Índice:

IA no LEGO EV3 Maze-Driving Robot: 13 etapas
IA no LEGO EV3 Maze-Driving Robot: 13 etapas
Anonim
Image
Image
Como um labirinto é resolvido
Como um labirinto é resolvido

Este é um robô simples e autônomo com alguma inteligência artificial. Ele foi projetado para explorar um labirinto e, quando colocado de volta na entrada, dirige até a saída e evita os becos sem saída. É muito mais complicado do que meu projeto anterior, que simplesmente dirigiu pelo labirinto. Aqui, o robô deve lembrar o caminho que percorreu, remover becos sem saída, armazenar o novo caminho e, em seguida, seguir o novo caminho.

Meu robô anterior é descrito aqui:

O robô é construído usando LEGO Mindstorms EV3. O EV3 Software é executado em um computador e gera um programa, que é então baixado para um microcontrolador chamado EV3 Brick. O método de programação é baseado em ícones e de alto nível. É muito fácil e versátil.

Suprimentos

PEÇAS

  1. Conjunto LEGO Mindstorms EV3
  2. Sensor ultrassônico LEGO Mindstorms EV3. Não está incluído no conjunto EV3.
  3. Papelão ondulado para o labirinto. Duas caixas devem ser suficientes.
  4. Um pequeno pedaço de papelão fino para ajudar a estabilizar alguns cantos e paredes.
  5. Cole e prenda com fita adesiva para unir os pedaços de papelão.
  6. Um envelope de cartão vermelho para identificar a saída do labirinto.

FERRAMENTAS

  1. Faca para cortar papelão.
  2. Régua de aço para auxiliar no processo de corte.

PROGRAMAS

O programa está aqui:

Etapa 1: Como um labirinto é resolvido

MÉTODO DE CONDUÇÃO DE LABIRINTO

Existem vários métodos de navegar em um labirinto. Se você estiver interessado em estudá-los, eles são descritos muito bem no seguinte artigo da Wikipedia:

Eu escolhi o método de seguir a parede do lado esquerdo. A ideia é que o robô mantenha uma parede em seu lado esquerdo, tomando as seguintes decisões ao passar pelo labirinto:

  1. Se for possível virar à esquerda, faça isso.
  2. Caso contrário, siga em frente, se possível.
  3. Se não puder ir para a esquerda ou em linha reta, vire à direita, se possível.
  4. Se nenhuma das opções acima for possível, isso deve ser um beco sem saída. Inversão de marcha.

Um cuidado é que o método pode falhar se o labirinto tiver um loop. Dependendo da localização do loop, o robô pode continuar dando voltas e mais voltas. Uma possível solução para esse problema seria o robô alternar para a regra do seguidor de parede à direita se percebesse que estava em um loop. Não incluí esse refinamento em meu projeto.

RESOLVER O LABIRINTO PARA ENCONTRAR UM CAMINHO DIRETO

Enquanto dirige pelo labirinto, o robô deve memorizar o caminho que está percorrendo e eliminar becos sem saída. Ele faz isso armazenando cada curva e interseção em uma matriz, verificando combinações específicas de curvas e interseções à medida que avança e substituindo as combinações que incluem um beco sem saída. A lista final de curvas e cruzamentos é o caminho direto pelo labirinto.

As curvas possíveis são: esquerda, direita, costas (em um beco sem saída) e reta (que é uma interseção).

As combinações são substituídas da seguinte forma:

  • "Left, Back, Left" torna-se "Straight".
  • "Left, Back, Right" torna-se "Back".
  • "Left, Back, Straight" torna-se "Right".
  • "Right, Back, Left" torna-se "Back".
  • "Straight, Back, Left" torna-se "Right".
  • "Straight, Back, Straight" torna-se "Back".

COMO O ROBÔ MANUSEIA MEU LABIRINHO

  1. Quando o robô começa a dirigir, ele vê um espaço à direita e armazena Straight na lista do array.
  2. Em seguida, ele vira à esquerda e adiciona Left à lista. A lista agora contém: Straight, Left.
  3. Com um beco sem saída, ele se vira e adiciona Voltar à lista. A lista agora contém: Straight, Left, Back.
  4. Passando a faixa usada desde a entrada, adiciona Straight à lista. A lista agora contém: Straight, Left, Back, Straight. Ele reconhece uma combinação e muda para a esquerda, para trás, direto para a direita. A lista agora contém Straight, Right.
  5. Com um beco sem saída, ele se vira e adiciona Voltar à lista. A lista agora contém: Straight, Right, Back.
  6. Após a curva à esquerda, a lista contém Reto, Direito, Traseiro, Esquerdo. Ele reconhece uma combinação e muda de direita, traseira, esquerda para trás. A lista agora contém Straight, Back.
  7. Após a próxima curva à esquerda, a lista contém Straight, Back, Left. Ele muda essa combinação para a direita. A lista agora contém apenas Right.
  8. Ele passa um espaço e adiciona Straight à lista. A lista agora contém Right, Straight.
  9. Depois de virar à direita, a lista contém Direita, Reta, Direita, que é o caminho direto.

Etapa 2: Considerações ao programar o robô

CONSIDERAÇÕES PARA QUALQUER MICROCONTROLADOR

Quando o robô decide fazer uma curva, ele deve fazer uma curva aberta ou avançar uma curta distância antes de virar e, após virar, avançar uma curta distância novamente sem verificar o sensor. A razão para a primeira distância curta é que o robô não deve bater na parede após a curva, e a razão para a segunda distância curta é que após o robô ter virado, o sensor veria o longo espaço de onde acabou de vir, e o robô pensaria que deveria girar novamente, o que não é a coisa certa a fazer.

Quando o robô detecta um cruzamento à direita, mas não é uma curva à direita, descobri que é bom que o robô avance cerca de 10 polegadas (25 cm) sem verificar seus sensores.

CONSIDERAÇÕES ESPECÍFICAS PARA LEGO MINDSTORMS EV3

Embora o LEGO Mindstorms EV3 seja muito versátil, ele não permite mais do que um de cada tipo de sensor conectado a um Brick. Dois ou mais Bricks podem ser encadeados, mas eu não queria comprar outro Brick, então usei os seguintes sensores (em vez de três sensores ultrassônicos): sensor infravermelho, sensor de cor e sensor ultrassônico. Isso funcionou bem.

Mas o sensor de cores tem um alcance muito curto, de cerca de 2 polegadas (5 cm), o que leva a algumas considerações especiais, conforme descrito abaixo:

  1. Quando o sensor de cores detecta uma parede na frente e o robô decide virar à direita ou virar, ele deve recuar primeiro, a fim de ter espaço suficiente para virar sem bater na parede.
  2. Um problema complicado ocorre com alguns cruzamentos “retos”. Por causa do curto alcance do sensor de cor, o robô não pode determinar se ele detecta uma interseção “reta” adequada ou a preparação para uma curva à direita. Tentei corrigir esse problema configurando o programa para armazenar um “Straight” na lista sempre que o robô detecta um e, em seguida, eliminar mais de um “Straight” em uma linha na lista. Isso corrige a situação em que uma curva à direita segue uma “reta” no labirinto, mas não a situação em que há uma curva à direita sem uma “reta” antes dela. Eu também tentei definir o programa para eliminar uma "reta" se for um pouco antes de uma "direita", mas isso não funciona se uma curva à direita segue uma "reta". Não consegui encontrar uma solução que se encaixasse em todos os casos, embora eu suponha que seria possível para o robô olhar a distância percorrida (lendo os sensores de rotação do motor) e decidir se é um "Reto" ou um direito vez. Não achei que valia a pena fazer essa complicação para fins de demonstração do conceito de IA neste projeto.
  3. Uma vantagem do sensor de cores é que ele distingue entre o marrom de uma parede e o vermelho da barreira que usei na saída, e fornece uma maneira fácil para o robô decidir quando terminou o labirinto.

Etapa 3: O Programa Principal

O Programa Principal
O Programa Principal

LEGO Mindstorms EV3 possui um método de programação baseado em ícones muito conveniente. Os blocos são mostrados na parte inferior da tela do computador e podem ser arrastados e soltos na janela de programação para criar um programa. O EV3 Brick pode ser conectado ao computador por um cabo USB, Wi-Fi ou Bluetooth, e o programa pode então ser baixado do computador para o Brick.

O programa consiste em um programa principal e vários “Meus blocos” que são sub-rotinas. O arquivo carregado contém o programa completo, que está aqui:

As etapas do programa principal são as seguintes:

  1. Defina e inicialize a variável de contagem de voltas e a matriz.
  2. Espere 5 segundos e diga “Vá”.
  3. Comece um loop.
  4. Dirija pelo labirinto. Quando a saída é alcançada, o loop é encerrado.
  5. Exibe na tela do Brick, os cruzamentos encontrados no labirinto até agora.
  6. Verifique se o caminho deve ser encurtado.
  7. Exiba as interseções no caminho reduzido.
  8. Volte para a etapa 4.
  9. Após o loop, dirija o caminho direto.

A captura de tela mostra este programa principal.

Etapa 4: Os meus blocos (sub-rotinas)

Os meus blocos (sub-rotinas)
Os meus blocos (sub-rotinas)

O Navigate My Block, que controla como o robô dirige através do labirinto, é mostrado. A impressão é muito pequena e pode não ser legível. Mas é um bom exemplo de quão versáteis e poderosas são as declarações if (chamadas Switches no sistema LEGO EV3).

  1. A seta no. 1 aponta para um interruptor que verifica se o sensor infravermelho vê um objeto a mais de uma distância específica. Nesse caso, a série superior de blocos é executada. Caso contrário, o controle é passado para a grande série de blocos inferior, onde a seta # 2 está localizada.
  2. A seta # 2 aponta para um interruptor que verifica a cor que o sensor de cores vê. Existem 3 casos: sem cor na parte superior, vermelha no meio e marrom na parte inferior.
  3. Duas setas # 3 apontam para interruptores que verificam se o sensor ultrassônico vê um objeto a mais de uma distância específica. Nesse caso, a série superior de blocos é executada. Caso contrário, o controle é passado para a série inferior de blocos.

Os Meus Blocos para encurtar o caminho e para dirigir o caminho direto são mais complicados e seriam totalmente ilegíveis, por isso não foram incluídos neste documento.

Etapa 5: começando a construir o robô: a base

Começando a construir o robô: a base
Começando a construir o robô: a base
Começando a construir o robô: a base
Começando a construir o robô: a base

Como mencionado anteriormente, LEGO Mindstorms EV3 permite no máximo um de cada tipo de sensor conectado a um Brick. Usei os seguintes sensores (em vez de três sensores ultrassônicos): sensor infravermelho, sensor de cor e sensor ultrassônico.

Os pares de fotos abaixo mostram como construir o robô. A primeira foto de cada par mostra as peças necessárias e a segunda foto mostra as mesmas peças conectadas entre si.

O primeiro passo é construir a base do robô, usando as peças mostradas. A base do robô é mostrada de cabeça para baixo. A pequena parte em forma de L na parte traseira do robô é um suporte para as costas. Ele desliza conforme o robô se move. Isso funciona bem. O kit EV3 não tem uma peça do tipo bola rolante.

Etapa 6: Parte superior da base, 1

Topo da Base, 1
Topo da Base, 1
Topo da Base, 1
Topo da Base, 1

Esta etapa e as próximas 2 etapas são para o topo da base do robô, o sensor de cores e os cabos, que são todos cabos de 10 polegadas (26 cm).

Etapa 7: Parte superior da base, 2

Topo da Base, 2
Topo da Base, 2
Topo da Base, 2
Topo da Base, 2

Etapa 8: Parte superior da base, 3

Topo da Base, 3
Topo da Base, 3
Topo da Base, 3
Topo da Base, 3

Etapa 9: Sensores infravermelhos e ultrassônicos

Sensores infravermelhos e ultrassônicos
Sensores infravermelhos e ultrassônicos
Sensores infravermelhos e ultrassônicos
Sensores infravermelhos e ultrassônicos

Em seguida, estão o sensor infravermelho (à esquerda do robô) e o sensor ultrassônico (à direita). Além disso, os 4 pinos para prender o Brick na parte superior.

Os sensores infravermelhos e ultrassônicos estão localizados verticalmente em vez da horizontal normal. Isso fornece uma melhor identificação dos cantos ou extremidades das paredes.

Etapa 10: cabos

Cabos
Cabos

Os cabos se conectam ao Brick da seguinte maneira:

  • Porta B: motor grande esquerdo.
  • Porta C: motor grande direito.
  • Porta 2: sensor ultrassônico.
  • Porta 3: sensor de cores.
  • Porta 4: sensor infravermelho.

Etapa 11: Etapa final na construção do robô: decoração

Etapa final na construção do robô: decoração
Etapa final na construção do robô: decoração
Etapa final na construção do robô: decoração
Etapa final na construção do robô: decoração

As asas e barbatanas são apenas para decoração.

Etapa 12: construir um labirinto

Construir um labirinto
Construir um labirinto
Construir um labirinto
Construir um labirinto

Duas caixas de papelão ondulado devem ser suficientes para o labirinto. Eu fiz as paredes do labirinto com 5 polegadas (12,5 cm) de altura, mas 4 polegadas (10 cm) deve funcionar tão bem se você estiver com falta de papelão ondulado.

Primeiro, cortei em volta das paredes das caixas, a 25 cm do fundo. Em seguida, cortei as paredes a 5 centímetros do fundo. Isso fornece várias paredes de 5 polegadas. Além disso, cortei em volta do fundo das caixas, deixando cerca de 1 polegada (2,5 cm) presas às paredes para estabilidade.

As várias peças podem ser cortadas e coladas ou coladas onde for necessário para formar o labirinto. Deve haver um espaço de 11 ou 12 polegadas (30 cm) entre as paredes laterais em qualquer caminho sem saída. O comprimento não deve ser inferior a 25 cm. Essas distâncias são necessárias para o robô se virar.

Alguns dos cantos do labirinto podem precisar ser reforçados. Além disso, algumas paredes retas precisam ser impedidas de dobrar se incluírem um canto de papelão endireitado. Pequenos pedaços de papelão fino devem ser colados no fundo nesses locais, como mostrado.

A saída possui uma barreira vermelha composta por meio envelope de cartão comemorativo vermelho e uma base feita de 2 pedaços de papelão fino, conforme mostrado.

Etapa 13: o labirinto

O labirinto
O labirinto

Um cuidado é que o labirinto não deve ser grande. Se as curvas do robô estiverem em um pequeno ângulo em relação ao correto, as discrepâncias se somam após algumas curvas e o robô pode correr para as paredes. Tive que mexer várias vezes com as configurações de Rotações das curvas para conseguir uma direção bem-sucedida até mesmo no pequeno labirinto que fiz.

Uma maneira de contornar esse problema é incluir uma rotina de endireitamento de caminho que manteria o robô a uma distância específica da parede esquerda. Eu não incluí isso. O programa já é complicado o suficiente e é suficiente para demonstrar o conceito de IA neste projeto.

OBSERVAÇÃO FINAL

Este foi um projeto divertido e uma ótima experiência de aprendizado. Espero que você também ache interessante.

Recomendado: