Robot per labirinto di linee con memoria del percorso LSRB
Un robot che esplora autonomamente un labirinto di linee nastrato, ricorda ogni bivo e percorre il percorso più breve dall'inizio alla fine senza una sola svolta sbagliata.
Un robot seguilinea segue. Un risolutore di labirinto di linee decide. È tutto il salto che compie questo progetto, ed è più grande di quanto sembri: il robot smette di essere un ciclo di controllo con ruote e diventa qualcosa che esplora un ambiente mai visto, ricorda ciò che ha trovato e agisce su quella memoria.
Il trucco è che nulla di tutto questo sostituisce il robot seguilinea: si trova sopra un robot seguilinea. Sotto, lo stesso array a riflessione e lo stesso ciclo PID mantengono il robot centrato sul nastro, senza sapere nulla di labirinti. Sopra, uno strato decisionale sottile osserva i momenti in cui la linea si ramifica, classifica il tipo di bivo, sceglie una direzione e scrive un carattere. Questa separazione rende gestibile il progetto ed è la stessa divisione a due strati che i robot reali usano ovunque.
Quindi l’ordine di costruzione conta più del solito. Ottieni prima un semplice seguimento della linea davvero stabile—regolato nel simulatore, poi su un ovale grande di nastro reale—e solo dopo aggiungi i bivi. Salta questa disciplina e ogni problema meccanico, ogni deriva di calibrazione, ogni ruota disallineata di 2 mm si presenterà travestito da bug di risoluzione del labirinto.
Percorri l’albero tecnologico qui sotto dall’alto verso il basso. Ogni nodo si sblocca quando i suoi prerequisiti sono completi e i progressi vengono salvati su questo dispositivo, così puoi costruire il robot durante un fine settimana senza perdere il punto.
Lista dei componenti
| Componente | Quantità | Costo indicativo | Note |
|---|---|---|---|
| Arduino Nano | 1 | $5 | A0–A7 dà otto canali analogici; i sei di un Uno non bastano |
| Array IR a riflessione, 8 canali | 1 | $8–12 | Otto, e analogici. Il rilevamento dei bivi richiede i sensori esterni |
| TB6612FNG | 1 | $3 | Vale la pena qui: L298N, con la sua caduta di ~2 V, danneggia le manovre precise a bassa velocità |
| Motore TT con riduttore | 2 | $4 | Le versioni con encoder sono fortemente consigliate per svolte ripetibili |
| Telaio 2WD | 1 | $6–10 | |
| Pacco batteria | 1 | $6 | 2×18650, supporto protetto |
| Nastro nero opaco, 19 mm | 1 rotolo | $3 | E un pavimento o pannello grande di colore chiaro su cui stendere il labirinto |
Totale: circa $35–45. L’array a 8 canali è l’unico componente su cui non conviene risparmiare, e il motivo è preciso: un robot rileva un ramo a sinistra notando che i sensori più esterni a sinistra sono diventati scuri mentre il centro è ancora sulla linea. Un array appena più largo del nastro non può fisicamente vederlo, quindi il rilevamento dei bivi diventa una supposizione, per quanto buono sia il codice.
Perché l’array deve essere più largo della linea
left branch array (8 channels, ~60 mm wide)
────────────────┐ [ x x x . . . . . ] outer left dark -> a branch
│
════════════════╪═══════ [ . . . x x . . . ] centre still on the line
│
Regola pratica: l’array dovrebbe essere almeno tre volte la larghezza del nastro. Per un nastro da 19 mm sono circa 60 mm, che è esattamente ciò che ottieni con un array a 8 canali e passo 8 mm. Più stretto e il robot non potrà distinguere «la linea ha curvato bruscamente» da «la linea si è ramificata», che è la decisione centrale su cui poggia tutto il progetto.
Costruiscilo in traguardi
L’ordine di costruzione conta più che in qualsiasi altro progetto di questo sito. Un risolutore di labirinto è un robot seguilinea con uno strato decisionale, e ogni guasto meccanico o di calibrazione del seguilinea riappare travestito da bug di risoluzione del labirinto.
| # | Traguardo | Il test | Un risultato positivo sembra |
|---|---|---|---|
| 1 | Il seguimento della linea funziona | Dieci giri di un ovale grande e semplice | Zero perdite. Non «quasi»—zero |
| 2 | Ripetibilità delle svolte | Comanda dieci rotazioni di 90°, misura | Entro ±3° e ripetibili |
| 3 | Bivo rilevato | Passa lentamente sopra una T, stampa l’array | I sensori esterni diventano scuri prima del centro |
| 4 | Bivo classificato | Passa lentamente ogni tipo di bivo | Sinistra / destra / T / incrocio / vicolo cieco chiamati tutti correttamente |
| 5 | Una svolta eseguita | Incontra un ramo a sinistra, gira a sinistra e riprendi a seguire | Riacquisisce la linea e continua |
| 6 | Percorso registrato | Percorri un labirinto breve, stampa la stringa | Una sequenza come LSRB che corrisponde a quello che hai visto |
| 7 | Semplificazione LSRB | Passa il percorso registrato attraverso il semplificatore | LBL diventa S e ogni regola viene applicata correttamente |
| 8 | Seconda corsa | Esegui il percorso semplificato | Raggiunge l’obiettivo senza svolte sbagliate e senza esplorare |
| 9 | Labirinto completo | Un labirinto con più vicoli ciechi | Esplora, semplifica e poi percorre il percorso più breve |
Il traguardo 1 non è negoziabile. «Segue per lo più la linea» diventa «ogni tanto inventa un bivo», e passerai una serata a fare debug della semplificazione del percorso per un guasto che in realtà è una ruota disallineata di 2 mm.
Il traguardo 2 è quello che le persone saltano. Un risolutore esegue centinaia di svolte per ogni corsa, e una svolta che è sempre 5° corta si accumula finché il robot esce completamente dalla linea. È esattamente qui che compare il gioco del riduttore: un errore che cambia segno con la direzione è meccanico, non un problema di regolazione.
La divisione a due strati, nel codice
Vale la pena vedere esplicitamente la separazione che rende gestibile questo progetto:
┌─────────────────────────────────────┐
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
└─────────────────────────────────────┘
Lo strato inferiore non impara mai che cos’è un labirinto. Lo strato superiore non tocca mai un motore. Quando qualcosa va storto, quel confine ti dice in quale metà cercare e, se non riesci a dire in quale metà vive un bug, gli strati non sono separati correttamente.
Che aspetto ha un buon risultato
| Misura | Tipica |
|---|---|
| Velocità di esplorazione | 0.15–0.25 m/s: abbastanza lenta da classificare i bivi in modo affidabile |
| Velocità della corsa di ritorno | 0.3–0.5 m/s: non ci sono decisioni da prendere, quindi può spingere |
| Accuratezza della classificazione dei bivi | 100%. Meno e il percorso registrato è sbagliato |
| Ripetibilità delle svolte | ±3° |
| Semplificazione del percorso | Un percorso di esplorazione di 30 caratteri si riduce in genere a 8–12 |
L’accuratezza dei bivi è davvero tutto o nulla, e questo sorprende le persone. Un bivo mal letto corrompe la stringa registrata, il semplificatore produce quindi un percorso dall’aspetto valido ma sbagliato e la corsa di ritorno entra con sicurezza in un muro. Non esiste un credito parziale: per questo l’esplorazione procede lentamente e nella corsa di ritorno recuperi il tempo.
Risoluzione dei problemi
| Sintomo | Causa probabile | Soluzione |
|---|---|---|
| Vede bivi che non ci sono | Una curva stretta letta come un ramo | Allarga l’array; richiedi che i sensori esterni restino scuri per una distanza minima |
| Non rileva i bivi | Sta guidando troppo veloce oppure l’array è troppo stretto | Rallenta l’esplorazione; verifica che l’array sia ≥3× la larghezza del nastro |
| Le svolte sono inconsistenti | Gioco del riduttore oppure assenza di encoder | Avvicinati sempre alla svolta nello stesso modo; misura il gioco |
| Il percorso registrato ha caratteri in più | Bivo rilevato due volte | Aggiungi un tempo morto dopo un bivo prima di cercare il successivo |
| La semplificazione produce un percorso sbagliato | Una regola applicata nell’ordine sbagliato | Prova prima separatamente LBL→S, LBR→B, SBL→R e simili |
| La corsa di ritorno fallisce alla prima svolta | Percorso registrato rispetto all’orientamento sbagliato | La stringa è una sequenza di svolte relative: controlla la convenzione |
| Funziona su un labirinto e non su un altro | Spaziatura dei bivi troppo stretta per il tempo morto | Riduci il tempo morto, oppure rallenta ulteriormente |
| Perde la linea dopo una svolta | La svolta supera la nuova linea | Gira finché i sensori centrali riacquistano la linea, anziché usare un angolo fisso |
| Deriva sempre di più durante la corsa | La batteria si affossa e cambiano i guadagni efficaci | Chiudi un ciclo di velocità con gli encoder |
Da dove proseguire
Aggiungi gli encoder e gira in base alla distanza, non al tempo. Le svolte a tempo sono la principale fonte di inaffidabilità di un primo risolutore di labirinto, perché il tempo necessario cambia con la tensione della batteria e con la superficie. Le svolte basate su encoder no.
Passa a un labirinto con muri, il micromouse, che sostituisce il nastro con muri e la regola LSRB con flood fill. È il passo genuinamente più grande: LSRB è un’euristica che segue le pareti e trova un percorso, mentre flood fill calcola quello più breve e riorganizza il piano quando scopre nuovi muri.
Ottimizza la corsa di ritorno. Una volta noto il percorso non restano decisioni da prendere, quindi il robot può accelerare sui rettilinei e rallentare solo per le curve. Un profilo di movimento sul percorso noto è la sede dei drammatici miglioramenti di tempo, spesso dimezzando la corsa di ritorno.
Roadmap del progetto
Il percorso di costruzione
Segui l'albero tecnologico dai componenti fino a un robot funzionante. Ogni nodo si sblocca quando i suoi prerequisiti sono completati, e i tuoi progressi vengono salvati su questo dispositivo.
0 / 21 completati
Componenti
- ControllerArduino UnoLa scheda a 8 bit tollerante con cui la maggior parte delle persone scopre la robotica.
- SensoreArray di sensori a riflessione IRUna fila di occhi a infrarossi che indica al robot dove si trova la linea.
- DriverDriver per motori TB6612FNGUn ponte H a MOSFET che conserva i volt che hai davvero pagato.
- AttuatoreMotore DC con ingranaggi (motore TT)Il motore giallo con ingranaggi che trasforma un telaio nudo in un'auto robot in movimento.
- TelaioTelaio robotico 2WDLa piattaforma su cui si montano due motori, un caster libero e tutta la tua elettronica.
- AlimentazionePacco batteria e alimentazione del robotLa differenza tra un robot che funziona e uno che continua a riavviarsi.
Tutorial in questo percorso
- Principiante · 20 min di letturaCostruisci un robot seguilinea: dai sensori allo sterzo con PIDDai sensori a riflessione IR all'errore ponderato e allo sterzo PID fluido: come funziona davvero un robot seguilinea.
- Principiante · 20 minLeggere un array di sensori IR per seguire una lineaTrasforma una fila di sensori IR in un'unica posizione di linea uniforme su cui puoi governare.
- Principiante · 18 min di letturaCome regolare un controllore PID: guida praticaUn ordine pratico per regolare i guadagni P, I e D senza tirare a indovinare, e come provare ogni passo dal vivo.
- Intermedio · 14 min di letturaGiunzioni nei labirinti lineari con un array IRClassifica T, incrocio, sinistra, destra, vicolo cieco e arrivo da un array di riflettanza, risolvendo i casi ambigui.
- Intermedio · 15 min di letturaSemplificazione del percorso LSRB per robot che seguono lineeRegistra le svolte come L, S, R e B, poi elimina ogni deviazione in vicolo cieco per ottenere il percorso ottimale.
Esercitati prima di cablare
Mettilo a punto nel simulatore
Il percorso di costruzione passa per un laboratorio nel browser. Ottieni qui il comportamento giusto, poi trasferisci le tue impostazioni sul robot reale.
Domande frequenti
Come si realizza un robot che risolve un labirinto con Arduino?
Parti da un robot seguilinea funzionante: un array a riflessione, un ciclo PID e un driver del motore. Poi aggiungi sopra uno strato decisionale che nota i bivi, sceglie un ramo con la regola della mano sinistra e registra ogni svolta come uno di quattro caratteri: L, S, R o B. Quando il robot raggiunge l'arrivo, regole di sostituzione eliminano dalla stringa ogni deviazione in un vicolo cieco e la seconda corsa segue il percorso semplificato. Questo percorso di costruzione segue tutta la catena e tu regoli lo strato di seguimento prima in un simulatore nel browser.
Che cos'è l'algoritmo LSRB in un robot seguilinea?
LSRB sta per Left, Straight, Right, Back: le quattro cose che un robot può fare a un bivo. Durante l'esplorazione il robot registra un carattere per bivo e ogni B segna un vicolo cieco da cui ha dovuto tornare indietro. Sei regole di sostituzione sostituiscono ogni finestra di tre caratteri centrata su B con l'unica svolta che avrebbe avuto lo stesso effetto, eliminando del tutto la deviazione. Ripeti finché non resta alcuna B e avrai il percorso più breve.
Qual è la differenza tra un labirinto di linee e uno con muri?
Un labirinto di linee è nastro nero su un pannello chiaro, rilevato da un array a riflessione rivolto verso il basso; un labirinto con muri, il formato Micromouse, ha muri fisici rilevati con sensori di distanza. Il rilevamento è completamente diverso, ma lo strato superiore è lo stesso: esplora per costruire conoscenza, poi percorri la rotta migliore. Un labirinto di linee costa molto meno da costruire, ed è per questo che le competizioni scolastiche e universitarie ne usano uno.
Devo comprare i componenti prima di iniziare questo progetto?
No. Lo strato di seguimento della linea, i suoi guadagni PID e il comportamento esplora-poi-ottimizza funzionano nei simulatori del browser, quindi puoi capire l'intero robot prima di spendere qualcosa. Solo gli ultimi quattro passaggi—cablaggio, calibrazione, passaggio di esplorazione e ripercorrimento—richiedono Arduino, array di sensori, driver, motori, telaio e batteria fisici.
Perché il mio robot sbaglia i bivi?
Quasi sempre perché decide troppo presto. Lo schema istantaneo dei sensori non può distinguere un bivo a T da un incrocio: entrambi appaiono neri sull'intera larghezza dell'array. Il robot deve registrare quali rami sono comparsi, avanzare di circa una lunghezza del robot e leggere di nuovo per capire se la linea continuava anche dritto. Decidere alla prima lettura è la causa più comune di svolte sbagliate ma sicure.
LSRB funziona con qualsiasi labirinto?
Solo con un labirinto perfetto, cioè senza anelli, in cui esattamente un percorso collega due punti qualsiasi. I labirinti di linee nastrati lo sono quasi sempre. Se il labirinto contiene un ciclo, la regola della mano sinistra può girare per sempre e non esiste alcun vicolo cieco che le regole possano eliminare; a quel punto servono una mappa reale e una ricerca su grafi come flood fill.