diff --git a/libraries/AC_AttitudeControl/AC_AttitudeControl.cpp b/libraries/AC_AttitudeControl/AC_AttitudeControl.cpp index 220a451c39..4ec88e88e9 100644 --- a/libraries/AC_AttitudeControl/AC_AttitudeControl.cpp +++ b/libraries/AC_AttitudeControl/AC_AttitudeControl.cpp @@ -103,7 +103,7 @@ void AC_AttitudeControl::angle_ef_roll_pitch_rate_ef_yaw_smooth(float roll_angle float rate_ef_desired; float angle_to_target; - if (_rate_bf_ff_enabled) { + if (_accel_rp_max > 0.0f) { // calculate earth-frame feed forward roll rate using linear response when close to the target, sqrt response when we're further away angle_to_target = roll_angle_ef - _angle_ef_target.x; @@ -145,7 +145,7 @@ void AC_AttitudeControl::angle_ef_roll_pitch_rate_ef_yaw_smooth(float roll_angle _rate_ef_desired.y = 0; } - if (_rate_bf_ff_enabled) { + if (_accel_y_max > 0.0f) { // set earth-frame feed forward rate for yaw rate_change_limit = _accel_y_max * _dt; @@ -221,7 +221,7 @@ void AC_AttitudeControl::angle_ef_roll_pitch_rate_ef_yaw(float roll_angle_ef, fl // add body frame rate feed forward if (_rate_bf_ff_enabled) { - _rate_bf_target += _rate_bf_desired; + _rate_bf_target.z += _rate_bf_desired.z; } // body-frame to motor outputs should be called separately @@ -348,7 +348,7 @@ void AC_AttitudeControl::rate_bf_roll_pitch_yaw(float roll_rate_bf, float pitch_ float rate_change, rate_change_limit; // update the rate feed forward with angular acceleration limits - if (_rate_bf_ff_enabled) { + if (_accel_rp_max > 0.0f) { rate_change_limit = _accel_rp_max * _dt; rate_change = roll_rate_bf - _rate_bf_desired.x; @@ -363,7 +363,7 @@ void AC_AttitudeControl::rate_bf_roll_pitch_yaw(float roll_rate_bf, float pitch_ _rate_bf_desired.y = pitch_rate_bf; } - if (_rate_bf_ff_enabled) { + if (_accel_y_max > 0.0f) { rate_change_limit = _accel_y_max * _dt; rate_change = yaw_rate_bf - _rate_bf_desired.z; @@ -375,7 +375,13 @@ void AC_AttitudeControl::rate_bf_roll_pitch_yaw(float roll_rate_bf, float pitch_ // body-frame rate commands added if (_rate_bf_ff_enabled) { - _rate_bf_target += _rate_bf_desired; + if (_accel_rp_max > 0.0f) { + _rate_bf_target.x += _rate_bf_desired.x; + _rate_bf_target.y += _rate_bf_desired.y; + } + if (_accel_y_max > 0.0f) { + _rate_bf_target.z += _rate_bf_desired.z; + } } }