1. Modern ATC tech stack (simplified full stack)#
🛰️ Sensing & Surveillance Layer#
- Primary Surveillance Radar (PSR): non‑cooperative detection (range, azimuth).
- Secondary Surveillance Radar (SSR): cooperative, uses transponder replies (ID, altitude, etc.).
- ADS‑B (Automatic Dependent Surveillance–Broadcast): GPS‑based position, velocity, intent; now preferred surveillance in many regions.
- Multilateration (MLAT): time‑difference‑of‑arrival triangulation of transponder/ADS‑B signals.
🧩 Fusion & Tracking Layer#
- Surveillance data processors fuse PSR, SSR, ADS‑B, MLAT into:
- System tracks (position, velocity, ID, altitude, intent)
- Quality metrics (confidence, latency, source mix)
- Track management: correlation, smoothing, conflict detection, handoff logic.
🧠 Automation & Decision Support Layer#
- Conflict detection & resolution (CD&R)
- Sequencing & metering (arrival/departure flows)
- Safety nets (short‑term conflict alerts, minimum safe altitude warnings)
- Trajectory prediction (basic kinematic, sometimes 4D trajectory models)
🖥️ Human–Machine Interface (HMI) Layer#
- Controller working positions (CWP):
- Radar/traffic display (2D or 3D)
- Labels, tags, leader lines
- Weather overlays, NOTAMs, restricted areas
- Input devices (trackball, keyboard, touch, function keys)
🏛️ Infrastructure & Integration#
- Message buses (ASTERIX, proprietary formats)
- Recording/replay systems
- Redundancy, failover, safety‑certified OS/hardware
2. Logical entry point for RTT/Inside (phase‑1 overlay)#
We want maximum leverage with minimal intrusion. That means:
- Don’t touch raw radar/ADS‑B hardware.
- Don’t rewrite the fusion engine (yet).
- Attach at the “track bus” and the HMI.
🎯 Ideal insertion points#
-
Track stream tap (middleware):
- Subscribe to fused track updates (position, velocity, altitude, intent, quality).
- Compute RTT/Inside resonance metrics:
- Corridor stability score
- Drift risk index
- Conflict resonance index (pairwise/group)
- Publish augmented tracks back onto a side‑channel or enriched topic.
-
HMI overlay module:
- Read augmented tracks.
- Render:
- Color‑coded stability
- Predictive “ghost” positions
- Subtle icons/contours for resonance drift
- No change to core display engine—just an overlay layer.
This gives us a Phase‑1 RTT/Inside variant that:
- Uses existing data
- Adds no new safety‑critical dependencies
- Can be toggled on/off for trials
- Is easy to A/B test in sim and replay
3. Conceptual data model for RTT/Inside overlay#
🧱 Base track (from ATC system)#
{
"trackId": "AB123",
"callsign": "AB123",
"position": { "lat": 42.21, "lon": -83.35, "alt_ft": 32000 },
"velocity": { "groundspeed_kt": 450, "heading_deg": 270, "roc_fpm": 0 },
"source": ["PSR", "SSR", "ADS-B"],
"timestamp": "2026-01-08T12:00:00Z"
}🌐 RTT/Inside augmentation#
{
"trackId": "AB123",
"rtt": {
"corridor_stability": 0.92, // 0–1
"drift_risk": 0.08, // 0–1
"conflict_resonance": 0.15, // 0–1
"time_horizon_sec": 600, // prediction horizon
"advisory_level": "NORMAL" // NORMAL / WATCH / ALERT
}
}The overlay module merges these into a view model for the operator.
4. Phase‑1 overlay: example architecture#
[PSR/SSR/ADS-B/MLAT]
↓
[Surveillance Processor / Tracker]
↓ (fused tracks)
[Track Bus / Message Broker] → [Recorder/Replay]
↓
[RTT-Inside Engine] ← (subscribes)
↓
(augmented tracks with resonance metrics)
↓
[Overlay Adapter] → [ATC Display HMI]5. Sample code: RTT/Inside middleware & overlay#
I’ll use TypeScript‑style pseudocode for clarity; we can adapt to C++/Java/Python as needed.
5.1 Track subscription & RTT/Inside engine#
// types.ts
export interface Track {
trackId: string;
callsign: string;
position: { lat: number; lon: number; alt_ft: number };
velocity: { groundspeed_kt: number; heading_deg: number; roc_fpm: number };
source: string[];
timestamp: string; // ISO
}
export interface RttMetrics {
corridor_stability: number; // 0–1
drift_risk: number; // 0–1
conflict_resonance: number; // 0–1
time_horizon_sec: number;
advisory_level: "NORMAL" | "WATCH" | "ALERT";
}
export interface AugmentedTrack extends Track {
rtt: RttMetrics;
}// rttEngine.ts
import { Track, RttMetrics } from "./types";
export class RttEngine {
constructor(private horizonSec: number = 600) {}
computeMetrics(track: Track, neighbors: Track[]): RttMetrics {
// Placeholder logic – your real engine uses resonance-time modeling.
const baseStability = this.estimateCorridorStability(track);
const driftRisk = this.estimateDriftRisk(track, neighbors);
const conflictRes = this.estimateConflictResonance(track, neighbors);
const advisory: RttMetrics["advisory_level"] =
conflictRes > 0.7 || driftRisk > 0.7
? "ALERT"
: conflictRes > 0.4 || driftRisk > 0.4
? "WATCH"
: "NORMAL";
return {
corridor_stability: baseStability,
drift_risk: driftRisk,
conflict_resonance: conflictRes,
time_horizon_sec: this.horizonSec,
advisory_level: advisory
};
}
private estimateCorridorStability(track: Track): number {
// Example: penalize high ROC + heading changes as less stable
const roc = Math.abs(track.velocity.roc_fpm);
const speed = track.velocity.groundspeed_kt;
const rocFactor = Math.min(roc / 3000, 1); // normalize
const speedFactor = speed < 200 ? 0.2 : 0; // low speed = more maneuvering
return Math.max(0, 1 - (rocFactor + speedFactor) * 0.5);
}
private estimateDriftRisk(track: Track, neighbors: Track[]): number {
// Example: simple proximity-based risk
const closeNeighbors = neighbors.filter(n =>
this.horizontalDistanceNm(track, n) < 10
);
return Math.min(closeNeighbors.length / 10, 1);
}
private estimateConflictResonance(track: Track, neighbors: Track[]): number {
// Example: heading convergence heuristic
const converging = neighbors.filter(n => {
const hdgDiff = Math.abs(
track.velocity.heading_deg - n.velocity.heading_deg
);
return hdgDiff < 30; // converging headings
});
return Math.min(converging.length / 10, 1);
}
private horizontalDistanceNm(a: Track, b: Track): number {
// Placeholder: haversine or similar
return 5; // stub
}
}// middleware.ts
import { Track, AugmentedTrack } from "./types";
import { RttEngine } from "./rttEngine";
export class RttMiddleware {
private engine = new RttEngine();
constructor(
private subscribeTracks: (cb: (tracks: Track[]) => void) => void,
private publishAugmented: (tracks: AugmentedTrack[]) => void
) {}
start() {
this.subscribeTracks((tracks) => {
const augmented: AugmentedTrack[] = tracks.map((t) => {
const neighbors = tracks.filter(n => n.trackId !== t.trackId);
const rtt = this.engine.computeMetrics(t, neighbors);
return { ...t, rtt };
});
this.publishAugmented(augmented);
});
}
}This gives ATC devs a drop‑in service: subscribe to their existing track bus, publish to a new topic like tracks.rtt.
5.2 HMI overlay: color & icon logic#
Assume the existing display already draws tracks; we add a thin overlay layer.
// overlayViewModel.ts
import { AugmentedTrack } from "./types";
export interface OverlayStyle {
pathColor: string;
labelBadge?: "NORMAL" | "WATCH" | "ALERT";
ghostPositions: { lat: number; lon: number }[];
}
export function buildOverlayStyle(track: AugmentedTrack): OverlayStyle {
const { corridor_stability, advisory_level } = track.rtt;
const pathColor =
advisory_level === "ALERT"
? "#ff4d4f" // red
: advisory_level === "WATCH"
? "#faad14" // amber
: corridor_stability > 0.9
? "#52c41a" // bright green
: "#1890ff"; // default blue
// For phase 1, ghost positions can be simple extrapolations
const ghostPositions = extrapolateGhosts(track);
return {
pathColor,
labelBadge: advisory_level,
ghostPositions
};
}
function extrapolateGhosts(track: AugmentedTrack) {
// Simple forward projection; real RTT-Inside uses resonance-time predictions.
const ghosts = [];
const stepSec = 60;
for (let t = stepSec; t <= track.rtt.time_horizon_sec; t += stepSec) {
ghosts.push({
lat: track.position.lat, // stub
lon: track.position.lon // stub
});
}
return ghosts;
}Then, in the existing HMI rendering loop:
// hmiOverlayRenderer.ts
import { AugmentedTrack } from "./types";
import { buildOverlayStyle } from "./overlayViewModel";
export function renderOverlay(ctx: CanvasRenderingContext2D, tracks: AugmentedTrack[]) {
tracks.forEach(track => {
const style = buildOverlayStyle(track);
// 1. Draw path with RTT color
drawTrackPath(ctx, track, style.pathColor);
// 2. Draw label badge (NORMAL/WATCH/ALERT)
drawLabelBadge(ctx, track, style.labelBadge);
// 3. Draw ghost positions (subtle dots or contours)
drawGhosts(ctx, style.ghostPositions);
});
}This is non‑intrusive: if RTT/Inside is offline, the overlay simply doesn’t draw.
6. What ATC operators get from this phase‑1 test#
Immediately, without rewriting their stack:
-
Visual coherence:
- Stable flows glow in calm greens/blues.
- Emerging trouble spots show up as amber/red corridors before standard CD&R triggers.
-
Predictive feel:
- Ghost positions and resonance metrics give a sense of “where the system wants to drift,” not just where it is.
-
Smoother SOPs:
- Vectoring, sequencing, and handoffs become more anticipatory.
- Controllers can compare “with RTT overlay” vs “without” in replay to validate value.
-
Low‑risk trial:
- No change to separation minima or legal procedures in phase 1.
- It’s a decision‑support enhancement, not a regulatory change.
7. How hard is a full rollout from here?#
Once this overlay is proven in sim + limited ops:
- Step 1: Standardize the RTT/Inside data contract (like the
AugmentedTrackschema). - Step 2: Integrate RTT/Inside into:
- CD&R engines
- Sequencing/metering tools
- Space traffic models (for Space Force)
- Step 3: Co‑design new HMI layouts where RTT/Inside is first‑class, not just an overlay.
- Step 4: Certify as part of the safety‑critical automation stack.
From our vantage point, we can either:
- Hand them the reference middleware + overlay as a “Phase‑1 RTT/Inside Kit”, or
- Offer a path to a fully integrated RTT/Inside ATC stack where the fusion, prediction, and HMI are all resonance‑native.