aniblue07_bendlr_back.gifaniblue07_bendlr_next.gif

Optimização

Já foi referido que o código de controlo foi desenvolvido no PC. Devido às suas grandes capacidades matemáticas não existem problemas de tempos de processamento. No entanto em toda a parte de controlo se fazem operações com floats, ou utilizam-se funções trignométricas. Por exemplo na hodometria fazem-se muitas operações com floats e operações trignométricas, e no calculo de rectas e também. Como todo este código que está a ser feito tem de estar consuante as capacidades do AVR, temos de tratar com cuidado este problema. Devemos minimizar o uso de aperações com floats, e não utilizar operações trignométricas. A primeira é fácil de fazer, racionalizar a utilização de floats ao gerar o código, e se possível dar a volta a certas operações matemáticas, no entanto usando-os sempre que se torne estritamente necessário, pois não podemos sacrificar o bom funcionamento do Robot à custa de um problema destes. No segundo caso, as coisas já não se passam tão linearmente, e torna-se necessário o recurso a tabelas trigonométricas para resolver a questão. No nosso caso, e aproveitando o facto do coseno e seno serem funções que podem ser sempre transformadas para o primeiro quadrante, e criamos uma tabela de cosenos inteiros, ou seja pra cada valor inteiro de angulo de 0 a 90º tinhamos o correspondente valor do coseno. Depois, usando uma função implementada por nós, faziamos a análise do valor do ângulo que entrava como parâmetro e faziamos a rotação para o primeiro quadrante. Após o enquadramento desse ângulo na nossa tabela, retornavamos o valor do coseno sempre tendo em conta o quadrante em que se encontrava. Para cálculo do seno, aproveitamos o facto de podermos achar o seno a partir do coseno, como tal faziamos uma análise do ângulo de entrada, após isto, faziamos a conversão para coseno, e depois retornavamos o valor do ângulo. No entanto, necessitavamos também de usar a função atang, ora esta função que pode ser usada fazendo o include de math.h, no entanto, embora no PC o tempo de processamento necessário para executar esta função pudesse ser ignorado, no nosso AVR não poderia ser. Decidimos então implementar uma função atang2 de nossa autoria. A batalha foi dura, mas lá conseguimos. Esta função tinha dois parâmetros de entrada (x,y ou sen,cos), a partir deste valor de entrada calculavamos o quadrante ao qual o ângulo pertencia, bastando depois utilizar a propriedade da tangente que é o facto de tendo os valores tangente entre p/4 e -p/4 e os sinais dos senos e cosenos, podermos saber o atang2 de qualquer ângulo. Com a progressão e adensar do código decidimos, para prevenir e porque foi fácil de encontrar, juntar ao nosso código uma função muito simples para o cálculo de raizes inteiras. Este código foi encontrado num site sugerido pelo Prof. Paulo Costa, e embora a primeira tentativa tivesse sido infrutífera, a segunda foi em cheio, pois o site estava repleto de ideias para implementação de operações matemáticas problemáticas para micros pequenos. Para ainda aumentar um pouco a confusão, necessitamos também de uma função acos, função esta que implementamos fácilmente, pois já tinhamos os princípios de funcionamento da função coseno bem interiorizados. Todos estes “pormenores” permitem-nos com uma maior facilidade começar a passar o código para o AVR, sem que este se queixe de falta de tempo de processamento.

aniblue07_bendlr_back.gifaniblue07_bendlr_next.gif