Integration Contract#
This document defines the production integration surfaces between
ArgusAiTR and the rest of the kill-chain. The 48-hour PoC ships stub
implementations behind these surfaces so the post-award implementation
drops in without rewriting the core. Every stub raises
NotImplementedError with a clear "post-award" message.
Surface 1 — RWS video tap (VideoSource / RTSPSource)#
PoC: FileSource reads a recorded UAS clip from disk.
Production: RTSPSource (stub today) connects to the CROWS HD-SDI
output via a commercial bridge (e.g., AJA / Magewell HD-SDI-to-IP) and
exposes an RTSP / MJPEG stream. The pipeline does not know the difference
— same VideoSource ABC.
class VideoSource(ABC):
def open(self) -> None: ...
def next_frame(self) -> Frame | None: ...
def close(self) -> None: ...
@property
def intrinsics(self) -> dict[str, Any]: ...
@property
def is_open(self) -> bool: ...
Frame contract:
- image: np.ndarray BGR (OpenCV convention).
- timestamp_ns: wall-clock ns at frame arrival.
- meta: at minimum focal_length_px. Recommended additions for
production: width_px, height_px, sensor_type, source_fps,
intrinsics_K (3×3 K matrix if calibrated), gimbal_az_rad,
gimbal_el_rad.
Wiring (production):
Surface 2 — Thermal channel (ThermalSource)#
PoC: Stub. The PoC supports EO only.
Production: Cooled MWIR sensor (FLIR Boson+ / Tau 2 class) plus
optional LWIR for low-cost overcoming-darkness coverage. The thermal
channel is a second VideoSource feeding a fused detector (post-award
upgrade to the detector stage). Time-synchronization is via the shared
wall-clock; spatial alignment via factory calibration of the dual-sensor
boresight on the CROWS turret.
Surface 3 — RWS control (CROWSAdapter)#
PoC: MockCROWSAdapter writes every slew command to
audit/crows_commands.jsonl.
Production: GVAAdapter (stub today) talks to the CROWS control box
over the Generic Vehicle Architecture (GVA) Ethernet bus per STANAG 4754.
class CROWSAdapter(ABC):
def send_slew_command(self, az_rad: float, el_rad: float, rate_rad_s: float = 0.0) -> None: ...
def read_telemetry(self) -> dict[str, Any]: ...
def report_health(self) -> dict[str, Any]: ...
Command semantics (production):
- Azimuth / elevation in gimbal frame (turret-relative), radians.
- Rate in radians per second (max angular rate cap).
- HITL hard gate: no command leaves ArgusAiTR without an operator-
attributed OperatorAction upstream. The audit log makes this
property externally verifiable.
Telemetry semantics (production):
The read_telemetry() payload includes at minimum the current turret
pose (az / el / rate), arming state, and any RWS-side health bits the
operator console needs. ArgusAiTR uses this to compute lead and to
inform the threat heuristic.
Surface 4 — Telemetry out (TelemetrySink / TAK / DDS)#
PoC: JSONFileSink writes the audit and event stream as JSONL.
Production: Multiple sinks composed:
| Sink | What it carries |
|---|---|
JSONFileSink |
Local audit log on the host. Identical to PoC. |
TAKTelemetrySink |
Cursor on Target (CoT) tracks for operator TAK clients (post-award stub). |
DDSSink (new) |
DDS topic for the broader fire-control network (post-award). |
MQTTSink (optional) |
Network bridge per Part 4 telemetry network architecture (post-award). |
The AuditLogger already fans events to multiple sinks; adding new
ones requires no changes to the rest of the system.
Surface 5 — Operator HMI#
PoC: Browser-based operator console served by the Argus host.
Production: Two delivery options, configurable per deployment:
- Co-located web console: the operator runs a browser on a panel PC in the vehicle. Same surface as the PoC.
- Embedded operator panel: Argus packages the HMI as a Qt panel that hosts the same JSON / MJPEG streams under the hood. The TestClient-compatible REST contract makes both delivery options consistent.
In either case, every HMI action is recorded in the audit log via
POST /op/{action} → AuditLogger.operator_action(...).
Surface 6 — Edge-network bridge (Part 4 alignment)#
Argus Part 1 stays out of the Part 4 network design, but the integration contract anticipates it:
- All outbound telemetry is structured JSON or CoT — encryption / transport agnostic.
- Per-sink configuration allows post-quantum encryption + tiered decryption keys to be applied at the sink boundary without changes to the orchestrator.
- TAK compatibility is the immediate stretch target.
Surface 7 — Time sync#
PoC: Host wall-clock (time.time_ns()).
Production: PTP (IEEE 1588) sync on the vehicle bus is standard; ArgusAiTR consumes whatever the GVA bus provides via the bridge. Internally the pipeline uses monotonic deltas for velocity computation and absolute wall-clock for audit timestamps — the two roles are kept separate in the code so a clock-discipline change does not affect tracker behavior.
Failure modes documented to the integrator#
- Loss of source: Pipeline emits
aitr_status=degraded; HMI banner flips. Operator continues with raw video (in the production overlay posture, raw video continues to be served by the bridge). - Adapter rejected command: Adapter
send_slew_commandshould raiseRuntimeError; ArgusAiTR audits the failure and surfaces it via the operator console without retrying autonomously. - AuditLogger sink fails: Caught and logged; pipeline continues.
Document scope#
This contract is normative for ArgusAiTR development through the post-award prototype. It is not a final ICD — that will be drafted jointly with the integrating party (Kongsberg US / NSWC / Army C5ISR) during Month 1.