Estimator Field Semantics¶
This document describes which input fields affect current estimator behavior and which fields are accepted for compatibility but not yet consumed by runtime logic.
The default estimator mode is fidelity v1. Fidelity v2 is opt-in and adds turn-arc dynamics, fixed-wing circular loiter, and compatibility with sub-segment wind sampling.
Mission Fields Used At Runtime¶
Top-level mission fields:
vehicle_profile: checked againstvehicle.vehicle_iddeparture_time: UTC departure timestamp used to evaluate time-windowed geofencesplanned_home: used as the initial state and RTL targetdefaults.cruise_speed_mps: fallback cruise speeddefaults.altitude_reference: default altitude frame for route itemsconstraints.min_landing_reserve_percent: mission reserve overrideconstraints.min_distance_to_landing_zone_m: maximum landing-zone distanceconstraints.min_obstacle_clearance_m: horizontal and vertical separation buffer around configured obstaclesconstraints.min_terrain_clearance_m: minimum sampled terrain clearance when a terrain provider is configuredassets.geofences_file: static geofence file loaded by the CLI (floor_m/ceiling_mfeature properties are operative when present)assets.landing_zones_file: static landing-zone file loaded by the CLIassets.terrain_file: offline elevation grid file loaded by the CLI for terrain-referenced altitude resolutionassets.population_grid_file: offline population-density grid loaded by the CLI for SORA ground-risk pre-assessmentassets.obstacles_file: static obstacle GeoJSON loaded by the CLI for vertical clearance checksassets.wind_grid_file: offline spatiotemporal wind grid file loaded by the CLI as a 4D wind providerestimation: persisted estimator settingslink_systems: deterministic communication-link systems
Route item fields:
route[].id: stable provenance in reports and timeline outputroute[].action: route action dispatchroute[].latroute[].lonroute[].altitude_mroute[].altitude_referenceroute[].loiter_time_s
Mission estimation fields:
estimation.wind_east_mpsestimation.wind_north_mpsestimation.wind_layersestimation.min_groundspeed_mpsestimation.max_segment_length_mestimation.fidelity
Mission link-system fields:
link_systems[].link_idlink_systems[].kindlink_systems[].requiredlink_systems[].prioritylink_systems[].availabilitylink_systems[].max_range_m
Vehicle Fields Used At Runtime¶
Identity and class:
vehicle_idvehicle_classcharacteristic_dimension_m: maximum span or rotor-tip diameter used withassets.population_grid_fileto compute intrinsic Ground Risk Classcapabilities.hovercapabilities.forward_flight
Performance:
performance.cruise_speed_mpsperformance.hover_speed_mpsperformance.max_speed_mpsperformance.climb_rate_mpsperformance.descent_rate_mpsperformance.turn_radius_mperformance.max_crab_angle_degperformance.max_station_keep_wind_mps
Energy:
energy.battery_capacity_whenergy.reserve_percent_defaultenergy.cruise_power_wenergy.hover_power_wenergy.climb_power_wenergy.descent_power_wenergy.reference_mass_kgenergy.reference_density_kgm3energy.induced_power_mass_exponentenergy.usable_capacity_curve
Mass:
mass.operating_mass_kg
Resource systems:
resource_systems[].resource_idresource_systems[].kindresource_systems[].priorityresource_systems[].battery_capacity_whresource_systems[].reserve_percentresource_systems[].continuous_power_wresource_systems[].max_route_distance_mresource_systems[].max_route_time_sresource_systems[].max_tether_length_m
Scenario Fields Used At Runtime¶
Scenario files are consumed by the scenario CLI and runner:
schema_versionscenario_idmission_filevehicle_fileinitial_conditionseventsassertions
Initial conditions:
initial_conditions.wind_east_mpsinitial_conditions.wind_north_mpsinitial_conditions.wind_layersinitial_conditions.min_groundspeed_mpsinitial_conditions.max_segment_length_minitial_conditions.fidelityinitial_conditions.lost_link_policyinitial_conditions.lost_link_policy.loiter_sinitial_conditions.lost_link_policy.actioninitial_conditions.lost_link_policy.divert_target_idinitial_conditions.link_systemsinitial_conditions.link_systems[].link_idinitial_conditions.link_systems[].kindinitial_conditions.link_systems[].requiredinitial_conditions.link_systems[].priorityinitial_conditions.link_systems[].availabilityinitial_conditions.link_systems[].max_range_m
Events:
events[].event_idevents[].kindevents[].triggerevents[].trigger_route_item_idevents[].trigger_elapsed_time_sevents[].wind_east_mpsevents[].wind_north_mpsevents[].wind_layersevents[].unavailable_zone_idsevents[].policyonlost_linkevents
Assertions:
assertions[].assertion_idassertions[].kindassertions[].field_pathassertions[].expectedassertions[].event_id
Supported resource/link assertion field paths:
estimate.resource.is_feasibleestimate.link.is_feasibleestimate.obstacle.is_feasible
Accepted But Non-Operative Fields¶
Mission:
mission_iddefaults.hover_speed_mpsconstraints.max_wind_mpsassets.comms_coverage_filepolicy.lost_link_policylink_systems[].coverage_asset_reflink_systems[].metadatametadataroute[].acceptance_radius_mroute[].loiter_radius_mroute[].metadata
Vehicle:
display_namemav_typeautopilotmass.empty_kgmass.max_payload_kgmass.max_takeoff_kgperformance.max_wind_mpsresource_systems[].deliveryresource_systems[].metadatafailsafe.*sitl.*(ignored by the deterministic estimator; thesitlCLI may copy these fields intositl-evidence.v1simulator metadata)metadata
Scenario:
descriptioninitial_conditions.link_systems[].coverage_asset_refinitial_conditions.link_systems[].metadataevents[].descriptionassertions[].descriptionmetadata
Non-operative fields are accepted for schema stability, interoperability, and future simulator phases. They must not be treated as enforced behavior unless this document and the implementation are updated together.
Wind Semantics¶
Constant wind:
wind_east_mpsis positive toward east.wind_north_mpsis positive toward north.- Constant wind applies when no layered wind provider is configured.
Layered wind:
wind_layersconfigures an altitude-bandedLayeredWindProvider.- Each layer defines a lower altitude bound and a constant EN wind vector.
- The highest layer not exceeding the query altitude is used.
- Queries below all configured layers use the lowest layer.
wind_layerssupersedes scalar wind fields.- Scalar wind fields may coexist with
wind_layers; they are ignored while layers are present.
Scenario wind changes:
wind_changeevents require eitherwind_east_mpspluswind_north_mps, or a non-emptywind_layerslist.- Wind-change payloads are only valid on
wind_changeevents. - When a wind-change event fires, its wind provider applies from the resolved timeline elapsed time onward.
- Multiple wind changes are applied in event order; later events at the same elapsed time supersede earlier ones.
- Route-item wind-change triggers are resolved deterministically against the scenario timeline and re-estimated until the schedule is stable.
Runtime precedence:
- Runtime
EstimationOptionstake precedence over missionestimation. - CLI
--wind-layerprovides an explicitLayeredWindProvider. - Scenario
initial_conditionsoverride missionestimationfor scenario runs. - The
scenarioCLI loads mission asset wind grids when the scenario leaves initial wind unset. Explicit scenario scalar wind orwind_layerstake precedence over the mission wind-grid asset. - If runtime options are used while mission
wind_layersare present and no explicit wind provider is supplied, result metadata recordsmission_wind_layers_ignored=true.
Fidelity Semantics¶
Fidelity v1:
- default mode
- geodesic leg-to-leg transit
- no turn dynamics
- station-keep loiter for hover-capable vehicles
- fixed-wing
loiter_timeis unsupported
Fidelity v2:
- opt-in through Python API, CLI, mission YAML, or scenario YAML
- injects
TURN_ARClegs at waypoint heading changes of at least 1 degree - turn arc path distance is
turn_radius_m * abs(delta_heading_rad), which is the exact Dubins solution for a same-position heading change; the arc has zero net displacement - subtracts the tangent-point offset (
turn_radius_m * tan(|Δθ|/2)) frompath_distance_mof both transit legs adjacent to each turn arc; offsets are clamped to zero so no leg reports a negative path distance - total path distance in fidelity v2 equals the sum of trimmed transit-leg distances plus all turn-arc lengths, which matches the true Dubins-path length through the waypoints
- fixed-wing
loiter_timeis modeled as circular loiter - hover-capable vehicles continue to use station-keep loiter
Vertical legs (takeoff and landing-transit) in all fidelity modes:
path_distance_mequalsvertical_distance_m(the 3D slant path distance for a purely vertical leg with zero horizontal displacement)
Result metadata field estimator_version records the actual fidelity used:
"v1" or "v2".
Energy Semantics¶
- Energy is evaluated after route kinematics are expanded.
- Mission reserve override comes from
constraints.min_landing_reserve_percent. - Vehicle default reserve comes from
energy.reserve_percent_default. climb_power_wanddescent_power_wfall back tocruise_power_wwhen omitted.hover_power_wis required for hover-capable loiter dwell.- Fixed-wing circular loiter in fidelity v2 uses
cruise_power_w. - When
mass.operating_mass_kgandenergy.reference_mass_kgare both set, hover and climb power scale by(operating_mass_kg / reference_mass_kg) ^ induced_power_mass_exponent. Cruise, turn-arc, fixed-wing loiter, RTL transit, and descent power use the same mass ratio with a milder0.5exponent. - When
energy.reference_density_kgm3is set, phase power is multiplied byreference_density_kgm3 / ISA_density(leg_midpoint_altitude_amsl_m), so lower-density high-altitude air increases estimated power. The density model is deterministic ISA troposphere logic and performs no live weather lookup. energy.usable_capacity_curvemaps state of charge to usable-capacity fraction. Estimator v1 applies the full-charge usable fraction as a capacity derating toresult.energy.usable_energy_wh; the reserve threshold remains based on nominalbattery_capacity_wh.- These mass, density, and SoC scalings are physically motivated closed-form adjustments. They are not a substitute for vehicle-specific log calibration.
- Return-to-home reserve is evaluated at each route leg endpoint against
mission.planned_home. Distance is straight-line geodesic; energy uses cruise TAS and the same mass/density-adjusted cruise power as route legs. result.energy.rth_reserve_timeline[].reserve_margin_whisenergy_remaining_before_rth_wh - rth_energy_wh - reserve_threshold_wh.result.rth_is_feasibleisTrueonly when every RTH timeline point has a non-negative reserve margin. It is informational and does not by itself make the estimate status infeasible.- Energy infeasibility does not make distance/time totals partial.
- When
vehicle.resource_systemsis configured,result.energyremains the legacy battery-only energy view and may reportis_feasible=falsewhileresult.resource.is_feasible=true. In that case resource feasibility, not legacy battery capacity, determines mission resource feasibility.
Resource Semantics¶
- Resource systems are configured on
vehicle.resource_systems. - When
resource_systemsis omitted, the estimator preserves legacy battery-only behavior fromvehicle.energyandresult.resourceisnull. - When
resource_systemsis present, each configured system is evaluated after route kinematics and phase-power demand are computed. - The mission is resource-feasible when at least one configured resource system
is feasible. The selected system is the feasible system with the lowest
priority, then lexicographically lowestresource_id. onboard_batteryusesbattery_capacity_whandreserve_percentwhen set; otherwise it uses the legacyvehicle.energycapacity and mission/vehicle reserve threshold.external_powerusescontinuous_power_was an effectively continuous supply and enforcesmax_route_distance_m,max_route_time_s, andmax_tether_length_mwhen set.hybridusescontinuous_power_wfirst and charges only residual per-leg power demand above that supply against the onboard battery capacity.fuel,hydrogen, andotherare accepted extension points but currently produce an unsupported resource-feasibility diagnostic when configured.max_tether_length_mis checked against the maximum horizontal distance from planned home observed at route leg start and end states.- Resource infeasibility does not make distance/time totals partial.
Link Semantics¶
- Link systems are configured on
mission.link_systems. - Scenario
initial_conditions.link_systemsreplacesmission.link_systemsfor that scenario run when set. - When no link systems are configured,
result.linkisnulland link feasibility does not affect the estimate. - Link checks are deterministic and make no live network, modem, satellite, or coverage-service calls.
availability: unavailablemakes that link infeasible.max_range_mis checked against the maximum horizontal distance from planned home observed at route leg start and end states.- If one or more links have
required=true, at least one required link must be feasible. Optional links are reported but do not make the mission infeasible. - The selected link is the feasible required link with the lowest
priority, then lexicographically lowestlink_id; if no required links exist, the same selection rule is applied to feasible optional links. coverage_asset_refis accepted for future coverage models but is always ignored by the estimator.- Link infeasibility does not make distance/time totals partial.
Geofence Semantics¶
assets.geofences_fileis loaded by the CLI when present.- Relative geofence paths resolve from the mission file directory.
- GeoJSON coordinates are interpreted in
[lon, lat]order. - Supported geometries are
PolygonandMultiPolygon. - Forbidden-zone boundary contact is a conflict.
- Required zones are evaluated as a union; route segments must be covered by that union.
floor_mandceiling_mare optional GeoJSON feature properties in metres AMSL. Missing lower or upper bounds behave as unbounded in that direction.- A forbidden zone conflicts with a leg only when the horizontal geometry intersects and the leg altitude band overlaps the zone altitude band.
- A required zone must cover the leg horizontally and contain the full leg altitude band. Boundary altitudes are included in the zone.
- When both
floor_mandceiling_mare present,ceiling_mmust be greater thanfloor_m. Per-zone AGL altitude references are not modelled. active_from,active_until, andrecurrenceare optional GeoJSON feature properties. When present andmission.departure_timeis set, route legs are checked only when their absolute time interval overlaps the zone's active window. Whendeparture_timeis missing, time-windowed zones are treated as always active and emitDEPARTURE_TIME_MISSING.
Landing-Zone Semantics¶
assets.landing_zones_fileis loaded by the CLI when present.- Relative landing-zone paths resolve from the mission file directory.
- GeoJSON coordinates are interpreted in
[lon, lat]order. - Supported geometries are
Point,Polygon, andMultiPolygon. - Reachability is evaluated at deterministic route leg end states.
- Divert energy uses resolved cruise TAS and the same mass/density-adjusted cruise power as route legs; distance uses Dubins path when entry heading and turn radius are available, otherwise straight-line geodesic.
- Landing-zone v1 does not evaluate terrain, obstacles, dynamic availability, suitability scoring, weather scoring, comms dependency, or landing-zone altitude.
Obstacle Clearance Semantics¶
assets.obstacles_fileis loaded by the CLI when present.- Relative obstacle paths resolve from the mission file directory.
- GeoJSON coordinates are interpreted in
[lon, lat]order. - Supported geometries are
Point,LineString, andPolygon. properties.height_mis required and is interpreted as the top of the obstacle in metres AMSL.properties.radius_mandproperties.uncertainty_mare optional non-negative metres. They expand the separation check and default to0.- When an obstacle provider is configured, route legs are sampled with the same sub-segment midpoint machinery used for wind and population checks.
- An obstacle violation is reported when a sampled route point lies within
radius_m + constraints.min_obstacle_clearance_m + uncertainty_mhorizontally and has less thanconstraints.min_obstacle_clearance_m + uncertainty_mvertical clearance aboveheight_m. Missingmin_obstacle_clearance_mdefaults to0for configured obstacle files. - When
constraints.min_terrain_clearance_mandassets.terrain_fileare both configured, the sampled AMSL altitude must also clear terrain elevation by at least that value. - Obstacle and terrain clearance failures do not make distance/time totals partial.
- Core execution performs no live obstacle lookups. Operator-provided obstacle data quality, freshness, and height reference are outside the estimator.
Divert Routing Semantics¶
Divert route estimates are computed in scenario runs when a lost_link event
fires and the configured lost_link_policy.action is divert.
Fields computed in CommsLinkPolicyOutcome.divert_estimate:
target_zone_id: ID of the landing zone targeted by the divert policy.distance_m: divert path distance to the nearest point of the target zone. Uses Dubins path distance (bank-angle-constrained arc + straight) when entry heading andvehicle.performance.turn_radius_mare both available; otherwise straight-line geodesic distance.time_s: transit time at mission or vehicle cruise TAS (distance_m / tas_mps).energy_wh: deterministic cruise-power energy for the divert leg. When mass/density fields are configured on the vehicle profile, the same adjusted cruise power used by route, RTH, and landing-zone energy checks is applied.energy_remaining_at_action_wh: battery energy available at the action execution point, computed asbattery_capacity_whminus the sum of all leg energies withleg_index <= action_at_timeline_index - 1.reserve_after_divert_wh:energy_remaining_at_action_wh - energy_wh.reserve_after_divert_percent:reserve_after_divert_wh / battery_capacity_wh * 100.reserve_threshold_wh: the mission reserve threshold in Wh.is_feasible:Truewhenreserve_after_divert_wh >= reserve_threshold_wh.infeasible_reason: human-readable string whenis_feasibleisFalse.warnings: list of structured diagnostic warning codes. The retiredDUBINS_DIVERT_PLANAR_APPROXIMATION_LIMITenum value remains available for backwards compatibility but is no longer emitted by divert routing.
Divert routing is informational. It does not change the overall mission
estimate status. The divert_estimate.is_feasible field indicates whether the
planned divert leg has sufficient energy reserve.
Dubins path distance is computed by sampling representative target geometry
boundary points, projecting each candidate into a local East-North frame
centred on the vehicle position using WGS-84 geodesic bearing and distance,
and evaluating the RS (right arc + straight) and LS (left arc + straight) path
types. The shortest sampled candidate is used. Entry heading is taken from
ground_track_deg of the last completed leg at the action timeline index; when
no prior leg exists (e.g. at_mission_start trigger with no loiter), entry
heading is unavailable and the estimate falls back to straight-line geodesic
distance. Dubins distance is never applied when
vehicle.performance.turn_radius_m is not set. The old planar approximation
limit warning is retired.
Divert route estimates use no wind correction, no geofence intersection, and no
terrain avoidance on the divert leg. TAS is taken from
mission.defaults.cruise_speed_mps if set; otherwise from
vehicle.performance.cruise_speed_mps.
CommsLinkPolicyOutcome.divert_estimate is None when:
- the policy action is not divert
- no landing zones are configured in the scenario
When the target zone is not found in the configured landing zones, or when energy
is not available, divert_estimate is populated with is_feasible=False and a
descriptive infeasible_reason.
Uncertainty Plan Fields Used At Runtime¶
Uncertainty files are consumed by the sample CLI command:
schema_versionuncertainty_idmission_filevehicle_filesamplesseedparameters
Parameter distributions (each may be null to hold the parameter at its deterministic value):
parameters.wind_east_mps.kind/mean/std/low/highparameters.wind_north_mps.kind/mean/std/low/highparameters.cruise_speed_mps.kind/mean/std/low/highparameters.cruise_power_w.kind/mean/std/low/highparameters.battery_capacity_wh.kind/mean/std/low/high
Supported distribution kinds: normal (requires mean and std > 0), uniform (requires low < high).
Monte Carlo Sampling Semantics¶
- Wind sampling (
wind_east_mps,wind_north_mps) overrides the mission wind provider with aConstantWindProviderfor each sample. Spatiotemporal and layered wind providers are not used in sampled runs when wind parameters are specified. - Cruise speed sampling overrides
mission.defaults.cruise_speed_mpsfor each sample. - Cruise power sampling overrides
vehicle.energy.cruise_power_wfor each sample. - Battery capacity sampling overrides
vehicle.energy.battery_capacity_whfor each sample. - Terrain, obstacles, geofences, and landing zones are used unchanged across all samples.
- The baseline estimate is computed once before sampling with unmodified mission, vehicle, and wind provider.
- Sampling is deterministic for a given
seed,samples, and parameter configuration. feasibility_rateis the fraction of completed samples whereenergy.is_feasibleisTrue. It isNonewhen no completed sample produced an energy estimate.
Output Format Semantics¶
--format summary¶
Available on estimate and scenario. Emits a single line to stdout.
Estimate summary fields (space-separated, fixed-width columns):
FEASIBLE/INFEASIBLE: mission energy feasibility.reserve <value> %:reserve_at_landing_wh / battery_capacity_wh * 100, formatted to one decimal place.flight <Xm Ys>: total flight time as minutes and seconds.[<INFEASIBLE_REASON>]: present only when the mission is infeasible; the first failing feasibility code.
Scenario summary fields:
PASSED <n>/<total>/FAILED <n>/<total>: assertion counts.reserve <value> %: same computation as estimate.flight <Xm Ys>: total flight time.policy <ACTION>: lost-link policy action (NONE,RTL,LAND,LOITER,DIVERT), orNONEwhen no lost-link event fired.[ASSERTION: <assertion_id>]: present only when at least one assertion has outcomeFAILED; the first failing assertion ID.
--format geojson¶
Available on estimate and scenario. Emits a GeoJSON FeatureCollection to stdout.
Feature layers:
route: one LineString per leg. Coordinates in[lon, lat, altitude_m]order (RFC 7946). Properties includeleg_id,action,energy_margin_pct,rth_reserve_margin_wh,rth_reserve_margin_pct, andrth_reserve_color(green/yellow/red) when RTH reserve data is available.landing_zones: one Point per configured landing zone. Properties includezone_id,reachable(boolean), andsurface(from GeoJSON source or"unknown").geofences: one Polygon per configured geofence zone. Properties includezone_id,kind(forbidden/caution), andconflict(boolean).obstacles: one Point, LineString, or Polygon per configured obstacle. Properties includeheight_m,radius_m,uncertainty_m, andconflict.
energy_margin_pct is computed per leg as:
(reserve_at_landing_wh − reserve_threshold_wh) / battery_capacity_wh × 100.
Energy color thresholds:
green:energy_margin_pct > 30amber:10 ≤ energy_margin_pct ≤ 30red:energy_margin_pct < 10
RTH reserve color thresholds use the same percentage bands, computed from
reserve_margin_wh / battery_capacity_wh × 100.
Geofence, landing-zone, and obstacle layers are omitted when the corresponding asset is not configured in the mission.
--format kml¶
Available on estimate and scenario. Emits KML to stdout using the http://www.opengis.net/kml/2.2 namespace.
Three placemarks per leg (one per energy color style), one Placemark per landing zone, and one Placemark per geofence polygon. Color encoding uses the same thresholds as GeoJSON: route-green (#00b050), route-amber (#0080ff), route-red (#0000ff) in KML aabbggrr encoding.
Opens directly in Google Earth and QGroundControl.
Update Rule¶
When a non-operative field becomes operative, update all of the following in the same change:
- implementation
- tests
- this document
- golden fixtures, if public outputs change
- versioning policy, if contract versions change