From 724731e5363607a45b729584315b1edab73f8b66 Mon Sep 17 00:00:00 2001 From: spoopr Date: Wed, 3 Jun 2026 16:06:56 -0500 Subject: [PATCH 1/3] centralize CANIDs --- src/main/java/frc/robot/Constants.java | 63 ++++++++++--------- .../subsystems/drive/SwerveSubsystem.java | 26 ++++---- 2 files changed, 46 insertions(+), 43 deletions(-) diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index cbe5f99..93aa99f 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -68,6 +68,39 @@ public static final class RobotConstants { public static final Mass TOTAL_MASS = Kilogram.of(107); public static final MomentOfInertia MOMENT_OF_INERTIA = KilogramSquareMeters.of(6.883); + + + public static final class CANIDs { + public static final class Drive { + public static final int IMU = 0; + + public static final class FL { + public static final int DRIVE = 10; + public static final int STEER = 11; + public static final int ENCODER = 12; + } + + public static final class FR { + public static final int DRIVE = 7; + public static final int STEER = 8; + public static final int ENCODER = 9; + } + + public static final class BL { + public static final int DRIVE = 4; + public static final int STEER = 5; + public static final int ENCODER = 6; + } + + public static final class BR { + public static final int DRIVE = 1; + public static final int STEER = 2; + public static final int ENCODER = 3; + } + } + + public static final int PDH = 13; + } } public static final class DriveConstants { @@ -216,36 +249,6 @@ public static final class Angle { } } } - - public static class CANIDs { - public static final int IMU = 0; - - public static class Modules { - public static final class FL { - public static final int DRIVE = 10; - public static final int STEER = 11; - public static final int CANCODER = 12; - } - - public static final class FR { - public static final int DRIVE = 7; - public static final int STEER = 8; - public static final int CANCODER = 9; - } - - public static final class BL { - public static final int DRIVE = 4; - public static final int STEER = 5; - public static final int CANCODER = 6; - } - - public static final class BR { - public static final int DRIVE = 1; - public static final int STEER = 2; - public static final int CANCODER = 3; - } - } - } } public static final class LimelightConstants { diff --git a/src/main/java/frc/robot/subsystems/drive/SwerveSubsystem.java b/src/main/java/frc/robot/subsystems/drive/SwerveSubsystem.java index 5934dc0..2532b87 100644 --- a/src/main/java/frc/robot/subsystems/drive/SwerveSubsystem.java +++ b/src/main/java/frc/robot/subsystems/drive/SwerveSubsystem.java @@ -200,18 +200,18 @@ public SwerveSubsystem() { SwerveModuleConfiguration modules[] = { new SwerveModuleConfiguration( new TalonFXSwerve( - DriveConstants.CANIDs.Modules.FL.DRIVE, + RobotConstants.CANIDs.Drive.FL.DRIVE, true, DCMotor.getKrakenX60Foc(1) ), new TalonFXSwerve( - DriveConstants.CANIDs.Modules.FL.STEER, + RobotConstants.CANIDs.Drive.FL.STEER, false, DCMotor.getKrakenX44Foc(1) ), conversionFactors, new CANCoderSwerve( - DriveConstants.CANIDs.Modules.FL.CANCODER + RobotConstants.CANIDs.Drive.FL.ENCODER ), DriveConstants.Modules.Offsets.FL.ANGLE.in(Degrees), DriveConstants.Modules.Offsets.FL.X.in(Meters), @@ -227,18 +227,18 @@ public SwerveSubsystem() { ), new SwerveModuleConfiguration( new TalonFXSwerve( - DriveConstants.CANIDs.Modules.FR.DRIVE, + RobotConstants.CANIDs.Drive.FR.DRIVE, true, DCMotor.getKrakenX60Foc(1) ), new TalonFXSwerve( - DriveConstants.CANIDs.Modules.FR.STEER, + RobotConstants.CANIDs.Drive.FR.STEER, false, DCMotor.getKrakenX44Foc(1) ), conversionFactors, new CANCoderSwerve( - DriveConstants.CANIDs.Modules.FR.CANCODER + RobotConstants.CANIDs.Drive.FR.ENCODER ), DriveConstants.Modules.Offsets.FR.ANGLE.in(Degrees), DriveConstants.Modules.Offsets.FR.X.in(Meters), @@ -252,18 +252,18 @@ public SwerveSubsystem() { ), new SwerveModuleConfiguration( new TalonFXSwerve( - DriveConstants.CANIDs.Modules.BL.DRIVE, + RobotConstants.CANIDs.Drive.BL.DRIVE, true, DCMotor.getKrakenX60Foc(1) ), new TalonFXSwerve( - DriveConstants.CANIDs.Modules.BL.STEER, + RobotConstants.CANIDs.Drive.BL.STEER, false, DCMotor.getKrakenX44Foc(1) ), conversionFactors, new CANCoderSwerve( - DriveConstants.CANIDs.Modules.BL.CANCODER + RobotConstants.CANIDs.Drive.BL.ENCODER ), DriveConstants.Modules.Offsets.BL.ANGLE.in(Degrees), DriveConstants.Modules.Offsets.BL.X.in(Meters), @@ -277,18 +277,18 @@ public SwerveSubsystem() { ), new SwerveModuleConfiguration( new TalonFXSwerve( - DriveConstants.CANIDs.Modules.BR.DRIVE, + RobotConstants.CANIDs.Drive.BR.DRIVE, true, DCMotor.getKrakenX60Foc(1) ), new TalonFXSwerve( - DriveConstants.CANIDs.Modules.BR.STEER, + RobotConstants.CANIDs.Drive.BR.STEER, false, DCMotor.getKrakenX44Foc(1) ), conversionFactors, new CANCoderSwerve( - DriveConstants.CANIDs.Modules.BR.CANCODER + RobotConstants.CANIDs.Drive.BR.ENCODER ), DriveConstants.Modules.Offsets.BR.ANGLE.in(Degrees), DriveConstants.Modules.Offsets.BR.X.in(Meters), @@ -305,7 +305,7 @@ public SwerveSubsystem() { SwerveDriveConfiguration driveConfiguration = new SwerveDriveConfiguration( modules, - new Pigeon2Swerve(DriveConstants.CANIDs.IMU), + new Pigeon2Swerve(RobotConstants.CANIDs.Drive.IMU), DriveConstants.IMU.INVERTED, physicalCharacteristics ); From c90a35d880cb78633ee6eb3c60d8b4335a4b0aea Mon Sep 17 00:00:00 2001 From: spoopr Date: Wed, 3 Jun 2026 16:33:19 -0500 Subject: [PATCH 2/3] reorganiz `util/` directory --- src/main/java/frc/robot/commands/control/DriveCommand.java | 2 +- .../java/frc/robot/subsystems/drive/SwerveSubsystem.java | 2 +- src/main/java/frc/robot/subsystems/limelight/Limelight.java | 4 ++-- src/main/java/frc/robot/subsystems/limelight/Reading.java | 2 +- src/main/java/frc/robot/util/{ => elastic}/Elastic.java | 2 +- .../frc/robot/util/{ => homebrew}/AllianceFlipUtil.java | 2 +- src/main/java/frc/robot/util/{ => homebrew}/Mutable.java | 2 +- .../frc/robot/util/{ => limelight}/LimelightHelpers.java | 6 ++---- 8 files changed, 10 insertions(+), 12 deletions(-) rename src/main/java/frc/robot/util/{ => elastic}/Elastic.java (99%) rename src/main/java/frc/robot/util/{ => homebrew}/AllianceFlipUtil.java (98%) rename src/main/java/frc/robot/util/{ => homebrew}/Mutable.java (90%) rename src/main/java/frc/robot/util/{ => limelight}/LimelightHelpers.java (99%) diff --git a/src/main/java/frc/robot/commands/control/DriveCommand.java b/src/main/java/frc/robot/commands/control/DriveCommand.java index ec16e52..41fab00 100644 --- a/src/main/java/frc/robot/commands/control/DriveCommand.java +++ b/src/main/java/frc/robot/commands/control/DriveCommand.java @@ -9,7 +9,7 @@ import edu.wpi.first.wpilibj.XboxController; import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; -import frc.robot.subsystems.SwerveSubsystem; +import frc.robot.subsystems.drive.SwerveSubsystem; import frc.robot.Constants.DriveConstants; import frc.robot.Constants.MetaConstants; diff --git a/src/main/java/frc/robot/subsystems/drive/SwerveSubsystem.java b/src/main/java/frc/robot/subsystems/drive/SwerveSubsystem.java index 2532b87..e3366ee 100644 --- a/src/main/java/frc/robot/subsystems/drive/SwerveSubsystem.java +++ b/src/main/java/frc/robot/subsystems/drive/SwerveSubsystem.java @@ -38,7 +38,7 @@ import frc.robot.Constants.ChoreoConstants; import frc.robot.RobotContainer; import frc.robot.subsystems.limelight.Reading; -import static frc.robot.util.LimelightHelpers.PoseEstimate; +import static frc.robot.util.limelight.LimelightHelpers.PoseEstimate; import swervelib.SwerveDrive; import swervelib.SwerveDriveTest; import swervelib.encoders.CANCoderSwerve; diff --git a/src/main/java/frc/robot/subsystems/limelight/Limelight.java b/src/main/java/frc/robot/subsystems/limelight/Limelight.java index 9bbd4b9..c353f63 100644 --- a/src/main/java/frc/robot/subsystems/limelight/Limelight.java +++ b/src/main/java/frc/robot/subsystems/limelight/Limelight.java @@ -3,11 +3,11 @@ import java.util.Optional; import java.util.function.Supplier; -import static frc.robot.util.LimelightHelpers.PoseEstimate; +import static frc.robot.util.limelight.LimelightHelpers.PoseEstimate; import frc.robot.RobotContainer; import frc.robot.Constants.LimelightConstants; import frc.robot.subsystems.limelight.Reading.ReadingType; -import frc.robot.util.LimelightHelpers; +import frc.robot.util.limelight.LimelightHelpers; import edu.wpi.first.math.geometry.Pose2d; import edu.wpi.first.math.geometry.Pose3d; import edu.wpi.first.math.util.Units; diff --git a/src/main/java/frc/robot/subsystems/limelight/Reading.java b/src/main/java/frc/robot/subsystems/limelight/Reading.java index e0fb81f..b37eec5 100644 --- a/src/main/java/frc/robot/subsystems/limelight/Reading.java +++ b/src/main/java/frc/robot/subsystems/limelight/Reading.java @@ -1,6 +1,6 @@ package frc.robot.subsystems.limelight; -import static frc.robot.util.LimelightHelpers.PoseEstimate; +import static frc.robot.util.limelight.LimelightHelpers.PoseEstimate; public class Reading { diff --git a/src/main/java/frc/robot/util/Elastic.java b/src/main/java/frc/robot/util/elastic/Elastic.java similarity index 99% rename from src/main/java/frc/robot/util/Elastic.java rename to src/main/java/frc/robot/util/elastic/Elastic.java index 74d122c..4d3c2d2 100644 --- a/src/main/java/frc/robot/util/Elastic.java +++ b/src/main/java/frc/robot/util/elastic/Elastic.java @@ -3,7 +3,7 @@ // defined by the Elastic license: // https://github.com/Gold872/elastic_dashboard/blob/main/LICENSE -package frc.robot.util; +package frc.robot.util.elastic; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; diff --git a/src/main/java/frc/robot/util/AllianceFlipUtil.java b/src/main/java/frc/robot/util/homebrew/AllianceFlipUtil.java similarity index 98% rename from src/main/java/frc/robot/util/AllianceFlipUtil.java rename to src/main/java/frc/robot/util/homebrew/AllianceFlipUtil.java index ff6153b..92fc7ee 100644 --- a/src/main/java/frc/robot/util/AllianceFlipUtil.java +++ b/src/main/java/frc/robot/util/homebrew/AllianceFlipUtil.java @@ -5,7 +5,7 @@ // license that can be found in the LICENSE file at // the root directory of this project. -package frc.robot.util; +package frc.robot.util.homebrew; import static edu.wpi.first.units.Units.*; diff --git a/src/main/java/frc/robot/util/Mutable.java b/src/main/java/frc/robot/util/homebrew/Mutable.java similarity index 90% rename from src/main/java/frc/robot/util/Mutable.java rename to src/main/java/frc/robot/util/homebrew/Mutable.java index 844e91b..4c2712f 100644 --- a/src/main/java/frc/robot/util/Mutable.java +++ b/src/main/java/frc/robot/util/homebrew/Mutable.java @@ -1,4 +1,4 @@ -package frc.robot.util; +package frc.robot.util.homebrew; import java.util.function.Supplier; diff --git a/src/main/java/frc/robot/util/LimelightHelpers.java b/src/main/java/frc/robot/util/limelight/LimelightHelpers.java similarity index 99% rename from src/main/java/frc/robot/util/LimelightHelpers.java rename to src/main/java/frc/robot/util/limelight/LimelightHelpers.java index 2510d6e..db0307d 100644 --- a/src/main/java/frc/robot/util/LimelightHelpers.java +++ b/src/main/java/frc/robot/util/limelight/LimelightHelpers.java @@ -1,14 +1,12 @@ //LimelightHelpers v1.14 (REQUIRES LLOS 2026.0 OR LATER) -package frc.robot.util; +package frc.robot.util.limelight; import edu.wpi.first.networktables.DoubleArrayEntry; import edu.wpi.first.networktables.NetworkTable; import edu.wpi.first.networktables.NetworkTableEntry; import edu.wpi.first.networktables.NetworkTableInstance; import edu.wpi.first.networktables.TimestampedDoubleArray; -import frc.robot.util.LimelightHelpers.LimelightResults; -import frc.robot.util.LimelightHelpers.PoseEstimate; import edu.wpi.first.math.geometry.Pose2d; import edu.wpi.first.math.geometry.Pose3d; import edu.wpi.first.math.geometry.Rotation2d; @@ -1944,4 +1942,4 @@ public static void setupPortForwardingUSB(int usbIndex) { PortForwarder.add(basePort + i, ip, 5800 + i); } } -} \ No newline at end of file +} From 964d05e70fb82231e65ecc84d123353410bb3599 Mon Sep 17 00:00:00 2001 From: spoopr Date: Wed, 3 Jun 2026 16:54:56 -0500 Subject: [PATCH 3/3] split `Constants.java` file and fix references --- src/main/java/frc/robot/Constants.java | 288 ------------------ src/main/java/frc/robot/Robot.java | 4 +- src/main/java/frc/robot/RobotContainer.java | 11 +- .../robot/commands/control/DriveCommand.java | 4 +- .../subsystems/drive/SwerveSubsystem.java | 8 +- .../robot/subsystems/limelight/Limelight.java | 2 +- .../robot/util/constants/ChoreoConstants.java | 17 ++ .../robot/util/constants/DriveConstants.java | 152 +++++++++ .../util/constants/LimelightConstants.java | 26 ++ .../robot/util/constants/MetaConstants.java | 53 ++++ .../robot/util/constants/RobotConstants.java | 54 ++++ .../robot/util/homebrew/AllianceFlipUtil.java | 2 +- 12 files changed, 317 insertions(+), 304 deletions(-) delete mode 100644 src/main/java/frc/robot/Constants.java create mode 100644 src/main/java/frc/robot/util/constants/ChoreoConstants.java create mode 100644 src/main/java/frc/robot/util/constants/DriveConstants.java create mode 100644 src/main/java/frc/robot/util/constants/LimelightConstants.java create mode 100644 src/main/java/frc/robot/util/constants/MetaConstants.java create mode 100644 src/main/java/frc/robot/util/constants/RobotConstants.java diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java deleted file mode 100644 index 93aa99f..0000000 --- a/src/main/java/frc/robot/Constants.java +++ /dev/null @@ -1,288 +0,0 @@ -package frc.robot; - -import static edu.wpi.first.units.Units.*; - -import java.util.HashMap; -import java.util.function.BooleanSupplier; - -import edu.wpi.first.apriltag.AprilTagFieldLayout; -import edu.wpi.first.apriltag.AprilTagFields; -import edu.wpi.first.math.geometry.Pose2d; -import edu.wpi.first.units.measure.*; -import edu.wpi.first.wpilibj.DriverStation; -import edu.wpi.first.wpilibj.DriverStation.Alliance; - -/** - * The Constants class provides a convenient to hold robot-wide numerical or - * boolean constants. This class should not be used for any other purpose. All - * constants should be declared globally (i.e. public static). Avoid putting - * anything functional in this class. - * - * It is advised to statically import this class (or one of its inner classes) - * wherever the constants are needed, to reduce verbosity. - */ -public final class Constants { - public static final class MetaConstants { - public static Alliance getAlliance() { - return DriverStation.getAlliance().isPresent() - ? DriverStation.getAlliance().get() - : Alliance.Blue; - } - - public static BooleanSupplier isRed = new BooleanSupplier() { - @Override - public boolean getAsBoolean() { - return getAlliance() == Alliance.Red; - } - }; - - public static final class Controllers { - public static final int DRIVER_PORT = 0; - public static final int OPERATOR_PORT = 1; - } - - public static final class Logging { - public static final boolean LOG_INTO_FILE_ENABLED = true; - } - - public static final class Field { - public static final LinearAcceleration GRAVITY = - MetersPerSecondPerSecond.of(9.81); - - public static final Distance LENGTH = Inches.of(651.22); - public static final Distance WIDTH = Inches.of(317.69); - } - - public static final class Game { - /* - * I used this for season specific constants, so, of course, its - * empty now. - */ - } - } - - public static final class RobotConstants { - public static final Distance WIDTH = Inches.of(25); - public static final Distance LENGTH = Inches.of(30); - - public static final Mass TOTAL_MASS = Kilogram.of(107); - public static final MomentOfInertia MOMENT_OF_INERTIA = - KilogramSquareMeters.of(6.883); - - - public static final class CANIDs { - public static final class Drive { - public static final int IMU = 0; - - public static final class FL { - public static final int DRIVE = 10; - public static final int STEER = 11; - public static final int ENCODER = 12; - } - - public static final class FR { - public static final int DRIVE = 7; - public static final int STEER = 8; - public static final int ENCODER = 9; - } - - public static final class BL { - public static final int DRIVE = 4; - public static final int STEER = 5; - public static final int ENCODER = 6; - } - - public static final class BR { - public static final int DRIVE = 1; - public static final int STEER = 2; - public static final int ENCODER = 3; - } - } - - public static final int PDH = 13; - } - } - - public static final class DriveConstants { - public static final LinearVelocity MAX_ROBOT_VELOCITY = - MetersPerSecond.of(4.2); - public static final AngularVelocity MAX_ROBOT_RAD_VELOCITY = - RotationsPerSecond.of(1); - - public static final class Control { - public static final Dimensionless REGULAR_DRIVE_MULT = - Percent.of(100); - public static final Dimensionless TURTLE_DRIVE_MULT = - Percent.of(25); - public static final Dimensionless ROCK_DRIVE_MULT = - Percent.of(15); - public static final Frequency MULTIPLIER_SLEW_RATE = - Percent - .of(25) - .per(Second); - - public static final class Deadband { - public static final double X = 0.1; - public static final double Y = 0.1; - public static final double Z = 0.08; - - // the radius beyond the center of the joystick (from 0 to - // 1) after which the angle-based heading control activates - public static final double HEADING = 0; - }; - - // for angle-based heading control - public static final class HeadingPID { - public static final double P = 0.01; - public static final double I = 0; - public static final double D = 0; - public static final double F = 0; - public static final double IZ = 0; - } - - // multiply the output of the drive motor by cos(angular_error) - public static final boolean USE_COSINE_COMPENSATION = true; - - // correction for heading skew when rotating - // (see)[https://yet-another-software-suite.github.io/YAGSL/javadocs/swervelib/SwerveDrive.html#setAngularVelocityCompensation(boolean,boolean,double)] - public static final class AngularCompensation { - public static final boolean ENABLE_IN_TELEOP = false; - public static final boolean ENABLE_IN_AUTO = false; - - // expected values are between -0.15 and 0.15 - public static final double COMPENSATION_COEFFICIENT = 0.1; - } - } - - public static final class IMU { - public static final boolean INVERTED = false; - } - - public static final class Modules { - public static final Distance WHEEL_DIAMETER = Inches.of(4); - public static final double WHEEL_FRICTION_COEFFICIENT = 2.255; - - public static final Voltage OPTIMAL_VOLTAGE = Volts.of(12); - public static final Current DRIVE_CURRENT_LIMIT = Amps.of(120); - public static final Current STEER_CURRENT_LIMIT = Amps.of(120); - - // the minimum number of seconds it takes the motor to go from 0 to - // full throttle - public static final Time DRIVE_RAMP = Seconds.of(0); - public static final Time STEER_RAMP = Seconds.of(0); - - // the minimum voltage it takes for the given motor to move - public static final Voltage DRIVE_FRICTION_VOLTAGE = Volts.of(0.23); - public static final Voltage STEER_FRICTION_VOLTAGE = Volts.of(0.19); - - public static final class Gearing { - public static final class Drive{ - public static final double LIGHT = 7.03; - public static final double RIDICULUS = 6.03; - public static final double LUDICRUS = 5.27; - } - - public static final double ANGLE = 26.09; - } - - - public static final class Offsets { - // distance left of the center of the robot - private static final Distance BASE_X = Inches.of(9.75); - // distance forward of the center of the robot - private static final Distance BASE_Y = Inches.of(12.263); - - - // im making the assumption that the swerve module placement is - // symmetrical on both axes - public static final class FL { - public static final Distance X = BASE_X; - public static final Distance Y = BASE_Y; - // the absolute encoder offset - public static final Angle ANGLE = Rotations.of(0.073975); - public static final boolean ENCODER_INVERTED = false; - public static final boolean DRIVE_INVERTED = false; - public static final boolean ANGLE_INVERTED = true; - } - public static final class FR { - public static final Distance X = BASE_X; - public static final Distance Y = BASE_Y.times(-1); - public static final Angle ANGLE = Rotations.of(0.918457); - public static final boolean ENCODER_INVERTED = false; - public static final boolean DRIVE_INVERTED = false; - public static final boolean ANGLE_INVERTED = true; - } - public static final class BL { - public static final Distance X = BASE_X.times(-1); - public static final Distance Y = BASE_Y; - public static final Angle ANGLE = Rotations.of(0.653564); - public static final boolean ENCODER_INVERTED = false; - public static final boolean DRIVE_INVERTED = false; - public static final boolean ANGLE_INVERTED = true; - } - public static final class BR { - public static final Distance X = BASE_X.times(-1); - public static final Distance Y = BASE_Y.times(-1); - public static final Angle ANGLE = Rotations.of(0.246826); - public static final boolean ENCODER_INVERTED = false; - public static final boolean DRIVE_INVERTED = false; - public static final boolean ANGLE_INVERTED = true; - } - } - public static final class PID { - // for the drive motors on the modules - public static final class Drive { - public static final double P = 6.5; - public static final double I = 0; - public static final double D = 0.03; - public static final double F = 0.2; - public static final double IZ = 0; - } - - // for the steer motors on the modules - public static final class Angle { - public static final double P = 80; - public static final double I = 0; - public static final double D = 0; - public static final double F = 0; - public static final double IZ = 0; - } - } - } - } - - public static final class LimelightConstants { - private static final AprilTagFieldLayout TAG_LAYOUT = - AprilTagFieldLayout.loadField(AprilTagFields.kDefaultField); - - public final static HashMap TAG_POSES = - new HashMap() {{ - for (int i = 0; i < TAG_LAYOUT.getTags().size(); ++i) { - if (TAG_LAYOUT.getTagPose(i + 1).isPresent()) - put(i, TAG_LAYOUT.getTagPose(i + 1).get().toPose2d()); - } - }}; - - public static final int[] VALID_TAGS = { - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48 - }; - } - - public static final class ChoreoConstants { - public static final class PID { - public static final class Translation { - public static final double P = 7.0; - public static final double I = 0.0; - public static final double D = 0.0; - } - - public static final class Heading { - public static final double P = 7.0; - public static final double I = 0.0; - public static final double D = 0.02; - } - } - } -} diff --git a/src/main/java/frc/robot/Robot.java b/src/main/java/frc/robot/Robot.java index 67e0690..76a82d2 100644 --- a/src/main/java/frc/robot/Robot.java +++ b/src/main/java/frc/robot/Robot.java @@ -21,8 +21,8 @@ import edu.wpi.first.wpilibj.Timer; import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.CommandScheduler; -import frc.robot.Constants.MetaConstants; -import frc.robot.util.Elastic; +import frc.robot.util.constants.MetaConstants; +import frc.robot.util.elastic.Elastic; /* * The VM is configured to automatically run this class, and to call the diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index 918d124..4526561 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -37,16 +37,15 @@ import edu.wpi.first.wpilibj2.command.button.RobotModeTriggers; import edu.wpi.first.wpilibj2.command.button.Trigger; -import frc.robot.Constants.MetaConstants; -import frc.robot.Constants.RobotConstants; +import frc.robot.util.constants.MetaConstants; +import frc.robot.util.constants.RobotConstants; import frc.robot.commands.control.DriveCommand; -import frc.robot.commands.util.MatchtimeStatusCommand; import frc.robot.commands.util.VoltageStatusCommand; -import frc.robot.Constants.DriveConstants; +import frc.robot.util.constants.DriveConstants; import frc.robot.subsystems.limelight.LimelightSubsystem; import frc.robot.subsystems.drive.SwerveSubsystem; -import frc.robot.util.AllianceFlipUtil; -import frc.robot.util.Elastic; +import frc.robot.util.homebrew.AllianceFlipUtil; +import frc.robot.util.elastic.Elastic; /** * This class is where the bulk of the robot should be declared. Since diff --git a/src/main/java/frc/robot/commands/control/DriveCommand.java b/src/main/java/frc/robot/commands/control/DriveCommand.java index 41fab00..b4897d3 100644 --- a/src/main/java/frc/robot/commands/control/DriveCommand.java +++ b/src/main/java/frc/robot/commands/control/DriveCommand.java @@ -10,8 +10,8 @@ import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; import frc.robot.subsystems.drive.SwerveSubsystem; -import frc.robot.Constants.DriveConstants; -import frc.robot.Constants.MetaConstants; +import frc.robot.util.constants.DriveConstants; +import frc.robot.util.constants.MetaConstants; public class DriveCommand extends Command { diff --git a/src/main/java/frc/robot/subsystems/drive/SwerveSubsystem.java b/src/main/java/frc/robot/subsystems/drive/SwerveSubsystem.java index e3366ee..a00f7f1 100644 --- a/src/main/java/frc/robot/subsystems/drive/SwerveSubsystem.java +++ b/src/main/java/frc/robot/subsystems/drive/SwerveSubsystem.java @@ -32,10 +32,10 @@ import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.SubsystemBase; import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine; -import frc.robot.Constants.DriveConstants; -import frc.robot.Constants.MetaConstants; -import frc.robot.Constants.RobotConstants; -import frc.robot.Constants.ChoreoConstants; +import frc.robot.util.constants.DriveConstants; +import frc.robot.util.constants.MetaConstants; +import frc.robot.util.constants.RobotConstants; +import frc.robot.util.constants.ChoreoConstants; import frc.robot.RobotContainer; import frc.robot.subsystems.limelight.Reading; import static frc.robot.util.limelight.LimelightHelpers.PoseEstimate; diff --git a/src/main/java/frc/robot/subsystems/limelight/Limelight.java b/src/main/java/frc/robot/subsystems/limelight/Limelight.java index c353f63..813e478 100644 --- a/src/main/java/frc/robot/subsystems/limelight/Limelight.java +++ b/src/main/java/frc/robot/subsystems/limelight/Limelight.java @@ -5,7 +5,7 @@ import static frc.robot.util.limelight.LimelightHelpers.PoseEstimate; import frc.robot.RobotContainer; -import frc.robot.Constants.LimelightConstants; +import frc.robot.util.constants.LimelightConstants; import frc.robot.subsystems.limelight.Reading.ReadingType; import frc.robot.util.limelight.LimelightHelpers; import edu.wpi.first.math.geometry.Pose2d; diff --git a/src/main/java/frc/robot/util/constants/ChoreoConstants.java b/src/main/java/frc/robot/util/constants/ChoreoConstants.java new file mode 100644 index 0000000..c3850d0 --- /dev/null +++ b/src/main/java/frc/robot/util/constants/ChoreoConstants.java @@ -0,0 +1,17 @@ +package frc.robot.util.constants; + +public final class ChoreoConstants { + public static final class PID { + public static final class Translation { + public static final double P = 7.0; + public static final double I = 0.0; + public static final double D = 0.0; + } + + public static final class Heading { + public static final double P = 7.0; + public static final double I = 0.0; + public static final double D = 0.02; + } + } +} diff --git a/src/main/java/frc/robot/util/constants/DriveConstants.java b/src/main/java/frc/robot/util/constants/DriveConstants.java new file mode 100644 index 0000000..965b0d1 --- /dev/null +++ b/src/main/java/frc/robot/util/constants/DriveConstants.java @@ -0,0 +1,152 @@ +package frc.robot.util.constants; + +import static edu.wpi.first.units.Units.*; +import edu.wpi.first.units.measure.*; + +public final class DriveConstants { + public static final LinearVelocity MAX_ROBOT_VELOCITY = + MetersPerSecond.of(4.2); + public static final AngularVelocity MAX_ROBOT_RAD_VELOCITY = + RotationsPerSecond.of(1); + + public static final class Control { + public static final Dimensionless REGULAR_DRIVE_MULT = + Percent.of(100); + public static final Dimensionless TURTLE_DRIVE_MULT = + Percent.of(25); + public static final Dimensionless ROCK_DRIVE_MULT = + Percent.of(15); + public static final Frequency MULTIPLIER_SLEW_RATE = + Percent + .of(25) + .per(Second); + + public static final class Deadband { + public static final double X = 0.1; + public static final double Y = 0.1; + public static final double Z = 0.08; + + // the radius beyond the center of the joystick (from 0 to + // 1) after which the angle-based heading control activates + public static final double HEADING = 0; + }; + + // for angle-based heading control + public static final class HeadingPID { + public static final double P = 0.01; + public static final double I = 0; + public static final double D = 0; + public static final double F = 0; + public static final double IZ = 0; + } + + // multiply the output of the drive motor by cos(angular_error) + public static final boolean USE_COSINE_COMPENSATION = true; + + // correction for heading skew when rotating + // (see)[https://yet-another-software-suite.github.io/YAGSL/javadocs/swervelib/SwerveDrive.html#setAngularVelocityCompensation(boolean,boolean,double)] + public static final class AngularCompensation { + public static final boolean ENABLE_IN_TELEOP = false; + public static final boolean ENABLE_IN_AUTO = false; + + // expected values are between -0.15 and 0.15 + public static final double COMPENSATION_COEFFICIENT = 0.1; + } + } + + public static final class IMU { + public static final boolean INVERTED = false; + } + + public static final class Modules { + public static final Distance WHEEL_DIAMETER = Inches.of(4); + public static final double WHEEL_FRICTION_COEFFICIENT = 2.255; + + public static final Voltage OPTIMAL_VOLTAGE = Volts.of(12); + public static final Current DRIVE_CURRENT_LIMIT = Amps.of(120); + public static final Current STEER_CURRENT_LIMIT = Amps.of(120); + + // the minimum number of seconds it takes the motor to go from 0 to + // full throttle + public static final Time DRIVE_RAMP = Seconds.of(0); + public static final Time STEER_RAMP = Seconds.of(0); + + // the minimum voltage it takes for the given motor to move + public static final Voltage DRIVE_FRICTION_VOLTAGE = Volts.of(0.23); + public static final Voltage STEER_FRICTION_VOLTAGE = Volts.of(0.19); + + public static final class Gearing { + public static final class Drive{ + public static final double LIGHT = 7.03; + public static final double RIDICULUS = 6.03; + public static final double LUDICRUS = 5.27; + } + + public static final double ANGLE = 26.09; + } + + + public static final class Offsets { + // distance left of the center of the robot + private static final Distance BASE_X = Inches.of(9.75); + // distance forward of the center of the robot + private static final Distance BASE_Y = Inches.of(12.263); + + + // im making the assumption that the swerve module placement is + // symmetrical on both axes + public static final class FL { + public static final Distance X = BASE_X; + public static final Distance Y = BASE_Y; + // the absolute encoder offset + public static final Angle ANGLE = Rotations.of(0.073975); + public static final boolean ENCODER_INVERTED = false; + public static final boolean DRIVE_INVERTED = false; + public static final boolean ANGLE_INVERTED = true; + } + public static final class FR { + public static final Distance X = BASE_X; + public static final Distance Y = BASE_Y.times(-1); + public static final Angle ANGLE = Rotations.of(0.918457); + public static final boolean ENCODER_INVERTED = false; + public static final boolean DRIVE_INVERTED = false; + public static final boolean ANGLE_INVERTED = true; + } + public static final class BL { + public static final Distance X = BASE_X.times(-1); + public static final Distance Y = BASE_Y; + public static final Angle ANGLE = Rotations.of(0.653564); + public static final boolean ENCODER_INVERTED = false; + public static final boolean DRIVE_INVERTED = false; + public static final boolean ANGLE_INVERTED = true; + } + public static final class BR { + public static final Distance X = BASE_X.times(-1); + public static final Distance Y = BASE_Y.times(-1); + public static final Angle ANGLE = Rotations.of(0.246826); + public static final boolean ENCODER_INVERTED = false; + public static final boolean DRIVE_INVERTED = false; + public static final boolean ANGLE_INVERTED = true; + } + } + public static final class PID { + // for the drive motors on the modules + public static final class Drive { + public static final double P = 6.5; + public static final double I = 0; + public static final double D = 0.03; + public static final double F = 0.2; + public static final double IZ = 0; + } + + // for the steer motors on the modules + public static final class Angle { + public static final double P = 80; + public static final double I = 0; + public static final double D = 0; + public static final double F = 0; + public static final double IZ = 0; + } + } + } +} diff --git a/src/main/java/frc/robot/util/constants/LimelightConstants.java b/src/main/java/frc/robot/util/constants/LimelightConstants.java new file mode 100644 index 0000000..1b09042 --- /dev/null +++ b/src/main/java/frc/robot/util/constants/LimelightConstants.java @@ -0,0 +1,26 @@ +package frc.robot.util.constants; + +import java.util.HashMap; + +import edu.wpi.first.apriltag.AprilTagFieldLayout; +import edu.wpi.first.apriltag.AprilTagFields; +import edu.wpi.first.math.geometry.Pose2d; + +public final class LimelightConstants { + private static final AprilTagFieldLayout TAG_LAYOUT = + AprilTagFieldLayout.loadField(AprilTagFields.kDefaultField); + + public final static HashMap TAG_POSES = + new HashMap() {{ + for (int i = 0; i < TAG_LAYOUT.getTags().size(); ++i) { + if (TAG_LAYOUT.getTagPose(i + 1).isPresent()) + put(i, TAG_LAYOUT.getTagPose(i + 1).get().toPose2d()); + } + }}; + + public static final int[] VALID_TAGS = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48 + }; +} diff --git a/src/main/java/frc/robot/util/constants/MetaConstants.java b/src/main/java/frc/robot/util/constants/MetaConstants.java new file mode 100644 index 0000000..b873953 --- /dev/null +++ b/src/main/java/frc/robot/util/constants/MetaConstants.java @@ -0,0 +1,53 @@ +package frc.robot.util.constants; + +import static edu.wpi.first.units.Units.*; +import edu.wpi.first.units.measure.*; + +import edu.wpi.first.wpilibj.DriverStation; +import edu.wpi.first.wpilibj.DriverStation.Alliance; + +import java.util.function.BooleanSupplier; + + +/* + * this file contains information more relavant to the game and context beyond + * the robot, like alliance and game piece values + */ +public final class MetaConstants { + public static Alliance getAlliance() { + return DriverStation.getAlliance().isPresent() + ? DriverStation.getAlliance().get() + : Alliance.Blue; + } + + public static BooleanSupplier isRed = new BooleanSupplier() { + @Override + public boolean getAsBoolean() { + return getAlliance() == Alliance.Red; + } + }; + + public static final class Controllers { + public static final int DRIVER_PORT = 0; + public static final int OPERATOR_PORT = 1; + } + + public static final class Logging { + public static final boolean LOG_INTO_FILE_ENABLED = true; + } + + public static final class Field { + public static final LinearAcceleration GRAVITY = + MetersPerSecondPerSecond.of(9.81); + + public static final Distance LENGTH = Inches.of(651.22); + public static final Distance WIDTH = Inches.of(317.69); + } + + public static final class Game { + /* + * I used this for season specific constants, so, of course, its + * empty now. + */ + } +} diff --git a/src/main/java/frc/robot/util/constants/RobotConstants.java b/src/main/java/frc/robot/util/constants/RobotConstants.java new file mode 100644 index 0000000..6ce1024 --- /dev/null +++ b/src/main/java/frc/robot/util/constants/RobotConstants.java @@ -0,0 +1,54 @@ +package frc.robot.util.constants; + +import static edu.wpi.first.units.Units.*; +import edu.wpi.first.units.measure.*; + + + +/* + * this file contains information that pertains to the actions of the entire + * robot as a whole, like its dimensions and mass + * + * also, all of the CANIDs have been centralized here, for a convenient lookup + */ +public final class RobotConstants { + public static final Distance WIDTH = Inches.of(25); + public static final Distance LENGTH = Inches.of(30); + + public static final Mass TOTAL_MASS = Kilogram.of(107); + public static final MomentOfInertia MOMENT_OF_INERTIA = + KilogramSquareMeters.of(6.883); + + + public static final class CANIDs { + public static final class Drive { + public static final int IMU = 0; + + public static final class FL { + public static final int DRIVE = 10; + public static final int STEER = 11; + public static final int ENCODER = 12; + } + + public static final class FR { + public static final int DRIVE = 7; + public static final int STEER = 8; + public static final int ENCODER = 9; + } + + public static final class BL { + public static final int DRIVE = 4; + public static final int STEER = 5; + public static final int ENCODER = 6; + } + + public static final class BR { + public static final int DRIVE = 1; + public static final int STEER = 2; + public static final int ENCODER = 3; + } + } + + public static final int PDH = 13; + } +} diff --git a/src/main/java/frc/robot/util/homebrew/AllianceFlipUtil.java b/src/main/java/frc/robot/util/homebrew/AllianceFlipUtil.java index 92fc7ee..4ed4f32 100644 --- a/src/main/java/frc/robot/util/homebrew/AllianceFlipUtil.java +++ b/src/main/java/frc/robot/util/homebrew/AllianceFlipUtil.java @@ -19,7 +19,7 @@ import edu.wpi.first.math.geometry.Translation2d; import edu.wpi.first.units.measure.Distance; import edu.wpi.first.wpilibj.DriverStation; -import frc.robot.Constants.MetaConstants; +import frc.robot.util.constants.MetaConstants; public class AllianceFlipUtil {