Pure Pursuit - vaul-ulaval/vaul-wiki GitHub Wiki
Lien vers le code
➡️En bref
Le pure pursuit est un algorithme de contrôle à haute vitesse. Le principe est simple, il permet au robot de suivre une ligne de course de manière très précise. Cette ligne de course est en fait une liste de waypoint. À chaque itération, l'algorithme choisi un waypoint devant le robot de manière stratégique et oriente le robot dans cette direction.
Les mathématiques
Cette lecture du cours F1TENTH explique très bien le fonctionnement de l'algorithme d'un point de vue mathématique.
- liens vers la lecture L'implémentation utilise des formules légèrement différentes qui sont disponibles ici.
Implémentation du VAUL
Choix de design
L'algorithme pure pursuit du VAUL dépend de 2 noeuds:
-
Le waypoint_publisher_node qui s'occupe de charger la liste de waypoints en mémoire et la publier sur un topic.
-
Le pure_pursuit qui contient la logique de contrôle.
Utilisation du pure pursuit
Pour utiliser le pure pursuit, il est nécessaire de faire une carte de l'environnement. Par la suite, on peut générer une raceline pour le robot à l'aide du gui de génération de racelines. Finalement, on peut utiliser l'algorithme pour suivre cette raceline.
Protocole de déploiement
➡️Documentation des fonctions
to_radians
, to_degrees
et p2pdist
C'est 3 fonctions utilitaires.
compute_lookahead
Cette fonction calcule le lookahead en fonction de la vitesse. Le lookahead
est une fonction linéaire de la vitesse qui peut être ajusté à l'aide des paramètres m
et q
.
lookahead_distance = speed * m + q
get_waypoint_infront_of_car
Récupère le waypoint qui est le plus près du lookahead_distance
. Cette opération se fait en 2 temps:
- On trouve le waypoint le plus près du robot.
- On itère vers l'avant jusqu'à ce que l'on trouve le waypoint qui se rapproche le plus de la distance
lookahead_distance
du robot.
transform_from_world_to_car_frame
Permet de transformer un waypoint du référenciel monde vers le référenciel du robot.
get_steering
Permet de calculer le steering_angle
depuis le goal point selon les maths décrites plus haut.
smooth_start_velocity_limiter
Permet de limiter la vitesse lorsqu'on démarre le véhicule à un endroit où la vitesse serait normalement élevé. Peut être ajusté à l'aide des paramètres smooth_start_threshold
et smooth_start_factor
.
get_velocity
Récupère la vitesse de la ligne de course à la position du robot et la multiplie par le velocity_percentage
.
pub_drive
Publie une commande de vitesse et d'angle de direction sur le topic drive.
odom_callback
Permet la mise à jour de la vitesse mesuré du robot.
closest_waypoint_to_car_cb
C'est la fonction qui est appelée à chaque fois que la position du robot change. C'est ici qu'on calcule le steering_angle et la vitesse à envoyer comme commande au robot.
waypoints_cb
Permet la mise à jour de la ligne de course.
visualize_goal
Visualise le goal point dans Rviz et foxglove.
visualize_steering
Visualise l'angle de braquage dans Rviz et foxglove.
update_parameters
Mets à jour périodiquement tous les paramètres du noeud.