BouwrouteGevorderdEen weekend

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.

Technisch schema: Bouw een lijndoolhofoplosser-robot met LSRB-routegeheugenJUNCTIONS → L S R B → ROUTEBB

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

100%
Bouw

Verbind de robot

45 min

Bouw

Kalibreer op je eigen baan

20 min

Bouw

Maak gewone lijnvolging stabiel

60 min

Bouw

Voer de verkenningsronde uit

45 min

Bouw

Speel de vereenvoudigde route opnieuw af

30 min

Doel

Lijndoolhofoplosser voltooid

Je hebt hem gebouwd

Componenten

Tutorials in deze 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.