FixTheRobot Explore Robotics / Systems Engineering / Engineering Guides / Module 10

Engineering Guides · Module 10

Obtaining IMU noise parameters

Record the IMU still for hours, compute the Allan deviation, and read the noise density at one second. Check the units your estimator expects.

  • Intermediate
  • Module 10: Visual-Inertial SLAM & LiDAR-Inertial Integration
  • Written for ROS 2 Jazzy where ROS 2 is used
  • Sources checked 2026-11-06

Assumptions: Numbers in the examples are illustrative and the code is executed by the site’s tests. Facts taken from a cited source are marked; other statements are general engineering knowledge and must be confirmed on the datasheet of the part you use.

1. Engineering problem

Visual-inertial and LiDAR-inertial estimators weight the IMU against other sensors using its noise parameters. Too small and the estimator over-trusts the IMU; too large and it ignores it. Datasheet values are a start, and a measured Allan deviation shows the real noise with your power supply and mounting.

2. When is this needed?

  • Setting up a VIO or LIO estimator.
  • When the estimator is over- or under-confident.
  • After changing the IMU rate or filter.

3. Selection and design decisions

The Allan deviation is computed from a long static recording by averaging over clusters of length τ and comparing neighbouring averages. For white rate noise it falls with slope −1/2 on a log-log plot; its value at τ = 1 s gives the noise density (units rad/s/√Hz for a gyro, m/s²/√Hz for an accelerometer, under the convention where density = per-sample standard deviation ÷ √sample rate). The rising part at long τ gives the bias random walk. Estimators differ in conventions (continuous or discrete time, Hz or sample rate), so read the documentation of yours; the Kalibr README (read 2026-11-06) lists calibration of IMU intrinsic parameters, and its documentation describes the noise model it expects.

Overview
ParameterRead fromTypical estimator input
Gyro noise densityAllan deviation at τ = 1 s (slope −1/2 region)rad/s/√Hz
Gyro bias random walkSlope +1/2 region at long τrad/s²/√Hz
Accel noise densityAllan deviation at τ = 1 sm/s²/√Hz
Accel bias random walkSlope +1/2 regionm/s³/√Hz
Bias instabilityMinimum of the curveInformational

4. Advantages and disadvantages

  • Longer recordings reveal the random-walk region (hours) and cost time.
  • Inflating the noise slightly (a common practice) makes the estimator more tolerant of unmodelled errors and loses some accuracy.
  • Temperature changes during the recording bias the result.

5. Requirements and constraints

  • The robot is perfectly still and the temperature stable during the recording.
  • The sample rate and any internal filter are the ones used in operation.
  • Units and conventions match the estimator’s documentation.

6. Architecture

static recording (hours) ─▶ Allan deviation vs τ ─▶ read density at τ = 1 s and random-walk slope ─▶ estimator config

7. Implementation

  1. Record the IMU still for at least several hours at the operating rate.
  2. Compute the Allan deviation for τ from the sample period up to a fraction of the recording.
  3. Read the noise density at τ = 1 s on the −1/2 slope and the random walk on the +1/2 slope.
  4. Convert to the estimator’s convention and units.
  5. Optionally inflate by a small factor and validate on a real run.
import numpy as np
rng = np.random.default_rng(1)
fs = 100.0
sigma = 0.002                                    # white gyro noise, rad/s per sample (illustrative)
w = rng.normal(0, sigma, 200000)
def adev(x, m):                                  # overlapping Allan deviation at tau = m / fs
    c = np.cumsum(np.insert(x, 0, 0.0))
    avg = (c[m:] - c[:-m]) / m
    d = avg[m:] - avg[:-m]
    return np.sqrt(0.5 * np.mean(d ** 2))
taus = [1, 10, 100, 1000]
vals = [adev(w, m) for m in taus]
for m, v in zip(taus, vals):
    print(f"tau {m / fs:7.2f} s: Allan deviation {v:.6f} rad/s")
slope = np.polyfit(np.log(taus), np.log(vals), 1)[0]
n_density = adev(w, int(fs)) 
print(f"log-log slope {slope:.2f} (white noise: -0.5)")
print(f"noise density from tau = 1 s: {n_density:.6f} rad/s/sqrt(Hz); direct from sigma: {sigma / np.sqrt(fs):.6f}")

Printed (checked by the site’s tests):

tau    0.01 s: Allan deviation 0.001999 rad/s
tau    0.10 s: Allan deviation 0.000629 rad/s
tau    1.00 s: Allan deviation 0.000195 rad/s
tau   10.00 s: Allan deviation 0.000064 rad/s
log-log slope -0.50 (white noise: -0.5)
noise density from tau = 1 s: 0.000195 rad/s/sqrt(Hz); direct from sigma: 0.000200

Reading it: synthetic white noise of 0.002 rad/s per sample at 100 Hz gives an Allan deviation that falls by √10 for each decade of τ (log-log slope −0.50), with 0.000195 rad/s at τ = 1 s against the true 0.000200 rad/s/√Hz. The recording is synthetic and short; a real IMU adds a rising random-walk branch at long τ.

8. Real examples

  • VIO setup: noise densities from a 3 h Allan run entered in the estimator’s configuration, inflated by a small factor.

9. Failure scenarios

  • Using datasheet values at a different bandwidth than the recorded rate.
  • A recording with the robot on a vibrating floor.
  • Confusing per-sample standard deviation with density.

10. Troubleshooting

  1. If the slope is not −1/2 at short τ, there may be filtering or quantisation.
  2. If the curve never rises, the recording is too short for the random walk.
  3. If the estimator is over-confident, increase the noise slightly.

11. Validation

  • The example prints the lines shown (executed by the site tests).
  • The estimator’s innovation statistics are consistent with its noise assumptions on a real run.

12. Engineering checklist

13. Further references

  • Kalibr README: ethz-asl/kalibr, read 2026-11-06 (it states that Kalibr performs visual-inertial calibration: spatial and temporal calibration of an IMU with respect to a camera system, along with IMU intrinsic parameters).
  • Allan variance and its application to IMUs follow IEEE Std 952 and standard texts; they were not read for this page.

Related on FixTheRobot