8 releases

0.4.3 Mar 18, 2026
0.4.2 Feb 26, 2026
0.3.0 Oct 3, 2024
0.2.2 Jun 4, 2024
0.2.0 Oct 1, 2021

#724 in Hardware support


Used in 2 crates

MIT/Apache

57KB
1K SLoC

Crazyflie link

Link implementation for the Crazyflie quadcopter.

This crates implements low-level link communication to a Crazyflie using the Crazyradio dongle or the direct USB connection. It allows to scan for Crazyflies and to open a bidirectional link.

This crate API is async, it is implemented using the Tokio executor.

Cargo features

  • packet_capture - Enable packet capture via Unix socket (Unix only)

Limitations

This crate currently only supports 2Mbit/s datarate over Crazyradio.

This crate currently only supports the Tokio executor.


lib.rs:

Crazyflie Link

This Crate implement the Crazyflie radio link connection using Crazyradio. It allows to scan for Crazyflies and to open a safe bidirectional radio connection using a Crazyradio.

The entry point to this Crate is the [LinkContext], it keeps track of Crazyradio dongles and provides functions to open a link [Connection].

A connection can then be used to send and receive packet with the Crazyflie.

Example:

// Create a link Context
let context = crazyflie_link::LinkContext::new();

// Scan for Crazyflies
let cf_found = context.scan([0xe7; 5]).await?;

if let Some(uri) = cf_found.first() {
    let connection = context.open_link(uri).await?;
    let packet = connection.recv_packet().await?;
    println!("Packet received: {:?}", packet);
}

The link URI format is as follows:

radio://<radio_nth>/<channel>/[datarate]/[address]?[options=value&options=value...]
  • radio_nth is the index of the Crazyradio to use (0 for the first, 1 for the second, etc.)
  • channel is the radio channel to use (0-125)
  • datarate is the datarate to use (optional, default is 2M, possible values are 250K, 1M, 2M)
  • address is the radio address to use (optional, default is e7e7e7e7e7, 5 bytes in hex)
  • options are additional options:
    • safelink: Disable safelink packet loss protection (optional, default is 1, 0 to disable)
    • ackfilter: Enable ACK filtering, if disable, empty ack packet will be send as null packet downstream (optional, default is 0, 1 to enable)
    • timeout: Set the receive timeout in milliseconds (optional, default is 1000)

Note: Crazyradio 2.0 only support channels 0-100, and datarates 1M and 2M.

Cargo features

  • packet_capture - Enable packet capture via Unix socket (Unix only)

Packet Capture

When the packet_capture feature is enabled, CRTP packets can be captured and sent to an external application for analysis. Call [capture::init()] at startup to connect to the capture socket.

The capture uses a Unix socket at /tmp/crazyflie-capture.sock. To view packets in Wireshark, use the extcap plugin from https://github.com/evoggy/wireshark-crazyflie.

Capture Format

Each captured packet is sent with a 41-byte header followed by the CRTP packet data:

Offset Size Field Description
0 1 link_type 1 = Radio, 2 = USB
1 1 direction 0 = TX (to Crazyflie), 1 = RX (from CF)
2 12 address Radio address (5 bytes) or empty for USB
14 1 channel Radio channel (0 for USB)
15 16 serial Radio/device serial number
31 8 timestamp Microseconds since Unix epoch (LE)
39 2 length CRTP packet length (LE)
41 N data CRTP packet (header + payload)

Dependencies

~6.5–9MB
~152K SLoC