@@ -233,28 +233,31 @@ public void drive(double xSpeed, double ySpeed, double rotation, boolean fieldRe
233233 calculatedRotation = m_headingCorrectionPID .calculate (currentAngle );
234234 }
235235
236- // Depending on whether the robot is being driven in field relative, calculate
237- // the desired states for each of the modules
238- m_desiredStates = DriveConstants .kDriveKinematics .toSwerveModuleStates (
239- fieldRelative
240- ? ChassisSpeeds .fromFieldRelativeSpeeds (xSpeed , ySpeed , calculatedRotation ,
241- Robot .isReal () ? m_gyro .getRotation2d () : new Rotation2d (m_gyroAngle ))
242- : new ChassisSpeeds (xSpeed , ySpeed , calculatedRotation ));
236+ // create chassis speeds
237+ ChassisSpeeds unlimitedSpeeds = fieldRelative
238+ ? ChassisSpeeds .fromFieldRelativeSpeeds (xSpeed , ySpeed , calculatedRotation ,
239+ Robot .isReal () ? m_gyro .getRotation2d () : new Rotation2d (m_gyroAngle ))
240+ : new ChassisSpeeds (xSpeed , ySpeed , calculatedRotation );
243241
244- SwerveDriveKinematics . desaturateWheelSpeeds (
245- m_desiredStates , DriveConstants .kMaxSpeedMetersPerSecond );
242+ // inverse kinematics to module states
243+ m_desiredStates = DriveConstants .kDriveKinematics . toSwerveModuleStates ( unlimitedSpeeds );
246244
247- // acceleration limits
245+ // limit max velocity
246+ SwerveDriveKinematics .desaturateWheelSpeeds (
247+ m_desiredStates , DriveConstants .kMaxSpeedMetersPerSecond );
248248
249- // convert to chassis speeds for calculations
250- ChassisSpeeds originalSpeeds = DriveConstants .kDriveKinematics .toChassisSpeeds (m_desiredStates );
249+ // acceleration limiting code needs desaturated speeds, so convert desaturated
250+ // module states back to chassis speeds
251+ unlimitedSpeeds = DriveConstants .kDriveKinematics .toChassisSpeeds (m_desiredStates );
252+
253+ // acceleration limits
251254
252255 // slew rate limiter only works in one dimension so it can't be used for
253256 // translation
254257
255258 // calculate speed vector delta magnitude
256259 final Vector <N2 > dv = VecBuilder
257- .fill (originalSpeeds .vxMetersPerSecond , originalSpeeds .vyMetersPerSecond )
260+ .fill (unlimitedSpeeds .vxMetersPerSecond , unlimitedSpeeds .vyMetersPerSecond )
258261 .minus (m_prevTranSpeed );
259262
260263 final double dvMagnitude = dv .norm ();
@@ -271,27 +274,21 @@ public void drive(double xSpeed, double ySpeed, double rotation, boolean fieldRe
271274 final Vector <N2 > newV = m_prevTranSpeed .plus (dvLimited );
272275
273276 // correct chassis speeds
274- originalSpeeds .vxMetersPerSecond = newV .get (0 );
275- originalSpeeds .vyMetersPerSecond = newV .get (1 );
276-
277- // inverse kinematics back to module states
278- m_desiredStates = DriveConstants .kDriveKinematics .toSwerveModuleStates (originalSpeeds );
277+ unlimitedSpeeds .vxMetersPerSecond = newV .get (0 );
278+ unlimitedSpeeds .vyMetersPerSecond = newV .get (1 );
279279 }
280280
281- // recalculate chassis speed for rotation limits
282- originalSpeeds = DriveConstants . kDriveKinematics . toChassisSpeeds ( m_desiredStates );
281+ // calculate new rotation speed
282+ final double limitedOmega = m_rotationRateFilter . calculate ( unlimitedSpeeds . omegaRadiansPerSecond );
283283
284- // calculate new rotation speed
285- final double limitedOmega = m_rotationRateFilter . calculate ( originalSpeeds . omegaRadiansPerSecond ) ;
284+ // correct chassis speeds
285+ unlimitedSpeeds . omegaRadiansPerSecond = limitedOmega ;
286286
287- // scale all modules to limit rotation
288- final double rotationScalar = originalSpeeds .omegaRadiansPerSecond == 0 ? 1
289- : limitedOmega / originalSpeeds .omegaRadiansPerSecond ;
290- for (SwerveModuleState state : m_desiredStates ) {
291- state .speedMetersPerSecond *= rotationScalar ;
292- }
287+ // inverse kinematics back to module states
288+ m_desiredStates = DriveConstants .kDriveKinematics .toSwerveModuleStates (unlimitedSpeeds );
293289
294- m_prevTranSpeed = VecBuilder .fill (originalSpeeds .vxMetersPerSecond , originalSpeeds .vyMetersPerSecond );
290+ // update past speeds
291+ m_prevTranSpeed = VecBuilder .fill (unlimitedSpeeds .vxMetersPerSecond , unlimitedSpeeds .vyMetersPerSecond );
295292}
296293
297294/**
0 commit comments