# Matomo/interfaces club

* Présentation
* Installation
* Configuration
* Fonctionnalités
* Fonctionnement
* Traductions
* Soutien
* À propos
* CodingStandard
* Réflexion Version 2
* SearchEnginesDetection
* Réflexions version2 test
* interfaces club
* Présentation
* Installation
* Configuration
* Fonctionnalités
* Fonctionnement
* Traductions
* Soutien
* À propos
* CodingStandard
* Réflexion Version 2
* SearchEnginesDetection
* Réflexions version2 test
* interfaces club
[ Modifier le sommaire ]

## Objectifs du module info

La carte PC a accès à deux ressources indépendantes : la carte électronique et la caméra firewire. Son but est donc de les utiliser au mieux afin de jouer le plus intelligemment (ou plutôt efficacement) possible. Le programme doit aussi être facilement configurable et pratique à déboguer, notamment en vue d'un changement tactique de dernière minute.

## Unités

Cette partie pourrait presque faire partie du guide de style, elle concerne les unités utilisés par les interfaces.
* On utilisera pour désigner des longueurs, positions ou distances le millimètre.
* Les angles seront mesurés en radian.
* Les vitesses s'expriment en millimètre/seconde et les accélérations en millimètre/seconde².
* Les vitesses angulaires en radian/seconde et les accélérations en radian/seconde².
* Les fréquences en Hertz.
* Les temps en seconde.
Si pour une raison ou une autre une autre unité est utilisée, il faudra préciser clairement dans le commentaire et dans le nom de la fonction ou de la variable quelle unité est utilisée.

## Numérotation des éléments du terrain

Voir les schémas annexes... On considère que les éléments sont fixes et que c'est le robot qui démarre d'un cote ou de l'autre.
Les éléments importants du terrain sont numérotés de la façon suivante :
* Tx.y pour la position des totems, x représentant le numéro de camp et y la position dans le camp.
* Hx.y pour la position des trous (Holes), x représentant le numéro de camp et y la position dans le camp en partant du haut du terrain. La numérotation des trous suit la logique du terrain (les trous sont placés par symétrie axiale), mais le terrain risquant d'être modifié, il est probable que la numérotation change.
* Bx.y pour la position des balles, x représentant la couleur de la balle et y la position de la balle en partant en haut à gauche du terrain.
* Beaconx.y pour la position des balises, x représentant le numéro de camp et y le numéro de balise.

## Description des couches et modules

Comme le montre le diagramme UML, le programme est divisé en couche représentant différents niveaux d'abstraction permettant de passer du protocole de communication avec le matériel, au niveau le plus abstrait qui permet de faire jouer un match complet en quelques lignes de script.

### Légende des priorités

Il existe un système de priorité de développement pour organiser le développement. 3 niveaux de priorités :
* *** : Urgent / indispensable. À faire en priorité, doit être parfaitement stable et fonctionnel
* ** : Intéressant. Indispensable pour faire une intelligence évoluée. Dans un 1er temps, facultatif.
* * : Facultatif. Le must du must pour de l'IA poussée... si on a fini en avance alors on gère ce genre de choses, mais on ne perds pas une minute dessus jusqu'à Avril.

### Couche "Auxiliaires Globaux"

Cette couche regroupe l'ensemble des modules pouvant servir à plusieurs niveaux, on y retrouve typiquement des modules de débogages, de configurations, des définitions de types globaux ou des modules facilitant le codage (plus spécifique au C++).

#### Types Globaux
##### Description

Ce sont tous les types qui ne sont pas spécifiques à un module, et qui pourront donc être employés par plusieurs couches différentes. On a notamment des types permettant de spécifier des positions.

##### Variables globales

On utilise deux repères globaux à l'application :
* Le premier est absolu, son origine se situe dans le coin a droite de la zone de départ du robot. L'axe des X est parallèle à la grande longueur du terrain, l'axe des Y est parallèle à la largeur du terrain et l'axe Z est perpendiculaire au terrain, orienté vers le haut.
* Le second est relatif, son origine se situe entre les deux roues motrices du robot. L'axe des X est dirigé vers l'avant du robot, l'axe des Y est dirigé vers la gauche du robot et l'axe Z est identique à l'axe Z du repère absolu. Enfin on définit l'angle thêta comme l'angle direct (sens trigo) entre l'axe X absolue et l'axe X relatif.

#### Math
##### Description

Primitives mathématiques diverses qui servent en particulier au positionnement (matrice4x4, vecteur3d)

##### Ébauche d'interface

+ fonctions permettant de créer des matrices de rotation, translation...

#### Constantes Globales
##### Description

Constantes généralement en relation avec le règlement, le terrain ou la mécanique du robot.

##### Ébauche d'Interface

Voir la section sur la numérotation des éléments du terrain.

#### Helpers divers et Abstraction OS
##### Description

Couche d'abstraction avec le système d'exploitation.
En particulier il s'agit d'objets simplifiant :
* le multitâche (création de thread et synchronisation)
* le réseau (création de client/serveur TCP/IP)
* le chronométrage (utilisé uniquement par le module Timer)
* les interfaces graphiques (utilisé uniquement par le module IHM)

##### Ébauche d'interface

+Gestionnaire d’événement/message avec des fonctions du style :
Voir doc spécifique OSAL.

#### Timer
##### Description

Le timer peut envoyer des évènements à certains moments clefs du match. On peut aussi lui demander de lever un évènement toutes les x secondes. Il permet en plus de chronométrer, et de profiler facilement certaines parties du code.

##### Ébauche d'interface
#### IHM/Debug
##### Description

Le but de ce module est de faciliter le debuggage (éventuellement à distance). On y retrouve des classes permettant de logguer du texte, de tracer des courbes, d'afficher des images à l'écran assez facilement ou encore de lire le clavier de manière asynchrone.

##### Ébauche d'interface
#### Config Manager
##### Description

Le Config Manager permet de configurer les constantes de chaque module au démarrage du programme. Il pourra par exemple lire ces constantes depuis un fichier de script (type .ini ou .xml).

   ##### Ébauche d'interface
### Couche IA (Intelligence Artificielle)

Il s'agit de la couche décisionnelle de plus haut niveau : à terme la tactique devrait être programmé uniquement dans ces modules.

#### IA/Script
##### Description

Il s'agit du module le plus haut : c'est lui qui prend les décisions, il peut éventuellement se servir d'un fichier de script (type Python ou Lua) pour lire les actions qu'il doit exécuter.
Il n'y a pas réellement d'interface pour ce module étant donné que c'est à lui d'utiliser les autres modules. Par contre si on décide d'utiliser un fichier de script, il faudra définir des fonctions "glues" permettant d’appeler les fonctions haut niveau du programme C++ depuis le script.

##### Exemple de script simple du type homologation

On récupère une balle a une position sure et on va la déposer dans le trou le plus simple.
Exemple de script en pseudo langage :

### Couche Auxiliaire IA

Les auxiliaires de l'IA sont la pour simplifier certains calculs et algorithmes et permettent donc à la couche d'IA d'utiliser des scripts assez simples. Cela permet aussi de factoriser certaines taches qui pourrait revenir systématiquement dans chaque script.

#### Positionnement auxiliaire
##### Description

Fournit à l'IA des fonctions simples pour obtenir des informations sur des éléments particuliers du jeu (comme la balle la plus proche ou le trou le plus accessible). Basiquement il s'agit d'algorithme de tri ou de recherche de min/max.

##### Interface

Les fonctions retournent un booléen indiquant l'existence de l'élément recherché et modifie l'objet position le cas échéant. Le terme 'nearest' ici signifie proche en temps, pas forcément en distance. Il s'agit donc d'obtenir l'élément le plus accessible.

#### Pathfinder
##### Description

Le pathfinder permet de déterminer les trajectoires optimales permettant d'aller d'un point à un autre.

   ##### Ébauche d'interface

Des classe spécialisées peuvent hériter de cPath afin d'avoir plusieurs style de trajectoires, par exemple on peut avoir un cPath version clothoide, un cPath version ligne droite et rotation sur place, ou encore un cPath ligne droite horizontale ou verticale uniquement.
Des classes spécialisées peuvent hériter de cWaypoint, pour définir par exemple des Waypoint de recallage sur bordure, d'attrapage de balle ou encore de dépose de balle. Ceci permet d'ajuster plus précisément la position du robot : pour déposer une balle dans un trou, il faut aligner l'éjecteur de balle avec le trou (et non pas le centre du robot).

### Synthèse

Cette couche permet de regrouper les informations par catégorie sans distinctions de leur source (Vidéo ou HAL). Par exemple, on peut contrôler et connaître l'état d'un capteur par la même interface même si l'état est connu par le biais de la vidéo et que le contrôle se fait par la HAL.

#### Positionnement
##### Description

Le module de positionnement synthétise toutes les informations relatives aux positions des éléments du jeu (balles, robots, totems, éléments du terrain), il peut aussi donner l'incertitude sur ces valeurs. L'intérêt est notamment de faire la synthèse des informations redondantes (particulièrement pour la position du robot : odométrie, caméra, balise).

   ##### Ébauche d'interface
#### Automatisme
##### Description

Le module d'automatisme gère les différents actionneurs et capteurs (comme la tirette de démarrage). Il permet donc de connaître l'état des actionneurs et de les contrôler assez facilement. On peut par exemple savoir la couleur de la balle actuellement dans le système d'éjection (vidéo) et commander son éjection (HAL).

   ##### Ébauche d'interface

La définition des interfaces du driver HAL générique dépasse le cadre de ce document, voir la doc spécifique.

### Drivers (spécifiques et génériques)

La couche de drivers spécifiques dépend entièrement de la mécanique du robot utilisé et du règlement du jeu. Son interface explicite donc les noms des divers éléments. Cette couche est directement relié à la couche de drivers génériques, elle effectue une simple traduction. La couche générique est plus universelle et devrait pouvoir être réutilisée pour plusieurs règlement/application.

#### Vidéo et vidéo lib
##### Description

Le module de vidéo utilise la librairie vidéo afin de détecter les éléments du jeu. La librairie vidéo est quant à elle beaucoup plus générique et devrait pouvoir être réutilisée telle quelle d'année en année.

   ##### Ébauche d'interface

La définition des interfaces du driver vidéo générique dépasse le cadre de ce document, voir la doc spécifique.

#### HAL (Hardware Abstraction Layer) et Driver Elek
##### Description

De la même façon que la vidéo, l'HAL fournit une implémentation spécifique du driver elek. L'HAL fournit donc une interface explicitant le nom des actionneurs, tandis que le driver elek reste totalement générique et ne dépend que de l'électronique utilisée.

   ##### Ébauche d'interface

[A définir plus précisément avec la méca et l'asservissement]

## Simulateur
### Description

Le simulateur permet de coder les modules haut niveau (au dessus de la couche de HAL) sans avoir implémenté les couches inférieures. Dans notre cas, le simulateur va nous aider à coder :
* Dans un premier temps : les modules de recherche et de génération de chemin.
* Ensuite : les modules de synthèses de position et de positionnement auxiliaire.
* Enfin indirectement, le module d'intelligence artificielle.

### Interface

L'interface possède donc deux niveaux (mutuellement exclusive, on utilise qu'une des deux):
* Un niveau qui simule la couche de synthèse avec notamment les fonctions :
* Un second niveau simulant la couche de HAL :
À ces deux niveaux d'interfaces, vient se rajouter le module de constantes.
Le simulateur doit aussi être configurable, on doit pouvoir notamment régler les erreurs/incertitudes sur les capteurs, un decallage entre la commande et la mise en action (simulation de la latence de la transmission usb), ...