Part 07 — Telemetry Data ModelLink to the section Part 07 — Telemetry Data Model

On this page

Maturity: Draft · Profiles: S (mandatory core), C and N (additional members) · Schema: univip.telemetry.v0.2 (../schemas/telemetry.schema.json)

7.1 PrinciplesLink to the section 7.1 Principles

  1. Units in names. Every numeric member carries its unit suffix: _m, _mps, _deg, _degps, _pct, _v, _a, _s, _ms, _dbm, _kbps. No alternative units exist on the wire (ADR-0006).
  2. References in names. Altitude is never bare; see altitude_msl_m, altitude_ellipsoid_m, altitude_agl_m, altitude_rel_m.
  3. Absence means unknown. A member that is not present is unknown. null is NOT used for numeric members. Enumerations use the explicit UNKNOWN value.
  4. One timestamp per sample. timestamp is the time of validity of the sample (sensor time), not transmission time. Members measured at materially different times (for example GNSS at 1 Hz, attitude at 50 Hz) are reported as of timestamp with the device choosing the most recent values; where the age matters, an age_ms member MAY be given in position, motion, power or a payloads[] entry (the age of that object's values at timestamp), and MUST be given for values carried over from a source that has stopped (§7.11).
  5. Monotonic sequence. sequence increases by one per sample per operation and allows gap detection.

7.2 StructureLink to the section 7.2 Structure

{
  "schema": "univip.telemetry.v0.2",
  "device_id": "urn:univip:acme:SN12345",
  "session_id": "flight-2026-10-15-1042",
  "timestamp": "2026-10-15T10:32:15.125Z",
  "sequence": 4201,
  "time": { "source": "GNSS", "accuracy_ms": 2 },
  "position": { "...§7.4..." },
  "motion": { "...§7.5..." },
  "power": { "...§7.6..." },
  "link": { "...§7.7..." },
  "vehicle": { "...§7.8..." },
  "payloads": [ { "...§7.9..." } ],
  "health": { "...§7.10..." }
}

7.3 Header membersLink to the section 7.3 Header members

Member Required Description
schema yes univip.telemetry.v0.2
device_id yes Part 05
session_id yes Operation identifier; new value per flight; MUST be present even on the ground (use the most recent or a pre-operation)
timestamp yes RFC 3339 UTC, time of validity
sequence yes Unsigned integer, +1 per sample, resets per session_id
time.source yes (S) GNSS, NTP, PTP, FREE_RUNNING, UNKNOWN
time.accuracy_ms SHOULD Estimated absolute clock error

7.4 position (Profile S: REQUIRED when a fix exists)Link to the section 7.4 position (Profile S: REQUIRED when a fix exists)

Member Required Description
latitude_deg, longitude_deg yes WGS84 decimal degrees
altitude_msl_m one of the three Height above mean sea level (geoid)
altitude_ellipsoid_m one of the three Height above WGS84 ellipsoid
altitude_agl_m SHOULD Height above ground directly below
altitude_rel_m MAY Height relative to home/launch point
depth_m one of the three (UNDERWATER/SURFACE) Depth below the water surface, positive downward
altitude_above_seabed_m SHOULD (UNDERWATER) Clearance above the seabed (DVL or altimeter)
source SHOULD; MUST when not GNSS GNSS, RTK_GNSS, USBL, LBL, DVL_INS, VISUAL_INS, DEAD_RECKONING, SURFACE_GNSS_LAST_FIX, UNKNOWN
geoid_model MAY EGM96 (default), EGM2008, OTHER
agl_source MAY RANGEFINDER, TERRAIN_MODEL, BAROMETRIC, ESTIMATED
horizontal_accuracy_m, vertical_accuracy_m SHOULD 1-sigma estimates

When no position estimate exists, position is omitted and health.gnss.fix is NONE. Underwater vehicles without GNSS report health.gnss.fix: NONE and a non-GNSS position.source; horizontal_accuracy_m is then REQUIRED.

7.5 motionLink to the section 7.5 motion

Member Required Description
heading_deg yes (S, deployed) True heading of the vehicle nose/bow, [0, 360)
course_deg MAY Direction of travel over ground, [0, 360)
ground_speed_mps yes (S, deployed) Horizontal speed over ground (or over seabed)
velocity_north_mps, velocity_east_mps, velocity_down_mps SHOULD NED velocity
roll_deg, pitch_deg, yaw_deg SHOULD (C), MAY (S) Vehicle attitude, NED body convention (ADR-0006). yaw_deg equals heading_deg for a conventional multirotor or ROV.
roll_rate_degps, pitch_rate_degps, yaw_rate_degps MAY Angular rates

7.6 powerLink to the section 7.6 power

REQUIRED (S) while the source is reporting. When the source has stopped (§7.11) the device either omits power or repeats the last known values with age_ms.

Member Required Description
battery_pct yes (S) 0–100, aggregated across batteries
voltage_v, current_a SHOULD Aggregate
remaining_endurance_s SHOULD Device estimate at current load
batteries[] MAY Per-battery { "id", "pct", "voltage_v", "temperature_c", "cycles" }
Member Required Description
state yes (S) CONNECTED, DEGRADED, LOST, UNKNOWN — the vehicle-to-controller/dock link, not the UNIVIP session
signal_quality_pct SHOULD 0–100 vendor-normalized
rssi_dbm MAY
latency_ms MAY Round-trip aircraft ↔ controller
uplink_kbps, downlink_kbps MAY
transport MAY RADIO, CELLULAR, WIFI, SATELLITE, TETHER, ACOUSTIC, OPTICAL, OTHER

A gateway that cannot observe the radio link reports state: UNKNOWN.

7.8 vehicleLink to the section 7.8 vehicle

Member Required Description
vehicle_state yes (S) Domain-neutral core state: OFF, IDLE, PREDEPLOY, DEPLOYING, OPERATING, HOLDING, RETURNING, RECOVERING, RECOVERED, DOCKED, EMERGENCY, UNKNOWN. Aerial reading: PREDEPLOY = preflight, DEPLOYING = taking off, OPERATING = flying, HOLDING = hovering, RETURNING = returning home, RECOVERING = landing, RECOVERED = landed. Underwater reading: DEPLOYING = launch/dive, OPERATING = submerged transit, HOLDING = station keeping, RECOVERING = surfacing/recovery.
domain_state SHOULD Domain-specific state as shown to the operator (FLYING, HOVERING, SUBMERGED, SURFACED, ...); informative
flight_mode SHOULD Vendor control-mode string as shown to the pilot (e.g. POSITION, SPORT, AUTO, GUIDED, DEPTH_HOLD)
armed SHOULD Boolean
home SHOULD { "latitude_deg", "longitude_deg", "altitude_msl_m" }
distance_from_home_m SHOULD Horizontal
operation_time_s SHOULD Since launch this operation
in_geofence SHOULD (N) Boolean, as judged by the device
control SHOULD (N) `{ "vehicle_lease_id": "...or absent", "pilot_override": false, "source": "PILOT"

7.9 payloads[] (Profile C: REQUIRED for each payload)Link to the section 7.9 payloads[] (Profile C: REQUIRED for each payload)

Member Required Description
payload_id yes Matches capabilities
type yes As in Part 06 §6.4
gimbal if gimbal exists `{ "frame": "EARTH"
zoom_ratio if zoom exists Current combined zoom ratio
focal_length_mm MAY 35 mm-equivalent
hfov_deg, vfov_deg SHOULD (geospatial) Current field of view
recording SHOULD { "active": true, "started_at": "...", "media_id": "..." }
stream_ids SHOULD Stream descriptors produced by this payload
thermal thermal payloads { "palette": "WHITE_HOT", "gain_mode": "HIGH" }
geospatial optional Part 12 footprint block

7.10 healthLink to the section 7.10 health

Member Required Description
status yes (S) OK, WARNING, ERROR, UNKNOWN — overall
gnss yes (S) `{ "fix": "NONE"
faults[] SHOULD { "code": "IMU_CALIBRATION", "severity": "WARNING", "message": "...", "since": "..." }. Codes are vendor strings; standard codes listed in Part 08 §8.5 SHOULD be used where they apply.
sensors MAY { "imu": "OK", "compass": "WARNING", "barometer": "OK", "obstacle_avoidance": "OK" }
temperature_c MAY Aircraft core temperature

7.11 Publication rate and gapsLink to the section 7.11 Publication rate and gaps

  • Profile S: ≥ 1 Hz powered, ≥ 2 Hz deployed; device SHOULD support ≥ 5 Hz. The client MAY request a rate via welcome or PATCH /config. A device whose link or source cannot sustain this (an acoustic link, or a vendor protocol that reports state at 0.5 Hz) MUST declare a lower telemetry.rate_hz.max in capabilities and is then held to that value; its staleness threshold below is then at least 2.5 sample periods.
  • A requested or applied rate is an upper bound. A device publishes each sample of its source at most once and MUST NOT repeat a sample to reach a rate higher than the source provides; the effective rate is then the source's rate.
  • A device MUST NOT fabricate samples; when the underlying source stops, the device MUST stop publishing position and motion, MUST keep publishing at ≥ 1 Hz with link.state: LOST (or UNKNOWN where it cannot observe the link), vehicle.vehicle_state: UNKNOWN and health.status: UNKNOWN, and MUST publish vehicle.telemetry.stale after 5 s. Any value it repeats from before the stop carries age_ms (§7.1).
  • Clients MUST tolerate gaps and MUST NOT interpolate across a gap longer than 2 s without marking the result as estimated. A client SHOULD show telemetry as stale when no sample has arrived for max(3 / applied_rate_hz s, 2 s), while the device is offline, or while vehicle.telemetry.stale is active, and SHOULD display the age of what it shows.
  • vehicle_state SHOULD NOT oscillate: a device reports HOLDING only after the vehicle has stayed below 0.5 m/s ground speed for 2 s and leaves it only when that no longer holds (the dwell of Annex A.2.2 applies to every device).

7.12 Relationship to media timeLink to the section 7.12 Relationship to media time

See Part 09 §9.5. The timestamp member is on the same clock as the RTCP sender-report NTP time of all streams from the device.

Generated from spec/07-telemetry.md.