mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-03 06:28:27 -04:00
AC_AttitudeControl: only use rate shaping tc if tc is nonzero
This commit is contained in:
parent
7594f7a558
commit
a547916ebf
@ -287,7 +287,11 @@ void AC_AttitudeControl::input_euler_angle_roll_pitch_euler_rate_yaw(float euler
|
|||||||
|
|
||||||
// When yaw acceleration limiting is enabled, the yaw input shaper constrains angular acceleration about the yaw axis, slewing
|
// When yaw acceleration limiting is enabled, the yaw input shaper constrains angular acceleration about the yaw axis, slewing
|
||||||
// the output rate towards the input rate.
|
// the output rate towards the input rate.
|
||||||
_euler_rate_target.z = input_shaping_rate((euler_yaw_rate - _euler_rate_target.z), _rate_y_tc, euler_accel.z, _euler_rate_target.z, _dt);
|
if (is_zero(_rate_y_tc)) {
|
||||||
|
_euler_rate_target.z = input_shaping_ang_vel(_euler_rate_target.z, euler_yaw_rate, euler_accel.z, _dt);
|
||||||
|
} else {
|
||||||
|
_euler_rate_target.z = input_shaping_rate((euler_yaw_rate - _euler_rate_target.z), _rate_y_tc, euler_accel.z, _euler_rate_target.z, _dt);
|
||||||
|
}
|
||||||
|
|
||||||
// Convert euler angle derivative of desired attitude into a body-frame angular velocity vector for feedforward
|
// Convert euler angle derivative of desired attitude into a body-frame angular velocity vector for feedforward
|
||||||
euler_rate_to_ang_vel(_euler_angle_target, _euler_rate_target, _ang_vel_target);
|
euler_rate_to_ang_vel(_euler_angle_target, _euler_rate_target, _ang_vel_target);
|
||||||
@ -388,9 +392,18 @@ void AC_AttitudeControl::input_euler_rate_roll_pitch_yaw(float euler_roll_rate_c
|
|||||||
|
|
||||||
// When acceleration limiting is enabled, the input shaper constrains angular acceleration, slewing
|
// When acceleration limiting is enabled, the input shaper constrains angular acceleration, slewing
|
||||||
// the output rate towards the input rate.
|
// the output rate towards the input rate.
|
||||||
_euler_rate_target.x = input_shaping_rate((euler_roll_rate - _euler_rate_target.x), _rate_rp_tc, euler_accel.x, _euler_rate_target.x, _dt);
|
if (is_zero(_rate_rp_tc)) {
|
||||||
_euler_rate_target.y = input_shaping_rate((euler_pitch_rate - _euler_rate_target.y), _rate_rp_tc, euler_accel.y, _euler_rate_target.y, _dt);
|
_euler_rate_target.x = input_shaping_ang_vel(_euler_rate_target.x, euler_roll_rate, euler_accel.x, _dt);
|
||||||
_euler_rate_target.z = input_shaping_rate((euler_yaw_rate - _euler_rate_target.z), _rate_y_tc, euler_accel.z, _euler_rate_target.z, _dt);
|
_euler_rate_target.y = input_shaping_ang_vel(_euler_rate_target.y, euler_pitch_rate, euler_accel.y, _dt);
|
||||||
|
} else {
|
||||||
|
_euler_rate_target.x = input_shaping_rate((euler_roll_rate - _euler_rate_target.x), _rate_rp_tc, euler_accel.x, _euler_rate_target.x, _dt);
|
||||||
|
_euler_rate_target.y = input_shaping_rate((euler_pitch_rate - _euler_rate_target.y), _rate_rp_tc, euler_accel.y, _euler_rate_target.y, _dt);
|
||||||
|
}
|
||||||
|
if (is_zero(_rate_y_tc)) {
|
||||||
|
_euler_rate_target.z = input_shaping_ang_vel(_euler_rate_target.z, euler_yaw_rate, euler_accel.z, _dt);
|
||||||
|
} else {
|
||||||
|
_euler_rate_target.z = input_shaping_rate((euler_yaw_rate - _euler_rate_target.z), _rate_y_tc, euler_accel.z, _euler_rate_target.z, _dt);
|
||||||
|
}
|
||||||
|
|
||||||
// Convert euler angle derivative of desired attitude into a body-frame angular velocity vector for feedforward
|
// Convert euler angle derivative of desired attitude into a body-frame angular velocity vector for feedforward
|
||||||
euler_rate_to_ang_vel(_euler_angle_target, _euler_rate_target, _ang_vel_target);
|
euler_rate_to_ang_vel(_euler_angle_target, _euler_rate_target, _ang_vel_target);
|
||||||
@ -428,9 +441,18 @@ void AC_AttitudeControl::input_rate_bf_roll_pitch_yaw(float roll_rate_bf_cds, fl
|
|||||||
// Compute acceleration-limited body frame rates
|
// Compute acceleration-limited body frame rates
|
||||||
// When acceleration limiting is enabled, the input shaper constrains angular acceleration about the axis, slewing
|
// When acceleration limiting is enabled, the input shaper constrains angular acceleration about the axis, slewing
|
||||||
// the output rate towards the input rate.
|
// the output rate towards the input rate.
|
||||||
_ang_vel_target.x = input_shaping_rate((roll_rate_rads - _ang_vel_target.x), _rate_rp_tc, get_accel_roll_max_radss(), _ang_vel_target.x, _dt);
|
if (is_zero(_rate_rp_tc)) {
|
||||||
_ang_vel_target.y = input_shaping_rate((pitch_rate_rads - _ang_vel_target.y), _rate_rp_tc, get_accel_pitch_max_radss(), _ang_vel_target.y, _dt);
|
_ang_vel_target.x = input_shaping_ang_vel(_ang_vel_target.x, roll_rate_rads, get_accel_roll_max_radss(), _dt);
|
||||||
_ang_vel_target.z = input_shaping_rate((yaw_rate_rads - _ang_vel_target.z), _rate_y_tc, get_accel_yaw_max_radss(), _ang_vel_target.z, _dt);
|
_ang_vel_target.y = input_shaping_ang_vel(_ang_vel_target.y, pitch_rate_rads, get_accel_pitch_max_radss(), _dt);
|
||||||
|
} else {
|
||||||
|
_ang_vel_target.x = input_shaping_rate((roll_rate_rads - _ang_vel_target.x), _rate_rp_tc, get_accel_roll_max_radss(), _ang_vel_target.x, _dt);
|
||||||
|
_ang_vel_target.y = input_shaping_rate((pitch_rate_rads - _ang_vel_target.y), _rate_rp_tc, get_accel_pitch_max_radss(), _ang_vel_target.y, _dt);
|
||||||
|
}
|
||||||
|
if (is_zero(_rate_y_tc)) {
|
||||||
|
_ang_vel_target.z = input_shaping_ang_vel(_ang_vel_target.z, yaw_rate_rads, get_accel_yaw_max_radss(), _dt);
|
||||||
|
} else {
|
||||||
|
_ang_vel_target.z = input_shaping_rate((yaw_rate_rads - _ang_vel_target.z), _rate_y_tc, get_accel_yaw_max_radss(), _ang_vel_target.z, _dt);
|
||||||
|
}
|
||||||
|
|
||||||
// Convert body-frame angular velocity into euler angle derivative of desired attitude
|
// Convert body-frame angular velocity into euler angle derivative of desired attitude
|
||||||
ang_vel_to_euler_rate(_euler_angle_target, _ang_vel_target, _euler_rate_target);
|
ang_vel_to_euler_rate(_euler_angle_target, _ang_vel_target, _euler_rate_target);
|
||||||
@ -461,9 +483,18 @@ void AC_AttitudeControl::input_rate_bf_roll_pitch_yaw_2(float roll_rate_bf_cds,
|
|||||||
// Compute acceleration-limited body frame rates
|
// Compute acceleration-limited body frame rates
|
||||||
// When acceleration limiting is enabled, the input shaper constrains angular acceleration about the axis, slewing
|
// When acceleration limiting is enabled, the input shaper constrains angular acceleration about the axis, slewing
|
||||||
// the output rate towards the input rate.
|
// the output rate towards the input rate.
|
||||||
_ang_vel_target.x = input_shaping_rate((roll_rate_rads - _ang_vel_target.x), _rate_rp_tc, get_accel_roll_max_radss(), _ang_vel_target.x, _dt);
|
if (is_zero(_rate_rp_tc)) {
|
||||||
_ang_vel_target.y = input_shaping_rate((pitch_rate_rads - _ang_vel_target.y), _rate_rp_tc, get_accel_pitch_max_radss(), _ang_vel_target.y, _dt);
|
_ang_vel_target.x = input_shaping_ang_vel(_ang_vel_target.x, roll_rate_rads, get_accel_roll_max_radss(), _dt);
|
||||||
_ang_vel_target.z = input_shaping_rate((yaw_rate_rads - _ang_vel_target.z), _rate_y_tc, get_accel_yaw_max_radss(), _ang_vel_target.z, _dt);
|
_ang_vel_target.y = input_shaping_ang_vel(_ang_vel_target.y, pitch_rate_rads, get_accel_pitch_max_radss(), _dt);
|
||||||
|
} else {
|
||||||
|
_ang_vel_target.x = input_shaping_rate((roll_rate_rads - _ang_vel_target.x), _rate_rp_tc, get_accel_roll_max_radss(), _ang_vel_target.x, _dt);
|
||||||
|
_ang_vel_target.y = input_shaping_rate((pitch_rate_rads - _ang_vel_target.y), _rate_rp_tc, get_accel_pitch_max_radss(), _ang_vel_target.y, _dt);
|
||||||
|
}
|
||||||
|
if (is_zero(_rate_y_tc)) {
|
||||||
|
_ang_vel_target.z = input_shaping_ang_vel(_ang_vel_target.z, yaw_rate_rads, get_accel_yaw_max_radss(), _dt);
|
||||||
|
} else {
|
||||||
|
_ang_vel_target.z = input_shaping_rate((yaw_rate_rads - _ang_vel_target.z), _rate_y_tc, get_accel_yaw_max_radss(), _ang_vel_target.z, _dt);
|
||||||
|
}
|
||||||
|
|
||||||
// Update the unused targets attitude based on current attitude to condition mode change
|
// Update the unused targets attitude based on current attitude to condition mode change
|
||||||
_ahrs.get_quat_body_to_ned(_attitude_target);
|
_ahrs.get_quat_body_to_ned(_attitude_target);
|
||||||
@ -500,9 +531,18 @@ void AC_AttitudeControl::input_rate_bf_roll_pitch_yaw_3(float roll_rate_bf_cds,
|
|||||||
// Compute acceleration-limited body frame rates
|
// Compute acceleration-limited body frame rates
|
||||||
// When acceleration limiting is enabled, the input shaper constrains angular acceleration about the axis, slewing
|
// When acceleration limiting is enabled, the input shaper constrains angular acceleration about the axis, slewing
|
||||||
// the output rate towards the input rate.
|
// the output rate towards the input rate.
|
||||||
_ang_vel_target.x = input_shaping_rate((roll_rate_rads - _ang_vel_target.x), _rate_rp_tc, get_accel_roll_max_radss(), _ang_vel_target.x, _dt);
|
if (is_zero(_rate_rp_tc)) {
|
||||||
_ang_vel_target.y = input_shaping_rate((pitch_rate_rads - _ang_vel_target.y), _rate_rp_tc, get_accel_pitch_max_radss(), _ang_vel_target.y, _dt);
|
_ang_vel_target.x = input_shaping_ang_vel(_ang_vel_target.x, roll_rate_rads, get_accel_roll_max_radss(), _dt);
|
||||||
_ang_vel_target.z = input_shaping_rate((yaw_rate_rads - _ang_vel_target.z), _rate_y_tc, get_accel_yaw_max_radss(), _ang_vel_target.z, _dt);
|
_ang_vel_target.y = input_shaping_ang_vel(_ang_vel_target.y, pitch_rate_rads, get_accel_pitch_max_radss(), _dt);
|
||||||
|
} else {
|
||||||
|
_ang_vel_target.x = input_shaping_rate((roll_rate_rads - _ang_vel_target.x), _rate_rp_tc, get_accel_roll_max_radss(), _ang_vel_target.x, _dt);
|
||||||
|
_ang_vel_target.y = input_shaping_rate((pitch_rate_rads - _ang_vel_target.y), _rate_rp_tc, get_accel_pitch_max_radss(), _ang_vel_target.y, _dt);
|
||||||
|
}
|
||||||
|
if (is_zero(_rate_y_tc)) {
|
||||||
|
_ang_vel_target.z = input_shaping_ang_vel(_ang_vel_target.z, yaw_rate_rads, get_accel_yaw_max_radss(), _dt);
|
||||||
|
} else {
|
||||||
|
_ang_vel_target.z = input_shaping_rate((yaw_rate_rads - _ang_vel_target.z), _rate_y_tc, get_accel_yaw_max_radss(), _ang_vel_target.z, _dt);
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve quaternion body attitude
|
// Retrieve quaternion body attitude
|
||||||
Quaternion attitude_body;
|
Quaternion attitude_body;
|
||||||
@ -584,7 +624,11 @@ void AC_AttitudeControl::input_thrust_vector_rate_heading(const Vector3f& thrust
|
|||||||
|
|
||||||
// When yaw acceleration limiting is enabled, the yaw input shaper constrains angular acceleration about the yaw axis, slewing
|
// When yaw acceleration limiting is enabled, the yaw input shaper constrains angular acceleration about the yaw axis, slewing
|
||||||
// the output rate towards the input rate.
|
// the output rate towards the input rate.
|
||||||
_ang_vel_target.z = input_shaping_ang_vel(_ang_vel_target.z, heading_rate, get_accel_yaw_max_radss(), _dt);
|
if (is_zero(_rate_y_tc)) {
|
||||||
|
_ang_vel_target.z = input_shaping_ang_vel(_ang_vel_target.z, heading_rate, get_accel_yaw_max_radss(), _dt);
|
||||||
|
} else {
|
||||||
|
_ang_vel_target.z = input_shaping_rate((heading_rate - _ang_vel_target.z), _rate_y_tc, get_accel_yaw_max_radss(), _ang_vel_target.z, _dt);
|
||||||
|
}
|
||||||
|
|
||||||
// Limit the angular velocity
|
// Limit the angular velocity
|
||||||
ang_vel_limit(_ang_vel_target, radians(_ang_vel_roll_max), radians(_ang_vel_pitch_max), radians(_ang_vel_yaw_max));
|
ang_vel_limit(_ang_vel_target, radians(_ang_vel_roll_max), radians(_ang_vel_pitch_max), radians(_ang_vel_yaw_max));
|
||||||
|
Loading…
Reference in New Issue
Block a user