An algorithm for fusing low-cost triaxial MEMS gyroscope and accelerometer measurements.
A no_std
Rust port of the original.
NOTE: libm
still doesn't work with overflow checks,
so you have to compile your project with --release
.
Leave a comment in the linked issue to raise awareness.
Library is available via crates.io .
// Create DCMIMU:
let mut dcmimu = DCMIMU::new();
let mut prev_t_ms = now();
loop {
// get gyroscope and accelerometer measurement from your sensors:
let gyro = sensor.read_gyro();
let accel = sensor.read_accel();
// Convert measurements to SI if needed.
// Get time difference since last update:
let t_ms = now();
let dt_ms = t_ms - prev_t_ms
prev_t_ms = t_ms
// Update dcmimu states (don't forget to use SI):
dcmimu.update_only((gyro.x, gyro.y, gyro.z), (accel.x, accel.y, accel.z), dt_ms.seconds());
let dcm = dcmimu.to_euler_angles();
println!("Roll: {}; yaw: {}; pitch: {}", dcm.roll, dcm.yaw, dcm.pitch);
}
Check out mpu9250 for accelerometer/gyroscrope sensors driver.
Available via docs.rs.