IMU noise model

Raw IMU measurements are corrupted in a structured way. The full error model (following Woodman’s primer) includes bias, scale-factor error, cross-axis misalignment, and white noise per sensor:

a~=a+ba+Saa+Maa+ηa,ω~=ω+bg+Sgω+Mgω+ηg\tilde{\mathbf{a}} = \mathbf{a} + \mathbf{b}^a + \mathbf{S}^a\mathbf{a} + \mathbf{M}^a\mathbf{a} + \boldsymbol{\eta}^a, \qquad \tilde{\boldsymbol{\omega}} = \boldsymbol{\omega} + \mathbf{b}^g + \mathbf{S}^g\boldsymbol{\omega} + \mathbf{M}^g\boldsymbol{\omega} + \boldsymbol{\eta}^g

where S\mathbf{S} is (diagonal) scale-factor error and M\mathbf{M} is cross-axis sensitivity. VIO estimators assume S\mathbf{S} and M\mathbf{M} are handled by factory or offline calibration and keep only the two online terms — additive white noise and a slowly-varying bias:

ω~=ω+bg+ηga~=a+ba+ηa\tilde{\boldsymbol{\omega}} = \boldsymbol{\omega} + \mathbf{b}^g + \boldsymbol{\eta}^g \qquad \tilde{\mathbf{a}} = \mathbf{a} + \mathbf{b}^a + \boldsymbol{\eta}^a

with η\boldsymbol{\eta} zero-mean white Gaussian noise and each bias modeled as a random walk: b˙=ηb\dot{\mathbf{b}} = \boldsymbol{\eta}^b with its own white driving noise.

Why these two terms matter so much

The four parameters and their units

A VIO configuration needs four numbers (often per-axis, usually shared):

ParameterSymbolTypical continuous-time unit
Gyro noise density (angle random walk)σηg\sigma_{\eta^g}rad/s/Hz\mathrm{rad/s/\sqrt{Hz}}
Accel noise density (velocity random walk)σηa\sigma_{\eta^a}m/s2/Hz\mathrm{m/s^2/\sqrt{Hz}}
Gyro bias random walkσbg\sigma_{b^g}rad/s2/Hz\mathrm{rad/s^2/\sqrt{Hz}}
Accel bias random walkσba\sigma_{b^a}m/s3/Hz\mathrm{m/s^3/\sqrt{Hz}}

These are continuous-time densities. To use them at a discrete sampling interval Δt\Delta t, the standard conversions are ση,d=ση/Δt\sigma_{\eta,d} = \sigma_\eta / \sqrt{\Delta t} for the measurement noise and σb,d=σbΔt\sigma_{b,d} = \sigma_b \sqrt{\Delta t} for the bias increment — a chronic source of implementation bugs (see pitfalls). These four numbers feed directly into the covariance propagation of an EKF or the covariance of a preintegrated IMU factor, i.e., they set how much the estimator trusts the IMU relative to the camera.

Allan variance: identifying the parameters

Allan variance is the standard tool for identifying these noise parameters from a long stationary log (hours, temperature-stable). Plotting the Allan deviation σ(τ)\sigma(\tau) against averaging time τ\tau on a log-log scale separates the noise sources by slope:

SlopeNoise sourceParameter
1/2-1/2White noise (angle/velocity random walk)ση\sigma_{\eta} (noise density, read at τ=1s\tau = 1\,\mathrm{s})
00 (flat minimum)Bias instability
+1/2+1/2Bias random walkσb\sigma_{b} (random-walk density)

The four numbers read off this plot are exactly the parameters demanded by the configuration files of VINS-Mono, OpenVINS, Kimera-VIO, and every other VIO system, e.g. in a Kalibr-style imu.yaml:

# continuous-time noise densities (example structure — measure your own values)
gyroscope_noise_density:     ...   # [rad/s/sqrt(Hz)]
gyroscope_random_walk:       ...   # [rad/s^2/sqrt(Hz)]
accelerometer_noise_density: ...   # [m/s^2/sqrt(Hz)]
accelerometer_random_walk:   ...   # [m/s^3/sqrt(Hz)]
update_rate: 200.0                 # [Hz]

Tools such as kalibr_allan and allan_variance_ros automate the log-and-fit procedure. In practice, values are often inflated somewhat above the Allan-derived ones (commonly several-fold) to absorb unmodeled effects: vibration, temperature ramps, scale-factor residuals.

Common pitfalls

Why it matters for SLAM

The noise model is the contract between your hardware and your estimator: it sets the weight of IMU factors relative to visual factors. Parameters that are too optimistic make the filter overconfident in the IMU (divergence under vibration); too pessimistic and you throw away the IMU’s motion information. Being able to run and read an Allan variance plot is a basic practical skill for anyone deploying VIO on real hardware.