M5Unit-IMU 0.0.2 git rev:e5b00aa
Loading...
Searching...
No Matches
ekf.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_IMU_IMU_FILTER_EKF_HPP
11#define M5_UNIT_IMU_IMU_FILTER_EKF_HPP
12
13#include <math/matrix.hpp>
14#include <math/quaternion.hpp>
15#include <math/vector3.hpp>
16
17#include "filter_base.hpp"
18
19namespace m5 {
20namespace imu {
21
46class EKFFilter : public AhrsFilterBase {
47public:
48 EKFFilter()
49 {
50 reset_state();
51 }
52
53 virtual void reset() override;
54 virtual void update(const float dt, const float accel[3], const float gyro[3], const float* mag) override;
55 virtual void quaternion(float& w, float& x, float& y, float& z) const override;
56
70 bool writeNoiseParams(const float gyro_noise_dps, const float accel_noise_g, const float mag_noise_ut,
71 const float bias_random_walk_dps);
73 inline float readGyroNoise() const
74 {
75 return _gyro_noise_dps;
76 }
78 inline float readAccelNoise() const
79 {
80 return _accel_noise_g;
81 }
83 inline float readMagNoise() const
84 {
85 return _mag_noise_ut;
86 }
88 inline float readBiasRandomWalk() const
89 {
90 return _bias_random_walk_dps;
91 }
92
95
108 bool writeQuaternion(const float w, const float x, const float y, const float z);
109
110private:
111 // Non-virtual state initializer shared by ctor and reset(); safe to call from ctor
112 void reset_state();
113 void predict(const float dt, const m5::math::Vector3& gyro_rad_s);
114 bool apply_axis3_update(const m5::math::Matrix<3, 7>& h, const m5::math::Vector3& innovation,
115 const float noise_var);
116
117 m5::math::Quaternion _q{}; // Current attitude estimate (identity by default)
118 m5::math::Vector3 _bias_rad_s{}; // Gyro bias estimate, rad/s, body frame
119 m5::math::Matrix<7, 7> _p{}; // State covariance (state = [q(4), bias(3)])
120
121 float _gyro_noise_dps{0.5f}; // Gyro measurement noise, 1-sigma, dps
122 float _accel_noise_g{0.05f}; // Accelerometer measurement noise, 1-sigma, G
123 float _mag_noise_ut{2.0f}; // Magnetometer measurement noise, 1-sigma, uT
124 float _bias_random_walk_dps{0.01f}; // Gyro bias random walk, 1-sigma, dps
125};
126
127} // namespace imu
128} // namespace m5
129#endif
Framework-independent contract shared by every AHRS attitude filter.
Definition filter_base.hpp:81
Quaternion extended Kalman filter (EKF) with gyro bias estimation.
Definition ekf.hpp:46
float readAccelNoise() const
Current accelerometer measurement noise (G)
Definition ekf.hpp:78
m5::math::Vector3 readGyroBias() const
Current estimated gyro bias (dps, body frame)
Definition ekf.cpp:347
float readBiasRandomWalk() const
Current gyro bias random walk (dps)
Definition ekf.hpp:88
bool writeNoiseParams(const float gyro_noise_dps, const float accel_noise_g, const float mag_noise_ut, const float bias_random_walk_dps)
Set the process/observation noise parameters.
Definition ekf.cpp:333
float readGyroNoise() const
Current gyro measurement noise (dps)
Definition ekf.hpp:73
bool writeQuaternion(const float w, const float x, const float y, const float z)
Overwrite the current attitude estimate directly.
Definition ekf.cpp:352
virtual void update(const float dt, const float accel[3], const float gyro[3], const float *mag) override
Fuse one IMU sample into the attitude estimate.
Definition ekf.cpp:284
float readMagNoise() const
Current magnetometer measurement noise (uT)
Definition ekf.hpp:83
virtual void reset() override
Reset the internal attitude estimate (and any filter state) to identity.
Definition ekf.cpp:200
virtual void quaternion(float &w, float &x, float &y, float &z) const override
Current fused attitude.
Definition ekf.cpp:325
Fixed-size (R rows x C columns) float matrix, std::array backed (no heap allocation)
Definition matrix.hpp:39
Common contract for AHRS attitude filters.
Minimal fixed-size matrix arithmetic (framework independent)
Top level namespace of M5Stack.
Definition ahrs_controller.cpp:26
Minimal quaternion arithmetic for attitude representation (framework independent)
Plain Hamilton quaternion (float) used to represent attitude.
Definition quaternion.hpp:31
Plain 3D vector (float)
Definition vector3.hpp:25
Minimal 3D vector arithmetic (framework independent)