segunda-feira, 25 de junho de 2012

Longa viagem, grandes avanços


Neste sábado iniciamos nossa “jornada” rumo ao México, para participar do campeonato mundial de robótica junto com várias outras equipes do mundo na RoboCup 2012.

Postei anteriormente sobre a mecânica do robô, e seguido de uma explicação sobre a eletrônica. Agora entra a parte da programação, que não escrevi ainda pois não tinhamos muitas coisas concretas.

A viagem

De Vitória - ES para o Rio, para Lima (Peru) e finalmente, México! No total darão 26h de viagem, e foram as horas em que mais trabalhamos!

O evento começará terça feira e terminará domingo, dando um tempo a mais para aparar as pontas do robô (e dar muitos nós também!)

O Programa


Viramos a noite no Rio, programando a parte lógica e até mesmo mecanica do robô, mas focamos bastante no software, que irá rodar no Android.

Como já expliquei aqui, escolhemos o uso do android pois é leve, hiper rápido, possui uma tela com resolução maior que minha TV, e é touch screen. Fazer logs, visualizar sensores, modificar configurações, é tudo mais rapido quando se pode acessar qualquer configuração com 2 toques! (e haja configuração...)

O código do android é feito em Java, e até agora, temos 32 Classes criadas, totalizando 13 mil linhas de código. Sim, tudo escrito do zero...

Os Algoritmos

De forma geral vou tentar explicar para vocês oque fizemos na parte de programação no robô. Qualquer duvida ou dicas são sempre bem vindas!

Alinhamentos

Se manter no meio do labirinto parece fácil... Mas não é bem assim!

Se manter, no meio do labirinto é uma questão de pequenos ajustes na direção do robo, e na posição ao longo do percurso. Imagine você girando de olhos fechados 30 vezes, depois como saberá onde estava a “frente”?

Justamente por isso, a mecanica do robô permite que ele faça varias medidas de distâncias mesmo estando parado, graças a “cabeça giratória”, que suporta nossos sensores de infravermelho de distância, podemos efetuar qualquer medida com precisão de 1 grau em torno do robô.

Imagine, depois, você transformar isso de cordenadas polares (angulos e distancias), para pontos em um plano cartesiano? Fica exatamente assim:


Quando chegamos em qualquer “célula” (quadrado do labirinto), temos que ajeitar o robô nele, para que esse “errinho” não se integre, e fique absurdo no futuro.

Se ajeitar na posição x, y, e o angulo do robô é o ideal, e por isso desenvolvemos um algoritmo que ache o erro angular do robô com apenas 2 medidas de cada possivel parede ao seu lado!

O que vou falar para vocês, foi o resultado de vários testes de algoritmos, dentre eles: achar a menor distância; calcular a tendencia do angulo da linha; e o que escolhemos: transformar de cordenadas Polares, para coordenadas cartesianas, e descobrir o angulo da linha baseado no deltaX e deltaY.

Ele transforma 2 medidas, com angulos de 20, e -20 graus, em uma “linha” no plano cartesiano, e descobre seu angulo em relação à 90 graus. Isso explica um pouco do como funciona:


De acordo com o “erro” angular do robô, essa linha tende para um lado ou para o outro do robô. A “ajeitadinha”, ocorre até duas vezes dependendo do quanto errado o robô está, já que pode haver falhas na leitura do sensor.

Depois que achado o angulo perpendicular a parede, é facil se acertar nos eixos X e Y. Sabemos que cada modulo do labirindo mede 30cm. os sensores medem de 0 até 80cm. Se subtrairmos os sensores opostos, e vermos o resto da divisão por 30, teremos exatamente o erro naquele eixo. Explicando melhor:

Olhe para sua esquerda, e meça a distancia até a parede. Olhe para sua direita e meça a distancia até a parede. Subtraia as duas distâncias e você achará o quanto esta “fora” do meio... Ver o resto da divisão, é apenas para se não houver uma parece ao lado e sim 30 cm depois, oque atrapalharia se não colocassemos o resto.

Mapeamento



Depois que se achamos o nosso erro e se ajeitamos, é hora de mapear!

O mapeamento do robô consegue se preciso o suficiente para ler um quadrado de 3x3 estando no centro dele.

Descobrir se existe uma parede no labirinto parece facil, mas na verdade são series de calculos de angulos (para mirar na parede certa), e probabilidades...

Probabilidades? Sim! Nenhuma parede nós guardamos como um valor Verdadeiro ou falso...

Usamos probabilidades, pois não é 100% de certeza, que o oque o robô esta vendo, é realmente o que esta lá... Por pequenos erros de imprecisão, ele pode muito bem mirar em outra parede, ou até mesmo fazer uma leitura errada do sensor de distância.

Usando probabilidade podemos dar “pesos” para as medidas que fazemos. As paredes mais próximas tem pesos maiores que as mais distântes, e por isso, ver uma parede de perto, importa mais que ve-la de longe!

Cada parede possui uma probabilidade de existencia. Todas iniciam em 0.5 (0% de certeza se existe ou não), 1.0 significa que temopos 100% de certeza de existencia, e 0.0 significa 100% de certeza de sua inexistencia. Assim, levamos em consideração também, a leitura de não haver parede, aumentando a probabilidade dela não existir.

Funcionou perfeitamente! fizemos vários testes, e se mostrou muito mais eficaz que usar um simples verdadeiro/falso.

Trajetos

Cada vez que o robô se ajeita, ele calcula usando um algoritmo de pesquisa por largura, para todas as celulas não visitadas, qual a célula em que ele consegue chegar em menos movimentos.

Executa o primeiro movimento desta “lista” de movimentos e em seguida volta a se ajeitar, e repetir o mesmo processo.

Isso resulta em algo muito legal: Ele muda a próxima célula, e o mapa cada vez que anda! Então não conseguimos saber exatamente oque ele irá fazer na proxima vez!

Vitmas

De fato, “achar” vitmas no labirinto é o que realmente vale pontos, mas é  a parte mais “facil”. Achar vitmas basta verificar se existe algo quente com os sensores infravermelhos de temperatura ao redor do robo em cada bloco que anda. Se sim, pisque um Led... Simples assim.

O que falta para terminar?

Muita coisa! Ainda não terminamos o robô, e como disse, noites foram, e serão viradas por isso.

Mesmo assim, com os resultados que vimos até agora, estamos confiantes de que dê certo! O robô esta bem inovador e bem robusto. Provavelmente com algumas modificações, será o robô do RescueB.

Soldar o sensor de luz, fazer os cabos do sensor de temperatura, concertar o PID dos motores, implementar a identificação da vitma e da rampa, adicionar algumas redundâncias e testar são coisas que ainda faltam fazer...