====== Trabalho Prático 3 ====== ===== Introdução ===== O trabalho prático 3 consiste em criar um robô autônomo utilizando peças Lego. O robô deverá ser capaz de realizar tarefas associadas ao uso de sensores. As tarefas são: reconhecimento de cores, percorrer um trajeto sobre uma linha preta no chão, seguir luzes polarizadas, seguir paredes e implementar um sistema de controle capaz de permitir a movimentação em linha reta. ===== Objetivos ===== O objetivo do trabalho é familiarizar com o uso de sensores, como sua construção, avaliação e processamento dos sinais medidos. Os sinais serão utilizados como dados de entradas em procedimentos relacionados às tarefas que o robô deverá ser capaz de realizar. ===== Desenvolvimento ===== Inicialmente, optamos por modificar a estrutura do robô que tínhamos até então do trabalho prático anterior. Utilizávamos até então pequenas esteiras entre algumas engrenagens. Essa estrutura tornava movimentos como curvas difíceis de controlar e muitas vezes imprevisível. :-/ Visando a estabilidade e uma maior facilidade no movimento do robô, trocamos essa estrutura e inserimos uma "rosca sem fim" no eixo do motor. Isso garantiu maior estabilidade. O próximo passo foi o estudo do funcionamento dos sensores. Utilizamos nessa montagem: * **Reconhecimento de cores:** 4 leds (vermelho, verde, amarelo e azul) e 1 sensor LDR (Light Dependent Resistor) * **Seguir linha preta no campo:** 2 sensores LDR (Light Dependent Resistor) * **Controle de proximidade:** 1 sensor de proximidade * **Seguir luz polarizada:** 2 sensores LDR (Light Dependent Resistor) com 2 filtros para cada tipo de luz. * **Estrutura para o controle PD** 2 sensores break-beam para a construção do Shaft Encoder. Foi necessário, para todo sensor LDR utilizado, envolvê-lo numa espécie de capa para isolá-lo, em algumas direções, da luz ambiente e focar suas leituras. Isso aumenta a qualidade das medidas filtrando ruídos provenientes da luz ambiente. Para o conjunto de reconhecimento de cores utilizamos uma placa de circuito impresso para facilitar a montagem. {{:cursos:introrobotica:2009-2:grupo5:dsc00066.jpg|}} Tal placa foi fixada à frente do robô. Logo abaixo foi fixado o sensor de proximidade e mais dois sensores LDR responsáveis por detecção de obstáculos e seguir a linha preta, respectivamente. Os sensores responsáveis por seguir as luzes polarizadas foram montados a partir da melhor posição dos filtros. Tal posição é escolhida verificando para qual orientação do filtro há uma maior luminosidade a partir de uma certa fonte de luz polarizada X. {{:cursos:introrobotica:2009-2:grupo5:dsc00067.jpg|}} Por fim, os sensores break-beam foram instalados na parte de baixo do robô. Foi necessário criar em papelão uma espécie de "círculo dentado", para que fosse possível contar o número de voltas. Uma vez que sabemos o número de "dentes" de tal círculo, sabemos quando houve uma volta completa e assim faz-se as inferências necessárias ao controle PD. {{:cursos:introrobotica:2009-2:grupo5:dsc00068.jpg|}} ===== Algoritmos Implementados ===== ==== Reconhecimento de cores ==== Como a luz ambiente é altamente variável e inconstante foi implementado um algoritmo de calibração. Tal algoritmo liga cada led por alguns segundos e toma 50 medidas e faz a média dos valores obtidos. O valor final é uma combinação linear das medidas feitas. Formalmente, o valor da cor é calculado como: COR = (leitura_led_amarelo) + 2*(leitura_led_vermelho) + 4*(leitura_led_verde) + 8*(leitura_led_azul); O reconhecimento ocorre com uma leitura como feita na calibração e uma tolerância de erro é aplicada. Procura-se então um valor de cor calibrado que esteja no intervalo lido. ==== Seguindo luzes polarizadas ==== O algoritmo implementado no robô que melhor respondeu ao propósito foi utilizar apenas 1 sensor por luz. A idéia é: para o filtro ajustado para um tipo de luz responderá com menor valor quanto este estiver melhor direcionado para a fonte. Já que haverá maior luminosidade e portanto menor valor retornado pelo sensor. Portanto o algoritmo é iniciado com uma leitura no sensor para o tipo de luz escolhida no menu na posição inicial. O robô faz uma pequena curva à esquerda e faz outra medida. Das duas possibilidades: 1 - Caso a medida seja menor, ou seja, a intensidade de luz é maior, essa direção é considerada adequada. O robô continua fazendo curvas à esquerda enquanto o valor lido seja menor que o anterior. Caso o valor lido seja maior, o robô vira à direita, para refazer a trajetória correta e anda reto por um certo tempo. 2 - Caso a medida seja maior, ou seja, a intensidade de luz é menor, o robô retorna à posição original e tenta a mesma estratégia em 1, mas dessa vez tentando sempre à direita. Após achar a melhor direção e seguir reto por um instante, todo o algoritmo recomeça. ==== Seguindo a linha preta do campo ==== Decidimos por fixar os dois sensores LDR sobre a linha preta. A máquina de estados implementada possui, portanto os seguintes estados e ações para os sensores: ^ Estado ^ Ação ^ | Direito: Preto; Esquerdo: Preto | Continuar em linha reta | | Direito: Preto; Esquerdo: Branco | Aumente a potência do motor esquerdo em 10% | | Direito: Branco; Esquerdo: Preto | Aumente a potência do motor direito em 10% | | Direito: Branco; Esquerdo: Branco | Ande em marcha ré | Os pares estado-ação descritos acima realizaram a tarefa de seguir a linha de forma interessante e robusta, uma vez que não há necessidade do robô parar para tomar qualquer decisão já que os sensores são lidos ao mesmo tempo que se move. ==== Reconhecimento de obstáculos ==== Os obstáculos no contexto deste trabalhos são os blocos coloridos disponibilizados. Neste ponto não é necessário calibração a todo instante como o algoritmo de reconhecimento de cores. Basta apenas, previamente, definir qual a distância adequada para a detecção dos blocos. A partir disso, olha-se a leitura do sensor de proximidade e guarda-se o valor. Este será usado operando de comparação a todo instante para verificar a existência de blocos no caminho. ==== Shaft Encoder e Controle PD ==== O controle do shaft encoder foi realizado utilizando uma biblioteca da linguagem IC. Arquivos SENCDR4.ICB e SENCDR5.ICB. Que são responsáveis por contar a quantidade de voltas, bem como calcular a velocidade a cada 64ms. A partir desses valores utilizamos o código do controlador exposto em aula, o código se encontra nas trasparências do livro: Robotics Explorations: A hands-on Introduction to Engineering, Fred Martin, 2001, Prentice-Hall. ===== Estudo das medidas dos sensores ===== Assim como especificado no trabalho, o estudo das variações de medidas a partir dos sensores foram estudados. A seguir os dados são apresentados. Vale lembrar que os valores lidos na Handyboard são dados de 0 a 255. ==== Leituras feitas com o sensor sem proteção e com LEDs desligados ==== **Cor Amarela** ^ Distância^ D1 ^ D2 ^ D3 ^ D4 ^ D5 ^ D6 ^ D7 ^ D8 ^ D9 ^ D10 ^ |1cm|61|61|62|61|61|62|61|61|61|62| |2cm|48|49|49|49|48|49|49|49|50|50| |3cm|38|38|39|39|39|39|40|40|40|40| {{:cursos:introrobotica:2009-2:grupo5:amarelo_dist.jpg|}} ---- **Cor Azul** ^ Distância^ D1 ^ D2 ^ D3 ^ D4 ^ D5 ^ D6 ^ D7 ^ D8 ^ D9 ^ D10 ^ |1cm|81|80|80|81|81|80|81|81|81|80| |2cm|58|57|61|61|60|60|60|60|60|60| |3cm|49|50|50|49|50|50|50|50|50|50| {{:cursos:introrobotica:2009-2:grupo5:azul_dist.jpg|}} ---- **Cor Verde** ^ Distância^ D1 ^ D2 ^ D3 ^ D4 ^ D5 ^ D6 ^ D7 ^ D8 ^ D9 ^ D10 ^ |1cm|47|47|48|48|49|48|47|48|48|48| |2cm|39|38|39|38|38|39|39|39|39|39| |3cm|31|30|31|31|30|31|31|31|31|31| {{:cursos:introrobotica:2009-2:grupo5:verde_dist.jpg|}} ---- **Cor Vermelho** ^ Distância^ D1 ^ D2 ^ D3 ^ D4 ^ D5 ^ D6 ^ D7 ^ D8 ^ D9 ^ D10 ^ |1cm|45|46|47|46|46|46|46|46|46|47| |2cm|38|39|39|38|39|39|39|39|39|39| |3cm|31|32|31|31|32|32|32|32|32|32| {{:cursos:introrobotica:2009-2:grupo5:vermelho_dist.jpg|}} ==== Leituras feitas sem caixa de proteção e motor desligado ==== **Cor Amarela** |76|76|76|77|77|77|76|77|77|77| {{:cursos:introrobotica:2009-2:grupo5:amarelo_sem_caixa_motor_off.jpg|}} ---- **Cor Azul** |108|108|108|108|109|109|109|109|109|109| {{:cursos:introrobotica:2009-2:grupo5:azul_sem_caixa_motor_off.jpg|}} ---- **Cor Verde** |101|101|101|102|102|102|102|103|103|103| {{:cursos:introrobotica:2009-2:grupo5:verde_sem_caixa_motor_off.jpg|}} ---- **Cor Vermelho** |80|82|83|83|83|84|84|84|84|84| {{:cursos:introrobotica:2009-2:grupo5:vermelho_sem_caixa_motor_off.jpg|}} ==== Leituras feitas sem caixa de proteção e motor ligado ==== **Cor Amarela** |74|74|74|74|75|75|75|76|75|75| {{:cursos:introrobotica:2009-2:grupo5:amarelo_sem_caixa_motor_on.jpg|}} ---- **Cor Azul** |104|104|104|104|103|103|104|103|104|104| {{:cursos:introrobotica:2009-2:grupo5:azul_sem_caixa_motor_on.jpg|}} ---- **Cor Verde** |102|102|102|103|103|103|103|103|104|104| {{:cursos:introrobotica:2009-2:grupo5:verde_sem_caixa_motor_on.jpg|}} ---- **Cor Vermelho** |84|84|84|84|85|85|85|85|85|85| {{:cursos:introrobotica:2009-2:grupo5:vermelho_sem_caixa_motor_on.jpg|}} ===== Conclusão ===== O trabalho proporcionou o contato direto com as dificuldades na utilização e calibração de sensores. Pôde-se ver que a influência da luz ambiente tem grande relevância na medição e que, por este motivo, soluções para eliminar esta influência indesejada são implementados, pois assim, o robô desenvolvido não está calibrado somente para um ambiente, mas sim para qualquer ambiente em que este esteja. ===== Documentação ===== Relatório: {{:cursos:introrobotica:2009-2:grupo5:Relatorio_TP3.pdf|}} ===== Arquivos ===== Código: {{:cursos:introrobotica:2009-2:grupo5:tp3_codigo.tar.gz|}}