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

UAV Systems Engineering · Module 2

M2-T6: GNSS jamming and spoofing

Jamming makes GNSS disappear; spoofing makes it lie. The second is the dangerous one, and only independent sensors can catch it.

  • Lesson 6 of 16
  • UAV Navigation and GNSS-Denied Operations
  • Implementation-specific
  • About 6 minutes to read

GNSS signals reach the ground at extremely low power, so they are easy to overwhelm and possible to imitate. A navigation architecture that treats GNSS as truth is therefore a single point of failure that an adversary, or a nearby transmitter, can trigger.

Learning objectives

After this lesson, you should be able to:

  • Distinguish jamming, spoofing and unintentional interference by their effect and detectability.
  • Explain how an innovation gate and an odometry cross-check detect spoofing and why slow ramps are hard.
  • Design a response policy for detected jamming or spoofing.
  • Reproduce a spoofing ramp against a gated filter and measure detection delay.

Conceptual explanation

Jamming raises the noise floor so receivers lose lock: the symptom is no fix or a degraded fix. Spoofing transmits counterfeit signals that a receiver accepts as genuine: the symptom is a confident, wrong position. Interference can be unintentional (a poorly shielded onboard device or a nearby transmitter) and looks like jamming.

Jamming is a loss of availability and is usually obvious. Spoofing is a loss of integrity and is not obvious from the GNSS data alone: the receiver may report good satellite counts and low DOP. Detection therefore comes from comparison with another source: the inertial and odometry estimate.

Spoofing detection chainA GNSS fix passes an innovation gate that catches jumps, then a windowed cross-check against displacement from GNSS-independent odometry that catches slow ramps. A failed check marks GNSS untrusted and the estimator excludes it.GNSS fix Innovation gateNIS < chi-squarecatches jumps Cross-checkGNSS vs odometrydisplacement, 4 s windowcatches slow ramps Trust flagexclude GNSS independent odometry (camera, LiDAR) is the reference: without it there is nothing to compare against
The detection chain used in the GNSS-Denied Failure Simulator: a gate for jumps, a windowed cross-check for ramps.
Animation in two phases of carrier-to-noise ratio and position innovation. In the jamming phase the carrier-to-noise ratio falls steadily below the tracking threshold and the position fix is lost. In the spoofing phase the carrier-to-noise ratio jumps up, the reported position slowly drags away from the inertial estimate, and the innovation test statistic crosses its threshold, raising an alarm.
Jamming: raised noise floor, C/N0 falls, satellites are lost one after another. Spoofing: a stronger counterfeit signal, C/N0 rises, the fix stays available but drifts away from what the INS and other sensors predict (innovation grows). Illustrative values; detection thresholds must be tuned to your receiver. (Looping, about 6 seconds; drawn and computed for this course with illustrative values.)

Engineering intuition

Imagine the filter as a skeptical navigator who always has a dead-reckoned position in mind. A GNSS fix that disagrees by a few sigma is rejected. A spoofer who understands this does not jump the position: it drags it slowly, so each fix is within the gate, and the filter follows the ramp. The defence is a longer memory: over several seconds, the displacement reported by GNSS must agree with the displacement from independent odometry. A spoofed ramp moving at 1 m/s relative to truth accumulates a visible disagreement within a few seconds.

Mathematical formulation

Innovation gate

For a GNSS position measurement zz with filter prediction z^\hat{z}, innovation y=z−z^y=z-\hat{z} and innovation covariance S=H P H⊤+RS=H\,P\,H^{\top}+R, accept the measurement if the normalised innovation squared stays below a chi-square threshold:

Innovation gate
NIS=y⊤S−1y≤χm, 1−α2\mathrm{NIS} = \mathbf y^{\top}\mathbf S^{-1}\mathbf y \le \chi^{2}_{m,\,1-\alpha}
For m = 2 (horizontal) the 99 % limit is 9.21.

Odometry cross-check

Compare the GNSS displacement over a window of NN seconds with the displacement predicted by GNSS-independent sources, averaging samples at both ends to suppress noise:

Displacement consistency
D=∥(zˉnew−zˉold)−(p^new−p^old)∥D = \left\lVert(\bar{\mathbf z}_{\text{new}} - \bar{\mathbf z}_{\text{old}}) - (\hat{\mathbf p}_{\text{new}} - \hat{\mathbf p}_{\text{old}})\right\rVert
flag spoofing if D>κσz2/n+σp2 for several windows\text{flag spoofing if } D > \kappa\sqrt{\sigma_z^{2}/n + \sigma_p^{2}} \text{ for several windows}
zˉ\bar{z}
mean of nn GNSS samples at the start or end of the window.
p^\hat{p}
mean estimated position from the odometry-driven filter at those same times.
κ\kappa
threshold multiplier (typically 4–6) chosen for a target false-alarm rate.

The detection delay for a spoof ramp of rate ρ\rho against a threshold δ\delta over a window WW is approximately t≈δ/ρ+W/2t\approx \delta /\rho +W/2: slower ramps take longer, and with ρ\rho below noise-limited sensitivity the spoof cannot be separated from drift of the odometry itself. The odometry’s own drift is the floor of this method.

Architecture and data flow

GNSS receiver → gate (per fix) → cross-check monitor (windowed, against visual and LiDAR odometry) → trust flag → estimator and navigation manager. When the flag drops, GNSS is excluded from the filter, the mode manager moves to a GNSS-denied mode, and the mission may be restricted. The GNSS-Denied Failure Simulator implements exactly this chain.

Real-world UAV applications

  • Operating near conflict zones or large transmitters where interference is known.
  • Integrity monitoring of a delivery or inspection UAV that must not follow a false position.
  • Choosing between GNSS-reliant and odometry-reliant flight modes automatically.
  • Authenticated or multi-band receivers add signal-level protection; they complement, not replace, a cross-check.

Implementation example

This runs as shown: a minimal gated filter fed a spoof ramp. It prints the fast-ramp case (caught by the gate) and the slow-ramp case (the filter follows until a displacement cross-check against pure odometry fires).

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

def run(ramp, cross_check, T=120.0, dt=0.2, sigma_gnss=1.5, sigma_odo=0.05, q_pos=0.03):
    """1-D position. True velocity 4 m/s. Odometry measures velocity (sigma_odo m/s). GNSS measures position.
    q_pos is process noise per step: it stands for odometry scale error and unmodelled motion."""
    x, P = 0.0, 4.0                      # estimate, variance
    hist_z, hist_o = [], []
    odo = 0.0                            # pure dead reckoning from odometry only: independent of GNSS
    detected_at, t = None, 0.0
    truth = 0.0
    while t < T:
        truth += 4.0 * dt
        v_meas = 4.0 + sigma_odo * rng.standard_normal()
        x += v_meas * dt; odo += v_meas * dt; P += (sigma_odo * dt) ** 2 + q_pos
        spoof = max(0.0, ramp * (t - 30.0))                       # spoofing starts at t = 30 s
        z = truth + spoof + sigma_gnss * rng.standard_normal()
        hist_z.append(z); hist_o.append(odo)
        S = P + sigma_gnss ** 2
        accept = (z - x) ** 2 / S < 6.63                            # 1-D chi-square 99% gate
        if cross_check and detected_at is None and len(hist_z) > 60 and t > 35:
            n = 10
            dz = np.mean(hist_z[-n:]) - np.mean(hist_z[-60:-60 + n])
            dx = np.mean(hist_o[-n:]) - np.mean(hist_o[-60:-60 + n])
            if abs(dz - dx) > 3.0: detected_at = t
        if accept and detected_at is None:
            K = P / S; x += K * (z - x); P *= (1 - K)
        t += dt
    return x - truth, detected_at

for ramp in (5.0, 0.3):
    e_off, _ = run(ramp, False); e_on, t_det = run(ramp, True)
    print(f"ramp {ramp} m/s: error without cross-check {e_off:6.1f} m; with it {e_on:6.1f} m, detected at {t_det}")
e_fast, _ = run(5.0, False); e_slow, _ = run(0.3, False); e_slow_chk, t = run(0.3, True)
assert abs(e_fast) < 15            # the gate alone rejects a fast ramp
assert abs(e_slow) > 15            # the filter follows a slow ramp: error approaches the spoof offset
assert t is not None and abs(e_slow_chk) < abs(e_slow)
Gate versus slow ramp versus cross-check in one dimension. Thresholds are teaching values.

Common engineering mistakes

Relying on the receiver’s own “good fix” flag

A spoofed signal can show many satellites and low DOP. Integrity must come from independent comparison.

Setting the innovation gate too wide to avoid dropouts

A wide gate lets a slow ramp through. Tune against both false-alarm rate and detection delay.

Cross-checking against a source with the same weakness

Barometer or compass alone cannot detect horizontal position spoofing; use odometry (vision, LiDAR) or an independent inertial reference.

No policy after detection

A detector without a response is a log message: define the degraded mode before flight.

Failure modes

Failure modes, symptoms and causes
Failure modeHow it shows upLikely cause
Slow-ramp spoofingEstimate follows a drifting position while reported accuracy stays goodRamp rate lower than the gate can resolve and no cross-check
JammingSatellite count and C/N0 collapse, fix lostBroadband interference raises the noise floor
False spoofing alarmGNSS excluded in good conditionsCross-check threshold too tight relative to odometry drift or noise
Re-acquisition jumpPosition jumps when GNSS returns after a long denialFilter accepted the new fix after drift grew; blend gradually and re-initialise offsets

Debugging approach

  1. Replay logs with a synthetic ramp added to the GNSS channel and measure detection delay and false-alarm rate.
  2. Plot innovation (y) and NIS over time: a persistent small positive trend is the signature of a slow ramp.
  3. Check C/N0 and automatic-gain-control indicators from the receiver for jamming evidence.
  4. Verify the estimator excludes GNSS completely (not just down-weights it) after the trust flag drops.

Practical exercises

  1. Estimate the detection delay for a 0.5 m/s ramp with a 4 s window and a 3 m threshold.
  2. Add a gate on the receiver-reported velocity (Doppler) and see whether it helps against position ramps.
  3. Extend the example to two dimensions with a spoof that also changes direction.
  4. Argue what odometry drift rate would make a 3 m threshold unusable.

Interview questions

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

Question 1

How do jamming and spoofing differ for a UAV?

Model answer

Jamming removes the signal (availability loss, easy to see). Spoofing replaces it with a plausible lie (integrity loss, hard to see). Spoofing needs cross-checks against independent sensors.

Question 2

Why can slow spoofing evade an innovation gate?

Model answer

Each fix is within the gate because the filter tracks the ramp. Only a comparison over a longer window against an independent displacement estimate reveals the accumulating disagreement.

Question 3

What should a UAV do on detecting spoofing?

Model answer

Stop fusing GNSS, continue on odometry-aided inertial navigation, reduce mission risk (speed, geofence), and execute a defined failsafe if confidence drops. The exact policy is a system requirement set before flight.

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-T7: Inertial Navigation Systems

Write the strapdown INS mechanisation equations for attitude, velocity and position, and explain how errors grow.