Simulador de solucionador de labirintos com flood fill
Execute um robô de labirintos no navegador: explore corredores e becos sem saída, mapeie o labirinto e encontre o caminho mais curto com flood fill.
- Categoria
- ESP32
- Tempo
- 2–4 horas
- Plataforma
- Navegador · ESP32
01 / Comece aqui
Introdução
Robôs de labirinto exploram primeiro e depois otimizam. O robô percorre o labirinto em profundidade — por todos os corredores, entrando nos becos sem saída e retornando — até mapear tudo; então faz flood fill a partir do objetivo e percorre o único caminho mais curto. Veja-o tentar todos os caminhos errados antes de seguir o certo, a mesma ideia de explorar e depois otimizar usada por um Micromouse real com 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.
Controles
Escolha um modo — Explorar e depois percorrer rapidamente ou Percorrer rapidamente apenas — e pressione Iniciar para vê-lo resolver, ou execute um movimento por vez com Passo. Novo labirinto cria um labirinto aleatório novo; Reiniciar repete o mesmo. Três velocidades, atalhos de teclado e Tela cheia mantêm a execução controlável. As linhas grossas são as paredes do labirinto, os corredores sombreados são todos os lugares que o robô explorou (incluindo becos sem saída) e a linha grossa é o caminho mais curto que o flood fill encontrou.
Teoria
Um labirinto em grade é formado por células unidas por arestas abertas, com paredes entre as demais. Para encontrar a rota mais curta, o robô precisa primeiro conhecer o labirinto — portanto este laboratório executa duas fases.
Explorar. O robô percorre o labirinto em profundidade com a regra da mão esquerda: em cada interseção, vira à esquerda se puder; caso contrário, segue em frente e depois vira à direita. Quando encontra um beco sem saída, retorna até a última interseção e pega o próximo ramo. Repetir isso até visitar todas as células mapeia o labirinto inteiro — incluindo todos os caminhos errados que ele precisou descartar.
Otimizar. Com o mapa completo, o flood fill atribui distância zero ao objetivo e propaga valores crescentes para fora por cada aresta aberta. Agora cada célula contém sua distância até o objetivo, portanto o caminho mais curto é simplesmente este: a partir do início, avance sempre para uma célula vizinha com número um menor. O robô percorre rapidamente esse caminho — muito mais curto que a exploração com desvios.
Algoritmo
- Explore o labirinto em profundidade com a regra da mão esquerda, retornando de cada beco sem saída até todas as células serem visitadas.
- Registre cada aresta aberta dos dois lados para que o mapa concluído conheça todas as paredes.
- Faça flood fill a partir do objetivo: rotule-o como 0 e propague distâncias crescentes para fora por cada aresta aberta.
- Leia o caminho mais curto no campo: a partir do início, avance repetidamente para uma célula vizinha cuja distância seja uma unidade menor.
- Percorra rapidamente esse caminho até o objetivo.
- Compare o comprimento da exploração com o comprimento do caminho mais curto para ver quanto o mapa economizou ao evitar desvios.
Código-fonte
Mantenha exploração, mapeamento, planejamento e movimento como funções separadas:
// 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
Essa fronteira permite testar o mesmo planejador neste laboratório de navegador, em um computador e no controlador final baseado no ESP32.
Premissas e diferenças do hardware
O laboratório torna o mapeamento limpo removendo a parte difícil de um Micromouse real: a odometria. O robô simulado se move exatamente uma célula por passo, sem derrapagem nas rodas, sem viés do giroscópio e sem erro de curva de 90°, e seus três sensores de distância relatam paredes perfeitamente, sem falsos positivos. Uma construção física com ESP32 acumula erros de orientação e distância a cada movimento, precisa se realinhar às paredes e precisa filtrar as leituras de ToF para compensar a luz do sol e a queda de tensão — por isso o tutorial de curvas precisas e o guia de flood fill gastam mais tempo com movimento do que com planejamento. Use este simulador para aprender por que o flood fill replaneja, não para provar sua camada de movimento.
Diagrama do circuito
Use um regulador externo dimensionado para a corrente de travamento do motor. O ESP32 e os sensores precisam de um trilho lógico estável, mesmo quando os motores invertem o sentido de rotação.
Lista de verificação de hardware
Componentes
- Placa de desenvolvimento ESP32
- Três sensores de distância por tempo de voo ou infravermelho
- Dois motorredutores com encoder
- Driver de motor duplo e bateria com tensão regulada
- Chassi compacto de acionamento diferencial
Explore o grafo
Onde este simulador é usado
Os projetos, caminhos de aprendizagem e tutoriais que se apoiam neste laboratório.
Continue construindo
Baixar recursos
Use estas referências da página enquanto trabalha no projeto. Pacotes de projeto para download serão adicionados somente depois que seu código-fonte e sua versão forem publicados.
Dúvidas comuns
Perguntas frequentes
Qual algoritmo de labirinto é melhor para um primeiro robô?
Uma exploração em profundidade para mapear o labirinto, seguida de flood fill para encontrar o caminho mais curto. O flood fill é uma boa escolha didática porque cada célula alcançável recebe um valor de distância e cada movimento pode ser inspecionado. Este simulador explora primeiro e depois faz flood fill no mapa completo, mantendo claros tanto o mapeamento quanto o planejamento do caminho mais curto.
Como um robô de labirinto encontra o caminho mais curto?
Ele não pode conhecer o caminho mais curto antes de ver o labirinto, portanto explora primeiro. Este simulador, como um Micromouse real, usa duas fases: uma execução de exploração que percorre todos os corredores e becos sem saída para mapear o labirinto inteiro e, depois, uma execução rápida pelo único caminho mais curto que o flood fill do mapa completo revela. A primeira fase é minuciosa e lenta; a segunda é curta e ótima.
Como o flood fill difere de BFS ou A*?
BFS e A* planejam sobre um grafo que você já conhece. O flood fill foi projetado para um labirinto que ainda está sendo descoberto: atribui distância zero ao objetivo e propaga valores crescentes para fora por cada aresta que não se sabe estar bloqueada; depois recalcula sempre que uma parede recém-detectada altera o mapa. O próprio campo de distâncias codifica a rota, portanto o robô simplesmente avança para qualquer célula vizinha com valor um menor.
Qual é a diferença entre as fases de exploração e de percurso rápido?
Explorar mapeia o labirinto: o robô caminha em profundidade para dentro de cada corredor e beco sem saída, retornando pelos caminhos errados até conhecer todas as paredes — é ali que você o vê tentar todos os caminhos errados. O percurso rápido usa esse mapa concluído: o flood fill o transforma em um campo de distâncias, e o robô segue o único caminho mais curto do início ao objetivo. Explorar é lento e minucioso; o percurso rápido é curto e ótimo.
Que sensores um Micromouse ou robô de labirinto precisa?
No mínimo, sensores de distância olhando para a esquerda, a frente e a direita para classificar as paredes da célula atual, além de encoders de rodas para percorrer um número preciso de células e alinhar as curvas. Sensores de distância por tempo de voo ou infravermelho são comuns; os encoders importam porque apenas a medição das paredes não informa a distância percorrida.
Por que usar flood fill em vez de seguir paredes?
Seguir paredes (manter sempre uma mão em uma parede) é simples, mas não alcança um objetivo que não esteja ligado à parede externa, como o centro de um labirinto Micromouse, e raramente encontra uma rota curta. O flood fill constrói um mapa de distâncias de todo o labirinto conhecido, portanto alcança um objetivo interno e melhora em direção ao caminho mais curto enquanto explora.
Leitura complementar
Referências
Fontes confiáveis para ir além do modelo educacional limitado deste simulador.