Robot à entraînement différentiel
Objectif : programmer un robot pour que depuis un point A, il se rende à un point B, en évitant des obstacles !
Étude des mouvements
Le robot AlphaBot est un robot à mouvement différentiel : deux moteurs pour actionner indépendamment deux roues coaxiales.
Documentation :
La roue sur le sol
Supposons dans un premier temps que la roue ne touche pas le sol :
\(\Large{\bbox[2px,border:2px solid black]{\overrightarrow{V_{P\in 1/2}}=\vec 0}}\)
Le mouvement différentiel
Le schéma ci-dessous représente le robot \(\color{blue}{A}\) vu de dessus, ainsi que la trajectoire de son centre \(C\) et les vitesses des centres de ses roues, \(O_G\) et \(O_D\) :
La distance \(O_GO_D\) s’appelle la voie du robot, on la notera \(b\).
Cas particuliers
- translation rectiligne
- rotation autour du point \(C\)
Programmation
Pour programmer le déplacement du robot, on écrit une fonction en langage Python, dont la description est donnée ci-dessous :
def vitesses_roues_robot(vitesse, rayon, b = 0.1, r = 0.035): """ Met en mouvement le robot selon une trajectoire circulaire * vitesse [m/s] : flottant * rayon [m] : flottant ou None pour un rayon infini (trajectoire rectiligne) * voie du robot [m] : flottant * rayon des roues du robot [m] : flottant Renvoie un tuple formé des vitesses angulaires des roues """ .......... .......... return wG, wD # rad/s
Dans la déclaration de cette fonction, les paramètres
vitesse
etrayon
sont obligatoires : il faut fournir leurs valeurs (arguments) lors de l’appel à la fonction.Exemple pour une consigne de vitesse de \(0,8m/s\) et un rayon de braquage de \(1,2m\) :
wG, wD = vitesses_roues_robot(0.8, 1.2)
En revanche, les paramètres
b
etr
sont facultatifs : si leurs valeurs ne sont pas données lors de l’appel à la fonction, leurs valeurs par défaut seront utilisées. On choisi les valeurs par défaut correspondantes à un robot en particulier, mais on peut quand même utiliser la fonction pour un robot aux caractéristiques différentes.Exemple pour un robot dont les roues ont un rayon de \(3\;cm\) et une voie de \(12\;cm\) :
wG, wD = vitesses_roues_robot(0.8, 1.2, 0.12, 0.03)
Pour éviter un obstacle, la stratégie suivante est choisie (en première approche) :
Dès que l’obstacle est détecté, le robot s’arrête, fait un quart de tour sur la droite, puis suit une trajectoire circulaire de rayon \(R=0,5m\), s’arrête à nouveau, opère un quart de tour sur la droite, et reprend son mouvement initial.
Cette procédure est réalisée par une fonction eviter_obstacle()
qui est déclenchée dès que l’obstacle est détecté (c’est à dire environ 20cm avant).
Si on suppose que les vitesses des roues données en consigne sont parfaitement respectées, il est possible de contrôler les positions du robot en comptant les durées des mouvements.
def eviter_obstacle(): """ """ ...... commander_roues(wG, wD) ......