02 — Roadmap and milestones¶
Each phase ends in a milestone with a demonstrable, testable exit criterion. A milestone is reached
only when every exit criterion is met on main with green CI, and the maintainer has run the demo
on their machine. Session counts are planning estimates: one task is sized for one working session
of roughly three to four hours; tasks marked ×2 are expected to need two.
| Phase | Milestone | Exit criteria | Tasks | Sessions |
|---|---|---|---|---|
| 0 Foundations | M0 Hello, CI | Repo public on GitHub with licence, ADRs, standards. Docker, ROS 2 Jazzy and Gazebo Harmonic images build in CI and run headless locally. Pre-commit and CI gates enforced. Docs site deployed. | P0-T01 … P0-T07 | 8 |
| 1 Vertical slice | M1 First scenario passes | A differential-drive UGV runs real Nav2 in its own container, navigates to a goal in a Gazebo world, scenario runner records MCAP and reports PASS. Same scenario runs headless in CI. | P1-T01 … P1-T07 | 8 |
| 2 Scenario engine | M2 Fleet, faults, two clocks | Three UGVs with namespaces and resource budgets. Network degradation and events from the timeline. Sim-time and real-time-locked modes. Parameter sweep produces a JUnit report. Field MCAP replays into the stack. External repo onboards through a manifest. | P2-T01 … P2-T08 | 10 |
| 3 Cockpit | M3 Watch and steer in the browser | Cockpit shows the 3D twin, sensors, fleet telemetry, injects events, scrubs a replay, and displays assertion status live. E2E tests in CI. | P3-T01 … P3-T07 | 9 |
| 4 Drones | M4 Mission under wind and GPS loss | Quadrotor on PX4 and on ArduPilot flies a waypoint mission from a MAVSDK companion node, survives a wind gust, executes failsafe on GPS denial, assertions verify RTL. | P4-T01 … P4-T05 | 6 |
| 5 USVs | M5 Station-keeping in sea state 3 | Catamaran USV holds station and docks in a harbour world with waves, wind and current; marine KPIs reported; cockpit renders sea surface and nautical overlays. | P5-T01 … P5-T05 | 6 |
| 6 Fidelity | M6 Same binary, same timing, same radio | ARM64 image of a vehicle runs under QEMU with a Pi-class compute budget; IMU/GPS noise calibrated from a field log; real flight controller runs HIL; ROS 1 stack bridged; sim-vs-field divergence report produced. | P6-T01 … P6-T06 | 8 |
| 7 Product | M7 v1.0 | Scenario library, world editor, run dashboard with trends, plugin SDK with versioned API, cockpit auth, signed images, tutorials. Tagged v1.0.0. |
P7-T01 … P7-T06 | 7 |
| 51 tasks | 62 |
Phase dependencies¶
P0 ─▶ P1 ─▶ P2 ─┬─▶ P3 (cockpit) ─────────────┐
├─▶ P4 (drones) ──┐ │
│ ├─▶ P6 ─────┼─▶ P7
└─▶ P5 (USV) ─────┘ │
│
P3 is independent of P4/P5 and can interleave with them. ┘
P4 and P5 only need P2. P3 only needs P2. After M2 the maintainer may reorder P3, P4 and P5 to match their priorities (for example, drones before cockpit if a drone team is waiting).
Milestone demos¶
- M0:
make upstarts the sim container,gz topic -llists topics, CI badge green. - M1:
fieldproof run examples/ugv_nav_to_goal.yamlends withPASSand a report; opening the MCAP in Foxglove Studio shows the robot path. - M2:
fieldproof matrix examples/ugv_fleet_sweep.yamlruns 3 robots × 4 loss profiles and produces JUnit consumed by CI; one run uses real-time lock and reports zero drift. - M3:
fieldproof cockpitopens the browser; inject an obstacle mid-run and watch Nav2 replan. - M4:
fieldproof run examples/uav_mission_gps_denied.yaml --autopilot px4and--autopilot ardupilotboth PASS. - M5:
fieldproof run examples/usv_station_keeping_ss3.yamlPASS with position error KPI. - M6: same UGV scenario at
--tier targeton an ARM64 image; divergence report vs field log. - M7: fresh clone to first scenario in under 15 minutes following the tutorial.
Risks and mitigations¶
| Risk | Impact | Mitigation |
|---|---|---|
| Gazebo Harmonic rendering on AMD Mesa inside containers is flaky | Camera sensors unusable | Validate in P0-T03 with /dev/dri; software rendering fallback; GPU-less sensor set for CI |
| VRX plugins lag behind Harmonic | USV phase slips | Pin to the VRX release targeting Harmonic; budget P5-T01 ×2 |
| PX4/ArduPilot Gazebo glue changes between versions | Drone phase churn | Pin autopilot versions; contract tests on MAVLink/uXRCE topics |
| Real-time lock impossible with heavy worlds on 16 threads | T2 scenarios cannot run | Report RTF honestly; reduce sensor rates; multi-machine in Phase 7 |
| QEMU ARM64 too slow for perception nodes | T2 limited | Document limits; per-node tier mixing (perception SIL, control emulated) |
| Scope creep in the cockpit | Delays fidelity work | Cockpit MVP list in P3 is fixed; extras go to Phase 7 |
| Disk space (88 GB free) | Image builds fail | Prune policy in Makefile; CI builds in GHCR not locally |