Part 06 — Capability DocumentLink to the section Part 06 — Capability Document
On this page
Maturity: Draft · Profiles: all · Schema: univip.capabilities.v0.2 (../schemas/capabilities.schema.json)
6.1 PurposeLink to the section 6.1 Purpose
The capability document is the contract between one device and its clients. A client MUST read it before offering any control and MUST offer only what it declares. A gateway MUST declare exactly the subset the underlying aircraft and API allow, never the superset the specification permits.
It is sent as the first payload after hello/welcome on the session channel and served at GET /univip/v1/devices/{device_id}/capabilities. A device MUST resend it on the session channel whenever it changes (for example when a payload is attached or the operator enables Profile N).
6.2 StructureLink to the section 6.2 Structure
{
"schema": "univip.capabilities.v0.2",
"device": { "...identity (Part 05)..." },
"profiles": ["S", "C"],
"schemas": ["univip.envelope.v0.2", "univip.capabilities.v0.2", "univip.telemetry.v0.2", "univip.event.v0.2",
"univip.command.v0.2", "univip.command_status.v0.2", "univip.lease.v0.2"],
"transports": {
"rest": { "device_hosted": false, "session_proxy": true },
"realtime": ["WSS"],
"media": ["WEBRTC"]
},
"telemetry": { "rate_hz": { "min": 1, "max": 10, "default": 2 }, "applied_rate_hz": 5,
"fields": ["position", "motion", "power", "link", "vehicle", "payloads", "health"] },
"events": { "topics": ["vehicle.operation.started", "..."] },
"media": { "streams": [ { "...Part 09 stream descriptor..." } ], "webrtc": { "ice": "FULL" } },
"payloads": [ { "...§6.4..." } ],
"vehicle": { "...§6.5, Profile N only..." },
"geospatial": { "supported": false },
"extensions": []
}6.3 Top-level membersLink to the section 6.3 Top-level members
| Member | Required | Description |
|---|---|---|
device |
yes | Identity block, Part 05 §5.1 |
profiles |
yes | Claimed profiles, subset of S, C, N. C requires S; N requires S. |
schemas |
yes | Exact schema identifiers the device emits or accepts, including univip.envelope.v<MAJOR>.<MINOR> and univip.capabilities.v<MAJOR>.<MINOR> |
transports.rest.device_hosted |
yes | true if the device serves /univip/v1 itself; base_url then REQUIRED |
transports.rest.session_proxy |
if not device-hosted | true if the device answers request envelopes (Part 05 §5.5.1). REQUIRED and true when device_hosted is false. |
transports.rest.insecure |
optional | true when base_url is plaintext http://, permitted only on an isolated local link (Part 13 §13.2) |
transports.realtime |
yes | Non-empty subset of WSS, MQTT5 |
transports.media |
yes | Subset of WEBRTC, RTSP, SRT; non-empty whenever a profile is claimed |
telemetry.rate_hz |
yes | min, max, default supported publication rates |
telemetry.applied_rate_hz |
yes (session channel) | The rate the device applies for the session that receives this document, after clamping (Part 05 §5.4.2). Omitted when served over REST. |
telemetry.fields |
yes | Top-level telemetry objects the device populates |
events.topics |
yes | Every topic the device can emit (standard and vendor) |
media.streams |
yes (may be empty only if profiles is empty) |
Stream descriptors, Part 09 |
media.webrtc.ice |
SHOULD | FULL (gathers host, server-reflexive and relay candidates as configured) or LITE (host candidates only, Part 09 §9.3) |
payloads |
Profile C | Payload capability blocks |
vehicle |
Profile N | Vehicle control block |
geospatial |
optional | supported and the list of geospatial fields emitted, Part 12 |
extensions |
optional | Reverse-DNS identifiers of vendor or future standard extensions |
An optional member set to null means the same as an absent member (Part 01 §1.4).
6.4 Payload capability blockLink to the section 6.4 Payload capability block
{
"payload_id": "cam-1",
"type": "CAMERA",
"name": "Wide + zoom EO",
"lease_required": true,
"lease": { "max_ttl_s": 900, "heartbeat_interval_s": 10 },
"gimbal": {
"axes": ["PITCH", "YAW"],
"frames": ["BODY", "EARTH"],
"limits_deg": { "pitch": { "min": -120, "max": 30 }, "yaw": { "min": -180, "max": 180 } },
"max_rate_degps": { "pitch": 90, "yaw": 90 },
"continuous_move": true
},
"zoom": { "min_ratio": 1.0, "max_ratio": 56.0, "optical_max_ratio": 7.0, "continuous": true },
"focus": { "modes": ["AUTO", "MANUAL", "ONE_SHOT"] },
"imaging": { "parameters": ["EXPOSURE_MODE", "EV_COMPENSATION", "WHITE_BALANCE", "IR_CUT_FILTER"] },
"thermal": null,
"recording": { "supported": true, "local_storage": true },
"snapshot": { "supported": true },
"spotlight": null
}| Member | Rule |
|---|---|
type |
CAMERA, THERMAL, DUAL_EO_IR, MULTISPECTRAL, LIDAR, RANGEFINDER, SPOTLIGHT, SPEAKER, OTHER |
lease_required |
If true, camera.* commands for this payload need a camera lease (Part 11 §11.3). |
lease |
REQUIRED when lease_required is true: max_ttl_s and heartbeat_interval_s of camera leases for this payload, so that a client can plan heartbeats before acquiring one. |
gimbal |
null if the payload is fixed. axes subset of ROLL, PITCH, YAW. frames lists the frames accepted in camera.gimbal.set_orientation. |
zoom |
null if fixed focal length. optical_max_ratio marks where digital zoom begins. |
thermal |
For thermal payloads: { "palettes": ["WHITE_HOT", "BLACK_HOT", "IRONBOW", ...], "gain_modes": ["HIGH", "LOW", "AUTO"], "radiometric": true } |
imaging.parameters |
Subset of the standard parameter list in Part 10 §10.6 |
6.5 Vehicle control block (Profile N)Link to the section 6.5 Vehicle control block (Profile N)
{
"enabled": true,
"domain": "AIR",
"commands": ["vehicle.hold", "vehicle.return_home", "vehicle.cancel", "vehicle.goto", "vehicle.move_relative"],
"limits": {
"max_altitude_agl_m": 120,
"max_altitude_msl_m": null,
"max_distance_from_home_m": 2000,
"max_ground_speed_mps": 15,
"max_depth_m": null,
"min_altitude_above_seabed_m": null,
"altitude_agl_basis": "HOME_ELEVATION",
"geofence": { "type": "Polygon", "coordinates": [[[77.59, 12.97], [77.60, 12.97], [77.60, 12.98], [77.59, 12.98], [77.59, 12.97]]] }
},
"lease": { "max_ttl_s": 300, "heartbeat_interval_s": 5, "preemptable_by": ["PILOT", "OPERATOR_POLICY"] },
"missions": { "formats": ["univip.mission.v0.2"], "max_waypoints": 99 },
"operator_authority": { "pilot_present_required": true, "pilot_override": "ALWAYS" }
}| Member | Rule |
|---|---|
enabled |
Operator-controlled switch. When false the device MUST reject every vehicle.* command with FLIGHT_CONTROL_DISABLED even though it claims Profile N. |
domain |
AIR, UNDERWATER, SURFACE, GROUND, MULTI; MUST equal device.domain. |
commands |
Exact supported subset of the Part 11 command list. vehicle.hold, vehicle.return_home and vehicle.cancel are REQUIRED for any Profile N claim. Domain-specific commands (vehicle.takeoff, vehicle.land, vehicle.dive_to, vehicle.surface) MUST NOT be listed for a domain they do not apply to. |
limits |
Limits the device enforces. null means not limited by the device (regulatory limits still apply to the operator). geofence is a GeoJSON Polygon or MultiPolygon in WGS84. max_depth_m and min_altitude_above_seabed_m apply to the UNDERWATER domain. altitude_agl_basis states how max_altitude_agl_m is evaluated: TERRAIN_MODEL, RANGEFINDER, or HOME_ELEVATION (height above the home point's ground, assuming flat terrain); it is REQUIRED when max_altitude_agl_m is set. |
lease |
Lease parameters, Part 11 §11.3 |
operator_authority |
Declares how pilot authority is enforced. pilot_override MUST be ALWAYS. |
6.6 Change notificationLink to the section 6.6 Change notification
When the capability document changes, the device MUST publish event vehicle.device.capabilities_changed and resend the capabilities envelope. Clients SHOULD re-evaluate offered controls.