Para ter uma IMU funcional não basta ler todos os sensores, é preciso remover o ruido das leituras, e fazer a fusão dos valores para ter uma estimativa mais precisa da orientação do sensores.


O projeto FreeIMU (http://www.varesano.net/projects/hardware/FreeIMU) estava em pleno desenvolvimento até o final de 2012, quando o seu autor morreu. Os amigos do desenvolver prometeram continuar o projeto, mas isto não aconteceu ainda. Então resolvi criar um fork para dar continuidade ao projeto. Minha ideal inicial é colocar a biblioteca para funcionar no Ubuntu 14.04 com as versão atuais de todas as bibliotecas atualizadas.
O código corrigido pode ser encontrado no meu github (https://github.com/murix/open-inertial-measurement-unit).

Pretendo também portar para rodar na:
Stellaris LaunchPad com Energia
Tiva C Series 123 LaunchPad com Energia
STM32F103 com MBED
FRDM-KL25Z com MBED

Na Beaglebone Black criei uma camada de compatibilidade com a API do Arduino, isso já permite compilar o projeto como biblioteca estática.

# pacotes necessários no Ubuntu 14.04
apt-get -y install python-qt4 python-qt4-gl python-opengl arduino

# baixar o código do FreeIMU com as correções necessárias para rodar no Ubuntu 14.04
https://github.com/murix/open-inertial-measurement-unit

Para compilar o código para arduino nano v3, usei o próprio arduino que vem no Ubuntu 14.04 que é a versão 1.0.1, deve ser gravada na placa o sketch do FreeIMU-serial.

O próximo passa é calibrar os sensores usando uma ferramenta feita em Python com Qt4 e OpenGL.
A ferramenta vai usar a conexão serial com o Arduino para capturar diversos samples dos sensores, e calcular com um método de calibração de "elipsoides na esfera" os valores que precisam ser gravados na EEPROM do arduino ou num arquivo ,h para pode ser embarcado no código. Um vez gravados os valores da calibração, é preciso resetar o Arduino.



O teste do FreeIMU calibrado é feito usado a ferramenta Processing (https://www.processing.org/) que também funciona com sketchs de Arduino e cria interfaces 3D para simulação. No video a seguir demonstro a biblioteca FreeIMU já calibrada rodar na placa de uma UAV que é composto por um Arduino Nano v3 junto com um Breakout board GY-86 (quase é 100% compatível com a versão de hardware 0.4.3 do FreeIMU).




FreeIMU : Capturando os valores descalibrados
Deve sem ser feitos giros completos de 360 nos eixos X,Y,Z para que o
algoritmo de otimização de aproximação de elipsoide em esfera calcule a calibração ótima.

O algoritmo utilizado no cálculo da calibração ótima está no artigo:
Approximation of n-Dimensional Data Using Spherical and Ellipsoidal Primitives
http://staff.polito.it/giuseppe.calafiore/Documenti/Papers/Ellipsoidal%20Approximation_TSMC-02.pdf



FreeIMU : Gerando os valores para calibrar o deslocamento e escala do sensores
FreeIMU : Testando a placa calibrada com o cubo 3D