diff --git a/src/modules/fw_pos_control_l1/FixedwingPositionControl.cpp b/src/modules/fw_pos_control_l1/FixedwingPositionControl.cpp index 9f167f5a91b5a0f4c625c56c45b3c0b63c927fee..ac6f0559176dacc65e34992780e169323f8d2cd3 100644 --- a/src/modules/fw_pos_control_l1/FixedwingPositionControl.cpp +++ b/src/modules/fw_pos_control_l1/FixedwingPositionControl.cpp @@ -1314,8 +1314,13 @@ FixedwingPositionControl::control_landing(const Vector2f &curr_pos, const Vector _fw_pos_ctrl_status.abort_landing = false; } - float bearing_lastwp_currwp = get_bearing_to_next_waypoint(prev_wp(0), prev_wp(1), curr_wp(0), curr_wp(1)); - float bearing_airplane_currwp = get_bearing_to_next_waypoint(curr_pos(0), curr_pos(1), curr_wp(0), curr_wp(1)); + const float bearing_airplane_currwp = get_bearing_to_next_waypoint(curr_pos(0), curr_pos(1), curr_wp(0), curr_wp(1)); + + float bearing_lastwp_currwp = bearing_airplane_currwp; + + if (pos_sp_prev.valid) { + bearing_lastwp_currwp = get_bearing_to_next_waypoint(prev_wp(0), prev_wp(1), curr_wp(0), curr_wp(1)); + } /* Horizontal landing control */ /* switch to heading hold for the last meters, continue heading hold after */ @@ -1417,16 +1422,6 @@ FixedwingPositionControl::control_landing(const Vector2f &curr_pos, const Vector } } - /* Calculate distance (to landing waypoint) and altitude of last ordinary waypoint L */ - float L_altitude_rel = 0.0f; - - if (pos_sp_prev.valid) { - L_altitude_rel = pos_sp_prev.alt - terrain_alt; - } - - float landing_slope_alt_rel_desired = _landingslope.getLandingSlopeRelativeAltitudeSave(wp_distance, - bearing_lastwp_currwp, bearing_airplane_currwp); - /* Check if we should start flaring with a vertical and a * horizontal limit (with some tolerance) * The horizontal limit is only applied when we are in front of the wp @@ -1510,11 +1505,15 @@ FixedwingPositionControl::control_landing(const Vector2f &curr_pos, const Vector * if current position is below the slope continue at previous wp altitude * until the intersection with slope * */ - float altitude_desired_rel{0.0f}; + + float altitude_desired = terrain_alt; + + const float landing_slope_alt_rel_desired = _landingslope.getLandingSlopeRelativeAltitudeSave(wp_distance, + bearing_lastwp_currwp, bearing_airplane_currwp); if (_global_pos.alt > terrain_alt + landing_slope_alt_rel_desired || _land_onslope) { /* stay on slope */ - altitude_desired_rel = landing_slope_alt_rel_desired; + altitude_desired = terrain_alt + landing_slope_alt_rel_desired; if (!_land_onslope) { mavlink_log_info(&_mavlink_log_pub, "Landing, on slope"); @@ -1524,16 +1523,16 @@ FixedwingPositionControl::control_landing(const Vector2f &curr_pos, const Vector } else { /* continue horizontally */ if (pos_sp_prev.valid) { - altitude_desired_rel = L_altitude_rel; + altitude_desired = pos_sp_prev.alt; } else { - altitude_desired_rel = _global_pos.alt - terrain_alt; + altitude_desired = _global_pos.alt; } } const float airspeed_approach = _parameters.land_airspeed_scale * _parameters.airspeed_min; - tecs_update_pitch_throttle(terrain_alt + altitude_desired_rel, + tecs_update_pitch_throttle(altitude_desired, calculate_target_airspeed(airspeed_approach), radians(_parameters.pitch_limit_min), radians(_parameters.pitch_limit_max),