Skip to content

Commit ccda5ba

Browse files
author
Liam Teltow
committed
Fixed remaining errors
1 parent b9b732b commit ccda5ba

File tree

7 files changed

+106
-453
lines changed

7 files changed

+106
-453
lines changed

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,18 @@
1717
import org.lasarobotics.utils.PIDConstants;
1818
import org.lasarobotics.vision.AprilTagCamera.Resolution;
1919

20+
import com.pathplanner.lib.config.ModuleConfig;
21+
import com.revrobotics.spark.config.SparkFlexConfig;
22+
2023
import edu.wpi.first.apriltag.AprilTag;
2124
import edu.wpi.first.apriltag.AprilTagFieldLayout;
2225
import edu.wpi.first.apriltag.AprilTagFields;
2326
import edu.wpi.first.math.geometry.Rotation2d;
2427
import edu.wpi.first.math.geometry.Rotation3d;
2528
import edu.wpi.first.math.geometry.Transform3d;
2629
import edu.wpi.first.math.geometry.Translation3d;
30+
import edu.wpi.first.math.system.plant.DCMotor;
31+
import edu.wpi.first.math.trajectory.TrapezoidProfile;
2732
import edu.wpi.first.units.Units;
2833
import edu.wpi.first.units.measure.Angle;
2934
import edu.wpi.first.units.measure.Current;
@@ -38,6 +43,8 @@ public static class Field {
3843
public static final AprilTagFieldLayout FIELD_LAYOUT = AprilTagFieldLayout.loadField(AprilTagFields.k2024Crescendo);
3944
public static final AprilTag BLUE_SPEAKER = getTag(7).get();
4045
public static final AprilTag RED_SPEAKER = getTag(4).get();
46+
public static final AprilTag BLUE_AMP = getTag(6).get();
47+
4148

4249
/**
4350
* Get AprilTag from field
@@ -55,6 +62,19 @@ public static class HID {
5562
public static final Dimensionless CONTROLLER_DEADBAND = Units.Percent.of(10);
5663
}
5764

65+
66+
public static class WiggleStick {
67+
68+
public static final SparkFlexConfig WIGGLE_STICK_CONFIG = new SparkFlexConfig();
69+
70+
public static final TrapezoidProfile.Constraints CONSTRAINTS = new TrapezoidProfile.Constraints(10, 20);
71+
}
72+
73+
public static class SmartDashboard {
74+
public static final String SMARTDASHBOARD_DEFAULT_TAB = "SmartDashboard";
75+
public static final String SMARTDASHBOARD_AUTO_MODE = "Auto Mode";
76+
}
77+
5878
public static class Drive {
5979
public static final DriveWheel DRIVE_WHEEL = DriveWheel.create(Units.Inches.of(4.0), Units.Value.of(1.3), Units.Value.of(1.2));
6080
public static final PIDConstants DRIVE_PID = PIDConstants.of(0.3, 0.0, 0.001, 0.0, 0.0);
@@ -86,6 +106,8 @@ public static class Drive {
86106

87107
public static final SwerveX2Module.GearRatio CTRE_GEAR_RATIO = SwerveX2Module.GearRatio.X4_3;
88108
public static final MAXSwerveModule.GearRatio REV_GEAR_RATIO = MAXSwerveModule.GearRatio.L3;
109+
110+
public static final ModuleConfig MODULE_CONFIG = new ModuleConfig(DRIVE_WHEEL.diameter.div(2), Units.MetersPerSecond.of(5.172), 1.3, DCMotor.getKrakenX60Foc(1), DRIVE_CURRENT_LIMIT, 1);
89111
}
90112

91113
public static class CTREDriveHardware {

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

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,11 @@
1111
import edu.wpi.first.wpilibj2.command.Commands;
1212
import edu.wpi.first.wpilibj2.command.button.CommandXboxController;
1313
import frc.robot.subsystems.WaggleSubsystem;
14-
import frc.robot.subsystems.drive.AutoTrajectory;
1514
import frc.robot.subsystems.drive.CTREDriveSubsystem;
1615
import frc.robot.subsystems.drive.REVDriveSubsystem;
1716

1817
public class RobotContainer {
19-
private static final CTREDriveSubsystem CTREDRIVE_SUBSYSTEM = new CTREDriveSubsystem(
18+
private static final CTREDriveSubsystem CTRE_DRIVE_SUBSYSTEM = new CTREDriveSubsystem(
2019
CTREDriveSubsystem.initializeHardware(),
2120
Constants.Drive.DRIVE_ROTATE_PID,
2221
Constants.Drive.DRIVE_AUTO_AIM_PID, Constants.Drive.DRIVE_CONTROL_CENTRICITY,
@@ -27,7 +26,7 @@ public class RobotContainer {
2726
Constants.Drive.DRIVE_LOOKAHEAD
2827
);
2928

30-
private static final REVDriveSubsystem REVDRIVE_SUBSYSTEM = new REVDriveSubsystem(
29+
private static final REVDriveSubsystem REV_DRIVE_SUBSYSTEM = new REVDriveSubsystem(
3130
REVDriveSubsystem.initializeHardware(),
3231
Constants.Drive.DRIVE_ROTATE_PID,
3332
Constants.Drive.DRIVE_AUTO_AIM_PID, Constants.Drive.DRIVE_CONTROL_CENTRICITY,
@@ -46,16 +45,16 @@ public class RobotContainer {
4645

4746
public RobotContainer() {
4847
// Set drive command
49-
CTREDRIVE_SUBSYSTEM.setDefaultCommand(
50-
CTREDRIVE_SUBSYSTEM.driveCommand(
48+
CTRE_DRIVE_SUBSYSTEM.setDefaultCommand(
49+
CTRE_DRIVE_SUBSYSTEM.driveCommand(
5150
() -> PRIMARY_CONTROLLER.getLeftY(),
5251
() -> PRIMARY_CONTROLLER.getLeftX(),
5352
() -> PRIMARY_CONTROLLER.getRightX()
5453
)
5554
);
5655

5756
// Setup AutoBuilder
58-
CTREDRIVE_SUBSYSTEM.configureAutoBuilder();
57+
CTRE_DRIVE_SUBSYSTEM.configureAutoBuilder();
5958

6059
autoModeChooser();
6160
SmartDashboard.putData(Constants.SmartDashboard.SMARTDASHBOARD_AUTO_MODE, m_automodeChooser);
@@ -66,19 +65,9 @@ public RobotContainer() {
6665

6766
private void configureBindings() {
6867
// Start button - toggle traction control
69-
PRIMARY_CONTROLLER.start().onTrue(CTREDRIVE_SUBSYSTEM.toggleTractionControlCommand());
68+
PRIMARY_CONTROLLER.start().onTrue(CTRE_DRIVE_SUBSYSTEM.toggleTractionControlCommand());
7069

71-
// A button - go to amp
72-
PRIMARY_CONTROLLER.a().whileTrue(
73-
CTREDRIVE_SUBSYSTEM.goToPoseCommand(
74-
Constants.Field.AMP
75-
)
76-
);
77-
78-
// B button - go to source
79-
PRIMARY_CONTROLLER.b().whileTrue(CTREDRIVE_SUBSYSTEM.goToPoseCommand(Constants.Field.SOURCE));
80-
81-
PRIMARY_CONTROLLER.povLeft().onTrue(CTREDRIVE_SUBSYSTEM.resetPoseCommand(() -> new Pose2d()));
70+
PRIMARY_CONTROLLER.povLeft().onTrue(CTRE_DRIVE_SUBSYSTEM.resetPoseCommand(() -> new Pose2d()));
8271

8372
// Left/right bumper - wiggle stick
8473
PRIMARY_CONTROLLER.leftBumper().onTrue(WIGGLE_STICK.setPositionCommand(0.0));
@@ -90,9 +79,6 @@ private void configureBindings() {
9079
*/
9180
private void autoModeChooser() {
9281
m_automodeChooser.setDefaultOption("Do nothing", Commands.none());
93-
m_automodeChooser.addOption("Leave", new AutoTrajectory(CTREDRIVE_SUBSYSTEM, "Leave").getCommand());
94-
m_automodeChooser.addOption("Preload + 3 Ring", new AutoTrajectory(CTREDRIVE_SUBSYSTEM, "Preload + 3 Ring").getCommand());
95-
m_automodeChooser.addOption("Preload + 1", new AutoTrajectory(CTREDRIVE_SUBSYSTEM, "Preload + 1").getCommand());
9682
}
9783

9884
/**

src/main/java/frc/robot/subsystems/WaggleSubsystem.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
package frc.robot.subsystems;
66

77
import org.lasarobotics.hardware.revrobotics.Spark;
8-
import org.lasarobotics.hardware.revrobotics.Spark.FeedbackSensor;
98
import org.lasarobotics.hardware.revrobotics.Spark.MotorKind;
10-
import org.lasarobotics.hardware.revrobotics.SparkPIDConfig;
119

12-
import com.revrobotics.CANSparkBase.IdleMode;
10+
import com.revrobotics.spark.SparkBase.ControlType;
11+
import com.revrobotics.spark.config.SparkBaseConfig;
12+
import com.revrobotics.spark.config.SparkBaseConfig.IdleMode;
13+
import com.revrobotics.spark.config.SparkFlexConfig;
14+
import com.revrobotics.spark.config.SparkMaxConfig;
1315

1416
import edu.wpi.first.math.trajectory.TrapezoidProfile.Constraints;
1517
import edu.wpi.first.wpilibj2.command.Command;
@@ -18,33 +20,38 @@
1820

1921
public class WaggleSubsystem extends SubsystemBase {
2022
Spark m_motor;
21-
SparkPIDConfig m_config;
23+
SparkBaseConfig m_config;
2224
Constraints m_constraint;
2325

2426
/** Creates a new wiggleStick. */
25-
public WaggleSubsystem(SparkPIDConfig config, Constraints constraint) {
27+
public WaggleSubsystem(SparkBaseConfig config, Constraints constraint) {
2628
m_motor = new Spark(new Spark.ID("wiggleStick", 20), MotorKind.NEO);
2729
m_config = config;
2830
m_constraint = constraint;
29-
31+
m_config = (m_motor.getKind().equals(MotorKind.NEO_VORTEX)) ? new SparkFlexConfig() : new SparkMaxConfig();
3032
double conversionFactor = 1.0;
31-
m_motor.initializeSparkPID(config, FeedbackSensor.NEO_ENCODER);
32-
m_motor.setPositionConversionFactor(FeedbackSensor.NEO_ENCODER, conversionFactor);
33-
m_motor.setVelocityConversionFactor(FeedbackSensor.NEO_ENCODER, conversionFactor);
33+
m_config.encoder.positionConversionFactor(conversionFactor);
34+
m_config.encoder.velocityConversionFactor(conversionFactor / 60);
35+
m_config.closedLoop.pidf(0.2, 0.0, 0.0, 0);
36+
m_config.closedLoop.maxMotion.maxAcceleration(20);
37+
m_config.closedLoop.maxMotion.maxVelocity(10);
3438

35-
m_motor.enablePIDWrapping(0.0, 15.0);
39+
m_config.closedLoop.positionWrappingEnabled(true);
3640
m_motor.setIdleMode(IdleMode.kCoast);
3741
m_motor.resetEncoder();
3842
}
3943

40-
public void setPosition(double position) {
41-
m_motor.smoothMotion(position, m_constraint);
44+
/** Moves to the given position */
45+
private void setPosition(double position) {
46+
m_motor.set(position, ControlType.kMAXMotionPositionControl);
4247
}
4348

49+
/** Gets the position using the encoders */
4450
public double getPosition() {
4551
return m_motor.getInputs().encoderPosition;
4652
}
4753

54+
/** Command to set the position of the robot */
4855
public Command setPositionCommand(double position) {
4956
return runOnce(() -> setPosition(position));
5057

src/main/java/frc/robot/subsystems/drive/AutoTrajectory.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44

55
package frc.robot.subsystems.drive;
66

7+
import java.io.IOException;
78
import java.util.List;
9+
import java.util.Optional;
810

11+
import org.json.simple.parser.ParseException;
912
import org.lasarobotics.drive.swerve.SwerveDrive;
1013

1114
import com.pathplanner.lib.auto.AutoBuilder;
1215
import com.pathplanner.lib.commands.PathPlannerAuto;
1316
import com.pathplanner.lib.path.GoalEndState;
17+
import com.pathplanner.lib.path.IdealStartingState;
1418
import com.pathplanner.lib.path.PathConstraints;
1519
import com.pathplanner.lib.path.PathPlannerPath;
1620

@@ -28,8 +32,10 @@ public class AutoTrajectory {
2832
* Create new path trajectory using PathPlanner path
2933
* @param driveSubsystem DriveSubsystem to drive the robot
3034
* @param autoName PathPlanner auto name
35+
* @throws IOException if attempting to load a file that does not exist or cannot be read
36+
* @throws ParseException If JSON within file cannot be parsed
3137
*/
32-
public AutoTrajectory(SwerveDrive driveSubsystem, String autoName) {
38+
public AutoTrajectory(SwerveDrive driveSubsystem, String autoName) throws IOException, ParseException {
3339
this.m_driveSubsystem = driveSubsystem;
3440

3541
// Get path
@@ -44,18 +50,19 @@ public AutoTrajectory(SwerveDrive driveSubsystem, String autoName) {
4450
*/
4551
public AutoTrajectory(SwerveDrive driveSubsystem, List<Pose2d> waypoints, PathConstraints pathConstraints) {
4652
this.m_driveSubsystem = driveSubsystem;
53+
IdealStartingState startingState = new IdealStartingState(0, null);
4754

4855
// Generate path from waypoints
4956
m_auto = new Pair<String, List<PathPlannerPath>>("", List.of(new PathPlannerPath(
50-
PathPlannerPath.bezierFromPoses(waypoints),
57+
PathPlannerPath.waypointsFromPoses(waypoints),
5158
pathConstraints,
52-
new GoalEndState(0.0, waypoints.get(waypoints.size() - 1).getRotation())
59+
startingState, new GoalEndState(0.0, waypoints.get(waypoints.size() - 1).getRotation())
5360
)));
5461
}
5562

5663
/** Return initial pose */
57-
public Pose2d getInitialPose() {
58-
return m_auto.getSecond().get(0).getPreviewStartingHolonomicPose();
64+
public Optional<Pose2d> getInitialPose() {
65+
return m_auto.getSecond().get(0).getStartingHolonomicPose();
5966
}
6067

6168
/**
@@ -68,7 +75,7 @@ public Command getCommand() {
6875
: new PathPlannerAuto(m_auto.getFirst());
6976

7077
return Commands.sequence(
71-
m_driveSubsystem.resetPoseCommand(() -> getInitialPose()),
78+
m_driveSubsystem.resetPoseCommand(() -> getInitialPose().orElseThrow(null)),
7279
autoCommand,
7380
m_driveSubsystem.stopCommand(),
7481
m_driveSubsystem.lockCommand()

src/main/java/frc/robot/subsystems/drive/CTREDriveSubsystem.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,23 @@
1212
import org.lasarobotics.hardware.kauailabs.NavX2;
1313
import org.lasarobotics.utils.PIDConstants;
1414
import org.lasarobotics.vision.AprilTagCamera;
15+
16+
import com.pathplanner.lib.auto.AutoBuilder;
17+
import com.pathplanner.lib.config.RobotConfig;
18+
import com.pathplanner.lib.controllers.PPHolonomicDriveController;
19+
1520
import edu.wpi.first.apriltag.AprilTagFieldLayout;
1621
import edu.wpi.first.apriltag.AprilTagFields;
22+
import edu.wpi.first.units.Units;
1723
import edu.wpi.first.units.measure.Angle;
1824
import edu.wpi.first.units.measure.Dimensionless;
1925
import edu.wpi.first.units.measure.Time;
26+
import edu.wpi.first.wpilibj.DriverStation;
2027
import frc.robot.Constants;
2128

2229
public class CTREDriveSubsystem extends SwerveDrive {
2330

31+
Hardware m_drivetrainHardware;
2432
/**
2533
* Create an instance of DriveSubsystem
2634
* <p>
@@ -40,6 +48,7 @@ public CTREDriveSubsystem(Hardware drivetrainHardware, PIDConstants rotatePIDF,
4048
PolynomialSplineFunction throttleInputCurve, PolynomialSplineFunction rotateInputCurve,
4149
Angle rotateScalar, Dimensionless deadband, Time lookAhead) {
4250
super(drivetrainHardware, rotatePIDF, aimPIDF, controlCentricity, throttleInputCurve, rotateInputCurve, rotateScalar, deadband, lookAhead);
51+
m_drivetrainHardware = drivetrainHardware;
4352
}
4453

4554
/**
@@ -157,4 +166,40 @@ public static Hardware initializeHardware() {
157166

158167
return drivetrainHardware;
159168
}
169+
170+
/**Configures the AutoBuilder so that PathPlanner can use its built-in commands when running autos.
171+
* Uses the PathPlanner AutoBuilder method.
172+
*/
173+
174+
public void configureAutoBuilder() {
175+
AutoBuilder.configure(
176+
() -> getPose(), // Robot pose supplier
177+
(pose) -> resetPose(pose), // Method to reset odometry (will be called if your auto has a starting pose)
178+
() -> getChassisSpeeds(), // ChassisSpeeds supplier. MUST BE ROBOT RELATIVE
179+
(speeds, feedforwards) -> autoDrive(speeds), // Method that will drive the robot given ROBOT RELATIVE ChassisSpeeds. Also optionally outputs individual module feedforwards
180+
new PPHolonomicDriveController( // PPHolonomicController is the built in path following controller for holonomic drive trains
181+
new com.pathplanner.lib.config.PIDConstants(5.0, 0.0, 0.0), // Translation PID constants
182+
new com.pathplanner.lib.config.PIDConstants(5.0, 0.0, 0.0) // Rotation PID constants
183+
),
184+
new RobotConfig(Constants.Drive.MASS, // The robot configuration
185+
Units.KilogramSquareMeters.of(1),
186+
Constants.Drive.MODULE_CONFIG,
187+
m_drivetrainHardware.lFrontModule().getModuleCoordinate(),
188+
m_drivetrainHardware.rFrontModule().getModuleCoordinate(),
189+
m_drivetrainHardware.lRearModule().getModuleCoordinate(),
190+
m_drivetrainHardware.rRearModule().getModuleCoordinate()),
191+
() -> {
192+
// Boolean supplier that controls when the path will be mirrored for the red alliance
193+
// This will flip the path being followed to the red side of the field.
194+
// THE ORIGIN WILL REMAIN ON THE BLUE SIDE
195+
196+
var alliance = DriverStation.getAlliance();
197+
if (alliance.isPresent()) {
198+
return alliance.get() == DriverStation.Alliance.Red;
199+
}
200+
return false;
201+
},
202+
this // Reference to this subsystem to set requirements
203+
);
204+
}
160205
}

0 commit comments

Comments
 (0)