7constexpr float kOne = 1.0F;
8constexpr float kTwo = 2.0F;
9constexpr float kFour = 4.0F;
20 const float gyroX = gyro.
x.
data;
21 const float gyroY = gyro.
y.
data;
22 const float gyroZ = gyro.
z.
data;
24 const float magX = mag.
x.
data;
25 const float magY = mag.
y.
data;
26 const float magZ = mag.
z.
data;
28 const float dt =
static_cast<float>(currentTime - lastUpdateTime) /
kMilliToSec;
31 bool useAccel =
false;
44 const auto magMag =
static_cast<float>(std::sqrt(magX*magX + magY*magY + magZ*magZ));
53 updateIMU(accel, gyro, currentTime);
56 const float qDot1 =
kRecipTwo * (-q1 * gyroX - q2 * gyroY - q3 * gyroZ);
57 const float qDot2 =
kRecipTwo * ( q0 * gyroX + q2 * gyroZ - q3 * gyroY);
58 const float qDot3 =
kRecipTwo * ( q0 * gyroY - q1 * gyroZ + q3 * gyroX);
59 const float qDot4 =
kRecipTwo * ( q0 * gyroZ + q1 * gyroY - q2 * gyroX);
66 const float recipNorm =
kOne /
static_cast<float>(std::sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3));
73 lastUpdateTime = currentTime;
79 updateFullAHRS(accel, gyro, mag, currentTime);
83 float accelX = accel.
x.
data;
84 float accelY = accel.
y.
data;
85 float accelZ = accel.
z.
data;
87 const float gyroX = gyro.
x.
data;
88 const float gyroY = gyro.
y.
data;
89 const float gyroZ = gyro.
z.
data;
91 float magX = mag.
x.
data;
92 float magY = mag.
y.
data;
93 float magZ = mag.
z.
data;
109 float _2q0magX, _2q0magY, _2q0magZ, _2q1magX, _2bx, _2bz, _4bx, _4bz, _2q0, _2q1, _2q2, _2q3, _2q0q2, _2q2q3, q0q0, q0q1, q0q2, q0q3, q1q1, q1q2, q1q3, q2q2, q2q3, q3q3;
112 const float dt =
static_cast<float>(currentTime - lastUpdateTime) /
kMilliToSec;
115 if((magX == 0.0F) && (magY == 0.0F) && (magZ == 0.0F)) {
116 updateIMU(accel, gyro, currentTime);
121 qDot1 =
kRecipTwo * (-q1 * gyroX - q2 * gyroY - q3 * gyroZ);
122 qDot2 =
kRecipTwo * (q0 * gyroX + q2 * gyroZ - q3 * gyroY);
123 qDot3 =
kRecipTwo * (q0 * gyroY - q1 * gyroZ + q3 * gyroX);
124 qDot4 =
kRecipTwo * (q0 * gyroZ + q1 * gyroY - q2 * gyroX);
127 if((accelX != 0.0F) || (accelY != 0.0F) || (accelZ != 0.0F)) {
130 recipNorm = 1 / std::sqrt(accelX * accelX + accelY * accelY + accelZ * accelZ);
136 recipNorm = 1 /std::sqrt(magX * magX + magY * magY + magZ * magZ);
142 _2q0magX =
kTwo * q0 * magX;
143 _2q0magY =
kTwo * q0 * magY;
144 _2q0magZ =
kTwo * q0 * magZ;
145 _2q1magX =
kTwo * q1 * magX;
150 _2q0q2 =
kTwo * q0 * q2;
151 _2q2q3 =
kTwo * q2 * q3;
164 hx = magX * q0q0 - _2q0magY * q3 + _2q0magZ * q2 + magX * q1q1 + _2q1 * magY * q2 + _2q1 * magZ * q3 - magX * q2q2 - magX * q3q3;
165 hy = _2q0magX * q3 + magY * q0q0 - _2q0magZ * q1 + _2q1magX * q2 - magY * q1q1 + magY * q2q2 + _2q2 * magZ * q3 - magY * q3q3;
166 _2bx =
static_cast<float>(std::sqrt(hx * hx + hy * hy));
167 _2bz = -_2q0magX * q2 + _2q0magY * q1 + magZ * q0q0 + _2q1magX * q3 - magZ * q1q1 + _2q2 * magY * q3 - magZ * q2q2 + magZ * q3q3;
172 s0 = -_2q2 * (
kTwo * q1q3 - _2q0q2 - accelX) + _2q1 * (
kTwo * q0q1 + _2q2q3 - accelY) - _2bz * q2 * (_2bx * (
kRecipTwo - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - magX) + (-_2bx * q3 + _2bz * q1) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - magY) + _2bx * q2 * (_2bx * (q0q2 + q1q3) + _2bz * (
kRecipTwo - q1q1 - q2q2) - magZ);
173 s1 = _2q3 * (
kTwo * q1q3 - _2q0q2 - accelX) + _2q0 * (
kTwo * q0q1 + _2q2q3 - accelY) -
kFour * q1 * (1 -
kTwo * q1q1 -
kTwo * q2q2 - accelZ) + _2bz * q3 * (_2bx * (
kRecipTwo - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - magX) + (_2bx * q2 + _2bz * q0) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - magY) + (_2bx * q3 - _4bz * q1) * (_2bx * (q0q2 + q1q3) + _2bz * (
kRecipTwo - q1q1 - q2q2) - magZ);
174 s2 = -_2q0 * (
kTwo * q1q3 - _2q0q2 - accelX) + _2q3 * (
kTwo * q0q1 + _2q2q3 - accelY) -
kFour * q2 * (1 -
kTwo * q1q1 -
kTwo * q2q2 - accelZ) + (-_4bx * q2 - _2bz * q0) * (_2bx * (
kRecipTwo - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - magX) + (_2bx * q1 + _2bz * q3) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - magY) + (_2bx * q0 - _4bz * q2) * (_2bx * (q0q2 + q1q3) + _2bz * (
kRecipTwo - q1q1 - q2q2) - magZ);
175 s3 = _2q1 * (
kTwo * q1q3 - _2q0q2 - accelX) + _2q2 * (
kTwo * q0q1 + _2q2q3 - accelY) + (-_4bx * q3 + _2bz * q1) * (_2bx * (
kRecipTwo - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - magX) + (-_2bx * q0 + _2bz * q2) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - magY) + _2bx * q1 * (_2bx * (q0q2 + q1q3) + _2bz * (
kRecipTwo - q1q1 - q2q2) - magZ);
176 recipNorm = 1 / std::sqrt(s0 * s0 + s1 * s1 + s2 * s2 + s3 * s3);
196 recipNorm = 1 / std::sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
203 lastUpdateTime = currentTime;
207 float accelX = accel.
x.
data;
208 float accelY = accel.
y.
data;
209 float accelZ = accel.
z.
data;
211 const float gyroX = gyro.
x.
data;
212 const float gyroY = gyro.
y.
data;
213 const float gyroZ = gyro.
z.
data;
227 float _2q0, _2q1, _2q2, _2q3, _4q0, _4q1, _4q2 ,_8q1, _8q2, q0q0, q1q1, q2q2, q3q3;
229 const float dt =
static_cast<float>(currentTime - lastUpdateTime) /
kMilliToSec;
232 qDot1 =
kRecipTwo * (-q1 * gyroX - q2 * gyroY - q3 * gyroZ);
233 qDot2 =
kRecipTwo * (q0 * gyroX + q2 * gyroZ - q3 * gyroY);
234 qDot3 =
kRecipTwo * (q0 * gyroY - q1 * gyroZ + q3 * gyroX);
235 qDot4 =
kRecipTwo * (q0 * gyroZ + q1 * gyroY - q2 * gyroX);
238 if((accelX != 0.0F) || (accelY != 0.0F) || (accelZ != 0.0F)) {
241 recipNorm = 1 / std::sqrt(accelX * accelX + accelY * accelY + accelZ * accelZ);
262 s0 = _4q0 * q2q2 + _2q2 * accelX + _4q0 * q1q1 - _2q1 * accelY;
263 s1 = _4q1 * q3q3 - _2q3 * accelX +
kFour * q0q0 * q1 - _2q0 * accelY - _4q1 + _8q1 * q1q1 + _8q1 * q2q2 + _4q1 * accelZ;
264 s2 =
kFour * q0q0 * q2 + _2q0 * accelX + _4q2 * q3q3 - _2q3 * accelY - _4q2 + _8q2 * q1q1 + _8q2 * q2q2 + _4q2 * accelZ;
265 s3 =
kFour * q1q1 * q3 - _2q1 * accelX +
kFour * q2q2 * q3 - _2q2 * accelY;
266 recipNorm = 1 / std::sqrt(s0 * s0 + s1 * s1 + s2 * s2 + s3 * s3);
286 recipNorm = 1 / std::sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
293 lastUpdateTime = currentTime;
296void OrientationEstimator::getEuler()
299 roll =
static_cast<float>(std::atan2(
300 kTwo * (q0 * q1 + q2 * q3),
305 float t =
kTwo * (q0 * q2 - q3 * q1);
312 pitch =
static_cast<float>(std::asin(t));
315 yaw =
static_cast<float>(std::atan2(
316 kTwo * (q0 * q3 + q1 * q2),
320 const float rad2deg = 57.29577951308232F;
constexpr float kLowMagThreshold
constexpr float kMilliToSec
constexpr float kHighMagThreshold
constexpr float kRecipTwo
void update(AccelerationTriplet accel, GyroTriplet gyro, MagTriplet mag, uint32_t currentTime)
Update the orientation estimator with new sensor data. This method should be called whenever new acce...