Browse Source

Plane: fixed landing after VTOL loiters

master
Henry Wurzburg 6 years ago committed by Andrew Tridgell
parent
commit
7178655cbe
  1. 15
      ArduPlane/quadplane.cpp

15
ArduPlane/quadplane.cpp

@ -2072,7 +2072,8 @@ void QuadPlane::vtol_position_controller(void) @@ -2072,7 +2072,8 @@ void QuadPlane::vtol_position_controller(void)
case QPOS_POSITION1: {
const Vector2f diff_wp = plane.current_loc.get_distance_NE(loc);
const float distance = diff_wp.length();
Vector2f groundspeed = ahrs.groundspeed_vector();
float speed_towards_target = distance>1?(diff_wp.normalized() * groundspeed):0;
if (poscontrol.speed_scale <= 0) {
// initialise scaling so we start off targeting our
// current linear speed towards the target. If this is
@ -2080,8 +2081,6 @@ void QuadPlane::vtol_position_controller(void) @@ -2080,8 +2081,6 @@ void QuadPlane::vtol_position_controller(void)
// land_speed_scale is then used to linearly change
// velocity as we approach the waypoint, aiming for zero
// speed at the waypoint
Vector2f groundspeed = ahrs.groundspeed_vector();
float speed_towards_target = distance>1?(diff_wp.normalized() * groundspeed):0;
// setup land_speed_scale so at current distance we
// maintain speed towards target, and slow down as we
// approach
@ -2137,9 +2136,15 @@ void QuadPlane::vtol_position_controller(void) @@ -2137,9 +2136,15 @@ void QuadPlane::vtol_position_controller(void)
than the actual velocity curve (for a high drag
aircraft). Nose down will cause a lot of downforce on the
wings which will draw a lot of current and also cause the
aircraft to lose altitude rapidly.
aircraft to lose altitude rapidly.pitch limit varies also with speed
to prevent inability to progress to position if moving from a loiter
to landing
*/
float pitch_limit_cd = linear_interpolate(-300, plane.aparm.pitch_limit_min_cd,
float minlimit = linear_interpolate(-aparm.angle_max, -300,
speed_towards_target,
wp_nav->get_default_speed_xy() * 0.01,
wp_nav->get_default_speed_xy() * 0.015);
float pitch_limit_cd = linear_interpolate(minlimit, plane.aparm.pitch_limit_min_cd,
plane.auto_state.wp_proportion, 0, 1);
if (plane.nav_pitch_cd < pitch_limit_cd) {
plane.nav_pitch_cd = pitch_limit_cd;

Loading…
Cancel
Save