Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.altnautica.com/llms.txt

Use this file to discover all available pages before exploring further.

An EscDriver reads per-motor telemetry from electronic speed controllers and surfaces it as a stream of EscTelemetry samples. DShot-telemetry, KISS, and BLHeli32 protocols all share this interface. ESC drivers are read-only by design. Setpoint commands flow through the FC over MAVLink, not through the agent.

The interface

from ados.sdk.drivers.esc import (
    EscDriver,
    EscCandidate,
    EscCapabilities,
    EscSession,
    EscTelemetry,
)

class MyEscDriver(EscDriver):
    async def discover(self) -> list[EscCandidate]:
        ...

    async def open(self, candidate, config) -> EscSession:
        ...

    async def close(self, session) -> None:
        ...

    def capabilities(self, session) -> EscCapabilities:
        ...

    async def telemetry_iterator(self, session):
        # async generator yielding EscTelemetry, one per motor per update
        ...

Capabilities

EscCapabilities(
    protocol="dshot-telemetry",
    motor_count=4,
    has_rpm=True,
    has_temperature=True,
    has_voltage=True,
    has_current=False,
    update_hz=200.0,
)

Telemetry samples

EscTelemetry(
    timestamp_ns=ns,
    motor_index=0,
    rpm=12500,
    temperature_c=42.0,
    voltage_v=22.1,
    current_a=0.0,
    throttle_pct=37.5,
)
current_a is 0.0 when the protocol does not carry it. Set temperature_c=None for sensors with no thermistor.

Manifest permissions

agent:
  permissions:
    - sensor.esc.register
    - mavlink.read       # for ESC_TELEMETRY MAVLink message ingestion

See also