Skip to content

Commit c481a00

Browse files
committed
feat: use fused CANCoder for swerve turn position
1 parent fb2088e commit c481a00

File tree

4 files changed

+21
-27
lines changed

4 files changed

+21
-27
lines changed

src/main/java/org/team1540/robot2024/subsystems/drive/Module.java

+2-15
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ public class Module {
2020
private final PIDController turnFeedback;
2121
private Rotation2d angleSetpoint = null; // Setpoint for closed loop control, null for open loop
2222
private Double speedSetpoint = null; // Setpoint for closed loop control, null for open loop
23-
private Rotation2d turnRelativeOffset = null; // Relative + Offset = Absolute
24-
private boolean forceTurn = false;
2523
private double lastPositionMeters = 0.0; // Used for delta calculation
2624

2725
public Module(ModuleIO io, int index) {
@@ -55,17 +53,10 @@ public Module(ModuleIO io, int index) {
5553

5654
public void periodic() {
5755
io.updateInputs(inputs);
58-
Logger.processInputs("Drive/Module" + index, inputs);
59-
60-
// On first cycle, reset relative turn encoder
61-
// Wait until absolute angle is nonzero in case it wasn't initialized yet
62-
if (turnRelativeOffset == null && inputs.turnAbsolutePosition.getRadians() != 0.0) {
63-
turnRelativeOffset = inputs.turnAbsolutePosition.minus(inputs.turnPosition);
64-
}
56+
Logger.processInputs("Drivetrain/Module" + index, inputs);
6557

6658
// Run closed loop turn control
6759
if (angleSetpoint != null) {
68-
6960
io.setTurnVoltage(
7061
turnFeedback.calculate(getAngle().getRadians(), angleSetpoint.getRadians()));
7162

@@ -143,11 +134,7 @@ public void setBrakeMode(boolean enabled) {
143134
* Returns the current turn angle of the module.
144135
*/
145136
public Rotation2d getAngle() {
146-
if (turnRelativeOffset == null) {
147-
return new Rotation2d();
148-
} else {
149-
return inputs.turnPosition.plus(turnRelativeOffset);
150-
}
137+
return inputs.turnPosition;
151138
}
152139

153140
/**

src/main/java/org/team1540/robot2024/subsystems/drive/ModuleIOSim.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
* approximation for the behavior of the module.
1717
*/
1818
public class ModuleIOSim implements ModuleIO {
19-
private final Rotation2d turnAbsoluteInitPosition = new Rotation2d(Math.random() * 2.0 * Math.PI);
2019
private final DCMotorSim driveSim = new DCMotorSim(DCMotor.getFalcon500Foc(1), DRIVE_GEAR_RATIO, 0.025);
2120
private final DCMotorSim turnSim = new DCMotorSim(DCMotor.getFalcon500Foc(1), TURN_GEAR_RATIO, 0.004);
2221
private double driveAppliedVolts = 0.0;
@@ -32,7 +31,7 @@ public void updateInputs(ModuleIOInputs inputs) {
3231
inputs.driveAppliedVolts = driveAppliedVolts;
3332
inputs.driveCurrentAmps = Math.abs(driveSim.getCurrentDrawAmps());
3433

35-
inputs.turnAbsolutePosition = new Rotation2d(turnSim.getAngularPositionRad()).plus(turnAbsoluteInitPosition);
34+
inputs.turnAbsolutePosition = new Rotation2d(turnSim.getAngularPositionRad());
3635
inputs.turnPosition = new Rotation2d(turnSim.getAngularPositionRad());
3736
inputs.turnVelocityRadPerSec = turnSim.getAngularVelocityRadPerSec();
3837
inputs.turnAppliedVolts = turnAppliedVolts;

src/main/java/org/team1540/robot2024/subsystems/drive/ModuleIOTalonFX.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,13 @@ public ModuleIOTalonFX(SwerveFactory.SwerveModuleHW hw) {
5858
drivePosition = driveTalon.getPosition();
5959
driveVelocity = driveTalon.getVelocity();
6060
driveAppliedVolts = driveTalon.getMotorVoltage();
61-
driveCurrent = driveTalon.getStatorCurrent();
61+
driveCurrent = driveTalon.getSupplyCurrent();
6262

6363
turnAbsolutePosition = cancoder.getAbsolutePosition();
6464
turnPosition = turnTalon.getPosition();
6565
turnVelocity = turnTalon.getVelocity();
6666
turnAppliedVolts = turnTalon.getMotorVoltage();
67-
turnCurrent = turnTalon.getStatorCurrent();
67+
turnCurrent = turnTalon.getSupplyCurrent();
6868

6969
BaseStatusSignal.setUpdateFrequencyForAll(100.0, drivePosition, turnPosition); // Required for odometry, use faster rate
7070
BaseStatusSignal.setUpdateFrequencyForAll(
@@ -111,8 +111,8 @@ public void updateInputs(ModuleIOInputs inputs) {
111111
inputs.driveCurrentAmps = driveCurrent.getValueAsDouble();
112112

113113
inputs.turnAbsolutePosition = Rotation2d.fromRotations(turnAbsolutePosition.getValueAsDouble());
114-
inputs.turnPosition = Rotation2d.fromRotations(turnPosition.getValueAsDouble() / TURN_GEAR_RATIO);
115-
inputs.turnVelocityRadPerSec = Units.rotationsToRadians(turnVelocity.getValueAsDouble()) / TURN_GEAR_RATIO;
114+
inputs.turnPosition = Rotation2d.fromRotations(turnPosition.getValueAsDouble());
115+
inputs.turnVelocityRadPerSec = Units.rotationsToRadians(turnVelocity.getValueAsDouble());
116116
inputs.turnAppliedVolts = turnAppliedVolts.getValueAsDouble();
117117
inputs.turnCurrentAmps = turnCurrent.getValueAsDouble();
118118
}

src/main/java/org/team1540/robot2024/util/swerve/SwerveFactory.java

+14-6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.ctre.phoenix6.hardware.CANcoder;
66
import com.ctre.phoenix6.hardware.TalonFX;
77
import com.ctre.phoenix6.signals.AbsoluteSensorRangeValue;
8+
import com.ctre.phoenix6.signals.FeedbackSensorSourceValue;
89
import com.ctre.phoenix6.signals.InvertedValue;
910
import com.ctre.phoenix6.signals.SensorDirectionValue;
1011
import org.team1540.robot2024.Constants;
@@ -49,6 +50,11 @@ private SwerveModuleHW(int id, SwerveCorner corner, String canbus) {
4950
if (canbus == null) {
5051
canbus = "";
5152
}
53+
54+
int driveID = 30 + id;
55+
int turnID = 20 + id;
56+
int canCoderID = 10 + id;
57+
5258
TalonFXConfiguration driveConfig = new TalonFXConfiguration();
5359
TalonFXConfiguration turnConfig = new TalonFXConfiguration();
5460
CANcoderConfiguration canCoderConfig = new CANcoderConfiguration();
@@ -62,21 +68,23 @@ private SwerveModuleHW(int id, SwerveCorner corner, String canbus) {
6268
turnConfig.CurrentLimits.SupplyCurrentLimit = 30.0;
6369
turnConfig.CurrentLimits.SupplyCurrentLimitEnable = true;
6470
turnConfig.MotorOutput.Inverted = InvertedValue.Clockwise_Positive;
71+
turnConfig.Feedback.FeedbackRemoteSensorID = canCoderID;
72+
turnConfig.Feedback.FeedbackSensorSource = FeedbackSensorSourceValue.FusedCANcoder;
73+
turnConfig.Feedback.SensorToMechanismRatio = 1.0;
74+
turnConfig.Feedback.RotorToSensorRatio = Constants.Drivetrain.TURN_GEAR_RATIO;
6575

6676
canCoderConfig.MagnetSensor.MagnetOffset = moduleOffsetsRots[id-1] + corner.offsetRots;
6777
canCoderConfig.MagnetSensor.SensorDirection = SensorDirectionValue.CounterClockwise_Positive;
6878
canCoderConfig.MagnetSensor.AbsoluteSensorRange = AbsoluteSensorRangeValue.Unsigned_0To1;
6979

70-
this.driveMotor = new TalonFX(30 + id, canbus);
80+
this.driveMotor = new TalonFX(driveID, canbus);
7181
this.driveMotor.getConfigurator().apply(driveConfig);
7282

73-
this.turnMotor = new TalonFX(20 + id, canbus);
83+
this.cancoder = new CANcoder(canCoderID, canbus);
84+
this.cancoder.getConfigurator().apply(canCoderConfig);
7485

86+
this.turnMotor = new TalonFX(turnID, canbus);
7587
this.turnMotor.getConfigurator().apply(turnConfig);
76-
77-
this.cancoder = new CANcoder(10 + id, canbus);
78-
79-
this.cancoder.getConfigurator().apply(canCoderConfig);
8088
}
8189
}
8290
}

0 commit comments

Comments
 (0)