Simulatie van obstakelvermijding voor mobiele robots
Leer reactieve navigatie, afstandsmeting en veilig stoppen met een robotica-simulatie voor obstakelvermijding, bedoeld voor Raspberry Pi-projecten.
- Categorie
- Raspberry Pi
- Tijd
- 2–3 uur
- Platform
- Browser · Raspberry Pi
01 / Begin hier
Inleiding
Obstakelvermijding zet onvolledige, ruisige metingen om in veilige beweging. Dit project scheidt waarneming, veiligheid en besturing zodat je over elke laag kunt nadenken voordat je een mobiele robot inzet. De simulatie laat sensordekking, stopafstand en storingsgevallen zien in plaats van te doen alsof één reactieve regel elk navigatieprobleem oplost.
Live lab / Reactive range-sensing navigation
Obstacle avoidance simulator
Drive a mobile robot toward the goal while a fan of range sensors keeps it clear of obstacles. Reposition the scene by dragging or with the coordinate controls, add noise, and compare two steering rules.
Lines are sensor rays; a brighter ray marks the nearest reading. The dashed line ahead is the predicted stopping distance. The green ring is the goal. Drag a scene item or use the position controls below.
- Status
- Seeking
- Distance to goal
- 630 px
- Min clearance
- 170 px
- Stopping distance
- 24 px
- Elapsed
- 0.0 s
Keyboard: focus the workspace, then use Space to run/pause, N to step, R to reset, D to add an obstacle, and F for full screen.
Bediening
De werkruimte bevat verplaatsbare obstakels, robotsnelheid, detectiebereik, gezichtsveld, meetruis en een drempel voor de veiligheidsafstand. Sensorstralen en de voorspelde stopafstand blijven zichtbaar. De stapmodus laat precies zien welke waarneming elke stuurbeslissing veroorzaakte.
Theorie
Een robot moet stoppen of draaien voordat zijn meegesweerde voetafdruk een obstakel raakt. De veilige afstand hangt af van de huidige snelheid, de latentie van de regelaar, het remvermogen, de onzekerheid in de meting en de fysieke straal van de robot — niet alleen van de laatste afstandswaarde.
Reactieve regelaars zoals potentiaalvelden maken van nabije obstakels afstotende vectoren en van het doel een aantrekkende vector. Ze reageren snel, maar kunnen in lokale minima vast komen te zitten. Een praktische opbouw combineert reactieve veiligheid met een globale of lokale planner.
Algoritme
- Verwerp verouderde en fysisch onmogelijke afstandsmonsters.
- Transformeer geldige waarnemingen naar het robotcoördinatenstelsel.
- Vergroot elk obstakel met de robotstraal plus een veiligheidsmarge.
- Bereken de stopafstand uit snelheid en geschatte vertraging.
- Stop wanneer de gang vooruit onveilig is; stuur anders naar de meest vrije sector die op het doel is gericht.
- Begrens versnelling en hoeksnelheid voordat je motorcommando’s verstuurt.
Broncode
Houd de noodbepaling klein genoeg om uitputtend te testen:
def safe_velocity(target, ranges, stop_distance):
front = [r for angle, r in ranges if abs(angle) < 0.35]
if not front or min(front) <= stop_distance:
return 0.0, choose_clear_turn(ranges)
return limit_acceleration(target), steer_toward_clearance(ranges)
In een echt systeem leg je tijdstempels van sensoren vast en ga je in een veilige gestopte toestand wanneer benodigde gegevens onbeschikbaar worden.
Aannames en hardwareverschillen
De wereld is van bovenaf gezien en tweedimensionaal: sensorstralen zijn direct, volledig dun en worden nooit door het eigen chassis van de robot geblokkeerd, en de robot is een schijf die zonder momentum tot stilstand kan remmen. Op een Raspberry Pi-robot loopt een ultrasone bundel 15° uiteen, hangen time-of-flight-metingen af van het oppervlak en de zon, en wordt de stopafstand bepaald door echte massa, motorkoppel en de latentie van waarnemen-beslissen-handelen — allemaal besproken in de routekaart voor reactieve navigatie. De simulatie negeert ook jitter in de lus en spanningsval, dus neem de stopafstandcurve als de vorm die je moet internaliseren, niet als een getal dat je overneemt.
Schakelschema
Niveauverschuif elk 5 V-echosignaal voordat het de GPIO van de Raspberry Pi bereikt. Voed de motoren apart en verbind de massa’s op een bewust gekozen gemeenschappelijk punt.
Begeleide experimenten
1. Leid de stopdrempel af in plaats van hem te gokken
Stel een lage snelheid in en verlaag de stopdrempel totdat de robot obstakels gaat raken. Noteer de waarde. Verdubbel nu de snelheid en herhaal dat.
De drempel die je nodig hebt verdubbelt niet, omdat die de som is van een term die schaalt met de snelheid en een term die schaalt met het kwadraat ervan:
stop_distance = (v x t_latency) + (v^2 / (2 x a_brake)) + robot_radius + margin
| Snelheid | Reactieterm (80 ms) | Remterm (1 m/s²) | Totaal, met 90 mm straal + 50 mm marge |
|---|---|---|---|
| 0,15 m/s | 12 mm | 11 mm | 16 cm |
| 0,30 m/s | 24 mm | 45 mm | 21 cm |
| 0,60 m/s | 48 mm | 180 mm | 37 cm |
| 0,90 m/s | 72 mm | 405 mm | 62 cm |
Daarom begint een robot die bij loopsnelheid betrouwbaar uitwijkt dingen te raken zodra je hem versnelt — en daarom is de oplossing een snelheidsafhankelijke drempel in plaats van één grote vaste waarde die de robot overal schuchter maakt.
2. Veroorzaak het stotteren van de drempel en repareer het
Park de robot zo dat hij vlak op de stopafstand balanceert. Met één drempel wisselt hij meerdere keren per seconde tussen rijden en draaien.
Scheid nu de twee: stop bij 20 cm en ga pas verder bij 30 cm. Het stotteren verdwijnt omdat het gedrag zich moet vastleggen. Dat gat is hysterese, en hetzelfde patroon verhelpt vrijwel elke door een drempel veroorzaakte oscillatie in robotcode.
3. Vang hem bewust
Bouw een concave hoek — een hoefijzer — en laat de robot erin rijden. Met een deterministische regel „draai naar de meest open richting“ draait hij, rijdt hij en komt hij steeds weer terug op zijn startpunt.
Dit is geen fout om te repareren. Dit is wat het ontbreken van een kaart betekent, en het is het duidelijkst mogelijke bewijs van de grens van reactieve navigatie. De tegenmaatregelen zijn een willekeurige component in de draai en een vastlopersensor die opschaling toepast na meerdere mislukte pogingen; de échte oplossing is geheugen, en dat is een volledig ander pad.
4. Vergelijk scantresolutie met scantijd
Vergroot het aantal scanhoeken en zie twee dingen in tegengestelde richting bewegen: de draaibeslissingen worden beter, en de robot staat langer stil.
Een scan is een blind moment — de robot staat stil en maakt geen vordering. Drie tot vijf hoeken is de gebruikelijke beste keuze, en daarboven is de extra informatie zelden de extra tijd waard.
Wat je moet zien
| Gedrag | Oorzaak |
|---|---|
| Raakt obstakels bij hoge snelheid | Drempel niet geschaald voor de kwadratische remterm |
| Stottert op een vaste afstand | Eén drempel, geen hysterese |
| Slingert ter plaatse heen en weer | Opnieuw beslissen voordat de draai iets heeft veranderd |
| Loopt eindeloos rond in een hoek | Deterministische ontsnapping uit een symmetrische val |
| Stopt overal veel te vroeg | Drempel ingesteld op het slechtste geval in plaats van op de huidige snelheid |
| Draait naar de rand van een opening | Kiest de maximale hoek in plaats van een gewogen zwaartepunt |
Naar de hardware
De stralen van de simulatie zijn direct, ruisvrij en oneindig dun. Een echte ultrasone sensor is geen van die dingen, en de verschillen vormen het hele werk op hardware:
| Dit lab | Een HC-SR04 op een echte robot |
|---|---|
| Een dunne straal | Een kegel van ~15°, ongeveer 53 cm breed op 1 m afstand |
| Elke oppervlak kaatst terug | Zachte en steil hellende oppervlakken geven helemaal niets terug |
| Directe metingen | Tot 25 ms per ping, ~60 ms ertussen |
| Geen servo | 100–200 ms stabilisatietijd per scanhoek |
| Geen ruis | Af en toe een uitschieter die een mediaanfilter nodig heeft |
| Ziet alles | Een gordijn is onzichtbaar — en daarom monteer je stuitschakelaars |
Bepaal hier een veilige stopafstand en een regel voor de vrijste richting, waar een fout niets kost. Voeg op hardware daarna het mediaanfilter, de stabilisatietijd van de servo en de contactdetectie toe — de tutorial over het vermijdingsalgoritme heeft ze alle drie in code.
Hardwarechecklist
Componenten
- Raspberry Pi met een ondersteunde voeding
- Twee of meer time-of-flight- of ultrasone sensoren
- Optionele cameramodule voor visuele detectie
- Motordriver met aparte motorvoeding
- Differentiaalonderstel met encoders
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 is één voorwaarts gerichte sensor niet genoeg?
Eén bundel laat blinde vlekken vlak bij de robot en kan een smal voorwerp niet onderscheiden van een muur. Meerdere kijkhoeken of een scannersensor leveren genoeg geometrie om een veiligere bocht te kiezen.
Vervangt obstakelvermijding baanplanning?
Nee. Reactieve vermijding handelt directe gevaren af, terwijl een planner vooruitgang naar een doel selecteert. Robuuste robots combineren beide en laten de veiligheidslaag onveilige geplande beweging overschrijven.
Ultrasone sensor of time-of-flight — welke is beter voor obstakelvermijding?
Ultrasone sensoren zijn goedkoop en werken op de meeste oppervlakken, maar hebben een slechte hoekresolutie en een blinde zone dicht bij de sensor. Time-of-flight-sensoren (ToF) geven sneller en nauwkeuriger afstand op korte afstand en een smalle bundel, maar kunnen worden verstoord door fel zonlicht, donkere of spiegelende oppervlakken en hoekreflecties. Veel robots gebruiken ultrasoon voor grove dekking en ToF waar nauwkeurige detectie op korte afstand telt.
Wat is een blinde zone van een sensor en waarom is die belangrijk?
De blinde zone is de minimale afstand waarbinnen een sensor geen geldige afstand kan melden — voor ultrasone sensoren wordt die bepaald door de lengte van de uitgezonden puls. Een obstakel binnen de blinde zone leest als vrij, dus een robot die de ruwe waarde vertrouwt kan ergens tegenaan rijden dat vlak voor hem staat. Monteer sensoren zo dat de blinde zone binnen de eigen voetafdruk van de robot valt, en behandel verdacht kleine metingen als ongeldig.
Hoe bereken ik een veilige stopafstand?
De veilige afstand is de reactieafstand plus de remafstand plus de straal van de robot en een marge. De reactieafstand groeit lineair met de snelheid (snelheid maal de latentie van waarnemen-beslissen-handelen), maar de remafstand groeit met het kwadraat van de snelheid, dus de benodigde vrije ruimte groeit sneller dan de snelheid zelf. Daarom kan een kleine snelheidsverhoging om een veel grotere veilige afstand vragen.
Waarom blijft mijn robot staan voor een obstakel?
Reactieve methoden zoals potentiaalvelden kunnen in een lokaal minimum terechtkomen waar de afstotende kracht van een obstakel de aantrekking naar het doel opheft, waarna de robot stilstaat of oscilleert. Sturen langs de grootste opening, in combinatie met een globale of lokale planner boven de reactieve laag, houdt de robot ervan zichzelf vast te zetten.
Hoe filter ik ruisige afstandsmetingen?
Verwerp fysisch onmogelijke waarden en plotselinge sprongen in plaats van erop te reageren, geef elke meting een tijdstempel en pas een licht mediaan- of tijdfilter toe om ongewenste echo's te onderdrukken. Als benodigde gegevens verouderd of onbeschikbaar worden, ga dan in een veilige gestopte toestand in plaats van op een gok te sturen.
Verder lezen
Bronnen
Gezaghebbende bronnen om dieper te gaan dan het afgebakende leermodel van deze simulator.