Skip to content
Mehridian

How FUSE builds one picture

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

FUSE turns one instant’s reports into a short list of fused tracks, in five stages, with no memory between timesteps. Each frame is computed from that frame’s reports alone, which makes the engine easy to test, and means it can’t carry a track through a gap.

FUSE in one line: five feeds are normalised into one frame with an uncertainty ellipse each, associated in two passes with a statistical gate, cleared of lone clutter plots, fused by inverse-covariance weighting with inherited classification, and ranked by class and range.

Normalisation is on the sensors page. This page starts from there: every report is now a position in metres about the ground station, with an uncertainty ellipse. The core needs only 2×2 matrix arithmetic, written by hand, so it runs on the Python standard library alone. Part of the Seemorgh operator console project.

Measuring agreement

Distance in metres is the wrong test. Two radar reports 200 m apart may be the same aircraft; two precision-tracker reports 50 m apart almost certainly aren’t. So FUSE uses the squared Mahalanobis distance: the separation between two reports, measured against the sum of their covariances. The result means the same thing whatever sensors are involved. Two reports agree if it is below 9.21, the chi-square value for two degrees of freedom at about the 99% level. That threshold is the gate. A report’s distance to a group is its distance to the group’s closest member.

Association, in two passes

FUSE association in two passes. Pass 1: identity-bearing reports, sorted by identity strength, each join the closest group inside the gate unless a veto applies, otherwise start a new group. Pass 2: plots and RF fixes are scored against groups whose gate, and whose sharpest member's gate, they pass; if the best candidate isn't at least twice as good as the second, the report is left out as ambiguous.

Pass 1: reports that carry identity form the groups. C2, precision and long-range radar tracks are the anchors. They seed groups in order of identity strength:

  1. C2 tracks with a friend or hostile call and real motion
  2. Reports with motion but no such call: the precision tracker
  3. Reports with a call but no motion
  4. Reports with neither: the long-range radar, and C2 tracks that say “unknown” and barely move

The order matters. The code’s comments describe the failure it prevents: if the long-range radar seeded first, its ellipse of a few hundred metres could take in a report from the other aircraft at the crossing.

The vetoes are absolute:

  • opposite IFF calls
  • a hostile RF call against a friendly group, or the reverse
  • a second report from the same sensor (radar plots excepted, since a real object lights up two a scan)
  • two reports both moving faster than 5 m/s with headings more than 60° apart

Below 5 m/s, velocity is treated as unavailable rather than as evidence.

Pass 2: plots and RF fixes attach, or don’t. A plot or fix must be inside a group’s gate with no veto. It must also be inside the gate of the group’s sharpest member, so it agrees with the precise evidence, not merely with the radar’s wide ellipse. The comments name a clutter plot that rode the radar’s ellipse into a track at t=22 as the case this rule stops. Finally, if the second-best group’s distance is less than twice the best group’s, the report attaches to neither.

Clutter, fusion, confidence, priority

  • Clutter. A group with a real track survives, even alone. A group of only plots needs at least two, which mirrors radar’s M-of-N confirmation. Nothing reads the scenario’s “clutter” label: across all 91 frames, every one of the 273 clutter plots was left out because nothing corroborated it.
  • Position is an inverse-covariance weighted mean. A 3 m precision track outweighs a 76 m C2 report by a factor of about 600.
  • The reported σ is the root mean square of the fused ellipse’s east and north standard deviations, floored at 1 m. The verification page checks it against the truth.
  • Altitude is a weighted mean of the reports that carry one, so RF is excluded.
  • Velocity and course come from the single sharpest report that measures them, not an average.
  • Classification is inherited, never inferred. Any hostile call makes the track hostile and is never downgraded. Otherwise a friendly C2 call makes it friendly. Otherwise it is unknown.
  • Confidence is a heuristic: half grows with the number of distinct source systems (1 − 0.5ⁿ), half shrinks with σ (1 ÷ (1 + σ/50 m)). For the interceptor at t=74: 0.469 + 0.470 = 0.939. It ranks tracks sensibly. It is not a probability.
  • Priority is by class (hostile, then unknown, then friend), then distance from the ground station, then confidence. So the unknown contact 12 km away always outranks the interceptor, and the friendly track is priority 3 in every frame.
  • Track numbers are those ranks. FT-001 is the first-ranked track in this frame, not a persistent identity.

One frame, worked through: t=74

GroupPass 1 anchorsPass 2 attachmentsResult
Hostile droneIts C2 track (hostile), then the long-range radar trackOne of its two plots; its RF fix (hostile)FT-001, hostile, priority 1, ±37 m, 4 source systems
Friendly interceptorIts C2 track (friend), then the precision trackBoth of its plots; its RF fix (unknown)FT-003, friend, priority 3, ±3 m, 4 source systems
Unknown contactThe long-range radar track, then its C2 track (unknown, 3.6 m/s)—FT-002, unknown, priority 2, ±72 m, 2 source systems
Left out—The drone’s other plot (ambiguous); three clutter plots (each alone)4 reports in no track

The drone’s second plot fitted the friendly group slightly better than its own. The crossing page measures that decision.

What comes from the textbook, and what is judgement

PartGrounding
Mahalanobis gate, χ² = 9.21 at 2 degrees of freedomStandard: Bar-Shalom, Willett and Tian, chapters 2 and 8
Inverse-covariance fusionStandard: the static case of the Kalman filter’s measurement update
Radar cross-range error from range × beamwidth; CEP ÷ 1.1774Standard error modelling
Anchor ordering, hard vetoes, “lone plot is clutter”, hostile never downgradedEngineering choices, deliberately conservative
Ambiguity factor of 2, the 5 m/s and 60° thresholdsTuned to this scenario; they would need calibrating on real vendor data

What it isn’t

  • Not a tracker. There is no motion model, prediction or history, so it can’t coast through a gap or use the past to place an ambiguous plot.
  • Not a global optimiser. Association is greedy and group-first, not global nearest neighbour or JPDA.
  • Not using all the kinematics. The long-range radar’s range rate is ignored.
  • Not tested against bunched clutter. Two clutter plots close enough to corroborate each other would make a track. The scenario scatters its clutter over about 360 km², so this never happens in the 91 frames, and no test forces it.

Basis: the association, clutter, fusion and priority code and the design references in the FUSE package at the export commit named in the replay README (private source); the recorded t=74 frame in the public replay data; and the phase 2 to 4 tests. The confidence arithmetic is recomputed from the recorded frame.

Further reading: Yaakov Bar-Shalom, Peter K. Willett and Xin Tian, Tracking and Data Fusion: A Handbook of Algorithms (YBS Publishing, 2011). R. E. Kalman, “A New Approach to Linear Filtering and Prediction Problems”, Journal of Basic Engineering 82(1), 1960.

Previous: Five sensors that disagree · Next: An AI layer with almost no room · Back to the overview