Contenus de la page
Introduction
À l’instar de l’Homme qui est passé d’un appui sur 4 pattes à un appui sur 2 pieds, notre robot a pour objectif de rester sur ses deux roues en se maintenant le plus droit possible.
C’est un projet certes classique, mais qui permet de réaliser et apercevoir concrètement l’asservissement en position (ici angulaire) d’un système.
État de l’art
Ce robot reprend le problème du pendule inversé et a été popularisé par la facilité croissante de mettre en place des petits systèmes électroniques. Il sera notamment utilisé comme outil pédagogique.
Pour énoncé son intérêt scientifique, je me permets de traduire une partie de cette recherche :
» Ces robots ont attiré l’attention du monde entier parmi les passionnés de robotique et les chercheurs, non seulement en raison de leur structure unique, de leur dynamique instable et de leur forte non-linéarité, mais aussi, et surtout, pour leur grande valeur en tant que plateforme idéale pour la validation de diverses théories de contrôle non linéaire. »
Malgré de nombreuses ressources, nous avons décidés de faire le robot sans aucune aide externe au fablab.
Partie Électronique
Pour maintenir le robot droit, nous avions besoin d’au minimum un moteur, d’un capteur pour connaître la position angulaire par rapport à l’axe des roues et un microcontrôleur.
C’est pour cela que nous avons pris :
– 2 moteurs avec encodeur
– 1 driver L298N
– 2 roues 6cm de diamètre
– 1 gyroscope/accéléromètre MPU6050 GY521
– 1 Lipo 7.4V
– 1 ESP32
Circuit électronique :

Partie Mecanique
La partie mécanique du robot n’est pas particulièrement complexe.
Nous avons utilisés un système d’étages pour superposer les éléments les un par dessus les autres, maintenus par 4 tiges filetées. Nous aurions possiblement pu améliorer cette solution pour avoir plus de robustesse mais ce n’était pas la priorité à la fin de ce projet.
Bien qu’il existe probablement de nombreux modèles plus efficaces sur internet, nous mettons à disposition à tout le monde le modèle de notre projet : https://cad.onshape.com/documents/39faecde72ec2984fa8e464c/w/eaaac84ce4dfbdd36b9efe02/e/bf141a6374a18c79eb7a82e8?renderMode=0&uiState=68167ade0c9cce34e053ba2b
Modèle 3D

Partie Informatique
Concrétisons notre robot par l’implémentation de l’asservissement. Parmi les différents choix, nous avons commencé par le classique PID. Nous n’avons pas tester d’approche physique (résolution de système physique) ou informatique (renforcement par apprentissage).
Ce robot est composé de deux asservissements PID travaillant de paire. Le premier a pour but d’obtenir un contrôle moteur précis et rapide. Le deuxième de permettre au robot de se tenir droit sur ses roues.
PID moteurs
Chaque moteur a son propre PID. Les moteurs sont asservis via deux encodeurs incrémentaux à 4 fils. Ces encodeurs permettent de connaitre la vitesse et le sens de rotation de chaque moteur. Ils sont essentiels, car sans eux la commande moteur ne correspond pas à la vitesse réelle. Les positions des moteurs est mise à jour grâce à une interruption sur les encodeurs. Les positions sont ensuite dérivées et filtrée pour en retirer les vitesses moteurs.

Le PID est ensuite réglé séparément pour chaque moteur.
Gestion du capteur gyroscopique/accéléromètre
Les valeurs du GY521 sont récupérés à intervals réguliers (toute les 10ms) grâce à une interruption déclenchée par un timer interne de l’ESP32. Ce capteur nous permet de retrouver l’angle dans lequel se trouve le robot de deux manières différente.

- Par les accéléromètres. Nous utilisons une combinaison des axes X et Y. En effet, l’angle du robot par rapport à la verticale est égal à arctan(acc(Z)/acc(X)).
2. Le seul gyroscope nous intéressant pour l’équilibre est celui selon l’axe Y. Celui-ci nous donne une vitesse angulaire. On se contente d’intégrer ses valeurs pour obtenir la position angulaire.
Ces deux manières de calculer l’angle ne donnent pas le même résultat en pratique. En effet, la méthode des accéléromètres est soumise au bruit et aux incertitudes dus aux accélérations du robot. Le gyroscope n’est pas soumis au bruit, mais dérive au cours du temps. Une combinaison des deux méthodes de calcul est donc nécessaire au bon calcul de l’angle.
Plusieurs méthodes existent pour combiner ces deux données (filtre de Kalman …) nous avons simplement choisi une combinaison pondérée. Cela nous permet à court terme de considérer uniquement le gyroscope et à long terme d’annihiler la dérive.
compAngle = alphaComp*gyrAngle + (1-alphaComp)*accAngle
alphaComp est un paramètre à régler en fonction du bruit des accéléromètres et de la dérive du gyroscope.
PID de l’équilibre du robot
Pondération manuelle
Nous utilisons un régulateur PID classique, réglé manuellement à partir des données filtrées du MPU6050.
Pour le réglage :
- Nous initialisons tous les gains PID à zéro.
- Nous augmentons progressivement Kp jusqu’à ce que le robot réagisse de manière visible à une inclinaison (par exemple, qu’il tente de se redresser lorsqu’il est poussé ou penche d’un côté), sans osciller excessivement.
- Nous augmentons ensuite Ki pour corriger l’erreur statique (dérive lente), en veillant à ne pas introduire d’oscillations.
- Enfin, nous ajoutons progressivement Kd pour atténuer les oscillations et améliorer la stabilité. Cela permet éventuellement de réduire légèrement Kp pour obtenir une réponse plus douce et stable.
Pondération numérique
Une deuxième méthode pour optimiser les paramètres de notre PID est l’utilisation de méthodes numériques.
Pour cela nous avons procédé en plusieurs étapes :
1. Modélisation légère du robot
Pour alléger la simulation, nous avons effectué une modélisation simpliste, en indiquant des paramètres supplémentaires pour la simulation tels que la masse ou les limites des liaisons, ce qui n’était pas obligatoire d’indiquer dans la version de base du modèle.

2. Insertion dans un environnement simulé en 3 dimensions
Pour cela, nous avons utilisé la bibliothèque python Pybullet. Après avoir transformé notre modèle d’Onshape en modèle urdf par une bibliothèque utilisant l’API d’Onshape, cette bibliothèque nous permets de manipuler notre modèle dans un espace en trois dimensions.
Il ne nous reste plus qu’à simuler l’action des moteurs sur les roues en donnant une vitesse angulaire aux roues pour implémenter un PID, en essayant d’effectuer une copie conforme à l’implémentation effectuée dans le monde réel.
N’ayant pas eu le temps de créer un environnement de Reinforcement Learning, nous avons décidé de faire une première version par échantillonnage des constantes Kp, Ki et Kd.
L’objectif est de compter le « temps » de simulation avant que le robot ne tombe (- 70° < alpha < 70°). Les résultats sont stockés dans un csv, ce qui nous permet de sélectionner le meilleur résultat et de relancer un échantillonnage plus précis.
Malheureusement, nous avons commencé la démarche trop tard pour pouvoir appliquer de l’IA, et tester le passage du simulé au réel.
Également, la simulation semble ne pas marcher correctement, comprenant des bugs qui font échouer le robot dans sa mission. ce qui empêche de tester le correcteur sur un long terme.
Nous aurions pu également essayé avec un environnement non plat.