Key equations
The two equations
$$ {}_{B}\tilde{\boldsymbol{\omega}}_{WB}(t) = {}_{B}\boldsymbol{\omega}_{WB}(t) + \mathbf{b}^{g}(t) + \boldsymbol{\eta}^{g}(t) \tag{27} $$
$$ {}_{B}\tilde{\mathbf{a}}(t) = \mathbf{R}_{WB}^{\top}(t)\,\big({}_{W}\mathbf{a}(t) - {}_{W}\mathbf{g}\big) + \mathbf{b}^{a}(t) + \boldsymbol{\eta}^{a}(t) \tag{28} $$
The bug, explained
$$ \tilde{\mathbf{a}} = -\mathbf{R}_{WB}^{\top}\,\mathbf{g} + \mathbf{b}^{a} $$
Practice
$$ {}_{B}\tilde{\boldsymbol{\omega}}_{WB} = {}_{B}\boldsymbol{\omega}_{WB} + \mathbf{b}^{g} + \boldsymbol{\eta}^{g} $$
$$ {}_{B}\tilde{\mathbf{a}} = \mathbf{R}_{WB}^{\top}\big({}_{W}\mathbf{a} - {}_{W}\mathbf{g}\big) + \mathbf{b}^{a} + \boldsymbol{\eta}^{a} $$
Symbols
- \(\tilde{x}\)
- A tilde means measured: what the sensor reports, not the truth.
- \({}_{B}x,\ {}_{W}x\)
- The frame a vector is expressed in: \(B\) is the body (IMU) frame, \(W\) the world frame.
- \(\mathbf{R}_{WB}\)
- Rotates body-frame vectors into the world, so \(\mathbf{R}_{WB}^{\top}\) takes world vectors into the body frame.
- \({}_{W}\mathbf{a}\)
- The sensor's true acceleration, in the world.
- \({}_{W}\mathbf{g}\)
- The gravity vector in the world. It points down: with \(z\) up, \(\mathbf{g} \approx [0,\,0,\,-9.81]^{\top}\,\mathrm{m/s^2}\).
- \(\mathbf{b}\)
- Bias: a slowly drifting offset, added in the body frame.
- \(\boldsymbol{\eta}\)
- White noise.
Say it at a whiteboard
“An accelerometer measures specific force, \(\mathbf{a} - \mathbf{g}\), in the body frame. At rest you only ever see \(-\mathbf{R}^{\top}\mathbf{g} + \mathbf{b}^{a}\) as one sum, so a static initialisation can't separate gravity from the accelerometer bias. You constrain gravity's magnitude and use sufficiently varied motion and external motion measurements to separate bias from gravity and attitude.”