Roadmap¶
This roadmap tracks bvlos-sim from the current deterministic validation engine toward a broader BVLOS simulation platform.
Current Status¶
The current codebase implements 53 tickets across the deterministic, stochastic, regulatory, and documentation tracks, including all core estimator, feasibility, scenario, SITL, stochastic, output-format, and batch capabilities:
- estimator hardening, static feasibility checks, and scenario runner (Tickets 001–021)
- fidelity v2 trajectory, wind, terrain, resource, link, and Dubins divert (Tickets 030–039)
- SITL adapter contract, ArduPilot adapter, telemetry recording, and comparison reports (Tickets 040–043)
- stochastic state propagation, twin-state EKF observation model, and closed-loop tracking controller (Tickets 047–049)
- real-world data fetch scripts and pre-fetched Alpine demo (Tickets 052–053)
- GeoJSON/KML route exports, community vehicle profiles, and
--format summary(Tickets 055–057) - deliberately infeasible demo, QGC import, batch estimates, and
--format csv(Tickets 059–060) - 3D geofence altitude bounds, wind-corrected divert energy, and stochastic spatial infeasibility tracking (Tickets 061, 062, 065)
--format checklist,--format profile, energy reserve sensitivity, andsize-batterycommand (Tickets 072–075)
The test suite currently passes with 1116 tests and 9 skipped live or environment-dependent tests.
bvlos-sim remains an engineering validation tool. It is not a flight-safety system, operational approval tool, or complete BVLOS compliance system.
Implemented Capabilities¶
Estimator:
- deterministic mission distance and time estimation
- raising and non-raising Python APIs
- structured failures for invalid, unsupported, and infeasible cases
- partial-result handling
- fidelity v1 baseline behavior
- fidelity v2 turn arcs and fixed-wing circular loiter
Static feasibility:
- deterministic phase-based energy model
- deterministic resource-system feasibility for onboard battery, external power, and hybrid power configurations
- deterministic communication-link feasibility for mission and scenario link systems
- reserve-at-landing output
- reserve threshold failures
- static GeoJSON geofence checks with optional AMSL altitude bounds
- static GeoJSON landing-zone reachability checks
Wind and trajectory fidelity:
ConstantWindProviderLayeredWindProviderSpatiotemporalWindProviderwith quadrilinear interpolation (offline wind grid)- optional transit sub-segment wind sampling
- wind-triangle correction for forward-flight transit
- station-keep loiter for hover-capable vehicles
Terrain:
TerrainProviderinterfaceConstantElevationProviderGridTerrainProviderwith bilinear interpolation (offline uniform elevation grid)- terrain-referenced altitude resolution from mission asset file
- structured diagnostics for missing provider and missing coverage
Scenario runner:
scenario.v1input schema- deterministic timeline construction
- observe, lost-link, wind-change, and landing-zone-unavailable events
- assertion outcomes:
passed,failed,skipped,unsupported - lost-link policy outcomes for
rtl,land,loiter, anddivert - computed divert route estimates (
DivertRouteEstimate) ondivertpolicy outcomes: geodesic distance, TAS transit time, cruise-power energy, reserve after divert, and feasibility flag policy_action_eqassertions
Uncertainty modeling:
uncertainty.v1YAML input schema withnormalanduniformdistributions- seeded Monte Carlo sampling over wind, cruise speed, cruise power, and battery capacity
run_monte_carloPython API wrapping the deterministic estimatorsampleCLI command for uncertainty executionuncertainty-report.v1JSON envelope with summary statistics (mean, std, min, p5, p50, p95, max) and deterministic baseline- Markdown rendering for uncertainty reports
Stochastic propagation:
- time-stepped particle propagator with Gaussian process noise
- twin true/estimated particle state via EKF predict/update cycle
- synthetic GPS and battery-meter sensor noise models (
SensorProfile) - proportional cross-track and along-track tracking controller (
ControllerProfile) propagateCLI command andstochastic.v1input schemastochastic-envelope.v1output contract withtimeline,estimation_error_timeline,cross_track_timeline,reserve_at_landing_wh,feasibility_rate, andspatial_infeasible_count(geofence/LZ failures counted separately from energy failures)
Interfaces and contracts:
estimateCLI commandscenarioCLI commandsampleCLI commandpropagateCLI commandsitlCLI command for contract-only SITL evidence bundles- canonical estimator JSON envelope (
estimator-envelope.v7) - canonical scenario JSON envelope (
scenario-report.v2) - canonical uncertainty JSON envelope (
uncertainty-report.v1) - canonical stochastic propagation envelope (
stochastic-envelope.v1) - canonical SITL evidence bundle (
sitl-evidence.v1) - canonical SITL comparison report (
sitl-comparison.v1) - ArduPilot SITL telemetry artifact recorder for completed evidence bundles
- SITL comparison report JSON and Markdown rendering through
compareand adapter APIs - Markdown rendering for estimator, scenario, and uncertainty reports
- one-line summary rendering for estimator, scenario, uncertainty, and stochastic reports
- GeoJSON and KML route export with per-leg energy-margin colouring, landing-zone reachability markers, and geofence conflict flags
- community vehicle profiles in
examples/vehicles/community/for DJI Matrice 300 RTK, Wingtra One Gen II, QS Trinity F90+, Autel EVO Max 4T, and generic survey hexacopter fetch_wind.py(Open-Meteo archive/forecast),fetch_terrain.py(SRTM viasrtm.py), andfetch_landing_zones.py(Overpass API) scripts with pre-fetched Alpine demo inexamples/real_world/- golden fixture regression tests
Known Limitations¶
Estimator limitations:
- no known path-planning model gaps remaining after Ticket 044
Scenario limitations:
- no known scenario path-planning model gaps remaining after Ticket 044
Platform limitations:
- ArduPilot SITL connect/upload, telemetry evidence, and comparison reporting are implemented through Tickets 041-043
- no PX4 SITL adapter yet; Tickets 045 (launch/upload) and 046 (telemetry/evidence)
- no REST API; Ticket 050
- no web UI; Ticket 050
- no reference inputs for calibration and import; Ticket 054
- no NOTAM/live airspace integration; Ticket 058
- no live comms, UTM/U-space, Remote ID, or traffic integrations; Tickets 070 and 071
- no real-world calibration pipeline; Tickets 080-084
Phase Plan¶
Phase 1: Estimator Hardening¶
Status: implemented.
Delivered:
- estimator CLI
- canonical result envelope
- stable exit codes
- schema/versioning policy
- golden fixtures
- package boundary cleanup
- structured error-envelope behavior
Exit criterion: estimator runs from CLI with deterministic versioned output.
Phase 2: Static Feasibility Layer¶
Status: implemented.
Delivered:
- deterministic energy feasibility
- reserve-at-landing checks
- geofence loading and route conflict checks with optional altitude bounds
- landing-zone loading and reachability checks
- structured diagnostics for feasibility failures
Exit criterion: missions can be accepted or rejected by deterministic static feasibility checks with machine-readable diagnostics.
Phase 3: Scenario Runner and Contingency Policies¶
Status: implemented.
Delivered:
- scenario schema
- deterministic scenario runner
- timeline model
- event outcomes
- assertion outcomes
- scenario JSON and Markdown reports
- lost-link policy outcome model
- policy action assertions
- dynamic
wind_changeevent injection
Exit criterion: repeatable scenario execution and machine-readable assertion outcomes.
Phase 4: Wind and Trajectory Fidelity v2¶
Status: implemented.
Delivered:
- layered wind provider
- sub-segment wind sampling
- fidelity mode selection
- turn-arc legs
- fixed-wing circular loiter
- metadata showing the fidelity mode used
Exit criterion: improved fidelity modes are available without breaking v1 contracts.
Phase 4.5: Environmental Model Extensions¶
Status: implemented.
Delivered:
- Ticket 032: terrain-referenced altitude execution
- Ticket 033: continuous spatiotemporal wind grid
- mission YAML asset integration for terrain and wind-grid files
- terrain and wind examples
- CLI, envelope, Markdown, and fixture coverage
Exit criterion: terrain and wind-grid inputs can be used through the same
mission YAML and estimate command path as existing deterministic features.
Phase 4.6: Resource and Link Feasibility¶
Status: implemented.
Scope:
- Ticket 034: resource and link feasibility abstractions — implemented
- generalized resource systems for onboard battery, external/tethered or optical-fiber power, hybrid power, and future resource-type extension points
- generalized communication link systems for direct, mesh, cellular, satellite, Starlink-class, and hybrid failover architectures
- integration with mission YAML, vehicle YAML, scenario YAML, existing feasibility reports, scenario assertions, and later live adapter replay artifacts
Exit criterion: energy/resource and communication-link feasibility can be modeled through shared deterministic abstractions instead of one-off battery-only or lost-link-only fields.
Phase 4.7: Scenario Contingency Model Gaps¶
Status: implemented.
Scope:
- Ticket 035: dynamic landing-zone availability — implemented
- Ticket 036: computed divert routing — implemented
- integration with scenario YAML, mission assets, terrain, wind, geofences, landing zones, resource systems, link systems, and existing scenario reports
Exit criterion: contingency outcomes can use the same configured environment and feasibility features as baseline mission estimation.
Phase 4.8: Uncertainty Modeling¶
Status: implemented.
Scope:
- Ticket 037: Monte Carlo uncertainty modeling — implemented
uncertainty.v1YAML-configured uncertainty inputs- explicit opt-in
sampleCLI command uncertainty-report.v1JSON envelope and Markdown rendering preserving deterministic baseline output
Exit criterion: uncertainty analysis composes with existing mission, vehicle, terrain, wind, geofence, landing-zone, resource, link, energy, and scenario behavior without changing deterministic defaults.
Phase 4.9: Bank-Angle Model and Dubins Path Optimization¶
Status: implemented.
Scope:
- Ticket 038: bank-angle model and Dubins path optimization
Delivered:
estimator.math.dubinsDubins path-to-point solver (RS and LS path types)- divert route estimates use Dubins path distance (bank-angle-constrained arc +
straight) when entry heading and
vehicle.performance.turn_radius_mare available; falls back to straight-line geodesic otherwise - fidelity v2 turn arc confirmed as the exact Dubins solution for a
same-position heading change (
turn_radius_m * |Δθ|); no change to v2 math - entry heading extracted from the last completed leg's
ground_track_degat the action timeline index
Exit criterion: horizontal path planning accounts for bank-angle constraints and heading continuity across transit, turn, and divert segments without changing fidelity v1 behavior or existing public result field names.
Phase 4.10: Path-Planning Model Gaps¶
Status: implemented.
Scope:
- Ticket 039: path-planning model gaps
Delivered:
- fidelity v2 transit legs adjacent to TURN_ARC legs subtract the
tangent-point offset (
turn_radius_m * tan(|Δθ|/2)) frompath_distance_m; offsets clamped to zero; total path distance now matches the true Dubins-path length through all waypoints - takeoff and landing-transit legs report
path_distance_m = vertical_distance_m(3D slant path for purely vertical legs) in all fidelity modes DUBINS_DIVERT_PLANAR_APPROXIMATION_LIMITwarning added as an interim diagnostic before Ticket 044 retired the warning emission
Exit criterion: fidelity v2 total path distance equals the sum of offset-adjusted transit legs plus turn arc lengths; takeoff and land legs report correct 3D slant path distance.
Phase 4.11: Geodesic Dubins Divert Path¶
Status: implemented.
Scope:
- Ticket 044: geodesic Dubins divert path
- replaced the single-point planar Dubins target projection with geodesic-aware target geometry boundary sampling
- retired the
DUBINS_DIVERT_PLANAR_APPROXIMATION_LIMITwarning emission
Exit criterion: divert distance is accurate within 0.5 % of the true Dubins path length on the WGS-84 ellipsoid for routes up to 500 km; the planar limit warning is no longer emitted for correctly handled distances.
Phase 5: SITL Integration¶
Status: partially implemented.
Prerequisites:
- Ticket 034: Resource and Link Feasibility Abstractions — implemented
- Ticket 035: Dynamic Landing-Zone Availability — implemented
- Ticket 036: Computed Divert Routing — implemented
- Ticket 037: Monte Carlo Uncertainty Modeling — implemented
Scope:
- Ticket 040: SITL adapter contract and evidence schema — implemented
- Ticket 041: ArduPilot SITL launch and mission upload - implemented
- Ticket 042: SITL telemetry recorder and evidence bundle - implemented
- Ticket 043: SITL scenario comparison report - implemented
- Ticket 045: PX4 SITL launch and mission upload
- Ticket 046: PX4 SITL telemetry recorder and evidence bundle
- adapter-local ArduPilot and MAVLink dependencies that stay outside core estimator/scenario execution
- adapter-local PX4 dependencies that stay outside core estimator/scenario execution
- comparison against existing deterministic
scenariooutputs
Exit criterion: a scenario can be executed against supported SITL adapters with recorded evidence and compared against deterministic scenario expectations while preserving the deterministic core execution path.
Phase 4.12: Real-World Data and Developer Experience¶
Status: partially implemented. Done: Tickets 052, 053, 055, 056, and 057. Planned: Tickets 054 and 058.
Scope:
- Ticket 052: real-world data fetch scripts —
fetch_wind.py(Open-Meteo forecast with--departure-time),fetch_terrain.py(SRTM viaelevationpackage),fetch_landing_zones.py(Overpass API); alpine demo example using pre-fetched real assets - Ticket 053: airspace geofence fetch script — implemented with
fetch_geofences.pyvia OpenAIP API key or keyless Overpass fallback; completes the static real-world asset set started in Ticket 052 - Ticket 054: reference inputs for calibration and import design — PX4 ULog
flight logs and QGC
.planfiles committed toreference/with field-mapping design notes feeding Tickets 060 and 080 - Ticket 055: GeoJSON / KML route export — implemented with
--format geojsonand--format kmlonestimateandscenariocommands; legs coloured by energy margin; landing zones and geofence polygons as separate feature layers; opens directly in Google Earth and QGC - Ticket 056: community vehicle profiles — implemented with five manufacturer-derived YAML profiles (DJI Matrice 300 RTK, Wingtra One Gen II, Quantum-Systems Trinity F90+, Autel EVO Max 4T, generic survey hexacopter) with provenance links
- Ticket 057: summary output format — implemented for
estimateandscenariocommands; single-line go/no-go digest with reserve %, flight time, contingency policy action, and first failing check; suitable for shell scripts and pre-flight checklists - Ticket 058: NOTAM and live airspace integration —
fetch_notams.pyvia FAA B4UFly API (US) and EUROCONTROL NOTAM service (Europe); active TFRs and temporary restrictions merged with static geofence output for day-of-flight feasibility checks
Exit criterion: a new user can fetch real terrain, wind, and airspace data for any location in under five minutes, run a geographically realistic estimate, and open the output in a map viewer without writing any code; community vehicle profiles allow immediate use without placeholder values; summary output is suitable for shell-script automation.
Phase 6: Product Surfaces¶
Status: partially implemented.
Scope:
- REST API around estimator and scenario execution
- web map UI for route, phases, warnings, failures, and timeline playback
- consistent JSON and Markdown report outputs
- optional PDF/report export after report contracts stabilize
- shared execution path with
estimateandscenario
Exit criterion: users can run missions and scenarios from UI or API with consistent outputs.
Phase 7: Stochastic State Propagation¶
Status: implemented.
Scope:
- Ticket 047: stochastic state propagation for path-dependent risk —
time-stepped propagator carrying a belief state (position, energy, wind
estimate) forward; Gaussian EKF-style representation; per-step
p_reserve_violation;stochastic.v1input schema;propagateCLI;stochastic-envelope.v1output contract - Ticket 048: closed-loop observation model and twin-state architecture —
separate true state (physics) from estimated state (autopilot EKF belief);
synthetic GPS, battery-meter, and airspeed sensor models; EKF predict/update
cycle; policy decisions made from estimated state;
estimation_error_timelineoutput;SensorProfileadded toVehicleProfile - Ticket 049: stochastic closed-loop control — tracking controller model
(cross-track/along-track error regulator) connecting EKF estimated state back
to true trajectory; path-length excess and energy feedback;
ControllerProfileadded toVehicleProfile;cross_track_timelineoutput - Ticket 050: contingency trigger probability derived from the twin-state and cross-track timeline
- Ticket 051: SITL telemetry replay to condition the belief state retrospectively and validate the controller model against observed tracks
Exit criterion: the simulator can report the probability of reserve violation at any point mid-flight, not only at landing; path-dependent uncertainty accumulates correctly across legs; estimation error feeds back through the autopilot controller into actual trajectory deviation and reserve consumption; the propagation path composes with all existing wind, terrain, and energy models without changing deterministic defaults.
Phase 8: Import, Export, and Batch Workflows¶
Status: partially implemented.
Done: QGroundControl .plan importer (convert) and batch estimates (batch).
Planned: Tickets 054 and 058.
Scope:
- QGroundControl
.planimporter — implemented asbvlos-sim convert - broader mission/action compatibility
- batch-run support — implemented as
bvlos-sim batchwithbatch.v1estimate manifests - performance profiling
- report comparison and diff tooling
- batch manifests referencing existing mission, vehicle, scenario, terrain, wind, geofence, and landing-zone files
Exit criterion: teams can import external plans, run batches, and compare outputs efficiently.
Phase 9: Operational Integration¶
Status: planned.
Scope:
- UTM/U-space integration seams
- live comms, Remote ID, and traffic-observation seams
- operational intent and conformance check interfaces
- schema migration guidance
- reproducibility and evidence standards
Exit criterion: outputs are operationally integrable, reproducible, and governance-ready.
Real-World Validation Track¶
This track is separate from platform surface area. It improves model credibility through observed flight data.
Planned work:
- flight log ingestion (done, Ticket 080)
- trace normalization (done, Ticket 080)
- flight phase segmentation (done, Ticket 081)
- predicted-vs-observed metrics (done, Ticket 082)
- calibration profile fitting (done, Ticket 083)
- holdout validation reports
SITL is not a substitute for real-world validation. SITL checks behavioral consistency; real logs calibrate and validate model assumptions.
Ticket Backlog¶
The detailed execution backlog is in tickets/README.md.