Larus glider flight sensor system 3.9.2024
Software-In-The-Loop test and validation system
Loading...
Searching...
No Matches
wind_observer.h
Go to the documentation of this file.
1/***********************************************************************/
25#ifndef NAV_ALGORITHMS_WIND_OBSERVER_H_
26#define NAV_ALGORITHMS_WIND_OBSERVER_H_
27
28#include "float3vector.h"
29#include "pt2.h"
32#include "persistent_data.h"
33
36{
37public:
39 :wind_resampler_100_10Hz(0.04f),
40 instant_wind_averager( configuration( WIND_TC) < 0.25f
43 wind_average_observer( configuration( MEAN_WIND_TC) < 0.25f
46 relative_wind_observer( configuration( MEAN_WIND_TC) < 0.25f
47 ? configuration( MEAN_WIND_TC) * 10.0f
49 corrected_wind_averager( configuration( MEAN_WIND_TC) < 0.25f
50 ? configuration( MEAN_WIND_TC) * 10.0f
52 circling_wind_averager(),
53 circling_state( STRAIGHT_FLIGHT),
54 old_circling_state( STRAIGHT_FLIGHT),
55 wind_correction_nav()
56 {}
57
58 // wind reported to the user
60 {
61 if( circling_state != STRAIGHT_FLIGHT)
62 return wind_average_observer.get_output(); // report last circle mean
63 else
64 return instant_wind_averager.get_output(); // report short-term average
65 }
66
68 {
69 if( circling_state == CIRCLING)
70 return circling_wind_averager.get_average();
71 else
72 return wind_average_observer.get_output();
73 }
74
76 {
77 if( instant_wind.abs() < NEGLECTABLE_WIND) // avoid float instability
78 {
79 wind_resampler_100_10Hz.settle({0});
80 instant_wind_averager.settle({0});
81 }
82 else
83 {
84 wind_resampler_100_10Hz.respond( instant_wind);
85 instant_wind_averager.respond( instant_wind);
86 }
87 }
88
89 void process_at_10_Hz( const AHRS_type & ahrs)
90 {
91 circling_state = ahrs.get_circling_state ();
92
93 float3vector instant_wind = wind_resampler_100_10Hz.get_output();
94 if( instant_wind.abs() < NEGLECTABLE_WIND) // avoid float instability
95 wind_average_observer.relax();
96 else
97 wind_average_observer.update(
99 ahrs.get_euler ().y,
100 circling_state);
101
102 float3vector relative_wind_NAV = wind_resampler_100_10Hz.get_output() - wind_average_observer.get_output();
104
105 if( circling_state == STRAIGHT_FLIGHT && old_circling_state == TRANSITION)
106 relative_wind_observer.reset({0});
107
108 if(( circling_state == CIRCLING))
109 {
110 if( old_circling_state == TRANSITION) // when starting to circle
111 {
112 circling_wind_averager.reset( wind_average_observer.get_output(), 100);
113 relative_wind_observer.reset({0});
114 }
115 else
116 {
117 relative_wind_observer.update( relative_wind_BODY, ahrs.get_euler ().y, ahrs.get_circling_state ());
118 wind_correction_nav = ahrs.get_body2nav() * relative_wind_observer.get_output();
119 wind_correction_nav[DOWN]=0.0f;
120
121 corrected_wind_averager.respond( wind_resampler_100_10Hz.get_output() - wind_correction_nav);
122 circling_wind_averager.update( wind_resampler_100_10Hz.get_output() - wind_correction_nav);
123 }
124 }
125
126 old_circling_state = circling_state;
127 }
128
130 {
131 return wind_resampler_100_10Hz.get_output();
132 }
133
134 float get_crosswind( void) const
135 {
136 return relative_wind_observer.get_output()[RIGHT];
137 }
138
139 float get_headwind( void) const
140 {
141 return relative_wind_observer.get_output()[FRONT];
142 }
143
145 {
146 return corrected_wind_averager.get_output();
147 }
148
150 {
151 return wind_average_observer.get_output();
152 }
153
154
155private:
156 pt2<float3vector,float> wind_resampler_100_10Hz;
157 pt2<float3vector,float> instant_wind_averager;
158 soaring_flight_averager< float3vector, true> wind_average_observer; // configure wind average clamping on first circle
160 pt2<float3vector,float> corrected_wind_averager;
161 accumulating_averager < float3vector> circling_wind_averager;
162 circle_state_t circling_state;
163 circle_state_t old_circling_state;
164 float3vector wind_correction_nav;
165};
166
167#endif /* NAV_ALGORITHMS_WIND_OBSERVER_H_ */
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
@ FRONT
Definition AHRS.h:41
@ RIGHT
Definition AHRS.h:41
#define FAST_SAMPLING_TIME
#define NEGLECTABLE_WIND
#define SLOW_SAMPLING_TIME
Attitude and heading reference system.
Definition AHRS.h:50
const float3matrix & get_body2nav(void) const
Definition AHRS.h:122
eulerangle< ftype > get_euler(void) const
Definition AHRS.h:78
circle_state_t get_circling_state(void) const
Definition AHRS.h:134
datatype y
Definition euler.h:17
mathematical vector of arbitrary type and size
Definition vector.h:40
datatype abs(void) const
vector abs operator returns absolute value
Definition vector.h:77
mechanisms to filter wind data
float3vector get_speed_compensator_wind(void) const
float3vector get_average_value(void) const
float3vector get_instant_value(void) const
float get_crosswind(void) const
float3vector get_measurement(void) const
void process_at_10_Hz(const AHRS_type &ahrs)
float get_headwind(void) const
void process_at_100_Hz(const float3vector &instant_wind)
float3vector get_corrected_wind(void) const
float configuration(EEPROM_PARAMETER_ID id)
definitions for persistent data in EEPROM or config. file
tunable second order IIR lowpass filter (butterworth)
specialized averager for circling and straight flight