|
|
|
@ -445,7 +445,7 @@ void AP_TECS::_update_height_demand(void)
@@ -445,7 +445,7 @@ void AP_TECS::_update_height_demand(void)
|
|
|
|
|
// us to consistently be above the desired glide slope. This will
|
|
|
|
|
// be replaced with a better zero-lag filter in the future.
|
|
|
|
|
float new_hgt_dem = _hgt_dem_adj; |
|
|
|
|
if (_flight_stage == FLIGHT_LAND_APPROACH || _flight_stage == FLIGHT_LAND_FINAL) { |
|
|
|
|
if (_flight_stage == FLIGHT_LAND_APPROACH || _flight_stage == FLIGHT_LAND_FINAL || _flight_stage == FLIGHT_LAND_PREFLARE) { |
|
|
|
|
new_hgt_dem += (_hgt_dem_adj - _hgt_dem_adj_last)*10.0f*(timeConstant()+1); |
|
|
|
|
} |
|
|
|
|
_hgt_dem_adj_last = _hgt_dem_adj; |
|
|
|
@ -495,6 +495,7 @@ void AP_TECS::_update_energies(void)
@@ -495,6 +495,7 @@ void AP_TECS::_update_energies(void)
|
|
|
|
|
float AP_TECS::timeConstant(void) const |
|
|
|
|
{ |
|
|
|
|
if (_flight_stage==FLIGHT_LAND_FINAL || |
|
|
|
|
_flight_stage==FLIGHT_LAND_PREFLARE || |
|
|
|
|
_flight_stage==FLIGHT_LAND_APPROACH) { |
|
|
|
|
if (_landTimeConst < 0.1f) { |
|
|
|
|
return 0.1f; |
|
|
|
@ -600,7 +601,7 @@ void AP_TECS::_update_throttle_option(int16_t throttle_nudge)
@@ -600,7 +601,7 @@ void AP_TECS::_update_throttle_option(int16_t throttle_nudge)
|
|
|
|
|
float nomThr; |
|
|
|
|
//If landing and we don't have an airspeed sensor and we have a non-zero
|
|
|
|
|
//TECS_LAND_THR param then use it
|
|
|
|
|
if ((_flight_stage == FLIGHT_LAND_APPROACH || _flight_stage== FLIGHT_LAND_FINAL) && |
|
|
|
|
if ((_flight_stage == FLIGHT_LAND_APPROACH || _flight_stage == FLIGHT_LAND_FINAL || _flight_stage == FLIGHT_LAND_PREFLARE) && |
|
|
|
|
_landThrottle >= 0) { |
|
|
|
|
nomThr = (_landThrottle + throttle_nudge) * 0.01f; |
|
|
|
|
} else { //not landing or not using TECS_LAND_THR parameter
|
|
|
|
@ -668,7 +669,9 @@ void AP_TECS::_update_pitch(void)
@@ -668,7 +669,9 @@ void AP_TECS::_update_pitch(void)
|
|
|
|
|
SKE_weighting = 0.0f; |
|
|
|
|
} else if ( _underspeed || _flight_stage == AP_TECS::FLIGHT_TAKEOFF || _flight_stage == AP_TECS::FLIGHT_LAND_ABORT) { |
|
|
|
|
SKE_weighting = 2.0f; |
|
|
|
|
} else if (_flight_stage == AP_TECS::FLIGHT_LAND_APPROACH || _flight_stage == AP_TECS::FLIGHT_LAND_FINAL) { |
|
|
|
|
} else if (_flight_stage == AP_TECS::FLIGHT_LAND_APPROACH || |
|
|
|
|
_flight_stage == AP_TECS::FLIGHT_LAND_PREFLARE || |
|
|
|
|
_flight_stage == AP_TECS::FLIGHT_LAND_FINAL) { |
|
|
|
|
if (_spdWeightLand < 0) { |
|
|
|
|
// use sliding scale from normal weight down to zero at landing
|
|
|
|
|
float scaled_weight = _spdWeight * (1.0f - _path_proportion); |
|
|
|
@ -849,7 +852,7 @@ void AP_TECS::update_pitch_throttle(int32_t hgt_dem_cm,
@@ -849,7 +852,7 @@ void AP_TECS::update_pitch_throttle(int32_t hgt_dem_cm,
|
|
|
|
|
|
|
|
|
|
// and allow zero throttle
|
|
|
|
|
_THRminf = 0; |
|
|
|
|
} else if (flight_stage == FLIGHT_LAND_APPROACH && (-_climb_rate) > _land_sink) { |
|
|
|
|
} else if ((flight_stage == FLIGHT_LAND_APPROACH || flight_stage == FLIGHT_LAND_PREFLARE) && (-_climb_rate) > _land_sink) { |
|
|
|
|
// constrain the pitch in landing as we get close to the flare
|
|
|
|
|
// point. Use a simple linear limit from 15 meters after the
|
|
|
|
|
// landing point
|
|
|
|
|