Menu
Contrôle moteur et déplacements
Contrôler les moteurs et connaitre la position du robot en mesurant le déplacement des roues (motices HCTL) et non motrices (ODOM) est une tâche qui doit se faire très régulièrement, c'est pourquoi un thread y est dédié.
De plus le contrôle des moteurs se fait par l'intermédiaire d'une carte connectée sur le port ISA du PC et la commande se fait par des séries d'écritures directement à l'adresse mémoire de la carte par des iopl. Sous linux, seul le thread qui a initialisé la lecture/écriture à une adresse mémoire peut continuer à accéder à cette mémoire. Par conséquent toutes les commandes vers la carte de contrôle des moteurs (carte HCTL) doivent être données par le même thread.
Il n'y a pas de driver sous forme de module linux pour la carte de contrôle moteur, mais juste une API dans le code du programme principal du robot (voir src/motor/*)
Les lois de commandes envoyées aux moteurs sont gérées par les classes Move et Movement (voir src/move/move.cpp src/move/movement.cpp)
La position du robot est calculée toutes les 25ms pour les HCTL et 40ms pour les ODOM dans le fichier src/move/robotPosition.cpp
Pour simplifier l'initialisation et la configuration de toutes ces parties de code, il y a la classe MovementManager (voir src/move/movementManager.cpp).
Moteurs
Voir le repertoire src/motor/*
La classe moteur peut être instanciée de manière réelle ou simulée (interface avec le simulateur). En mode réel elle communique directement avec la carte HCTL embarquée dans le PC104 par le port ISA.
Elle permet de :
- définir la vitesse des moteurs
- définir l'accélération/décélération maximum des moteurs pour éviter le glissement des roues.
- reccupérer la position des codeurs des moteurs des roues motrices, ce qui permet de connaitre la position du robot
- reccupérer la valeur de la commande envoyée aux moteurs PWM
Une tache périodique de la classe permet de détecter que les moteurs forces (donc que les roues sont bloquées) en mesurant la consigne envoyée à la carte de puissance des moteurs (PWM). Si le PWM reste à 100% pendant 2 seconde c'est que les roues sont bloquées et on envoie un l'évènement EVENTS_PWM_ALERT
Position du robot
Voir src/move/robotPosition.cpp
La position du robot est calculée de deux manières. La première utilise les odomètres connectés à la carte UART odomètres (ODOM). La deuxième utilise les codeurs des moteurs des roues motrices (HCTL).
On calcule la position du robot en connaissant la position de départ puis en intégrant tous les déplacements.
A chaque fois que la carte odomètre envoie la position des codeurs (toutes les 40ms) on met à jour la position ODOM. Une tache péridique appelée par le thread du movement manager met à jour la position HCTL (toutes les 20ms environ).
Par défaut on utilise la position ODOM comme position du robot. Si on détecte que l'on n'a pas recu d'informations de la carte ODOM pendant un certain temps, on utilise la position HCTL. Comme les roues motrices glissent plus facilement, la position HCTL est moins fiable que la position ODOM.
Périodiquement on compare les 2 positions. Si la position HCTL varie beaucoup plus que la position ODOM, c'est que les roues motrices tournent dans le vide. On déclenche alors l'évènement EVENTS_PWM_ALERT.
Déplacements
Le but est d'avoir un robot qui se déplacement avec le moins d'accouts possible pour éviter les glissements qui pourraient nuire à l'odomètrie, d'avoir un robot qui se déplace rapidement, d'avoir une API haut niveau qui permette de s'asservir sur une trajectoire donnée par l'utilisateur.
La classe Move (voir src/move/move.cpp), calcule en permanence la consigne de vitesse envoyée aux roues, gère l'asservissement sur une trajectoire, gère un limiteur de vitesse (à ameliorer l'année prochaine pour avoir une variation de la vitesse max en fonction de la position sur la trajectoire: on peut aller plus vite en ligne droite que dans les virages).
L'utilisateur définit un "mouvement" ou une série de mouvements. A chaque mouvement correspond une fonction (periodicTask) qui détermine la consigne en vitesse (voir src/move/movement.cpp). Ensuite un limiteur de vitesse et d'accélération logiciels régulent cette consigne avant de l'envoyer aux moteurs (voir src/move/move.cpp setSpeed).