Nous souhaitons une fonction qui convertisse un déplacement désiré du PAMI en une consigne pour les moteurs.
Vous avez suivi avec succès la partie « l’asservissement des moteurs en vitesse ».
Note : toutes les notions de vitesse, de vecteur qui suivent dans ce chapitre s’entendent dans le référentiel du robot.
Le PAMI est un objet physique tridimensionnel. Pour le piloter, nous le simplifierons et le modéliserons par un point ayant une position (x,y) et une orientation (ωZ).
La position de ce point impacte fortement la loi de commande. Généralement, ce point est choisi de manière à simplifier au maximum la loi de commande, mais avant de donner la version simplifiée de la loi de commande, nous détaillerons le raisonnement qui permet de l’obtenir (et qui s’applique à d’autres cinématiques de robot, tels que les robots holonomes) et donnerons la version complète de la loi de commande pour un robot différentiel.
Pourquoi compliquer les choses ? Parfois, ce n’est pas le déplacement du centre du robot qui importe, mais celui d’un capteur ou d’un actionneur. Sur un PAMI, une possibilité serait que vous ayez fixé un stylo à l’arrière et que vous cherchiez à dessiner avec.
Comment peut se déplacer un point de votre PAMI sur le terrain ? Ceci dépend de la mécanique du PAMI. Une roue classique ne peut avancer, sans glisser, que sur un axe. avec Vy = 0.
Un patin, comme celui monté à l’avant, sera modélisé par un appui plan et ne rajoutera pas de contrainte à un déplacement dans le plan XY.
À chaque contrainte, exprimez le tenseur cinématique puis déplacez le au point de de référence que vous avez choisi.
Voici le cas générique pour une robot différentiel (à deux roues motrices sur le même axe) :
#insérer schéma
$$\mathcal{V}_G = \begin{Bmatrix} \vec{\Omega} \\ \vec{\mathrm{V}}_g \end{Bmatrix} \textrm{avec } \mathrm{V}_G = \begin{Bmatrix} V_G \\ 0 \\ 0 \end{Bmatrix}$$
$$\mathcal{V}_D = \begin{Bmatrix} \vec{\Omega} \\ \vec{\mathrm{V}}_d \end{Bmatrix} \textrm{avec } \mathrm{V}_D = \begin{Bmatrix} V_D \\ 0 \\ 0 \end{Bmatrix}$$
Pour un solide indéformable, le vecteur rotation est le même en tout point. Notre PAMI reste parallèle au sol, il ne peut tourner que selon l’axe z. $$ \vec{\Omega} = \begin{Bmatrix} 0 \\ 0 \\ \omega_z \end{Bmatrix}$$
En déplaçant $\mathcal{V}_G$ et $\mathcal{V}_D$ au point de référence (R), de coordonnées (dx, dy), nous obtenons :
$$\mathcal{V}_r = \begin{Bmatrix} \vec{\Omega} \\ \vec{V_r} \end{Bmatrix} = \begin{Bmatrix} \vec{\Omega} \\ \vec{V_g} + \vec{RG} \wedge \vec{\Omega} \end{Bmatrix} = \begin{Bmatrix} \vec{\Omega} \\ \vec{V_d} + \vec{RD} \wedge \vec{\Omega} \end{Bmatrix}$$
ce qui se développe en posant $\vec{RG}$ et $\vec{RD}$ $$ \vec{RG} = \begin{Bmatrix} -dx \\ e - dy \\ 0 \end{Bmatrix} \textrm{et } \vec{RD} = \begin{Bmatrix} -dx \\ -e - dy \\ 0 \end{Bmatrix} $$ Ce qui donne, pour $\vec{V_r}$ les expressions : $$ \vec{V_r} = \begin{Bmatrix} (e-dy) \cdot \omega_z + V_g \\ dx \cdot \omega_z \\ 0 \end{Bmatrix} = \begin{Bmatrix} (-e-dy) \cdot \omega_z + V_d \\ dx \cdot \omega_z \\ 0 \end{Bmatrix} $$
La composante x permet d’obtenir la rotation $\omega_z$ : $$\omega_z = \frac{V_d - V_g}{2 \cdot e}$$
et de simplifier $\vec{V_r}$ :
$$ \vec{V_r} = \begin{Bmatrix} \frac{V_d + V_g}{2} - dy \cdot \omega_z \\ dx \cdot \omega_z \\ 0 \end{Bmatrix} $$
De cette expression, nous pouvons conclure que :
Nous souhaitons simplifier les équations. Notre point de référence pour le PAMI sera (dx=0, dy=0). La translation en Y n’est pas commandable et notre loi de commande prendra comme arguments :
$$ \left\{ \begin{array}{l} \vec{V_x} = \frac{V_D + V_G}{2} \\ \omega_z = \frac{V_D - V_G}{2 \cdot e} \\ \end{array} \right. $$
A partir des équations précédentes, nous obtenons la vitesse de chaque roue en fonction de la translation en X et de la rotation en Z désirées :
$$ \left\{ \begin{array}{l} \vec{V_D} = V_x + \omega_z \cdot e \\ \vec{V_G} = V_x + \omega_z \cdot e \\ \end{array} \right. $$
Ce module est censé remplacer les appels directs à AsserMoteur_setConsigne_mm_s(…). Il ne sera composé que d’une seule fonction :
Ce module fait intervenir un nouveau paramètre :
#LIEN vers le code complet du module
L’impact sur la structure du code étant faible, ce code de démonstration sert également pour le débogage.
Convertissez les deux codes de l’article précédents pour utiliser ce module.
Remplacez les fonctions AsserMoteur_setConsigne_mm_s(…) par commande_vitesse(consigne_vitesse, consigne_vitesse / (3 * DISTANCE_ROUES_CENTRE_MM).
De la même manière, remplacez les fonctions AsserMoteur_setConsigne_mm_s(…) par commande_vitesse(consigne_vitesse, 0).
Vous pouvez également tester la rotation du PAMI sur lui-même. Reprenez le code de la trajectoire circulaire et changez les arguments de la fonction, essayez avec ces valeurs : commande_vitesse(0, 0.5)