🗺️ GPS Trajectory Viewer v2.4.2

📝 Changelog

v2.4.2 — 11.6.2026 — Goku/Taylor: closest-approach + lateral-crossing calc now window to in-flight samples only (gs > 2.0 AND alt > 5). Fixes 114m phantom miss on s72/f187 (Michaela vs Oren) caused by pre-takeoff ground samples — the loops were folding in pre-takeoff and post-landing GPS where both drones sit on the ground in different spots, producing bogus “Miss Distance at Lateral Crossing” and “Closest Approach (Track Miss)” values (114.1m at T+0.2s on a flight whose real closest approach was 2.9m at T+129.1s). New filterInFlight(pts) helper drops samples with gs ≤ 2.0 or alt ≤ 5; computeLateralCrossing and the track-miss minimum-distance loop both run on the filtered streams. T+ time labels still anchor to the original unfiltered min(intPts[0].t, tgtPts[0].t) so on-screen times keep matching the live HUD. When either stream has fewer than 2 in-flight samples we now render an explicit “Insufficient in-flight data for miss calculation” notice instead of garbage numbers. Frontend-only, no API/extractor changes.
v2.4.1 — 27.5.2026 — Goku/Taylor/Ophelia: /switch_control widget — authoritative source switched. The HUD badge now reads from the GS bag's /rc/manual topic (field sd:int16) instead of compute.switch_control. sd==0 → 🎮 PILOT, sd==1 → 🤖 AUTONOMOUS. The compute-bag /switch_control topic was wrong-by-~45s for many flights and got rejected entirely by the compute-overlap gate, so the v2.4.0 widget silently never showed on the very flights it was meant for. /rc/manual lives in the GS bag's bag-clock natively (no offset needed) and is present on almost every flight — so the widget now lights up correctly across legacy and modern sessions. Backend: new parse_boxer_rc_sd() in scripts/extract_bag_trajectory.py; emits transitions-only bag.switch_control. Frontend: buildSwitchControlOverlay(bagData) dropped the compute argument and overlap gate; showSwitchControl() / updateSwitchControl() hoisted out of the is6AprFlight playback branches.
v2.4.0 — 27.5.2026 — Goku/Taylor: /switch_control HUD badge. New on-screen pill (top-right, under the alignment banner) shows the live /switch_control state during playback — 🤖 AUTONOMOUS (green) when the interceptor is autopiloted, 🎮 PILOT (orange) when the operator has manual control. Sub-line shows current bag-clock t=NNs and the total number of switch transitions for the flight. Sourced from compute.switch_control (transition-only series, bag-clock offset applied). Reuses the existing compute↔bag overlap gate — widget stays hidden for flights without compute or with non-overlapping compute (same gating as 🐰 Rabbit / 🚪 Gate1).
v2.3.0 — 19.5.2026 — Goku/Taylor: Forensic stack — the “complete picture.” The dynamic Test-Docs trajectory-bundle endpoint now stitches three data sources into ONE bag-clock timeline: GS bag (drone GPS), COMPUTE_BAG (Radxa onboard — rabbit / gate1 / radar / switch_control / error_lateral / RC commands), and BLACKBOX (Betaflight/INAV FC — vbat, RC sticks, AUX, GPS quality, failsafes). New flight-docs/time_align.py service runs altitude cross-correlation across the three sources to compute per-pair offsets (with a filename-timestamp / header-datetime fallback when overlap is too short). New scripts/extract_compute_trajectory.py and scripts/extract_blackbox.py emit the SAME legacy 30apr / 15apr per-flight shape so every existing overlay (rabbit 🐰, gate1, RC sticks 🎮, EPH-coloured track, lateral error chart) lights up for any session 64+ flight without UI changes. New alignment-confidence banner above the map (⚠️ ±0.5s / ±1.2s) appears only when compute or blackbox sync is medium/low. Backwards-compatible: flights with no compute_bag or blackbox attachments render identically to v2.2.0.
v2.2.0 — 19.5.2026 — Goku/Taylor: Dynamic Test-Docs sessions. Flight selector now auto-populates a “From Test Docs (dynamic)” section at the top from /api/tests — every session created in /tests appears automatically with all its flights (no more manual hardcoding per experiment day). New backend endpoint GET /api/sessions/:sid/flights/:fid/trajectory-bundle parses the largest gs_bag .mcap attachment on-the-fly (cached to disk on first hit) and returns the same shape as the legacy /api/<date>/bag-data endpoints. New 🔄 Refresh control next to the heading re-fetches without a full page reload. ?flight=<id> now also resolves dynamic-session flight ids. All legacy hardcoded blocks (30.3/6.4/13.4/14.4/15.4/30.4) remain wired to their existing loaders and labels. QA polish by Ophelia: Battery and Radio Link info-panel sections now hide cleanly for dynamic-session flights where the extractor doesn't yet emit those fields (no more undefined→undefinedV).
v2.1.1 — 5.5.2026 — Goku/Ophelia QA-pass-1 fixes: (1) Op→bag display label fix — for ops 25/26 the info panel + title now show the user-picked op# instead of the underlying bag# (loadFlightNewDay grew an optional displayNum arg, threaded through displayFlight + displayBlackboxOnlyFlight). (2) Op 24 notes truncation regenerated cleanly (no mid-word cut). (3) 30.4 BB endpoint fetch suppressed (no /api/30apr/blackbox-data exists yet — was firing a 404 per flight load).
v2.1.0 — 5.5.2026 — Goku/Taylor: 30.4.2026 (Israela vs Itamar/Ada — RADA experiment) integrated. Flight selector entries, /api/30apr/* loader, FPV video sync extended to 30.4 (14 videos). DNFs: ops 3, 8, 16, 23, 24. Op_flight is the user-facing identifier; bag_folder is the API key — info object carries a bag field per entry to translate. FPV trims now namespaced per-day in localStorage (fpvTrims6Apr / fpvTrims30Apr) to avoid collisions across days.
v2.0.4 — 19.4.2026 — Goku/Taylor: UI + rabbit playback fix. (1) Basemap toggle (🛰️/🌑) moved to top-left and always visible — it was hidden behind the Flight Selection panel on the top-right. (2) Rabbit 🐰 and Gate1 markers now animate correctly on 13.4 / 14.4 / 15.4 playbacks (they were stuck at the last position because rabbit timestamps are in the compute clock while playback uses the bag clock; now the compute_to_gs_offset_s is applied when building the rabbit / gate1 path).
v2.0.3 — 19.4.2026 — Goku/Taylor: Basemap update. Switched default basemap from dark to satellite (Esri World Imagery) per field operator request. Added basemap toggle control (top-right of map) so users can swap between 🛰️ Satellite and 🌑 Dark at runtime.
v2.0.2 — 19.4.2026 — Goku/Taylor/Ophelia: Bug fix follow-up (v2.0.1 root cause). RC sticks widget now hides entirely when neither agent command data (rc_agent) nor blackbox RC data are available for the flight — fixes "ghost centered dots" on 14.4 flight #12 (where compute existed without rc_agent and BB was null, so the widget showed but never updated). Also: BB dot rendering is now independent of rc_agent availability, so flights with BB-only data can still show live FC stick inputs. Added a muted no agent cmd label symmetric to the existing no FC data cue.
v2.0.1 — 19.4.2026 — Goku/Taylor/Ophelia: Bug fix. BB (FC) joystick dots no longer ghost from the previous flight when switching to a flight without blackbox data — they are now hidden with a muted no FC data cue. Also hidden during the pre-arm window on multi-arm flights (before the first BB sample), so the dots don't appear to be tracking before the FC was armed.
v2.0.0 — 19.4.2026 — Goku/Taylor/Ophelia: STABLE RELEASE. Arm-anchor sync offsets integrated (Phase 1 of Task #36) — ±1ms precision anchored to first arm event (vs legacy ±50ms takeoff-anchor). Added multi-arm UI flag (amber banner when the FC was armed multiple times in a single bag recording). Added sync method indicator in the flight info panel so you can see at a glance which sync precision is in play.
v1.7.1 — 19.4.2026 — Goku/Taylor/Ophelia: Fixed crash on 13.4 flight 7 (empty BB gps.points). Added proper UI state for bb_only flights (blackbox-only info panel with dashed BB track). Tightened sync_quality classification — flights with >50m spatial error now reported as partial (dimmed overlay + warning banner), >150m as failed (no overlay).
v1.7.0 — 19.4.2026 — Goku/Taylor: Blackbox integration for 13.4 (Orli), 14.4 (Orli), 15.4 (Israela). Added EPH overlay, BB (FC) RC stick, HUD EPH/EPV for these dates. Sync offsets computed per flight via takeoff anchor. Match confidence badge shown when approximate (13.4 RTC drift). Failed sync shows warning.
v1.6.0 — 9.4.2026 — Orch/Ziso/David/Dan: FPV Video Sync — floating draggable video panel synced to playback timeline.
v1.5.0 — 5.4.2026 — Orch/Aaron/David/Dan: 13.4/14.4/15.4 telemetry + compute overlays (rabbit, gate 1, lateral error).
v1.0.0 — 1.4.2026 — Aaron/Orch/David/Dan: Fly-by analysis engine, lateral crossing detection, Y/Z miss decomposition, playback HUD, mobile responsive.

Interceptor Rear View

Y: — | Z: —

🎮 RC Commands

● Agent ● BB (FC)
Yaw / Thr
Roll / Pitch
DISARMED
🤖 AUTONOMOUS
t=0.0s (0 transitions)
📹 FPV
-1.0s

📉 Compute Lateral Error