====== Relatório - Robotica Movel ======= ====== 1- Introdução ====== O Trabalho Prático 3 consiste na utilização de sensores em um robô móvel a fim de avaliar e processar os sinais medidos por esses dispositivos. Para isso, o trabalho foi divido em 5 tarefas: * Caracterização de um sensor óptico-reflexivo através da coleta de dados adquiridos usando um bloco de isopor pintado a uma distância de 3mm do sensor; * Fazer uma análise experimental usando o mesmo bloco do item anterior com distâncias variadas para verificar o comportamento do sinal do sensor. Ainda nessa tarefa é determinada a melhor distância para distinguir entre blocos de isopor de cores diferentes; * Montagem de um LDR com um LED RGB para identificar a cor de um determinado bloco de isopor; * Fazer o robô seguir linhas delimitadas em uma superfície usando o sensor óptico-reflexivo; * Implementação de um Menu na placa HandyBoard que acesse facilmente todos as tarefas anteriores. ====== 2- Principais Decisões ====== Para esse trabalho prático, além do robô construído e utilizado no trabalho prático 2, utilizamos um LDR, um sensor óptico reflexivo e um LED RGB (o mesmo utilizado no tp2). Cinco blocos de isopor de cores azul, preto, vermelho, verde e amarelo foram disponibilizados para o nosso experimento. Foi necessária uma montagem utilizando o LDR e o LED RGB, para montar um sensor que identificasse as cores. Por operar no espectro visível, a luz do LED RGB refletida pelos blocos e captada pelo LDR permitia uma melhor distinção entre as cores quando comparado ao sensor óptico-reflexivo. Como só é possível realizar o controle de um LED RGB na HandyBoard, optou-se pelo sensor óptico-reflexivo como sensor para seguir linhas. Assim, como sua distinção entre branco e preto era suficiente para a elaboração de um controle, ele se tornou uma opção mais viável se comparada a deixar o LED sempre aceso em uma entrada analógica. Dessa forma, o sensor óptico-reflexivo foi conectado na porta nº 5 e o LDR na porta nº 6, ambos de entrada analógica. {{:cursos:introrobotica:2015-1:grupo03:sendor_ldr.jpg?300x300}} {{:cursos:introrobotica:2015-1:grupo03:sensor_optico_reflexivo.jpg?300x300}}\\ Figura 1: Sensor LDR e Sensor Optico Reflexivo \\ ===== 2.1- Identificação de Cor ===== A montagem LDR e LED RGB foi utilizada para distinguir entre as cores dos blocos. Implementamos um algoritmo em Interactive C que recebe um valor da placa HandyBoard que corresponde ao sinal lido pelo LDR através da reflexão da luz emitida pelo LED RGB no bloco de isopor. Com esses dados podemos calcular e estimar a cor do determinado bloco que está em frente ao LDR. O algoritmo funciona da seguinte forma:\\ Com a luz vermelha enviada pelo LED RGB, percebemos que o sinal refletido pelo bloco amarelo mantém um padrão aproximado com os sinais refletidos pelos outros blocos (independente da iluminação).\\ Seja:\\ X = sinal refletido pelo bloco amarelo\\ Y = sinal refletido pelo bloco azul\\ Z = sinal refletido pelo bloco verde\\ W = sinal refletido pelo bloco vermelho\\ M = sinal refletido pelo bloco preto\\ \\ Temos:\\ Y = X + k\\ Z = X + r\\ W = X + p\\ M = X + d\\ Onde k, r, p e d são constantes.\\ \\ Nós encontramos as constantes k, r, p e d. Porém, percebemos que k ~ d ~ r. Logo, só poderíamos a principio distinguir de forma concisa os blocos amarelo e vermelho (X e W). Assim, com a luz azul enviada pelo LED RGB, percebemos que:\\ \\ Y’ = X + k’\\ M’ = X + d’\\ Z’ = X + r’\\ \\ Contudo, ainda assim existia uma semelhança entre r’ e d’ (r’ ~ d’). Nesse caso, resolvemos o problema da identificação do bloco azul, ou seja, ao encontrar um valor próximo de X + k, mudamos a cor do LED para azul. Se o valor encontrado for Y’, então o bloco é azul. Mas ainda resta distinguir entre verde e preto. Então, com a luz verde enviada pelo LED RGB, vimos que:\\ \\ M’’ = X + d’’\\ Z’’ = X + r’’\\ \\ Que nesse caso resolveu o problema de identificação de cores. Se o valor encontrado for X + k, então mudamos o LED para a luz vermelha. Se o valor encontrado for X + d’, então mudamos o LED novamente para luz verde. Se o valor encontrado for X + d’’, então o bloco é preto. Caso contrário, o bloco é verde. Dessa forma, para distinguir com precisão as cores dos blocos, fez-se necessário realizar uma calibração a partir do bloco amarelo e emitir as três cores base do LED RGB (vermelho, verde e azul). Assim, em caso de “empate” com uma das cores, uma segunda cor é acionada para separar alguns blocos e, persistindo o empate, uma terceira cor é emitida para separar totalmente os blocos.\\ {{youtube>small:80JuA1Unb7c}}\\ ===== 2.2- Seguindo a Linha ===== Usamos o sensor óptico-reflexivo para analisar a precisão e a variação do sinal refletido por um bloco a uma certa distância do sensor. Esse sensor foi a principio conectado na frente do nosso robô de forma a facilitar a coleta de dados. Posteriormente fixamos o sensor na parte de baixo do robô para guiar o nosso robô na linha delimitada na superfície. Para seguir a linha, primeiro é feita uma calibração onde o robô aprende as cores branca e preta. O robô irá seguir pelo caminho cujos dados lidos correspondem à média dos valores da calibração, ou seja, ele irá sempre seguir as bordas. Usando esse valor médio como referência, elaborou-se um controlador do tipo Proporcional, cuja constante foi modificada através do knob durante testes até obter um valor satisfatório. Devido à configuração mecânica do robô apresentada no trabalho prático 2, inicialmente o controle era realizado somente no motor de rotação, e o motor de traslação era deixado em velocidade máxima. Contudo, tal configuração não permitia ao robô realizar curvas “em quinas vivas”, deixando de seguir a linha. Como a constante do controlador que proporcionava os melhores resultados gerava valores de potência do motor maiores que 100 no controle, utilizou-se esse excedente, modificado por uma outra constante também obtida por testes, como um valor a ser subtraído da potência do motor de translação, permitindo assim, a realização de curvas fechadas. {{youtube>small:wvXIit68_uM}}\\ ====== 3- Desafios ====== Algumas dificuldades foram encontradas na realização deste Trabalho Prático. Um algoritmo para identificação das cores dos blocos não foi inicialmente trivial, dado que alguns blocos de cores diferentes possuem sinais bem próximos uns dos outros, sendo necessária a utilização das cores do LED RGB para distinguir entre os blocos. Além disso, a luz do ambiente também influenciava na verificação de cor. Nesse caso, a implementação de um algoritmo para calibração do robô para detecção de cor foi necessária. Para a coleta de dados foi exigida algumas funções do Interactive C. Porém, para obter esses dados foi necessário a instalação de um HyperTerminal para gerar a saída dos dados. Essa informação não estava disponível nem na especificação do trabalho prático nem na documentação disponibilizada do Interactive C, gerando assim um grande atraso pesquisando a maneira correta de fazer a coleta de dados. Um outro desafio foi a montagem dos sensores, pois era necessário garantir que as variações de resistência ocasionada por eles acarretassem variações de tensão que pudessem ser captadas pela conversão analógico-digital da Handyboard (se a variação da resistência do LDR fosse muito pequena, a maioria dos valores seria arredondada para um mesmo valor final impedindo a realização do controle). Além disso, foi necessário minimizar os efeitos da variação de luz sobre o sensor LED+LDR. A solução foi utilizar uma peça de Lego preta como base do sensor e deixar o LDR “escondido” para que só recebesse luz frontal. ====== 4- Caracterização do Sensor ====== Utilizando um sensor óptico-reflexivo no robô e escolhendo como bloco de teste o bloco azul, coletamos dados para caracterizar o nosso sensor. Colocamos o bloco a uma distância de 3mm do sensor e usamos as funções do IC (disable_pcode_serial(), printdec(), serial_putchar(10), serial_putchar(13)) por cerca de 5 segundos para adquirirmos os valores de leitura do sensor. O teste foi realizado, primeiramente, com os motores desligados e logo após com ambos os motores ligados. Os resultados obtidos são mostrados nas figuras a seguir:\\ {{:cursos:introrobotica:2015-1:grupo03:optico-3mm-desligados.png?300}} {{:cursos:introrobotica:2015-1:grupo03:optico-3mm-ligados.png?300}} \\ Figura 2: Medidas do sensor óptico-reflexivo para distância de 3 mm entre ele e o bloco azul coletadas durante 5 segundos Após coletar os dados, utilizamos o software Matlab para calcular o valor médio e o desvio padrão das medidas coletadas, como é possível observar nas figuras acima. De acordo com essas figuras, percebe-se que tanto o valor médio quanto o desvio padrão são menores para o teste realizado com os motores desligados (cerca de metade dos valores encontrados para o teste com os motores ligados). Isso deve-se ao fato de que no teste com os motores ligados o algoritmo é executado em multitarefa, o que implica em constantes chaveamentos do programa e consequente “perda de dados em tempo real”. Além disso, o balanço de cargas na HandyBoard possivelmente é afetado ao ligarmos os dois motores o que implica em “perda de potência e capacidade de medição do sensor”. \\ ====== 5- Avaliação Experimental ====== A tarefa de análise experimental também foi realizada com o sensor óptico-reflexivo acoplado na frente do robô para coletar os dados. O bloco escolhido para teste foi novamente o bloco azul e todos os testes foram realizados com os motores desligados. Colocamos o bloco em quatro distâncias diferentes da anterior (3mm na caracterização) em relação ao sensor e usamos as funções do IC descritas anteriormente, coletando os dados de leitura do sensor por cerca de 5 segundos. Os gráficos de Sinal x Tempo (s) para cada uma das distâncias foram plotados apenas para análise do comportamento do sinal, sendo estes mostrados nas figuras 3 e 4 a seguir: {{:cursos:introrobotica:2015-1:grupo03:optico-5mm.png?300}} {{:cursos:introrobotica:2015-1:grupo03:optico-10mm.png?300}}\\ Figura 3: Medidas do sensor óptico-reflexivo para distância de 5 mm e 10mm entre ele e o bloco azul coletadas durante 5 segundos. {{:cursos:introrobotica:2015-1:grupo03:optico-15mm.png?300}} {{:cursos:introrobotica:2015-1:grupo03:optico-20mm.png?300}}\\ Figura 4: Medidas do sensor óptico-reflexivo para distância de 15mm e 20 mm entre ele e o bloco azul coletafas durante 5 segundos. Os valores de média e desvio padrão para cada um desses teste foram calculados conforme é apresentado nas figuras acima. Para efeito comparativo, plotamos o gráfico Sinal x Distância (mm) contendo os quatro testes realizados, conforme é apresentado na figura 5 abaixo: {{:cursos:introrobotica:2015-1:grupo03:optico-sinalxdist.png?400}}\\ Figura 5: Gráfico Sinal vs. Distância (mm), para distâncias de 5, 10, 15 e 20 mm entre o sensor óptico-reflexivo e o bloco azul. De acordo com a figura 5 percebe-se que a partir de 10mm o valor médio do sinal é próximo, sendo a medida de 5mm a mais divergente das demais. Já o desvio padrão manteve-se próximo para as medidas de 5, 15 e 20 mm, sendo a distância de 10mm a que apresentou menor desvio padrão (cerca de metade dos demais). ===== 5.1- Melhor Distância para distinguir blocos de cores diferentes ===== Esta tarefa consiste em realizar testes com o sensor óptico-reflexivo a fim de determinar qual a melhor distância possível para se distinguir blocos de cores diferentes, Os testes foram realizados com as distâncias de 3, 5, 10 e 15 mm e os resultados obtidos são apresentados na tabela a seguir: {{:cursos:introrobotica:2015-1:grupo03:optico-tabela-corxdist.png?400}}\\ Tabela 1: Cor do bloco vs. Distância (mm) do bloco até o sensor óptico-reflexivo Pela Tabela 1 acima, percebe-se que a melhor distância entre os blocos de isopor pintados e o sensor óptico-reflexivo que permite selecionar adequadamente cada bloco de cor diferente é 5mm. Ou seja, para esta distância, há faixas de valores relativamente bem definidos para cada bloco de uma cor, com exceção apenas para as cores verde e vermelho cuja diferença de valores é bem próxima. ===== 5.2- Testes ===== {{youtube>small:aJ-6ZhFistU}}\\ ====== 6- Software ====== Utilizando o IC, um programa foi escrito para realizar as tarefas descritas nos tópicos acima. Para mover o robô de um ponto a outro em uma determinada distância, o motor de translação e rotação são acionados pelo código. Para identificar a cor de um determinado bloco, o algoritmo descrito na seção 2.1 foi utilizado. Para ligar ou desligar o LED RGB ou receber informações do LDR ou do sensor óptico-reflexivo, funções do IC foram utilizadas na implementação dessas tarefas. ===== 6.1- Multitarefa ===== Para realizar o teste com motores ligados da seção 4 foi necessária a realização de multitarefa utilizando o IC. O problema exigia a leitura do sensor óptico-reflexivo juntamente com os dois motores do robô acionados e em um tempo de 5 segundos para cada teste. Assim, foi implementada uma função para ligar os motores e uma função para receber dados do sensor. Para realizar a multitarefa, cada uma das duas funções criadas foram passadas como parâmetro para a função start_process() do IC. Dessa forma, todo o código implementado nessas funções era executado em paralelo. Após 5 segundos, todas as tarefas são canceladas usando a função kill_process() do IC. ===== 6.2- Menu ===== Utilizando o IC e carregando o programa na Handyboard, um menu foi implementado. O menu é bastante intuitivo dizendo quais botões devem ser utilizados para selecionar ou trocar alguma opção (ou usar o knob se for o caso). Todas as tarefas descritas nas seções anteriores podem ser acessadas pelo Menu. Além das opções exigidas no Trabalho Prático 3, o menu também possui opções extras, como ligar apenas um dos motores ou testar uma cor específica do LED. ====== 7- Conclusão ====== O trabalho prático 3 possibilitou a implementação de sistemas de controle ao robô através da medição de seu estado por meio de sensores, melhorando muito a realização das tarefas seja em se tratando de precisão ou de repetibilidade. Contudo, foi possível perceber que os valores registrados pelo sensores geralmente apresentam erros com relação aos valores reais e que o devido tratamento deve ser dado a esses erros para garantir o bom funcionamento do robô. Portanto, é possível concluir que, diferente do Trabalho Prático 2, a programação (software) contendo apenas comandos simples é relativamente executada com boa precisão pelo robô (hardware) quando o controle é realizado em malha fechada. O uso de sensores adequados para que o robô consiga “perceber os próprios erros” é fundamental para que as ações de correção sejam realizadas, garantindo uma execução mais eficiente para suas tarefas.