Working logically

This commit is contained in:
Tyler Wilcox 2026-01-27 20:46:13 -05:00
parent bc53ef3b38
commit ae742134fe
3 changed files with 54 additions and 25 deletions

View File

@ -54,7 +54,7 @@ public class SwerveBuilder {
} }
public SwerveDriveSubsystem build(){ public SwerveDriveSubsystem build(){
return new SwerveDriveSubsystem(pigeonId, maxLinearVelMetersSecond, maxAngularVelRadiansSecond, modules.toArray(size -> new SwerveModule[size])); return new SwerveDriveSubsystem(pigeonId, canBusName, maxLinearVelMetersSecond, maxAngularVelRadiansSecond, modules.toArray(size -> new SwerveModule[size]));
} }
public class SwerveModuleBuilder { public class SwerveModuleBuilder {
@ -63,10 +63,12 @@ public class SwerveBuilder {
private double driveKP; private double driveKP;
private double driveKI; private double driveKI;
private double driveKD; private double driveKD;
private double driveKV;
private int steerMotorId; private int steerMotorId;
private double steerKP; private double steerKP;
private double steerKI; private double steerKI;
private double steerKD; private double steerKD;
private double steerKV;
private int steerEncoderId; private int steerEncoderId;
private double steerOffset; private double steerOffset;
private Translation2d moduleLocation; private Translation2d moduleLocation;
@ -98,6 +100,11 @@ public class SwerveBuilder {
return this; return this;
} }
public SwerveModuleBuilder withDriveKV(double driveKV){
this.driveKV = driveKV;
return this;
}
public SwerveModuleBuilder withSteerMotorId(int steerMotorId){ public SwerveModuleBuilder withSteerMotorId(int steerMotorId){
this.steerMotorId = steerMotorId; this.steerMotorId = steerMotorId;
return this; return this;
@ -118,6 +125,11 @@ public class SwerveBuilder {
return this; return this;
} }
public SwerveModuleBuilder withSteerKV(double steerKV){
this.steerKV = steerKV;
return this;
}
public SwerveModuleBuilder withSteerEncoderId(int steerEncoderId){ public SwerveModuleBuilder withSteerEncoderId(int steerEncoderId){
this.steerEncoderId = steerEncoderId; this.steerEncoderId = steerEncoderId;
return this; return this;
@ -144,7 +156,7 @@ public class SwerveBuilder {
} }
public SwerveModule build() { public SwerveModule build() {
return new SwerveModule(driveMotorId, driveKP, driveKI, driveKD, steerMotorId, steerKP, steerKI, steerKD, return new SwerveModule(driveMotorId, driveKP, driveKI, driveKD, driveKV, steerMotorId, steerKP, steerKI, steerKD, steerKV,
steerEncoderId, steerOffset, canBusName, moduleLocation, gearRatio, wheelDiameterInMeters, moduleName); steerEncoderId, steerOffset, canBusName, moduleLocation, gearRatio, wheelDiameterInMeters, moduleName);
} }

View File

@ -34,7 +34,7 @@ public class SwerveDriveSubsystem extends SubsystemBase{
private double mLastSimTime = 0; private double mLastSimTime = 0;
public SwerveDriveSubsystem(int pigeonId, double maxLinearVelMetersSecond, double maxAngularVelRadiansSecond, SwerveModule... modules){ public SwerveDriveSubsystem(int pigeonId, String canBusName, double maxLinearVelMetersSecond, double maxAngularVelRadiansSecond, SwerveModule... modules){
MAX_LINEAR_SPEED = maxLinearVelMetersSecond; MAX_LINEAR_SPEED = maxLinearVelMetersSecond;
MAX_ANGULAR_SPEED = maxAngularVelRadiansSecond; MAX_ANGULAR_SPEED = maxAngularVelRadiansSecond;
@ -45,7 +45,7 @@ public class SwerveDriveSubsystem extends SubsystemBase{
Arrays.stream(modules).map((m) -> m.getModuleLocation()).toArray(size -> new Translation2d[size]) Arrays.stream(modules).map((m) -> m.getModuleLocation()).toArray(size -> new Translation2d[size])
); );
gyro = new Pigeon2(pigeonId); gyro = new Pigeon2(pigeonId, canBusName);
poseEstimator = new SwerveDrivePoseEstimator3d(driveKiniematics, new Rotation3d(Rotation2d.fromRotations(getCurrentYaw().magnitude())), getModulePositions(), Pose3d.kZero); poseEstimator = new SwerveDrivePoseEstimator3d(driveKiniematics, new Rotation3d(Rotation2d.fromRotations(getCurrentYaw().magnitude())), getModulePositions(), Pose3d.kZero);
chassisSpeeds = new ChassisSpeeds(); chassisSpeeds = new ChassisSpeeds();
@ -56,9 +56,9 @@ public class SwerveDriveSubsystem extends SubsystemBase{
super.periodic(); super.periodic();
SwerveModuleState[] moduleStates = driveKiniematics.toSwerveModuleStates(chassisSpeeds, centerOfRotation); SwerveModuleState[] moduleStates = driveKiniematics.toSwerveModuleStates(chassisSpeeds, centerOfRotation);
for(int i=0; i<modules.length;i++){ // for(int i=0; i<modules.length;i++){
moduleStates[i].optimize(modules[i].getSteerRotations()); // moduleStates[i].optimize(modules[i].getSteerRotations());
} // }
poseEstimator.updateWithTime(Utils.getCurrentTimeSeconds(), new Rotation3d(Rotation2d.fromRotations(getCurrentYaw().magnitude())), getModulePositions()); poseEstimator.updateWithTime(Utils.getCurrentTimeSeconds(), new Rotation3d(Rotation2d.fromRotations(getCurrentYaw().magnitude())), getModulePositions());

View File

@ -11,12 +11,14 @@ import com.ctre.phoenix6.controls.VelocityVoltage;
import com.ctre.phoenix6.hardware.CANcoder; import com.ctre.phoenix6.hardware.CANcoder;
import com.ctre.phoenix6.hardware.TalonFX; import com.ctre.phoenix6.hardware.TalonFX;
import com.ctre.phoenix6.signals.FeedbackSensorSourceValue; import com.ctre.phoenix6.signals.FeedbackSensorSourceValue;
import com.sun.jdi.request.StepRequest; import com.ctre.phoenix6.signals.SensorDirectionValue;
import com.ctre.phoenix6.signals.StaticFeedforwardSignValue;
import edu.wpi.first.math.geometry.Rotation2d; import edu.wpi.first.math.geometry.Rotation2d;
import edu.wpi.first.math.geometry.Translation2d; import edu.wpi.first.math.geometry.Translation2d;
import edu.wpi.first.math.kinematics.SwerveModulePosition; import edu.wpi.first.math.kinematics.SwerveModulePosition;
import edu.wpi.first.math.kinematics.SwerveModuleState; import edu.wpi.first.math.kinematics.SwerveModuleState;
import edu.wpi.first.units.measure.Angle;
public class SwerveModule { public class SwerveModule {
@ -45,10 +47,12 @@ public class SwerveModule {
double driveKP, double driveKP,
double driveKI, double driveKI,
double driveKD, double driveKD,
double driveKV,
int steerMotorId, int steerMotorId,
double steerKP, double steerKP,
double steerKI, double steerKI,
double steerKD, double steerKD,
double steerKV,
int steerEncoderId, int steerEncoderId,
double steerOffset, double steerOffset,
String canBusName, String canBusName,
@ -57,20 +61,21 @@ public class SwerveModule {
double wheelDiameterInMeters, double wheelDiameterInMeters,
String moduleName String moduleName
){ ){
driveMotor = new TalonFX(driveMotorId, canBusName);
driveMotor.getVelocity().setUpdateFrequency(CAN_UPDATE_FREQUENCY);
driveMotor.optimizeBusUtilization();
driveMotor.getConfigurator().apply(generateDriveTalonConfiguration(driveKP, driveKI, driveKD));
steerMotor = new TalonFX(steerMotorId, canBusName);
steerMotor.optimizeBusUtilization();
steerMotor.getConfigurator().apply(generateSteerTalonConfiguration(steerKP, steerKI, steerKD));
steerEncoder = new CANcoder(steerEncoderId, canBusName); steerEncoder = new CANcoder(steerEncoderId, canBusName);
steerEncoder.getPosition().setUpdateFrequency(CAN_UPDATE_FREQUENCY); steerEncoder.getPosition().setUpdateFrequency(CAN_UPDATE_FREQUENCY);
steerEncoder.optimizeBusUtilization(); steerEncoder.optimizeBusUtilization();
steerEncoder.getConfigurator().apply(generateCanCoderConfiguration(steerOffset)); steerEncoder.getConfigurator().apply(generateCanCoderConfiguration(steerOffset));
driveMotor = new TalonFX(driveMotorId, canBusName);
driveMotor.getVelocity().setUpdateFrequency(CAN_UPDATE_FREQUENCY);
driveMotor.optimizeBusUtilization();
driveMotor.getConfigurator().apply(generateDriveTalonConfiguration(driveKP, driveKI, driveKD, driveKV));
steerMotor = new TalonFX(steerMotorId, canBusName);
steerMotor.optimizeBusUtilization();
steerMotor.getConfigurator().apply(generateSteerTalonConfiguration(steerKP, steerKI, steerKD, steerKV));
this.moduleLocation = moduleLocation; this.moduleLocation = moduleLocation;
this.gearRatio = gearRatio; this.gearRatio = gearRatio;
@ -79,7 +84,7 @@ public class SwerveModule {
this.moduleName = moduleName; this.moduleName = moduleName;
} }
public void setSteerRotations(double rotations){ public void setSteerRotations(Angle rotations){
steerMotor.setControl(steerRequest.withSlot(0).withPosition(rotations)); steerMotor.setControl(steerRequest.withSlot(0).withPosition(rotations));
} }
@ -90,7 +95,7 @@ public class SwerveModule {
public void setDriveSpeed(double speed){ public void setDriveSpeed(double speed){
// Convert wheel speed to rotor speed // Convert wheel speed to rotor speed
// Circumfrence of wheel / speed * gear ratio // Circumfrence of wheel / speed * gear ratio
double rotorVelocity = ((Math.PI * wheelDiameterInMeters) / speed) * gearRatio; double rotorVelocity = (speed / (Math.PI * wheelDiameterInMeters)) * gearRatio;
driveMotor.setControl(driveRequest.withSlot(0).withVelocity(rotorVelocity)); driveMotor.setControl(driveRequest.withSlot(0).withVelocity(rotorVelocity));
} }
@ -107,7 +112,7 @@ public class SwerveModule {
* @return * @return
*/ */
public double getDriveWheelSpeed(){ public double getDriveWheelSpeed(){
return (driveMotor.getVelocity().refresh().getValueAsDouble() / gearRatio) * (Math.PI * wheelDiameterInMeters); return (driveMotor.getVelocity().refresh().getValueAsDouble() * gearRatio) / (Math.PI * wheelDiameterInMeters);
} }
public Translation2d getModuleLocation(){ public Translation2d getModuleLocation(){
@ -115,7 +120,7 @@ public class SwerveModule {
} }
public void setModuleState(SwerveModuleState state){ public void setModuleState(SwerveModuleState state){
this.setSteerRotations(state.angle.getRotations()); this.setSteerRotations(state.angle.getMeasure());
this.setDriveSpeed(state.speedMetersPerSecond); this.setDriveSpeed(state.speedMetersPerSecond);
moduleState = state; moduleState = state;
} }
@ -133,34 +138,46 @@ public class SwerveModule {
} }
private double getModuleDistance(){ private double getModuleDistance(){
double distance = (this.driveMotor.getPosition(true).getValueAsDouble()) / gearRatio * (Math.PI * wheelDiameterInMeters); double distance = (this.driveMotor.getPosition(true).getValueAsDouble() * gearRatio) / (Math.PI * wheelDiameterInMeters);
return distance; return distance;
} }
private TalonFXConfiguration generateDriveTalonConfiguration(double kP, double kI, double kD){ private TalonFXConfiguration generateDriveTalonConfiguration(double kP, double kI, double kD, double kV){
return new TalonFXConfiguration().withSlot0( return new TalonFXConfiguration().withSlot0(
new Slot0Configs() new Slot0Configs()
.withKP(kP) .withKP(kP)
.withKI(kI) .withKI(kI)
.withKD(kD) .withKD(kD)
.withKV(kV)
); );
} }
private TalonFXConfiguration generateSteerTalonConfiguration(double kP, double kI, double kD){ private TalonFXConfiguration generateSteerTalonConfiguration(double kP, double kI, double kD, double kV){
return new TalonFXConfiguration().withSlot0( return new TalonFXConfiguration().withSlot0(
new Slot0Configs() new Slot0Configs()
.withKP(kP) .withKP(kP)
.withKI(kI) .withKI(kI)
.withKD(kD) .withKD(kD)
.withKS(kV)
.withStaticFeedforwardSign(StaticFeedforwardSignValue.UseClosedLoopSign)
).withFeedback( ).withFeedback(
new FeedbackConfigs() new FeedbackConfigs()
.withFeedbackRemoteSensorID(steerEncoder.getDeviceID()) .withFeedbackRemoteSensorID(steerEncoder.getDeviceID())
.withFeedbackSensorSource(FeedbackSensorSourceValue.RemoteCANcoder) .withFeedbackSensorSource(FeedbackSensorSourceValue.FusedCANcoder)
.withSensorToMechanismRatio(1.0)
.withRotorToSensorRatio(12.8)
).withClosedLoopGeneral(
new ClosedLoopGeneralConfigs()
.withContinuousWrap(true)
); );
} }
private CANcoderConfiguration generateCanCoderConfiguration(double steerOffset){ private CANcoderConfiguration generateCanCoderConfiguration(double steerOffset){
return new CANcoderConfiguration().withMagnetSensor(new MagnetSensorConfigs().withMagnetOffset(steerOffset)); return new CANcoderConfiguration().withMagnetSensor(
new MagnetSensorConfigs()
.withMagnetOffset(steerOffset)
.withSensorDirection(SensorDirectionValue.CounterClockwise_Positive)
);
} }
} }