Skip to the content
FixTheRobot Explore Robotics / UAV / Module 2 / M2-T8

UAV Systems Engineering · Module 2

M2-T8: Dead reckoning and inertial drift

Position error from inertial navigation grows as t², t^1.5 or t³ depending on the error source; knowing which one dominates tells you how often you must correct.

  • Lesson 8 of 16
  • UAV Navigation and GNSS-Denied Operations
  • Established engineering
  • About 5 minutes to read

Every GNSS-denied design starts with one question: how long can the vehicle fly on inertial data alone before the error becomes unacceptable? This lesson turns that question into formulas you can check against a log.

Learning objectives

After this lesson, you should be able to:

  • Derive position error growth from a constant accelerometer bias, a gyro bias and white accelerometer noise.
  • Estimate the time until inertial position error exceeds a given bound for a given IMU quality.
  • Explain why attitude (gyro) errors eventually dominate.
  • Fit a bias to a stationary log and predict drift.

Conceptual explanation

Dead reckoning is estimating position by integrating motion from a known starting point. For an IMU, errors in the measurement are integrated along with the signal. Three sources matter: accelerometer bias (a constant offset), accelerometer noise (random jitter) and gyroscope bias (a constant attitude-rate offset that corrupts the gravity projection).

Inertial drift growthPosition error against time for a 5 milli-g accelerometer bias (growing as t squared), for accelerometer noise (t to the 1.5), and for a 0.1 deg/s gyro bias (growing as t cubed). The cubic term overtakes the others after a short time.020406002505007501000time (s)position error (m) accelerometer bias 5 mg: ½ b t²accelerometer noise: ∝ t^1.5 (illustrative)gyro bias 0.1°/s: ⅙ g b_g t³Vertical axis clipped at 1000 m
Error growth by source for illustrative values: the cubic gyro term starts small but overtakes the others within about a minute.
Animation of dead reckoning around a 40 metre square at 4 metres per second. The true path is a square; three dead-reckoned paths with gyro bias of 0.1, 0.3 and 1 degree per second drift further and further from it because the heading error grows linearly with time and the position error with the distance travelled times that heading error. Labels show the final position error of each.
Dead reckoning with a speed sensor and a gyro with constant bias bb: heading error ψe=b t\psi _{e}=b\,t, so the cross-track error grows like v b t2/2v\,b\,t^{2}/2 on a straight leg. Illustrative speeds and biases; real systems calibrate the bias, but a residual always remains. (Looping, about 6 seconds; drawn and computed for this course with illustrative values.)

Engineering intuition

The exponent counts integrations. A bias in acceleration is integrated twice: error ∝ t2t^{2}. White noise in acceleration integrates to a random walk in velocity (error ∝ t1/2t^{1/2}) and then to position (∝t3/2)(\propto t^{3/2}). A gyro bias is integrated once into tilt, which leaks gravity into horizontal acceleration, then twice more: three integrations, t3t^{3}. A cheap IMU can therefore look fine for 5 seconds and be metres off at 30.

Mathematical formulation

Accelerometer bias

Position error from accelerometer bias
δp(t)=12 ba t2\delta p(t) = \tfrac{1}{2}\,b_a\,t^{2}

Accelerometer white noise

For a noise density NN (m/s²/√Hz), velocity error has standard deviation NtN\sqrt{t} and position error standard deviation:

Position standard deviation from white acceleration noise
σp(t)=N t3/23\sigma_p(t) = \frac{N\,t^{3/2}}{\sqrt{3}}

Gyro bias

A constant gyro bias bgb_{g} gives a tilt error δθ(t)=bg t\delta \theta (t)=b_{g}\,t, a spurious horizontal acceleration g δθg\,\delta \theta , and:

Position error from gyro bias (small angles)
δp(t)=16 g bg t3\delta p(t) = \tfrac{1}{6}\,g\,b_g\,t^{3}
bab_{a}
accelerometer bias (m/s2)(m/s^{2}). 1 mg = 0.00981 m/s20.00981\,\mathrm{m}/\mathrm{s}^{2}.
bgb_{g}
gyro bias (rad/s). 1°/s = 0.01745 rad/s.
NN
accelerometer noise density (m/s²/√Hz): the “velocity random walk” in m/s/√Hz.
gg
9.81 m/s29.81\,\mathrm{m}/\mathrm{s}^{2}.

The cubic term dominates for tt above the crossover where ⅙ g bg t3g\,b_{g}\,t^{3} = ½ ba t2b_{a}\,t^{2}, that is t=3 ba/(g bg)t=3\,b_{a}/(g\,b_{g}). With ba=5b_{a}=5 mg and bg=0.1 °/sb_{g}=0.1\,\mathrm{°}/\mathrm{s} this is about 86 s. Important: these formulas apply to residual bias after calibration and filtering; consumer MEMS devices can be a lot worse before calibration.

Architecture and data flow

Bias is not constant: it drifts (bias random walk) and depends on temperature. A good estimator therefore estimates the biases online while aiding is available (lesson M3-T7), then dead-reckons with the last estimate during an outage. The residual bias error at the moment aiding is lost sets the drift rate for the whole outage. That is why a short, noisy aiding window just before GNSS loss can be worse than a long clean one earlier.

Real-world UAV applications

  • Specifying IMU grade from the maximum allowed outage: how long must the vehicle survive without aiding?
  • Choosing when to trigger a failsafe: error bound versus time since last aiding.
  • Judging whether a log’s drift is explained by bias or by something else (misalignment, timing).
  • Deciding the update rate and covariance inflation in a GNSS-denied estimator.

Implementation example

This runs as shown: it simulates a stationary 1-D accelerometer with bias and noise, fits the bias from the first 10 seconds, and predicts the drift at 60 seconds from the formulas.

import numpy as np
rng = np.random.default_rng(2)
dt, T = 0.01, 60.0
b_a = 0.049                    # 5 mg bias (m/s^2)
N = 0.002                      # noise density, m/s^2/sqrt(Hz)
n = int(T / dt)
acc = b_a + N / np.sqrt(dt) * rng.standard_normal(n)      # stationary: true acceleration is 0

v = np.cumsum(acc) * dt
p = np.cumsum(v) * dt
print(f"position error at 60 s: {p[-1]:.1f} m")

# 1) fit the bias from the first 10 s of stationary data and predict the drift
b_hat = acc[: int(10 / dt)].mean()
pred = 0.5 * b_hat * T**2
print(f"bias estimate {b_hat/9.81*1000:.2f} mg, predicted {pred:.1f} m")
assert abs(pred - p[-1]) / p[-1] < 0.05                    # the bias model explains the drift

# 2) after removing the estimated bias, only noise remains: much smaller growth
acc2 = acc - b_hat
p2 = np.cumsum(np.cumsum(acc2) * dt) * dt
sigma_pred = N * T**1.5 / np.sqrt(3)
print(f"after bias removal: error {abs(p2[-1]):.3f} m, noise-only 1-sigma prediction {sigma_pred:.3f} m")
assert abs(p2[-1]) < 5 * sigma_pred + 0.5 and abs(p2[-1]) < 0.1 * p[-1]
Stationary drift study: bias dominates, and removing it leaves only the noise-driven growth.

Common engineering mistakes

Quoting drift from the noise figure alone

Noise density gives the t3/2t^{3/2} term; bias gives t2t^{2} and usually dominates over minutes. Use both.

Assuming bias is constant over a flight

It drifts with temperature and time (bias instability). Estimate it online and re-estimate often.

Ignoring gravity leakage from attitude error

Even a perfect accelerometer drifts if the attitude is wrong by a fraction of a degree.

Comparing datasheet numbers without units

mg versus m/s2m/s^{2}, ∘/s^{\circ}/s versus rad/s, and per √Hz versus per hour are the usual traps.

Failure modes

Failure modes, symptoms and causes
Failure modeHow it shows upLikely cause
Quadratic drift on a vertical-only axisAltitude slowly climbs or sinks during dead reckoningAccelerometer z-bias not removed
Cubic growth after a quiet startFine for 20 s and then rapidly worseGyro bias residual leaking gravity into horizontal channels
Covariance too small during an outageEstimator overconfident while driftingProcess noise does not include bias random walk
Temperature-induced bias stepSudden drift after power-up warm-upNo thermal calibration, or heating from the companion computer

Debugging approach

  1. Place the vehicle still, log for a minute and compute the mean and Allan deviation of each axis.
  2. Fit ½ b t2b\,t^{2} to the integrated position of the stationary data to recover bab_{a}.
  3. Check the temperature trace against bias in a warm-up test.
  4. Verify that the estimator’s covariance during a simulated outage grows at least as fast as the true error.

Practical exercises

  1. How long until position error exceeds 10 m for a 2 mg bias? And 1 m?
  2. Find the crossover time at which gyro-bias drift overtakes accelerometer-bias drift for ba=2b_{a}=2 mg and bg=0.05 °/sb_{g}=0.05\,\mathrm{°}/\mathrm{s}.
  3. If you must survive a 30 s GNSS outage within 5 m, what accelerometer bias residual is acceptable?
  4. Use the Sensor Fusion Simulator to reproduce the t2t^{2} growth with fusion disabled.

Interview questions

Write an answer in your own words, then reveal the model answer. Nothing is sent anywhere.

Question 1

What growth law does a constant accelerometer bias produce in position?

Model answer

Quadratic: δp\delta p = ½ b t2b\,t^{2}, because the bias is integrated twice.

Question 2

Why does a small gyro bias eventually dominate?

Model answer

It causes tilt that grows linearly, which leaks gravity into horizontal acceleration and is integrated twice more, giving δp\delta p ≈ ⅙ g bg t3g\,b_{g}\,t^{3}, a cubic term.

Question 3

How do you reduce inertial drift during a GNSS outage?

Model answer

Estimate and remove biases while aiding is available, use a better IMU, add other aiding sensors (vision, LiDAR, airspeed), and reduce the outage duration by detecting and responding sooner.

References and further reading

Primary papers, official documentation and standards. Each claim above that is specific to a tool or version points here.

What’s next

Mark this lesson

Saved in this browser and synced to your account when you are signed in.

Practice this lesson

M2-L5: Compare IMU-only, VIO and LiDAR odometry

Run the three estimators on one trajectory and compare error growth.

Practice this lesson

M2-L6: Analyze position drift

Fit drift growth rates to estimator error.

Next lesson

M2-T9: Vision-aided navigation

Explain how cameras bound inertial drift and where vision fails.