23 units::LinearVelocityFeedforward Kv, units::LinearAccelerationFeedforward Ka,
24 units::Voltage max_voltage, units::Length track_width
26 : Kv_(Kv), Ka_(Ka), max_voltage_(max_voltage), kinematics_(track_width) {}
36 units::LinearVelocityFeedforward Kv, units::LinearAccelerationFeedforward Ka,
39 : Kv_(Kv), Ka_(Ka), max_voltage_(max_voltage), kinematics_(kinematics) {}
62 const Pose2d& pose, units::Curvature curvature, units::Velocity speed
64 units::AngularVelocity omega = speed * curvature;
68 units::Velocity max_wheel_speed = units::max(wheel_speeds.
left, wheel_speeds.
right);
69 units::Velocity min_wheel_speed = units::min(wheel_speeds.
left, wheel_speeds.
right);
71 units::Acceleration max_wheel_acceleration = (max_voltage_ - (Kv_ * max_wheel_speed)) / Ka_;
72 units::Acceleration min_wheel_acceleration = (-max_voltage_ - Kv_ * min_wheel_speed) / Ka_;
74 units::Acceleration max_chassis_acceleration;
75 units::Acceleration min_chassis_acceleration;
77 const units::Number curvature_term = (kinematics_.track_width * units::abs(curvature)) / 1_rad;
79 if (units::abs(speed) <= 1e-9_mps) {
81 max_chassis_acceleration =
82 max_wheel_acceleration / (units::abs(denom) < 1e-6 ?
units::Number(1e-6) : denom);
83 min_chassis_acceleration =
84 min_wheel_acceleration / (units::abs(denom) < 1e-6 ?
units::Number(1e-6) : denom);
87 const units::Number max_denom = 1.0 + (curvature_term * speed_sgn / 2.0);
88 const units::Number min_denom = 1.0 - (curvature_term * speed_sgn / 2.0);
90 max_chassis_acceleration =
91 max_wheel_acceleration / (units::abs(max_denom) < 1e-6 ?
units::Number(1e-6) : max_denom);
92 min_chassis_acceleration =
93 min_wheel_acceleration / (units::abs(min_denom) < 1e-6 ?
units::Number(1e-6) : min_denom);
96 if (units::abs(curvature) > 1E-9_radpm &&
97 (kinematics_.track_width / 2.0) > 1_rad / units::abs(curvature)) {
98 if (speed > 0_mps && min_chassis_acceleration > 0_inps2) {
99 min_chassis_acceleration = -min_chassis_acceleration;
100 }
else if (speed < 0_mps && max_chassis_acceleration < 0_inps2) {
101 max_chassis_acceleration = -max_chassis_acceleration;
105 return {min_chassis_acceleration, max_chassis_acceleration};