A fusion engine is only as good as the data fed into it, and the data fed into it is almost never clean. A radar reports range in meters and bearing in mils; an AIS receiver reports position in WGS84 decimal degrees and speed in knots; an imagery product carries an acquisition timestamp in local time; a SIGINT intercept carries no geolocation at all. Before any correlation, tracking, or analytics can run, every one of these heterogeneous outputs must be reshaped into a single, consistent internal representation. That reshaping is sensor data normalization, and the single representation it targets is the canonical data model. This article covers how to design the canonical model, build the per-source adapters that map to it, normalize units, coordinates, and time, carry provenance through every record, and evolve the schema over years without breaking the consumers that depend on it.

Why a canonical data model

The naive approach to a multi-sensor system is to let each consumer understand each source format directly. The fusion engine parses radar messages, then AIS messages, then imagery detections, and so on. This works for two or three sources and collapses under the weight of the fourth. Every new sensor type forces a change to the fusion code, the storage layer, the COP renderer, and every analytic that touches the data. The coupling is quadratic: N sources times M consumers.

A canonical data model breaks that coupling. You define one internal schema – a normalized observation – and require that every source be mapped to it before it enters the pipeline. The fusion engine, the track store, and the analytics layer consume only the canonical model and never see a native sensor format. Adding a new sensor means writing one adapter; no downstream component changes. The coupling drops from N times M to N plus M.

The canonical model is not a lowest-common-denominator format. It is a deliberately rich superset: it carries the fields any consumer might need – kinematics, identity, confidence, uncertainty, classification, and provenance – even when a given source populates only a subset of them. A radar contact and a HUMINT report look structurally identical in the canonical model; they differ only in which fields are present and how confident each is.

Anatomy of a normalized observation

A well-designed canonical observation has five field groups, each with a clear purpose.

Identity and type. A globally unique observation ID, an entity-type code drawn from a controlled taxonomy (ground vehicle, surface vessel, aircraft, emitter, dismount), and any source-asserted identity such as a track number, MMSI, or call sign. The type taxonomy must be shared across all sources so that a vessel reported by AIS and a vessel detected by radar map to the same canonical type.

Kinematics. Position in the canonical coordinate frame, velocity and heading in canonical units, and altitude or depth where applicable. Every kinematic field carries an associated uncertainty – a covariance or, at minimum, an error radius – because fusion algorithms cannot weight an observation they cannot bound.

Time. An event time (when the observation occurred), distinct from the ingest time (when the pipeline received it). Event time is the basis for all correlation; ingest time is for diagnostics and latency measurement. Each timestamp carries an uncertainty bound.

Confidence. A normalized confidence score and, separately, the source's own reliability rating. A high-confidence detection from an unreliable source is not the same as a moderate-confidence detection from a trusted one, and the canonical model must keep the two distinguishable.

Provenance. The originating source ID, sensor type, native message ID, the adapter and schema version that produced the record, and the classification and caveats inherited from the source. Provenance is what makes every downstream assertion traceable.

Adapters: where source-specific complexity lives

The adapter is the only place in the system that understands a sensor's native format. It parses the raw message, extracts the relevant fields, performs all conversions, attaches provenance, and emits a canonical observation. Everything strange about a source – its proprietary binary layout, its missing fields, its irregular update cadence, its clock drift – is absorbed inside the adapter and never leaks downstream. This is the same separation-of-concerns discipline that multi-sensor fusion architecture relies on: the fusion core stays generic precisely because the adapters do the dirty work.

Adapters should be small, independently testable, and stateless wherever possible. A stateless adapter that maps one input message to one canonical observation is trivial to unit-test against recorded sample messages. When an adapter must hold state – for example, to interpolate a position between sparse updates, or to apply a rolling clock-offset correction – that state should be explicit and bounded, never an implicit accumulation that drifts over a long mission.

Schema mapping in practice

Schema mapping is the field-by-field translation from a source's native structure to the canonical observation. The hard part is rarely the fields that map one-to-one; it is the mismatches. A source may pack two canonical concepts into one field, or split one canonical concept across several. A source may use an enumeration with no canonical equivalent, requiring a lookup table and a documented default for unrecognized values. A source may omit a field the canonical model treats as mandatory, forcing the adapter to either derive it, flag the observation as partial, or reject it.

The mapping itself should be expressed declaratively where possible – a mapping table or configuration that states "native field X with unit U becomes canonical field Y" – so that the translation is auditable and changes do not require recompiling the engine. Imperative code is reserved for the genuinely complex transformations that a table cannot express. These same heterogeneity problems are at the root of the broader data integration challenges in defense systems, and a disciplined mapping layer is the single most effective mitigation.

Units, coordinates, and time

Three normalization tasks cause more silent, hard-to-diagnose errors than anything else in a fusion pipeline: unit conversion, coordinate transformation, and time alignment. Each produces output that looks plausible while being wrong.

Units. Choose a single canonical unit system – SI is the conventional choice: meters, meters per second, radians or degrees consistently – and convert every incoming value at the adapter boundary. Knots become meters per second; feet become meters; magnetic headings are converted to true using the local magnetic declination. The danger is not the conversion arithmetic, which is trivial, but the unconverted field that slips through because the source's unit was assumed rather than checked. A speed field left in knots and treated as meters per second produces a track moving at roughly twice its real velocity – a track that correlates wrongly and is hard to spot because it is not absurd, merely incorrect.

Coordinates. Sensors report in WGS84 geodetic, MGRS, local tangent-plane grids, or platform-relative frames. All must be transformed to one canonical reference frame before correlation. Use a tested geodesy library rather than hand-rolled trigonometry; a datum mismatch or a sign error in a coordinate transform introduces position errors of tens of meters that are operationally significant and notoriously hard to trace back to their source.

Time. Convert every timestamp to a single authoritative base – GPS-synchronized UTC is the standard – and store it as event time, not arrival time. Legacy sensors with free-running or local clocks require per-source offset-correction tables, and every timestamp must carry an explicit uncertainty bound. Observations whose timestamp uncertainty exceeds a configured threshold should be flagged or rejected before they reach the correlator, because a temporally mislabeled observation associates with the wrong object and corrupts the track it joins.

Key insight: The most damaging normalization failures are not the ones that crash the pipeline – those get fixed immediately. They are the silent ones: an unconverted unit, a coordinate datum mismatch, a timestamp off by a fixed offset. The output is plausible, the system reports healthy, and the fused tracks are quietly wrong. Validate every converted value against physical plausibility ranges at the adapter boundary, and you catch these failures at the one source that produced them instead of debugging a corrupted operational picture.

Provenance: making fused output accountable

When a fused track is presented to a commander, the question that eventually follows is "where did this come from?" If the answer is "the fusion engine asserted it," that is not enough for a system that informs targeting or accreditation decisions. Provenance is the chain of evidence that answers the question properly: this track was built from these three observations, produced by these two sensors, normalized by these adapter versions, at these event times, carrying these classifications.

Provenance must be attached at normalization, not reconstructed later. Every canonical observation carries its source ID, sensor type, native message ID, adapter and schema version, and the classification and caveats of the source. When the fusion engine combines observations into a track, it accumulates their provenance rather than discarding it, so the track's composite classification is the most restrictive of its inputs and its source list is the union of theirs. Need-to-know is then enforced at query time against that composite classification – never at ingestion, because a record's eventual sensitivity depends on what it is later combined with. This is the same accountability discipline that disciplined message-queue defense data pipelines rely on to make every event traceable as it moves between stages.

Evolving the schema without breaking consumers

A canonical model is a long-lived contract. New sensor types arrive, new attributes become relevant, and the model must absorb them without forcing a synchronized redeployment of every consumer in the system. The discipline that makes this possible is additive, versioned change.

Additive means new fields are always optional and defaulted, so a consumer that does not understand a new field simply ignores it. Existing fields are never repurposed and never removed in place – repurposing a field is the single fastest way to silently corrupt a consumer that was not updated. Versioned means every observation is tagged with the schema version under which it was produced, and every consumer declares the minimum schema version it requires. A producer can begin emitting a new optional field the day it is added; consumers adopt it on their own schedule.

When a genuinely breaking change is unavoidable, it is introduced as a new major schema version that runs in parallel with the old one. Producers emit both, or a translation shim downgrades new records to the old shape, until every consumer has migrated; only then is the old version retired. This parallel-running discipline is unglamorous but it is what lets a sensor network grow continuously – the same way a well-designed military IoT sensor network onboards new node types – without ever stopping the pipeline for a coordinated cutover.

Schema versioning also pays off in testing. Because every record carries its version and provenance, a replay capability can ingest recorded raw data, run it through a new adapter or schema version, and compare the canonical output against a known baseline. Adapter changes are validated against real recorded inputs before they ever touch live data, and regressions surface in replay rather than in the field.

Build your canonical model on a proven foundation

Corvus HEAD ingests heterogeneous sensor feeds, normalizes them into a canonical, versioned data model, and carries provenance through to the operational picture – so every fused track is consistent, accountable, and accreditable.

Explore Corvus HEAD → Book a Briefing

This analysis was prepared by Corvus Intelligence engineers who build mission-critical data integration and fusion systems for defense and government organizations. Learn about our team →