Obter a atitude de drones, veículos subaquáticos e outros dispositivos com 6 graus de liberdade é uma das tarefas mais desafiadoras no projeto de sistemas de controle de navegação. Por este motivo, muitos projetos utilizam programas proprietários ou limitam-se á simulações. Neste trabalho é apresentado um sistema completo para determinação de atitude capaz de fornecer medidas calibradas e atitude estimada utilizando sensores MEMS, com microcontrolador de baixo custo e baixo consumo energético. Acelerômetro e magnetômetro são calibrados online no sistema embarcado como emprego do método dos mínimos quadrados sem auxílio de equipamentos externos. O estado estimado é computado com um rápido algorítimo algébrico de quatérnios consumindo menos de 1,5ms com emprego de um filtro aditivo de Kalman linear.
Este trabalho faz parte de um projeto que visa o desenvolvimento de protótipo de veículos não tripulados. Para saber mais acesse: Navigation, Position and Time in Unmanned Aerial Vehicles in environments with no GPS/GNSS signal
Este projeto é resultado do Trabalho de Graduação de Engenharia Aeroespacial
Artigo publico no Congresso Brasileiro de Automática no ano 2020.
Este projeto utiliza a biblioteca Eigen (por este motivo o #include "../eigen/Eigen/Dense"
) para computa das operações de álgebra linear. Para completar a transmissão da telemetria o projeto utiliza o API ESP-NOW da Espressif, portando, para receber os dados outro ESP-32 deve esta conectado a um pc e com o código de coleta de dados da telemetria carregado.
Para instar esses bibliotecas basta executar o comando:
git clone https://github.com/roneydua/plataformastrapdown.git
O foco destas bibliotecas é de construção para uma plataforma strapdown de seis graus de liberdade tal que forneça:
(IMU::calibraGyro())
; que atualiza a variável _biasGyro
que é um vetor 3x1.O magnetometro é calibrado pelo método geométrico com a função int calibracaoGeometrica(MatrixXf &data, Matrix3f &sF, Vector3f &bias, float moduloCampo)
.
Para utilizar este método é necessário coletar medidas rotacionando a plataforma. Durante a rotação estas medidas coletadas são armazenadas em uma matriz Nx3 &dados
. Quando mais dados coletados, mais acurada costuma ser a calibração (500 medidas costumam apresentar bons resultados). &sF
é um matriz 3x3 diagonal com os fatores de escala e &bias
é um vetor 3x1 de bias. Quando o método falha, retorna um número negativo.
O acelerômetro é calibrado com a função int calibracaoAcelerometro(MatrixXf &X, MatrixXf data)
A base desenvolvida possui o sensor preso como pode ser visto na figura abaixo:
Depois de montada e fechada, o algoritmo de calibração do acelerômetro precisa da tomada de dados nas seis orientações para resolver o problema de mínimos quadrados. A base fechada como mostra a figura possibilita que essa tomada seja feita de forma simples.
O projeto fornece um vetor de dimensão 4+3+3+3+3+1 = 17 floats. Na seguinte sequência:
Componentes do quatérnio de atitude | Ângulos de Euler | Acelerômetro | Magnetômetro | Giroscópio | Intervalo de tempo |
---|---|---|---|---|---|
normalizado | graus | m/s | normalizado | rad/s | segundos |
O ESP-32 possui dois núcleo como capacidade de realizar operações multitarefa. Um dos núcleos executa a função void estimadorCodigo(void *)
e o outro a função void comunicacaoCodigo(void *)
, o primeiro executa o loop de estimação e o segundo comanda a telemetria.
Os sensores são calibrados considerando:
A estimação da atitude é feita com um filtro de Kalman linear e Quatérnios são utilizados para representar a atitude.