Simulador interativoIntermediário

Simulador de labirinto de linha com simplificação LSRB

No navegador, execute um solucionador de labirinto de linha: a detecção de cruzamentos e as regras LSRB eliminam becos sem saída até a rota mais curta.

Categoria
Arduino
Tempo
2–3 horas
Plataforma
Navegador · Arduino
Esquema técnico de Simulador de labirinto de linha com simplificação LSRBJUNCTIONS → L S R B → ROUTEBB

01 / Comece aqui

Introdução

Um robô de labirinto de linha é um seguidor que também decide. Ele classifica cruzamentos e registra um caractere por movimento; ao chegar, as regras de substituição LSRB eliminam cada desvio causado por um beco sem saída até restar a rota mais curta, que ele percorre novamente.

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.

Browser native
A line maze lab. A robot starts at the bottom-left of a taped maze and follows the left-hand rule to the finish at the top-right, recording one turn symbol per junction and backing out of every dead end. The LSRB substitution rules then collapse that record into the shortest route, which the robot drives again as a speed run. Use the controls below to run it or step one move at a time.

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.

Simulation

Ready. Press Start to explore the line maze, or Step one move at a time.

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.

Controles

Modo escolhe entre a execução completa em três fases — explorar, simplificar e depois percorrer rapidamente — e a ir direto para a rota final. Velocidade de execução define a rapidez com que o robô dirige. Iniciar, Pausar e Passo executam continuamente ou um movimento por vez; Reiniciar repete o mesmo labirinto e Novo labirinto gera um novo. Mantenha o canvas em foco e use Espaço, N, R, M e F para acessar os mesmos controles pelo teclado.

A faixa de memória da rota abaixo do labirinto é a parte que vale observar. Ela é preenchida com um símbolo por movimento enquanto o robô dirige e depois se reescreve durante a fase de simplificação, a cada substituição.

Teoria

Um robô de labirinto de linha é construído em duas camadas, e mantê-las separadas é o que torna o problema tratável.

A camada inferior é um robô seguidor de linha comum. Uma matriz de refletância de oito canais lê a fita, as leituras são combinadas em um único erro ponderado e um controlador PID transforma esse erro em duas velocidades de roda diferentes. Esta camada nada sabe sobre labirintos.

A camada superior só acorda quando a fita se ramifica. Ela classifica o cruzamento — esquerda, direita, T, cruzamento completo, beco sem saída ou chegada — escolhe um ramo pela regra da mão esquerda e acrescenta um caractere a uma sequência. A barra desenhada na frente do robô neste simulador é essa matriz, e você pode ver um lado inteiro acender quando um ramo se abre.

O problema é que a leitura instantânea é ambígua. Um cruzamento em T, um cruzamento completo e o bloco de chegada relatam todos os canais pretos. O robô precisa avançar além do cruzamento e ler novamente antes de saber o que acabou de atravessar.

Algoritmo

A exploração usa a regra da mão esquerda: em cada célula, escolha a opção disponível mais à esquerda e só vire quando um beco sem saída não deixar outra opção. Em um labirinto sem ciclos, isso sempre alcança a chegada, e não exige manter estado, o que permite verificar o resultado manualmente.

Cada movimento acrescenta um símbolo. L, S e R registram movimentos para a esquerda, em frente e para a direita; B registra o retorno de 180° necessário depois de entrar em um beco sem saída. Portanto, cada B marca um retorno que precisa ser eliminado, junto com o movimento anterior e o movimento posterior.

Essa janela de três caracteres sempre pode ser substituída por uma única curva, porque os três movimentos são apenas ângulos que se somam. Contando esquerda como −90°, em frente como 0°, direita como +90° e retorno como 180°, L B L soma 0°, que é S — siga em frente em vez de entrar no desvio. As seis regras de substituição são essa aritmética, tabulada.

Uma passagem não basta: simplificar um desvio pode juntar duas curvas que agora formam uma nova janela redutível, portanto as regras são aplicadas repetidamente até nada mudar. Quando o ciclo termina, não resta nenhum B na sequência, o que prova que ela terminou — qualquer beco sem saída restante ainda mostraria um.

Código-fonte

// 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 é a tabela de substituições, e ela é curta porque contém apenas aritmética de ângulos: some as duas curvas dos dois lados da reversão de 180°, reduza o resultado ao intervalo de ±180° e mapeie-o de volta para um símbolo.

Premissas e diferenças do hardware

A fita é renderizada como preto perfeito sobre branco perfeito, sem enrolamento, reflexo ou sombra, e a matriz de refletância relata valores binários ideais a uma altura fixa. Uma matriz IR real vê reflexões em tons de cinza que mudam com a luz ambiente, a altura dos sensores e o desgaste da fita, portanto toda execução no hardware precisa calibrar branco e preto primeiro, como observam as notas de fiação. O simulador também executa o controlador PID com período perfeito e avança uma célula limpa por decisão; em um Arduino, a variação do intervalo de execução do controlador, a derrapagem das rodas e um deslocamento de montagem de 2 mm aparecem como classificações erradas de cruzamentos. Considere os ganhos e a sequência LSRB aqui como a lógica a transferir, não como números para copiar.

Diagrama do circuito

O robô que este laboratório modela é o do caminho de construção do solucionador de labirinto de linha: um Arduino Nano lendo uma matriz de refletância de oito canais em seus pinos analógicos e acionando dois motorredutores por meio de um TB6612FNG.

A regra de fiação mais importante é a divisão de alimentação. A bateria do motor deve alcançar o pino VM do driver e nada mais; os 5 V do Arduino alimentam apenas a lógica; e todos os terras — placa, driver, matriz de sensores e negativo da bateria — precisam estar conectados, ou os sinais de controle não terão referência e a falha será silenciosa.

Lista de verificação de hardware

Componentes

  • Arduino Nano ou Uno
  • Matriz de sensores de refletância IR de oito canais
  • Driver de motor duplo TB6612FNG
  • Dois motorredutores CC em um chassi 2WD
  • Fita elétrica preta sobre uma placa clara

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

O que é um robô de labirinto de linha?

Um robô seguidor de linha com uma camada de decisão por cima. A camada inferior mantém o robô centralizado na fita preta usando uma matriz de refletância e um controlador PID, exatamente como um robô seguidor de linha comum. A camada superior observa os momentos em que a fita se ramifica, classifica o tipo de cruzamento, escolhe uma direção e registra a curva. Esse registro é o que permite percorrer o labirinto uma segunda vez sem nenhuma curva errada.

Como um labirinto de linha difere de um labirinto Micromouse?

O mundo e a medição são completamente diferentes. Um labirinto de linha é fita preta sobre uma placa clara, lida por uma matriz de refletância voltada para baixo; um labirinto Micromouse tem paredes físicas lidas por sensores de distância. O que permanece após a troca é a estratégia — explorar para reunir conhecimento e depois percorrer a melhor rota. O labirinto de linha é muito mais barato de construir, e é por isso que competições escolares e universitárias costumam usar um. Compare os dois no Simulador de Solucionador de Labirintos.

O que LSRB significa?

L significa movimento para a esquerda, S significa movimento em frente, R significa movimento para a direita e B significa um retorno de 180° depois de entrar em um beco sem saída. O robô acrescenta um caractere por movimento durante a execução de exploração, e cada B marca o retorno que precisa ser simplificado. Seis regras de substituição então substituem cada janela de três caracteres centrada em um B pela única curva que teria o mesmo efeito, eliminando completamente o desvio.

Por que o robô não pode decidir no instante em que vê um cruzamento?

Porque o padrão dos sensores é ambíguo. Um cruzamento em T, um cruzamento completo e o marcador de chegada acendem toda a matriz ao mesmo tempo, e um ramo à esquerda parece o mesmo se a linha também continue em frente. O robô precisa registrar quais ramos apareceram, avançar cerca de um comprimento de robô e ler novamente para descobrir se havia um caminho em frente. Decidir na primeira leitura é a causa mais comum de curvas erradas feitas com confiança.

LSRB funciona em qualquer labirinto?

Somente em um labirinto perfeito — um sem ciclos, em que exatamente uma rota conecta quaisquer dois pontos. Os labirintos de competição com fita quase sempre são assim, e este simulador gera um. Se o labirinto contiver um ciclo, a regra da mão esquerda pode girar para sempre e não haverá beco sem saída para as regras colapsarem; nesse momento você precisa de um mapa real e de uma busca em grafo, como flood fill.

Quanta memória isso ocupa em um Arduino?

Quase não ocupa memória, que é todo o atrativo. O mapa inteiro é um vetor de caracteres — algumas dezenas de bytes para um labirinto de competição — porque o robô nunca armazena o próprio labirinto, apenas as curvas que fez. Em contraste, um robô com flood fill mantém um valor de distância para cada célula de uma grade. Essa é a troca: LSRB é minúsculo, mas exige um labirinto sem ciclos; flood fill é mais pesado, mas lida com qualquer um.

Leitura complementar

Referências

Fontes confiáveis para ir além do modelo educacional limitado deste simulador.