Loi de commande
Objectif
Nous souhaitons une fonction qui convertisse un déplacement désiré du PAMI en une consigne pour les moteurs.
Pré-requis
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 point de référence
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.
Déplacements possibles
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 :
- Si pour le point de référence, dx est différent de 0, alors la rotation et la translation en Y sont liées, une loi de commande ne pourra accepter que l’un de ces deux paramètres en argument. Notons que commander un robot avec (X, Y) nous fait perdre le contrôle de son orientation.
- Si, pour le point de référence, dx égale 0, alors ce point ne peut pas translater en Y. La seule loi de commande possible est (X, ωZ).
Notre choix
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 :
- Translation en X : avance_mm_s
- Rotation en Z : rotation_rad_s
$$ \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. $$
La loi de commande
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. $$
Structure du code
Ce module est censé remplacer les appels directs à AsserMoteur_setConsigne_mm_s(…). Il ne sera composé que d’une seule fonction :
- commande_vitesse(avance_mm_s, rotation_rad_s) :
- qui calcule les vitesses consignes des moteurs
- envoie ces vitesses au module d’asservissement
Ce module fait intervenir un nouveau paramètre :
- DISTANCE_ROUES_CENTRE_MM : la distance entre une roue et le centre du robot.
#LIEN vers le code complet du module
Code de démonstration
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.
Trajectoire circulaire
Remplacez les fonctions AsserMoteur_setConsigne_mm_s(…) par commande_vitesse(consigne_vitesse, consigne_vitesse / (3 * DISTANCE_ROUES_CENTRE_MM).
Aller-retours
De la même manière, remplacez les fonctions AsserMoteur_setConsigne_mm_s(…) par commande_vitesse(consigne_vitesse, 0).
Rotation pure
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)