Simulatie van baanvolging: pure pursuit en Stanley
Parcours met pure pursuit of Stanley en echte stuurvertraging. Versleep de vooruitkijkafstand en de run tekent zich opnieuw af, met wat 1 Hz GPS-fix je kost.
- Categorie
- Autonome robots
- Tijd
- 20–40 min
- Platform
- Browser · Arduino · Raspberry Pi
01 / Begin hier
Inleiding
Een planner geeft je een pad; niets daarin vertelt de wielen wat ze moeten doen. Dit lab is dat ontbrekende sportje. Pure pursuit en Stanley volgen hetzelfde waypointparcours met een eerste-ordere stuurrespons en detectielatentie, want een model zonder vertraging laat een verkeerde afstemming optimaal lijken. Versleep een waypoint of de vooruitkijkafstand en de hele run wordt opnieuw berekend.
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.
Bediening
Regelaar schakelt tussen pure pursuit en Stanley. Vooruitkijkafstand is de enige parameter van pure pursuit en is uitgeschakeld voor Stanley, dat er geen gebruikt — dat is zelf al het punt.
Snelheid en vooruitkijkafstand werken op elkaar in, en dat is waar je mee kunt spelen: stel 1 m/s in en zoek de beste vooruitkijkafstand, stel dan 3 m/s in en zoek hem opnieuw.
Positie uit vervangt perfecte odometrie door een fix van 1 Hz met ruis op meterschaal, die tussen de updates wordt vastgehouden. De fout wordt altijd tegen de waarheid gescoord, dus de straf is echt en niet verborgen.
Sleep een willekeurig waypoint, of druk op 1–8 om er een te selecteren en verplaats het met de pijltjestoetsen. De hele run wordt opnieuw berekend terwijl je sleept.
Theorie
Beide regelaars beantwoorden dezelfde vraag — gegeven waar ik ben en waar het pad loopt, welke stuurhoek? — en beantwoorden die volledig verschillend.
Pure pursuit is geometrie. Zoek het punt op het pad op een vooruitkijkafstand L verderop en rij de cirkelboog daardoorheen:
κ = 2y / L_d² δ = atan(2 b sin α / L_d)
met y de laterale offset van het doelpunt in het robotframe en b de wielbasis. Eén parameter, en het is een afstand in plaats van een versterking — dus hij is overdraagbaar tussen robots.
Stanley is regeltechniek. Neem de vooras als referentie en tel er twee termen bij op:
δ = θ_e + atan(k · e / v)
richtingsfout plus een arctangens van de dwarslijnfout. Delen door de snelheid is wat één versterking over een snelheidsbereik laat werken. k is een echte regelversterking en is niet overdraagbaar.
Het lab voegt toe wat klassieke afleidingen weglaten: 0,4 s totale latentie, als een eerste-ordere stuurrespons van 0,25 s plus 0,15 s detectie- en rekenvertraging. Zonder die latentie wordt pure pursuit monotonisch beter naarmate de vooruitkijkafstand kleiner wordt, en verdwijnt de hele afstemvraag.
Algoritme
Elke stap, voor beide regelaars:
- Projecteer op het pad, zoekend in een venster rond de laatst bereikte booglengte in plaats van over het hele pad. Een globale zoekactie matcht het dichtstbijzijnde segment, dus een parcours dat omkeert stuurt de voortgang van de robot naar een hoek die hij een minuut geleden al passeerde.
- Los een gelijkspel op een knooppunt op naar het uitgaande segment. Na een hoek projecteren beide aangrenzende segmenten naar hetzelfde punt op dezelfde afstand; het binnenkomende segment vasthouden geeft de regelaar een richtingsfout en een laterale offset die beide vrijwel nul zijn terwijl hij in rechte lijn van het pad af rijdt, zonder enig signaal.
- Bereken de stuurhoek volgens de eigen regel van de regelaar en begrens hem op de mechanische grens.
- Pas de latentie toe en integreer daarna het fietsmodel.
- Score tegen de waarheid, nooit tegen de schatting.
Stap 2 is geen optimalisatie. Het was het verschil tussen een werkende Stanley en een Stanley die bij elke enkele run op precies 78% zelfverzekerd het parcours verlaat.
Broncode
Pure pursuit, compleet, in de vorm die het op een echte robot aanneemt:
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
}
De drie regels die ertoe doen zijn de ondergrens van het schema, de monotone lastS en de begrenzing van ld. Al het andere is de formule.
Aannames en hardwareverschillen
Het lab geeft de robot een perfecte kaart van het pad, een perfect bekende wielbasis, geen wielslip en een latentie die een zuiver eerste-ordemodel is. Een echte robot heeft daar geen van allemaal.
Wielslip maakt de positieschatting fout op een manier die geen enkele regelaar kan detecteren. Tandwielspeling voegt bij elke stuurterugslag doodlopende verplaatsing toe, wat zich gedraagt als extra latentie en de optimale vooruitkijkafstand omhoog duwt. En een differentiaalaandrijving heeft helemaal geen stuurhoek — die heeft een gevraagde draaisnelheid, dus ω = v κ vervangt de atan en de wielbasis is alleen nog van belang voor hoe strak hij kan draaien.
Wat daarvan overblijft is de vorm: een optimum binnen het bereik, dat met de snelheid naar rechts schuift, en een fout bij dat optimum die met de snelheid groeit, hoe dan ook.
Schakelschema
De regelaar is het goedkope deel. Wat hij van de rest van de robot nodig heeft, is het dure deel.
Positie. Kwadratuurencoders op beide wielen en differentiaale odometrie die ze integreert, op de snelheid van de regelkring. Binnenshuis is dat voldoende voor enkele tientallen meters.
Koers. Een gyro voor de korte termijn, een magnetometer als absolute referentie, of allebei. De richtingsfout is de term die beide regelaars het zwaarst wegen, en het is de eerste die de odometrie verliest.
Een absolute correctie, buiten. Een GPS-module die in de schatting wordt gefuseerd in plaats van rechtstreeks te worden gevolgd — het verschil is 0,09 m RMS-fout tegenover 1,25.
Voor de volledige theorie, zie pure pursuit en dwarslijnfout; om het te bouwen, de GPS-waypointrover begint binnenshuis op encoders en gaat pas naar buiten zodra de volger werkt.
Hardwarechecklist
Componenten
- Een onderstel waarvan je het stuurwerk of de wielsnelheden rechtstreeks kunt aansturen
- Een positieschatting — minimaal encoders, buiten gefuseerd met GPS
- Een richtingsbron die over een hele run niet drift
- Een regelkring die snel genoeg is dat de eigen latentie kleiner is dan je vooruitkijkafstand
Verken de graaf
Waar deze simulator wordt gebruikt
De projecten, leerroutes en tutorials die op dit lab voortbouwen.
Verder bouwen
Hulpmiddelen downloaden
Gebruik deze naslag op de pagina terwijl je het project doorwerkt. Downloadbare projectpakketten komen er pas bij nadat hun broncode en versie zijn gepubliceerd.
Veelgestelde vragen
Veelgestelde vragen
Waarom volgt een kortere vooruitkijkafstand niet altijd beter?
In een model zonder latentie wel, en juist daarom misleiden zoveel klassieke afleidingen. Echte roboten hebben tijd nodig om een gevraagde stuurhoek te bereiken en handelen op een pose die al tientallen milliseconden oud is. Dit lab modelleert een stuurtijdconstante van 0,25 seconde en 0,15 seconde detectielatentie. Met die latentie wordt de foutcurve een U: een korte vooruitkijkafstand vraagt een correctie die pas aankomt als de robot de fout al voorbij is, dus overstuurt het volgende commando. Een regelaar die sneller is dan zijn eigen actuator oscilleert.
Hoe kies ik de vooruitkijkafstand voor mijn robot?
Meet je totale regellatentie, vermenigvuldig die met je snelheid en begin tussen een en twee keer die afstand. In dit lab is de latentie 0,4 seconde, en de gemeten optima zijn 0,9 meter bij 1 m/s oplopend tot 1,4 meter bij 3 m/s — tussen de 1,2 en 2,3 keer de afgelegde afstand tijdens de latentie. Merk op dat het optimum met de snelheid groeit maar minder dan evenredig, dus een vast aantal seconden rijtijd komt in de buurt maar klopt niet. Lever het als een klein lineair schema op de snelheid met een harde ondergrens, want bij stilstand wil dat schema naar nul.
Wat is beter, pure pursuit of Stanley?
Ze falen op verschillende manieren, en dat is het bruikbare antwoord. Over dit parcours bij 2 m/s snijdt pure pursuit de bochten af en eindigt het 0,8 procent onder de gevraagde padlengte; Stanley weigert de lijn te verlaten, gaat ruimer uit de bocht en rijdt 2,2 procent te ver. Stanley houdt waar het telt een strakkere lijn aan, maar besteedt 18,5 radiaal aan sturen tegenover 4,3 voor pure pursuit — viermaal zoveel beweging van de actuator, stroom en bandenslijtage. Gebruik pure pursuit als het pad een suggestie is en Stanley als het een randvoorwaarde is.
Waarom wordt de fout gemeten tegen de werkelijke positie in plaats van tegen de schatting?
Omdat een robot die denkt op het pad te staan per definitie nul fout meldt. Zet de positiebron op GPS en de regelaar gaat sturen op een ruisige fix van één seconde oud, terwijl het lab blijft scoren tegen de pose die het model werkelijk heeft geïntegreerd. Dat is de enige reden dat de GPS-straf als getal zichtbaar wordt: 0,09 meter RMS-fout wordt 1,25, en de stuurinspanning wordt meer dan vier keer zo groot.
Wat toont de vage lijn?
De volledige run bij de huidige instellingen, berekend op het moment dat je er één wijzigt. Elke schuifregelaar rekent het hele parcours zonder weergave opnieuw uit in ongeveer twintig milliseconden, zodat het slepen van de vooruitkijkafstand je het traject laat zien dat het oplevert in plaats van een belofte erover. De dikke lijn is de robot die over diezelfde run animeert wanneer je op Start drukt.
Waarom stopt de robot nooit met draaien bij de zeer scherpe hoek?
Beide regelaars hebben een minimale draaicirkel die wordt bepaald door de wielbasis en de maximale stuurhoek, en een scherpere hoek dan die kun je niet volgen hoe je ook afstemt. De eerlijke oplossingen liggen stroomopwaarts: het pad gladstrijken met een afronding of een boog, of afremmen voor de hoek, en daar is een bewegingsprofiel precies voor. Geen stuurregelaar kan een geometrie rijden die het voertuig niet heeft.
Verder lezen
Bronnen
Gezaghebbende bronnen om dieper te gaan dan het afgebakende leermodel van deze simulator.