@@ -174,51 +174,31 @@ void TECS::_update_speed_setpoint()
174
174
175
175
}
176
176
177
- void TECS::_update_height_setpoint (float desired, float state)
177
+ void TECS::updateHeightRateSetpoint (float alt_sp_amsl_m, float target_climbrate_m_s, float target_sinkrate_m_s,
178
+ float alt_amsl)
178
179
{
179
- // Detect first time through and initialize previous value to demand
180
- if (PX4_ISFINITE (desired) && fabsf (_hgt_setpoint_in_prev) < 0 .1f ) {
181
- _hgt_setpoint_in_prev = desired;
182
- }
183
-
184
- // Apply a 2 point moving average to demanded height to reduce
185
- // intersampling noise effects.
186
- if (PX4_ISFINITE (desired)) {
187
- _hgt_setpoint = 0 .5f * (desired + _hgt_setpoint_in_prev);
180
+ target_climbrate_m_s = math::min (target_climbrate_m_s, _max_climb_rate);
181
+ target_sinkrate_m_s = math::min (target_sinkrate_m_s, _max_sink_rate);
188
182
189
- } else {
190
- _hgt_setpoint = _hgt_setpoint_in_prev;
191
- }
183
+ float feedforward_height_rate = 0 .0f ;
192
184
193
- _hgt_setpoint_in_prev = _hgt_setpoint;
185
+ if (fabsf (alt_sp_amsl_m - _hgt_setpoint) < math::max (target_sinkrate_m_s, target_climbrate_m_s) * _dt) {
186
+ _hgt_setpoint = alt_sp_amsl_m;
194
187
195
- // Apply a rate limit to respect vehicle performance limitations
196
- if (( _hgt_setpoint - _hgt_setpoint_prev) > (_max_climb_rate * _dt)) {
197
- _hgt_setpoint = _hgt_setpoint_prev + _max_climb_rate * _dt ;
188
+ } else if (alt_sp_amsl_m > _hgt_setpoint) {
189
+ _hgt_setpoint += target_climbrate_m_s * _dt;
190
+ feedforward_height_rate = target_climbrate_m_s ;
198
191
199
- } else if ((_hgt_setpoint - _hgt_setpoint_prev) < (-_max_sink_rate * _dt)) {
200
- _hgt_setpoint = _hgt_setpoint_prev - _max_sink_rate * _dt;
192
+ } else if (alt_sp_amsl_m < _hgt_setpoint) {
193
+ _hgt_setpoint -= target_sinkrate_m_s * _dt;
194
+ feedforward_height_rate = -target_sinkrate_m_s;
201
195
}
202
196
203
- _hgt_setpoint_prev = _hgt_setpoint;
204
-
205
- // Apply a first order noise filter
206
- _hgt_setpoint_adj = 0 .1f * _hgt_setpoint + 0 .9f * _hgt_setpoint_adj_prev;
207
-
208
197
// Use a first order system to calculate a height rate setpoint from the current height error.
209
198
// Additionally, allow to add feedforward from heigh setpoint change
210
- _hgt_rate_setpoint = (_hgt_setpoint_adj - state) * _height_error_gain + _height_setpoint_gain_ff *
211
- (_hgt_setpoint_adj - _hgt_setpoint_adj_prev) / _dt;
212
-
213
- _hgt_setpoint_adj_prev = _hgt_setpoint_adj;
214
-
215
- // Limit the rate of change of height demand to respect vehicle performance limits
216
- if (_hgt_rate_setpoint > _max_climb_rate) {
217
- _hgt_rate_setpoint = _max_climb_rate;
218
-
219
- } else if (_hgt_rate_setpoint < -_max_sink_rate) {
220
- _hgt_rate_setpoint = -_max_sink_rate;
221
- }
199
+ _hgt_rate_setpoint = (_hgt_setpoint - alt_amsl) * _height_error_gain + _height_setpoint_gain_ff *
200
+ feedforward_height_rate;
201
+ _hgt_rate_setpoint = math::constrain (_hgt_rate_setpoint, -_max_sink_rate, _max_climb_rate);
222
202
}
223
203
224
204
void TECS::_detect_underspeed ()
@@ -229,7 +209,7 @@ void TECS::_detect_underspeed()
229
209
}
230
210
231
211
if (((_tas_state < _TAS_min * 0 .9f ) && (_last_throttle_setpoint >= _throttle_setpoint_max * 0 .95f ))
232
- || ((_vert_pos_state < _hgt_setpoint_adj ) && _underspeed_detected)) {
212
+ || ((_vert_pos_state < _hgt_setpoint ) && _underspeed_detected)) {
233
213
234
214
_underspeed_detected = true ;
235
215
@@ -241,7 +221,7 @@ void TECS::_detect_underspeed()
241
221
void TECS::_update_energy_estimates ()
242
222
{
243
223
// Calculate specific energy demands in units of (m**2/sec**2)
244
- _SPE_setpoint = _hgt_setpoint_adj * CONSTANTS_ONE_G; // potential energy
224
+ _SPE_setpoint = _hgt_setpoint * CONSTANTS_ONE_G; // potential energy
245
225
_SKE_setpoint = 0 .5f * _TAS_setpoint_adj * _TAS_setpoint_adj; // kinetic energy
246
226
247
227
// Calculate total energy error
@@ -477,10 +457,7 @@ void TECS::_initialize_states(float pitch, float throttle_cruise, float baro_alt
477
457
_last_throttle_setpoint = (_in_air ? throttle_cruise : 0 .0f );;
478
458
_last_pitch_setpoint = constrain (pitch, _pitch_setpoint_min, _pitch_setpoint_max);
479
459
_pitch_setpoint_unc = _last_pitch_setpoint;
480
- _hgt_setpoint_adj_prev = baro_altitude;
481
- _hgt_setpoint_adj = _hgt_setpoint_adj_prev;
482
- _hgt_setpoint_prev = _hgt_setpoint_adj_prev;
483
- _hgt_setpoint_in_prev = _hgt_setpoint_adj_prev;
460
+ _hgt_setpoint = baro_altitude;
484
461
_TAS_setpoint_last = _EAS * EAS2TAS;
485
462
_TAS_setpoint_adj = _TAS_setpoint_last;
486
463
_underspeed_detected = false ;
@@ -499,15 +476,12 @@ void TECS::_initialize_states(float pitch, float throttle_cruise, float baro_alt
499
476
// throttle lower limit is set to a value that prevents throttle reduction
500
477
_throttle_setpoint_min = _throttle_setpoint_max - 0 .01f ;
501
478
502
- // height demand and associated states are set to track the measured height
503
- _hgt_setpoint_adj_prev = baro_altitude;
504
- _hgt_setpoint_adj = _hgt_setpoint_adj_prev;
505
- _hgt_setpoint_prev = _hgt_setpoint_adj_prev;
506
-
507
479
// airspeed demand states are set to track the measured airspeed
508
480
_TAS_setpoint_last = _EAS * EAS2TAS;
509
481
_TAS_setpoint_adj = _EAS * EAS2TAS;
510
482
483
+ _hgt_setpoint = baro_altitude;
484
+
511
485
// disable speed and decent error condition checks
512
486
_underspeed_detected = false ;
513
487
_uncommanded_descent_recovery = false ;
@@ -535,7 +509,8 @@ void TECS::_update_STE_rate_lim()
535
509
536
510
void TECS::update_pitch_throttle (float pitch, float baro_altitude, float hgt_setpoint,
537
511
float EAS_setpoint, float equivalent_airspeed, float eas_to_tas, bool climb_out_setpoint, float pitch_min_climbout,
538
- float throttle_min, float throttle_max, float throttle_cruise, float pitch_limit_min, float pitch_limit_max)
512
+ float throttle_min, float throttle_max, float throttle_cruise, float pitch_limit_min, float pitch_limit_max,
513
+ float target_climbrate, float target_sinkrate)
539
514
{
540
515
// Calculate the time since last update (seconds)
541
516
uint64_t now = hrt_absolute_time ();
@@ -573,8 +548,8 @@ void TECS::update_pitch_throttle(float pitch, float baro_altitude, float hgt_set
573
548
// Calculate the demanded true airspeed
574
549
_update_speed_setpoint ();
575
550
576
- // Calculate the demanded height
577
- _update_height_setpoint (hgt_setpoint, baro_altitude);
551
+ // calculate heigh rate setpoint based on altitude demand
552
+ updateHeightRateSetpoint (hgt_setpoint, target_climbrate, target_sinkrate , baro_altitude);
578
553
579
554
// Calculate the specific energy values required by the control loop
580
555
_update_energy_estimates ();
0 commit comments