Le trajet et les trajectoires

Objectif

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.

Pré-requis

Vous avez suivi avec succès la partie « asservissement en position ». Vous avez réglé vos coefficients d’asservissement.

Principe

Pour cette partie, nous allons avoir besoin de deux nouveaux modules :

  • Un module que nous nommerons « Trajet », qui gère la vitesse que doit avoir le PAMI. Ce module considère que le PAMI évolue sur une abscisse comprise en 0 et 1 et délègue ce qui est relatif à la position en (X,Y).

  • Un module « Trajectoire » qui répond au module Trajet. Dans cette partie, le module Trajectoire sera développé au minimum pour obtenir un système fonctionnel.

Module Trajet

Le module trajet :

  • détermine la vitesse que doit avoir le PAMI
  • calcule la distance que le PAMI parcourt pendant le pas de temps à cette vitesse
  • demande à la trajectoire d’avancer de cette distance et récupère la nouvelle abscisse
  • demande à la trajectoire la position du robot correspondant à cette nouvelle abscisse
  • envoie cette position à l’asservissement en position

À 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.

Calcule de la vitesse

À chaque pas de temps, ce module actualise la consigne de vitesse en tenant compte de :

  • la vitesse qu’aurait le PAMI s’il accélérait
  • la vitesse maximale autorisée sur le trajet
  • la vitesse qui suit la courbe de décélération pour s’arrêter en bout de trajectoire

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.

Fin du trajet

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.

Module simplifié de trajectoire

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.

Avancer sur la trajectoire à partir d’une abscisse

float Trajectoire_avance(float abscisse, float distance){
	return abscisse + distance / longueur_trajectoire
}

Obtenir la position dans le plan à partir de l’abscisse curviligne

struct point_t Trajectoire_get_point(float abscisse){
	struct point_t point;
	point.x_mm = abscisse * longueur_trajectoire;
	point.y_mm = 0;
	return point ;
}

Obtenir la longueur de la trajectoire

float Trajectroire_get_longueur_mm(){
	return 500;
}

Code de démonstration

Faites parcourir à votre PAMI la trajectoire simplifiée en variant les paramètres d’accélération et de vitesse maximale.

Débogage

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.