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

UAV Systems Engineering · Module 2

M2-T15: Radar-aided navigation

Radar measures velocity directly, in the dark and through dust: each stationary target tells you the vehicle’s speed along the line of sight.

  • Lesson 15 of 16
  • UAV Navigation and GNSS-Denied Operations
  • Research-level
  • About 5 minutes to read

Where cameras and LiDAR struggle (smoke, dust, fog, rain, darkness), radar keeps working. It is lower resolution, but its Doppler measurement turns the whole environment into a velocity sensor. This lesson derives the ego-motion estimate and shows its robustness to moving targets.

Learning objectives

After this lesson, you should be able to:

  • Explain what a radar measures (range, azimuth, elevation, radial velocity) and its limits.
  • Derive ego velocity from the radial velocities of stationary targets.
  • Reject moving targets with RANSAC.
  • State where radar helps and where it does not.

Conceptual explanation

A radar emits electromagnetic waves and measures reflections. Modern compact (FMCW) radars give each detection a range, azimuth (and for 4-D radars, elevation) and a radial (Doppler) velocity. Wavelengths of millimetres pass through dust, smoke, fog and rain and do not depend on light. The price is coarse angular resolution, sparse and noisy point clouds, ghost targets from multipath, and specular reflection.

Radar ego-velocityEach detection gives a radial velocity. For stationary targets, the radial velocity equals minus the dot product of the line-of-sight direction with the vehicle velocity. Many detections give an over-determined linear system, solved with RANSAC to reject moving targets.Detectionsrange, angle, v_rRANSACreject moversLeast squaresv from v_rOdometryintegrate / fusevelocity without features, textures or light
Ego-motion from radar Doppler.
Animation of radar ego-velocity estimation. A vehicle moves at 4 metres per second forward and 1 metre per second sideways past static targets. Each radar return gives a range and a radial velocity; plotting radial velocity against azimuth gives a cosine whose amplitude and phase are the vehicle velocity. As more targets accumulate, a least-squares fit converges to the true velocity. A dust cloud blocks the LiDAR returns in part of the field of view while the radar returns continue.
Radial Doppler velocity of a static target at azimuth ϕ\phi is −(vx cos⁡ ϕ+vy sin⁡ ϕ)(v_{x}\,\cos \,\phi +v_{y}\,\sin \,\phi ). A least-squares fit over many targets recovers the ego velocity (vx, vy)(v_{x},\,v_{y}) directly, without feature tracking, and radar continues through dust and darkness where LiDAR and cameras drop out. Illustrative numbers. (Looping, about 6 seconds; drawn and computed for this course with illustrative values.)

Engineering intuition

If you drive past a stationary sign, its Doppler shift says how fast you approach it along the line of sight. Every stationary object around you does the same, each along its own direction. A handful of detections in different directions pins down the full velocity vector. Moving objects (people, vehicles) violate the assumption, which is why a robust fit is used. Because the Doppler is a direct velocity measurement, drift is much lower than integrating accelerations, though position still accumulates error by integrating velocity.

Mathematical formulation

A stationary target at unit direction uiu_{i} (sensor frame) produces radial velocity vr, i=−ui⊤ vv_{r,\,i}=-u_{i}^{\top}\,v for sensor velocity vv. Stacking NN detections:

Ego velocity by least squares
vr=−U v+ε,U=[u1⊤⋮uN⊤]\mathbf v_r = -\mathbf U\,\mathbf v + \boldsymbol\varepsilon, \qquad \mathbf U = \begin{bmatrix}\mathbf u_1^{\top}\\ \vdots\\ \mathbf u_N^{\top}\end{bmatrix}
Least-squares ego velocity
v^=−(U⊤U)−1U⊤vr\hat{\mathbf v} = -(\mathbf U^{\top}\mathbf U)^{-1}\mathbf U^{\top}\mathbf v_r

The conditioning of U⊤UU^{\top}U depends on the spread of directions: detections only straight ahead cannot give the lateral velocity (the same geometric degeneracy as for LiDAR). RANSAC: sample three detections (or two for planar motion), solve, count inliers with ∣vr, i+ui⊤ v^∣|v_{r,\,i}+u_{i}^{\top}\,\hat{v}| < threshold, keep the best, refit. For rotation, a second antenna or gyro is used; the lever-arm velocity ω × rsensor must be removed.

vr, iv_{r,\,i}
radial velocity of detection ii (positive when moving away, by convention: check your sensor).
uiu_{i}
unit vector from the sensor to the target.
ε\varepsilon
measurement noise; includes moving targets as outliers.

Architecture and data flow

Radar point cloud with Doppler → ego-velocity estimator with RANSAC → velocity with covariance (from the residuals and geometry) → estimator as a velocity measurement alongside IMU (lesson M3-T10 style fusion), and optionally as a scan-registration source with radar-specific methods (research level). Calibrate the radar-to-IMU extrinsics and check the sign convention of the radial velocity.

Real-world UAV applications

  • Flight in smoke, dust and fog where optical sensors fail.
  • Velocity aiding with no dependence on texture or geometry.
  • Altitude and terrain-following with radar altimeters.
  • Diverse redundancy to vision and LiDAR (lesson M2-T16).

Implementation example

This runs as shown: radar detections of stationary points plus moving targets; a RANSAC ego-velocity estimator recovers the vehicle velocity within a few centimetres per second where plain least squares is biased by the movers.

import numpy as np
rng = np.random.default_rng(6)
v_true = np.array([3.0, -0.8, 0.5])                                  # vehicle velocity in the sensor frame (m/s)

N = 120
dirs = rng.standard_normal((N, 3)); dirs[:, 0] = np.abs(dirs[:, 0]) + 0.3; dirs /= np.linalg.norm(dirs, axis=1, keepdims=True)   # detections in a forward-looking cone
vr = -dirs @ v_true + 0.05 * rng.standard_normal(N)                  # radial velocity of stationary targets
movers = rng.choice(N, 25, replace=False)                            # 25 detections are on moving objects
vr[movers] += rng.uniform(-6, 6, len(movers))

def lsq(U, y): return np.linalg.lstsq(-U, y, rcond=None)[0]
def ransac_ego(U, y, iters=200, thresh=0.25):
    best, best_in = None, None
    for _ in range(iters):
        idx = rng.choice(len(U), 3, replace=False); v = lsq(U[idx], y[idx])
        inl = np.abs(y + U @ v) < thresh
        if best_in is None or inl.sum() > best_in.sum(): best, best_in = v, inl
    return lsq(U[best_in], y[best_in]), best_in

v_plain = lsq(dirs, vr); v_rob, inl = ransac_ego(dirs, vr)
print(f"plain least squares error {np.linalg.norm(v_plain - v_true):.2f} m/s, RANSAC error {np.linalg.norm(v_rob - v_true):.3f} m/s, inliers {inl.sum()} of {N}")
assert np.linalg.norm(v_rob - v_true) < 0.05 and np.linalg.norm(v_plain - v_true) > 3 * np.linalg.norm(v_rob - v_true)
assert not np.any(inl[movers[np.abs(vr[movers] + dirs[movers] @ v_true) > 1.0]])        # the clearly moving targets were rejected
Radar ego-velocity with RANSAC against moving targets.

Common engineering mistakes

Assuming all detections are stationary

Movers bias a plain fit; use RANSAC or a Doppler-based classifier.

Wrong sign convention of radial velocity

The estimated velocity is mirrored: check with a known motion.

Ignoring lever arm and rotation

Angular rate adds ω×r\omega \times r to the sensor velocity.

Expecting LiDAR-like point density

Radar is sparse and noisy; design the estimator for that.

Ghost targets

Multipath produces detections at wrong positions; use consistency.

Failure modes

Failure modes, symptoms and causes
Failure modeHow it shows upLikely cause
Lateral velocity unobservableWrong sideways velocityAll detections near the boresight
Moving crowdEstimate pulledMany movers, RANSAC threshold too loose
Metallic reflectionsGhost detections near wallsMultipath
InterferenceNoisy detectionsOther radars on the same band

Debugging approach

  1. Plot radial velocity against uu·vv of the estimated velocity: stationary targets should lie on a line.
  2. Compare against another velocity source.
  3. Check the sign convention with a straight-line drive.
  4. Examine detection density against the field of view.

Practical exercises

  1. Show that detections in only one direction cannot determine lateral velocity.
  2. Add rotation: include ω×r\omega \times r and estimate both.
  3. Choose a RANSAC threshold for a 0.1 m/s noise and justify it.
  4. Describe how radar would complement vision and LiDAR in a smoke-filled tunnel.

Interview questions

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

Question 1

What does a radar give that vision and LiDAR do not?

Model answer

Direct radial velocity (Doppler) and operation in dust, smoke, fog and darkness.

Question 2

How is ego velocity estimated from radar?

Model answer

For stationary targets the radial velocity is minus the line-of-sight direction dotted with the vehicle velocity; a robust least-squares fit over many detections gives the velocity.

Question 3

What are radar’s weaknesses for navigation?

Model answer

Low angular resolution, sparse and noisy detections, multipath ghosts and specular effects.

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-T16: Multi-sensor GNSS-denied navigation architectures

Design a layered architecture with GNSS, VIO and LiDAR odometry and a confidence monitor.