[[cursos:introrobotica:2010-2:grupo01:index|voltar]]
===== Trabalho Prático 3 =====
{{:cursos:introrobotica:2010-2:grupo01:gbrabelex_1_.png|}}
Link para o relatório do trabalho 3 (sem imagens) :
{{:cursos:introrobotica:2010-2:grupo01:tprob_3.pdf|}}
Link para o código do trabalho:
{{:cursos:introrobotica:2010-2:grupo01:codigo_tp3_redcyclone.tar.gz|}}
Fluxograma do menu implementado na handyboard:
{{:cursos:introrobotica:2010-2:grupo01:menu_tp3.pdf|}}
=== Objetivo ====
O objetivo do trabalho é a utilização de sensores ópticos (opto-reflexivo e chave óptica) para a aquisição de dados, que uma vez tratados serão utilizados no controle do robô conforme o que está proposto na atividade.
{{:cursos:introrobotica:2010-2:grupo01:driver_1_.jpeg?320x192|}}
=== Montagem dos Sensores ===
O primeiro passo pára realização do tp3 foi construção dos sensores ópticos e sua montagem na estrutura do robô. Sensores opto-reflixivos são vendidos no comercio com vários nomes diferentes,assim foi fundamental levar uma ilustração dos componentes para facilitar sua aquisição
**Problemas:**
* determinar se os sensores estavam funcionando, uma vez que operam numa faixa de infra-vermelho e não pode ser visualizado.
**Solução:**
* Montar uma circuito que acendesse um led toda vez que o emissor estiver montado da maneira correta( Leds emissores de infra-vermelho funcionam de forma semelhante a leds comuns).
* Utilizar uma câmera digital( celular ou maquina fotográfica digital), esse aparelhos possuem sensibilidade que cobre essa faixa do espectro da luz. No display aparece um ponto luminoso que corresponde a luz emitida.
=== Construção do robô ===
**Nome do ROBO:** GEBRABELEX-T3
{{:cursos:introrobotica:2010-2:grupo01:chassi_1_.jpeg|}}.
Para obter maior precisão quanto ao numero de giro das rodas os shaft-encoders foram montados nos eixos tracionadores do robô(.
{{:cursos:introrobotica:2010-2:grupo01:encoder_4_.jpg?400x320|}}
**Problemas:**
* Determinar a melhor forma de obter os pulsos que seriam gerados.
**Solução:**
* Testar diferentes polias visando encontra aquela que atendesse os requesitos de espaço e numero de pulso. Para isso foram testas roldanas de mouse( apresentavam orifícios muito pequenos o que dificultava a obtenção de dados, engrenagem de brinquedos mas ocorreu dificuldade de centralização, ao final escolhido a engrenagem de 14 dentes do kit.
{{:cursos:introrobotica:2010-2:grupo01:encoder_3_.jpeg?400x320|}}
Os sensores foram montados muito afastados do local de encaixe e alem disso eram muitos os fios dessa forma foram confeccionados chicotes ,que melhoraam a organização dos fios.Figura_4 –fotos dos chicotes.
{{:cursos:introrobotica:2010-2:grupo01:chicote_1_.jpeg?400x320|}}
A principio pensou em utilizar rodas montadas na parte frontal do robô para facilitar as curvas nas quinas de paredes, mas esta solução não se apresentou muito eficiente na prática, e esta ideia foi abandonada, e ao invés foi utilizada a estratégia de um sensor frontal para detectar a colisão com a parede, então o robô recua e faz uma curva para a direita.
{{:cursos:introrobotica:2010-2:grupo01:frontal_1_.jpeg?400x320|}}
=== Tarefas ===
**Testes de Respostas do Opto-Reflexivo.**
**Video da Execução do WallFollow Hard:**
http://www.youtube.com/watch?v=qRPkUkX6J2w
{{youtube>large:qRPkUkX6J2w}}
**Video da Execução do WallFollow Gentle:**
http://www.youtube.com/watch?v=-mk5qiYVV6g
{{youtube>large:-mk5qiYVV6g}}
**Video da Execução do Three State:**
http://www.youtube.com/watch?v=LrO8wIKXgRQ
{{youtube>large:LrO8wIKXgRQ}}
**Simple feedback control.**
Uso de gráficos para comparar e discutir as funções hard, gentle e tri-state
Hard
{{:cursos:introrobotica:2010-2:grupo01:hard.jpg|}}
Gentle
{{:cursos:introrobotica:2010-2:grupo01:gentle.jpg|}}
Three-State
{{:cursos:introrobotica:2010-2:grupo01:3state.jpg|}}
**Controle Proporcional Derivativo.**
A partir das funções encoder?_counts( conta o numero de pulsos) e encoder?_velocity (retorna a velocidade) foi elaborado o controle proporcional derivativo do robô.
O controle visava igualar as posições das rodas a cada unidade de tempo. A roda esquerda foi tomada com Referência.
ErroProrcional = PosiçãoDir - PosiçãoEsq
Erro derivativo = velocidadeD - velocidadeEsq
Potencia = potencia_Atual - ganhoP*(ErroProporcional) - ganhoDx∗Erroderivativo)
Problemas:
* As operações que o computador realiza são muito rápidas, por esse motivo num primeiro instante o tentar realizar o controle da roda direita os valores para potencia eram extremos, ora acima do máximo (potencia>100) , ora valores negativos (Potencia <0). Isso ocorria, pois toda vez que era identificado um erro(roda mais lenta ou mais rápida) o controle tentava corrigi-lo , mas como não esperava um tempo suficiente para atuação dos motores ocorria então, um efeito avalanche.
Solução:
* Determinar um processo para amostragem de dados separadamente. Assim, havia tempo suficiente para que os motores agissem.
Problema2:
* Os motores partiam em tempos diferentes.Dessa forma havia um grande erro inicial e ao tentar corrigi-lo o robô o fazia de forma brusca o que causava um desvio na partida fazendo com que o robôs perdesse o alinhamento.
Solução:
* Os motores passaram a ser acionados em tempos diferentes ,não é melhor forma de fazer o ajuste( a melhor seria parti-lo em rampa), mas como havia a necessidade de medir a distancia foi adotado esse método.
Para o Controle PD foi elaborado um menu de permite ajustar os ganhos Proporcional, Derivativos e o tempo para amostragem dos sensores.
**Controle Deliberativo: Algoritmo Wave Front**
Esse algoritmo permite que o robô parta de um ponto de coordenadas A(x,y) e chegue ao ponto B(x¹,y¹), sendo capaz de desviar de obstáculos no seu caminho.
{{:cursos:introrobotica:2010-2:grupo01:wf_plan_1_.jpeg?400x320| Plano do Wave Front}}
Problema1:
* Adpatação do código disponível no site.
Solução:
* Percorrer as linhas do código substituindo as funções de seguir em frente, virar_esquerda e virar_direita , pelas funções elaboradas pelo grupo. Além disso, foram feitos alguns tratamentos de erro para deixar o código mais robusto.
Problema2:
* Devido as limitações físicas (potenciômetro e os botões de start e stop) da handyboard , a configuração dos dados: posição inicial, posição final , numero de objetos, e suas relativas posições, são muito trabalhosa.
Solução:
* Criar uma função que converte posições nos gride e números assim facilitaria parte do código.Essa função implementada .
Problema3:
* Superposição – quando uma posição já está ocupada( obstáculo, ponto de partida ou ponto de chegada) e tenta-se utiliza-la.
Solução:
* Imprimir mensagem de aviso indicando o uso dessa posição.
A identificação das células do grid foi parametrizadas. Assim, o valor entrado é uma identificação que é convertida nas coordenadas (x,y).
**Execução do Algoritmo Wave Front:**
Após algumas tentativas frustradas, conseguimos achar os valores de calibração ideal para as curvas para a esquerda e para a direita. E enfim o trajecto de teste foi executado correctamente duas vezes.
**Video da Execução do Wave Front:**
http://www.youtube.com/watch?v=LE9egb27r7c
{{youtube>large:LE9egb27r7c}}
Tira-teima:
http://www.youtube.com/watch?v=vGwdo8yZUro
{{youtube>large:vGwdo8yZUro}}