@@ -73,17 +73,30 @@ class wind_oberserver_t
7373
7474 void process_at_100_Hz ( const float3vector &instant_wind)
7575 {
76- wind_resampler_100_10Hz.respond ( instant_wind);
77- instant_wind_averager.respond ( instant_wind);
76+ if ( instant_wind.abs () < NEGLECTABLE_WIND) // avoid float instability
77+ {
78+ wind_resampler_100_10Hz.settle ({0 });
79+ instant_wind_averager.settle ({0 });
80+ }
81+ else
82+ {
83+ wind_resampler_100_10Hz.respond ( instant_wind);
84+ instant_wind_averager.respond ( instant_wind);
85+ }
7886 }
7987
8088 void process_at_10_Hz ( const AHRS_type & ahrs)
8189 {
8290 circling_state = ahrs.get_circling_state ();
83- wind_average_observer.update (
84- wind_resampler_100_10Hz.get_output (),
85- ahrs.get_euler ().y ,
86- circling_state);
91+
92+ float3vector instant_wind = wind_resampler_100_10Hz.get_output ();
93+ if ( instant_wind.abs () < NEGLECTABLE_WIND) // avoid float instability
94+ wind_average_observer.relax ();
95+ else
96+ wind_average_observer.update (
97+ instant_wind,
98+ ahrs.get_euler ().y ,
99+ circling_state);
87100
88101 float3vector relative_wind_NAV = wind_resampler_100_10Hz.get_output () - wind_average_observer.get_output ();
89102 float3vector relative_wind_BODY = ahrs.get_body2nav ().reverse_map (relative_wind_NAV);
@@ -99,15 +112,16 @@ class wind_oberserver_t
99112 relative_wind_observer.reset ({0 });
100113 }
101114 else
102- relative_wind_observer.update ( relative_wind_BODY, ahrs.get_euler ().y , ahrs.get_circling_state ());
115+ {
116+ relative_wind_observer.update ( relative_wind_BODY, ahrs.get_euler ().y , ahrs.get_circling_state ());
117+ wind_correction_nav = ahrs.get_body2nav () * relative_wind_observer.get_output ();
118+ wind_correction_nav[DOWN]=0 .0f ;
119+
120+ corrected_wind_averager.respond ( wind_resampler_100_10Hz.get_output () - wind_correction_nav);
121+ circling_wind_averager.update ( wind_resampler_100_10Hz.get_output () - wind_correction_nav);
122+ }
103123 }
104124
105- wind_correction_nav = ahrs.get_body2nav () * relative_wind_observer.get_output ();
106- wind_correction_nav[DOWN]=0 .0f ;
107-
108- corrected_wind_averager.respond ( wind_resampler_100_10Hz.get_output () - wind_correction_nav);
109- circling_wind_averager.update ( wind_resampler_100_10Hz.get_output () - wind_correction_nav);
110-
111125 old_circling_state = circling_state;
112126 }
113127
0 commit comments