Consigne de vitesse

10 septembre 2022

 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 de décé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$$

Voici le type de courbes obtenu :


Courbes de décélération

 Simplification

Dans un cas simple, la contrainte de vitesse vaut 0, que ce soit un obstacle ou la fin du trajet. D’où :

$$ V_A = \sqrt{2 \times acc \times D_A}$$

 Conclusion

Pour le pilotage en vitesse, il s’agit de retenir la vitesse la plus basse parmi :

  1. La vitesse qu’aurait le robot s’il accélérait.
  2. La plus faible des vitesses liées aux contraintes
  3. La vitesse maximale absolue du robot

Commentaires

Il n'y a pas de commentaires

Ajouter un commentaire

Pseudo :
Mail :

Texte :

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