Costruisci un Micromouse per labirinto con flood fill
Un robot che esplora autonomamente un labirinto con muri, ne costruisce una mappa e poi percorre il percorso più breve dall'inizio al centro senza una svolta sbagliata.
Cosa stai costruendo
Un robot che viene messo in un labirinto mai visto, trova il centro e poi torna indietro percorrendo il percorso più breve di cui può dimostrare l’esistenza.
Quella seconda metà è ciò che distingue un micromouse da ogni altro robot di questo sito. Un robot seguilinea reagisce. Un robot per l’evitamento degli ostacoli reagisce. Un micromouse ricorda: costruisce una mappa mentre si muove e poi pianifica tra celle che non ha visitato. È il più piccolo problema completo di robotica: rilevamento, movimento, mappatura e pianificazione, tutti contemporaneamente.
La strategia a due corse
I mouse da competizione fanno diverse corse e vengono valutati sulla più veloce. Questo produce una strategia che vale la pena copiare anche quando nessuno sta cronometrando:
Prima corsa — esplora. Guidare con attenzione, registrare quali celle hanno quali pareti e raggiungere il centro. La velocità è irrilevante: la mappa è il prodotto.
Seconda corsa — sfrutta. Applica flood fill alla mappa completata, calcola il percorso più breve e percorrilo senza fermarti a rilevare ciò che già sai.
La divisione conta perché le due corse vogliono cose opposte. L’esplorazione vuole movimento lento e cauto e sensori costanti. La corsa veloce vuole impegno. Provare a fare entrambe le cose insieme produce un robot che è scarso in entrambe.
Perché l’algoritmo non è la parte difficile
Flood fill è davvero semplice: assegna alla cella dell’obiettivo la distanza 0, assegna a ogni vicina un valore superiore di 1 rispetto al vicino più basso raggiungibile e poi scendi sempre verso un numero minore. Sono poche decine di righe e su una griglia è dimostrabilmente il percorso più breve.
La parte difficile è che l’algoritmo presuppone che il robot sappia in quale cella si trova.
Conta male una cella, oppure gira di 88° invece di 90° qualche volta, e il pianificatore sta risolvendo il labirinto per un robot che si trova altrove. Il sintomo è frustrante: l’algoritmo è perfetto, il cablaggio è corretto e il robot entra con sicurezza in un muro.
L’ordine di costruzione qui sotto dedica quindi gran parte dell’impegno al movimento e aggiunge il pianificatore per ultimo. Puoi dimostrare il pianificatore separatamente nel simulatore del risolutore di labirinto, dove la posizione è esatta per costruzione: è precisamente il motivo per cui simularlo prima vale il tempo investito.
Lista dei componenti
| Componente | Quantità | Costo indicativo | Note |
|---|---|---|---|
| Arduino Uno o Nano | 1 | $5 | RAM limitata: un labirinto 16×16 richiede attenzione. Un Mega o un ESP32 elimina la preoccupazione |
| VL53L0X | 3 | $15 | Sinistra, fronte, destra. Tre, non uno: vedi sotto |
| MPU-6050 | 1 | $2 | Orientamento attraverso le svolte; le ruote strisciano proprio quando conta di più |
| Motori N20 con encoder | 2 | $16 | 1:50 o 1:100. Il riduttore metallico è essenziale: il gioco si accumula a ogni svolta |
| TB6612FNG | 1 | $3 | |
| Telaio 2WD | 1 | $10 | Deve entrare in una cella del labirinto con spazio: meno di circa 90 mm di larghezza |
| Pacco batteria | 1 | $8 | 2×18650 |
| Muri del labirinto | — | $10–30 | Cartoncino rigido o compensato. Le celle standard sono di 180 mm con muri di 50 mm |
Totale: circa $70–95, più il labirinto.
Tre sensori di distanza, non uno. Un solo sensore frontale costringe il robot a girare per guardare, il che costa tempo e—molto peggio— introduce un errore di orientamento a ogni osservazione. Tre sensori fissi permettono al robot di leggere tutte e tre le pareti di una cella in un istante, senza muoversi. Questa è la differenza tra un mouse che mappa in modo affidabile e uno che accumula errore ogni volta che controlla una parete.
Ricorda che tutti e tre i sensori VL53L0X si accendono sull’indirizzo 0x29, quindi servono tre GPIO
su XSHUT per attivarli uno alla volta e riassegnare gli indirizzi— e per rifarlo a ogni avvio,
perché la modifica è volatile.
Fai attenzione alla RAM. Un campo delle distanze flood fill 16×16 memorizzato come uint8_t
occupa 256 byte, più una mappa dei muri e una coda. Nei 2 KB di un Uno lo spazio c’è, ma solo se
lo gestisci con attenzione— il che è già un buon esercizio e il motivo per cui molte persone passano
a ESP32 qui.
Ordine di costruzione
1 — Ottieni tre letture di distanza pulite. Fronte, sinistra, destra, usando i sensori a tempo di volo VL53L0X. Condividono un bus I²C e si avviano allo stesso indirizzo, quindi attivali uno alla volta tenendo gli altri in reset e riassegnando gli indirizzi all’avvio. Conferma che ognuno legga una parete a una distanza nota prima di montare qualsiasi cosa.
2 — Fagli percorrere dritto e girare in quadrato. Questo è il vero progetto. Segui inseguimento delle pareti e svolte precise: un ciclo PID sui sensori laterali per restare centrato, svolte integrate con il giroscopio invece dei conteggi degli encoder e riallineamento in quadrato contro una parete frontale ogni volta che è disponibile. Non andare avanti finché il robot non riesce a fare dieci svolte e a essere ancora rivolto nella direzione giusta.
3 — Conta le celle in modo affidabile. Gli encoder prevedono dove dovrebbe essere un confine; il fronte di discesa di una parete laterale conferma dove si trova davvero. Quando sono in disaccordo, credi alla parete: è un punto di riferimento fisico, non una stima accumulata.
4 — Registra i muri in una mappa. Due bit per cella per quattro muri, e un labirinto 16 × 16 entra in poche centinaia di byte. Registra ciò che vedi quando lo vedi.
5 — Aggiungi flood fill. Ora il pianificatore ha dati onesti. Ricalcola le distanze ogni volta che un muro appena scoperto invalida il piano corrente: questa riorganizzazione è l’intero motivo per cui si usa flood fill invece di una ricerca eseguita una sola volta.
Note hardware importanti
Piccolo batte veloce. Il robot deve ruotare dentro una cella. Un telaio compatto con le ruote vicino al centro di rotazione pivota in modo pulito; uno lungo urta i muri a ogni svolta e nessuna quantità di regolazione corregge la geometria.
Il gioco del riduttore è errore di orientamento. Ogni svolta su se stesso inverte i motori e un riduttore allentato perde i primi gradi, circa 0.9° di orientamento con una ruota da 42 mm per 4° di gioco. Esistono motori N20 con riduttore metallico per questo motivo.
Monta i sensori laterali leggermente in avanti e inclinati. Puntarli dritti verso l’esterno significa vederli una parete solo quando è perfettamente accanto, così il robot impara a conoscerla in ritardo. Un piccolo angolo in avanti dà al ciclo di controllo un’anticipazione.
Dai ai sensori un’alimentazione stabile. Un VL53L0X restituisce numeri sbagliati dall’aspetto plausibile su una linea che si affossa invece di fallire in modo ovvio: è il tipo peggiore di guasto, perché la mappa si riempie di muri che non ci sono.
Che aspetto ha un buon risultato
| Misura | Primo mouse funzionante | Ben regolato |
|---|---|---|
| Velocità di esplorazione | 0.2–0.3 m/s | 0.3–0.5 m/s |
| Corsa veloce | 0.4–0.6 m/s | 1.0–2.0 m/s |
| Errore di centratura della cella dopo 10 celle | 10–20 mm | Inferiore a 5 mm |
| Errore di orientamento dopo 10 svolte | 8–15° | Inferiore a 3° |
| Accuratezza del rilevamento delle pareti | Deve essere 100% | 100% |
| Esplorazione completa 16×16 | 3–6 minuti | 1–2 minuti |
Due di queste righe meritano attenzione.
Il rilevamento delle pareti non ha crediti parziali. Un muro registrato male corrompe la mappa, poi flood fill calcola un percorso convincente ma sbagliato attraverso un muro e la corsa veloce ci va dritta contro. Non esiste un degrado graduale, ed è per questo che la corsa di esplorazione procede lentamente.
Le righe sulla deriva sono il vero progetto. L’algoritmo non è la parte difficile— flood fill richiede circa quaranta righe e puoi provarlo interamente nel simulatore senza hardware. La parte difficile è che dopo dieci celle il robot non è più dove crede di essere, e un mouse che deriva 20 mm ogni dieci celle toccherà un muro dal lato opposto del labirinto. Tutto ciò che fa funzionare un vero micromouse— correzione durante l’inseguimento della parete, svolte fuse con il giroscopio, calibrazione degli encoder— esiste per combattere proprio quel numero.
Quando va storto
| Sintomo | Di solito |
|---|---|
| Entra con sicurezza in un muro | Conteggio delle celle sbagliato: posizione, non pianificazione |
| Finisce in diagonale dopo diverse svolte | Bias del giroscopio non sottratto, oppure svolte non riallineate in quadrato |
| Scivola bruscamente verso aperture laterali | Controllo della presenza della parete mancante nel ciclo di seguimento |
| Mappa muri che non esistono | Alimentazione dei sensori che si affossa, oppure interferenze tra i moduli |
| Risolve lentamente, si schianta velocemente | Corsa veloce troppo rapida per lo strato di movimento: rallentala, poi aumentala |
Quasi ogni voce di quella tabella è un guasto di movimento o sensore piuttosto che dell’algoritmo. Questa distribuzione è la cosa più utile da sapere prima di iniziare, perché dice dove investire i tuoi fine settimana.
Se vuoi le idee di mappatura e pianificazione senza hardware, il simulatore del risolutore di labirinto esegue nel browser la stessa strategia a due fasi e il percorso di apprendimento di pianificazione del percorso e mappatura la porta avanti verso A* e SLAM. Per un primo robot da labirinto molto più economico, il risolutore di labirinto di linee usa il nastro invece dei muri e non ha bisogno di nessun sensore di distanza.
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 / 16 completati
Componenti
- ControllerArduino UnoLa scheda a 8 bit tollerante con cui la maggior parte delle persone scopre la robotica.
- SensoreSensore ToF VL53L0XMisurazione laser a tempo di volo: un fascio stretto e preciso al millimetro; il sonar è troppo grossolano.
- SensoreMPU-6050 IMUUn sensore di movimento a sei assi: ecco come il robot percepisce inclinazione, rotazione e accelerazione.
- AttuatoreMotore con encoder N20Un micromotore con ingranaggi metallici e un encoder sul retro, così il robot sa quanto è avanzato davvero.
- DriverDriver per motori TB6612FNGUn ponte H a MOSFET che conserva i volt che hai davvero pagato.
- 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
- Intermedio · 1.5 oreSeguire il muro e ruotare con precisione nel labirintoResta centrato tra i muri e ruota di esattamente 90°: le due competenze da cui dipende un robot da labirinto.
- Intermedio · 16 min di letturaRisoluzione del labirinto con flood fill per robot MicromouseCon flood fill, un labirinto parzialmente noto diventa un campo di distanza che il robot può seguire fino all'obiettivo.
- Principiante · 17 min di letturaLeggi gli encoder in quadratura per distanza e velocitàTrasforma gli impulsi di un encoder in quadratura in misure affidabili di direzione, distanza e velocità della ruota.
- Principiante · 18 min di letturaSensori robotici ultrasonori o a tempo di voloScegli, monta, calibra e prova sensori ultrasonori o a tempo di volo per rilevare ostacoli.
- Intermedio · 20 min di letturaOdometria differenziale con encoder sulle ruoteIntegra il movimento delle ruote sinistra e destra per ottenere la posa di un robot mobile, poi identifica e calibra la deriva.
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
Che cos'è un micromouse?
Un piccolo robot autonomo che risolve un labirinto con muri, e la più antica competizione di robotica ancora attiva al mondo. Il labirinto standard è di 16 per 16 celle di 18 cm ciascuna, con l'obiettivo al centro, e il robot non riceve alcuna mappa: deve esplorare, costruirne una e poi percorrere la rotta più veloce che riesce a trovare. È un problema completo di robotica in una scatola: rilevamento, movimento preciso, mappatura e pianificazione devono funzionare insieme e il fallimento di uno qualsiasi è immediatamente visibile.
Perché usare sensori a tempo di volo invece degli ultrasuoni?
Per tre ragioni, tutte peggiorate da un labirinto. Un fascio a ultrasuoni si allarga di circa 15 gradi, quindi in un corridoio stretto colpisce le pareti ai lati di quella che stavi puntando. Più sensori a ultrasuoni si interferiscono reciprocamente e sentono i ping degli altri. E ogni lettura richiede millisecondi di tempo di volo, il che limita la velocità del ciclo di controllo. Un VL53L0X ha un fascio stretto, non è influenzato dai vicini e legge in circa 20 ms.
Mi serve un giroscopio se ho gli encoder?
Per un labirinto, sì. Gli encoder misurano la rotazione delle ruote, non quella del robot, e le due differiscono ogni volta che una ruota slitta, cosa che accade esattamente durante una svolta su se stesso. Un errore di 2 gradi per svolta è impercettibile una volta e fatale dopo dieci. Il giroscopio misura direttamente la rotazione reale del robot, quindi le svolte restano quadrate indipendentemente da ciò che hanno fatto le ruote.
In che modo è diverso dal risolutore di labirinto di linee?
Sono robot diversi che per caso condividono una parola. Un labirinto di linee è nastro nero su un pannello, letto da un array a riflessione rivolto verso il basso, e la memoria del percorso LSRB elimina i vicoli ciechi da una stringa di svolte. Un micromouse ha pareti fisiche, le legge con sensori di distanza e deve costruire una mappa reale del labirinto per pianificare tra celle che non ha mai percorso. Il labirinto di linee costa molto meno; il micromouse è quello che insegna la mappatura.
Perché il mio robot risolve il labirinto ma si schianta nella corsa veloce?
Perché la velocità cambia la fisica, non l'algoritmo. Guidare più velocemente significa più slittamento delle ruote, distanze di arresto più lunghe e meno tempo perché il ciclo di inseguimento della parete corregga prima della cella successiva. La soluzione tipica non è più regolazione, ma iniziare la corsa veloce a una velocità più bassa; poi aumenti quando lo strato di movimento è stato dimostrato. È anche il motivo per cui i mouse da competizione si riallineano in quadrato contro le pareti quando possono: è l'unica cosa che elimina l'errore accumulato invece di limitarlo.
Posso costruire un micromouse con un Arduino Uno?
Per un primo mouse, sì. L'Uno può gestire tre VL53L0X e un IMU su I²C e conservare una mappa di muri 16 per 16 in poche centinaia di byte. Quello che non può fare è competere: i mouse seri usano controllori a 32 bit più veloci, così il ciclo di movimento può girare in chilohertz e il pianificatore può ricalcolare continuamente. Costruisci prima quello lento; quasi tutto ciò che impari si trasferisce.