3. Fusão Sensorial Interna, Quaternions, Ângulos de Euler e Fundamentos Trigonométricos
O grande diferencial do BNO055 é a fusão sensorial embarcada. Enquanto em sensores como MPU6050 ou LSM9DS1 você precisa implementar filtros como Madgwick ou Mahony no microcontrolador hospedeiro, o BNO055 executa internamente o algoritmo proprietário da Bosch (BSX). Isso significa que o microcontrolador externo recebe diretamente orientação estável e compensada.
Para compreender corretamente os dados fornecidos pelo BNO055, é essencial entender três conceitos matemáticos: vetor gravitacional, ângulos de Euler e quaternions.
3.1 Papel de Cada Sensor na Fusão
O acelerômetro mede:
\[
\vec{a} = \vec{a}_{linear} + \vec{g}
\]
Onde:
- (\vec{a}_{linear}) é aceleração real do movimento.
- (\vec{g}) é o vetor gravitacional.
O giroscópio mede velocidade angular:
\[
\vec{\omega} = \left[ \omega_x, \omega_y, \omega_z \right]
\]
Integrando no tempo:
\[
\theta(t) = \int \omega(t), dt
\]
Porém, essa integração gera deriva acumulativa.
O magnetômetro mede o campo magnético terrestre:
\[
\vec{B}
\]
Ele fornece referência absoluta de heading (yaw), eliminando deriva acumulada do giroscópio.
O algoritmo interno combina:
- Giroscópio → resposta rápida
- Acelerômetro → referência gravitacional
- Magnetômetro → referência absoluta de heading
O resultado é uma orientação estável no espaço tridimensional.
3.2 Ângulos de Euler
O BNO055 pode fornecer orientação em forma de:
- Heading (Yaw)
- Roll
- Pitch
Esses ângulos são armazenados nos registradores 0x1A a 0x1F.
Escala:
\[
1^\circ = 16 \text{ LSB}
\]
Conversão em C:
int16_t raw_heading = (msb << 8) | lsb;
float heading = raw_heading / 16.0f;
Interpretação Trigonométrica
Considere o eixo X apontando para frente, Y para direita e Z para cima.
Roll (φ):
Rotação em torno do eixo X.
Pitch (θ):
Rotação em torno do eixo Y.
Yaw (ψ):
Rotação em torno do eixo Z.
A reconstrução de um vetor rotacionado pode ser feita com matrizes de rotação:
\[
R = R_z(\psi) R_y(\theta) R_x(\phi)
\]
Onde:
\[
R_x(\phi) =
\begin{bmatrix}
1 & 0 & 0 \
0 & \cos\phi & -\sin\phi \
0 & \sin\phi & \cos\phi
\end{bmatrix}
\]
\[
R_y(\theta) =
\begin{bmatrix}
\cos\theta & 0 & \sin\theta \
0 & 1 & 0 \
-\sin\theta & 0 & \cos\theta
\end{bmatrix}
\]
\[
R_z(\psi) =
\begin{bmatrix}
\cos\psi & -\sin\psi & 0 \
\sin\psi & \cos\psi & 0 \
0 & 0 & 1
\end{bmatrix}
\]
Entretanto, essa representação sofre com gimbal lock.
3.3 Quaternions
O BNO055 fornece quaternions nos registradores 0x20 a 0x27.
Escala:
\[
1 = 2^{14} = 16384 \text{ LSB}
\]
Conversão:
float qw = raw_w / 16384.0f;
float qx = raw_x / 16384.0f;
float qy = raw_y / 16384.0f;
float qz = raw_z / 16384.0f;
Um quaternion é definido como:
\[
q = w + xi + yj + zk
\]
Ou:
\[
q = (w, x, y, z)
\]
Ele representa uma rotação no espaço tridimensional sem singularidades.
Conversão Quaternion → Euler
\[
\phi = \arctan2(2(wx + yz), 1 – 2(x^2 + y^2))
\]
\[
\theta = \arcsin(2(wy – zx))
\]
\[
\psi = \arctan2(2(wz + xy), 1 – 2(y^2 + z^2))
\]
Exemplo em C:
float roll = atan2f(2.0f*(qw*qx + qy*qz),
1.0f - 2.0f*(qx*qx + qy*qy));
float pitch = asinf(2.0f*(qw*qy - qz*qx));
float yaw = atan2f(2.0f*(qw*qz + qx*qy),
1.0f - 2.0f*(qy*qy + qz*qz));
Essa abordagem evita gimbal lock.
3.4 Vetores Fornecidos pelo BNO055
O sensor também fornece:
- Linear Acceleration (gravidade removida)
- Gravity Vector
- Gyroscope data
- Magnetometer data
Isso permite aplicações como:
- Estabilização de drones
- Navegação inercial
- Compensação de inclinação
- Controle de robôs bípedes
3.5 Processo de Calibração
O registrador CALIB_STAT (0x35) informa estado de calibração:
Bits:
- SYS
- GYR
- ACC
- MAG
Valor máximo: 3 (totalmente calibrado)
Leitura:
uint8_t calib = BNO055_Read(0x35);
uint8_t sys = (calib >> 6) & 0x03;
uint8_t gyro = (calib >> 4) & 0x03;
uint8_t acc = (calib >> 2) & 0x03;
uint8_t mag = calib & 0x03;
A calibração pode ser salva lendo registradores de offset e regravando após reboot, evitando recalibração física.
Na próxima seção vamos abordar a parte crítica que muitos ignoram:
por que o BNO055 frequentemente “quebra” o barramento I2C, quais microcontroladores sofrem com isso, quais funcionam corretamente, e a explicação elétrica e temporal do problema.