Simulatore di labirinto a linee con instradamento LSRB
Esegui nel browser un labirinto a linee: nastro adesivo, rilevamento delle giunzioni e regole LSRB che trasformano una rotta con vicoli ciechi nella più breve.
- Categoria
- Arduino
- Tempo
- 2–3 ore
- Piattaforma
- Browser · Arduino
01 / Inizia qui
Introduzione
Un robot per labirinti a linee è un robot seguilinea che sa anche decidere. Questo laboratorio lo guida lungo nastro nero, classifica ogni giunzione e scrive un solo carattere per mossa. Al traguardo guardi le regole di sostituzione LSRB scattare una alla volta, ripiegando fuori dal registro ogni deviazione in un vicolo cieco, finché rimane una stringa senza B: la rotta più breve, che il robot percorre di nuovo.
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.
Controlli
Modalità sceglie tra l’esecuzione completa in tre atti — esplora, semplifica, poi percorri a velocità — e il salto diretto alla rotta finale. Velocità di esecuzione imposta quanto velocemente il robot guida. Avvia, Pausa e Passo lo eseguono continuamente o una mossa alla volta, Reimposta riproduce lo stesso labirinto e Nuovo labirinto ne genera uno nuovo. Porta il focus sul canvas e usa Space, N, R, M e F per gli stessi controlli dalla tastiera.
La striscia della memoria del percorso sotto il labirinto è la parte da guardare. Si riempie di un simbolo per mossa mentre il robot guida, poi si riscrive durante la fase di semplificazione man mano che scatta ogni sostituzione.
Teoria
Un robot per labirinti a linee è costruito in due strati, e tenerli separati è ciò che lo rende gestibile.
Lo strato inferiore è un normale robot seguilinea. Un array di riflettanza a otto canali legge il nastro, le letture collassano in un unico errore ponderato e un anello PID trasforma quell’errore in due velocità diverse delle ruote. Questo strato non sa nulla dei labirinti.
Lo strato superiore si attiva solo quando il nastro si ramifica. Classifica la giunzione — sinistra, destra, T, incrocio, vicolo cieco o arrivo — sceglie un ramo con la regola della mano sinistra e aggiunge un carattere a una stringa. La barra disegnata sul muso del robot in questo simulatore è quell’array e puoi guardare un lato intero accendersi quando si apre un ramo.
Il problema è che la lettura istantanea è ambigua. Una giunzione a T, un incrocio e il blocco di arrivo riportano ogni canale nero. Il robot deve superare la giunzione e leggere di nuovo prima di sapere cosa abbia appena attraversato.
Algoritmo
L’esplorazione usa la regola della mano sinistra: in ogni cella sceglie l’opzione più a sinistra e torna indietro solo quando un vicolo cieco non lascia alternative. In un labirinto senza anelli arriva sempre all’arrivo ed è abbastanza senza stato da poter verificare a mano.
Ogni mossa aggiunge un simbolo. L, S e R sono svolte; B compare solo dove il robot è tornato indietro da un vicolo cieco. Quindi ogni B nella stringa finale segna un errore, insieme alla svolta prima e alla svolta dopo.
Quella finestra di tre caratteri è sempre sostituibile da una singola svolta, perché le tre mosse sono soltanto angoli che si sommano. Contando la sinistra come −90°, il dritto come 0°, la destra come +90° e l’indietro come 180°, L B L dà 0°, cioè S: guida dritto invece di entrare nel ramo laterale. Le sei regole di sostituzione sono questa aritmetica, tabulata.
Una passata non basta: ripiegare una deviazione può accostare due svolte che ora formano una nuova finestra riducibile, quindi le regole vengono applicate ripetutamente finché non cambia più nulla. Quando il ciclo termina non resta alcun B nella stringa, ed è la prova che il percorso è finito: un eventuale vicolo cieco residuo mostrerebbe ancora uno.
Codice sorgente
// 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 è la tabella di sostituzione ed è breve perché contiene solo aritmetica degli angoli: somma le due svolte ai lati dell’inversione di 180°, riporta il risultato nell’intervallo ±180° e mappa di nuovo il risultato su un simbolo.
Ipotesi e differenze hardware
Il nastro è reso come nero perfetto su bianco perfetto, senza arricciamento, riflessi o ombre, e l’array di riflettanza riporta valori binari ideali a un’altezza fissa. Un array IR reale vede riflessi in scala di grigi che cambiano con la luce ambiente, l’altezza del sensore e l’usura del nastro, quindi ogni esecuzione hardware deve prima calibrare bianco e nero con una scansione, come spiega la sezione sul cablaggio. Il simulatore esegue anche l’anello PID con un periodo perfetto e avanza di una cella pulita per ogni decisione; su un Arduino compaiono come classificazioni errate delle giunzioni il jitter del ciclo, lo slittamento delle ruote e un offset di montaggio di 2 mm. Tratta i guadagni e la stringa LSRB qui presentati come logica da trasferire, non come numeri da copiare.
Schema elettrico
Il robot modellato da questo laboratorio è quello del percorso di costruzione del risolutore di labirinto a linee: un Arduino Nano che legge un array di riflettanza a otto canali sui pin analogici e aziona due motori con riduttore tramite un TB6612FNG.
La regola di cablaggio più importante è la separazione dell’alimentazione. La batteria dei motori raggiunge il pin VM del driver e nient’altro; i 5 V dell’Arduino alimentano solo la logica; ogni massa — scheda, driver, array di sensori, polo negativo della batteria — deve essere collegata insieme, altrimenti i segnali di controllo non hanno riferimento e il fallimento è silenzioso.
Checklist hardware
Componenti
- Arduino Nano o Uno
- Array di sensori IR a riflessione a otto canali
- Driver doppio del motore TB6612FNG
- Due motori CC con riduttore su un telaio 2WD
- Nastro elettrico nero su un pannello chiaro
Esplora il grafo
Dove si usa questo simulatore
I progetti, i percorsi di apprendimento e i tutorial che si basano su questo laboratorio.
Continua a costruire
Scarica le risorse
Usa questi riferimenti nella pagina mentre lavori al progetto. I pacchetti di progetto scaricabili verranno aggiunti solo dopo la pubblicazione del loro codice sorgente e della loro versione.
Domande comuni
Domande frequenti
Che cos'è un robot per labirinti a linee?
Un robot seguilinea con uno strato decisionale sopra. Lo strato inferiore mantiene il robot centrato sul nastro nero usando un array di riflettanza e un anello PID, esattamente come fa un normale robot seguilinea. Lo strato superiore osserva i momenti in cui il nastro si ramifica, classifica il tipo di giunzione, sceglie una direzione e registra la svolta. Quel registro gli permette di percorrere il labirinto una seconda volta senza nessuna svolta sbagliata.
In che modo un labirinto a linee differisce da un labirinto Micromouse?
Il mondo e la percezione sono completamente diversi. Un labirinto a linee è nastro nero su un pannello chiaro, letto da un array di riflettanza rivolto verso il basso; un labirinto Micromouse ha muri fisici letti da sensori di distanza. Ciò che sopravvive allo scambio è la strategia: esplorare per raccogliere informazioni, poi percorrere la rotta migliore. Il labirinto a linee è molto più economico da costruire, ed è per questo che le competizioni scolastiche e universitarie usano di solito questo. Confronta i due nel Simulatore di risolutore di labirinto.
Cosa significa LSRB?
Sinistra, Dritto, Destra e Indietro: le quattro cose che un robot può fare a una giunzione. Il robot aggiunge un carattere per mossa durante l'esplorazione e ogni B segna un vicolo cieco da cui è dovuto tornare indietro. Sei regole di sostituzione sostituiscono poi ogni finestra di tre caratteri centrata su un B con l'unica svolta che avrebbe avuto lo stesso effetto, eliminando del tutto la deviazione.
Perché il robot non può decidere nell'istante in cui vede una giunzione?
Perché lo schema dei sensori è ambiguo. Una giunzione a T, un incrocio e il segnale di arrivo illuminano tutto l'array insieme, e un ramo a sinistra viene letto allo stesso modo indipendentemente dal fatto che la linea prosegua dritta. Il robot deve registrare quali rami sono comparsi, avanzare di circa una lunghezza del robot e leggere di nuovo per scoprire se c'era una strada dritta. Decidere alla prima lettura è la causa più comune di svolte sbagliate ma sicure.
LSRB funziona su ogni labirinto?
Solo su un labirinto perfetto, senza anelli, in cui esattamente una rotta collega due punti qualsiasi. I labirinti da competizione con nastro adesivo lo sono quasi sempre, e questo simulatore ne genera uno. Se il labirinto contiene un ciclo, la regola della mano sinistra può girare all'infinito e non esiste alcun vicolo cieco che le regole possano ridurre; a quel punto servono una mappa reale e una ricerca su grafo come il flood fill.
Quanta memoria occupa su un Arduino?
Quasi nulla, ed è tutto il fascino. La mappa completa è un array di caratteri, poche decine di byte per un labirinto da competizione, perché il robot non memorizza mai il labirinto stesso ma solo le svolte che ha fatto. Un robot con flood fill, invece, conserva un valore di distanza per ogni cella di una griglia. Questo è il compromesso: LSRB è minimo ma richiede un labirinto senza anelli, il flood fill è più pesante ma gestisce qualsiasi cosa.
Per approfondire
Fonti
Fonti autorevoli per andare oltre il modello didattico, volutamente limitato, di questo simulatore.