Padvolging voor robots: een leertraject
Geef een robot een lijst met waypoints en laat die ze rijden, en kun je in meters zeggen hoe goed het ging.
Padplanning en padvolging zijn verschillende problemen, en de meeste robotica-stof behandelt alleen het eerste. A* geeft je een route; niets daarin vertelt de wielen wat ze moeten doen. Dit leertraject is die ontbrekende schakel — alles tussen een lijst met waypoints en een robot die ze daadwerkelijk rijdt.
Werk de knopen in volgorde door. Elke knop is iets waar de volgende van uitgaat, en wie er één overslaat, krijgt een robot die dwaalt om een reden die je niet kunt isoleren.
Voordat je begint
Je hebt een robot met differentiële aandrijving nodig die je al kunt aansturen — twee motoren, een driver en een lus die op een constante snelheid draait. Het leertraject motorregeling dekt dat allemaal en dit leertraject veronderstelt dat eerst. Er is geen regeltheorie nodig; pure pursuit is meetkunde, geen PID.
Wat je aan het eind kunt
- Encoderpulsen van je wielen omzetten in een pose, en kunnen zeggen hoeveel die pose per gereden meter afdrijft op je eigen vloer.
- Een gyrosensor fuseren met een absolute referentie tot een koers die tijdens een missie niet wegloopt.
- Pure pursuit implementeren vanaf de krommingsformule, in ongeveer een dozijn regels, en elke regel kunnen uitleggen.
- De vooruitkijkafstand kiezen op basis van de gemeten regelvertraging van je robot in plaats van proefondervinding, en hem plannen op snelheid.
- Cross-trackfout meten tegenover grondwaarheid, en RMS, het slechtste geval en de plek langs het pad waar de fout zit rapporteren.
- Uitleggen waarom dezelfde regelaar veertien keer slechter is op een ruwe GPS-fix, en dat oplossen zonder de regelaar te wijzigen.
Waar mensen vastlopen
De regelaar afstemmen terwijl de schatting het probleem is. Als de robot denkt op het pad te staan, meldt hij nul fout en stuurt hij zelfverzekerd een heg in. Meet tegen een externe referentie voordat je aan de stuurversterkingen komt — een rolmaat telt mee.
Een simulatie zonder vertraging geloven. Een zuiver kinematische pure pursuit wordt beter naarmate de vooruitkijkafstand kleiner wordt, dus een model zonder vertraging beveelt precies één instelling aan: degene die op echte hardware oscilleert. Bouw een tijdsconstante voor de besturing en een detectievertraging in elk model waarop je afstemt.
Een globale zoektocht naar het dichtstbijzijnde punt. Het is de voor de hand liggende implementatie en hij faalt stilzwijgend op elk pad dat omkeert, waarbij hij een segment matcht dat de robot een minuut geleden reed. Houd de booglengte bij, zoek in een venster eromheen en laat de voortgang nooit teruglopen.
Een hoekpuntgelijkstand naar het inkomende segment oplossen. Voorbij een bocht projecteren beide aangrenzende segmenten naar hetzelfde punt op dezelfde afstand. Houd je het verkeerde vast, dan ziet een regelaar die op koers en laterale fout stuurt ongeveer nul van beide terwijl hij recht van het pad rijdt. Het is de stilzwijgendste bug op deze pagina.
Bouw het als de GPS-waypointrover, die precies deze volgorde volgt — eerst binnen op encoders, daarna buiten op een gefuseerde fix.
Wat je nodig hebt
| Wat | Waarom dit leertraject het nodig heeft | Opmerkingen |
|---|---|---|
| Encoders op beide wielen | De poseschatting die al het andere voedt | Hier niet optioneel — dit leertraject gaat over weten waar je bent |
| Een gyrosensor of IMU | Wielen kunnen geen rotatie meten die ze voorbijgeslipt hebben | Een MPU-6050 volstaat |
| Een lus met een vaste periode | Zowel de schatter als de regelaar integreren over de tijd | Vaste periode, of geef de werkelijk verstreken tijd door |
| Iets om tegen te meten | Zonder grondwaarheid kun je het volgen niet afstemmen | Een krijtlijn en een rolmaat verslaan elke hoeveelheid telemetrie |
| Een GPS-module (alleen voor het buitenste deel) | De laatste twee knopen | Binnen vindt hij helemaal geen fix |
Waarom dit leertraject in deze volgorde loopt
Dit leertraject is bijzonder, want de eerste vijf knopen gaan helemaal niet over besturen. Ze bouwen de poseschatting, omdat een padregelaar die op een verkeerde pose werkt op een manier faalt die precies lijkt op een slecht afgestemde regelaar — de robot meldt nul fout terwijl hij een heg in rijdt. Eerst de schatting goed hebben betekent dat je, wanneer je eindelijk de stuurversterkingen afstemt, kunt geloven wat je meet.
Encoders, dan odometrie, dan slip, in die volgorde. Elke corrigeert het optimisme van de vorige. Encoders vertellen je dat het wiel draaide; odometrie maakt van twee wielbewegingen één pose; slip vertelt je hoeveel van die pose fictie is, en specifiek dat de systematische fout lineair groeit met de afstand terwijl de willekeurige fout alleen als √N groeit.
De IMU sluit aan vóór de regelaar, omdat de koers het deel van de pose is dat voor een padvolger het zwaarst weegt en het deel waar wielen het slechtst in zijn. Een draaibeweging op de plaats schuurt beide banden bijna per definitie, dus de enige manoeuvre die de koers het meest verandert is degene die odometrie het slechtst meet. Een complementair filter fuseert de goede korte-termijnsnelheid van een gyrosensor met het goede lange-termijngemiddelde van een absolute referentie, en het resultaat is een koers die niet wegloopt.
Bewegingsprofielen komen vóór pure pursuit, omdat een padvolger continu snelheid opdraagt en een snelheidsopdracht met stappen een robot oplevert die schokt en slipt — precies de odometriefout opnieuw introduceren die je net drie knopen lang hebt bestreden.
Pure pursuit, dan de lab, dan cross-trackfout. De regelaar is ongeveer een dozijn regels en de meetkunde is eenvoudig; lastig is het kiezen van de vooruitkijkafstand en weten of het resultaat goed is. De lab bestaat zodat je de afweging rond de vooruitkijkafstand kunt zien gebeuren, en de cross-trackfoutknop bestaat zodat “hij rijdt goed” een getal wordt met een RMS en een slechtste geval.
GPS als laatste, en echt als laatste. Het verandert niets aan de regelaar en alles aan de schatting. Als je het als laatste doet, weet je zodra het volgen veertien keer slechter wordt al zeker dat de regelaar niet de reden is.
Controlepunten: hoe je weet dat een etappe is geland
| Etappe | De controle | Hoe een succes eruitziet |
|---|---|---|
| Encoders | Duw de robot met de hand 2 m langs een krijtlijn | Pulsen komen overeen met 2000 mm binnen 2%, bij beide wielen |
| Odometrie | Rijd een vierkant van 1 m en keer terug naar het startpunt | De gemelde pose sluit binnen enkele centimeters, en je kunt de fout per meter noemen |
| Slip | Voer een draaibeweging op de plaats uit en vergelijk de koers van de gyrosensor met die uit odometrie | Ze zijn het niet eens, en je kunt zeggen hoeveel — dat verschil is het schuren van de banden |
| IMU-fusie | Draai de robot langzaam 360° en laat hem daarna twee minuten stil staan | De koers keert terug naar de beginwaarde en drijft niet terwijl de robot stilstaat |
| Bewegingsprofielen | Geef een stapsgewijze snelheidsverandering en daarna een geprofileerde | De geprofileerde beweging laat de banden niet piepen; de stapsgewijze wel |
| Pure pursuit | Volg een rechte lijn met een start die 0,5 m ernaast ligt | Hij convergeert zonder overshoot, en je kunt je vooruitkijkafstand in meters noemen |
| Vooruitkijkafstand afstemmen | Halveer de vooruitkijkafstand bewust | Hij oscilleert — nu ken je de storingsvorm, en waarom een simulator zonder vertraging die verbergt |
| Cross-trackfout | Rijd een achtvorm en leg de fout vast tegenover grondwaarheid | Je kunt RMS en de fout in het slechtste geval rapporteren, en zeggen waar langs het pad het ergste zit |
| GPS | Leg tien minuten een statische fix vast zonder te bewegen | Je ziet het rondzwerven, in meters, dat je regelaar anders zou najagen |
Waar dit leertraject ophoudt
Dit leertraject neemt een gegeven pad en rijdt het. Het levert het pad niet op — dat is padplanning en kartering, en samen vormen de twee de volledige navigatiestack.
Het houdt ook op voor drie dingen. Obstakelvermijding tijdens het volgen — reageren op iets dat op een pad verschijnt dat je nog niet hebt gekozen — vraagt om een lokale planner onder de padvolger, en dat is een werkelijk moeilijker probleem dan beide helften afzonderlijk. Ackermann- en omnidirectionele besturing veranderen de meetkunde: pure pursuit past zich makkelijk aan een auto-achtige robot aan, maar de stap van kromming naar wielsnelheid hier is specifiek differentiële aandrijving — voor een basis die kan zijwaarts rijden, begin bij holonome aandrijving, en merk op dat een holonome robot strikt beter kan doen dan elke van de regelaars hier, omdat hij positie kan corrigeren zonder koers te verbruiken. En RTK GPS, die de fix buiten van meters naar centimeters brengt, is wat padvolging buiten echt nauwkeurig maakt — het is de moeite waard te weten dat het bestaat voordat je concludeert dat navigatie buiten simpelweg onnauwkeurig is.
Leerroute
De route
Volg de knooppunten op volgorde – elk ontgrendelt het volgende zodra je het hebt afgerond. Je voortgang wordt op dit apparaat opgeslagen.
0 / 11 klaar
Veelgestelde vragen
Veelgestelde vragen
Wat is het verschil tussen padplanning en padvolging?
Padplanning levert een route op; padvolging zorgt dat de wielen de lijn volgen. A* geeft je een lijst met waypoints en zegt absoluut niets over besturing, snelheid of wat je moet doen als de robot een halve meter links van zijn bedoelde plek belandt. Padvolging is dat ontbrekende deel: gegeven waar de robot denkt dat hij is en waar het pad loopt, bepaalt het wat de wielen op dit moment moeten doen. De meeste robotica-stof behandelt padplanning grondig en padvolging nauwelijks, en daarom dwaalt een robot met een correct plan zo vaak.
Hoe kies ik de vooruitkijkafstand voor pure pursuit?
Uit de gemeten regelvertraging van je robot, niet door proefondervinding. De vooruitkijkafstand moet ver genoeg vooruit liggen dat de robot er fysiek kan komen gegeven hoe lang de besturing erover doet om te reageren — te kort en hij oscilleert, te lang en hij snijdt bochten af. Meet de tijd tussen het geven van een besturingsopdracht en het moment dat de robot werkelijk draait, vermenigvuldig die met je snelheid en begin daar. Plan de afstand daarna op snelheid: dezelfde robot heeft bij 1 m/s een langere vooruitkijkafstand nodig dan bij 0,2 m/s, omdat de regelvertraging meer afstand oplevert.
Waarom werkt mijn padvolger in simulatie maar oscilleert hij op de robot?
Vrijwel zeker omdat de simulatie geen vertraging kent. Een puur kinematisch pure-pursuitmodel wordt monotonisch beter naarmate de vooruitkijkafstand kleiner wordt, dus als je op zo'n model afstemt, beveelt het de kleinste afstand aan — en dat is precies de instelling die op echte hardware oscilleert. Elk model waarop je afstemt moet een tijdsconstante voor de besturing en een detectievertraging bevatten, anders leert het je vol vertrouwen het omgekeerde van wat de echte robot nodig heeft.
Pure pursuit of Stanley — welke padregelaar moet ik gebruiken?
Pure pursuit voor robots met differentiële aandrijving en voor gladde paden; Stanley wanneer de nauwkeurigheid op de vooras zwaarder weegt dan de gladheid. Pure pursuit stuurt naar een punt verderop op het pad, wat hem vergevingsgezind en van nature glad maakt, ten koste van het afsnijden van bochten. Stanley combineert koersfout en cross-trackfout rechtstreeks, wat strakker volgt maar minder tolerant is voor een ruisende poseschatting. Voor een klein robotje binnen is pure pursuit vrijwel altijd de juiste eerste keuze.
Waarom volgt mijn robot buiten op GPS zo veel slechter?
Omdat de regelaar prima is en de poseschatting niet. Een consumenten-GPS-fix is nauwkeurig tot op enkele meters en bijwerkt met 1–10 Hz, terwijl wielodometrie nauwkeurig is tot op centimeters en bijwerkt zo snel als je hem uitleest. Geef dezelfde regelaar een fix die tussen twee updates door twee meter springt en hij gaat die sprongen achterna. De oplossing zit niet in de regelaar — het is GPS fuseren met odometrie en een koersbron, zodat de pose die de regelaar ziet glad is, en GPS de langzame drift laten corrigeren in plaats van de snelle regellus aan te sturen.
Waarom stuurt mijn robot vlak na een bocht van het pad af?
Dit is de hoekpuntgelijkstand, en het is de stilzwijgendste bug op het hele pad. Vlak voorbij een bocht projecteren beide aangrenzende padsegmenten naar hetzelfde punt op dezelfde afstand, zodat een naïeve zoektocht naar het dichtstbijzijnde punt het segment kan matchen dat de robot al heeft afgerond. Een regelaar die op koers en laterale fout stuurt, ziet dan ongeveer nul van beide en meldt de hele tijd dat hij perfect het pad volgt, terwijl hij recht van het pad rijdt. Houd de booglengte langs het pad bij, zoek alleen in een venster rond je laatste positie en laat de voortgang nooit teruglopen.