Published topics
These are the topics the host itself publishes:
Topics are printable ASCII, at most 256 bytes. A subscription pattern can end in
.* within your own namespace: plugin.<id>.* matches plugin.<id>.alert but not the bare plugin.<id>. Public host topics are subscribed by exact name.
Subscribe and publish rules
Subscribing needsevent.subscribe, and the topic must be one of:
- your own
plugin.<id>.namespace; - one of the public host topics:
vehicle.armed,vehicle.disarmed,vehicle.mode_changed,vehicle.battery_low,vehicle.geofence_breach,agent.ready,agent.shutdown; - a shared topic another plugin declares, when you also hold its
subscribe_capability.
plugin.<id>. prefix needs no capability. Reserved, never publishable: vehicle., mavlink., mission., safety., agent., swarm., gps., vision., telemetry., and any plugin. topic outside your own plugin.<id>. prefix or your declared shared topics. Other topics need event.publish.
The host decides from the topic, not from what the plugin claims, and it stamps every event with the publishing plugin’s id. Topics are delivered verbatim; the host adds no prefix.
Telemetry
The Pythonctx.telemetry.extend(channel, payload) adds a channel to the node’s heartbeat (gated on telemetry.extend).
To read vehicle state, call telemetry.subscribe (gated on telemetry.read). The host pushes the newest vehicle-state snapshot as a telemetry.state event, at most 10 times a second. A node with no flight controller never fires it.
- Rust:
telemetry_subscribe(callback)on the SDK client. - Python:
subscribe_telemetry()on the IPC client, an async iterator over the sametelemetry.statesnapshots. For individual MAVLink messages, usectx.mavlink.subscribe(gated onmavlink.read). See MAVLink extensions.
ctx.telemetry.subscribe, gated on telemetry.subscribe or a per-topic telemetry.subscribe.<topic> grant. See Permissions.
Delivery and back-pressure
Each subscriber has its own queue, 256 events deep. Event payloads are capped at 64 KiB. The bus never blocks a publisher: when a subscriber’s queue is full, events are dropped for that subscriber and the host logs a warning. Treat live events as best-effort; if you need a complete record, persist from a recording instead. Do not block in an event handler. Hand work to a background task and return quickly:Plugin-to-plugin
Aplugin.* event reaches only its publisher unless the publisher declares it in agent.contributes.shared_topics. A shared topic lives under plugin.<leaf>., where <leaf> is the last segment of the publisher’s id, and names the capability a subscriber must hold:
subscribe_capability is either a catalog capability or one the publisher declares itself under agent.declared_capabilities (plugin.<leaf>.<name>). The publisher needs event.publish to publish a shared topic. A subscriber needs event.subscribe plus that capability. Shared topics match exactly: plugin.rangefinder.reading.x gains nothing from the declaration.
Plugin topics are derived data on a sandboxed bus. Nothing on the bus commands the vehicle.
Next steps
MAVLink extensions
Read and write MAVLink, register components and re-publish decoded data.
Multi-component plugins
How agent events reach the GCS half.
Permissions
Every capability and its risk level.
GCS bridge methods
Events and RPC on the Mission Control side.