Simulatore di path following: Pure Pursuit e Stanley
Percorri una rotta con pure pursuit o Stanley e un ritardo reale dello sterzo. Trascina l'anticipo: una correzione GPS a 1 Hz cambia l'intera corsa.
- Categoria
- Robot autonomi
- Tempo
- 20–40 min
- Piattaforma
- Browser · Arduino · Raspberry Pi
01 / Inizia qui
Introduzione
Un pianificatore consegna un percorso, ma nulla in esso dice alle ruote cosa fare. Questo laboratorio colma la lacuna: Pure Pursuit e Stanley seguono lo stesso tracciato di punti di passaggio con una risposta di sterzo del primo ordine e un ritardo di rilevamento, perché un modello senza ritardo rende ottimale una regolazione sbagliata. Trascina un punto di passaggio o l'anticipo e l'intera corsa viene ricalcolata.
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.
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
- 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.
Controlli
Controllore alterna tra pure pursuit e Stanley. Anticipo è l’unico parametro di pure pursuit ed è disabilitato per Stanley, che non ne usa uno: è proprio questo il punto.
Velocità e anticipo interagiscono, ed è la parte con cui vale la pena giocare: imposta 1 m/s e trova l’anticipo migliore, poi imposta 3 m/s e trovalo di nuovo.
Posizione da sostituisce l’odometria perfetta con una correzione a 1 Hz con rumore su scala metrica, mantenuta tra un aggiornamento e l’altro. L’errore viene sempre valutato rispetto alla verità, quindi la penalità è reale e non nascosta.
Trascina un punto di passaggio, oppure premi 1–8 per selezionarlo e spostarlo con le frecce. L’intera corsa viene ricalcolata mentre lo trascini.
Teoria
Entrambi i controllori rispondono alla stessa domanda — dato dove mi trovo e dov’è il percorso, quale angolo di sterzo? — ma lo fanno in modi completamente diversi.
Pure pursuit è geometria. Trova il punto sul percorso a una distanza di anticipo L davanti e percorri l’arco circolare che lo attraversa:
κ = 2y / L_d² δ = atan(2 b sin α / L_d)
dove y è lo scostamento laterale del punto obiettivo nel sistema del robot e b è il passo della ruota. Un solo parametro, ed è una distanza anziché un guadagno: quindi si trasferisce tra robot diversi.
Stanley è controllo. Prendi come riferimento l’asse anteriore e aggiungi due termini:
δ = θ_e + atan(k · e / v)
errore di orientamento più un arcotangente dell’errore trasversale al percorso. Dividere per la velocità permette a un solo guadagno di funzionare su un intervallo di velocità. k è un vero guadagno di controllo e non si trasferisce.
Il laboratorio aggiunge ciò che le derivazioni dei manuali omettono: 0.4 s di ritardo totale, composto da una risposta di sterzo del primo ordine di 0.25 s più 0.15 s di ritardo di rilevamento e calcolo. Senza di esso, pure pursuit migliora monotonamente quando l’anticipo si riduce e la domanda sulla regolazione scompare.
Algoritmo
A ogni passo, per entrambi i controllori:
- Proietta sul percorso, cercando una finestra attorno alla lunghezza d’arco raggiunta l’ultima volta anziché tutto il percorso. Una ricerca globale abbina il segmento più vicino, quindi un tracciato che torna indietro teletrasporta l’avanzamento del robot verso un angolo superato un minuto prima.
- Risolvi un pareggio a un vertice scegliendo il segmento uscente. Dopo un angolo, entrambi i segmenti adiacenti si proiettano nello stesso punto alla stessa distanza; mantenere quello entrante consegna al controllore un errore di orientamento e uno scostamento laterale entrambi quasi nulli mentre esce dritto dal percorso, in silenzio.
- Calcola l’angolo di sterzo secondo la regola del controllore e limitane il valore al limite meccanico.
- Applica il ritardo, poi integra il modello della bicicletta.
- Valuta rispetto alla verità, mai rispetto alla stima.
Il passo 2 non è un’ottimizzazione. È la differenza tra Stanley funzionante e Stanley che esce con sicurezza dal tracciato esattamente nel 78% delle esecuzioni.
Codice sorgente
Pure pursuit, completo, nella forma che assume su un robot reale:
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
}
Le tre righe che contano sono il limite inferiore della schedulazione, la monotonia di lastS e il limite di ld. Tutto il resto è la formula.
Ipotesi e differenze hardware
Il laboratorio dà al robot una mappa perfetta del percorso, un passo della ruota perfettamente noto, nessuno slittamento delle ruote e un ritardo modellato in modo pulito come sistema del primo ordine. Un robot reale non ha nessuna di queste proprietà.
Lo slittamento delle ruote rende sbagliata la stima della posizione in un modo che nessun controllore può rilevare. Il gioco di inversione del riduttore aggiunge corsa morta a ogni inversione di sterzo, si comporta come ritardo aggiuntivo e spinge in alto l’anticipo ottimale. Inoltre la trazione differenziale non ha alcun angolo di sterzo: ha una velocità di rotazione comandata, quindi ω = v κ sostituisce atan e il passo della ruota conta solo per capire quanto strettamente può curvare.
Ciò che sopravvive a tutto questo è la forma: un ottimo interno, che si sposta verso destra con la velocità, e un errore in quel punto che cresce comunque con la velocità.
Schema elettrico
Il controllore è la parte economica. Ciò che deve fornire il resto del robot è la parte costosa.
Posizione. Encoder in quadratura su entrambe le ruote e odometria a trazione differenziale che li integra, alla frequenza del ciclo. In ambienti interni è sufficiente per qualche decina di metri.
Orientamento. Un giroscopio per il breve termine, un magnetometro come riferimento assoluto, o entrambi. L’errore di orientamento è il termine che entrambi i controllori pesano maggiormente, ed è quello che l’odometria perde per primo.
Una correzione assoluta, all’aperto. Un modulo GPS fuso nella stima anziché seguito direttamente: la differenza è 0.09 m di errore RMS rispetto a 1.25.
Per la teoria completa, vedi pure pursuit e errore trasversale al percorso; per costruirlo, il rover GPS con punti di passaggio parte all’interno con gli encoder e passa all’esterno solo quando il sistema di inseguimento funziona.
Checklist hardware
Componenti
- Una base con sterzo o velocità delle ruote direttamente comandabili
- Una stima della posizione: almeno encoder, uniti al GPS all'aperto
- Un riferimento di orientamento che non derivi durante una missione
- Un ciclo abbastanza veloce da avere un ritardo proprio minore dell'anticipo
Esplora il grafo
Dove si usa questo simulatore
I progetti, i percorsi di apprendimento e i tutorial che si basano su questo laboratorio.
Continua a costruire
Scarica le risorse
Usa questi riferimenti nella pagina mentre lavori al progetto. I pacchetti di progetto scaricabili verranno aggiunti solo dopo la pubblicazione del loro codice sorgente e della loro versione.
Domande comuni
Domande frequenti
Perché un anticipo più breve non migliora sempre il tracciamento?
In un modello senza ritardo lo fa, ed è esattamente il motivo per cui molte derivazioni dei manuali sono fuorvianti. I robot reali impiegano tempo a raggiungere un angolo di sterzo comandato e agiscono su una posizione che ha già decine di millisecondi. Questo laboratorio modella una costante di tempo di sterzo di 0.25 secondi e 0.15 secondi di ritardo di rilevamento. Con quel ritardo la curva dell'errore diventa a U: un anticipo breve comanda una correzione che arriva dopo che il robot ha già superato l'errore, quindi il comando successivo sovracorregge. Un controllore più veloce del proprio attuatore oscilla.
Come scelgo l'anticipo per il mio robot?
Misura il ritardo totale del controllo, moltiplicalo per la velocità e parti da una distanza compresa tra una e due volte quella distanza. In questo laboratorio il ritardo è di 0.4 secondi e gli ottimi misurati sono 0.9 metri a 1 m/s, fino a 1.4 metri a 3 m/s: tra 1.2 e 2.3 volte la distanza percorsa durante il ritardo. Nota che l'ottimo cresce con la velocità ma meno che proporzionalmente, quindi un numero fisso di secondi di viaggio è una buona approssimazione, non quella giusta. Implementalo come una piccola schedulazione lineare sulla velocità con un minimo rigido, perché da fermo la schedulazione vuole zero.
Qual è migliore, pure pursuit o Stanley?
Falliscono in modo diverso, che è la risposta utile. Su questo tracciato a 2 m/s pure pursuit taglia gli angoli e finisce dello 0.8 percento più corto della lunghezza del percorso comandato; Stanley rifiuta di lasciare la linea, esce più largo e percorre il 2.2 percento in più. Stanley mantiene una linea più stretta dove conta, ma consuma 18.5 rad di sterzo contro i 4.3 di pure pursuit: quattro volte il movimento dell'attuatore, la corrente e lo strisciamento degli pneumatici. Usa pure pursuit quando il percorso è un suggerimento e Stanley quando è un vincolo.
Perché l'errore viene misurato rispetto alla posizione reale invece che alla stima?
Perché un robot che crede di essere sul percorso segnala un errore nullo per costruzione. Se imposti la sorgente di posizione su GPS, il controllore inizia a sterzare usando una correzione rumorosa e vecchia di un secondo, mentre il laboratorio continua a valutarlo rispetto alla posizione che il modello ha effettivamente integrato. Ecco l'unico motivo per cui la penalità GPS appare come numero: 0.09 metri di errore RMS diventano 1.25 e lo sforzo di sterzo supera di oltre quattro volte quello iniziale.
Cosa mostra la linea tenue?
La corsa completa con le impostazioni attuali, calcolata nel momento in cui ne modifichi una. Ogni movimento di un cursore rielabora l'intero tracciato in modalità senza interfaccia in circa venti millisecondi, quindi trascinando l'anticipo vedi la traiettoria che produce, non una promessa. La linea spessa è il robot che si anima sulla stessa corsa quando premi Start.
Perché il robot non smette mai di sterzare nell'angolo molto acuto?
Entrambi i controllori hanno un raggio di curvatura minimo determinato dal passo della ruota e dall'angolo di sterzo massimo; un angolo più acuto non può essere seguito, qualunque cosa tu regoli. Le correzioni oneste sono a monte: ammorbidisci il percorso con un raccordo o un arco, oppure rallenta nell'angolo: è a questo che serve un profilo di movimento. Nessun controllore di sterzo può percorrere una geometria che il veicolo non ha.
Per approfondire
Fonti
Fonti autorevoli per andare oltre il modello didattico, volutamente limitato, di questo simulatore.