Skip to the content
FixTheRobot Explore Robotics / UAV / Module 3 / M3-T12

UAV Systems Engineering · Module 3

M3-T12: Observability and consistency

A filter can only learn what the measurements can reveal: observability tells you what that is, and consistency tells you whether the filter knows its own limits.

  • Lesson 12 of 16
  • Sensor Fusion and State Estimation
  • Research-level
  • About 5 minutes to read

Position and yaw cannot be known from a camera and an IMU alone; a filter that does not respect that quietly gains false information and becomes overconfident. This lesson computes observability and links it to the consistency tests of the previous lessons.

Learning objectives

After this lesson, you should be able to:

  • Define observability and compute the observability matrix of a linear system.
  • Identify the unobservable directions of visual-inertial navigation (global position and yaw) and the effect of bias states.
  • Explain how spurious information in an unobservable direction makes a filter inconsistent.
  • Choose measurements or motion that make a state observable.

Conceptual explanation

A state is observable if it can be determined from the measurements (and controls) over some time. For a linear system xk+1=F xkx_{k+1}=F\,x_{k}, zk=H xkz_{k}=H\,x_{k}, the system is observable if the observability matrix has full column rank. Unobservable directions are those along which the state can change without altering any measurement.

Observability and consistencyMeasurements and motion determine which state directions are observable. Estimators that respect the unobservable directions stay consistent; those that gain spurious information in them become overconfident and are detected by NEES.Model + measurementsF, HObservability matrixrank testUnobservable directionsgauge freedomsEstimator designrespect themConsistency testNEES / NISknow what cannot be known, and report it
From observability analysis to consistency.
Animation of the gauge freedom of visual-inertial estimation. A planar trajectory and its landmarks are rotated together about the origin by an angle that grows to 90 degrees. The bearings and ranges measured in the body frame stay exactly the same, with a residual of zero, so no filter can know the absolute yaw. When only the trajectory is rotated and the landmarks are left where they were, the measurements no longer fit and the residual grows.
Visual-inertial measurements depend only on relative geometry: rotating (or translating) the trajectory and the map together leaves every body-frame measurement unchanged, so global yaw and position are unobservable. A consistent filter must keep their uncertainty (it cannot shrink); a filter that lets it shrink has gained false information. Computed residuals. (Looping, about 6 seconds; drawn and computed for this course with illustrative values.)

Engineering intuition

Shift the whole world a metre east and rotate it about the vertical: every image of the environment and every IMU measurement (relative to gravity) is unchanged. Position and yaw are therefore unobservable in VIO: four degrees of freedom, the “gauge”. The true uncertainty in those directions grows with time (drift). A filter whose linearisation points happen to depend on its current estimate can, through numerical accident, appear to learn about yaw from a measurement that contains none: its covariance in yaw shrinks when it should not. That is inconsistency, and the cure is to build the Jacobians so the unobservable directions stay in their null space.

Mathematical formulation

For the linear system, the observability matrix and its rank test:

Observability matrix
O=[HHFHF2⋮HF n−1]\mathbf O = \begin{bmatrix}\mathbf H\\ \mathbf H\mathbf F\\ \mathbf H\mathbf F^{2}\\ \vdots\\ \mathbf H\mathbf F^{\,n-1}\end{bmatrix}
observable  ⟺  rank⁡(O)=n,unobservable subspace=null⁡(O)\text{observable} \;\Longleftrightarrow\; \operatorname{rank}(\mathbf O) = n, \qquad \text{unobservable subspace} = \operatorname{null}(\mathbf O)

Example: position–velocity with an accelerometer bias (state [pp, vv, bb]); acceleration measured as a =u+b=u+b. With only a velocity or position measurement the bias is observable if the vehicle accelerates (the bias then changes the prediction), but with no measurement of position or velocity the whole state is unobservable. For the nonlinear VIO case, observability is analysed with Lie derivatives (Hesch et al., Kelly and Sukhatme): the result is four unobservable directions (3 translation, 1 yaw), plus scale becoming unobservable in a monocular system without sufficient excitation.

Consistency requires that the filter’s linearised model have the same unobservable subspace as the true nonlinear system. Observability-constrained EKF (OC-EKF) and first-estimate Jacobians enforce this: they choose the linearisation points so that null⁡(O)\operatorname{null} (O) contains the true gauge directions.

OO
observability matrix (linear case) or observability Gramian.
null⁡(O)\operatorname{null} (O)
directions that cannot be inferred from the data.

Architecture and data flow

The practical consequence for system design: provide a measurement that observes what you need. GNSS observes position and (via motion) heading, a magnetometer observes yaw, a map or loop closure observes the gauge directions in a drifting VIO. A navigation manager should know which states are observable in each mode and report a growing covariance in the others (lesson M2-T16).

Real-world UAV applications

  • Deciding whether VIO needs a heading source for long flights.
  • Checking that a filter keeps yaw uncertainty growing without GNSS.
  • Choosing manoeuvres that excite scale or bias for calibration.
  • Explaining overconfident covariance in a research estimator.

Implementation example

This runs as shown: observability ranks for a 1-D inertial navigation model with accelerometer bias and for a planar vehicle with yaw, and the observability Gramian eigenvalues for a constant-heading case.

import numpy as np

def obs_matrix(F, H, n):
    blocks, M = [], np.eye(n)
    for _ in range(n): blocks.append(H @ M); M = F @ M
    return np.vstack(blocks)
rank = lambda O: np.linalg.matrix_rank(O, tol=1e-9)

dt = 0.1
# 1-D inertial navigation: state [p, v, b_a]; the accelerometer measures a + b_a, which we treat as a known input u (so the bias drives velocity)
F = np.array([[1, dt, 0], [0, 1, -dt], [0, 0, 1.0]])
assert rank(obs_matrix(F, np.array([[1.0, 0, 0]]), 3)) == 3         # position measurements make velocity and bias observable
assert rank(obs_matrix(F, np.array([[0, 1.0, 0]]), 3)) == 2         # velocity alone: absolute position stays unobservable
assert rank(obs_matrix(F, np.array([[0, 0, 0.0]]), 3)) == 0         # no measurement: nothing is observable

# planar vehicle, state [x, y, yaw], heading-referenced position increments only observe relative motion
F3 = np.eye(3); H_rel = np.array([[0.0, 0, 0]])
assert rank(obs_matrix(F3, H_rel, 3)) == 0                          # odometry alone: no absolute pose is observable (gauge)
H_pos = np.array([[1.0, 0, 0], [0, 1.0, 0]])
assert rank(obs_matrix(F3, H_pos, 3)) == 2                          # absolute position observes x and y, yaw remains unobservable
H_all = np.vstack([H_pos, [0, 0, 1.0]])
assert rank(obs_matrix(F3, H_all, 3)) == 3                          # adding a heading source (magnetometer, GNSS course) observes yaw

# observability Gramian eigenvalues: the unobservable direction has (numerically) zero information
G = sum(np.linalg.matrix_power(F3.T, k) @ H_pos.T @ H_pos @ np.linalg.matrix_power(F3, k) for k in range(10))
lam = np.linalg.eigvalsh(G); print("Gramian eigenvalues (x, y observed):", np.round(lam, 3))
assert lam[0] < 1e-12 and lam[-1] > 5
Observability ranks and Gramian: what each measurement set can and cannot determine.

Common engineering mistakes

Assuming a state is observable because it appears in the model

Rank-test it; yaw and absolute position are typical gauge directions.

Linearising at the current estimate in a way that breaks the null space

The filter learns spurious information; use first-estimate Jacobians or an OC formulation.

Inflating process noise to hide the symptom

Treats the effect, not the cause.

Expecting calibration states to converge without excitation

Extrinsics and scale need motion.

Ignoring that observability depends on motion

Straight constant-velocity flight can make states unobservable.

Failure modes

Failure modes, symptoms and causes
Failure modeHow it shows upLikely cause
Spurious yaw certaintyYaw covariance shrinks without a heading measurementInconsistent linearisation
Scale driftMonocular scale wanders in straight flightNo acceleration excitation
Calibration not convergingExtrinsic estimate stays at its initial valueNo rotation excitation
Overconfident outputNEES high only in unobservable statesGauge directions not respected

Debugging approach

  1. Compute the rank and the null space of the observability matrix of your model.
  2. Run NEES on sub-blocks: position, yaw, biases separately (lesson M3-T15).
  3. Check that yaw variance grows monotonically without a heading source.
  4. Design excitation manoeuvres and check convergence of calibration states.

Practical exercises

  1. Compute the observability matrix of a 2-D constant-velocity model measuring position only.
  2. Show that adding a magnetometer makes yaw observable in the planar example.
  3. Explain why scale is unobservable for a monocular camera flying at constant velocity.
  4. Find the dimension of the unobservable subspace of VIO with unknown camera–IMU extrinsics (see the references).

Interview questions

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

Question 1

What are the unobservable directions of VIO?

Model answer

Global position (three) and yaw about gravity (one): shifting or rotating the world about the vertical changes no measurement; roll, pitch, scale and biases are observable with sufficient motion.

Question 2

Why do some filters become inconsistent in unobservable directions?

Model answer

Linearising at the current estimate can give the filter spurious information in those directions, shrinking its covariance when the truth is drift.

Question 3

How do you make yaw observable?

Model answer

Add a measurement that depends on it: magnetometer, GNSS course or position over a path, a map or loop closure.

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

M3-L5: Analyze covariance and drift

Watch covariance grow in prediction and shrink at updates.

Next lesson

M3-T13: Innovation monitoring

Compute the innovation and its covariance, and use them to gate, tune and monitor a filter.