Simulatie van een lijndoolhofoplosser met LSRB-routering
Rij een lijndoolhofoplosser in je browser: een doolhof van tape, kruispuntdetectie en de LSRB-regels die een doodlopende route terugbrengen tot de kortste.
- Categorie
- Arduino
- Tijd
- 2–3 uur
- Platform
- Browser · Arduino
01 / Begin hier
Inleiding
Een lijndoolhofrobot is een lijnvolger die ook kan beslissen. Dit lab rijdt er een over zwarte tape, classificeert elk kruispunt en schrijft één teken per zet. Bij het eindpunt zie je de LSRB-vervangingsregels een voor een vuren, elke omweg door een doodlopende weg uit het verslag vouwen, totdat er een tekenreeks zonder B overblijft — de kortste route, die de robot daarna opnieuw rijdt.
Live lab / Junction detection & LSRB route memory
Line maze simulator
A line follower drives a taped maze, recording every turn as L, S, R or B. Watch it back out of dead ends, then watch the substitution rules collapse that string into the shortest route — and drive it again.
The dark lines are the tape. The orange trail is everywhere the robot drove while exploring, dead ends included; the teal line is the simplified route it speed-runs. The bar above the robot is its eight-channel reflectance array — a whole side lights up when a branch opens there.
- Tape
- Explored (dead ends included)
- Simplified route
- Finish
Route memory
The robot writes one symbol per move. Every B is a dead end it had to reverse out of.
Press Start — the string builds as the robot drives.
- Phase
- Ready
- Junction
- —
- Explored turns
- — moves
- Simplified turns
- — moves
- Saved
- —
- Maze
- —
Keyboard: focus the maze, then use Space to run/pause, N to step, R to reset, M for a new maze, and F for full screen.
Bediening
Modus kiest tussen de volledige rit in drie bedrijven — verkennen, vereenvoudigen, en daarna in recordtempo — en direct naar de afgewerkte route springen. Simulatiesnelheid stelt in hoe snel de robot rijdt. Starten, Pauzeren en Stap laten hem doorlopend of per zet draaien, Resetten speelt hetzelfde doolhof opnieuw af, en Nieuw doolhof genereert een nieuw doolhof. Focus het canvas en gebruik spatie, N, R, M en F voor dezelfde bediening vanaf het toetsenbord.
De strook met het routegeheugen onder het doolhof is het deel om in de gaten te houden. Hij vult zich met één symbool per zet terwijl de robot rijdt, en herschrijft zichzelf tijdens de vereenvoudigingsfase zodra elke vervanging vuurt.
Theorie
Een lijndoolhofrobot is in twee lagen opgebouwd, en ze gescheiden houden is wat hem hanteerbaar maakt.
De onderste laag is een gewone lijnvolger. Een reflectiesensorarray met acht kanalen leest de tape, de aflezingen vallen samen tot één gewogen fout, en een PID-lus maakt daarvan twee verschillende wielsnelheden. Deze laag weet niets over doolhoven.
De bovenste laag wordt alleen wakker wanneer de tape vertakt. Hij classificeert het kruispunt — links, rechts, T, kruising, doodlopende weg, of eindpunt — kiest een tak met de linkerhandregel, en voegt één teken toe aan een tekenreeks. De balk die in deze simulator over de neus van de robot getekend staat is die array, en je ziet een hele kant oplichten zodra er een tak opent.
Het addertje is dat de directe aflezing dubbelzinnig is. Een T-kruispunt, een kruising en het eindblok melden allemaal elk kanaal zwart. De robot moet voorbij het kruispunt doorrijden en opnieuw aflezen voordat hij weet wat hij net is overgestoken.
Algoritme
Verkennen gebruikt de linkerhandregel: neem op elke cel de meest linkse beschikbare optie, en draai pas terug wanneer een doodlopende weg niets anders laat. In een doolhof zonder lussen bereikt dat altijd het eindpunt, en het is grotendeels toestandsloos genoeg om met de hand te verifiëren.
Elke zet voegt een symbool toe. L, S en R zijn bochten; B verschijnt alleen waar de robot uit een doodlopende weg terugkeerde. Elke B in de afgewerkte tekenreeks markeert dus een fout, samen met de bocht ervoor en de bocht erna.
Dat venster van drie tekens is altijd vervangbaar door een enkele bocht, omdat de drie zetten hoeken zijn die samen een som vormen. Tel links als −90°, rechtdoor als 0°, rechts als +90° en terug als 180°, dan telt L B L op tot 0°, en dat is S — rij in plaats van het zijpad binnen te rijden gewoon rechtdoor. De zes vervangingsregels zijn die rekenkunde, in een tabel gezet.
Eén doorloop is niet genoeg: het invouwen van een omweg kan twee bochten tegen elkaar aan leggen die nu samen een nieuw vereenvoudigbaar venster vormen, dus de regels worden herhaaldelijk toegepast tot er niets meer verandert. Als de lus eindigt is er geen B meer over in de tekenreeks, en dat is het bewijs dat hij klaar is — elke overgebleven doodlopende weg zou er nog een laten zien.
Broncode
// Repeat until a full pass changes nothing: collapsing one detour
// can push two turns together that are themselves reducible.
void simplify(String& route) {
bool changed = true;
while (changed) {
changed = false;
for (int i = 1; i + 1 < route.length(); i++) {
if (route[i] != 'B') continue; // windows centre on a turn-back
route = route.substring(0, i - 1)
+ fold(route[i - 1], route[i + 1])
+ route.substring(i + 2);
changed = true;
break;
}
}
}
fold is de vervangtabel, en hij is kort omdat het alleen hoekrekenkunde is: tel de twee bochten aan weerszijden van de omkering van 180° bij elkaar op, wikkel het naar ±180°, en map het resultaat terug op een symbool.
Aannames en hardwareverschillen
Tape wordt getekend als perfect zwart op perfect wit zonder krulling, schittering of schaduw, en de reflectiesensorarray meldt ideale binaire waarden op vaste hoogte. Een echte IR-array ziet grijsschaalreflecties die meebewegen met het omgevingslicht, de sensorhoogte en slijtage van de tape, dus elke hardwarerit moet eerst op wit en zwart ijken, zoals de bedradingssectie stelt. De simulator draait de PID-lus ook op een perfecte periode en zet per beslissing één schone cel voor; op een Arduino verschijnen lusjitter, wielslip en een montageoffset van 2 mm als verkeerd geclassificeerde kruispunten. Behandel de versterkingen en de LSRB-tekenreeks hier als de logica om over te nemen, niet als getallen om te kopiëren.
Schakelschema
De robot die dit lab modelleert is die uit het bouwpad van de lijndoolhofoplosser: een Arduino Nano die op zijn analoge pinnen een reflectiesensorarray met acht kanalen uitleest en twee kastmotoren aanstuurt via een TB6612FNG.
De bedradingsregel die het zwaarst weegt is de voedingsscheiding. De motoraccu bereikt de VM-pin van de besturing en niets anders; de 5 V van de Arduino voedt alleen de logica; en alle massa’s — bord, besturing, sensorarray, accuminus — moeten met elkaar verbonden zijn, anders hebben de regelsignalen geen referentie en is de storing stil.
Hardwarechecklist
Componenten
- Arduino Nano of Uno
- IR-reflectiesensorarray met acht kanalen
- TB6612FNG dubbele motorbesturing
- Twee gelijkstroomkastmotoren op een 2WD-chassis
- Zwarte elektrische tape op een licht bord
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
Wat is een lijndoolhofrobot?
Een lijnvolger met een beslissingslaag erbovenop. De onderste laag houdt de robot gecentreerd op zwarte tape met een reflectiesensorarray en een PID-lus, precies zoals een gewone lijnvolger dat doet. De bovenste laag let op de momenten waarop de tape vertakt, classificeert welk soort kruispunt het is, kiest een richting, en legt de bocht vast. Dat verslag is wat hem in staat stelt het doolhof een tweede keer te rijden zonder één verkeerde bocht.
Hoe verschilt een lijndoolhof van een Micromouse-doolhof?
De wereld en de detectie zijn volledig verschillend. Een lijndoolhof is zwarte tape op een licht bord, gelezen door een naar beneden gerichte reflectiesensorarray; een Micromouse-doolhof heeft fysieke muren die afstandssensoren aflezen. Wat de verwisseling overleeft is de strategie — verkennen om kennis te verzamelen, en dan de beste route rijden. Het lijndoolhof is veel goedkoper te bouwen, en daarom gebruiken school- en collegewedstrijden er meestal een. Vergelijk de twee in de simulator van de doolhofoplosser.
Waar staat LSRB voor?
Links, Rechtdoor, Rechts en Terug — de vier dingen die een robot op een kruispunt kan doen. De robot voegt tijdens de verkenningsrit één teken per zet toe, en elke B markeert een doodlopende weg waaruit hij moest terugkeren. Zes vervangingsregels vervangen daarna elk venster van drie tekens rond een B door de enkele bocht die hetzelfde effect zou hebben gehad, waardoor de omweg volledig verdwijnt.
Waarom kan de robot niet beslissen op het moment dat hij een kruispunt ziet?
Omdat het sensorpatroon dubbelzinnig is. Een T-kruispunt, een kruising en de eindmarkering lichten allemaal de hele array tegelijk op, en een linkertak leest hetzelfde of de lijn nu ook rechtdoor doorloopt of niet. De robot moet vastleggen welke takken verschenen, ongeveer één robotlengte vooruit rijden, en opnieuw aflezen om te leren of er recht vooruit een weg was. Beslissen op de eerste aflezing is de meest voorkomende oorzaak van zelfverzekerde verkeerde bochten.
Werkt LSRB in elke doolhof?
Alleen in een perfect doolhof — een zonder lussen, waarin precies één route elk tweetal punten verbindt. Met tape gebouwde wedstrijddoolhoven zijn dat bijna altijd, en deze simulator genereert er zelf één. Bevat het doolhof een cyclus, dan kan de linkerhandregel eindeloos rondlopen en is er geen doodlopende weg om in te vouwen; op dat moment heb je een echte kaart en een graafzoekactie zoals flood fill nodig.
Hoeveel geheugen kost dit op een Arduino?
Bijna niets, en dat is de hele aantrekkingskracht. De hele kaart is één array tekens — een paar tientallen bytes voor een wedstrijddoolhof — omdat de robot nooit het doolhof zelf opslaat, alleen de bochten die hij maakte. Een robot met flood fill bewaart daarentegen een afstandswaarde voor elke cel van een raster. Dat is de afweging: LSRB is heel klein maar vraagt een doolhof zonder lussen, flood fill is zwaarder maar kan met alles om.
Verder lezen
Bronnen
Gezaghebbende bronnen om dieper te gaan dan het afgebakende leermodel van deze simulator.