Mobot#

Artigo de Cosku Acay, Edwin Cho, Kenneth Li e Nishant Pol. PDF.

Descrição do Projeto#

Na competição Mobot da Carnegie Mellon, os robôs devem passar por uma série de 14 portões posicionados ao longo de uma linha branca curva de 255 pés em uma calçada ao ar livre. O percurso inclui duas rampas íngremes e uma área de ponto de decisão onde o robô deve selecionar a rota correta para passar por 14 portões em ordem serial. Como a linha é ao ar livre e sob o clima de Pittsburgh, o robô deve funcionar em uma variedade de condições. Este ano estava chuvoso e ventoso no dia da competição. Mais informações podem ser encontradas em http://www.cs.cmu.edu/mobot/mobot.html

Mobot Mobot

Mobot (full size)Mobot (full size)

Solução com a CMUcam4#

Escolhemos abordar a tarefa de seguimento de linha usando a CMUcam4 porque ela exigia hardware mínimo e tinha uma interface bem adequada para rastrear uma linha.

Mobot hardware Mobot hardware (full size)

A CMUcam4 captura uma imagem da linha a 30 quadros por segundo e alimenta a imagem de rastreamento de cor ao Arduino Mega por uma das três linhas Seriais. O Arduino Mega então processa essa imagem (veja a Descrição do Software abaixo) e entrega comandos de velocidade e curva do motor ao controlador PID por outra linha Serial. O controlador PID, por sua vez, fornece ao Arduino Mega as contagens do encoder para ambas as rodas direita e esquerda, o que nos permite acompanhar nossa posição e direção em relação ao portão 0.

O controlador PID (MD-25) é fabricado pela Robot-Electronics no Reino Unido. Ele aciona dois motores DC de escova com redução, com encoders magnéticos no eixo do motor. A tela LCD é para fins de depuração. Tínhamos dois trilhos de energia, 12V para os motores e 5V para a lógica, compartilhando o mesmo terra e ambos alimentados por uma única bateria recarregável de 12V.

Inicialmente planejávamos fazer um protótipo a partir de uma base de madeira para entrarmos na fase de programação rapidamente e depois trabalhar em uma base mais rápida e confiável, como um carro de RC. No entanto, descobrimos que o protótipo era muito confiável e fácil de trabalhar, então o mantivemos para o design final. A impermeabilização do corpo consistia em uma camada de celofane sob uma camada de fita de embalagem. A chuva, no entanto, vazava pela fita de embalagem, mas felizmente não pelo celofane. A câmera foi coberta por um quadrado de plástico de um saco Ziploc, já que descobrimos que o “filtro” melhorava a capacidade da câmera de ignorar pequenos trechos da linha que, para a câmera, pareciam o concreto de fundo.

Descrição do Algoritmo#

Contexto#

Usamos a CMUcam4 no modo de rastreamento de cor com o modo YUV habilitado, o que nos dá uma representação de imagem binária da linha. O software da câmera filtra tudo o que não é branco (ou seja, o fundo) e coloca um pixel “ligado” onde há uma linha (onde é branco). Usamos o modo YUV para que o rastreamento de cor seja insensível à intensidade da luz, de modo que nosso robô possa funcionar sob uma ampla variedade de condições, incluindo ambientes internos e externos.

Seguimento de Linha#

A CMUcam4 fornece ao nosso chip Arduino uma imagem binária de 80 por 60. Amostramos 10 linhas de pixels igualmente espaçadas da imagem e calculamos o centroide dos pixels “ligados” (veja aqui: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Em seguida, assumimos que a linha se encontra no centroide. Fazendo isso em 10 linhas diferentes da imagem, obtemos uma boa aproximação da linha conectando os pontos. Podemos então usar esses dados descobrindo o quão longe cada ponto da linha está da linha vertical que se encontra no centro da imagem, para obter um valor que representa o quão curva é a linha. Isso pode ser visto como algo semelhante a encontrar a área entre a linha tangente e uma curva e usar essa área para determinar o quanto precisamos virar. O sinal determina se a curva é para a esquerda ou para a direita, enquanto a magnitude determina o quanto precisamos virar para seguir a linha. Como você esperaria, se medíssemos área zero, então a linha está diretamente à frente do robô e é uma linha reta. Se a magnitude da área for grande, então o robô precisa virar para tentar minimizar a magnitude dessa área.

Pontos de Decisão#

Para determinar se o robô está em um ponto de decisão, pegamos os dados que a câmera coleta do seguimento de linha e verificamos quantos pontos centrais médios aparecem no espaço preto. Isso funciona com base na suposição de que o ponto médio entre duas linhas não deve estar sobre nenhuma das linhas, a menos que as linhas sejam a mesma linha. Se o robô detectar múltiplos pontos médios no espaço preto, ele pode concluir que deve haver duas linhas aqui. Então ele seleciona a curva apropriada e enviesa sua curva naquela direção até que veja apenas uma linha.

Acesse https://github.com/cacay/Mobot para ver uma versão simplificada do nosso código ou aqui para uma cópia local.