Consigne de vitesse

 Contexte

Mi 2022, nous avons un robot qui répond plutôt bien, qui suit une trajectoire courbe avec fluidité. Cependant, lors de la compétition - pas avant, ça aurait été trop simple - nous réalisons que le robot se traîne plusieurs centimètres derrière sa consigne. Et seule l’inertie lui permet d’arriver à destination sur les 5 derniers centimètres. Nous le découvrons, car le robot devait arriver à une position à une vitesse réduite, et là, l’écart était bien visible.

Les premières tentatives, de simplement augmenter les gains d’asservissement se soldent par un échec.

Nous regardons en détail notre vieux code d’asservissement et découvrons que nous bridions l’accélération du robot de manière indélicate. Donc, nous avons une consigne forte, bridée par la suite. Toute tentative d’insérer un terme intégral ne pouvait se conclure que par une réponse instable.

Pourquoi nous avions fait ça ? Car notre consigne de position ne présentait pas de courbe d’accélération, passant de l’arrêt à la vitesse maximale instantanément.

Que le robot soit holonome, différentiel ou autre, il est intéressant de construire une consigne de position atteignable par le robot. Et pour que la consigne de position soit atteignable, il faut tenir compte des phases d’accélération, construire des courbes de vitesse...

 L’idée

Proposer une consigne de position qui accélère et décélère.

 L’accélération

La phase d’accélération est assez simple à gérer. On définit la vitesse à partir de la vitesse au pas de temps précédent et de l’accélération souhaitée :

$$ Vitesse[n] = Vitesse[n-1] + acceleration \times \Delta_t $$

C’est presque simple, il faut encore saturer la vitesse avec la vitesse maximale

if(vitesse > vitesse_max){
   vitesse = vitesse_max;
}

 La décélération

La phase d’accélération est assez simple à gérer. On définit la vitesse à partir de la vitesse au pas de temps précédent et de l’accélération souhaitée. Il suffit de savoir quand commencer la décélération.

La grande question de la décélération est de savoir quand commencer à décélérer.

Nous utiliserons la notion de contrainte de vitesse. Une contrainte de vitesse est définie par une vitesse maximale que le robot doit respecter à une position située devant lui sur sa trajectoire. Un peu comme un panneau d’entrée de ville pour les voitures, en franchissant le panneau, les voitures doivent rouler à moins de 50 km/h.

Nous notons :

  • PA, tA la position actuelle et le temps actuel du robot ;
  • VA la vitesse maximale à la position du robot, imposée par la contrainte devant le robot ;
  • PC, VC la position et la vitesse de la contrainte ;
  • tC le temps auquel le robot arriverait à la contrainte ;
  • t0 le temps pour lequel la vitesse du robot serait nulle s’il continuait de décélérer après la contrainte.
  • acc, l’accélération du robot. acc est négatif pendant la décélération.

Décélération : vitesse en fonction du temps

Note 1 : le robot n’aura aucune raison de continuer de ralentir après la contrainte. t0 n’est représenté que parce qu’il sera utilisé par la suite.
Note 2 : nous choisissons tC = 0, cela simplifie la démonstration.

La vitesse du robot s’obtient ainsi :

$$ V(t) = acc \times t + V_C$$

Il reste à définir le temps que va mettre le robot pour atteindre le point de la contrainte. Intégrons la vitesse pour obtenir la position du robot. La distance ente le robot et la contrainte de vitesse étant connue.

$$ P(t) = \frac12 acc \times t^2 - V_C\times t + K $$

Déterminons K, la constante d’intégration, de manière à ce qu’à t=0, V(t) = VC, P(t) = 0. D’où K = 0.


Décélération : distance en fonction du temps

Trouvons t, tel que P(t) = DA :

$$ D_A = \frac12 acc \times t^2 - V_C\times t $$


$$ \frac12 acc \times t^2 - V_C\times t - D_A = 0 $$

Calculons le discriminant :

$$ \Delta = V_C^2 + 2 acc \times D_A $$

Avec acc < 0, D_A < 0 (voir graphique), le discriminant est positif. La solution qui nous intéresse est celle négative, avant le point de la contrainte :

$$ t_A = \frac{-V_C + \sqrt{V_{C}^2 + 2 \times acc \times D_A}}{acc}$$

Nous obtenons V(t_A) :

$$ V(t_A) = acc \times t_A + V_C $$

Soit :

$$ V(t_A) = -V_C + \sqrt{V_{C}^2 + 2 \times acc \times D_A} + V_C $$


$$ V(t_A) = \sqrt{V_{C}^2 + 2 \times acc \times D_A} = V_A$$

 Conclusion

La logique pour le pilotage en vitesse est la suivante :

  1. Pour chaque contrainte de vitesse devant le robot, déterminer la vitesse maximale liée à la contrainte.
  2. Définir la vitesse maximale comme la vitesse la plus faible entre celles déterminées plus haut et la vitesse maximal du robot
  3. Déterminer la vitesse en faisant accélérer le robot
  4. Saturer cette vitesse par la vitesse maximale si besoin.

Voici le type de courbes obtenu :


Courbes de décélération

Commentaires

Il n'y a pas de commentaires

Ajouter un commentaire

Pseudo :
Mail :

Texte :

Copyright "POIVRON" 2011-2021, tous droits réservés
Administration du site