Simulateur interactifIntermédiaire

Simulateur de trajectoire : poursuite pure, Stanley

Parcours en poursuite pure ou Stanley, avec un vrai retard de direction. Tirez la distance de visée et l'essai se retrace, coût d'un point GPS à 1 Hz inclus.

Catégorie
Robots autonomes
Durée
20–40 min
Plateforme
Navigateur · Arduino · Raspberry Pi
Schéma technique : Simulateur de trajectoire : poursuite pure, StanleyLOOKAHEADGOAL POINTCOMMANDED PATH

01 / Commencez ici

Introduction

Un planificateur vous remet une trajectoire ; rien dedans ne dit aux roues quoi faire. Ce labo est l'échelon manquant. La poursuite pure et Stanley dirigent le même parcours de points de passage avec une réponse de direction du premier ordre et un retard de détection, car un modèle sans retard fait paraître optimal le mauvais réglage. Tirez un point de passage ou la visée et tout l'essai se recalcule.

Live lab / Path following

Path following simulator

Pure pursuit and Stanley steering the same course, with the lag a real robot has. Drag the lookahead and the whole run replots — too short oscillates, too long cuts corners, and the best value moves with speed.

Browser native
A top-down path-following lab. A robot follows a course of waypoints using the selected controller, and the route it actually drove is drawn against the route it was asked to drive. Use the controls below to run it and the keyboard hint to move the waypoints.
A plot of how far the robot was from the path, against distance along the path. Corners appear as spikes; a lookahead that is too short appears as jitter everywhere.

The dashed line with dots is the course you asked for; the solid line is where the robot went. The faint line is the whole run at the current settings, computed the moment you change one. Below, cross-track error along the path — dotted verticals are corners. Drag a waypoint to rebuild the course.

  • Commanded path
  • Driven
  • Full run preview
  • GPS fix
Simulation

Ready. The faint line is the whole run at these settings — press Start to drive it.

RMS error
—
Worst error
—
Corner cut
—
Steering effort
—
Progress
0%
Lap time
—

Keyboard: focus the course, then Space to run/pause, N to step, R to reset, C for a new course, F for full screen. Press 1–8 to pick a waypoint and the arrow keys to move it.

Commandes

Controller bascule entre poursuite pure et Stanley. Lookahead est le seul bouton de la poursuite pure et est désactivé pour Stanley, qui n’en utilise pas — c’est en soi le propos.

Speed et la visée interagissent, ce qui est la chose à explorer : réglez 1 m/s et trouvez la meilleure visée, puis réglez 3 m/s et retrouvez-la.

Position from échange l’odométrie parfaite contre un point à 1 Hz avec un bruit métrique, maintenu entre les mises à jour. L’erreur est toujours notée face à la vérité, donc la pénalité est réelle plutôt que masquée.

Tirez n’importe quel point de passage, ou appuyez sur 1–8 pour en sélectionner un et le déplacer avec les flèches du clavier. Tout l’essai se recalcule pendant que vous tirez.

Théorie

Les deux contrôleurs répondent à la même question — étant donné où je suis et où est la trajectoire, quel angle de direction ? — et y répondent tout à fait différemment.

La poursuite pure est géométrique. Trouvez le point sur la trajectoire à une distance de visée L devant, et roulez l’arc de cercle qui y passe :

κ = 2y / L_d²          δ = atan(2 b sin α / L_d)

avec y l’écart latéral du point but dans le repère du robot et b l’empattement. Un paramètre, et c’est une distance plutôt qu’un gain — donc il se transfère entre robots.

Stanley est de la commande. Référencez l’essieu avant et ajoutez deux termes :

δ = θ_e + atan(k · e / v)

erreur de cap plus un arc-tangente de l’écart transversal. Diviser par la vitesse permet à un gain de fonctionner sur une plage de vitesses. k est un vrai gain de commande et ne se transfère pas.

Le labo ajoute ce que les démonstrations de manuels omettent : 0,4 s de retard total, comme une réponse de direction du premier ordre de 0,25 s plus 0,15 s de retard de détection et de calcul. Sans lui, la poursuite pure s’améliore de façon monotone quand la visée rétrécit et toute la question du réglage disparaît.

Algorithme

À chaque pas, pour les deux contrôleurs :

  1. Projetez sur la trajectoire, en cherchant dans une fenêtre autour de l’abscisse curviligne dernière atteinte plutôt que sur toute la trajectoire. Une recherche globale apparie le segment le plus proche, donc un parcours qui rebrousse chemin téléporte la progression du robot vers un virage passé il y a une minute.
  2. Résolvez une égalité à un sommet vers le segment sortant. Après un virage, les deux segments adjacents se projettent au même point à la même distance ; garder l’entrant confie au contrôleur une erreur de cap et un écart latéral tous deux proches de zéro pendant qu’il quitte la trajectoire tout droit, silencieusement.
  3. Calculez l’angle de direction selon la propre règle du contrôleur, et saturez-le à la limite mécanique.
  4. Appliquez le retard, puis intégrez le modèle bicyclette.
  5. Notez face à la vérité, jamais face à l’estimation.

L’étape 2 n’est pas une optimisation. C’était la différence entre Stanley qui fonctionne et Stanley qui quitte le parcours avec assurance exactement à 78 % à chaque essai.

Code source

La poursuite pure, complète, sous la forme qu’elle prend sur un vrai robot :

float lastS = 0;   // arc length last reached — state, and it only moves forward

float pursue(float x, float y, float heading, float speed) {
  // The lookahead is scheduled on speed, with a hard floor: at a standstill a
  // proportional schedule asks for zero, which is a division by zero in disguise.
  float lookahead = constrain(0.7f * speed + 0.4f, 0.4f, 3.0f);

  float s = projectOntoPath(x, y, lastS);      // windowed around lastS
  lastS = max(lastS, s);
  Point goal = pointAtArcLength(lastS + lookahead);

  float dx = goal.x - x, dy = goal.y - y;
  float lateral = -sinf(heading) * dx + cosf(heading) * dy;
  float ld = max(0.3f, hypotf(dx, dy));        // clamp, or curvature blows up

  float curvature = 2.0f * lateral / (ld * ld);
  return curvature;                            // omega = v * curvature
}

Les trois lignes qui comptent sont le plancher du programme, la monotonicité de lastS, et la saturation de ld. Tout le reste est la formule.

Hypothèses et différences avec le matériel

Le labo donne au robot une carte parfaite de la trajectoire, un empattement parfaitement connu, aucun patinage des roues, et un retard qui est un modèle propre du premier ordre. Un vrai robot n’a rien de tout cela.

Le patinage des roues fausse l’estimation de position d’une façon qu’aucun contrôleur ne peut détecter. Le jeu du réducteur ajoute une course morte à chaque inversion de direction, qui se comporte comme un retard supplémentaire et pousse la visée optimale vers le haut. Et une propulsion différentielle n’a aucun angle de direction — elle a une vitesse de rotation commandée, donc ω = v κ remplace l’atan et l’empattement ne compte que pour l’étroitesse de ses virages.

Ce qui survit à tout cela, c’est l’allure : un optimum intérieur, qui se déplace vers la droite avec la vitesse, et une erreur à cet optimum qui croît avec la vitesse quoi qu’il arrive.

Schéma de câblage

Le contrôleur est la partie bon marché. Ce dont il a besoin du reste du robot est la partie chère.

Position. Codeurs en quadrature sur les deux roues et odométrie à propulsion différentielle qui les intègre, à la fréquence de boucle. En intérieur, cela suffit pour quelques dizaines de mètres.

Cap. Un gyroscope pour le court terme, un magnétomètre pour la référence absolue, ou les deux. L’erreur de cap est le terme que les deux contrôleurs pondèrent le plus, et c’est celui que l’odométrie perd en premier.

Une correction absolue, en extérieur. Un module GPS fusionné dans l’estimation plutôt que suivi directement — la différence est de 0,09 m d’erreur RMS contre 1,25.

Pour la théorie complète, voir poursuite pure et écart transversal ; pour construire, le rover GPS à points de passage démarre en intérieur sur codeurs et ne sort que lorsque le suiveur fonctionne.

Liste de vérification du matériel

Composants

  • Une base dont vous pouvez commander directement la direction ou les vitesses de roues
  • Une estimation de position — codeurs au minimum, fusionnés avec le GPS en extérieur
  • Une référence de cap qui ne dérive pas sur une mission
  • Une boucle assez rapide pour que son propre retard soit plus petit que votre visée

Explorer le graphe

Où ce simulateur est utilisé

Les projets, parcours d'apprentissage et tutoriels qui s'appuient sur ce labo.

Continuer la construction

Ressources à télécharger

Utilisez ces références sur la page pendant que vous avancez dans le projet. Les archives de projet téléchargeables ne seront ajoutées qu'une fois leur source et leur version publiées.

Questions courantes

Questions fréquentes

Pourquoi une visée plus courte ne suit-elle pas toujours mieux ?

Dans un modèle sans retard, si, et c'est exactement pourquoi tant de démonstrations de manuels sont trompeuses. Les vrais robots prennent du temps pour atteindre un angle de direction commandé et agissent sur une pose déjà vieille de dizaines de millisecondes. Ce labo modélise une constante de temps de direction de 0,25 seconde et 0,15 seconde de retard de détection. Avec ce retard présent, la courbe d'erreur devient un U : une visée courte commande une correction qui arrive après que le robot a déjà dépassé l'erreur, donc la commande suivante surcorrige. Un contrôleur plus rapide que son propre actionneur oscille.

Comment choisir la visée pour mon robot ?

Mesurez votre retard total de commande, multipliez par votre vitesse, et commencez entre une et deux fois cette distance. Dans ce labo, le retard est de 0,4 seconde, et les optima mesurés sont de 0,9 mètre à 1 m/s montant à 1,4 mètre à 3 m/s — entre 1,2 et 2,3 fois la distance couverte pendant le retard. Notez que l'optimum croît avec la vitesse mais moins que proportionnellement, donc un nombre fixe de secondes de parcours est proche mais pas juste. Livrez-le comme un petit programme linéaire en vitesse avec un minimum strict, car à l'arrêt le programme veut zéro.

Lequel est meilleur, poursuite pure ou Stanley ?

Ils échouent différemment, ce qui est la réponse utile. Sur ce parcours à 2 m/s, la poursuite pure coupe les virages et finit à 0,8 pour cent en dessous de la longueur de parcours commandée ; Stanley refuse de quitter la ligne, s'écarte large, et parcourt 2,2 pour cent en plus. Stanley tient une ligne plus serrée là où cela compte mais dépense 18,5 radians de direction contre 4,3 pour la poursuite pure — quatre fois le mouvement d'actionneur, le courant et le ripage des pneus. Utilisez la poursuite pure quand la trajectoire est une suggestion et Stanley quand c'est une contrainte.

Pourquoi l'erreur est-elle mesurée par rapport à la position vraie plutôt qu'à l'estimation ?

Parce qu'un robot qui se croit sur la trajectoire annonce zéro erreur par construction. Basculez la source de position sur GPS et le contrôleur commence à diriger sur un point bruité vieux d'une seconde pendant que le labo continue de noter face à la pose que le modèle a réellement intégrée. C'est la seule raison pour laquelle la pénalité GPS apparaît comme un nombre : 0,09 mètre d'erreur RMS devient 1,25, et l'effort de direction quadruple plus.

Que montre la ligne pâle ?

L'essai complet aux réglages actuels, calculé dès que vous en changez un. Chaque mouvement de curseur rejoue tout le parcours à vide en une vingtaine de millisecondes, donc tirer la visée vous montre la trajectoire qu'elle produit plutôt qu'une promesse. La ligne épaisse est le robot qui s'anime sur ce même essai quand vous appuyez sur Start.

Pourquoi le robot n'arrête-t-il jamais de tourner dans le virage très serré ?

Les deux contrôleurs ont un rayon de braquage minimal fixé par l'empattement et l'angle de direction maximal, et un virage plus serré que cela ne peut pas être suivi quel que soit le réglage. Les corrections honnêtes sont en amont : adoucissez la trajectoire avec un congé ou un arc, ou ralentissez pour le virage, ce à quoi sert un profil de mouvement. Aucun contrôleur de direction ne peut rouler une géométrie que le véhicule n'a pas.

Pour aller plus loin

Références

Des sources faisant autorité pour aller plus loin que le modèle pédagogique, borné, de ce simulateur.