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

UAV Systems Engineering · Module 2

M2-T13: LiDAR-aided navigation

A LiDAR constrains pose only along directions in which the surfaces it sees change: in a long corridor it cannot tell you how far along you are.

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

LiDAR gives direct metric geometry independent of lighting, which is why it anchors many GNSS-denied UAV systems. Its weakness is geometric: some scenes do not constrain some directions. This lesson shows how to see that in the maths, and detect it at run time.

Learning objectives

After this lesson, you should be able to:

  • Explain how a range scan constrains the vehicle pose through surface geometry.
  • Write the point-to-plane residual and the information (Hessian) matrix it produces.
  • Detect degenerate directions from the eigenvalues of the information matrix.
  • List LiDAR failure modes: degeneracy, dust, rain, glass, vibration and motion distortion.

Conceptual explanation

A scanning LiDAR measures ranges along known beam directions, giving a point cloud in the sensor frame. Navigation uses it by registering the current scan to a reference (the previous scan or a map): the pose that best aligns the points to the surfaces. Each point on a planar surface constrains the pose only along that surface’s normal; the set of normals in the scene determines which directions are constrained.

LiDAR aidingA scan is deskewed with IMU motion, registered against a local map giving pose corrections and an information matrix, whose eigenvalues reveal degenerate directions. The result aids the estimator with covariance.Scanpoints + timesDeskewIMU motionRegisterscan to mapInformationeigenvaluesEstimatoraided pose + Σdegenerate directions must carry large covariance
LiDAR aiding and its degeneracy check.
Animation of a two-dimensional LiDAR scan as a vehicle flies down a long corridor and into a room. In the corridor all the surface normals point sideways, so the scan constrains sideways motion but not motion along the corridor, and the uncertainty ellipse of the scan-matching translation stretches into a long needle. In the room the walls have all directions and the ellipse shrinks to a small round shape. The ratio of eigenvalues is printed.
Scan matching constrains position along each wall normal. The information matrix Σ n\Sigma \,nᵢnnᵢ⊤^{\top} over the scan has rank one in a straight corridor (nothing observes motion along it) and full rank in a room. Computed by ray casting 181 rays with a 20 m range. (Looping, about 6 seconds; drawn and computed for this course with illustrative values.)

Engineering intuition

Stand in a long straight featureless corridor with a LiDAR: the two walls and the floor and ceiling tell you exactly where you are across and above, but nothing tells you where you are along the corridor. Every candidate position along the axis sees the same scan. The same happens in an open field (flat ground constrains only height, roll and pitch) and next to a single wall. A registration algorithm in such a scene returns a confident-looking answer along the unconstrained direction that is simply the initial guess (or noise): it must be flagged, and a different sensor must constrain that direction.

Mathematical formulation

For a point pip_{i} (sensor frame), a pose (RR, tt) and the plane through the map with unit normal nin_{i} and offset did_{i}, the point-to-plane residual and its Jacobian for a small pose update (δθ, δt)(\delta \theta ,\,\delta t) are:

Point-to-plane residual and Jacobian
ri=ni⊤(Rpi+t)−dir_i = \mathbf n_i^{\top}(\mathbf R\mathbf p_i + \mathbf t) - d_i
Jacobian
Ji=[((Rpi+t)×ni)⊤ni⊤]\mathbf J_i = \begin{bmatrix}\left((\mathbf R\mathbf p_i + \mathbf t)\times\mathbf n_i\right)^{\top} & \mathbf n_i^{\top}\end{bmatrix}
A 1×6 row: rotation, then translation.

The information matrix and its eigen-decomposition give the constraint strength per direction:

Information matrix and degeneracy test
H=1σ2∑iJi⊤Ji\mathbf H = \frac{1}{\sigma^{2}}\sum_i \mathbf J_i^{\top}\mathbf J_i
Degeneracy test
λ1≥⋯≥λ6;degenerate direction if λk<λmin⁡\lambda_1 \ge \dots \ge \lambda_6; \qquad \text{degenerate direction if } \lambda_k < \lambda_{\min}

The covariance of the registration is H−1H^{-1}: a near-zero eigenvalue is an enormous variance in that direction, which an honest estimator must reflect (lesson M3-T12). The translational block alone is a 3×3 matrix Σ n n⊤\Sigma \,n\,n^{\top}: a corridor has normals in only two directions, so one eigenvalue is zero.

nin_{i}
unit normal of the plane at point ii.
σ\sigma
range noise of the sensor.
λmin⁡\lambda _{\min}
threshold chosen from the required accuracy and σ\sigma .

Architecture and data flow

Scan with per-point time → IMU deskew (lesson M3-T10) → registration to the local map (lesson M2-T14, M4-T8) → pose, covariance and an explicit degeneracy flag (which directions are unconstrained) → estimator, which inflates the covariance in those directions or ignores them (as in degeneracy-aware LIO systems), and the navigation monitor (lesson M2-T16).

Real-world UAV applications

  • GNSS-denied flight in warehouses, tunnels and under bridges.
  • Detecting when to trust LiDAR odometry and when to lean on vision.
  • Mapping and localisation (Capstone 2).
  • Choosing a LiDAR with a wider field of view to see more normals.

Implementation example

This runs as shown: the translational information matrix Σ n n⊤\Sigma \,n\,n^{\top} for a room, a corridor and an open field; the corridor and field have rank deficiency the eigenvalues expose.

import numpy as np
rng = np.random.default_rng(0)

def scene_normals(kind, n=600):
    if kind == "room":     axes = np.eye(3)                                    # walls, floor, ceiling in all three directions
    elif kind == "corridor": axes = np.array([[0, 1, 0], [0, 0, 1]], float)     # side walls and floor/ceiling: nothing normal to the corridor axis (x)
    else:                  axes = np.array([[0, 0, 1]], float)                  # open field: flat ground only
    k = rng.integers(0, len(axes), n); nvec = axes[k] + 0.02 * rng.standard_normal((n, 3))      # a little roughness
    return nvec / np.linalg.norm(nvec, axis=1, keepdims=True)

def translation_information(normals, sigma=0.03): return normals.T @ normals / sigma ** 2

for kind in ("room", "corridor", "field"):
    lam = np.sort(np.linalg.eigvalsh(translation_information(scene_normals(kind))))[::-1]
    constrained = int(np.sum(lam > 1e-2 * lam[0]))
    sigma_axes = np.where(lam > 1e-2 * lam[0], 1 / np.sqrt(np.maximum(lam, 1e-12)), np.inf)
    print(f"{kind:9s} eigenvalues {np.round(lam, 0)} -> constrained directions: {constrained}")
    assert constrained == {"room": 3, "corridor": 2, "field": 1}[kind]
# the covariance along the weak direction is huge
lam = np.sort(np.linalg.eigvalsh(translation_information(scene_normals("corridor"))))
assert 1 / np.sqrt(max(lam[0], 1e-12)) > 10 / np.sqrt(lam[-1])                       # at least ten times more uncertain along the weak direction
Degeneracy detection from the eigenvalues of the point-to-plane information matrix.

Common engineering mistakes

Reporting a covariance from the optimiser without a degeneracy check

In a corridor the registration returns an answer along the axis with false confidence.

Assuming more points means more constraint

Constraint comes from normal diversity, not point count.

Ignoring dust, rain and fog returns

They create false surfaces near the sensor; filter by range and intensity.

Mounting without a clear field of view

The airframe and propellers appear as obstacles in the scan.

Not deskewing

At UAV speeds a scan is distorted by motion (lessons M3-T10, M4-T8).

Failure modes

Failure modes, symptoms and causes
Failure modeHow it shows upLikely cause
Corridor driftDrift along the corridor axis with small reported covarianceDegenerate geometry
Glass and mirrorsMissing or phantom surfacesSpecular surfaces defeat LiDAR returns
Dust and rainFalse returns, odometry jitterParticles near the sensor
Vibration blurSmeared surfacesUnsynchronised IMU or motion not deskewed

Debugging approach

  1. Plot the eigenvalues of the registration information over time and mark corridors.
  2. View the accumulated map for double surfaces.
  3. Compare drift along and across a corridor.
  4. Test with a deliberate corridor and a flat field segment.

Practical exercises

  1. Prove that Σ n n⊤\Sigma \,n\,n^{\top} has rank equal to the dimension spanned by the normals.
  2. Choose λmin⁡\lambda _{\min} for a 0.05 m accuracy requirement and σ=0.03 m\sigma =0.03\,\mathrm{m}.
  3. Describe which other sensor constrains the along-corridor direction and how.
  4. Count the constrained directions for a scene with a single wall.

Interview questions

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

Question 1

Why can LiDAR odometry drift in a long corridor?

Model answer

The surface normals span only two directions, so motion along the corridor axis changes no residual: the scan registration does not constrain it.

Question 2

How do you detect degeneracy at run time?

Model answer

From the eigenvalues of the information matrix (or the registration Hessian): a small eigenvalue marks an unconstrained direction.

Question 3

What should the estimator do with a degenerate direction?

Model answer

Treat it as unobserved: inflate its covariance or exclude the update, and rely on another sensor for it.

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.

Next lesson

M2-T14: LiDAR odometry

Describe scan-to-scan and scan-to-map registration with ICP.