terça-feira, 21 de junho de 2011

Regional da OBR no Espírito Santo

A garra do Hulk, com 4 servo motores do VEX
A OBR

As 6 equipes que participaram do campeonato
Como devem ter percebido, estive ausente este mês devido ao campeonato da OBR (Olimpíada Brasileira de Robótica) que ocorreu sábado passado, no IFES vitória e que me tomou muito tempo.
O desafio é construir e programar um robô autônomo, capaz de seguir uma faixa preta aleatória, contendo obstáculos e gaps (falhas). E no final do trajeto, resgatar uma vítima que é uma lata de refrigerante. Este campeonato é também chamado de RoboCup Junior RESCUE A.
Participaram do campeonato 1 equipe do nível 1 e 6 equipes do nível 2, sendo uma delas a nossa equipe: EMEROTECOS.
Nosso robô, contava com diversos sensores, inclusive uma placa Multiplexadora de sensores e motores utilizando o ARDUINO, que eu produzi para conectar ao NXT.
Ela neste evento, serviu apenas para comandar os quatro motores do VEX, de acordo com os comandos do NXT, mas poderia ser adicionado até 20 servos, ou 20 sensores digitais sendo 8 analógicos. Ele se comunica com o NXT via I²C. Fiz basicamente o mesmo que AQUI, porém utilizando o Arduino nano como micro controlador.


Sensores

Placa Multiplexadora com Arduino
Utilizamos 10 sensores de luz, para seguir a linha e conseguir aplicar algoritmos do tipo PID para se acertar com precisão na linha, e minimizar o erro dele ao longo do percurso.
Um sensor de bussola, fundamental para fazer curvas bem-feitas, e saber sua direção relativa a locais do qual o robô tinha conhecimento de sua direção (como uma borda).
Um sensor de distância Infravermelho, capaz de diferenciar 1mm de distância, responsável por gerar um gráfico no qual usamos para saber a posição da vítima na última sala.


Algoritimos de navegação

O Hulk, robô da OBR regional 2011
Para facilitar a programação, passei algumas horas criando uma máquina de estados para o RobotC, o que me ajudou muito posteriormente. Esta tal "máquina de estados", é um simples diagrama, no qual posso passar de um estado para outro, de qualquer parte do meu programa.
Um exemplo: O robô esta seguindo linha, e uma multi-tarefa, detecta que o sensor de toque foi pressionado. O estado principal, que segue linha, não precisa se preocupar com isso, e apenas deixará de executar este estado, e passará para o de desvio de obstáculo. Isso, sendo feito de qualquer parte do programa!
Agora vem a parte pratico-teórica de verdade.
O robô inicia checando todos os sensores, e motores. Se qualquer um deles estiver desligado/desconectado/quebrado/sumido/derretido/qualquer outra coisa, o NXT joga uma mensagem de erro na tela, dizendo qual sensor esta com erro, e oque deve ser feito.
Feito isso, entra a tela inicial, e escolhemos portanto, seguir linha com um clique no NXT.
Ele começa a seguir linha, e se algum desses 3 eventos ocorrer, ele entra em um novo estado:

  • O robô não esta mais enxergando linha, salva a posição da bússola e vai para a tarefa de gap.
    • Se andou por mais de uma distância, e não detectou linha nenhuma, sabe que esta na ultima sala (pois não há linha) e vai para a tarefa de pegar a lata.
    • Se detectou novamente a linha, volta para a tarefa de seguir linha.
  • O robô detecta que a velocidade angular da roda (derivada do encoder) esta baixa, então vai para a tarefa de obstáculo.
    • Na tarefa de obstáculo, ele desvia e volta para a tarefa de seguir linha.
  • O robô detecta que ao tentar se acertar na linha, seu ângulo de reentrada na linha foi maior que 130º, então sabe que fez alguma cagada (como ir na direção oposta) e reverte seu sentido.

Como não havia paredes na última sala, o sensor de infravermelho detectava sempre seu valor máximo quando não estava vendo a lata, e seu valor mínimo quando na lata. Para achar a posição dela, ele varria a sala com 90º, e gravava 200 amostras de distância. Logo após, varria essas 200 amostras, e descobria qual delas, teve o menor ponto, e que estava ao lado de menores pontos também (para filtrar amostras erradas).
Logo depois, andava um pouco mais a frente, e repetia este processo até estar próximo suficiente, para evitar erros, e conseguir pegar com as garras do Hulk.
Feito isso, o robô se posicionava nas 2 bordas da sala, para resetar sua posição XY e seguia para o final.
Isso tudo em 1300 linhas (com comentários) para conseguir fazer as missões.
Um vídeo mostrando ele na hora do campeonato (o filme não ficou muito bom, pois foi filmado de longe).

O que vem agora?

Se tiver um tempo, edito um vídeo para postar com algumas filmagens do robô em ação.
Como ganhamos o campeonato, iremos para o brasileiro em Setembro que ocorrera em São João Del Rei onde também participaremos do RoboCup Soccer, que são outros 500...
Dia 3 de Julho, viajaremos para Istambul na Turquia, para competir no campeonato mundial, RoboCup RESCUE B e voltaremos dia 14. Vou levar o Xoom, e se der faço um webcasting ao vivo de lá! Só preciso ter Internet.

No mais é isso.
Podem perguntar a vontade quanto ao robô, espero que tenham gostado e que tenha ajudado!

terça-feira, 7 de junho de 2011

Sorteio, anunciando o ganhador!

O vídeo fala por si só...

Parabéns ao ganhador!
O PIC será enviado pelo Francisco pelos correios. Faça bom uso!
Fiquem ligados, que tem mais novidades por vir...
Agradeço a todos que participaram, apoiaram, e elogiaram!
Um abraço,
Ivan Seidel