Construire la consigne de position de manière à ce que le robot suive une trajectoire en accélérant et décélérant progressivement.
Vous avez suivi avec succès la partie « asservissement en position ». Vous avez réglé vos coefficients d’asservissement.
Pour cette partie, nous allons avoir besoin de deux nouveaux modules :
Le module trajet :
À chaque début de trajet, nous considérons que le robot est immobile. Les paramètres de vitesse maximale et d’accélération sont reçus en argument au début du trajet.
À chaque pas de temps, ce module actualise la consigne de vitesse en tenant compte de :
La vitesse liée à l’accélération (Vacc) s’obtient à partir de la vitesse actuelle :
$$ V_{acc} = V_{actuelle} + Acceleration \times pas\_de\_temps $$ La vitesse maximale autorisée sur le trajet est connue, puisque donnée à l’initialisation du trajet.
La vitesse suivant la courbe de décélération (Vdec)s’obtient à la l’aide de la distance restante à parcourir. La distance parcourue sur le trajet se calcule en additionnant à chaque pas de temps la distance parcourue au pas de temps. La distance restant se calcule en soustrayant la distance parcourue à la longueur de la trajectoire.
$$ Distance\_restante = longueur\_trajectoire - Distance\_parcourue$$ $$ V_{dec} = \sqrt{2 \times acceleration \times Distance\_restante} $$
Note : nous utilisons la même valeur pour l’accélération et la décélération.
La vitesse retenue est la plus faible de ces trois vitesses.
Note : Pour une version plus détaillée, vous pouvez-vous référer à cet article consigne de vitesse.
Reste à savoir quand le trajet est terminé. Le plus évident est de tester la valeur de l’abscisse. Si celle-ci est supérieure ou égale à 1 alors le trajet est terminé. Mais avec certaines trajectoires, les erreurs d’arrondis font que le trajet ne se termine pas à tout à fait à 1. Pour palier à ce problème, nous proposons de tester que la vitesse obtenue avec la courbe de décélération est inférieure à un seuil.
Le module simplifié ne gère qu’une seule trajectoire, une trajectoire droite de 50 cm de long, partant de (0,0) et avançant uniquement selon X. Voici les interfaces avec le module Trajet et leur implémentation sommaire.
float Trajectoire_avance(float abscisse, float distance){ return abscisse + distance / longueur_trajectoire }
struct point_t Trajectoire_get_point(float abscisse){ struct point_t point; point.x_mm = abscisse * longueur_trajectoire; point.y_mm = 0; return point ; }
float Trajectroire_get_longueur_mm(){ return 500; }
Faites parcourir à votre PAMI la trajectoire simplifiée en variant les paramètres d’accélération et de vitesse maximale.
Surveillez la vitesse consigne et la consigne de position. En cas de comportement erratique du PAMI en début ou en fin de trajectoire, contrôlez l’erreur d’orientation au niveau de l’asservissement en position.