Déplacer la Tortue (TurtleSim)
Résumé
Move Turtle est un script python ROS simple qui déplace la tortue dans TurtleSim de ROS vers des coordonnées (points) spécifiées. Ce projet a commencé comme projet de cours pour CSCI473 à la Colorado School of Mines (CSOM) et a ensuite évolué en un projet que j’ai utilisé pour m’aider à apprendre comment créer des systèmes en boucle fermée, connaissances qui ont été utilisées pour m’aider dans mon travail au laboratoire Human Center Robotics (HCR) de la CSOM.
Contexte
Pour un peu de contexte, ROS signifie Robot Operating Systems. ROS est un middleware de robotique open-source, généralement associé au système d’exploitation Ubuntu, qui est utilisé pour mieux gérer les composants/ensembles logiciels d’un système robotique. Vous pouvez en apprendre davantage sur l’utilisation de ROS via le [wiki] officiel de ROS. Le code que vous écrivez dans ROS est en C++ ou en Python.
TurtleSim est un simulateur robotique 2D simple utilisé comme introduction à ROS et aux paquets ROS pour les nouveaux utilisateurs de ROS. Tout ce que fait TurtleSim est d’ouvrir un affichage 2D simple avec une tortue. Cette tortue agit comme le « robot » et vous pouvez envoyer des messages à ce « robot » pour le déplacer et/ou le faire tourner. En fait, TurtleSim génère une petite erreur aléatoire pour simuler la physique du monde réel de manière simple.
Sachant ce qu’est ROS et TurtleSim, pourquoi les utilisais-je ? Eh bien, au printemps 2020, je suivais un cours intitulé « Human Centered Robotics » à la Colorado School of Mines dans le cadre de mon programme de licence en informatique. Le cours était dispensé par le Dr Hao Zhang. Le cours comprenait trois projets et le premier projet consistait à installer ROS, apprendre à l’utiliser, et implémenter un algorithme en boucle ouverte ou en boucle fermée qui ferait dessiner un M à la tortue dans TurtleSim. La description originale du projet peut être consultée ICI.
Lorsque je suivais le cours, j’ai terminé ce projet en implémentant un algorithme en boucle ouverte. Cette solution fonctionnait mais était vraiment médiocre et dessinait un A « suffisant » mais loin d’être « excellent ». Après avoir soumis le projet vers la mi-février 2020, je l’ai oublié jusqu’à environ février 2021.
Défi
En février 2021, j’ai été embauché comme assistant de recherche au laboratoire Human Centered Robotics (HCR) de la Colorado School of Mines où j’ai travaillé sous la direction du Dr Hao Zhang. L’objectif du laboratoire est de mener des recherches sur « l’autonomie collaborative à vie, dans le but de permettre aux robots de fonctionner et de s’adapter sur de longues périodes ». Au 1‑9‑2022 (1 septembre 2022), le laboratoire a déménagé de la Colorado School of Mines à l’Université du Massachusetts Amherst. Mais, lorsque j’y travaillais, il était encore situé au Colorado.
Au laboratoire HCR, on m’a chargé de travailler sur le projet Triton. Le projet Triton comprenait plusieurs dizaines de robots appelés Tritons. Les Tritons étaient des robots terrestres à roues omni triangulaires qui ressemblaient à ceci :
Avec les Tritons, huit caméras IR de OptiTrack disposées en « ordre octogonal » à quelques pieds du sol. En utilisant ces caméras, le logiciel Motive d’Optitrack, un PC sous Windows 10 et ROS, un espace de 2 mètres sur 2 mètres sur 2 mètres (x, y, z) est créé où la position réelle exacte des objets avec des marqueurs de capture de mouvement peut être déterminée.
Ma première tâche dans le projet Triton était de créer des scripts permettant au robot Triton de se déplacer vers une position réelle spécifique. À l’époque, je ne savais pas comment y parvenir, mais je me souvenais du premier projet de CSCI473 où l’idée d’un système en boucle fermée m’avait été présentée, j’ai donc commencé à approfondir les systèmes en boucle fermée et, par conséquent, les systèmes de rétroaction.
Recherche
Lors de mes recherches, j’ai découvert cette excellente vidéo d’AerospaceControlsLab :
Dans cette vidéo, l’idée d’un système PID m’est présentée et expliquée. Un système PID est un système en boucle fermée, de boucle de contrôle, qui produit des sorties spécifiques à partir de données du monde réel. En termes simples, c’est un système de rétroaction qui ajuste sa sortie en fonction de la différence entre la valeur désirée et la valeur mesurée. Voici la formule d’un contrôleur PID :
$$ u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt} $$
- $u(t)$ est le signal de commande.
- $K_p$, $K_i$, $K_d$ sont respectivement les gains proportionnel, intégral et dérivé.
- $e(t)$ est le signal d’erreur (la différence entre la sortie désirée et la sortie réelle).
- $\int e(t) dt$ est l’intégrale de l’erreur au cours du temps.
- $\frac{de(t)}{dt}$ est la dérivée de l’erreur.
Pour en savoir plus, consultez la vidéo d’AerospaceControlsLab ou cet incroyable article Wikipédia dont provient la formule.
Après avoir mené mes recherches et reçu de l’aide de mes amis et professeurs brillants, j’ai déterminé que l’utilisation d’un contrôleur proportionnel, le contrôleur P, serait la meilleure solution pour aider le Triton à atteindre une coordonnée spécifique.
Étant donné que le Triton est un robot terrestre, je n’ai besoin de me préoccuper que des coordonnées X et Y. En sachant cela, j’ai dû déterminer quelles valeurs désirées et mesurées mesurer et traiter dans le(s) contrôleur(s) P. Dans mes recherches, j’ai trouvé cet article impressionnant sur le wiki ROS intitulé Go to Goal où ils se concentraient sur les erreurs suivantes :
- Erreur de distance : La différence de distance entre l’emplacement désiré (X, Y) et l’emplacement actuel (X, Y).
- Erreur d’orientation (Theta) : La différence entre l’orientation désirée et l’orientation actuelle.
Solution Proposée
En connaissant tout cela, la solution pour faire déplacer le Triton vers une coordonnée réelle spécifique consiste à utiliser un contrôleur proportionnel pour l’erreur de distance et l’erreur d’orientation du Triton par rapport à la coordonnée cible et à la coordonnée actuelle du Triton. Mais avant d’implémenter cela dans un système physique, je voulais tester l’idée dans une simulation et, à l’époque, je pensais que l’utilisation de TurtleSim comme simulation était le meilleur choix.
Tests en Simulation
Avec la solution théorique décrite, j’ai choisi de la valider d’abord par simulation, plutôt que dans un scénario réel. Le monde réel est souvent encombré de bruit qui peut obscurcir l’efficacité de la solution et entraîner des problèmes non pertinents. En reconnaissant cela, j’ai revisité mon projet de CSCI473 et l’ai adapté comme terrain d’essai pour cette solution théorique.
Après avoir mis à jour l’ancien code pour passer de ROS Melodic à ROS Noetic et après quelques raffinements itératifs, j’ai fait fonctionner la solution proposée dans TurtleSim. Des démonstrations de son fonctionnement, avec quelques trajectoires de coordonnées cibles intéressantes, se trouvent à la fin de cet article de blog. Le code complet peut être consulté ICI.
Conclusion
En résumé, grâce à ce projet, la tortue de TurtleSim se déplace efficacement vers les coordonnées définies en utilisant le système en boucle fermée, surpassant largement mon système en boucle ouverte initial de 2020. Après des tests réussis, j’ai implémenté cette solution avec les robots Triton. Mais le bruit du monde réel a introduit des problèmes inattendus nécessitant des semaines de débogage et de tests réels. Après ces semaines, j’ai finalement fait en sorte que le Triton atteigne des coordonnées réelles spécifiques en utilisant la solution que j’avais testée dans TurtleSim. Voici une démonstration du Triton se déplaçant vers des coordonnées réelles spécifiques en utilisant la méthode testée dans TurtleSim :
Avec le recul, j’aurais aimé utiliser une simulation qui reproduisait mieux la physique du monde réel. TurtleSim est excellent pour l’apprentissage mais pas idéal pour tester des idées de robotique en conditions réelles. À l’époque, je pensais que cela serait suffisant pour mon cas d’utilisation simple, mais cela s’est avéré ne pas être le cas.
L’objectif principal de cet article de blog était de décrire la création d’un système en boucle fermée permettant à la tortue de TurtleSim, puis aux robots Triton, de naviguer précisément vers des positions cibles spécifiées (X, Y). Je crois que cet objectif a été atteint, mais il pourrait susciter un certain intérêt pour mon travail au laboratoire HCR. En sachant cela, j’ai l’intention d’écrire d’autres articles de blog sur mon expérience de travail au laboratoire HCR…
Démos de Moving Turtle (TurtleSim)
Cette vidéo contient les démonstrations suivantes :
- Cayley Nodal : Un design simple de Cayley Nodal
- Cercles : Un design en forme de toile d’araignée
- Cercles intérieurs : Un design « cercles à l’intérieur de cercles »
- M : Un design très simple de M