M5Unit-IMU 0.0.2 git rev:e5b00aa
Loading...
Searching...
No Matches
vqf.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_VQF_HPP
11#define M5_UNIT_IMU_IMU_FILTER_VQF_HPP
12
13#include <memory>
14
15#include <math/vector3.hpp>
16
17#include "filter_base.hpp"
18
19// The vendored vqf.hpp (see src/imu/filter/third_party/vqf, MIT license, unmodified from
20// https://github.com/dlaidig/vqf) picks its floating-point type `vqf_real_t` (used for every
21// VQF member, including its in-memory layout) based on whether VQF_SINGLE_PRECISION is
22// defined *at the point vqf.hpp is included* -- defaulting to `double` otherwise. Defining it
23// here, right before the only include of the vendored header in this adapter's public header,
24// makes every translation unit that includes this file (the adapter's .cpp, and its tests)
25// see `vqf_real_t == float`, matching this repository's float-based AhrsFilterBase. This must
26// stay consistent with third_party/vqf/vqf_impl.cpp, which defines the same macro before
27// compiling the vendored implementation itself (see that file for why both sides need to agree).
28#ifndef VQF_SINGLE_PRECISION
29#define VQF_SINGLE_PRECISION
30#endif
31#include "third_party/vqf/vqf.hpp"
32
33namespace m5 {
34namespace imu {
35
102class VQFFilter : public AhrsFilterBase {
103public:
104 VQFFilter();
105
106 virtual void reset() override;
107 virtual void update(const float dt, const float accel[3], const float gyro[3], const float* mag) override;
108 virtual void quaternion(float& w, float& x, float& y, float& z) const override;
109
115 bool writeTauAcc(const float tau_acc);
117 inline float readTauAcc() const
118 {
119 return static_cast<float>(_vqf->getParams().tauAcc);
120 }
121
127 bool writeTauMag(const float tau_mag);
129 inline float readTauMag() const
130 {
131 return static_cast<float>(_vqf->getParams().tauMag);
132 }
133
141 void writeRestBiasEstimation(const bool enabled);
143 inline bool readRestBiasEstimation() const
144 {
145 return _vqf->getParams().restBiasEstEnabled;
146 }
147
155 void writeMotionBiasEstimation(const bool enabled);
157 inline bool readMotionBiasEstimation() const
158 {
159 return _vqf->getParams().motionBiasEstEnabled;
160 }
161
180 void writeMagDisturbanceRejection(const bool enabled);
182 inline bool readMagDisturbanceRejection() const
183 {
184 return _vqf->getParams().magDistRejectionEnabled;
185 }
186
205 bool writeBiasClip(const float bias_clip_dps);
207 inline float readBiasClip() const
208 {
209 return static_cast<float>(_vqf->getParams().biasClip);
210 }
211
214
216 inline bool restDetected() const
217 {
218 return _vqf->getRestDetected();
219 }
220
235 inline void readMagNormDip(float& norm, float& dip_deg) const
236 {
237 const VQFState& state = _vqf->getState();
238 norm = static_cast<float>(state.magNormDip[0]);
239 dip_deg = static_cast<float>(state.magNormDip[1]) * (180.0f / 3.14159265358979323846f);
240 }
241
250 inline void readRestDeviations(float& gyro_relative, float& accel_relative) const
251 {
252 vqf_real_t out[2]{};
253 _vqf->getRelativeRestDeviations(out);
254 gyro_relative = static_cast<float>(out[0]);
255 accel_relative = static_cast<float>(out[1]);
256 }
257
267 inline bool magDisturbanceDetected() const
268 {
269 return _vqf->getMagDistDetected();
270 }
271
272private:
275 void ensure_sample_period(const float dt);
276
277 std::unique_ptr<::VQF> _vqf{}; // basicvqf's filter instance (see VQFFilter()/ensure_sample_period())
278 float _built_dt{}; // Sample period _vqf was (re)built with, in seconds
279 bool _mag_seen{}; // Any mag sample consumed? Gates the heading convention fix
280};
281
282} // namespace imu
283} // namespace m5
284#endif
Framework-independent contract shared by every AHRS attitude filter.
Definition filter_base.hpp:81
Adapter around the vendored VQF algorithm (Daniel Laidig, MIT license; see src/imu/filter/third_party...
Definition vqf.hpp:102
void writeRestBiasEstimation(const bool enabled)
Enable/disable gyroscope bias estimation while the device is at rest.
Definition vqf.cpp:135
bool writeTauMag(const float tau_mag)
Set the magnetometer heading correction time constant (VQFParams::tauMag)
Definition vqf.cpp:126
bool readMotionBiasEstimation() const
Whether motion bias estimation is enabled.
Definition vqf.hpp:157
float readBiasClip() const
Current maximum expected gyroscope bias (dps)
Definition vqf.hpp:207
virtual void reset() override
Reset the internal attitude estimate (and any filter state) to identity.
Definition vqf.cpp:41
bool writeTauAcc(const float tau_acc)
Set the accelerometer low-pass time constant (VQFParams::tauAcc)
Definition vqf.cpp:117
float readTauMag() const
Current magnetometer heading correction time constant.
Definition vqf.hpp:129
void readMagNormDip(float &norm, float &dip_deg) const
The magnetic field as VQF currently measures it, in earth frame.
Definition vqf.hpp:235
virtual void quaternion(float &w, float &x, float &y, float &z) const override
Current fused attitude.
Definition vqf.cpp:85
bool writeBiasClip(const float bias_clip_dps)
Set the largest gyroscope bias the estimator will accept (VQFParams::biasClip)
Definition vqf.cpp:150
void readRestDeviations(float &gyro_relative, float &accel_relative) const
How close the last sample was to being accepted as "at rest".
Definition vqf.hpp:250
float readTauAcc() const
Current accelerometer low-pass time constant.
Definition vqf.hpp:117
bool magDisturbanceDetected() const
Whether a magnetic disturbance is currently detected.
Definition vqf.hpp:267
void writeMotionBiasEstimation(const bool enabled)
Enable/disable gyroscope bias estimation while the device is moving.
Definition vqf.cpp:140
m5::math::Vector3 readGyroBias() const
Current estimated gyro bias (dps, body frame); zero unless bias estimation is enabled.
Definition vqf.cpp:166
bool readMagDisturbanceRejection() const
Whether magnetic disturbance rejection is enabled.
Definition vqf.hpp:182
bool readRestBiasEstimation() const
Whether rest bias estimation is enabled.
Definition vqf.hpp:143
bool restDetected() const
Whether the device is currently detected as resting (see writeRestBiasEstimation())
Definition vqf.hpp:216
void writeMagDisturbanceRejection(const bool enabled)
Enable/disable magnetic disturbance detection and rejection.
Definition vqf.cpp:145
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 vqf.cpp:51
Common contract for AHRS attitude filters.
Top level namespace of M5Stack.
Definition ahrs_controller.cpp:26
Plain 3D vector (float)
Definition vector3.hpp:25
Minimal 3D vector arithmetic (framework independent)