Rust flight
firmware.
Memory-safe autopilot for STM32H7. 24-state EKF, 13 flight modes, VTOL support, ArduPilot-compatible parameters. No GC, no heap in the control loop — 400 Hz on bare metal.
CrabPilot
Board photo coming soonRuns on real hardware.
One TOML per board — codegen produces the RTIC app and peripheral init. Add a new flight controller without touching the control loop.
CubeOrange / CubeOrangePlus
Hex — STM32H743Primary development target. All peripherals exercised in CI.
USB CDC + MAVLink
AK09916 compass + ICM-20948 IMU
Used as primary dev target
Custom board
Bring your own TOMLDescribe your board in TOML and codegen handles peripheral init. Part of the engagement.
Bring a TOML board definition
Codegen handles peripheral init
Part of the engagement
Rust flight firmware, open source.
Memory-safe no_std Rust from driver to control law. 3,500+ tests, Gazebo SITL in CI.
24-state EKF
Gyro bias, accel bias, magnetic offsets, wind. Lock-free on the control loop.
13 flight modes
Stabilize through Auto, including Guided + Smart-RTL. ArduPilot semantics.
ArduPilot-compatible params
Same names, same units. Drop into existing fleets.
Gazebo SITL
Bare-metal-identical control loop, no shortcuts. Lockstep clock.
HITL bridge
Drive a real STM32 board with simulated sensors. 2 Mbaud framed UART.
Failsafe stack
Battery, GPS, geofence, link loss. Watchdog, deterministic startup.
How it works
A layered no_std crate stack — each layer depends only on the one below it. Swap a driver without touching the EKF.
no_std crate stack
HAL
embedded-hal-async traits, RTIC tasksDrivers
ICM-20948, BMP581, RM3100, UBloxSensor pipeline
MultiImuPipeline + BaroPipeline (corrector → LPF → voter)EKF and control
24-state filter, attitude + position loopsMAVLink + DroneCAN
serial, USB CDC, CAN FDDefine a flight mode
Implement the FlightMode trait. The scheduler calls update every control tick — no allocation, no dynamic dispatch overhead.
pub struct LoiterMode {
target: PositionNed,
}
impl FlightMode for LoiterMode {
fn on_enter(&mut self, telem: &Telemetry) {
// Capture current position as hold target
self.target = telem.position_ned;
}
fn update(
&mut self,
dt: f32,
telem: &Telemetry,
) -> ControlOutput {
let err = self.target - telem.position_ned;
ControlOutput::position_hold(err, dt)
}
}Who flies CrabPilot
Research labs
Bring your own controller, plug it into the sensor pipeline, fly it in Gazebo before it hits hardware.
Hobby builds
ArduPilot-compatible params and modes — drop into a 5-inch quad without retraining your fingers.
Education
Read the EKF, step through it in defmt RTT. The whole stack is in one repo.
Open source. no_std. MIT.
CrabPilot is a fully open autopilot stack. Read the EKF, hack the flight modes, port it to new hardware — the entire repo is public.
3,500+ tests across the workspace
Cube Orange flashing via probe-rs + RTT
Gazebo SITL ships with the repo
Reference docs in the repo mirror every subsystem
ArduPilot parameter compatibility