@@ -91,11 +91,9 @@ public void setDesiredState(SwerveModuleState desiredState, boolean isDriveOpenL
9191 if (desiredState .speedMetersPerSecond < driveDeadbandMetersPerSecond ) {
9292 desiredState = new SwerveModuleState (0.0 , previousAngle );
9393 }
94- previousAngle = desiredState .angle ;
9594
96- Rotation2d currentAngle = getAzimuthRotation2d ();
97- SwerveModuleState optimizedState = SwerveModuleState .optimize (desiredState , currentAngle );
98- setAzimuthRotation2d (optimizedState .angle );
95+ SwerveModuleState optimizedState = setAzimuthOptimizedState (desiredState );
96+
9997 if (isDriveOpenLoop ) {
10098 setDriveOpenLoopMetersPerSecond (optimizedState .speedMetersPerSecond );
10199 } else {
@@ -155,17 +153,35 @@ private int getAzimuthAbsoluteEncoderCounts() {
155153 return azimuthTalon .getSensorCollection ().getPulseWidthPosition () & 0xFFF ;
156154 }
157155
156+ @ Override
158157 public Rotation2d getAzimuthRotation2d () {
159158 double azimuthCounts = azimuthTalon .getSelectedSensorPosition ();
160159 double radians = 2.0 * Math .PI * azimuthCounts / azimuthCountsPerRev ;
161160 return new Rotation2d (radians );
162161 }
163162
163+ @ Override
164164 public void setAzimuthRotation2d (Rotation2d angle ) {
165+ setAzimuthOptimizedState (new SwerveModuleState (0.0 , angle ));
166+ logger .info ("azimuth {}: set rotation to: {}" , azimuthTalon .getDeviceID (), angle );
167+ }
168+
169+ @ NotNull
170+ private SwerveModuleState setAzimuthOptimizedState (SwerveModuleState desiredState ) {
171+ // minimize change in heading by potentially reversing the drive direction
172+ Rotation2d currentAngle = getAzimuthRotation2d ();
173+ SwerveModuleState optimizedState = SwerveModuleState .optimize (desiredState , currentAngle );
174+
175+ // set the azimuth wheel position
165176 double countsBefore = azimuthTalon .getSelectedSensorPosition ();
166- double countsFromAngle = angle .getRadians () / (2.0 * Math .PI ) * azimuthCountsPerRev ;
177+ double countsFromAngle =
178+ optimizedState .angle .getRadians () / (2.0 * Math .PI ) * azimuthCountsPerRev ;
167179 double countsDelta = Math .IEEEremainder (countsFromAngle - countsBefore , azimuthCountsPerRev );
168180 azimuthTalon .set (MotionMagic , countsBefore + countsDelta );
181+
182+ // save previous angle for use if inside deadband in setDesiredState()
183+ previousAngle = optimizedState .angle ;
184+ return optimizedState ;
169185 }
170186
171187 private double getDriveMetersPerSecond () {
0 commit comments