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
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);
}
Link URI format
The link URI format is as follows:
radio://<radio_nth>/<channel>/[datarate]/[address]?[options=value&options=value...]
radio_nthis the index of the Crazyradio to use (0 for the first, 1 for the second, etc.)channelis the radio channel to use (0-125)datarateis the datarate to use (optional, default is 2M, possible values are 250K, 1M, 2M)addressis the radio address to use (optional, default is e7e7e7e7e7, 5 bytes in hex)optionsare 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