Larus glider flight sensor system 3.9.2024
Software-In-The-Loop test and validation system
Loading...
Searching...
No Matches
organizer.h
Go to the documentation of this file.
1/***********************************************************************/
25#ifndef ORGANIZER_H_
26#define ORGANIZER_H_
27
28#include <variometer.h>
29#include "data_structures.h"
30#include "navigator.h"
32
35{
36public:
38 : pitot_offset(0.0f),
39 pitot_span(0.0f),
40 QNH_offset(0.0f),
41 magnetic_induction_update_counter(0)
42 {
43
44 }
45
47 {
48 pitot_offset= configuration (PITOT_OFFSET);
49 pitot_span = configuration (PITOT_SPAN);
50 QNH_offset = configuration (QNH_OFFSET);
51
52 {
54 q.from_euler (configuration (SENS_TILT_ROLL),
57 q.get_rotation_matrix (sensor_mapping);
58 }
59
60 }
61
62 void update_magnetic_induction_data( double latitude, double longitude)
63 {
66 if( induction_data.valid)
67 navigator.update_magnetic_induction_data( induction_data.declination, induction_data.inclination);
68 }
69
71 {
72 navigator.update_pressure( output_data.m.static_pressure - QNH_offset);
73 navigator.initialize_QFF_density_metering( -output_data.c.position[DOWN]);
74 navigator.reset_altitude ();
75
76 // setup initial attitude
77 acc = sensor_mapping * output_data.m.acc;
78 mag = sensor_mapping * output_data.m.mag;
79
80 if (output_data.c.sat_fix_type & SAT_HEADING)
81 {
82 navigator.set_attitude ( 0.0f, 0.0f, output_data.c.relPosHeading); // todo use acc data some day ?
83 }
84 else
85 navigator.set_from_add_mag( acc, mag); // initialize attitude from acceleration + compass
86 }
87
89 {
90 navigator.update_pressure(output_data.m.static_pressure - QNH_offset);
91 navigator.update_pitot ( (output_data.m.pitot_pressure - pitot_offset) * pitot_span);
92 }
93
95 {
96 bool landing_detected = navigator.update_at_10Hz ();
97 navigator.feed_QFF_density_metering( output_data.m.static_pressure - QNH_offset, -output_data.c.position[DOWN]);
98
99 if( ++magnetic_induction_update_counter > 36000) // every hour
100 {
102 magnetic_induction_update_counter=0;
103 }
104 return landing_detected;
105 }
106
107 void set_attitude ( float roll, float nick, float present_heading)
108 {
109 navigator.set_attitude ( roll, nick, present_heading);
110 }
111 void update_GNSS_data( const coordinates_t &coordinates)
112 {
113 navigator.update_GNSS_data(coordinates);
114 }
115
117 {
118#if 0 // modify many parameters
119 // rotate sensor coordinates into airframe coordinates
121
122 acc_mod[0] += tweaks[0];
123 acc_mod[0] *= 1.0f + tweaks[1];
124 acc_mod[1] += tweaks[2];
125 acc_mod[1] *= 1.0f + tweaks[3];
126 acc_mod[2] += tweaks[4];
127 acc_mod[2] *= 1.0f + tweaks[5];
128
130
131 mag_mod[0] += tweaks[9] * output_data.m.mag[1] + tweaks[10] * output_data.m.mag[2];
132 mag_mod[1] += tweaks[11] * output_data.m.mag[0] + tweaks[12] * output_data.m.mag[2];
133 mag_mod[2] += tweaks[13] * output_data.m.mag[0] + tweaks[14] * output_data.m.mag[1];
134
136
137 gyro_mod[0] *= 1.0f + tweaks[6];
138 gyro_mod[1] *= 1.0f + tweaks[7];
139 gyro_mod[2] *= 1.0f + tweaks[8];
140
141 acc = sensor_mapping * acc_mod;
142 mag = sensor_mapping * mag_mod;
143 gyro = sensor_mapping * gyro_mod;
144#endif
145#if 1
147 acc_mod[0] = (1.0f + tweaks[0]) * output_data.m.acc[0] + tweaks[1];
148 acc_mod[1] = (1.0f + tweaks[2]) * output_data.m.acc[1] + tweaks[3];
149 acc_mod[2] = (1.0f + tweaks[4]) * output_data.m.acc[2] + tweaks[5];
150
151 acc = sensor_mapping * acc_mod;
152 mag = sensor_mapping * output_data.m.mag;
153 gyro = sensor_mapping * output_data.m.gyro;
154#endif
155#if 0 // magnetic sensor matrix optimization matrix
157 mag_mod[0] = 1.0f * output_data.m.mag[0] + tweaks[1] * output_data.m.mag[1] + tweaks[2] * output_data.m.mag[2];
158 mag_mod[1] = tweaks[3] * output_data.m.mag[0] + 1.0f * output_data.m.mag[1] + tweaks[5] * output_data.m.mag[2];
159 mag_mod[2] = tweaks[6] * output_data.m.mag[0] + tweaks[7] * output_data.m.mag[1] + 1.0f * output_data.m.mag[2];
160
161 acc = sensor_mapping * output_data.m.acc;
162 mag = sensor_mapping * mag_mod;
163 gyro = sensor_mapping * output_data.m.gyro;
164#endif
165#if 0 // gyro matrix
167
168 gyro_mod[0] = (1.0f + tweaks[0]) * output_data.m.gyro[0] + tweaks[1] * output_data.m.gyro[1] + tweaks[2] * output_data.m.gyro[2];
169 gyro_mod[1] = tweaks[3] * output_data.m.gyro[0] + (1.0f + tweaks[4]) * output_data.m.gyro[1] + tweaks[5] * output_data.m.gyro[2];
170 gyro_mod[2] = tweaks[6] * output_data.m.gyro[0] + tweaks[7] * output_data.m.gyro[1] + (1.0f + tweaks[8]) * output_data.m.gyro[2];
171
172 acc = sensor_mapping * output_data.m.acc;
173 mag = sensor_mapping * output_data.m.mag;
174 gyro = sensor_mapping * gyro_mod;
175#endif
176#if DEVELOPMENT_ADDITIONS
177 output_data.body_acc = acc;
178 output_data.body_gyro = gyro;
179#endif
180
181 navigator.update_at_100Hz (acc, mag, gyro);
182 }
183
185 {
186 navigator.report_data ( data);
187 }
188
189 void set_density_data( float temp, float humidity)
190 {
191 navigator.set_density_data( temp, humidity);
192 }
193
195 {
196 navigator.disregard_density_data();
197 }
198
199private:
200 navigator_t navigator;
201 float3vector acc;
202 float3vector mag;
203 float3vector gyro;
204 float3matrix sensor_mapping;
205 float pitot_offset;
206 float pitot_span;
207 float QNH_offset;
208 unsigned magnetic_induction_update_counter;
209};
210
211#endif /* ORGANIZER_H_ */
@ DOWN
Definition AHRS.h:42
#define SAT_HEADING
Definition GNSS.h:100
induction_values get_induction_data_at(double longitude, double latitude)
organizes horizontal navigation, wind observation and variometer
Definition navigator.h:42
void reset_altitude(void)
Definition navigator.h:120
void set_density_data(float temperature, float humidity)
Definition navigator.h:78
void update_pressure(float pressure)
update absolute pressure called @ 100 Hz
Definition navigator.h:114
void initialize_QFF_density_metering(float MSL_altitude)
Definition navigator.h:85
bool update_at_10Hz()
slow update flight observer data
Definition navigator.cpp:85
void update_at_100Hz(const float3vector &acc, const float3vector &mag, const float3vector &gyro)
update AHRS from IMU
Definition navigator.cpp:28
void set_from_add_mag(const float3vector &acc, const float3vector &mag)
Definition navigator.h:102
void report_data(output_data_t &d)
copy all navigator data into output_data structure
void feed_QFF_density_metering(float pressure, float MSL_altitude)
Definition navigator.h:90
void update_pitot(float pressure)
update pitot pressure called @ 100 Hz
Definition navigator.h:130
void disregard_density_data(void)
Definition navigator.h:95
void update_magnetic_induction_data(float declination, float inclination)
Definition navigator.h:70
void update_GNSS_data(const coordinates_t &coordinates)
update on new navigation data from GNSS
Definition navigator.cpp:62
void set_attitude(float roll, float nick, float yaw)
return aggregate flight observer
Definition navigator.h:182
set of algorithms and data to be used by Larus flight sensor
Definition organizer.h:35
organizer_t(void)
Definition organizer.h:37
void update_every_10ms(output_data_t &output_data, float *tweaks)
Definition organizer.h:116
void disregard_density_data()
Definition organizer.h:194
void update_GNSS_data(const coordinates_t &coordinates)
Definition organizer.h:111
void initialize_after_first_measurement(output_data_t &output_data)
Definition organizer.h:70
void set_density_data(float temp, float humidity)
Definition organizer.h:189
void report_data(output_data_t &data)
Definition organizer.h:184
void initialize_before_measurement(void)
Definition organizer.h:46
bool update_every_100ms(output_data_t &output_data)
Definition organizer.h:94
void on_new_pressure_data(output_data_t &output_data)
Definition organizer.h:88
void set_attitude(float roll, float nick, float present_heading)
Definition organizer.h:107
void update_magnetic_induction_data(double latitude, double longitude)
Definition organizer.h:62
mathematical vector of arbitrary type and size
Definition vector.h:40
earth_induction_model_t earth_induction_model
one singleton object of this type
find position-dependent data for magnetic declination and magnetic inclination
combine sensor observations to provide flight-relevant data
float configuration(EEPROM_PARAMETER_ID id)
Contains all important data from the GNSS.
Definition GNSS.h:104
struct containing magnetic induction data for a point
combination of all input and output data in one structure