====== Introdução ====== Neste trabalho foi pedido que o robô realizasse as seguintes tarefas: - Andar em linha reta por um tempo determinado. - Se localizar e andar em direção a luz polarizada. - Andar sobre uma linha preta e tomar decisões ao encontrar blocos coloridos. Para cumprir esse objetivos introduzimos novos sensores no Robô relevantes para as tarefas destacadas e para a competição "Robomarte". Dentre esse sensores, destacamos: * sensor de toque * sensor diferencial para luz polarizada * adaptação para que o sensor de cor para que ele possa fazer a leitura enquanto o robô estiver em movimento. * shaft encoders Além disso, o trabalho exigiu uma lógica mais refinada para o robô uma vez que as tarefas deste trabalho são bem mais elaboradas do que nos anteriores. Iremos detalhar essas decisoes mais adiante neste relatório. Na próxima seção, detalharemos as mudanças estruturais e as modificações na montagem elétrica que realizamos no robô em relação ao TP 2. ====== Estrutura Mecânica ====== Depois de uma série de sugestões sobre a posição dos motores, a forma de fixar a handyboard, e a robustez da montagem dos sensores feitas pelo professor e pelo monitor no TP2, resolvemos reconstruir o robô. Dessa forma, sanamos todos os problemas apontados mas, encontramos novos questões que deverão ser resolvidas para a prévia. Em seguida mostraremos passo-a-passo as mudanças estruturais do robô. {{:cursos:introrobotica:2012-2:grupo07:tp3:all.jpg?400}} ===== Posição do motor e reduções ===== O novo robô pode ser dividido em 2 partes: a parte mecânica e de controle na traseira, e a parte de percepção na ponta (Foto 1). Na parte mecânica, posicionamos o motor, mais ao fundo perpendicular ao sentido de movimento do robo. Biapoiamos o eixo do motor de forma que a redução fosse feita internamente ao robô. Com esse novo posicionamento, procuramos aumentar a resistência do robô a eventuais colisões, pois teremos a possibilidade de ocupar as laterais com sensores de toque ao invés de engrenagens. Além disso foi possível colocar o shaft encoder. Em nosso antigo robô a redução era de 1/5 e hoje temos apenas 1/3 Pelo que avaliamos, o torque gerado pelo motor somado a essa redução é suficiente para que o robo consiga subir a rampa da prévia. Infelizmente, a nova configuração de engrenagens elevou o atrito e tivemos que aumentar a potencia mínima imprimida pelo motor de 20% para 60%. Mesmo assim, consideramos esse valor razoável pois ainda temos 40% de potência dos motores para poder manobrar e corrigir os erros de movimento. O eixo principal do robô foi elevado em um bloco de lego, ou seja, as rodas se encontram a uma distancia de 1 peça de lego (3 cm, aproximadamente) mais afastadas do plano onde estão localizados os motores. Com isso, pretendíamos diminuir a chance do robô raspar o fundo na subida da rampa. No entanto, isso introduziu o dilema da altura do robô que falaremos mais adiante {{:cursos:introrobotica:2012-2:grupo07:tp3:reducao.jpg?400}} ===== Shaft Encoders (SE) ===== Os SEs são chaves opticas acopladas a um dos eixos ligados a uma das engrenagens conectadas às rodas de forma a contar seu número de rotações. Idealmente, os SEs não podem estar em eixos próximos da engrenagem (resolução dos dados lidos será baixa), como não podem estar muito distantes (podem haver perdas de rotação e deslizamento de engrenagens no caminho). No nosso caso, colocamos o SE na terceira engrenagem, após uma redução de 1/5 (menor engrenagem para a maior). Pelos nossos, testes a resolução do SE ficou boa, obtendo 10 rotações por segundo. Cabe ressaltar que nossas engrenagens não estão deslizando pois as posicionamos a uma distancia recomendada pelo guia umas das outras. Além disso, Realizamos testes colocando cargas nos pneus e não foram dectadas nenhum travamento parcial ou total do conjunto de engrenagens do robô. {{:cursos:introrobotica:2012-2:grupo07:tp3:shaft-encoder.jpg?400}} ===== Sensor de Toque ===== Para esse trabalho colocamos sensores de toque na frente do robô como se fossem parachoques. {{:cursos:introrobotica:2012-2:grupo07:tp3:bumper.jpg?400}} ===== Sensor diferencial ===== Tivemos alguns problemas sobre a colocação do sensor diferencial para luz polarizada. Inicialmente tentamos colocá-lo na parte de trás do robô para minimizar com o led do sensor ativo de cor. No entanto, a grande quantidade de cabos ligados a handyboard prejudicariam sua leitura. dessa forma colocamos ele logo a frente da handyboard. Realizamos alguns testes e verificamos que não há essa interferência que temiamos. Os LDRs foram isolados usando uma mangueira preta e ligamos ele como mostra no livro de forma a ocupar apenas uma porta analógica. ===== Adaptaçao sensor de cor ===== Nesse trabalho adaptamos o sensor de luz para detectar as cores usando reflexão de um LED RGB. Infelizmente, o LED RGB queimou e tivemos que substituir por um led de cada cor. Para avaliar a cor dos blocos utilizamos 2 algoritmos que explicaremos mais adiante. ===== Dilema altura do robô ===== Como decidimos deixar os sensores na frente do robô, tivemos dificuldades em decidir a altura que ficaria o sensor de cor. Se ficasse baixo demais, poderia raspar na rampa. Se ele ficasse alto, não conseguiria ler a cor do bloco. Dessa forma, a precisão e a exatidão do sensor foram prejudicadas em detrimento da altura e do sensor de toque. Tentaremos melhorar essa questão para a prévia ====== Estrutura Elétrica ====== ===== Mapa das portas ===== {{:cursos:introrobotica:2012-2:grupo07:tp3:configeletrica.png|}} ===== Posição dos fios ===== Como ja foi falado, a nova estrutura permitiu que os sensores fosse posicionados na frente do robô. Dessa forma maioria dos cabos passam pela frente temos uma barra para segurar os cabos que vem nessa direção. Nas laterais, utilizo uma estrutura para segurar os fios dos Shafts Encoders e do Motor. ===== Plug handyboard ===== Outra modificação foi que todos os sensores agora conectam com a handyboard com um plug único isso dificulta que os sensores sejam ligados incorretamente. ====== Testes, Calibração e Avaliação experimental ====== Para escolher cortes e fazer decisões do algoritmo a ser usado, fizemos alguns testes nos novos sensores adicionados no robô. Em seguida analisaremos os resultados do sensor diferencial e do shaft encoder. ===== Sensor diferencial ===== O sensor diferencial mostrou valores bem diferentes quando o sensor se encontra próximo da fonte luminosa. É viável traças um limiar para determinar se o sensor se encontra sob influência da fonte de um lado ou de outro. {{:cursos:introrobotica:2012-2:grupo07:tp3:values.png|}} {{:cursos:introrobotica:2012-2:grupo07:tp3:grafico.png?650}} Experimentalmente, conseguimos que essa influencia de uma luz chegasse a quase metade do campo contrário. ===== Shaft Encoder ===== Determinamos experimentalmente, que a potencia ideal do motor (PWM) é de 75%. Além disso, verificamos que 60% é a potencia de travamento do motor. Dessa forma, temos uma margem para correção de erros que foi feita através de um controle PD. Dentro dessa margem 60% - 100% o shaft encoder funcionou corretamente. ====== Implementação dos Algoritmos ====== {{:cursos:introrobotica:2012-2:grupo07:tp3.txt| Código Fonte}} ===== 1- Localização ===== A partir de 2 lâmpadas polarizadas em lados opostos do campo, implementamos um algoritmo que permita ao robô se localizar e caminhar até uma das luzes (que é escolhida). Os valores dessas luzes (com o robô bem perto delas) é calibrado no início do algoritmo, para que seja detectado o momento em que o robô chegar até uma delas. Para o desenvolvimento do algoritmo, foi criado um autômato de estados finitos, com os seguintes estados: Estado 0 – Perdido Estado 1 – Totalmente Perdido Estado 2 – Caminhando ao Objetivo Os estados 1 e 2 possuem transições para o estado 0 e vice-versa, mas não há transições entre 1 e 2. Assim, o estado 0 pode ser considerado como o “centro” do algoritmo, e é também o estado inicial. Abaixo, descreverei as ações tomadas em cada um dos estados. ==== Perdido ==== O robô gira 360 graus procurando o ângulo em que a luz (da fonte de luz escolhida) é mais forte. Após o giro de 360 graus, retorna até esse maior ângulo, se achado (foram criados limites para determinar se as fontes foram achadas ou não). Nesse caso, vai para o Estado 2 – Caminhando ao Objetivo. Se não achar, vai para o Estado 1 – Totalmente Perdido. Obs: Como o sensor a ser usado para a polarização foi o sensor diferencial, o nosso valor de “zero” seria o 127 ou 128 (metade de 255). Assim, quanto mais distante desse “zero”, tanto para baixo quanto para cima, mais próximo o robô está de uma fonte de luz, sendo que um valor superior indica uma fonte e um inferior indica a outra. Sendo assim, os limites definidos foram 120 e 135 (abaixo de 120 indica uma fonte, acima de 135 indica a outra, e entre esses valores nenhuma fonte é achada). ==== Totalmente Perdido ==== Como em sua posição atual o robô não encontrou luz em nenhum ângulo, ele começa a descrever um movimento aleatório enquanto continua a procurar pela luz. O movimento feito é em forma de espiral, uma espiral quadrada, que vai incrementando o tamanho de lado a cada 3 lados executados. Caso o robô bata na parede, ele possui um sensor de toque dianteiro, que faz com que ele ande um pouco para trás e continue o seu movimento em espiral. A qualquer momento que alguma das fontes de luz seja detectada (de acordo com os limites descritos anteriormente), o robô volta ao Estado 0 – Perdido, para achar o melhor ângulo para seguir em direção à fonte. ==== Caminhando ao Objetivo ==== O robô simplesmente executa uma trajetória em linha reta. No entanto, um histórico é utilizado para determinar quando a trajetória tem que ser recalculada (por exemplo em casos de acumulo de erro, ou se o caminho até a fonte não for uma simples linha reta). Quando o robô se aproxima da fonte de luz, a tendência é aumentar o valor de luz lido. Assim, o funcionamento do algoritmo é o seguinte: se todos os últimos valores lidos (o buffer do histórico) forem maiores do que o valor de luz lido, a probabilidade é muito grande da direção do robô estar errada, e então é feito o recalculo. Nesse caso, o robô volta ao Estado 0 – Perdido. Entretanto, será nesse estado que o robô chegará alguma hora na fonte de luz. Isso é detectado por limites previamente calibrados e ajustados. Quando o robô encosta na parede, ativando o seu sensor de toque, esse limite é diminuido, pois a probabilidade passa a ser maior do robô ter chegado à fonte (se a luz estiver forte). Após a detecção da chegada, o robô executa mais uma vez o Estado 0 para se orientar em frente à fonte e finaliza a sua execução, com uma música para avisar. ===== 2 – Segue Linha (com identificação de cores) ===== O algoritmo de Segue Linha funciona como descrito no TP2, por isso, não será aqui descrito novamente. No entanto, o algoritmo de identificação de cores foi melhorado, por isso o descrevo abaixo. 3 Leds (RGB) são utilizados para detectar as cores de blocos e também um sensor LDR. Cada Led é aceso em momentos diferentes, de modo que haja três medições para cada bloco. Cada bloco a ser utilizado é calibrado previamente. O algoritmo funciona calculando a distância cartesiana dos valores (R,G,B) de cada bloco para o valor (R,G,B) medido, considerando um espaço de 3 dimensões com as dimensões R, G e B. Além disso, o algoritmo também considera as razões entre os valores de luz de cada objeto (R/G, G/B e B/R). Ele calcula para o valor medido, a distância também de cada padrão(as razões) . No final, o algoritmo multiplica os dois valores de distância para cada bloco. O bloco correspondente à menor distância calculada é o detectado. ===== 3 - Linha Reta (Shaft Encoder) ===== Foi desenvolvido um controle PD para fazer o robô consertar em vez de acumular erros dos motores, de modo a andar em linha reta. O tempo que o robô anda pode ser escolhido pelo usuário. Para isso, 2 algoritmos foram utilizados. Eles serão descritos abaixo: ==== Iguala Motores ==== Esse algoritmo tenta, a partir do número de rotações da roda direita e da roda esquerda em um intervalo de tempo, ajustar as potências dos motores de modo a igualar essas rotações no próximo ciclo(mesmo intervalo de tempo). Assim, ele calcula a razão rotDir / rotEsq e aplica essa razão nas potências. Para que não seja só um motor ajustado, ele aplica em um deles a raiz quadrada da razão e no outro o inverso da raiz quadrada da razão. ==== Controle PD ==== Esse controle proporcional-derivativo utiliza o valor do erro como base para a correção. Quanto maior o erro, maior é a correção, que é proporcional à constante Kp, para a qual utilizamos o valor 2.0. Há também a parte derivativa, que reduz essa correção com base na variação (derivada) do erro. O valor de Kd escolhido foi 0.8.