Skip to content

Commit 43405bb

Browse files
committed
2 parents 9e5bb0b + 8164a75 commit 43405bb

File tree

11 files changed

+245
-11
lines changed

11 files changed

+245
-11
lines changed

.Glass/glass.json

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,17 @@
2222
"Launcher": {
2323
"Amp": {
2424
"open": true
25+
}
26+
},
27+
"Swerve": {
28+
"Modules": {
29+
"Back Left": {
30+
"open": true
31+
},
32+
"Back Right": {
33+
"open": true
34+
},
35+
"open": true
2536
},
2637
"open": true
2738
},
@@ -30,7 +41,15 @@
3041
},
3142
"types": {
3243
"/FMSInfo": "FMSInfo",
33-
"/SmartDashboard/Autonomous": "String Chooser"
44+
"/SmartDashboard/Autonomous": "String Chooser",
45+
"/SmartDashboard/Field": "Field2d"
46+
},
47+
"windows": {
48+
"/SmartDashboard/Autonomous": {
49+
"window": {
50+
"visible": true
51+
}
52+
}
3453
}
3554
},
3655
"NetworkTables Info": {
@@ -83,5 +102,6 @@
83102
}
84103
]
85104
}
86-
}
105+
},
106+
"enterKey": 92
87107
}

.pathplanner/settings.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"robotWidth": 0.9,
3+
"robotLength": 0.9,
4+
"holonomicMode": false,
5+
"pathFolders": [],
6+
"autoFolders": [],
7+
"defaultMaxVel": 3.0,
8+
"defaultMaxAccel": 3.0,
9+
"defaultMaxAngVel": 540.0,
10+
"defaultMaxAngAccel": 720.0,
11+
"maxModuleSpeed": 4.5
12+
}

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
plugins {
22
id "java"
3-
id "edu.wpi.first.GradleRIO" version "2024.1.1"
3+
id "edu.wpi.first.GradleRIO" version "2024.2.1"
44
id "com.diffplug.spotless" version "6.22.0"
55
}
66

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{
2+
"version": 1.0,
3+
"startingPose": null,
4+
"command": {
5+
"type": "sequential",
6+
"data": {
7+
"commands": [
8+
{
9+
"type": "path",
10+
"data": {
11+
"pathName": "1 Note Part 1"
12+
}
13+
},
14+
{
15+
"type": "path",
16+
"data": {
17+
"pathName": "1 Note Part 2"
18+
}
19+
},
20+
{
21+
"type": "named",
22+
"data": {
23+
"name": "LauncherLaunch"
24+
}
25+
}
26+
]
27+
}
28+
},
29+
"folder": null,
30+
"choreoAuto": false
31+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +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]]}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{
2+
"version": 1.0,
3+
"waypoints": [
4+
{
5+
"anchor": {
6+
"x": 0.8574827844100136,
7+
"y": 4.028517436664504
8+
},
9+
"prevControl": null,
10+
"nextControl": {
11+
"x": 0.8617584596280307,
12+
"y": 4.017650095485377
13+
},
14+
"isLocked": false,
15+
"linkedName": null
16+
},
17+
{
18+
"anchor": {
19+
"x": 2.8779768624352067,
20+
"y": 4.781214428169598
21+
},
22+
"prevControl": {
23+
"x": 2.0779768624352064,
24+
"y": 4.781214428169598
25+
},
26+
"nextControl": null,
27+
"isLocked": false,
28+
"linkedName": null
29+
}
30+
],
31+
"rotationTargets": [],
32+
"constraintZones": [],
33+
"eventMarkers": [],
34+
"globalConstraints": {
35+
"maxVelocity": 3.0,
36+
"maxAcceleration": 3.0,
37+
"maxAngularVelocity": 540.0,
38+
"maxAngularAcceleration": 720.0
39+
},
40+
"goalEndState": {
41+
"velocity": 0,
42+
"rotation": 0,
43+
"rotateFast": false
44+
},
45+
"reversed": false,
46+
"folder": null,
47+
"previewStartingState": null,
48+
"useDefaultConstraints": false
49+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{
2+
"version": 1.0,
3+
"waypoints": [
4+
{
5+
"anchor": {
6+
"x": 2.88,
7+
"y": 4.78
8+
},
9+
"prevControl": null,
10+
"nextControl": {
11+
"x": 2.235378507794053,
12+
"y": 4.985437304207942
13+
},
14+
"isLocked": false,
15+
"linkedName": null
16+
},
17+
{
18+
"anchor": {
19+
"x": 1.3921797241742635,
20+
"y": 5.5760149436965545
21+
},
22+
"prevControl": {
23+
"x": 2.4431478839872605,
24+
"y": 5.5760149436965545
25+
},
26+
"nextControl": null,
27+
"isLocked": false,
28+
"linkedName": null
29+
}
30+
],
31+
"rotationTargets": [],
32+
"constraintZones": [],
33+
"eventMarkers": [],
34+
"globalConstraints": {
35+
"maxVelocity": 3.0,
36+
"maxAcceleration": 3.0,
37+
"maxAngularVelocity": 540.0,
38+
"maxAngularAcceleration": 720.0
39+
},
40+
"goalEndState": {
41+
"velocity": 0,
42+
"rotation": -50.079173387765984,
43+
"rotateFast": false
44+
},
45+
"reversed": true,
46+
"folder": null,
47+
"previewStartingState": null,
48+
"useDefaultConstraints": false
49+
}

src/main/java/com/stuypulse/robot/RobotContainer.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55

66
package com.stuypulse.robot;
77

8+
import com.pathplanner.lib.auto.AutoBuilder;
9+
import com.pathplanner.lib.auto.NamedCommands;
810
import com.stuypulse.robot.commands.auton.DoNothingAuton;
911
import com.stuypulse.robot.commands.drivetrain.DrivetrainDrive;
1012
import com.stuypulse.robot.commands.launcher.LaunchPrepare;
13+
import com.stuypulse.robot.commands.launcher.LaunchPrepare;
1114
import com.stuypulse.robot.commands.launcher.LauncherHoldSpeed;
1215
import com.stuypulse.robot.commands.launcher.LauncherLaunchSpeaker;
1316
import com.stuypulse.robot.commands.launcher.LauncherIntakeNote;
@@ -44,6 +47,7 @@ public class RobotContainer {
4447
public RobotContainer() {
4548
configureDefaultCommands();
4649
configureButtonBindings();
50+
configureNamedCommands();
4751
configureAutons();
4852
}
4953

@@ -56,6 +60,14 @@ private void configureDefaultCommands() {
5660
launcher.setDefaultCommand(new LauncherHoldSpeed(Settings.Launcher.LAUNCHER_SPEAKER_SPEED));
5761
}
5862

63+
/**********************/
64+
/*** NAMED COMMANDS ***/
65+
/**********************/
66+
67+
private void configureNamedCommands() {
68+
NamedCommands.registerCommand("LauncherLaunch", new LauncherLaunchSpeaker());
69+
}
70+
5971
/***************/
6072
/*** BUTTONS ***/
6173
/***************/
@@ -70,7 +82,7 @@ private void configureDriverBindings() {
7082
.whileTrue(new LauncherIntakeNote());
7183

7284
driver.getBottomButton()
73-
.whileTrue(new LaunchPrepare(Settings.Launcher.LAUNCHER_AMP_SPEED, Settings.Launcher.AMP_THRESHOLD_RPM).andThen(new LauncherLaunch(Settings.Launcher.FEEDER_AMP_SPEED, Settings.Launcher.LAUNCHER_AMP_SPEED)));
85+
.whileTrue(new LaunchPrepare(Settings.Launcher.LAUNCHER_SPEAKER_SPEED, Settings.Launcher.SPEAKER_THRESHOLD_RPM).andThen(new LauncherLaunchSpeaker()));
7486
}
7587

7688
private void configureOperatorBindings() {}
@@ -80,7 +92,7 @@ private void configureOperatorBindings() {}
8092
/**************/
8193

8294
public void configureAutons() {
83-
autonChooser.setDefaultOption("Do Nothing", new DoNothingAuton());
95+
autonChooser = AutoBuilder.buildAutoChooser();
8496

8597
SmartDashboard.putData("Autonomous", autonChooser);
8698
}

src/main/java/com/stuypulse/robot/constants/Settings.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ public interface Launcher {
4949
double LAUNCHER_INTAKE_SPEED = -1;
5050
double FEEDER_INTAKE_SPEED = -0.2;
5151

52-
SmartNumber AMP_THRESHOLD_RPM = new SmartNumber("Launcher/Amp/Threshold RPM", 4000);
52+
SmartNumber AMP_THRESHOLD_RPM = new SmartNumber("Launcher/Amp/Threshold RPM", 2250);
5353

54-
SmartNumber LAUNCHER_AMP_SPEED = new SmartNumber("Launcher/Amp/Launcher Speed", 0.7);
55-
SmartNumber FEEDER_AMP_SPEED = new SmartNumber("Launcher/Amp/Feeder Speed", 0.7);
54+
SmartNumber LAUNCHER_AMP_SPEED = new SmartNumber("Launcher/Amp/Launcher Speed", 0.4);
55+
SmartNumber FEEDER_AMP_SPEED = new SmartNumber("Launcher/Amp/Feeder Speed", 0.4);
5656
}
5757

5858
public interface Alignment {

src/main/java/com/stuypulse/robot/subsystems/drivetrain/AbstractDrivetrain.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.stuypulse.stuylib.math.Angle;
44

5+
import edu.wpi.first.math.geometry.Rotation2d;
56
import edu.wpi.first.wpilibj.RobotBase;
67
import edu.wpi.first.wpilibj2.command.SubsystemBase;
78

src/main/java/com/stuypulse/robot/subsystems/drivetrain/Drivetrain.java

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,27 @@
77
import com.stuypulse.robot.constants.Ports;
88
import com.stuypulse.robot.constants.Settings;
99
import com.stuypulse.stuylib.math.Angle;
10-
10+
import com.pathplanner.lib.auto.AutoBuilder;
11+
import com.pathplanner.lib.util.ReplanningConfig;
12+
13+
import edu.wpi.first.math.geometry.Pose2d;
14+
import edu.wpi.first.math.geometry.Rotation2d;
15+
import edu.wpi.first.math.kinematics.ChassisSpeeds;
16+
import edu.wpi.first.math.kinematics.DifferentialDriveKinematics;
17+
import edu.wpi.first.math.kinematics.DifferentialDriveOdometry;
18+
import edu.wpi.first.math.kinematics.DifferentialDriveWheelPositions;
19+
import edu.wpi.first.math.util.Units;
20+
import edu.wpi.first.wpilibj.DriverStation;
1121
import edu.wpi.first.wpilibj.drive.DifferentialDrive;
1222
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
1323

1424
public class Drivetrain extends AbstractDrivetrain {
25+
1526
private final DifferentialDrive drivetrain;
1627

28+
private final DifferentialDriveKinematics kinematics;
29+
private final DifferentialDriveOdometry odometry;
30+
1731
private final CANSparkMax leftFront;
1832
private final CANSparkMax leftBack;
1933
private final CANSparkMax rightFront;
@@ -36,6 +50,25 @@ public Drivetrain() {
3650
Motors.Drivetrain.RIGHT.configure(rightBack);
3751

3852
drivetrain = new DifferentialDrive(leftFront, rightFront);
53+
54+
kinematics = new DifferentialDriveKinematics(Units.inchesToMeters(24));
55+
odometry = new DifferentialDriveOdometry(new Rotation2d(), getLeftDistance(), getRightDistance());
56+
57+
AutoBuilder.configureRamsete(
58+
this::getPose,
59+
this::resetPose,
60+
this::getCurrentSpeeds,
61+
this::drive,
62+
new ReplanningConfig(),
63+
() -> {
64+
var alliance = DriverStation.getAlliance();
65+
if (alliance.isPresent()) {
66+
return alliance.get() == DriverStation.Alliance.Red;
67+
}
68+
return false;
69+
},
70+
this
71+
);
3972
}
4073

4174
//********** GETTERS **********//
@@ -74,8 +107,28 @@ public double getDistance() {
74107
public Angle getAngle() {
75108
return Angle.fromDegrees(Math.toDegrees(getLeftDistance() - getRightDistance() / Settings.Drivetrain.TRACK_WIDTH));
76109
}
77-
78-
//********** Drive Methods **********//
110+
111+
private DifferentialDriveWheelPositions getWheelPositions() {
112+
return new DifferentialDriveWheelPositions(getLeftDistance(), getRightDistance());
113+
}
114+
115+
public Pose2d getPose() {
116+
return odometry.getPoseMeters();
117+
}
118+
119+
public void resetPose(Pose2d pose) {
120+
odometry.resetPosition(new Rotation2d(), getWheelPositions(), pose);
121+
}
122+
123+
private double getAngularVelocity() {
124+
return (getLeftSpeed() - getRightSpeed()) / Units.inchesToMeters(26);
125+
}
126+
127+
public ChassisSpeeds getCurrentSpeeds() {
128+
return new ChassisSpeeds(getVelocity(), 0, getAngularVelocity());
129+
}
130+
131+
//********** Drive Methods **********//
79132
public void tankDriveVolts(double leftVolts, double rightVolts) {
80133
leftFront.setVoltage(leftVolts);
81134
rightFront.setVoltage(rightVolts);
@@ -94,6 +147,10 @@ public void curvatureDrive(double speed, double rotation, boolean isQuickTurn) {
94147
drivetrain.curvatureDrive(speed, rotation, isQuickTurn);
95148
}
96149

150+
public void drive(ChassisSpeeds speeds) {
151+
drivetrain.arcadeDrive(speeds.vxMetersPerSecond, speeds.omegaRadiansPerSecond);
152+
}
153+
97154
public CANSparkMax[] getMotors() {
98155
return new CANSparkMax[] {
99156
rightFront, leftFront, rightBack, leftBack
@@ -122,6 +179,8 @@ public void stop() {
122179

123180
@Override
124181
public void periodicChild() {
182+
odometry.update(new Rotation2d(), getWheelPositions());
183+
125184
SmartDashboard.putNumber("Drivetrain/Left Speed", getLeftSpeed());
126185
SmartDashboard.putNumber("Drivetrain/Right Speed", getRightSpeed());
127186

0 commit comments

Comments
 (0)