Drone.Adapter.Capabilities (ex_drone v0.3.0)

View Source

Adapter capability descriptors.

Capabilities let missions and callers discover what an adapter supports without leaking vehicle-specific concepts into the public Drone API. Adapters may implement optional Drone.Adapter.capabilities/1; when omitted, Drone.Adapter.capabilities/2 falls back to tello_like/0.

Examples

caps = Drone.Adapter.Capabilities.crazyflie(positioning: :flow)
true = Drone.Adapter.Capabilities.supports_command?(caps, :takeoff)
false = Drone.Adapter.Capabilities.supports_command?(caps, :flip)

Summary

Types

t()

Capability map advertised by an adapter.

Functions

Capabilities advertised by the Crazyflie adapter.

Returns whether command_type is listed as supported.

Returns whether query_type is listed as supported.

Default capabilities for Tello-shaped adapters (Sim and Tello).

Types

t()

@type t() :: %{
  optional(:sdk_mode) => :required | :optional | :not_applicable,
  optional(:commands) => [atom()],
  optional(:queries) => [atom()],
  optional(:positioning) => atom() | nil,
  optional(:units) => %{
    optional(:distance) => :cm,
    optional(:angle) => :degrees,
    optional(:duration) => :milliseconds | :seconds
  },
  optional(:maneuver_completion) => :immediate | :awaited | :fire_and_forget,
  optional(:requires_estimator) => boolean(),
  optional(:pose_source) => :adapter | :dead_reckoning,
  optional(:takeoff_height_cm) => pos_integer(),
  optional(:link) => atom()
}

Capability map advertised by an adapter.

All keys are optional so adapters can publish only what they know.

KeyPossible valuesMeaning
:sdk_mode:required | :optional | :not_applicableWhether connect_sdk / :sdk_mode is mandatory before flight
:commands[atom()]Command types supported by Drone.Command / the adapter
:queries[atom()]Query types accepted by :query commands
:positioningatom() | nilPositioning model (:dead_reckoning, :flow, :lighthouse, :loco, …)
:unitsmapCanonical units for distance / angle / duration
:maneuver_completion:immediate | :awaited | :fire_and_forgetHow move completion is observed
:requires_estimatorboolean()Motion needs estimator ready
:pose_source:adapter | :dead_reckoningWho owns authoritative pose
:takeoff_height_cmpos_integer()Planned takeoff height for altitude safety
:linkatom()Physical link hint (:crazyradio, …)

:units map keys:

KeyPossible values
:distance:cm
:angle:degrees
:duration:milliseconds | :seconds

Examples

%{
  sdk_mode: :required,
  commands: [:takeoff, :land, :move, :query],
  queries: [:battery, :height],
  positioning: :dead_reckoning,
  units: %{distance: :cm, angle: :degrees, duration: :seconds},
  maneuver_completion: :awaited
}

%{
  sdk_mode: :optional,
  maneuver_completion: :fire_and_forget,
  requires_estimator: true,
  link: :crazyradio,
  positioning: :flow
}

Functions

crazyflie(opts \\ [])

@spec crazyflie(keyword()) :: t()

Capabilities advertised by the Crazyflie adapter.

SDK mode is optional (no-op for mission portability). Maneuvers are fire-and-forget at the CRTP layer. Flip is not listed.

Parameters

  • opts (keyword()) — optional overrides:
    • :positioning (atom()) — defaults to :flow; also :lighthouse, :loco, …

Returns

t/0 including Crazyflie extras :requires_estimator and :link.

Examples

caps = Drone.Adapter.Capabilities.crazyflie(positioning: :lighthouse)
:optional = caps.sdk_mode
:fire_and_forget = caps.maneuver_completion
true = caps.requires_estimator
:crazyradio = caps.link
:lighthouse = caps.positioning
false = Drone.Adapter.Capabilities.supports_command?(caps, :flip)

supports_command?(caps, type)

@spec supports_command?(t(), atom()) :: boolean()

Returns whether command_type is listed as supported.

When :commands is missing, the Tello default command list is used.

Parameters

  • caps (t/0) — capability map
  • command_type (atom()) — for example :takeoff, :flip

Returns

boolean().

Examples

caps = Drone.Adapter.Capabilities.tello_like()
true = Drone.Adapter.Capabilities.supports_command?(caps, :takeoff)
true = Drone.Adapter.Capabilities.supports_command?(caps, :flip)

cf = Drone.Adapter.Capabilities.crazyflie()
false = Drone.Adapter.Capabilities.supports_command?(cf, :flip)

supports_query?(caps, type)

@spec supports_query?(t(), atom()) :: boolean()

Returns whether query_type is listed as supported.

When :queries is missing, the Tello default query list is used.

Parameters

  • caps (t/0) — capability map
  • query_type (atom()) — for example :battery, :wifi

Returns

boolean().

Examples

caps = Drone.Adapter.Capabilities.crazyflie()
true = Drone.Adapter.Capabilities.supports_query?(caps, :battery)
false = Drone.Adapter.Capabilities.supports_query?(caps, :wifi)

tello_like()

@spec tello_like() :: t()

Default capabilities for Tello-shaped adapters (Sim and Tello).

SDK mode is required, maneuvers wait for completion, and positioning is dead-reckoning from commanded moves.

Returns

t/0 capability map.

Examples

caps = Drone.Adapter.Capabilities.tello_like()
:required = caps.sdk_mode
:awaited = caps.maneuver_completion
true = Drone.Adapter.Capabilities.supports_command?(caps, :flip)