Skip to content
Mehridian

Five sensors that disagree

Seemorgh operator console · Overview · 1 The crossing · 2 Sensors · 3 Fusion · 4 AI layer · 5 Checks · 6 Beyond the scenario

Before FUSE can ask whether two reports describe the same aircraft, it has to make them comparable. The scenario’s five feeds disagree on where they measure from, in what units, on what clock, and what their “id” field means. Two of them emit filtered tracks; one emits raw single-scan detections, some of them clutter.

The scenario to scale. The plot radar is 4.5 km east of the ground station and the RF direction finder 3.0 km west; the precision tracker is at the ground station; the long-range radar is 17.8 km north, off the map. The hostile drone flies south from 9 km out; the friendly interceptor climbs north past the precision tracker's specified 3.5 km range. Their paths cross at t=74, 143 m apart. The unknown contact moves slowly about 12 km out.

Part of the Seemorgh operator console project.

The five feeds

FeedWhere it sitsWhat it sendsUnits and clockWhat its ID means
Long-range radar17.8 km northTracks as slant range, azimuth and elevation from its own site, plus range rate and beamwidthMetres, degrees; Unix secondsA small integer, unique only within this radar and recycled when a track drops
Precision trackerAt the ground stationTracks in east, north and up metres, with a 3D velocity and a 0–1 quality scoreMetres, m/s; Unix millisecondsA local string such as PS-0007
Plot radar4.5 km eastSingle-scan plots as range, azimuth and elevation, with signal-to-noise ratio. No velocity, no identity, some clutterMetres, degrees, dB; Unix secondsMinted fresh every scan
C2 networkA partner’s feedTracks in latitude and longitude, with altitude, ground speed, course, an IFF call and a circular error probableFeet, knots; ISO 8601 textA UUID that is never shared with any other sensor
RF direction finder3.0 km westA bearing to a drone’s radio link, a coarse range from signal strength, and a threat callDegrees, metres, dBm; Unix secondsA local detection ID, recycled

Only the C2 network says a contact is friendly. Only the RF sensor independently says a contact is hostile, and it never says “friend”: RF alone cannot clear a contact. The plot radar says nothing about identity at all.

One frame, one set of units, one clock

Frame. FUSE puts every report into east, north and up metres about the ground station, at 48.05° N, 11.65° E. The radar feeds are converted from polar coordinates about their own sites, the C2 feed from latitude and longitude, and the RF fix from a bearing and range about the RF site. The conversion is a flat-earth approximation, accurate to well under a metre over the 25 km play area. A test feeds one point through the long-range radar and the precision tracker; both must land within 50 m of it and fuse into one track.

Units. C2 speed is converted from knots and altitude from feet. Tests check that 200 knots comes out near 102.9 m/s, and 1,000 ft near 304.8 m.

Time. The three time formats are parsed to Unix seconds and used for one thing: a track’s last_update is its reports’ latest timestamp, not the computer’s clock. FUSE doesn’t align reports in time. The C2 feed’s specification says it can lag, but in this scenario every report at timestep t carries the same second, so a lag correction is never needed, and the engine doesn’t have one.

Identity. None of the five ID fields can link one sensor’s report to another’s. So FUSE never associates by ID: a test gives two precision tracks the same ID 7 km apart, and they must stay two tracks.

How much FUSE trusts each feed

One-sigma uncertainty ellipses at t=74, drawn to the same scale: the long-range radar about 265 by 255 m; the RF fix 250 by 200 m, tilted along its bearing; a C2 report a 76 m circle; a 16 dB plot a 49 m circle; and the precision tracker a 3 m circle, barely a dot. The same 50 m offset is 0.2σ for the radar and 16σ for the precision tracker.

Every report becomes a position plus a 2×2 covariance: an uncertainty ellipse in the horizontal plane. The ellipse is the engine’s model of how that sensor errs:

FeedRule in FUSE
Long-range radarAcross the beam: range × half the beamwidth. Along it: 2% of range, at least 60 m
Precision tracker3 m divided by the tracker’s quality score (floored at 0.3): 3.0–3.5 m here
Plot radar800 m divided by the SNR in dB, kept between 15 and 100 m. Real plots come out at 31–57 m; clutter at 67–100 m
C2 networkCEP ÷ 1.1774; the scenario’s 90 m CEP gives 76 m
RF direction finderAlong the bearing: the reported range error. Across it: range × bearing error, at least 5 m

Two consequences follow:

  • The precision tracker dominates any track it joins. The friendly interceptor’s track is ±3 m because of it.
  • The RF fix is not a bearing-only line. It is placed at its estimated range and contributes horizontal position like any other report. The console draws it as a bearing ray, which is why RF is often described as bearing-only; in the engine it isn’t.

The scenario’s simplifications

The scenario generator came with the original challenge brief. It is deterministic, with noise seeded by the timestep. It has three objects moving in straight lines at constant velocity, plus three clutter plots a frame scattered over about 18 × 20 km. That makes 15 reports in each of the 91 timesteps: 12 from real objects and 3 clutter, 1,365 in all. A clean result here shows less than it might seem, for five reasons:

  • Noise is horizontal and mild. Positions are perturbed 120 m per axis for the long-range radar, 60 m for C2, 35 m for plots, 40 m for the RF fix (plus 1° of bearing and 200 m of range noise), and 3 m for the precision tracker.
  • Altitude is nearly exact. Only the precision tracker adds altitude noise, so the drone’s fused altitude is exactly 320 m in all 91 frames.
  • C2 motion is exact. The drone’s fused velocity is the true 60.1 m/s throughout.
  • Coverage is generous. The precision tracker’s specification says it loses contacts beyond about 3.5 km; the scenario keeps it on the interceptor to 5.5 km.
  • Labels are always right. Every C2 and RF identity call matches the truth.

Basis: the feed specifications, geometry helpers, scenario generator and normalisation code in the FUSE package at the export commit named in the replay README (private source); the recorded frames in the public replay data; and the phase 1 and 2 tests. Ellipse sizes are computed from the scenario’s stated parameters at t=74, not measured from hardware.

Further reading: Merrill I. Skolnik (ed.), Radar Handbook, 3rd edition (McGraw-Hill, 2008), on why a radar’s cross-range error grows with range and beamwidth.

Previous: The crossing, frame by frame · Next: How FUSE builds one picture · Back to the overview