Larus glider flight sensor system 3.9.2024
Software-In-The-Loop test and validation system
Loading...
Searching...
No Matches
AHRS.h
Go to the documentation of this file.
1/***********************************************************************/
25#ifndef AHRS_H_
26#define AHRS_H_
27
28#include "embedded_math.h"
29#include "quaternion.h"
30#include "float3vector.h"
31#include "float3matrix.h"
32#include "integrator.h"
33#include "compass_calibration.h"
35#include "HP_LP_fusion.h"
36#include "pt2.h"
37
39
40enum { ROLL, PITCH, YAW};
41enum { FRONT, RIGHT, BOTTOM};
42enum { NORTH, EAST, DOWN};
43
45
47
50{
51public:
53 void attitude_setup( const float3vector & acceleration, const float3vector & induction);
54
55 void update_magnetic_induction_data( float declination, float inclination)
56 {
57 declination *= (M_PI_F / 180.0f); // degrees to radiant
58 inclination *= (M_PI_F / 180.0f);
59
60 expected_nav_induction[NORTH] = COS( inclination);
61 expected_nav_induction[EAST] = COS( inclination) * SIN( declination);
62 expected_nav_induction[DOWN] = SIN( inclination);
63 update_magnetic_loop_gain(); // adapt to magnetic inclination
64 }
65
66 void update( const float3vector &gyro, const float3vector &acc, const float3vector &mag,
67 const float3vector &GNSS_acceleration,
68 float GNSS_heading,
70 );
71
72 inline void set_from_euler( float r, float n, float y)
73 {
74 attitude.from_euler( r, n, y);
75 attitude.get_rotation_matrix( body2nav);
76 euler = attitude;
77 }
78 inline eulerangle<ftype> get_euler(void) const
79 {
80 return euler;
81 }
83 {
84 return attitude;
85 }
86 inline const float3vector &get_nav_acceleration(void) const
87 {
88 return acceleration_nav_frame;
89 }
90 inline const float3vector &get_nav_induction(void) const
91 {
92 return induction_nav_frame;
93 }
94 inline float get_north(void) const
95 {
96 return attitude.get_north();
97 }
98 inline float get_east(void) const
99 {
100 return attitude.get_east();
101 }
102 inline float get_down(void) const
103 {
104 return attitude.get_down();
105 }
106 inline float get_cross_acc_correction(void) const
107 {
108 return cross_acc_correction;
109 }
110 inline const float3vector get_orientation(void) const
111 {
113 retv[NORTH] = get_north();
114 retv[EAST] = get_east();
115 retv[DOWN] = get_down();
116 return retv;
117 }
118 inline const float3vector &get_gyro_correction(void) const
119 {
120 return gyro_correction;
121 }
122 inline const float3matrix &get_body2nav( void) const
123 {
124 return body2nav;
125 }
127 {
128 return nav_correction;
129 }
131 {
132 return gyro_correction;
133 }
135 {
136 return circling_state;
137 }
139 float
141 {
142 return slip_angle_averager.get_output();
143 }
144
145 float
147 {
148 return pitch_angle_averager.get_output();
149 }
150
151 float get_turn_rate( void ) const
152 {
153 return turn_rate_averager.get_output();
154 }
155 float get_G_load( void ) const
156 {
157 return G_load_averager.get_output();
158 }
159
160 void update_compass(
161 const float3vector &gyro, const float3vector &acc, const float3vector &mag,
162 const float3vector &GNSS_acceleration);
163#if 1 // SOFT_IRON_TEST
164 void update_ACC_only(
165 const float3vector &gyro, const float3vector &acc, const float3vector &mag,
166 const float3vector &GNSS_acceleration);
167#endif
168 float
170 {
171 return heading_difference_AHRS_DGNSS;
172 }
173
175 {
176 return magnetic_disturbance;
177 }
178
180 {
181 return body_induction_error;
182 }
183
185 {
186 return body_induction;
187 }
188
190 {
191 return gyro_correction_power;
192 }
193
194private:
195 void handle_magnetic_calibration( char type);
196
197 void update_magnetic_loop_gain( void)
198 {
199 float expected_horizontal_induction = SQRT( SQR(expected_nav_induction[EAST])+SQR(expected_nav_induction[NORTH]));
200 if( expected_horizontal_induction < 0.001f) // fail-safe default
201 magnetic_control_gain = M_H_GAIN;
202 else
203 magnetic_control_gain = M_H_GAIN / expected_horizontal_induction;
204 }
205
206 void feed_magnetic_induction_observer(const float3vector &mag_sensor);
207 circle_state_t update_circling_state( void);
208
209 void update_diff_GNSS( const float3vector &gyro, const float3vector &acc, const float3vector &mag,
210 const float3vector &GNSS_acceleration,
211 float GNSS_heading);
212
213 void update_attitude( const float3vector &acc, const float3vector &gyro, const float3vector &mag);
214
215 ftype Ts;
216 ftype Ts_div_2;
217 quaternion<ftype>attitude;
218 float3vector gyro_integrator;
219 unsigned circling_counter;
220 circle_state_t circling_state;
221 float3vector nav_correction;
222 float3vector gyro_correction;
223 float3vector acceleration_nav_frame;
224 float3vector induction_nav_frame;
225 float3vector expected_nav_induction;
226 float3vector expected_body_induction;
227 float3matrix body2nav;
228 eulerangle<ftype> euler;
229 pt2<float,float> slip_angle_averager;
230 pt2<float,float> pitch_angle_averager;
231 pt2<float,float> turn_rate_averager;
232 pt2<float,float> G_load_averager;
233 linear_least_square_fit<int64_t, float> mag_calibration_data_collector_right_turn[3];
234 linear_least_square_fit<int64_t, float> mag_calibration_data_collector_left_turn[3];
235 compass_calibration_t <int64_t, float> compass_calibration;
236 compass_calibrator_3D calib_3D;
237 float antenna_DOWN_correction;
238 float antenna_RIGHT_correction;
239 float heading_difference_AHRS_DGNSS;
240 float cross_acc_correction;
241 float magnetic_disturbance;
242 float magnetic_control_gain;
243 bool automatic_magnetic_calibration;
244 bool automatic_earth_field_parameters; // todo unused, remove me some day
245 bool magnetic_calibration_updated;
246 float3vector body_induction;
247 float3vector body_induction_error;
248 float gyro_correction_power;
249};
250
251#endif /* AHRS_H_ */
@ ROLL
Definition AHRS.h:40
@ YAW
Definition AHRS.h:40
@ PITCH
Definition AHRS.h:40
integrator< float, float3vector > vector3integrator
Definition AHRS.h:46
circle_state_t
Definition AHRS.h:44
@ TRANSITION
Definition AHRS.h:44
@ STRAIGHT_FLIGHT
Definition AHRS.h:44
@ CIRCLING
Definition AHRS.h:44
@ DOWN
Definition AHRS.h:42
@ EAST
Definition AHRS.h:42
@ NORTH
Definition AHRS.h:42
float3vector nav_induction
@ FRONT
Definition AHRS.h:41
@ BOTTOM
Definition AHRS.h:41
@ RIGHT
Definition AHRS.h:41
measurement data fusion filter
#define M_H_GAIN
Attitude controller: horizontal gain magnetic.
Attitude and heading reference system.
Definition AHRS.h:50
float3vector getBodyInductionError() const
Definition AHRS.h:179
float getSlipAngle() const
Definition AHRS.h:140
float get_down(void) const
Definition AHRS.h:102
float get_east(void) const
Definition AHRS.h:98
void update_magnetic_induction_data(float declination, float inclination)
Definition AHRS.h:55
const float3matrix & get_body2nav(void) const
Definition AHRS.h:122
float get_G_load(void) const
Definition AHRS.h:155
float get_north(void) const
Definition AHRS.h:94
const float3vector & get_gyro_correction(void) const
Definition AHRS.h:118
const float3vector & get_gyro_correction(void)
Definition AHRS.h:130
eulerangle< ftype > get_euler(void) const
Definition AHRS.h:78
void write_calibration_into_EEPROM(void)
Definition AHRS.cpp:429
circle_state_t get_circling_state(void) const
Definition AHRS.h:134
float getPitchAngle() const
Definition AHRS.h:146
void attitude_setup(const float3vector &acceleration, const float3vector &induction)
initial attitude setup from observables
Definition AHRS.cpp:41
quaternion< ftype > get_attitude(void) const
Definition AHRS.h:82
const float3vector & get_nav_acceleration(void) const
Definition AHRS.h:86
float getMagneticDisturbance() const
Definition AHRS.h:174
float getHeadingDifferenceAhrsDgnss() const
Definition AHRS.h:169
void update_ACC_only(const float3vector &gyro, const float3vector &acc, const float3vector &mag, const float3vector &GNSS_acceleration)
rotate quaternion taking angular rate readings
Definition AHRS.cpp:387
float getGyro_correction_Power() const
Definition AHRS.h:189
const float3vector & get_nav_induction(void) const
Definition AHRS.h:90
void update_compass(const float3vector &gyro, const float3vector &acc, const float3vector &mag, const float3vector &GNSS_acceleration)
rotate quaternion taking angular rate readings
Definition AHRS.cpp:303
float3vector getBodyInduction() const
Definition AHRS.h:184
float get_turn_rate(void) const
Definition AHRS.h:151
float get_cross_acc_correction(void) const
Definition AHRS.h:106
const float3vector get_orientation(void) const
Definition AHRS.h:110
const float3vector & get_nav_correction(void)
Definition AHRS.h:126
void update(const float3vector &gyro, const float3vector &acc, const float3vector &mag, const float3vector &GNSS_acceleration, float GNSS_heading, bool GNSS_heading_valid)
Definition AHRS.cpp:168
void set_from_euler(float r, float n, float y)
Definition AHRS.h:72
3 dimensional magnetic calibration and error compensation mechanism
datatype get_output(void) const
Definition pt2.h:88
datatype get_north(void) const
get north component of attitude
Definition quaternion.h:81
void from_euler(datatype p, datatype q, datatype r)
euler angle -> quaternion transformation
Definition quaternion.h:139
datatype get_down(void) const
get down component of attitude
Definition quaternion.h:101
datatype get_east(void) const
get east component of attitude
Definition quaternion.h:91
void get_rotation_matrix(matrix< datatype, 3 > &m) const
quaternion -> rotation matrix transformation
Definition quaternion.h:156
Automatic compass calibration using a linear least square fit algorithm.
induction sensor calibration and magnetic disturbance compensation
defines platform-dependent algorithms and constants
#define SIN(x)
#define ftype
#define COS(x)
#define M_PI_F
#define SQRT(x)
integrate data (template)
tunable second order IIR lowpass filter (butterworth)
quaternion for 3d attitude representation (template)
#define SQR(x)