Interactieve simulatorGevorderd

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
Technisch schema: Simulatie van een lijndoolhofoplosser met LSRB-routeringJUNCTIONS → L S R B → ROUTEBB

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.

Browser native
A line maze lab. A robot starts at the bottom-left of a taped maze and follows the left-hand rule to the finish at the top-right, recording one turn symbol per junction and backing out of every dead end. The LSRB substitution rules then collapse that record into the shortest route, which the robot drives again as a speed run. Use the controls below to run it or step one move at a time.

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.

Simulation

Ready. Press Start to explore the line maze, or Step one move at a time.

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.