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.

Implémentation du VAUL

Choix de design

L'algorithme pure pursuit du VAUL dépend de 2 noeuds:

  1. Le waypoint_publisher_node qui s'occupe de charger la liste de waypoints en mémoire et la publier sur un topic.

  2. 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:

  1. On trouve le waypoint le plus près du robot.
  2. 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.