Contrôle PID avec TurtleSim
Résumé
Move Turtle est un simple script python ROS qui déplace la tortue dans TurtleSim de ROS vers des coordonnées spécifiées (points). Ce projet a commencé comme un projet de classe pour CSCI473 à l’École des Mines du Colorado (CSOM) et a ensuite évolué en un projet que j’ai utilisé pour m’aider à apprendre comment des systèmes en boucle fermée peuvent être créés, les connaissances acquises ayant été utilisées pour m’aider dans mon travail au laboratoire de robotique centrée sur l’humain (HCR) de 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 grâce au wiki officiel de ROS. Le code que vous écrivez dans ROS est en C++ ou en Python.
TurtleSim est un simple simulateur de robot 2D utilisé comme introduction à ROS et aux paquets ROS pour les nouveaux utilisateurs de ROS. Tout ce que fait TurtleSim est d’ouvrir un simple affichage 2D 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 se déplaçant, TurtleSim génère cependant une certaine 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é “Robotique centrée sur l’humain” à l’École des Mines du Colorado dans le cadre de ma charge de cours en informatique de premier cycle. Le cours était enseigné par le Dr. Hao Zhang. Le cours se composait de trois projets et le premier projet consistait à configurer ROS, à apprendre à utiliser ROS et à mettre en œuvre soit un algorithme en boucle ouverte, soit un algorithme 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 mettant en œuvre un algorithme en boucle ouverte. Cette solution fonctionnait mais était vraiment médiocre et dessinait un A qui était “suffisamment bon” mais pas du tout “génial”. Après avoir soumis le projet vers la mi-février 2020, j’ai oublié jusqu’à un an plus tard, vers février 2021.
Défi
En février 2021, j’ai été embauché en tant qu’assistant de recherche au laboratoire de robotique centrée sur l’humain (HCR) de l’École des Mines du Colorado où je travaillais sous la direction du Dr. Hao Zhang. L’objectif du laboratoire est de faire des recherches sur “l’autonomie collaborative tout au long de la vie, avec pour but de permettre aux robots d’opérer et de s’adapter sur de longues périodes”. Au 1er septembre 2022, le laboratoire a déménagé de l’École des Mines du Colorado à l’Université du Massachusetts Amherst. Mais, lorsque j’y travaillais, ils étaient encore situés au Colorado.
Au laboratoire HCR, j’ai été chargé de travailler sur le projet Triton. Le projet Triton se composait de plusieurs dizaines de robots appelés Tritons. Les Tritons étaient des robots terrestres triangulaires roues omnidirectionnelles qui ressemblaient à ceci :
Avec les Tritons, huit caméras IR de OptiTrack disposées en “ordre octogonal” à quelques pieds au-dessus du sol. En utilisant ces caméras, le logiciel Motive d’Optitrack, un PC fonctionnant sous Windows 10, et ROS ; un espace de 2 mètres par 2 mètres par 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 avec le projet Triton était de créer des scripts qui faisaient déplacer le robot Triton vers une position réelle spécifique. À l’époque, je n’étais pas sûr de la façon d’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, alors j’ai commencé à vraiment rechercher les systèmes en boucle fermée et, par conséquent, les systèmes de rétroaction.
Recherche
Au cours de mes recherches, j’ai découvert cette excellente vidéo de AerospaceControlsLab :
Dans cette vidéo, l’idée d’un système PID m’a été montrée et expliquée. Un système PID est un système de boucle de contrôle en boucle fermée qui produit des sorties spécifiques basées sur des 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 souhaitée et la valeur mesurée. Voici la formule pour 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 contrôle.
- $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 souhaitée et la sortie réelle).
- $\int e(t) dt$ est l’intégrale de l’erreur dans le 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 la formule est tirée.
Après avoir fait mes recherches ainsi qu’avoir reçu de l’aide de mes amis et professeurs intelligents, j’ai déterminé que l’utilisation d’un contrôleur proportionnel, un 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 soucier que des coordonnées X et Y. Sachant cela, j’ai ensuite dû déterminer quelles valeurs souhaitées et mesurées mesurer et traiter dans le(s) contrôleur(s) P. Dans mes recherches, j’ai trouvé ce post incroyable 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 souhaité (X, Y) et l’emplacement actuel (X, Y).
- Erreur de theta : La différence entre l’orientation souhaitée et l’orientation actuelle.
Solution Proposée
Sachant tout cela, la solution pour amener le Triton à se déplacer vers une coordonnée réelle spécifique est d’utiliser un contrôleur proportionnel pour l’erreur de distance du Triton et l’erreur de theta par rapport à la coordonnée cible et à la coordonnée actuelle du Triton. Mais avant de l’implémenter 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.
Test en Simulation
Avec la solution théorique décrite, j’ai choisi de la valider initialement par simulation, plutôt que par un scénario du monde réel. Le monde réel est souvent encombré de bruit qui pourrait brouiller l’efficacité de la solution et conduire à traiter des problèmes non pertinents. 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 avec quelques améliorations itératives, j’ai réussi à faire fonctionner la solution proposée dans TurtleSim. Des démonstrations de sa fonctionnalité, avec quelques chemins de coordonnées cibles intéressants, peuvent être trouvées à la fin de ce billet de blog. Le code pour tout cela peut être consulté ICI.
Conclusion
En résumé, grâce à ce projet, la tortue de TurtleSim navigue efficacement vers des coordonnées définies en utilisant le système en boucle fermée, surpassant de manière significative mon système en boucle ouverte initial de 2020. Testée avec succès, 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 dans le monde réel. Après ces semaines, j’ai finalement réussi à amener le Triton à atteindre des coordonnées réelles spécifiques en utilisant finalement la solution que j’ai 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, je regrette de ne pas avoir utilisé une simulation qui simule mieux la physique du monde réel. TurtleSim est excellent pour apprendre mais pas idéal pour tester des idées de robotique du monde réel. À l’époque, je pensais que cela suffirait pour mon cas d’utilisation simple, mais cela s’est avéré ne pas être le cas.
L’objectif principal de ce billet de blog était de décrire la création d’un système en boucle fermée permettant à la tortue dans TurtleSim, et par la suite 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 cela a peut-être suscité un certain intérêt pour mon travail au laboratoire HCR. Sachant cela, j’ai l’intention de rédiger d’autres billets de blog sur mon expérience de travail au laboratoire HCR…
Démos de Turtle en Mouvement (TurtleSim)
Cette vidéo contient les démos suivantes :
- Cayley Nodal: Un simple design Cayley Nodal
- Cercles: Un design semblable à une toile d’araignée
- Cercles Intérieurs: Un design de “cercles à l’intérieur de cercles”
- M: Un design M très simple