10#ifndef M5_UNIT_IMU_IMU_AHRS_CONTROLLER_HPP
11#define M5_UNIT_IMU_IMU_AHRS_CONTROLLER_HPP
230 bool calibrateGyro(
const uint32_t update_count,
const float dt);
327 void quaternion(
float& w,
float& x,
float& y,
float& z)
const;
335 void euler(
float& roll_deg,
float& pitch_deg,
float& yaw_deg)
const;
369 return _accel_src !=
nullptr;
375 return _gyro_src !=
nullptr;
381 return _temp_src !=
nullptr;
392 return _has_valid_mag;
409 struct axis_offset_state_t {
416 uint8_t average_shifter{1};
426 uint8_t radius_shift{};
427 bool radius_seeded{};
429 uint8_t update_stillness(
const float sample[3]);
433 static constexpr size_t MAX_SOURCES{4};
435 static bool is_mag_overflow(
const int32_t mag[3]);
436 static void apply_offset_and_calibrate(axis_offset_state_t& cal,
float v[3]);
438 bool find_source_index(
const IMUDataSource& src,
size_t& out_index)
const;
439 Capability drain_and_fuse(
const float dt);
440 void begin_gyro_collect();
441 bool end_gyro_collect();
442 void recompute_composed(
const size_t index);
443 void recompute_all_composed();
445 IMUDataSource* _sources[MAX_SOURCES]{};
446 AxisOrder _axis_orders[MAX_SOURCES]{};
447 AxisOrder _mag_axis_orders[MAX_SOURCES]{};
448 AxisOrder _user_axis_order{};
451 AxisOrder _composed_axis_orders[MAX_SOURCES]{};
452 AxisOrder _composed_mag_axis_orders[MAX_SOURCES]{};
453 size_t _source_count{};
455 IMUDataSource* _accel_src{};
456 IMUDataSource* _gyro_src{};
457 IMUDataSource* _mag_src{};
458 IMUDataSource* _temp_src{};
460 AhrsFilterBase* _owned_filter{};
461 AhrsFilterBase* _filter{};
467 imu_physical_data_t _latest{};
468 bool _has_valid_mag{
false};
470 unsigned long _last_micros{};
471 bool _has_last_micros{
false};
473 bool _has_dt_ema{
false};
477 axis_offset_state_t _accel_cal{};
478 axis_offset_state_t _gyro_cal{};
479 axis_offset_state_t _mag_cal{};
481 bool _gyro_collecting{
false};
482 float _gyro_collect_sum[3]{};
483 uint32_t _gyro_collect_count{};
Per-source axis permutation and inversion applied to raw-to-physical IMU samples.
Merges up to 4 IMUDataSource instances by capability and fuses their samples into an attitude estimat...
Definition ahrs_controller.hpp:58
void readUserAxisOrder(AxisOrder &out) const
Read back the current global user axis remap.
Definition ahrs_controller.cpp:229
bool wakeup()
Bring every added source back from sleep()
Definition ahrs_controller.cpp:257
bool selectFilter(const FilterType type)
Select and internally construct one of the built-in filters.
Definition ahrs_controller.cpp:389
~AhrsController()
Destructor.
Definition ahrs_controller.cpp:122
bool hasAccel() const
Whether an accelerometer source has been registered (see add())
Definition ahrs_controller.hpp:367
unsigned long lastMicros() const
Microsecond timestamp of the most recent self-clocked update()
Definition ahrs_controller.hpp:401
AhrsController(const AhrsController &)=delete
Copy construction is disabled (holds pointers to registered sources)
bool writeAxisOrder(const IMUDataSource &src, const AxisOrder &order)
Set the chip-frame-to-body-frame axis remap applied to one source's Accel/Gyro (and Temp) samples.
Definition ahrs_controller.cpp:179
void writeAutoCalibration(const uint8_t accel, const uint8_t gyro, const uint8_t mag)
Enable/disable continuous background auto-calibration per capability.
Definition ahrs_controller.cpp:271
void writeMagCalibrationRadius(const float radius_ut)
Pin the field strength the magnetometer auto-calibration fits its samples to.
Definition ahrs_controller.cpp:285
bool begin()
Prepare this controller for update()
Definition ahrs_controller.cpp:378
bool readCalibration(calibration_data_t &out) const
Snapshot every capability's current auto-calibration offset.
Definition ahrs_controller.cpp:352
AhrsFilterBase * filter() const
Currently active filter, or nullptr if none has been selected yet.
Definition ahrs_controller.hpp:314
void quaternion(float &w, float &x, float &y, float &z) const
Current fused attitude.
Definition ahrs_controller.cpp:431
bool readMagAxisOrder(const IMUDataSource &src, AxisOrder &out) const
Read back the Mag-only axis remap currently configured for one source.
Definition ahrs_controller.cpp:213
const imu_physical_data_t & latest() const
Most recently fused physical-unit sample.
Definition ahrs_controller.hpp:361
bool add(IMUDataSource &src)
Register an IMU data source.
Definition ahrs_controller.cpp:127
bool readAxisOrder(const IMUDataSource &src, AxisOrder &out) const
Read back the Accel/Gyro axis remap currently configured for one source.
Definition ahrs_controller.cpp:191
void setFilter(AhrsFilterBase &filter)
Inject an externally-owned filter.
Definition ahrs_controller.cpp:422
AhrsController & operator=(const AhrsController &)=delete
Copy assignment is disabled (holds pointers to registered sources)
bool sleep()
Put every added source into its lowest reversible power state.
Definition ahrs_controller.cpp:247
bool hasGyro() const
Whether a gyroscope source has been registered (see add())
Definition ahrs_controller.hpp:373
bool calibrateGyro(const uint32_t duration_ms)
Collect gyro samples for the given duration (real clock) and set the gyro offset to their mean.
Definition ahrs_controller.cpp:325
bool writeCalibration(const calibration_data_t &data)
Overwrite every capability's auto-calibration offset from a snapshot.
Definition ahrs_controller.cpp:363
void clearYawTare()
Remove a previously applied tareYaw() offset.
Definition ahrs_controller.cpp:469
Capability update()
Drain every source and fuse newly-arrived samples, measuring dt from the real clock (m5::utility::mic...
Definition ahrs_controller.cpp:742
AhrsController()
Construct with no sources and the default filter (Complementary)
Definition ahrs_controller.cpp:103
void euler(float &roll_deg, float &pitch_deg, float &yaw_deg) const
Current fused attitude as aerospace ZYX Euler angles.
Definition ahrs_controller.cpp:446
void readAutoCalibration(uint8_t &accel, uint8_t &gyro, uint8_t &mag) const
Read back the current auto-calibration strengths.
Definition ahrs_controller.cpp:278
bool hasTemp() const
Whether a temperature source has been registered (see add())
Definition ahrs_controller.hpp:379
void writeUserAxisOrder(const AxisOrder &order)
Set a global user axis remap composed on top of every source's fixed order.
Definition ahrs_controller.cpp:223
bool hasValidMag() const
Whether at least one valid magnetometer sample has been seen.
Definition ahrs_controller.hpp:390
float readMagCalibrationRadius() const
Field strength the magnetometer auto-calibration is currently fitting to.
Definition ahrs_controller.cpp:298
bool writeMagAxisOrder(const IMUDataSource &src, const AxisOrder &order)
Set the chip-frame-to-body-frame axis remap applied to one source's Mag samples.
Definition ahrs_controller.cpp:201
void tareYaw()
Zero the publicly reported yaw at the current heading.
Definition ahrs_controller.cpp:453
Framework-independent contract shared by every AHRS attitude filter.
Definition filter_base.hpp:81
Thin contract between measurement units and consumers (e.g. AHRS)
Definition imu_data_source.hpp:27
Common contract for AHRS attitude filters.
FilterType
Built-in AHRS filter implementations selectable via AhrsController::selectFilter.
Definition filter_base.hpp:65
Public interface for IMU data providers.
Common types for M5Unit-IMU.
Capability
Capability of the IMU data source (bitwise combinable)
Definition imu_types.hpp:22
Top level namespace of M5Stack.
Definition ahrs_controller.cpp:26
Minimal quaternion arithmetic for attitude representation (framework independent)
Exportable/importable snapshot of every capability's auto-calibration offset.
Definition ahrs_controller.hpp:66
uint32_t version
Struct layout version.
Definition ahrs_controller.hpp:67
float gyro_offset[3]
Gyroscope offset (dps), X/Y/Z.
Definition ahrs_controller.hpp:69
float mag_offset[3]
Magnetometer offset (uT), X/Y/Z.
Definition ahrs_controller.hpp:70
float accel_offset[3]
Accelerometer offset (G), X/Y/Z.
Definition ahrs_controller.hpp:68
Chip-frame-to-body-frame axis remap: a permutation plus a per-output-axis sign flip.
Definition axis_order.hpp:43
Merged, converted physical-unit IMU sample (AhrsController::latest())
Definition imu_types.hpp:81
Plain Hamilton quaternion (float) used to represent attitude.
Definition quaternion.hpp:31