THREAT
FUSION
Data fusion is how Lisa 26 turns multiple partial observations into a complete battlefield picture. Each drone sees a piece. Lisa 26 assembles the puzzle.
Why One Drone Is Not Enough
A single FPV drone at 120m altitude with a 6mm lens sees a patch of ground about 126×94 meters. That's roughly one football field. The battlefield is 10+ km wide. One drone sees less than 0.01% of the area at any time.
Worse: a single drone can be wrong. It detects a "vehicle" at 76% confidence — but is it actually a vehicle, or is it a shed? Is it moving or parked? Is it alone or part of a column? One frame from one angle is not enough to answer these questions.
Fusion solves both problems. Multiple drones covering different areas → full picture. Multiple detections of the same target → higher confidence. Multiple observations over time → movement patterns.
How Fusion Works — Plain Language
Imagine four people standing at different corners of a dark room, each with a flashlight. Each person can only see what their flashlight illuminates. Person A sees a chair. Person B sees a table leg. Person C sees nothing. Person D sees shoes under the table.
None of them know the full room. But if they all report what they see to a fifth person (Lisa 26), that person can say: "There's a table in the middle of the room with a chair next to it and someone sitting at the table."
That's data fusion. Each drone is a flashlight. Lisa 26 is the person who combines all the reports.
The Three Fusion Steps
What Goes Into The Fusion Engine
FUSION DATA SOURCES
The Output: Common Operating Picture
All fused data appears on one map — the COP (Common Operating Picture). Every contact is a NATO APP-6D symbol with hostile targets shown as red diamonds, friendly forces as blue rectangles, and unknown contacts as yellow circles. Each contact shows: position, class, confidence, heading, speed, age of data, and source. Both pilots — the FPV operator and the Fischer 26 operator — see the same COP simultaneously. When a new detection arrives, both screens update within 500ms.
Mathematical Derivation — Dempster–Shafer Combination Rule
This section shows the derivation of the combination formula used in Lisa 26 step-by-step. The goal is that a reviewer from FOI, KTH, or Chalmers can verify why C_fused = 1 − ∏(1 − C_i) produces the right answer and under what assumptions it stops being correct. The derivation follows Shafer's A Mathematical Theory of Evidence (Princeton University Press, 1976) specialized to the simple binary case we use in threat fusion (target present vs absent). More general Dempster–Shafer mass functions with full frame-of-discernment handling are used by Lisa 26 only when confidences disagree — see the disagreement case below.
Step 1 — The frame of discernment
The threat-fusion question is binary: "Is there a hostile armored vehicle at grid Q?" The frame of discernment Θ = {present, absent}. Each observation i provides a mass function m_i with:
m_i({present}) = C_i (confidence the observation supports "present")
m_i({absent}) = 0 (we are not modeling negative evidence here)
m_i(Θ) = 1 − C_i (remaining mass = uncertainty, assigned to "either")
This is the simple case where the confidence number output by YOLOv8 or by a human observer maps directly to belief that the target is present, with all residual mass assigned to uncertainty (not to "absent"). This choice matters — see Step 4.
Step 2 — Dempster's combination rule for two sources
Given two independent mass functions m_1 and m_2, Dempster's rule of combination produces:
m(A) = (1 / (1 − K)) · Σ_{B ∩ C = A} m_1(B) · m_2(C)
where K = Σ_{B ∩ C = ∅} m_1(B) · m_2(C) is the conflict mass.
With only "present" and "either" as mass-bearing sets, intersections are always either "present" or "either" — there is no conflict (K = 0). The rule simplifies.
Step 3 — Specialization to binary confidence
Expand m({present}) after combining m_1 and m_2:
m({present}) = m_1({present}) · m_2({present}) [both say present]
+ m_1({present}) · m_2(Θ) [source 1 says present, source 2 uncertain]
+ m_1(Θ) · m_2({present}) [source 2 says present, source 1 uncertain]
Substitute C_1, C_2, (1−C_1), (1−C_2):
m({present}) = C_1·C_2 + C_1·(1−C_2) + (1−C_1)·C_2
= C_1 + C_2 − C_1·C_2
= 1 − (1 − C_1)·(1 − C_2)
So for two sources the fused confidence is 1 − (1−C_1)(1−C_2). By induction, for n independent sources:
C_fused = 1 − ∏_{i=1..n} (1 − C_i)
This is exactly the expression Lisa 26 uses, now shown to be a consequence of Dempster's rule under the binary-confidence assumption. It is also exactly the probability that "at least one source is right" if each C_i is interpreted as the independent probability that source i correctly identifies the target — the two interpretations are numerically identical.
Step 4 — When this formula breaks and what Lisa 26 does instead
Two situations invalidate the simple formula: (a) when observations are NOT independent (e.g. two FPVs looking at the same target through the same thermal haze — correlated noise), and (b) when some observations actively argue for "absent" rather than simply being uncertain. For (a) Lisa 26 caps the fused confidence at 0.95 regardless of how many agreeing sources appear, preventing runaway confidence from correlated noise. For (b) the full Dempster rule with non-zero K (conflict) is invoked, and the normalization factor 1 / (1 − K) becomes operationally meaningful. When K > 0.6, Lisa 26 flags the contact as "DISPUTED" on the COP and demands operator review rather than trusting the fused value.
Worked Example 1 — Two drones see the same T-72
FPV-12 reports "T-72, conf 0.72" at grid 34TDM1234. ISR-03 reports "T-72, conf 0.68" at grid 34TDM1235 (100 m away, within 200 m declustering radius). Both observations are within 60 s of each other. Lisa 26 treats them as the same target.
C_fused = 1 − (1 − 0.72)(1 − 0.68)
= 1 − 0.28 × 0.32
= 1 − 0.0896
= 0.9104 → 91.0%
Two moderately-confident independent observations produce a fused confidence that crosses the L2 recommendation threshold (85%) that neither alone would. This is the operational reason for fusion: convert two "probable" observations into one "almost certain" contact.
Worked Example 2 — Three sources, one disagrees
Same target with three reports: FPV-12 conf 0.72 (T-72), ISR-03 conf 0.68 (T-72), but Fischer 26 reports the same position with confidence 0.30 for T-72 (its thermal view sees heat signature not matching tracks). Under the simple binary rule:
Simple C_fused = 1 − (1 − 0.72)(1 − 0.68)(1 − 0.30)
= 1 − 0.28 × 0.32 × 0.70
= 1 − 0.0627
= 0.9373 → 93.7%
Simple fusion produces HIGHER confidence than either ground-based source alone, which is wrong: Fischer 26's low confidence is evidence AGAINST the target, not just uncertainty. Lisa 26 detects this by computing the conflict mass K under the full Dempster rule:
With Fischer 26 expressing 0.30 for "present" and mapping the remaining 0.70 partially to "absent"
(via the thermal-signature-mismatch flag), K rises above 0.6 → contact flagged "DISPUTED".
COP displays: red diamond with "?" overlay and "OPERATOR REVIEW: thermal-visual mismatch"
instead of a solid 93.7% confidence symbol.
The operator then inspects the three sources, confirms the thermal mismatch is a concealment measure (crew running engine low, vehicle cooled by recent rain), and manually confirms the contact. The fused value enters the COP at 80% — a confidence floor that Lisa 26 uses when one source explicitly disputes the others but the operator overrides.
Verification Code — Reproducing the Worked Examples
import math
def fuse_binary(confidences):
"""Simple fusion: C_fused = 1 - prod(1 - C_i).
Correct when all sources express 'present'-or-uncertain (no disputing)."""
product = 1.0
for c in confidences:
product *= (1.0 - c)
return 1.0 - product
def fuse_with_conflict(present_masses, absent_masses):
"""Full Dempster combination for two sources with explicit absent-mass.
present_masses[i] = C_i (mass on {present})
absent_masses[i] = A_i (mass on {absent}, often 0 but nonzero for disputes)
Returns (fused_present, fused_absent, conflict_K)."""
p1, p2 = present_masses
a1, a2 = absent_masses
u1 = 1.0 - p1 - a1 # uncertainty mass 1
u2 = 1.0 - p2 - a2 # uncertainty mass 2
# Conflict: one source says present, other says absent
K = p1 * a2 + a1 * p2
if K >= 1.0:
raise ValueError("Total conflict; combination undefined")
scale = 1.0 / (1.0 - K)
fused_p = scale * (p1 * p2 + p1 * u2 + u1 * p2)
fused_a = scale * (a1 * a2 + a1 * u2 + u1 * a2)
return fused_p, fused_a, K
# Reproduce Worked Example 1
c1 = fuse_binary([0.72, 0.68])
print(f"Example 1: 0.72 + 0.68 fused = {c1:.3f}") # Expected 0.910
# Reproduce Worked Example 2 (simple formula)
c2 = fuse_binary([0.72, 0.68, 0.30])
print(f"Example 2 simple: 0.72 + 0.68 + 0.30 = {c2:.3f}") # Expected 0.937 (wrong, as discussed)
# Example 2 treated correctly: Fischer 26's low conf becomes partial absent-mass
# (0.30 present, 0.50 absent from thermal-mismatch flag, 0.20 uncertainty)
fp, fa, K = fuse_with_conflict([0.72, 0.30], [0.0, 0.50])
print(f"Example 2 with absent-mass: present={fp:.3f}, absent={fa:.3f}, K={K:.3f}")
# Expected: K > 0.3, fused present < simple 0.937 value — signals dispute
Why This Derivation Matters Operationally
Three operational decisions depend on the correctness of this fusion math. First, L2 recommendations: the 85% confidence threshold that triggers a strike recommendation is crossed by two medium-confidence observations (0.72 and 0.68 fuse to 0.91) but not by one alone. If the fusion formula were wrong — say, if Lisa 26 simply averaged confidences instead — two 0.70 observations would still average to 0.70, below threshold, and no L2 would issue. Brigades would either get too many strike recommendations (under-conservative fusion) or too few (over-conservative), and in both cases the system would lose trust.
Second, the DISPUTED flag: without the conflict-mass calculation, a thermal-signature mismatch that should raise an alarm gets silently averaged into a high fused confidence. The operator sees a "93.7% confident T-72" and authorizes a strike on what turns out to be a decoy. The DISPUTED flag exists precisely to prevent this failure mode — and it exists only because the full Dempster rule with K > 0 is implemented, not just the simple product formula.
Third, the 0.95 cap on correlated sources: without it, five FPVs looking at the same haze-obscured target from the same direction would fuse to 0.99+ confidence, treating their correlated errors as independent evidence. The cap keeps Lisa 26 honest about what it actually knows. The value 0.95 is a design choice based on empirical observation from published Ukrainian operations that no single-modality confirmation should exceed this floor of uncertainty — FSG-A has not collected its own correlated-error data to refine the cap.
The formulas are validated in provable_claims.py under DS_FUSION_2 (two-source binary) and DS_FUSION_3 (three-source binary). The conflict-mass extension (fuse_with_conflict) is verified numerically in the code above but is not yet wrapped in a provable_claims entry because the realistic disputed-evidence scenarios require correlated-noise modeling that FSG-A has not validated against real sensor data.
Implementation
# Dempster-Shafer Fusion — Multiple Drone Observations
# pip install numpy
import numpy as np
def dempster_shafer_fuse(confidences):
"""Fuse independent observations. C_fused = 1 - prod(1-Ci)"""
if not confidences:
return 0.0
result = 1.0
for c in confidences:
result *= (1.0 - c)
return 1.0 - result
# Example: 3 drones observe same target
observations = [
{"drone": "FPV-12", "class": "T-72", "conf": 0.72, "mgrs": "34TDM1234"},
{"drone": "ISR-03", "class": "T-72", "conf": 0.68, "mgrs": "34TDM1235"},
{"drone": "F26-01", "class": "MBT", "conf": 0.81, "mgrs": "34TDM1234"},
]
# Spatial clustering: observations within 100m = same target
fused_conf = dempster_shafer_fuse([o["conf"] for o in observations])
print(f"Individual: {[o['conf'] for o in observations]}")
print(f"Fused: {fused_conf:.3f}") # 0.974 — near certain
Interactive: Multi-Source Threat Fusion Dashboard
Add independent observations from different sources. Dempster-Shafer fuses them into a single confidence level. Try adding HUMINT or SIGINT to see how non-drone sources improve the picture.
Sources
Mathematically verified estimates. The independent-observation fusion formula C_fused = 1 − ∏(1 − C_i) is Dempster-Shafer theory. Validated in provable_claims.py under DS_FUSION_2 and DS_FUSION_3. The 70% × 65% → 89.5% example reproduces by direct calculation in the code.
Parameter sources. Field of view 126×94 m for a 6 mm lens at 120 m AGL — trigonometry for a typical IMX477 sensor. 500 ms COP update — design target for the brigade MANET. APP-6D symbology (red diamond for hostile, blue rectangle for friendly, yellow circle for unknown) — NATO standard. STANAG 2022 reliability codes (A–F for source, 1–6 for information precision) — NATO intelligence evaluation framework.
Operational estimates — not validated by FSG-A in the field. Spatial clustering thresholds (200 m for deduplication, 100 m for fusion, 60 s time window) are FSG-A design choices, not calibrated on real drone data. The "3–5 vehicle column at 0200-0400 UTC" correlation example is illustrative, not actual intelligence. The fusion algorithm runs on synthetic data; it requires validation on real drone traffic before operational use.
External standards and references. Dempster-Shafer theory (Shafer 1976, Dempster 1968). Multi-sensor data fusion principles (Hall & Llinas, 2001). NATO STANAG 4609 motion imagery metadata. NATO STANAG 4545 (imagery formats). NATO STANAG 2022 (intelligence evaluation). NATO APP-6D (military symbology). ArduPilot MAVLink companion computer documentation. Lisa 26 fusion algorithm design (FSG-A internal, 2025). FSG-A has no operational fusion data — algorithm verified on synthetic data.
Threat fusion through Dempster-Shafer theory combines independent observations into higher-confidence assessments. Single-source threat confidence of 70% becomes 91% when fused with a second independent 70% observation. Threat fusion is the mathematical reason brigade-level ISR outperforms platoon-level.
Threat fusion transforms individual drone observations into brigade-level intelligence. Without threat fusion, each platoon sees its own sector in isolation. With threat fusion, patterns emerge across the entire brigade area: the same convoy route used three nights running, the same observation drone appearing before artillery fire. Threat fusion through Dempster-Shafer mathematics provides the confidence levels that justify resource allocation decisions.
Open the interactive Threat Fusion Dashboard →