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 têm de passar por uma série de 14 portas posicionadas ao longo de uma linha branca curva de 255 pés num passeio ao ar livre. O percurso inclui duas rampas íngremes e uma área de ponto de decisão onde o robô tem de selecionar a rota correta para passar pelas 14 portas por ordem sequencial. Uma vez que a linha está ao ar livre e sujeita ao clima de Pittsburgh, o robô tem de funcionar numa variedade de condições. Este ano estava chuvoso e ventoso no dia da competição. Pode encontrar mais informações 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 utilizando a CMUcam4 porque requeria hardware mínimo e tinha uma interface bem adequada para seguir uma linha.

Mobot hardware Mobot hardware (full size)

A CMUcam4 capta uma imagem da linha a 30 fotogramas por segundo e alimenta a imagem de seguimento de cor ao Arduino Mega através de uma das três linhas Série. O Arduino Mega processa então esta imagem (ver a Descrição do Software abaixo) e entrega comandos de velocidade do motor e de viragem ao controlador PID através de outra linha Série. 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 a nossa posição e direção em relação à porta 0.

O controlador PID (MD-25) é fabricado pela Robot-Electronics no Reino Unido. Aciona dois motores DC de escovas com engrenagens, com encoders magnéticos no veio do motor. O ecrã LCD serve para fins de depuração. Tínhamos duas linhas de alimentação, 12V para os motores e 5V para a lógica, partilhando a mesma massa e ambas alimentadas por uma única bateria recarregável de 12V.

Inicialmente, planeámos fazer um protótipo a partir de uma base de madeira para entrarmos rapidamente na fase de programação e depois trabalhar numa base mais rápida e fiável, como um carro RC. No entanto, descobrimos que o protótipo era muito fiável e fácil de trabalhar, pelo que o mantivemos para o design final. A impermeabilização do corpo consistia numa camada de película de celofane sob uma camada de fita de embalagem. No entanto, a chuva infiltrou-se através da fita de embalagem, mas felizmente não através da película de celofane. A câmara foi coberta por um quadrado de plástico de um saco Ziploc, uma vez que descobrimos que o «filtro» melhorava a capacidade da câmara de ignorar pequenas manchas da linha que, para a câmara, se pareciam com o betão de fundo.

Descrição do Algoritmo#

Contexto#

Utilizamos a CMUcam4 em modo de seguimento de cor com o modo YUV ativado, o que nos dá uma representação em imagem binária da linha. O software da câmara filtra tudo o que não seja branco (ou seja, o fundo) e coloca um pixel «ativo» onde há uma linha (onde é branco). Utilizamos o modo YUV para que o seguimento de cor seja insensível à intensidade da luz, de modo a que o nosso robô possa funcionar numa grande variedade de condições, incluindo no interior e no exterior.

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 «ativos» (ver aqui: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Depois assumimos que a linha se situa no centroide. Ao fazer isto em 10 linhas diferentes da imagem, obtemos uma boa aproximação da linha ligando os pontos. Podemos então utilizar estes dados descobrindo a que distância cada ponto da linha está da linha vertical que se situa no centro da imagem, para obter um valor que representa quão curvada está a linha. Isto pode ser visto como algo semelhante a encontrar a área entre a linha tangente e uma curva e utilizar essa área para determinar quanto precisamos de virar. O sinal determina se a viragem é para a esquerda ou para a direita, enquanto a magnitude determina quanto precisamos de virar para seguir a linha. Como seria de esperar, se medíssemos uma área nula, 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 de virar para tentar minimizar a magnitude desta área.

Pontos de Decisão#

Para determinar se o robô está num ponto de decisão, pegamos nos dados que a câmara recolhe do seguimento de linha e verificamos quantos pontos centrais médios aparecem no espaço negro. Isto 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ô detetar vários pontos médios no espaço negro, pode concluir que devem existir duas linhas aqui. Depois seleciona a viragem apropriada e enviesa a sua viragem nessa direção até ver apenas uma linha.

Por favor, vá a https://github.com/cacay/Mobot para ver uma versão simplificada do nosso código ou aqui para uma cópia local.