Bouw een lijndoolhofoplosser-robot met LSRB-routegeheugen
Een robot die zelfstandig een lijndoolhof verkent, elk kruispunt onthoudt en daarna van start tot eind zonder één verkeerde bocht de kortste route rijdt.
Een lijnvolger volgt. Een lijndoolhofoplosser beslist. Dat is de hele sprong die dit project maakt, en hij is groter dan hij lijkt: de robot stopt niet langer een regellus met wielen te zijn en wordt iets dat een omgeving verkent die het nog nooit heeft gezien, onthoudt wat het heeft gevonden en op basis daarvan handelt.
De truc is dat niets ervan de lijnvolger vervangt — het zit er bovenop. Onderaan houden dezelfde reflectiearray en dezelfde PID-lus de robot gecentreerd op de tape en weten ze niets van doolhoven. Daarboven kijkt een dunne beslissingslaag naar de momenten waarop de lijn vertakt, classificeert welk kruispunt hij tegenkomt, kiest een richting en schrijft één teken op. Die scheiding maakt het project overzichtelijk en is dezelfde tweelaagse splitsing die echte roboten overal gebruiken.
De bouwvolgorde is dus belangrijker dan anders. Je maakt eerst gewone lijnvolging echt stabiel — afgesteld in de simulator en daarna op een grote ovaal van echte tape — en voeg pas dan kruispunten toe. Sla die discipline over en elk mechanisch probleem, elke kalibratiedrift en elk wiel dat 2 mm uit de lijn staat, doet zich voor als een doolhofbug.
Volg de techniekstructuur hieronder van boven naar beneden. Elk knooppunt wordt beschikbaar zodra de vereisten zijn afgerond, en je voortgang wordt op dit apparaat opgeslagen, zodat je de robot in een weekend kunt bouwen zonder je voortgang kwijt te raken.
Stuklijst
| Onderdeel | Aantal | Geschatte kosten | Opmerkingen |
|---|---|---|---|
| Arduino Nano | 1 | $5 | A0–A7 levert acht analoge kanalen; de zes van een Uno zijn niet genoeg |
| IR-reflectiearray, 8 kanalen | 1 | $8–12 | Acht, en analoog. Kruispuntdetectie heeft de buitenste sensoren nodig |
| TB6612FNG | 1 | $3 | Het is de moeite waard: de spanningsval van ~2 V bij de L298N hindert de nauwkeurige bewegingen bij lage snelheid |
| TT-tandwielmotor | 2 | $4 | Versies met encoder worden sterk aanbevolen voor herhaalbare bochten |
| 2WD-chassis | 1 | $6–10 | |
| Accupakket | 1 | $6 | 2×18650, beveiligde houder |
| Matzwarte tape, 19 mm | 1 rol | $3 | En een grote lichte vloer of een bord om het doolhof op te leggen |
Totaal: ongeveer $35–45. De array met acht kanalen is het onderdeel waarop je niet moet bezuinigen, en de reden is specifiek: een robot detecteert een linkertak door te zien dat de buitenste linker sensoren donker worden terwijl het midden nog op de lijn ligt. Een array die maar iets breder is dan de tape kan dat fysiek niet zien, waardoor kruispuntdetectie gokwerk wordt, hoe goed de code ook is.
Waarom de array breder moet zijn dan de lijn
left branch array (8 channels, ~60 mm wide)
────────────────┐ [ x x x . . . . . ] outer left dark -> a branch
│
════════════════╪═══════ [ . . . x x . . . ] centre still on the line
│
Vuistregel: de array moet minstens drie keer zo breed als de tape zijn. Voor 19 mm tape is dat ongeveer 60 mm, en dat krijg je precies met een array van acht kanalen op 8 mm afstand. Met een smallere array kan de robot niet onderscheiden of “de lijn maakte een scherpe bocht” of “de lijn vertakte”, en dat is precies de beslissing waarop het hele project rust.
Bouw de robot in mijlpalen
De bouwvolgorde is hier belangrijker dan in enig ander project op deze site. Een doolhofoplosser is een lijnvolger met een beslissingslaag, en elke mechanische of kalibratiefout in de lijnvolger komt verkleed als een doolhofbug terug.
| # | Mijlpaal | De test | Geslaagd ziet er zo uit |
|---|---|---|---|
| 1 | Lijnvolgen werkt | Tien rondjes op een grote, gewone ovaal | Nul keer de lijn kwijt. Niet “meestal” — nul |
| 2 | Bochten herhaalbaar | Laat de robot tien keer 90° pivoteren en meet | Binnen ±3° en herhaalbaar |
| 3 | Kruispunt gezien | Rijd langzaam over een T en druk de array af | De buitenste sensoren worden donker vóór het midden |
| 4 | Kruispunt geclassificeerd | Rijd langzaam over elk kruispuntstype | Links / rechts / T / kruising / doodlopende weg allemaal correct benoemd |
| 5 | Eén bocht uitgevoerd | Rijd naar een linkertak, maak links en volg weer | Hij vindt de lijn terug en gaat verder |
| 6 | Route opgenomen | Rijd een kort doolhof af en druk de tekenreeks af | Een reeks zoals LSRB die overeenkomt met wat je zag |
| 7 | LSRB-vereenvoudiging | Voer de opgenomen route door de vereenvoudiger | LBL wordt S en elke regel wordt correct toegepast |
| 8 | Tweede rit | Rijd de vereenvoudigde route | Hij bereikt het doel zonder verkeerde bochten en zonder verkennen |
| 9 | Volledig doolhof | Een doolhof met meerdere doodlopende wegen | Verken, vereenvoudig en rijd daarna de kortste route |
Mijlpaal 1 is niet onderhandelbaar. “Volgt de lijn meestal” wordt “verzint af en toe een kruispunt”, en je besteedt een avond aan het foutzoeken in padvereenvoudiging voor een fout die in werkelijkheid een wiel 2 mm uit de lijn staat.
Mijlpaal 2 is de stap die mensen overslaan. Een doolhofoplosser voert honderden bochten per rit uit, en een bocht die steeds 5° te kort uitvalt, telt op tot de robot de lijn volledig verlaat. Dit is precies waar tandwielspeling zichtbaar wordt — een fout die van teken verandert naargelang de richting is mechanisch, geen afstemfout.
De tweelaagse splitsing, in code
Het is de moeite waard om de scheiding die dit project overzichtelijk maakt expliciet te zien:
┌─────────────────────────────────────┐
decision │ classify junction -> choose turn │ runs only at junctions
layer │ record a character -> simplify │ knows nothing about PWM
└──────────────────┬──────────────────┘
│ "turn left" / "keep going"
┌──────────────────▼──────────────────┐
following │ read array -> position -> PID │ runs every loop, ~200 Hz
layer │ -> left and right wheel speeds │ knows nothing about mazes
└─────────────────────────────────────┘
De onderste laag leert nooit wat een doolhof is. De bovenste laag raakt nooit een motor aan. Als er iets misgaat, vertelt die grens je welke helft je moet bekijken — en als je niet kunt zeggen in welke helft een bug zit, zijn de lagen niet goed gescheiden.
Hoe een goed resultaat eruitziet
| Meting | Typisch |
|---|---|
| Verkenningssnelheid | 0,15–0,25 m/s — langzaam genoeg om kruispunten betrouwbaar te classificeren |
| Snelheid op de terugrit | 0,3–0,5 m/s — niets te beslissen, dus hij kan harder |
| Nauwkeurigheid van kruispuntclassificatie | 100%. Minder en de opgenomen route is fout |
| Herhaalbaarheid van bochten | ±3° |
| Padvereenvoudiging | Een verkenningsroute van 30 tekens wordt doorgaans 8–12 |
De nauwkeurigheid van kruispunten is echt alles-of-niets, en dat verrast mensen. Eén verkeerd gelezen kruispunt verpest de opgenomen tekenreeks; de vereenvoudiger maakt daarna een ogend geldige maar verkeerde route en de terugrit rijdt zelfverzekerd tegen een muur. Er is geen gedeeltelijke score — daarom verloopt de verkenningsrit langzaam en win je de tijd terug op de terugrit.
Problemen oplossen
| Symptoom | Vermoedelijke oorzaak | Oplossing |
|---|---|---|
| Ziet kruispunten die er niet zijn | Een scherpe bocht leest als een tak | Verbreed de array; eis dat de buitenste sensoren minimaal een bepaalde afstand donker blijven |
| Mist kruispunten | Rijdt te snel of array is te smal | Verminder de verkenningssnelheid; controleer dat de array minstens drie keer zo breed is als de tape |
| Bochten zijn inconsistent | Speling of geen encoders | Nader een bocht altijd op dezelfde manier aan; meet de speling |
| Opgenomen route bevat extra tekens | Kruispunt tweemaal gedetecteerd | Voeg een dode tijd toe na een kruispunt voordat je naar het volgende zoekt |
| Vereenvoudiging levert een verkeerde route op | Een regel in de verkeerde volgorde toegepast | Test LBL→S, LBR→B, SBL→R en soortgelijke afzonderlijk |
| Terugrit mislukt bij de eerste bocht | Route opgenomen ten opzichte van verkeerde koers | De tekenreeks is een reeks relatieve bochten — controleer de afspraak |
| Werkt in het ene doolhof, maar niet in het andere | Afstand tussen kruispunten te klein voor de dode tijd | Verminder de dode tijd of rijd nog langzamer |
| Verliest de lijn na een bocht | Bocht schiet voorbij de nieuwe lijn | Draai totdat de middelste sensoren de lijn weer vinden, niet tot een vaste hoek |
| Drift wordt erger tijdens de rit | Accu zakt in en de effectieve versterkingen veranderen | Sluit een snelheidsregellus met encoders |
Waar je daarna kunt gaan
Voeg encoders toe en draai op basis van de afgelegde afstand in plaats van op basis van tijd. Tijdgestuurde bochten zijn de grootste bron van onbetrouwbaarheid in een eerste doolhofoplosser, omdat de benodigde tijd verandert met de accuspanning en de ondergrond. Bochten op basis van de afgelegde afstand en de encoders hebben dat probleem niet.
Ga naar een doolhof met muren — de micromouse — waarin tape wordt vervangen door muren en de LSRB-regel door flood fill. Dat is de werkelijk grotere stap: LSRB is een heuristiek voor muurvolgen die een pad vindt, terwijl flood fill het kortste pad berekent en opnieuw een route bepaalt zodra nieuwe muren worden ontdekt.
Optimaliseer de terugrit. Zodra het pad bekend is, hoef je niets meer te beslissen en kan de robot op rechte stukken versnellen en alleen voor bochten vertragen. Een bewegingsprofiel over de bekende route levert de grote tijdwinst op — vaak halveert het de terugrit.
Projectroadmap
De bouwroute
Volg de techboom van onderdelen tot een werkende robot. Elk knooppunt wordt ontgrendeld zodra de voorwaarden klaar zijn, en je voortgang wordt op dit apparaat opgeslagen.
0 / 21 klaar
Componenten
- ControllerArduino UnoHet vergevingsgezinde 8-bits bord waarmee de meeste mensen robotica leren.
- SensorIR-reflectiesensorarrayEen rij infrarode ogen die een robot vertelt waar de lijn ligt.
- DriverTB6612FNG-motordriverEen MOSFET-H-brug die meer spanning aan de motor doorgeeft.
- ActuatorDC-gelijkstroommotor (TT Motor)De gele tandwielmotor die een kale basis in een rijdende robotauto verandert.
- Chassis2WD-robotchassisDe basis waarop twee motoren, een vrij zwenkwiel en je elektronica worden gemonteerd.
- VoedingAccu- en voedingspakket voor robotsHet verschil tussen een robot die blijft draaien en een robot die steeds opnieuw opstart.
Tutorials in deze route
- Beginner · 20 min lezenBouw een lijnvolger: van sensoren tot PID-besturingVan IR-reflectiesensoren via een gewogen fout naar vloeiende PID-besturing — zo werkt een lijnvolger echt.
- Beginner · 20 minEen IR-reflectiearray lezen voor lijnvolgenMaak van een rij IR-sensoren één vloeiende lijnpositie waarop je kunt sturen.
- Beginner · 18 min lezenEen PID-regelaar afstellen: een praktische gidsEen praktische volgorde om P, I en D af te stellen zonder gokwerk — en hoe je elke stap live kunt uitproberen.
- Gevorderd · 14 min lezenLijnmaze-kruisingen detecteren met een IR-arrayClassificeer T, kruis, links, rechts, doodlopende weg en finish met een reflectie-array en los de twijfelgevallen op.
- Gevorderd · 15 min lezenLSRB-padvereenvoudiging voor lijnmazrobotsLeg de bochten vast als L, S, R en B en klap dan elke doodlopende omweg in tot de optimale route.
Oefen voordat je bedraadt
Stem het af in de live simulator
De bouwroute loopt via een lab in de browser. Krijg het gedrag hier goed en zet je instellingen daarna over naar de echte robot.
Veelgestelde vragen
Hoe maak je een doolhofoplossende robot met Arduino?
Begin met een werkende lijnvolger: een reflectiearray, een PID-lus en een motordriver. Voeg daar bovenop een beslissingslaag toe die kruispunten herkent, met de linkerhandregel een tak kiest en elke bocht als een van vier tekens vastlegt — L, S, R of B. Bereikt de robot het eindpunt, dan halen vervangingsregels elke omweg door een doodlopende weg uit die tekenreeks en volgt de tweede rit de vereenvoudigde route. Dit bouwpad loopt de hele keten door en je stelt de lijnvolglaag eerst in een browsersimulator af.
Wat is het LSRB-algoritme in een lijnvolger?
LSRB staat voor Left, Straight, Right en Back (links, rechtuit, rechts en terug) — de vier bewegingen die een robot op een kruispunt kan maken. De robot legt tijdens de verkenning per kruispunt één teken vast en elke B markeert een doodlopende weg waaruit hij moest terugkeren. Zes vervangingsregels vervangen elk venster van drie tekens rond een B door de enkele bocht die hetzelfde effect zou hebben gehad. Daardoor verdwijnt de hele omweg. Herhaal dit totdat er geen B meer over is en je hebt de kortste route.
Wat is het verschil tussen een lijndoolhof en een doolhof met muren?
Een lijndoolhof is zwarte tape op een licht bord, waargenomen met een naar beneden gerichte reflectiearray; een doolhof met muren — het Micromouse-formaat — heeft fysieke muren die met afstandssensoren worden waargenomen. De waarneming is volledig anders, maar de laag erboven is dezelfde: verkennen om kennis op te bouwen en daarna de beste route rijden. Een lijndoolhof is veel goedkoper om te bouwen en daarom gebruiken school- en collegewedstrijden er meestal een.
Moet ik onderdelen kopen voordat ik met dit project begin?
Nee. De lijnvolglaag, de PID-versterkingen en het gedrag van eerst verkennen en daarna optimaliseren draaien allemaal in de browsersimulatoren, dus je kunt de hele robot begrijpen voordat je geld uitgeeft. Alleen de laatste vier stappen — bedrading, kalibratie, de verkenningsronde en de herhaling — vereisen de fysieke Arduino, sensorarray, motordriver, motoren, chassis en accu.
Waarom maakt mijn doolhofrobot op de verkeerde kruispunten een bocht?
Bijna altijd omdat hij te vroeg beslist. Het ogenblikkelijke sensorpatroon kan een T-kruispunt niet van een kruising onderscheiden — beide lezen zwart over de hele array. De robot moet vastleggen welke takken verschenen, ongeveer één robotlengte vooruit rijden en opnieuw lezen om vast te stellen of de lijn ook rechtdoor ging. Beslissen op basis van de eerste meting is de meest voorkomende oorzaak van zelfverzekerde verkeerde bochten.
Werkt LSRB in elk doolhof?
Alleen in een perfect doolhof — een zonder lussen, waarin precies één pad elk tweetal punten verbindt. Lijndoolhoven op tape zijn dat vrijwel altijd. Bevat het doolhof een cyclus, dan kan de linkerhandregel eindeloos rondlopen en is er geen doodlopende weg voor de regels om weg te werken; dan heb je een echte kaart en een zoekmethode op een graaf, zoals flood fill, nodig.