Linien-Labyrinthlöser bauen: Mit LSRB-Routenspeicher
Ein Roboter, der selbstständig ein Linienlabyrinth erkundet, sich jede Kreuzung merkt und dann die kürzeste Route von Start bis Ziel ohne einen Fehler fährt.
Ein Linienfolger folgt. Ein Linien-Labyrinthlöser entscheidet. Das ist der ganze Sprung, den dieses Projekt macht, und er ist größer, als es aussieht: Der Roboter hört auf, ein Regelkreis mit Rädern zu sein, und wird etwas, das eine nie gesehene Umgebung erkundet, sich merkt, was er fand, und nach diesem Gedächtnis handelt.
Der Trick ist, dass nichts davon den Linienfolger ersetzt – es sitzt darauf. Darunter halten dasselbe Reflexionsarray und derselbe PID-Regelkreis den Roboter mittig auf dem Band und wissen nichts von Labyrinthen. Darüber beobachtet eine dünne Entscheidungsschicht die Momente, in denen sich die Linie verzweigt, klassifiziert, auf welche Kreuzungsart sie traf, wählt eine Richtung und schreibt ein Zeichen auf. Diese Trennung macht das Projekt handhabbar, und es ist dieselbe Zwei-Schichten-Trennung, die echte Roboter überall nutzen.
Also zählt die Baureihenfolge mehr als sonst. Du bekommst reines Linienfolgen erst wirklich stabil – abgestimmt im Simulator, dann auf einem großen Oval aus echtem Band – und fügst erst dann Kreuzungen hinzu. Wer diese Disziplin überspringt, bei dem zeigt sich jedes mechanische Problem, jede Kalibrierungsdrift, jedes 2 mm schief stehende Rad getarnt als Labyrinthlöse-Bug.
Folge dem Technikbaum unten von oben nach unten. Jeder Knoten öffnet sich, sobald seine Voraussetzungen erfüllt sind, und dein Fortschritt wird auf diesem Gerät gespeichert, sodass du den Roboter über ein Wochenende bauen kannst, ohne den Faden zu verlieren.
Stückliste
| Bauteil | Menge | Ca. Kosten | Hinweise |
|---|---|---|---|
| Arduino Nano | 1 | $5 | A0–A7 gibt acht Analogkanäle; die sechs eines Uno reichen nicht |
| IR-Reflexionsarray, 8 Kanäle | 1 | $8–12 | Acht, und analog. Kreuzungserkennung braucht die äußeren Sensoren |
| TB6612FNG | 1 | $3 | Lohnt sich hier: Der ~2-V-Drop des L298N schmerzt bei präzisen Langsamfahrten |
| TT-Getriebemotor | 2 | $4 | Encoder-Versionen dringend empfohlen für wiederholbare Drehungen |
| 2WD-Chassis | 1 | $6–10 | |
| Akkupack | 1 | $6 | 2×18650, geschützter Halter |
| Mattes schwarzes Band, 19 mm | 1 Rolle | $3 | Und ein großer heller Boden oder Platte zum Auslegen des Labyrinths |
Gesamt: ca. $35–45. Das 8-Kanal-Array ist das Bauteil, an dem nicht gespart wird, und der Grund ist spezifisch: Ein Roboter erkennt einen linken Zweig daran, dass die äußersten linken Sensoren dunkel werden, während die Mitte noch auf der Linie ist. Ein Array, das kaum breiter ist als das Band, kann das physisch nicht sehen – Kreuzungserkennung wird dann Raten, egal wie gut der Code ist.
Warum das Array breiter sein muss als die Linie
left branch array (8 channels, ~60 mm wide)
────────────────┐ [ x x x . . . . . ] outer left dark -> a branch
│
════════════════╪═══════ [ . . . x x . . . ] centre still on the line
│
Faustregel: Das Array sollte mindestens dreimal so breit sein wie das Band. Für 19-mm-Band sind das rund 60 mm, was ein 8-Kanal-Array bei 8 mm Abstand genau liefert. Schmaler, und der Roboter kann „die Linie kurvt scharf“ nicht von „die Linie verzweigt sich“ unterscheiden – die zentrale Entscheidung, auf der das ganze Projekt ruht.
Baue ihn in Meilensteinen
Die Baureihenfolge zählt hier mehr als in jedem anderen Projekt dieser Seite. Ein Labyrinthlöser ist ein Linienfolger mit Entscheidungsschicht, und jeder mechanische oder Kalibrierungsfehler im Folger erscheint getarnt als Labyrinthlöse-Bug.
| Nr. | Meilenstein | Der Test | Bestanden, wenn |
|---|---|---|---|
| 1 | Linienfolgen geht | Zehn Runden auf großem schlichtem Oval | Null Verluste. Nicht „meistens“ – null |
| 2 | Drehwiederholbarkeit | 90°-Drehung zehnmal befehlen, messen | Innerhalb ±3°, und wiederholbar |
| 3 | Kreuzung gesehen | Langsam über ein T fahren, Array ausgeben | Äußere Sensoren werden dunkel, bevor es die Mitte tut |
| 4 | Kreuzung klassifiziert | Jeden Kreuzungstyp langsam fahren | Links / rechts / T / Kreuz / Sackgasse alle richtig benannt |
| 5 | Eine Abbiegung ausgeführt | Linken Zweig treffen, links abbiegen, Folgen wiederaufnehmen | Er fasst die Linie wieder und fährt weiter |
| 6 | Pfad aufgezeichnet | Kurzes Labyrinth fahren, String ausgeben | Eine Folge wie LSRB, passend zum Beobachteten |
| 7 | LSRB-Vereinfachung | Aufgezeichneten Pfad durch den Vereinfacher geben | LBL wird S, und jede Regel feuert korrekt |
| 8 | Zweiter Lauf | Vereinfachten Pfad fahren | Erreicht das Ziel ohne Fehlabbiegung und ohne Erkunden |
| 9 | Volles Labyrinth | Labyrinth mit mehreren Sackgassen | Erkundet, vereinfacht, fährt dann die kürzeste Route |
Meilenstein 1 ist nicht verhandelbar. „Folgt der Linie meistens“ wird zu „erfindet gelegentlich eine Kreuzung“, und du verbringst einen Abend mit Pfadvereinfachungs-Debugging für einen Fehler, der wirklich ein 2 mm schief stehendes Rad ist.
Meilenstein 2 wird gerne übersprungen. Ein Labyrinthlöser fährt Hunderte Drehungen pro Lauf, und eine konstant 5° zu kurze Drehung summiert sich, bis der Roboter die Linie ganz verlässt. Genau hier zeigt sich Getriebespiel – Fehler, der mit der Richtung das Vorzeichen wechselt, ist mechanisch, kein Abstimmungsfehler.
Die Zwei-Schichten-Trennung, im Code
Die Trennung, die dieses Projekt handhabbar macht, ist es wert, explizit zu sehen:
┌─────────────────────────────────────┐
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
└─────────────────────────────────────┘
Die untere Schicht lernt nie, was ein Labyrinth ist. Die obere fasst nie einen Motor an. Wenn etwas schiefgeht, sagt dir diese Grenze, in welcher Hälfte du suchst – und wenn du nicht sagen kannst, in welcher Hälfte ein Bug lebt, sind die Schichten nicht sauber getrennt.
Wie gut aussieht
| Messung | Typisch |
|---|---|
| Erkundungsgeschwindigkeit | 0,15–0,25 m/s – langsam genug, um Kreuzungen verlässlich zu klassifizieren |
| Rücklaufgeschwindigkeit | 0,3–0,5 m/s – keine Entscheidungen nötig, also kann er drücken |
| Kreuzungsklassifizierungs-Genauigkeit | 100 %. Alles darunter, und der aufgezeichnete Pfad ist falsch |
| Drehwiederholbarkeit | ±3° |
| Pfadvereinfachung | Ein 30-Zeichen-Erkundungspfad schrumpft typisch auf 8–12 |
Kreuzungsgenauigkeit ist wirklich alles oder nichts, und das überrascht. Eine falsch gelesene Kreuzung verdirbt den aufgezeichneten String, der Vereinfacher produziert dann einen gültig aussehenden, aber falschen Pfad, und der Rücklauf fährt selbstbewusst in eine Wand. Es gibt keine Teilpunkte – weshalb Erkundungsläufe langsam fahren und der Rücklauf die Zeit zurückgewinnt.
Fehlersuche
| Symptom | Wahrscheinliche Ursache | Lösung |
|---|---|---|
| Sieht Kreuzungen, wo keine sind | Enge Kurve liest sich als Zweig | Array verbreitern; verlangen, dass äußere Sensoren Mindeststrecke dunkel bleiben |
| Übersieht Kreuzungen | Zu schnell gefahren oder Array zu schmal | Erkundungslauf verlangsamen; Array ≥3× Bandbreite prüfen |
| Drehungen inkonsistent | Spiel oder keine Encoder | Drehung immer gleich anfahren; Spiel messen |
| Aufgezeichneter Pfad hat Extrazeichen | Kreuzung doppelt erkannt | Totzeit nach Kreuzung, bevor nächste gesucht wird |
| Vereinfachung liefert falschen Pfad | Regel in falscher Reihenfolge angewandt | LBL→S, LBR→B, SBL→R u. a. erst isoliert testen |
| Rücklauf scheitert an erster Abbiegung | Pfad relativ zur falschen Fahrtrichtung aufgezeichnet | String ist Folge relativer Abbiegungen – Konvention prüfen |
| Geht auf einem Labyrinth, nicht auf anderem | Kreuzungsabstand zu eng für die Totzeit | Totzeit reduzieren oder noch langsamer fahren |
| Verliert Linie nach Drehung | Drehung schießt über die neue Linie hinaus | Drehen, bis Mittensensoren wieder fassen, statt festen Winkel |
| Driftet mit Laufdauer immer mehr | Akku bricht ein, ändert effektive Verstärkungen | Drehzahlregelkreis mit Encodern schließen |
Wie es weitergeht
Encoder hinzufügen und per Distanz statt per Zeit drehen. Zeitgesteuerte Drehungen sind die größte Unzuverlässigkeitsquelle eines ersten Labyrinthlösers, weil die nötige Zeit mit Akkuspannung und Untergrund wechselt. Encoderbasierte Drehungen nicht.
Zum Wandlabyrinth wechseln – die Micromouse – die Band durch Wände und LSRB-Regel durch Flood-Fill ersetzt. Das ist der wirklich größere Schritt: LSRB ist eine Wandfolge-Heuristik, die einen Pfad findet, während Flood-Fill den kürzesten berechnet und bei neu entdeckten Wänden neu plant.
Den Rücklauf optimieren. Ist der Pfad bekannt, bleibt keine Entscheidung übrig – der Roboter kann auf Geraden beschleunigen und nur für Abbiegungen bremsen. Ein Bewegungsprofil über die bekannte Route bringt die dramatischen Zeitgewinne – oft halbiert es den Rücklauf.
Projekt-Roadmap
Der Baupfad
Folge dem Technikbaum von den Bauteilen bis zum funktionierenden Roboter. Jeder Knoten wird freigeschaltet, sobald seine Voraussetzungen erledigt sind, und dein Fortschritt wird auf diesem Gerät gespeichert.
0 / 21 erledigt
Bauteile
- ControllerArduino UnoDas gutmütige 8-Bit-Board, über das die meisten die Robotik kennenlernen.
- SensorIR Reflectance Sensor ArrayEine Reihe Infrarotaugen, die einem Roboter sagt, wo die Linie ist.
- TreiberTB6612FNG-MotortreiberEine MOSFET-H-Brücke, die die Volt behält, für die du wirklich bezahlt hast.
- AktorDC Gearmotor (TT Motor)Der gelbe Getriebemotor, der aus nacktem Chassis ein fahrendes Roboterauto macht.
- Chassis2WD Robot ChassisDie Plattform, auf die zwei Motoren, eine freie Rolle und die Elektronik geschraubt werden.
- StromversorgungRobot Battery & Power PackDer Unterschied zwischen einem Roboter, der läuft, und einem, der ständig neu startet.
Tutorials in diesem Pfad
- Einsteiger · 20 Min. LesezeitLinienfolger-Roboter bauen: Sensoren bis PID-LenkungVon IR-Reflexionssensoren über gewichtete Fehler bis zu sanfter PID-Lenkung – so arbeitet ein Linienfolger wirklich.
- Einsteiger · 20 Min. LesezeitIR-Reflexionsarray lesen für LinienfolgerVerwandle eine Reihe IR-Sensoren in eine einzige, glatte Linienposition, nach der du lenken kannst.
- Einsteiger · 18 Min. LesezeitEinen PID-Regler abstimmen: Eine praktische AnleitungEine praxisnahe Reihenfolge zum Abstimmen der P-, I- und D-Verstärkung ohne Raten – und wie man jeden Schritt live testet.
- Mittelstufe · 14 Min. LesezeitLinienlabyrinth-Kreuzungen mit IR-Array erkennenT, Kreuz, links, rechts, Sackgasse und Ziel aus einem Reflexionsarray klassifizieren und die mehrdeutigen Fälle auflösen.
- Mittelstufe · 15 Min. LesezeitLSRB-Pfadvereinfachung für Linienlabyrinth-RoboterDrehungen als L, S, R und B aufzeichnen, dann jeden Sackgassenumweg zur optimalen Route kollabieren.
Üben, bevor du verdrahtest
Im Live-Simulator abstimmen
Der Baupfad führt durch ein Browser-Labor. Bring das Verhalten hier in Ordnung und übertrage deine Einstellungen dann auf den echten Roboter.
Häufig gestellte Fragen
Wie baut man einen Labyrinth-Roboter mit Arduino?
Beginne mit einem funktionierenden Linienfolger: Reflexionsarray, PID-Regelkreis und Motortreiber. Setze dann eine Entscheidungsschicht darauf, die Kreuzungen bemerkt, per Linke-Hand-Regel einen Zweig wählt und jede Abbiegung als eines von vier Zeichen aufzeichnet – L, S, R oder B. Am Ziel klappen Ersetzungsregeln jede Sackgassen-Umwegschleife aus diesem String, und der zweite Lauf folgt der vereinfachten Route. Dieser Lernpfad geht die ganze Kette durch, und du stimmst die Folgeschicht zuerst in einem Browser-Simulator ab.
Was ist der LSRB-Algorithmus in einem Linienfolger?
LSRB steht für Links, Geradeaus, Rechts, Zurück – die vier Dinge, die ein Roboter an einer Kreuzung tun kann. Der Roboter zeichnet pro Kreuzung während der Erkundung ein Zeichen auf, und jedes B markiert eine Sackgasse, aus der er zurücksetzen musste. Sechs Ersetzungsregeln ersetzen jedes Drei-Zeichen-Fenster um ein B durch die einzelne Abbiegung mit derselben Wirkung, was den Umweg vollständig entfernt. Wiederholen, bis kein B bleibt – und du hast die kürzeste Route.
Was unterscheidet ein Linienlabyrinth von einem Wandlabyrinth?
Ein Linienlabyrinth ist schwarzes Band auf hellem Board, getastet mit einem nach unten schauenden Reflexionsarray; ein Wandlabyrinth – das Micromouse-Format – hat physische Wände, getastet mit Distanzsensoren. Die Sensorik ist völlig verschieden, doch die Schicht darüber ist dieselbe: erkunden für Wissen, dann die beste Route fahren. Ein Linienlabyrinth ist weit billiger zu bauen – weshalb Schul- und Hochschulwettbewerbe meist eines nutzen.
Muss ich Bauteile kaufen, bevor ich mit diesem Projekt beginne?
Nein. Linienfolgeschicht, ihre PID-Verstärkungen und das Erkunden-dann-Optimieren-Verhalten laufen alle in den Browser-Simulatoren, sodass du den ganzen Roboter verstehen kannst, bevor du etwas ausgibst. Nur die letzten vier Schritte – Verdrahtung, Kalibrierung, Erkundungsfahrt und Wiederholung – brauchen den echten Arduino, Sensorarray, Treiber, Motoren, Chassis und Akku.
Warum biegt mein Labyrinthroboter an falschen Kreuzungen ab?
Fast immer, weil er zu früh entscheidet. Das momentane Sensormuster kann ein T nicht von einer Kreuzung unterscheiden – beide lesen sich als Schwarz über das ganze Array. Der Roboter muss aufzeichnen, welche Zweige auftauchten, etwa eine Roboterlänge vorfahren und erneut lesen, um herauszufinden, ob die Linie auch geradeaus weiterging. Auf den ersten Messwert zu entscheiden, ist die häufigste Ursache selbstbewusster Fehlabbiegungen.
Funktioniert LSRB in jedem Labyrinth?
Nur in einem perfekten Labyrinth – einem ohne Schleifen, in dem genau ein Weg zwei Punkte verbindet. Klebeband-Linienlabyrinthe sind das fast immer. Enthält das Labyrinth einen Kreis, kann die Linke-Hand-Regel ewig kreisen, und es gibt keine Sackgasse, die die Regeln einklappen könnten; dann brauchst du eine echte Karte und eine Graphensuche wie Flood-Fill.