Simulatore di risolutore di labirinto con flood fill
Nel browser, un robot risolutore esplora corridoi e vicoli ciechi, poi applica il flood fill alla mappa per trovare e percorrere l'unico percorso più breve.
- Categoria
- ESP32
- Tempo
- 2–4 ore
- Piattaforma
- Browser · ESP32
01 / Inizia qui
Introduzione
I robot che risolvono labirinti prima esplorano, poi ottimizzano. Questo laboratorio mostra il robot che percorre ogni corridoio e vicolo cieco, torna indietro finché tutto il labirinto è mappato e poi applica il flood fill dall'obiettivo per trovare e percorrere a velocità l'unico percorso più breve. Guardalo provare rotte sbagliate prima di scegliere quella giusta, come un vero Micromouse con ESP32.
Live lab / Maze exploration & flood-fill shortest path
Maze solver simulator
Watch a robot explore a real maze — down every corridor, into dead ends, backtracking out — then flood-fill the map and speed-run the one shortest path to the centre.
Bold lines are maze walls. The shaded corridors are everywhere the robot explored (including dead ends it backtracked out of); the bold line is the shortest path found by flood fill; the triangle is the robot and its heading.
- Wall
- Explored (wrong paths)
- Shortest path
- Goal
- Phase
- Ready
- Explored
- 1 / 144
- Exploration
- — moves
- Shortest path
- — 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
Scegli una modalità — Esplora, poi corri o Solo corsa rapida — e premi Avvia per guardarlo risolvere, oppure Passo una mossa alla volta. Nuovo labirinto costruisce un nuovo labirinto casuale; Reimposta riproduce quello stesso. Tre velocità, scorciatoie da tastiera e Schermo intero mantengono controllabile l’esecuzione. Le linee in grassetto sono i muri del labirinto, i corridoi ombreggiati sono ovunque il robot ha esplorato (vicoli ciechi inclusi) e la linea in grassetto è il percorso più breve trovato dal flood fill.
Teoria
Un labirinto a griglia è fatto di celle collegate da bordi aperti, con muri tra tutte le altre. Per trovare la rotta più breve un robot deve prima conoscere il labirinto, quindi questo laboratorio esegue due fasi.
Esplora. Il robot percorre il labirinto in profondità con la regola della mano sinistra: a ogni giunzione gira a sinistra se può, altrimenti va dritto e poi a destra. Quando incontra un vicolo cieco torna all’ultima giunzione e prende il ramo successivo. Ripetere l’operazione finché ogni cella è stata visitata mappa l’intero labirinto, inclusi tutti i percorsi sbagliati che ha dovuto escludere.
Ottimizza. Con la mappa completa, un flood fill assegna alla destinazione distanza zero e propaga valori crescenti verso l’esterno attraverso ogni bordo aperto. Ogni cella contiene ora la propria distanza dalla destinazione, quindi il percorso più breve è semplice: dalla partenza, passa sempre a un vicino con un numero inferiore di uno. Il robot percorre a velocità quel percorso, molto più corto dell’esplorazione con divagazioni.
Algoritmo
- Esplora il labirinto in profondità con la regola della mano sinistra, tornando indietro da ogni vicolo cieco finché tutte le celle sono visitate.
- Registra ogni bordo aperto su entrambi i lati, così la mappa finale conosce ogni muro.
- Applica il flood fill dalla destinazione: etichettala 0 e propaga distanze crescenti verso l’esterno attraverso ogni bordo aperto.
- Leggi il percorso più breve dal campo: dalla partenza, passa ripetutamente a un vicino la cui distanza è inferiore di uno.
- Corri a velocità lungo quel percorso fino alla destinazione.
- Confronta la lunghezza dell’esplorazione con quella del percorso più breve per vedere quanta divagazione abbia evitato la mappa.
Codice sorgente
Mantieni esplorazione, mappatura, pianificazione e movimento come funzioni separate:
// Phase 1 — map the whole maze, backtracking out of dead ends
exploreDepthFirst(map, robot); // left-hand rule until every cell is visited
// Phase 2 — flood-fill the finished map and run the shortest path
map.floodFill(goal); // goal = 0, distances ripple outward
for (Cell c = start; c != goal; c = map.lowerNeighbor(c))
robot.driveTo(c); // always step one distance lower
Questo confine rende lo stesso pianificatore testabile in questo laboratorio nel browser, su un desktop e sul controllore ESP32 finale.
Ipotesi e differenze hardware
Il laboratorio rende pulita la mappatura eliminando la parte difficile di un vero Micromouse: l’odometria. Il robot simulato si muove esattamente di una cella per passo senza slittamento delle ruote, bias del giroscopio o errore di inversione a 90°, e i suoi tre sensori di distanza riportano i muri perfettamente senza falsi positivi. Una realizzazione ESP32 fisica accumula errore di orientamento e distanza a ogni mossa, deve riallinearsi rispetto ai muri e deve filtrare le letture ToF contro la luce del sole e il calo dell’alimentazione — ed è per questo che il tutorial sulle inversioni precise e la guida al flood fill dedicano più tempo al movimento che alla pianificazione. Usa questo simulatore per capire perché il flood fill ripianifica, non per dimostrare il tuo strato di movimento.
Schema elettrico
Usa un regolatore esterno dimensionato per la corrente di stallo dei motori. ESP32 e sensori necessitano di una pista logica stabile anche quando i motori si invertono.
Checklist hardware
Componenti
- Scheda di sviluppo ESP32
- Tre sensori di distanza a tempo di volo o a infrarossi
- Due motori con riduttore e encoder
- Driver doppio del motore e alimentazione a batteria regolata
- Telaio compatto a trazione differenziale
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
Quale algoritmo di labirinto è migliore per un primo robot?
Un'esplorazione in profondità per mappare il labirinto, poi un flood fill per trovare il percorso più breve. Il flood fill è una scelta didattica forte perché assegna un valore di distanza a ogni cella raggiungibile e ogni mossa può essere ispezionata. Questo simulatore esplora prima e poi applica il flood fill alla mappa completata, così mappatura e pianificazione del percorso più breve restano chiare.
Come trova un robot da labirinto il percorso più breve?
Non può conoscere il percorso più breve finché non ha visto il labirinto, quindi prima esplora. Questo simulatore, come un vero Micromouse, usa due fasi: un'esecuzione di esplorazione che percorre ogni corridoio e vicolo cieco per mappare tutto il labirinto, poi una corsa rapida lungo l'unico percorso più breve che il flood fill della mappa completata rivela. La prima fase è approfondita e lenta; la seconda è breve e ottimale.
In che modo il flood fill differisce da BFS o A*?
BFS e A* pianificano su un grafo già noto. Il flood fill è progettato per un labirinto che stai ancora scoprendo: assegna alla destinazione distanza zero e propaga valori crescenti verso l'esterno attraverso ogni bordo non noto come bloccato, poi ricalcola ogni volta che un muro appena percepito modifica la mappa. Il campo delle distanze stesso codifica la rotta, quindi il robot basta che passi a un vicino con valore inferiore di uno.
Qual è la differenza tra le fasi di esplorazione e corsa rapida?
L'esplorazione mappa il labirinto: il robot percorre in profondità ogni corridoio e vicolo cieco, torna indietro da quelli sbagliati finché non conosce ogni muro — è lì che lo vedi provare tutte le rotte sbagliate. La corsa rapida usa quella mappa finita: un flood fill la trasforma in un campo di distanze e il robot segue l'unico percorso più breve dalla partenza alla destinazione. Esplorare è lento e approfondito; la corsa rapida è breve e ottimale.
Quali sensori servono a un Micromouse o a un robot da labirinto?
Servono almeno sensori di distanza rivolti a sinistra, davanti e a destra per classificare i muri della cella corrente, più encoder delle ruote per spostarsi di un numero preciso di celle e riallineare le inversioni. I sensori di distanza a tempo di volo o a infrarossi sono comuni; gli encoder contano perché la sola percezione dei muri non dice quanto si è percorso.
Perché usare il flood fill invece di seguire il muro?
Seguire il muro (tenere sempre una mano appoggiata a un muro) è semplice, ma non può raggiungere un obiettivo non collegato al muro esterno, come il centro di un labirinto Micromouse, e raramente trova una rotta breve. Il flood fill costruisce una mappa delle distanze dell'intero labirinto noto, quindi può raggiungere un obiettivo interno e migliorare verso il percorso più breve mentre esplora.
Per approfondire
Fonti
Fonti autorevoli per andare oltre il modello didattico, volutamente limitato, di questo simulatore.