Skip to content

Commit 0dfc54c

Browse files
Added support for pathplanner.
1 parent b36dc60 commit 0dfc54c

File tree

8 files changed

+171
-10
lines changed

8 files changed

+171
-10
lines changed

.pathplanner/settings.json

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"robotWidth": 0.9,
3+
"robotLength": 0.9,
4+
"holonomicMode": true,
5+
"pathFolders": [
6+
"New Folder"
7+
],
8+
"autoFolders": [],
9+
"defaultMaxVel": 3.0,
10+
"defaultMaxAccel": 3.0,
11+
"defaultMaxAngVel": 540.0,
12+
"defaultMaxAngAccel": 720.0,
13+
"maxModuleSpeed": 4.5,
14+
"choreoProjectPath": null
15+
}

simgui.json

+13-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,16 @@
2121
"open": true
2222
}
2323
},
24+
"Talon FX (v6)[2]/Rotor Sensor": {
25+
"header": {
26+
"open": true
27+
}
28+
},
29+
"Talon FX (v6)[51]": {
30+
"header": {
31+
"open": true
32+
}
33+
},
2434
"Talon FX[50]": {
2535
"header": {
2636
"open": true
@@ -51,9 +61,11 @@
5161
"/LiveWindow/Ungrouped/Pigeon 2 [13]": "Gyro",
5262
"/LiveWindow/Ungrouped/Scheduler": "Scheduler",
5363
"/SmartDashboard/Field": "Field2d",
64+
"/SmartDashboard/Pigeon 2 (v6) [13]": "Gyro",
5465
"/SmartDashboard/Pigeon 2 [13]": "Gyro",
5566
"/SmartDashboard/SendableChooser[0]": "String Chooser",
56-
"/SmartDashboard/navX-Sensor[1]": "Gyro"
67+
"/SmartDashboard/navX-Sensor[1]": "Gyro",
68+
"/SmartDashboard/navX-Sensor[4]": "Gyro"
5769
},
5870
"windows": {
5971
"/SmartDashboard/Field": {
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"field_size":{"x":16.54,"y":8.02},"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,false,false,false,false,false,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,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,true,true,true,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,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,true,true,true,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,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,true,true,true,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,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,true,true,true,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,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,true,true,true,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,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,true,true,true,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,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,true,true,true,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,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,true,true,true,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,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,true,true,true,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,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,true,true,true,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,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,true,true,true,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,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,true,true,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,true,true,true,true,true,true,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,true,true,true,true,true,true,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,true,true,true,true,true,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,true,true,true,true,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,true,true,true,true,true,true,true,true,true,true,true,true,true,true],[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,true,true,true,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,false,false,false,false,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,false,false,false,false,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,false,false,false,false,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,false,false,false,false,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]]}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
{
2+
"version": 1.0,
3+
"waypoints": [
4+
{
5+
"anchor": {
6+
"x": 2.0,
7+
"y": 7.0
8+
},
9+
"prevControl": null,
10+
"nextControl": {
11+
"x": 3.0,
12+
"y": 6.5
13+
},
14+
"isLocked": false,
15+
"linkedName": null
16+
},
17+
{
18+
"anchor": {
19+
"x": 5.0,
20+
"y": 5.0
21+
},
22+
"prevControl": {
23+
"x": 4.0,
24+
"y": 6.0
25+
},
26+
"nextControl": {
27+
"x": 6.0,
28+
"y": 4.0
29+
},
30+
"isLocked": false,
31+
"linkedName": null
32+
},
33+
{
34+
"anchor": {
35+
"x": 7.225280307703473,
36+
"y": 6.012192024384049
37+
},
38+
"prevControl": {
39+
"x": 6.975280307703473,
40+
"y": 7.512192024384059
41+
},
42+
"nextControl": null,
43+
"isLocked": false,
44+
"linkedName": null
45+
}
46+
],
47+
"rotationTargets": [],
48+
"constraintZones": [],
49+
"eventMarkers": [],
50+
"globalConstraints": {
51+
"maxVelocity": 3.0,
52+
"maxAcceleration": 3.0,
53+
"maxAngularVelocity": 540.0,
54+
"maxAngularAcceleration": 720.0
55+
},
56+
"goalEndState": {
57+
"velocity": 0,
58+
"rotation": 0,
59+
"rotateFast": false
60+
},
61+
"reversed": false,
62+
"folder": null,
63+
"previewStartingState": null,
64+
"useDefaultConstraints": false
65+
}

src/main/java/frc/robot/Constants.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,9 @@ public final class Constants
2727
public static final class Auton
2828
{
2929

30-
public static final PIDFConfig xAutoPID = new PIDFConfig(0.7, 0, 0);
31-
public static final PIDFConfig yAutoPID = new PIDFConfig(0.7, 0, 0);
30+
public static final PIDFConfig TranslationPID = new PIDFConfig(0.7, 0, 0);
3231
public static final PIDFConfig angleAutoPID = new PIDFConfig(0.4, 0, 0.01);
3332

34-
public static final double MAX_SPEED = 4;
3533
public static final double MAX_ACCELERATION = 2;
3634
}
3735

src/main/java/frc/robot/RobotContainer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ private void configureBindings()
118118
public Command getAutonomousCommand()
119119
{
120120
// An example command will be run in autonomous
121-
return null;
121+
return drivebase.getAutonomousCommand("New Path", true);
122122
}
123123

124124
public void setDriveMode()

src/main/java/frc/robot/subsystems/swervedrive/SwerveSubsystem.java

+64-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44

55
package frc.robot.subsystems.swervedrive;
66

7+
import com.pathplanner.lib.auto.AutoBuilder;
8+
import com.pathplanner.lib.path.PathPlannerPath;
9+
import com.pathplanner.lib.util.HolonomicPathFollowerConfig;
10+
import com.pathplanner.lib.util.PIDConstants;
11+
import com.pathplanner.lib.util.ReplanningConfig;
712
import edu.wpi.first.math.geometry.Pose2d;
813
import edu.wpi.first.math.geometry.Rotation2d;
914
import edu.wpi.first.math.geometry.Translation2d;
@@ -15,8 +20,6 @@
1520
import edu.wpi.first.wpilibj2.command.Command;
1621
import edu.wpi.first.wpilibj2.command.SubsystemBase;
1722
import java.io.File;
18-
import java.util.List;
19-
import java.util.Map;
2023
import swervelib.SwerveController;
2124
import swervelib.SwerveDrive;
2225
import swervelib.math.SwerveMath;
@@ -32,11 +35,11 @@ public class SwerveSubsystem extends SubsystemBase
3235
/**
3336
* Swerve drive object.
3437
*/
35-
private final SwerveDrive swerveDrive;
38+
private final SwerveDrive swerveDrive;
3639
/**
3740
* Maximum speed of the robot in meters per second, used to limit acceleration.
3841
*/
39-
public double maximumSpeed = Units.feetToMeters(14.5);
42+
public double maximumSpeed = Units.feetToMeters(14.5);
4043

4144
/**
4245
* Initialize {@link SwerveDrive} with the directory provided.
@@ -71,6 +74,57 @@ public SwerveSubsystem(File directory)
7174
throw new RuntimeException(e);
7275
}
7376
swerveDrive.setHeadingCorrection(false); // Heading correction should only be used while controlling the robot via angle.
77+
78+
setupPathPlanner();
79+
}
80+
81+
/**
82+
* Setup AutoBuilder for PathPlanner.
83+
*/
84+
public void setupPathPlanner()
85+
{
86+
AutoBuilder.configureHolonomic(
87+
this::getPose, // Robot pose supplier
88+
this::resetOdometry, // Method to reset odometry (will be called if your auto has a starting pose)
89+
this::getRobotVelocity, // ChassisSpeeds supplier. MUST BE ROBOT RELATIVE
90+
this::setChassisSpeeds, // Method that will drive the robot given ROBOT RELATIVE ChassisSpeeds
91+
new HolonomicPathFollowerConfig( // HolonomicPathFollowerConfig, this should likely live in your Constants class
92+
new PIDConstants(5.0, 0.0, 0.0),
93+
// Translation PID constants
94+
new PIDConstants(swerveDrive.swerveController.config.headingPIDF.p,
95+
swerveDrive.swerveController.config.headingPIDF.i,
96+
swerveDrive.swerveController.config.headingPIDF.d),
97+
// Rotation PID constants
98+
4.5,
99+
// Max module speed, in m/s
100+
swerveDrive.swerveDriveConfiguration.getDriveBaseRadiusMeters(),
101+
// Drive base radius in meters. Distance from robot center to furthest module.
102+
new ReplanningConfig()
103+
// Default path replanning config. See the API for the options here
104+
),
105+
this // Reference to this subsystem to set requirements
106+
);
107+
}
108+
109+
/**
110+
* Get the path follower with events.
111+
*
112+
* @param pathName PathPlanner path name.
113+
* @param setOdomToStart Set the odometry position to the start of the path.
114+
* @return {@link AutoBuilder#followPathWithEvents(PathPlannerPath)} path command.
115+
*/
116+
public Command getAutonomousCommand(String pathName, boolean setOdomToStart)
117+
{
118+
// Load the path you want to follow using its name in the GUI
119+
PathPlannerPath path = PathPlannerPath.fromPathFile(pathName);
120+
121+
if (setOdomToStart)
122+
{
123+
resetOdometry(path.getStartingDifferentialPose());
124+
}
125+
126+
// Create a path following command using AutoBuilder. This will also trigger event markers.
127+
return AutoBuilder.followPathWithEvents(path);
74128
}
75129

76130
/**
@@ -230,7 +284,12 @@ public ChassisSpeeds getTargetSpeeds(double xInput, double yInput, double headin
230284
{
231285
xInput = Math.pow(xInput, 3);
232286
yInput = Math.pow(yInput, 3);
233-
return swerveDrive.swerveController.getTargetSpeeds(xInput, yInput, headingX, headingY, getHeading().getRadians(), maximumSpeed);
287+
return swerveDrive.swerveController.getTargetSpeeds(xInput,
288+
yInput,
289+
headingX,
290+
headingY,
291+
getHeading().getRadians(),
292+
maximumSpeed);
234293
}
235294

236295
/**

src/main/java/swervelib/parser/SwerveDriveConfiguration.java

+11
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,15 @@ public SwerveModule[] createModules(SwerveModuleConfiguration[] swerves, SimpleM
8181
}
8282
return modArr;
8383
}
84+
85+
/**
86+
* Assume the first module is the furthest. Usually front-left.
87+
*
88+
* @return Drive base radius from center of robot to the farthest wheel in meters.
89+
*/
90+
public double getDriveBaseRadiusMeters()
91+
{
92+
Translation2d furthestModule = moduleLocationsMeters[0];
93+
return Math.abs(Math.sqrt(Math.pow(furthestModule.getX(), 2) + Math.pow(furthestModule.getY(), 2)));
94+
}
8495
}

0 commit comments

Comments
 (0)