mavkit 0.1.0

Async MAVLink SDK for vehicle control, missions, and parameters
Documentation

MAVKit

MAVKit (crate name: mavkit) is an async Rust SDK for MAVLink vehicles.

It provides a transport-agnostic Vehicle API for:

  • connection and link state
  • telemetry and status watches
  • vehicle actions (arm/disarm, mode, takeoff, guided goto)
  • mission upload/download/clear/set-current
  • parameter download and write operations

The crate is designed to be embedded in desktop/mobile apps, CLIs, or backend services.

Features

  • udp (default): enable MAVLink UDP transport strings (via mavlink)
  • tcp: enable MAVLink TCP transport strings
  • serial (default): enable MAVLink direct serial transport strings
  • ardupilot (default): ArduPilot mode-name mapping helpers
  • stream: byte-stream transport adapters for BLE/SPP/custom links

Default features: udp, serial, ardupilot.

Install

[dependencies]
mavkit = "0.1"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }

Quick start

use mavkit::Vehicle;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
  let vehicle = Vehicle::connect_udp("0.0.0.0:14550").await?;

  let mut state_rx = vehicle.state();
  state_rx.changed().await?;
  let state = state_rx.borrow().clone();
  println!("mode={} armed={}", state.mode_name, state.armed);

  vehicle.disconnect().await?;
  Ok(())
}

Mission wire semantics

For MissionType::Mission, MAVLink wire transfer is normalized as:

  • upload: a home item is prepended at seq=0 (or placeholder if missing)
  • download: wire seq=0 is extracted as home and remaining items are resequenced from 0

For MissionType::Fence and MissionType::Rally, items pass through unchanged.

These semantics are implemented in:

  • items_for_wire_upload
  • plan_from_wire_download

Examples

  • examples/connect_udp.rs
  • examples/mission_upload_download.rs
  • examples/params_roundtrip.rs

Run an example:

cargo run --example connect_udp

Development

Common local checks:

cargo check
cargo clippy --all-targets --all-features -- -D warnings
cargo test

SITL helper targets:

make bridge-up
make test-sitl
make test-sitl-strict
make bridge-down

SITL integration testing

Ignored integration tests in tests/sitl_roundtrip.rs can be run against ArduPilot SITL.

Environment variables:

  • MAVKIT_SITL_UDP_BIND (default: 0.0.0.0:14550)
  • MAVKIT_SITL_STRICT (1 to fail on strict timeout/unsupported behavior)

Run:

MAVKIT_SITL_UDP_BIND=0.0.0.0:14550 \
cargo test --test sitl_roundtrip -- --ignored --nocapture --test-threads=1

Notes

  • Vehicle::from_connection(...) is the transport-agnostic entry point for custom links.
  • Vehicle::identity() currently reflects autopilot and vehicle type; system/component ids are not yet exposed from the current state channels.