índiceitem superior

item anteriorpróximo item

 

7 – Operações em tempo-real

 

Um dos principais requisitos para o programa de simulação é que ele deve ser executado em tempo-real. Desta forma, o tempo de execução de uma malha de integração deve ser inferior ao passo de integração numérica adotado. Sabe-se que o tempo de execução é aproximadamente proporcional ao passo, o que significa que o simples aumento do passo de integração não acarreta necessariamente a execução em tempo-real. Por outro lado, o crescente aumento no poder de processamento dos computadores, aliado a adoção de métodos adequados de codificação permitem garantir que esta exigência será atendida com grande folga. 

 

            Os controladores de atitude embarcados executam ciclos de controle em intervalos aproximadamente constantes. A freqüência típica destes controladores é da ordem de 0.5 a 2 Hz, dependendo de características tanto do satélite quanto do próprio sistema de controle. A amostragem dos sensores é, em geral, efetuada na mesma freqüência, porém admite-se que alguns deles (rodas de reação e giroscópios) possam ser amostrados a taxas superiores, podendo chegar a 100 Hz. Esta condição estabelece um limite ao passo de integração numérica, que deverá ser por volta de 0,01s para assegurar a operação em tempo-real. Além disso, deve-se esperar que não haja sincronismo entre a simulação e o controle, isto é, que a simulação não dependa dos instantes de comando do controle, e este possa efetuar suas amostragens a qualquer instante. Para que isto seja conseguido deve-se, novamente, assegurar que o passo de integração seja de pelo menos uma ordem de grandeza acima do intervalo do ciclo de controle.

 

            Existem diversas formas pelas quais pode-se sincronizar o tempo de execução de um programa com o tempo de propagação utilizado no cálculo numérico. Supondo-se que o tempo de execução seja menor do que o passo de integração, como exigido, então pode-se, por exemplo, aguardar, após a execução, que os tempos de ambos se igualem. Durante este intervalo o processamento é detido, e nada é executado. Esta tática apresenta como desvantagem o fato de se desperdiçar tempo de processamento. Além disso, se o processamento for interrompido pelo próprio sistema operacional, haverá uma perda de sincronismo que comprometerá o resultado da simulação. Para reduzir o desperdício de tempo pode-se tentar reduzir o passo até que o tempo de espera seja pequeno ou desprezível. Este ajuste, contudo, deve ser feito sempre que o programa for executado num outro computador, já que o desempenho da máquina influi no passo. Outro método é efetuar este ajuste de forma automática, fazendo com que o próximo passo de integração seja igual ao intervalo de tempo decorrido no cálculo do último passo. Este processo, ainda que melhor que o anterior, não evita a perda de sincronismo em caso de interrupção, porém garante que o sincronismo seja recuperado rapidamente após a espera.

 

            A tática sugerida para a simulação da atitude consiste então em:

 

a)      efetuar um ciclo de integração e determinar o intervalo de processamento.

b)      ajustar o próximo passo de integração para se ajustar a este intervalo.

 

É bastante provável que esta tática produza amostras da atitude em intervalos de tempo diferentes entre si, principalmente se o processamento efetuado percorrer caminhos diferentes no programa a cada ciclo. Esta desvantagem é pequena e suportável caso o passo médio conseguido seja pequeno, da ordem de 10-2s.

 

Com a finalidade de se construir ferramentas para a simulação em tempo-real, implementou-se funções para ajuste de passo e para efetuar a espera de processamento. Elas foram agrupadas no pacote realtime.lib e cabeçalho realtime.h. Todas elas utilizam a função clock, que é integrante das bibliotecas da linguagem C. Esta função retorna com o tempo decorrido desde o início de execução do programa, em unidades de 1/CLOCKS_PER_SEC (normalmente milisegundos), em variáveis do tipo clock_t, (definida como long no cabeçalho time.h.

 

As funções são descritas a seguir. Construíram-se funções para deter o processamento e para ajuste do passo. A resolução típica das funções apresentadas é de 1 ms.

 

·         double rt_timer ();

·         double rt_clock_resolution ();

·         void rt_reset_timer ();

·         void rt_wait (double timsec);

·         int rt_wait_till (double timsec);

·         double rt_time_since (double timsec);

·         double rt_adjust_step_time (double t, double step);