mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-09 09:28:31 -04:00
AC_PosControl: stop I term build-up when motors at max
This commit is contained in:
parent
05c59c757c
commit
e565ee6d33
@ -589,9 +589,7 @@ void AC_PosControl::rate_to_accel_xy(float dt)
|
|||||||
{
|
{
|
||||||
const Vector3f &vel_curr = _inav.get_velocity(); // current velocity in cm/s
|
const Vector3f &vel_curr = _inav.get_velocity(); // current velocity in cm/s
|
||||||
float accel_total; // total acceleration in cm/s/s
|
float accel_total; // total acceleration in cm/s/s
|
||||||
|
float lat_i, lon_i;
|
||||||
// reset accel limit flag
|
|
||||||
_limit.accel_xy = false;
|
|
||||||
|
|
||||||
// reset last velocity if this controller has just been engaged or dt is zero
|
// reset last velocity if this controller has just been engaged or dt is zero
|
||||||
if (dt == 0.0) {
|
if (dt == 0.0) {
|
||||||
@ -611,10 +609,21 @@ void AC_PosControl::rate_to_accel_xy(float dt)
|
|||||||
_vel_error.x = _vel_target.x - vel_curr.x;
|
_vel_error.x = _vel_target.x - vel_curr.x;
|
||||||
_vel_error.y = _vel_target.y - vel_curr.y;
|
_vel_error.y = _vel_target.y - vel_curr.y;
|
||||||
|
|
||||||
|
// get current i term
|
||||||
|
lat_i = _pid_rate_lat.get_integrator();
|
||||||
|
lon_i = _pid_rate_lon.get_integrator();
|
||||||
|
|
||||||
|
// update i term if we have not hit the accel or throttle limits OR the i term will reduce
|
||||||
|
if ((!_limit.accel_xy && !_motors.limit.throttle_upper) || ((lat_i>0&&_vel_error.x<0)||(lat_i<0&&_vel_error.x>0))) {
|
||||||
|
lat_i = _pid_rate_lat.get_i(_vel_error.x, dt);
|
||||||
|
}
|
||||||
|
if ((!_limit.accel_xy && !_motors.limit.throttle_upper) || ((lon_i>0&&_vel_error.y<0)||(lon_i<0&&_vel_error.y>0))) {
|
||||||
|
lon_i = _pid_rate_lat.get_i(_vel_error.y, dt);
|
||||||
|
}
|
||||||
|
|
||||||
// combine feed forward accel with PID output from velocity error
|
// combine feed forward accel with PID output from velocity error
|
||||||
// To-Do: check accel limit flag before adding I term
|
_accel_target.x += _pid_rate_lat.get_p(_vel_error.x) + lat_i + _pid_rate_lat.get_d(_vel_error.x, dt);
|
||||||
_accel_target.x += _pid_rate_lat.get_pid(_vel_error.x, dt);
|
_accel_target.y += _pid_rate_lon.get_p(_vel_error.y) + lon_i + _pid_rate_lon.get_d(_vel_error.y, dt);
|
||||||
_accel_target.y += _pid_rate_lon.get_pid(_vel_error.y, dt);
|
|
||||||
|
|
||||||
// scale desired acceleration if it's beyond acceptable limit
|
// scale desired acceleration if it's beyond acceptable limit
|
||||||
// To-Do: move this check down to the accel_to_lean_angle method?
|
// To-Do: move this check down to the accel_to_lean_angle method?
|
||||||
@ -623,6 +632,9 @@ void AC_PosControl::rate_to_accel_xy(float dt)
|
|||||||
_accel_target.x = POSCONTROL_ACCEL_XY_MAX * _accel_target.x/accel_total;
|
_accel_target.x = POSCONTROL_ACCEL_XY_MAX * _accel_target.x/accel_total;
|
||||||
_accel_target.y = POSCONTROL_ACCEL_XY_MAX * _accel_target.y/accel_total;
|
_accel_target.y = POSCONTROL_ACCEL_XY_MAX * _accel_target.y/accel_total;
|
||||||
_limit.accel_xy = true; // unused
|
_limit.accel_xy = true; // unused
|
||||||
|
} else {
|
||||||
|
// reset accel limit flag
|
||||||
|
_limit.accel_xy = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user