diff --git a/libraries/AC_AttitudeControl/AC_AttitudeControl.cpp b/libraries/AC_AttitudeControl/AC_AttitudeControl.cpp index 05c224d83b..50dbc52963 100644 --- a/libraries/AC_AttitudeControl/AC_AttitudeControl.cpp +++ b/libraries/AC_AttitudeControl/AC_AttitudeControl.cpp @@ -534,6 +534,7 @@ void AC_AttitudeControl::input_rate_bf_roll_pitch_yaw_2(float roll_rate_bf_cds, _attitude_target.to_euler(_euler_angle_target); // Convert body-frame angular velocity into euler angle derivative of desired attitude ang_vel_to_euler_rate(_attitude_target, _ang_vel_target, _euler_rate_target); + // finally update the attitude target _ang_vel_body = _ang_vel_target; } @@ -619,6 +620,25 @@ void AC_AttitudeControl::input_angle_step_bf_roll_pitch_yaw(float roll_angle_ste attitude_controller_run_quat(); } +// Command an rate step (i.e change) in body frame rate +// Used to command a step in rate without exciting the orthogonal axis during autotune +// Done as a single thread-safe function to avoid intermediate zero values being seen by the attitude controller +void AC_AttitudeControl::input_rate_step_bf_roll_pitch_yaw(float roll_rate_step_bf_cd, float pitch_rate_step_bf_cd, float yaw_rate_step_bf_cd) +{ + // Update the unused targets attitude based on current attitude to condition mode change + _ahrs.get_quat_body_to_ned(_attitude_target); + _attitude_target.to_euler(_euler_angle_target); + // Set the target angular velocity to be zero to minimize target overshoot after the rate step finishes + _ang_vel_target.zero(); + // Convert body-frame angular velocity into euler angle derivative of desired attitude + _euler_rate_target.zero(); + + Vector3f ang_vel_body {roll_rate_step_bf_cd, pitch_rate_step_bf_cd, yaw_rate_step_bf_cd}; + ang_vel_body = ang_vel_body * 0.01f * DEG_TO_RAD; + // finally update the attitude target + _ang_vel_body = ang_vel_body; +} + // Command a thrust vector and heading rate void AC_AttitudeControl::input_thrust_vector_rate_heading(const Vector3f& thrust_vector, float heading_rate_cds, bool slew_yaw) { diff --git a/libraries/AC_AttitudeControl/AC_AttitudeControl.h b/libraries/AC_AttitudeControl/AC_AttitudeControl.h index 6829ceb8c5..c326b76643 100644 --- a/libraries/AC_AttitudeControl/AC_AttitudeControl.h +++ b/libraries/AC_AttitudeControl/AC_AttitudeControl.h @@ -206,6 +206,9 @@ public: // Command an angular step (i.e change) in body frame angle virtual void input_angle_step_bf_roll_pitch_yaw(float roll_angle_step_bf_cd, float pitch_angle_step_bf_cd, float yaw_angle_step_bf_cd); + // Command an angular rate step (i.e change) in body frame rate + virtual void input_rate_step_bf_roll_pitch_yaw(float roll_rate_step_bf_cd, float pitch_rate_step_bf_cd, float yaw_rate_step_bf_cd); + // Command a thrust vector in the earth frame and a heading angle and/or rate virtual void input_thrust_vector_rate_heading(const Vector3f& thrust_vector, float heading_rate_cds, bool slew_yaw = true); virtual void input_thrust_vector_heading(const Vector3f& thrust_vector, float heading_angle_cd, float heading_rate_cds);