mirror of https://github.com/ArduPilot/ardupilot
Plane: improve target airspeed in landing approach
if the user hasn't set TECS_LAND_ARSPD then we can use an airspeed between ARSPD_FBW_MIN and TRIM_ARSPD_CM when on approach this also fixes landing_desired_closing_velocity() to never go above the landing target speed, so we don't try to speed up if we are starting the landing sequence too early
This commit is contained in:
parent
16da949467
commit
e0b4da9f68
|
@ -3923,6 +3923,16 @@ Vector2f QuadPlane::landing_desired_closing_velocity()
|
||||||
|
|
||||||
// base target speed based on sqrt of distance
|
// base target speed based on sqrt of distance
|
||||||
float target_speed = safe_sqrt(2*transition_decel*dist);
|
float target_speed = safe_sqrt(2*transition_decel*dist);
|
||||||
|
|
||||||
|
// don't let the target speed go above landing approach speed
|
||||||
|
const float eas2tas = plane.ahrs.get_EAS2TAS();
|
||||||
|
float land_speed = plane.aparm.airspeed_cruise_cm * 0.01;
|
||||||
|
float tecs_land_airspeed = plane.TECS_controller.get_land_airspeed();
|
||||||
|
if (is_positive(tecs_land_airspeed)) {
|
||||||
|
land_speed = tecs_land_airspeed;
|
||||||
|
}
|
||||||
|
target_speed = MIN(target_speed, eas2tas * land_speed);
|
||||||
|
|
||||||
Vector2f target_speed_xy = diff_wp.normalized() * target_speed;
|
Vector2f target_speed_xy = diff_wp.normalized() * target_speed;
|
||||||
|
|
||||||
return target_speed_xy;
|
return target_speed_xy;
|
||||||
|
@ -3933,26 +3943,38 @@ Vector2f QuadPlane::landing_desired_closing_velocity()
|
||||||
*/
|
*/
|
||||||
float QuadPlane::get_land_airspeed(void)
|
float QuadPlane::get_land_airspeed(void)
|
||||||
{
|
{
|
||||||
if (poscontrol.get_state() == QPOS_APPROACH ||
|
const auto qstate = poscontrol.get_state();
|
||||||
|
if (qstate == QPOS_APPROACH ||
|
||||||
plane.control_mode == &plane.mode_rtl) {
|
plane.control_mode == &plane.mode_rtl) {
|
||||||
float land_airspeed = plane.TECS_controller.get_land_airspeed();
|
const float cruise_speed = plane.aparm.airspeed_cruise_cm * 0.01;
|
||||||
if (!is_positive(land_airspeed)) {
|
float approach_speed = cruise_speed;
|
||||||
land_airspeed = plane.aparm.airspeed_cruise_cm * 0.01;
|
float tecs_land_airspeed = plane.TECS_controller.get_land_airspeed();
|
||||||
|
if (is_positive(tecs_land_airspeed)) {
|
||||||
|
approach_speed = tecs_land_airspeed;
|
||||||
|
} else {
|
||||||
|
if (qstate == QPOS_APPROACH) {
|
||||||
|
// default to half way between min airspeed and cruise
|
||||||
|
// airspeed when on the approach
|
||||||
|
approach_speed = 0.5*(cruise_speed+plane.aparm.airspeed_min);
|
||||||
|
} else {
|
||||||
|
// otherwise cruise
|
||||||
|
approach_speed = cruise_speed;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
float cruise_airspeed = plane.aparm.airspeed_cruise_cm * 0.01;
|
const float time_to_landing = plane.auto_state.wp_distance / MAX(approach_speed, 5);
|
||||||
float time_to_landing = plane.auto_state.wp_distance / MAX(land_airspeed, 5);
|
|
||||||
/*
|
/*
|
||||||
slow down to landing approach speed as we get closer to landing
|
slow down to landing approach speed as we get closer to landing
|
||||||
*/
|
*/
|
||||||
land_airspeed = linear_interpolate(land_airspeed, cruise_airspeed,
|
approach_speed = linear_interpolate(approach_speed, cruise_speed,
|
||||||
time_to_landing,
|
time_to_landing,
|
||||||
20, 60);
|
20, 60);
|
||||||
return land_airspeed;
|
return approach_speed;
|
||||||
}
|
}
|
||||||
Vector2f vel = landing_desired_closing_velocity();
|
|
||||||
|
|
||||||
const float eas2tas = plane.ahrs.get_EAS2TAS();
|
// calculate speed based on landing desired velocity
|
||||||
|
Vector2f vel = landing_desired_closing_velocity();
|
||||||
const Vector3f wind = plane.ahrs.wind_estimate();
|
const Vector3f wind = plane.ahrs.wind_estimate();
|
||||||
|
const float eas2tas = plane.ahrs.get_EAS2TAS();
|
||||||
vel.x -= wind.x;
|
vel.x -= wind.x;
|
||||||
vel.y -= wind.y;
|
vel.y -= wind.y;
|
||||||
vel /= eas2tas;
|
vel /= eas2tas;
|
||||||
|
|
Loading…
Reference in New Issue