====== O Robô ====== ===== Hardware ===== O Pulga possui dois sensores LDR com filtro para detectar as bases, um sensor LDR para detectar a presença ou não de blocos, um sensor infravermelho para detectar a partida e diferenciar blocos inocentes de blocos bandidos, um encoder em cada roda, além de dois sensores de toque na frente esquerda e direita. É um robô diferencial, simplificando o controle. ===== Software ===== O Pulga foi programado segundo o paradigma comportamental. Funciona de forma reativa, sem depender de uma localização precisa para capturar os blocos e levá-los até a base. Sua única dependência para funcionar adequadamente são as luzes polarizadas que iluminam ambas as bases. O robô utiliza as luzes polarizadas para caminhar em direção à base adversária. Ele utiliza as paredes para caminhar em diagonal, de forma a explorar o ambiente. Caso encontre um bloco durante o percurso, o Pulga verifica se é um inocente ou um bandido. Se for um inocente, o Pulga recua, liberando-o. Se for um bandido, ele é levado até a base. Para ir até a sua própria base, o robô segue a luz polarizada. Porém, dessa vez ele procura fazer um caminho reto em direção à luz, ao invés de andar em diagonal, de forma a chegar na base o mais rápido possível. Caso o robô chegue no final da base adversária sem pegar nenhum bloco, ele passa a explorar o ambiente em direção à sua própria base. O Pulga verifica se chegou no final da base adversária ou no final da sua base pelo valor dos sensores LDR. O tanto que ele irá se aproximar do final de uma base até retornar pode ser calibrado. Quando o robô possui um bloco, a forma de detectar se ele chegou no final da base é diferente. Caso um dos sensores de toque se ative e o robô esteja virado em direção à sua base, ele considera que chegou no final da base, e pode liberar o bloco. Como ele está seguindo a luz, ele consegue deixar o bloco no local correto. A programação foi realizada utilizando três camadas, como pode ser visto abaixo: {{:cursos:introrobotica:2007-2:grupo10:tp0:diagrama.png|:cursos:introrobotica:2007-2:grupo10:tp0:diagrama.png}} A camada **Toque** é responsável por fazer o robô girar quando os sensores de toque se ativam, permitindo que ele explore o ambiente quicando nas paredes. Além disso, essa camada também é responsável por verificar se o robô chegou no final de sua base. A camada **Retornar** é responsável por fazer o robô andar em direção à luz de sua base, permitindo que ele deixe um bloco capturado no local apropriado. Essa camada só é ativada quando o robô percebe que capturou um bloco. A camada **Explorar** é responsável por fazer o robô explorar o ambiente. Ele utiliza as luzes para se orientar, mas nessa camada ele não busca andar reto em direção à luz, como na camada **Retornar**. Devido ao efeito da camada **Toque**, o robô anda em diagonal, quicando nas paredes, maximizando a exploração do ambiente. ====== Dificuldades e Decisões de Implementação ====== Tivemos várias dificuldades durante a implementação: * Entender e implementar adequadamente um algoritmo no paradigma comportamental. * Saber a orientação do robô no cenário. Dependemos muito das lâmpadas para identificar a orientação. * Controlar o robô de forma precisa dentro do paradigma comportamental. Para evitar conflitos entre as threads, acabamos tendo que implementar a maior parte do controle baseado em tempo. ====== Prévia ====== Dia 04/12/2007 às 00:50 é terminado o Pulga. Todos os testes foram feitos, e o bugs encontrados, corrigidos. Iniciamos a etapa de aguardar ansiosamente pela prévia, afinal, todo o destino do grupo dependia de uma boa apresentação do Pulga. Após apresentação de alguns grupos sentimos um certo alívio, mas Murph existe, e apesar de testes exaustivos, algo poderia dar errado. Quando chegou nossa vez de apresentar, o Pulga demonstrou-se melhor do que esperávamos e pegou 5 (CINCO) bloquinhos... Alegria total. Até tal ponto não acreditávamos ter um robô capaz de ganhar, afinal, robôs com grandes braços e comedores estavam no campo, mas vimos que o Pulga era bastante eficiente. PS.: Pegamos o maior número de blocos na prévia :-D ====== Competição ====== É começada a competição. Mario apresenta o objetivo do evento. Todos os grupos se apresentam, nós, os últimos, não aguentávamos de ansiedade. Primeira batalha, adivinha... Pulga x Chuck Norris. O Pulga conseguiu pegar 4 bloquinhos e nós não aguentávamos mais de tanta alegria. Mas as batalhas foram passando, e o Pulga... Arrebentando. Fim da 3a rodada: Pulga com 31 pontos, 2o colocado com 24 pontos. Mas a soberba precede a queda... brincadeira, mas estávamos quase certos da vitória. 4a rodada... Pulga x Gato Guerreiro. Tudo corria bem, o Pulga pegando os bloquinhos e pontuando, até que o Gato Guerreiro pegou todos nosso blocos. Até ai tudo bem, poderiámos ganhar ainda, a diferença de pontos era grande e ainda tinhamos +/- 30 segundos. De repente uma colisão, o Gato Guerreiro empurrou o Pulga, e devido a um bloco atrás do Pulga, servindo de encalsse, fez com que o Pulga tombasse, e devido a força do Gato Guerreiro, foi arrastado até a base inimiga. Resultado... Pulga perde de 45 a 32. 8-O ====== Conclusão ====== Primeira conclusão: Nem sempre o melhor vence. O Pulga era o único que varria todo o campo através do algoritmo Wander, utilizando as paredes para virar. O Pulga era o único que via a luz de qualquer lugar do campo (horas e mais horas de montagem e calibragem para tal feito). O Pulga era o único que reconhecia a cor do bloco. Mas o que o Pulga não tinha ? A melhor estratégia ? Mais força ? Vai saber ... Segunda conclusão: O trabalho árduo foi recompensado. Mesmo não tendo ganhado, recebemos vários elogios a respeito do robô. Até mesmo durante o discurso de vitória do MoU fomos citados. Terceira conclusão: Perder não é bom :-( Até a prévia nem acreditávamos ter um robô competitivo. Depois e durante a competição fomos ficando cada vez mais certos da vitória, e ela não veio. O resumão de tudo é que o trabalho foi extremamente gratificante, principalmente porque o Pulga fez exatamente o que pensamos, e lutou bravamente até o final. Não foi fácil chegar onde chegamos, mas estamos contentes com o resultado. ====== Mídia ====== ^ Fotos ^^ ^ Visão Frontal ^ Sensor de Base ^ |[[http://tp1-intro-robotica.googlecode.com/files/IMG_0600.JPG|{{:cursos:introrobotica:2007-2:grupo10:tp0:IMG_0600thumb.jpg}}]]|[[http://tp1-intro-robotica.googlecode.com/files/IMG_0601.JPG|{{:cursos:introrobotica:2007-2:grupo10:tp0:IMG_0601thumb.jpg}}]]| ^ Sensor de Bloco ^ Visão Lateral ^ |[[http://tp1-intro-robotica.googlecode.com/files/IMG_0605.JPG|{{:cursos:introrobotica:2007-2:grupo10:tp0:IMG_0605thumb.jpg}}]]|[[http://tp1-intro-robotica.googlecode.com/files/IMG_0606.JPG|{{:cursos:introrobotica:2007-2:grupo10:tp0:IMG_0606thumb.jpg}}]]| ^ Roteamento dos Fios ^ Sensor de Toque ^ |[[http://tp1-intro-robotica.googlecode.com/files/IMG_0607.JPG|{{:cursos:introrobotica:2007-2:grupo10:tp0:IMG_0607thumb.jpg}}]]|[[http://tp1-intro-robotica.googlecode.com/files/IMG_0609.JPG|{{:cursos:introrobotica:2007-2:grupo10:tp0:IMG_0609thumb.jpg}}]]| * **Video:** [[http://www.youtube.com/watch?v=IawllSGSixc|Link para YouTube]] * **Video Pulga:** [[http://tp1-intro-robotica.googlecode.com/files/Brope.wmv|Link para download]] * **Apresentação:** [[http://tp1-intro-robotica.googlecode.com/files/apresentacao.pdf|Link para download]] * **Código Fonte:** [[http://tp1-intro-robotica.googlecode.com/svn/trunk/Robo%20Final/|Link para o código]] * **Outros:** [[http://code.google.com/p/tp1-intro-robotica/downloads/list|Link para diretório no Google]]