From 322d9258b51aab76d84864040065682f6cceec70 Mon Sep 17 00:00:00 2001 From: 1023941311414 Date: Wed, 16 Sep 2026 12:07:38 -0400 Subject: [PATCH 1/3] GyroIOCanandgyro and Redux library --- .../robot/sensors/gyro/GyroIOCanandgyro.java | 69 +++++++++++++++++++ vendordeps/ReduxLib-2026.1.2.json | 69 +++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 src/main/java/frc/robot/sensors/gyro/GyroIOCanandgyro.java create mode 100644 vendordeps/ReduxLib-2026.1.2.json diff --git a/src/main/java/frc/robot/sensors/gyro/GyroIOCanandgyro.java b/src/main/java/frc/robot/sensors/gyro/GyroIOCanandgyro.java new file mode 100644 index 00000000..13ecc89a --- /dev/null +++ b/src/main/java/frc/robot/sensors/gyro/GyroIOCanandgyro.java @@ -0,0 +1,69 @@ +package frc.robot.sensors.gyro; + +import java.util.Queue; + +import com.reduxrobotics.sensors.canandgyro.Canandgyro; + +import edu.wpi.first.math.geometry.Rotation2d; +import frc.robot.sensors.odometry.SparkOdometryThread; + +public class GyroIOCanandgyro implements GyroIO { + private final Canandgyro gyro; + + double offset = 0; + private final Queue yawPositionQueue; + private final Queue yawTimestampQueue; + private final Queue rate; + + double pitchOffset = 0; + double rollOffset = 0; + + public GyroIOCanandgyro(int gyroId) { + gyro = new Canandgyro(gyroId); + rate = SparkOdometryThread.getInstance().registerSignal(() -> Math.toRadians(gyro.getAngularVelocityYaw() * 360)); + yawTimestampQueue = SparkOdometryThread.getInstance().makeTimestampQueue(); + yawPositionQueue = SparkOdometryThread.getInstance().registerSignal(() -> gyro.getYaw() * 2 * Math.PI); + } + + @Override + public void updateInputs(GyroIOInputs inputs) { + + inputs.isConnected = gyro.isConnected(); + inputs.isCalibrating = gyro.isCalibrating(); + inputs.angleRadiansRaw = gyro.getYaw() * 2 * Math.PI; + inputs.angularVelocityDegreesPerSecond = gyro.getAngularVelocityYaw() * 360; + inputs.angleDegreesRaw = Math.toDegrees(inputs.angleRadiansRaw); + + inputs.roll = new Rotation2d(gyro.getRoll() * 2 * Math.PI - rollOffset); + inputs.pitch = new Rotation2d(gyro.getPitch() * 2 * Math.PI - pitchOffset); + + inputs.displacementX = 0; + inputs.displacementY = 0; + inputs.odometryYawRate = rate.stream().mapToDouble((Double value) -> value).toArray(); + inputs.odometryYawTimestamps = yawTimestampQueue.stream().mapToDouble((Double value) -> value).toArray(); + inputs.odometryYawPositions = yawPositionQueue.stream().map((Double value) -> Rotation2d.fromRadians(value)) + .toArray(Rotation2d[]::new); + + inputs.accelX = gyro.getAccelerationX(); + inputs.accelY = gyro.getAccelerationY(); + inputs.accelZ = gyro.getAccelerationZ(); + yawTimestampQueue.clear(); + yawPositionQueue.clear(); + rate.clear(); + } + + @Override + public double getActual(GyroIOInputs inputs) { + return inputs.angleRadiansRaw - offset; + } + + @Override + public double getOffset() { + return offset; + } + + @Override + public void setOffset(double offset) { + this.offset = offset; + } +} diff --git a/vendordeps/ReduxLib-2026.1.2.json b/vendordeps/ReduxLib-2026.1.2.json new file mode 100644 index 00000000..46e64b20 --- /dev/null +++ b/vendordeps/ReduxLib-2026.1.2.json @@ -0,0 +1,69 @@ +{ + "fileName": "ReduxLib-2026.1.2.json", + "name": "ReduxLib", + "version": "2026.1.2", + "frcYear": "2026", + "uuid": "151ecca8-670b-4026-8160-cdd2679ef2bd", + "mavenUrls": [ + "https://maven.reduxrobotics.com/" + ], + "jsonUrl": "https://frcsdk.reduxrobotics.com/ReduxLib_2026.json", + "javaDependencies": [ + { + "groupId": "com.reduxrobotics.frc", + "artifactId": "ReduxLib-java", + "version": "2026.1.2" + } + ], + "jniDependencies": [ + { + "groupId": "com.reduxrobotics.frc", + "artifactId": "ReduxLib-fifo", + "version": "2026.1.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "linuxathena", + "linuxx86-64", + "linuxarm64", + "osxuniversal", + "windowsx86-64" + ] + } + ], + "cppDependencies": [ + { + "groupId": "com.reduxrobotics.frc", + "artifactId": "ReduxLib-cpp", + "version": "2026.1.2", + "libName": "ReduxLib", + "headerClassifier": "headers", + "sourcesClassifier": "sources", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "linuxathena", + "linuxx86-64", + "linuxarm64", + "osxuniversal", + "windowsx86-64" + ] + }, + { + "groupId": "com.reduxrobotics.frc", + "artifactId": "ReduxLib-fifo", + "version": "2026.1.2", + "libName": "reduxfifo", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "linuxathena", + "linuxx86-64", + "linuxarm64", + "osxuniversal", + "windowsx86-64" + ] + } + ] +} \ No newline at end of file From 338f5167033c96d9cd671e4b3e49abe7e87e6147 Mon Sep 17 00:00:00 2001 From: 1023941311414 Date: Sat, 19 Sep 2026 15:35:10 -0400 Subject: [PATCH 2/3] Works! --- src/main/java/frc/robot/sensors/gyro/GyroIO.java | 3 ++- src/main/java/frc/robot/subsystems/drive/DriveConstants.java | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/frc/robot/sensors/gyro/GyroIO.java b/src/main/java/frc/robot/sensors/gyro/GyroIO.java index 25fc2c50..d71f88bf 100644 --- a/src/main/java/frc/robot/sensors/gyro/GyroIO.java +++ b/src/main/java/frc/robot/sensors/gyro/GyroIO.java @@ -2,6 +2,7 @@ import edu.wpi.first.math.geometry.Rotation2d; import frc.robot.Robot; +import frc.robot.subsystems.drive.DriveConstants; import java.util.function.DoubleSupplier; @@ -46,7 +47,7 @@ public default void setOffset(double offset) { public static GyroIO getIOByMode(DoubleSupplier simRotRate) { return switch (Robot.getMode()) { - case REAL -> new GyroIONavX(); + case REAL -> new GyroIOCanandgyro(DriveConstants.canandgyroId); case SIM -> new GyroIOSim(simRotRate); case REPLAY -> new GyroIO() { }; diff --git a/src/main/java/frc/robot/subsystems/drive/DriveConstants.java b/src/main/java/frc/robot/subsystems/drive/DriveConstants.java index 4594a8d6..f2dd0546 100644 --- a/src/main/java/frc/robot/subsystems/drive/DriveConstants.java +++ b/src/main/java/frc/robot/subsystems/drive/DriveConstants.java @@ -55,6 +55,8 @@ public static enum PivotId { public static final SwerveDriveKinematics kinematics = new SwerveDriveKinematics(frontLeftLocation, frontRightLocation, backLeftLocation, backRightLocation); + public static final int canandgyroId = 17; + public static final ModuleInfo FL = new ModuleInfo(PivotId.FL, SwitchableCANID.of(1).get(), SwitchableCANID.of(2).get(), Switchable.of(0).addAlt(RobotTypes.frank25, 2).addAlt(RobotTypes.prime25, 2).get(), 45); From ded8e644b3be595011b2562f83649cb6a7e38195 Mon Sep 17 00:00:00 2001 From: 1023941311414 Date: Wed, 14 Oct 2026 18:57:45 -0400 Subject: [PATCH 3/3] Spotless --- src/main/java/frc/robot/sensors/gyro/GyroIOCanandgyro.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/frc/robot/sensors/gyro/GyroIOCanandgyro.java b/src/main/java/frc/robot/sensors/gyro/GyroIOCanandgyro.java index 13ecc89a..0344aaac 100644 --- a/src/main/java/frc/robot/sensors/gyro/GyroIOCanandgyro.java +++ b/src/main/java/frc/robot/sensors/gyro/GyroIOCanandgyro.java @@ -20,7 +20,8 @@ public class GyroIOCanandgyro implements GyroIO { public GyroIOCanandgyro(int gyroId) { gyro = new Canandgyro(gyroId); - rate = SparkOdometryThread.getInstance().registerSignal(() -> Math.toRadians(gyro.getAngularVelocityYaw() * 360)); + rate = SparkOdometryThread.getInstance() + .registerSignal(() -> Math.toRadians(gyro.getAngularVelocityYaw() * 360)); yawTimestampQueue = SparkOdometryThread.getInstance().makeTimestampQueue(); yawPositionQueue = SparkOdometryThread.getInstance().registerSignal(() -> gyro.getYaw() * 2 * Math.PI); }