From 5a28ac2282d71c704f7502e4551d03f5a631ee9a Mon Sep 17 00:00:00 2001 From: Ayden-157 Date: Sat, 11 Jan 2025 10:31:05 -0500 Subject: [PATCH 01/13] Autogenerated code from phoenix tuner with some slight changes - AF, RG, JR, BH --- .../roborioteamnumbersetter.json | 3 - .wpilib/wpilib_preferences.json | 8 +- 8.11/checksums/checksums.lock | Bin 17 -> 17 bytes 8.11/checksums/md5-checksums.bin | Bin 24847 -> 22297 bytes 8.11/checksums/sha1-checksums.bin | Bin 30053 -> 22763 bytes 8.11/executionHistory/executionHistory.bin | Bin 31903 -> 122898 bytes 8.11/executionHistory/executionHistory.lock | Bin 17 -> 17 bytes 8.11/expanded/expanded.lock | Bin 0 -> 17 bytes 8.11/fileHashes/fileHashes.bin | Bin 21697 -> 25547 bytes 8.11/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes 8.11/fileHashes/resourceHashesCache.bin | Bin 20435 -> 19959 bytes ...ystem.java => CommandSwerveDrivetrain.java | 43 +- Constants.java | 12 +- Inputs.java | 98 ----- LoggingSystem.java | 61 --- .../autos/1m left auto.auto => New Auto.auto | 12 +- ...5.1.1.json => PathplannerLib-2025.2.1.json | 8 +- ...5.1.0.json => Phoenix6-frc2025-latest.json | 2 +- Robot.java | 5 +- RobotContainer.java | 164 +++----- Telemetry.java | 2 +- TunerConstants.java | 78 ++-- WPILibNewCommands.json | 38 ++ .../1m left auto.auto => autos/New Auto.auto | 12 +- build.gradle | 2 +- buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 17 bytes buildOutputCleanup/cache.properties | 2 +- buildOutputCleanup/outputFiles.bin | Bin 18821 -> 19001 bytes cosmetics/BlinkInLEDs.java | 35 -- cosmetics/PwmLEDs.java | 249 ----------- data/LoggingSystem.java | 61 --- deploy/music/BuddyHollyRiff.chrp | Bin 108 -> 0 bytes deploy/music/MoreCowbell.chrp | Bin 1084 -> 0 bytes deploy/music/TOTTFIY.chrp | Bin 24844 -> 0 bytes deploy/music/WTTBPchrp.chrp | Bin 9636 -> 0 bytes deploy/music/YourLoveOF.chrp | Bin 10740 -> 0 bytes deploy/music/adams.chrp | Bin 2332 -> 0 bytes .../music/bluetoothdeviceisreadytopair.chrp | Bin 2352 -> 0 bytes deploy/music/e1m1.chrp | Bin 25698 -> 0 bytes deploy/music/entry.chrp | Bin 17798 -> 0 bytes deploy/music/exorcist.chrp | Bin 4466 -> 0 bytes deploy/music/output.chrp | Bin 4704 -> 0 bytes deploy/music/sundog.chrp | Bin 12270 -> 0 bytes deploy/music/super_mario.chrp | Bin 2374 -> 0 bytes deploy/music/tetris.chrp | Bin 1596 -> 0 bytes .../pathplanner/autos/1m backward auto.auto | 25 -- .../autos/1m forward & backwards x25.auto | 169 -------- .../autos/1m forward & backwards.auto | 302 -------------- deploy/pathplanner/autos/1m forward auto.auto | 25 -- deploy/pathplanner/autos/1m left auto.auto | 25 -- deploy/pathplanner/autos/1m right auto.auto | 25 -- deploy/pathplanner/autos/New Auto.auto | 12 +- deploy/pathplanner/navgrid.json | 2 +- .../pathplanner/paths/1m Back and forth.path | 103 ----- deploy/pathplanner/paths/1m backward.path | 52 --- deploy/pathplanner/paths/1m forward.path | 52 --- deploy/pathplanner/paths/1m right.path | 52 --- deploy/pathplanner/paths/Example Path.path | 30 +- deploy/pathplanner/paths/Stephen.path | 52 --- deploy/pathplanner/paths/test.path | 68 --- file-system.probe | Bin 8 -> 8 bytes generated/TunerConstants.java | 78 ++-- java/frc/robot/Inputs.java | 98 ----- java/frc/robot/Main.java | 15 - java/frc/robot/Robot.java | 76 ---- java/frc/robot/RobotContainer.java | 130 ------ java/frc/robot/Telemetry.java | 124 ------ java/frc/robot/cosmetics/BlinkInLEDs.java | 35 -- java/frc/robot/cosmetics/PwmLEDs.java | 249 ----------- java/frc/robot/data/LoggingSystem.java | 61 --- java/frc/robot/generated/TunerConstants.java | 286 ------------- java/org/assabet/aztechs157/PrintLimiter.java | 44 -- java/org/assabet/aztechs157/Sanity.java | 91 ---- java/org/assabet/aztechs157/input/Model.java | 52 --- java/org/assabet/aztechs157/input/Pov.java | 67 --- .../input/layouts/DynamicLayout.java | 43 -- .../aztechs157/input/layouts/Layout.java | 22 - .../aztechs157/input/layouts/MapLayout.java | 62 --- .../input/models/LogitechAttack.java | 31 -- .../input/models/LogitechExtreme3D.java | 32 -- .../input/models/LogitechGamepadF310.java | 34 -- .../aztechs157/input/models/XboxOne.java | 34 -- .../assabet/aztechs157/input/values/Axis.java | 97 ----- .../aztechs157/input/values/Button.java | 131 ------ .../assabet/aztechs157/numbers/Deadzone.java | 40 -- .../org/assabet/aztechs157/numbers/Range.java | 36 -- .../aztechs157/numbers/RangeConverter.java | 26 -- main/deploy/music/BuddyHollyRiff.chrp | Bin 108 -> 0 bytes main/deploy/music/MoreCowbell.chrp | Bin 1084 -> 0 bytes main/deploy/music/TOTTFIY.chrp | Bin 24844 -> 0 bytes main/deploy/music/WTTBPchrp.chrp | Bin 9636 -> 0 bytes main/deploy/music/YourLoveOF.chrp | Bin 10740 -> 0 bytes main/deploy/music/adams.chrp | Bin 2332 -> 0 bytes .../music/bluetoothdeviceisreadytopair.chrp | Bin 2352 -> 0 bytes main/deploy/music/e1m1.chrp | Bin 25698 -> 0 bytes main/deploy/music/entry.chrp | Bin 17798 -> 0 bytes main/deploy/music/exorcist.chrp | Bin 4466 -> 0 bytes main/deploy/music/output.chrp | Bin 4704 -> 0 bytes main/deploy/music/sundog.chrp | Bin 12270 -> 0 bytes main/deploy/music/super_mario.chrp | Bin 2374 -> 0 bytes main/deploy/music/tetris.chrp | Bin 1596 -> 0 bytes .../pathplanner/autos/1m backward auto.auto | 25 -- .../autos/1m forward & backwards x25.auto | 169 -------- .../autos/1m forward & backwards.auto | 302 -------------- .../pathplanner/autos/1m forward auto.auto | 25 -- .../pathplanner/autos/1m right auto.auto | 25 -- main/deploy/pathplanner/autos/New Auto.auto | 12 +- main/deploy/pathplanner/navgrid.json | 2 +- .../pathplanner/paths/1m Back and forth.path | 103 ----- .../deploy/pathplanner/paths/1m backward.path | 52 --- main/deploy/pathplanner/paths/1m forward.path | 52 --- main/deploy/pathplanner/paths/1m left.path | 52 --- main/deploy/pathplanner/paths/1m right.path | 52 --- .../pathplanner/paths/Example Path.path | 30 +- main/deploy/pathplanner/paths/Stephen.path | 52 --- main/deploy/pathplanner/paths/test.path | 68 --- main/java/frc/robot/Inputs.java | 98 ----- main/java/frc/robot/Robot.java | 5 +- main/java/frc/robot/RobotContainer.java | 164 +++----- main/java/frc/robot/Telemetry.java | 2 +- .../java/frc/robot/cosmetics/BlinkInLEDs.java | 35 -- main/java/frc/robot/cosmetics/PwmLEDs.java | 249 ----------- main/java/frc/robot/data/LoggingSystem.java | 61 --- .../frc/robot/generated/TunerConstants.java | 78 ++-- .../subsystems/CommandSwerveDrivetrain.java | 43 +- .../java/frc/robot/subsystems}/Constants.java | 12 +- .../org/assabet/aztechs157/PrintLimiter.java | 44 -- main/java/org/assabet/aztechs157/Sanity.java | 91 ---- .../org/assabet/aztechs157/input/Model.java | 52 --- .../org/assabet/aztechs157/input/Pov.java | 67 --- .../input/layouts/DynamicLayout.java | 43 -- .../aztechs157/input/layouts/Layout.java | 22 - .../aztechs157/input/layouts/MapLayout.java | 62 --- .../input/models/LogitechAttack.java | 31 -- .../input/models/LogitechExtreme3D.java | 32 -- .../input/models/LogitechGamepadF310.java | 34 -- .../aztechs157/input/models/XboxOne.java | 34 -- .../assabet/aztechs157/input/values/Axis.java | 97 ----- .../aztechs157/input/values/Button.java | 131 ------ .../assabet/aztechs157/numbers/Deadzone.java | 40 -- .../org/assabet/aztechs157/numbers/Range.java | 36 -- .../aztechs157/numbers/RangeConverter.java | 26 -- music/BuddyHollyRiff.chrp | Bin 108 -> 0 bytes music/MoreCowbell.chrp | Bin 1084 -> 0 bytes music/TOTTFIY.chrp | Bin 24844 -> 0 bytes music/WTTBPchrp.chrp | Bin 9636 -> 0 bytes music/YourLoveOF.chrp | Bin 10740 -> 0 bytes music/adams.chrp | Bin 2332 -> 0 bytes music/bluetoothdeviceisreadytopair.chrp | Bin 2352 -> 0 bytes music/e1m1.chrp | Bin 25698 -> 0 bytes music/entry.chrp | Bin 17798 -> 0 bytes music/exorcist.chrp | Bin 4466 -> 0 bytes music/output.chrp | Bin 4704 -> 0 bytes music/sundog.chrp | Bin 12270 -> 0 bytes music/super_mario.chrp | Bin 2374 -> 0 bytes music/tetris.chrp | Bin 1596 -> 0 bytes navgrid.json | 1 + org/assabet/aztechs157/PrintLimiter.java | 44 -- org/assabet/aztechs157/Sanity.java | 91 ---- org/assabet/aztechs157/input/Model.java | 52 --- org/assabet/aztechs157/input/Pov.java | 67 --- .../input/layouts/DynamicLayout.java | 43 -- .../aztechs157/input/layouts/Layout.java | 22 - .../aztechs157/input/layouts/MapLayout.java | 62 --- .../input/models/LogitechAttack.java | 31 -- .../input/models/LogitechExtreme3D.java | 32 -- .../input/models/LogitechGamepadF310.java | 34 -- .../aztechs157/input/models/XboxOne.java | 34 -- org/assabet/aztechs157/input/values/Axis.java | 97 ----- .../aztechs157/input/values/Button.java | 131 ------ org/assabet/aztechs157/numbers/Deadzone.java | 40 -- org/assabet/aztechs157/numbers/Range.java | 36 -- .../aztechs157/numbers/RangeConverter.java | 26 -- pathplanner/autos/1m backward auto.auto | 25 -- .../autos/1m forward & backwards x25.auto | 169 -------- pathplanner/autos/1m forward & backwards.auto | 302 -------------- pathplanner/autos/1m forward auto.auto | 25 -- pathplanner/autos/1m right auto.auto | 25 -- pathplanner/autos/New Auto.auto | 12 +- pathplanner/navgrid.json | 2 +- pathplanner/paths/1m Back and forth.path | 103 ----- pathplanner/paths/1m backward.path | 52 --- pathplanner/paths/1m forward.path | 52 --- pathplanner/paths/1m left.path | 52 --- pathplanner/paths/1m right.path | 52 --- pathplanner/paths/Example Path.path | 30 +- pathplanner/paths/Stephen.path | 52 --- pathplanner/paths/test.path | 68 --- .../1m left.path => paths/Example Path.path | 34 +- robot/Inputs.java | 98 ----- robot/Robot.java | 5 +- robot/RobotContainer.java | 164 +++----- robot/Telemetry.java | 2 +- robot/cosmetics/BlinkInLEDs.java | 35 -- robot/cosmetics/PwmLEDs.java | 249 ----------- robot/data/LoggingSystem.java | 61 --- robot/generated/TunerConstants.java | 78 ++-- ...stem.java => CommandSwerveDrivetrain.java} | 43 +- robot/{ => subsystems}/Constants.java | 12 +- .../CommandSwerveDrivetrain.java | 43 +- .../frc/robot => subsystems}/Constants.java | 12 +- subsystems/DriveSystem.java | 293 ------------- tuner-project.json | 1 + vendordeps/PathplannerLib-2025.2.1.json | 38 ++ vendordeps/Phoenix6-frc2025-latest.json | 389 ++++++++++++++++++ 205 files changed, 995 insertions(+), 8919 deletions(-) delete mode 100644 .roboRIOTeamNumberSetter/roborioteamnumbersetter.json create mode 100644 8.11/expanded/expanded.lock rename java/frc/robot/subsystems/DriveSystem.java => CommandSwerveDrivetrain.java (89%) delete mode 100644 Inputs.java delete mode 100644 LoggingSystem.java rename main/deploy/pathplanner/autos/1m left auto.auto => New Auto.auto (58%) rename vendordeps/PathplannerLib-2025.1.1.json => PathplannerLib-2025.2.1.json (87%) rename vendordeps/Phoenix6-25.1.0.json => Phoenix6-frc2025-latest.json (99%) create mode 100644 WPILibNewCommands.json rename pathplanner/autos/1m left auto.auto => autos/New Auto.auto (58%) delete mode 100644 cosmetics/BlinkInLEDs.java delete mode 100644 cosmetics/PwmLEDs.java delete mode 100644 data/LoggingSystem.java delete mode 100644 deploy/music/BuddyHollyRiff.chrp delete mode 100644 deploy/music/MoreCowbell.chrp delete mode 100644 deploy/music/TOTTFIY.chrp delete mode 100644 deploy/music/WTTBPchrp.chrp delete mode 100644 deploy/music/YourLoveOF.chrp delete mode 100644 deploy/music/adams.chrp delete mode 100644 deploy/music/bluetoothdeviceisreadytopair.chrp delete mode 100644 deploy/music/e1m1.chrp delete mode 100644 deploy/music/entry.chrp delete mode 100644 deploy/music/exorcist.chrp delete mode 100644 deploy/music/output.chrp delete mode 100644 deploy/music/sundog.chrp delete mode 100644 deploy/music/super_mario.chrp delete mode 100644 deploy/music/tetris.chrp delete mode 100644 deploy/pathplanner/autos/1m backward auto.auto delete mode 100644 deploy/pathplanner/autos/1m forward & backwards x25.auto delete mode 100644 deploy/pathplanner/autos/1m forward & backwards.auto delete mode 100644 deploy/pathplanner/autos/1m forward auto.auto delete mode 100644 deploy/pathplanner/autos/1m left auto.auto delete mode 100644 deploy/pathplanner/autos/1m right auto.auto delete mode 100644 deploy/pathplanner/paths/1m Back and forth.path delete mode 100644 deploy/pathplanner/paths/1m backward.path delete mode 100644 deploy/pathplanner/paths/1m forward.path delete mode 100644 deploy/pathplanner/paths/1m right.path delete mode 100644 deploy/pathplanner/paths/Stephen.path delete mode 100644 deploy/pathplanner/paths/test.path delete mode 100644 java/frc/robot/Inputs.java delete mode 100644 java/frc/robot/Main.java delete mode 100644 java/frc/robot/Robot.java delete mode 100644 java/frc/robot/RobotContainer.java delete mode 100644 java/frc/robot/Telemetry.java delete mode 100644 java/frc/robot/cosmetics/BlinkInLEDs.java delete mode 100644 java/frc/robot/cosmetics/PwmLEDs.java delete mode 100644 java/frc/robot/data/LoggingSystem.java delete mode 100644 java/frc/robot/generated/TunerConstants.java delete mode 100644 java/org/assabet/aztechs157/PrintLimiter.java delete mode 100644 java/org/assabet/aztechs157/Sanity.java delete mode 100644 java/org/assabet/aztechs157/input/Model.java delete mode 100644 java/org/assabet/aztechs157/input/Pov.java delete mode 100644 java/org/assabet/aztechs157/input/layouts/DynamicLayout.java delete mode 100644 java/org/assabet/aztechs157/input/layouts/Layout.java delete mode 100644 java/org/assabet/aztechs157/input/layouts/MapLayout.java delete mode 100644 java/org/assabet/aztechs157/input/models/LogitechAttack.java delete mode 100644 java/org/assabet/aztechs157/input/models/LogitechExtreme3D.java delete mode 100644 java/org/assabet/aztechs157/input/models/LogitechGamepadF310.java delete mode 100644 java/org/assabet/aztechs157/input/models/XboxOne.java delete mode 100644 java/org/assabet/aztechs157/input/values/Axis.java delete mode 100644 java/org/assabet/aztechs157/input/values/Button.java delete mode 100644 java/org/assabet/aztechs157/numbers/Deadzone.java delete mode 100644 java/org/assabet/aztechs157/numbers/Range.java delete mode 100644 java/org/assabet/aztechs157/numbers/RangeConverter.java delete mode 100644 main/deploy/music/BuddyHollyRiff.chrp delete mode 100644 main/deploy/music/MoreCowbell.chrp delete mode 100644 main/deploy/music/TOTTFIY.chrp delete mode 100644 main/deploy/music/WTTBPchrp.chrp delete mode 100644 main/deploy/music/YourLoveOF.chrp delete mode 100644 main/deploy/music/adams.chrp delete mode 100644 main/deploy/music/bluetoothdeviceisreadytopair.chrp delete mode 100644 main/deploy/music/e1m1.chrp delete mode 100644 main/deploy/music/entry.chrp delete mode 100644 main/deploy/music/exorcist.chrp delete mode 100644 main/deploy/music/output.chrp delete mode 100644 main/deploy/music/sundog.chrp delete mode 100644 main/deploy/music/super_mario.chrp delete mode 100644 main/deploy/music/tetris.chrp delete mode 100644 main/deploy/pathplanner/autos/1m backward auto.auto delete mode 100644 main/deploy/pathplanner/autos/1m forward & backwards x25.auto delete mode 100644 main/deploy/pathplanner/autos/1m forward & backwards.auto delete mode 100644 main/deploy/pathplanner/autos/1m forward auto.auto delete mode 100644 main/deploy/pathplanner/autos/1m right auto.auto delete mode 100644 main/deploy/pathplanner/paths/1m Back and forth.path delete mode 100644 main/deploy/pathplanner/paths/1m backward.path delete mode 100644 main/deploy/pathplanner/paths/1m forward.path delete mode 100644 main/deploy/pathplanner/paths/1m left.path delete mode 100644 main/deploy/pathplanner/paths/1m right.path delete mode 100644 main/deploy/pathplanner/paths/Stephen.path delete mode 100644 main/deploy/pathplanner/paths/test.path delete mode 100644 main/java/frc/robot/Inputs.java delete mode 100644 main/java/frc/robot/cosmetics/BlinkInLEDs.java delete mode 100644 main/java/frc/robot/cosmetics/PwmLEDs.java delete mode 100644 main/java/frc/robot/data/LoggingSystem.java rename DriveSystem.java => main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java (89%) rename {java/frc/robot => main/java/frc/robot/subsystems}/Constants.java (64%) delete mode 100644 main/java/org/assabet/aztechs157/PrintLimiter.java delete mode 100644 main/java/org/assabet/aztechs157/Sanity.java delete mode 100644 main/java/org/assabet/aztechs157/input/Model.java delete mode 100644 main/java/org/assabet/aztechs157/input/Pov.java delete mode 100644 main/java/org/assabet/aztechs157/input/layouts/DynamicLayout.java delete mode 100644 main/java/org/assabet/aztechs157/input/layouts/Layout.java delete mode 100644 main/java/org/assabet/aztechs157/input/layouts/MapLayout.java delete mode 100644 main/java/org/assabet/aztechs157/input/models/LogitechAttack.java delete mode 100644 main/java/org/assabet/aztechs157/input/models/LogitechExtreme3D.java delete mode 100644 main/java/org/assabet/aztechs157/input/models/LogitechGamepadF310.java delete mode 100644 main/java/org/assabet/aztechs157/input/models/XboxOne.java delete mode 100644 main/java/org/assabet/aztechs157/input/values/Axis.java delete mode 100644 main/java/org/assabet/aztechs157/input/values/Button.java delete mode 100644 main/java/org/assabet/aztechs157/numbers/Deadzone.java delete mode 100644 main/java/org/assabet/aztechs157/numbers/Range.java delete mode 100644 main/java/org/assabet/aztechs157/numbers/RangeConverter.java delete mode 100644 music/BuddyHollyRiff.chrp delete mode 100644 music/MoreCowbell.chrp delete mode 100644 music/TOTTFIY.chrp delete mode 100644 music/WTTBPchrp.chrp delete mode 100644 music/YourLoveOF.chrp delete mode 100644 music/adams.chrp delete mode 100644 music/bluetoothdeviceisreadytopair.chrp delete mode 100644 music/e1m1.chrp delete mode 100644 music/entry.chrp delete mode 100644 music/exorcist.chrp delete mode 100644 music/output.chrp delete mode 100644 music/sundog.chrp delete mode 100644 music/super_mario.chrp delete mode 100644 music/tetris.chrp create mode 100644 navgrid.json delete mode 100644 org/assabet/aztechs157/PrintLimiter.java delete mode 100644 org/assabet/aztechs157/Sanity.java delete mode 100644 org/assabet/aztechs157/input/Model.java delete mode 100644 org/assabet/aztechs157/input/Pov.java delete mode 100644 org/assabet/aztechs157/input/layouts/DynamicLayout.java delete mode 100644 org/assabet/aztechs157/input/layouts/Layout.java delete mode 100644 org/assabet/aztechs157/input/layouts/MapLayout.java delete mode 100644 org/assabet/aztechs157/input/models/LogitechAttack.java delete mode 100644 org/assabet/aztechs157/input/models/LogitechExtreme3D.java delete mode 100644 org/assabet/aztechs157/input/models/LogitechGamepadF310.java delete mode 100644 org/assabet/aztechs157/input/models/XboxOne.java delete mode 100644 org/assabet/aztechs157/input/values/Axis.java delete mode 100644 org/assabet/aztechs157/input/values/Button.java delete mode 100644 org/assabet/aztechs157/numbers/Deadzone.java delete mode 100644 org/assabet/aztechs157/numbers/Range.java delete mode 100644 org/assabet/aztechs157/numbers/RangeConverter.java delete mode 100644 pathplanner/autos/1m backward auto.auto delete mode 100644 pathplanner/autos/1m forward & backwards x25.auto delete mode 100644 pathplanner/autos/1m forward & backwards.auto delete mode 100644 pathplanner/autos/1m forward auto.auto delete mode 100644 pathplanner/autos/1m right auto.auto delete mode 100644 pathplanner/paths/1m Back and forth.path delete mode 100644 pathplanner/paths/1m backward.path delete mode 100644 pathplanner/paths/1m forward.path delete mode 100644 pathplanner/paths/1m left.path delete mode 100644 pathplanner/paths/1m right.path delete mode 100644 pathplanner/paths/Stephen.path delete mode 100644 pathplanner/paths/test.path rename deploy/pathplanner/paths/1m left.path => paths/Example Path.path (60%) delete mode 100644 robot/Inputs.java delete mode 100644 robot/cosmetics/BlinkInLEDs.java delete mode 100644 robot/cosmetics/PwmLEDs.java delete mode 100644 robot/data/LoggingSystem.java rename robot/subsystems/{DriveSystem.java => CommandSwerveDrivetrain.java} (89%) rename robot/{ => subsystems}/Constants.java (64%) rename main/java/frc/robot/subsystems/DriveSystem.java => subsystems/CommandSwerveDrivetrain.java (89%) rename {main/java/frc/robot => subsystems}/Constants.java (64%) delete mode 100644 subsystems/DriveSystem.java create mode 100644 tuner-project.json create mode 100644 vendordeps/PathplannerLib-2025.2.1.json create mode 100644 vendordeps/Phoenix6-frc2025-latest.json diff --git a/.roboRIOTeamNumberSetter/roborioteamnumbersetter.json b/.roboRIOTeamNumberSetter/roborioteamnumbersetter.json deleted file mode 100644 index 6ae8e1b..0000000 --- a/.roboRIOTeamNumberSetter/roborioteamnumbersetter.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "TeamNumber": 157 -} diff --git a/.wpilib/wpilib_preferences.json b/.wpilib/wpilib_preferences.json index d0142f9..3769767 100644 --- a/.wpilib/wpilib_preferences.json +++ b/.wpilib/wpilib_preferences.json @@ -1,6 +1,6 @@ { - "enableCppIntellisense": false, - "currentLanguage": "java", - "projectYear": "2025", - "teamNumber": 157 + "enableCppIntellisense": false, + "currentLanguage": "java", + "projectYear": "2025", + "teamNumber": 157 } \ No newline at end of file diff --git a/8.11/checksums/checksums.lock b/8.11/checksums/checksums.lock index 89394e47b62b6953b4cbf135cec2a96d8db966c4..f8258999bd92c85fb3df1b58ce20646c75d37a91 100644 GIT binary patch literal 17 UcmZS1db5K6$=%6686aRg074K36#xJL literal 17 VcmZR+6M4t}XPw diff --git a/8.11/checksums/md5-checksums.bin b/8.11/checksums/md5-checksums.bin index 32623f2b907b11426b4728dc75d9b407ce3df0b2..500e713bb1e1088d0f00dec4ef1bf0d681d4d688 100644 GIT binary patch delta 2699 zcmYk-3p7-D90%~3hOH1vn63(I<2c2Ttb=S#dKfcf=FW>Duk;p=DkK0s6vTeVzh^czY`yILTE%Dv%cB$FI3*R88(})|A+dsB?#NR=# zqlxdGed48c_zVN?4M(2U_Ve26HL22&Ozd}%8jZggLMlCyczBSkhIsvps=NC57F>FbaLJI8>pYOXlZp0QX z&^Z&oFRZmTez2}Z9V5br-bG^bze7lTg_ zY4YJJ3C~bG7rCUBI5Y4ucd#qdXD=#*ttW*)sgudO(hI%updsQzS+`eb@GBQ1r!9%U z%<~%xO1dsW9{w-!x4d-$$Ht@%BA4$V{!dR@!6!R182qMCJ|G3Yt^Xu5DmxJmx=q|{ z5?^pA^!06vx=+a1IZ=pQ@wLf24!mEI(`1F5(TtFS#q!k_ zp6&+xuGYj7w{mdPH&}@a(E_>FV8#RX0+^N_3e5ubJb_SF<=dn)z@;$F?yH;-7I z`+(Gd_Gcu+m@cwO@9ZGtTP4XB(*e7TvMPfxn^G3u9j5?|G*DQUi}Mqj-= zc@_TtGa8eH6~1GqT`fQhbd_X5a@~c!>Dhm~A=l;-|FXvQVQk;j4&;jS#5a8Uqtqdx z_8xXe;@OSVwCYJu@JkuK%H+YXMmvLY7vmof`W`7Tlg0TCc6D|5f}Rs6$>WXnEq8tA zSnktr3({yeL9lQH99B|bNMSDscFG05GzCg&csxCoJFaHkv5@PbmG+jwj`;V4UjS&i z9iZsRf?#JauD4Rj_QnAtoafB-;@=W}F=$tMz?nr{O-i$K@CN|a(z)7k?i{`Bxv3T~ zN{it2oB=acFkPe|7N>ztM?R=kiQo)Ay3Z+Dpf|z}SgYZ+IP`!SYS;ral18xS})BT zZMztZ*TZKk>;pFO6kznQMzx?CzX6D&U=6;0Y|S+a&YqqG?nY5yJ9m79bGaV6V-tMV z6c}I~zJ`1~1un72&YoOx@n;0-p97`7(?=($`A@^D_mK8(|KDchF;)Ht`}yo7Ur%QWB= z%l4%KIZg&=Ih)RH;7P1V3==)031u+7{ou|M{<*S$wvTip`C#hf#CHWJ{vEPtrFlGl Rp{oCk9W26)e-!S#{{wChy*2;< literal 24847 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

dy;SO%5ByR&w>X09TQereLp*xnD)4o zvLi;ov4H1hFEB!tV6RwYwK^8w7fd7GQLM|^trDVY2MHR81K3fOOv-o!RcHS#hA8cfUT z-`8#xDC)131kYEZ$Pl(98si4JmG_VGv{>BsNgs)S#Rh7G7~vHt6z4VAhN;H2*z(g; zYh5zmH|A!Yips<8VtBeCI&^_DFNA139V`2^tm|=c6OQ#zOyhOuOK0{v3Po3?>2Cg?eW*hr}5oZs2HTMtE_-+^B^7;0IT)mrv zu>yIL%Fw{)0c&Ck*oG-x?#LtKWNiV%wJqWj~Aa z(+%E(L}S6Vn~K?qg&#D#qbMB~>#?&GpN}~F!xq+N7GoQx8cEumE4}31P10w*>=v7Q zAY!_~$4xY(=c~xA2=e6GRXg!{uH~F0Xe`7lu&$waCq(?Ay3djvYi-W)#XmMrH(1rM zKP-GY$~$skd{l=+U{=p8XbAm#jf}TdlfUI=253JL9@Z%i+&bOhlLf4)+%}RyMA359NIr*)4`qwp2!&2D^@jpJ?!;WFSHt5V9Va% z?Y0(6lRh7d!8kbabCIc6GY=zZ4vw&g9^Y3~d8_fAxoDXhu?iTWaJ5s*iN?r#N3S#GIu#QI%V;AO5qDvY zpRfiCgTLgvl68NP?EUmr18IBH;K*aK^8|0KdL@?~x8Lf_W81YBHVcks%)`!BeB>dI zpm78H$}|qO{HPuwnma8mC6nh<+io9Vgu}Z5t8tk1rtxxBeTdOo+1{(W0X>(5;&&RX zvAT0^*zHmE_+(CJf6?f!C(Hp&eyD0dys^H2F>oU!tl{sCZw_Rs|it8w)7*7G^#8>(?-?Ego(CIK5U zUL!OC8n=iw297P52>9~Xj`#d~L(Ejp?gK^~ynhJenK7l?CZoZgn3)+|QM)BJc>izg z(=~l1LPN}&XbhXWo|0EjUJ?3vqN(h96LzPh8;+n?Jh4PWT$MN9XNUN;4H15I@{&d+ z(+$Buq7m|9?3~o3z@w7k^?dvuesa)ofiyNeIEj{AimpDpK@A%A>6^L6qU(#JT|aHfKH@NyFSj@QZ&(8w!dMc_ zhDzb3lq(1Jihi3X<}k4KN!mt9`x0KJ+EaYhO+9D`xr^fBk`hf+xM^odlXKDI4pfN`T)0kF!T%Nb<%w|)5${hgnS$aX?{z!JgL0&=q} zC$J(|4Zoj?bb&&>Kr}wAch#KHb&HofP4QFAjyUWdOE<7*IlNKvy8=@U^G9wUpIm6{ z+O|t;Nyo7u>@yl}{BouXEU$^;Gn4Mh28OCdGj+Cr>=+nIk SuVLVufUiKTQFF14(tiM2dmr-v diff --git a/8.11/checksums/sha1-checksums.bin b/8.11/checksums/sha1-checksums.bin index 476b9d513435583de10bc7e29c82e86d51dbdc09..26d9361abc2e9004da6b110e9961ec2a1fe92ade 100644 GIT binary patch delta 2843 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 RXZ8Wfslyw{@D|C%{|845urdGu delta 3161 zcmbuCc~BE)7{+c=eA+_=d-u)WS6DV7h*6h9D}IBq$msXeu}z)uE33`O#GkdCMhkF{x`B z50orQg7Os_g-AonNm|r<>}9KoR6$Z|jK&od5|e=wD-#K6e4NFQ$a(STmxl}XyR^!T zuJYBP@R`lfsuS6Cj6?@vEZXbVr-*Eox`$)o?1+@6>?fp9y>uoenCkb%P%X@%XiUw$xbbnTv?H*zlgc|F3ez2nVNDC z@)LqOjb+m!cI>$j9=W7Ua)aq8hd`z|se4R#B9W=J#T-(a_TWYm6l_sl{SZoR zv-KGGgB6@HP!Iw?TCS(^=jif+1#6BLO`NmMz3uIdo0z*FgEyS-9#EVS%=fq}^sSh6 zJ}N)fq1Jt0?R!iU4MN7Lf8eE6Qlmmp zibCZWji9+Srbweg!y^!!4G76Vb4XK8NL&tqs&R$Xe96_wg_Hy@PK~Na{=D&7qu&gF zXfRocI4hCON@TVYaaN*n{k?9F9IO}7g4bjQKY68K*+hSz2g1|Gp>|kAoQE?T$K8>m z%tJGK(YWCrXTo>IeH(ajdF7Nh6JlZiuxMDD(YBn;ZEaW0=8;M)gR7CjC%vsra5HjL zA3!05ACm3AF%jrT7#*vusDwGEPbnNbVq55_fI7U-{;}a z!=XU~GrI{Wb~`e^XK%a5{~Ip>Rb!c`^3|}=5DxJEJ#uT2YT6~<=4Z#Y-+zmQBSQiD zm}xoJrNL{4TW5g3OR@br^dc})9*;dLhFE%BO)Va!6%b0;voFa= z9XIjSDT&l`8Ci?+%Qv7=4|(fg=b(95gg5LjjSkJwViY3D#x1|5%92`HvB>kH+Z(VT2DgBT&4nPl))fa4qorw*;3CMcdSy>TaYePrS@VwW_RnJ2I~)wF zg`*Dr&7L#}ty<3R3vn2#%q6WIpzyByx=`plUgg<2dv?>K6JQvCg42t7>3=cpH%zMz z0*9G~1tJ+GRF)px%Ws|)uZ&!y3|i;Dbb(VO>>7f=Ccb0c?wAWY@E-|;>3d9vX=qHt zRmD)~+lopvqyO?teCofqiGjM|&~&@FS!_D(DU3{m6SNdpn|2}##GETt^&R*5cBt`6H-5?7$h#QQhYx`zkvvV iSvZ_CKh=k3378qHA)3d#(mj0pY6y36GW{_Sr~C`aH`Uny diff --git a/8.11/executionHistory/executionHistory.lock b/8.11/executionHistory/executionHistory.lock index 9c3d979b5619b38e10dbc293a246b52c74aa1b6f..96fbcea3e2ad8f60bd290d0acc46001a47bfbb89 100644 GIT binary patch literal 17 UcmZSHHEX8xC$?N}1_;Op05M$z6951J literal 17 UcmZSHwXtk!&a)dE7$ATX072sgT>t<8 diff --git a/8.11/expanded/expanded.lock b/8.11/expanded/expanded.lock new file mode 100644 index 0000000000000000000000000000000000000000..fd95533e56c79b3390a92fa06b8329b3ed1e96fe GIT binary patch literal 17 TcmZR+aXGd4YMf;)0~7!NIwJ&d literal 0 HcmV?d00001 diff --git a/8.11/fileHashes/fileHashes.bin b/8.11/fileHashes/fileHashes.bin index 66416b0bb1684969a974dbfaa743d89ca7206126..1af4242ef0dd2543505376b0e715212e4e2765cb 100644 GIT binary patch literal 25547 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 literal 21697 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 E0Fz5IP5=M^ diff --git a/8.11/fileHashes/fileHashes.lock b/8.11/fileHashes/fileHashes.lock index 3228a625a172356f06ec610f77aa4772d0c70ac1..95707108e4be24263228dd59d57bc6923f75caae 100644 GIT binary patch literal 17 VcmZQR$ZGnYQ`mI{0~j#s001Se10(qhDppV z%NEwPI9dud$Pp&Kd*;;j6D8PLpyJ6e@x5+E@7mw|o(mE8YKDm)Y-o68xAYPlMBMv2 zO#F!Q93c*>XYlriNu1i0r(-146%WG&@czLed+aVG@jUX`) zc>T-8F=>@iBShT$Cq(rB|L=;-nielFh(XmahKc`5Qus0D(!X|yxYtXV_#b;iC#x`_ zOHlPkVd5fbR`t3S{wL=^Bz(1D67t)g8Ms>W?tqAUyoQOZSzS~xO$yM4huUu`0MAmW}=Vd75GotKPe&rySjdz^%e|GOM^ zSWpw{F>hT+_yc8~k2PLr*Dv*iYG{RNaIF`cx@VsGI*7RMM3{JZ;ft21T$aC~78k?B zBUv_GnDFO#B1GIL9wr{$ue7Ot$31A;@{xv#*T*uatkx~Mt_soMB@2_tuIOI)RN{6U z)M8GUcy6fJsy9`wFQFFyhKW~w|8zb`OGW@Hz8xlBJI8Z^CI1!^s5$vC@%ngKvAYV+ zvPuvMA6u9NjAme9k=&^GLwuouh@3G{kt7g<@~WUf@6Sb^T+JTuZ@%b`lREox>ts$( zllqg_c7OjhNzJst&wAlgugolo7`y0OcU0T`BJD_rMjv0eip_Vt=QG!H-c+7v@mIgLaEaI-nJK-F zaA_a|;`TtLI>lRRsk35dT@?4_?0M34$wutGIc#XI+B!*H!Gjvs~1c z#8_gg2)JfdF>BVQ@VrMaj8D%Hc!a4UEh*k~^3MAo^(I$J8|2vh@W50ecQ;GHMDo6g fsXoh+mxn8{gow1KjHg88QE{_e&+aEyi@+)X%lEUa literal 20435 zcmeI3XH-*Z8h|4Rp$<4hi-HgWDpFJwB1Hh_dX=~lkc;@;p8O$ zKp(ij9@2ju!XsD!7Jvm{0aySQfCXRySO6A)1z-VK02Y7+U;$VF7Jvm{0aySQ_KVU@);nwMZCq?P* z=-0VKM>s|Q3(q#t7$vsOBHW%1c*gEp>Fb*%pAc@h1Mp0N?7*|~xGj)1dX87T^t7|SEv$`tV1+h3gN-0RhV&PfBj@vJN|`S$^DuRf!p{cW5#I)4c8j%mIJ-9CZt2)Bv>yz8x+ zt|;f{cGOP+d^jw!#<-c|h;Z8xz^6~)NzSx6Glbg}0RDnCsa&pleF)(;^MJpsNb*(` z8NZKksx9F2L$azyFL%*UUIqBVx`io?rF{|Ml-~hg+FxOHG{Wl^I^P%Y50-^tntcZ+ z5pLB6_?l?OlGvv=XHowq;OjJ{)vNuROoZFt0sN027>Nv#wh@HeY64DB+xu=@JNE!O zrv>nx^0hs53Xa z@B`8w9fRq^(+Ia+1N_k1i4C&5V=X$z6L1|7ZCs?!_dy7!CINm}DBk}byJrsJRwn`1 zOFb?+Ja>YDa2sR54Fa_4+;(TP5N=JA-?s- z7rwk~5JB=oUk|qb1l)Avd-8jO<93K|=MA{o=D@Mvx2e^j=UoBZnf!6_R$Marf43?I z+%@QB^qhzu`o6X^1l(sL74;Gli%;QX7GqAdOa@y zKb5U5TTqryK)BTc;HO<=Sc~B?^QiwA@F4yWnSws~zl}40-`!C9F#4|GphJ@oErPqYn#W)ok==X4R_ThT z-E>0;Rti|7Y31#`p{T*e=MtUnvQ7ExSmUVrOjFh_a$&`oj^6Ps)0bF-vOgnWd1|6o zH+>*F*ZT-oo5 zH3aFVS}vaYIZnl0n_bG9B&^|R<4~qd%O`kkCn+o|wsTi(^PELEP@+SJWznoQ?vtv1%8V)-u;_?EzW<}6kqaYaXW6so#FV%h1(*K>8!{vlZ7nTmCY z*iS*u7k-WL)ql^&z#4w3RSqfpq{fAh5eNFhnXOpkLVMhC|8lxu9>X6^Bnfoob61t~6f?xHhR)L5nNMAWvqL4M zx$EY6j6HGQoTpu}66JCx2?b-dd032EPn3RAf6c=w5;%ihSSB0 z-adj2OvVJ(P$){NV6X2?EYQz*5H`}Xj5S)O;t!_Ud#GGm7?IjIdV;${hvzIe#}_oH zQLfamZ=N|;4upQ?HP%}yA3W-Rp)y^6pgXa00a{XN$3 z5YIWd`eUJ-A)&1G?np5iYmBlov&ACC*&hQlr1CW~zEX^D+pLRq$#YhnT^^2ZJtK^r zaUiC#zo#;rKb#>ET|LF-?(5*WQhdevm7Nw2;lbCG1{;#R?qZESPa?83RCHWA*jMyt zY&khtL#T)?kXTu4Rz*x+X|+t}?lR&zi^v^f@kuKoQJc5wjKJg@9IO#O=J4pr^_GVg zV}lFCCqW5VK<86tlNIv#>*lYJ0sVoGrlM{ zO{+a3ue)C=c>!xoET(hpNzHeRWOSy|&(3mpjPTq`xjysq)xzijjnMOI8e3vzu|`)x zaq~2#p8Z35kwqyhr5kIs=Em3yg?zVn{LPjkOUh#dtl_S?_O6(uE%j7Ij+~Yf=!G>j z8UpnmXtph^$s0##4!2ukjfzZ{p1Pog&fiMw6_mYYX0b-Xu^2|XN0?C58b=K8da@jA X1cwo0P5isY{KI@B<(gjOxyFA0Wi86H diff --git a/java/frc/robot/subsystems/DriveSystem.java b/CommandSwerveDrivetrain.java similarity index 89% rename from java/frc/robot/subsystems/DriveSystem.java rename to CommandSwerveDrivetrain.java index 3447342..a78ffc3 100644 --- a/java/frc/robot/subsystems/DriveSystem.java +++ b/CommandSwerveDrivetrain.java @@ -9,7 +9,6 @@ import com.ctre.phoenix6.swerve.SwerveDrivetrainConstants; import com.ctre.phoenix6.swerve.SwerveModuleConstants; import com.ctre.phoenix6.swerve.SwerveRequest; - import com.pathplanner.lib.auto.AutoBuilder; import com.pathplanner.lib.config.PIDConstants; import com.pathplanner.lib.config.RobotConfig; @@ -33,7 +32,7 @@ * Class that extends the Phoenix 6 SwerveDrivetrain class and implements * Subsystem so it can easily be used in command-based projects. */ -public class DriveSystem extends TunerSwerveDrivetrain implements Subsystem { +public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Subsystem { private static final double kSimLoopPeriod = 0.005; // 5 ms private Notifier m_simNotifier = null; private double m_lastSimTime; @@ -122,10 +121,10 @@ public class DriveSystem extends TunerSwerveDrivetrain implements Subsystem { * the devices themselves. If they need the devices, they can access them through * getters in the classes. * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param modules Constants for each specific module + * @param drivetrainConstants Drivetrain-wide constants for the swerve drive + * @param modules Constants for each specific module */ - public DriveSystem( + public CommandSwerveDrivetrain( SwerveDrivetrainConstants drivetrainConstants, SwerveModuleConstants... modules ) { @@ -143,13 +142,13 @@ public DriveSystem( * the devices themselves. If they need the devices, they can access them through * getters in the classes. * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param modules Constants for each specific module + * @param drivetrainConstants Drivetrain-wide constants for the swerve drive + * @param odometryUpdateFrequency The frequency to run the odometry loop. If + * unspecified or set to 0 Hz, this is 250 Hz on + * CAN FD, and 100 Hz on CAN 2.0. + * @param modules Constants for each specific module */ - public DriveSystem( + public CommandSwerveDrivetrain( SwerveDrivetrainConstants drivetrainConstants, double odometryUpdateFrequency, SwerveModuleConstants... modules @@ -168,19 +167,19 @@ public DriveSystem( * the devices themselves. If they need the devices, they can access them through * getters in the classes. * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param odometryStandardDeviation The standard deviation for odometry calculation + * @param drivetrainConstants Drivetrain-wide constants for the swerve drive + * @param odometryUpdateFrequency The frequency to run the odometry loop. If + * unspecified or set to 0 Hz, this is 250 Hz on + * CAN FD, and 100 Hz on CAN 2.0. + * @param odometryStandardDeviation The standard deviation for odometry calculation * in the form [x, y, theta]áµ€, with units in meters * and radians * @param visionStandardDeviation The standard deviation for vision calculation * in the form [x, y, theta]áµ€, with units in meters * and radians - * @param modules Constants for each specific module + * @param modules Constants for each specific module */ - public DriveSystem( + public CommandSwerveDrivetrain( SwerveDrivetrainConstants drivetrainConstants, double odometryUpdateFrequency, Matrix odometryStandardDeviation, @@ -191,7 +190,7 @@ public DriveSystem( if (Utils.isSimulation()) { startSimThread(); } - configureAutoBuilder(); + configureAutoBuilder(); } private void configureAutoBuilder() { @@ -209,9 +208,9 @@ private void configureAutoBuilder() { ), new PPHolonomicDriveController( // PID constants for translation - new PIDConstants(10, 0, 0), // 5, 0, 0 + new PIDConstants(10, 0, 0), // PID constants for rotation - new PIDConstants(7, 0, 0) // 5, 0, 0 + new PIDConstants(7, 0, 0) ), config, // Assume the path needs to be flipped for Red vs Blue, this is normally the case @@ -290,4 +289,4 @@ private void startSimThread() { }); m_simNotifier.startPeriodic(kSimLoopPeriod); } -} \ No newline at end of file +} diff --git a/Constants.java b/Constants.java index e452735..247eeaa 100644 --- a/Constants.java +++ b/Constants.java @@ -1,4 +1,4 @@ -package frc.robot; +package frc.robot.subsystems; public class Constants { public static class ControllerConstants { @@ -17,14 +17,4 @@ public static class LoggingConstants { public static final boolean DEFAULT_LOGGING_STATE = false; } - - public static class CosmeticConstants { - - public static final int LIGHT_ID = 9; - public static final double SOLID_YELLOW_VALUE = 0.69; - public static final double SOLID_PURPLE_VALUE = 0.91; - public static final int LIGHT_LENGTH = 76; - - } - } diff --git a/Inputs.java b/Inputs.java deleted file mode 100644 index 26d5bfa..0000000 --- a/Inputs.java +++ /dev/null @@ -1,98 +0,0 @@ -// 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; - -import org.assabet.aztechs157.input.layouts.DynamicLayout; -import org.assabet.aztechs157.input.layouts.Layout; -import org.assabet.aztechs157.input.layouts.MapLayout; -import java.util.function.DoubleSupplier; -import org.assabet.aztechs157.input.models.XboxOne; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; -import org.assabet.aztechs157.numbers.Deadzone; -import org.assabet.aztechs157.numbers.Range; - -import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard; -import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; -import frc.robot.Constants.ControllerConstants; - -/** Add your docs here. */ -public class Inputs extends DynamicLayout { - - public static final Axis.Key precisionDrive = new Axis.Key(); - - ////////////////////////////////////////////////////////// - // HERE'S AN EXAMPLE OF USING ADDING NEW BUTTONS/AXIS - ///////////////////////////////////////////////////////// - - // public static final Button.Key resetGyro = new Button.Key(); - - // public static final Button.Key driveToSpeaker = new Button.Key(); - // public static final Button.Key driveToAmp = new Button.Key(); - // public static final Button.Key autoIntake = new Button.Key(); - - // public static final Button.Key intake = new Button.Key(); - // public static final Button.Key loadNote = new Button.Key(); - // public static final Button.Key eject = new Button.Key(); - - // public static final Button.Key highShotSpinUp = new Button.Key(); - // public static final Button.Key lowShotSpinUp = new Button.Key(); - - // public static final Button.Key highShot = new Button.Key(); - // public static final Button.Key lowShot = new Button.Key(); - // public static final Button.Key pass = new Button.Key(); - - // public static final Button.Key liftHanger = new Button.Key(); - // public static final Button.Key retractHanger = new Button.Key(); - // public static final Button.Key retractHangerPin = new Button.Key(); - // public static final Button.Key extendHangerPin = new Button.Key(); - - public static Inputs createFromChooser() { - final SendableChooser chooser = new SendableChooser<>(); - chooser.setDefaultOption("xbox", doubleXBOXLayout()); - Shuffleboard.getTab("Driver").add("Layout Choose", chooser); - - return new Inputs(chooser); - } - - private Inputs(final SendableChooser chooser) { - super(chooser::getSelected); - } - - private static Layout doubleXBOXLayout() { - - final var layout = new MapLayout(); - final var driver = new XboxOne(ControllerConstants.DRIVER_CONTROLLER_PORT); - final var operator = new XboxOne(ControllerConstants.OPERATOR_CONTROLLER_PORT); - - layout.assign(precisionDrive, driver.leftTriggerHeld.map(Deadzone.forAxis(new Range(0.0, 0.05))::apply).scaledBy(0.7)); - - ////////////////////////////////////////////////////////// - // HERE'S AN EXAMPLE OF USING CONTROLER LAYOUT OPTIONS - ///////////////////////////////////////////////////////// - - // layout.assign(driveToSpeaker, operator.a); - // layout.assign(driveToAmp, operator.b); - // layout.assign(resetGyro, driver.start); - // layout.assign(autoIntake, operator.leftBumper); - - // layout.assign(intake, driver.leftBumper); - // layout.assign(loadNote, operator.x); - - // layout.assign(highShotSpinUp, operator.rightBumper); - // layout.assign(lowShotSpinUp, operator.leftBumper); - - // layout.assign(highShot, new Button(() -> driver.rightTriggerHeld.get() > 0.2)); - // layout.assign(lowShot, driver.rightBumper); - // layout.assign(pass, operator.a); - // layout.assign(eject, operator.b); - - // layout.assign(liftHanger, operator.pov.up); - // layout.assign(retractHanger, operator.pov.down); - - return layout; - } - -} diff --git a/LoggingSystem.java b/LoggingSystem.java deleted file mode 100644 index 5c21203..0000000 --- a/LoggingSystem.java +++ /dev/null @@ -1,61 +0,0 @@ -// 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.data; - -import java.util.Dictionary; -import java.util.Map; - -import com.ctre.phoenix6.SignalLogger; - -import edu.wpi.first.networktables.GenericEntry; -import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard; -import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; -import edu.wpi.first.wpilibj2.command.Subsystem; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants.LoggingConstants; -import frc.robot.subsystems.DriveSystem; - -public class LoggingSystem extends SubsystemBase { - - private Map subsystemArray; - private boolean loggingState = LoggingConstants.DEFAULT_LOGGING_STATE; - private GenericEntry loggingChooser; - - - /** Creates a new LoggingSystem. */ - public LoggingSystem(Map subsystemArray) { - loggingChooser = Shuffleboard.getTab("Logging").add("Enable Logging", false).getEntry(); - SmartDashboard.putBoolean("Logging Chooser", false); - this.subsystemArray = subsystemArray; - } - - public boolean getLoggingState() { - return loggingState; - } - - private boolean getLoggingFlag() { - // An example command will be run in autonomous - return loggingChooser.getBoolean(false); // TODO: Actually use this value -} - - @Override - public void periodic() { - // This method will be called once per scheduler run - if (getLoggingFlag() != loggingState) { - loggingState = getLoggingFlag(); - - if (loggingState) { - SignalLogger.start(); - // Log the odometry pose as a double array - } else { - SignalLogger.stop(); - } - } - if (loggingState){ - var pose = ((DriveSystem)subsystemArray.get(new String("Drive"))).getState().Pose; - var status = SignalLogger.writeDoubleArray("odometry", new double[] {pose.getX(), pose.getY(), pose.getRotation().getDegrees()}); - } - } -} diff --git a/main/deploy/pathplanner/autos/1m left auto.auto b/New Auto.auto similarity index 58% rename from main/deploy/pathplanner/autos/1m left auto.auto rename to New Auto.auto index 286b393..70b7ab2 100644 --- a/main/deploy/pathplanner/autos/1m left auto.auto +++ b/New Auto.auto @@ -1,12 +1,5 @@ { - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, + "version": "2025.0", "command": { "type": "sequential", "data": { @@ -14,12 +7,13 @@ { "type": "path", "data": { - "pathName": "1m left" + "pathName": "Example Path" } } ] } }, + "resetOdom": true, "folder": null, "choreoAuto": false } \ No newline at end of file diff --git a/vendordeps/PathplannerLib-2025.1.1.json b/PathplannerLib-2025.2.1.json similarity index 87% rename from vendordeps/PathplannerLib-2025.1.1.json rename to PathplannerLib-2025.2.1.json index 6322388..71e25f3 100644 --- a/vendordeps/PathplannerLib-2025.1.1.json +++ b/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, diff --git a/vendordeps/Phoenix6-25.1.0.json b/Phoenix6-frc2025-latest.json similarity index 99% rename from vendordeps/Phoenix6-25.1.0.json rename to Phoenix6-frc2025-latest.json index 473f6a8..7f4bd2e 100644 --- a/vendordeps/Phoenix6-25.1.0.json +++ b/Phoenix6-frc2025-latest.json @@ -1,5 +1,5 @@ { - "fileName": "Phoenix6-25.1.0.json", + "fileName": "Phoenix6-frc2025-latest.json", "name": "CTRE-Phoenix (v6)", "version": "25.1.0", "frcYear": "2025", diff --git a/Robot.java b/Robot.java index 0556048..6973bbe 100644 --- a/Robot.java +++ b/Robot.java @@ -11,10 +11,9 @@ public class Robot extends TimedRobot { private Command m_autonomousCommand; - private RobotContainer m_robotContainer; + private final RobotContainer m_robotContainer; - @Override - public void robotInit() { + public Robot() { m_robotContainer = new RobotContainer(); } diff --git a/RobotContainer.java b/RobotContainer.java index 5718dfb..0cd4e30 100644 --- a/RobotContainer.java +++ b/RobotContainer.java @@ -4,127 +4,83 @@ package frc.robot; -import java.util.HashMap; -import java.util.Map; - -import org.assabet.aztechs157.input.layouts.Layout; - -import static edu.wpi.first.units.Units.*; - -import com.ctre.phoenix6.Orchestra; +import static edu.wpi.first.units.Units.MetersPerSecond; +import static edu.wpi.first.units.Units.RadiansPerSecond; +import static edu.wpi.first.units.Units.RotationsPerSecond; import com.ctre.phoenix6.swerve.SwerveModule.DriveRequestType; import com.ctre.phoenix6.swerve.SwerveRequest; - import com.pathplanner.lib.auto.AutoBuilder; +import edu.wpi.first.math.MathUtil; import edu.wpi.first.math.geometry.Rotation2d; 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.button.CommandXboxController; -import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine.Direction; - import frc.robot.generated.TunerConstants; -import frc.robot.subsystems.DriveSystem; -import edu.wpi.first.wpilibj2.command.Subsystem; -import frc.robot.data.LoggingSystem; +import frc.robot.subsystems.CommandSwerveDrivetrain; +import frc.robot.subsystems.Constants.ControllerConstants; public class RobotContainer { - private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed - private double MaxAngularRate = RotationsPerSecond.of(0.75).in(RadiansPerSecond); // 3/4 of a rotation per second max angular velocity - private Map SystemMap = new HashMap(); - - private final CommandXboxController joystick = new CommandXboxController(0); // My joystick - public final DriveSystem drivetrain = TunerConstants.createDrivetrain(); // My drivetrain - - {SystemMap.put("Drive",drivetrain);} - private final Layout inputs = Inputs.createFromChooser(); - private final LoggingSystem loggingSystem = new LoggingSystem(SystemMap); - private final SendableChooser autoChooser; - -/* Setting up bindings for necessary control of the swerve drive platform */ -private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric() -.withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1) // Add a 10% deadband -.withDriveRequestType(DriveRequestType.OpenLoopVoltage); // Use open-loop control for drive motors -private final SwerveRequest.SwerveDriveBrake brake = new SwerveRequest.SwerveDriveBrake(); -private final SwerveRequest.PointWheelsAt point = new SwerveRequest.PointWheelsAt(); -private final SwerveRequest.RobotCentric forwardStraight = new SwerveRequest.RobotCentric() -.withDriveRequestType(DriveRequestType.OpenLoopVoltage); - - private final Telemetry logger = new Telemetry(MaxSpeed); - - // Slew Rate Limiters to limit acceleration of joystick inputs - // private final SlewRateLimiter xLimiter = new SlewRateLimiter(25); - // private final SlewRateLimiter yLimiter = new SlewRateLimiter(25); - // private final SlewRateLimiter rotLimiter = new SlewRateLimiter(1570); - - private Orchestra soundSystem = new Orchestra(); - - public RobotContainer() { - configureBindings(); - - autoChooser = AutoBuilder.buildAutoChooser("NothingAuto"); - SmartDashboard.putData("Auto Chooser", autoChooser); - for(int i = 0; i<4;i++){ - soundSystem.addInstrument(drivetrain.getModule(i).getDriveMotor(), 0); - soundSystem.addInstrument(drivetrain.getModule(i).getSteerMotor(), 1); - } - soundSystem.loadMusic("music/e1m1.chrp"); - } - - /** - * Use this to pass the autonomous command to the main {@link Robot} class. - * - * @return the command to run in autonomous - */ - public Command getAutonomousCommand() { - // An example command will be run in autonomous - return autoChooser.getSelected(); - } + private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed + private double MaxAngularRate = RotationsPerSecond.of(1).in(RadiansPerSecond); // 1 of a rotation per second max angular velocity - public double modifySpeed(final double speed) { - final var modifier = 1 - inputs.axis(Inputs.precisionDrive).get(); - return speed * modifier; -} + private final SendableChooser autoChooser; - private void configureBindings() { - // Note that X is defined as forward according to WPILib convention, - // and Y is defined as to the left according to WPILib convention. - drivetrain.setDefaultCommand( // Drivetrain will execute this command periodically - drivetrain.applyRequest(() -> drive.withVelocityX(-joystick.getLeftY() /* TODO: check inversion */ * modifySpeed(MaxSpeed)) // Drive forward with - // negative Y (forward) - .withVelocityY(-joystick.getLeftX() /* TODO: check inversion */ * modifySpeed(MaxSpeed)) // Drive left with negative X (left) - .withRotationalRate(-joystick.getRightX() /* TODO: check inversion */ * MaxAngularRate) // Drive counterclockwise with negative X (left) - )); + /* Setting up bindings for necessary control of the swerve drive platform */ + private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric() + .withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1) // Add a 10% deadband + .withDriveRequestType(DriveRequestType.OpenLoopVoltage); // Use open-loop control for drive motors + private final SwerveRequest.SwerveDriveBrake brake = new SwerveRequest.SwerveDriveBrake(); + private final SwerveRequest.PointWheelsAt point = new SwerveRequest.PointWheelsAt(); + + private final Telemetry logger = new Telemetry(MaxSpeed); + + private final CommandXboxController joystick = new CommandXboxController(0); - joystick.a().whileTrue(drivetrain.applyRequest(() -> brake)); - joystick.b().whileTrue(drivetrain.applyRequest(() -> + public final CommandSwerveDrivetrain drivetrain = TunerConstants.createDrivetrain(); + + public RobotContainer() { + configureBindings(); + + autoChooser = AutoBuilder.buildAutoChooser("New Auto"); + + SmartDashboard.putData("Auto Chooser", autoChooser); + } + + private void configureBindings() { + // Note that X is defined as forward according to WPILib convention, + // and Y is defined as to the left according to WPILib convention. + drivetrain.setDefaultCommand( + // Drivetrain will execute this command periodically + drivetrain.applyRequest(() -> + drive.withVelocityX(MathUtil.applyDeadband(-joystick.getLeftY(), ControllerConstants.LEFT_Y_DEADBAND) * MaxSpeed) // Drive forward with negative Y (forward) + .withVelocityY(MathUtil.applyDeadband(-joystick.getLeftX(), ControllerConstants.LEFT_X_DEADBAND) * MaxSpeed) // Drive left with negative X (left) + .withRotationalRate(MathUtil.applyDeadband(-joystick.getRightX(), ControllerConstants.RIGHT_X_DEADBAND) * MaxAngularRate) // Drive counterclockwise with negative X (left) + ) + ); + + joystick.a().whileTrue(drivetrain.applyRequest(() -> brake)); + joystick.b().whileTrue(drivetrain.applyRequest(() -> point.withModuleDirection(new Rotation2d(-joystick.getLeftY(), -joystick.getLeftX())) )); - joystick.pov(0).whileTrue(drivetrain.applyRequest(() -> - forwardStraight.withVelocityX(0.5).withVelocityY(0)) - ); - joystick.pov(180).whileTrue(drivetrain.applyRequest(() -> - forwardStraight.withVelocityX(-0.5).withVelocityY(0)) - ); - - // Run SysId routines when holding back/start and X/Y. - // Note that each routine should be run exactly once in a single log. - joystick.back().and(joystick.y()).whileTrue(drivetrain.sysIdDynamic(Direction.kForward)); - joystick.back().and(joystick.x()).whileTrue(drivetrain.sysIdDynamic(Direction.kReverse)); - joystick.start().and(joystick.y()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kForward)); - joystick.start().and(joystick.x()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kReverse)); - - // reset the field-centric heading on left bumper press - joystick.leftBumper().onTrue(drivetrain.runOnce(() -> drivetrain.seedFieldCentric())); - - joystick.start().onTrue(drivetrain.runOnce(()-> {soundSystem.play();})); - joystick.back().onTrue(drivetrain.runOnce(()->{soundSystem.pause();})); - joystick.y().onTrue(drivetrain.runOnce(()->{soundSystem.stop();})); - - drivetrain.registerTelemetry(logger::telemeterize); - } - + // Run SysId routines when holding back/start and X/Y. + // Note that each routine should be run exactly once in a single log. + // joystick.back().and(joystick.y()).whileTrue(drivetrain.sysIdDynamic(Direction.kForward)); + // joystick.back().and(joystick.x()).whileTrue(drivetrain.sysIdDynamic(Direction.kReverse)); + // joystick.start().and(joystick.y()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kForward)); + // joystick.start().and(joystick.x()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kReverse)); + + // reset the field-centric heading on left bumper press + joystick.start().onTrue(drivetrain.runOnce(() -> drivetrain.seedFieldCentric())); + + drivetrain.registerTelemetry(logger::telemeterize); + } + + public Command getAutonomousCommand() { + return autoChooser.getSelected(); + // return Commands.print("No autonomous command configured"); + } } diff --git a/Telemetry.java b/Telemetry.java index a2d36dd..edf1979 100644 --- a/Telemetry.java +++ b/Telemetry.java @@ -121,4 +121,4 @@ public void telemeterize(SwerveDriveState state) { SmartDashboard.putData("Module " + i, m_moduleMechanisms[i]); } } -} \ No newline at end of file +} diff --git a/TunerConstants.java b/TunerConstants.java index cbbbb05..7c55399 100644 --- a/TunerConstants.java +++ b/TunerConstants.java @@ -14,7 +14,7 @@ import edu.wpi.first.math.numbers.N3; import edu.wpi.first.units.measure.*; -import frc.robot.subsystems.DriveSystem; +import frc.robot.subsystems.CommandSwerveDrivetrain; // Generated by the Tuner X Swerve Project Generator // https://v6.docs.ctr-electronics.com/en/stable/docs/tuner/tuner-swerve/index.html @@ -24,14 +24,14 @@ public class TunerConstants { // The steer motor uses any SwerveModule.SteerRequestType control request with the // output type specified by SwerveModuleConstants.SteerMotorClosedLoopOutput private static final Slot0Configs steerGains = new Slot0Configs() - .withKP(100).withKI(0).withKD(0.5) // 100, 0, 0.5 - .withKS(0.1).withKV(1.91).withKA(0) // 0, 1.5, 0 + .withKP(100).withKI(0).withKD(0.5) + .withKS(0.1).withKV(1.59).withKA(0) .withStaticFeedforwardSign(StaticFeedforwardSignValue.UseClosedLoopSign); // When using closed-loop control, the drive motor uses the control // output type specified by SwerveModuleConstants.DriveMotorClosedLoopOutput private static final Slot0Configs driveGains = new Slot0Configs() - .withKP(0.1).withKI(0).withKD(0) // 3, 0, 0 - .withKS(0).withKV(0.124); // removed KA changed and KV from 0 + .withKP(0.1).withKI(0).withKD(0) + .withKS(0).withKV(0.124); // The closed-loop output type to use for the steer motors; // This affects the PID/FF gains for the steer motors @@ -51,7 +51,7 @@ public class TunerConstants { // The stator current at which the wheels start to slip; // This needs to be tuned to your individual robot - private static final Current kSlipCurrent = Amps.of(120.0); // 150 + private static final Current kSlipCurrent = Amps.of(120.0); // Initial configs for the drive and steer motors and the azimuth encoder; these cannot be null. // Some configs will be overwritten; check the `with*InitialConfigs()` API documentation. @@ -70,19 +70,19 @@ public class TunerConstants { // CAN bus that the devices are located on; // All swerve devices must share the same CAN bus - public static final CANBus kCANBus = new CANBus("canivore", "./logs/example.hoot"); // Default Name + public static final CANBus kCANBus = new CANBus("Default Name", "./logs/example.hoot"); // Theoretical free speed (m/s) at 12 V applied output; // This needs to be tuned to your individual robot - public static final LinearVelocity kSpeedAt12Volts = MetersPerSecond.of(4.69); // 5 + public static final LinearVelocity kSpeedAt12Volts = MetersPerSecond.of(6.21); // Every 1 rotation of the azimuth results in kCoupleRatio drive motor turns; // This may need to be tuned to your individual robot - private static final double kCoupleRatio = 3.8181818181818183; // 3.5714285714285716 + private static final double kCoupleRatio = 3; - private static final double kDriveGearRatio = 7.363636363636365; // 6.122448979591837 - private static final double kSteerGearRatio = 15.42857142857143; // 12.8 - private static final Distance kWheelRadius = Inches.of(2.167); // 1.92 + private static final double kDriveGearRatio = 5.142857142857142; + private static final double kSteerGearRatio = 12.8; + private static final Distance kWheelRadius = Inches.of(2); private static final boolean kInvertLeftSide = false; private static final boolean kInvertRightSide = true; @@ -90,11 +90,11 @@ public class TunerConstants { private static final int kPigeonId = 13; // These are only used for simulation - private static final MomentOfInertia kSteerInertia = KilogramSquareMeters.of(0.01); // 0.00001 - private static final MomentOfInertia kDriveInertia = KilogramSquareMeters.of(0.01); // 0.001 + private static final MomentOfInertia kSteerInertia = KilogramSquareMeters.of(0.01); + private static final MomentOfInertia kDriveInertia = KilogramSquareMeters.of(0.01); // Simulated voltage necessary to overcome friction - private static final Voltage kSteerFrictionVoltage = Volts.of(0.2); // 0.25 - private static final Voltage kDriveFrictionVoltage = Volts.of(0.2); // 0.25 + private static final Voltage kSteerFrictionVoltage = Volts.of(0.2); + private static final Voltage kDriveFrictionVoltage = Volts.of(0.2); public static final SwerveDrivetrainConstants DrivetrainConstants = new SwerveDrivetrainConstants() .withCANBusName(kCANBus.getName()) @@ -129,45 +129,45 @@ public class TunerConstants { private static final int kFrontLeftDriveMotorId = 11; private static final int kFrontLeftSteerMotorId = 12; private static final int kFrontLeftEncoderId = 10; - private static final Angle kFrontLeftEncoderOffset = Rotations.of(0.15234375); // -0.052734375 - private static final boolean kFrontLeftSteerMotorInverted = true; // false - private static final boolean kFrontLeftEncoderInverted = false; // new + private static final Angle kFrontLeftEncoderOffset = Rotations.of(-0.0537109375); + private static final boolean kFrontLeftSteerMotorInverted = false; + private static final boolean kFrontLeftEncoderInverted = false; - private static final Distance kFrontLeftXPos = Inches.of(10); // 9.25 - private static final Distance kFrontLeftYPos = Inches.of(10); // 9.25 + private static final Distance kFrontLeftXPos = Inches.of(9); + private static final Distance kFrontLeftYPos = Inches.of(9); // Front Right private static final int kFrontRightDriveMotorId = 2; private static final int kFrontRightSteerMotorId = 3; private static final int kFrontRightEncoderId = 1; - private static final Angle kFrontRightEncoderOffset = Rotations.of(-0.4873046875); // -0.6796875 - private static final boolean kFrontRightSteerMotorInverted = true; // false - private static final boolean kFrontRightEncoderInverted = false; // new + private static final Angle kFrontRightEncoderOffset = Rotations.of(0.328125); + private static final boolean kFrontRightSteerMotorInverted = false; + private static final boolean kFrontRightEncoderInverted = false; - private static final Distance kFrontRightXPos = Inches.of(10); // 9.25 - private static final Distance kFrontRightYPos = Inches.of(-10); // -9.25 + private static final Distance kFrontRightXPos = Inches.of(9); + private static final Distance kFrontRightYPos = Inches.of(-9); // Back Left private static final int kBackLeftDriveMotorId = 8; private static final int kBackLeftSteerMotorId = 9; private static final int kBackLeftEncoderId = 7; - private static final Angle kBackLeftEncoderOffset = Rotations.of(-0.219482421875); // -0.304931640625 - private static final boolean kBackLeftSteerMotorInverted = true; // false - private static final boolean kBackLeftEncoderInverted = false; // new + private static final Angle kBackLeftEncoderOffset = Rotations.of(-0.30224609375); + private static final boolean kBackLeftSteerMotorInverted = false; + private static final boolean kBackLeftEncoderInverted = false; - private static final Distance kBackLeftXPos = Inches.of(-10); // -9.25 - private static final Distance kBackLeftYPos = Inches.of(10); // 9.25 + private static final Distance kBackLeftXPos = Inches.of(-9); + private static final Distance kBackLeftYPos = Inches.of(9); // Back Right private static final int kBackRightDriveMotorId = 5; private static final int kBackRightSteerMotorId = 6; private static final int kBackRightEncoderId = 4; - private static final Angle kBackRightEncoderOffset = Rotations.of(0.17236328125); // -0.032470703125 - private static final boolean kBackRightSteerMotorInverted = true; // false - private static final boolean kBackRightEncoderInverted = false; // new + private static final Angle kBackRightEncoderOffset = Rotations.of(-0.031005859375); + private static final boolean kBackRightSteerMotorInverted = false; + private static final boolean kBackRightEncoderInverted = false; - private static final Distance kBackRightXPos = Inches.of(-10); // -9.25 - private static final Distance kBackRightYPos = Inches.of(-10); // -9.25 + private static final Distance kBackRightXPos = Inches.of(-9); + private static final Distance kBackRightYPos = Inches.of(-9); public static final SwerveModuleConstants FrontLeft = @@ -195,8 +195,8 @@ public class TunerConstants { * Creates a CommandSwerveDrivetrain instance. * This should only be called once in your robot program,. */ - public static DriveSystem createDrivetrain() { - return new DriveSystem( + public static CommandSwerveDrivetrain createDrivetrain() { + return new CommandSwerveDrivetrain( DrivetrainConstants, FrontLeft, FrontRight, BackLeft, BackRight ); } @@ -283,4 +283,4 @@ public TunerSwerveDrivetrain( ); } } -} \ No newline at end of file +} diff --git a/WPILibNewCommands.json b/WPILibNewCommands.json new file mode 100644 index 0000000..3718e0a --- /dev/null +++ b/WPILibNewCommands.json @@ -0,0 +1,38 @@ +{ + "fileName": "WPILibNewCommands.json", + "name": "WPILib-New-Commands", + "version": "1.0.0", + "uuid": "111e20f7-815e-48f8-9dd6-e675ce75b266", + "frcYear": "2025", + "mavenUrls": [], + "jsonUrl": "", + "javaDependencies": [ + { + "groupId": "edu.wpi.first.wpilibNewCommands", + "artifactId": "wpilibNewCommands-java", + "version": "wpilib" + } + ], + "jniDependencies": [], + "cppDependencies": [ + { + "groupId": "edu.wpi.first.wpilibNewCommands", + "artifactId": "wpilibNewCommands-cpp", + "version": "wpilib", + "libName": "wpilibNewCommands", + "headerClassifier": "headers", + "sourcesClassifier": "sources", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "linuxathena", + "linuxarm32", + "linuxarm64", + "windowsx86-64", + "windowsx86", + "linuxx86-64", + "osxuniversal" + ] + } + ] +} diff --git a/pathplanner/autos/1m left auto.auto b/autos/New Auto.auto similarity index 58% rename from pathplanner/autos/1m left auto.auto rename to autos/New Auto.auto index 286b393..70b7ab2 100644 --- a/pathplanner/autos/1m left auto.auto +++ b/autos/New Auto.auto @@ -1,12 +1,5 @@ { - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, + "version": "2025.0", "command": { "type": "sequential", "data": { @@ -14,12 +7,13 @@ { "type": "path", "data": { - "pathName": "1m left" + "pathName": "Example Path" } } ] } }, + "resetOdom": true, "folder": null, "choreoAuto": false } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 81c0f3b..9d8ae14 100644 --- a/build.gradle +++ b/build.gradle @@ -47,7 +47,7 @@ def deployArtifact = deploy.targets.roborio.artifacts.frcJava wpi.java.debugJni = false // Set this to true to enable desktop support. -def includeDesktopSupport = false +def includeDesktopSupport = true // Defining my dependencies. In this case, WPILib (+ friends), and vendor libraries. // Also defines JUnit 5. diff --git a/buildOutputCleanup/buildOutputCleanup.lock b/buildOutputCleanup/buildOutputCleanup.lock index 0e7756ee992a364c8c08f93c3656ded31ef2d710..400a03845b5639bbe92b16fb69d7eaa1896ed952 100644 GIT binary patch literal 17 UcmZRc^ZKatztk=!1_;;)06J6!3jhEB literal 17 TcmZS1*6rFD*SWud0RmJ2FZBcw diff --git a/buildOutputCleanup/cache.properties b/buildOutputCleanup/cache.properties index ee61b37..2c24b04 100644 --- a/buildOutputCleanup/cache.properties +++ b/buildOutputCleanup/cache.properties @@ -1,2 +1,2 @@ -#Tue Jan 07 19:12:58 EST 2025 +#Fri Jan 10 18:58:02 EST 2025 gradle.version=8.11 diff --git a/buildOutputCleanup/outputFiles.bin b/buildOutputCleanup/outputFiles.bin index 9045eb64e65f940b9b7ce07c13db5c3684f4ab51..b861c256ba7dd5d3e948ebd237e176aadabe19d1 100644 GIT binary patch literal 19001 zcmeI%Ur1A77{~FWL)5Y+!epsTs7%8@sL_UkhN3u^OvE(sW(=9$I1yV|T^N$(AEYKI z8oR29VQttJ7(-LRE72K=AUH%YfSpeN#-`t5L!M{|#`>0i_g{n1cA$NhBDW`cXH4cS-r$^_jYbd-}$_BiT3Tr#TO~ zXD4I@db0b!Q}=Vvu~|~1OE0z2oIdW_d6!*ft#ncE;C|g&VR~Q=U8XtJ-0Li(U!Sgj zVYeCX^`?x~8_n+~Y5%Q%{Y`ONVtilOA&cBir=@IvEg#ZK~009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZafh#gWtb9h$DV;q~_VV#A U@&g{x6aL@iqx;ukCLemwUp2>m)c^nh delta 334 zcmdlvg|T%q;|3FnNTKef&G+}6xWA173_KJ6L%~#urkE4I8*W0yC1K+GZK^GfRAw7M z#65yx;x2g> zpPtmZ2&z66CT=-vv%`+RFNC1#i(%r{Zr78lE>9DIinGJS9XM_@_lb#H@<1iDVG>S< z;-pS$Io*d^P!1Ch{BWvBP~y-QsCegORVjtZy;24Osn_dzzARpE4wZ16yj4nziSgh@ R#UJ7u4I;!gJ9@Y<0svjZnppq< diff --git a/cosmetics/BlinkInLEDs.java b/cosmetics/BlinkInLEDs.java deleted file mode 100644 index f2241f0..0000000 --- a/cosmetics/BlinkInLEDs.java +++ /dev/null @@ -1,35 +0,0 @@ -// 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.cosmetics; - -import edu.wpi.first.wpilibj.motorcontrol.Spark; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants.CosmeticConstants; - -// We are no longer using this file to run any code, it is merely left as a reference -public class BlinkInLEDs extends SubsystemBase { - public final Spark lightController = new Spark(CosmeticConstants.LIGHT_ID); - // private ShuffleboardTab tab = Shuffleboard.getTab("LED"); - // private GenericEntry lightColor = tab.add("led color", - // CosmeticConstants.SOLID_YELLOW_VALUE).getEntry(); - - /** Creates a new lights. */ - public BlinkInLEDs() { - } - - public void setYellow() { - lightController.set(CosmeticConstants.SOLID_YELLOW_VALUE); - } - - public void setPurple() { - lightController.set(CosmeticConstants.SOLID_PURPLE_VALUE); - } - - @Override - public void periodic() { - // This method will be called once per scheduler run - // lightController.set(lightColor.getDouble(CosmeticConstants.SOLID_YELLOW_VALUE)); - } -} diff --git a/cosmetics/PwmLEDs.java b/cosmetics/PwmLEDs.java deleted file mode 100644 index acb2796..0000000 --- a/cosmetics/PwmLEDs.java +++ /dev/null @@ -1,249 +0,0 @@ -// 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.cosmetics; - -import edu.wpi.first.wpilibj.AddressableLED; -import edu.wpi.first.wpilibj.AddressableLEDBuffer; -import edu.wpi.first.wpilibj.DriverStation; -import edu.wpi.first.wpilibj.Timer; -import edu.wpi.first.wpilibj.util.Color; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants.CosmeticConstants; - -public class PwmLEDs extends SubsystemBase { - private final AddressableLED lights = new AddressableLED(CosmeticConstants.LIGHT_ID); - private AddressableLEDBuffer buffer = new AddressableLEDBuffer(CosmeticConstants.LIGHT_LENGTH); - private Color color1 = Color.kBlack; - private Color color2 = Color.kBlack; - private double onLength = 0.0; - private double offLength = 0.0; - private int color1Length = 0; - private int color2Length = 0; - private double speed = 0; - private double cycleLength = 0.0; - private double duration = 0.0; - - private double mp1 = 90.0; - private double mp2 = 60.0; - private double mp3 = 30.0; - private double mp4 = 15.0; - private double mp5 = 10.0; - private double mp6 = 5.0; - private double mpTolerance = 0.5; - - private Mode lightMode = Mode.SOLID; - - public void setLightMode(Mode lightMode) { - this.lightMode = lightMode; - } - - public Color getColor1() { - return color1; - } - - public void setColor1(Color color1) { - this.color1 = color1; - } - - public Color getColor2() { - return color2; - } - - public void setColor2(Color color2) { - this.color2 = color2; - } - - public void setColor1Length(int color1Length) { - this.color1Length = color1Length; - } - - public void setColor2Length(int color2Length) { - this.color2Length = color2Length; - } - - public void setSpeed(double speed) { - this.speed = speed; - } - - public static enum Mode { - SOLID, WAVE, CLIMB, STROBE; - } - - /** Creates a new PwmLEDs. */ - public PwmLEDs() { - lights.setLength(CosmeticConstants.LIGHT_LENGTH); - lights.setData(buffer); - lights.start(); - } - - public void solid(Color color) { - for (int i = 0; i < buffer.getLength(); i++) { - buffer.setLED(i, color); - } - } - - public void setSolid(Color color) { - this.color1 = color; - this.lightMode = Mode.SOLID; - } - - public void wave(Color color1, Color color2, double cycleLength, double duration) { - double counter = (1 - ((Timer.getFPGATimestamp() % duration) / duration)) * 2.0 * Math.PI; - double counterDiffPerLed = (2.0 * Math.PI) / cycleLength; - for (int i = 0; i < buffer.getLength(); i++) { - counter += counterDiffPerLed; - if (i >= 0) { - double ratio = (Math.pow(Math.sin(counter), 0.4) + 1.0) / 2.0; - if (Double.isNaN(ratio)) { - ratio = (-Math.pow(Math.sin(counter + Math.PI), 0.4) + 1.0) / 2.0; - } - if (Double.isNaN(ratio)) { - ratio = 0.5; - } - double red = (color1.red * (1 - ratio)) + (color2.red * ratio); - double green = (color1.green * (1 - ratio)) + (color2.green * ratio); - double blue = (color1.blue * (1 - ratio)) + (color2.blue * ratio); - buffer.setLED(i, new Color(red, green, blue)); - } - } - } - - public void wave(Color color, double cycleLength, double duration) { - wave(color, Color.kBlack, cycleLength, duration); - } - - public void setWave(Color color1, Color color2, double cycleLength, double duration) { - this.color1 = color1; - this.color2 = color2; - this.cycleLength = cycleLength; - this.duration = duration; - this.lightMode = Mode.WAVE; - } - - public void climb(Color color1, Color color2, int color1Length, int color2Length, double speed) { - int counter = (int) Math.floor(Timer.getFPGATimestamp() * speed); - for (int i = 0; i < buffer.getLength(); i += color2Length + color1Length) { - for (int j = 0; j < color1Length; j++) { - buffer.setLED((i + j + counter) % buffer.getLength(), color1); - } - for (int j = color1Length; j < color1Length + color2Length; j++) { - buffer.setLED((i + j + counter) % buffer.getLength(), color2); - } - } - } - - public void climb(Color color, int colorLength, int offLength, double speed) { - climb(color, Color.kBlack, colorLength, offLength, speed); - } - - public void setClimb(Color color1, Color color2, int color1Length, int color2Length, double speed) { - this.color1 = color1; - this.color2 = color2; - this.color1Length = color1Length; - this.color2Length = color2Length; - this.speed = speed; - this.lightMode = Mode.CLIMB; - } - - public void strobe(Color color1, Color color2, double onLength, double offLength) { - boolean lightsOn = Timer.getFPGATimestamp() % onLength + offLength > onLength; - if (lightsOn) { - for (int i = 0; i < buffer.getLength(); i++) { - buffer.setLED(i, color1); - } - } else { - for (int i = 0; i < buffer.getLength(); i++) { - buffer.setLED(i, color2); - } - } - } - - public void strobe(Color color, double onLength, double offLength) { - strobe(color, Color.kBlack, onLength, offLength); - } - - public void setStrobe(Color color1, Color color2, double onLength, double offLength) { - this.color1 = color1; - this.color2 = color2; - this.onLength = onLength; - this.offLength = offLength; - this.lightMode = Mode.STROBE; - } - - public void setDefault() { - Color color1 = Color.kBlue; - Color color2 = Color.kGold; - if (DriverStation.isEStopped()) { - color1 = Color.kDarkGreen; - color2 = Color.kPowderBlue; - } - if (!DriverStation.isFMSAttached()) { - color1 = PwmLEDs.dimColor(color1, 0.25); - color2 = PwmLEDs.dimColor(color2, 0.25); - } - - setWave(color1, color2, 10, 3); - } - - public static Color dimColor(Color color, double brightness) { - return new Color(color.red * brightness, color.green * brightness, color.blue * brightness); - } - - @Override - public void periodic() { - // This method will be called once per scheduler run - - double time = Timer.getMatchTime(); - if (Math.abs(time - mp1) <= mpTolerance) { - solid(Color.kBlue); - lights.setData(buffer); - return; - } - if (Math.abs(time - mp2) <= mpTolerance) { - solid(Color.kGreen); - lights.setData(buffer); - return; - } - if (Math.abs(time - mp3) <= mpTolerance) { - solid(Color.kFirstRed); - lights.setData(buffer); - return; - } - if (time < mp4 && time > mp5 && time % 1.0 > 0.5) { - solid(dimColor(Color.kDarkGoldenrod, 0.5)); - lights.setData(buffer); - return; - } - if (time < mp5 && time > mp6 && time % 1.0 > 0.5) { - solid(dimColor(Color.kFirstBlue, 0.5)); - lights.setData(buffer); - return; - } - if (time < mp6 && time % 1.0 > 0.5) { - solid(dimColor(Color.kFirstRed, 0.5)); - lights.setData(buffer); - return; - } - - switch (lightMode) { - case SOLID: - solid(color1); - break; - case WAVE: - wave(color1, color2, cycleLength, duration); - break; - case CLIMB: - climb(color1, color2, color1Length, color2Length, speed); - break; - case STROBE: - strobe(color1, color2, onLength, offLength); - break; - default: - solid(Color.kBlack); - } - - lights.setData(buffer); - } -} diff --git a/data/LoggingSystem.java b/data/LoggingSystem.java deleted file mode 100644 index 5c21203..0000000 --- a/data/LoggingSystem.java +++ /dev/null @@ -1,61 +0,0 @@ -// 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.data; - -import java.util.Dictionary; -import java.util.Map; - -import com.ctre.phoenix6.SignalLogger; - -import edu.wpi.first.networktables.GenericEntry; -import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard; -import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; -import edu.wpi.first.wpilibj2.command.Subsystem; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants.LoggingConstants; -import frc.robot.subsystems.DriveSystem; - -public class LoggingSystem extends SubsystemBase { - - private Map subsystemArray; - private boolean loggingState = LoggingConstants.DEFAULT_LOGGING_STATE; - private GenericEntry loggingChooser; - - - /** Creates a new LoggingSystem. */ - public LoggingSystem(Map subsystemArray) { - loggingChooser = Shuffleboard.getTab("Logging").add("Enable Logging", false).getEntry(); - SmartDashboard.putBoolean("Logging Chooser", false); - this.subsystemArray = subsystemArray; - } - - public boolean getLoggingState() { - return loggingState; - } - - private boolean getLoggingFlag() { - // An example command will be run in autonomous - return loggingChooser.getBoolean(false); // TODO: Actually use this value -} - - @Override - public void periodic() { - // This method will be called once per scheduler run - if (getLoggingFlag() != loggingState) { - loggingState = getLoggingFlag(); - - if (loggingState) { - SignalLogger.start(); - // Log the odometry pose as a double array - } else { - SignalLogger.stop(); - } - } - if (loggingState){ - var pose = ((DriveSystem)subsystemArray.get(new String("Drive"))).getState().Pose; - var status = SignalLogger.writeDoubleArray("odometry", new double[] {pose.getX(), pose.getY(), pose.getRotation().getDegrees()}); - } - } -} diff --git a/deploy/music/BuddyHollyRiff.chrp b/deploy/music/BuddyHollyRiff.chrp deleted file mode 100644 index 9489fddede232cc8e27c2027e43a841f0bec01e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmZQzU|?iq;9#(0HevvQ4?w(&$p}n8U}OM`gXjxP3=B(vYC!Y>W(Ec^79%jdfEA(! fL{DI2V3-Wl3!)p?85r__Y!KZb#=v0x;s1XCZ37bT diff --git a/deploy/music/MoreCowbell.chrp b/deploy/music/MoreCowbell.chrp deleted file mode 100644 index e5baa9f296f1e287ec724a6fc3554f186ae2fd33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 zcmX|lCmg+LRpl>AQsAC zASr`b?xGA9Wl=cC+wrf{IlY~po__xaKw1P1s73A)59 zB0WXTG7m(6Q)-{NE(2Jno|!-BW0|3UO>fD<-~1hVBstXBZ04=ZX0B}J%I4h6 zY|hH&tZcUGo2|0hCYjB)kJ)UsgV`#Zt+IJ)j(IAZr?MGp2QySQLuGSQ-`teVO}m+! zb~Cq04C>7P?);9~H=IP%KSRCyhLz2*n;kRMyYE)n4An71z57;`%}^aP)Vmofo0~f3 wrgz_@vbm{aZhH3}Dw~@+=B9Vwp0c?Ovtw?`2fVu?-kCaPsCP3wpZxjx1!8}jW&i*H diff --git a/deploy/music/TOTTFIY.chrp b/deploy/music/TOTTFIY.chrp deleted file mode 100644 index 52411f120b597c1db52307317bfc8dbc78303f17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24844 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 diff --git a/deploy/music/adams.chrp b/deploy/music/adams.chrp deleted file mode 100644 index f5be11b62447405fc1d2eb266161bd54c6822b9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2332 zcmXw)dra147=|CU14%iQBuIyvtb}l+MOKWo2+Obo>%g!`B~8OHOEb;J@{mYbPRlTi zteK>99hhX1WSi62T$U3plj(9U7SrisE;pB>`|_4Q?(e$y?*4th=X>AheZGk3)h9lP znyWtk%!X;I6qxXPIi9IwGrt9orgb5nW4tM7Gh=^60&cOUE*8@*V{N7Vyoi>!;+iz4v zi$o2uVzl!x^;YN8#8!!XMsCCbiF}*5_;%-E&KT$6QHk@)yECFw;#pXGm!E}&d9HuF zcvdRwRTX>gjhI`YcgVwE?~5qvT^0MqszR^BBjY2gm1!4i?vGfn?}vXq5IX;==n(&T zFk*u;UE(K25#Pzf|0X(fLEQR~*Ws0qxP}CAyTsnY0mXiAvY7suGeg9E5_Q7NCtPQi zcvxZ`-d5r|bHx)9b;7Zwu3?;5^px`x#q$z%!Y9l8t`hO`XZ$^I>SSli#iS{Iw!c_8 z)p`tKI&o_GCl(=6|E zgZTIht_^-&=}e3UgUhdt{Eb+&#O#RB4G_h4; z9S(1F4H@DAiM?$TbGG@tw}^S)I0HK+&I=ZP>pI7aXC>C*qs^|fSnQU#oAJH=Q+Bw9 zGI8b)&cl?Qm-<1>-sN|V6bpXx_rTJ<&P)>L{NiU}{cqm$H3v1@4_!Jh@w9aDyhJk8 z28(|8_iQ<==l<||(-ECZyUt9Rl*`nISJ=bs1p9)kBOdN&4@>obM!tS<#O8E+xNWHY z-i(MtH`>ELN7$ds)_LXF!)r#_7w2n##@fRf_t-O&nZLYi?F7$TJad&9ir-c2nTcmM zG6(TzNnA*y<2w} z-*cDo9n1B9vBK+JB6pSbr62M%^!=>8vRs1XeS diff --git a/deploy/music/bluetoothdeviceisreadytopair.chrp b/deploy/music/bluetoothdeviceisreadytopair.chrp deleted file mode 100644 index 6bb6ad6466bc2d76c4a90a45460897e931341dd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2352 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 Tt?f@kIwy*8nu}uQpS=2iJlt`` diff --git a/deploy/music/entry.chrp b/deploy/music/entry.chrp deleted file mode 100644 index b3848635bc7ab6f8a612e8dc1f0498bd633bb7ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17798 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 W7`fH_NCrdaYmp4b`;UM9@BaY#oD0bS diff --git a/deploy/music/exorcist.chrp b/deploy/music/exorcist.chrp deleted file mode 100644 index b8d1d6fd8b1812a769323397c8b8bc95f9cb44c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4466 zcmXBY1yGf35QgFJpxBDt-5tm7ZY=EX#zHZ%J5dx9ySqEEu)7<(`?p2;@AYx!nakPP zec$~~U^tHB@^JiIE~mQ7?bxrKWDmb@hF&h`Up+pCk$2Qj;1Cbh1F%38#~DxEjW3AJ znjuluvk-ke9VfPj+o_K+qNyGe50RSGL$P0U)%`JN4Bcgh6PtaA!7*iFR0vt&*zV8WSf|e-b=Htlu1-T>Fo}!YMRc z1m6(rd5cR^YKLXmIF;&VoYdMsE*>S;e+&nv(OrWuZ(7af!>7c0p5gp->M`r2SG_KJ zX3!4Na6hsB1K1~{`u#9lCe_V*#6BnYF(|WUXJWN1>Zy)@iM@uAxFf6TJF#0f?Qf>b zu6laBPVBwDfs=D+b_$lysh$e>o!EPAZpfwjMr@Z`v+Xf?9@SIe1!8+%#4&j_I~Ggi zQ;+$9*q$G8Wq#FHVeaJj{(MWYOlGyv=H0EbGvHo4yy@~ep#SBd~n-Omk>oKP^Q++B{ zXs&ui{6Xx@pSY=o>YK4cOP$#fQ?}Bqd6C$emvC%r?LQ7nwo$zlej+t_Uq0jNwyK*g z+Uc&An6SNO6X7XhXP(Ak9dy@lEYwl;!uXolp623CsxQHYowa8pjNL`EaqtMSGmqkc zuBw~4yQ!WB9}_$C3C``V`aG=dt266h)E=7k#C^ohG<)^b{=G3vFV(Z+U1HCE4`=jN zJqWAz(OqT)vCr)v+~%jA?bxNSdb(oTeyXR#Ys9`g*Kv}+>So#g>Mw_1iS70c*ALMC z8?fy_&9=j2gVbZ5BeuhN95q<=(O7JV_Aid_iJkcYR|M#;mDp^kW=*eQ>WPnG#9q%6 zIApl$0a##!c5vehVrQBmBh|kUeMYHXA7hNx{xR_ov1bp(eq+?*k2%L`2Q!@5nGZ2| zoc5n>j#u3qT@!Sd2ks{J?56KT_4L4ulXO=myhZHH+c<5qW&^R(6vr7F&FxgiU&MYs zo13TdT10U>Td?Ca^>o5ifjToaUM4ns1;^MoIx}6bNc((R0f^SG~c6*CU=kQ+g`(@a8u4c_R^K@5SJWA}$ zV>ocWW(Q&31*+%6r^NPrhVw%-Yt~t)p1SC{NcCvApV*lPu+L(h>4({tsBYdPcIJHy zTB_NZSZ$els^ec``$yuA<*M(*ZY%WcX1bNCr^oBWp8W<+UZvS7Sbnv7D&TiwJ?4fr zs&B-0YqdjrOukO_6nKGH|3w_LUiGn9VuSWKKM?yoe8iO-)w2qlZ_*AeFu`Wk6XHo? z@0}U2MfIWR-m1F_;!9%B{t6duQ_o^-uw6Y3G1d;%%}`=H97g}0s`tlSyVRc>9}#s?UY2cuuq>uDY!)_)NFF6pkmnEkS5bKnDFJ>fX(ih6>v##PnL zNMfG{=Nf;1AlAPNyI)toFJ`!*dPclS?E7d=xvANySmBm>D&h}fpNF5g>9*>dvBMqh z-w{*ZRo%Qu?7MRb$KKQII4pTzJ*Dsyv7XPk`hn_Zi*W7G5)(dDJrSNF)_)p@JyLx* z7J97x3*&2I&u%V$qMjw#@Tqoagt4Eg9tV#Q`#v7U0nb%8bHC7CdGIl@XMcioU#e#w z)_$eC>R{B@s(a!-Vtbms-l*Oiv%J-wS@ABhJ@4U+cj^hks_#`dBZ$3se{kCeow*&m zd{n(Frv0Qd)8RE@XI{ripVecQ{ZIRs!>`27{D$kl=-D@5+pns(!(`udmwArZv!BON z-_tFdi~a(@iC0po+offgn9z7z#rA!_=4D(X2@Ti zxe$FKRj-dR9M`|kZA?5w?95Q?$Nz!YtUu=TaQ)lg3@289h`~`@|K9i6STm~X-stjl g{d?~`a5u4MH+`eI98Z3R*uN=qdGlv{iHOMm0a;hbV*mgE diff --git a/deploy/music/output.chrp b/deploy/music/output.chrp deleted file mode 100644 index ca4e2270820e2090d33c890531961fbc9dd06297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4704 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 diff --git a/deploy/music/super_mario.chrp b/deploy/music/super_mario.chrp deleted file mode 100644 index 16f8649535a01556ba2658c05c0f13233296288e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2374 zcmeH|ze|;I7{#CKuPie&y9FW+LKH1R4GuLl6eOY0AZU<-Tw4T}hJpwpgd%8YD2kxK zp{2p0B|<33B?zP-!KJ~$Fc1d?7s<}Y=X;?4pyggT_k6hb@V=LGUcNUXDlO3yr=qvK zw>8v)*R1rQQrq*3m54zxzABNyA2wtLKi!xa{HsI;f4)!OiC@UiwMM+wbf<>4WZzU#TX~$-9mv-;%FL9gVdZJ{~dJlbz7#RjFCOfnGPI&yjsT zE#1=RfO;fDpUV;%`n)62KYe~|O8zA8Y)-}}3ghnz<4rA@8Iiv!ye+@1J?NHQeoIv` zyF8W_bzgSr*B)fp<(ou?U2aNb*rlpH$gs=U!Q^Z5w}tVY!uU{oX7E>qH{=%%<>yc2 zD-zEh`_4!MV)i|$UDtG9_We?}X5T4^4EwfgS2FB7SGM-PT+{o)-WT@1@5SC1_P((9 zT^D=b`??n|wt>A7?2TY=1bZXc8^PWP_C}AyY&5BUVfPHXXV^W%?iqH^uzQBxGhMl7 zo;UaWQtY0|xMwo%nT&fT diff --git a/deploy/music/tetris.chrp b/deploy/music/tetris.chrp deleted file mode 100644 index 88363c33232c94aa3eab2888b80b5419b3323183..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1596 zcmXYwZA_JQ7{;%2j_)TAr&7^UJei0T3Koj^0uP>!N~lnoFJ(eyqGfQ(7c>*deCdNL z7p|Ah3177Z5RZ2;^)-<;U{qAl*Jo{be+V$N3`?>G`krWDP zk6OYh4H7@XQhBIQBSKOf-4`lT820i+!-1~DpCeL5IH|wj#lfEM*1z}((5W#4QxnA+01_fth>X%w+2?;>Hf+|(pvN<%%=(#PnOb=K;&}^8<_3tf!v1!s^@;P@&)9<$4ij;skdG3#cS!8U#8SpAk z3w4G}mj((fUo7QInP{ss48~@7|AK$;M9E)+J@?pNlDY!Fo#}J#y;u6PP^zW>pWrX} zmj4cZHp}Xy)CE7E?fG*>+y}Jns|%i*igZ_zKH!U_Iw&{EqA{b){(J( zYT*23?ys(3k4rpX370Q*e<55##=bXz`49ScEv}T7Rr!1Zn0mndB3MGk=2-wou5ds1 zA@;c3^Aq9Zhut3o$CI)99ESs|{oJuD+3zavCk{v7@Q1?KBYvL+e|*gI*U|ltdj2x} zdyV_Q!AoRXnP(3?`?#NbaV`6;_I`TcuQl#>!}DaU|1S9cQ|^EL1bcka^QYh!>)byH zKP6-HZ-=cL{oIcA?6=nYX@?(faQ`SgLB{6a26sK{{@YKp$7ekM8a%Yg{eAEN8JmAI ztbfkWeWi~7b-nk~4ELtpZ-9+ttp7Azy4C%S&r^G|=d0nmE$**?YslFAt6)`wpSx-s z_W^D9*}T#n?l0QT-qGnuQURQ>%l+aP*!xcJKOYvp=>8O#N2VkaC;|KS__6`w6{{RPcH`o9G diff --git a/deploy/pathplanner/autos/1m backward auto.auto b/deploy/pathplanner/autos/1m backward auto.auto deleted file mode 100644 index e988db7..0000000 --- a/deploy/pathplanner/autos/1m backward auto.auto +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m backward" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/deploy/pathplanner/autos/1m forward & backwards x25.auto b/deploy/pathplanner/autos/1m forward & backwards x25.auto deleted file mode 100644 index e2f253c..0000000 --- a/deploy/pathplanner/autos/1m forward & backwards x25.auto +++ /dev/null @@ -1,169 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 2.0, - "y": 7.0 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/deploy/pathplanner/autos/1m forward & backwards.auto b/deploy/pathplanner/autos/1m forward & backwards.auto deleted file mode 100644 index 79adb64..0000000 --- a/deploy/pathplanner/autos/1m forward & backwards.auto +++ /dev/null @@ -1,302 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/deploy/pathplanner/autos/1m forward auto.auto b/deploy/pathplanner/autos/1m forward auto.auto deleted file mode 100644 index de1be04..0000000 --- a/deploy/pathplanner/autos/1m forward auto.auto +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m forward" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/deploy/pathplanner/autos/1m left auto.auto b/deploy/pathplanner/autos/1m left auto.auto deleted file mode 100644 index 286b393..0000000 --- a/deploy/pathplanner/autos/1m left auto.auto +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m left" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/deploy/pathplanner/autos/1m right auto.auto b/deploy/pathplanner/autos/1m right auto.auto deleted file mode 100644 index 69e6f18..0000000 --- a/deploy/pathplanner/autos/1m right auto.auto +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m right" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/deploy/pathplanner/autos/New Auto.auto b/deploy/pathplanner/autos/New Auto.auto index 9e7a7f3..70b7ab2 100644 --- a/deploy/pathplanner/autos/New Auto.auto +++ b/deploy/pathplanner/autos/New Auto.auto @@ -1,12 +1,5 @@ { - "version": 1.0, - "startingPose": { - "position": { - "x": 2.0, - "y": 7.0 - }, - "rotation": 0 - }, + "version": "2025.0", "command": { "type": "sequential", "data": { @@ -14,12 +7,13 @@ { "type": "path", "data": { - "pathName": "test" + "pathName": "Example Path" } } ] } }, + "resetOdom": true, "folder": null, "choreoAuto": false } \ No newline at end of file diff --git a/deploy/pathplanner/navgrid.json b/deploy/pathplanner/navgrid.json index bab0da9..23e0db9 100644 --- a/deploy/pathplanner/navgrid.json +++ b/deploy/pathplanner/navgrid.json @@ -1 +1 @@ -{"field_size":{"x":16.54,"y":8.21},"nodeSizeMeters":0.3,"grid":[[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true]]} \ No newline at end of file +{"field_size":{"x":17.548,"y":8.052},"nodeSizeMeters":0.3,"grid":[[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true]]} \ No newline at end of file diff --git a/deploy/pathplanner/paths/1m Back and forth.path b/deploy/pathplanner/paths/1m Back and forth.path deleted file mode 100644 index add093c..0000000 --- a/deploy/pathplanner/paths/1m Back and forth.path +++ /dev/null @@ -1,103 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 2.0, - "y": 7.0 - }, - "prevControl": null, - "nextControl": { - "x": 2.1, - "y": 7.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 3.0, - "y": 7.0 - }, - "prevControl": { - "x": 2.9, - "y": 7.0 - }, - "nextControl": { - "x": 3.1, - "y": 7.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 2.0, - "y": 7.0 - }, - "prevControl": { - "x": 1.9, - "y": 7.0 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [ - { - "name": "Wait", - "waypointRelativePos": 1.0, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "wait", - "data": { - "waitTime": 0.5 - } - } - ] - } - } - }, - { - "name": "Wait 2", - "waypointRelativePos": 0, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "wait", - "data": { - "waitTime": 0.5 - } - } - ] - } - } - } - ], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/deploy/pathplanner/paths/1m backward.path b/deploy/pathplanner/paths/1m backward.path deleted file mode 100644 index fa735aa..0000000 --- a/deploy/pathplanner/paths/1m backward.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 2.0, - "y": 5.59 - }, - "prevControl": null, - "nextControl": { - "x": 2.1, - "y": 5.59 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 1.0, - "y": 5.59 - }, - "prevControl": { - "x": 1.1, - "y": 5.59 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/deploy/pathplanner/paths/1m forward.path b/deploy/pathplanner/paths/1m forward.path deleted file mode 100644 index 544f728..0000000 --- a/deploy/pathplanner/paths/1m forward.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 1.0, - "y": 5.589805823486292 - }, - "prevControl": null, - "nextControl": { - "x": 1.9999999999999967, - "y": 5.589805823486292 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 2.0, - "y": 5.589805823486292 - }, - "prevControl": { - "x": 1.0, - "y": 5.589805823486292 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/deploy/pathplanner/paths/1m right.path b/deploy/pathplanner/paths/1m right.path deleted file mode 100644 index 88a7b65..0000000 --- a/deploy/pathplanner/paths/1m right.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 1.0, - "y": 5.59 - }, - "prevControl": null, - "nextControl": { - "x": 1.0, - "y": 5.49 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 1.0, - "y": 4.59 - }, - "prevControl": { - "x": 1.0, - "y": 4.54 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/deploy/pathplanner/paths/Example Path.path b/deploy/pathplanner/paths/Example Path.path index f745d1b..7b84c0a 100644 --- a/deploy/pathplanner/paths/Example Path.path +++ b/deploy/pathplanner/paths/Example Path.path @@ -1,26 +1,26 @@ { - "version": 1.0, + "version": "2025.0", "waypoints": [ { "anchor": { - "x": 2.0, - "y": 7.0 + "x": 4.0, + "y": 6.0 }, "prevControl": null, "nextControl": { - "x": 3.0, - "y": 7.0 + "x": 5.0, + "y": 6.0 }, "isLocked": false, "linkedName": null }, { "anchor": { - "x": 4.0, + "x": 5.0, "y": 6.0 }, "prevControl": { - "x": 3.0, + "x": 4.0, "y": 6.0 }, "nextControl": null, @@ -30,23 +30,25 @@ ], "rotationTargets": [], "constraintZones": [], + "pointTowardsZones": [], "eventMarkers": [], "globalConstraints": { - "maxVelocity": 5.0292, + "maxVelocity": 3.0, "maxAcceleration": 3.0, "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 + "maxAngularAcceleration": 720.0, + "nominalVoltage": 12.0, + "unlimited": false }, "goalEndState": { "velocity": 0, - "rotation": 0, - "rotateFast": false + "rotation": 0.0 }, "reversed": false, "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 + "idealStartingState": { + "velocity": 0, + "rotation": 0.0 }, "useDefaultConstraints": true } \ No newline at end of file diff --git a/deploy/pathplanner/paths/Stephen.path b/deploy/pathplanner/paths/Stephen.path deleted file mode 100644 index 9126da3..0000000 --- a/deploy/pathplanner/paths/Stephen.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 2.0, - "y": 7.0 - }, - "prevControl": null, - "nextControl": { - "x": 3.0, - "y": 7.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 7.439971575099845, - "y": 5.028486410249174 - }, - "prevControl": { - "x": 7.182700177366168, - "y": 6.2563726267053665 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": -33.02386755579669, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/deploy/pathplanner/paths/test.path b/deploy/pathplanner/paths/test.path deleted file mode 100644 index 16dc425..0000000 --- a/deploy/pathplanner/paths/test.path +++ /dev/null @@ -1,68 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 2.0, - "y": 7.0 - }, - "prevControl": null, - "nextControl": { - "x": 3.0, - "y": 7.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 6.200391204201211, - "y": 6.572114796651245 - }, - "prevControl": { - "x": 5.200391204201211, - "y": 6.572114796651245 - }, - "nextControl": { - "x": 7.200391204201211, - "y": 6.572114796651245 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 7.486748192869604, - "y": 4.654273468091096 - }, - "prevControl": { - "x": 7.694394331808605, - "y": 5.256522421876753 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/file-system.probe b/file-system.probe index 9d8bc6c212cb90b98e733e27eb8af9574b3451ac..b226731d5a173669dcbe766f3ee939c0b7c9b69c 100644 GIT binary patch literal 8 PcmZQzV4M=P-2WK>2eSgi literal 8 PcmZQzV4UKSJBbAV27v+L diff --git a/generated/TunerConstants.java b/generated/TunerConstants.java index cbbbb05..7c55399 100644 --- a/generated/TunerConstants.java +++ b/generated/TunerConstants.java @@ -14,7 +14,7 @@ import edu.wpi.first.math.numbers.N3; import edu.wpi.first.units.measure.*; -import frc.robot.subsystems.DriveSystem; +import frc.robot.subsystems.CommandSwerveDrivetrain; // Generated by the Tuner X Swerve Project Generator // https://v6.docs.ctr-electronics.com/en/stable/docs/tuner/tuner-swerve/index.html @@ -24,14 +24,14 @@ public class TunerConstants { // The steer motor uses any SwerveModule.SteerRequestType control request with the // output type specified by SwerveModuleConstants.SteerMotorClosedLoopOutput private static final Slot0Configs steerGains = new Slot0Configs() - .withKP(100).withKI(0).withKD(0.5) // 100, 0, 0.5 - .withKS(0.1).withKV(1.91).withKA(0) // 0, 1.5, 0 + .withKP(100).withKI(0).withKD(0.5) + .withKS(0.1).withKV(1.59).withKA(0) .withStaticFeedforwardSign(StaticFeedforwardSignValue.UseClosedLoopSign); // When using closed-loop control, the drive motor uses the control // output type specified by SwerveModuleConstants.DriveMotorClosedLoopOutput private static final Slot0Configs driveGains = new Slot0Configs() - .withKP(0.1).withKI(0).withKD(0) // 3, 0, 0 - .withKS(0).withKV(0.124); // removed KA changed and KV from 0 + .withKP(0.1).withKI(0).withKD(0) + .withKS(0).withKV(0.124); // The closed-loop output type to use for the steer motors; // This affects the PID/FF gains for the steer motors @@ -51,7 +51,7 @@ public class TunerConstants { // The stator current at which the wheels start to slip; // This needs to be tuned to your individual robot - private static final Current kSlipCurrent = Amps.of(120.0); // 150 + private static final Current kSlipCurrent = Amps.of(120.0); // Initial configs for the drive and steer motors and the azimuth encoder; these cannot be null. // Some configs will be overwritten; check the `with*InitialConfigs()` API documentation. @@ -70,19 +70,19 @@ public class TunerConstants { // CAN bus that the devices are located on; // All swerve devices must share the same CAN bus - public static final CANBus kCANBus = new CANBus("canivore", "./logs/example.hoot"); // Default Name + public static final CANBus kCANBus = new CANBus("Default Name", "./logs/example.hoot"); // Theoretical free speed (m/s) at 12 V applied output; // This needs to be tuned to your individual robot - public static final LinearVelocity kSpeedAt12Volts = MetersPerSecond.of(4.69); // 5 + public static final LinearVelocity kSpeedAt12Volts = MetersPerSecond.of(6.21); // Every 1 rotation of the azimuth results in kCoupleRatio drive motor turns; // This may need to be tuned to your individual robot - private static final double kCoupleRatio = 3.8181818181818183; // 3.5714285714285716 + private static final double kCoupleRatio = 3; - private static final double kDriveGearRatio = 7.363636363636365; // 6.122448979591837 - private static final double kSteerGearRatio = 15.42857142857143; // 12.8 - private static final Distance kWheelRadius = Inches.of(2.167); // 1.92 + private static final double kDriveGearRatio = 5.142857142857142; + private static final double kSteerGearRatio = 12.8; + private static final Distance kWheelRadius = Inches.of(2); private static final boolean kInvertLeftSide = false; private static final boolean kInvertRightSide = true; @@ -90,11 +90,11 @@ public class TunerConstants { private static final int kPigeonId = 13; // These are only used for simulation - private static final MomentOfInertia kSteerInertia = KilogramSquareMeters.of(0.01); // 0.00001 - private static final MomentOfInertia kDriveInertia = KilogramSquareMeters.of(0.01); // 0.001 + private static final MomentOfInertia kSteerInertia = KilogramSquareMeters.of(0.01); + private static final MomentOfInertia kDriveInertia = KilogramSquareMeters.of(0.01); // Simulated voltage necessary to overcome friction - private static final Voltage kSteerFrictionVoltage = Volts.of(0.2); // 0.25 - private static final Voltage kDriveFrictionVoltage = Volts.of(0.2); // 0.25 + private static final Voltage kSteerFrictionVoltage = Volts.of(0.2); + private static final Voltage kDriveFrictionVoltage = Volts.of(0.2); public static final SwerveDrivetrainConstants DrivetrainConstants = new SwerveDrivetrainConstants() .withCANBusName(kCANBus.getName()) @@ -129,45 +129,45 @@ public class TunerConstants { private static final int kFrontLeftDriveMotorId = 11; private static final int kFrontLeftSteerMotorId = 12; private static final int kFrontLeftEncoderId = 10; - private static final Angle kFrontLeftEncoderOffset = Rotations.of(0.15234375); // -0.052734375 - private static final boolean kFrontLeftSteerMotorInverted = true; // false - private static final boolean kFrontLeftEncoderInverted = false; // new + private static final Angle kFrontLeftEncoderOffset = Rotations.of(-0.0537109375); + private static final boolean kFrontLeftSteerMotorInverted = false; + private static final boolean kFrontLeftEncoderInverted = false; - private static final Distance kFrontLeftXPos = Inches.of(10); // 9.25 - private static final Distance kFrontLeftYPos = Inches.of(10); // 9.25 + private static final Distance kFrontLeftXPos = Inches.of(9); + private static final Distance kFrontLeftYPos = Inches.of(9); // Front Right private static final int kFrontRightDriveMotorId = 2; private static final int kFrontRightSteerMotorId = 3; private static final int kFrontRightEncoderId = 1; - private static final Angle kFrontRightEncoderOffset = Rotations.of(-0.4873046875); // -0.6796875 - private static final boolean kFrontRightSteerMotorInverted = true; // false - private static final boolean kFrontRightEncoderInverted = false; // new + private static final Angle kFrontRightEncoderOffset = Rotations.of(0.328125); + private static final boolean kFrontRightSteerMotorInverted = false; + private static final boolean kFrontRightEncoderInverted = false; - private static final Distance kFrontRightXPos = Inches.of(10); // 9.25 - private static final Distance kFrontRightYPos = Inches.of(-10); // -9.25 + private static final Distance kFrontRightXPos = Inches.of(9); + private static final Distance kFrontRightYPos = Inches.of(-9); // Back Left private static final int kBackLeftDriveMotorId = 8; private static final int kBackLeftSteerMotorId = 9; private static final int kBackLeftEncoderId = 7; - private static final Angle kBackLeftEncoderOffset = Rotations.of(-0.219482421875); // -0.304931640625 - private static final boolean kBackLeftSteerMotorInverted = true; // false - private static final boolean kBackLeftEncoderInverted = false; // new + private static final Angle kBackLeftEncoderOffset = Rotations.of(-0.30224609375); + private static final boolean kBackLeftSteerMotorInverted = false; + private static final boolean kBackLeftEncoderInverted = false; - private static final Distance kBackLeftXPos = Inches.of(-10); // -9.25 - private static final Distance kBackLeftYPos = Inches.of(10); // 9.25 + private static final Distance kBackLeftXPos = Inches.of(-9); + private static final Distance kBackLeftYPos = Inches.of(9); // Back Right private static final int kBackRightDriveMotorId = 5; private static final int kBackRightSteerMotorId = 6; private static final int kBackRightEncoderId = 4; - private static final Angle kBackRightEncoderOffset = Rotations.of(0.17236328125); // -0.032470703125 - private static final boolean kBackRightSteerMotorInverted = true; // false - private static final boolean kBackRightEncoderInverted = false; // new + private static final Angle kBackRightEncoderOffset = Rotations.of(-0.031005859375); + private static final boolean kBackRightSteerMotorInverted = false; + private static final boolean kBackRightEncoderInverted = false; - private static final Distance kBackRightXPos = Inches.of(-10); // -9.25 - private static final Distance kBackRightYPos = Inches.of(-10); // -9.25 + private static final Distance kBackRightXPos = Inches.of(-9); + private static final Distance kBackRightYPos = Inches.of(-9); public static final SwerveModuleConstants FrontLeft = @@ -195,8 +195,8 @@ public class TunerConstants { * Creates a CommandSwerveDrivetrain instance. * This should only be called once in your robot program,. */ - public static DriveSystem createDrivetrain() { - return new DriveSystem( + public static CommandSwerveDrivetrain createDrivetrain() { + return new CommandSwerveDrivetrain( DrivetrainConstants, FrontLeft, FrontRight, BackLeft, BackRight ); } @@ -283,4 +283,4 @@ public TunerSwerveDrivetrain( ); } } -} \ No newline at end of file +} diff --git a/java/frc/robot/Inputs.java b/java/frc/robot/Inputs.java deleted file mode 100644 index 26d5bfa..0000000 --- a/java/frc/robot/Inputs.java +++ /dev/null @@ -1,98 +0,0 @@ -// 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; - -import org.assabet.aztechs157.input.layouts.DynamicLayout; -import org.assabet.aztechs157.input.layouts.Layout; -import org.assabet.aztechs157.input.layouts.MapLayout; -import java.util.function.DoubleSupplier; -import org.assabet.aztechs157.input.models.XboxOne; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; -import org.assabet.aztechs157.numbers.Deadzone; -import org.assabet.aztechs157.numbers.Range; - -import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard; -import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; -import frc.robot.Constants.ControllerConstants; - -/** Add your docs here. */ -public class Inputs extends DynamicLayout { - - public static final Axis.Key precisionDrive = new Axis.Key(); - - ////////////////////////////////////////////////////////// - // HERE'S AN EXAMPLE OF USING ADDING NEW BUTTONS/AXIS - ///////////////////////////////////////////////////////// - - // public static final Button.Key resetGyro = new Button.Key(); - - // public static final Button.Key driveToSpeaker = new Button.Key(); - // public static final Button.Key driveToAmp = new Button.Key(); - // public static final Button.Key autoIntake = new Button.Key(); - - // public static final Button.Key intake = new Button.Key(); - // public static final Button.Key loadNote = new Button.Key(); - // public static final Button.Key eject = new Button.Key(); - - // public static final Button.Key highShotSpinUp = new Button.Key(); - // public static final Button.Key lowShotSpinUp = new Button.Key(); - - // public static final Button.Key highShot = new Button.Key(); - // public static final Button.Key lowShot = new Button.Key(); - // public static final Button.Key pass = new Button.Key(); - - // public static final Button.Key liftHanger = new Button.Key(); - // public static final Button.Key retractHanger = new Button.Key(); - // public static final Button.Key retractHangerPin = new Button.Key(); - // public static final Button.Key extendHangerPin = new Button.Key(); - - public static Inputs createFromChooser() { - final SendableChooser chooser = new SendableChooser<>(); - chooser.setDefaultOption("xbox", doubleXBOXLayout()); - Shuffleboard.getTab("Driver").add("Layout Choose", chooser); - - return new Inputs(chooser); - } - - private Inputs(final SendableChooser chooser) { - super(chooser::getSelected); - } - - private static Layout doubleXBOXLayout() { - - final var layout = new MapLayout(); - final var driver = new XboxOne(ControllerConstants.DRIVER_CONTROLLER_PORT); - final var operator = new XboxOne(ControllerConstants.OPERATOR_CONTROLLER_PORT); - - layout.assign(precisionDrive, driver.leftTriggerHeld.map(Deadzone.forAxis(new Range(0.0, 0.05))::apply).scaledBy(0.7)); - - ////////////////////////////////////////////////////////// - // HERE'S AN EXAMPLE OF USING CONTROLER LAYOUT OPTIONS - ///////////////////////////////////////////////////////// - - // layout.assign(driveToSpeaker, operator.a); - // layout.assign(driveToAmp, operator.b); - // layout.assign(resetGyro, driver.start); - // layout.assign(autoIntake, operator.leftBumper); - - // layout.assign(intake, driver.leftBumper); - // layout.assign(loadNote, operator.x); - - // layout.assign(highShotSpinUp, operator.rightBumper); - // layout.assign(lowShotSpinUp, operator.leftBumper); - - // layout.assign(highShot, new Button(() -> driver.rightTriggerHeld.get() > 0.2)); - // layout.assign(lowShot, driver.rightBumper); - // layout.assign(pass, operator.a); - // layout.assign(eject, operator.b); - - // layout.assign(liftHanger, operator.pov.up); - // layout.assign(retractHanger, operator.pov.down); - - return layout; - } - -} diff --git a/java/frc/robot/Main.java b/java/frc/robot/Main.java deleted file mode 100644 index fe215d7..0000000 --- a/java/frc/robot/Main.java +++ /dev/null @@ -1,15 +0,0 @@ -// 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; - -import edu.wpi.first.wpilibj.RobotBase; - -public final class Main { - private Main() {} - - public static void main(String... args) { - RobotBase.startRobot(Robot::new); - } -} diff --git a/java/frc/robot/Robot.java b/java/frc/robot/Robot.java deleted file mode 100644 index 0556048..0000000 --- a/java/frc/robot/Robot.java +++ /dev/null @@ -1,76 +0,0 @@ -// 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; - -import edu.wpi.first.wpilibj.TimedRobot; -import edu.wpi.first.wpilibj2.command.Command; -import edu.wpi.first.wpilibj2.command.CommandScheduler; - -public class Robot extends TimedRobot { - private Command m_autonomousCommand; - - private RobotContainer m_robotContainer; - - @Override - public void robotInit() { - m_robotContainer = new RobotContainer(); - } - - @Override - public void robotPeriodic() { - CommandScheduler.getInstance().run(); - } - - @Override - public void disabledInit() {} - - @Override - public void disabledPeriodic() {} - - @Override - public void disabledExit() {} - - @Override - public void autonomousInit() { - m_autonomousCommand = m_robotContainer.getAutonomousCommand(); - - if (m_autonomousCommand != null) { - m_autonomousCommand.schedule(); - } - } - - @Override - public void autonomousPeriodic() {} - - @Override - public void autonomousExit() {} - - @Override - public void teleopInit() { - if (m_autonomousCommand != null) { - m_autonomousCommand.cancel(); - } - } - - @Override - public void teleopPeriodic() {} - - @Override - public void teleopExit() {} - - @Override - public void testInit() { - CommandScheduler.getInstance().cancelAll(); - } - - @Override - public void testPeriodic() {} - - @Override - public void testExit() {} - - @Override - public void simulationPeriodic() {} -} diff --git a/java/frc/robot/RobotContainer.java b/java/frc/robot/RobotContainer.java deleted file mode 100644 index 5718dfb..0000000 --- a/java/frc/robot/RobotContainer.java +++ /dev/null @@ -1,130 +0,0 @@ -// 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; - -import java.util.HashMap; -import java.util.Map; - -import org.assabet.aztechs157.input.layouts.Layout; - -import static edu.wpi.first.units.Units.*; - -import com.ctre.phoenix6.Orchestra; - -import com.ctre.phoenix6.swerve.SwerveModule.DriveRequestType; -import com.ctre.phoenix6.swerve.SwerveRequest; - -import com.pathplanner.lib.auto.AutoBuilder; - -import edu.wpi.first.math.geometry.Rotation2d; -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.button.CommandXboxController; -import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine.Direction; - -import frc.robot.generated.TunerConstants; -import frc.robot.subsystems.DriveSystem; -import edu.wpi.first.wpilibj2.command.Subsystem; -import frc.robot.data.LoggingSystem; - -public class RobotContainer { - private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed - private double MaxAngularRate = RotationsPerSecond.of(0.75).in(RadiansPerSecond); // 3/4 of a rotation per second max angular velocity - private Map SystemMap = new HashMap(); - - private final CommandXboxController joystick = new CommandXboxController(0); // My joystick - public final DriveSystem drivetrain = TunerConstants.createDrivetrain(); // My drivetrain - - {SystemMap.put("Drive",drivetrain);} - private final Layout inputs = Inputs.createFromChooser(); - private final LoggingSystem loggingSystem = new LoggingSystem(SystemMap); - private final SendableChooser autoChooser; - -/* Setting up bindings for necessary control of the swerve drive platform */ -private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric() -.withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1) // Add a 10% deadband -.withDriveRequestType(DriveRequestType.OpenLoopVoltage); // Use open-loop control for drive motors -private final SwerveRequest.SwerveDriveBrake brake = new SwerveRequest.SwerveDriveBrake(); -private final SwerveRequest.PointWheelsAt point = new SwerveRequest.PointWheelsAt(); -private final SwerveRequest.RobotCentric forwardStraight = new SwerveRequest.RobotCentric() -.withDriveRequestType(DriveRequestType.OpenLoopVoltage); - - private final Telemetry logger = new Telemetry(MaxSpeed); - - // Slew Rate Limiters to limit acceleration of joystick inputs - // private final SlewRateLimiter xLimiter = new SlewRateLimiter(25); - // private final SlewRateLimiter yLimiter = new SlewRateLimiter(25); - // private final SlewRateLimiter rotLimiter = new SlewRateLimiter(1570); - - private Orchestra soundSystem = new Orchestra(); - - public RobotContainer() { - configureBindings(); - - autoChooser = AutoBuilder.buildAutoChooser("NothingAuto"); - SmartDashboard.putData("Auto Chooser", autoChooser); - for(int i = 0; i<4;i++){ - soundSystem.addInstrument(drivetrain.getModule(i).getDriveMotor(), 0); - soundSystem.addInstrument(drivetrain.getModule(i).getSteerMotor(), 1); - } - soundSystem.loadMusic("music/e1m1.chrp"); - } - - /** - * Use this to pass the autonomous command to the main {@link Robot} class. - * - * @return the command to run in autonomous - */ - public Command getAutonomousCommand() { - // An example command will be run in autonomous - return autoChooser.getSelected(); - } - - public double modifySpeed(final double speed) { - final var modifier = 1 - inputs.axis(Inputs.precisionDrive).get(); - return speed * modifier; -} - - private void configureBindings() { - // Note that X is defined as forward according to WPILib convention, - // and Y is defined as to the left according to WPILib convention. - drivetrain.setDefaultCommand( // Drivetrain will execute this command periodically - drivetrain.applyRequest(() -> drive.withVelocityX(-joystick.getLeftY() /* TODO: check inversion */ * modifySpeed(MaxSpeed)) // Drive forward with - // negative Y (forward) - .withVelocityY(-joystick.getLeftX() /* TODO: check inversion */ * modifySpeed(MaxSpeed)) // Drive left with negative X (left) - .withRotationalRate(-joystick.getRightX() /* TODO: check inversion */ * MaxAngularRate) // Drive counterclockwise with negative X (left) - )); - - joystick.a().whileTrue(drivetrain.applyRequest(() -> brake)); - joystick.b().whileTrue(drivetrain.applyRequest(() -> - point.withModuleDirection(new Rotation2d(-joystick.getLeftY(), -joystick.getLeftX())) - )); - - joystick.pov(0).whileTrue(drivetrain.applyRequest(() -> - forwardStraight.withVelocityX(0.5).withVelocityY(0)) - ); - joystick.pov(180).whileTrue(drivetrain.applyRequest(() -> - forwardStraight.withVelocityX(-0.5).withVelocityY(0)) - ); - - // Run SysId routines when holding back/start and X/Y. - // Note that each routine should be run exactly once in a single log. - joystick.back().and(joystick.y()).whileTrue(drivetrain.sysIdDynamic(Direction.kForward)); - joystick.back().and(joystick.x()).whileTrue(drivetrain.sysIdDynamic(Direction.kReverse)); - joystick.start().and(joystick.y()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kForward)); - joystick.start().and(joystick.x()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kReverse)); - - // reset the field-centric heading on left bumper press - joystick.leftBumper().onTrue(drivetrain.runOnce(() -> drivetrain.seedFieldCentric())); - - joystick.start().onTrue(drivetrain.runOnce(()-> {soundSystem.play();})); - joystick.back().onTrue(drivetrain.runOnce(()->{soundSystem.pause();})); - joystick.y().onTrue(drivetrain.runOnce(()->{soundSystem.stop();})); - - drivetrain.registerTelemetry(logger::telemeterize); - } - -} diff --git a/java/frc/robot/Telemetry.java b/java/frc/robot/Telemetry.java deleted file mode 100644 index a2d36dd..0000000 --- a/java/frc/robot/Telemetry.java +++ /dev/null @@ -1,124 +0,0 @@ -package frc.robot; - -import com.ctre.phoenix6.SignalLogger; -import com.ctre.phoenix6.swerve.SwerveDrivetrain.SwerveDriveState; - -import edu.wpi.first.math.geometry.Pose2d; -import edu.wpi.first.math.kinematics.ChassisSpeeds; -import edu.wpi.first.math.kinematics.SwerveModulePosition; -import edu.wpi.first.math.kinematics.SwerveModuleState; -import edu.wpi.first.networktables.DoubleArrayPublisher; -import edu.wpi.first.networktables.DoublePublisher; -import edu.wpi.first.networktables.NetworkTable; -import edu.wpi.first.networktables.NetworkTableInstance; -import edu.wpi.first.networktables.StringPublisher; -import edu.wpi.first.networktables.StructArrayPublisher; -import edu.wpi.first.networktables.StructPublisher; -import edu.wpi.first.wpilibj.smartdashboard.Mechanism2d; -import edu.wpi.first.wpilibj.smartdashboard.MechanismLigament2d; -import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; -import edu.wpi.first.wpilibj.util.Color; -import edu.wpi.first.wpilibj.util.Color8Bit; - -public class Telemetry { - private final double MaxSpeed; - - /** - * Construct a telemetry object, with the specified max speed of the robot - * - * @param maxSpeed Maximum speed in meters per second - */ - public Telemetry(double maxSpeed) { - MaxSpeed = maxSpeed; - SignalLogger.start(); - } - - /* What to publish over networktables for telemetry */ - private final NetworkTableInstance inst = NetworkTableInstance.getDefault(); - - /* Robot swerve drive state */ - private final NetworkTable driveStateTable = inst.getTable("DriveState"); - private final StructPublisher drivePose = driveStateTable.getStructTopic("Pose", Pose2d.struct).publish(); - private final StructPublisher driveSpeeds = driveStateTable.getStructTopic("Speeds", ChassisSpeeds.struct).publish(); - private final StructArrayPublisher driveModuleStates = driveStateTable.getStructArrayTopic("ModuleStates", SwerveModuleState.struct).publish(); - private final StructArrayPublisher driveModuleTargets = driveStateTable.getStructArrayTopic("ModuleTargets", SwerveModuleState.struct).publish(); - private final StructArrayPublisher driveModulePositions = driveStateTable.getStructArrayTopic("ModulePositions", SwerveModulePosition.struct).publish(); - private final DoublePublisher driveTimestamp = driveStateTable.getDoubleTopic("Timestamp").publish(); - private final DoublePublisher driveOdometryFrequency = driveStateTable.getDoubleTopic("OdometryFrequency").publish(); - - /* Robot pose for field positioning */ - private final NetworkTable table = inst.getTable("Pose"); - private final DoubleArrayPublisher fieldPub = table.getDoubleArrayTopic("robotPose").publish(); - private final StringPublisher fieldTypePub = table.getStringTopic(".type").publish(); - - /* Mechanisms to represent the swerve module states */ - private final Mechanism2d[] m_moduleMechanisms = new Mechanism2d[] { - new Mechanism2d(1, 1), - new Mechanism2d(1, 1), - new Mechanism2d(1, 1), - new Mechanism2d(1, 1), - }; - /* A direction and length changing ligament for speed representation */ - private final MechanismLigament2d[] m_moduleSpeeds = new MechanismLigament2d[] { - m_moduleMechanisms[0].getRoot("RootSpeed", 0.5, 0.5).append(new MechanismLigament2d("Speed", 0.5, 0)), - m_moduleMechanisms[1].getRoot("RootSpeed", 0.5, 0.5).append(new MechanismLigament2d("Speed", 0.5, 0)), - m_moduleMechanisms[2].getRoot("RootSpeed", 0.5, 0.5).append(new MechanismLigament2d("Speed", 0.5, 0)), - m_moduleMechanisms[3].getRoot("RootSpeed", 0.5, 0.5).append(new MechanismLigament2d("Speed", 0.5, 0)), - }; - /* A direction changing and length constant ligament for module direction */ - private final MechanismLigament2d[] m_moduleDirections = new MechanismLigament2d[] { - m_moduleMechanisms[0].getRoot("RootDirection", 0.5, 0.5) - .append(new MechanismLigament2d("Direction", 0.1, 0, 0, new Color8Bit(Color.kWhite))), - m_moduleMechanisms[1].getRoot("RootDirection", 0.5, 0.5) - .append(new MechanismLigament2d("Direction", 0.1, 0, 0, new Color8Bit(Color.kWhite))), - m_moduleMechanisms[2].getRoot("RootDirection", 0.5, 0.5) - .append(new MechanismLigament2d("Direction", 0.1, 0, 0, new Color8Bit(Color.kWhite))), - m_moduleMechanisms[3].getRoot("RootDirection", 0.5, 0.5) - .append(new MechanismLigament2d("Direction", 0.1, 0, 0, new Color8Bit(Color.kWhite))), - }; - - private final double[] m_poseArray = new double[3]; - private final double[] m_moduleStatesArray = new double[8]; - private final double[] m_moduleTargetsArray = new double[8]; - - /** Accept the swerve drive state and telemeterize it to SmartDashboard and SignalLogger. */ - public void telemeterize(SwerveDriveState state) { - /* Telemeterize the swerve drive state */ - drivePose.set(state.Pose); - driveSpeeds.set(state.Speeds); - driveModuleStates.set(state.ModuleStates); - driveModuleTargets.set(state.ModuleTargets); - driveModulePositions.set(state.ModulePositions); - driveTimestamp.set(state.Timestamp); - driveOdometryFrequency.set(1.0 / state.OdometryPeriod); - - /* Also write to log file */ - m_poseArray[0] = state.Pose.getX(); - m_poseArray[1] = state.Pose.getY(); - m_poseArray[2] = state.Pose.getRotation().getDegrees(); - for (int i = 0; i < 4; ++i) { - m_moduleStatesArray[i*2 + 0] = state.ModuleStates[i].angle.getRadians(); - m_moduleStatesArray[i*2 + 1] = state.ModuleStates[i].speedMetersPerSecond; - m_moduleTargetsArray[i*2 + 0] = state.ModuleTargets[i].angle.getRadians(); - m_moduleTargetsArray[i*2 + 1] = state.ModuleTargets[i].speedMetersPerSecond; - } - - SignalLogger.writeDoubleArray("DriveState/Pose", m_poseArray); - SignalLogger.writeDoubleArray("DriveState/ModuleStates", m_moduleStatesArray); - SignalLogger.writeDoubleArray("DriveState/ModuleTargets", m_moduleTargetsArray); - SignalLogger.writeDouble("DriveState/OdometryPeriod", state.OdometryPeriod, "seconds"); - - /* Telemeterize the pose to a Field2d */ - fieldTypePub.set("Field2d"); - fieldPub.set(m_poseArray); - - /* Telemeterize the module states to a Mechanism2d */ - for (int i = 0; i < 4; ++i) { - m_moduleSpeeds[i].setAngle(state.ModuleStates[i].angle); - m_moduleDirections[i].setAngle(state.ModuleStates[i].angle); - m_moduleSpeeds[i].setLength(state.ModuleStates[i].speedMetersPerSecond / (2 * MaxSpeed)); - - SmartDashboard.putData("Module " + i, m_moduleMechanisms[i]); - } - } -} \ No newline at end of file diff --git a/java/frc/robot/cosmetics/BlinkInLEDs.java b/java/frc/robot/cosmetics/BlinkInLEDs.java deleted file mode 100644 index f2241f0..0000000 --- a/java/frc/robot/cosmetics/BlinkInLEDs.java +++ /dev/null @@ -1,35 +0,0 @@ -// 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.cosmetics; - -import edu.wpi.first.wpilibj.motorcontrol.Spark; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants.CosmeticConstants; - -// We are no longer using this file to run any code, it is merely left as a reference -public class BlinkInLEDs extends SubsystemBase { - public final Spark lightController = new Spark(CosmeticConstants.LIGHT_ID); - // private ShuffleboardTab tab = Shuffleboard.getTab("LED"); - // private GenericEntry lightColor = tab.add("led color", - // CosmeticConstants.SOLID_YELLOW_VALUE).getEntry(); - - /** Creates a new lights. */ - public BlinkInLEDs() { - } - - public void setYellow() { - lightController.set(CosmeticConstants.SOLID_YELLOW_VALUE); - } - - public void setPurple() { - lightController.set(CosmeticConstants.SOLID_PURPLE_VALUE); - } - - @Override - public void periodic() { - // This method will be called once per scheduler run - // lightController.set(lightColor.getDouble(CosmeticConstants.SOLID_YELLOW_VALUE)); - } -} diff --git a/java/frc/robot/cosmetics/PwmLEDs.java b/java/frc/robot/cosmetics/PwmLEDs.java deleted file mode 100644 index acb2796..0000000 --- a/java/frc/robot/cosmetics/PwmLEDs.java +++ /dev/null @@ -1,249 +0,0 @@ -// 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.cosmetics; - -import edu.wpi.first.wpilibj.AddressableLED; -import edu.wpi.first.wpilibj.AddressableLEDBuffer; -import edu.wpi.first.wpilibj.DriverStation; -import edu.wpi.first.wpilibj.Timer; -import edu.wpi.first.wpilibj.util.Color; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants.CosmeticConstants; - -public class PwmLEDs extends SubsystemBase { - private final AddressableLED lights = new AddressableLED(CosmeticConstants.LIGHT_ID); - private AddressableLEDBuffer buffer = new AddressableLEDBuffer(CosmeticConstants.LIGHT_LENGTH); - private Color color1 = Color.kBlack; - private Color color2 = Color.kBlack; - private double onLength = 0.0; - private double offLength = 0.0; - private int color1Length = 0; - private int color2Length = 0; - private double speed = 0; - private double cycleLength = 0.0; - private double duration = 0.0; - - private double mp1 = 90.0; - private double mp2 = 60.0; - private double mp3 = 30.0; - private double mp4 = 15.0; - private double mp5 = 10.0; - private double mp6 = 5.0; - private double mpTolerance = 0.5; - - private Mode lightMode = Mode.SOLID; - - public void setLightMode(Mode lightMode) { - this.lightMode = lightMode; - } - - public Color getColor1() { - return color1; - } - - public void setColor1(Color color1) { - this.color1 = color1; - } - - public Color getColor2() { - return color2; - } - - public void setColor2(Color color2) { - this.color2 = color2; - } - - public void setColor1Length(int color1Length) { - this.color1Length = color1Length; - } - - public void setColor2Length(int color2Length) { - this.color2Length = color2Length; - } - - public void setSpeed(double speed) { - this.speed = speed; - } - - public static enum Mode { - SOLID, WAVE, CLIMB, STROBE; - } - - /** Creates a new PwmLEDs. */ - public PwmLEDs() { - lights.setLength(CosmeticConstants.LIGHT_LENGTH); - lights.setData(buffer); - lights.start(); - } - - public void solid(Color color) { - for (int i = 0; i < buffer.getLength(); i++) { - buffer.setLED(i, color); - } - } - - public void setSolid(Color color) { - this.color1 = color; - this.lightMode = Mode.SOLID; - } - - public void wave(Color color1, Color color2, double cycleLength, double duration) { - double counter = (1 - ((Timer.getFPGATimestamp() % duration) / duration)) * 2.0 * Math.PI; - double counterDiffPerLed = (2.0 * Math.PI) / cycleLength; - for (int i = 0; i < buffer.getLength(); i++) { - counter += counterDiffPerLed; - if (i >= 0) { - double ratio = (Math.pow(Math.sin(counter), 0.4) + 1.0) / 2.0; - if (Double.isNaN(ratio)) { - ratio = (-Math.pow(Math.sin(counter + Math.PI), 0.4) + 1.0) / 2.0; - } - if (Double.isNaN(ratio)) { - ratio = 0.5; - } - double red = (color1.red * (1 - ratio)) + (color2.red * ratio); - double green = (color1.green * (1 - ratio)) + (color2.green * ratio); - double blue = (color1.blue * (1 - ratio)) + (color2.blue * ratio); - buffer.setLED(i, new Color(red, green, blue)); - } - } - } - - public void wave(Color color, double cycleLength, double duration) { - wave(color, Color.kBlack, cycleLength, duration); - } - - public void setWave(Color color1, Color color2, double cycleLength, double duration) { - this.color1 = color1; - this.color2 = color2; - this.cycleLength = cycleLength; - this.duration = duration; - this.lightMode = Mode.WAVE; - } - - public void climb(Color color1, Color color2, int color1Length, int color2Length, double speed) { - int counter = (int) Math.floor(Timer.getFPGATimestamp() * speed); - for (int i = 0; i < buffer.getLength(); i += color2Length + color1Length) { - for (int j = 0; j < color1Length; j++) { - buffer.setLED((i + j + counter) % buffer.getLength(), color1); - } - for (int j = color1Length; j < color1Length + color2Length; j++) { - buffer.setLED((i + j + counter) % buffer.getLength(), color2); - } - } - } - - public void climb(Color color, int colorLength, int offLength, double speed) { - climb(color, Color.kBlack, colorLength, offLength, speed); - } - - public void setClimb(Color color1, Color color2, int color1Length, int color2Length, double speed) { - this.color1 = color1; - this.color2 = color2; - this.color1Length = color1Length; - this.color2Length = color2Length; - this.speed = speed; - this.lightMode = Mode.CLIMB; - } - - public void strobe(Color color1, Color color2, double onLength, double offLength) { - boolean lightsOn = Timer.getFPGATimestamp() % onLength + offLength > onLength; - if (lightsOn) { - for (int i = 0; i < buffer.getLength(); i++) { - buffer.setLED(i, color1); - } - } else { - for (int i = 0; i < buffer.getLength(); i++) { - buffer.setLED(i, color2); - } - } - } - - public void strobe(Color color, double onLength, double offLength) { - strobe(color, Color.kBlack, onLength, offLength); - } - - public void setStrobe(Color color1, Color color2, double onLength, double offLength) { - this.color1 = color1; - this.color2 = color2; - this.onLength = onLength; - this.offLength = offLength; - this.lightMode = Mode.STROBE; - } - - public void setDefault() { - Color color1 = Color.kBlue; - Color color2 = Color.kGold; - if (DriverStation.isEStopped()) { - color1 = Color.kDarkGreen; - color2 = Color.kPowderBlue; - } - if (!DriverStation.isFMSAttached()) { - color1 = PwmLEDs.dimColor(color1, 0.25); - color2 = PwmLEDs.dimColor(color2, 0.25); - } - - setWave(color1, color2, 10, 3); - } - - public static Color dimColor(Color color, double brightness) { - return new Color(color.red * brightness, color.green * brightness, color.blue * brightness); - } - - @Override - public void periodic() { - // This method will be called once per scheduler run - - double time = Timer.getMatchTime(); - if (Math.abs(time - mp1) <= mpTolerance) { - solid(Color.kBlue); - lights.setData(buffer); - return; - } - if (Math.abs(time - mp2) <= mpTolerance) { - solid(Color.kGreen); - lights.setData(buffer); - return; - } - if (Math.abs(time - mp3) <= mpTolerance) { - solid(Color.kFirstRed); - lights.setData(buffer); - return; - } - if (time < mp4 && time > mp5 && time % 1.0 > 0.5) { - solid(dimColor(Color.kDarkGoldenrod, 0.5)); - lights.setData(buffer); - return; - } - if (time < mp5 && time > mp6 && time % 1.0 > 0.5) { - solid(dimColor(Color.kFirstBlue, 0.5)); - lights.setData(buffer); - return; - } - if (time < mp6 && time % 1.0 > 0.5) { - solid(dimColor(Color.kFirstRed, 0.5)); - lights.setData(buffer); - return; - } - - switch (lightMode) { - case SOLID: - solid(color1); - break; - case WAVE: - wave(color1, color2, cycleLength, duration); - break; - case CLIMB: - climb(color1, color2, color1Length, color2Length, speed); - break; - case STROBE: - strobe(color1, color2, onLength, offLength); - break; - default: - solid(Color.kBlack); - } - - lights.setData(buffer); - } -} diff --git a/java/frc/robot/data/LoggingSystem.java b/java/frc/robot/data/LoggingSystem.java deleted file mode 100644 index 5c21203..0000000 --- a/java/frc/robot/data/LoggingSystem.java +++ /dev/null @@ -1,61 +0,0 @@ -// 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.data; - -import java.util.Dictionary; -import java.util.Map; - -import com.ctre.phoenix6.SignalLogger; - -import edu.wpi.first.networktables.GenericEntry; -import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard; -import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; -import edu.wpi.first.wpilibj2.command.Subsystem; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants.LoggingConstants; -import frc.robot.subsystems.DriveSystem; - -public class LoggingSystem extends SubsystemBase { - - private Map subsystemArray; - private boolean loggingState = LoggingConstants.DEFAULT_LOGGING_STATE; - private GenericEntry loggingChooser; - - - /** Creates a new LoggingSystem. */ - public LoggingSystem(Map subsystemArray) { - loggingChooser = Shuffleboard.getTab("Logging").add("Enable Logging", false).getEntry(); - SmartDashboard.putBoolean("Logging Chooser", false); - this.subsystemArray = subsystemArray; - } - - public boolean getLoggingState() { - return loggingState; - } - - private boolean getLoggingFlag() { - // An example command will be run in autonomous - return loggingChooser.getBoolean(false); // TODO: Actually use this value -} - - @Override - public void periodic() { - // This method will be called once per scheduler run - if (getLoggingFlag() != loggingState) { - loggingState = getLoggingFlag(); - - if (loggingState) { - SignalLogger.start(); - // Log the odometry pose as a double array - } else { - SignalLogger.stop(); - } - } - if (loggingState){ - var pose = ((DriveSystem)subsystemArray.get(new String("Drive"))).getState().Pose; - var status = SignalLogger.writeDoubleArray("odometry", new double[] {pose.getX(), pose.getY(), pose.getRotation().getDegrees()}); - } - } -} diff --git a/java/frc/robot/generated/TunerConstants.java b/java/frc/robot/generated/TunerConstants.java deleted file mode 100644 index cbbbb05..0000000 --- a/java/frc/robot/generated/TunerConstants.java +++ /dev/null @@ -1,286 +0,0 @@ -package frc.robot.generated; - -import static edu.wpi.first.units.Units.*; - -import com.ctre.phoenix6.CANBus; -import com.ctre.phoenix6.configs.*; -import com.ctre.phoenix6.hardware.*; -import com.ctre.phoenix6.signals.*; -import com.ctre.phoenix6.swerve.*; -import com.ctre.phoenix6.swerve.SwerveModuleConstants.*; - -import edu.wpi.first.math.Matrix; -import edu.wpi.first.math.numbers.N1; -import edu.wpi.first.math.numbers.N3; -import edu.wpi.first.units.measure.*; - -import frc.robot.subsystems.DriveSystem; - -// Generated by the Tuner X Swerve Project Generator -// https://v6.docs.ctr-electronics.com/en/stable/docs/tuner/tuner-swerve/index.html -public class TunerConstants { - // Both sets of gains need to be tuned to your individual robot. - - // The steer motor uses any SwerveModule.SteerRequestType control request with the - // output type specified by SwerveModuleConstants.SteerMotorClosedLoopOutput - private static final Slot0Configs steerGains = new Slot0Configs() - .withKP(100).withKI(0).withKD(0.5) // 100, 0, 0.5 - .withKS(0.1).withKV(1.91).withKA(0) // 0, 1.5, 0 - .withStaticFeedforwardSign(StaticFeedforwardSignValue.UseClosedLoopSign); - // When using closed-loop control, the drive motor uses the control - // output type specified by SwerveModuleConstants.DriveMotorClosedLoopOutput - private static final Slot0Configs driveGains = new Slot0Configs() - .withKP(0.1).withKI(0).withKD(0) // 3, 0, 0 - .withKS(0).withKV(0.124); // removed KA changed and KV from 0 - - // The closed-loop output type to use for the steer motors; - // This affects the PID/FF gains for the steer motors - private static final ClosedLoopOutputType kSteerClosedLoopOutput = ClosedLoopOutputType.Voltage; - // The closed-loop output type to use for the drive motors; - // This affects the PID/FF gains for the drive motors - private static final ClosedLoopOutputType kDriveClosedLoopOutput = ClosedLoopOutputType.Voltage; - - // The type of motor used for the drive motor - private static final DriveMotorArrangement kDriveMotorType = DriveMotorArrangement.TalonFX_Integrated; - // The type of motor used for the drive motor - private static final SteerMotorArrangement kSteerMotorType = SteerMotorArrangement.TalonFX_Integrated; - - // The remote sensor feedback type to use for the steer motors; - // When not Pro-licensed, FusedCANcoder/SyncCANcoder automatically fall back to RemoteCANcoder - private static final SteerFeedbackType kSteerFeedbackType = SteerFeedbackType.FusedCANcoder; - - // The stator current at which the wheels start to slip; - // This needs to be tuned to your individual robot - private static final Current kSlipCurrent = Amps.of(120.0); // 150 - - // Initial configs for the drive and steer motors and the azimuth encoder; these cannot be null. - // Some configs will be overwritten; check the `with*InitialConfigs()` API documentation. - private static final TalonFXConfiguration driveInitialConfigs = new TalonFXConfiguration(); - private static final TalonFXConfiguration steerInitialConfigs = new TalonFXConfiguration() - .withCurrentLimits( - new CurrentLimitsConfigs() - // Swerve azimuth does not require much torque output, so we can set a relatively low - // stator current limit to help avoid brownouts without impacting performance. - .withStatorCurrentLimit(Amps.of(60)) - .withStatorCurrentLimitEnable(true) - ); - private static final CANcoderConfiguration encoderInitialConfigs = new CANcoderConfiguration(); - // Configs for the Pigeon 2; leave this null to skip applying Pigeon 2 configs - private static final Pigeon2Configuration pigeonConfigs = null; - - // CAN bus that the devices are located on; - // All swerve devices must share the same CAN bus - public static final CANBus kCANBus = new CANBus("canivore", "./logs/example.hoot"); // Default Name - - // Theoretical free speed (m/s) at 12 V applied output; - // This needs to be tuned to your individual robot - public static final LinearVelocity kSpeedAt12Volts = MetersPerSecond.of(4.69); // 5 - - // Every 1 rotation of the azimuth results in kCoupleRatio drive motor turns; - // This may need to be tuned to your individual robot - private static final double kCoupleRatio = 3.8181818181818183; // 3.5714285714285716 - - private static final double kDriveGearRatio = 7.363636363636365; // 6.122448979591837 - private static final double kSteerGearRatio = 15.42857142857143; // 12.8 - private static final Distance kWheelRadius = Inches.of(2.167); // 1.92 - - private static final boolean kInvertLeftSide = false; - private static final boolean kInvertRightSide = true; - - private static final int kPigeonId = 13; - - // These are only used for simulation - private static final MomentOfInertia kSteerInertia = KilogramSquareMeters.of(0.01); // 0.00001 - private static final MomentOfInertia kDriveInertia = KilogramSquareMeters.of(0.01); // 0.001 - // Simulated voltage necessary to overcome friction - private static final Voltage kSteerFrictionVoltage = Volts.of(0.2); // 0.25 - private static final Voltage kDriveFrictionVoltage = Volts.of(0.2); // 0.25 - - public static final SwerveDrivetrainConstants DrivetrainConstants = new SwerveDrivetrainConstants() - .withCANBusName(kCANBus.getName()) - .withPigeon2Id(kPigeonId) - .withPigeon2Configs(pigeonConfigs); - - private static final SwerveModuleConstantsFactory ConstantCreator = - new SwerveModuleConstantsFactory() - .withDriveMotorGearRatio(kDriveGearRatio) - .withSteerMotorGearRatio(kSteerGearRatio) - .withCouplingGearRatio(kCoupleRatio) - .withWheelRadius(kWheelRadius) - .withSteerMotorGains(steerGains) - .withDriveMotorGains(driveGains) - .withSteerMotorClosedLoopOutput(kSteerClosedLoopOutput) - .withDriveMotorClosedLoopOutput(kDriveClosedLoopOutput) - .withSlipCurrent(kSlipCurrent) - .withSpeedAt12Volts(kSpeedAt12Volts) - .withDriveMotorType(kDriveMotorType) - .withSteerMotorType(kSteerMotorType) - .withFeedbackSource(kSteerFeedbackType) - .withDriveMotorInitialConfigs(driveInitialConfigs) - .withSteerMotorInitialConfigs(steerInitialConfigs) - .withEncoderInitialConfigs(encoderInitialConfigs) - .withSteerInertia(kSteerInertia) - .withDriveInertia(kDriveInertia) - .withSteerFrictionVoltage(kSteerFrictionVoltage) - .withDriveFrictionVoltage(kDriveFrictionVoltage); - - - // Front Left - private static final int kFrontLeftDriveMotorId = 11; - private static final int kFrontLeftSteerMotorId = 12; - private static final int kFrontLeftEncoderId = 10; - private static final Angle kFrontLeftEncoderOffset = Rotations.of(0.15234375); // -0.052734375 - private static final boolean kFrontLeftSteerMotorInverted = true; // false - private static final boolean kFrontLeftEncoderInverted = false; // new - - private static final Distance kFrontLeftXPos = Inches.of(10); // 9.25 - private static final Distance kFrontLeftYPos = Inches.of(10); // 9.25 - - // Front Right - private static final int kFrontRightDriveMotorId = 2; - private static final int kFrontRightSteerMotorId = 3; - private static final int kFrontRightEncoderId = 1; - private static final Angle kFrontRightEncoderOffset = Rotations.of(-0.4873046875); // -0.6796875 - private static final boolean kFrontRightSteerMotorInverted = true; // false - private static final boolean kFrontRightEncoderInverted = false; // new - - private static final Distance kFrontRightXPos = Inches.of(10); // 9.25 - private static final Distance kFrontRightYPos = Inches.of(-10); // -9.25 - - // Back Left - private static final int kBackLeftDriveMotorId = 8; - private static final int kBackLeftSteerMotorId = 9; - private static final int kBackLeftEncoderId = 7; - private static final Angle kBackLeftEncoderOffset = Rotations.of(-0.219482421875); // -0.304931640625 - private static final boolean kBackLeftSteerMotorInverted = true; // false - private static final boolean kBackLeftEncoderInverted = false; // new - - private static final Distance kBackLeftXPos = Inches.of(-10); // -9.25 - private static final Distance kBackLeftYPos = Inches.of(10); // 9.25 - - // Back Right - private static final int kBackRightDriveMotorId = 5; - private static final int kBackRightSteerMotorId = 6; - private static final int kBackRightEncoderId = 4; - private static final Angle kBackRightEncoderOffset = Rotations.of(0.17236328125); // -0.032470703125 - private static final boolean kBackRightSteerMotorInverted = true; // false - private static final boolean kBackRightEncoderInverted = false; // new - - private static final Distance kBackRightXPos = Inches.of(-10); // -9.25 - private static final Distance kBackRightYPos = Inches.of(-10); // -9.25 - - - public static final SwerveModuleConstants FrontLeft = - ConstantCreator.createModuleConstants( - kFrontLeftSteerMotorId, kFrontLeftDriveMotorId, kFrontLeftEncoderId, kFrontLeftEncoderOffset, - kFrontLeftXPos, kFrontLeftYPos, kInvertLeftSide, kFrontLeftSteerMotorInverted, kFrontLeftEncoderInverted - ); - public static final SwerveModuleConstants FrontRight = - ConstantCreator.createModuleConstants( - kFrontRightSteerMotorId, kFrontRightDriveMotorId, kFrontRightEncoderId, kFrontRightEncoderOffset, - kFrontRightXPos, kFrontRightYPos, kInvertRightSide, kFrontRightSteerMotorInverted, kFrontRightEncoderInverted - ); - public static final SwerveModuleConstants BackLeft = - ConstantCreator.createModuleConstants( - kBackLeftSteerMotorId, kBackLeftDriveMotorId, kBackLeftEncoderId, kBackLeftEncoderOffset, - kBackLeftXPos, kBackLeftYPos, kInvertLeftSide, kBackLeftSteerMotorInverted, kBackLeftEncoderInverted - ); - public static final SwerveModuleConstants BackRight = - ConstantCreator.createModuleConstants( - kBackRightSteerMotorId, kBackRightDriveMotorId, kBackRightEncoderId, kBackRightEncoderOffset, - kBackRightXPos, kBackRightYPos, kInvertRightSide, kBackRightSteerMotorInverted, kBackRightEncoderInverted - ); - - /** - * Creates a CommandSwerveDrivetrain instance. - * This should only be called once in your robot program,. - */ - public static DriveSystem createDrivetrain() { - return new DriveSystem( - DrivetrainConstants, FrontLeft, FrontRight, BackLeft, BackRight - ); - } - - - /** - * Swerve Drive class utilizing CTR Electronics' Phoenix 6 API with the selected device types. - */ - public static class TunerSwerveDrivetrain extends SwerveDrivetrain { - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param modules Constants for each specific module - */ - public TunerSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - SwerveModuleConstants... modules - ) { - super( - TalonFX::new, TalonFX::new, CANcoder::new, - drivetrainConstants, modules - ); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param modules Constants for each specific module - */ - public TunerSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - SwerveModuleConstants... modules - ) { - super( - TalonFX::new, TalonFX::new, CANcoder::new, - drivetrainConstants, odometryUpdateFrequency, modules - ); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param odometryStandardDeviation The standard deviation for odometry calculation - * in the form [x, y, theta]ᵀ, with units in meters - * and radians - * @param visionStandardDeviation The standard deviation for vision calculation - * in the form [x, y, theta]ᵀ, with units in meters - * and radians - * @param modules Constants for each specific module - */ - public TunerSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - Matrix odometryStandardDeviation, - Matrix visionStandardDeviation, - SwerveModuleConstants... modules - ) { - super( - TalonFX::new, TalonFX::new, CANcoder::new, - drivetrainConstants, odometryUpdateFrequency, - odometryStandardDeviation, visionStandardDeviation, modules - ); - } - } -} \ No newline at end of file diff --git a/java/org/assabet/aztechs157/PrintLimiter.java b/java/org/assabet/aztechs157/PrintLimiter.java deleted file mode 100644 index aa6dc7a..0000000 --- a/java/org/assabet/aztechs157/PrintLimiter.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.assabet.aztechs157; - -public class PrintLimiter { - private final int ticksPerPrint; - private int currentTicks = 0; - - public PrintLimiter(final int ticksPerPrint) { - this.ticksPerPrint = ticksPerPrint; - } - - public PrintLimiter tick() { - currentTicks++; - - if (currentTicks > ticksPerPrint) { - currentTicks = 0; - } - - return this; - } - - public PrintLimiter println(final String message) { - if (currentTicks == 0) { - System.out.println(message); - } - - return this; - } - - public PrintLimiter print(final String message) { - if (currentTicks == 0) { - System.out.print(message); - } - - return this; - } - - public PrintLimiter limitBody(final Runnable body) { - if (currentTicks == 0) { - body.run(); - } - - return this; - } -} diff --git a/java/org/assabet/aztechs157/Sanity.java b/java/org/assabet/aztechs157/Sanity.java deleted file mode 100644 index a2ac436..0000000 --- a/java/org/assabet/aztechs157/Sanity.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.assabet.aztechs157; - -import org.assabet.aztechs157.numbers.Range; - -public final class Sanity { - private Sanity() { - throw new UnsupportedOperationException("Expect is a utility class"); - } - - public static class SanityError extends RuntimeException { - public SanityError(final String message) { - super(message); - } - } - - public static NumberSanity check(final double number) { - return new NumberSanity(number); - } - - public static record NumberSanity(double value) { - public NumberSanity containedWithin(final Range range) { - if (range.contains(value)) { - return this; - } else { - throw new SanityError(value + " was not contained within " + range); - } - } - - public NumberSanity equalTo(final double other) { - if (value == other) { - return this; - } else { - throw new SanityError(value + " was not equal to " + other); - } - } - - public NumberSanity notEqualTo(final double other) { - if (value != other) { - return this; - } else { - throw new SanityError(value + " was equal to " + other); - } - } - - public NumberSanity greaterThan(final double other) { - if (value > other) { - return this; - } else { - throw new SanityError(value + " was not greater than " + other); - } - } - - public NumberSanity lessThan(final double other) { - if (value < other) { - return this; - } else { - throw new SanityError(value + " was not less than " + other); - } - } - - public NumberSanity greaterOrEqual(final double other) { - if (value >= other) { - return this; - } else { - throw new SanityError(value + " was not greater or equal to " + other); - } - } - - public NumberSanity lessOrEqual(final double other) { - if (value <= other) { - return this; - } else { - throw new SanityError(value + " was not less or equal to " + other); - } - } - } - - public static BooleanSanity check(final boolean value) { - return new BooleanSanity(value); - } - - public static record BooleanSanity(boolean value) { - public BooleanSanity equal(final boolean other) { - if (value == other) { - return this; - } else { - throw new SanityError(value + " was not equal to " + other); - } - } - } -} diff --git a/java/org/assabet/aztechs157/input/Model.java b/java/org/assabet/aztechs157/input/Model.java deleted file mode 100644 index daa0894..0000000 --- a/java/org/assabet/aztechs157/input/Model.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.assabet.aztechs157.input; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -/** - * Models map physical inputs on a input device to input classes such as - * {@link Button}, {@link Axis}, or {@link Pov}. - */ -public class Model { - - public final int deviceId; - - /** - * Create a Model that models the device specified by `deviceId` - * - * @param deviceId The id of the device - */ - public Model(final int deviceId) { - this.deviceId = deviceId; - } - - /** - * Create a {@link Button} that models a physical button - * - * @param buttonId The button to model - * @return The modeled {@link Button} - */ - public Button button(final int buttonId) { - return Button.fromDriverStation(deviceId, buttonId); - } - - /** - * Create a {@link Axis} that models a physical axis - * - * @param buttonId The axis to model - * @return The modeled {@link Axis} - */ - public Axis axis(final int axisId) { - return Axis.fromDriverStation(deviceId, axisId); - } - - /** - * Create a {@link Pov} that modes a physical pov - * - * @param povId The pov to model - * @return The modeled {@link Pov} - */ - public Pov pov(final int povId) { - return Pov.fromDriverStation(deviceId, povId); - } -} diff --git a/java/org/assabet/aztechs157/input/Pov.java b/java/org/assabet/aztechs157/input/Pov.java deleted file mode 100644 index 7dd2a8f..0000000 --- a/java/org/assabet/aztechs157/input/Pov.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.assabet.aztechs157.input; - -import java.util.function.IntSupplier; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -import edu.wpi.first.wpilibj.DriverStation; - -/** - * Class for getting input from a pov. - */ -public class Pov { - private final IntSupplier degrees; - - public Pov(final IntSupplier degrees) { - this.degrees = degrees; - } - - public static Pov fromDriverStation(final int deviceId, final int povId) { - return new Pov(() -> DriverStation.getStickPOV(deviceId, povId)); - } - - public int get() { - return degrees.getAsInt(); - } - - public final Axis value = new Axis(() -> get()); - - public final Axis y = new Axis(() -> switch (get()) { - case UP_LEFT, UP, UP_RIGHT -> 1; - case LEFT, CENTER, RIGHT -> 0; - case DOWN_LEFT, DOWN, DOWN_RIGHT -> -1; - default -> 0; - }); - - public final Axis x = new Axis(() -> switch (get()) { - case DOWN_RIGHT, RIGHT, UP_RIGHT -> 1; - case DOWN, CENTER, UP -> 0; - case DOWN_LEFT, LEFT, UP_LEFT -> -1; - default -> 0; - }); - - public static final int CENTER = -1; - public static final int UP = 45 * 0; - public static final int UP_RIGHT = 45 * 1; - public static final int RIGHT = 45 * 2; - public static final int DOWN_RIGHT = 45 * 3; - public static final int DOWN = 45 * 4; - public static final int DOWN_LEFT = 45 * 5; - public static final int LEFT = 45 * 6; - public static final int UP_LEFT = 45 * 7; - - private Button buttonForValue(final int degrees, final String name) { - return new Button(() -> get() == degrees); - } - - public final Button center = buttonForValue(CENTER, "Center"); - public final Button up = buttonForValue(UP, "Up"); - public final Button upRight = buttonForValue(UP_RIGHT, "Up Right"); - public final Button right = buttonForValue(RIGHT, "Right"); - public final Button downRight = buttonForValue(DOWN_RIGHT, "Down Right"); - public final Button down = buttonForValue(DOWN, "Down"); - public final Button downLeft = buttonForValue(DOWN_LEFT, "Down Left"); - public final Button left = buttonForValue(LEFT, "Left"); - public final Button upLeft = buttonForValue(UP_LEFT, "Up Left"); -} diff --git a/java/org/assabet/aztechs157/input/layouts/DynamicLayout.java b/java/org/assabet/aztechs157/input/layouts/DynamicLayout.java deleted file mode 100644 index c4cbcf7..0000000 --- a/java/org/assabet/aztechs157/input/layouts/DynamicLayout.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.assabet.aztechs157.input.layouts; - -import java.util.function.Supplier; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -/** - * Object that manages layouts. A layout can be selected from Shuffleboard that - * can then be used by the robot. It maps the inputs of a - * {@link DynamicLayout} to the desired functions of the robot. - */ -public class DynamicLayout implements Layout { - private final Supplier layoutSupplier; - - public DynamicLayout(final Supplier layoutSupplier) { - this.layoutSupplier = layoutSupplier; - } - - public Layout getCurrent() { - return layoutSupplier.get(); - } - - /** - * Get a button from the currently selected layout. - * - * @param key Which button to retrieve - * @return A {@link Button} and {@link Button.Key} representing the input - */ - public Button button(final Button.Key key) { - return new Button(() -> getCurrent().button(key).get()); - } - - /** - * Get a axis from the currently selected layout. - * - * @param key Which axis to retrieve - * @return A {@link Axis} representing the input - */ - public Axis axis(final Axis.Key key) { - return new Axis(() -> getCurrent().axis(key).get()); - } -} diff --git a/java/org/assabet/aztechs157/input/layouts/Layout.java b/java/org/assabet/aztechs157/input/layouts/Layout.java deleted file mode 100644 index 01c914c..0000000 --- a/java/org/assabet/aztechs157/input/layouts/Layout.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.assabet.aztechs157.input.layouts; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public interface Layout { - /** - * Retrieve the {@link Button} associated with a {@link Button.Key} - * - * @param key The key a button was assigned to - * @return The associated button - */ - public Button button(final Button.Key key); - - /** - * Retrieve the {@link Axis} associated with a {@link Axis.KeyBase} - * - * @param key The key an axis was assigned to - * @return The associated axis - */ - public Axis axis(final Axis.Key key); -} diff --git a/java/org/assabet/aztechs157/input/layouts/MapLayout.java b/java/org/assabet/aztechs157/input/layouts/MapLayout.java deleted file mode 100644 index fe4c8b0..0000000 --- a/java/org/assabet/aztechs157/input/layouts/MapLayout.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.assabet.aztechs157.input.layouts; - -import java.util.HashMap; -import java.util.Map; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -/** - * A simple structure that stores the mapping between keys and inputs. These can - * be used with {@link DynamicLayout} to allow hot-swapping of layouts. - */ -public class MapLayout implements Layout { - private final Map buttons = new HashMap<>(); - private final Map axes = new HashMap<>(); - - /** - * For this Layout, assign a {@link Button.Key} to a {@link Button}. - * Calling - * this method multiple times with the same key will override the previous - * assignment. - * - * @param key The key to assign with - * @param button The button being assigned - */ - public void assign(final Button.Key key, final Button button) { - buttons.put(key, button); - } - - /** - * For this Layout, assign a {@link Axis.KeyBase} to a {@link Axis}. Calling - * this - * method multiple times with the same key will override the previous - * assignment. - * - * @param key The key to assign with - * @param axis The axis being assigned - */ - public void assign(final Axis.Key key, final Axis axis) { - axes.put(key, axis); - } - - /** - * Retrieve the {@link Button} associated with a {@link Button.Key} - * - * @param key The key a button was assigned to - * @return The associated button - */ - public Button button(final Button.Key key) { - return buttons.get(key); - } - - /** - * Retrieve the {@link Axis} associated with a {@link Axis.KeyBase} - * - * @param key The key an axis was assigned to - * @return The associated axis - */ - public Axis axis(final Axis.Key key) { - return axes.get(key); - } -} diff --git a/java/org/assabet/aztechs157/input/models/LogitechAttack.java b/java/org/assabet/aztechs157/input/models/LogitechAttack.java deleted file mode 100644 index c097cc6..0000000 --- a/java/org/assabet/aztechs157/input/models/LogitechAttack.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.assabet.aztechs157.input.models; - -import org.assabet.aztechs157.input.Model; -import org.assabet.aztechs157.input.Pov; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public class LogitechAttack extends Model { - - public LogitechAttack(final int joystickId) { - super(joystickId); - } - - public final Button trigger = button(1); - public final Button button2 = button(2); - public final Button button3 = button(3); - public final Button button4 = button(4); - public final Button button5 = button(5); - public final Button button6 = button(6); - public final Button button7 = button(7); - public final Button button8 = button(8); - public final Button button9 = button(9); - public final Button button10 = button(10); - public final Button button11 = button(11); - - public final Axis stickX = axis(0); - public final Axis stickY = axis(1); - public final Axis slider = axis(3); - - public final Pov pov = pov(0); -} diff --git a/java/org/assabet/aztechs157/input/models/LogitechExtreme3D.java b/java/org/assabet/aztechs157/input/models/LogitechExtreme3D.java deleted file mode 100644 index 59a51e3..0000000 --- a/java/org/assabet/aztechs157/input/models/LogitechExtreme3D.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.assabet.aztechs157.input.models; - -import org.assabet.aztechs157.input.Model; -import org.assabet.aztechs157.input.Pov; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public class LogitechExtreme3D extends Model { - public LogitechExtreme3D(final int joystickId) { - super(joystickId); - } - - public final Button trigger = button(1); - public final Button thumb = button(2); - public final Button button3 = button(3); - public final Button button4 = button(4); - public final Button button5 = button(5); - public final Button button6 = button(6); - public final Button button7 = button(7); - public final Button button8 = button(8); - public final Button button9 = button(9); - public final Button button10 = button(10); - public final Button button11 = button(11); - public final Button button12 = button(12); - - public final Axis stickX = axis(0); - public final Axis stickY = axis(1); - public final Axis stickRotate = axis(2); - public final Axis slider = axis(3); - - public final Pov pov = pov(0); -} diff --git a/java/org/assabet/aztechs157/input/models/LogitechGamepadF310.java b/java/org/assabet/aztechs157/input/models/LogitechGamepadF310.java deleted file mode 100644 index 3be4af0..0000000 --- a/java/org/assabet/aztechs157/input/models/LogitechGamepadF310.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.assabet.aztechs157.input.models; - -import org.assabet.aztechs157.input.Model; -import org.assabet.aztechs157.input.Pov; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public class LogitechGamepadF310 extends Model { - - public LogitechGamepadF310(final int joystickId) { - super(joystickId); - } - - public final Button a = button(1); - public final Button b = button(2); - public final Button x = button(3); - public final Button y = button(4); - public final Button leftBumper = button(5); - public final Button rightBumper = button(6); - public final Button back = button(7); - public final Button start = button(8); - public final Button leftStickPress = button(9); - public final Button rightStickPress = button(10); - - public final Axis leftStickX = axis(0); - public final Axis leftStickY = axis(1); - public final Axis rightTriggerHeld = axis(2); - public final Axis leftTriggerHeld = axis(3); - public final Axis rightStickX = axis(4); - public final Axis rightStickY = axis(5); - public final Axis combinedTriggersHeld = rightTriggerHeld.offsetBy(leftTriggerHeld.inverted()::get); - - public final Pov pov = pov(0); -} diff --git a/java/org/assabet/aztechs157/input/models/XboxOne.java b/java/org/assabet/aztechs157/input/models/XboxOne.java deleted file mode 100644 index 0bc79fe..0000000 --- a/java/org/assabet/aztechs157/input/models/XboxOne.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.assabet.aztechs157.input.models; - -import org.assabet.aztechs157.input.Model; -import org.assabet.aztechs157.input.Pov; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public class XboxOne extends Model { - - public XboxOne(final int joystickId) { - super(joystickId); - } - - public final Button a = button(1); - public final Button b = button(2); - public final Button x = button(3); - public final Button y = button(4); - public final Button leftBumper = button(5); - public final Button rightBumper = button(6); - public final Button back = button(7); - public final Button start = button(8); - public final Button leftStickPress = button(9); - public final Button rightStickPress = button(10); - - public final Axis leftStickX = axis(0); - public final Axis leftStickY = axis(1); - public final Axis leftTriggerHeld = axis(2); - public final Axis rightTriggerHeld = axis(3); - public final Axis rightStickX = axis(4); - public final Axis rightStickY = axis(5); - public final Axis combinedTriggersHeld = rightTriggerHeld.offsetBy(leftTriggerHeld.inverted()::get); - - public final Pov pov = pov(0); -} diff --git a/java/org/assabet/aztechs157/input/values/Axis.java b/java/org/assabet/aztechs157/input/values/Axis.java deleted file mode 100644 index 892cbfd..0000000 --- a/java/org/assabet/aztechs157/input/values/Axis.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.assabet.aztechs157.input.values; - -import java.util.function.DoubleConsumer; -import java.util.function.DoubleSupplier; -import java.util.function.DoubleUnaryOperator; - -import org.assabet.aztechs157.numbers.Range; - -import edu.wpi.first.wpilibj.DriverStation; - -/** - * Class for getting input from a axis. This class has methods and static - * methods to modify and compose {@link Axis}s into a new - * {@link Axis}. - */ -public class Axis { - public static class Key { - } - - public static final Range kDeviceDefaultRange = new Range(-1, 1); - - private final DoubleSupplier value; - - public Axis(final DoubleSupplier value) { - this.value = value; - } - - public static Axis fromDriverStation(final int deviceId, final int axisId) { - return new Axis(() -> DriverStation.getStickAxis(deviceId, axisId)); - } - - public static Axis always(final double value) { - return new Axis(() -> value); - } - - public double get() { - return value.getAsDouble(); - } - - public Axis map(final DoubleUnaryOperator body) { - return new Axis(() -> body.applyAsDouble(get())); - } - - public Axis tap(final DoubleConsumer body) { - return map(value -> { - body.accept(value); - return value; - }); - } - - /** - * Inverts the input by negating the number's sign - * - * @return A new inverted input - */ - public Axis inverted() { - return map(value -> -value); - } - - /** - * Scale the input with a scalar value. - * - * @param scale The value to scale by - * @return A new input with the scale applied - */ - public Axis scaledBy(final double scale) { - return map(value -> value * scale); - } - - /** - * Scale the input with another input. - * - * @param scale The input to retrieve the scale from - * @return A new input with the scale applied - */ - public Axis scaledBy(final DoubleSupplier scale) { - return map(value -> value * scale.getAsDouble()); - } - - public Axis offsetBy(final double offset) { - return map(value -> value + offset); - } - - public Axis offsetBy(final DoubleSupplier offset) { - return map(value -> value + offset.getAsDouble()); - } - - /** - * Clamp the input to a number within the provided range. - * - * @param range The range to clamp to - * @return A new input with clamp applied - */ - public Axis clampTo(final Range range) { - return map(value -> range.clamp(value)); - } -} diff --git a/java/org/assabet/aztechs157/input/values/Button.java b/java/org/assabet/aztechs157/input/values/Button.java deleted file mode 100644 index ebd6a2d..0000000 --- a/java/org/assabet/aztechs157/input/values/Button.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.assabet.aztechs157.input.values; - -import java.util.function.BooleanSupplier; -import java.util.function.UnaryOperator; - -import edu.wpi.first.util.function.BooleanConsumer; -import edu.wpi.first.wpilibj.DriverStation; -import edu.wpi.first.wpilibj2.command.Command; -import edu.wpi.first.wpilibj2.command.button.Trigger; - -/** - * Class for getting input from a button. This class has methods and static - * methods to modify and compose {@link Button}s into a new - * {@link Button}. - */ -public class Button { - public static class Key { - } - - private final BooleanSupplier value; - - public Button(final BooleanSupplier value) { - this.value = value; - } - - public static Button fromDriverStation(final int deviceId, final int buttonId) { - return new Button(() -> DriverStation.getStickButton(deviceId, buttonId)); - } - - public static Button always(final boolean value) { - return new Button(() -> value); - } - - public boolean get() { - return value.getAsBoolean(); - } - - public Button whenPressed(final Command command) { - new Trigger(value).onTrue(command); - return this; - } - - public Button whileHeld(final Command command) { - new Trigger(value).whileTrue(command); - return this; - } - - public Button toggleWhenPressed(final Command command) { - new Trigger(value).toggleOnTrue(command); - return this; - } - - public Button map(final UnaryOperator body) { - return new Button(() -> body.apply(get())); - } - - public Button tap(final BooleanConsumer body) { - return map(value -> { - body.accept(value); - return value; - }); - } - - /** - * Inverts the input; similar to a boolean `!` - * - * @return A new inverted input - */ - public Button inverted() { - return map(value -> !value); - } - - /** - * Checks that all inputs are true; similar to a boolean `&&` - * - * @param first The first input - * @param rest The rest of the inputs - * @return A new input that is only true when all of the passed inputs are true - */ - public static Button all(final Button first, final Button... rest) { - // The first argument is explicit to prevent being given empty arrays - - return new Button(() -> { - // Check each input individually - // As soon as one input is false, return false - - if (first != null && first.get() == false) { - return false; - } - - for (final var input : rest) { - if (input != null && input.get() == false) { - return false; - } - } - - // All inputs are true at this point, so return true - return true; - }); - } - - /** - * Checks that any input is true; similar to a boolean `||` - * - * @param first The first input - * @param rest The rest of the inputs - * @return A new input that is true when any of the passed inputs are true - */ - public static Button any(final Button first, final Button... rest) { - // The first argument is explicit to prevent being given empty arrays - - return new Button(() -> { - // Check each input individually - // As soon as one input is true, return true - - if (first != null && first.get()) { - return true; - } - - for (final var input : rest) { - if (input != null && input.get()) { - return true; - } - } - - // All inputs are false at this point, so return false - return false; - }); - - } -} diff --git a/java/org/assabet/aztechs157/numbers/Deadzone.java b/java/org/assabet/aztechs157/numbers/Deadzone.java deleted file mode 100644 index 62a1578..0000000 --- a/java/org/assabet/aztechs157/numbers/Deadzone.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.assabet.aztechs157.numbers; - -import org.assabet.aztechs157.input.values.Axis; - -public class Deadzone { - public final Range deadzone; - public final Range full; - public final RangeConverter leftConverter; - public final RangeConverter rightConverter; - - public static Deadzone forAxis(final Range deadzone) { - return new Deadzone(deadzone, Axis.kDeviceDefaultRange, 0); - } - - public Deadzone(final Range deadzone, final Range full, final double fullCenter) { - this.deadzone = deadzone; - this.full = full; - - final var leftFull = new Range(full.start(), fullCenter); - final var leftDeadzone = new Range(full.start(), deadzone.start()); - this.leftConverter = new RangeConverter(leftDeadzone, leftFull); - - final var rightFull = new Range(fullCenter, full.end()); - final var rightDeadzone = new Range(deadzone.end(), full.end()); - this.rightConverter = new RangeConverter(rightDeadzone, rightFull); - } - - public double apply(final double input) { - if (deadzone.contains(input)) { - return 0; - } else if (leftConverter.inputRange.contains(input)) { - return leftConverter.convert(input); - } else if (rightConverter.inputRange.contains(input)) { - return rightConverter.convert(input); - } - - throw new Error("Attempted to apply deadzone to input outside of full range " - + full.start() + " to " + full.end()); - } -} diff --git a/java/org/assabet/aztechs157/numbers/Range.java b/java/org/assabet/aztechs157/numbers/Range.java deleted file mode 100644 index a69bb32..0000000 --- a/java/org/assabet/aztechs157/numbers/Range.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.assabet.aztechs157.numbers; - -public record Range(double start, double end) { - - public boolean contains(final double value) { - return start <= value && value <= end; - } - - public double range() { - return end - start; - } - - public double clamp(final double value) { - if (value < start) { - return start; - } else if (value > end) { - return end; - } else { - return value; - } - } - - public double limitMotionWithinRange(final double speed, final double currentPosition) { - if (speed > 0 && currentPosition > end) { - return 0; - } else if (speed < 0 && currentPosition < start) { - return 0; - } else { - return speed; - } - } - - public RangeConverter convertingTo(final Range output) { - return new RangeConverter(this, output); - } -} diff --git a/java/org/assabet/aztechs157/numbers/RangeConverter.java b/java/org/assabet/aztechs157/numbers/RangeConverter.java deleted file mode 100644 index edb424e..0000000 --- a/java/org/assabet/aztechs157/numbers/RangeConverter.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.assabet.aztechs157.numbers; - -public class RangeConverter { - public final Range inputRange; - public final Range outputRange; - public final double scaleFactor; - - public RangeConverter(final Range inputRange, final Range outputRange) { - this.inputRange = inputRange; - this.outputRange = outputRange; - this.scaleFactor = outputRange.range() / inputRange.range(); - } - - public double convert(final double inputValue) { - // Shift to zero based input range - final var basedInput = inputValue - inputRange.start(); - - // Scale the zero based input - final var scaled = basedInput * scaleFactor; - - // Shift from zero based to output range - final var outputValue = scaled + outputRange.start(); - - return outputValue; - } -} diff --git a/main/deploy/music/BuddyHollyRiff.chrp b/main/deploy/music/BuddyHollyRiff.chrp deleted file mode 100644 index 9489fddede232cc8e27c2027e43a841f0bec01e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmZQzU|?iq;9#(0HevvQ4?w(&$p}n8U}OM`gXjxP3=B(vYC!Y>W(Ec^79%jdfEA(! fL{DI2V3-Wl3!)p?85r__Y!KZb#=v0x;s1XCZ37bT diff --git a/main/deploy/music/MoreCowbell.chrp b/main/deploy/music/MoreCowbell.chrp deleted file mode 100644 index e5baa9f296f1e287ec724a6fc3554f186ae2fd33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 zcmX|lCmg+LRpl>AQsAC zASr`b?xGA9Wl=cC+wrf{IlY~po__xaKw1P1s73A)59 zB0WXTG7m(6Q)-{NE(2Jno|!-BW0|3UO>fD<-~1hVBstXBZ04=ZX0B}J%I4h6 zY|hH&tZcUGo2|0hCYjB)kJ)UsgV`#Zt+IJ)j(IAZr?MGp2QySQLuGSQ-`teVO}m+! zb~Cq04C>7P?);9~H=IP%KSRCyhLz2*n;kRMyYE)n4An71z57;`%}^aP)Vmofo0~f3 wrgz_@vbm{aZhH3}Dw~@+=B9Vwp0c?Ovtw?`2fVu?-kCaPsCP3wpZxjx1!8}jW&i*H diff --git a/main/deploy/music/TOTTFIY.chrp b/main/deploy/music/TOTTFIY.chrp deleted file mode 100644 index 52411f120b597c1db52307317bfc8dbc78303f17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24844 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 diff --git a/main/deploy/music/adams.chrp b/main/deploy/music/adams.chrp deleted file mode 100644 index f5be11b62447405fc1d2eb266161bd54c6822b9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2332 zcmXw)dra147=|CU14%iQBuIyvtb}l+MOKWo2+Obo>%g!`B~8OHOEb;J@{mYbPRlTi zteK>99hhX1WSi62T$U3plj(9U7SrisE;pB>`|_4Q?(e$y?*4th=X>AheZGk3)h9lP znyWtk%!X;I6qxXPIi9IwGrt9orgb5nW4tM7Gh=^60&cOUE*8@*V{N7Vyoi>!;+iz4v zi$o2uVzl!x^;YN8#8!!XMsCCbiF}*5_;%-E&KT$6QHk@)yECFw;#pXGm!E}&d9HuF zcvdRwRTX>gjhI`YcgVwE?~5qvT^0MqszR^BBjY2gm1!4i?vGfn?}vXq5IX;==n(&T zFk*u;UE(K25#Pzf|0X(fLEQR~*Ws0qxP}CAyTsnY0mXiAvY7suGeg9E5_Q7NCtPQi zcvxZ`-d5r|bHx)9b;7Zwu3?;5^px`x#q$z%!Y9l8t`hO`XZ$^I>SSli#iS{Iw!c_8 z)p`tKI&o_GCl(=6|E zgZTIht_^-&=}e3UgUhdt{Eb+&#O#RB4G_h4; z9S(1F4H@DAiM?$TbGG@tw}^S)I0HK+&I=ZP>pI7aXC>C*qs^|fSnQU#oAJH=Q+Bw9 zGI8b)&cl?Qm-<1>-sN|V6bpXx_rTJ<&P)>L{NiU}{cqm$H3v1@4_!Jh@w9aDyhJk8 z28(|8_iQ<==l<||(-ECZyUt9Rl*`nISJ=bs1p9)kBOdN&4@>obM!tS<#O8E+xNWHY z-i(MtH`>ELN7$ds)_LXF!)r#_7w2n##@fRf_t-O&nZLYi?F7$TJad&9ir-c2nTcmM zG6(TzNnA*y<2w} z-*cDo9n1B9vBK+JB6pSbr62M%^!=>8vRs1XeS diff --git a/main/deploy/music/bluetoothdeviceisreadytopair.chrp b/main/deploy/music/bluetoothdeviceisreadytopair.chrp deleted file mode 100644 index 6bb6ad6466bc2d76c4a90a45460897e931341dd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2352 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 Tt?f@kIwy*8nu}uQpS=2iJlt`` diff --git a/main/deploy/music/entry.chrp b/main/deploy/music/entry.chrp deleted file mode 100644 index b3848635bc7ab6f8a612e8dc1f0498bd633bb7ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17798 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 W7`fH_NCrdaYmp4b`;UM9@BaY#oD0bS diff --git a/main/deploy/music/exorcist.chrp b/main/deploy/music/exorcist.chrp deleted file mode 100644 index b8d1d6fd8b1812a769323397c8b8bc95f9cb44c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4466 zcmXBY1yGf35QgFJpxBDt-5tm7ZY=EX#zHZ%J5dx9ySqEEu)7<(`?p2;@AYx!nakPP zec$~~U^tHB@^JiIE~mQ7?bxrKWDmb@hF&h`Up+pCk$2Qj;1Cbh1F%38#~DxEjW3AJ znjuluvk-ke9VfPj+o_K+qNyGe50RSGL$P0U)%`JN4Bcgh6PtaA!7*iFR0vt&*zV8WSf|e-b=Htlu1-T>Fo}!YMRc z1m6(rd5cR^YKLXmIF;&VoYdMsE*>S;e+&nv(OrWuZ(7af!>7c0p5gp->M`r2SG_KJ zX3!4Na6hsB1K1~{`u#9lCe_V*#6BnYF(|WUXJWN1>Zy)@iM@uAxFf6TJF#0f?Qf>b zu6laBPVBwDfs=D+b_$lysh$e>o!EPAZpfwjMr@Z`v+Xf?9@SIe1!8+%#4&j_I~Ggi zQ;+$9*q$G8Wq#FHVeaJj{(MWYOlGyv=H0EbGvHo4yy@~ep#SBd~n-Omk>oKP^Q++B{ zXs&ui{6Xx@pSY=o>YK4cOP$#fQ?}Bqd6C$emvC%r?LQ7nwo$zlej+t_Uq0jNwyK*g z+Uc&An6SNO6X7XhXP(Ak9dy@lEYwl;!uXolp623CsxQHYowa8pjNL`EaqtMSGmqkc zuBw~4yQ!WB9}_$C3C``V`aG=dt266h)E=7k#C^ohG<)^b{=G3vFV(Z+U1HCE4`=jN zJqWAz(OqT)vCr)v+~%jA?bxNSdb(oTeyXR#Ys9`g*Kv}+>So#g>Mw_1iS70c*ALMC z8?fy_&9=j2gVbZ5BeuhN95q<=(O7JV_Aid_iJkcYR|M#;mDp^kW=*eQ>WPnG#9q%6 zIApl$0a##!c5vehVrQBmBh|kUeMYHXA7hNx{xR_ov1bp(eq+?*k2%L`2Q!@5nGZ2| zoc5n>j#u3qT@!Sd2ks{J?56KT_4L4ulXO=myhZHH+c<5qW&^R(6vr7F&FxgiU&MYs zo13TdT10U>Td?Ca^>o5ifjToaUM4ns1;^MoIx}6bNc((R0f^SG~c6*CU=kQ+g`(@a8u4c_R^K@5SJWA}$ zV>ocWW(Q&31*+%6r^NPrhVw%-Yt~t)p1SC{NcCvApV*lPu+L(h>4({tsBYdPcIJHy zTB_NZSZ$els^ec``$yuA<*M(*ZY%WcX1bNCr^oBWp8W<+UZvS7Sbnv7D&TiwJ?4fr zs&B-0YqdjrOukO_6nKGH|3w_LUiGn9VuSWKKM?yoe8iO-)w2qlZ_*AeFu`Wk6XHo? z@0}U2MfIWR-m1F_;!9%B{t6duQ_o^-uw6Y3G1d;%%}`=H97g}0s`tlSyVRc>9}#s?UY2cuuq>uDY!)_)NFF6pkmnEkS5bKnDFJ>fX(ih6>v##PnL zNMfG{=Nf;1AlAPNyI)toFJ`!*dPclS?E7d=xvANySmBm>D&h}fpNF5g>9*>dvBMqh z-w{*ZRo%Qu?7MRb$KKQII4pTzJ*Dsyv7XPk`hn_Zi*W7G5)(dDJrSNF)_)p@JyLx* z7J97x3*&2I&u%V$qMjw#@Tqoagt4Eg9tV#Q`#v7U0nb%8bHC7CdGIl@XMcioU#e#w z)_$eC>R{B@s(a!-Vtbms-l*Oiv%J-wS@ABhJ@4U+cj^hks_#`dBZ$3se{kCeow*&m zd{n(Frv0Qd)8RE@XI{ripVecQ{ZIRs!>`27{D$kl=-D@5+pns(!(`udmwArZv!BON z-_tFdi~a(@iC0po+offgn9z7z#rA!_=4D(X2@Ti zxe$FKRj-dR9M`|kZA?5w?95Q?$Nz!YtUu=TaQ)lg3@289h`~`@|K9i6STm~X-stjl g{d?~`a5u4MH+`eI98Z3R*uN=qdGlv{iHOMm0a;hbV*mgE diff --git a/main/deploy/music/output.chrp b/main/deploy/music/output.chrp deleted file mode 100644 index ca4e2270820e2090d33c890531961fbc9dd06297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4704 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 diff --git a/main/deploy/music/super_mario.chrp b/main/deploy/music/super_mario.chrp deleted file mode 100644 index 16f8649535a01556ba2658c05c0f13233296288e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2374 zcmeH|ze|;I7{#CKuPie&y9FW+LKH1R4GuLl6eOY0AZU<-Tw4T}hJpwpgd%8YD2kxK zp{2p0B|<33B?zP-!KJ~$Fc1d?7s<}Y=X;?4pyggT_k6hb@V=LGUcNUXDlO3yr=qvK zw>8v)*R1rQQrq*3m54zxzABNyA2wtLKi!xa{HsI;f4)!OiC@UiwMM+wbf<>4WZzU#TX~$-9mv-;%FL9gVdZJ{~dJlbz7#RjFCOfnGPI&yjsT zE#1=RfO;fDpUV;%`n)62KYe~|O8zA8Y)-}}3ghnz<4rA@8Iiv!ye+@1J?NHQeoIv` zyF8W_bzgSr*B)fp<(ou?U2aNb*rlpH$gs=U!Q^Z5w}tVY!uU{oX7E>qH{=%%<>yc2 zD-zEh`_4!MV)i|$UDtG9_We?}X5T4^4EwfgS2FB7SGM-PT+{o)-WT@1@5SC1_P((9 zT^D=b`??n|wt>A7?2TY=1bZXc8^PWP_C}AyY&5BUVfPHXXV^W%?iqH^uzQBxGhMl7 zo;UaWQtY0|xMwo%nT&fT diff --git a/main/deploy/music/tetris.chrp b/main/deploy/music/tetris.chrp deleted file mode 100644 index 88363c33232c94aa3eab2888b80b5419b3323183..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1596 zcmXYwZA_JQ7{;%2j_)TAr&7^UJei0T3Koj^0uP>!N~lnoFJ(eyqGfQ(7c>*deCdNL z7p|Ah3177Z5RZ2;^)-<;U{qAl*Jo{be+V$N3`?>G`krWDP zk6OYh4H7@XQhBIQBSKOf-4`lT820i+!-1~DpCeL5IH|wj#lfEM*1z}((5W#4QxnA+01_fth>X%w+2?;>Hf+|(pvN<%%=(#PnOb=K;&}^8<_3tf!v1!s^@;P@&)9<$4ij;skdG3#cS!8U#8SpAk z3w4G}mj((fUo7QInP{ss48~@7|AK$;M9E)+J@?pNlDY!Fo#}J#y;u6PP^zW>pWrX} zmj4cZHp}Xy)CE7E?fG*>+y}Jns|%i*igZ_zKH!U_Iw&{EqA{b){(J( zYT*23?ys(3k4rpX370Q*e<55##=bXz`49ScEv}T7Rr!1Zn0mndB3MGk=2-wou5ds1 zA@;c3^Aq9Zhut3o$CI)99ESs|{oJuD+3zavCk{v7@Q1?KBYvL+e|*gI*U|ltdj2x} zdyV_Q!AoRXnP(3?`?#NbaV`6;_I`TcuQl#>!}DaU|1S9cQ|^EL1bcka^QYh!>)byH zKP6-HZ-=cL{oIcA?6=nYX@?(faQ`SgLB{6a26sK{{@YKp$7ekM8a%Yg{eAEN8JmAI ztbfkWeWi~7b-nk~4ELtpZ-9+ttp7Azy4C%S&r^G|=d0nmE$**?YslFAt6)`wpSx-s z_W^D9*}T#n?l0QT-qGnuQURQ>%l+aP*!xcJKOYvp=>8O#N2VkaC;|KS__6`w6{{RPcH`o9G diff --git a/main/deploy/pathplanner/autos/1m backward auto.auto b/main/deploy/pathplanner/autos/1m backward auto.auto deleted file mode 100644 index e988db7..0000000 --- a/main/deploy/pathplanner/autos/1m backward auto.auto +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m backward" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/main/deploy/pathplanner/autos/1m forward & backwards x25.auto b/main/deploy/pathplanner/autos/1m forward & backwards x25.auto deleted file mode 100644 index e2f253c..0000000 --- a/main/deploy/pathplanner/autos/1m forward & backwards x25.auto +++ /dev/null @@ -1,169 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 2.0, - "y": 7.0 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/main/deploy/pathplanner/autos/1m forward & backwards.auto b/main/deploy/pathplanner/autos/1m forward & backwards.auto deleted file mode 100644 index 79adb64..0000000 --- a/main/deploy/pathplanner/autos/1m forward & backwards.auto +++ /dev/null @@ -1,302 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/main/deploy/pathplanner/autos/1m forward auto.auto b/main/deploy/pathplanner/autos/1m forward auto.auto deleted file mode 100644 index de1be04..0000000 --- a/main/deploy/pathplanner/autos/1m forward auto.auto +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m forward" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/main/deploy/pathplanner/autos/1m right auto.auto b/main/deploy/pathplanner/autos/1m right auto.auto deleted file mode 100644 index 69e6f18..0000000 --- a/main/deploy/pathplanner/autos/1m right auto.auto +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m right" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/main/deploy/pathplanner/autos/New Auto.auto b/main/deploy/pathplanner/autos/New Auto.auto index 9e7a7f3..70b7ab2 100644 --- a/main/deploy/pathplanner/autos/New Auto.auto +++ b/main/deploy/pathplanner/autos/New Auto.auto @@ -1,12 +1,5 @@ { - "version": 1.0, - "startingPose": { - "position": { - "x": 2.0, - "y": 7.0 - }, - "rotation": 0 - }, + "version": "2025.0", "command": { "type": "sequential", "data": { @@ -14,12 +7,13 @@ { "type": "path", "data": { - "pathName": "test" + "pathName": "Example Path" } } ] } }, + "resetOdom": true, "folder": null, "choreoAuto": false } \ No newline at end of file diff --git a/main/deploy/pathplanner/navgrid.json b/main/deploy/pathplanner/navgrid.json index bab0da9..23e0db9 100644 --- a/main/deploy/pathplanner/navgrid.json +++ b/main/deploy/pathplanner/navgrid.json @@ -1 +1 @@ -{"field_size":{"x":16.54,"y":8.21},"nodeSizeMeters":0.3,"grid":[[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true]]} \ No newline at end of file +{"field_size":{"x":17.548,"y":8.052},"nodeSizeMeters":0.3,"grid":[[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true]]} \ No newline at end of file diff --git a/main/deploy/pathplanner/paths/1m Back and forth.path b/main/deploy/pathplanner/paths/1m Back and forth.path deleted file mode 100644 index add093c..0000000 --- a/main/deploy/pathplanner/paths/1m Back and forth.path +++ /dev/null @@ -1,103 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 2.0, - "y": 7.0 - }, - "prevControl": null, - "nextControl": { - "x": 2.1, - "y": 7.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 3.0, - "y": 7.0 - }, - "prevControl": { - "x": 2.9, - "y": 7.0 - }, - "nextControl": { - "x": 3.1, - "y": 7.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 2.0, - "y": 7.0 - }, - "prevControl": { - "x": 1.9, - "y": 7.0 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [ - { - "name": "Wait", - "waypointRelativePos": 1.0, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "wait", - "data": { - "waitTime": 0.5 - } - } - ] - } - } - }, - { - "name": "Wait 2", - "waypointRelativePos": 0, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "wait", - "data": { - "waitTime": 0.5 - } - } - ] - } - } - } - ], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/main/deploy/pathplanner/paths/1m backward.path b/main/deploy/pathplanner/paths/1m backward.path deleted file mode 100644 index fa735aa..0000000 --- a/main/deploy/pathplanner/paths/1m backward.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 2.0, - "y": 5.59 - }, - "prevControl": null, - "nextControl": { - "x": 2.1, - "y": 5.59 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 1.0, - "y": 5.59 - }, - "prevControl": { - "x": 1.1, - "y": 5.59 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/main/deploy/pathplanner/paths/1m forward.path b/main/deploy/pathplanner/paths/1m forward.path deleted file mode 100644 index 544f728..0000000 --- a/main/deploy/pathplanner/paths/1m forward.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 1.0, - "y": 5.589805823486292 - }, - "prevControl": null, - "nextControl": { - "x": 1.9999999999999967, - "y": 5.589805823486292 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 2.0, - "y": 5.589805823486292 - }, - "prevControl": { - "x": 1.0, - "y": 5.589805823486292 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/main/deploy/pathplanner/paths/1m left.path b/main/deploy/pathplanner/paths/1m left.path deleted file mode 100644 index 1482a76..0000000 --- a/main/deploy/pathplanner/paths/1m left.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 1.0, - "y": 5.59 - }, - "prevControl": null, - "nextControl": { - "x": 1.0, - "y": 6.502346398657132 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 1.0, - "y": 6.59 - }, - "prevControl": { - "x": 0.9999999999999999, - "y": 5.59 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/main/deploy/pathplanner/paths/1m right.path b/main/deploy/pathplanner/paths/1m right.path deleted file mode 100644 index 88a7b65..0000000 --- a/main/deploy/pathplanner/paths/1m right.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 1.0, - "y": 5.59 - }, - "prevControl": null, - "nextControl": { - "x": 1.0, - "y": 5.49 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 1.0, - "y": 4.59 - }, - "prevControl": { - "x": 1.0, - "y": 4.54 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/main/deploy/pathplanner/paths/Example Path.path b/main/deploy/pathplanner/paths/Example Path.path index f745d1b..7b84c0a 100644 --- a/main/deploy/pathplanner/paths/Example Path.path +++ b/main/deploy/pathplanner/paths/Example Path.path @@ -1,26 +1,26 @@ { - "version": 1.0, + "version": "2025.0", "waypoints": [ { "anchor": { - "x": 2.0, - "y": 7.0 + "x": 4.0, + "y": 6.0 }, "prevControl": null, "nextControl": { - "x": 3.0, - "y": 7.0 + "x": 5.0, + "y": 6.0 }, "isLocked": false, "linkedName": null }, { "anchor": { - "x": 4.0, + "x": 5.0, "y": 6.0 }, "prevControl": { - "x": 3.0, + "x": 4.0, "y": 6.0 }, "nextControl": null, @@ -30,23 +30,25 @@ ], "rotationTargets": [], "constraintZones": [], + "pointTowardsZones": [], "eventMarkers": [], "globalConstraints": { - "maxVelocity": 5.0292, + "maxVelocity": 3.0, "maxAcceleration": 3.0, "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 + "maxAngularAcceleration": 720.0, + "nominalVoltage": 12.0, + "unlimited": false }, "goalEndState": { "velocity": 0, - "rotation": 0, - "rotateFast": false + "rotation": 0.0 }, "reversed": false, "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 + "idealStartingState": { + "velocity": 0, + "rotation": 0.0 }, "useDefaultConstraints": true } \ No newline at end of file diff --git a/main/deploy/pathplanner/paths/Stephen.path b/main/deploy/pathplanner/paths/Stephen.path deleted file mode 100644 index 9126da3..0000000 --- a/main/deploy/pathplanner/paths/Stephen.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 2.0, - "y": 7.0 - }, - "prevControl": null, - "nextControl": { - "x": 3.0, - "y": 7.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 7.439971575099845, - "y": 5.028486410249174 - }, - "prevControl": { - "x": 7.182700177366168, - "y": 6.2563726267053665 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": -33.02386755579669, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/main/deploy/pathplanner/paths/test.path b/main/deploy/pathplanner/paths/test.path deleted file mode 100644 index 16dc425..0000000 --- a/main/deploy/pathplanner/paths/test.path +++ /dev/null @@ -1,68 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 2.0, - "y": 7.0 - }, - "prevControl": null, - "nextControl": { - "x": 3.0, - "y": 7.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 6.200391204201211, - "y": 6.572114796651245 - }, - "prevControl": { - "x": 5.200391204201211, - "y": 6.572114796651245 - }, - "nextControl": { - "x": 7.200391204201211, - "y": 6.572114796651245 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 7.486748192869604, - "y": 4.654273468091096 - }, - "prevControl": { - "x": 7.694394331808605, - "y": 5.256522421876753 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/main/java/frc/robot/Inputs.java b/main/java/frc/robot/Inputs.java deleted file mode 100644 index 26d5bfa..0000000 --- a/main/java/frc/robot/Inputs.java +++ /dev/null @@ -1,98 +0,0 @@ -// 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; - -import org.assabet.aztechs157.input.layouts.DynamicLayout; -import org.assabet.aztechs157.input.layouts.Layout; -import org.assabet.aztechs157.input.layouts.MapLayout; -import java.util.function.DoubleSupplier; -import org.assabet.aztechs157.input.models.XboxOne; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; -import org.assabet.aztechs157.numbers.Deadzone; -import org.assabet.aztechs157.numbers.Range; - -import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard; -import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; -import frc.robot.Constants.ControllerConstants; - -/** Add your docs here. */ -public class Inputs extends DynamicLayout { - - public static final Axis.Key precisionDrive = new Axis.Key(); - - ////////////////////////////////////////////////////////// - // HERE'S AN EXAMPLE OF USING ADDING NEW BUTTONS/AXIS - ///////////////////////////////////////////////////////// - - // public static final Button.Key resetGyro = new Button.Key(); - - // public static final Button.Key driveToSpeaker = new Button.Key(); - // public static final Button.Key driveToAmp = new Button.Key(); - // public static final Button.Key autoIntake = new Button.Key(); - - // public static final Button.Key intake = new Button.Key(); - // public static final Button.Key loadNote = new Button.Key(); - // public static final Button.Key eject = new Button.Key(); - - // public static final Button.Key highShotSpinUp = new Button.Key(); - // public static final Button.Key lowShotSpinUp = new Button.Key(); - - // public static final Button.Key highShot = new Button.Key(); - // public static final Button.Key lowShot = new Button.Key(); - // public static final Button.Key pass = new Button.Key(); - - // public static final Button.Key liftHanger = new Button.Key(); - // public static final Button.Key retractHanger = new Button.Key(); - // public static final Button.Key retractHangerPin = new Button.Key(); - // public static final Button.Key extendHangerPin = new Button.Key(); - - public static Inputs createFromChooser() { - final SendableChooser chooser = new SendableChooser<>(); - chooser.setDefaultOption("xbox", doubleXBOXLayout()); - Shuffleboard.getTab("Driver").add("Layout Choose", chooser); - - return new Inputs(chooser); - } - - private Inputs(final SendableChooser chooser) { - super(chooser::getSelected); - } - - private static Layout doubleXBOXLayout() { - - final var layout = new MapLayout(); - final var driver = new XboxOne(ControllerConstants.DRIVER_CONTROLLER_PORT); - final var operator = new XboxOne(ControllerConstants.OPERATOR_CONTROLLER_PORT); - - layout.assign(precisionDrive, driver.leftTriggerHeld.map(Deadzone.forAxis(new Range(0.0, 0.05))::apply).scaledBy(0.7)); - - ////////////////////////////////////////////////////////// - // HERE'S AN EXAMPLE OF USING CONTROLER LAYOUT OPTIONS - ///////////////////////////////////////////////////////// - - // layout.assign(driveToSpeaker, operator.a); - // layout.assign(driveToAmp, operator.b); - // layout.assign(resetGyro, driver.start); - // layout.assign(autoIntake, operator.leftBumper); - - // layout.assign(intake, driver.leftBumper); - // layout.assign(loadNote, operator.x); - - // layout.assign(highShotSpinUp, operator.rightBumper); - // layout.assign(lowShotSpinUp, operator.leftBumper); - - // layout.assign(highShot, new Button(() -> driver.rightTriggerHeld.get() > 0.2)); - // layout.assign(lowShot, driver.rightBumper); - // layout.assign(pass, operator.a); - // layout.assign(eject, operator.b); - - // layout.assign(liftHanger, operator.pov.up); - // layout.assign(retractHanger, operator.pov.down); - - return layout; - } - -} diff --git a/main/java/frc/robot/Robot.java b/main/java/frc/robot/Robot.java index 0556048..6973bbe 100644 --- a/main/java/frc/robot/Robot.java +++ b/main/java/frc/robot/Robot.java @@ -11,10 +11,9 @@ public class Robot extends TimedRobot { private Command m_autonomousCommand; - private RobotContainer m_robotContainer; + private final RobotContainer m_robotContainer; - @Override - public void robotInit() { + public Robot() { m_robotContainer = new RobotContainer(); } diff --git a/main/java/frc/robot/RobotContainer.java b/main/java/frc/robot/RobotContainer.java index 5718dfb..0cd4e30 100644 --- a/main/java/frc/robot/RobotContainer.java +++ b/main/java/frc/robot/RobotContainer.java @@ -4,127 +4,83 @@ package frc.robot; -import java.util.HashMap; -import java.util.Map; - -import org.assabet.aztechs157.input.layouts.Layout; - -import static edu.wpi.first.units.Units.*; - -import com.ctre.phoenix6.Orchestra; +import static edu.wpi.first.units.Units.MetersPerSecond; +import static edu.wpi.first.units.Units.RadiansPerSecond; +import static edu.wpi.first.units.Units.RotationsPerSecond; import com.ctre.phoenix6.swerve.SwerveModule.DriveRequestType; import com.ctre.phoenix6.swerve.SwerveRequest; - import com.pathplanner.lib.auto.AutoBuilder; +import edu.wpi.first.math.MathUtil; import edu.wpi.first.math.geometry.Rotation2d; 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.button.CommandXboxController; -import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine.Direction; - import frc.robot.generated.TunerConstants; -import frc.robot.subsystems.DriveSystem; -import edu.wpi.first.wpilibj2.command.Subsystem; -import frc.robot.data.LoggingSystem; +import frc.robot.subsystems.CommandSwerveDrivetrain; +import frc.robot.subsystems.Constants.ControllerConstants; public class RobotContainer { - private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed - private double MaxAngularRate = RotationsPerSecond.of(0.75).in(RadiansPerSecond); // 3/4 of a rotation per second max angular velocity - private Map SystemMap = new HashMap(); - - private final CommandXboxController joystick = new CommandXboxController(0); // My joystick - public final DriveSystem drivetrain = TunerConstants.createDrivetrain(); // My drivetrain - - {SystemMap.put("Drive",drivetrain);} - private final Layout inputs = Inputs.createFromChooser(); - private final LoggingSystem loggingSystem = new LoggingSystem(SystemMap); - private final SendableChooser autoChooser; - -/* Setting up bindings for necessary control of the swerve drive platform */ -private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric() -.withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1) // Add a 10% deadband -.withDriveRequestType(DriveRequestType.OpenLoopVoltage); // Use open-loop control for drive motors -private final SwerveRequest.SwerveDriveBrake brake = new SwerveRequest.SwerveDriveBrake(); -private final SwerveRequest.PointWheelsAt point = new SwerveRequest.PointWheelsAt(); -private final SwerveRequest.RobotCentric forwardStraight = new SwerveRequest.RobotCentric() -.withDriveRequestType(DriveRequestType.OpenLoopVoltage); - - private final Telemetry logger = new Telemetry(MaxSpeed); - - // Slew Rate Limiters to limit acceleration of joystick inputs - // private final SlewRateLimiter xLimiter = new SlewRateLimiter(25); - // private final SlewRateLimiter yLimiter = new SlewRateLimiter(25); - // private final SlewRateLimiter rotLimiter = new SlewRateLimiter(1570); - - private Orchestra soundSystem = new Orchestra(); - - public RobotContainer() { - configureBindings(); - - autoChooser = AutoBuilder.buildAutoChooser("NothingAuto"); - SmartDashboard.putData("Auto Chooser", autoChooser); - for(int i = 0; i<4;i++){ - soundSystem.addInstrument(drivetrain.getModule(i).getDriveMotor(), 0); - soundSystem.addInstrument(drivetrain.getModule(i).getSteerMotor(), 1); - } - soundSystem.loadMusic("music/e1m1.chrp"); - } - - /** - * Use this to pass the autonomous command to the main {@link Robot} class. - * - * @return the command to run in autonomous - */ - public Command getAutonomousCommand() { - // An example command will be run in autonomous - return autoChooser.getSelected(); - } + private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed + private double MaxAngularRate = RotationsPerSecond.of(1).in(RadiansPerSecond); // 1 of a rotation per second max angular velocity - public double modifySpeed(final double speed) { - final var modifier = 1 - inputs.axis(Inputs.precisionDrive).get(); - return speed * modifier; -} + private final SendableChooser autoChooser; - private void configureBindings() { - // Note that X is defined as forward according to WPILib convention, - // and Y is defined as to the left according to WPILib convention. - drivetrain.setDefaultCommand( // Drivetrain will execute this command periodically - drivetrain.applyRequest(() -> drive.withVelocityX(-joystick.getLeftY() /* TODO: check inversion */ * modifySpeed(MaxSpeed)) // Drive forward with - // negative Y (forward) - .withVelocityY(-joystick.getLeftX() /* TODO: check inversion */ * modifySpeed(MaxSpeed)) // Drive left with negative X (left) - .withRotationalRate(-joystick.getRightX() /* TODO: check inversion */ * MaxAngularRate) // Drive counterclockwise with negative X (left) - )); + /* Setting up bindings for necessary control of the swerve drive platform */ + private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric() + .withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1) // Add a 10% deadband + .withDriveRequestType(DriveRequestType.OpenLoopVoltage); // Use open-loop control for drive motors + private final SwerveRequest.SwerveDriveBrake brake = new SwerveRequest.SwerveDriveBrake(); + private final SwerveRequest.PointWheelsAt point = new SwerveRequest.PointWheelsAt(); + + private final Telemetry logger = new Telemetry(MaxSpeed); + + private final CommandXboxController joystick = new CommandXboxController(0); - joystick.a().whileTrue(drivetrain.applyRequest(() -> brake)); - joystick.b().whileTrue(drivetrain.applyRequest(() -> + public final CommandSwerveDrivetrain drivetrain = TunerConstants.createDrivetrain(); + + public RobotContainer() { + configureBindings(); + + autoChooser = AutoBuilder.buildAutoChooser("New Auto"); + + SmartDashboard.putData("Auto Chooser", autoChooser); + } + + private void configureBindings() { + // Note that X is defined as forward according to WPILib convention, + // and Y is defined as to the left according to WPILib convention. + drivetrain.setDefaultCommand( + // Drivetrain will execute this command periodically + drivetrain.applyRequest(() -> + drive.withVelocityX(MathUtil.applyDeadband(-joystick.getLeftY(), ControllerConstants.LEFT_Y_DEADBAND) * MaxSpeed) // Drive forward with negative Y (forward) + .withVelocityY(MathUtil.applyDeadband(-joystick.getLeftX(), ControllerConstants.LEFT_X_DEADBAND) * MaxSpeed) // Drive left with negative X (left) + .withRotationalRate(MathUtil.applyDeadband(-joystick.getRightX(), ControllerConstants.RIGHT_X_DEADBAND) * MaxAngularRate) // Drive counterclockwise with negative X (left) + ) + ); + + joystick.a().whileTrue(drivetrain.applyRequest(() -> brake)); + joystick.b().whileTrue(drivetrain.applyRequest(() -> point.withModuleDirection(new Rotation2d(-joystick.getLeftY(), -joystick.getLeftX())) )); - joystick.pov(0).whileTrue(drivetrain.applyRequest(() -> - forwardStraight.withVelocityX(0.5).withVelocityY(0)) - ); - joystick.pov(180).whileTrue(drivetrain.applyRequest(() -> - forwardStraight.withVelocityX(-0.5).withVelocityY(0)) - ); - - // Run SysId routines when holding back/start and X/Y. - // Note that each routine should be run exactly once in a single log. - joystick.back().and(joystick.y()).whileTrue(drivetrain.sysIdDynamic(Direction.kForward)); - joystick.back().and(joystick.x()).whileTrue(drivetrain.sysIdDynamic(Direction.kReverse)); - joystick.start().and(joystick.y()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kForward)); - joystick.start().and(joystick.x()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kReverse)); - - // reset the field-centric heading on left bumper press - joystick.leftBumper().onTrue(drivetrain.runOnce(() -> drivetrain.seedFieldCentric())); - - joystick.start().onTrue(drivetrain.runOnce(()-> {soundSystem.play();})); - joystick.back().onTrue(drivetrain.runOnce(()->{soundSystem.pause();})); - joystick.y().onTrue(drivetrain.runOnce(()->{soundSystem.stop();})); - - drivetrain.registerTelemetry(logger::telemeterize); - } - + // Run SysId routines when holding back/start and X/Y. + // Note that each routine should be run exactly once in a single log. + // joystick.back().and(joystick.y()).whileTrue(drivetrain.sysIdDynamic(Direction.kForward)); + // joystick.back().and(joystick.x()).whileTrue(drivetrain.sysIdDynamic(Direction.kReverse)); + // joystick.start().and(joystick.y()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kForward)); + // joystick.start().and(joystick.x()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kReverse)); + + // reset the field-centric heading on left bumper press + joystick.start().onTrue(drivetrain.runOnce(() -> drivetrain.seedFieldCentric())); + + drivetrain.registerTelemetry(logger::telemeterize); + } + + public Command getAutonomousCommand() { + return autoChooser.getSelected(); + // return Commands.print("No autonomous command configured"); + } } diff --git a/main/java/frc/robot/Telemetry.java b/main/java/frc/robot/Telemetry.java index a2d36dd..edf1979 100644 --- a/main/java/frc/robot/Telemetry.java +++ b/main/java/frc/robot/Telemetry.java @@ -121,4 +121,4 @@ public void telemeterize(SwerveDriveState state) { SmartDashboard.putData("Module " + i, m_moduleMechanisms[i]); } } -} \ No newline at end of file +} diff --git a/main/java/frc/robot/cosmetics/BlinkInLEDs.java b/main/java/frc/robot/cosmetics/BlinkInLEDs.java deleted file mode 100644 index f2241f0..0000000 --- a/main/java/frc/robot/cosmetics/BlinkInLEDs.java +++ /dev/null @@ -1,35 +0,0 @@ -// 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.cosmetics; - -import edu.wpi.first.wpilibj.motorcontrol.Spark; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants.CosmeticConstants; - -// We are no longer using this file to run any code, it is merely left as a reference -public class BlinkInLEDs extends SubsystemBase { - public final Spark lightController = new Spark(CosmeticConstants.LIGHT_ID); - // private ShuffleboardTab tab = Shuffleboard.getTab("LED"); - // private GenericEntry lightColor = tab.add("led color", - // CosmeticConstants.SOLID_YELLOW_VALUE).getEntry(); - - /** Creates a new lights. */ - public BlinkInLEDs() { - } - - public void setYellow() { - lightController.set(CosmeticConstants.SOLID_YELLOW_VALUE); - } - - public void setPurple() { - lightController.set(CosmeticConstants.SOLID_PURPLE_VALUE); - } - - @Override - public void periodic() { - // This method will be called once per scheduler run - // lightController.set(lightColor.getDouble(CosmeticConstants.SOLID_YELLOW_VALUE)); - } -} diff --git a/main/java/frc/robot/cosmetics/PwmLEDs.java b/main/java/frc/robot/cosmetics/PwmLEDs.java deleted file mode 100644 index acb2796..0000000 --- a/main/java/frc/robot/cosmetics/PwmLEDs.java +++ /dev/null @@ -1,249 +0,0 @@ -// 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.cosmetics; - -import edu.wpi.first.wpilibj.AddressableLED; -import edu.wpi.first.wpilibj.AddressableLEDBuffer; -import edu.wpi.first.wpilibj.DriverStation; -import edu.wpi.first.wpilibj.Timer; -import edu.wpi.first.wpilibj.util.Color; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants.CosmeticConstants; - -public class PwmLEDs extends SubsystemBase { - private final AddressableLED lights = new AddressableLED(CosmeticConstants.LIGHT_ID); - private AddressableLEDBuffer buffer = new AddressableLEDBuffer(CosmeticConstants.LIGHT_LENGTH); - private Color color1 = Color.kBlack; - private Color color2 = Color.kBlack; - private double onLength = 0.0; - private double offLength = 0.0; - private int color1Length = 0; - private int color2Length = 0; - private double speed = 0; - private double cycleLength = 0.0; - private double duration = 0.0; - - private double mp1 = 90.0; - private double mp2 = 60.0; - private double mp3 = 30.0; - private double mp4 = 15.0; - private double mp5 = 10.0; - private double mp6 = 5.0; - private double mpTolerance = 0.5; - - private Mode lightMode = Mode.SOLID; - - public void setLightMode(Mode lightMode) { - this.lightMode = lightMode; - } - - public Color getColor1() { - return color1; - } - - public void setColor1(Color color1) { - this.color1 = color1; - } - - public Color getColor2() { - return color2; - } - - public void setColor2(Color color2) { - this.color2 = color2; - } - - public void setColor1Length(int color1Length) { - this.color1Length = color1Length; - } - - public void setColor2Length(int color2Length) { - this.color2Length = color2Length; - } - - public void setSpeed(double speed) { - this.speed = speed; - } - - public static enum Mode { - SOLID, WAVE, CLIMB, STROBE; - } - - /** Creates a new PwmLEDs. */ - public PwmLEDs() { - lights.setLength(CosmeticConstants.LIGHT_LENGTH); - lights.setData(buffer); - lights.start(); - } - - public void solid(Color color) { - for (int i = 0; i < buffer.getLength(); i++) { - buffer.setLED(i, color); - } - } - - public void setSolid(Color color) { - this.color1 = color; - this.lightMode = Mode.SOLID; - } - - public void wave(Color color1, Color color2, double cycleLength, double duration) { - double counter = (1 - ((Timer.getFPGATimestamp() % duration) / duration)) * 2.0 * Math.PI; - double counterDiffPerLed = (2.0 * Math.PI) / cycleLength; - for (int i = 0; i < buffer.getLength(); i++) { - counter += counterDiffPerLed; - if (i >= 0) { - double ratio = (Math.pow(Math.sin(counter), 0.4) + 1.0) / 2.0; - if (Double.isNaN(ratio)) { - ratio = (-Math.pow(Math.sin(counter + Math.PI), 0.4) + 1.0) / 2.0; - } - if (Double.isNaN(ratio)) { - ratio = 0.5; - } - double red = (color1.red * (1 - ratio)) + (color2.red * ratio); - double green = (color1.green * (1 - ratio)) + (color2.green * ratio); - double blue = (color1.blue * (1 - ratio)) + (color2.blue * ratio); - buffer.setLED(i, new Color(red, green, blue)); - } - } - } - - public void wave(Color color, double cycleLength, double duration) { - wave(color, Color.kBlack, cycleLength, duration); - } - - public void setWave(Color color1, Color color2, double cycleLength, double duration) { - this.color1 = color1; - this.color2 = color2; - this.cycleLength = cycleLength; - this.duration = duration; - this.lightMode = Mode.WAVE; - } - - public void climb(Color color1, Color color2, int color1Length, int color2Length, double speed) { - int counter = (int) Math.floor(Timer.getFPGATimestamp() * speed); - for (int i = 0; i < buffer.getLength(); i += color2Length + color1Length) { - for (int j = 0; j < color1Length; j++) { - buffer.setLED((i + j + counter) % buffer.getLength(), color1); - } - for (int j = color1Length; j < color1Length + color2Length; j++) { - buffer.setLED((i + j + counter) % buffer.getLength(), color2); - } - } - } - - public void climb(Color color, int colorLength, int offLength, double speed) { - climb(color, Color.kBlack, colorLength, offLength, speed); - } - - public void setClimb(Color color1, Color color2, int color1Length, int color2Length, double speed) { - this.color1 = color1; - this.color2 = color2; - this.color1Length = color1Length; - this.color2Length = color2Length; - this.speed = speed; - this.lightMode = Mode.CLIMB; - } - - public void strobe(Color color1, Color color2, double onLength, double offLength) { - boolean lightsOn = Timer.getFPGATimestamp() % onLength + offLength > onLength; - if (lightsOn) { - for (int i = 0; i < buffer.getLength(); i++) { - buffer.setLED(i, color1); - } - } else { - for (int i = 0; i < buffer.getLength(); i++) { - buffer.setLED(i, color2); - } - } - } - - public void strobe(Color color, double onLength, double offLength) { - strobe(color, Color.kBlack, onLength, offLength); - } - - public void setStrobe(Color color1, Color color2, double onLength, double offLength) { - this.color1 = color1; - this.color2 = color2; - this.onLength = onLength; - this.offLength = offLength; - this.lightMode = Mode.STROBE; - } - - public void setDefault() { - Color color1 = Color.kBlue; - Color color2 = Color.kGold; - if (DriverStation.isEStopped()) { - color1 = Color.kDarkGreen; - color2 = Color.kPowderBlue; - } - if (!DriverStation.isFMSAttached()) { - color1 = PwmLEDs.dimColor(color1, 0.25); - color2 = PwmLEDs.dimColor(color2, 0.25); - } - - setWave(color1, color2, 10, 3); - } - - public static Color dimColor(Color color, double brightness) { - return new Color(color.red * brightness, color.green * brightness, color.blue * brightness); - } - - @Override - public void periodic() { - // This method will be called once per scheduler run - - double time = Timer.getMatchTime(); - if (Math.abs(time - mp1) <= mpTolerance) { - solid(Color.kBlue); - lights.setData(buffer); - return; - } - if (Math.abs(time - mp2) <= mpTolerance) { - solid(Color.kGreen); - lights.setData(buffer); - return; - } - if (Math.abs(time - mp3) <= mpTolerance) { - solid(Color.kFirstRed); - lights.setData(buffer); - return; - } - if (time < mp4 && time > mp5 && time % 1.0 > 0.5) { - solid(dimColor(Color.kDarkGoldenrod, 0.5)); - lights.setData(buffer); - return; - } - if (time < mp5 && time > mp6 && time % 1.0 > 0.5) { - solid(dimColor(Color.kFirstBlue, 0.5)); - lights.setData(buffer); - return; - } - if (time < mp6 && time % 1.0 > 0.5) { - solid(dimColor(Color.kFirstRed, 0.5)); - lights.setData(buffer); - return; - } - - switch (lightMode) { - case SOLID: - solid(color1); - break; - case WAVE: - wave(color1, color2, cycleLength, duration); - break; - case CLIMB: - climb(color1, color2, color1Length, color2Length, speed); - break; - case STROBE: - strobe(color1, color2, onLength, offLength); - break; - default: - solid(Color.kBlack); - } - - lights.setData(buffer); - } -} diff --git a/main/java/frc/robot/data/LoggingSystem.java b/main/java/frc/robot/data/LoggingSystem.java deleted file mode 100644 index 5c21203..0000000 --- a/main/java/frc/robot/data/LoggingSystem.java +++ /dev/null @@ -1,61 +0,0 @@ -// 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.data; - -import java.util.Dictionary; -import java.util.Map; - -import com.ctre.phoenix6.SignalLogger; - -import edu.wpi.first.networktables.GenericEntry; -import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard; -import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; -import edu.wpi.first.wpilibj2.command.Subsystem; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants.LoggingConstants; -import frc.robot.subsystems.DriveSystem; - -public class LoggingSystem extends SubsystemBase { - - private Map subsystemArray; - private boolean loggingState = LoggingConstants.DEFAULT_LOGGING_STATE; - private GenericEntry loggingChooser; - - - /** Creates a new LoggingSystem. */ - public LoggingSystem(Map subsystemArray) { - loggingChooser = Shuffleboard.getTab("Logging").add("Enable Logging", false).getEntry(); - SmartDashboard.putBoolean("Logging Chooser", false); - this.subsystemArray = subsystemArray; - } - - public boolean getLoggingState() { - return loggingState; - } - - private boolean getLoggingFlag() { - // An example command will be run in autonomous - return loggingChooser.getBoolean(false); // TODO: Actually use this value -} - - @Override - public void periodic() { - // This method will be called once per scheduler run - if (getLoggingFlag() != loggingState) { - loggingState = getLoggingFlag(); - - if (loggingState) { - SignalLogger.start(); - // Log the odometry pose as a double array - } else { - SignalLogger.stop(); - } - } - if (loggingState){ - var pose = ((DriveSystem)subsystemArray.get(new String("Drive"))).getState().Pose; - var status = SignalLogger.writeDoubleArray("odometry", new double[] {pose.getX(), pose.getY(), pose.getRotation().getDegrees()}); - } - } -} diff --git a/main/java/frc/robot/generated/TunerConstants.java b/main/java/frc/robot/generated/TunerConstants.java index cbbbb05..7c55399 100644 --- a/main/java/frc/robot/generated/TunerConstants.java +++ b/main/java/frc/robot/generated/TunerConstants.java @@ -14,7 +14,7 @@ import edu.wpi.first.math.numbers.N3; import edu.wpi.first.units.measure.*; -import frc.robot.subsystems.DriveSystem; +import frc.robot.subsystems.CommandSwerveDrivetrain; // Generated by the Tuner X Swerve Project Generator // https://v6.docs.ctr-electronics.com/en/stable/docs/tuner/tuner-swerve/index.html @@ -24,14 +24,14 @@ public class TunerConstants { // The steer motor uses any SwerveModule.SteerRequestType control request with the // output type specified by SwerveModuleConstants.SteerMotorClosedLoopOutput private static final Slot0Configs steerGains = new Slot0Configs() - .withKP(100).withKI(0).withKD(0.5) // 100, 0, 0.5 - .withKS(0.1).withKV(1.91).withKA(0) // 0, 1.5, 0 + .withKP(100).withKI(0).withKD(0.5) + .withKS(0.1).withKV(1.59).withKA(0) .withStaticFeedforwardSign(StaticFeedforwardSignValue.UseClosedLoopSign); // When using closed-loop control, the drive motor uses the control // output type specified by SwerveModuleConstants.DriveMotorClosedLoopOutput private static final Slot0Configs driveGains = new Slot0Configs() - .withKP(0.1).withKI(0).withKD(0) // 3, 0, 0 - .withKS(0).withKV(0.124); // removed KA changed and KV from 0 + .withKP(0.1).withKI(0).withKD(0) + .withKS(0).withKV(0.124); // The closed-loop output type to use for the steer motors; // This affects the PID/FF gains for the steer motors @@ -51,7 +51,7 @@ public class TunerConstants { // The stator current at which the wheels start to slip; // This needs to be tuned to your individual robot - private static final Current kSlipCurrent = Amps.of(120.0); // 150 + private static final Current kSlipCurrent = Amps.of(120.0); // Initial configs for the drive and steer motors and the azimuth encoder; these cannot be null. // Some configs will be overwritten; check the `with*InitialConfigs()` API documentation. @@ -70,19 +70,19 @@ public class TunerConstants { // CAN bus that the devices are located on; // All swerve devices must share the same CAN bus - public static final CANBus kCANBus = new CANBus("canivore", "./logs/example.hoot"); // Default Name + public static final CANBus kCANBus = new CANBus("Default Name", "./logs/example.hoot"); // Theoretical free speed (m/s) at 12 V applied output; // This needs to be tuned to your individual robot - public static final LinearVelocity kSpeedAt12Volts = MetersPerSecond.of(4.69); // 5 + public static final LinearVelocity kSpeedAt12Volts = MetersPerSecond.of(6.21); // Every 1 rotation of the azimuth results in kCoupleRatio drive motor turns; // This may need to be tuned to your individual robot - private static final double kCoupleRatio = 3.8181818181818183; // 3.5714285714285716 + private static final double kCoupleRatio = 3; - private static final double kDriveGearRatio = 7.363636363636365; // 6.122448979591837 - private static final double kSteerGearRatio = 15.42857142857143; // 12.8 - private static final Distance kWheelRadius = Inches.of(2.167); // 1.92 + private static final double kDriveGearRatio = 5.142857142857142; + private static final double kSteerGearRatio = 12.8; + private static final Distance kWheelRadius = Inches.of(2); private static final boolean kInvertLeftSide = false; private static final boolean kInvertRightSide = true; @@ -90,11 +90,11 @@ public class TunerConstants { private static final int kPigeonId = 13; // These are only used for simulation - private static final MomentOfInertia kSteerInertia = KilogramSquareMeters.of(0.01); // 0.00001 - private static final MomentOfInertia kDriveInertia = KilogramSquareMeters.of(0.01); // 0.001 + private static final MomentOfInertia kSteerInertia = KilogramSquareMeters.of(0.01); + private static final MomentOfInertia kDriveInertia = KilogramSquareMeters.of(0.01); // Simulated voltage necessary to overcome friction - private static final Voltage kSteerFrictionVoltage = Volts.of(0.2); // 0.25 - private static final Voltage kDriveFrictionVoltage = Volts.of(0.2); // 0.25 + private static final Voltage kSteerFrictionVoltage = Volts.of(0.2); + private static final Voltage kDriveFrictionVoltage = Volts.of(0.2); public static final SwerveDrivetrainConstants DrivetrainConstants = new SwerveDrivetrainConstants() .withCANBusName(kCANBus.getName()) @@ -129,45 +129,45 @@ public class TunerConstants { private static final int kFrontLeftDriveMotorId = 11; private static final int kFrontLeftSteerMotorId = 12; private static final int kFrontLeftEncoderId = 10; - private static final Angle kFrontLeftEncoderOffset = Rotations.of(0.15234375); // -0.052734375 - private static final boolean kFrontLeftSteerMotorInverted = true; // false - private static final boolean kFrontLeftEncoderInverted = false; // new + private static final Angle kFrontLeftEncoderOffset = Rotations.of(-0.0537109375); + private static final boolean kFrontLeftSteerMotorInverted = false; + private static final boolean kFrontLeftEncoderInverted = false; - private static final Distance kFrontLeftXPos = Inches.of(10); // 9.25 - private static final Distance kFrontLeftYPos = Inches.of(10); // 9.25 + private static final Distance kFrontLeftXPos = Inches.of(9); + private static final Distance kFrontLeftYPos = Inches.of(9); // Front Right private static final int kFrontRightDriveMotorId = 2; private static final int kFrontRightSteerMotorId = 3; private static final int kFrontRightEncoderId = 1; - private static final Angle kFrontRightEncoderOffset = Rotations.of(-0.4873046875); // -0.6796875 - private static final boolean kFrontRightSteerMotorInverted = true; // false - private static final boolean kFrontRightEncoderInverted = false; // new + private static final Angle kFrontRightEncoderOffset = Rotations.of(0.328125); + private static final boolean kFrontRightSteerMotorInverted = false; + private static final boolean kFrontRightEncoderInverted = false; - private static final Distance kFrontRightXPos = Inches.of(10); // 9.25 - private static final Distance kFrontRightYPos = Inches.of(-10); // -9.25 + private static final Distance kFrontRightXPos = Inches.of(9); + private static final Distance kFrontRightYPos = Inches.of(-9); // Back Left private static final int kBackLeftDriveMotorId = 8; private static final int kBackLeftSteerMotorId = 9; private static final int kBackLeftEncoderId = 7; - private static final Angle kBackLeftEncoderOffset = Rotations.of(-0.219482421875); // -0.304931640625 - private static final boolean kBackLeftSteerMotorInverted = true; // false - private static final boolean kBackLeftEncoderInverted = false; // new + private static final Angle kBackLeftEncoderOffset = Rotations.of(-0.30224609375); + private static final boolean kBackLeftSteerMotorInverted = false; + private static final boolean kBackLeftEncoderInverted = false; - private static final Distance kBackLeftXPos = Inches.of(-10); // -9.25 - private static final Distance kBackLeftYPos = Inches.of(10); // 9.25 + private static final Distance kBackLeftXPos = Inches.of(-9); + private static final Distance kBackLeftYPos = Inches.of(9); // Back Right private static final int kBackRightDriveMotorId = 5; private static final int kBackRightSteerMotorId = 6; private static final int kBackRightEncoderId = 4; - private static final Angle kBackRightEncoderOffset = Rotations.of(0.17236328125); // -0.032470703125 - private static final boolean kBackRightSteerMotorInverted = true; // false - private static final boolean kBackRightEncoderInverted = false; // new + private static final Angle kBackRightEncoderOffset = Rotations.of(-0.031005859375); + private static final boolean kBackRightSteerMotorInverted = false; + private static final boolean kBackRightEncoderInverted = false; - private static final Distance kBackRightXPos = Inches.of(-10); // -9.25 - private static final Distance kBackRightYPos = Inches.of(-10); // -9.25 + private static final Distance kBackRightXPos = Inches.of(-9); + private static final Distance kBackRightYPos = Inches.of(-9); public static final SwerveModuleConstants FrontLeft = @@ -195,8 +195,8 @@ public class TunerConstants { * Creates a CommandSwerveDrivetrain instance. * This should only be called once in your robot program,. */ - public static DriveSystem createDrivetrain() { - return new DriveSystem( + public static CommandSwerveDrivetrain createDrivetrain() { + return new CommandSwerveDrivetrain( DrivetrainConstants, FrontLeft, FrontRight, BackLeft, BackRight ); } @@ -283,4 +283,4 @@ public TunerSwerveDrivetrain( ); } } -} \ No newline at end of file +} diff --git a/DriveSystem.java b/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java similarity index 89% rename from DriveSystem.java rename to main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java index 3447342..a78ffc3 100644 --- a/DriveSystem.java +++ b/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java @@ -9,7 +9,6 @@ import com.ctre.phoenix6.swerve.SwerveDrivetrainConstants; import com.ctre.phoenix6.swerve.SwerveModuleConstants; import com.ctre.phoenix6.swerve.SwerveRequest; - import com.pathplanner.lib.auto.AutoBuilder; import com.pathplanner.lib.config.PIDConstants; import com.pathplanner.lib.config.RobotConfig; @@ -33,7 +32,7 @@ * Class that extends the Phoenix 6 SwerveDrivetrain class and implements * Subsystem so it can easily be used in command-based projects. */ -public class DriveSystem extends TunerSwerveDrivetrain implements Subsystem { +public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Subsystem { private static final double kSimLoopPeriod = 0.005; // 5 ms private Notifier m_simNotifier = null; private double m_lastSimTime; @@ -122,10 +121,10 @@ public class DriveSystem extends TunerSwerveDrivetrain implements Subsystem { * the devices themselves. If they need the devices, they can access them through * getters in the classes. * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param modules Constants for each specific module + * @param drivetrainConstants Drivetrain-wide constants for the swerve drive + * @param modules Constants for each specific module */ - public DriveSystem( + public CommandSwerveDrivetrain( SwerveDrivetrainConstants drivetrainConstants, SwerveModuleConstants... modules ) { @@ -143,13 +142,13 @@ public DriveSystem( * the devices themselves. If they need the devices, they can access them through * getters in the classes. * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param modules Constants for each specific module + * @param drivetrainConstants Drivetrain-wide constants for the swerve drive + * @param odometryUpdateFrequency The frequency to run the odometry loop. If + * unspecified or set to 0 Hz, this is 250 Hz on + * CAN FD, and 100 Hz on CAN 2.0. + * @param modules Constants for each specific module */ - public DriveSystem( + public CommandSwerveDrivetrain( SwerveDrivetrainConstants drivetrainConstants, double odometryUpdateFrequency, SwerveModuleConstants... modules @@ -168,19 +167,19 @@ public DriveSystem( * the devices themselves. If they need the devices, they can access them through * getters in the classes. * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param odometryStandardDeviation The standard deviation for odometry calculation + * @param drivetrainConstants Drivetrain-wide constants for the swerve drive + * @param odometryUpdateFrequency The frequency to run the odometry loop. If + * unspecified or set to 0 Hz, this is 250 Hz on + * CAN FD, and 100 Hz on CAN 2.0. + * @param odometryStandardDeviation The standard deviation for odometry calculation * in the form [x, y, theta]ᵀ, with units in meters * and radians * @param visionStandardDeviation The standard deviation for vision calculation * in the form [x, y, theta]ᵀ, with units in meters * and radians - * @param modules Constants for each specific module + * @param modules Constants for each specific module */ - public DriveSystem( + public CommandSwerveDrivetrain( SwerveDrivetrainConstants drivetrainConstants, double odometryUpdateFrequency, Matrix odometryStandardDeviation, @@ -191,7 +190,7 @@ public DriveSystem( if (Utils.isSimulation()) { startSimThread(); } - configureAutoBuilder(); + configureAutoBuilder(); } private void configureAutoBuilder() { @@ -209,9 +208,9 @@ private void configureAutoBuilder() { ), new PPHolonomicDriveController( // PID constants for translation - new PIDConstants(10, 0, 0), // 5, 0, 0 + new PIDConstants(10, 0, 0), // PID constants for rotation - new PIDConstants(7, 0, 0) // 5, 0, 0 + new PIDConstants(7, 0, 0) ), config, // Assume the path needs to be flipped for Red vs Blue, this is normally the case @@ -290,4 +289,4 @@ private void startSimThread() { }); m_simNotifier.startPeriodic(kSimLoopPeriod); } -} \ No newline at end of file +} diff --git a/java/frc/robot/Constants.java b/main/java/frc/robot/subsystems/Constants.java similarity index 64% rename from java/frc/robot/Constants.java rename to main/java/frc/robot/subsystems/Constants.java index e452735..247eeaa 100644 --- a/java/frc/robot/Constants.java +++ b/main/java/frc/robot/subsystems/Constants.java @@ -1,4 +1,4 @@ -package frc.robot; +package frc.robot.subsystems; public class Constants { public static class ControllerConstants { @@ -17,14 +17,4 @@ public static class LoggingConstants { public static final boolean DEFAULT_LOGGING_STATE = false; } - - public static class CosmeticConstants { - - public static final int LIGHT_ID = 9; - public static final double SOLID_YELLOW_VALUE = 0.69; - public static final double SOLID_PURPLE_VALUE = 0.91; - public static final int LIGHT_LENGTH = 76; - - } - } diff --git a/main/java/org/assabet/aztechs157/PrintLimiter.java b/main/java/org/assabet/aztechs157/PrintLimiter.java deleted file mode 100644 index aa6dc7a..0000000 --- a/main/java/org/assabet/aztechs157/PrintLimiter.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.assabet.aztechs157; - -public class PrintLimiter { - private final int ticksPerPrint; - private int currentTicks = 0; - - public PrintLimiter(final int ticksPerPrint) { - this.ticksPerPrint = ticksPerPrint; - } - - public PrintLimiter tick() { - currentTicks++; - - if (currentTicks > ticksPerPrint) { - currentTicks = 0; - } - - return this; - } - - public PrintLimiter println(final String message) { - if (currentTicks == 0) { - System.out.println(message); - } - - return this; - } - - public PrintLimiter print(final String message) { - if (currentTicks == 0) { - System.out.print(message); - } - - return this; - } - - public PrintLimiter limitBody(final Runnable body) { - if (currentTicks == 0) { - body.run(); - } - - return this; - } -} diff --git a/main/java/org/assabet/aztechs157/Sanity.java b/main/java/org/assabet/aztechs157/Sanity.java deleted file mode 100644 index a2ac436..0000000 --- a/main/java/org/assabet/aztechs157/Sanity.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.assabet.aztechs157; - -import org.assabet.aztechs157.numbers.Range; - -public final class Sanity { - private Sanity() { - throw new UnsupportedOperationException("Expect is a utility class"); - } - - public static class SanityError extends RuntimeException { - public SanityError(final String message) { - super(message); - } - } - - public static NumberSanity check(final double number) { - return new NumberSanity(number); - } - - public static record NumberSanity(double value) { - public NumberSanity containedWithin(final Range range) { - if (range.contains(value)) { - return this; - } else { - throw new SanityError(value + " was not contained within " + range); - } - } - - public NumberSanity equalTo(final double other) { - if (value == other) { - return this; - } else { - throw new SanityError(value + " was not equal to " + other); - } - } - - public NumberSanity notEqualTo(final double other) { - if (value != other) { - return this; - } else { - throw new SanityError(value + " was equal to " + other); - } - } - - public NumberSanity greaterThan(final double other) { - if (value > other) { - return this; - } else { - throw new SanityError(value + " was not greater than " + other); - } - } - - public NumberSanity lessThan(final double other) { - if (value < other) { - return this; - } else { - throw new SanityError(value + " was not less than " + other); - } - } - - public NumberSanity greaterOrEqual(final double other) { - if (value >= other) { - return this; - } else { - throw new SanityError(value + " was not greater or equal to " + other); - } - } - - public NumberSanity lessOrEqual(final double other) { - if (value <= other) { - return this; - } else { - throw new SanityError(value + " was not less or equal to " + other); - } - } - } - - public static BooleanSanity check(final boolean value) { - return new BooleanSanity(value); - } - - public static record BooleanSanity(boolean value) { - public BooleanSanity equal(final boolean other) { - if (value == other) { - return this; - } else { - throw new SanityError(value + " was not equal to " + other); - } - } - } -} diff --git a/main/java/org/assabet/aztechs157/input/Model.java b/main/java/org/assabet/aztechs157/input/Model.java deleted file mode 100644 index daa0894..0000000 --- a/main/java/org/assabet/aztechs157/input/Model.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.assabet.aztechs157.input; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -/** - * Models map physical inputs on a input device to input classes such as - * {@link Button}, {@link Axis}, or {@link Pov}. - */ -public class Model { - - public final int deviceId; - - /** - * Create a Model that models the device specified by `deviceId` - * - * @param deviceId The id of the device - */ - public Model(final int deviceId) { - this.deviceId = deviceId; - } - - /** - * Create a {@link Button} that models a physical button - * - * @param buttonId The button to model - * @return The modeled {@link Button} - */ - public Button button(final int buttonId) { - return Button.fromDriverStation(deviceId, buttonId); - } - - /** - * Create a {@link Axis} that models a physical axis - * - * @param buttonId The axis to model - * @return The modeled {@link Axis} - */ - public Axis axis(final int axisId) { - return Axis.fromDriverStation(deviceId, axisId); - } - - /** - * Create a {@link Pov} that modes a physical pov - * - * @param povId The pov to model - * @return The modeled {@link Pov} - */ - public Pov pov(final int povId) { - return Pov.fromDriverStation(deviceId, povId); - } -} diff --git a/main/java/org/assabet/aztechs157/input/Pov.java b/main/java/org/assabet/aztechs157/input/Pov.java deleted file mode 100644 index 7dd2a8f..0000000 --- a/main/java/org/assabet/aztechs157/input/Pov.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.assabet.aztechs157.input; - -import java.util.function.IntSupplier; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -import edu.wpi.first.wpilibj.DriverStation; - -/** - * Class for getting input from a pov. - */ -public class Pov { - private final IntSupplier degrees; - - public Pov(final IntSupplier degrees) { - this.degrees = degrees; - } - - public static Pov fromDriverStation(final int deviceId, final int povId) { - return new Pov(() -> DriverStation.getStickPOV(deviceId, povId)); - } - - public int get() { - return degrees.getAsInt(); - } - - public final Axis value = new Axis(() -> get()); - - public final Axis y = new Axis(() -> switch (get()) { - case UP_LEFT, UP, UP_RIGHT -> 1; - case LEFT, CENTER, RIGHT -> 0; - case DOWN_LEFT, DOWN, DOWN_RIGHT -> -1; - default -> 0; - }); - - public final Axis x = new Axis(() -> switch (get()) { - case DOWN_RIGHT, RIGHT, UP_RIGHT -> 1; - case DOWN, CENTER, UP -> 0; - case DOWN_LEFT, LEFT, UP_LEFT -> -1; - default -> 0; - }); - - public static final int CENTER = -1; - public static final int UP = 45 * 0; - public static final int UP_RIGHT = 45 * 1; - public static final int RIGHT = 45 * 2; - public static final int DOWN_RIGHT = 45 * 3; - public static final int DOWN = 45 * 4; - public static final int DOWN_LEFT = 45 * 5; - public static final int LEFT = 45 * 6; - public static final int UP_LEFT = 45 * 7; - - private Button buttonForValue(final int degrees, final String name) { - return new Button(() -> get() == degrees); - } - - public final Button center = buttonForValue(CENTER, "Center"); - public final Button up = buttonForValue(UP, "Up"); - public final Button upRight = buttonForValue(UP_RIGHT, "Up Right"); - public final Button right = buttonForValue(RIGHT, "Right"); - public final Button downRight = buttonForValue(DOWN_RIGHT, "Down Right"); - public final Button down = buttonForValue(DOWN, "Down"); - public final Button downLeft = buttonForValue(DOWN_LEFT, "Down Left"); - public final Button left = buttonForValue(LEFT, "Left"); - public final Button upLeft = buttonForValue(UP_LEFT, "Up Left"); -} diff --git a/main/java/org/assabet/aztechs157/input/layouts/DynamicLayout.java b/main/java/org/assabet/aztechs157/input/layouts/DynamicLayout.java deleted file mode 100644 index c4cbcf7..0000000 --- a/main/java/org/assabet/aztechs157/input/layouts/DynamicLayout.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.assabet.aztechs157.input.layouts; - -import java.util.function.Supplier; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -/** - * Object that manages layouts. A layout can be selected from Shuffleboard that - * can then be used by the robot. It maps the inputs of a - * {@link DynamicLayout} to the desired functions of the robot. - */ -public class DynamicLayout implements Layout { - private final Supplier layoutSupplier; - - public DynamicLayout(final Supplier layoutSupplier) { - this.layoutSupplier = layoutSupplier; - } - - public Layout getCurrent() { - return layoutSupplier.get(); - } - - /** - * Get a button from the currently selected layout. - * - * @param key Which button to retrieve - * @return A {@link Button} and {@link Button.Key} representing the input - */ - public Button button(final Button.Key key) { - return new Button(() -> getCurrent().button(key).get()); - } - - /** - * Get a axis from the currently selected layout. - * - * @param key Which axis to retrieve - * @return A {@link Axis} representing the input - */ - public Axis axis(final Axis.Key key) { - return new Axis(() -> getCurrent().axis(key).get()); - } -} diff --git a/main/java/org/assabet/aztechs157/input/layouts/Layout.java b/main/java/org/assabet/aztechs157/input/layouts/Layout.java deleted file mode 100644 index 01c914c..0000000 --- a/main/java/org/assabet/aztechs157/input/layouts/Layout.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.assabet.aztechs157.input.layouts; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public interface Layout { - /** - * Retrieve the {@link Button} associated with a {@link Button.Key} - * - * @param key The key a button was assigned to - * @return The associated button - */ - public Button button(final Button.Key key); - - /** - * Retrieve the {@link Axis} associated with a {@link Axis.KeyBase} - * - * @param key The key an axis was assigned to - * @return The associated axis - */ - public Axis axis(final Axis.Key key); -} diff --git a/main/java/org/assabet/aztechs157/input/layouts/MapLayout.java b/main/java/org/assabet/aztechs157/input/layouts/MapLayout.java deleted file mode 100644 index fe4c8b0..0000000 --- a/main/java/org/assabet/aztechs157/input/layouts/MapLayout.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.assabet.aztechs157.input.layouts; - -import java.util.HashMap; -import java.util.Map; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -/** - * A simple structure that stores the mapping between keys and inputs. These can - * be used with {@link DynamicLayout} to allow hot-swapping of layouts. - */ -public class MapLayout implements Layout { - private final Map buttons = new HashMap<>(); - private final Map axes = new HashMap<>(); - - /** - * For this Layout, assign a {@link Button.Key} to a {@link Button}. - * Calling - * this method multiple times with the same key will override the previous - * assignment. - * - * @param key The key to assign with - * @param button The button being assigned - */ - public void assign(final Button.Key key, final Button button) { - buttons.put(key, button); - } - - /** - * For this Layout, assign a {@link Axis.KeyBase} to a {@link Axis}. Calling - * this - * method multiple times with the same key will override the previous - * assignment. - * - * @param key The key to assign with - * @param axis The axis being assigned - */ - public void assign(final Axis.Key key, final Axis axis) { - axes.put(key, axis); - } - - /** - * Retrieve the {@link Button} associated with a {@link Button.Key} - * - * @param key The key a button was assigned to - * @return The associated button - */ - public Button button(final Button.Key key) { - return buttons.get(key); - } - - /** - * Retrieve the {@link Axis} associated with a {@link Axis.KeyBase} - * - * @param key The key an axis was assigned to - * @return The associated axis - */ - public Axis axis(final Axis.Key key) { - return axes.get(key); - } -} diff --git a/main/java/org/assabet/aztechs157/input/models/LogitechAttack.java b/main/java/org/assabet/aztechs157/input/models/LogitechAttack.java deleted file mode 100644 index c097cc6..0000000 --- a/main/java/org/assabet/aztechs157/input/models/LogitechAttack.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.assabet.aztechs157.input.models; - -import org.assabet.aztechs157.input.Model; -import org.assabet.aztechs157.input.Pov; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public class LogitechAttack extends Model { - - public LogitechAttack(final int joystickId) { - super(joystickId); - } - - public final Button trigger = button(1); - public final Button button2 = button(2); - public final Button button3 = button(3); - public final Button button4 = button(4); - public final Button button5 = button(5); - public final Button button6 = button(6); - public final Button button7 = button(7); - public final Button button8 = button(8); - public final Button button9 = button(9); - public final Button button10 = button(10); - public final Button button11 = button(11); - - public final Axis stickX = axis(0); - public final Axis stickY = axis(1); - public final Axis slider = axis(3); - - public final Pov pov = pov(0); -} diff --git a/main/java/org/assabet/aztechs157/input/models/LogitechExtreme3D.java b/main/java/org/assabet/aztechs157/input/models/LogitechExtreme3D.java deleted file mode 100644 index 59a51e3..0000000 --- a/main/java/org/assabet/aztechs157/input/models/LogitechExtreme3D.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.assabet.aztechs157.input.models; - -import org.assabet.aztechs157.input.Model; -import org.assabet.aztechs157.input.Pov; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public class LogitechExtreme3D extends Model { - public LogitechExtreme3D(final int joystickId) { - super(joystickId); - } - - public final Button trigger = button(1); - public final Button thumb = button(2); - public final Button button3 = button(3); - public final Button button4 = button(4); - public final Button button5 = button(5); - public final Button button6 = button(6); - public final Button button7 = button(7); - public final Button button8 = button(8); - public final Button button9 = button(9); - public final Button button10 = button(10); - public final Button button11 = button(11); - public final Button button12 = button(12); - - public final Axis stickX = axis(0); - public final Axis stickY = axis(1); - public final Axis stickRotate = axis(2); - public final Axis slider = axis(3); - - public final Pov pov = pov(0); -} diff --git a/main/java/org/assabet/aztechs157/input/models/LogitechGamepadF310.java b/main/java/org/assabet/aztechs157/input/models/LogitechGamepadF310.java deleted file mode 100644 index 3be4af0..0000000 --- a/main/java/org/assabet/aztechs157/input/models/LogitechGamepadF310.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.assabet.aztechs157.input.models; - -import org.assabet.aztechs157.input.Model; -import org.assabet.aztechs157.input.Pov; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public class LogitechGamepadF310 extends Model { - - public LogitechGamepadF310(final int joystickId) { - super(joystickId); - } - - public final Button a = button(1); - public final Button b = button(2); - public final Button x = button(3); - public final Button y = button(4); - public final Button leftBumper = button(5); - public final Button rightBumper = button(6); - public final Button back = button(7); - public final Button start = button(8); - public final Button leftStickPress = button(9); - public final Button rightStickPress = button(10); - - public final Axis leftStickX = axis(0); - public final Axis leftStickY = axis(1); - public final Axis rightTriggerHeld = axis(2); - public final Axis leftTriggerHeld = axis(3); - public final Axis rightStickX = axis(4); - public final Axis rightStickY = axis(5); - public final Axis combinedTriggersHeld = rightTriggerHeld.offsetBy(leftTriggerHeld.inverted()::get); - - public final Pov pov = pov(0); -} diff --git a/main/java/org/assabet/aztechs157/input/models/XboxOne.java b/main/java/org/assabet/aztechs157/input/models/XboxOne.java deleted file mode 100644 index 0bc79fe..0000000 --- a/main/java/org/assabet/aztechs157/input/models/XboxOne.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.assabet.aztechs157.input.models; - -import org.assabet.aztechs157.input.Model; -import org.assabet.aztechs157.input.Pov; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public class XboxOne extends Model { - - public XboxOne(final int joystickId) { - super(joystickId); - } - - public final Button a = button(1); - public final Button b = button(2); - public final Button x = button(3); - public final Button y = button(4); - public final Button leftBumper = button(5); - public final Button rightBumper = button(6); - public final Button back = button(7); - public final Button start = button(8); - public final Button leftStickPress = button(9); - public final Button rightStickPress = button(10); - - public final Axis leftStickX = axis(0); - public final Axis leftStickY = axis(1); - public final Axis leftTriggerHeld = axis(2); - public final Axis rightTriggerHeld = axis(3); - public final Axis rightStickX = axis(4); - public final Axis rightStickY = axis(5); - public final Axis combinedTriggersHeld = rightTriggerHeld.offsetBy(leftTriggerHeld.inverted()::get); - - public final Pov pov = pov(0); -} diff --git a/main/java/org/assabet/aztechs157/input/values/Axis.java b/main/java/org/assabet/aztechs157/input/values/Axis.java deleted file mode 100644 index 892cbfd..0000000 --- a/main/java/org/assabet/aztechs157/input/values/Axis.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.assabet.aztechs157.input.values; - -import java.util.function.DoubleConsumer; -import java.util.function.DoubleSupplier; -import java.util.function.DoubleUnaryOperator; - -import org.assabet.aztechs157.numbers.Range; - -import edu.wpi.first.wpilibj.DriverStation; - -/** - * Class for getting input from a axis. This class has methods and static - * methods to modify and compose {@link Axis}s into a new - * {@link Axis}. - */ -public class Axis { - public static class Key { - } - - public static final Range kDeviceDefaultRange = new Range(-1, 1); - - private final DoubleSupplier value; - - public Axis(final DoubleSupplier value) { - this.value = value; - } - - public static Axis fromDriverStation(final int deviceId, final int axisId) { - return new Axis(() -> DriverStation.getStickAxis(deviceId, axisId)); - } - - public static Axis always(final double value) { - return new Axis(() -> value); - } - - public double get() { - return value.getAsDouble(); - } - - public Axis map(final DoubleUnaryOperator body) { - return new Axis(() -> body.applyAsDouble(get())); - } - - public Axis tap(final DoubleConsumer body) { - return map(value -> { - body.accept(value); - return value; - }); - } - - /** - * Inverts the input by negating the number's sign - * - * @return A new inverted input - */ - public Axis inverted() { - return map(value -> -value); - } - - /** - * Scale the input with a scalar value. - * - * @param scale The value to scale by - * @return A new input with the scale applied - */ - public Axis scaledBy(final double scale) { - return map(value -> value * scale); - } - - /** - * Scale the input with another input. - * - * @param scale The input to retrieve the scale from - * @return A new input with the scale applied - */ - public Axis scaledBy(final DoubleSupplier scale) { - return map(value -> value * scale.getAsDouble()); - } - - public Axis offsetBy(final double offset) { - return map(value -> value + offset); - } - - public Axis offsetBy(final DoubleSupplier offset) { - return map(value -> value + offset.getAsDouble()); - } - - /** - * Clamp the input to a number within the provided range. - * - * @param range The range to clamp to - * @return A new input with clamp applied - */ - public Axis clampTo(final Range range) { - return map(value -> range.clamp(value)); - } -} diff --git a/main/java/org/assabet/aztechs157/input/values/Button.java b/main/java/org/assabet/aztechs157/input/values/Button.java deleted file mode 100644 index ebd6a2d..0000000 --- a/main/java/org/assabet/aztechs157/input/values/Button.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.assabet.aztechs157.input.values; - -import java.util.function.BooleanSupplier; -import java.util.function.UnaryOperator; - -import edu.wpi.first.util.function.BooleanConsumer; -import edu.wpi.first.wpilibj.DriverStation; -import edu.wpi.first.wpilibj2.command.Command; -import edu.wpi.first.wpilibj2.command.button.Trigger; - -/** - * Class for getting input from a button. This class has methods and static - * methods to modify and compose {@link Button}s into a new - * {@link Button}. - */ -public class Button { - public static class Key { - } - - private final BooleanSupplier value; - - public Button(final BooleanSupplier value) { - this.value = value; - } - - public static Button fromDriverStation(final int deviceId, final int buttonId) { - return new Button(() -> DriverStation.getStickButton(deviceId, buttonId)); - } - - public static Button always(final boolean value) { - return new Button(() -> value); - } - - public boolean get() { - return value.getAsBoolean(); - } - - public Button whenPressed(final Command command) { - new Trigger(value).onTrue(command); - return this; - } - - public Button whileHeld(final Command command) { - new Trigger(value).whileTrue(command); - return this; - } - - public Button toggleWhenPressed(final Command command) { - new Trigger(value).toggleOnTrue(command); - return this; - } - - public Button map(final UnaryOperator body) { - return new Button(() -> body.apply(get())); - } - - public Button tap(final BooleanConsumer body) { - return map(value -> { - body.accept(value); - return value; - }); - } - - /** - * Inverts the input; similar to a boolean `!` - * - * @return A new inverted input - */ - public Button inverted() { - return map(value -> !value); - } - - /** - * Checks that all inputs are true; similar to a boolean `&&` - * - * @param first The first input - * @param rest The rest of the inputs - * @return A new input that is only true when all of the passed inputs are true - */ - public static Button all(final Button first, final Button... rest) { - // The first argument is explicit to prevent being given empty arrays - - return new Button(() -> { - // Check each input individually - // As soon as one input is false, return false - - if (first != null && first.get() == false) { - return false; - } - - for (final var input : rest) { - if (input != null && input.get() == false) { - return false; - } - } - - // All inputs are true at this point, so return true - return true; - }); - } - - /** - * Checks that any input is true; similar to a boolean `||` - * - * @param first The first input - * @param rest The rest of the inputs - * @return A new input that is true when any of the passed inputs are true - */ - public static Button any(final Button first, final Button... rest) { - // The first argument is explicit to prevent being given empty arrays - - return new Button(() -> { - // Check each input individually - // As soon as one input is true, return true - - if (first != null && first.get()) { - return true; - } - - for (final var input : rest) { - if (input != null && input.get()) { - return true; - } - } - - // All inputs are false at this point, so return false - return false; - }); - - } -} diff --git a/main/java/org/assabet/aztechs157/numbers/Deadzone.java b/main/java/org/assabet/aztechs157/numbers/Deadzone.java deleted file mode 100644 index 62a1578..0000000 --- a/main/java/org/assabet/aztechs157/numbers/Deadzone.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.assabet.aztechs157.numbers; - -import org.assabet.aztechs157.input.values.Axis; - -public class Deadzone { - public final Range deadzone; - public final Range full; - public final RangeConverter leftConverter; - public final RangeConverter rightConverter; - - public static Deadzone forAxis(final Range deadzone) { - return new Deadzone(deadzone, Axis.kDeviceDefaultRange, 0); - } - - public Deadzone(final Range deadzone, final Range full, final double fullCenter) { - this.deadzone = deadzone; - this.full = full; - - final var leftFull = new Range(full.start(), fullCenter); - final var leftDeadzone = new Range(full.start(), deadzone.start()); - this.leftConverter = new RangeConverter(leftDeadzone, leftFull); - - final var rightFull = new Range(fullCenter, full.end()); - final var rightDeadzone = new Range(deadzone.end(), full.end()); - this.rightConverter = new RangeConverter(rightDeadzone, rightFull); - } - - public double apply(final double input) { - if (deadzone.contains(input)) { - return 0; - } else if (leftConverter.inputRange.contains(input)) { - return leftConverter.convert(input); - } else if (rightConverter.inputRange.contains(input)) { - return rightConverter.convert(input); - } - - throw new Error("Attempted to apply deadzone to input outside of full range " - + full.start() + " to " + full.end()); - } -} diff --git a/main/java/org/assabet/aztechs157/numbers/Range.java b/main/java/org/assabet/aztechs157/numbers/Range.java deleted file mode 100644 index a69bb32..0000000 --- a/main/java/org/assabet/aztechs157/numbers/Range.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.assabet.aztechs157.numbers; - -public record Range(double start, double end) { - - public boolean contains(final double value) { - return start <= value && value <= end; - } - - public double range() { - return end - start; - } - - public double clamp(final double value) { - if (value < start) { - return start; - } else if (value > end) { - return end; - } else { - return value; - } - } - - public double limitMotionWithinRange(final double speed, final double currentPosition) { - if (speed > 0 && currentPosition > end) { - return 0; - } else if (speed < 0 && currentPosition < start) { - return 0; - } else { - return speed; - } - } - - public RangeConverter convertingTo(final Range output) { - return new RangeConverter(this, output); - } -} diff --git a/main/java/org/assabet/aztechs157/numbers/RangeConverter.java b/main/java/org/assabet/aztechs157/numbers/RangeConverter.java deleted file mode 100644 index edb424e..0000000 --- a/main/java/org/assabet/aztechs157/numbers/RangeConverter.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.assabet.aztechs157.numbers; - -public class RangeConverter { - public final Range inputRange; - public final Range outputRange; - public final double scaleFactor; - - public RangeConverter(final Range inputRange, final Range outputRange) { - this.inputRange = inputRange; - this.outputRange = outputRange; - this.scaleFactor = outputRange.range() / inputRange.range(); - } - - public double convert(final double inputValue) { - // Shift to zero based input range - final var basedInput = inputValue - inputRange.start(); - - // Scale the zero based input - final var scaled = basedInput * scaleFactor; - - // Shift from zero based to output range - final var outputValue = scaled + outputRange.start(); - - return outputValue; - } -} diff --git a/music/BuddyHollyRiff.chrp b/music/BuddyHollyRiff.chrp deleted file mode 100644 index 9489fddede232cc8e27c2027e43a841f0bec01e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmZQzU|?iq;9#(0HevvQ4?w(&$p}n8U}OM`gXjxP3=B(vYC!Y>W(Ec^79%jdfEA(! fL{DI2V3-Wl3!)p?85r__Y!KZb#=v0x;s1XCZ37bT diff --git a/music/MoreCowbell.chrp b/music/MoreCowbell.chrp deleted file mode 100644 index e5baa9f296f1e287ec724a6fc3554f186ae2fd33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 zcmX|lCmg+LRpl>AQsAC zASr`b?xGA9Wl=cC+wrf{IlY~po__xaKw1P1s73A)59 zB0WXTG7m(6Q)-{NE(2Jno|!-BW0|3UO>fD<-~1hVBstXBZ04=ZX0B}J%I4h6 zY|hH&tZcUGo2|0hCYjB)kJ)UsgV`#Zt+IJ)j(IAZr?MGp2QySQLuGSQ-`teVO}m+! zb~Cq04C>7P?);9~H=IP%KSRCyhLz2*n;kRMyYE)n4An71z57;`%}^aP)Vmofo0~f3 wrgz_@vbm{aZhH3}Dw~@+=B9Vwp0c?Ovtw?`2fVu?-kCaPsCP3wpZxjx1!8}jW&i*H diff --git a/music/TOTTFIY.chrp b/music/TOTTFIY.chrp deleted file mode 100644 index 52411f120b597c1db52307317bfc8dbc78303f17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24844 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 diff --git a/music/adams.chrp b/music/adams.chrp deleted file mode 100644 index f5be11b62447405fc1d2eb266161bd54c6822b9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2332 zcmXw)dra147=|CU14%iQBuIyvtb}l+MOKWo2+Obo>%g!`B~8OHOEb;J@{mYbPRlTi zteK>99hhX1WSi62T$U3plj(9U7SrisE;pB>`|_4Q?(e$y?*4th=X>AheZGk3)h9lP znyWtk%!X;I6qxXPIi9IwGrt9orgb5nW4tM7Gh=^60&cOUE*8@*V{N7Vyoi>!;+iz4v zi$o2uVzl!x^;YN8#8!!XMsCCbiF}*5_;%-E&KT$6QHk@)yECFw;#pXGm!E}&d9HuF zcvdRwRTX>gjhI`YcgVwE?~5qvT^0MqszR^BBjY2gm1!4i?vGfn?}vXq5IX;==n(&T zFk*u;UE(K25#Pzf|0X(fLEQR~*Ws0qxP}CAyTsnY0mXiAvY7suGeg9E5_Q7NCtPQi zcvxZ`-d5r|bHx)9b;7Zwu3?;5^px`x#q$z%!Y9l8t`hO`XZ$^I>SSli#iS{Iw!c_8 z)p`tKI&o_GCl(=6|E zgZTIht_^-&=}e3UgUhdt{Eb+&#O#RB4G_h4; z9S(1F4H@DAiM?$TbGG@tw}^S)I0HK+&I=ZP>pI7aXC>C*qs^|fSnQU#oAJH=Q+Bw9 zGI8b)&cl?Qm-<1>-sN|V6bpXx_rTJ<&P)>L{NiU}{cqm$H3v1@4_!Jh@w9aDyhJk8 z28(|8_iQ<==l<||(-ECZyUt9Rl*`nISJ=bs1p9)kBOdN&4@>obM!tS<#O8E+xNWHY z-i(MtH`>ELN7$ds)_LXF!)r#_7w2n##@fRf_t-O&nZLYi?F7$TJad&9ir-c2nTcmM zG6(TzNnA*y<2w} z-*cDo9n1B9vBK+JB6pSbr62M%^!=>8vRs1XeS diff --git a/music/bluetoothdeviceisreadytopair.chrp b/music/bluetoothdeviceisreadytopair.chrp deleted file mode 100644 index 6bb6ad6466bc2d76c4a90a45460897e931341dd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2352 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 Tt?f@kIwy*8nu}uQpS=2iJlt`` diff --git a/music/entry.chrp b/music/entry.chrp deleted file mode 100644 index b3848635bc7ab6f8a612e8dc1f0498bd633bb7ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17798 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 W7`fH_NCrdaYmp4b`;UM9@BaY#oD0bS diff --git a/music/exorcist.chrp b/music/exorcist.chrp deleted file mode 100644 index b8d1d6fd8b1812a769323397c8b8bc95f9cb44c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4466 zcmXBY1yGf35QgFJpxBDt-5tm7ZY=EX#zHZ%J5dx9ySqEEu)7<(`?p2;@AYx!nakPP zec$~~U^tHB@^JiIE~mQ7?bxrKWDmb@hF&h`Up+pCk$2Qj;1Cbh1F%38#~DxEjW3AJ znjuluvk-ke9VfPj+o_K+qNyGe50RSGL$P0U)%`JN4Bcgh6PtaA!7*iFR0vt&*zV8WSf|e-b=Htlu1-T>Fo}!YMRc z1m6(rd5cR^YKLXmIF;&VoYdMsE*>S;e+&nv(OrWuZ(7af!>7c0p5gp->M`r2SG_KJ zX3!4Na6hsB1K1~{`u#9lCe_V*#6BnYF(|WUXJWN1>Zy)@iM@uAxFf6TJF#0f?Qf>b zu6laBPVBwDfs=D+b_$lysh$e>o!EPAZpfwjMr@Z`v+Xf?9@SIe1!8+%#4&j_I~Ggi zQ;+$9*q$G8Wq#FHVeaJj{(MWYOlGyv=H0EbGvHo4yy@~ep#SBd~n-Omk>oKP^Q++B{ zXs&ui{6Xx@pSY=o>YK4cOP$#fQ?}Bqd6C$emvC%r?LQ7nwo$zlej+t_Uq0jNwyK*g z+Uc&An6SNO6X7XhXP(Ak9dy@lEYwl;!uXolp623CsxQHYowa8pjNL`EaqtMSGmqkc zuBw~4yQ!WB9}_$C3C``V`aG=dt266h)E=7k#C^ohG<)^b{=G3vFV(Z+U1HCE4`=jN zJqWAz(OqT)vCr)v+~%jA?bxNSdb(oTeyXR#Ys9`g*Kv}+>So#g>Mw_1iS70c*ALMC z8?fy_&9=j2gVbZ5BeuhN95q<=(O7JV_Aid_iJkcYR|M#;mDp^kW=*eQ>WPnG#9q%6 zIApl$0a##!c5vehVrQBmBh|kUeMYHXA7hNx{xR_ov1bp(eq+?*k2%L`2Q!@5nGZ2| zoc5n>j#u3qT@!Sd2ks{J?56KT_4L4ulXO=myhZHH+c<5qW&^R(6vr7F&FxgiU&MYs zo13TdT10U>Td?Ca^>o5ifjToaUM4ns1;^MoIx}6bNc((R0f^SG~c6*CU=kQ+g`(@a8u4c_R^K@5SJWA}$ zV>ocWW(Q&31*+%6r^NPrhVw%-Yt~t)p1SC{NcCvApV*lPu+L(h>4({tsBYdPcIJHy zTB_NZSZ$els^ec``$yuA<*M(*ZY%WcX1bNCr^oBWp8W<+UZvS7Sbnv7D&TiwJ?4fr zs&B-0YqdjrOukO_6nKGH|3w_LUiGn9VuSWKKM?yoe8iO-)w2qlZ_*AeFu`Wk6XHo? z@0}U2MfIWR-m1F_;!9%B{t6duQ_o^-uw6Y3G1d;%%}`=H97g}0s`tlSyVRc>9}#s?UY2cuuq>uDY!)_)NFF6pkmnEkS5bKnDFJ>fX(ih6>v##PnL zNMfG{=Nf;1AlAPNyI)toFJ`!*dPclS?E7d=xvANySmBm>D&h}fpNF5g>9*>dvBMqh z-w{*ZRo%Qu?7MRb$KKQII4pTzJ*Dsyv7XPk`hn_Zi*W7G5)(dDJrSNF)_)p@JyLx* z7J97x3*&2I&u%V$qMjw#@Tqoagt4Eg9tV#Q`#v7U0nb%8bHC7CdGIl@XMcioU#e#w z)_$eC>R{B@s(a!-Vtbms-l*Oiv%J-wS@ABhJ@4U+cj^hks_#`dBZ$3se{kCeow*&m zd{n(Frv0Qd)8RE@XI{ripVecQ{ZIRs!>`27{D$kl=-D@5+pns(!(`udmwArZv!BON z-_tFdi~a(@iC0po+offgn9z7z#rA!_=4D(X2@Ti zxe$FKRj-dR9M`|kZA?5w?95Q?$Nz!YtUu=TaQ)lg3@289h`~`@|K9i6STm~X-stjl g{d?~`a5u4MH+`eI98Z3R*uN=qdGlv{iHOMm0a;hbV*mgE diff --git a/music/output.chrp b/music/output.chrp deleted file mode 100644 index ca4e2270820e2090d33c890531961fbc9dd06297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4704 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 diff --git a/music/super_mario.chrp b/music/super_mario.chrp deleted file mode 100644 index 16f8649535a01556ba2658c05c0f13233296288e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2374 zcmeH|ze|;I7{#CKuPie&y9FW+LKH1R4GuLl6eOY0AZU<-Tw4T}hJpwpgd%8YD2kxK zp{2p0B|<33B?zP-!KJ~$Fc1d?7s<}Y=X;?4pyggT_k6hb@V=LGUcNUXDlO3yr=qvK zw>8v)*R1rQQrq*3m54zxzABNyA2wtLKi!xa{HsI;f4)!OiC@UiwMM+wbf<>4WZzU#TX~$-9mv-;%FL9gVdZJ{~dJlbz7#RjFCOfnGPI&yjsT zE#1=RfO;fDpUV;%`n)62KYe~|O8zA8Y)-}}3ghnz<4rA@8Iiv!ye+@1J?NHQeoIv` zyF8W_bzgSr*B)fp<(ou?U2aNb*rlpH$gs=U!Q^Z5w}tVY!uU{oX7E>qH{=%%<>yc2 zD-zEh`_4!MV)i|$UDtG9_We?}X5T4^4EwfgS2FB7SGM-PT+{o)-WT@1@5SC1_P((9 zT^D=b`??n|wt>A7?2TY=1bZXc8^PWP_C}AyY&5BUVfPHXXV^W%?iqH^uzQBxGhMl7 zo;UaWQtY0|xMwo%nT&fT diff --git a/music/tetris.chrp b/music/tetris.chrp deleted file mode 100644 index 88363c33232c94aa3eab2888b80b5419b3323183..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1596 zcmXYwZA_JQ7{;%2j_)TAr&7^UJei0T3Koj^0uP>!N~lnoFJ(eyqGfQ(7c>*deCdNL z7p|Ah3177Z5RZ2;^)-<;U{qAl*Jo{be+V$N3`?>G`krWDP zk6OYh4H7@XQhBIQBSKOf-4`lT820i+!-1~DpCeL5IH|wj#lfEM*1z}((5W#4QxnA+01_fth>X%w+2?;>Hf+|(pvN<%%=(#PnOb=K;&}^8<_3tf!v1!s^@;P@&)9<$4ij;skdG3#cS!8U#8SpAk z3w4G}mj((fUo7QInP{ss48~@7|AK$;M9E)+J@?pNlDY!Fo#}J#y;u6PP^zW>pWrX} zmj4cZHp}Xy)CE7E?fG*>+y}Jns|%i*igZ_zKH!U_Iw&{EqA{b){(J( zYT*23?ys(3k4rpX370Q*e<55##=bXz`49ScEv}T7Rr!1Zn0mndB3MGk=2-wou5ds1 zA@;c3^Aq9Zhut3o$CI)99ESs|{oJuD+3zavCk{v7@Q1?KBYvL+e|*gI*U|ltdj2x} zdyV_Q!AoRXnP(3?`?#NbaV`6;_I`TcuQl#>!}DaU|1S9cQ|^EL1bcka^QYh!>)byH zKP6-HZ-=cL{oIcA?6=nYX@?(faQ`SgLB{6a26sK{{@YKp$7ekM8a%Yg{eAEN8JmAI ztbfkWeWi~7b-nk~4ELtpZ-9+ttp7Azy4C%S&r^G|=d0nmE$**?YslFAt6)`wpSx-s z_W^D9*}T#n?l0QT-qGnuQURQ>%l+aP*!xcJKOYvp=>8O#N2VkaC;|KS__6`w6{{RPcH`o9G diff --git a/navgrid.json b/navgrid.json new file mode 100644 index 0000000..23e0db9 --- /dev/null +++ b/navgrid.json @@ -0,0 +1 @@ +{"field_size":{"x":17.548,"y":8.052},"nodeSizeMeters":0.3,"grid":[[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true]]} \ No newline at end of file diff --git a/org/assabet/aztechs157/PrintLimiter.java b/org/assabet/aztechs157/PrintLimiter.java deleted file mode 100644 index aa6dc7a..0000000 --- a/org/assabet/aztechs157/PrintLimiter.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.assabet.aztechs157; - -public class PrintLimiter { - private final int ticksPerPrint; - private int currentTicks = 0; - - public PrintLimiter(final int ticksPerPrint) { - this.ticksPerPrint = ticksPerPrint; - } - - public PrintLimiter tick() { - currentTicks++; - - if (currentTicks > ticksPerPrint) { - currentTicks = 0; - } - - return this; - } - - public PrintLimiter println(final String message) { - if (currentTicks == 0) { - System.out.println(message); - } - - return this; - } - - public PrintLimiter print(final String message) { - if (currentTicks == 0) { - System.out.print(message); - } - - return this; - } - - public PrintLimiter limitBody(final Runnable body) { - if (currentTicks == 0) { - body.run(); - } - - return this; - } -} diff --git a/org/assabet/aztechs157/Sanity.java b/org/assabet/aztechs157/Sanity.java deleted file mode 100644 index a2ac436..0000000 --- a/org/assabet/aztechs157/Sanity.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.assabet.aztechs157; - -import org.assabet.aztechs157.numbers.Range; - -public final class Sanity { - private Sanity() { - throw new UnsupportedOperationException("Expect is a utility class"); - } - - public static class SanityError extends RuntimeException { - public SanityError(final String message) { - super(message); - } - } - - public static NumberSanity check(final double number) { - return new NumberSanity(number); - } - - public static record NumberSanity(double value) { - public NumberSanity containedWithin(final Range range) { - if (range.contains(value)) { - return this; - } else { - throw new SanityError(value + " was not contained within " + range); - } - } - - public NumberSanity equalTo(final double other) { - if (value == other) { - return this; - } else { - throw new SanityError(value + " was not equal to " + other); - } - } - - public NumberSanity notEqualTo(final double other) { - if (value != other) { - return this; - } else { - throw new SanityError(value + " was equal to " + other); - } - } - - public NumberSanity greaterThan(final double other) { - if (value > other) { - return this; - } else { - throw new SanityError(value + " was not greater than " + other); - } - } - - public NumberSanity lessThan(final double other) { - if (value < other) { - return this; - } else { - throw new SanityError(value + " was not less than " + other); - } - } - - public NumberSanity greaterOrEqual(final double other) { - if (value >= other) { - return this; - } else { - throw new SanityError(value + " was not greater or equal to " + other); - } - } - - public NumberSanity lessOrEqual(final double other) { - if (value <= other) { - return this; - } else { - throw new SanityError(value + " was not less or equal to " + other); - } - } - } - - public static BooleanSanity check(final boolean value) { - return new BooleanSanity(value); - } - - public static record BooleanSanity(boolean value) { - public BooleanSanity equal(final boolean other) { - if (value == other) { - return this; - } else { - throw new SanityError(value + " was not equal to " + other); - } - } - } -} diff --git a/org/assabet/aztechs157/input/Model.java b/org/assabet/aztechs157/input/Model.java deleted file mode 100644 index daa0894..0000000 --- a/org/assabet/aztechs157/input/Model.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.assabet.aztechs157.input; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -/** - * Models map physical inputs on a input device to input classes such as - * {@link Button}, {@link Axis}, or {@link Pov}. - */ -public class Model { - - public final int deviceId; - - /** - * Create a Model that models the device specified by `deviceId` - * - * @param deviceId The id of the device - */ - public Model(final int deviceId) { - this.deviceId = deviceId; - } - - /** - * Create a {@link Button} that models a physical button - * - * @param buttonId The button to model - * @return The modeled {@link Button} - */ - public Button button(final int buttonId) { - return Button.fromDriverStation(deviceId, buttonId); - } - - /** - * Create a {@link Axis} that models a physical axis - * - * @param buttonId The axis to model - * @return The modeled {@link Axis} - */ - public Axis axis(final int axisId) { - return Axis.fromDriverStation(deviceId, axisId); - } - - /** - * Create a {@link Pov} that modes a physical pov - * - * @param povId The pov to model - * @return The modeled {@link Pov} - */ - public Pov pov(final int povId) { - return Pov.fromDriverStation(deviceId, povId); - } -} diff --git a/org/assabet/aztechs157/input/Pov.java b/org/assabet/aztechs157/input/Pov.java deleted file mode 100644 index 7dd2a8f..0000000 --- a/org/assabet/aztechs157/input/Pov.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.assabet.aztechs157.input; - -import java.util.function.IntSupplier; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -import edu.wpi.first.wpilibj.DriverStation; - -/** - * Class for getting input from a pov. - */ -public class Pov { - private final IntSupplier degrees; - - public Pov(final IntSupplier degrees) { - this.degrees = degrees; - } - - public static Pov fromDriverStation(final int deviceId, final int povId) { - return new Pov(() -> DriverStation.getStickPOV(deviceId, povId)); - } - - public int get() { - return degrees.getAsInt(); - } - - public final Axis value = new Axis(() -> get()); - - public final Axis y = new Axis(() -> switch (get()) { - case UP_LEFT, UP, UP_RIGHT -> 1; - case LEFT, CENTER, RIGHT -> 0; - case DOWN_LEFT, DOWN, DOWN_RIGHT -> -1; - default -> 0; - }); - - public final Axis x = new Axis(() -> switch (get()) { - case DOWN_RIGHT, RIGHT, UP_RIGHT -> 1; - case DOWN, CENTER, UP -> 0; - case DOWN_LEFT, LEFT, UP_LEFT -> -1; - default -> 0; - }); - - public static final int CENTER = -1; - public static final int UP = 45 * 0; - public static final int UP_RIGHT = 45 * 1; - public static final int RIGHT = 45 * 2; - public static final int DOWN_RIGHT = 45 * 3; - public static final int DOWN = 45 * 4; - public static final int DOWN_LEFT = 45 * 5; - public static final int LEFT = 45 * 6; - public static final int UP_LEFT = 45 * 7; - - private Button buttonForValue(final int degrees, final String name) { - return new Button(() -> get() == degrees); - } - - public final Button center = buttonForValue(CENTER, "Center"); - public final Button up = buttonForValue(UP, "Up"); - public final Button upRight = buttonForValue(UP_RIGHT, "Up Right"); - public final Button right = buttonForValue(RIGHT, "Right"); - public final Button downRight = buttonForValue(DOWN_RIGHT, "Down Right"); - public final Button down = buttonForValue(DOWN, "Down"); - public final Button downLeft = buttonForValue(DOWN_LEFT, "Down Left"); - public final Button left = buttonForValue(LEFT, "Left"); - public final Button upLeft = buttonForValue(UP_LEFT, "Up Left"); -} diff --git a/org/assabet/aztechs157/input/layouts/DynamicLayout.java b/org/assabet/aztechs157/input/layouts/DynamicLayout.java deleted file mode 100644 index c4cbcf7..0000000 --- a/org/assabet/aztechs157/input/layouts/DynamicLayout.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.assabet.aztechs157.input.layouts; - -import java.util.function.Supplier; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -/** - * Object that manages layouts. A layout can be selected from Shuffleboard that - * can then be used by the robot. It maps the inputs of a - * {@link DynamicLayout} to the desired functions of the robot. - */ -public class DynamicLayout implements Layout { - private final Supplier layoutSupplier; - - public DynamicLayout(final Supplier layoutSupplier) { - this.layoutSupplier = layoutSupplier; - } - - public Layout getCurrent() { - return layoutSupplier.get(); - } - - /** - * Get a button from the currently selected layout. - * - * @param key Which button to retrieve - * @return A {@link Button} and {@link Button.Key} representing the input - */ - public Button button(final Button.Key key) { - return new Button(() -> getCurrent().button(key).get()); - } - - /** - * Get a axis from the currently selected layout. - * - * @param key Which axis to retrieve - * @return A {@link Axis} representing the input - */ - public Axis axis(final Axis.Key key) { - return new Axis(() -> getCurrent().axis(key).get()); - } -} diff --git a/org/assabet/aztechs157/input/layouts/Layout.java b/org/assabet/aztechs157/input/layouts/Layout.java deleted file mode 100644 index 01c914c..0000000 --- a/org/assabet/aztechs157/input/layouts/Layout.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.assabet.aztechs157.input.layouts; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public interface Layout { - /** - * Retrieve the {@link Button} associated with a {@link Button.Key} - * - * @param key The key a button was assigned to - * @return The associated button - */ - public Button button(final Button.Key key); - - /** - * Retrieve the {@link Axis} associated with a {@link Axis.KeyBase} - * - * @param key The key an axis was assigned to - * @return The associated axis - */ - public Axis axis(final Axis.Key key); -} diff --git a/org/assabet/aztechs157/input/layouts/MapLayout.java b/org/assabet/aztechs157/input/layouts/MapLayout.java deleted file mode 100644 index fe4c8b0..0000000 --- a/org/assabet/aztechs157/input/layouts/MapLayout.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.assabet.aztechs157.input.layouts; - -import java.util.HashMap; -import java.util.Map; - -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -/** - * A simple structure that stores the mapping between keys and inputs. These can - * be used with {@link DynamicLayout} to allow hot-swapping of layouts. - */ -public class MapLayout implements Layout { - private final Map buttons = new HashMap<>(); - private final Map axes = new HashMap<>(); - - /** - * For this Layout, assign a {@link Button.Key} to a {@link Button}. - * Calling - * this method multiple times with the same key will override the previous - * assignment. - * - * @param key The key to assign with - * @param button The button being assigned - */ - public void assign(final Button.Key key, final Button button) { - buttons.put(key, button); - } - - /** - * For this Layout, assign a {@link Axis.KeyBase} to a {@link Axis}. Calling - * this - * method multiple times with the same key will override the previous - * assignment. - * - * @param key The key to assign with - * @param axis The axis being assigned - */ - public void assign(final Axis.Key key, final Axis axis) { - axes.put(key, axis); - } - - /** - * Retrieve the {@link Button} associated with a {@link Button.Key} - * - * @param key The key a button was assigned to - * @return The associated button - */ - public Button button(final Button.Key key) { - return buttons.get(key); - } - - /** - * Retrieve the {@link Axis} associated with a {@link Axis.KeyBase} - * - * @param key The key an axis was assigned to - * @return The associated axis - */ - public Axis axis(final Axis.Key key) { - return axes.get(key); - } -} diff --git a/org/assabet/aztechs157/input/models/LogitechAttack.java b/org/assabet/aztechs157/input/models/LogitechAttack.java deleted file mode 100644 index c097cc6..0000000 --- a/org/assabet/aztechs157/input/models/LogitechAttack.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.assabet.aztechs157.input.models; - -import org.assabet.aztechs157.input.Model; -import org.assabet.aztechs157.input.Pov; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public class LogitechAttack extends Model { - - public LogitechAttack(final int joystickId) { - super(joystickId); - } - - public final Button trigger = button(1); - public final Button button2 = button(2); - public final Button button3 = button(3); - public final Button button4 = button(4); - public final Button button5 = button(5); - public final Button button6 = button(6); - public final Button button7 = button(7); - public final Button button8 = button(8); - public final Button button9 = button(9); - public final Button button10 = button(10); - public final Button button11 = button(11); - - public final Axis stickX = axis(0); - public final Axis stickY = axis(1); - public final Axis slider = axis(3); - - public final Pov pov = pov(0); -} diff --git a/org/assabet/aztechs157/input/models/LogitechExtreme3D.java b/org/assabet/aztechs157/input/models/LogitechExtreme3D.java deleted file mode 100644 index 59a51e3..0000000 --- a/org/assabet/aztechs157/input/models/LogitechExtreme3D.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.assabet.aztechs157.input.models; - -import org.assabet.aztechs157.input.Model; -import org.assabet.aztechs157.input.Pov; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public class LogitechExtreme3D extends Model { - public LogitechExtreme3D(final int joystickId) { - super(joystickId); - } - - public final Button trigger = button(1); - public final Button thumb = button(2); - public final Button button3 = button(3); - public final Button button4 = button(4); - public final Button button5 = button(5); - public final Button button6 = button(6); - public final Button button7 = button(7); - public final Button button8 = button(8); - public final Button button9 = button(9); - public final Button button10 = button(10); - public final Button button11 = button(11); - public final Button button12 = button(12); - - public final Axis stickX = axis(0); - public final Axis stickY = axis(1); - public final Axis stickRotate = axis(2); - public final Axis slider = axis(3); - - public final Pov pov = pov(0); -} diff --git a/org/assabet/aztechs157/input/models/LogitechGamepadF310.java b/org/assabet/aztechs157/input/models/LogitechGamepadF310.java deleted file mode 100644 index 3be4af0..0000000 --- a/org/assabet/aztechs157/input/models/LogitechGamepadF310.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.assabet.aztechs157.input.models; - -import org.assabet.aztechs157.input.Model; -import org.assabet.aztechs157.input.Pov; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public class LogitechGamepadF310 extends Model { - - public LogitechGamepadF310(final int joystickId) { - super(joystickId); - } - - public final Button a = button(1); - public final Button b = button(2); - public final Button x = button(3); - public final Button y = button(4); - public final Button leftBumper = button(5); - public final Button rightBumper = button(6); - public final Button back = button(7); - public final Button start = button(8); - public final Button leftStickPress = button(9); - public final Button rightStickPress = button(10); - - public final Axis leftStickX = axis(0); - public final Axis leftStickY = axis(1); - public final Axis rightTriggerHeld = axis(2); - public final Axis leftTriggerHeld = axis(3); - public final Axis rightStickX = axis(4); - public final Axis rightStickY = axis(5); - public final Axis combinedTriggersHeld = rightTriggerHeld.offsetBy(leftTriggerHeld.inverted()::get); - - public final Pov pov = pov(0); -} diff --git a/org/assabet/aztechs157/input/models/XboxOne.java b/org/assabet/aztechs157/input/models/XboxOne.java deleted file mode 100644 index 0bc79fe..0000000 --- a/org/assabet/aztechs157/input/models/XboxOne.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.assabet.aztechs157.input.models; - -import org.assabet.aztechs157.input.Model; -import org.assabet.aztechs157.input.Pov; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; - -public class XboxOne extends Model { - - public XboxOne(final int joystickId) { - super(joystickId); - } - - public final Button a = button(1); - public final Button b = button(2); - public final Button x = button(3); - public final Button y = button(4); - public final Button leftBumper = button(5); - public final Button rightBumper = button(6); - public final Button back = button(7); - public final Button start = button(8); - public final Button leftStickPress = button(9); - public final Button rightStickPress = button(10); - - public final Axis leftStickX = axis(0); - public final Axis leftStickY = axis(1); - public final Axis leftTriggerHeld = axis(2); - public final Axis rightTriggerHeld = axis(3); - public final Axis rightStickX = axis(4); - public final Axis rightStickY = axis(5); - public final Axis combinedTriggersHeld = rightTriggerHeld.offsetBy(leftTriggerHeld.inverted()::get); - - public final Pov pov = pov(0); -} diff --git a/org/assabet/aztechs157/input/values/Axis.java b/org/assabet/aztechs157/input/values/Axis.java deleted file mode 100644 index 892cbfd..0000000 --- a/org/assabet/aztechs157/input/values/Axis.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.assabet.aztechs157.input.values; - -import java.util.function.DoubleConsumer; -import java.util.function.DoubleSupplier; -import java.util.function.DoubleUnaryOperator; - -import org.assabet.aztechs157.numbers.Range; - -import edu.wpi.first.wpilibj.DriverStation; - -/** - * Class for getting input from a axis. This class has methods and static - * methods to modify and compose {@link Axis}s into a new - * {@link Axis}. - */ -public class Axis { - public static class Key { - } - - public static final Range kDeviceDefaultRange = new Range(-1, 1); - - private final DoubleSupplier value; - - public Axis(final DoubleSupplier value) { - this.value = value; - } - - public static Axis fromDriverStation(final int deviceId, final int axisId) { - return new Axis(() -> DriverStation.getStickAxis(deviceId, axisId)); - } - - public static Axis always(final double value) { - return new Axis(() -> value); - } - - public double get() { - return value.getAsDouble(); - } - - public Axis map(final DoubleUnaryOperator body) { - return new Axis(() -> body.applyAsDouble(get())); - } - - public Axis tap(final DoubleConsumer body) { - return map(value -> { - body.accept(value); - return value; - }); - } - - /** - * Inverts the input by negating the number's sign - * - * @return A new inverted input - */ - public Axis inverted() { - return map(value -> -value); - } - - /** - * Scale the input with a scalar value. - * - * @param scale The value to scale by - * @return A new input with the scale applied - */ - public Axis scaledBy(final double scale) { - return map(value -> value * scale); - } - - /** - * Scale the input with another input. - * - * @param scale The input to retrieve the scale from - * @return A new input with the scale applied - */ - public Axis scaledBy(final DoubleSupplier scale) { - return map(value -> value * scale.getAsDouble()); - } - - public Axis offsetBy(final double offset) { - return map(value -> value + offset); - } - - public Axis offsetBy(final DoubleSupplier offset) { - return map(value -> value + offset.getAsDouble()); - } - - /** - * Clamp the input to a number within the provided range. - * - * @param range The range to clamp to - * @return A new input with clamp applied - */ - public Axis clampTo(final Range range) { - return map(value -> range.clamp(value)); - } -} diff --git a/org/assabet/aztechs157/input/values/Button.java b/org/assabet/aztechs157/input/values/Button.java deleted file mode 100644 index ebd6a2d..0000000 --- a/org/assabet/aztechs157/input/values/Button.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.assabet.aztechs157.input.values; - -import java.util.function.BooleanSupplier; -import java.util.function.UnaryOperator; - -import edu.wpi.first.util.function.BooleanConsumer; -import edu.wpi.first.wpilibj.DriverStation; -import edu.wpi.first.wpilibj2.command.Command; -import edu.wpi.first.wpilibj2.command.button.Trigger; - -/** - * Class for getting input from a button. This class has methods and static - * methods to modify and compose {@link Button}s into a new - * {@link Button}. - */ -public class Button { - public static class Key { - } - - private final BooleanSupplier value; - - public Button(final BooleanSupplier value) { - this.value = value; - } - - public static Button fromDriverStation(final int deviceId, final int buttonId) { - return new Button(() -> DriverStation.getStickButton(deviceId, buttonId)); - } - - public static Button always(final boolean value) { - return new Button(() -> value); - } - - public boolean get() { - return value.getAsBoolean(); - } - - public Button whenPressed(final Command command) { - new Trigger(value).onTrue(command); - return this; - } - - public Button whileHeld(final Command command) { - new Trigger(value).whileTrue(command); - return this; - } - - public Button toggleWhenPressed(final Command command) { - new Trigger(value).toggleOnTrue(command); - return this; - } - - public Button map(final UnaryOperator body) { - return new Button(() -> body.apply(get())); - } - - public Button tap(final BooleanConsumer body) { - return map(value -> { - body.accept(value); - return value; - }); - } - - /** - * Inverts the input; similar to a boolean `!` - * - * @return A new inverted input - */ - public Button inverted() { - return map(value -> !value); - } - - /** - * Checks that all inputs are true; similar to a boolean `&&` - * - * @param first The first input - * @param rest The rest of the inputs - * @return A new input that is only true when all of the passed inputs are true - */ - public static Button all(final Button first, final Button... rest) { - // The first argument is explicit to prevent being given empty arrays - - return new Button(() -> { - // Check each input individually - // As soon as one input is false, return false - - if (first != null && first.get() == false) { - return false; - } - - for (final var input : rest) { - if (input != null && input.get() == false) { - return false; - } - } - - // All inputs are true at this point, so return true - return true; - }); - } - - /** - * Checks that any input is true; similar to a boolean `||` - * - * @param first The first input - * @param rest The rest of the inputs - * @return A new input that is true when any of the passed inputs are true - */ - public static Button any(final Button first, final Button... rest) { - // The first argument is explicit to prevent being given empty arrays - - return new Button(() -> { - // Check each input individually - // As soon as one input is true, return true - - if (first != null && first.get()) { - return true; - } - - for (final var input : rest) { - if (input != null && input.get()) { - return true; - } - } - - // All inputs are false at this point, so return false - return false; - }); - - } -} diff --git a/org/assabet/aztechs157/numbers/Deadzone.java b/org/assabet/aztechs157/numbers/Deadzone.java deleted file mode 100644 index 62a1578..0000000 --- a/org/assabet/aztechs157/numbers/Deadzone.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.assabet.aztechs157.numbers; - -import org.assabet.aztechs157.input.values.Axis; - -public class Deadzone { - public final Range deadzone; - public final Range full; - public final RangeConverter leftConverter; - public final RangeConverter rightConverter; - - public static Deadzone forAxis(final Range deadzone) { - return new Deadzone(deadzone, Axis.kDeviceDefaultRange, 0); - } - - public Deadzone(final Range deadzone, final Range full, final double fullCenter) { - this.deadzone = deadzone; - this.full = full; - - final var leftFull = new Range(full.start(), fullCenter); - final var leftDeadzone = new Range(full.start(), deadzone.start()); - this.leftConverter = new RangeConverter(leftDeadzone, leftFull); - - final var rightFull = new Range(fullCenter, full.end()); - final var rightDeadzone = new Range(deadzone.end(), full.end()); - this.rightConverter = new RangeConverter(rightDeadzone, rightFull); - } - - public double apply(final double input) { - if (deadzone.contains(input)) { - return 0; - } else if (leftConverter.inputRange.contains(input)) { - return leftConverter.convert(input); - } else if (rightConverter.inputRange.contains(input)) { - return rightConverter.convert(input); - } - - throw new Error("Attempted to apply deadzone to input outside of full range " - + full.start() + " to " + full.end()); - } -} diff --git a/org/assabet/aztechs157/numbers/Range.java b/org/assabet/aztechs157/numbers/Range.java deleted file mode 100644 index a69bb32..0000000 --- a/org/assabet/aztechs157/numbers/Range.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.assabet.aztechs157.numbers; - -public record Range(double start, double end) { - - public boolean contains(final double value) { - return start <= value && value <= end; - } - - public double range() { - return end - start; - } - - public double clamp(final double value) { - if (value < start) { - return start; - } else if (value > end) { - return end; - } else { - return value; - } - } - - public double limitMotionWithinRange(final double speed, final double currentPosition) { - if (speed > 0 && currentPosition > end) { - return 0; - } else if (speed < 0 && currentPosition < start) { - return 0; - } else { - return speed; - } - } - - public RangeConverter convertingTo(final Range output) { - return new RangeConverter(this, output); - } -} diff --git a/org/assabet/aztechs157/numbers/RangeConverter.java b/org/assabet/aztechs157/numbers/RangeConverter.java deleted file mode 100644 index edb424e..0000000 --- a/org/assabet/aztechs157/numbers/RangeConverter.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.assabet.aztechs157.numbers; - -public class RangeConverter { - public final Range inputRange; - public final Range outputRange; - public final double scaleFactor; - - public RangeConverter(final Range inputRange, final Range outputRange) { - this.inputRange = inputRange; - this.outputRange = outputRange; - this.scaleFactor = outputRange.range() / inputRange.range(); - } - - public double convert(final double inputValue) { - // Shift to zero based input range - final var basedInput = inputValue - inputRange.start(); - - // Scale the zero based input - final var scaled = basedInput * scaleFactor; - - // Shift from zero based to output range - final var outputValue = scaled + outputRange.start(); - - return outputValue; - } -} diff --git a/pathplanner/autos/1m backward auto.auto b/pathplanner/autos/1m backward auto.auto deleted file mode 100644 index e988db7..0000000 --- a/pathplanner/autos/1m backward auto.auto +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m backward" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/pathplanner/autos/1m forward & backwards x25.auto b/pathplanner/autos/1m forward & backwards x25.auto deleted file mode 100644 index e2f253c..0000000 --- a/pathplanner/autos/1m forward & backwards x25.auto +++ /dev/null @@ -1,169 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 2.0, - "y": 7.0 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - }, - { - "type": "path", - "data": { - "pathName": "1m Back and forth" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/pathplanner/autos/1m forward & backwards.auto b/pathplanner/autos/1m forward & backwards.auto deleted file mode 100644 index 79adb64..0000000 --- a/pathplanner/autos/1m forward & backwards.auto +++ /dev/null @@ -1,302 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - },{ - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m forward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - }, - { - "type": "path", - "data": { - "pathName": "1m backward" - } - }, - { - "type": "wait", - "data": { - "waitTime": 1.0 - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/pathplanner/autos/1m forward auto.auto b/pathplanner/autos/1m forward auto.auto deleted file mode 100644 index de1be04..0000000 --- a/pathplanner/autos/1m forward auto.auto +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m forward" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/pathplanner/autos/1m right auto.auto b/pathplanner/autos/1m right auto.auto deleted file mode 100644 index 69e6f18..0000000 --- a/pathplanner/autos/1m right auto.auto +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 1.0, - "startingPose": { - "position": { - "x": 1.0, - "y": 5.59 - }, - "rotation": 0 - }, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "1m right" - } - } - ] - } - }, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/pathplanner/autos/New Auto.auto b/pathplanner/autos/New Auto.auto index 9e7a7f3..70b7ab2 100644 --- a/pathplanner/autos/New Auto.auto +++ b/pathplanner/autos/New Auto.auto @@ -1,12 +1,5 @@ { - "version": 1.0, - "startingPose": { - "position": { - "x": 2.0, - "y": 7.0 - }, - "rotation": 0 - }, + "version": "2025.0", "command": { "type": "sequential", "data": { @@ -14,12 +7,13 @@ { "type": "path", "data": { - "pathName": "test" + "pathName": "Example Path" } } ] } }, + "resetOdom": true, "folder": null, "choreoAuto": false } \ No newline at end of file diff --git a/pathplanner/navgrid.json b/pathplanner/navgrid.json index bab0da9..23e0db9 100644 --- a/pathplanner/navgrid.json +++ b/pathplanner/navgrid.json @@ -1 +1 @@ -{"field_size":{"x":16.54,"y":8.21},"nodeSizeMeters":0.3,"grid":[[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true],[true,true,true,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true]]} \ No newline at end of file +{"field_size":{"x":17.548,"y":8.052},"nodeSizeMeters":0.3,"grid":[[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true]]} \ No newline at end of file diff --git a/pathplanner/paths/1m Back and forth.path b/pathplanner/paths/1m Back and forth.path deleted file mode 100644 index add093c..0000000 --- a/pathplanner/paths/1m Back and forth.path +++ /dev/null @@ -1,103 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 2.0, - "y": 7.0 - }, - "prevControl": null, - "nextControl": { - "x": 2.1, - "y": 7.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 3.0, - "y": 7.0 - }, - "prevControl": { - "x": 2.9, - "y": 7.0 - }, - "nextControl": { - "x": 3.1, - "y": 7.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 2.0, - "y": 7.0 - }, - "prevControl": { - "x": 1.9, - "y": 7.0 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [ - { - "name": "Wait", - "waypointRelativePos": 1.0, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "wait", - "data": { - "waitTime": 0.5 - } - } - ] - } - } - }, - { - "name": "Wait 2", - "waypointRelativePos": 0, - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "wait", - "data": { - "waitTime": 0.5 - } - } - ] - } - } - } - ], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/pathplanner/paths/1m backward.path b/pathplanner/paths/1m backward.path deleted file mode 100644 index fa735aa..0000000 --- a/pathplanner/paths/1m backward.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 2.0, - "y": 5.59 - }, - "prevControl": null, - "nextControl": { - "x": 2.1, - "y": 5.59 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 1.0, - "y": 5.59 - }, - "prevControl": { - "x": 1.1, - "y": 5.59 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/pathplanner/paths/1m forward.path b/pathplanner/paths/1m forward.path deleted file mode 100644 index 544f728..0000000 --- a/pathplanner/paths/1m forward.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 1.0, - "y": 5.589805823486292 - }, - "prevControl": null, - "nextControl": { - "x": 1.9999999999999967, - "y": 5.589805823486292 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 2.0, - "y": 5.589805823486292 - }, - "prevControl": { - "x": 1.0, - "y": 5.589805823486292 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/pathplanner/paths/1m left.path b/pathplanner/paths/1m left.path deleted file mode 100644 index 1482a76..0000000 --- a/pathplanner/paths/1m left.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 1.0, - "y": 5.59 - }, - "prevControl": null, - "nextControl": { - "x": 1.0, - "y": 6.502346398657132 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 1.0, - "y": 6.59 - }, - "prevControl": { - "x": 0.9999999999999999, - "y": 5.59 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/pathplanner/paths/1m right.path b/pathplanner/paths/1m right.path deleted file mode 100644 index 88a7b65..0000000 --- a/pathplanner/paths/1m right.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 1.0, - "y": 5.59 - }, - "prevControl": null, - "nextControl": { - "x": 1.0, - "y": 5.49 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 1.0, - "y": 4.59 - }, - "prevControl": { - "x": 1.0, - "y": 4.54 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/pathplanner/paths/Example Path.path b/pathplanner/paths/Example Path.path index f745d1b..7b84c0a 100644 --- a/pathplanner/paths/Example Path.path +++ b/pathplanner/paths/Example Path.path @@ -1,26 +1,26 @@ { - "version": 1.0, + "version": "2025.0", "waypoints": [ { "anchor": { - "x": 2.0, - "y": 7.0 + "x": 4.0, + "y": 6.0 }, "prevControl": null, "nextControl": { - "x": 3.0, - "y": 7.0 + "x": 5.0, + "y": 6.0 }, "isLocked": false, "linkedName": null }, { "anchor": { - "x": 4.0, + "x": 5.0, "y": 6.0 }, "prevControl": { - "x": 3.0, + "x": 4.0, "y": 6.0 }, "nextControl": null, @@ -30,23 +30,25 @@ ], "rotationTargets": [], "constraintZones": [], + "pointTowardsZones": [], "eventMarkers": [], "globalConstraints": { - "maxVelocity": 5.0292, + "maxVelocity": 3.0, "maxAcceleration": 3.0, "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 + "maxAngularAcceleration": 720.0, + "nominalVoltage": 12.0, + "unlimited": false }, "goalEndState": { "velocity": 0, - "rotation": 0, - "rotateFast": false + "rotation": 0.0 }, "reversed": false, "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 + "idealStartingState": { + "velocity": 0, + "rotation": 0.0 }, "useDefaultConstraints": true } \ No newline at end of file diff --git a/pathplanner/paths/Stephen.path b/pathplanner/paths/Stephen.path deleted file mode 100644 index 9126da3..0000000 --- a/pathplanner/paths/Stephen.path +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 2.0, - "y": 7.0 - }, - "prevControl": null, - "nextControl": { - "x": 3.0, - "y": 7.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 7.439971575099845, - "y": 5.028486410249174 - }, - "prevControl": { - "x": 7.182700177366168, - "y": 6.2563726267053665 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": -33.02386755579669, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/pathplanner/paths/test.path b/pathplanner/paths/test.path deleted file mode 100644 index 16dc425..0000000 --- a/pathplanner/paths/test.path +++ /dev/null @@ -1,68 +0,0 @@ -{ - "version": 1.0, - "waypoints": [ - { - "anchor": { - "x": 2.0, - "y": 7.0 - }, - "prevControl": null, - "nextControl": { - "x": 3.0, - "y": 7.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 6.200391204201211, - "y": 6.572114796651245 - }, - "prevControl": { - "x": 5.200391204201211, - "y": 6.572114796651245 - }, - "nextControl": { - "x": 7.200391204201211, - "y": 6.572114796651245 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 7.486748192869604, - "y": 4.654273468091096 - }, - "prevControl": { - "x": 7.694394331808605, - "y": 5.256522421876753 - }, - "nextControl": null, - "isLocked": false, - "linkedName": null - } - ], - "rotationTargets": [], - "constraintZones": [], - "eventMarkers": [], - "globalConstraints": { - "maxVelocity": 5.0292, - "maxAcceleration": 3.0, - "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 - }, - "goalEndState": { - "velocity": 0, - "rotation": 0, - "rotateFast": false - }, - "reversed": false, - "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 - }, - "useDefaultConstraints": true -} \ No newline at end of file diff --git a/deploy/pathplanner/paths/1m left.path b/paths/Example Path.path similarity index 60% rename from deploy/pathplanner/paths/1m left.path rename to paths/Example Path.path index 1482a76..7b84c0a 100644 --- a/deploy/pathplanner/paths/1m left.path +++ b/paths/Example Path.path @@ -1,27 +1,27 @@ { - "version": 1.0, + "version": "2025.0", "waypoints": [ { "anchor": { - "x": 1.0, - "y": 5.59 + "x": 4.0, + "y": 6.0 }, "prevControl": null, "nextControl": { - "x": 1.0, - "y": 6.502346398657132 + "x": 5.0, + "y": 6.0 }, "isLocked": false, "linkedName": null }, { "anchor": { - "x": 1.0, - "y": 6.59 + "x": 5.0, + "y": 6.0 }, "prevControl": { - "x": 0.9999999999999999, - "y": 5.59 + "x": 4.0, + "y": 6.0 }, "nextControl": null, "isLocked": false, @@ -30,23 +30,25 @@ ], "rotationTargets": [], "constraintZones": [], + "pointTowardsZones": [], "eventMarkers": [], "globalConstraints": { - "maxVelocity": 5.0292, + "maxVelocity": 3.0, "maxAcceleration": 3.0, "maxAngularVelocity": 540.0, - "maxAngularAcceleration": 720.0 + "maxAngularAcceleration": 720.0, + "nominalVoltage": 12.0, + "unlimited": false }, "goalEndState": { "velocity": 0, - "rotation": 0, - "rotateFast": false + "rotation": 0.0 }, "reversed": false, "folder": null, - "previewStartingState": { - "rotation": 0, - "velocity": 0 + "idealStartingState": { + "velocity": 0, + "rotation": 0.0 }, "useDefaultConstraints": true } \ No newline at end of file diff --git a/robot/Inputs.java b/robot/Inputs.java deleted file mode 100644 index 26d5bfa..0000000 --- a/robot/Inputs.java +++ /dev/null @@ -1,98 +0,0 @@ -// 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; - -import org.assabet.aztechs157.input.layouts.DynamicLayout; -import org.assabet.aztechs157.input.layouts.Layout; -import org.assabet.aztechs157.input.layouts.MapLayout; -import java.util.function.DoubleSupplier; -import org.assabet.aztechs157.input.models.XboxOne; -import org.assabet.aztechs157.input.values.Axis; -import org.assabet.aztechs157.input.values.Button; -import org.assabet.aztechs157.numbers.Deadzone; -import org.assabet.aztechs157.numbers.Range; - -import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard; -import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; -import frc.robot.Constants.ControllerConstants; - -/** Add your docs here. */ -public class Inputs extends DynamicLayout { - - public static final Axis.Key precisionDrive = new Axis.Key(); - - ////////////////////////////////////////////////////////// - // HERE'S AN EXAMPLE OF USING ADDING NEW BUTTONS/AXIS - ///////////////////////////////////////////////////////// - - // public static final Button.Key resetGyro = new Button.Key(); - - // public static final Button.Key driveToSpeaker = new Button.Key(); - // public static final Button.Key driveToAmp = new Button.Key(); - // public static final Button.Key autoIntake = new Button.Key(); - - // public static final Button.Key intake = new Button.Key(); - // public static final Button.Key loadNote = new Button.Key(); - // public static final Button.Key eject = new Button.Key(); - - // public static final Button.Key highShotSpinUp = new Button.Key(); - // public static final Button.Key lowShotSpinUp = new Button.Key(); - - // public static final Button.Key highShot = new Button.Key(); - // public static final Button.Key lowShot = new Button.Key(); - // public static final Button.Key pass = new Button.Key(); - - // public static final Button.Key liftHanger = new Button.Key(); - // public static final Button.Key retractHanger = new Button.Key(); - // public static final Button.Key retractHangerPin = new Button.Key(); - // public static final Button.Key extendHangerPin = new Button.Key(); - - public static Inputs createFromChooser() { - final SendableChooser chooser = new SendableChooser<>(); - chooser.setDefaultOption("xbox", doubleXBOXLayout()); - Shuffleboard.getTab("Driver").add("Layout Choose", chooser); - - return new Inputs(chooser); - } - - private Inputs(final SendableChooser chooser) { - super(chooser::getSelected); - } - - private static Layout doubleXBOXLayout() { - - final var layout = new MapLayout(); - final var driver = new XboxOne(ControllerConstants.DRIVER_CONTROLLER_PORT); - final var operator = new XboxOne(ControllerConstants.OPERATOR_CONTROLLER_PORT); - - layout.assign(precisionDrive, driver.leftTriggerHeld.map(Deadzone.forAxis(new Range(0.0, 0.05))::apply).scaledBy(0.7)); - - ////////////////////////////////////////////////////////// - // HERE'S AN EXAMPLE OF USING CONTROLER LAYOUT OPTIONS - ///////////////////////////////////////////////////////// - - // layout.assign(driveToSpeaker, operator.a); - // layout.assign(driveToAmp, operator.b); - // layout.assign(resetGyro, driver.start); - // layout.assign(autoIntake, operator.leftBumper); - - // layout.assign(intake, driver.leftBumper); - // layout.assign(loadNote, operator.x); - - // layout.assign(highShotSpinUp, operator.rightBumper); - // layout.assign(lowShotSpinUp, operator.leftBumper); - - // layout.assign(highShot, new Button(() -> driver.rightTriggerHeld.get() > 0.2)); - // layout.assign(lowShot, driver.rightBumper); - // layout.assign(pass, operator.a); - // layout.assign(eject, operator.b); - - // layout.assign(liftHanger, operator.pov.up); - // layout.assign(retractHanger, operator.pov.down); - - return layout; - } - -} diff --git a/robot/Robot.java b/robot/Robot.java index 0556048..6973bbe 100644 --- a/robot/Robot.java +++ b/robot/Robot.java @@ -11,10 +11,9 @@ public class Robot extends TimedRobot { private Command m_autonomousCommand; - private RobotContainer m_robotContainer; + private final RobotContainer m_robotContainer; - @Override - public void robotInit() { + public Robot() { m_robotContainer = new RobotContainer(); } diff --git a/robot/RobotContainer.java b/robot/RobotContainer.java index 5718dfb..0cd4e30 100644 --- a/robot/RobotContainer.java +++ b/robot/RobotContainer.java @@ -4,127 +4,83 @@ package frc.robot; -import java.util.HashMap; -import java.util.Map; - -import org.assabet.aztechs157.input.layouts.Layout; - -import static edu.wpi.first.units.Units.*; - -import com.ctre.phoenix6.Orchestra; +import static edu.wpi.first.units.Units.MetersPerSecond; +import static edu.wpi.first.units.Units.RadiansPerSecond; +import static edu.wpi.first.units.Units.RotationsPerSecond; import com.ctre.phoenix6.swerve.SwerveModule.DriveRequestType; import com.ctre.phoenix6.swerve.SwerveRequest; - import com.pathplanner.lib.auto.AutoBuilder; +import edu.wpi.first.math.MathUtil; import edu.wpi.first.math.geometry.Rotation2d; 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.button.CommandXboxController; -import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine.Direction; - import frc.robot.generated.TunerConstants; -import frc.robot.subsystems.DriveSystem; -import edu.wpi.first.wpilibj2.command.Subsystem; -import frc.robot.data.LoggingSystem; +import frc.robot.subsystems.CommandSwerveDrivetrain; +import frc.robot.subsystems.Constants.ControllerConstants; public class RobotContainer { - private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed - private double MaxAngularRate = RotationsPerSecond.of(0.75).in(RadiansPerSecond); // 3/4 of a rotation per second max angular velocity - private Map SystemMap = new HashMap(); - - private final CommandXboxController joystick = new CommandXboxController(0); // My joystick - public final DriveSystem drivetrain = TunerConstants.createDrivetrain(); // My drivetrain - - {SystemMap.put("Drive",drivetrain);} - private final Layout inputs = Inputs.createFromChooser(); - private final LoggingSystem loggingSystem = new LoggingSystem(SystemMap); - private final SendableChooser autoChooser; - -/* Setting up bindings for necessary control of the swerve drive platform */ -private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric() -.withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1) // Add a 10% deadband -.withDriveRequestType(DriveRequestType.OpenLoopVoltage); // Use open-loop control for drive motors -private final SwerveRequest.SwerveDriveBrake brake = new SwerveRequest.SwerveDriveBrake(); -private final SwerveRequest.PointWheelsAt point = new SwerveRequest.PointWheelsAt(); -private final SwerveRequest.RobotCentric forwardStraight = new SwerveRequest.RobotCentric() -.withDriveRequestType(DriveRequestType.OpenLoopVoltage); - - private final Telemetry logger = new Telemetry(MaxSpeed); - - // Slew Rate Limiters to limit acceleration of joystick inputs - // private final SlewRateLimiter xLimiter = new SlewRateLimiter(25); - // private final SlewRateLimiter yLimiter = new SlewRateLimiter(25); - // private final SlewRateLimiter rotLimiter = new SlewRateLimiter(1570); - - private Orchestra soundSystem = new Orchestra(); - - public RobotContainer() { - configureBindings(); - - autoChooser = AutoBuilder.buildAutoChooser("NothingAuto"); - SmartDashboard.putData("Auto Chooser", autoChooser); - for(int i = 0; i<4;i++){ - soundSystem.addInstrument(drivetrain.getModule(i).getDriveMotor(), 0); - soundSystem.addInstrument(drivetrain.getModule(i).getSteerMotor(), 1); - } - soundSystem.loadMusic("music/e1m1.chrp"); - } - - /** - * Use this to pass the autonomous command to the main {@link Robot} class. - * - * @return the command to run in autonomous - */ - public Command getAutonomousCommand() { - // An example command will be run in autonomous - return autoChooser.getSelected(); - } + private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed + private double MaxAngularRate = RotationsPerSecond.of(1).in(RadiansPerSecond); // 1 of a rotation per second max angular velocity - public double modifySpeed(final double speed) { - final var modifier = 1 - inputs.axis(Inputs.precisionDrive).get(); - return speed * modifier; -} + private final SendableChooser autoChooser; - private void configureBindings() { - // Note that X is defined as forward according to WPILib convention, - // and Y is defined as to the left according to WPILib convention. - drivetrain.setDefaultCommand( // Drivetrain will execute this command periodically - drivetrain.applyRequest(() -> drive.withVelocityX(-joystick.getLeftY() /* TODO: check inversion */ * modifySpeed(MaxSpeed)) // Drive forward with - // negative Y (forward) - .withVelocityY(-joystick.getLeftX() /* TODO: check inversion */ * modifySpeed(MaxSpeed)) // Drive left with negative X (left) - .withRotationalRate(-joystick.getRightX() /* TODO: check inversion */ * MaxAngularRate) // Drive counterclockwise with negative X (left) - )); + /* Setting up bindings for necessary control of the swerve drive platform */ + private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric() + .withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1) // Add a 10% deadband + .withDriveRequestType(DriveRequestType.OpenLoopVoltage); // Use open-loop control for drive motors + private final SwerveRequest.SwerveDriveBrake brake = new SwerveRequest.SwerveDriveBrake(); + private final SwerveRequest.PointWheelsAt point = new SwerveRequest.PointWheelsAt(); + + private final Telemetry logger = new Telemetry(MaxSpeed); + + private final CommandXboxController joystick = new CommandXboxController(0); - joystick.a().whileTrue(drivetrain.applyRequest(() -> brake)); - joystick.b().whileTrue(drivetrain.applyRequest(() -> + public final CommandSwerveDrivetrain drivetrain = TunerConstants.createDrivetrain(); + + public RobotContainer() { + configureBindings(); + + autoChooser = AutoBuilder.buildAutoChooser("New Auto"); + + SmartDashboard.putData("Auto Chooser", autoChooser); + } + + private void configureBindings() { + // Note that X is defined as forward according to WPILib convention, + // and Y is defined as to the left according to WPILib convention. + drivetrain.setDefaultCommand( + // Drivetrain will execute this command periodically + drivetrain.applyRequest(() -> + drive.withVelocityX(MathUtil.applyDeadband(-joystick.getLeftY(), ControllerConstants.LEFT_Y_DEADBAND) * MaxSpeed) // Drive forward with negative Y (forward) + .withVelocityY(MathUtil.applyDeadband(-joystick.getLeftX(), ControllerConstants.LEFT_X_DEADBAND) * MaxSpeed) // Drive left with negative X (left) + .withRotationalRate(MathUtil.applyDeadband(-joystick.getRightX(), ControllerConstants.RIGHT_X_DEADBAND) * MaxAngularRate) // Drive counterclockwise with negative X (left) + ) + ); + + joystick.a().whileTrue(drivetrain.applyRequest(() -> brake)); + joystick.b().whileTrue(drivetrain.applyRequest(() -> point.withModuleDirection(new Rotation2d(-joystick.getLeftY(), -joystick.getLeftX())) )); - joystick.pov(0).whileTrue(drivetrain.applyRequest(() -> - forwardStraight.withVelocityX(0.5).withVelocityY(0)) - ); - joystick.pov(180).whileTrue(drivetrain.applyRequest(() -> - forwardStraight.withVelocityX(-0.5).withVelocityY(0)) - ); - - // Run SysId routines when holding back/start and X/Y. - // Note that each routine should be run exactly once in a single log. - joystick.back().and(joystick.y()).whileTrue(drivetrain.sysIdDynamic(Direction.kForward)); - joystick.back().and(joystick.x()).whileTrue(drivetrain.sysIdDynamic(Direction.kReverse)); - joystick.start().and(joystick.y()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kForward)); - joystick.start().and(joystick.x()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kReverse)); - - // reset the field-centric heading on left bumper press - joystick.leftBumper().onTrue(drivetrain.runOnce(() -> drivetrain.seedFieldCentric())); - - joystick.start().onTrue(drivetrain.runOnce(()-> {soundSystem.play();})); - joystick.back().onTrue(drivetrain.runOnce(()->{soundSystem.pause();})); - joystick.y().onTrue(drivetrain.runOnce(()->{soundSystem.stop();})); - - drivetrain.registerTelemetry(logger::telemeterize); - } - + // Run SysId routines when holding back/start and X/Y. + // Note that each routine should be run exactly once in a single log. + // joystick.back().and(joystick.y()).whileTrue(drivetrain.sysIdDynamic(Direction.kForward)); + // joystick.back().and(joystick.x()).whileTrue(drivetrain.sysIdDynamic(Direction.kReverse)); + // joystick.start().and(joystick.y()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kForward)); + // joystick.start().and(joystick.x()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kReverse)); + + // reset the field-centric heading on left bumper press + joystick.start().onTrue(drivetrain.runOnce(() -> drivetrain.seedFieldCentric())); + + drivetrain.registerTelemetry(logger::telemeterize); + } + + public Command getAutonomousCommand() { + return autoChooser.getSelected(); + // return Commands.print("No autonomous command configured"); + } } diff --git a/robot/Telemetry.java b/robot/Telemetry.java index a2d36dd..edf1979 100644 --- a/robot/Telemetry.java +++ b/robot/Telemetry.java @@ -121,4 +121,4 @@ public void telemeterize(SwerveDriveState state) { SmartDashboard.putData("Module " + i, m_moduleMechanisms[i]); } } -} \ No newline at end of file +} diff --git a/robot/cosmetics/BlinkInLEDs.java b/robot/cosmetics/BlinkInLEDs.java deleted file mode 100644 index f2241f0..0000000 --- a/robot/cosmetics/BlinkInLEDs.java +++ /dev/null @@ -1,35 +0,0 @@ -// 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.cosmetics; - -import edu.wpi.first.wpilibj.motorcontrol.Spark; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants.CosmeticConstants; - -// We are no longer using this file to run any code, it is merely left as a reference -public class BlinkInLEDs extends SubsystemBase { - public final Spark lightController = new Spark(CosmeticConstants.LIGHT_ID); - // private ShuffleboardTab tab = Shuffleboard.getTab("LED"); - // private GenericEntry lightColor = tab.add("led color", - // CosmeticConstants.SOLID_YELLOW_VALUE).getEntry(); - - /** Creates a new lights. */ - public BlinkInLEDs() { - } - - public void setYellow() { - lightController.set(CosmeticConstants.SOLID_YELLOW_VALUE); - } - - public void setPurple() { - lightController.set(CosmeticConstants.SOLID_PURPLE_VALUE); - } - - @Override - public void periodic() { - // This method will be called once per scheduler run - // lightController.set(lightColor.getDouble(CosmeticConstants.SOLID_YELLOW_VALUE)); - } -} diff --git a/robot/cosmetics/PwmLEDs.java b/robot/cosmetics/PwmLEDs.java deleted file mode 100644 index acb2796..0000000 --- a/robot/cosmetics/PwmLEDs.java +++ /dev/null @@ -1,249 +0,0 @@ -// 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.cosmetics; - -import edu.wpi.first.wpilibj.AddressableLED; -import edu.wpi.first.wpilibj.AddressableLEDBuffer; -import edu.wpi.first.wpilibj.DriverStation; -import edu.wpi.first.wpilibj.Timer; -import edu.wpi.first.wpilibj.util.Color; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants.CosmeticConstants; - -public class PwmLEDs extends SubsystemBase { - private final AddressableLED lights = new AddressableLED(CosmeticConstants.LIGHT_ID); - private AddressableLEDBuffer buffer = new AddressableLEDBuffer(CosmeticConstants.LIGHT_LENGTH); - private Color color1 = Color.kBlack; - private Color color2 = Color.kBlack; - private double onLength = 0.0; - private double offLength = 0.0; - private int color1Length = 0; - private int color2Length = 0; - private double speed = 0; - private double cycleLength = 0.0; - private double duration = 0.0; - - private double mp1 = 90.0; - private double mp2 = 60.0; - private double mp3 = 30.0; - private double mp4 = 15.0; - private double mp5 = 10.0; - private double mp6 = 5.0; - private double mpTolerance = 0.5; - - private Mode lightMode = Mode.SOLID; - - public void setLightMode(Mode lightMode) { - this.lightMode = lightMode; - } - - public Color getColor1() { - return color1; - } - - public void setColor1(Color color1) { - this.color1 = color1; - } - - public Color getColor2() { - return color2; - } - - public void setColor2(Color color2) { - this.color2 = color2; - } - - public void setColor1Length(int color1Length) { - this.color1Length = color1Length; - } - - public void setColor2Length(int color2Length) { - this.color2Length = color2Length; - } - - public void setSpeed(double speed) { - this.speed = speed; - } - - public static enum Mode { - SOLID, WAVE, CLIMB, STROBE; - } - - /** Creates a new PwmLEDs. */ - public PwmLEDs() { - lights.setLength(CosmeticConstants.LIGHT_LENGTH); - lights.setData(buffer); - lights.start(); - } - - public void solid(Color color) { - for (int i = 0; i < buffer.getLength(); i++) { - buffer.setLED(i, color); - } - } - - public void setSolid(Color color) { - this.color1 = color; - this.lightMode = Mode.SOLID; - } - - public void wave(Color color1, Color color2, double cycleLength, double duration) { - double counter = (1 - ((Timer.getFPGATimestamp() % duration) / duration)) * 2.0 * Math.PI; - double counterDiffPerLed = (2.0 * Math.PI) / cycleLength; - for (int i = 0; i < buffer.getLength(); i++) { - counter += counterDiffPerLed; - if (i >= 0) { - double ratio = (Math.pow(Math.sin(counter), 0.4) + 1.0) / 2.0; - if (Double.isNaN(ratio)) { - ratio = (-Math.pow(Math.sin(counter + Math.PI), 0.4) + 1.0) / 2.0; - } - if (Double.isNaN(ratio)) { - ratio = 0.5; - } - double red = (color1.red * (1 - ratio)) + (color2.red * ratio); - double green = (color1.green * (1 - ratio)) + (color2.green * ratio); - double blue = (color1.blue * (1 - ratio)) + (color2.blue * ratio); - buffer.setLED(i, new Color(red, green, blue)); - } - } - } - - public void wave(Color color, double cycleLength, double duration) { - wave(color, Color.kBlack, cycleLength, duration); - } - - public void setWave(Color color1, Color color2, double cycleLength, double duration) { - this.color1 = color1; - this.color2 = color2; - this.cycleLength = cycleLength; - this.duration = duration; - this.lightMode = Mode.WAVE; - } - - public void climb(Color color1, Color color2, int color1Length, int color2Length, double speed) { - int counter = (int) Math.floor(Timer.getFPGATimestamp() * speed); - for (int i = 0; i < buffer.getLength(); i += color2Length + color1Length) { - for (int j = 0; j < color1Length; j++) { - buffer.setLED((i + j + counter) % buffer.getLength(), color1); - } - for (int j = color1Length; j < color1Length + color2Length; j++) { - buffer.setLED((i + j + counter) % buffer.getLength(), color2); - } - } - } - - public void climb(Color color, int colorLength, int offLength, double speed) { - climb(color, Color.kBlack, colorLength, offLength, speed); - } - - public void setClimb(Color color1, Color color2, int color1Length, int color2Length, double speed) { - this.color1 = color1; - this.color2 = color2; - this.color1Length = color1Length; - this.color2Length = color2Length; - this.speed = speed; - this.lightMode = Mode.CLIMB; - } - - public void strobe(Color color1, Color color2, double onLength, double offLength) { - boolean lightsOn = Timer.getFPGATimestamp() % onLength + offLength > onLength; - if (lightsOn) { - for (int i = 0; i < buffer.getLength(); i++) { - buffer.setLED(i, color1); - } - } else { - for (int i = 0; i < buffer.getLength(); i++) { - buffer.setLED(i, color2); - } - } - } - - public void strobe(Color color, double onLength, double offLength) { - strobe(color, Color.kBlack, onLength, offLength); - } - - public void setStrobe(Color color1, Color color2, double onLength, double offLength) { - this.color1 = color1; - this.color2 = color2; - this.onLength = onLength; - this.offLength = offLength; - this.lightMode = Mode.STROBE; - } - - public void setDefault() { - Color color1 = Color.kBlue; - Color color2 = Color.kGold; - if (DriverStation.isEStopped()) { - color1 = Color.kDarkGreen; - color2 = Color.kPowderBlue; - } - if (!DriverStation.isFMSAttached()) { - color1 = PwmLEDs.dimColor(color1, 0.25); - color2 = PwmLEDs.dimColor(color2, 0.25); - } - - setWave(color1, color2, 10, 3); - } - - public static Color dimColor(Color color, double brightness) { - return new Color(color.red * brightness, color.green * brightness, color.blue * brightness); - } - - @Override - public void periodic() { - // This method will be called once per scheduler run - - double time = Timer.getMatchTime(); - if (Math.abs(time - mp1) <= mpTolerance) { - solid(Color.kBlue); - lights.setData(buffer); - return; - } - if (Math.abs(time - mp2) <= mpTolerance) { - solid(Color.kGreen); - lights.setData(buffer); - return; - } - if (Math.abs(time - mp3) <= mpTolerance) { - solid(Color.kFirstRed); - lights.setData(buffer); - return; - } - if (time < mp4 && time > mp5 && time % 1.0 > 0.5) { - solid(dimColor(Color.kDarkGoldenrod, 0.5)); - lights.setData(buffer); - return; - } - if (time < mp5 && time > mp6 && time % 1.0 > 0.5) { - solid(dimColor(Color.kFirstBlue, 0.5)); - lights.setData(buffer); - return; - } - if (time < mp6 && time % 1.0 > 0.5) { - solid(dimColor(Color.kFirstRed, 0.5)); - lights.setData(buffer); - return; - } - - switch (lightMode) { - case SOLID: - solid(color1); - break; - case WAVE: - wave(color1, color2, cycleLength, duration); - break; - case CLIMB: - climb(color1, color2, color1Length, color2Length, speed); - break; - case STROBE: - strobe(color1, color2, onLength, offLength); - break; - default: - solid(Color.kBlack); - } - - lights.setData(buffer); - } -} diff --git a/robot/data/LoggingSystem.java b/robot/data/LoggingSystem.java deleted file mode 100644 index 5c21203..0000000 --- a/robot/data/LoggingSystem.java +++ /dev/null @@ -1,61 +0,0 @@ -// 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.data; - -import java.util.Dictionary; -import java.util.Map; - -import com.ctre.phoenix6.SignalLogger; - -import edu.wpi.first.networktables.GenericEntry; -import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard; -import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; -import edu.wpi.first.wpilibj2.command.Subsystem; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants.LoggingConstants; -import frc.robot.subsystems.DriveSystem; - -public class LoggingSystem extends SubsystemBase { - - private Map subsystemArray; - private boolean loggingState = LoggingConstants.DEFAULT_LOGGING_STATE; - private GenericEntry loggingChooser; - - - /** Creates a new LoggingSystem. */ - public LoggingSystem(Map subsystemArray) { - loggingChooser = Shuffleboard.getTab("Logging").add("Enable Logging", false).getEntry(); - SmartDashboard.putBoolean("Logging Chooser", false); - this.subsystemArray = subsystemArray; - } - - public boolean getLoggingState() { - return loggingState; - } - - private boolean getLoggingFlag() { - // An example command will be run in autonomous - return loggingChooser.getBoolean(false); // TODO: Actually use this value -} - - @Override - public void periodic() { - // This method will be called once per scheduler run - if (getLoggingFlag() != loggingState) { - loggingState = getLoggingFlag(); - - if (loggingState) { - SignalLogger.start(); - // Log the odometry pose as a double array - } else { - SignalLogger.stop(); - } - } - if (loggingState){ - var pose = ((DriveSystem)subsystemArray.get(new String("Drive"))).getState().Pose; - var status = SignalLogger.writeDoubleArray("odometry", new double[] {pose.getX(), pose.getY(), pose.getRotation().getDegrees()}); - } - } -} diff --git a/robot/generated/TunerConstants.java b/robot/generated/TunerConstants.java index cbbbb05..7c55399 100644 --- a/robot/generated/TunerConstants.java +++ b/robot/generated/TunerConstants.java @@ -14,7 +14,7 @@ import edu.wpi.first.math.numbers.N3; import edu.wpi.first.units.measure.*; -import frc.robot.subsystems.DriveSystem; +import frc.robot.subsystems.CommandSwerveDrivetrain; // Generated by the Tuner X Swerve Project Generator // https://v6.docs.ctr-electronics.com/en/stable/docs/tuner/tuner-swerve/index.html @@ -24,14 +24,14 @@ public class TunerConstants { // The steer motor uses any SwerveModule.SteerRequestType control request with the // output type specified by SwerveModuleConstants.SteerMotorClosedLoopOutput private static final Slot0Configs steerGains = new Slot0Configs() - .withKP(100).withKI(0).withKD(0.5) // 100, 0, 0.5 - .withKS(0.1).withKV(1.91).withKA(0) // 0, 1.5, 0 + .withKP(100).withKI(0).withKD(0.5) + .withKS(0.1).withKV(1.59).withKA(0) .withStaticFeedforwardSign(StaticFeedforwardSignValue.UseClosedLoopSign); // When using closed-loop control, the drive motor uses the control // output type specified by SwerveModuleConstants.DriveMotorClosedLoopOutput private static final Slot0Configs driveGains = new Slot0Configs() - .withKP(0.1).withKI(0).withKD(0) // 3, 0, 0 - .withKS(0).withKV(0.124); // removed KA changed and KV from 0 + .withKP(0.1).withKI(0).withKD(0) + .withKS(0).withKV(0.124); // The closed-loop output type to use for the steer motors; // This affects the PID/FF gains for the steer motors @@ -51,7 +51,7 @@ public class TunerConstants { // The stator current at which the wheels start to slip; // This needs to be tuned to your individual robot - private static final Current kSlipCurrent = Amps.of(120.0); // 150 + private static final Current kSlipCurrent = Amps.of(120.0); // Initial configs for the drive and steer motors and the azimuth encoder; these cannot be null. // Some configs will be overwritten; check the `with*InitialConfigs()` API documentation. @@ -70,19 +70,19 @@ public class TunerConstants { // CAN bus that the devices are located on; // All swerve devices must share the same CAN bus - public static final CANBus kCANBus = new CANBus("canivore", "./logs/example.hoot"); // Default Name + public static final CANBus kCANBus = new CANBus("Default Name", "./logs/example.hoot"); // Theoretical free speed (m/s) at 12 V applied output; // This needs to be tuned to your individual robot - public static final LinearVelocity kSpeedAt12Volts = MetersPerSecond.of(4.69); // 5 + public static final LinearVelocity kSpeedAt12Volts = MetersPerSecond.of(6.21); // Every 1 rotation of the azimuth results in kCoupleRatio drive motor turns; // This may need to be tuned to your individual robot - private static final double kCoupleRatio = 3.8181818181818183; // 3.5714285714285716 + private static final double kCoupleRatio = 3; - private static final double kDriveGearRatio = 7.363636363636365; // 6.122448979591837 - private static final double kSteerGearRatio = 15.42857142857143; // 12.8 - private static final Distance kWheelRadius = Inches.of(2.167); // 1.92 + private static final double kDriveGearRatio = 5.142857142857142; + private static final double kSteerGearRatio = 12.8; + private static final Distance kWheelRadius = Inches.of(2); private static final boolean kInvertLeftSide = false; private static final boolean kInvertRightSide = true; @@ -90,11 +90,11 @@ public class TunerConstants { private static final int kPigeonId = 13; // These are only used for simulation - private static final MomentOfInertia kSteerInertia = KilogramSquareMeters.of(0.01); // 0.00001 - private static final MomentOfInertia kDriveInertia = KilogramSquareMeters.of(0.01); // 0.001 + private static final MomentOfInertia kSteerInertia = KilogramSquareMeters.of(0.01); + private static final MomentOfInertia kDriveInertia = KilogramSquareMeters.of(0.01); // Simulated voltage necessary to overcome friction - private static final Voltage kSteerFrictionVoltage = Volts.of(0.2); // 0.25 - private static final Voltage kDriveFrictionVoltage = Volts.of(0.2); // 0.25 + private static final Voltage kSteerFrictionVoltage = Volts.of(0.2); + private static final Voltage kDriveFrictionVoltage = Volts.of(0.2); public static final SwerveDrivetrainConstants DrivetrainConstants = new SwerveDrivetrainConstants() .withCANBusName(kCANBus.getName()) @@ -129,45 +129,45 @@ public class TunerConstants { private static final int kFrontLeftDriveMotorId = 11; private static final int kFrontLeftSteerMotorId = 12; private static final int kFrontLeftEncoderId = 10; - private static final Angle kFrontLeftEncoderOffset = Rotations.of(0.15234375); // -0.052734375 - private static final boolean kFrontLeftSteerMotorInverted = true; // false - private static final boolean kFrontLeftEncoderInverted = false; // new + private static final Angle kFrontLeftEncoderOffset = Rotations.of(-0.0537109375); + private static final boolean kFrontLeftSteerMotorInverted = false; + private static final boolean kFrontLeftEncoderInverted = false; - private static final Distance kFrontLeftXPos = Inches.of(10); // 9.25 - private static final Distance kFrontLeftYPos = Inches.of(10); // 9.25 + private static final Distance kFrontLeftXPos = Inches.of(9); + private static final Distance kFrontLeftYPos = Inches.of(9); // Front Right private static final int kFrontRightDriveMotorId = 2; private static final int kFrontRightSteerMotorId = 3; private static final int kFrontRightEncoderId = 1; - private static final Angle kFrontRightEncoderOffset = Rotations.of(-0.4873046875); // -0.6796875 - private static final boolean kFrontRightSteerMotorInverted = true; // false - private static final boolean kFrontRightEncoderInverted = false; // new + private static final Angle kFrontRightEncoderOffset = Rotations.of(0.328125); + private static final boolean kFrontRightSteerMotorInverted = false; + private static final boolean kFrontRightEncoderInverted = false; - private static final Distance kFrontRightXPos = Inches.of(10); // 9.25 - private static final Distance kFrontRightYPos = Inches.of(-10); // -9.25 + private static final Distance kFrontRightXPos = Inches.of(9); + private static final Distance kFrontRightYPos = Inches.of(-9); // Back Left private static final int kBackLeftDriveMotorId = 8; private static final int kBackLeftSteerMotorId = 9; private static final int kBackLeftEncoderId = 7; - private static final Angle kBackLeftEncoderOffset = Rotations.of(-0.219482421875); // -0.304931640625 - private static final boolean kBackLeftSteerMotorInverted = true; // false - private static final boolean kBackLeftEncoderInverted = false; // new + private static final Angle kBackLeftEncoderOffset = Rotations.of(-0.30224609375); + private static final boolean kBackLeftSteerMotorInverted = false; + private static final boolean kBackLeftEncoderInverted = false; - private static final Distance kBackLeftXPos = Inches.of(-10); // -9.25 - private static final Distance kBackLeftYPos = Inches.of(10); // 9.25 + private static final Distance kBackLeftXPos = Inches.of(-9); + private static final Distance kBackLeftYPos = Inches.of(9); // Back Right private static final int kBackRightDriveMotorId = 5; private static final int kBackRightSteerMotorId = 6; private static final int kBackRightEncoderId = 4; - private static final Angle kBackRightEncoderOffset = Rotations.of(0.17236328125); // -0.032470703125 - private static final boolean kBackRightSteerMotorInverted = true; // false - private static final boolean kBackRightEncoderInverted = false; // new + private static final Angle kBackRightEncoderOffset = Rotations.of(-0.031005859375); + private static final boolean kBackRightSteerMotorInverted = false; + private static final boolean kBackRightEncoderInverted = false; - private static final Distance kBackRightXPos = Inches.of(-10); // -9.25 - private static final Distance kBackRightYPos = Inches.of(-10); // -9.25 + private static final Distance kBackRightXPos = Inches.of(-9); + private static final Distance kBackRightYPos = Inches.of(-9); public static final SwerveModuleConstants FrontLeft = @@ -195,8 +195,8 @@ public class TunerConstants { * Creates a CommandSwerveDrivetrain instance. * This should only be called once in your robot program,. */ - public static DriveSystem createDrivetrain() { - return new DriveSystem( + public static CommandSwerveDrivetrain createDrivetrain() { + return new CommandSwerveDrivetrain( DrivetrainConstants, FrontLeft, FrontRight, BackLeft, BackRight ); } @@ -283,4 +283,4 @@ public TunerSwerveDrivetrain( ); } } -} \ No newline at end of file +} diff --git a/robot/subsystems/DriveSystem.java b/robot/subsystems/CommandSwerveDrivetrain.java similarity index 89% rename from robot/subsystems/DriveSystem.java rename to robot/subsystems/CommandSwerveDrivetrain.java index 3447342..a78ffc3 100644 --- a/robot/subsystems/DriveSystem.java +++ b/robot/subsystems/CommandSwerveDrivetrain.java @@ -9,7 +9,6 @@ import com.ctre.phoenix6.swerve.SwerveDrivetrainConstants; import com.ctre.phoenix6.swerve.SwerveModuleConstants; import com.ctre.phoenix6.swerve.SwerveRequest; - import com.pathplanner.lib.auto.AutoBuilder; import com.pathplanner.lib.config.PIDConstants; import com.pathplanner.lib.config.RobotConfig; @@ -33,7 +32,7 @@ * Class that extends the Phoenix 6 SwerveDrivetrain class and implements * Subsystem so it can easily be used in command-based projects. */ -public class DriveSystem extends TunerSwerveDrivetrain implements Subsystem { +public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Subsystem { private static final double kSimLoopPeriod = 0.005; // 5 ms private Notifier m_simNotifier = null; private double m_lastSimTime; @@ -122,10 +121,10 @@ public class DriveSystem extends TunerSwerveDrivetrain implements Subsystem { * the devices themselves. If they need the devices, they can access them through * getters in the classes. * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param modules Constants for each specific module + * @param drivetrainConstants Drivetrain-wide constants for the swerve drive + * @param modules Constants for each specific module */ - public DriveSystem( + public CommandSwerveDrivetrain( SwerveDrivetrainConstants drivetrainConstants, SwerveModuleConstants... modules ) { @@ -143,13 +142,13 @@ public DriveSystem( * the devices themselves. If they need the devices, they can access them through * getters in the classes. * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param modules Constants for each specific module + * @param drivetrainConstants Drivetrain-wide constants for the swerve drive + * @param odometryUpdateFrequency The frequency to run the odometry loop. If + * unspecified or set to 0 Hz, this is 250 Hz on + * CAN FD, and 100 Hz on CAN 2.0. + * @param modules Constants for each specific module */ - public DriveSystem( + public CommandSwerveDrivetrain( SwerveDrivetrainConstants drivetrainConstants, double odometryUpdateFrequency, SwerveModuleConstants... modules @@ -168,19 +167,19 @@ public DriveSystem( * the devices themselves. If they need the devices, they can access them through * getters in the classes. * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param odometryStandardDeviation The standard deviation for odometry calculation + * @param drivetrainConstants Drivetrain-wide constants for the swerve drive + * @param odometryUpdateFrequency The frequency to run the odometry loop. If + * unspecified or set to 0 Hz, this is 250 Hz on + * CAN FD, and 100 Hz on CAN 2.0. + * @param odometryStandardDeviation The standard deviation for odometry calculation * in the form [x, y, theta]ᵀ, with units in meters * and radians * @param visionStandardDeviation The standard deviation for vision calculation * in the form [x, y, theta]ᵀ, with units in meters * and radians - * @param modules Constants for each specific module + * @param modules Constants for each specific module */ - public DriveSystem( + public CommandSwerveDrivetrain( SwerveDrivetrainConstants drivetrainConstants, double odometryUpdateFrequency, Matrix odometryStandardDeviation, @@ -191,7 +190,7 @@ public DriveSystem( if (Utils.isSimulation()) { startSimThread(); } - configureAutoBuilder(); + configureAutoBuilder(); } private void configureAutoBuilder() { @@ -209,9 +208,9 @@ private void configureAutoBuilder() { ), new PPHolonomicDriveController( // PID constants for translation - new PIDConstants(10, 0, 0), // 5, 0, 0 + new PIDConstants(10, 0, 0), // PID constants for rotation - new PIDConstants(7, 0, 0) // 5, 0, 0 + new PIDConstants(7, 0, 0) ), config, // Assume the path needs to be flipped for Red vs Blue, this is normally the case @@ -290,4 +289,4 @@ private void startSimThread() { }); m_simNotifier.startPeriodic(kSimLoopPeriod); } -} \ No newline at end of file +} diff --git a/robot/Constants.java b/robot/subsystems/Constants.java similarity index 64% rename from robot/Constants.java rename to robot/subsystems/Constants.java index e452735..247eeaa 100644 --- a/robot/Constants.java +++ b/robot/subsystems/Constants.java @@ -1,4 +1,4 @@ -package frc.robot; +package frc.robot.subsystems; public class Constants { public static class ControllerConstants { @@ -17,14 +17,4 @@ public static class LoggingConstants { public static final boolean DEFAULT_LOGGING_STATE = false; } - - public static class CosmeticConstants { - - public static final int LIGHT_ID = 9; - public static final double SOLID_YELLOW_VALUE = 0.69; - public static final double SOLID_PURPLE_VALUE = 0.91; - public static final int LIGHT_LENGTH = 76; - - } - } diff --git a/main/java/frc/robot/subsystems/DriveSystem.java b/subsystems/CommandSwerveDrivetrain.java similarity index 89% rename from main/java/frc/robot/subsystems/DriveSystem.java rename to subsystems/CommandSwerveDrivetrain.java index 3447342..a78ffc3 100644 --- a/main/java/frc/robot/subsystems/DriveSystem.java +++ b/subsystems/CommandSwerveDrivetrain.java @@ -9,7 +9,6 @@ import com.ctre.phoenix6.swerve.SwerveDrivetrainConstants; import com.ctre.phoenix6.swerve.SwerveModuleConstants; import com.ctre.phoenix6.swerve.SwerveRequest; - import com.pathplanner.lib.auto.AutoBuilder; import com.pathplanner.lib.config.PIDConstants; import com.pathplanner.lib.config.RobotConfig; @@ -33,7 +32,7 @@ * Class that extends the Phoenix 6 SwerveDrivetrain class and implements * Subsystem so it can easily be used in command-based projects. */ -public class DriveSystem extends TunerSwerveDrivetrain implements Subsystem { +public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Subsystem { private static final double kSimLoopPeriod = 0.005; // 5 ms private Notifier m_simNotifier = null; private double m_lastSimTime; @@ -122,10 +121,10 @@ public class DriveSystem extends TunerSwerveDrivetrain implements Subsystem { * the devices themselves. If they need the devices, they can access them through * getters in the classes. * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param modules Constants for each specific module + * @param drivetrainConstants Drivetrain-wide constants for the swerve drive + * @param modules Constants for each specific module */ - public DriveSystem( + public CommandSwerveDrivetrain( SwerveDrivetrainConstants drivetrainConstants, SwerveModuleConstants... modules ) { @@ -143,13 +142,13 @@ public DriveSystem( * the devices themselves. If they need the devices, they can access them through * getters in the classes. * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param modules Constants for each specific module + * @param drivetrainConstants Drivetrain-wide constants for the swerve drive + * @param odometryUpdateFrequency The frequency to run the odometry loop. If + * unspecified or set to 0 Hz, this is 250 Hz on + * CAN FD, and 100 Hz on CAN 2.0. + * @param modules Constants for each specific module */ - public DriveSystem( + public CommandSwerveDrivetrain( SwerveDrivetrainConstants drivetrainConstants, double odometryUpdateFrequency, SwerveModuleConstants... modules @@ -168,19 +167,19 @@ public DriveSystem( * the devices themselves. If they need the devices, they can access them through * getters in the classes. * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param odometryStandardDeviation The standard deviation for odometry calculation + * @param drivetrainConstants Drivetrain-wide constants for the swerve drive + * @param odometryUpdateFrequency The frequency to run the odometry loop. If + * unspecified or set to 0 Hz, this is 250 Hz on + * CAN FD, and 100 Hz on CAN 2.0. + * @param odometryStandardDeviation The standard deviation for odometry calculation * in the form [x, y, theta]ᵀ, with units in meters * and radians * @param visionStandardDeviation The standard deviation for vision calculation * in the form [x, y, theta]ᵀ, with units in meters * and radians - * @param modules Constants for each specific module + * @param modules Constants for each specific module */ - public DriveSystem( + public CommandSwerveDrivetrain( SwerveDrivetrainConstants drivetrainConstants, double odometryUpdateFrequency, Matrix odometryStandardDeviation, @@ -191,7 +190,7 @@ public DriveSystem( if (Utils.isSimulation()) { startSimThread(); } - configureAutoBuilder(); + configureAutoBuilder(); } private void configureAutoBuilder() { @@ -209,9 +208,9 @@ private void configureAutoBuilder() { ), new PPHolonomicDriveController( // PID constants for translation - new PIDConstants(10, 0, 0), // 5, 0, 0 + new PIDConstants(10, 0, 0), // PID constants for rotation - new PIDConstants(7, 0, 0) // 5, 0, 0 + new PIDConstants(7, 0, 0) ), config, // Assume the path needs to be flipped for Red vs Blue, this is normally the case @@ -290,4 +289,4 @@ private void startSimThread() { }); m_simNotifier.startPeriodic(kSimLoopPeriod); } -} \ No newline at end of file +} diff --git a/main/java/frc/robot/Constants.java b/subsystems/Constants.java similarity index 64% rename from main/java/frc/robot/Constants.java rename to subsystems/Constants.java index e452735..247eeaa 100644 --- a/main/java/frc/robot/Constants.java +++ b/subsystems/Constants.java @@ -1,4 +1,4 @@ -package frc.robot; +package frc.robot.subsystems; public class Constants { public static class ControllerConstants { @@ -17,14 +17,4 @@ public static class LoggingConstants { public static final boolean DEFAULT_LOGGING_STATE = false; } - - public static class CosmeticConstants { - - public static final int LIGHT_ID = 9; - public static final double SOLID_YELLOW_VALUE = 0.69; - public static final double SOLID_PURPLE_VALUE = 0.91; - public static final int LIGHT_LENGTH = 76; - - } - } diff --git a/subsystems/DriveSystem.java b/subsystems/DriveSystem.java deleted file mode 100644 index 3447342..0000000 --- a/subsystems/DriveSystem.java +++ /dev/null @@ -1,293 +0,0 @@ -package frc.robot.subsystems; - -import static edu.wpi.first.units.Units.*; - -import java.util.function.Supplier; - -import com.ctre.phoenix6.SignalLogger; -import com.ctre.phoenix6.Utils; -import com.ctre.phoenix6.swerve.SwerveDrivetrainConstants; -import com.ctre.phoenix6.swerve.SwerveModuleConstants; -import com.ctre.phoenix6.swerve.SwerveRequest; - -import com.pathplanner.lib.auto.AutoBuilder; -import com.pathplanner.lib.config.PIDConstants; -import com.pathplanner.lib.config.RobotConfig; -import com.pathplanner.lib.controllers.PPHolonomicDriveController; - -import edu.wpi.first.math.Matrix; -import edu.wpi.first.math.geometry.Rotation2d; -import edu.wpi.first.math.numbers.N1; -import edu.wpi.first.math.numbers.N3; -import edu.wpi.first.wpilibj.DriverStation; -import edu.wpi.first.wpilibj.DriverStation.Alliance; -import edu.wpi.first.wpilibj.Notifier; -import edu.wpi.first.wpilibj.RobotController; -import edu.wpi.first.wpilibj2.command.Command; -import edu.wpi.first.wpilibj2.command.Subsystem; -import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine; - -import frc.robot.generated.TunerConstants.TunerSwerveDrivetrain; - -/** - * Class that extends the Phoenix 6 SwerveDrivetrain class and implements - * Subsystem so it can easily be used in command-based projects. - */ -public class DriveSystem extends TunerSwerveDrivetrain implements Subsystem { - private static final double kSimLoopPeriod = 0.005; // 5 ms - private Notifier m_simNotifier = null; - private double m_lastSimTime; - - /* Blue alliance sees forward as 0 degrees (toward red alliance wall) */ - private static final Rotation2d kBlueAlliancePerspectiveRotation = Rotation2d.kZero; - /* Red alliance sees forward as 180 degrees (toward blue alliance wall) */ - private static final Rotation2d kRedAlliancePerspectiveRotation = Rotation2d.k180deg; - /* Keep track if we've ever applied the operator perspective before or not */ - private boolean m_hasAppliedOperatorPerspective = false; - - /** Swerve request to apply during robot-centric path following */ - private final SwerveRequest.ApplyRobotSpeeds m_pathApplyRobotSpeeds = new SwerveRequest.ApplyRobotSpeeds(); - - /* Swerve requests to apply during SysId characterization */ - private final SwerveRequest.SysIdSwerveTranslation m_translationCharacterization = new SwerveRequest.SysIdSwerveTranslation(); - private final SwerveRequest.SysIdSwerveSteerGains m_steerCharacterization = new SwerveRequest.SysIdSwerveSteerGains(); - private final SwerveRequest.SysIdSwerveRotation m_rotationCharacterization = new SwerveRequest.SysIdSwerveRotation(); - - /* SysId routine for characterizing translation. This is used to find PID gains for the drive motors. */ - private final SysIdRoutine m_sysIdRoutineTranslation = new SysIdRoutine( - new SysIdRoutine.Config( - null, // Use default ramp rate (1 V/s) - Volts.of(4), // Reduce dynamic step voltage to 4 V to prevent brownout - null, // Use default timeout (10 s) - // Log state with SignalLogger class - state -> SignalLogger.writeString("SysIdTranslation_State", state.toString()) - ), - new SysIdRoutine.Mechanism( - output -> setControl(m_translationCharacterization.withVolts(output)), - null, - this - ) - ); - - /* SysId routine for characterizing steer. This is used to find PID gains for the steer motors. */ - private final SysIdRoutine m_sysIdRoutineSteer = new SysIdRoutine( - new SysIdRoutine.Config( - null, // Use default ramp rate (1 V/s) - Volts.of(7), // Use dynamic voltage of 7 V - null, // Use default timeout (10 s) - // Log state with SignalLogger class - state -> SignalLogger.writeString("SysIdSteer_State", state.toString()) - ), - new SysIdRoutine.Mechanism( - volts -> setControl(m_steerCharacterization.withVolts(volts)), - null, - this - ) - ); - - /* - * SysId routine for characterizing rotation. - * This is used to find PID gains for the FieldCentricFacingAngle HeadingController. - * See the documentation of SwerveRequest.SysIdSwerveRotation for info on importing the log to SysId. - */ - private final SysIdRoutine m_sysIdRoutineRotation = new SysIdRoutine( - new SysIdRoutine.Config( - /* This is in radians per second², but SysId only supports "volts per second" */ - Volts.of(Math.PI / 6).per(Second), - /* This is in radians per second, but SysId only supports "volts" */ - Volts.of(Math.PI), - null, // Use default timeout (10 s) - // Log state with SignalLogger class - state -> SignalLogger.writeString("SysIdRotation_State", state.toString()) - ), - new SysIdRoutine.Mechanism( - output -> { - /* output is actually radians per second, but SysId only supports "volts" */ - setControl(m_rotationCharacterization.withRotationalRate(output.in(Volts))); - /* also log the requested output for SysId */ - SignalLogger.writeDouble("Rotational_Rate", output.in(Volts)); - }, - null, - this - ) - ); - - /* The SysId routine to test */ - private SysIdRoutine m_sysIdRoutineToApply = m_sysIdRoutineTranslation; - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param modules Constants for each specific module - */ - public DriveSystem( - SwerveDrivetrainConstants drivetrainConstants, - SwerveModuleConstants... modules - ) { - super(drivetrainConstants, modules); - if (Utils.isSimulation()) { - startSimThread(); - } - configureAutoBuilder(); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param modules Constants for each specific module - */ - public DriveSystem( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - SwerveModuleConstants... modules - ) { - super(drivetrainConstants, odometryUpdateFrequency, modules); - if (Utils.isSimulation()) { - startSimThread(); - } - configureAutoBuilder(); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param odometryStandardDeviation The standard deviation for odometry calculation - * in the form [x, y, theta]áµ€, with units in meters - * and radians - * @param visionStandardDeviation The standard deviation for vision calculation - * in the form [x, y, theta]áµ€, with units in meters - * and radians - * @param modules Constants for each specific module - */ - public DriveSystem( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - Matrix odometryStandardDeviation, - Matrix visionStandardDeviation, - SwerveModuleConstants... modules - ) { - super(drivetrainConstants, odometryUpdateFrequency, odometryStandardDeviation, visionStandardDeviation, modules); - if (Utils.isSimulation()) { - startSimThread(); - } - configureAutoBuilder(); - } - - private void configureAutoBuilder() { - try { - var config = RobotConfig.fromGUISettings(); - AutoBuilder.configure( - () -> getState().Pose, // Supplier of current robot pose - this::resetPose, // Consumer for seeding pose against auto - () -> getState().Speeds, // Supplier of current robot speeds - // Consumer of ChassisSpeeds and feedforwards to drive the robot - (speeds, feedforwards) -> setControl( - m_pathApplyRobotSpeeds.withSpeeds(speeds) - .withWheelForceFeedforwardsX(feedforwards.robotRelativeForcesXNewtons()) - .withWheelForceFeedforwardsY(feedforwards.robotRelativeForcesYNewtons()) - ), - new PPHolonomicDriveController( - // PID constants for translation - new PIDConstants(10, 0, 0), // 5, 0, 0 - // PID constants for rotation - new PIDConstants(7, 0, 0) // 5, 0, 0 - ), - config, - // Assume the path needs to be flipped for Red vs Blue, this is normally the case - () -> DriverStation.getAlliance().orElse(Alliance.Blue) == Alliance.Red, - this // Subsystem for requirements - ); - } catch (Exception ex) { - DriverStation.reportError("Failed to load PathPlanner config and configure AutoBuilder", ex.getStackTrace()); - } - } - - /** - * Returns a command that applies the specified control request to this swerve drivetrain. - * - * @param request Function returning the request to apply - * @return Command to run - */ - public Command applyRequest(Supplier requestSupplier) { - return run(() -> this.setControl(requestSupplier.get())); - } - - /** - * Runs the SysId Quasistatic test in the given direction for the routine - * specified by {@link #m_sysIdRoutineToApply}. - * - * @param direction Direction of the SysId Quasistatic test - * @return Command to run - */ - public Command sysIdQuasistatic(SysIdRoutine.Direction direction) { - return m_sysIdRoutineToApply.quasistatic(direction); - } - - /** - * Runs the SysId Dynamic test in the given direction for the routine - * specified by {@link #m_sysIdRoutineToApply}. - * - * @param direction Direction of the SysId Dynamic test - * @return Command to run - */ - public Command sysIdDynamic(SysIdRoutine.Direction direction) { - return m_sysIdRoutineToApply.dynamic(direction); - } - - @Override - public void periodic() { - /* - * Periodically try to apply the operator perspective. - * If we haven't applied the operator perspective before, then we should apply it regardless of DS state. - * This allows us to correct the perspective in case the robot code restarts mid-match. - * Otherwise, only check and apply the operator perspective if the DS is disabled. - * This ensures driving behavior doesn't change until an explicit disable event occurs during testing. - */ - if (!m_hasAppliedOperatorPerspective || DriverStation.isDisabled()) { - DriverStation.getAlliance().ifPresent(allianceColor -> { - setOperatorPerspectiveForward( - allianceColor == Alliance.Red - ? kRedAlliancePerspectiveRotation - : kBlueAlliancePerspectiveRotation - ); - m_hasAppliedOperatorPerspective = true; - }); - } - } - - private void startSimThread() { - m_lastSimTime = Utils.getCurrentTimeSeconds(); - - /* Run simulation at a faster rate so PID gains behave more reasonably */ - m_simNotifier = new Notifier(() -> { - final double currentTime = Utils.getCurrentTimeSeconds(); - double deltaTime = currentTime - m_lastSimTime; - m_lastSimTime = currentTime; - - /* use the measured time delta, get battery voltage from WPILib */ - updateSimState(deltaTime, RobotController.getBatteryVoltage()); - }); - m_simNotifier.startPeriodic(kSimLoopPeriod); - } -} \ No newline at end of file diff --git a/tuner-project.json b/tuner-project.json new file mode 100644 index 0000000..19324c1 --- /dev/null +++ b/tuner-project.json @@ -0,0 +1 @@ +{"Version":"1.0.0.0","LastState":11,"Modules":[{"ModuleName":"Front Left","ModuleId":0,"Encoder":{"Id":10,"Name":"frontLeft","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},"SteerMotor":{"Id":12,"Name":"frontLeftAngle","Model":"Talon FX vers. C","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":{"Name":"WCP Kraken x60","FreeSpeedRps":96.7},"IsStandaloneFx":false},"DriveMotor":{"Id":11,"Name":"frontLeftDrive","Model":"Talon FX vers. C","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":{"Name":"WCP Kraken x60","FreeSpeedRps":96.7},"IsStandaloneFx":false},"IsEncoderInverted":false,"IsSteerInverted":false,"SelectedEncoderType":"CANcoder","EncoderOffset":-0.0537109375,"DriveMotorSelectionState":1,"SteerMotorSelectionState":1,"SteerEncoderSelectionState":1,"IsModuleValidationComplete":true,"ValidatedSteerId":12,"ValidatedDriveId":11,"ValidatedEncoderId":10,"AvailEncoders":[{"Id":1,"Name":"frontRight","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},{"Id":4,"Name":"backRight","Model":"CANCoder vers. H","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},{"Id":7,"Name":"backLeft","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},{"Id":10,"Name":"frontLeft","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false}],"IsEncoderTypeCAN":true,"IsDeviceSelectionCompleted":true,"IsConfigurationCompleted":true,"AvailEncoderTypes":["CANcoder"]},{"ModuleName":"Front Right","ModuleId":1,"Encoder":{"Id":1,"Name":"frontRight","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},"SteerMotor":{"Id":3,"Name":"frontRightAngle","Model":"Talon FX vers. C","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":{"Name":"WCP Kraken x60","FreeSpeedRps":96.7},"IsStandaloneFx":false},"DriveMotor":{"Id":2,"Name":"frontRightDrive","Model":"Talon FX vers. C","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":{"Name":"WCP Kraken x60","FreeSpeedRps":96.7},"IsStandaloneFx":false},"IsEncoderInverted":false,"IsSteerInverted":false,"SelectedEncoderType":"CANcoder","EncoderOffset":0.328125,"DriveMotorSelectionState":1,"SteerMotorSelectionState":1,"SteerEncoderSelectionState":1,"IsModuleValidationComplete":true,"ValidatedSteerId":3,"ValidatedDriveId":2,"ValidatedEncoderId":1,"AvailEncoders":[{"Id":1,"Name":"frontRight","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},{"Id":4,"Name":"backRight","Model":"CANCoder vers. H","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},{"Id":7,"Name":"backLeft","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},{"Id":10,"Name":"frontLeft","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false}],"IsEncoderTypeCAN":true,"IsDeviceSelectionCompleted":true,"IsConfigurationCompleted":true,"AvailEncoderTypes":["CANcoder"]},{"ModuleName":"Back Left","ModuleId":2,"Encoder":{"Id":7,"Name":"backLeft","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},"SteerMotor":{"Id":9,"Name":"backLeftAngle","Model":"Talon FX vers. C","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":{"Name":"WCP Kraken x60","FreeSpeedRps":96.7},"IsStandaloneFx":false},"DriveMotor":{"Id":8,"Name":"backLeftDrive","Model":"Talon FX vers. C","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":{"Name":"WCP Kraken x60","FreeSpeedRps":96.7},"IsStandaloneFx":false},"IsEncoderInverted":false,"IsSteerInverted":false,"SelectedEncoderType":"CANcoder","EncoderOffset":-0.30224609375,"DriveMotorSelectionState":1,"SteerMotorSelectionState":1,"SteerEncoderSelectionState":1,"IsModuleValidationComplete":true,"ValidatedSteerId":9,"ValidatedDriveId":8,"ValidatedEncoderId":7,"AvailEncoders":[{"Id":1,"Name":"frontRight","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},{"Id":4,"Name":"backRight","Model":"CANCoder vers. H","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},{"Id":7,"Name":"backLeft","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},{"Id":10,"Name":"frontLeft","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false}],"IsEncoderTypeCAN":true,"IsDeviceSelectionCompleted":true,"IsConfigurationCompleted":true,"AvailEncoderTypes":["CANcoder"]},{"ModuleName":"Back Right","ModuleId":3,"Encoder":{"Id":4,"Name":"backRight","Model":"CANCoder vers. H","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},"SteerMotor":{"Id":6,"Name":"backRightAngle","Model":"Talon FX vers. C","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":{"Name":"WCP Kraken x60","FreeSpeedRps":96.7},"IsStandaloneFx":false},"DriveMotor":{"Id":5,"Name":"backRightDrive","Model":"Talon FX vers. C","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":{"Name":"WCP Kraken x60","FreeSpeedRps":96.7},"IsStandaloneFx":false},"IsEncoderInverted":false,"IsSteerInverted":false,"SelectedEncoderType":"CANcoder","EncoderOffset":-0.031005859375,"DriveMotorSelectionState":1,"SteerMotorSelectionState":1,"SteerEncoderSelectionState":1,"IsModuleValidationComplete":true,"ValidatedSteerId":6,"ValidatedDriveId":5,"ValidatedEncoderId":4,"AvailEncoders":[{"Id":1,"Name":"frontRight","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},{"Id":4,"Name":"backRight","Model":"CANCoder vers. H","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},{"Id":7,"Name":"backLeft","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},{"Id":10,"Name":"frontLeft","Model":"CANCoder","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false}],"IsEncoderTypeCAN":true,"IsDeviceSelectionCompleted":true,"IsConfigurationCompleted":true,"AvailEncoderTypes":["CANcoder"]}],"SwerveOptions":{"kSpeedAt12Volts":6.206390820091836,"Gyro":{"Id":13,"Name":"Pigeon 2 vers. S (Device ID 13)","Model":"Pigeon 2 vers. S","CANbus":"02C14EB74C32435320202059092017FF","CANbusFriendly":"Default Name","SelectedMotorType":null,"IsStandaloneFx":false},"IsValidGyroCANbus":true,"VerticalTrackSizeInches":18.0,"HorizontalTrackSizeInches":18.0,"WheelRadiusInches":2.0,"IsLeftSideInverted":false,"IsRightSideInverted":true,"SwerveModuleType":3,"SwerveModuleConfiguration":{"ModuleBrand":3,"DriveRatio":5.142857142857142,"SteerRatio":12.8,"CouplingRatio":3.0,"CustomName":"L4"},"HasVerifiedSteer":true,"HasVerifiedDrive":true,"IsValidConfiguration":true}} \ No newline at end of file diff --git a/vendordeps/PathplannerLib-2025.2.1.json b/vendordeps/PathplannerLib-2025.2.1.json new file mode 100644 index 0000000..71e25f3 --- /dev/null +++ b/vendordeps/PathplannerLib-2025.2.1.json @@ -0,0 +1,38 @@ +{ + "fileName": "PathplannerLib-2025.2.1.json", + "name": "PathplannerLib", + "version": "2025.2.1", + "uuid": "1b42324f-17c6-4875-8e77-1c312bc8c786", + "frcYear": "2025", + "mavenUrls": [ + "https://3015rangerrobotics.github.io/pathplannerlib/repo" + ], + "jsonUrl": "https://3015rangerrobotics.github.io/pathplannerlib/PathplannerLib.json", + "javaDependencies": [ + { + "groupId": "com.pathplanner.lib", + "artifactId": "PathplannerLib-java", + "version": "2025.2.1" + } + ], + "jniDependencies": [], + "cppDependencies": [ + { + "groupId": "com.pathplanner.lib", + "artifactId": "PathplannerLib-cpp", + "version": "2025.2.1", + "libName": "PathplannerLib", + "headerClassifier": "headers", + "sharedLibrary": false, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "osxuniversal", + "linuxathena", + "linuxarm32", + "linuxarm64" + ] + } + ] +} \ No newline at end of file diff --git a/vendordeps/Phoenix6-frc2025-latest.json b/vendordeps/Phoenix6-frc2025-latest.json new file mode 100644 index 0000000..7f4bd2e --- /dev/null +++ b/vendordeps/Phoenix6-frc2025-latest.json @@ -0,0 +1,389 @@ +{ + "fileName": "Phoenix6-frc2025-latest.json", + "name": "CTRE-Phoenix (v6)", + "version": "25.1.0", + "frcYear": "2025", + "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", + "mavenUrls": [ + "https://maven.ctr-electronics.com/release/" + ], + "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json", + "conflictsWith": [ + { + "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", + "errorMessage": "Users can not have both the replay and regular Phoenix 6 vendordeps in their robot program.", + "offlineFileName": "Phoenix6-replay-frc2025-latest.json" + } + ], + "javaDependencies": [ + { + "groupId": "com.ctre.phoenix6", + "artifactId": "wpiapi-java", + "version": "25.1.0" + } + ], + "jniDependencies": [ + { + "groupId": "com.ctre.phoenix6", + "artifactId": "api-cpp", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix6", + "artifactId": "tools", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "api-cpp-sim", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "tools-sim", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simTalonSRX", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simVictorSPX", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simPigeonIMU", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simCANCoder", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProTalonFX", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANcoder", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProPigeon2", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANrange", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ], + "cppDependencies": [ + { + "groupId": "com.ctre.phoenix6", + "artifactId": "wpiapi-cpp", + "version": "25.1.0", + "libName": "CTRE_Phoenix6_WPI", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix6", + "artifactId": "tools", + "version": "25.1.0", + "libName": "CTRE_PhoenixTools", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "wpiapi-cpp-sim", + "version": "25.1.0", + "libName": "CTRE_Phoenix6_WPISim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "tools-sim", + "version": "25.1.0", + "libName": "CTRE_PhoenixTools_Sim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simTalonSRX", + "version": "25.1.0", + "libName": "CTRE_SimTalonSRX", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simVictorSPX", + "version": "25.1.0", + "libName": "CTRE_SimVictorSPX", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simPigeonIMU", + "version": "25.1.0", + "libName": "CTRE_SimPigeonIMU", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simCANCoder", + "version": "25.1.0", + "libName": "CTRE_SimCANCoder", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProTalonFX", + "version": "25.1.0", + "libName": "CTRE_SimProTalonFX", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANcoder", + "version": "25.1.0", + "libName": "CTRE_SimProCANcoder", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProPigeon2", + "version": "25.1.0", + "libName": "CTRE_SimProPigeon2", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANrange", + "version": "25.1.0", + "libName": "CTRE_SimProCANrange", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ] +} \ No newline at end of file From 004a117dc25d4fce2d73f92d7e8210e6c609ac86 Mon Sep 17 00:00:00 2001 From: Ayden-157 Date: Sat, 11 Jan 2025 11:18:25 -0500 Subject: [PATCH 02/13] Did it proper this time --- 8.11/checksums/checksums.lock | Bin 17 -> 0 bytes 8.11/checksums/md5-checksums.bin | Bin 22297 -> 0 bytes 8.11/checksums/sha1-checksums.bin | Bin 22763 -> 0 bytes 8.11/executionHistory/executionHistory.bin | Bin 122898 -> 0 bytes 8.11/executionHistory/executionHistory.lock | Bin 17 -> 0 bytes 8.11/expanded/expanded.lock | Bin 17 -> 0 bytes 8.11/fileChanges/last-build.bin | Bin 1 -> 0 bytes 8.11/fileHashes/fileHashes.bin | Bin 25547 -> 0 bytes 8.11/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes 8.11/fileHashes/resourceHashesCache.bin | Bin 19959 -> 0 bytes 8.11/gc.properties | 0 PathplannerLib-2025.2.1.json | 38 -- Phoenix6-frc2025-latest.json | 389 ------------------ WPILibNewCommands.json | 38 -- autos/New Auto.auto | 19 - buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 0 bytes buildOutputCleanup/cache.properties | 2 - buildOutputCleanup/outputFiles.bin | Bin 19001 -> 0 bytes deploy/pathplanner/autos/New Auto.auto | 19 - example.txt | 3 - file-system.probe | Bin 8 -> 0 bytes generated/TunerConstants.java | 286 ------------- main/deploy/example.txt | 3 - main/deploy/pathplanner/autos/New Auto.auto | 19 - main/deploy/pathplanner/navgrid.json | 1 - .../pathplanner/paths/Example Path.path | 54 --- main/java/frc/robot/Main.java | 15 - main/java/frc/robot/Robot.java | 75 ---- main/java/frc/robot/RobotContainer.java | 86 ---- main/java/frc/robot/Telemetry.java | 124 ------ .../frc/robot/generated/TunerConstants.java | 286 ------------- .../subsystems/CommandSwerveDrivetrain.java | 292 ------------- main/java/frc/robot/subsystems/Constants.java | 20 - navgrid.json | 1 - pathplanner/autos/New Auto.auto | 19 - pathplanner/navgrid.json | 1 - pathplanner/paths/Example Path.path | 54 --- paths/Example Path.path | 54 --- robot/Main.java | 15 - robot/Robot.java | 75 ---- robot/RobotContainer.java | 86 ---- robot/Telemetry.java | 124 ------ robot/generated/TunerConstants.java | 286 ------------- robot/subsystems/CommandSwerveDrivetrain.java | 292 ------------- robot/subsystems/Constants.java | 20 - {deploy => src/main/deploy}/example.txt | 0 .../deploy/pathplanner/autos/New Auto.auto | 0 .../main/deploy}/pathplanner/navgrid.json | 0 .../pathplanner/paths/Example Path.path | 0 .../main/java/frc/robot/Main.java | 0 .../main/java/frc/robot/Robot.java | 0 .../main/java/frc/robot/RobotContainer.java | 2 +- .../main/java/frc/robot/Telemetry.java | 0 .../frc/robot/generated/TunerConstants.java | 0 .../subsystems/CommandSwerveDrivetrain.java | 0 .../java/frc/robot/subsystems/Constants.java | 0 subsystems/CommandSwerveDrivetrain.java | 292 ------------- subsystems/Constants.java | 20 - vcs-1/gc.properties | 0 59 files changed, 1 insertion(+), 3109 deletions(-) delete mode 100644 8.11/checksums/checksums.lock delete mode 100644 8.11/checksums/md5-checksums.bin delete mode 100644 8.11/checksums/sha1-checksums.bin delete mode 100644 8.11/executionHistory/executionHistory.bin delete mode 100644 8.11/executionHistory/executionHistory.lock delete mode 100644 8.11/expanded/expanded.lock delete mode 100644 8.11/fileChanges/last-build.bin delete mode 100644 8.11/fileHashes/fileHashes.bin delete mode 100644 8.11/fileHashes/fileHashes.lock delete mode 100644 8.11/fileHashes/resourceHashesCache.bin delete mode 100644 8.11/gc.properties delete mode 100644 PathplannerLib-2025.2.1.json delete mode 100644 Phoenix6-frc2025-latest.json delete mode 100644 WPILibNewCommands.json delete mode 100644 autos/New Auto.auto delete mode 100644 buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 buildOutputCleanup/cache.properties delete mode 100644 buildOutputCleanup/outputFiles.bin delete mode 100644 deploy/pathplanner/autos/New Auto.auto delete mode 100644 example.txt delete mode 100644 file-system.probe delete mode 100644 generated/TunerConstants.java delete mode 100644 main/deploy/example.txt delete mode 100644 main/deploy/pathplanner/autos/New Auto.auto delete mode 100644 main/deploy/pathplanner/navgrid.json delete mode 100644 main/deploy/pathplanner/paths/Example Path.path delete mode 100644 main/java/frc/robot/Main.java delete mode 100644 main/java/frc/robot/Robot.java delete mode 100644 main/java/frc/robot/RobotContainer.java delete mode 100644 main/java/frc/robot/Telemetry.java delete mode 100644 main/java/frc/robot/generated/TunerConstants.java delete mode 100644 main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java delete mode 100644 main/java/frc/robot/subsystems/Constants.java delete mode 100644 navgrid.json delete mode 100644 pathplanner/autos/New Auto.auto delete mode 100644 pathplanner/navgrid.json delete mode 100644 pathplanner/paths/Example Path.path delete mode 100644 paths/Example Path.path delete mode 100644 robot/Main.java delete mode 100644 robot/Robot.java delete mode 100644 robot/RobotContainer.java delete mode 100644 robot/Telemetry.java delete mode 100644 robot/generated/TunerConstants.java delete mode 100644 robot/subsystems/CommandSwerveDrivetrain.java delete mode 100644 robot/subsystems/Constants.java rename {deploy => src/main/deploy}/example.txt (100%) rename New Auto.auto => src/main/deploy/pathplanner/autos/New Auto.auto (100%) rename {deploy => src/main/deploy}/pathplanner/navgrid.json (100%) rename {deploy => src/main/deploy}/pathplanner/paths/Example Path.path (100%) rename Main.java => src/main/java/frc/robot/Main.java (100%) rename Robot.java => src/main/java/frc/robot/Robot.java (100%) rename RobotContainer.java => src/main/java/frc/robot/RobotContainer.java (99%) rename Telemetry.java => src/main/java/frc/robot/Telemetry.java (100%) rename TunerConstants.java => src/main/java/frc/robot/generated/TunerConstants.java (100%) rename CommandSwerveDrivetrain.java => src/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java (100%) rename Constants.java => src/main/java/frc/robot/subsystems/Constants.java (100%) delete mode 100644 subsystems/CommandSwerveDrivetrain.java delete mode 100644 subsystems/Constants.java delete mode 100644 vcs-1/gc.properties diff --git a/8.11/checksums/checksums.lock b/8.11/checksums/checksums.lock deleted file mode 100644 index f8258999bd92c85fb3df1b58ce20646c75d37a91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZS1db5K6$=%6686aRg074K36#xJL diff --git a/8.11/checksums/md5-checksums.bin b/8.11/checksums/md5-checksums.bin deleted file mode 100644 index 500e713bb1e1088d0f00dec4ef1bf0d681d4d688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22297 zcmeI3dpJ~EAIC?Mm=TR)YEX`FI_^{|$z2%tTS-wQm5`#mjzlUa<*t8x=5*{)R8WSF5b1RwVX4T^Z)z2&sxu8&pe-5pZ#0wyZ2sup2uu+8jU42j2i9l zHu>+jSF5`hsVN?o$3;rNMMLH;w zb!I!{PQjQb1>F15qUwDMa(5@plXdgoO|Vf;Lj4UfPg&i(z@yk>2jq52qx?w415?gT z7sy?FF+W&dQvF+y!)wHKFwZ<2l_+A98VR{=0_Hhp`l|H30h1uNIf!}QmhmqwBsYsd z?ks}&kyvMwKs`E|m%Rh#MeOkKY{sc3*xyPtiW zv8}r^1O z4#fPP{hWOb;|HW5cb|s&eb%K3!`~)cg4{j^^R^l-ujv)9?I3qe!n|WiaiH$ZHg~k2 zSj-=K>6BR+*H4Gst!k8i`LVx@U4YIjhfd6&$UJ;Hd^0)%?f(+yFR}tXXI52@TtzgR z-5bn%iu-2unCN+;{VyKn?<=ioNd*faw{F4w^^e`X9b2@MA-CFu`P-?50eeHzHPL?h zFz<`Fu_jdLtR>`5bj;uF(d(PA-@zmD>@ zjIWDgZ&GUxXs!d8i?3QEK2s$LozJezF=xmqd0b;EGqYj1ANv=WI|i=w5o-MS0P!=U{B=*WPw>=s$T=%9cRuCXwD72w zB;<}}n7d{at$$y?>?-6=d6;|F8*fvnuQ`eKQ;)f~d%&65f(%bF@&(0XfEiFp94Tt`&?LMrU$k0U^`CvLaXrvqF4(J_HJZk@*4%E zEK$GfvD&$9T^014=Sk2|K)#>|UmnwO#|r_eAAWlx3=LUuwoq-^La^bP$GM&5xx+@w54^gXb1*wPe*?EM zg?e&;$7uah_GZ?@JH^{h1W%_+iq=3wrjx2bqp<~?iQ*q@%Vl#+byLSFEWh7mVaRQW zJq8+2jb%@iyOf?hi?-=vv@vAajohQMq%z|%Dqib$4Z8P#lWX}ynkCov3%8*z!EgAg zWvJ-}=?Oou5PQzBU(^MS>C|IJpiTY(Has;xxkoL3d*Nn|d1c>DX1<~px4~BDH^f)2 z-DH`$tNN^V5vSeln;$e}UQrcjG!-?l;i<7_<@*ARG zfA8+zn4r3FS9DkIo&fMn2X$WIW6lZYH%=HITYpC7WT)e!;vL@B8~@@q7y_;j{ayE+ zY`->Vir>uj^Gq$iiDn)T_6^!x>UaG-^T;hL4PJVw;JNIK1oOKUv*&ReI@A*;JjOo# zU3XM=w>q~qul_+dcZx=aKIjRW2=y!gk5Om5u_smUdTZvIcSBl1j>owTiCz4L+__4P ztoWjyxsRf0?T)74Djm57O{fYq+PGq{;i<9LP;|bZ+6vp$@sA&|C&xx{8O^vRvpj;)iBcZ>-PFnA^g|w_pa?@Q@~Ro|1<>E2=rNOsdJ*)>V$BXg}=8ENb{e^ zLv%4H#B)5xCGTG2@SE86cHjMqi*BA}aT`*W{D%B5hYV6y-q0Am<6Pr6L?WAfKFz7|*OkmW>68>@0FBY_3<7FQH2RXH zlb-ArQNS)&xKcX~8VbJDn817LX(gUfeR#FhFR$FBYN&7){exo^7zLG;LiUIta31zg zQzXP{dUnj4-}cnZV)Q!$SRtq;B;Y=%niaR*Iq!~}k)x|zdd8Gfu!gJ`GAh6;�tI zK54piA62=LYS5b!mV%DpH0nzpXoBY9nc#k+YyI?u?zE!?KM7?iz#6P=$e^Bc;;B(? zbwcZ5a(-~)4^GDXeU`Dvn2HPm>2^M?lk_aG))mXxeoE`o?ulp~_mOd)zedcYa~iJ8~S|NB0?V{6(XJW%xAE&SbhUTmW&x3Jg1cF5a3#+437VG!l_K%c829+vk^m|~#GpcWnlNP+nt1HXO`Di7)uEC$% zU{Ys2kCEfvmL~r;yKJ6b&Hh@pVLi7YI>2v8e3#!|ma$K^N1-g0^|7l+B}s`WJrOM^PkSLLTcQ$^ zrbkLBEy$8BN~L)3bEC7E zzuyw?hy;iPhy;iPhy;iPhy;iPhy;iPhy;iPhy;iPhy;iPhy;iPhy;iPhy;iP{$CPs zzy`tx1|y+53x6XNNg^#5z~0#GeWc`M-kHq_KBl#zzaPZkTOWJ3gVYANr7_}16)Azy z5{3H#x8H(zieJ;jb0znufI9^veoQlGK+r-V1#r8sh^P86R=ZqsIRLm-!ZgnNic?0oUF#*ePju-BL zZ|p(5uCZmAuFAQ+fYUe-XXL)`Ra<`A3~-y*h(A|+>fIvPya{mXE5!eq^~0N^phgjJ z3nj#xtaZ|Bc}9c*chX1vr9_qBuPW8us0dTuS#0QRO_3L@or~^)2f%q87f91JZfxUoRjUfKBJt%Ez zg;$7hN=0u0?JW?Vlz018u|ckw*YYo{S~UMHkw_4n_WX({zZGSku+m1;2UEQSG`tW z7C>zZguD>(WeqiZMg*?>g4_8x%|{s~T3hq&0XL6FT&FBQ_vZ-{H^7}Ki0dzVrYn9c z53YMOUBnHJ?kP5ktA@E**&%KsM7At4Hl76Au?axjHekzEa@}Y%5zqzqtO}@Gi;I^L--}u)>|G|fw9szDwiTEGKrTO^Peo+B;zKyu+!*#JT4=Zl~ zZaD{WcSpbN2RL@Yb<*}0;$EEc%iDvgA7J~Ph;OUgc)g*72G?inrHK1U6lriTC`$wF zo!(6I>cV5e(O={Ncg#RMq;lb#&0X_f0dBi~n!nc&^xd?(4{+yL#KRX|riyt~H3Dvv zi+FUM)Phoxk8nPimrnEHAI*A+8{m1z{wdbt}^nM+yrn36SySxIzqg1wg z$9<0{k;o^E^(97t7x@(SsyR~?H~)vK>TkV?q0zC@@Fnm5NjhkW-Q$U?q!XbklT~$e zZmJ~r;Om6-x%&!9OI^!juW@t&l?=S&mdr-AzjH@-$VVg6pY{b=pSIt6{cXsv6sW}E z{lV;d=n#=w`rYC3qI)F~KgMtIRxIS?g*_C9clnd?yG)tJCEqd75p-bQvjOe!FAAd3 zntv>%V)rcLcd{7;It zfvaW0C9gfv2S?BOmZz770hJVE%8Eq3!m6?o>CwN+_;$uZZheT~v7GEK_x&${O6ELN zvDsh8FSv>L%$?X;d@o{%@yjDE^!SxGu!ry-WpWm)7mtp41kEZTd&^?Am>S-i2*pDl zFhiMK=*33mX%^cOWTN5wW_8FjZ_&Xa)3*z;`>*i~r}r0|H1;K|4CjmP5{Po~6x(~b zfuhe_LI*18zoFN4)*k+}(Wh&#`gBS;gfGt|BBSO@-<5Kpl7sgy^W9}t*%X~t7*$_o zd2IA(S6ltpk7LKrLNBBevtw1Mxjjrv$vdy3U}Z2-@-WEsrg?Ke92Xh%aMK!ARo!I8 z-HPM3QG8A7A`?e-ypDMoeV(b3#GgK3nj22L8ue8uYATny=yPpcBqDTaB^f{^)(*U+ z+05Pz9~fiLgnKUcQad($)A#y1E_i0iOcgJ-*O|TiAKuJSpLK##R~>$6&hECWy;p6q z=QF1E7aZ3HJWHk?PAux0pxd^*{XM_aUEA8%&SFU*n)6VlI)_!|^#@OVheO?St0UtI zxtn8MENOMWftMWq_!3s;O<)z1SE@{jyyQS__uh_1<)W5Q`M4PTMtr=7NF}Yxs`^wV zIFuxGHKby5Ozr$N&t-!n_oTu!K4Gn~qNsvZOkNsY!zy}iaY5>r125)&Q000eTaL|j z+zTboTfwTj{3q{ym-rj0d-}aQtaoP#%hgsgr9s91&FrOoU5~bzD&iUPN_af&LA8Xs z-vYS5#9@X4Y>wr@n~I++ZO4@bAD=$NIa?+3bJ*9FFpa~Q2Ub?$&kHb(>pD;9f>*@S2Rmbg)+P!o2p6V{O3hTwImoIix69WMY_2oycwcHTX519>nEn~A8*+xY z6NxnY5>_#J-8r8zQsyC4xNm_^wEXPDzcF=C4@f|$D|tFC*&nxF>g%V_`TGD z2cvHj@0SkFRI&4-+dDprh_qg^a*;vTi4LEo&41RsovC8yr5(@U_Nc1UAiG@18I386 zDQMrk6sq7kg`L-}Z`6Tb)?OX6!?KMTK8K!bc@J03R0(mjj>~PY=;=p2E*W>qBy`#` z-75mjWUzH&>PW#?G_0`mq69^UKTmvjzk%!bUOUl|E|P&E_P+`Kr;44IxTwGaYKD%f z@R4=#`k8X4{KF3#LlsP(+X*vdO8#8*gUjQRv^XiJt{$GxrcNJ|HX6-T32$Ik<=7l5 za}w=Xx2o$Y=ORD;44LYu@1Y8=^X$Aj(wb66=#8sC_B)2&&5Roj9}L%-sbc5VYjcYK zl$JzsBhSu~vY^uA9VU$PKqZ0AN4$`Wu!?D1Kgiyb^kIKWU{Xx>{kN_Bbyb}3NSQwC zu~ChhWbJgmv&C2GhCe4`n~qXVSxy}A5~ojDk;rV$dRF%-t%ovQi|O_!^Fv||d-)A` zBmk9+Csg52S~2yoZt<5NJew5TZ@N6T@uW+1QrhdVr18BxeZBFRRYlVMz59Y-o5IfK zkX&=$WVIH9`T^*5270j>SE*5cTB2>AEiLn%q<2WvWbFf;SwJO=&3(L(+4S&K^0JG1 zN&{+iKDnWSliKQ^7}4TDCGG}QCD<#|xPqd*Xx`3Gzm$B}bQ>nwk#ptlW7*;3l8A*W z{B*&j%5X4jEOTyNrD9%vO*55=WlwWd{pGLYJwwUm2%*d zyI2t}+u9mT%Yo0AwShahmN}9&15~d}cp3_^@ zm9R#n*djGKBg3*4d3j*1u_AzdD_|a%Nz7K+1MzEptdcpRs2gtWF%cRjLoW|pLn2Ya zu!<>-_tM#3m0#P|1^-gq7ipM6d)>vgZ>CD%PgWJ3{`0}h(^_9=>(vx2d=owJGjn~x zOqD1;N0__@_Lnc7?d;=UefwVJ&~CK_zrzk;GiYjM^Tk?Yh5rFoF{yUdIR74g{H>%y zm%1_9n9^GlX4yDXCC288Xx#hF%gwo_-U*W@hpg9f)PHzUfSntsygYCxEJN(rX7>7^ zX!hFQ(R2~VC)FI2(M^5YlKtpRscDeZ0Gz2TAO*pssb0hF4i+H`U4vwlD&`vM;ob{+K%tC%v>RW!GhN{tF8eYm#lYM4&F z2{j&DCvY#Mnsbv?wYGS1R%mwFXtm?wjJ{!g*=x;iQ{R{EyZ@%(PS_UCVil9uf2YcO zpZi%_fbylMc&k&a&2VthSk*zihnUxiDXUo#Pg%XT<5Yp U?;PyAFC|W?$Oo`136kc&07VEJZvX%Q diff --git a/8.11/executionHistory/executionHistory.bin b/8.11/executionHistory/executionHistory.bin deleted file mode 100644 index 62f1784d8aa749c50ed4f46d8c4f933b6d204d8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122898 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 RXZ8Wfslyw{@D|C%{|845urdGu diff --git a/8.11/executionHistory/executionHistory.lock b/8.11/executionHistory/executionHistory.lock deleted file mode 100644 index 96fbcea3e2ad8f60bd290d0acc46001a47bfbb89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZSHHEX8xC$?N}1_;Op05M$z6951J diff --git a/8.11/expanded/expanded.lock b/8.11/expanded/expanded.lock deleted file mode 100644 index fd95533e56c79b3390a92fa06b8329b3ed1e96fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZR+aXGd4YMf;)0~7!NIwJ&d diff --git a/8.11/fileChanges/last-build.bin b/8.11/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/8.11/fileHashes/fileHashes.bin b/8.11/fileHashes/fileHashes.bin deleted file mode 100644 index 1af4242ef0dd2543505376b0e715212e4e2765cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25547 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 diff --git a/8.11/fileHashes/fileHashes.lock b/8.11/fileHashes/fileHashes.lock deleted file mode 100644 index 95707108e4be24263228dd59d57bc6923f75caae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZQR$ZGnYQ`mI{0~j#s001Se10(X+wTOtK z?4S50^5t6otXMv*jMa3ga{L}b(Axf|`|$gN6k1~I^HJ|3Na>l+>-((2sHI6~t3+-(r(> zY)vsvdy9BlSo2j;mTeNoZ3_@jUth8O@@(N}j8mKtzgYR!PbzOn4&(Hjh-ZF(Y#Di5 zZ4f?=1>#i~ImM}p;$k>Ii1=NbfZq~ErZX{4jX|6j74>fWm9~W#x8o!JK!e@cyU+q( zkDUYJjio0@Tb7<>;Jy^%%^$S3N{t3J;^WsN-ah*=>(FR*KE~;E#5;o{%FXLWoiI+3 zM*PK5ag9C90ZW{BBR*K1%vdAYa|h$JXvBx7tSy*DTcR;;H;MSTnyA*cp;iUl&qaKS zsXCF?Hk*KP>JZ{H=9?{z_bzS2{aVE3y^YDi4i7J3oUV=dn%i$S?KF`t$GGh<;+n=! zR1KJp+8DRHh4^{~o7d|&eI4UeFT^)5cWdh4biTkiMHg|s@?vkP4Cf~pr~it${-pb~ zp{r8`#_iaMn;y}ra#_zU!Z_6&af|80hGVAtY54dY#4VN1v~9__q=|9chyU=|_PzJz zwD9+`BO`8A7tI&f4Wi(F9O6486*$#dhBq)yPepv6|6uHZq|r1!?@7d6#7bLJX6n5# zPGcbMmaJYHS^gaVUD1>fKOlPODmj3^4)duhh#w1PWe+I!#N+cyAb#9gp=cyDZU~=u z8u8Ha507_kRF=j09mK;gQBsU#%JlJZd=Zais3<&BwNl48%?xq$Eg~Ye5_<-pPyh-* z0Vn_kpa2wr0#E=7KmjNK1)u;FfC5ke3P1rU00p1`6o3Ly017|>C;$bZ02F`%Pyh-* z0Vn_kpa2wr0#E=7{Fe*p%`Hx_`B$(hUrsi0GKV4=V>{YC$nsd#{QlM)T>Wpu^HW@` zCtsoLvz6z%VtwTkMB`y+)%etTO#?rBlk5Si&rzZgf5>Z-+fwEm9^2-?)g$+=5e=3- zBSNg_@!~Q1tqG%@wSt}XLhDFZJCO4S%Qe0)K-*uL)%)}=G`*A zGl<5beBOejk^;-0)l$YAY&e25AwsiA-c&0%XuC*?`awI&C*{Xcq7nMk@j=(+`fBT^ z9m8r}{)t56j0vWNqxl1&t&T~ zhGn<3$)^kxjouN?C|#rO=5_^x=N!L&!FdLuce!Dba5^n7ww)AsN{ck_%nG8>oLf-$ z!u~GLo0D&StthpHXf$NT(HEUuwz22;dHFW>wSv<=LbJG%CqEWwY?1FQF>>`W{W%1vR3@?WjXQU8;OQl$e!)$Kaux1a96w- z8acO%XmmH9yWy!lRwSOtwbsmYHzFF2oyNgjZt1=guLkv+F37$j8s1EX0lT8_y$(A> uY14P66GUV6v!kl|EBo{fbj9+9?uUG(hZ04ZqUch)V(W1VtKT^1Z{sigcc9P! diff --git a/8.11/gc.properties b/8.11/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/PathplannerLib-2025.2.1.json b/PathplannerLib-2025.2.1.json deleted file mode 100644 index 71e25f3..0000000 --- a/PathplannerLib-2025.2.1.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "fileName": "PathplannerLib-2025.2.1.json", - "name": "PathplannerLib", - "version": "2025.2.1", - "uuid": "1b42324f-17c6-4875-8e77-1c312bc8c786", - "frcYear": "2025", - "mavenUrls": [ - "https://3015rangerrobotics.github.io/pathplannerlib/repo" - ], - "jsonUrl": "https://3015rangerrobotics.github.io/pathplannerlib/PathplannerLib.json", - "javaDependencies": [ - { - "groupId": "com.pathplanner.lib", - "artifactId": "PathplannerLib-java", - "version": "2025.2.1" - } - ], - "jniDependencies": [], - "cppDependencies": [ - { - "groupId": "com.pathplanner.lib", - "artifactId": "PathplannerLib-cpp", - "version": "2025.2.1", - "libName": "PathplannerLib", - "headerClassifier": "headers", - "sharedLibrary": false, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal", - "linuxathena", - "linuxarm32", - "linuxarm64" - ] - } - ] -} \ No newline at end of file diff --git a/Phoenix6-frc2025-latest.json b/Phoenix6-frc2025-latest.json deleted file mode 100644 index 7f4bd2e..0000000 --- a/Phoenix6-frc2025-latest.json +++ /dev/null @@ -1,389 +0,0 @@ -{ - "fileName": "Phoenix6-frc2025-latest.json", - "name": "CTRE-Phoenix (v6)", - "version": "25.1.0", - "frcYear": "2025", - "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", - "mavenUrls": [ - "https://maven.ctr-electronics.com/release/" - ], - "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json", - "conflictsWith": [ - { - "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", - "errorMessage": "Users can not have both the replay and regular Phoenix 6 vendordeps in their robot program.", - "offlineFileName": "Phoenix6-replay-frc2025-latest.json" - } - ], - "javaDependencies": [ - { - "groupId": "com.ctre.phoenix6", - "artifactId": "wpiapi-java", - "version": "25.1.0" - } - ], - "jniDependencies": [ - { - "groupId": "com.ctre.phoenix6", - "artifactId": "api-cpp", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6", - "artifactId": "tools", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "api-cpp-sim", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "tools-sim", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simTalonSRX", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simVictorSPX", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simPigeonIMU", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simCANCoder", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProTalonFX", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANcoder", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProPigeon2", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANrange", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - } - ], - "cppDependencies": [ - { - "groupId": "com.ctre.phoenix6", - "artifactId": "wpiapi-cpp", - "version": "25.1.0", - "libName": "CTRE_Phoenix6_WPI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6", - "artifactId": "tools", - "version": "25.1.0", - "libName": "CTRE_PhoenixTools", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "wpiapi-cpp-sim", - "version": "25.1.0", - "libName": "CTRE_Phoenix6_WPISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "tools-sim", - "version": "25.1.0", - "libName": "CTRE_PhoenixTools_Sim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simTalonSRX", - "version": "25.1.0", - "libName": "CTRE_SimTalonSRX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simVictorSPX", - "version": "25.1.0", - "libName": "CTRE_SimVictorSPX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simPigeonIMU", - "version": "25.1.0", - "libName": "CTRE_SimPigeonIMU", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simCANCoder", - "version": "25.1.0", - "libName": "CTRE_SimCANCoder", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProTalonFX", - "version": "25.1.0", - "libName": "CTRE_SimProTalonFX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANcoder", - "version": "25.1.0", - "libName": "CTRE_SimProCANcoder", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProPigeon2", - "version": "25.1.0", - "libName": "CTRE_SimProPigeon2", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANrange", - "version": "25.1.0", - "libName": "CTRE_SimProCANrange", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - } - ] -} \ No newline at end of file diff --git a/WPILibNewCommands.json b/WPILibNewCommands.json deleted file mode 100644 index 3718e0a..0000000 --- a/WPILibNewCommands.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "fileName": "WPILibNewCommands.json", - "name": "WPILib-New-Commands", - "version": "1.0.0", - "uuid": "111e20f7-815e-48f8-9dd6-e675ce75b266", - "frcYear": "2025", - "mavenUrls": [], - "jsonUrl": "", - "javaDependencies": [ - { - "groupId": "edu.wpi.first.wpilibNewCommands", - "artifactId": "wpilibNewCommands-java", - "version": "wpilib" - } - ], - "jniDependencies": [], - "cppDependencies": [ - { - "groupId": "edu.wpi.first.wpilibNewCommands", - "artifactId": "wpilibNewCommands-cpp", - "version": "wpilib", - "libName": "wpilibNewCommands", - "headerClassifier": "headers", - "sourcesClassifier": "sources", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "linuxathena", - "linuxarm32", - "linuxarm64", - "windowsx86-64", - "windowsx86", - "linuxx86-64", - "osxuniversal" - ] - } - ] -} diff --git a/autos/New Auto.auto b/autos/New Auto.auto deleted file mode 100644 index 70b7ab2..0000000 --- a/autos/New Auto.auto +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": "2025.0", - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "Example Path" - } - } - ] - } - }, - "resetOdom": true, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/buildOutputCleanup/buildOutputCleanup.lock b/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 400a03845b5639bbe92b16fb69d7eaa1896ed952..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZRc^ZKatztk=!1_;;)06J6!3jhEB diff --git a/buildOutputCleanup/cache.properties b/buildOutputCleanup/cache.properties deleted file mode 100644 index 2c24b04..0000000 --- a/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Fri Jan 10 18:58:02 EST 2025 -gradle.version=8.11 diff --git a/buildOutputCleanup/outputFiles.bin b/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index b861c256ba7dd5d3e948ebd237e176aadabe19d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19001 zcmeI%Ur1A77{~FWL)5Y+!epsTs7%8@sL_UkhN3u^OvE(sW(=9$I1yV|T^N$(AEYKI z8oR29VQttJ7(-LRE72K=AUH%YfSpeN#-`t5L!M{|#`>0i_g{n1cA$NhBDW`cXH4cS-r$^_jYbd-}$_BiT3Tr#TO~ zXD4I@db0b!Q}=Vvu~|~1OE0z2oIdW_d6!*ft#ncE;C|g&VR~Q=U8XtJ-0Li(U!Sgj zVYeCX^`?x~8_n+~Y5%Q%{Y`ONVtilOA&cBir=@IvEg#ZK~009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZafh#gWtb9h$DV;q~_VV#A U@&g{x6aL@iqx;ukCLemwUp2>m)c^nh diff --git a/deploy/pathplanner/autos/New Auto.auto b/deploy/pathplanner/autos/New Auto.auto deleted file mode 100644 index 70b7ab2..0000000 --- a/deploy/pathplanner/autos/New Auto.auto +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": "2025.0", - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "Example Path" - } - } - ] - } - }, - "resetOdom": true, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/example.txt b/example.txt deleted file mode 100644 index bb82515..0000000 --- a/example.txt +++ /dev/null @@ -1,3 +0,0 @@ -Files placed in this directory will be deployed to the RoboRIO into the -'deploy' directory in the home folder. Use the 'Filesystem.getDeployDirectory' wpilib function -to get a proper path relative to the deploy directory. \ No newline at end of file diff --git a/file-system.probe b/file-system.probe deleted file mode 100644 index b226731d5a173669dcbe766f3ee939c0b7c9b69c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmZQzV4M=P-2WK>2eSgi diff --git a/generated/TunerConstants.java b/generated/TunerConstants.java deleted file mode 100644 index 7c55399..0000000 --- a/generated/TunerConstants.java +++ /dev/null @@ -1,286 +0,0 @@ -package frc.robot.generated; - -import static edu.wpi.first.units.Units.*; - -import com.ctre.phoenix6.CANBus; -import com.ctre.phoenix6.configs.*; -import com.ctre.phoenix6.hardware.*; -import com.ctre.phoenix6.signals.*; -import com.ctre.phoenix6.swerve.*; -import com.ctre.phoenix6.swerve.SwerveModuleConstants.*; - -import edu.wpi.first.math.Matrix; -import edu.wpi.first.math.numbers.N1; -import edu.wpi.first.math.numbers.N3; -import edu.wpi.first.units.measure.*; - -import frc.robot.subsystems.CommandSwerveDrivetrain; - -// Generated by the Tuner X Swerve Project Generator -// https://v6.docs.ctr-electronics.com/en/stable/docs/tuner/tuner-swerve/index.html -public class TunerConstants { - // Both sets of gains need to be tuned to your individual robot. - - // The steer motor uses any SwerveModule.SteerRequestType control request with the - // output type specified by SwerveModuleConstants.SteerMotorClosedLoopOutput - private static final Slot0Configs steerGains = new Slot0Configs() - .withKP(100).withKI(0).withKD(0.5) - .withKS(0.1).withKV(1.59).withKA(0) - .withStaticFeedforwardSign(StaticFeedforwardSignValue.UseClosedLoopSign); - // When using closed-loop control, the drive motor uses the control - // output type specified by SwerveModuleConstants.DriveMotorClosedLoopOutput - private static final Slot0Configs driveGains = new Slot0Configs() - .withKP(0.1).withKI(0).withKD(0) - .withKS(0).withKV(0.124); - - // The closed-loop output type to use for the steer motors; - // This affects the PID/FF gains for the steer motors - private static final ClosedLoopOutputType kSteerClosedLoopOutput = ClosedLoopOutputType.Voltage; - // The closed-loop output type to use for the drive motors; - // This affects the PID/FF gains for the drive motors - private static final ClosedLoopOutputType kDriveClosedLoopOutput = ClosedLoopOutputType.Voltage; - - // The type of motor used for the drive motor - private static final DriveMotorArrangement kDriveMotorType = DriveMotorArrangement.TalonFX_Integrated; - // The type of motor used for the drive motor - private static final SteerMotorArrangement kSteerMotorType = SteerMotorArrangement.TalonFX_Integrated; - - // The remote sensor feedback type to use for the steer motors; - // When not Pro-licensed, FusedCANcoder/SyncCANcoder automatically fall back to RemoteCANcoder - private static final SteerFeedbackType kSteerFeedbackType = SteerFeedbackType.FusedCANcoder; - - // The stator current at which the wheels start to slip; - // This needs to be tuned to your individual robot - private static final Current kSlipCurrent = Amps.of(120.0); - - // Initial configs for the drive and steer motors and the azimuth encoder; these cannot be null. - // Some configs will be overwritten; check the `with*InitialConfigs()` API documentation. - private static final TalonFXConfiguration driveInitialConfigs = new TalonFXConfiguration(); - private static final TalonFXConfiguration steerInitialConfigs = new TalonFXConfiguration() - .withCurrentLimits( - new CurrentLimitsConfigs() - // Swerve azimuth does not require much torque output, so we can set a relatively low - // stator current limit to help avoid brownouts without impacting performance. - .withStatorCurrentLimit(Amps.of(60)) - .withStatorCurrentLimitEnable(true) - ); - private static final CANcoderConfiguration encoderInitialConfigs = new CANcoderConfiguration(); - // Configs for the Pigeon 2; leave this null to skip applying Pigeon 2 configs - private static final Pigeon2Configuration pigeonConfigs = null; - - // CAN bus that the devices are located on; - // All swerve devices must share the same CAN bus - public static final CANBus kCANBus = new CANBus("Default Name", "./logs/example.hoot"); - - // Theoretical free speed (m/s) at 12 V applied output; - // This needs to be tuned to your individual robot - public static final LinearVelocity kSpeedAt12Volts = MetersPerSecond.of(6.21); - - // Every 1 rotation of the azimuth results in kCoupleRatio drive motor turns; - // This may need to be tuned to your individual robot - private static final double kCoupleRatio = 3; - - private static final double kDriveGearRatio = 5.142857142857142; - private static final double kSteerGearRatio = 12.8; - private static final Distance kWheelRadius = Inches.of(2); - - private static final boolean kInvertLeftSide = false; - private static final boolean kInvertRightSide = true; - - private static final int kPigeonId = 13; - - // These are only used for simulation - private static final MomentOfInertia kSteerInertia = KilogramSquareMeters.of(0.01); - private static final MomentOfInertia kDriveInertia = KilogramSquareMeters.of(0.01); - // Simulated voltage necessary to overcome friction - private static final Voltage kSteerFrictionVoltage = Volts.of(0.2); - private static final Voltage kDriveFrictionVoltage = Volts.of(0.2); - - public static final SwerveDrivetrainConstants DrivetrainConstants = new SwerveDrivetrainConstants() - .withCANBusName(kCANBus.getName()) - .withPigeon2Id(kPigeonId) - .withPigeon2Configs(pigeonConfigs); - - private static final SwerveModuleConstantsFactory ConstantCreator = - new SwerveModuleConstantsFactory() - .withDriveMotorGearRatio(kDriveGearRatio) - .withSteerMotorGearRatio(kSteerGearRatio) - .withCouplingGearRatio(kCoupleRatio) - .withWheelRadius(kWheelRadius) - .withSteerMotorGains(steerGains) - .withDriveMotorGains(driveGains) - .withSteerMotorClosedLoopOutput(kSteerClosedLoopOutput) - .withDriveMotorClosedLoopOutput(kDriveClosedLoopOutput) - .withSlipCurrent(kSlipCurrent) - .withSpeedAt12Volts(kSpeedAt12Volts) - .withDriveMotorType(kDriveMotorType) - .withSteerMotorType(kSteerMotorType) - .withFeedbackSource(kSteerFeedbackType) - .withDriveMotorInitialConfigs(driveInitialConfigs) - .withSteerMotorInitialConfigs(steerInitialConfigs) - .withEncoderInitialConfigs(encoderInitialConfigs) - .withSteerInertia(kSteerInertia) - .withDriveInertia(kDriveInertia) - .withSteerFrictionVoltage(kSteerFrictionVoltage) - .withDriveFrictionVoltage(kDriveFrictionVoltage); - - - // Front Left - private static final int kFrontLeftDriveMotorId = 11; - private static final int kFrontLeftSteerMotorId = 12; - private static final int kFrontLeftEncoderId = 10; - private static final Angle kFrontLeftEncoderOffset = Rotations.of(-0.0537109375); - private static final boolean kFrontLeftSteerMotorInverted = false; - private static final boolean kFrontLeftEncoderInverted = false; - - private static final Distance kFrontLeftXPos = Inches.of(9); - private static final Distance kFrontLeftYPos = Inches.of(9); - - // Front Right - private static final int kFrontRightDriveMotorId = 2; - private static final int kFrontRightSteerMotorId = 3; - private static final int kFrontRightEncoderId = 1; - private static final Angle kFrontRightEncoderOffset = Rotations.of(0.328125); - private static final boolean kFrontRightSteerMotorInverted = false; - private static final boolean kFrontRightEncoderInverted = false; - - private static final Distance kFrontRightXPos = Inches.of(9); - private static final Distance kFrontRightYPos = Inches.of(-9); - - // Back Left - private static final int kBackLeftDriveMotorId = 8; - private static final int kBackLeftSteerMotorId = 9; - private static final int kBackLeftEncoderId = 7; - private static final Angle kBackLeftEncoderOffset = Rotations.of(-0.30224609375); - private static final boolean kBackLeftSteerMotorInverted = false; - private static final boolean kBackLeftEncoderInverted = false; - - private static final Distance kBackLeftXPos = Inches.of(-9); - private static final Distance kBackLeftYPos = Inches.of(9); - - // Back Right - private static final int kBackRightDriveMotorId = 5; - private static final int kBackRightSteerMotorId = 6; - private static final int kBackRightEncoderId = 4; - private static final Angle kBackRightEncoderOffset = Rotations.of(-0.031005859375); - private static final boolean kBackRightSteerMotorInverted = false; - private static final boolean kBackRightEncoderInverted = false; - - private static final Distance kBackRightXPos = Inches.of(-9); - private static final Distance kBackRightYPos = Inches.of(-9); - - - public static final SwerveModuleConstants FrontLeft = - ConstantCreator.createModuleConstants( - kFrontLeftSteerMotorId, kFrontLeftDriveMotorId, kFrontLeftEncoderId, kFrontLeftEncoderOffset, - kFrontLeftXPos, kFrontLeftYPos, kInvertLeftSide, kFrontLeftSteerMotorInverted, kFrontLeftEncoderInverted - ); - public static final SwerveModuleConstants FrontRight = - ConstantCreator.createModuleConstants( - kFrontRightSteerMotorId, kFrontRightDriveMotorId, kFrontRightEncoderId, kFrontRightEncoderOffset, - kFrontRightXPos, kFrontRightYPos, kInvertRightSide, kFrontRightSteerMotorInverted, kFrontRightEncoderInverted - ); - public static final SwerveModuleConstants BackLeft = - ConstantCreator.createModuleConstants( - kBackLeftSteerMotorId, kBackLeftDriveMotorId, kBackLeftEncoderId, kBackLeftEncoderOffset, - kBackLeftXPos, kBackLeftYPos, kInvertLeftSide, kBackLeftSteerMotorInverted, kBackLeftEncoderInverted - ); - public static final SwerveModuleConstants BackRight = - ConstantCreator.createModuleConstants( - kBackRightSteerMotorId, kBackRightDriveMotorId, kBackRightEncoderId, kBackRightEncoderOffset, - kBackRightXPos, kBackRightYPos, kInvertRightSide, kBackRightSteerMotorInverted, kBackRightEncoderInverted - ); - - /** - * Creates a CommandSwerveDrivetrain instance. - * This should only be called once in your robot program,. - */ - public static CommandSwerveDrivetrain createDrivetrain() { - return new CommandSwerveDrivetrain( - DrivetrainConstants, FrontLeft, FrontRight, BackLeft, BackRight - ); - } - - - /** - * Swerve Drive class utilizing CTR Electronics' Phoenix 6 API with the selected device types. - */ - public static class TunerSwerveDrivetrain extends SwerveDrivetrain { - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param modules Constants for each specific module - */ - public TunerSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - SwerveModuleConstants... modules - ) { - super( - TalonFX::new, TalonFX::new, CANcoder::new, - drivetrainConstants, modules - ); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param modules Constants for each specific module - */ - public TunerSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - SwerveModuleConstants... modules - ) { - super( - TalonFX::new, TalonFX::new, CANcoder::new, - drivetrainConstants, odometryUpdateFrequency, modules - ); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param odometryStandardDeviation The standard deviation for odometry calculation - * in the form [x, y, theta]áµ€, with units in meters - * and radians - * @param visionStandardDeviation The standard deviation for vision calculation - * in the form [x, y, theta]áµ€, with units in meters - * and radians - * @param modules Constants for each specific module - */ - public TunerSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - Matrix odometryStandardDeviation, - Matrix visionStandardDeviation, - SwerveModuleConstants... modules - ) { - super( - TalonFX::new, TalonFX::new, CANcoder::new, - drivetrainConstants, odometryUpdateFrequency, - odometryStandardDeviation, visionStandardDeviation, modules - ); - } - } -} diff --git a/main/deploy/example.txt b/main/deploy/example.txt deleted file mode 100644 index bb82515..0000000 --- a/main/deploy/example.txt +++ /dev/null @@ -1,3 +0,0 @@ -Files placed in this directory will be deployed to the RoboRIO into the -'deploy' directory in the home folder. Use the 'Filesystem.getDeployDirectory' wpilib function -to get a proper path relative to the deploy directory. \ No newline at end of file diff --git a/main/deploy/pathplanner/autos/New Auto.auto b/main/deploy/pathplanner/autos/New Auto.auto deleted file mode 100644 index 70b7ab2..0000000 --- a/main/deploy/pathplanner/autos/New Auto.auto +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": "2025.0", - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "Example Path" - } - } - ] - } - }, - "resetOdom": true, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/main/deploy/pathplanner/navgrid.json b/main/deploy/pathplanner/navgrid.json deleted file mode 100644 index 23e0db9..0000000 --- a/main/deploy/pathplanner/navgrid.json +++ /dev/null @@ -1 +0,0 @@ -{"field_size":{"x":17.548,"y":8.052},"nodeSizeMeters":0.3,"grid":[[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true]]} \ No newline at end of file diff --git a/main/deploy/pathplanner/paths/Example Path.path b/main/deploy/pathplanner/paths/Example Path.path deleted file mode 100644 index 7b84c0a..0000000 --- a/main/deploy/pathplanner/paths/Example Path.path +++ /dev/null @@ -1,54 +0,0 @@ -{ - "version": "2025.0", - "waypoints": [ - { - "anchor": { - "x": 4.0, - "y": 6.0 - }, - "prevControl": null, - "nextControl": { - "x": 5.0, - "y": 6.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 5.0, - "y": 6.0 - }, - "prevControl": { - "x": 4.0, - "y": 6.0 - }, - "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/main/java/frc/robot/Main.java b/main/java/frc/robot/Main.java deleted file mode 100644 index fe215d7..0000000 --- a/main/java/frc/robot/Main.java +++ /dev/null @@ -1,15 +0,0 @@ -// 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; - -import edu.wpi.first.wpilibj.RobotBase; - -public final class Main { - private Main() {} - - public static void main(String... args) { - RobotBase.startRobot(Robot::new); - } -} diff --git a/main/java/frc/robot/Robot.java b/main/java/frc/robot/Robot.java deleted file mode 100644 index 6973bbe..0000000 --- a/main/java/frc/robot/Robot.java +++ /dev/null @@ -1,75 +0,0 @@ -// 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; - -import edu.wpi.first.wpilibj.TimedRobot; -import edu.wpi.first.wpilibj2.command.Command; -import edu.wpi.first.wpilibj2.command.CommandScheduler; - -public class Robot extends TimedRobot { - private Command m_autonomousCommand; - - private final RobotContainer m_robotContainer; - - public Robot() { - m_robotContainer = new RobotContainer(); - } - - @Override - public void robotPeriodic() { - CommandScheduler.getInstance().run(); - } - - @Override - public void disabledInit() {} - - @Override - public void disabledPeriodic() {} - - @Override - public void disabledExit() {} - - @Override - public void autonomousInit() { - m_autonomousCommand = m_robotContainer.getAutonomousCommand(); - - if (m_autonomousCommand != null) { - m_autonomousCommand.schedule(); - } - } - - @Override - public void autonomousPeriodic() {} - - @Override - public void autonomousExit() {} - - @Override - public void teleopInit() { - if (m_autonomousCommand != null) { - m_autonomousCommand.cancel(); - } - } - - @Override - public void teleopPeriodic() {} - - @Override - public void teleopExit() {} - - @Override - public void testInit() { - CommandScheduler.getInstance().cancelAll(); - } - - @Override - public void testPeriodic() {} - - @Override - public void testExit() {} - - @Override - public void simulationPeriodic() {} -} diff --git a/main/java/frc/robot/RobotContainer.java b/main/java/frc/robot/RobotContainer.java deleted file mode 100644 index 0cd4e30..0000000 --- a/main/java/frc/robot/RobotContainer.java +++ /dev/null @@ -1,86 +0,0 @@ -// 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; - -import static edu.wpi.first.units.Units.MetersPerSecond; -import static edu.wpi.first.units.Units.RadiansPerSecond; -import static edu.wpi.first.units.Units.RotationsPerSecond; - -import com.ctre.phoenix6.swerve.SwerveModule.DriveRequestType; -import com.ctre.phoenix6.swerve.SwerveRequest; -import com.pathplanner.lib.auto.AutoBuilder; - -import edu.wpi.first.math.MathUtil; -import edu.wpi.first.math.geometry.Rotation2d; -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.button.CommandXboxController; -import frc.robot.generated.TunerConstants; -import frc.robot.subsystems.CommandSwerveDrivetrain; -import frc.robot.subsystems.Constants.ControllerConstants; - -public class RobotContainer { - private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed - private double MaxAngularRate = RotationsPerSecond.of(1).in(RadiansPerSecond); // 1 of a rotation per second max angular velocity - - private final SendableChooser autoChooser; - - /* Setting up bindings for necessary control of the swerve drive platform */ - private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric() - .withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1) // Add a 10% deadband - .withDriveRequestType(DriveRequestType.OpenLoopVoltage); // Use open-loop control for drive motors - private final SwerveRequest.SwerveDriveBrake brake = new SwerveRequest.SwerveDriveBrake(); - private final SwerveRequest.PointWheelsAt point = new SwerveRequest.PointWheelsAt(); - - private final Telemetry logger = new Telemetry(MaxSpeed); - - private final CommandXboxController joystick = new CommandXboxController(0); - - public final CommandSwerveDrivetrain drivetrain = TunerConstants.createDrivetrain(); - - public RobotContainer() { - configureBindings(); - - autoChooser = AutoBuilder.buildAutoChooser("New Auto"); - - SmartDashboard.putData("Auto Chooser", autoChooser); - } - - private void configureBindings() { - // Note that X is defined as forward according to WPILib convention, - // and Y is defined as to the left according to WPILib convention. - drivetrain.setDefaultCommand( - // Drivetrain will execute this command periodically - drivetrain.applyRequest(() -> - drive.withVelocityX(MathUtil.applyDeadband(-joystick.getLeftY(), ControllerConstants.LEFT_Y_DEADBAND) * MaxSpeed) // Drive forward with negative Y (forward) - .withVelocityY(MathUtil.applyDeadband(-joystick.getLeftX(), ControllerConstants.LEFT_X_DEADBAND) * MaxSpeed) // Drive left with negative X (left) - .withRotationalRate(MathUtil.applyDeadband(-joystick.getRightX(), ControllerConstants.RIGHT_X_DEADBAND) * MaxAngularRate) // Drive counterclockwise with negative X (left) - ) - ); - - joystick.a().whileTrue(drivetrain.applyRequest(() -> brake)); - joystick.b().whileTrue(drivetrain.applyRequest(() -> - point.withModuleDirection(new Rotation2d(-joystick.getLeftY(), -joystick.getLeftX())) - )); - - // Run SysId routines when holding back/start and X/Y. - // Note that each routine should be run exactly once in a single log. - // joystick.back().and(joystick.y()).whileTrue(drivetrain.sysIdDynamic(Direction.kForward)); - // joystick.back().and(joystick.x()).whileTrue(drivetrain.sysIdDynamic(Direction.kReverse)); - // joystick.start().and(joystick.y()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kForward)); - // joystick.start().and(joystick.x()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kReverse)); - - // reset the field-centric heading on left bumper press - joystick.start().onTrue(drivetrain.runOnce(() -> drivetrain.seedFieldCentric())); - - drivetrain.registerTelemetry(logger::telemeterize); - } - - public Command getAutonomousCommand() { - return autoChooser.getSelected(); - // return Commands.print("No autonomous command configured"); - } -} diff --git a/main/java/frc/robot/Telemetry.java b/main/java/frc/robot/Telemetry.java deleted file mode 100644 index edf1979..0000000 --- a/main/java/frc/robot/Telemetry.java +++ /dev/null @@ -1,124 +0,0 @@ -package frc.robot; - -import com.ctre.phoenix6.SignalLogger; -import com.ctre.phoenix6.swerve.SwerveDrivetrain.SwerveDriveState; - -import edu.wpi.first.math.geometry.Pose2d; -import edu.wpi.first.math.kinematics.ChassisSpeeds; -import edu.wpi.first.math.kinematics.SwerveModulePosition; -import edu.wpi.first.math.kinematics.SwerveModuleState; -import edu.wpi.first.networktables.DoubleArrayPublisher; -import edu.wpi.first.networktables.DoublePublisher; -import edu.wpi.first.networktables.NetworkTable; -import edu.wpi.first.networktables.NetworkTableInstance; -import edu.wpi.first.networktables.StringPublisher; -import edu.wpi.first.networktables.StructArrayPublisher; -import edu.wpi.first.networktables.StructPublisher; -import edu.wpi.first.wpilibj.smartdashboard.Mechanism2d; -import edu.wpi.first.wpilibj.smartdashboard.MechanismLigament2d; -import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; -import edu.wpi.first.wpilibj.util.Color; -import edu.wpi.first.wpilibj.util.Color8Bit; - -public class Telemetry { - private final double MaxSpeed; - - /** - * Construct a telemetry object, with the specified max speed of the robot - * - * @param maxSpeed Maximum speed in meters per second - */ - public Telemetry(double maxSpeed) { - MaxSpeed = maxSpeed; - SignalLogger.start(); - } - - /* What to publish over networktables for telemetry */ - private final NetworkTableInstance inst = NetworkTableInstance.getDefault(); - - /* Robot swerve drive state */ - private final NetworkTable driveStateTable = inst.getTable("DriveState"); - private final StructPublisher drivePose = driveStateTable.getStructTopic("Pose", Pose2d.struct).publish(); - private final StructPublisher driveSpeeds = driveStateTable.getStructTopic("Speeds", ChassisSpeeds.struct).publish(); - private final StructArrayPublisher driveModuleStates = driveStateTable.getStructArrayTopic("ModuleStates", SwerveModuleState.struct).publish(); - private final StructArrayPublisher driveModuleTargets = driveStateTable.getStructArrayTopic("ModuleTargets", SwerveModuleState.struct).publish(); - private final StructArrayPublisher driveModulePositions = driveStateTable.getStructArrayTopic("ModulePositions", SwerveModulePosition.struct).publish(); - private final DoublePublisher driveTimestamp = driveStateTable.getDoubleTopic("Timestamp").publish(); - private final DoublePublisher driveOdometryFrequency = driveStateTable.getDoubleTopic("OdometryFrequency").publish(); - - /* Robot pose for field positioning */ - private final NetworkTable table = inst.getTable("Pose"); - private final DoubleArrayPublisher fieldPub = table.getDoubleArrayTopic("robotPose").publish(); - private final StringPublisher fieldTypePub = table.getStringTopic(".type").publish(); - - /* Mechanisms to represent the swerve module states */ - private final Mechanism2d[] m_moduleMechanisms = new Mechanism2d[] { - new Mechanism2d(1, 1), - new Mechanism2d(1, 1), - new Mechanism2d(1, 1), - new Mechanism2d(1, 1), - }; - /* A direction and length changing ligament for speed representation */ - private final MechanismLigament2d[] m_moduleSpeeds = new MechanismLigament2d[] { - m_moduleMechanisms[0].getRoot("RootSpeed", 0.5, 0.5).append(new MechanismLigament2d("Speed", 0.5, 0)), - m_moduleMechanisms[1].getRoot("RootSpeed", 0.5, 0.5).append(new MechanismLigament2d("Speed", 0.5, 0)), - m_moduleMechanisms[2].getRoot("RootSpeed", 0.5, 0.5).append(new MechanismLigament2d("Speed", 0.5, 0)), - m_moduleMechanisms[3].getRoot("RootSpeed", 0.5, 0.5).append(new MechanismLigament2d("Speed", 0.5, 0)), - }; - /* A direction changing and length constant ligament for module direction */ - private final MechanismLigament2d[] m_moduleDirections = new MechanismLigament2d[] { - m_moduleMechanisms[0].getRoot("RootDirection", 0.5, 0.5) - .append(new MechanismLigament2d("Direction", 0.1, 0, 0, new Color8Bit(Color.kWhite))), - m_moduleMechanisms[1].getRoot("RootDirection", 0.5, 0.5) - .append(new MechanismLigament2d("Direction", 0.1, 0, 0, new Color8Bit(Color.kWhite))), - m_moduleMechanisms[2].getRoot("RootDirection", 0.5, 0.5) - .append(new MechanismLigament2d("Direction", 0.1, 0, 0, new Color8Bit(Color.kWhite))), - m_moduleMechanisms[3].getRoot("RootDirection", 0.5, 0.5) - .append(new MechanismLigament2d("Direction", 0.1, 0, 0, new Color8Bit(Color.kWhite))), - }; - - private final double[] m_poseArray = new double[3]; - private final double[] m_moduleStatesArray = new double[8]; - private final double[] m_moduleTargetsArray = new double[8]; - - /** Accept the swerve drive state and telemeterize it to SmartDashboard and SignalLogger. */ - public void telemeterize(SwerveDriveState state) { - /* Telemeterize the swerve drive state */ - drivePose.set(state.Pose); - driveSpeeds.set(state.Speeds); - driveModuleStates.set(state.ModuleStates); - driveModuleTargets.set(state.ModuleTargets); - driveModulePositions.set(state.ModulePositions); - driveTimestamp.set(state.Timestamp); - driveOdometryFrequency.set(1.0 / state.OdometryPeriod); - - /* Also write to log file */ - m_poseArray[0] = state.Pose.getX(); - m_poseArray[1] = state.Pose.getY(); - m_poseArray[2] = state.Pose.getRotation().getDegrees(); - for (int i = 0; i < 4; ++i) { - m_moduleStatesArray[i*2 + 0] = state.ModuleStates[i].angle.getRadians(); - m_moduleStatesArray[i*2 + 1] = state.ModuleStates[i].speedMetersPerSecond; - m_moduleTargetsArray[i*2 + 0] = state.ModuleTargets[i].angle.getRadians(); - m_moduleTargetsArray[i*2 + 1] = state.ModuleTargets[i].speedMetersPerSecond; - } - - SignalLogger.writeDoubleArray("DriveState/Pose", m_poseArray); - SignalLogger.writeDoubleArray("DriveState/ModuleStates", m_moduleStatesArray); - SignalLogger.writeDoubleArray("DriveState/ModuleTargets", m_moduleTargetsArray); - SignalLogger.writeDouble("DriveState/OdometryPeriod", state.OdometryPeriod, "seconds"); - - /* Telemeterize the pose to a Field2d */ - fieldTypePub.set("Field2d"); - fieldPub.set(m_poseArray); - - /* Telemeterize the module states to a Mechanism2d */ - for (int i = 0; i < 4; ++i) { - m_moduleSpeeds[i].setAngle(state.ModuleStates[i].angle); - m_moduleDirections[i].setAngle(state.ModuleStates[i].angle); - m_moduleSpeeds[i].setLength(state.ModuleStates[i].speedMetersPerSecond / (2 * MaxSpeed)); - - SmartDashboard.putData("Module " + i, m_moduleMechanisms[i]); - } - } -} diff --git a/main/java/frc/robot/generated/TunerConstants.java b/main/java/frc/robot/generated/TunerConstants.java deleted file mode 100644 index 7c55399..0000000 --- a/main/java/frc/robot/generated/TunerConstants.java +++ /dev/null @@ -1,286 +0,0 @@ -package frc.robot.generated; - -import static edu.wpi.first.units.Units.*; - -import com.ctre.phoenix6.CANBus; -import com.ctre.phoenix6.configs.*; -import com.ctre.phoenix6.hardware.*; -import com.ctre.phoenix6.signals.*; -import com.ctre.phoenix6.swerve.*; -import com.ctre.phoenix6.swerve.SwerveModuleConstants.*; - -import edu.wpi.first.math.Matrix; -import edu.wpi.first.math.numbers.N1; -import edu.wpi.first.math.numbers.N3; -import edu.wpi.first.units.measure.*; - -import frc.robot.subsystems.CommandSwerveDrivetrain; - -// Generated by the Tuner X Swerve Project Generator -// https://v6.docs.ctr-electronics.com/en/stable/docs/tuner/tuner-swerve/index.html -public class TunerConstants { - // Both sets of gains need to be tuned to your individual robot. - - // The steer motor uses any SwerveModule.SteerRequestType control request with the - // output type specified by SwerveModuleConstants.SteerMotorClosedLoopOutput - private static final Slot0Configs steerGains = new Slot0Configs() - .withKP(100).withKI(0).withKD(0.5) - .withKS(0.1).withKV(1.59).withKA(0) - .withStaticFeedforwardSign(StaticFeedforwardSignValue.UseClosedLoopSign); - // When using closed-loop control, the drive motor uses the control - // output type specified by SwerveModuleConstants.DriveMotorClosedLoopOutput - private static final Slot0Configs driveGains = new Slot0Configs() - .withKP(0.1).withKI(0).withKD(0) - .withKS(0).withKV(0.124); - - // The closed-loop output type to use for the steer motors; - // This affects the PID/FF gains for the steer motors - private static final ClosedLoopOutputType kSteerClosedLoopOutput = ClosedLoopOutputType.Voltage; - // The closed-loop output type to use for the drive motors; - // This affects the PID/FF gains for the drive motors - private static final ClosedLoopOutputType kDriveClosedLoopOutput = ClosedLoopOutputType.Voltage; - - // The type of motor used for the drive motor - private static final DriveMotorArrangement kDriveMotorType = DriveMotorArrangement.TalonFX_Integrated; - // The type of motor used for the drive motor - private static final SteerMotorArrangement kSteerMotorType = SteerMotorArrangement.TalonFX_Integrated; - - // The remote sensor feedback type to use for the steer motors; - // When not Pro-licensed, FusedCANcoder/SyncCANcoder automatically fall back to RemoteCANcoder - private static final SteerFeedbackType kSteerFeedbackType = SteerFeedbackType.FusedCANcoder; - - // The stator current at which the wheels start to slip; - // This needs to be tuned to your individual robot - private static final Current kSlipCurrent = Amps.of(120.0); - - // Initial configs for the drive and steer motors and the azimuth encoder; these cannot be null. - // Some configs will be overwritten; check the `with*InitialConfigs()` API documentation. - private static final TalonFXConfiguration driveInitialConfigs = new TalonFXConfiguration(); - private static final TalonFXConfiguration steerInitialConfigs = new TalonFXConfiguration() - .withCurrentLimits( - new CurrentLimitsConfigs() - // Swerve azimuth does not require much torque output, so we can set a relatively low - // stator current limit to help avoid brownouts without impacting performance. - .withStatorCurrentLimit(Amps.of(60)) - .withStatorCurrentLimitEnable(true) - ); - private static final CANcoderConfiguration encoderInitialConfigs = new CANcoderConfiguration(); - // Configs for the Pigeon 2; leave this null to skip applying Pigeon 2 configs - private static final Pigeon2Configuration pigeonConfigs = null; - - // CAN bus that the devices are located on; - // All swerve devices must share the same CAN bus - public static final CANBus kCANBus = new CANBus("Default Name", "./logs/example.hoot"); - - // Theoretical free speed (m/s) at 12 V applied output; - // This needs to be tuned to your individual robot - public static final LinearVelocity kSpeedAt12Volts = MetersPerSecond.of(6.21); - - // Every 1 rotation of the azimuth results in kCoupleRatio drive motor turns; - // This may need to be tuned to your individual robot - private static final double kCoupleRatio = 3; - - private static final double kDriveGearRatio = 5.142857142857142; - private static final double kSteerGearRatio = 12.8; - private static final Distance kWheelRadius = Inches.of(2); - - private static final boolean kInvertLeftSide = false; - private static final boolean kInvertRightSide = true; - - private static final int kPigeonId = 13; - - // These are only used for simulation - private static final MomentOfInertia kSteerInertia = KilogramSquareMeters.of(0.01); - private static final MomentOfInertia kDriveInertia = KilogramSquareMeters.of(0.01); - // Simulated voltage necessary to overcome friction - private static final Voltage kSteerFrictionVoltage = Volts.of(0.2); - private static final Voltage kDriveFrictionVoltage = Volts.of(0.2); - - public static final SwerveDrivetrainConstants DrivetrainConstants = new SwerveDrivetrainConstants() - .withCANBusName(kCANBus.getName()) - .withPigeon2Id(kPigeonId) - .withPigeon2Configs(pigeonConfigs); - - private static final SwerveModuleConstantsFactory ConstantCreator = - new SwerveModuleConstantsFactory() - .withDriveMotorGearRatio(kDriveGearRatio) - .withSteerMotorGearRatio(kSteerGearRatio) - .withCouplingGearRatio(kCoupleRatio) - .withWheelRadius(kWheelRadius) - .withSteerMotorGains(steerGains) - .withDriveMotorGains(driveGains) - .withSteerMotorClosedLoopOutput(kSteerClosedLoopOutput) - .withDriveMotorClosedLoopOutput(kDriveClosedLoopOutput) - .withSlipCurrent(kSlipCurrent) - .withSpeedAt12Volts(kSpeedAt12Volts) - .withDriveMotorType(kDriveMotorType) - .withSteerMotorType(kSteerMotorType) - .withFeedbackSource(kSteerFeedbackType) - .withDriveMotorInitialConfigs(driveInitialConfigs) - .withSteerMotorInitialConfigs(steerInitialConfigs) - .withEncoderInitialConfigs(encoderInitialConfigs) - .withSteerInertia(kSteerInertia) - .withDriveInertia(kDriveInertia) - .withSteerFrictionVoltage(kSteerFrictionVoltage) - .withDriveFrictionVoltage(kDriveFrictionVoltage); - - - // Front Left - private static final int kFrontLeftDriveMotorId = 11; - private static final int kFrontLeftSteerMotorId = 12; - private static final int kFrontLeftEncoderId = 10; - private static final Angle kFrontLeftEncoderOffset = Rotations.of(-0.0537109375); - private static final boolean kFrontLeftSteerMotorInverted = false; - private static final boolean kFrontLeftEncoderInverted = false; - - private static final Distance kFrontLeftXPos = Inches.of(9); - private static final Distance kFrontLeftYPos = Inches.of(9); - - // Front Right - private static final int kFrontRightDriveMotorId = 2; - private static final int kFrontRightSteerMotorId = 3; - private static final int kFrontRightEncoderId = 1; - private static final Angle kFrontRightEncoderOffset = Rotations.of(0.328125); - private static final boolean kFrontRightSteerMotorInverted = false; - private static final boolean kFrontRightEncoderInverted = false; - - private static final Distance kFrontRightXPos = Inches.of(9); - private static final Distance kFrontRightYPos = Inches.of(-9); - - // Back Left - private static final int kBackLeftDriveMotorId = 8; - private static final int kBackLeftSteerMotorId = 9; - private static final int kBackLeftEncoderId = 7; - private static final Angle kBackLeftEncoderOffset = Rotations.of(-0.30224609375); - private static final boolean kBackLeftSteerMotorInverted = false; - private static final boolean kBackLeftEncoderInverted = false; - - private static final Distance kBackLeftXPos = Inches.of(-9); - private static final Distance kBackLeftYPos = Inches.of(9); - - // Back Right - private static final int kBackRightDriveMotorId = 5; - private static final int kBackRightSteerMotorId = 6; - private static final int kBackRightEncoderId = 4; - private static final Angle kBackRightEncoderOffset = Rotations.of(-0.031005859375); - private static final boolean kBackRightSteerMotorInverted = false; - private static final boolean kBackRightEncoderInverted = false; - - private static final Distance kBackRightXPos = Inches.of(-9); - private static final Distance kBackRightYPos = Inches.of(-9); - - - public static final SwerveModuleConstants FrontLeft = - ConstantCreator.createModuleConstants( - kFrontLeftSteerMotorId, kFrontLeftDriveMotorId, kFrontLeftEncoderId, kFrontLeftEncoderOffset, - kFrontLeftXPos, kFrontLeftYPos, kInvertLeftSide, kFrontLeftSteerMotorInverted, kFrontLeftEncoderInverted - ); - public static final SwerveModuleConstants FrontRight = - ConstantCreator.createModuleConstants( - kFrontRightSteerMotorId, kFrontRightDriveMotorId, kFrontRightEncoderId, kFrontRightEncoderOffset, - kFrontRightXPos, kFrontRightYPos, kInvertRightSide, kFrontRightSteerMotorInverted, kFrontRightEncoderInverted - ); - public static final SwerveModuleConstants BackLeft = - ConstantCreator.createModuleConstants( - kBackLeftSteerMotorId, kBackLeftDriveMotorId, kBackLeftEncoderId, kBackLeftEncoderOffset, - kBackLeftXPos, kBackLeftYPos, kInvertLeftSide, kBackLeftSteerMotorInverted, kBackLeftEncoderInverted - ); - public static final SwerveModuleConstants BackRight = - ConstantCreator.createModuleConstants( - kBackRightSteerMotorId, kBackRightDriveMotorId, kBackRightEncoderId, kBackRightEncoderOffset, - kBackRightXPos, kBackRightYPos, kInvertRightSide, kBackRightSteerMotorInverted, kBackRightEncoderInverted - ); - - /** - * Creates a CommandSwerveDrivetrain instance. - * This should only be called once in your robot program,. - */ - public static CommandSwerveDrivetrain createDrivetrain() { - return new CommandSwerveDrivetrain( - DrivetrainConstants, FrontLeft, FrontRight, BackLeft, BackRight - ); - } - - - /** - * Swerve Drive class utilizing CTR Electronics' Phoenix 6 API with the selected device types. - */ - public static class TunerSwerveDrivetrain extends SwerveDrivetrain { - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param modules Constants for each specific module - */ - public TunerSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - SwerveModuleConstants... modules - ) { - super( - TalonFX::new, TalonFX::new, CANcoder::new, - drivetrainConstants, modules - ); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param modules Constants for each specific module - */ - public TunerSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - SwerveModuleConstants... modules - ) { - super( - TalonFX::new, TalonFX::new, CANcoder::new, - drivetrainConstants, odometryUpdateFrequency, modules - ); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param odometryStandardDeviation The standard deviation for odometry calculation - * in the form [x, y, theta]ᵀ, with units in meters - * and radians - * @param visionStandardDeviation The standard deviation for vision calculation - * in the form [x, y, theta]ᵀ, with units in meters - * and radians - * @param modules Constants for each specific module - */ - public TunerSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - Matrix odometryStandardDeviation, - Matrix visionStandardDeviation, - SwerveModuleConstants... modules - ) { - super( - TalonFX::new, TalonFX::new, CANcoder::new, - drivetrainConstants, odometryUpdateFrequency, - odometryStandardDeviation, visionStandardDeviation, modules - ); - } - } -} diff --git a/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java b/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java deleted file mode 100644 index a78ffc3..0000000 --- a/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java +++ /dev/null @@ -1,292 +0,0 @@ -package frc.robot.subsystems; - -import static edu.wpi.first.units.Units.*; - -import java.util.function.Supplier; - -import com.ctre.phoenix6.SignalLogger; -import com.ctre.phoenix6.Utils; -import com.ctre.phoenix6.swerve.SwerveDrivetrainConstants; -import com.ctre.phoenix6.swerve.SwerveModuleConstants; -import com.ctre.phoenix6.swerve.SwerveRequest; -import com.pathplanner.lib.auto.AutoBuilder; -import com.pathplanner.lib.config.PIDConstants; -import com.pathplanner.lib.config.RobotConfig; -import com.pathplanner.lib.controllers.PPHolonomicDriveController; - -import edu.wpi.first.math.Matrix; -import edu.wpi.first.math.geometry.Rotation2d; -import edu.wpi.first.math.numbers.N1; -import edu.wpi.first.math.numbers.N3; -import edu.wpi.first.wpilibj.DriverStation; -import edu.wpi.first.wpilibj.DriverStation.Alliance; -import edu.wpi.first.wpilibj.Notifier; -import edu.wpi.first.wpilibj.RobotController; -import edu.wpi.first.wpilibj2.command.Command; -import edu.wpi.first.wpilibj2.command.Subsystem; -import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine; - -import frc.robot.generated.TunerConstants.TunerSwerveDrivetrain; - -/** - * Class that extends the Phoenix 6 SwerveDrivetrain class and implements - * Subsystem so it can easily be used in command-based projects. - */ -public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Subsystem { - private static final double kSimLoopPeriod = 0.005; // 5 ms - private Notifier m_simNotifier = null; - private double m_lastSimTime; - - /* Blue alliance sees forward as 0 degrees (toward red alliance wall) */ - private static final Rotation2d kBlueAlliancePerspectiveRotation = Rotation2d.kZero; - /* Red alliance sees forward as 180 degrees (toward blue alliance wall) */ - private static final Rotation2d kRedAlliancePerspectiveRotation = Rotation2d.k180deg; - /* Keep track if we've ever applied the operator perspective before or not */ - private boolean m_hasAppliedOperatorPerspective = false; - - /** Swerve request to apply during robot-centric path following */ - private final SwerveRequest.ApplyRobotSpeeds m_pathApplyRobotSpeeds = new SwerveRequest.ApplyRobotSpeeds(); - - /* Swerve requests to apply during SysId characterization */ - private final SwerveRequest.SysIdSwerveTranslation m_translationCharacterization = new SwerveRequest.SysIdSwerveTranslation(); - private final SwerveRequest.SysIdSwerveSteerGains m_steerCharacterization = new SwerveRequest.SysIdSwerveSteerGains(); - private final SwerveRequest.SysIdSwerveRotation m_rotationCharacterization = new SwerveRequest.SysIdSwerveRotation(); - - /* SysId routine for characterizing translation. This is used to find PID gains for the drive motors. */ - private final SysIdRoutine m_sysIdRoutineTranslation = new SysIdRoutine( - new SysIdRoutine.Config( - null, // Use default ramp rate (1 V/s) - Volts.of(4), // Reduce dynamic step voltage to 4 V to prevent brownout - null, // Use default timeout (10 s) - // Log state with SignalLogger class - state -> SignalLogger.writeString("SysIdTranslation_State", state.toString()) - ), - new SysIdRoutine.Mechanism( - output -> setControl(m_translationCharacterization.withVolts(output)), - null, - this - ) - ); - - /* SysId routine for characterizing steer. This is used to find PID gains for the steer motors. */ - private final SysIdRoutine m_sysIdRoutineSteer = new SysIdRoutine( - new SysIdRoutine.Config( - null, // Use default ramp rate (1 V/s) - Volts.of(7), // Use dynamic voltage of 7 V - null, // Use default timeout (10 s) - // Log state with SignalLogger class - state -> SignalLogger.writeString("SysIdSteer_State", state.toString()) - ), - new SysIdRoutine.Mechanism( - volts -> setControl(m_steerCharacterization.withVolts(volts)), - null, - this - ) - ); - - /* - * SysId routine for characterizing rotation. - * This is used to find PID gains for the FieldCentricFacingAngle HeadingController. - * See the documentation of SwerveRequest.SysIdSwerveRotation for info on importing the log to SysId. - */ - private final SysIdRoutine m_sysIdRoutineRotation = new SysIdRoutine( - new SysIdRoutine.Config( - /* This is in radians per second², but SysId only supports "volts per second" */ - Volts.of(Math.PI / 6).per(Second), - /* This is in radians per second, but SysId only supports "volts" */ - Volts.of(Math.PI), - null, // Use default timeout (10 s) - // Log state with SignalLogger class - state -> SignalLogger.writeString("SysIdRotation_State", state.toString()) - ), - new SysIdRoutine.Mechanism( - output -> { - /* output is actually radians per second, but SysId only supports "volts" */ - setControl(m_rotationCharacterization.withRotationalRate(output.in(Volts))); - /* also log the requested output for SysId */ - SignalLogger.writeDouble("Rotational_Rate", output.in(Volts)); - }, - null, - this - ) - ); - - /* The SysId routine to test */ - private SysIdRoutine m_sysIdRoutineToApply = m_sysIdRoutineTranslation; - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param modules Constants for each specific module - */ - public CommandSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - SwerveModuleConstants... modules - ) { - super(drivetrainConstants, modules); - if (Utils.isSimulation()) { - startSimThread(); - } - configureAutoBuilder(); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param modules Constants for each specific module - */ - public CommandSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - SwerveModuleConstants... modules - ) { - super(drivetrainConstants, odometryUpdateFrequency, modules); - if (Utils.isSimulation()) { - startSimThread(); - } - configureAutoBuilder(); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param odometryStandardDeviation The standard deviation for odometry calculation - * in the form [x, y, theta]áµ€, with units in meters - * and radians - * @param visionStandardDeviation The standard deviation for vision calculation - * in the form [x, y, theta]áµ€, with units in meters - * and radians - * @param modules Constants for each specific module - */ - public CommandSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - Matrix odometryStandardDeviation, - Matrix visionStandardDeviation, - SwerveModuleConstants... modules - ) { - super(drivetrainConstants, odometryUpdateFrequency, odometryStandardDeviation, visionStandardDeviation, modules); - if (Utils.isSimulation()) { - startSimThread(); - } - configureAutoBuilder(); - } - - private void configureAutoBuilder() { - try { - var config = RobotConfig.fromGUISettings(); - AutoBuilder.configure( - () -> getState().Pose, // Supplier of current robot pose - this::resetPose, // Consumer for seeding pose against auto - () -> getState().Speeds, // Supplier of current robot speeds - // Consumer of ChassisSpeeds and feedforwards to drive the robot - (speeds, feedforwards) -> setControl( - m_pathApplyRobotSpeeds.withSpeeds(speeds) - .withWheelForceFeedforwardsX(feedforwards.robotRelativeForcesXNewtons()) - .withWheelForceFeedforwardsY(feedforwards.robotRelativeForcesYNewtons()) - ), - new PPHolonomicDriveController( - // PID constants for translation - new PIDConstants(10, 0, 0), - // PID constants for rotation - new PIDConstants(7, 0, 0) - ), - config, - // Assume the path needs to be flipped for Red vs Blue, this is normally the case - () -> DriverStation.getAlliance().orElse(Alliance.Blue) == Alliance.Red, - this // Subsystem for requirements - ); - } catch (Exception ex) { - DriverStation.reportError("Failed to load PathPlanner config and configure AutoBuilder", ex.getStackTrace()); - } - } - - /** - * Returns a command that applies the specified control request to this swerve drivetrain. - * - * @param request Function returning the request to apply - * @return Command to run - */ - public Command applyRequest(Supplier requestSupplier) { - return run(() -> this.setControl(requestSupplier.get())); - } - - /** - * Runs the SysId Quasistatic test in the given direction for the routine - * specified by {@link #m_sysIdRoutineToApply}. - * - * @param direction Direction of the SysId Quasistatic test - * @return Command to run - */ - public Command sysIdQuasistatic(SysIdRoutine.Direction direction) { - return m_sysIdRoutineToApply.quasistatic(direction); - } - - /** - * Runs the SysId Dynamic test in the given direction for the routine - * specified by {@link #m_sysIdRoutineToApply}. - * - * @param direction Direction of the SysId Dynamic test - * @return Command to run - */ - public Command sysIdDynamic(SysIdRoutine.Direction direction) { - return m_sysIdRoutineToApply.dynamic(direction); - } - - @Override - public void periodic() { - /* - * Periodically try to apply the operator perspective. - * If we haven't applied the operator perspective before, then we should apply it regardless of DS state. - * This allows us to correct the perspective in case the robot code restarts mid-match. - * Otherwise, only check and apply the operator perspective if the DS is disabled. - * This ensures driving behavior doesn't change until an explicit disable event occurs during testing. - */ - if (!m_hasAppliedOperatorPerspective || DriverStation.isDisabled()) { - DriverStation.getAlliance().ifPresent(allianceColor -> { - setOperatorPerspectiveForward( - allianceColor == Alliance.Red - ? kRedAlliancePerspectiveRotation - : kBlueAlliancePerspectiveRotation - ); - m_hasAppliedOperatorPerspective = true; - }); - } - } - - private void startSimThread() { - m_lastSimTime = Utils.getCurrentTimeSeconds(); - - /* Run simulation at a faster rate so PID gains behave more reasonably */ - m_simNotifier = new Notifier(() -> { - final double currentTime = Utils.getCurrentTimeSeconds(); - double deltaTime = currentTime - m_lastSimTime; - m_lastSimTime = currentTime; - - /* use the measured time delta, get battery voltage from WPILib */ - updateSimState(deltaTime, RobotController.getBatteryVoltage()); - }); - m_simNotifier.startPeriodic(kSimLoopPeriod); - } -} diff --git a/main/java/frc/robot/subsystems/Constants.java b/main/java/frc/robot/subsystems/Constants.java deleted file mode 100644 index 247eeaa..0000000 --- a/main/java/frc/robot/subsystems/Constants.java +++ /dev/null @@ -1,20 +0,0 @@ -package frc.robot.subsystems; - -public class Constants { - public static class ControllerConstants { - - public static final int DRIVER_CONTROLLER_PORT = 0; - public static final int OPERATOR_CONTROLLER_PORT = 1; - - // Joystick Deadband - public static final double LEFT_X_DEADBAND = 0.1; - public static final double LEFT_Y_DEADBAND = 0.1; - public static final double RIGHT_X_DEADBAND = 0.1; - } - - public static class LoggingConstants { - - public static final boolean DEFAULT_LOGGING_STATE = false; - } - -} diff --git a/navgrid.json b/navgrid.json deleted file mode 100644 index 23e0db9..0000000 --- a/navgrid.json +++ /dev/null @@ -1 +0,0 @@ -{"field_size":{"x":17.548,"y":8.052},"nodeSizeMeters":0.3,"grid":[[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true]]} \ No newline at end of file diff --git a/pathplanner/autos/New Auto.auto b/pathplanner/autos/New Auto.auto deleted file mode 100644 index 70b7ab2..0000000 --- a/pathplanner/autos/New Auto.auto +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": "2025.0", - "command": { - "type": "sequential", - "data": { - "commands": [ - { - "type": "path", - "data": { - "pathName": "Example Path" - } - } - ] - } - }, - "resetOdom": true, - "folder": null, - "choreoAuto": false -} \ No newline at end of file diff --git a/pathplanner/navgrid.json b/pathplanner/navgrid.json deleted file mode 100644 index 23e0db9..0000000 --- a/pathplanner/navgrid.json +++ /dev/null @@ -1 +0,0 @@ -{"field_size":{"x":17.548,"y":8.052},"nodeSizeMeters":0.3,"grid":[[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true],[true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true],[true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true],[true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true]]} \ No newline at end of file diff --git a/pathplanner/paths/Example Path.path b/pathplanner/paths/Example Path.path deleted file mode 100644 index 7b84c0a..0000000 --- a/pathplanner/paths/Example Path.path +++ /dev/null @@ -1,54 +0,0 @@ -{ - "version": "2025.0", - "waypoints": [ - { - "anchor": { - "x": 4.0, - "y": 6.0 - }, - "prevControl": null, - "nextControl": { - "x": 5.0, - "y": 6.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 5.0, - "y": 6.0 - }, - "prevControl": { - "x": 4.0, - "y": 6.0 - }, - "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/paths/Example Path.path b/paths/Example Path.path deleted file mode 100644 index 7b84c0a..0000000 --- a/paths/Example Path.path +++ /dev/null @@ -1,54 +0,0 @@ -{ - "version": "2025.0", - "waypoints": [ - { - "anchor": { - "x": 4.0, - "y": 6.0 - }, - "prevControl": null, - "nextControl": { - "x": 5.0, - "y": 6.0 - }, - "isLocked": false, - "linkedName": null - }, - { - "anchor": { - "x": 5.0, - "y": 6.0 - }, - "prevControl": { - "x": 4.0, - "y": 6.0 - }, - "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/robot/Main.java b/robot/Main.java deleted file mode 100644 index fe215d7..0000000 --- a/robot/Main.java +++ /dev/null @@ -1,15 +0,0 @@ -// 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; - -import edu.wpi.first.wpilibj.RobotBase; - -public final class Main { - private Main() {} - - public static void main(String... args) { - RobotBase.startRobot(Robot::new); - } -} diff --git a/robot/Robot.java b/robot/Robot.java deleted file mode 100644 index 6973bbe..0000000 --- a/robot/Robot.java +++ /dev/null @@ -1,75 +0,0 @@ -// 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; - -import edu.wpi.first.wpilibj.TimedRobot; -import edu.wpi.first.wpilibj2.command.Command; -import edu.wpi.first.wpilibj2.command.CommandScheduler; - -public class Robot extends TimedRobot { - private Command m_autonomousCommand; - - private final RobotContainer m_robotContainer; - - public Robot() { - m_robotContainer = new RobotContainer(); - } - - @Override - public void robotPeriodic() { - CommandScheduler.getInstance().run(); - } - - @Override - public void disabledInit() {} - - @Override - public void disabledPeriodic() {} - - @Override - public void disabledExit() {} - - @Override - public void autonomousInit() { - m_autonomousCommand = m_robotContainer.getAutonomousCommand(); - - if (m_autonomousCommand != null) { - m_autonomousCommand.schedule(); - } - } - - @Override - public void autonomousPeriodic() {} - - @Override - public void autonomousExit() {} - - @Override - public void teleopInit() { - if (m_autonomousCommand != null) { - m_autonomousCommand.cancel(); - } - } - - @Override - public void teleopPeriodic() {} - - @Override - public void teleopExit() {} - - @Override - public void testInit() { - CommandScheduler.getInstance().cancelAll(); - } - - @Override - public void testPeriodic() {} - - @Override - public void testExit() {} - - @Override - public void simulationPeriodic() {} -} diff --git a/robot/RobotContainer.java b/robot/RobotContainer.java deleted file mode 100644 index 0cd4e30..0000000 --- a/robot/RobotContainer.java +++ /dev/null @@ -1,86 +0,0 @@ -// 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; - -import static edu.wpi.first.units.Units.MetersPerSecond; -import static edu.wpi.first.units.Units.RadiansPerSecond; -import static edu.wpi.first.units.Units.RotationsPerSecond; - -import com.ctre.phoenix6.swerve.SwerveModule.DriveRequestType; -import com.ctre.phoenix6.swerve.SwerveRequest; -import com.pathplanner.lib.auto.AutoBuilder; - -import edu.wpi.first.math.MathUtil; -import edu.wpi.first.math.geometry.Rotation2d; -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.button.CommandXboxController; -import frc.robot.generated.TunerConstants; -import frc.robot.subsystems.CommandSwerveDrivetrain; -import frc.robot.subsystems.Constants.ControllerConstants; - -public class RobotContainer { - private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed - private double MaxAngularRate = RotationsPerSecond.of(1).in(RadiansPerSecond); // 1 of a rotation per second max angular velocity - - private final SendableChooser autoChooser; - - /* Setting up bindings for necessary control of the swerve drive platform */ - private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric() - .withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1) // Add a 10% deadband - .withDriveRequestType(DriveRequestType.OpenLoopVoltage); // Use open-loop control for drive motors - private final SwerveRequest.SwerveDriveBrake brake = new SwerveRequest.SwerveDriveBrake(); - private final SwerveRequest.PointWheelsAt point = new SwerveRequest.PointWheelsAt(); - - private final Telemetry logger = new Telemetry(MaxSpeed); - - private final CommandXboxController joystick = new CommandXboxController(0); - - public final CommandSwerveDrivetrain drivetrain = TunerConstants.createDrivetrain(); - - public RobotContainer() { - configureBindings(); - - autoChooser = AutoBuilder.buildAutoChooser("New Auto"); - - SmartDashboard.putData("Auto Chooser", autoChooser); - } - - private void configureBindings() { - // Note that X is defined as forward according to WPILib convention, - // and Y is defined as to the left according to WPILib convention. - drivetrain.setDefaultCommand( - // Drivetrain will execute this command periodically - drivetrain.applyRequest(() -> - drive.withVelocityX(MathUtil.applyDeadband(-joystick.getLeftY(), ControllerConstants.LEFT_Y_DEADBAND) * MaxSpeed) // Drive forward with negative Y (forward) - .withVelocityY(MathUtil.applyDeadband(-joystick.getLeftX(), ControllerConstants.LEFT_X_DEADBAND) * MaxSpeed) // Drive left with negative X (left) - .withRotationalRate(MathUtil.applyDeadband(-joystick.getRightX(), ControllerConstants.RIGHT_X_DEADBAND) * MaxAngularRate) // Drive counterclockwise with negative X (left) - ) - ); - - joystick.a().whileTrue(drivetrain.applyRequest(() -> brake)); - joystick.b().whileTrue(drivetrain.applyRequest(() -> - point.withModuleDirection(new Rotation2d(-joystick.getLeftY(), -joystick.getLeftX())) - )); - - // Run SysId routines when holding back/start and X/Y. - // Note that each routine should be run exactly once in a single log. - // joystick.back().and(joystick.y()).whileTrue(drivetrain.sysIdDynamic(Direction.kForward)); - // joystick.back().and(joystick.x()).whileTrue(drivetrain.sysIdDynamic(Direction.kReverse)); - // joystick.start().and(joystick.y()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kForward)); - // joystick.start().and(joystick.x()).whileTrue(drivetrain.sysIdQuasistatic(Direction.kReverse)); - - // reset the field-centric heading on left bumper press - joystick.start().onTrue(drivetrain.runOnce(() -> drivetrain.seedFieldCentric())); - - drivetrain.registerTelemetry(logger::telemeterize); - } - - public Command getAutonomousCommand() { - return autoChooser.getSelected(); - // return Commands.print("No autonomous command configured"); - } -} diff --git a/robot/Telemetry.java b/robot/Telemetry.java deleted file mode 100644 index edf1979..0000000 --- a/robot/Telemetry.java +++ /dev/null @@ -1,124 +0,0 @@ -package frc.robot; - -import com.ctre.phoenix6.SignalLogger; -import com.ctre.phoenix6.swerve.SwerveDrivetrain.SwerveDriveState; - -import edu.wpi.first.math.geometry.Pose2d; -import edu.wpi.first.math.kinematics.ChassisSpeeds; -import edu.wpi.first.math.kinematics.SwerveModulePosition; -import edu.wpi.first.math.kinematics.SwerveModuleState; -import edu.wpi.first.networktables.DoubleArrayPublisher; -import edu.wpi.first.networktables.DoublePublisher; -import edu.wpi.first.networktables.NetworkTable; -import edu.wpi.first.networktables.NetworkTableInstance; -import edu.wpi.first.networktables.StringPublisher; -import edu.wpi.first.networktables.StructArrayPublisher; -import edu.wpi.first.networktables.StructPublisher; -import edu.wpi.first.wpilibj.smartdashboard.Mechanism2d; -import edu.wpi.first.wpilibj.smartdashboard.MechanismLigament2d; -import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; -import edu.wpi.first.wpilibj.util.Color; -import edu.wpi.first.wpilibj.util.Color8Bit; - -public class Telemetry { - private final double MaxSpeed; - - /** - * Construct a telemetry object, with the specified max speed of the robot - * - * @param maxSpeed Maximum speed in meters per second - */ - public Telemetry(double maxSpeed) { - MaxSpeed = maxSpeed; - SignalLogger.start(); - } - - /* What to publish over networktables for telemetry */ - private final NetworkTableInstance inst = NetworkTableInstance.getDefault(); - - /* Robot swerve drive state */ - private final NetworkTable driveStateTable = inst.getTable("DriveState"); - private final StructPublisher drivePose = driveStateTable.getStructTopic("Pose", Pose2d.struct).publish(); - private final StructPublisher driveSpeeds = driveStateTable.getStructTopic("Speeds", ChassisSpeeds.struct).publish(); - private final StructArrayPublisher driveModuleStates = driveStateTable.getStructArrayTopic("ModuleStates", SwerveModuleState.struct).publish(); - private final StructArrayPublisher driveModuleTargets = driveStateTable.getStructArrayTopic("ModuleTargets", SwerveModuleState.struct).publish(); - private final StructArrayPublisher driveModulePositions = driveStateTable.getStructArrayTopic("ModulePositions", SwerveModulePosition.struct).publish(); - private final DoublePublisher driveTimestamp = driveStateTable.getDoubleTopic("Timestamp").publish(); - private final DoublePublisher driveOdometryFrequency = driveStateTable.getDoubleTopic("OdometryFrequency").publish(); - - /* Robot pose for field positioning */ - private final NetworkTable table = inst.getTable("Pose"); - private final DoubleArrayPublisher fieldPub = table.getDoubleArrayTopic("robotPose").publish(); - private final StringPublisher fieldTypePub = table.getStringTopic(".type").publish(); - - /* Mechanisms to represent the swerve module states */ - private final Mechanism2d[] m_moduleMechanisms = new Mechanism2d[] { - new Mechanism2d(1, 1), - new Mechanism2d(1, 1), - new Mechanism2d(1, 1), - new Mechanism2d(1, 1), - }; - /* A direction and length changing ligament for speed representation */ - private final MechanismLigament2d[] m_moduleSpeeds = new MechanismLigament2d[] { - m_moduleMechanisms[0].getRoot("RootSpeed", 0.5, 0.5).append(new MechanismLigament2d("Speed", 0.5, 0)), - m_moduleMechanisms[1].getRoot("RootSpeed", 0.5, 0.5).append(new MechanismLigament2d("Speed", 0.5, 0)), - m_moduleMechanisms[2].getRoot("RootSpeed", 0.5, 0.5).append(new MechanismLigament2d("Speed", 0.5, 0)), - m_moduleMechanisms[3].getRoot("RootSpeed", 0.5, 0.5).append(new MechanismLigament2d("Speed", 0.5, 0)), - }; - /* A direction changing and length constant ligament for module direction */ - private final MechanismLigament2d[] m_moduleDirections = new MechanismLigament2d[] { - m_moduleMechanisms[0].getRoot("RootDirection", 0.5, 0.5) - .append(new MechanismLigament2d("Direction", 0.1, 0, 0, new Color8Bit(Color.kWhite))), - m_moduleMechanisms[1].getRoot("RootDirection", 0.5, 0.5) - .append(new MechanismLigament2d("Direction", 0.1, 0, 0, new Color8Bit(Color.kWhite))), - m_moduleMechanisms[2].getRoot("RootDirection", 0.5, 0.5) - .append(new MechanismLigament2d("Direction", 0.1, 0, 0, new Color8Bit(Color.kWhite))), - m_moduleMechanisms[3].getRoot("RootDirection", 0.5, 0.5) - .append(new MechanismLigament2d("Direction", 0.1, 0, 0, new Color8Bit(Color.kWhite))), - }; - - private final double[] m_poseArray = new double[3]; - private final double[] m_moduleStatesArray = new double[8]; - private final double[] m_moduleTargetsArray = new double[8]; - - /** Accept the swerve drive state and telemeterize it to SmartDashboard and SignalLogger. */ - public void telemeterize(SwerveDriveState state) { - /* Telemeterize the swerve drive state */ - drivePose.set(state.Pose); - driveSpeeds.set(state.Speeds); - driveModuleStates.set(state.ModuleStates); - driveModuleTargets.set(state.ModuleTargets); - driveModulePositions.set(state.ModulePositions); - driveTimestamp.set(state.Timestamp); - driveOdometryFrequency.set(1.0 / state.OdometryPeriod); - - /* Also write to log file */ - m_poseArray[0] = state.Pose.getX(); - m_poseArray[1] = state.Pose.getY(); - m_poseArray[2] = state.Pose.getRotation().getDegrees(); - for (int i = 0; i < 4; ++i) { - m_moduleStatesArray[i*2 + 0] = state.ModuleStates[i].angle.getRadians(); - m_moduleStatesArray[i*2 + 1] = state.ModuleStates[i].speedMetersPerSecond; - m_moduleTargetsArray[i*2 + 0] = state.ModuleTargets[i].angle.getRadians(); - m_moduleTargetsArray[i*2 + 1] = state.ModuleTargets[i].speedMetersPerSecond; - } - - SignalLogger.writeDoubleArray("DriveState/Pose", m_poseArray); - SignalLogger.writeDoubleArray("DriveState/ModuleStates", m_moduleStatesArray); - SignalLogger.writeDoubleArray("DriveState/ModuleTargets", m_moduleTargetsArray); - SignalLogger.writeDouble("DriveState/OdometryPeriod", state.OdometryPeriod, "seconds"); - - /* Telemeterize the pose to a Field2d */ - fieldTypePub.set("Field2d"); - fieldPub.set(m_poseArray); - - /* Telemeterize the module states to a Mechanism2d */ - for (int i = 0; i < 4; ++i) { - m_moduleSpeeds[i].setAngle(state.ModuleStates[i].angle); - m_moduleDirections[i].setAngle(state.ModuleStates[i].angle); - m_moduleSpeeds[i].setLength(state.ModuleStates[i].speedMetersPerSecond / (2 * MaxSpeed)); - - SmartDashboard.putData("Module " + i, m_moduleMechanisms[i]); - } - } -} diff --git a/robot/generated/TunerConstants.java b/robot/generated/TunerConstants.java deleted file mode 100644 index 7c55399..0000000 --- a/robot/generated/TunerConstants.java +++ /dev/null @@ -1,286 +0,0 @@ -package frc.robot.generated; - -import static edu.wpi.first.units.Units.*; - -import com.ctre.phoenix6.CANBus; -import com.ctre.phoenix6.configs.*; -import com.ctre.phoenix6.hardware.*; -import com.ctre.phoenix6.signals.*; -import com.ctre.phoenix6.swerve.*; -import com.ctre.phoenix6.swerve.SwerveModuleConstants.*; - -import edu.wpi.first.math.Matrix; -import edu.wpi.first.math.numbers.N1; -import edu.wpi.first.math.numbers.N3; -import edu.wpi.first.units.measure.*; - -import frc.robot.subsystems.CommandSwerveDrivetrain; - -// Generated by the Tuner X Swerve Project Generator -// https://v6.docs.ctr-electronics.com/en/stable/docs/tuner/tuner-swerve/index.html -public class TunerConstants { - // Both sets of gains need to be tuned to your individual robot. - - // The steer motor uses any SwerveModule.SteerRequestType control request with the - // output type specified by SwerveModuleConstants.SteerMotorClosedLoopOutput - private static final Slot0Configs steerGains = new Slot0Configs() - .withKP(100).withKI(0).withKD(0.5) - .withKS(0.1).withKV(1.59).withKA(0) - .withStaticFeedforwardSign(StaticFeedforwardSignValue.UseClosedLoopSign); - // When using closed-loop control, the drive motor uses the control - // output type specified by SwerveModuleConstants.DriveMotorClosedLoopOutput - private static final Slot0Configs driveGains = new Slot0Configs() - .withKP(0.1).withKI(0).withKD(0) - .withKS(0).withKV(0.124); - - // The closed-loop output type to use for the steer motors; - // This affects the PID/FF gains for the steer motors - private static final ClosedLoopOutputType kSteerClosedLoopOutput = ClosedLoopOutputType.Voltage; - // The closed-loop output type to use for the drive motors; - // This affects the PID/FF gains for the drive motors - private static final ClosedLoopOutputType kDriveClosedLoopOutput = ClosedLoopOutputType.Voltage; - - // The type of motor used for the drive motor - private static final DriveMotorArrangement kDriveMotorType = DriveMotorArrangement.TalonFX_Integrated; - // The type of motor used for the drive motor - private static final SteerMotorArrangement kSteerMotorType = SteerMotorArrangement.TalonFX_Integrated; - - // The remote sensor feedback type to use for the steer motors; - // When not Pro-licensed, FusedCANcoder/SyncCANcoder automatically fall back to RemoteCANcoder - private static final SteerFeedbackType kSteerFeedbackType = SteerFeedbackType.FusedCANcoder; - - // The stator current at which the wheels start to slip; - // This needs to be tuned to your individual robot - private static final Current kSlipCurrent = Amps.of(120.0); - - // Initial configs for the drive and steer motors and the azimuth encoder; these cannot be null. - // Some configs will be overwritten; check the `with*InitialConfigs()` API documentation. - private static final TalonFXConfiguration driveInitialConfigs = new TalonFXConfiguration(); - private static final TalonFXConfiguration steerInitialConfigs = new TalonFXConfiguration() - .withCurrentLimits( - new CurrentLimitsConfigs() - // Swerve azimuth does not require much torque output, so we can set a relatively low - // stator current limit to help avoid brownouts without impacting performance. - .withStatorCurrentLimit(Amps.of(60)) - .withStatorCurrentLimitEnable(true) - ); - private static final CANcoderConfiguration encoderInitialConfigs = new CANcoderConfiguration(); - // Configs for the Pigeon 2; leave this null to skip applying Pigeon 2 configs - private static final Pigeon2Configuration pigeonConfigs = null; - - // CAN bus that the devices are located on; - // All swerve devices must share the same CAN bus - public static final CANBus kCANBus = new CANBus("Default Name", "./logs/example.hoot"); - - // Theoretical free speed (m/s) at 12 V applied output; - // This needs to be tuned to your individual robot - public static final LinearVelocity kSpeedAt12Volts = MetersPerSecond.of(6.21); - - // Every 1 rotation of the azimuth results in kCoupleRatio drive motor turns; - // This may need to be tuned to your individual robot - private static final double kCoupleRatio = 3; - - private static final double kDriveGearRatio = 5.142857142857142; - private static final double kSteerGearRatio = 12.8; - private static final Distance kWheelRadius = Inches.of(2); - - private static final boolean kInvertLeftSide = false; - private static final boolean kInvertRightSide = true; - - private static final int kPigeonId = 13; - - // These are only used for simulation - private static final MomentOfInertia kSteerInertia = KilogramSquareMeters.of(0.01); - private static final MomentOfInertia kDriveInertia = KilogramSquareMeters.of(0.01); - // Simulated voltage necessary to overcome friction - private static final Voltage kSteerFrictionVoltage = Volts.of(0.2); - private static final Voltage kDriveFrictionVoltage = Volts.of(0.2); - - public static final SwerveDrivetrainConstants DrivetrainConstants = new SwerveDrivetrainConstants() - .withCANBusName(kCANBus.getName()) - .withPigeon2Id(kPigeonId) - .withPigeon2Configs(pigeonConfigs); - - private static final SwerveModuleConstantsFactory ConstantCreator = - new SwerveModuleConstantsFactory() - .withDriveMotorGearRatio(kDriveGearRatio) - .withSteerMotorGearRatio(kSteerGearRatio) - .withCouplingGearRatio(kCoupleRatio) - .withWheelRadius(kWheelRadius) - .withSteerMotorGains(steerGains) - .withDriveMotorGains(driveGains) - .withSteerMotorClosedLoopOutput(kSteerClosedLoopOutput) - .withDriveMotorClosedLoopOutput(kDriveClosedLoopOutput) - .withSlipCurrent(kSlipCurrent) - .withSpeedAt12Volts(kSpeedAt12Volts) - .withDriveMotorType(kDriveMotorType) - .withSteerMotorType(kSteerMotorType) - .withFeedbackSource(kSteerFeedbackType) - .withDriveMotorInitialConfigs(driveInitialConfigs) - .withSteerMotorInitialConfigs(steerInitialConfigs) - .withEncoderInitialConfigs(encoderInitialConfigs) - .withSteerInertia(kSteerInertia) - .withDriveInertia(kDriveInertia) - .withSteerFrictionVoltage(kSteerFrictionVoltage) - .withDriveFrictionVoltage(kDriveFrictionVoltage); - - - // Front Left - private static final int kFrontLeftDriveMotorId = 11; - private static final int kFrontLeftSteerMotorId = 12; - private static final int kFrontLeftEncoderId = 10; - private static final Angle kFrontLeftEncoderOffset = Rotations.of(-0.0537109375); - private static final boolean kFrontLeftSteerMotorInverted = false; - private static final boolean kFrontLeftEncoderInverted = false; - - private static final Distance kFrontLeftXPos = Inches.of(9); - private static final Distance kFrontLeftYPos = Inches.of(9); - - // Front Right - private static final int kFrontRightDriveMotorId = 2; - private static final int kFrontRightSteerMotorId = 3; - private static final int kFrontRightEncoderId = 1; - private static final Angle kFrontRightEncoderOffset = Rotations.of(0.328125); - private static final boolean kFrontRightSteerMotorInverted = false; - private static final boolean kFrontRightEncoderInverted = false; - - private static final Distance kFrontRightXPos = Inches.of(9); - private static final Distance kFrontRightYPos = Inches.of(-9); - - // Back Left - private static final int kBackLeftDriveMotorId = 8; - private static final int kBackLeftSteerMotorId = 9; - private static final int kBackLeftEncoderId = 7; - private static final Angle kBackLeftEncoderOffset = Rotations.of(-0.30224609375); - private static final boolean kBackLeftSteerMotorInverted = false; - private static final boolean kBackLeftEncoderInverted = false; - - private static final Distance kBackLeftXPos = Inches.of(-9); - private static final Distance kBackLeftYPos = Inches.of(9); - - // Back Right - private static final int kBackRightDriveMotorId = 5; - private static final int kBackRightSteerMotorId = 6; - private static final int kBackRightEncoderId = 4; - private static final Angle kBackRightEncoderOffset = Rotations.of(-0.031005859375); - private static final boolean kBackRightSteerMotorInverted = false; - private static final boolean kBackRightEncoderInverted = false; - - private static final Distance kBackRightXPos = Inches.of(-9); - private static final Distance kBackRightYPos = Inches.of(-9); - - - public static final SwerveModuleConstants FrontLeft = - ConstantCreator.createModuleConstants( - kFrontLeftSteerMotorId, kFrontLeftDriveMotorId, kFrontLeftEncoderId, kFrontLeftEncoderOffset, - kFrontLeftXPos, kFrontLeftYPos, kInvertLeftSide, kFrontLeftSteerMotorInverted, kFrontLeftEncoderInverted - ); - public static final SwerveModuleConstants FrontRight = - ConstantCreator.createModuleConstants( - kFrontRightSteerMotorId, kFrontRightDriveMotorId, kFrontRightEncoderId, kFrontRightEncoderOffset, - kFrontRightXPos, kFrontRightYPos, kInvertRightSide, kFrontRightSteerMotorInverted, kFrontRightEncoderInverted - ); - public static final SwerveModuleConstants BackLeft = - ConstantCreator.createModuleConstants( - kBackLeftSteerMotorId, kBackLeftDriveMotorId, kBackLeftEncoderId, kBackLeftEncoderOffset, - kBackLeftXPos, kBackLeftYPos, kInvertLeftSide, kBackLeftSteerMotorInverted, kBackLeftEncoderInverted - ); - public static final SwerveModuleConstants BackRight = - ConstantCreator.createModuleConstants( - kBackRightSteerMotorId, kBackRightDriveMotorId, kBackRightEncoderId, kBackRightEncoderOffset, - kBackRightXPos, kBackRightYPos, kInvertRightSide, kBackRightSteerMotorInverted, kBackRightEncoderInverted - ); - - /** - * Creates a CommandSwerveDrivetrain instance. - * This should only be called once in your robot program,. - */ - public static CommandSwerveDrivetrain createDrivetrain() { - return new CommandSwerveDrivetrain( - DrivetrainConstants, FrontLeft, FrontRight, BackLeft, BackRight - ); - } - - - /** - * Swerve Drive class utilizing CTR Electronics' Phoenix 6 API with the selected device types. - */ - public static class TunerSwerveDrivetrain extends SwerveDrivetrain { - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param modules Constants for each specific module - */ - public TunerSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - SwerveModuleConstants... modules - ) { - super( - TalonFX::new, TalonFX::new, CANcoder::new, - drivetrainConstants, modules - ); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param modules Constants for each specific module - */ - public TunerSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - SwerveModuleConstants... modules - ) { - super( - TalonFX::new, TalonFX::new, CANcoder::new, - drivetrainConstants, odometryUpdateFrequency, modules - ); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param odometryStandardDeviation The standard deviation for odometry calculation - * in the form [x, y, theta]ᵀ, with units in meters - * and radians - * @param visionStandardDeviation The standard deviation for vision calculation - * in the form [x, y, theta]ᵀ, with units in meters - * and radians - * @param modules Constants for each specific module - */ - public TunerSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - Matrix odometryStandardDeviation, - Matrix visionStandardDeviation, - SwerveModuleConstants... modules - ) { - super( - TalonFX::new, TalonFX::new, CANcoder::new, - drivetrainConstants, odometryUpdateFrequency, - odometryStandardDeviation, visionStandardDeviation, modules - ); - } - } -} diff --git a/robot/subsystems/CommandSwerveDrivetrain.java b/robot/subsystems/CommandSwerveDrivetrain.java deleted file mode 100644 index a78ffc3..0000000 --- a/robot/subsystems/CommandSwerveDrivetrain.java +++ /dev/null @@ -1,292 +0,0 @@ -package frc.robot.subsystems; - -import static edu.wpi.first.units.Units.*; - -import java.util.function.Supplier; - -import com.ctre.phoenix6.SignalLogger; -import com.ctre.phoenix6.Utils; -import com.ctre.phoenix6.swerve.SwerveDrivetrainConstants; -import com.ctre.phoenix6.swerve.SwerveModuleConstants; -import com.ctre.phoenix6.swerve.SwerveRequest; -import com.pathplanner.lib.auto.AutoBuilder; -import com.pathplanner.lib.config.PIDConstants; -import com.pathplanner.lib.config.RobotConfig; -import com.pathplanner.lib.controllers.PPHolonomicDriveController; - -import edu.wpi.first.math.Matrix; -import edu.wpi.first.math.geometry.Rotation2d; -import edu.wpi.first.math.numbers.N1; -import edu.wpi.first.math.numbers.N3; -import edu.wpi.first.wpilibj.DriverStation; -import edu.wpi.first.wpilibj.DriverStation.Alliance; -import edu.wpi.first.wpilibj.Notifier; -import edu.wpi.first.wpilibj.RobotController; -import edu.wpi.first.wpilibj2.command.Command; -import edu.wpi.first.wpilibj2.command.Subsystem; -import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine; - -import frc.robot.generated.TunerConstants.TunerSwerveDrivetrain; - -/** - * Class that extends the Phoenix 6 SwerveDrivetrain class and implements - * Subsystem so it can easily be used in command-based projects. - */ -public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Subsystem { - private static final double kSimLoopPeriod = 0.005; // 5 ms - private Notifier m_simNotifier = null; - private double m_lastSimTime; - - /* Blue alliance sees forward as 0 degrees (toward red alliance wall) */ - private static final Rotation2d kBlueAlliancePerspectiveRotation = Rotation2d.kZero; - /* Red alliance sees forward as 180 degrees (toward blue alliance wall) */ - private static final Rotation2d kRedAlliancePerspectiveRotation = Rotation2d.k180deg; - /* Keep track if we've ever applied the operator perspective before or not */ - private boolean m_hasAppliedOperatorPerspective = false; - - /** Swerve request to apply during robot-centric path following */ - private final SwerveRequest.ApplyRobotSpeeds m_pathApplyRobotSpeeds = new SwerveRequest.ApplyRobotSpeeds(); - - /* Swerve requests to apply during SysId characterization */ - private final SwerveRequest.SysIdSwerveTranslation m_translationCharacterization = new SwerveRequest.SysIdSwerveTranslation(); - private final SwerveRequest.SysIdSwerveSteerGains m_steerCharacterization = new SwerveRequest.SysIdSwerveSteerGains(); - private final SwerveRequest.SysIdSwerveRotation m_rotationCharacterization = new SwerveRequest.SysIdSwerveRotation(); - - /* SysId routine for characterizing translation. This is used to find PID gains for the drive motors. */ - private final SysIdRoutine m_sysIdRoutineTranslation = new SysIdRoutine( - new SysIdRoutine.Config( - null, // Use default ramp rate (1 V/s) - Volts.of(4), // Reduce dynamic step voltage to 4 V to prevent brownout - null, // Use default timeout (10 s) - // Log state with SignalLogger class - state -> SignalLogger.writeString("SysIdTranslation_State", state.toString()) - ), - new SysIdRoutine.Mechanism( - output -> setControl(m_translationCharacterization.withVolts(output)), - null, - this - ) - ); - - /* SysId routine for characterizing steer. This is used to find PID gains for the steer motors. */ - private final SysIdRoutine m_sysIdRoutineSteer = new SysIdRoutine( - new SysIdRoutine.Config( - null, // Use default ramp rate (1 V/s) - Volts.of(7), // Use dynamic voltage of 7 V - null, // Use default timeout (10 s) - // Log state with SignalLogger class - state -> SignalLogger.writeString("SysIdSteer_State", state.toString()) - ), - new SysIdRoutine.Mechanism( - volts -> setControl(m_steerCharacterization.withVolts(volts)), - null, - this - ) - ); - - /* - * SysId routine for characterizing rotation. - * This is used to find PID gains for the FieldCentricFacingAngle HeadingController. - * See the documentation of SwerveRequest.SysIdSwerveRotation for info on importing the log to SysId. - */ - private final SysIdRoutine m_sysIdRoutineRotation = new SysIdRoutine( - new SysIdRoutine.Config( - /* This is in radians per second², but SysId only supports "volts per second" */ - Volts.of(Math.PI / 6).per(Second), - /* This is in radians per second, but SysId only supports "volts" */ - Volts.of(Math.PI), - null, // Use default timeout (10 s) - // Log state with SignalLogger class - state -> SignalLogger.writeString("SysIdRotation_State", state.toString()) - ), - new SysIdRoutine.Mechanism( - output -> { - /* output is actually radians per second, but SysId only supports "volts" */ - setControl(m_rotationCharacterization.withRotationalRate(output.in(Volts))); - /* also log the requested output for SysId */ - SignalLogger.writeDouble("Rotational_Rate", output.in(Volts)); - }, - null, - this - ) - ); - - /* The SysId routine to test */ - private SysIdRoutine m_sysIdRoutineToApply = m_sysIdRoutineTranslation; - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param modules Constants for each specific module - */ - public CommandSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - SwerveModuleConstants... modules - ) { - super(drivetrainConstants, modules); - if (Utils.isSimulation()) { - startSimThread(); - } - configureAutoBuilder(); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param modules Constants for each specific module - */ - public CommandSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - SwerveModuleConstants... modules - ) { - super(drivetrainConstants, odometryUpdateFrequency, modules); - if (Utils.isSimulation()) { - startSimThread(); - } - configureAutoBuilder(); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param odometryStandardDeviation The standard deviation for odometry calculation - * in the form [x, y, theta]ᵀ, with units in meters - * and radians - * @param visionStandardDeviation The standard deviation for vision calculation - * in the form [x, y, theta]ᵀ, with units in meters - * and radians - * @param modules Constants for each specific module - */ - public CommandSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - Matrix odometryStandardDeviation, - Matrix visionStandardDeviation, - SwerveModuleConstants... modules - ) { - super(drivetrainConstants, odometryUpdateFrequency, odometryStandardDeviation, visionStandardDeviation, modules); - if (Utils.isSimulation()) { - startSimThread(); - } - configureAutoBuilder(); - } - - private void configureAutoBuilder() { - try { - var config = RobotConfig.fromGUISettings(); - AutoBuilder.configure( - () -> getState().Pose, // Supplier of current robot pose - this::resetPose, // Consumer for seeding pose against auto - () -> getState().Speeds, // Supplier of current robot speeds - // Consumer of ChassisSpeeds and feedforwards to drive the robot - (speeds, feedforwards) -> setControl( - m_pathApplyRobotSpeeds.withSpeeds(speeds) - .withWheelForceFeedforwardsX(feedforwards.robotRelativeForcesXNewtons()) - .withWheelForceFeedforwardsY(feedforwards.robotRelativeForcesYNewtons()) - ), - new PPHolonomicDriveController( - // PID constants for translation - new PIDConstants(10, 0, 0), - // PID constants for rotation - new PIDConstants(7, 0, 0) - ), - config, - // Assume the path needs to be flipped for Red vs Blue, this is normally the case - () -> DriverStation.getAlliance().orElse(Alliance.Blue) == Alliance.Red, - this // Subsystem for requirements - ); - } catch (Exception ex) { - DriverStation.reportError("Failed to load PathPlanner config and configure AutoBuilder", ex.getStackTrace()); - } - } - - /** - * Returns a command that applies the specified control request to this swerve drivetrain. - * - * @param request Function returning the request to apply - * @return Command to run - */ - public Command applyRequest(Supplier requestSupplier) { - return run(() -> this.setControl(requestSupplier.get())); - } - - /** - * Runs the SysId Quasistatic test in the given direction for the routine - * specified by {@link #m_sysIdRoutineToApply}. - * - * @param direction Direction of the SysId Quasistatic test - * @return Command to run - */ - public Command sysIdQuasistatic(SysIdRoutine.Direction direction) { - return m_sysIdRoutineToApply.quasistatic(direction); - } - - /** - * Runs the SysId Dynamic test in the given direction for the routine - * specified by {@link #m_sysIdRoutineToApply}. - * - * @param direction Direction of the SysId Dynamic test - * @return Command to run - */ - public Command sysIdDynamic(SysIdRoutine.Direction direction) { - return m_sysIdRoutineToApply.dynamic(direction); - } - - @Override - public void periodic() { - /* - * Periodically try to apply the operator perspective. - * If we haven't applied the operator perspective before, then we should apply it regardless of DS state. - * This allows us to correct the perspective in case the robot code restarts mid-match. - * Otherwise, only check and apply the operator perspective if the DS is disabled. - * This ensures driving behavior doesn't change until an explicit disable event occurs during testing. - */ - if (!m_hasAppliedOperatorPerspective || DriverStation.isDisabled()) { - DriverStation.getAlliance().ifPresent(allianceColor -> { - setOperatorPerspectiveForward( - allianceColor == Alliance.Red - ? kRedAlliancePerspectiveRotation - : kBlueAlliancePerspectiveRotation - ); - m_hasAppliedOperatorPerspective = true; - }); - } - } - - private void startSimThread() { - m_lastSimTime = Utils.getCurrentTimeSeconds(); - - /* Run simulation at a faster rate so PID gains behave more reasonably */ - m_simNotifier = new Notifier(() -> { - final double currentTime = Utils.getCurrentTimeSeconds(); - double deltaTime = currentTime - m_lastSimTime; - m_lastSimTime = currentTime; - - /* use the measured time delta, get battery voltage from WPILib */ - updateSimState(deltaTime, RobotController.getBatteryVoltage()); - }); - m_simNotifier.startPeriodic(kSimLoopPeriod); - } -} diff --git a/robot/subsystems/Constants.java b/robot/subsystems/Constants.java deleted file mode 100644 index 247eeaa..0000000 --- a/robot/subsystems/Constants.java +++ /dev/null @@ -1,20 +0,0 @@ -package frc.robot.subsystems; - -public class Constants { - public static class ControllerConstants { - - public static final int DRIVER_CONTROLLER_PORT = 0; - public static final int OPERATOR_CONTROLLER_PORT = 1; - - // Joystick Deadband - public static final double LEFT_X_DEADBAND = 0.1; - public static final double LEFT_Y_DEADBAND = 0.1; - public static final double RIGHT_X_DEADBAND = 0.1; - } - - public static class LoggingConstants { - - public static final boolean DEFAULT_LOGGING_STATE = false; - } - -} diff --git a/deploy/example.txt b/src/main/deploy/example.txt similarity index 100% rename from deploy/example.txt rename to src/main/deploy/example.txt diff --git a/New Auto.auto b/src/main/deploy/pathplanner/autos/New Auto.auto similarity index 100% rename from New Auto.auto rename to src/main/deploy/pathplanner/autos/New Auto.auto diff --git a/deploy/pathplanner/navgrid.json b/src/main/deploy/pathplanner/navgrid.json similarity index 100% rename from deploy/pathplanner/navgrid.json rename to src/main/deploy/pathplanner/navgrid.json diff --git a/deploy/pathplanner/paths/Example Path.path b/src/main/deploy/pathplanner/paths/Example Path.path similarity index 100% rename from deploy/pathplanner/paths/Example Path.path rename to src/main/deploy/pathplanner/paths/Example Path.path diff --git a/Main.java b/src/main/java/frc/robot/Main.java similarity index 100% rename from Main.java rename to src/main/java/frc/robot/Main.java diff --git a/Robot.java b/src/main/java/frc/robot/Robot.java similarity index 100% rename from Robot.java rename to src/main/java/frc/robot/Robot.java diff --git a/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java similarity index 99% rename from RobotContainer.java rename to src/main/java/frc/robot/RobotContainer.java index 0cd4e30..45ae6bc 100644 --- a/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -43,7 +43,7 @@ public class RobotContainer { public RobotContainer() { configureBindings(); - + autoChooser = AutoBuilder.buildAutoChooser("New Auto"); SmartDashboard.putData("Auto Chooser", autoChooser); diff --git a/Telemetry.java b/src/main/java/frc/robot/Telemetry.java similarity index 100% rename from Telemetry.java rename to src/main/java/frc/robot/Telemetry.java diff --git a/TunerConstants.java b/src/main/java/frc/robot/generated/TunerConstants.java similarity index 100% rename from TunerConstants.java rename to src/main/java/frc/robot/generated/TunerConstants.java diff --git a/CommandSwerveDrivetrain.java b/src/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java similarity index 100% rename from CommandSwerveDrivetrain.java rename to src/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java diff --git a/Constants.java b/src/main/java/frc/robot/subsystems/Constants.java similarity index 100% rename from Constants.java rename to src/main/java/frc/robot/subsystems/Constants.java diff --git a/subsystems/CommandSwerveDrivetrain.java b/subsystems/CommandSwerveDrivetrain.java deleted file mode 100644 index a78ffc3..0000000 --- a/subsystems/CommandSwerveDrivetrain.java +++ /dev/null @@ -1,292 +0,0 @@ -package frc.robot.subsystems; - -import static edu.wpi.first.units.Units.*; - -import java.util.function.Supplier; - -import com.ctre.phoenix6.SignalLogger; -import com.ctre.phoenix6.Utils; -import com.ctre.phoenix6.swerve.SwerveDrivetrainConstants; -import com.ctre.phoenix6.swerve.SwerveModuleConstants; -import com.ctre.phoenix6.swerve.SwerveRequest; -import com.pathplanner.lib.auto.AutoBuilder; -import com.pathplanner.lib.config.PIDConstants; -import com.pathplanner.lib.config.RobotConfig; -import com.pathplanner.lib.controllers.PPHolonomicDriveController; - -import edu.wpi.first.math.Matrix; -import edu.wpi.first.math.geometry.Rotation2d; -import edu.wpi.first.math.numbers.N1; -import edu.wpi.first.math.numbers.N3; -import edu.wpi.first.wpilibj.DriverStation; -import edu.wpi.first.wpilibj.DriverStation.Alliance; -import edu.wpi.first.wpilibj.Notifier; -import edu.wpi.first.wpilibj.RobotController; -import edu.wpi.first.wpilibj2.command.Command; -import edu.wpi.first.wpilibj2.command.Subsystem; -import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine; - -import frc.robot.generated.TunerConstants.TunerSwerveDrivetrain; - -/** - * Class that extends the Phoenix 6 SwerveDrivetrain class and implements - * Subsystem so it can easily be used in command-based projects. - */ -public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Subsystem { - private static final double kSimLoopPeriod = 0.005; // 5 ms - private Notifier m_simNotifier = null; - private double m_lastSimTime; - - /* Blue alliance sees forward as 0 degrees (toward red alliance wall) */ - private static final Rotation2d kBlueAlliancePerspectiveRotation = Rotation2d.kZero; - /* Red alliance sees forward as 180 degrees (toward blue alliance wall) */ - private static final Rotation2d kRedAlliancePerspectiveRotation = Rotation2d.k180deg; - /* Keep track if we've ever applied the operator perspective before or not */ - private boolean m_hasAppliedOperatorPerspective = false; - - /** Swerve request to apply during robot-centric path following */ - private final SwerveRequest.ApplyRobotSpeeds m_pathApplyRobotSpeeds = new SwerveRequest.ApplyRobotSpeeds(); - - /* Swerve requests to apply during SysId characterization */ - private final SwerveRequest.SysIdSwerveTranslation m_translationCharacterization = new SwerveRequest.SysIdSwerveTranslation(); - private final SwerveRequest.SysIdSwerveSteerGains m_steerCharacterization = new SwerveRequest.SysIdSwerveSteerGains(); - private final SwerveRequest.SysIdSwerveRotation m_rotationCharacterization = new SwerveRequest.SysIdSwerveRotation(); - - /* SysId routine for characterizing translation. This is used to find PID gains for the drive motors. */ - private final SysIdRoutine m_sysIdRoutineTranslation = new SysIdRoutine( - new SysIdRoutine.Config( - null, // Use default ramp rate (1 V/s) - Volts.of(4), // Reduce dynamic step voltage to 4 V to prevent brownout - null, // Use default timeout (10 s) - // Log state with SignalLogger class - state -> SignalLogger.writeString("SysIdTranslation_State", state.toString()) - ), - new SysIdRoutine.Mechanism( - output -> setControl(m_translationCharacterization.withVolts(output)), - null, - this - ) - ); - - /* SysId routine for characterizing steer. This is used to find PID gains for the steer motors. */ - private final SysIdRoutine m_sysIdRoutineSteer = new SysIdRoutine( - new SysIdRoutine.Config( - null, // Use default ramp rate (1 V/s) - Volts.of(7), // Use dynamic voltage of 7 V - null, // Use default timeout (10 s) - // Log state with SignalLogger class - state -> SignalLogger.writeString("SysIdSteer_State", state.toString()) - ), - new SysIdRoutine.Mechanism( - volts -> setControl(m_steerCharacterization.withVolts(volts)), - null, - this - ) - ); - - /* - * SysId routine for characterizing rotation. - * This is used to find PID gains for the FieldCentricFacingAngle HeadingController. - * See the documentation of SwerveRequest.SysIdSwerveRotation for info on importing the log to SysId. - */ - private final SysIdRoutine m_sysIdRoutineRotation = new SysIdRoutine( - new SysIdRoutine.Config( - /* This is in radians per second², but SysId only supports "volts per second" */ - Volts.of(Math.PI / 6).per(Second), - /* This is in radians per second, but SysId only supports "volts" */ - Volts.of(Math.PI), - null, // Use default timeout (10 s) - // Log state with SignalLogger class - state -> SignalLogger.writeString("SysIdRotation_State", state.toString()) - ), - new SysIdRoutine.Mechanism( - output -> { - /* output is actually radians per second, but SysId only supports "volts" */ - setControl(m_rotationCharacterization.withRotationalRate(output.in(Volts))); - /* also log the requested output for SysId */ - SignalLogger.writeDouble("Rotational_Rate", output.in(Volts)); - }, - null, - this - ) - ); - - /* The SysId routine to test */ - private SysIdRoutine m_sysIdRoutineToApply = m_sysIdRoutineTranslation; - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param modules Constants for each specific module - */ - public CommandSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - SwerveModuleConstants... modules - ) { - super(drivetrainConstants, modules); - if (Utils.isSimulation()) { - startSimThread(); - } - configureAutoBuilder(); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param modules Constants for each specific module - */ - public CommandSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - SwerveModuleConstants... modules - ) { - super(drivetrainConstants, odometryUpdateFrequency, modules); - if (Utils.isSimulation()) { - startSimThread(); - } - configureAutoBuilder(); - } - - /** - * Constructs a CTRE SwerveDrivetrain using the specified constants. - *

- * This constructs the underlying hardware devices, so users should not construct - * the devices themselves. If they need the devices, they can access them through - * getters in the classes. - * - * @param drivetrainConstants Drivetrain-wide constants for the swerve drive - * @param odometryUpdateFrequency The frequency to run the odometry loop. If - * unspecified or set to 0 Hz, this is 250 Hz on - * CAN FD, and 100 Hz on CAN 2.0. - * @param odometryStandardDeviation The standard deviation for odometry calculation - * in the form [x, y, theta]ᵀ, with units in meters - * and radians - * @param visionStandardDeviation The standard deviation for vision calculation - * in the form [x, y, theta]ᵀ, with units in meters - * and radians - * @param modules Constants for each specific module - */ - public CommandSwerveDrivetrain( - SwerveDrivetrainConstants drivetrainConstants, - double odometryUpdateFrequency, - Matrix odometryStandardDeviation, - Matrix visionStandardDeviation, - SwerveModuleConstants... modules - ) { - super(drivetrainConstants, odometryUpdateFrequency, odometryStandardDeviation, visionStandardDeviation, modules); - if (Utils.isSimulation()) { - startSimThread(); - } - configureAutoBuilder(); - } - - private void configureAutoBuilder() { - try { - var config = RobotConfig.fromGUISettings(); - AutoBuilder.configure( - () -> getState().Pose, // Supplier of current robot pose - this::resetPose, // Consumer for seeding pose against auto - () -> getState().Speeds, // Supplier of current robot speeds - // Consumer of ChassisSpeeds and feedforwards to drive the robot - (speeds, feedforwards) -> setControl( - m_pathApplyRobotSpeeds.withSpeeds(speeds) - .withWheelForceFeedforwardsX(feedforwards.robotRelativeForcesXNewtons()) - .withWheelForceFeedforwardsY(feedforwards.robotRelativeForcesYNewtons()) - ), - new PPHolonomicDriveController( - // PID constants for translation - new PIDConstants(10, 0, 0), - // PID constants for rotation - new PIDConstants(7, 0, 0) - ), - config, - // Assume the path needs to be flipped for Red vs Blue, this is normally the case - () -> DriverStation.getAlliance().orElse(Alliance.Blue) == Alliance.Red, - this // Subsystem for requirements - ); - } catch (Exception ex) { - DriverStation.reportError("Failed to load PathPlanner config and configure AutoBuilder", ex.getStackTrace()); - } - } - - /** - * Returns a command that applies the specified control request to this swerve drivetrain. - * - * @param request Function returning the request to apply - * @return Command to run - */ - public Command applyRequest(Supplier requestSupplier) { - return run(() -> this.setControl(requestSupplier.get())); - } - - /** - * Runs the SysId Quasistatic test in the given direction for the routine - * specified by {@link #m_sysIdRoutineToApply}. - * - * @param direction Direction of the SysId Quasistatic test - * @return Command to run - */ - public Command sysIdQuasistatic(SysIdRoutine.Direction direction) { - return m_sysIdRoutineToApply.quasistatic(direction); - } - - /** - * Runs the SysId Dynamic test in the given direction for the routine - * specified by {@link #m_sysIdRoutineToApply}. - * - * @param direction Direction of the SysId Dynamic test - * @return Command to run - */ - public Command sysIdDynamic(SysIdRoutine.Direction direction) { - return m_sysIdRoutineToApply.dynamic(direction); - } - - @Override - public void periodic() { - /* - * Periodically try to apply the operator perspective. - * If we haven't applied the operator perspective before, then we should apply it regardless of DS state. - * This allows us to correct the perspective in case the robot code restarts mid-match. - * Otherwise, only check and apply the operator perspective if the DS is disabled. - * This ensures driving behavior doesn't change until an explicit disable event occurs during testing. - */ - if (!m_hasAppliedOperatorPerspective || DriverStation.isDisabled()) { - DriverStation.getAlliance().ifPresent(allianceColor -> { - setOperatorPerspectiveForward( - allianceColor == Alliance.Red - ? kRedAlliancePerspectiveRotation - : kBlueAlliancePerspectiveRotation - ); - m_hasAppliedOperatorPerspective = true; - }); - } - } - - private void startSimThread() { - m_lastSimTime = Utils.getCurrentTimeSeconds(); - - /* Run simulation at a faster rate so PID gains behave more reasonably */ - m_simNotifier = new Notifier(() -> { - final double currentTime = Utils.getCurrentTimeSeconds(); - double deltaTime = currentTime - m_lastSimTime; - m_lastSimTime = currentTime; - - /* use the measured time delta, get battery voltage from WPILib */ - updateSimState(deltaTime, RobotController.getBatteryVoltage()); - }); - m_simNotifier.startPeriodic(kSimLoopPeriod); - } -} diff --git a/subsystems/Constants.java b/subsystems/Constants.java deleted file mode 100644 index 247eeaa..0000000 --- a/subsystems/Constants.java +++ /dev/null @@ -1,20 +0,0 @@ -package frc.robot.subsystems; - -public class Constants { - public static class ControllerConstants { - - public static final int DRIVER_CONTROLLER_PORT = 0; - public static final int OPERATOR_CONTROLLER_PORT = 1; - - // Joystick Deadband - public static final double LEFT_X_DEADBAND = 0.1; - public static final double LEFT_Y_DEADBAND = 0.1; - public static final double RIGHT_X_DEADBAND = 0.1; - } - - public static class LoggingConstants { - - public static final boolean DEFAULT_LOGGING_STATE = false; - } - -} diff --git a/vcs-1/gc.properties b/vcs-1/gc.properties deleted file mode 100644 index e69de29..0000000 From 94f89645440ed76b5644f7f2a436dedab22ccad6 Mon Sep 17 00:00:00 2001 From: Ayden-157 Date: Sat, 11 Jan 2025 15:03:12 -0500 Subject: [PATCH 03/13] Tested drive some more, set up pathplanner, tested some paths, documentated april tag locations - KS, LS, RG, BH --- _reference_docs/FRC2025AprilTagPositions.csv | 23 ++++++++ build.gradle | 2 +- .../autos/{New Auto.auto => Backward.auto} | 2 +- src/main/deploy/pathplanner/autos/Box.auto | 37 +++++++++++++ src/main/deploy/pathplanner/autos/Left.auto | 19 +++++++ src/main/deploy/pathplanner/autos/Right.auto | 19 +++++++ .../deploy/pathplanner/autos/Straight.auto | 19 +++++++ .../deploy/pathplanner/paths/Backward.path | 54 +++++++++++++++++++ .../paths/{Example Path.path => Forward.path} | 0 src/main/deploy/pathplanner/paths/Left.path | 54 +++++++++++++++++++ src/main/deploy/pathplanner/paths/Right.path | 54 +++++++++++++++++++ src/main/deploy/pathplanner/settings.json | 34 ++++++++++++ src/main/java/frc/robot/RobotContainer.java | 10 ++-- .../frc/robot/generated/TunerConstants.java | 6 +-- ...SwerveDrivetrain.java => DriveSystem.java} | 10 ++-- 15 files changed, 329 insertions(+), 14 deletions(-) create mode 100644 _reference_docs/FRC2025AprilTagPositions.csv rename src/main/deploy/pathplanner/autos/{New Auto.auto => Backward.auto} (86%) create mode 100644 src/main/deploy/pathplanner/autos/Box.auto create mode 100644 src/main/deploy/pathplanner/autos/Left.auto create mode 100644 src/main/deploy/pathplanner/autos/Right.auto create mode 100644 src/main/deploy/pathplanner/autos/Straight.auto create mode 100644 src/main/deploy/pathplanner/paths/Backward.path rename src/main/deploy/pathplanner/paths/{Example Path.path => Forward.path} (100%) create mode 100644 src/main/deploy/pathplanner/paths/Left.path create mode 100644 src/main/deploy/pathplanner/paths/Right.path create mode 100644 src/main/deploy/pathplanner/settings.json rename src/main/java/frc/robot/subsystems/{CommandSwerveDrivetrain.java => DriveSystem.java} (98%) diff --git a/_reference_docs/FRC2025AprilTagPositions.csv b/_reference_docs/FRC2025AprilTagPositions.csv new file mode 100644 index 0000000..b4e4302 --- /dev/null +++ b/_reference_docs/FRC2025AprilTagPositions.csv @@ -0,0 +1,23 @@ +Element,Side,ID,X,Y,Z,Z-Rotation,X-Rotation +Left Coral Station,Red,1,657.37,25.8,55.25,126,0 +Right Coral Station,Red,2,657.37,291.2,55.25,234,0 +Processor,Red,3,455.15,317.15,47.88,270,0 +Blue Barge,Red,4,365.2,241.64,70.73,0,30 +Red Barge,Red,5,365.2,75.39,70.73,0,30 +Close Left Reef,Red,6,530.49,130.17,8.75,300,0 +Close Center Reef,Red,7,546.87,158.5,8.75,0,0 +Close Right Reef,Red,8,530.49,186.83,8.75,60,0 +Far Right Reef,Red,9,497.77,186.83,8.75,120,0 +Far Center Reef,Red,10,481.39,158.5,8.75,180,0 +Far Left Reef,Red,11,497.77,130.17,8.75,240,0 +Right Coral Station,Blue,12,33.51,25.8,55.25,54,0 +Left Coral Station,Blue,13,33.51,291.2,55.25,306,0 +Blue Barge,Blue,14,325.68,241.64,70.73,180,30 +Red Barge,Blue,15,325.68,75.39,70.73,180,30 +Processor,Blue,16,235.73,-0.15,47.88,90,0 +Close Right Reef,Blue,17,160.39,130.17,8.75,240,0 +Close Center Reef,Blue,18,144,158.5,8.75,180,0 +Close Left Reef,Blue,19,160.39,186.83,8.75,120,0 +Far Left Reef,Blue,20,193.1,186.83,8.75,60,0 +Far Center Reef,Blue,21,209.49,158.5,8.75,0,0 +Far Right Reef,Blue,22,193.1,130.17,8.75,300,0 \ No newline at end of file diff --git a/build.gradle b/build.gradle index 9d8ae14..8e63796 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,7 @@ deploy { frcStaticFileDeploy(getArtifactTypeClass('FileTreeArtifact')) { files = project.fileTree('src/main/deploy') directory = '/home/lvuser/deploy' - deleteOldFiles = false // Change to true to delete files on roboRIO that no + deleteOldFiles = true // Change to true to delete files on roboRIO that no // longer exist in deploy directory of this project } } diff --git a/src/main/deploy/pathplanner/autos/New Auto.auto b/src/main/deploy/pathplanner/autos/Backward.auto similarity index 86% rename from src/main/deploy/pathplanner/autos/New Auto.auto rename to src/main/deploy/pathplanner/autos/Backward.auto index 70b7ab2..6f21695 100644 --- a/src/main/deploy/pathplanner/autos/New Auto.auto +++ b/src/main/deploy/pathplanner/autos/Backward.auto @@ -7,7 +7,7 @@ { "type": "path", "data": { - "pathName": "Example Path" + "pathName": "Backward" } } ] diff --git a/src/main/deploy/pathplanner/autos/Box.auto b/src/main/deploy/pathplanner/autos/Box.auto new file mode 100644 index 0000000..4f78a1b --- /dev/null +++ b/src/main/deploy/pathplanner/autos/Box.auto @@ -0,0 +1,37 @@ +{ + "version": "2025.0", + "command": { + "type": "sequential", + "data": { + "commands": [ + { + "type": "path", + "data": { + "pathName": "Forward" + } + }, + { + "type": "path", + "data": { + "pathName": "Left" + } + }, + { + "type": "path", + "data": { + "pathName": "Backward" + } + }, + { + "type": "path", + "data": { + "pathName": "Right" + } + } + ] + } + }, + "resetOdom": true, + "folder": null, + "choreoAuto": false +} \ No newline at end of file diff --git a/src/main/deploy/pathplanner/autos/Left.auto b/src/main/deploy/pathplanner/autos/Left.auto new file mode 100644 index 0000000..33f3c3c --- /dev/null +++ b/src/main/deploy/pathplanner/autos/Left.auto @@ -0,0 +1,19 @@ +{ + "version": "2025.0", + "command": { + "type": "sequential", + "data": { + "commands": [ + { + "type": "path", + "data": { + "pathName": "Left" + } + } + ] + } + }, + "resetOdom": true, + "folder": null, + "choreoAuto": false +} \ No newline at end of file diff --git a/src/main/deploy/pathplanner/autos/Right.auto b/src/main/deploy/pathplanner/autos/Right.auto new file mode 100644 index 0000000..717dba6 --- /dev/null +++ b/src/main/deploy/pathplanner/autos/Right.auto @@ -0,0 +1,19 @@ +{ + "version": "2025.0", + "command": { + "type": "sequential", + "data": { + "commands": [ + { + "type": "path", + "data": { + "pathName": "Right" + } + } + ] + } + }, + "resetOdom": true, + "folder": null, + "choreoAuto": false +} \ No newline at end of file diff --git a/src/main/deploy/pathplanner/autos/Straight.auto b/src/main/deploy/pathplanner/autos/Straight.auto new file mode 100644 index 0000000..3a27fcd --- /dev/null +++ b/src/main/deploy/pathplanner/autos/Straight.auto @@ -0,0 +1,19 @@ +{ + "version": "2025.0", + "command": { + "type": "sequential", + "data": { + "commands": [ + { + "type": "path", + "data": { + "pathName": "Forward" + } + } + ] + } + }, + "resetOdom": true, + "folder": null, + "choreoAuto": false +} \ No newline at end of file diff --git a/src/main/deploy/pathplanner/paths/Backward.path b/src/main/deploy/pathplanner/paths/Backward.path new file mode 100644 index 0000000..cc5d65b --- /dev/null +++ b/src/main/deploy/pathplanner/paths/Backward.path @@ -0,0 +1,54 @@ +{ + "version": "2025.0", + "waypoints": [ + { + "anchor": { + "x": 5.0, + "y": 7.0 + }, + "prevControl": null, + "nextControl": { + "x": 4.0, + "y": 7.0 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 4.0, + "y": 7.0 + }, + "prevControl": { + "x": 5.0, + "y": 7.0 + }, + "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/paths/Example Path.path b/src/main/deploy/pathplanner/paths/Forward.path similarity index 100% rename from src/main/deploy/pathplanner/paths/Example Path.path rename to src/main/deploy/pathplanner/paths/Forward.path diff --git a/src/main/deploy/pathplanner/paths/Left.path b/src/main/deploy/pathplanner/paths/Left.path new file mode 100644 index 0000000..57f588d --- /dev/null +++ b/src/main/deploy/pathplanner/paths/Left.path @@ -0,0 +1,54 @@ +{ + "version": "2025.0", + "waypoints": [ + { + "anchor": { + "x": 5.0, + "y": 6.0 + }, + "prevControl": null, + "nextControl": { + "x": 5.0, + "y": 6.343420974730547 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 5.0, + "y": 7.0 + }, + "prevControl": { + "x": 5.0, + "y": 6.0 + }, + "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/paths/Right.path b/src/main/deploy/pathplanner/paths/Right.path new file mode 100644 index 0000000..cc0c7e6 --- /dev/null +++ b/src/main/deploy/pathplanner/paths/Right.path @@ -0,0 +1,54 @@ +{ + "version": "2025.0", + "waypoints": [ + { + "anchor": { + "x": 4.0, + "y": 7.0 + }, + "prevControl": null, + "nextControl": { + "x": 4.0, + "y": 6.0 + }, + "isLocked": false, + "linkedName": null + }, + { + "anchor": { + "x": 4.0, + "y": 6.0 + }, + "prevControl": { + "x": 4.0, + "y": 7.0 + }, + "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..9dce420 --- /dev/null +++ b/src/main/deploy/pathplanner/settings.json @@ -0,0 +1,34 @@ +{ + "robotWidth": 0.787, + "robotLength": 0.787, + "holonomicMode": true, + "pathFolders": [], + "autoFolders": [], + "defaultMaxVel": 3.0, + "defaultMaxAccel": 3.0, + "defaultMaxAngVel": 540.0, + "defaultMaxAngAccel": 720.0, + "defaultNominalVoltage": 12.0, + "robotMass": 58.1, + "robotMOI": 5.332, + "robotTrackwidth": 0.5588, + "driveWheelRadius": 0.0483, + "driveGearing": 5.14, + "maxDriveSpeed": 4.7, + "driveMotorType": "krakenX60", + "driveCurrentLimit": 120.0, + "wheelCOF": 1.7, + "flModuleX": 0.2286, + "flModuleY": 0.229, + "frModuleX": 0.229, + "frModuleY": -0.229, + "blModuleX": -0.229, + "blModuleY": 0.229, + "brModuleX": -0.229, + "brModuleY": -0.229, + "bumperOffsetX": 0.0, + "bumperOffsetY": 0.0, + "robotFeatures": [ + "{\"name\":\"Circle\",\"type\":\"circle\",\"data\":{\"center\":{\"x\":0.0,\"y\":0.0},\"radius\":0.1,\"strokeWidth\":0.02,\"filled\":false}}" + ] +} \ 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 45ae6bc..a46c3a0 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -19,15 +19,13 @@ import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.button.CommandXboxController; import frc.robot.generated.TunerConstants; -import frc.robot.subsystems.CommandSwerveDrivetrain; +import frc.robot.subsystems.DriveSystem; import frc.robot.subsystems.Constants.ControllerConstants; public class RobotContainer { private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed private double MaxAngularRate = RotationsPerSecond.of(1).in(RadiansPerSecond); // 1 of a rotation per second max angular velocity - private final SendableChooser autoChooser; - /* Setting up bindings for necessary control of the swerve drive platform */ private final SwerveRequest.FieldCentric drive = new SwerveRequest.FieldCentric() .withDeadband(MaxSpeed * 0.1).withRotationalDeadband(MaxAngularRate * 0.1) // Add a 10% deadband @@ -39,11 +37,13 @@ public class RobotContainer { private final CommandXboxController joystick = new CommandXboxController(0); - public final CommandSwerveDrivetrain drivetrain = TunerConstants.createDrivetrain(); + public final DriveSystem drivetrain = TunerConstants.createDrivetrain(); + + private final SendableChooser autoChooser; public RobotContainer() { configureBindings(); - + System.out.println("Im about to make autobuilder"); autoChooser = AutoBuilder.buildAutoChooser("New Auto"); SmartDashboard.putData("Auto Chooser", autoChooser); diff --git a/src/main/java/frc/robot/generated/TunerConstants.java b/src/main/java/frc/robot/generated/TunerConstants.java index 7c55399..abee4cf 100644 --- a/src/main/java/frc/robot/generated/TunerConstants.java +++ b/src/main/java/frc/robot/generated/TunerConstants.java @@ -14,7 +14,7 @@ import edu.wpi.first.math.numbers.N3; import edu.wpi.first.units.measure.*; -import frc.robot.subsystems.CommandSwerveDrivetrain; +import frc.robot.subsystems.DriveSystem; // Generated by the Tuner X Swerve Project Generator // https://v6.docs.ctr-electronics.com/en/stable/docs/tuner/tuner-swerve/index.html @@ -195,8 +195,8 @@ public class TunerConstants { * Creates a CommandSwerveDrivetrain instance. * This should only be called once in your robot program,. */ - public static CommandSwerveDrivetrain createDrivetrain() { - return new CommandSwerveDrivetrain( + public static DriveSystem createDrivetrain() { + return new DriveSystem( DrivetrainConstants, FrontLeft, FrontRight, BackLeft, BackRight ); } diff --git a/src/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java b/src/main/java/frc/robot/subsystems/DriveSystem.java similarity index 98% rename from src/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java rename to src/main/java/frc/robot/subsystems/DriveSystem.java index a78ffc3..05f937a 100644 --- a/src/main/java/frc/robot/subsystems/CommandSwerveDrivetrain.java +++ b/src/main/java/frc/robot/subsystems/DriveSystem.java @@ -32,7 +32,7 @@ * Class that extends the Phoenix 6 SwerveDrivetrain class and implements * Subsystem so it can easily be used in command-based projects. */ -public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Subsystem { +public class DriveSystem extends TunerSwerveDrivetrain implements Subsystem { private static final double kSimLoopPeriod = 0.005; // 5 ms private Notifier m_simNotifier = null; private double m_lastSimTime; @@ -124,7 +124,7 @@ public class CommandSwerveDrivetrain extends TunerSwerveDrivetrain implements Su * @param drivetrainConstants Drivetrain-wide constants for the swerve drive * @param modules Constants for each specific module */ - public CommandSwerveDrivetrain( + public DriveSystem( SwerveDrivetrainConstants drivetrainConstants, SwerveModuleConstants... modules ) { @@ -148,7 +148,7 @@ public CommandSwerveDrivetrain( * CAN FD, and 100 Hz on CAN 2.0. * @param modules Constants for each specific module */ - public CommandSwerveDrivetrain( + public DriveSystem( SwerveDrivetrainConstants drivetrainConstants, double odometryUpdateFrequency, SwerveModuleConstants... modules @@ -179,7 +179,7 @@ public CommandSwerveDrivetrain( * and radians * @param modules Constants for each specific module */ - public CommandSwerveDrivetrain( + public DriveSystem( SwerveDrivetrainConstants drivetrainConstants, double odometryUpdateFrequency, Matrix odometryStandardDeviation, @@ -194,6 +194,7 @@ public CommandSwerveDrivetrain( } private void configureAutoBuilder() { + System.out.println("Im about to configure the autobuilder"); try { var config = RobotConfig.fromGUISettings(); AutoBuilder.configure( @@ -218,6 +219,7 @@ private void configureAutoBuilder() { this // Subsystem for requirements ); } catch (Exception ex) { + System.out.println(ex); DriverStation.reportError("Failed to load PathPlanner config and configure AutoBuilder", ex.getStackTrace()); } } From 44e480315533808334ecd3b6d7aeeb11bb0edbd1 Mon Sep 17 00:00:00 2001 From: Luca Forever and Ever Date: Tue, 14 Jan 2025 20:45:07 -0500 Subject: [PATCH 04/13] Installed RevLib, started work on elevator subsystem, started work on a command to move the elevator to a set position - LS, JM, JR, LQ --- src/main/java/frc/robot/Constants.java | 39 ++++++++++ src/main/java/frc/robot/RobotContainer.java | 2 +- .../java/frc/robot/commands/GoToStage1.java | 43 +++++++++++ .../java/frc/robot/subsystems/Constants.java | 20 ------ .../frc/robot/subsystems/ElevatorSystem.java | 61 ++++++++++++++++ vendordeps/REVLib-2025.0.1.json | 71 +++++++++++++++++++ 6 files changed, 215 insertions(+), 21 deletions(-) create mode 100644 src/main/java/frc/robot/Constants.java create mode 100644 src/main/java/frc/robot/commands/GoToStage1.java delete mode 100644 src/main/java/frc/robot/subsystems/Constants.java create mode 100644 src/main/java/frc/robot/subsystems/ElevatorSystem.java create mode 100644 vendordeps/REVLib-2025.0.1.json diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java new file mode 100644 index 0000000..2d10719 --- /dev/null +++ b/src/main/java/frc/robot/Constants.java @@ -0,0 +1,39 @@ +package frc.robot; + +import edu.wpi.first.math.controller.PIDController; + +public class Constants { + public static class ControllerConstants { + + public static final int DRIVER_CONTROLLER_PORT = 0; + public static final int OPERATOR_CONTROLLER_PORT = 1; + + // Joystick Deadband + public static final double LEFT_X_DEADBAND = 0.1; + public static final double LEFT_Y_DEADBAND = 0.1; + public static final double RIGHT_X_DEADBAND = 0.1; + } + + public static class LoggingConstants { + + public static final boolean DEFAULT_LOGGING_STATE = false; + } + + public static class ElevatorConstants { + + public static final int ELEVATOR_MOTOR_ID = 21; + public static final int ELEVATOR_POT_ID = 22; + public static final int ELEVATOR_STAGE_1_LIMIT_ID = 23; + public static final int ELEVATOR_STAGE_2_LIMIT_ID = 24; + public static final int ELEVATOR_STAGE_3_LIMIT_ID = 25; + public static final int ELEVATOR_STAGE_4_LIMIT_ID = 26; + + public static final PIDController ELEVATOR_PID = new PIDController(0, 0, 0); + + public static final int STAGE_1_POS = 4; + public static final int STAGE_2_POS = 8; + public static final int STAGE_3_POS = 12; + public static final int STAGE_4_POS = 157; + } + +} diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index a46c3a0..88fcd4b 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -18,9 +18,9 @@ import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.button.CommandXboxController; +import frc.robot.Constants.ControllerConstants; import frc.robot.generated.TunerConstants; import frc.robot.subsystems.DriveSystem; -import frc.robot.subsystems.Constants.ControllerConstants; public class RobotContainer { private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed diff --git a/src/main/java/frc/robot/commands/GoToStage1.java b/src/main/java/frc/robot/commands/GoToStage1.java new file mode 100644 index 0000000..d22761d --- /dev/null +++ b/src/main/java/frc/robot/commands/GoToStage1.java @@ -0,0 +1,43 @@ +// 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 edu.wpi.first.wpilibj2.command.Command; +import frc.robot.Constants.ElevatorConstants; +import frc.robot.subsystems.ElevatorSystem; + +/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ +public class GoToStage1 extends Command { + private ElevatorSystem elevator; + + /** Creates a new GoToStage1. */ + public GoToStage1(final ElevatorSystem elevator) { + // Use addRequirements() here to declare subsystem dependencies. + this.elevator = elevator; + addRequirements(elevator); + } + + // Called when the command is initially scheduled. + @Override + public void initialize() { + elevator.runMotor(elevator.getNewSpeed(ElevatorConstants.STAGE_1_POS)); + } + + // Called every time the scheduler runs while the command is scheduled. + @Override + public void execute() { + elevator.runMotor(elevator.getNewSpeed(ElevatorConstants.STAGE_1_POS)); + } + + // Called once the command ends or is interrupted. + @Override + public void end(boolean interrupted) {} + + // Returns true when the command should end. + @Override + public boolean isFinished() { + return false; + } +} diff --git a/src/main/java/frc/robot/subsystems/Constants.java b/src/main/java/frc/robot/subsystems/Constants.java deleted file mode 100644 index 247eeaa..0000000 --- a/src/main/java/frc/robot/subsystems/Constants.java +++ /dev/null @@ -1,20 +0,0 @@ -package frc.robot.subsystems; - -public class Constants { - public static class ControllerConstants { - - public static final int DRIVER_CONTROLLER_PORT = 0; - public static final int OPERATOR_CONTROLLER_PORT = 1; - - // Joystick Deadband - public static final double LEFT_X_DEADBAND = 0.1; - public static final double LEFT_Y_DEADBAND = 0.1; - public static final double RIGHT_X_DEADBAND = 0.1; - } - - public static class LoggingConstants { - - public static final boolean DEFAULT_LOGGING_STATE = false; - } - -} diff --git a/src/main/java/frc/robot/subsystems/ElevatorSystem.java b/src/main/java/frc/robot/subsystems/ElevatorSystem.java new file mode 100644 index 0000000..7fa6715 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/ElevatorSystem.java @@ -0,0 +1,61 @@ +// 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.subsystems; + +import com.revrobotics.spark.SparkLowLevel.MotorType; +import com.revrobotics.spark.SparkMax; + +import edu.wpi.first.math.controller.PIDController; +import edu.wpi.first.wpilibj.AnalogInput; +import edu.wpi.first.wpilibj.DigitalInput; +import edu.wpi.first.wpilibj2.command.SubsystemBase; +import frc.robot.Constants.ElevatorConstants; + +public class ElevatorSystem extends SubsystemBase { + + private static SparkMax motor = new SparkMax(ElevatorConstants.ELEVATOR_MOTOR_ID, MotorType.kBrushless); + private static AnalogInput pot = new AnalogInput(ElevatorConstants.ELEVATOR_POT_ID); + private static DigitalInput stage1Limit = new DigitalInput(ElevatorConstants.ELEVATOR_STAGE_1_LIMIT_ID); + private static DigitalInput stage2Limit = new DigitalInput(ElevatorConstants.ELEVATOR_STAGE_2_LIMIT_ID); + private static DigitalInput stage3Limit = new DigitalInput(ElevatorConstants.ELEVATOR_STAGE_3_LIMIT_ID); + private static DigitalInput stage4Limit = new DigitalInput(ElevatorConstants.ELEVATOR_STAGE_4_LIMIT_ID); + private static PIDController PID = ElevatorConstants.ELEVATOR_PID; + + /** Creates a new ElevatorSystem. */ + public ElevatorSystem() {} + + public void runMotor(double velocity) { + motor.set(velocity); + } + + public static int getPos() { + return pot.getValue(); + } + + public static boolean atStage1() { + return stage1Limit.get(); + } + + public static boolean atStage2() { + return stage2Limit.get(); + } + + public static boolean atStage3() { + return stage3Limit.get(); + } + + public static boolean atStage4() { + return stage4Limit.get(); + } + + public double getNewSpeed(double desiredPos) { + return PID.calculate(getPos(), desiredPos); + } + + @Override + public void periodic() { + // This method will be called once per scheduler run + } +} diff --git a/vendordeps/REVLib-2025.0.1.json b/vendordeps/REVLib-2025.0.1.json new file mode 100644 index 0000000..c998054 --- /dev/null +++ b/vendordeps/REVLib-2025.0.1.json @@ -0,0 +1,71 @@ +{ + "fileName": "REVLib-2025.0.1.json", + "name": "REVLib", + "version": "2025.0.1", + "frcYear": "2025", + "uuid": "3f48eb8c-50fe-43a6-9cb7-44c86353c4cb", + "mavenUrls": [ + "https://maven.revrobotics.com/" + ], + "jsonUrl": "https://software-metadata.revrobotics.com/REVLib-2025.json", + "javaDependencies": [ + { + "groupId": "com.revrobotics.frc", + "artifactId": "REVLib-java", + "version": "2025.0.1" + } + ], + "jniDependencies": [ + { + "groupId": "com.revrobotics.frc", + "artifactId": "REVLib-driver", + "version": "2025.0.1", + "skipInvalidPlatforms": true, + "isJar": false, + "validPlatforms": [ + "windowsx86-64", + "linuxarm64", + "linuxx86-64", + "linuxathena", + "linuxarm32", + "osxuniversal" + ] + } + ], + "cppDependencies": [ + { + "groupId": "com.revrobotics.frc", + "artifactId": "REVLib-cpp", + "version": "2025.0.1", + "libName": "REVLib", + "headerClassifier": "headers", + "sharedLibrary": false, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxarm64", + "linuxx86-64", + "linuxathena", + "linuxarm32", + "osxuniversal" + ] + }, + { + "groupId": "com.revrobotics.frc", + "artifactId": "REVLib-driver", + "version": "2025.0.1", + "libName": "REVLibDriver", + "headerClassifier": "headers", + "sharedLibrary": false, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxarm64", + "linuxx86-64", + "linuxathena", + "linuxarm32", + "osxuniversal" + ] + } + ] +} \ No newline at end of file From 2d888bffeeacece5fa4ffa55e133a7c3aa3ae661 Mon Sep 17 00:00:00 2001 From: Luca Forever and Ever Date: Wed, 15 Jan 2025 20:09:19 -0500 Subject: [PATCH 05/13] added a isOscillating function (need to find values for related constants) and a getMotorVelocity function to the elevator subsystem, finished the GoToStage1 command for the elevator subsystem (need to find values for related constants) - LS, JR, LQ --- src/main/java/frc/robot/Constants.java | 11 ++++--- .../java/frc/robot/commands/GoToStage1.java | 6 ++-- .../frc/robot/subsystems/ElevatorSystem.java | 29 +++++++++++++++---- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index 2d10719..528c08b 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -30,10 +30,13 @@ public static class ElevatorConstants { public static final PIDController ELEVATOR_PID = new PIDController(0, 0, 0); - public static final int STAGE_1_POS = 4; - public static final int STAGE_2_POS = 8; - public static final int STAGE_3_POS = 12; - public static final int STAGE_4_POS = 157; + public static final double STAGE_1_POS = 4; + public static final double STAGE_2_POS = 8; + public static final double STAGE_3_POS = 12; + public static final double STAGE_4_POS = 157; + + public static final double ELEVATOR_POS_TOLERANCE = 2; + public static final double ELEVATOR_MOTOR_VELOCITY_TOLERANCE = 0.2; } } diff --git a/src/main/java/frc/robot/commands/GoToStage1.java b/src/main/java/frc/robot/commands/GoToStage1.java index d22761d..2f45edc 100644 --- a/src/main/java/frc/robot/commands/GoToStage1.java +++ b/src/main/java/frc/robot/commands/GoToStage1.java @@ -33,11 +33,13 @@ public void execute() { // Called once the command ends or is interrupted. @Override - public void end(boolean interrupted) {} + public void end(boolean interrupted) { + elevator.runMotor(0); + } // Returns true when the command should end. @Override public boolean isFinished() { - return false; + return (elevator.isOscillating(ElevatorConstants.STAGE_1_POS) | elevator.atStage1()); } } diff --git a/src/main/java/frc/robot/subsystems/ElevatorSystem.java b/src/main/java/frc/robot/subsystems/ElevatorSystem.java index 7fa6715..f25ef19 100644 --- a/src/main/java/frc/robot/subsystems/ElevatorSystem.java +++ b/src/main/java/frc/robot/subsystems/ElevatorSystem.java @@ -30,23 +30,27 @@ public void runMotor(double velocity) { motor.set(velocity); } - public static int getPos() { + private static double getMotorVelocity() { + return motor.getEncoder().getVelocity(); + } + + private static int getPos() { return pot.getValue(); } - public static boolean atStage1() { + public boolean atStage1() { return stage1Limit.get(); } - public static boolean atStage2() { + public boolean atStage2() { return stage2Limit.get(); } - public static boolean atStage3() { + public boolean atStage3() { return stage3Limit.get(); } - public static boolean atStage4() { + public boolean atStage4() { return stage4Limit.get(); } @@ -54,6 +58,21 @@ public double getNewSpeed(double desiredPos) { return PID.calculate(getPos(), desiredPos); } + public boolean isOscillating(double desiredPos) { // TODO: Consider generalizing this + boolean retval = false; + + if ((getPos() >= desiredPos - ElevatorConstants.ELEVATOR_POS_TOLERANCE) & ((getMotorVelocity() >= 0) & (getMotorVelocity() <= ElevatorConstants.ELEVATOR_MOTOR_VELOCITY_TOLERANCE))) { + // checks if the elevator's current position is below the desired position within ELEVATOR_POS_TOLERANCE and the elevator is moving up at a speed below ELEVATOR_MOTOR_VELOCITY_TOLERANCE + retval = true; + } + else if ((getPos() <= desiredPos + ElevatorConstants.ELEVATOR_POS_TOLERANCE) & ((getMotorVelocity() <= 0) & (getMotorVelocity() >= - ElevatorConstants.ELEVATOR_MOTOR_VELOCITY_TOLERANCE))) { + // checks if the elevator's current position is above the desired position within ELEVATOR_POS_TOLERANCE and the elevator is moving down at a speed below ELEVATOR_MOTOR_VELOCITY_TOLERANCE + retval = true; + } + + return retval; + } + @Override public void periodic() { // This method will be called once per scheduler run From 7bb0ee5dd9af3bc8415575dc91cdd58ce607512d Mon Sep 17 00:00:00 2001 From: Ayden-157 Date: Sat, 18 Jan 2025 10:14:04 -0500 Subject: [PATCH 06/13] added photon vision library --- vendordeps/photonlib.json | 71 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 vendordeps/photonlib.json diff --git a/vendordeps/photonlib.json b/vendordeps/photonlib.json new file mode 100644 index 0000000..6af3d3e --- /dev/null +++ b/vendordeps/photonlib.json @@ -0,0 +1,71 @@ +{ + "fileName": "photonlib.json", + "name": "photonlib", + "version": "v2025.1.1", + "uuid": "515fe07e-bfc6-11fa-b3de-0242ac130004", + "frcYear": "2025", + "mavenUrls": [ + "https://maven.photonvision.org/repository/internal", + "https://maven.photonvision.org/repository/snapshots" + ], + "jsonUrl": "https://maven.photonvision.org/repository/internal/org/photonvision/photonlib-json/1.0/photonlib-json-1.0.json", + "jniDependencies": [ + { + "groupId": "org.photonvision", + "artifactId": "photontargeting-cpp", + "version": "v2025.1.1", + "skipInvalidPlatforms": true, + "isJar": false, + "validPlatforms": [ + "windowsx86-64", + "linuxathena", + "linuxx86-64", + "osxuniversal" + ] + } + ], + "cppDependencies": [ + { + "groupId": "org.photonvision", + "artifactId": "photonlib-cpp", + "version": "v2025.1.1", + "libName": "photonlib", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxathena", + "linuxx86-64", + "osxuniversal" + ] + }, + { + "groupId": "org.photonvision", + "artifactId": "photontargeting-cpp", + "version": "v2025.1.1", + "libName": "photontargeting", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxathena", + "linuxx86-64", + "osxuniversal" + ] + } + ], + "javaDependencies": [ + { + "groupId": "org.photonvision", + "artifactId": "photonlib-java", + "version": "v2025.1.1" + }, + { + "groupId": "org.photonvision", + "artifactId": "photontargeting-java", + "version": "v2025.1.1" + } + ] +} \ No newline at end of file From dd136450e643b7c43f1bd4e580856734f83901e0 Mon Sep 17 00:00:00 2001 From: Ayden-157 Date: Sat, 18 Jan 2025 15:18:29 -0500 Subject: [PATCH 07/13] Began to remake the go to stage 1 command for further use cases. Created game element position schema. - LS, JR, JM, KS, BH, RG, TC --- src/main/deploy/position_details.json | 259 ++++++++++++++++++ src/main/java/frc/robot/PositionDetails.java | 8 + .../java/frc/robot/commands/GoToExtrema.java | 47 ++++ ...ToStage1.java => GoToIntermidiatePos.java} | 10 +- 4 files changed, 319 insertions(+), 5 deletions(-) create mode 100644 src/main/deploy/position_details.json create mode 100644 src/main/java/frc/robot/PositionDetails.java create mode 100644 src/main/java/frc/robot/commands/GoToExtrema.java rename src/main/java/frc/robot/commands/{GoToStage1.java => GoToIntermidiatePos.java} (85%) diff --git a/src/main/deploy/position_details.json b/src/main/deploy/position_details.json new file mode 100644 index 0000000..91f244e --- /dev/null +++ b/src/main/deploy/position_details.json @@ -0,0 +1,259 @@ +{ + "reef": { + "tag6": { + "face": "closeLeftFace", + "coral": { + "stage1": { + "verticalPos": 0.46, + "horizontalOffsets": { + "left": -0.301625, + "center": 0, + "right": 0.301625 + } + }, + "stage2": { + "verticalPos": 0.81, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + }, + "stage3": { + "verticalPos": 1.21, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + }, + "stage4": { + "verticalPos": 1.83, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + } + }, + "algae": { + "verticalPos": 0.965, + "horizontalOffset": 0 + } + }, + + "tag7": { + "face": "closeCenterFace", + "coral": { + "stage1": { + "verticalPos": 0.46, + "horizontalOffsets": { + "left": -0.301625, + "center": 0, + "right": 0.301625 + } + }, + "stage2": { + "verticalPos": 0.81, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + }, + "stage3": { + "verticalPos": 1.21, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + }, + "stage4": { + "verticalPos": 1.83, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + } + }, + "algae": { + "verticalPos": 1.365, + "horizontalOffset": 0 + } + }, + + "tag8": { + "face": "closeRightFace", + "coral": { + "stage1": { + "verticalPos": 0.46, + "horizontalOffsets": { + "left": -0.301625, + "center": 0, + "right": 0.301625 + } + }, + "stage2": { + "verticalPos": 0.81, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + }, + "stage3": { + "verticalPos": 1.21, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + }, + "stage4": { + "verticalPos": 1.83, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + } + }, + "algae": { + "verticalPos": 0.965, + "horizontalOffset": 0 + } + }, + + "tag9": { + "face": "farRightFace", + "coral": { + "stage1": { + "verticalPos": 0.46, + "horizontalOffsets": { + "left": -0.301625, + "center": 0, + "right": 0.301625 + } + }, + "stage2": { + "verticalPos": 0.81, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + }, + "stage3": { + "verticalPos": 1.21, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + }, + "stage4": { + "verticalPos": 1.83, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + } + }, + "algae": { + "verticalPos": 1.365, + "horizontalOffset": 0 + } + }, + + "tag10": { + "face": "farCenterFace", + "coral": { + "stage1": { + "verticalPos": 0.46, + "horizontalOffsets": { + "left": -0.301625, + "center": 0, + "right": 0.301625 + } + }, + "stage2": { + "verticalPos": 0.81, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + }, + "stage3": { + "verticalPos": 1.21, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + }, + "stage4": { + "verticalPos": 1.83, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + } + }, + "algae": { + "verticalPos": 0.965, + "horizontalOffset": 0 + } + }, + + "tag11": { + "face": "farLeftFace", + "coral": { + "stage1": { + "verticalPos": 0.46, + "horizontalOffsets": { + "left": -0.301625, + "center": 0, + "right": 0.301625 + } + }, + "stage2": { + "verticalPos": 0.81, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + }, + "stage3": { + "verticalPos": 1.21, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + }, + "stage4": { + "verticalPos": 1.83, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + } + }, + "algae": { + "verticalPos": 1.365, + "horizontalOffset": 0 + } + } + }, + + "processor": { + "verticalPos": 0.43, + "horizontalOffset": 0 + }, + + "coralStation": { + "verticalPos": 0.95, + "tag1": { + "side": "left", + "horizontalOffsets": [-0.428667, -0.3215, -0.214333, -0.1071667, 0, 0.1071667, 0.214333, 0.3215, 0.428667] + }, + "tag2": { + "side": "right", + "horizontalOffsets": [-0.428667, -0.3215, -0.214333, -0.1071667, 0, 0.1071667, 0.214333, 0.3215, 0.428667] + } + }, + + "barge": { + + } + +} \ No newline at end of file diff --git a/src/main/java/frc/robot/PositionDetails.java b/src/main/java/frc/robot/PositionDetails.java new file mode 100644 index 0000000..34f52ac --- /dev/null +++ b/src/main/java/frc/robot/PositionDetails.java @@ -0,0 +1,8 @@ +// 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; + +/** Add your docs here. */ +public class PositionDetails {} diff --git a/src/main/java/frc/robot/commands/GoToExtrema.java b/src/main/java/frc/robot/commands/GoToExtrema.java new file mode 100644 index 0000000..4e30486 --- /dev/null +++ b/src/main/java/frc/robot/commands/GoToExtrema.java @@ -0,0 +1,47 @@ +// 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 edu.wpi.first.wpilibj2.command.Command; +import frc.robot.Constants.ElevatorConstants; +import frc.robot.subsystems.ElevatorSystem; + +/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ +public class GoToExtrema extends Command { + private final ElevatorSystem elevator; + private final boolean isTop; + + /** Creates a new GoToStage1. */ + public GoToExtrema(final ElevatorSystem elevator, final boolean isTop) { + // Use addRequirements() here to declare subsystem dependencies. + this.elevator = elevator; + this.isTop = isTop; + addRequirements(elevator); + } + + // Called when the command is initially scheduled. + @Override + public void initialize() { + elevator.runMotor(elevator.getNewSpeed(isTop ? ElevatorConstants.STAGE_1_POS : ElevatorConstants.STAGE_4_POS)); + } + + // Called every time the scheduler runs while the command is scheduled. + @Override + public void execute() { + elevator.runMotor(elevator.getNewSpeed(ElevatorConstants.STAGE_1_POS)); + } + + // Called once the command ends or is interrupted. + @Override + public void end(boolean interrupted) { + elevator.runMotor(0); + } + + // Returns true when the command should end. + @Override + public boolean isFinished() { + return (elevator.isOscillating(ElevatorConstants.STAGE_1_POS) | elevator.atStage1()); + } +} diff --git a/src/main/java/frc/robot/commands/GoToStage1.java b/src/main/java/frc/robot/commands/GoToIntermidiatePos.java similarity index 85% rename from src/main/java/frc/robot/commands/GoToStage1.java rename to src/main/java/frc/robot/commands/GoToIntermidiatePos.java index 2f45edc..d6ce8f3 100644 --- a/src/main/java/frc/robot/commands/GoToStage1.java +++ b/src/main/java/frc/robot/commands/GoToIntermidiatePos.java @@ -9,11 +9,11 @@ import frc.robot.subsystems.ElevatorSystem; /* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ -public class GoToStage1 extends Command { +public class GoToIntermidiatePos extends Command { private ElevatorSystem elevator; /** Creates a new GoToStage1. */ - public GoToStage1(final ElevatorSystem elevator) { + public GoToIntermidiatePos(final ElevatorSystem elevator) { // Use addRequirements() here to declare subsystem dependencies. this.elevator = elevator; addRequirements(elevator); @@ -22,13 +22,13 @@ public GoToStage1(final ElevatorSystem elevator) { // Called when the command is initially scheduled. @Override public void initialize() { - elevator.runMotor(elevator.getNewSpeed(ElevatorConstants.STAGE_1_POS)); + elevator.runMotor(elevator.getNewSpeed(ElevatorConstants.STAGE_2_POS)); } // Called every time the scheduler runs while the command is scheduled. @Override public void execute() { - elevator.runMotor(elevator.getNewSpeed(ElevatorConstants.STAGE_1_POS)); + elevator.runMotor(elevator.getNewSpeed(ElevatorConstants.STAGE_2_POS)); } // Called once the command ends or is interrupted. @@ -40,6 +40,6 @@ public void end(boolean interrupted) { // Returns true when the command should end. @Override public boolean isFinished() { - return (elevator.isOscillating(ElevatorConstants.STAGE_1_POS) | elevator.atStage1()); + return (elevator.isOscillating(ElevatorConstants.STAGE_2_POS) | elevator.atStage2()); } } From ab4caf7f8bb4af9dd00d5900c06da66fdfbfbee0 Mon Sep 17 00:00:00 2001 From: Luca Forever and Ever Date: Sat, 18 Jan 2025 15:30:55 -0500 Subject: [PATCH 08/13] Added photonvision code systems in place. -RG, BH, TC --- src/main/java/frc/robot/Constants.java | 23 ++ src/main/java/frc/robot/RobotContainer.java | 5 + .../frc/robot/subsystems/VisionSystem.java | 382 ++++++++++++++++++ 3 files changed, 410 insertions(+) create mode 100644 src/main/java/frc/robot/subsystems/VisionSystem.java diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index 528c08b..cb98960 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -1,6 +1,9 @@ package frc.robot; import edu.wpi.first.math.controller.PIDController; +import edu.wpi.first.math.geometry.Rotation3d; +import edu.wpi.first.math.geometry.Transform3d; +import edu.wpi.first.math.geometry.Translation3d; public class Constants { public static class ControllerConstants { @@ -14,6 +17,25 @@ public static class ControllerConstants { public static final double RIGHT_X_DEADBAND = 0.1; } + public class VisionConstants + { + + public static final String LEFT_CAMERA_NICKNAME = "Microsoft_LifeCam_HD-3000_Left"; // TODO: find proper value + public static final Transform3d LEFT_CAMERA_PLACEMENT = new Transform3d( + new Translation3d(-0.305816, 0.2276856, 0.5478018), new Rotation3d()) + .plus(new Transform3d(new Translation3d(), new Rotation3d(0, 0.959931, 0))) + .plus(new Transform3d(new Translation3d(), new Rotation3d(0, 0, -0.523599))); // TODO: find proper + // value, + // new Rotation3d(0, 0.959931, 2.61799) + public static final String RIGHT_CAMERA_NICKNAME = "Microsoft_LifeCam_HD-3000_Right"; // TODO: find proper value + public static final Transform3d RIGHT_CAMERA_PLACEMENT = new Transform3d( + new Translation3d(-0.305816, -0.2276856, 0.5478018), new Rotation3d()) + .plus(new Transform3d(new Translation3d(), new Rotation3d(0, 0.959931, 0))) + .plus(new Transform3d(new Translation3d(), new Rotation3d(0, 0, 0.523599))); // TODO: find proper + // value, + + } + public static class LoggingConstants { public static final boolean DEFAULT_LOGGING_STATE = false; @@ -40,3 +62,4 @@ public static class ElevatorConstants { } } + diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index 88fcd4b..ca82454 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -21,6 +21,7 @@ import frc.robot.Constants.ControllerConstants; import frc.robot.generated.TunerConstants; import frc.robot.subsystems.DriveSystem; +import frc.robot.subsystems.VisionSystem; public class RobotContainer { private double MaxSpeed = TunerConstants.kSpeedAt12Volts.in(MetersPerSecond); // kSpeedAt12Volts desired top speed @@ -39,6 +40,8 @@ public class RobotContainer { public final DriveSystem drivetrain = TunerConstants.createDrivetrain(); + public final VisionSystem visionSystem = new VisionSystem(); + private final SendableChooser autoChooser; public RobotContainer() { @@ -66,6 +69,8 @@ private void configureBindings() { point.withModuleDirection(new Rotation2d(-joystick.getLeftY(), -joystick.getLeftX())) )); + System.out.print( visionSystem.getTagPose(3)); + // Run SysId routines when holding back/start and X/Y. // Note that each routine should be run exactly once in a single log. // joystick.back().and(joystick.y()).whileTrue(drivetrain.sysIdDynamic(Direction.kForward)); diff --git a/src/main/java/frc/robot/subsystems/VisionSystem.java b/src/main/java/frc/robot/subsystems/VisionSystem.java new file mode 100644 index 0000000..4513141 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/VisionSystem.java @@ -0,0 +1,382 @@ +// 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.subsystems; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import org.photonvision.EstimatedRobotPose; +import org.photonvision.PhotonCamera; +import org.photonvision.PhotonPoseEstimator; +import org.photonvision.PhotonPoseEstimator.PoseStrategy; +import org.photonvision.common.hardware.VisionLEDMode; +import org.photonvision.PhotonUtils; +import org.photonvision.targeting.PhotonTrackedTarget; +import edu.wpi.first.apriltag.AprilTagFieldLayout; +import edu.wpi.first.apriltag.AprilTagFields; +import edu.wpi.first.math.geometry.Pose2d; +import edu.wpi.first.math.geometry.Pose3d; +import edu.wpi.first.math.geometry.Rotation2d; +import edu.wpi.first.math.geometry.Transform2d; +import edu.wpi.first.math.geometry.Transform3d; +import edu.wpi.first.math.geometry.Translation2d; +import edu.wpi.first.math.util.Units; +import edu.wpi.first.net.PortForwarder; +import edu.wpi.first.wpilibj.DriverStation; +import edu.wpi.first.wpilibj.smartdashboard.Field2d; +import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; +import edu.wpi.first.wpilibj2.command.SubsystemBase; +import frc.robot.Constants.VisionConstants; + +public class VisionSystem extends SubsystemBase { + + PhotonCamera leftCamera; + PhotonCamera rightCamera; + AprilTagFieldLayout tagLayout; + PhotonPoseEstimator poseEstimatorLeft; + PhotonPoseEstimator poseEstimatorRight; + private Field2d vision_field = new Field2d(); + + boolean blueAlliance = true; + + /** Creates a new vision. */ + public VisionSystem() { + leftCamera = new PhotonCamera(VisionConstants.LEFT_CAMERA_NICKNAME); + rightCamera = new PhotonCamera(VisionConstants.RIGHT_CAMERA_NICKNAME); + PortForwarder.add(5800, "photonvision.local", 5800); + + try { + tagLayout = AprilTagFieldLayout.loadFromResource(AprilTagFields.k2024Crescendo.m_resourceFile); + } catch (IOException exception) { + leftCamera.close(); + rightCamera.close(); + throw new RuntimeException(exception); + } + + poseEstimatorLeft = new PhotonPoseEstimator(tagLayout, PoseStrategy.MULTI_TAG_PNP_ON_COPROCESSOR, VisionConstants.LEFT_CAMERA_PLACEMENT); // TODO: decide which pose strategy to use + poseEstimatorRight = new PhotonPoseEstimator(tagLayout, PoseStrategy.MULTI_TAG_PNP_ON_COPROCESSOR, VisionConstants.RIGHT_CAMERA_PLACEMENT); // TODO: decide which pose strategy to use + + SmartDashboard.putData("vision based field", vision_field); + + } + + public void updateAlliance() { + var alliance = DriverStation.getAlliance(); + blueAlliance = alliance.get() == DriverStation.Alliance.Blue; + } + + public PhotonTrackedTarget findSpeakerTag() { + List targets = findTargets(); + List speakerTags = new ArrayList<>(); + + if (!blueAlliance) { + for (PhotonTrackedTarget target : targets) { + if (target.getFiducialId() == 3 | target.getFiducialId() == 4) { + speakerTags.add(target); + } + } + } else { + for (PhotonTrackedTarget target : targets) { + if (target.getFiducialId() == 7 | target.getFiducialId() == 8) { + speakerTags.add(target); + } + } + } + + PhotonTrackedTarget bestSpeakerTarget = Collections.max(targets, this::compareTargets); + return bestSpeakerTarget; + } + + public PhotonTrackedTarget findAmpTag() { + List targets = findTargets(); + PhotonTrackedTarget ampTag = null; + + if (!blueAlliance) { + for (PhotonTrackedTarget target : targets) { + if (target.getFiducialId() == 5) { + ampTag = target; + break; + } + } + } else { + for (PhotonTrackedTarget target : targets) { + if (target.getFiducialId() == 6) { + ampTag = target; + break; + } + } + } + + return ampTag; + } + + public int compareTargets(PhotonTrackedTarget a, PhotonTrackedTarget b) { + if (a.getArea() > b.getArea()) { + return 1; + } + if (a.getArea() == b.getArea()) { + return 0; + } else { + return -1; + } + } + + /* + * Get a list of tracked targets from the latest pipeline result. Returns null + * if there are no targets. + */ + + public List findTargets() { + var visionFrame = leftCamera.getLatestResult(); + if (visionFrame.hasTargets()) { + List targets = visionFrame.getTargets(); + return targets; + } else { + return null; + } + } + + /* + * Get the "best" target from the latest pipeline result. Returns null if there + * are no targets. + */ + + public PhotonTrackedTarget findBestTarget() { + var visionFrame = leftCamera.getLatestResult(); + if (visionFrame.hasTargets()) { + PhotonTrackedTarget target = visionFrame.getBestTarget(); + return target; + } else { + return null; + } + } + + /* + * Gets the yaw of the target in degrees (positive right). + */ + + public double getTargetYaw(PhotonTrackedTarget target) { + return target.getYaw(); + } + + /* + * Get the pitch of the target in degrees (positive up). + */ + + public double getTargetPitch(PhotonTrackedTarget target) { + return target.getPitch(); + } + + /* + * Get the area of the target (how much of the camera feed the bounding box + * takes up) as a percent (0-100). + */ + + public double getTargetArea(PhotonTrackedTarget target) { + return target.getArea(); + } + + /* + * Get the skew of the target (the skew of the target in degrees counter-clockwise positive). + */ + + public double getTargetSkew(PhotonTrackedTarget target) { + return target.getSkew(); + } + + // /* TODO: Added in docs but not in library + // * Get 4 corners of the minimum bounding box rectagle + // */ + + // public List getTargetCorners(PhotonTrackedTarget target) { + // return target.getCorners(); + // } + + + /* + * Get the ID of the detected fiducial marker. + */ + + public int getTargetID(PhotonTrackedTarget target) { + return target.getFiducialId(); + } + + /* + * + */ + + public double getPoseAmbiguity(PhotonTrackedTarget target) { + return target.getPoseAmbiguity(); + } + + // /* TODO: Included in docs but not in library + // * Get the transform that maps camera space (X = forward, Y = left, Z = up) to + // * object/fiducial tag space (X forward, Y left, Z up) with the lowest + // * reprojection error. + // */ + + // public Transform2d getCameraToTarget(PhotonTrackedTarget target) { + // return target.getCameraToTarget(); + // } + + /* + * Get the transform that maps camera space (X = forward, Y = left, Z = up) to + * object/fiducial tag space (X forward, Y left, Z up) with the lowest + * reprojection error. + */ + + public Transform3d getBestPathToTarget(PhotonTrackedTarget target) { + return target.getBestCameraToTarget(); + } + + /* + * Get the transform that maps camera space (X = forward, Y = left, Z = up) to + * object/fiducial tag space (X forward, Y left, Z up) with the highest + * reprojection error. + */ + + public Transform3d getOtherPathToTarget(PhotonTrackedTarget target) { + return target.getAlternateCameraToTarget(); + } + + /* + * Estimate the position of the robot relitive to the field. + */ + + public Optional getEstimatedGlobalPoseLeft() { + // poseEstimator.setReferencePose(prevRobotPose); + var visionFrame = leftCamera.getLatestResult(); + return poseEstimatorLeft.update(visionFrame); + } + + public Optional getEstimatedGlobalPoseRight() { + // poseEstimator.setReferencePose(prevRobotPose);\ + var visionFrame = rightCamera.getLatestResult(); + return poseEstimatorRight.update(visionFrame); + } + + public Optional getEstimatedGlobalPose() { + var poseLeft = poseEstimatorLeft.update(leftCamera.getLatestResult()); + var poseRight = poseEstimatorRight.update(rightCamera.getLatestResult()); + if (poseLeft.isPresent() && poseRight.isPresent()) { + return Optional.of(poseLeft.get().estimatedPose.interpolate(poseRight.get().estimatedPose, 0.5)); + } else if (poseLeft.isPresent()) { + return Optional.of(poseLeft.get().estimatedPose); + } else if (poseRight.isPresent()) { + return Optional.of(poseRight.get().estimatedPose); + } else { + return Optional.empty(); + } + } + + /* + * Get the position of the tag relitive to the field. + */ + + public Optional getTagPose(int targetID) { + return tagLayout.getTagPose(targetID); // TODO: make this return a non-optional Pose3d + } + + /* + * Calculate your robot’s Pose3d on the field using the pose of the AprilTag + * relative to the camera, pose of the AprilTag relative to the field, and the + * transform from the camera to the origin of the robot. + */ + // TODO: Only use function if (tagLayout.getTagPose(target.getFiducialId()).isPresent()) + + public Pose3d getFieldRelativePose( Pose3d tagPose, Transform3d cameraToTarget) { + return PhotonUtils.estimateFieldToRobotAprilTag(cameraToTarget, tagPose, VisionConstants.LEFT_CAMERA_PLACEMENT); + } + + // TODO: Define 2d version of camera placement to use this function + // public Pose2d getFieldRelativePose( Pose2d tagPose, Transform2d cameraToTarget) { + // return PhotonUtils.estimateFieldToRobot(cameraToTarget, tagPose, VisionConstants.LEFT_CAMERA_PLACEMENT); + // } + + /* + * Calculate the distance to the target based on the hieght of the camera off of + * the ground, the hieght of the target off of the ground, the camera’s pitch, + * and the pitch to the target. + */ + + public double getDistanceToTarget(double targetHeight, double cameraPitch, + double targetPitch) { + return PhotonUtils.calculateDistanceToTargetMeters(VisionConstants.LEFT_CAMERA_PLACEMENT.getY(), targetHeight, + cameraPitch, + Units.degreesToRadians(targetPitch)); // TODO: convert cameraPitch to use a constant + } + + /* + * Calculate the distance between two poses. This is useful when using + * AprilTags, given that there may not be an AprilTag directly on the target. + */ + + public double getDistanceToPose(Pose2d robotPose, Pose2d targetPose) { + return PhotonUtils.getDistanceToPose(robotPose, targetPose); + } + + /* + * Calculate translation to the target based on the distance to the target and + * angle to the target (yaw). + */ + + public Translation2d getTranslationToTarget(double distanceToTarget, double targetYaw) { + return PhotonUtils.estimateCameraToTargetTranslation(distanceToTarget, Rotation2d.fromDegrees(-targetYaw)); + } + + /* + * Calculate the Rotation2d between your robot and a target. This is useful when + * turning towards an arbitrary target on the field. + */ + + public Rotation2d getYawToPose(Pose2d robotPose, Pose2d targetPose) { + return PhotonUtils.getYawToPose(robotPose, targetPose); + } + + /* + * Toggle driver mode on or off. Driver mode is an unfiltered/normal view of the + * camera to be used while driving the robot. + */ + + public void driverModeToggle(boolean toggleOn) { + leftCamera.setDriverMode(toggleOn); + } + + /* + * Set the pipeline used by the camera. + */ + + public void setPipelineIndex(int index) { + leftCamera.setPipelineIndex(index); + } + + // /* TODO: Docs say we don't care + // * Get the latency of the pipeline in miliseconds. + // */ + + // public double getPipelineLatency() { + // var visionFrame = leftCamera.getLatestResult(); + // return visionFrame.getLatencyMillis(); + // } + + /* + * Set the mode of the camera LED(s). + */ + + public void setLED(VisionLEDMode LEDMode) { + leftCamera.setLED(LEDMode); + } + + @Override + public void periodic() { + // This method will be called once per scheduler run + var pose = getEstimatedGlobalPose(); + if (pose.isPresent()) { + vision_field.setRobotPose(pose.get().toPose2d()); + } + } +} From 6587109e21f5c0d74b7d562d3a24d8f7dcd8c1d5 Mon Sep 17 00:00:00 2001 From: Luca Forever and Ever Date: Sat, 25 Jan 2025 15:01:24 -0500 Subject: [PATCH 09/13] Made an intake subsystem and commands for intaking, placing, and ejecting coral, made parser for elevator related data from position_details.json, finished changing the goToIntermediatePos command to accomodate any stage, made the joint subsystem to represent the wrist and elbow mechanisms - TC, JR, LS --- src/main/deploy/position_details.json | 44 +++--------- src/main/java/frc/robot/Constants.java | 25 +++++++ src/main/java/frc/robot/PositionDetails.java | 8 --- .../{ => elevator_commands}/GoToExtrema.java | 2 +- .../GoToIntermediatePos.java} | 20 +++--- .../commands/intake_commands/EjectCoral.java | 43 +++++++++++ .../commands/intake_commands/IntakeCoral.java | 43 +++++++++++ .../commands/intake_commands/PlaceCoral.java | 43 +++++++++++ .../frc/robot/parsing/PositionDetails.java | 72 +++++++++++++++++++ src/main/java/frc/robot/parsing/ReefTag.java | 72 +++++++++++++++++++ .../frc/robot/subsystems/ElevatorSystem.java | 10 +++ .../frc/robot/subsystems/IntakeSystem.java | 39 ++++++++++ .../frc/robot/subsystems/JointSystem.java | 44 ++++++++++++ 13 files changed, 412 insertions(+), 53 deletions(-) delete mode 100644 src/main/java/frc/robot/PositionDetails.java rename src/main/java/frc/robot/commands/{ => elevator_commands}/GoToExtrema.java (97%) rename src/main/java/frc/robot/commands/{GoToIntermidiatePos.java => elevator_commands/GoToIntermediatePos.java} (63%) create mode 100644 src/main/java/frc/robot/commands/intake_commands/EjectCoral.java create mode 100644 src/main/java/frc/robot/commands/intake_commands/IntakeCoral.java create mode 100644 src/main/java/frc/robot/commands/intake_commands/PlaceCoral.java create mode 100644 src/main/java/frc/robot/parsing/PositionDetails.java create mode 100644 src/main/java/frc/robot/parsing/ReefTag.java create mode 100644 src/main/java/frc/robot/subsystems/IntakeSystem.java create mode 100644 src/main/java/frc/robot/subsystems/JointSystem.java diff --git a/src/main/deploy/position_details.json b/src/main/deploy/position_details.json index 91f244e..ecbaa25 100644 --- a/src/main/deploy/position_details.json +++ b/src/main/deploy/position_details.json @@ -7,7 +7,6 @@ "verticalPos": 0.46, "horizontalOffsets": { "left": -0.301625, - "center": 0, "right": 0.301625 } }, @@ -33,10 +32,7 @@ } } }, - "algae": { - "verticalPos": 0.965, - "horizontalOffset": 0 - } + "algaeVerticalPos": 0.965 }, "tag7": { @@ -46,7 +42,6 @@ "verticalPos": 0.46, "horizontalOffsets": { "left": -0.301625, - "center": 0, "right": 0.301625 } }, @@ -72,10 +67,7 @@ } } }, - "algae": { - "verticalPos": 1.365, - "horizontalOffset": 0 - } + "algaeVerticalPos": 1.365 }, "tag8": { @@ -85,7 +77,6 @@ "verticalPos": 0.46, "horizontalOffsets": { "left": -0.301625, - "center": 0, "right": 0.301625 } }, @@ -111,10 +102,7 @@ } } }, - "algae": { - "verticalPos": 0.965, - "horizontalOffset": 0 - } + "algaeVerticalPos": 0.965 }, "tag9": { @@ -124,7 +112,6 @@ "verticalPos": 0.46, "horizontalOffsets": { "left": -0.301625, - "center": 0, "right": 0.301625 } }, @@ -150,10 +137,7 @@ } } }, - "algae": { - "verticalPos": 1.365, - "horizontalOffset": 0 - } + "algaeVerticalPos": 1.365 }, "tag10": { @@ -163,7 +147,6 @@ "verticalPos": 0.46, "horizontalOffsets": { "left": -0.301625, - "center": 0, "right": 0.301625 } }, @@ -189,10 +172,7 @@ } } }, - "algae": { - "verticalPos": 0.965, - "horizontalOffset": 0 - } + "algaeVerticalPos": 0.965 }, "tag11": { @@ -202,7 +182,6 @@ "verticalPos": 0.46, "horizontalOffsets": { "left": -0.301625, - "center": 0, "right": 0.301625 } }, @@ -228,10 +207,7 @@ } } }, - "algae": { - "verticalPos": 1.365, - "horizontalOffset": 0 - } + "algaeVerticalPos": 1.365 } }, @@ -244,16 +220,12 @@ "verticalPos": 0.95, "tag1": { "side": "left", - "horizontalOffsets": [-0.428667, -0.3215, -0.214333, -0.1071667, 0, 0.1071667, 0.214333, 0.3215, 0.428667] + "horizontalOffsets": [-0.85777, -0.64333, -0.42888, -0.21444, 0, 0.21444, 0.42888, 0.64333, 0.85777] }, "tag2": { "side": "right", - "horizontalOffsets": [-0.428667, -0.3215, -0.214333, -0.1071667, 0, 0.1071667, 0.214333, 0.3215, 0.428667] + "horizontalOffsets": [-0.85777, -0.64333, -0.42888, -0.21444, 0, 0.21444, 0.42888, 0.64333, 0.85777] } - }, - - "barge": { - } } \ No newline at end of file diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index cb98960..1006ebc 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -61,5 +61,30 @@ public static class ElevatorConstants { public static final double ELEVATOR_MOTOR_VELOCITY_TOLERANCE = 0.2; } + public static class IntakeConstants { + + public static final int INTAKE_MOTOR_ID = 31; + public static final int INTAKE_SENSOR_ID = 32; + // public static final int INTAKE_SENSOR2_ID = 33; + + public static final double INTAKE_MOTOR_SPEED = 0.5; + public static final double PLACE_MOTOR_SPEED = 0.5; + public static final double EJECT_MOTOR_SPEED = 0.5; + } + + public static class ElbowConstants { + public static final int ELBOW_MOTOR_ID = 41; + public static final int ELBOW_POT_ID = 52; + + public static final PIDController ELBOW_PID = new PIDController(0, 0, 0); + } + + public static class WristConstants { + public static final int WRIST_MOTOR_ID = 42; + public static final int WRIST_POT_ID = 51; + + public static final PIDController WRIST_PID = new PIDController(0, 0, 0); + } + } diff --git a/src/main/java/frc/robot/PositionDetails.java b/src/main/java/frc/robot/PositionDetails.java deleted file mode 100644 index 34f52ac..0000000 --- a/src/main/java/frc/robot/PositionDetails.java +++ /dev/null @@ -1,8 +0,0 @@ -// 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; - -/** Add your docs here. */ -public class PositionDetails {} diff --git a/src/main/java/frc/robot/commands/GoToExtrema.java b/src/main/java/frc/robot/commands/elevator_commands/GoToExtrema.java similarity index 97% rename from src/main/java/frc/robot/commands/GoToExtrema.java rename to src/main/java/frc/robot/commands/elevator_commands/GoToExtrema.java index 4e30486..17ebbf7 100644 --- a/src/main/java/frc/robot/commands/GoToExtrema.java +++ b/src/main/java/frc/robot/commands/elevator_commands/GoToExtrema.java @@ -2,7 +2,7 @@ // 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; +package frc.robot.commands.elevator_commands; import edu.wpi.first.wpilibj2.command.Command; import frc.robot.Constants.ElevatorConstants; diff --git a/src/main/java/frc/robot/commands/GoToIntermidiatePos.java b/src/main/java/frc/robot/commands/elevator_commands/GoToIntermediatePos.java similarity index 63% rename from src/main/java/frc/robot/commands/GoToIntermidiatePos.java rename to src/main/java/frc/robot/commands/elevator_commands/GoToIntermediatePos.java index d6ce8f3..7613e8f 100644 --- a/src/main/java/frc/robot/commands/GoToIntermidiatePos.java +++ b/src/main/java/frc/robot/commands/elevator_commands/GoToIntermediatePos.java @@ -2,33 +2,37 @@ // 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; +package frc.robot.commands.elevator_commands; import edu.wpi.first.wpilibj2.command.Command; -import frc.robot.Constants.ElevatorConstants; +import frc.robot.parsing.PositionDetails; import frc.robot.subsystems.ElevatorSystem; /* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ -public class GoToIntermidiatePos extends Command { - private ElevatorSystem elevator; +public class GoToIntermediatePos extends Command { + private final ElevatorSystem elevator; + private final int stage; + private final double stageHeight; /** Creates a new GoToStage1. */ - public GoToIntermidiatePos(final ElevatorSystem elevator) { + public GoToIntermediatePos(final ElevatorSystem elevator, final PositionDetails positionDetails, final int stage) { // Use addRequirements() here to declare subsystem dependencies. this.elevator = elevator; addRequirements(elevator); + this.stage = stage; + stageHeight = positionDetails.getCoralVerticalPos(stage); } // Called when the command is initially scheduled. @Override public void initialize() { - elevator.runMotor(elevator.getNewSpeed(ElevatorConstants.STAGE_2_POS)); + elevator.runMotor(elevator.getNewSpeed(stageHeight)); } // Called every time the scheduler runs while the command is scheduled. @Override public void execute() { - elevator.runMotor(elevator.getNewSpeed(ElevatorConstants.STAGE_2_POS)); + elevator.runMotor(elevator.getNewSpeed(stageHeight)); } // Called once the command ends or is interrupted. @@ -40,6 +44,6 @@ public void end(boolean interrupted) { // Returns true when the command should end. @Override public boolean isFinished() { - return (elevator.isOscillating(ElevatorConstants.STAGE_2_POS) | elevator.atStage2()); + return (elevator.isOscillating(stageHeight) || elevator.atStage(stage)); } } diff --git a/src/main/java/frc/robot/commands/intake_commands/EjectCoral.java b/src/main/java/frc/robot/commands/intake_commands/EjectCoral.java new file mode 100644 index 0000000..cf51ae4 --- /dev/null +++ b/src/main/java/frc/robot/commands/intake_commands/EjectCoral.java @@ -0,0 +1,43 @@ +// 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.intake_commands; + +import edu.wpi.first.wpilibj2.command.Command; +import frc.robot.Constants.IntakeConstants; +import frc.robot.subsystems.IntakeSystem; + +/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ +public class EjectCoral extends Command { + private final IntakeSystem intakeSystem; + + /** Creates a new EjectCoral. */ + public EjectCoral(final IntakeSystem intakeSystem) { + // Use addRequirements() here to declare subsystem dependencies. + this.intakeSystem = intakeSystem; + addRequirements(intakeSystem); + } + + // Called when the command is initially scheduled. + @Override + public void initialize() { + intakeSystem.run(-IntakeConstants.EJECT_MOTOR_SPEED); + } + + // Called every time the scheduler runs while the command is scheduled. + @Override + public void execute() {} + + // Called once the command ends or is interrupted. + @Override + public void end(boolean interrupted) { + intakeSystem.run(0); + } + + // Returns true when the command should end. + @Override + public boolean isFinished() { + return !intakeSystem.hasCoral(); + } +} diff --git a/src/main/java/frc/robot/commands/intake_commands/IntakeCoral.java b/src/main/java/frc/robot/commands/intake_commands/IntakeCoral.java new file mode 100644 index 0000000..e81a006 --- /dev/null +++ b/src/main/java/frc/robot/commands/intake_commands/IntakeCoral.java @@ -0,0 +1,43 @@ +// 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.intake_commands; + +import edu.wpi.first.wpilibj2.command.Command; +import frc.robot.Constants.IntakeConstants; +import frc.robot.subsystems.IntakeSystem; + +/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ +public class IntakeCoral extends Command { + private final IntakeSystem intakeSystem; + + /** Creates a new IntakeCoral. */ + public IntakeCoral(final IntakeSystem intakeSystem) { + // Use addRequirements() here to declare subsystem dependencies. + this.intakeSystem = intakeSystem; + addRequirements(intakeSystem); + } + + // Called when the command is initially scheduled. + @Override + public void initialize() { + intakeSystem.run(IntakeConstants.INTAKE_MOTOR_SPEED); + } + + // Called every time the scheduler runs while the command is scheduled. + @Override + public void execute() {} + + // Called once the command ends or is interrupted. + @Override + public void end(boolean interrupted) { + intakeSystem.run(0); + } + + // Returns true when the command should end. + @Override + public boolean isFinished() { + return intakeSystem.hasCoral(); + } +} diff --git a/src/main/java/frc/robot/commands/intake_commands/PlaceCoral.java b/src/main/java/frc/robot/commands/intake_commands/PlaceCoral.java new file mode 100644 index 0000000..e31aa82 --- /dev/null +++ b/src/main/java/frc/robot/commands/intake_commands/PlaceCoral.java @@ -0,0 +1,43 @@ +// 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.intake_commands; + +import edu.wpi.first.wpilibj2.command.Command; +import frc.robot.Constants.IntakeConstants; +import frc.robot.subsystems.IntakeSystem; + +/* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ +public class PlaceCoral extends Command { + private final IntakeSystem intakeSystem; + + /** Creates a new PlaceCoral. */ + public PlaceCoral(final IntakeSystem intakeSystem) { + // Use addRequirements() here to declare subsystem dependencies. + this.intakeSystem = intakeSystem; + addRequirements(intakeSystem); + } + + // Called when the command is initially scheduled. + @Override + public void initialize() { + intakeSystem.run(-IntakeConstants.PLACE_MOTOR_SPEED); + } + + // Called every time the scheduler runs while the command is scheduled. + @Override + public void execute() {} + + // Called once the command ends or is interrupted. + @Override + public void end(boolean interrupted) { + intakeSystem.run(0); + } + + // Returns true when the command should end. + @Override + public boolean isFinished() { + return !intakeSystem.hasCoral(); + } +} diff --git a/src/main/java/frc/robot/parsing/PositionDetails.java b/src/main/java/frc/robot/parsing/PositionDetails.java new file mode 100644 index 0000000..5192276 --- /dev/null +++ b/src/main/java/frc/robot/parsing/PositionDetails.java @@ -0,0 +1,72 @@ +// 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.parsing; + +import java.io.File; +import java.io.IOException; +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.Iterator; + +import edu.wpi.first.wpilibj.Filesystem; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** Add your docs here. */ +public class PositionDetails { + private final String JSONPath = "/position_details.json"; + private final double ARBITRARY_TAG_ID = 6; + public Dictionary reefTags = new Hashtable<>(); + + public PositionDetails() { + File file = new File(Filesystem.getDeployDirectory().toPath() + JSONPath); + ObjectMapper objectMapper = new ObjectMapper(); + try { + JsonNode json = objectMapper.readTree(file); + for (Iterator i = json.get("reef").fieldNames(); i.hasNext();) { + String currentTag = i.next(); + int tagID = Integer.parseInt(currentTag.substring(3)); + reefTags.put(tagID, new ReefTag(json.get("reef").get(currentTag), tagID)); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + /** + * Get vertical position for the algae for the specified tag + * @param tagID - red oriented tag IDs ie: blue 17 -> red 6 + * @return a double representing the vertical position + */ + public double getAlgaeVerticalPos(int tagID) { + return reefTags.get(tagID).getAlgaeVerticalPos(); + } + /** + * Get vertical position for the specified stage for the specified tag + * @param stage - one-indexed ie: 1,2,3,4 + * @return a double representing the vertical position + */ + public double getCoralVerticalPos(int stage) { + return reefTags.get(ARBITRARY_TAG_ID).getCoralVerticalPos(stage); + } + /** + * Get left offset for the specified stage for the specified tag + * @param stage - one-indexed ie: 1,2,3,4 + * @return a double representing the left offset + */ + public double getLeftOffset(int stage) { + return reefTags.get(ARBITRARY_TAG_ID).getLeftOffset(stage); + } + /** + * Get right offset for the specified stage for the specified tag + * @param stage - one-indexed ie: 1,2,3,4 + * @return a double representing the right offset + */ + public double getRightOffset(int stage) { + return reefTags.get(ARBITRARY_TAG_ID).getRightOffset(stage); + } + +} diff --git a/src/main/java/frc/robot/parsing/ReefTag.java b/src/main/java/frc/robot/parsing/ReefTag.java new file mode 100644 index 0000000..96dabf0 --- /dev/null +++ b/src/main/java/frc/robot/parsing/ReefTag.java @@ -0,0 +1,72 @@ +// 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.parsing; + +import java.util.ArrayList; +import java.util.List; +import com.fasterxml.jackson.databind.JsonNode; + +/** Add your docs here. */ +public class ReefTag { + public int tagID; + public String face; + public Stage[] corals; + public double algaeVerticalPos; + + public class Stage { + public double verticalPos; + public double leftOffset; + public double rightOffset; + + public Stage(JsonNode stageJSON) { + this.verticalPos = stageJSON.get("verticalPos").asDouble(); + this.leftOffset = stageJSON.get("horizontalOffsets").get("left").asDouble(); + this.rightOffset = stageJSON.get("horizontalOffsets").get("right").asDouble(); + } + } + + public ReefTag(JsonNode tagJSON, int tagID) { + this.tagID = tagID; // TODO: Try to get tag ID from tagJSON + this.face = tagJSON.get("face").asText(); + this.algaeVerticalPos = tagJSON.get("algaeVerticalPos").asDouble(); + List coralList = new ArrayList(4); + for(int i = 1; i <= 4; i++) { + coralList.add(new Stage(tagJSON.get("coral").get("stage" + i))); + } + coralList.toArray(corals); + } + + /** + * Get vertical position for the algae + * @return a double representing the vertical position + */ + public double getAlgaeVerticalPos() { + return algaeVerticalPos; + } + /** + * Get vertical position for the specified stage + * @param stage - one-indexed ie: 1,2,3,4 + * @return a double representing the vertical position + */ + public double getCoralVerticalPos(int stage) { + return corals[stage - 1].verticalPos; + } + /** + * Get left offset for the specified stage + * @param stage - one-indexed ie: 1,2,3,4 + * @return a double representing the left offset + */ + public double getLeftOffset(int stage) { + return corals[stage - 1].leftOffset; + } + /** + * Get right offset for the specified stage + * @param stage - one-indexed ie: 1,2,3,4 + * @return a double representing the right offset + */ + public double getRightOffset(int stage) { + return corals[stage - 1].rightOffset; + } +} \ No newline at end of file diff --git a/src/main/java/frc/robot/subsystems/ElevatorSystem.java b/src/main/java/frc/robot/subsystems/ElevatorSystem.java index f25ef19..fea57f0 100644 --- a/src/main/java/frc/robot/subsystems/ElevatorSystem.java +++ b/src/main/java/frc/robot/subsystems/ElevatorSystem.java @@ -38,6 +38,16 @@ private static int getPos() { return pot.getValue(); } + public boolean atStage(int stage) { + switch (stage) { + case 1: return atStage1(); + case 2: return atStage2(); + case 3: return atStage3(); + case 4: return atStage4(); + default: return false; + } + } + public boolean atStage1() { return stage1Limit.get(); } diff --git a/src/main/java/frc/robot/subsystems/IntakeSystem.java b/src/main/java/frc/robot/subsystems/IntakeSystem.java new file mode 100644 index 0000000..0b6cf5e --- /dev/null +++ b/src/main/java/frc/robot/subsystems/IntakeSystem.java @@ -0,0 +1,39 @@ +// 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.subsystems; + +import com.revrobotics.spark.SparkMax; +import com.revrobotics.spark.SparkLowLevel.MotorType; + +import edu.wpi.first.wpilibj.DigitalInput; +import edu.wpi.first.wpilibj2.command.SubsystemBase; +import frc.robot.Constants.IntakeConstants; + +public class IntakeSystem extends SubsystemBase { + private static SparkMax motor = new SparkMax(IntakeConstants.INTAKE_MOTOR_ID, MotorType.kBrushless); + private static DigitalInput sensor = new DigitalInput(IntakeConstants.INTAKE_SENSOR_ID); + // private static DigitalInput sensor2 = new DigitalInput(IntakeConstants.INTAKE_SENSOR2_ID); + + + /** Creates a new IntakeSystem. */ + public IntakeSystem() {} + + public void run(double speed) { + motor.set(speed); + } + + public boolean hasCoral() { + return sensor.get(); + } + + /* public boolean fullIntake() { + return sensor2.get(); + } */ + + @Override + public void periodic() { + // This method will be called once per scheduler run + } +} diff --git a/src/main/java/frc/robot/subsystems/JointSystem.java b/src/main/java/frc/robot/subsystems/JointSystem.java new file mode 100644 index 0000000..0212e16 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/JointSystem.java @@ -0,0 +1,44 @@ +// 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.subsystems; + +import com.revrobotics.spark.SparkMax; +import com.revrobotics.spark.SparkLowLevel.MotorType; + +import edu.wpi.first.math.controller.PIDController; +import edu.wpi.first.wpilibj.AnalogInput; +import edu.wpi.first.wpilibj2.command.SubsystemBase; +import frc.robot.Constants.ElbowConstants; +import frc.robot.Constants.WristConstants; + +public class JointSystem extends SubsystemBase { + private SparkMax motor; + private AnalogInput pot; + private PIDController PID; + + /** Creates a new JointSystem. */ + public JointSystem(boolean isElbow) { + motor = new SparkMax(isElbow ? ElbowConstants.ELBOW_MOTOR_ID : WristConstants.WRIST_MOTOR_ID, MotorType.kBrushless); + pot = new AnalogInput(isElbow ? ElbowConstants.ELBOW_POT_ID : WristConstants.WRIST_POT_ID); + PID = isElbow ? ElbowConstants.ELBOW_PID : WristConstants.WRIST_PID; + } + + public void runMotor(double velocity) { + motor.set(velocity); + } + + private int getPos() { + return pot.getValue(); + } + + public double getNewSpeed(double desiredPos) { + return PID.calculate(getPos(), desiredPos); + } + + @Override + public void periodic() { + // This method will be called once per scheduler run + } +} From 5de8b5af5cf27b8732dd64e1585550f4d37cb3c1 Mon Sep 17 00:00:00 2001 From: Luca Forever and Ever Date: Sat, 25 Jan 2025 15:14:48 -0500 Subject: [PATCH 10/13] added subsystems to robot container - JR, LS, TC, KS --- src/main/java/frc/robot/RobotContainer.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index ca82454..21ed2d8 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -19,8 +19,12 @@ import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.button.CommandXboxController; import frc.robot.Constants.ControllerConstants; +import frc.robot.Constants.ElevatorConstants; import frc.robot.generated.TunerConstants; import frc.robot.subsystems.DriveSystem; +import frc.robot.subsystems.ElevatorSystem; +import frc.robot.subsystems.IntakeSystem; +import frc.robot.subsystems.JointSystem; import frc.robot.subsystems.VisionSystem; public class RobotContainer { @@ -39,7 +43,10 @@ public class RobotContainer { private final CommandXboxController joystick = new CommandXboxController(0); public final DriveSystem drivetrain = TunerConstants.createDrivetrain(); - + private final ElevatorSystem elevator = new ElevatorSystem(); + private final IntakeSystem intake = new IntakeSystem(); + private final JointSystem elbow = new JointSystem(true); + private final JointSystem wrist = new JointSystem(false); public final VisionSystem visionSystem = new VisionSystem(); private final SendableChooser autoChooser; From a6e6e2cd766b4d3b88f6caea71407f56b5e00453 Mon Sep 17 00:00:00 2001 From: Luca Forever and Ever Date: Tue, 28 Jan 2025 20:14:39 -0500 Subject: [PATCH 11/13] Updated WPILIB properly this time, generalized the isOscillating function - LS, JR, JM, RG --- build.gradle | 2 +- src/main/java/frc/robot/Constants.java | 4 +-- .../frc/robot/subsystems/ElevatorSystem.java | 22 ++++-------- .../frc/robot/subsystems/JointSystem.java | 27 +++++++++++---- src/main/java/frc/utilities/PosUtils.java | 34 +++++++++++++++++++ 5 files changed, 63 insertions(+), 26 deletions(-) create mode 100644 src/main/java/frc/utilities/PosUtils.java diff --git a/build.gradle b/build.gradle index 8e63796..bb54b03 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "java" - id "edu.wpi.first.GradleRIO" version "2025.1.1" + id "edu.wpi.first.GradleRIO" version "2025.2.1" } java { diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index 1006ebc..b68a1f4 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -74,14 +74,14 @@ public static class IntakeConstants { public static class ElbowConstants { public static final int ELBOW_MOTOR_ID = 41; - public static final int ELBOW_POT_ID = 52; + public static final int ELBOW_ENCODER_ID = 52; public static final PIDController ELBOW_PID = new PIDController(0, 0, 0); } public static class WristConstants { public static final int WRIST_MOTOR_ID = 42; - public static final int WRIST_POT_ID = 51; + public static final int WRIST_ENCODER_ID = 51; public static final PIDController WRIST_PID = new PIDController(0, 0, 0); } diff --git a/src/main/java/frc/robot/subsystems/ElevatorSystem.java b/src/main/java/frc/robot/subsystems/ElevatorSystem.java index fea57f0..b2fc67a 100644 --- a/src/main/java/frc/robot/subsystems/ElevatorSystem.java +++ b/src/main/java/frc/robot/subsystems/ElevatorSystem.java @@ -12,8 +12,9 @@ import edu.wpi.first.wpilibj.DigitalInput; import edu.wpi.first.wpilibj2.command.SubsystemBase; import frc.robot.Constants.ElevatorConstants; +import frc.utilities.PosUtils; -public class ElevatorSystem extends SubsystemBase { +public class ElevatorSystem extends SubsystemBase implements PosUtils { private static SparkMax motor = new SparkMax(ElevatorConstants.ELEVATOR_MOTOR_ID, MotorType.kBrushless); private static AnalogInput pot = new AnalogInput(ElevatorConstants.ELEVATOR_POT_ID); @@ -30,11 +31,11 @@ public void runMotor(double velocity) { motor.set(velocity); } - private static double getMotorVelocity() { + private double getMotorVelocity() { return motor.getEncoder().getVelocity(); } - private static int getPos() { + private double getPos() { return pot.getValue(); } @@ -68,19 +69,8 @@ public double getNewSpeed(double desiredPos) { return PID.calculate(getPos(), desiredPos); } - public boolean isOscillating(double desiredPos) { // TODO: Consider generalizing this - boolean retval = false; - - if ((getPos() >= desiredPos - ElevatorConstants.ELEVATOR_POS_TOLERANCE) & ((getMotorVelocity() >= 0) & (getMotorVelocity() <= ElevatorConstants.ELEVATOR_MOTOR_VELOCITY_TOLERANCE))) { - // checks if the elevator's current position is below the desired position within ELEVATOR_POS_TOLERANCE and the elevator is moving up at a speed below ELEVATOR_MOTOR_VELOCITY_TOLERANCE - retval = true; - } - else if ((getPos() <= desiredPos + ElevatorConstants.ELEVATOR_POS_TOLERANCE) & ((getMotorVelocity() <= 0) & (getMotorVelocity() >= - ElevatorConstants.ELEVATOR_MOTOR_VELOCITY_TOLERANCE))) { - // checks if the elevator's current position is above the desired position within ELEVATOR_POS_TOLERANCE and the elevator is moving down at a speed below ELEVATOR_MOTOR_VELOCITY_TOLERANCE - retval = true; - } - - return retval; + public boolean isOscillating(double desiredPos) { + return PosUtils.isOscillating(desiredPos, getPos(), ElevatorConstants.ELEVATOR_POS_TOLERANCE, getMotorVelocity(), ElevatorConstants.ELEVATOR_MOTOR_VELOCITY_TOLERANCE); } @Override diff --git a/src/main/java/frc/robot/subsystems/JointSystem.java b/src/main/java/frc/robot/subsystems/JointSystem.java index 0212e16..32870fa 100644 --- a/src/main/java/frc/robot/subsystems/JointSystem.java +++ b/src/main/java/frc/robot/subsystems/JointSystem.java @@ -4,6 +4,8 @@ package frc.robot.subsystems; +import com.revrobotics.spark.SparkBase; +import com.revrobotics.spark.SparkFlex; import com.revrobotics.spark.SparkMax; import com.revrobotics.spark.SparkLowLevel.MotorType; @@ -11,17 +13,19 @@ import edu.wpi.first.wpilibj.AnalogInput; import edu.wpi.first.wpilibj2.command.SubsystemBase; import frc.robot.Constants.ElbowConstants; +import frc.robot.Constants.ElevatorConstants; import frc.robot.Constants.WristConstants; +import frc.utilities.PosUtils; -public class JointSystem extends SubsystemBase { - private SparkMax motor; - private AnalogInput pot; - private PIDController PID; +public class JointSystem extends SubsystemBase implements PosUtils { + private static SparkBase motor; + private static AnalogInput absEncoder; + private static PIDController PID; /** Creates a new JointSystem. */ public JointSystem(boolean isElbow) { - motor = new SparkMax(isElbow ? ElbowConstants.ELBOW_MOTOR_ID : WristConstants.WRIST_MOTOR_ID, MotorType.kBrushless); - pot = new AnalogInput(isElbow ? ElbowConstants.ELBOW_POT_ID : WristConstants.WRIST_POT_ID); + motor = isElbow ? new SparkFlex(ElbowConstants.ELBOW_MOTOR_ID, MotorType.kBrushless) : new SparkMax(WristConstants.WRIST_MOTOR_ID, MotorType.kBrushless); + absEncoder = new AnalogInput(isElbow ? ElbowConstants.ELBOW_ENCODER_ID : WristConstants.WRIST_ENCODER_ID); PID = isElbow ? ElbowConstants.ELBOW_PID : WristConstants.WRIST_PID; } @@ -29,10 +33,19 @@ public void runMotor(double velocity) { motor.set(velocity); } + private double getMotorVelocity() { + return motor.getEncoder().getVelocity(); + } + private int getPos() { - return pot.getValue(); + return absEncoder.getValue(); } + public boolean isOscillating(double desiredPos) { + return PosUtils.isOscillating(desiredPos, getPos(), ElevatorConstants.ELEVATOR_POS_TOLERANCE, getMotorVelocity(), ElevatorConstants.ELEVATOR_MOTOR_VELOCITY_TOLERANCE); + } + + public double getNewSpeed(double desiredPos) { return PID.calculate(getPos(), desiredPos); } diff --git a/src/main/java/frc/utilities/PosUtils.java b/src/main/java/frc/utilities/PosUtils.java new file mode 100644 index 0000000..1d7e5f4 --- /dev/null +++ b/src/main/java/frc/utilities/PosUtils.java @@ -0,0 +1,34 @@ +// 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.utilities; + +/** Add your docs here. */ +public interface PosUtils { + + /** + * checks if the currentPos is within posTolerance of desiredPos and the motorVelocity is within velocityTolerance in the direction towards desiredPos. + * @param desiredPos - the position you wish the system to reach + * @param currentPos - the position the system is currently at + * @param posTolerance - the allowable deviation from the desired position + * @param motorVelocity - the velocity that the motor is currently spinning at + * @param velocityTolerance - the maximum motor velocity for the system to not overshoot the desired position tolerance + * @return - boolean + */ + static boolean isOscillating(double desiredPos, double currentPos, double posTolerance, double motorVelocity, double velocityTolerance) { + boolean retval = false; + + if ((currentPos >= desiredPos - posTolerance) & ((motorVelocity >= 0) & (motorVelocity <= velocityTolerance))) { + // checks if the elevator's current position is below the desired position within ELEVATOR_POS_TOLERANCE and the elevator is moving up at a speed below ELEVATOR_MOTOR_VELOCITY_TOLERANCE + retval = true; + } + else if ((currentPos <= desiredPos + posTolerance) & ((motorVelocity <= 0) & (motorVelocity >= - velocityTolerance))) { + // checks if the elevator's current position is above the desired position within ELEVATOR_POS_TOLERANCE and the elevator is moving down at a speed below ELEVATOR_MOTOR_VELOCITY_TOLERANCE + retval = true; + } + + return retval; + } + +} From 39546b153200ea706cdd54981de3ef0d1c73c748 Mon Sep 17 00:00:00 2001 From: Luca Forever and Ever Date: Tue, 28 Jan 2025 20:40:53 -0500 Subject: [PATCH 12/13] Started work on changing the position_details schema to provide system positions rather than simply the height of elements - LS --- src/main/deploy/position_details.json | 276 ++++++------------ .../frc/robot/parsing/PositionDetails.java | 34 ++- src/main/java/frc/robot/parsing/ReefTag.java | 44 --- 3 files changed, 112 insertions(+), 242 deletions(-) diff --git a/src/main/deploy/position_details.json b/src/main/deploy/position_details.json index ecbaa25..4bfcb50 100644 --- a/src/main/deploy/position_details.json +++ b/src/main/deploy/position_details.json @@ -1,213 +1,104 @@ { "reef": { - "tag6": { - "face": "closeLeftFace", - "coral": { - "stage1": { - "verticalPos": 0.46, - "horizontalOffsets": { - "left": -0.301625, - "right": 0.301625 - } - }, - "stage2": { - "verticalPos": 0.81, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - }, - "stage3": { - "verticalPos": 1.21, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - }, - "stage4": { - "verticalPos": 1.83, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } + "coral": { + "stage1": { + "verticalPos": 0.46, + "systemPositions": { + "elevator": , + "elbow": , + "wrist": + }, + "horizontalOffsets": { + "left": -0.301625, + "right": 0.301625 } }, - "algaeVerticalPos": 0.965 - }, - - "tag7": { - "face": "closeCenterFace", - "coral": { - "stage1": { - "verticalPos": 0.46, - "horizontalOffsets": { - "left": -0.301625, - "right": 0.301625 - } - }, - "stage2": { - "verticalPos": 0.81, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - }, - "stage3": { - "verticalPos": 1.21, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - }, - "stage4": { - "verticalPos": 1.83, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } + "stage2": { + "verticalPos": 0.81, + "systemPositions": { + "elevator": , + "elbow": , + "wrist": + }, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 } }, - "algaeVerticalPos": 1.365 - }, - - "tag8": { - "face": "closeRightFace", - "coral": { - "stage1": { - "verticalPos": 0.46, - "horizontalOffsets": { - "left": -0.301625, - "right": 0.301625 - } - }, - "stage2": { - "verticalPos": 0.81, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - }, - "stage3": { - "verticalPos": 1.21, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - }, - "stage4": { - "verticalPos": 1.83, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } + "stage3": { + "verticalPos": 1.21, + "systemPositions": { + "elevator": , + "elbow": , + "wrist": + }, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 } }, - "algaeVerticalPos": 0.965 + "stage4": { + "verticalPos": 1.83, + "systemPositions": { + "elevator": , + "elbow": , + "wrist": + }, + "horizontalOffsets": { + "left": -0.1651, + "right": 0.1651 + } + } + }, + + "tag6": { + "face": "closeLeftFace", + "algaeVerticalPos": 0.965, + "algaeSystemPositions": { + "elevator": , + "elbow": , + "wrist": + } + }, + + "tag7": { + "face": "closeCenterFace", + "algaeVerticalPos": 0.965, + "algaeSystemPositions": { + "elevator": , + "elbow": , + "wrist": + } }, "tag9": { "face": "farRightFace", - "coral": { - "stage1": { - "verticalPos": 0.46, - "horizontalOffsets": { - "left": -0.301625, - "right": 0.301625 - } - }, - "stage2": { - "verticalPos": 0.81, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - }, - "stage3": { - "verticalPos": 1.21, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - }, - "stage4": { - "verticalPos": 1.83, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - } - }, - "algaeVerticalPos": 1.365 + "algaeVerticalPos": 1.365, + "algaeSystemPositions": { + "elevator": , + "elbow": , + "wrist": + } }, "tag10": { "face": "farCenterFace", - "coral": { - "stage1": { - "verticalPos": 0.46, - "horizontalOffsets": { - "left": -0.301625, - "right": 0.301625 - } - }, - "stage2": { - "verticalPos": 0.81, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - }, - "stage3": { - "verticalPos": 1.21, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - }, - "stage4": { - "verticalPos": 1.83, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - } - }, - "algaeVerticalPos": 0.965 + "algaeVerticalPos": 0.965, + "algaeSystemPositions": { + "elevator": , + "elbow": , + "wrist": + } }, "tag11": { "face": "farLeftFace", - "coral": { - "stage1": { - "verticalPos": 0.46, - "horizontalOffsets": { - "left": -0.301625, - "right": 0.301625 - } - }, - "stage2": { - "verticalPos": 0.81, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - }, - "stage3": { - "verticalPos": 1.21, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - }, - "stage4": { - "verticalPos": 1.83, - "horizontalOffsets": { - "left": -0.1651, - "right": 0.1651 - } - } - }, - "algaeVerticalPos": 1.365 + "algaeVerticalPos": 1.365, + "algaeSystemPositions": { + "elevator": , + "elbow": , + "wrist": + } } }, @@ -218,6 +109,11 @@ "coralStation": { "verticalPos": 0.95, + "algaeSystemPositions": { + "elevator": , + "elbow": , + "wrist": + }, "tag1": { "side": "left", "horizontalOffsets": [-0.85777, -0.64333, -0.42888, -0.21444, 0, 0.21444, 0.42888, 0.64333, 0.85777] diff --git a/src/main/java/frc/robot/parsing/PositionDetails.java b/src/main/java/frc/robot/parsing/PositionDetails.java index 5192276..634760d 100644 --- a/src/main/java/frc/robot/parsing/PositionDetails.java +++ b/src/main/java/frc/robot/parsing/PositionDetails.java @@ -6,9 +6,11 @@ import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.Dictionary; import java.util.Hashtable; import java.util.Iterator; +import java.util.List; import edu.wpi.first.wpilibj.Filesystem; import com.fasterxml.jackson.databind.JsonNode; @@ -17,9 +19,21 @@ /** Add your docs here. */ public class PositionDetails { private final String JSONPath = "/position_details.json"; - private final double ARBITRARY_TAG_ID = 6; + public Stage[] corals; public Dictionary reefTags = new Hashtable<>(); + public class Stage { + public double verticalPos; + public double leftOffset; + public double rightOffset; + + public Stage(JsonNode stageJSON) { + this.verticalPos = stageJSON.get("verticalPos").asDouble(); + this.leftOffset = stageJSON.get("horizontalOffsets").get("left").asDouble(); + this.rightOffset = stageJSON.get("horizontalOffsets").get("right").asDouble(); + } + } + public PositionDetails() { File file = new File(Filesystem.getDeployDirectory().toPath() + JSONPath); ObjectMapper objectMapper = new ObjectMapper(); @@ -30,6 +44,11 @@ public PositionDetails() { int tagID = Integer.parseInt(currentTag.substring(3)); reefTags.put(tagID, new ReefTag(json.get("reef").get(currentTag), tagID)); } + List coralList = new ArrayList(4); + for(int i = 1; i <= 4; i++) { + coralList.add(new Stage(json.get("reef").get("coral").get("stage" + i))); + } + coralList.toArray(corals); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -45,28 +64,27 @@ public double getAlgaeVerticalPos(int tagID) { return reefTags.get(tagID).getAlgaeVerticalPos(); } /** - * Get vertical position for the specified stage for the specified tag + * Get vertical position for the specified stage * @param stage - one-indexed ie: 1,2,3,4 * @return a double representing the vertical position */ public double getCoralVerticalPos(int stage) { - return reefTags.get(ARBITRARY_TAG_ID).getCoralVerticalPos(stage); + return corals[stage - 1].verticalPos; } /** - * Get left offset for the specified stage for the specified tag + * Get left offset for the specified stage * @param stage - one-indexed ie: 1,2,3,4 * @return a double representing the left offset */ public double getLeftOffset(int stage) { - return reefTags.get(ARBITRARY_TAG_ID).getLeftOffset(stage); + return corals[stage - 1].leftOffset; } /** - * Get right offset for the specified stage for the specified tag + * Get right offset for the specified stage * @param stage - one-indexed ie: 1,2,3,4 * @return a double representing the right offset */ public double getRightOffset(int stage) { - return reefTags.get(ARBITRARY_TAG_ID).getRightOffset(stage); + return corals[stage - 1].rightOffset; } - } diff --git a/src/main/java/frc/robot/parsing/ReefTag.java b/src/main/java/frc/robot/parsing/ReefTag.java index 96dabf0..ed40583 100644 --- a/src/main/java/frc/robot/parsing/ReefTag.java +++ b/src/main/java/frc/robot/parsing/ReefTag.java @@ -4,38 +4,18 @@ package frc.robot.parsing; -import java.util.ArrayList; -import java.util.List; import com.fasterxml.jackson.databind.JsonNode; /** Add your docs here. */ public class ReefTag { public int tagID; public String face; - public Stage[] corals; public double algaeVerticalPos; - public class Stage { - public double verticalPos; - public double leftOffset; - public double rightOffset; - - public Stage(JsonNode stageJSON) { - this.verticalPos = stageJSON.get("verticalPos").asDouble(); - this.leftOffset = stageJSON.get("horizontalOffsets").get("left").asDouble(); - this.rightOffset = stageJSON.get("horizontalOffsets").get("right").asDouble(); - } - } - public ReefTag(JsonNode tagJSON, int tagID) { this.tagID = tagID; // TODO: Try to get tag ID from tagJSON this.face = tagJSON.get("face").asText(); this.algaeVerticalPos = tagJSON.get("algaeVerticalPos").asDouble(); - List coralList = new ArrayList(4); - for(int i = 1; i <= 4; i++) { - coralList.add(new Stage(tagJSON.get("coral").get("stage" + i))); - } - coralList.toArray(corals); } /** @@ -45,28 +25,4 @@ public ReefTag(JsonNode tagJSON, int tagID) { public double getAlgaeVerticalPos() { return algaeVerticalPos; } - /** - * Get vertical position for the specified stage - * @param stage - one-indexed ie: 1,2,3,4 - * @return a double representing the vertical position - */ - public double getCoralVerticalPos(int stage) { - return corals[stage - 1].verticalPos; - } - /** - * Get left offset for the specified stage - * @param stage - one-indexed ie: 1,2,3,4 - * @return a double representing the left offset - */ - public double getLeftOffset(int stage) { - return corals[stage - 1].leftOffset; - } - /** - * Get right offset for the specified stage - * @param stage - one-indexed ie: 1,2,3,4 - * @return a double representing the right offset - */ - public double getRightOffset(int stage) { - return corals[stage - 1].rightOffset; - } } \ No newline at end of file From e230f21902b62b7d9e5d02df814b940e27ab8a66 Mon Sep 17 00:00:00 2001 From: Luca Forever and Ever Date: Sat, 1 Feb 2025 12:29:06 -0500 Subject: [PATCH 13/13] finished changes to the position details parser that were started last time, updated the coral place and eject commands to stop after a specified amount of time has passed, updated elevator code to only use two limit switches - LS, BH, RG --- src/main/java/frc/robot/Constants.java | 3 + .../elevator_commands/GoToExtrema.java | 12 ++-- .../GoToIntermediatePos.java | 6 +- .../commands/intake_commands/EjectCoral.java | 5 +- .../commands/intake_commands/PlaceCoral.java | 5 +- .../frc/robot/parsing/PositionDetails.java | 61 +++++++++++++++---- src/main/java/frc/robot/parsing/ReefTag.java | 26 +++++++- .../frc/robot/subsystems/ElevatorSystem.java | 32 +++------- .../frc/robot/subsystems/IntakeSystem.java | 6 -- 9 files changed, 100 insertions(+), 56 deletions(-) diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index b68a1f4..17333a7 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -70,6 +70,9 @@ public static class IntakeConstants { public static final double INTAKE_MOTOR_SPEED = 0.5; public static final double PLACE_MOTOR_SPEED = 0.5; public static final double EJECT_MOTOR_SPEED = 0.5; + + public static final double PLACE_TIME = 0.5; + public static final double EJECT_TIME = 0.5; } public static class ElbowConstants { diff --git a/src/main/java/frc/robot/commands/elevator_commands/GoToExtrema.java b/src/main/java/frc/robot/commands/elevator_commands/GoToExtrema.java index 17ebbf7..418d907 100644 --- a/src/main/java/frc/robot/commands/elevator_commands/GoToExtrema.java +++ b/src/main/java/frc/robot/commands/elevator_commands/GoToExtrema.java @@ -5,18 +5,20 @@ package frc.robot.commands.elevator_commands; import edu.wpi.first.wpilibj2.command.Command; -import frc.robot.Constants.ElevatorConstants; +import frc.robot.parsing.PositionDetails; import frc.robot.subsystems.ElevatorSystem; /* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ public class GoToExtrema extends Command { private final ElevatorSystem elevator; + private final PositionDetails positionDetails; private final boolean isTop; /** Creates a new GoToStage1. */ - public GoToExtrema(final ElevatorSystem elevator, final boolean isTop) { + public GoToExtrema(final ElevatorSystem elevator, final PositionDetails positionDetails, final boolean isTop) { // Use addRequirements() here to declare subsystem dependencies. this.elevator = elevator; + this.positionDetails = positionDetails; this.isTop = isTop; addRequirements(elevator); } @@ -24,13 +26,13 @@ public GoToExtrema(final ElevatorSystem elevator, final boolean isTop) { // Called when the command is initially scheduled. @Override public void initialize() { - elevator.runMotor(elevator.getNewSpeed(isTop ? ElevatorConstants.STAGE_1_POS : ElevatorConstants.STAGE_4_POS)); + elevator.runMotor(elevator.getNewSpeed(isTop ? positionDetails.getElevatorPosAtStage(1) : positionDetails.getElevatorPosAtStage(4))); } // Called every time the scheduler runs while the command is scheduled. @Override public void execute() { - elevator.runMotor(elevator.getNewSpeed(ElevatorConstants.STAGE_1_POS)); + elevator.runMotor(elevator.getNewSpeed(isTop ? positionDetails.getElevatorPosAtStage(1) : positionDetails.getElevatorPosAtStage(4))); } // Called once the command ends or is interrupted. @@ -42,6 +44,6 @@ public void end(boolean interrupted) { // Returns true when the command should end. @Override public boolean isFinished() { - return (elevator.isOscillating(ElevatorConstants.STAGE_1_POS) | elevator.atStage1()); + return (elevator.isOscillating(isTop ? positionDetails.getElevatorPosAtStage(1) : positionDetails.getElevatorPosAtStage(4)) || isTop ? elevator.atBottom() : elevator.atTop()); } } diff --git a/src/main/java/frc/robot/commands/elevator_commands/GoToIntermediatePos.java b/src/main/java/frc/robot/commands/elevator_commands/GoToIntermediatePos.java index 7613e8f..64780c9 100644 --- a/src/main/java/frc/robot/commands/elevator_commands/GoToIntermediatePos.java +++ b/src/main/java/frc/robot/commands/elevator_commands/GoToIntermediatePos.java @@ -11,7 +11,6 @@ /* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ public class GoToIntermediatePos extends Command { private final ElevatorSystem elevator; - private final int stage; private final double stageHeight; /** Creates a new GoToStage1. */ @@ -19,8 +18,7 @@ public GoToIntermediatePos(final ElevatorSystem elevator, final PositionDetails // Use addRequirements() here to declare subsystem dependencies. this.elevator = elevator; addRequirements(elevator); - this.stage = stage; - stageHeight = positionDetails.getCoralVerticalPos(stage); + stageHeight = positionDetails.getElevatorPosAtStage(stage); } // Called when the command is initially scheduled. @@ -44,6 +42,6 @@ public void end(boolean interrupted) { // Returns true when the command should end. @Override public boolean isFinished() { - return (elevator.isOscillating(stageHeight) || elevator.atStage(stage)); + return elevator.isOscillating(stageHeight); } } diff --git a/src/main/java/frc/robot/commands/intake_commands/EjectCoral.java b/src/main/java/frc/robot/commands/intake_commands/EjectCoral.java index cf51ae4..8c276f5 100644 --- a/src/main/java/frc/robot/commands/intake_commands/EjectCoral.java +++ b/src/main/java/frc/robot/commands/intake_commands/EjectCoral.java @@ -4,6 +4,7 @@ package frc.robot.commands.intake_commands; +import edu.wpi.first.wpilibj.Timer; import edu.wpi.first.wpilibj2.command.Command; import frc.robot.Constants.IntakeConstants; import frc.robot.subsystems.IntakeSystem; @@ -11,6 +12,7 @@ /* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ public class EjectCoral extends Command { private final IntakeSystem intakeSystem; + private Timer timer = new Timer(); /** Creates a new EjectCoral. */ public EjectCoral(final IntakeSystem intakeSystem) { @@ -23,6 +25,7 @@ public EjectCoral(final IntakeSystem intakeSystem) { @Override public void initialize() { intakeSystem.run(-IntakeConstants.EJECT_MOTOR_SPEED); + timer.start(); } // Called every time the scheduler runs while the command is scheduled. @@ -38,6 +41,6 @@ public void end(boolean interrupted) { // Returns true when the command should end. @Override public boolean isFinished() { - return !intakeSystem.hasCoral(); + return timer.get() > IntakeConstants.EJECT_TIME; } } diff --git a/src/main/java/frc/robot/commands/intake_commands/PlaceCoral.java b/src/main/java/frc/robot/commands/intake_commands/PlaceCoral.java index e31aa82..b0b7f66 100644 --- a/src/main/java/frc/robot/commands/intake_commands/PlaceCoral.java +++ b/src/main/java/frc/robot/commands/intake_commands/PlaceCoral.java @@ -4,6 +4,7 @@ package frc.robot.commands.intake_commands; +import edu.wpi.first.wpilibj.Timer; import edu.wpi.first.wpilibj2.command.Command; import frc.robot.Constants.IntakeConstants; import frc.robot.subsystems.IntakeSystem; @@ -11,6 +12,7 @@ /* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ public class PlaceCoral extends Command { private final IntakeSystem intakeSystem; + private Timer timer = new Timer(); /** Creates a new PlaceCoral. */ public PlaceCoral(final IntakeSystem intakeSystem) { @@ -23,6 +25,7 @@ public PlaceCoral(final IntakeSystem intakeSystem) { @Override public void initialize() { intakeSystem.run(-IntakeConstants.PLACE_MOTOR_SPEED); + timer.start(); } // Called every time the scheduler runs while the command is scheduled. @@ -38,6 +41,6 @@ public void end(boolean interrupted) { // Returns true when the command should end. @Override public boolean isFinished() { - return !intakeSystem.hasCoral(); + return timer.get() > IntakeConstants.PLACE_TIME; } } diff --git a/src/main/java/frc/robot/parsing/PositionDetails.java b/src/main/java/frc/robot/parsing/PositionDetails.java index 634760d..d503fc9 100644 --- a/src/main/java/frc/robot/parsing/PositionDetails.java +++ b/src/main/java/frc/robot/parsing/PositionDetails.java @@ -23,14 +23,19 @@ public class PositionDetails { public Dictionary reefTags = new Hashtable<>(); public class Stage { - public double verticalPos; public double leftOffset; public double rightOffset; + public double elevatorPos; + public double elbowPos; + public double wristPos; + public Stage(JsonNode stageJSON) { - this.verticalPos = stageJSON.get("verticalPos").asDouble(); this.leftOffset = stageJSON.get("horizontalOffsets").get("left").asDouble(); this.rightOffset = stageJSON.get("horizontalOffsets").get("right").asDouble(); + this.elevatorPos = stageJSON.get("systemPositions").get("elevator").asDouble(); + this.elbowPos = stageJSON.get("systemPositions").get("elbow").asDouble(); + this.wristPos = stageJSON.get("systemPositions").get("wrist").asDouble(); } } @@ -56,27 +61,59 @@ public PositionDetails() { } /** - * Get vertical position for the algae for the specified tag + * Get elevator position for the algae * @param tagID - red oriented tag IDs ie: blue 17 -> red 6 - * @return a double representing the vertical position + * @return a double representing the elevator position */ - public double getAlgaeVerticalPos(int tagID) { - return reefTags.get(tagID).getAlgaeVerticalPos(); + public double getElevatorPosAtAlgae(int tagID) { + return reefTags.get(tagID).getElevatorPosAtAlgae(); } /** - * Get vertical position for the specified stage + * Get elbow position for the algae + * @param tagID - red oriented tag IDs ie: blue 17 -> red 6 + * @return a double representing the elbow position + */ + public double getElbowPosAtAlgae(int tagID) { + return reefTags.get(tagID).getElbowPosAtAlgae(); + } + /** + * Get wrist position for the algae + * @param tagID - red oriented tag IDs ie: blue 17 -> red 6 + * @return a double representing the wrist position + */ + public double getWristPosAtAlgae(int tagID) { + return reefTags.get(tagID).getWristPosAtAlgae(); + } + /** + * Get elevator position for the specified stage + * @param stage - one-indexed ie: 1,2,3,4 + * @return a double representing the elevator position + */ + public double getElevatorPosAtStage(int stage) { + return corals[stage - 1].elevatorPos; + } + /** + * Get elbow position for the specified stage + * @param stage - one-indexed ie: 1,2,3,4 + * @return a double representing the elbow position + */ + public double getElbowPosAtStage(int stage) { + return corals[stage - 1].elbowPos; + } + /** + * Get wrist position for the specified stage * @param stage - one-indexed ie: 1,2,3,4 - * @return a double representing the vertical position + * @return a double representing the wrist position */ - public double getCoralVerticalPos(int stage) { - return corals[stage - 1].verticalPos; + public double getWristPosAtStage(int stage) { + return corals[stage - 1].wristPos; } /** * Get left offset for the specified stage * @param stage - one-indexed ie: 1,2,3,4 * @return a double representing the left offset */ - public double getLeftOffset(int stage) { + public double getLeftOffsetAtStage(int stage) { return corals[stage - 1].leftOffset; } /** @@ -84,7 +121,7 @@ public double getLeftOffset(int stage) { * @param stage - one-indexed ie: 1,2,3,4 * @return a double representing the right offset */ - public double getRightOffset(int stage) { + public double getRightOffsetAtStage(int stage) { return corals[stage - 1].rightOffset; } } diff --git a/src/main/java/frc/robot/parsing/ReefTag.java b/src/main/java/frc/robot/parsing/ReefTag.java index ed40583..2f5a526 100644 --- a/src/main/java/frc/robot/parsing/ReefTag.java +++ b/src/main/java/frc/robot/parsing/ReefTag.java @@ -11,18 +11,38 @@ public class ReefTag { public int tagID; public String face; public double algaeVerticalPos; + public double elevatorPos; + public double elbowPos; + public double wristPos; public ReefTag(JsonNode tagJSON, int tagID) { this.tagID = tagID; // TODO: Try to get tag ID from tagJSON this.face = tagJSON.get("face").asText(); this.algaeVerticalPos = tagJSON.get("algaeVerticalPos").asDouble(); + this.elevatorPos = tagJSON.get("systemPositions").get("elevator").asDouble(); + this.elbowPos = tagJSON.get("systemPositions").get("elbow").asDouble(); + this.wristPos = tagJSON.get("systemPositions").get("wrist").asDouble(); } /** - * Get vertical position for the algae - * @return a double representing the vertical position + * Get elevator position for the algae + * @return a double representing the elevator position */ - public double getAlgaeVerticalPos() { + public double getElevatorPosAtAlgae() { + return algaeVerticalPos; + } + /** + * Get elbow position for the algae + * @return a double representing the elbow position + */ + public double getElbowPosAtAlgae() { + return algaeVerticalPos; + } + /** + * Get wrist position for the algae + * @return a double representing the wrist position + */ + public double getWristPosAtAlgae() { return algaeVerticalPos; } } \ No newline at end of file diff --git a/src/main/java/frc/robot/subsystems/ElevatorSystem.java b/src/main/java/frc/robot/subsystems/ElevatorSystem.java index b2fc67a..942169f 100644 --- a/src/main/java/frc/robot/subsystems/ElevatorSystem.java +++ b/src/main/java/frc/robot/subsystems/ElevatorSystem.java @@ -18,10 +18,8 @@ public class ElevatorSystem extends SubsystemBase implements PosUtils { private static SparkMax motor = new SparkMax(ElevatorConstants.ELEVATOR_MOTOR_ID, MotorType.kBrushless); private static AnalogInput pot = new AnalogInput(ElevatorConstants.ELEVATOR_POT_ID); - private static DigitalInput stage1Limit = new DigitalInput(ElevatorConstants.ELEVATOR_STAGE_1_LIMIT_ID); - private static DigitalInput stage2Limit = new DigitalInput(ElevatorConstants.ELEVATOR_STAGE_2_LIMIT_ID); - private static DigitalInput stage3Limit = new DigitalInput(ElevatorConstants.ELEVATOR_STAGE_3_LIMIT_ID); - private static DigitalInput stage4Limit = new DigitalInput(ElevatorConstants.ELEVATOR_STAGE_4_LIMIT_ID); + private static DigitalInput bottomLimit = new DigitalInput(ElevatorConstants.ELEVATOR_STAGE_1_LIMIT_ID); + private static DigitalInput topLimit = new DigitalInput(ElevatorConstants.ELEVATOR_STAGE_4_LIMIT_ID); private static PIDController PID = ElevatorConstants.ELEVATOR_PID; /** Creates a new ElevatorSystem. */ @@ -39,30 +37,16 @@ private double getPos() { return pot.getValue(); } - public boolean atStage(int stage) { - switch (stage) { - case 1: return atStage1(); - case 2: return atStage2(); - case 3: return atStage3(); - case 4: return atStage4(); - default: return false; - } + public boolean atStage(boolean top) { + return top? atTop() : atBottom(); } - public boolean atStage1() { - return stage1Limit.get(); + public boolean atBottom() { + return bottomLimit.get(); } - public boolean atStage2() { - return stage2Limit.get(); - } - - public boolean atStage3() { - return stage3Limit.get(); - } - - public boolean atStage4() { - return stage4Limit.get(); + public boolean atTop() { + return topLimit.get(); } public double getNewSpeed(double desiredPos) { diff --git a/src/main/java/frc/robot/subsystems/IntakeSystem.java b/src/main/java/frc/robot/subsystems/IntakeSystem.java index 0b6cf5e..2d756e0 100644 --- a/src/main/java/frc/robot/subsystems/IntakeSystem.java +++ b/src/main/java/frc/robot/subsystems/IntakeSystem.java @@ -14,8 +14,6 @@ public class IntakeSystem extends SubsystemBase { private static SparkMax motor = new SparkMax(IntakeConstants.INTAKE_MOTOR_ID, MotorType.kBrushless); private static DigitalInput sensor = new DigitalInput(IntakeConstants.INTAKE_SENSOR_ID); - // private static DigitalInput sensor2 = new DigitalInput(IntakeConstants.INTAKE_SENSOR2_ID); - /** Creates a new IntakeSystem. */ public IntakeSystem() {} @@ -28,10 +26,6 @@ public boolean hasCoral() { return sensor.get(); } - /* public boolean fullIntake() { - return sensor2.get(); - } */ - @Override public void periodic() { // This method will be called once per scheduler run