diff --git a/src/main/deploy/pathplanner/paths/DriveForward.path b/src/main/deploy/pathplanner/paths/DriveForward.path index a92d15b..ba52bbc 100644 --- a/src/main/deploy/pathplanner/paths/DriveForward.path +++ b/src/main/deploy/pathplanner/paths/DriveForward.path @@ -8,7 +8,7 @@ }, "prevControl": null, "nextControl": { - "x": 2.425937499999999, + "x": 1.6759375, "y": 6.0 }, "isLocked": false, @@ -16,12 +16,12 @@ }, { "anchor": { - "x": 4.0, - "y": 6.0 + "x": 4.648, + "y": 5.9878289473684205 }, "prevControl": { - "x": 3.0, - "y": 6.0 + "x": 4.398, + "y": 5.9878289473684205 }, "nextControl": null, "isLocked": false, @@ -33,8 +33,8 @@ "pointTowardsZones": [], "eventMarkers": [], "globalConstraints": { - "maxVelocity": 3.0, - "maxAcceleration": 3.0, + "maxVelocity": 5.5, + "maxAcceleration": 6.7, "maxAngularVelocity": 540.0, "maxAngularAcceleration": 720.0, "nominalVoltage": 12.0, @@ -50,5 +50,5 @@ "velocity": 0, "rotation": 0.0 }, - "useDefaultConstraints": true + "useDefaultConstraints": false } \ No newline at end of file diff --git a/src/main/deploy/pathplanner/paths/New Path.path b/src/main/deploy/pathplanner/paths/New Path.path new file mode 100644 index 0000000..b030c88 --- /dev/null +++ b/src/main/deploy/pathplanner/paths/New Path.path @@ -0,0 +1,86 @@ +{ + "version": "2025.0", + "waypoints": [ + { + "anchor": { + "x": 1.884630681818182, + "y": 6.921747159090909 + }, + "prevControl": null, + "nextControl": { + "x": 2.134630681818182, + "y": 6.921747159090909 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 4.029, + "y": 6.922 + }, + "prevControl": { + "x": 3.779, + "y": 6.922 + }, + "nextControl": { + "x": 4.279, + "y": 6.922 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 4.029, + "y": 5.645383522727273 + }, + "prevControl": { + "x": 3.779, + "y": 5.645383522727273 + }, + "nextControl": { + "x": 4.279, + "y": 5.645383522727273 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 1.884630681818182, + "y": 5.645383522727273 + }, + "prevControl": { + "x": 1.6346306818181817, + "y": 5.645383522727273 + }, + "nextControl": null, + "isLocked": false, + "linkedName": null + } + ], + "rotationTargets": [], + "constraintZones": [], + "pointTowardsZones": [], + "eventMarkers": [], + "globalConstraints": { + "maxVelocity": 3.0, + "maxAcceleration": 3.0, + "maxAngularVelocity": 540.0, + "maxAngularAcceleration": 720.0, + "nominalVoltage": 12.0, + "unlimited": false + }, + "goalEndState": { + "velocity": 0, + "rotation": 0.0 + }, + "reversed": false, + "folder": null, + "idealStartingState": { + "velocity": 0, + "rotation": 0.0 + }, + "useDefaultConstraints": true +} \ No newline at end of file diff --git a/src/main/deploy/pathplanner/settings.json b/src/main/deploy/pathplanner/settings.json new file mode 100644 index 0000000..72e780f --- /dev/null +++ b/src/main/deploy/pathplanner/settings.json @@ -0,0 +1,32 @@ +{ + "robotWidth": 0.9398, + "robotLength": 0.9398, + "holonomicMode": true, + "pathFolders": [], + "autoFolders": [], + "defaultMaxVel": 3.0, + "defaultMaxAccel": 3.0, + "defaultMaxAngVel": 540.0, + "defaultMaxAngAccel": 720.0, + "defaultNominalVoltage": 12.0, + "robotMass": 68.0, + "robotMOI": 6.883, + "robotTrackwidth": 0.546, + "driveWheelRadius": 0.0508, + "driveGearing": 5.36, + "maxDriveSpeed": 5.96, + "driveMotorType": "krakenX60", + "driveCurrentLimit": 60.0, + "wheelCOF": 1.2, + "flModuleX": 0.34925, + "flModuleY": 0.34925, + "frModuleX": 0.34925, + "frModuleY": -0.34925, + "blModuleX": -0.34925, + "blModuleY": 0.34925, + "brModuleX": -0.34925, + "brModuleY": -0.34925, + "bumperOffsetX": 0.0, + "bumperOffsetY": 0.0, + "robotFeatures": [] +} \ No newline at end of file diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index e830bf0..ba1826e 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -6,23 +6,31 @@ import static edu.wpi.first.units.Units.*; +import com.ctre.phoenix6.SignalLogger; import com.ctre.phoenix6.swerve.SwerveRequest; import edu.wpi.first.wpilibj.Joystick; import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; import edu.wpi.first.wpilibj2.command.Command; +import edu.wpi.first.wpilibj2.command.InstantCommand; import edu.wpi.first.wpilibj2.command.WaitCommand; import edu.wpi.first.wpilibj2.command.button.CommandXboxController; import edu.wpi.first.wpilibj2.command.button.Trigger; +import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine; +import frc.robot.commands.DriveForward; import frc.robot.commands.ResetGyro; import frc.robot.commands.RunAlgaeIntake; import frc.robot.commands.RunCoralOuttake; +import frc.robot.commands.SwerveCharacterization; +import frc.robot.constants.ROBOT; import frc.robot.constants.SWERVE; +import frc.robot.constants.SWERVE.ROUTINE_TYPE; import frc.robot.constants.USB; import frc.robot.generated.TunerConstants; import frc.robot.subsystems.AlgaeIntake; import frc.robot.subsystems.CommandSwerveDrivetrain; import frc.robot.subsystems.CoralOuttake; +import frc.robot.utils.SysIdUtils; import frc.robot.utils.Telemetry; /** @@ -41,6 +49,7 @@ public class RobotContainer { // Replace with CommandPS4Controller or CommandJoystick if needed private final Joystick leftJoystick = new Joystick(USB.leftJoystick); private final SendableChooser m_sysidChooser = new SendableChooser<>(); + private final SendableChooser m_chooser = new SendableChooser<>(); private final Joystick rightJoystick = new Joystick(USB.rightJoystick); private final CommandXboxController m_driverController = new CommandXboxController(USB.xBoxController); @@ -66,7 +75,6 @@ public RobotContainer() { // Configure the trigger bindings configureBindings(); - initAutoChooser(); } private void initializeSubSystems() { @@ -87,60 +95,67 @@ private void initializeSubSystems() { } private void initAutoChooser() { - // Add the autonomous chooser to the dashboard - // SmartDashboard.putData("Auto Mode", m_chooser); + SmartDashboard.putData("Auto Mode", m_chooser); + m_chooser.setDefaultOption("Do Nothing", new WaitCommand(0)); + + m_chooser.addOption("DriveForward", new DriveForward(m_swerveDrive)); } private void initSmartDashboard() { - // if (ROBOT.useSysID) initSysidChooser(); - // else initAutoChooser(); + if (ROBOT.useSysID) initSysidChooser(); + else initAutoChooser(); SmartDashboard.putData("ResetGyro", new ResetGyro(m_swerveDrive)); } - // private void initSysidChooser(){ - // SignalLogger.setPath("/media/sda1/"); - - // SysIdUtils.createSwerveDriveRoutines(m_swerveDrive); - // SysIdUtils.createSwerveTurnRoutines(m_swerveDrive); - - // SmartDashboard.putData( - // "Start Logging", new InstantCommand(SignalLogger::start).ignoringDisable(true)); - // SmartDashboard.putData( - // "Stop Logging", new InstantCommand(SignalLogger::stop).ignoringDisable(true)); - // SmartDashboard.putData( - // "initDriveSettings", - // new InstantCommand(m_swerveDrive::initDriveSysid).ignoringDisable(true)); - // SmartDashboard.putData( - // "initTurnSettings",new - // InstantCommand(m_swerveDrive::initTurnSysid).ignoringDisable(true)); - - // m_sysidChooser.addOption( - // "driveQuasistaticForward", - // new SwerveDriveQuasistatic(m_swerveDrive, SysIdRoutine.Direction.kForward)); - // m_sysidChooser.addOption( - // "driveQuasistaticBackwards", - // new SwerveDriveQuasistatic(m_swerveDrive, SysIdRoutine.Direction.kReverse)); - // m_sysidChooser.addOption( - // "driveDynamicForward", - // new SwerveDriveDynamic(m_swerveDrive, SysIdRoutine.Direction.kForward)); - // m_sysidChooser.addOption( - // "driveDynamicBackward", - // new SwerveDriveDynamic(m_swerveDrive, SysIdRoutine.Direction.kReverse)); - - // m_sysidChooser.addOption( - // "turnQuasistaticForward", - // new SwerveTurnQuasistatic(m_swerveDrive, SysIdRoutine.Direction.kForward)); - // m_sysidChooser.addOption( - // "turnQuasistaticBackwards", - // new SwerveTurnQuasistatic(m_swerveDrive, SysIdRoutine.Direction.kReverse)); - // m_sysidChooser.addOption( - // "turnDynamicForward", - // new SwerveTurnDynamic(m_swerveDrive, SysIdRoutine.Direction.kForward)); - // m_sysidChooser.addOption( - // "turnDynamicBackward", - // new SwerveTurnDynamic(m_swerveDrive, SysIdRoutine.Direction.kReverse)); - - // } + private void initSysidChooser() { + SignalLogger.setPath("/media/sda1/"); + + SysIdUtils.createSwerveDriveRoutines(m_swerveDrive); + SysIdUtils.createSwerveTurnRoutines(m_swerveDrive); + + SmartDashboard.putData( + "Start Logging", new InstantCommand(SignalLogger::start).ignoringDisable(true)); + SmartDashboard.putData( + "Stop Logging", new InstantCommand(SignalLogger::stop).ignoringDisable(true)); + SmartDashboard.putData( + "initDriveSettings", + new InstantCommand(m_swerveDrive::initDriveSysid).ignoringDisable(true)); + + m_sysidChooser.addOption( + "driveQuasistaticForward", + new SwerveCharacterization( + m_swerveDrive, SysIdRoutine.Direction.kForward, ROUTINE_TYPE.DRIVE_QUASISTATIC)); + m_sysidChooser.addOption( + "driveQuasistaticBackwards", + new SwerveCharacterization( + m_swerveDrive, SysIdRoutine.Direction.kReverse, ROUTINE_TYPE.DRIVE_QUASISTATIC)); + m_sysidChooser.addOption( + "driveDynamicForward", + new SwerveCharacterization( + m_swerveDrive, SysIdRoutine.Direction.kForward, ROUTINE_TYPE.DRIVE_DYNAMIC)); + m_sysidChooser.addOption( + "driveDynamicBackward", + new SwerveCharacterization( + m_swerveDrive, SysIdRoutine.Direction.kReverse, ROUTINE_TYPE.DRIVE_DYNAMIC)); + + m_sysidChooser.addOption( + "turnQuasistaticForward", + new SwerveCharacterization( + m_swerveDrive, SysIdRoutine.Direction.kForward, ROUTINE_TYPE.TURN_QUASISTATIC)); + m_sysidChooser.addOption( + "turnQuasistaticBackwards", + new SwerveCharacterization( + m_swerveDrive, SysIdRoutine.Direction.kReverse, ROUTINE_TYPE.TURN_QUASISTATIC)); + m_sysidChooser.addOption( + "turnDynamicForward", + new SwerveCharacterization( + m_swerveDrive, SysIdRoutine.Direction.kForward, ROUTINE_TYPE.TURN_DYNAMIC)); + m_sysidChooser.addOption( + "turnDynamicBackward", + new SwerveCharacterization( + m_swerveDrive, SysIdRoutine.Direction.kReverse, ROUTINE_TYPE.TURN_DYNAMIC)); + } + /** * Use this method to define your trigger->command mappings. Triggers can be created via the * {@link Trigger#Trigger(java.util.function.BooleanSupplier)} constructor with an arbitrary @@ -151,13 +166,9 @@ private void initSmartDashboard() { * joysticks}. */ private void configureBindings() { - // // Schedule `ExampleCommand` when `exampleCondition` changes to `true` - // new Trigger(m_exampleSubsystem::exampleCondition) - // .onTrue(new ExampleCommand(m_exampleSubsystem)); - // - // // Schedule `exampleMethodCommand` when the Xbox controller's B button is pressed, - // // cancelling on release. - // m_driverController.b().whileTrue(m_exampleSubsystem.exampleMethodCommand()); + // Schedule `exampleMethodCommand` when the Xbox controller's B button is pressed, + // cancelling on release. + // m_driverController.b().whileTrue(m_exampleSubsystem.exampleMethodCommand()); m_driverController.leftBumper().whileTrue(new RunCoralOuttake(m_coralOuttake, 0.15)); // outtake m_driverController .rightBumper() @@ -172,7 +183,7 @@ private void configureBindings() { * @return the command to run in autonomous */ public Command getAutonomousCommand() { - return new WaitCommand(0); + return m_chooser.getSelected(); } public void testInit() { diff --git a/src/main/java/frc/robot/commands/DriveForward.java b/src/main/java/frc/robot/commands/DriveForward.java new file mode 100644 index 0000000..73cf85b --- /dev/null +++ b/src/main/java/frc/robot/commands/DriveForward.java @@ -0,0 +1,46 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +package frc.robot.commands; + +import com.ctre.phoenix6.swerve.SwerveRequest; +import com.pathplanner.lib.auto.AutoBuilder; +import com.pathplanner.lib.path.PathPlannerPath; +import edu.wpi.first.math.geometry.Rotation2d; +import edu.wpi.first.wpilibj.DriverStation; +import edu.wpi.first.wpilibj2.command.InstantCommand; +import edu.wpi.first.wpilibj2.command.SequentialCommandGroup; +import edu.wpi.first.wpilibj2.command.WaitCommand; +import frc.robot.subsystems.CommandSwerveDrivetrain; + +public class DriveForward extends SequentialCommandGroup { + /** Creates a new DriveForward. */ + public DriveForward(CommandSwerveDrivetrain swerveDrive /* TODO: Add field sim */) { + try { + PathPlannerPath path = PathPlannerPath.fromPathFile("DriveForward"); + + var m_ppCommand = AutoBuilder.followPath(path); + + var point = new SwerveRequest.PointWheelsAt(); + var stopRequest = new SwerveRequest.ApplyRobotSpeeds(); + + // Will throw an exception if the starting pose is not present + var starting_pose = path.getStartingHolonomicPose().orElseThrow(); + + // Add your commands in the addCommands() call, e.g. + // addCommands(new FooCommand(), new BarCommand()); + addCommands( + new InstantCommand( // Reset the pose of the robot to the starting pose of the path + () -> swerveDrive.resetPose(starting_pose)), + new InstantCommand( + () -> swerveDrive.applyRequest(() -> point.withModuleDirection(new Rotation2d())), + swerveDrive) + .alongWith(new WaitCommand(1)), + m_ppCommand.andThen(() -> swerveDrive.setControl(stopRequest))); + } catch (Exception e) { + DriverStation.reportError("Failed to load path for DriveForward", e.getStackTrace()); + addCommands(new WaitCommand(0)); + } + } +} diff --git a/src/main/java/frc/robot/constants/CORALOUTTAKE.java b/src/main/java/frc/robot/constants/CORALOUTTAKE.java index 0718b69..c00624d 100644 --- a/src/main/java/frc/robot/constants/CORALOUTTAKE.java +++ b/src/main/java/frc/robot/constants/CORALOUTTAKE.java @@ -7,6 +7,6 @@ public class CORALOUTTAKE { public static final double kI = 0.0; public static final double kD = 0.0; public static final double gearRatio = 1.0; - public static final double Inertia = 0.001; - public static final DCMotor Gearbox = DCMotor.getKrakenX60(1); + public static final double inertia = 0.001; + public static final DCMotor gearbox = DCMotor.getKrakenX60(1); } diff --git a/src/main/java/frc/robot/constants/SWERVE.java b/src/main/java/frc/robot/constants/SWERVE.java index ceb63f9..8700ca2 100644 --- a/src/main/java/frc/robot/constants/SWERVE.java +++ b/src/main/java/frc/robot/constants/SWERVE.java @@ -3,6 +3,7 @@ import edu.wpi.first.math.geometry.Translation2d; import edu.wpi.first.math.util.Units; +// TODO: most of these values have been moved to delete or update public class SWERVE { public static double kTrackWidth = Units.inchesToMeters(21); public static final double kWheelBase = Units.inchesToMeters(19); @@ -24,6 +25,7 @@ public class SWERVE { // public static final SwerveDriveKinematics kSwerveKinematics = // new SwerveDriveKinematics( // ModuleMap.orderedValues(kModuleTranslations, new Translation2d[0])); + public static final Translation2d kFrontLeftPosition = new Translation2d(kWheelBase / 2.0, kTrackWidth / 2.0); public static final Translation2d kFrontRightPosition = diff --git a/src/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java b/src/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java index eff2986..9fccf41 100644 --- a/src/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java +++ b/src/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java @@ -2,8 +2,11 @@ import static edu.wpi.first.units.Units.*; +import com.ctre.phoenix6.BaseStatusSignal; import com.ctre.phoenix6.SignalLogger; import com.ctre.phoenix6.Utils; +import com.ctre.phoenix6.configs.TalonFXConfiguration; +import com.ctre.phoenix6.signals.NeutralModeValue; import com.ctre.phoenix6.swerve.SwerveDrivetrainConstants; import com.ctre.phoenix6.swerve.SwerveModuleConstants; import com.ctre.phoenix6.swerve.SwerveRequest; @@ -26,6 +29,8 @@ import edu.wpi.first.wpilibj2.command.Subsystem; import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine; import frc.robot.generated.TunerConstants.TunerSwerveDrivetrain; +import frc.robot.utils.CtreUtils; +import frc.robot.utils.ModuleMap; import java.util.function.Supplier; /** @@ -128,22 +133,25 @@ public CommandSwerveDrivetrain( if (Utils.isSimulation()) { startSimThread(); } - // configureAutoBuilder(); + configureAutoBuilder(); } - // public void initDriveSysid() { - // for (ModuleMap.MODULE_POSITION i : ModuleMap.MODULE_POSITION.values()) { - // var driveMotor = getModule(i.ordinal()).getDriveMotor(); - // var turnMotor = getModule(i.ordinal()).getSteerMotor(); - // TunerConstants.configureTalonFx(driveMotor, new TalonFXConfiguration()); - // TunerConstants.configureTalonFx(turnMotor, TunerConstants.generateTurnMotorConfig()); - // driveMotor.setNeutralMode(NeutralModeValue.Brake); - // BaseStatusSignal.setUpdateFrequencyForAll( - // 250, driveMotor.getPosition(), driveMotor.getVelocity(), driveMotor.getMotorVoltage()); + public void initDriveSysid() { + for (ModuleMap.MODULE_POSITION i : ModuleMap.MODULE_POSITION.values()) { + var driveMotor = getModule(i.ordinal()).getDriveMotor(); + var turnMotor = getModule(i.ordinal()).getSteerMotor(); + CtreUtils.configureTalonFx(driveMotor, new TalonFXConfiguration()); + CtreUtils.configureTalonFx( + turnMotor, + new TalonFXConfiguration() /* was previously CtreUtils.generateTurnMotorConfig() TODO: get that method working again*/); + driveMotor.setNeutralMode(NeutralModeValue.Brake); + BaseStatusSignal.setUpdateFrequencyForAll( + 250, driveMotor.getPosition(), driveMotor.getVelocity(), driveMotor.getMotorVoltage()); + + driveMotor.optimizeBusUtilization(); + } + } - // driveMotor.optimizeBusUtilization(); - // } - // } /** * Constructs a CTRE SwerveDrivetrain using the specified constants. * @@ -163,7 +171,7 @@ public CommandSwerveDrivetrain( if (Utils.isSimulation()) { startSimThread(); } - // configureAutoBuilder(); + configureAutoBuilder(); } /** @@ -196,13 +204,13 @@ public CommandSwerveDrivetrain( if (Utils.isSimulation()) { startSimThread(); } - // configureAutoBuilder(); + configureAutoBuilder(); } // TODO: Re-implement - // public Command applyChassisSpeeds(Supplier chassisSpeeds) { - // return applyChassisSpeeds(chassisSpeeds, 0.02, 1.0, false); - // } + // public Command applyChassisSpeeds(Supplier chassisSpeeds) { + // return applyChassisSpeeds(chassisSpeeds, 0.02, 1.0, false); + // } /** * Second-Order Kinematics outtakePlant = LinearSystemId.createDCMotorSystem(1, 1); private final TalonFX outtakeMotor = new TalonFX(CAN.coralOuttakeMotor); private final DCMotorSim outtakeMotorSim = - new DCMotorSim(outtakePlant, CORALOUTTAKE.Gearbox); // TODO implement sim code + new DCMotorSim(outtakePlant, CORALOUTTAKE.gearbox); // TODO implement sim code private double m_desiredPercentOutput; private final DutyCycleOut m_dutyCycleRequest = new DutyCycleOut(0); private double m_rpmSetpoint; @@ -144,4 +146,9 @@ private void updateSmartDashboard() { SmartDashboard.putNumber("CoralOuttake/DesiredPercentOutput", m_desiredPercentOutput); SmartDashboard.putNumber("CoralOuttake/rpmSetpoint", m_rpmSetpoint); } + + @Override + public void periodic() { + updateSmartDashboard(); + } } diff --git a/src/main/java/frc/robot/subsystems/Elevator.java b/src/main/java/frc/robot/subsystems/Elevator.java index 79aa58d..0fa1942 100644 --- a/src/main/java/frc/robot/subsystems/Elevator.java +++ b/src/main/java/frc/robot/subsystems/Elevator.java @@ -6,7 +6,6 @@ import com.ctre.phoenix6.configs.TalonFXConfiguration; import com.ctre.phoenix6.hardware.TalonFX; -import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.SubsystemBase; import frc.robot.utils.CtreUtils; @@ -28,30 +27,6 @@ public Elevator() { CtreUtils.configureTalonFx(elevatormotors[1], configElevator); } - /** - * Example command factory method. - * - * @return a command - */ - public Command exampleMethodCommand() { - // Inline construction of command goes here. - // Subsystem::RunOnce implicitly requires `this` subsystem. - return runOnce( - () -> { - /* one-time action goes here */ - }); - } - - /** - * An example method querying a boolean state of the subsystem (for example, a digital sensor). - * - * @return value of some boolean subsystem state, such as a digital sensor. - */ - public boolean exampleCondition() { - // Query some boolean state, such as a digital sensor. - return false; - } - @Override public void periodic() { // This method will be called once per scheduler run diff --git a/src/main/java/frc/robot/utils/CtreUtils.java b/src/main/java/frc/robot/utils/CtreUtils.java index f90491c..6b7316b 100644 --- a/src/main/java/frc/robot/utils/CtreUtils.java +++ b/src/main/java/frc/robot/utils/CtreUtils.java @@ -5,15 +5,13 @@ import com.ctre.phoenix6.configs.TalonFXConfiguration; import com.ctre.phoenix6.hardware.CANcoder; import com.ctre.phoenix6.hardware.TalonFX; -import com.ctre.phoenix6.signals.*; import edu.wpi.first.wpilibj.Alert; import edu.wpi.first.wpilibj.Alert.AlertType; import edu.wpi.first.wpilibj.RobotBase; import edu.wpi.first.wpilibj.Timer; import frc.robot.constants.CAN; -// import frc.robot.constants.SWERVE; - +// TODO: This class is also a mess public final class CtreUtils { /** * Initialize Phoenix Server by creating a dummy device. We do this so that the CANCoders don't diff --git a/vendordeps/PathplannerLib-2025.1.1.json b/vendordeps/PathplannerLib-2025.2.1.json similarity index 87% rename from vendordeps/PathplannerLib-2025.1.1.json rename to vendordeps/PathplannerLib-2025.2.1.json index 6322388..71e25f3 100644 --- a/vendordeps/PathplannerLib-2025.1.1.json +++ b/vendordeps/PathplannerLib-2025.2.1.json @@ -1,7 +1,7 @@ { - "fileName": "PathplannerLib-2025.1.1.json", + "fileName": "PathplannerLib-2025.2.1.json", "name": "PathplannerLib", - "version": "2025.1.1", + "version": "2025.2.1", "uuid": "1b42324f-17c6-4875-8e77-1c312bc8c786", "frcYear": "2025", "mavenUrls": [ @@ -12,7 +12,7 @@ { "groupId": "com.pathplanner.lib", "artifactId": "PathplannerLib-java", - "version": "2025.1.1" + "version": "2025.2.1" } ], "jniDependencies": [], @@ -20,7 +20,7 @@ { "groupId": "com.pathplanner.lib", "artifactId": "PathplannerLib-cpp", - "version": "2025.1.1", + "version": "2025.2.1", "libName": "PathplannerLib", "headerClassifier": "headers", "sharedLibrary": false,