Skip to content

Commit a6c232c

Browse files
Merged in BUGFIX_wind_decay
1 parent 26917e5 commit a6c232c

File tree

3 files changed

+33
-13
lines changed

3 files changed

+33
-13
lines changed

NAV_Algorithms/NAV_tuning_parameters.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#define DEFAULT_AVG_VARIO_TC 30.0f
4343
#define DEFAULT_WIND_TC 5.0f
4444
#define DEFAULT_WIND_AVG_TC 30.0f
45+
#define NEGLECTABLE_WIND 0.1f
4546

4647
// AHRS tuning parameters:
4748
// These parameters have been tuned for the flight-dynamics of gliders

NAV_Algorithms/soaring_flight_averager.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@ template<class value_t, bool CLAMP_OUTPUT_FIRST_CIRCLE = false, bool SOFT_TAKEOF
147147
return true;
148148
}
149149

150+
void relax( void)
151+
{
152+
averager.settle({0});
153+
}
154+
150155
private:
151156

152157
value_t get_boxcar_average( void)

NAV_Algorithms/wind_observer.h

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)