Asservissement polaire d'un robot
2013-05-25 - No comments
En sachant notre position actuelle, on veut atteindre une autre position, et l'atteindre à tous les coups, quel que soient l'état du terrain, des pneus (dérapage), des contraintes internes (jeu mécanique) ou des contraintes extérieures (choc non prévu).
On est donc obligés d'utiliser d'avoir un retour et de contrôler le robot en position.
Asservissement en Position
Pour atteindre une position, on calcule la différence entre la position actuelle et la position à atteindre, la dériver et l'intégrer.
Ensuite on somme toutes ces variables, chacune avec son propre facteur, ainsi on a :
Asservissement en Vitesse
De la même façon, on dérive le ε (l'erreur entre l'entrée et la sortie), et on asservit en vitesse.
Ça peut-être utile si la chaîne de traction de chaque roue est légèrement différente, avec un robot qui dérive un peu en ligne droite (avec les roues parfaitement parallèles).
C'est forcément à utiliser en plus d'un asservissement en position, souvent le système est cloisonné en deux parties :
- Un bloc moteur, avec un codeur optique fixé sur l'axe, directement asservi et commandé en vitesse.
- Une roue codeuse, indépendante, qui va être utilisée pour l'asservissement en position, en commandant le bloc en vitesse.
Contrôle(s)
Pour détecter les instabilités, les chocs et protéger les moteurs, il est utile d'avoir un retour sur le couple développé par les moteurs, que l'on peut obtenir avec le courant qu'ils consomment.
Ça permet aussi, en limitant le courant, d'avoir de "jolis" trapèzes de vitesse, avec une accélération constante.
Sans contrôle du courant, on a , qui impose un couple et un courant énormes à faible vitesse, risquant de faire déraper le robot, et d'abîmer le moteur si le robot se met a osciller.
Les cartes moteur LMD18200 de Galiléo ont une sortie en tension, proportionnelle au courant consommé par le moteur. Mais les moteurs MFA ont un courant très bruité par le collecteur et le PWM, et les moteurs Maxon ont tellement de couple que les roues dérapent avant que le courant n'ait le temps d'augmenter...
Principe de l'asservissement polaire
On contrôle les erreurs de position (et aussi de vitesse et d'intégrale avec les coefficients D et I), roue par roue, et l'erreur d'angle.
Ça permet de rouler droit, sans dévier, même si le robot prend du lacet et oscille, il garde le cap et la position finale voulus.
Coefficients
- P est déterminant pour la vitesse et l'erreur statique de la correction.
- I ralentit le système et corrige l'erreur statique, mais risque de le rendre instable
- D accélère la réponse du système, notament face aux grosses variations rapides, y compris celles générées par l'asservissement lui-même (oscillations).
Ici, l'écart statique est difficile à accepter, mais les instabilités liées à l'intégrateur sont "dangereuses", du coup il faut être subtil dans le choix des coefficients.
On peut avoir un écart statique négligeable sans intégrateur, et accepter jusqu'à quelques mm d'erreur statique.
Au final, ce qui fonctionne le mieux, c'est un coefficient P obtenu (par calcul/simulation/dichotomie à l'arrache) pour ne pas avoir trop d'erreur statique et un seul dépassement maximum, et ensuite, rajouter un D pour corriger le dépassement et augmenter la vitesse.
Le I est remplacé par le temps de lecture des codeurs optiques, en quelques ms, l'écart est déjà intégré (de quelques pas à quelques dizaines de pas).
Astuces
Pour qu'un asservissement soit fiable, il faut deux choses : Que le système fonctionne déjà pas trop mal sans asservissement, et que les conditions soient assez proches à chaque utilisation.
- Un robot qui roule droit (ou en déviant peu) sans asservissement, avec les moteurs à fond, c'est assez bon signe
- Roues codeuses montées sur des roues non motrices, suspendues, pour avoir une mesure de position fiable quel que soit l'état du terrain, et aussi en cas de choc (dérapage des roues motrices).
- Nettoyage des roues motrices et codeuses, pour avoir toujours la même adhérence.
- Ne pas oublier de prendre en compte le jeu et l'élasticité de la transmission.
- Réguler la tension d'alim des moteurs, ça permet d'avoir une tension constante, quel que soit le courant tiré sur les batteries et leur niveau de charge, pas vraiment indispensable avec un bon asser.
- Éviter l'intégrateur, déjà inclus de manière parasite dans la lecture du codeur optique.
- Borner la sortie du moteur peut permettre de commencer à alimenter le moteur seulement quand on a atteint sa FCEM nominale, du coup on évite les petites oscillations à l'arrêt, liées au jeu mécanique. La borne supérieure permet de superposer plusieurs corrections : linéaire et angulaire, sans dépasser la valeur de sortie maximale.
Composants utilisés pour l'asservissement
- LM629 : Utilisé par Galiléo en 2005 et en 2006, ASIC ancien et n'asservit qu'une seule roue en position
- PE12316 : Carte développée par Galiléo pendant l'année 2007 et utilisée à la coupe 2008.
- CPLD : Utilisé à la coupe 2009, les sources ont plus ou moins disparu...
- Arduino : Codé en un jour (et une nuit), utilisé pour une démo en fin d'année 2012, mais brancher les codeurs sur les interruptions rend l'asservissement lent et peu stable (la durée d'échantillonage s'allonge avec la vitesse de déplacement...)
- HCTL2032 : Developpé pendant l'année 2013, et utilisé aux coupes 2013, 2014 et 2015