Skip to content

Commit ad3acc7

Browse files
Merge pull request #35 from TotalTaxAmount/reef-align
Reef align
2 parents da3f7a2 + f8c27c4 commit ad3acc7

File tree

5 files changed

+121
-12
lines changed

5 files changed

+121
-12
lines changed

src/main/java/frc/robot/Robot.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import edu.wpi.first.wpilibj.TimedRobot;
55
import edu.wpi.first.wpilibj2.command.Command;
66
import edu.wpi.first.wpilibj2.command.CommandScheduler;
7+
import org.littletonrobotics.junction.Logger;
78

89
public class Robot extends TimedRobot {
910
private Command autonomousCommand;

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import edu.wpi.first.wpilibj2.command.RunCommand;
1010
import frc.robot.commands.*;
1111
import frc.robot.constants.*;
12+
import frc.robot.framework.Odometry;
1213
import frc.robot.subsystems.*;
1314
import frc.robot.utils.Camera;
1415
import frc.robot.utils.Controller;
@@ -28,7 +29,7 @@ public class RobotContainer {
2829
private final Camera testCamera =
2930
new Camera("testCam", Camera.CameraType.PHOTONVISION, cameraOffset);
3031

31-
private OdometrySubsystem odometrySubsystem = OdometrySubsystem.getInstance();
32+
private Odometry odometry = Odometry.getInstance();
3233
// Auto Chooser
3334
SendableChooser<Command> superSecretMissileTech = new SendableChooser<>();
3435

@@ -57,11 +58,11 @@ private void configureBindings() {
5758
}
5859

5960
public void robotInit() {
60-
odometrySubsystem.addCamera(testCamera);
61+
odometry.addCamera(testCamera);
6162
}
6263

6364
public void robotPeriodic() {
64-
odometrySubsystem.periodic();
65+
odometry.periodic();
6566
}
6667

6768
public Command getAutonomousCommand() {
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/* Black Knights Robotics (C) 2025 */
2+
package frc.robot.commands;
3+
4+
import edu.wpi.first.math.controller.ProfiledPIDController;
5+
import edu.wpi.first.math.geometry.Pose3d;
6+
import edu.wpi.first.math.geometry.Rotation3d;
7+
import edu.wpi.first.wpilibj2.command.Command;
8+
import frc.robot.constants.AlignConstants;
9+
import frc.robot.framework.Odometry;
10+
import frc.robot.subsystems.SwerveSubsystem;
11+
import frc.robot.utils.ConfigManager;
12+
13+
public class ReefAlignCommand extends Command {
14+
private final SwerveSubsystem swerveSubsystem;
15+
16+
private ProfiledPIDController xAxisPid =
17+
new ProfiledPIDController(
18+
AlignConstants.X_AXIS_P,
19+
AlignConstants.X_AXIS_I,
20+
AlignConstants.X_AXIS_D,
21+
AlignConstants.X_AXIS_CONSTRAINTS);
22+
23+
private ProfiledPIDController yAxisPid =
24+
new ProfiledPIDController(
25+
AlignConstants.Y_AXIS_P,
26+
AlignConstants.Y_AXIS_I,
27+
AlignConstants.Y_AXIS_D,
28+
AlignConstants.Y_AXIS_CONSTRAINTS);
29+
30+
private ProfiledPIDController rotationPid =
31+
new ProfiledPIDController(
32+
AlignConstants.ROTATION_P,
33+
AlignConstants.ROTATION_I,
34+
AlignConstants.ROTATION_D,
35+
AlignConstants.ROTATION_CONSTRAINTS);
36+
37+
private final Odometry odometry = Odometry.getInstance();
38+
private final ConfigManager configManager = ConfigManager.getInstance();
39+
40+
private Pose3d targetPos =
41+
new Pose3d(497.77, 130.17, 0.0, new Rotation3d(0, 0, Math.toRadians(270)));
42+
43+
public ReefAlignCommand(SwerveSubsystem swerveSubsystem) {
44+
this.swerveSubsystem = swerveSubsystem;
45+
46+
this.xAxisPid.setTolerance(configManager.get("reef_align_pos_tolerance", 0.2));
47+
this.yAxisPid.setTolerance(configManager.get("reef_align_pos_tolerance", 0.2));
48+
this.rotationPid.setTolerance(
49+
Math.toRadians(configManager.get("reef_align_rotation_tolerance", 10)));
50+
51+
addRequirements(swerveSubsystem);
52+
}
53+
54+
@Override
55+
public void execute() {
56+
Pose3d robotPose = odometry.getRobotPose();
57+
double xAxisCalc = this.xAxisPid.calculate(robotPose.getX());
58+
double yAxisCalc = this.yAxisPid.calculate(robotPose.getY());
59+
double rotationPidCalc = this.rotationPid.calculate(robotPose.getRotation().getZ());
60+
61+
swerveSubsystem.drive(xAxisCalc, yAxisCalc, rotationPidCalc, true, true);
62+
}
63+
64+
@Override
65+
public void initialize() {
66+
// Reset PIDs to starting pose
67+
Pose3d robotPose = odometry.getRobotPose();
68+
this.xAxisPid.reset(robotPose.getX());
69+
this.yAxisPid.reset(robotPose.getY());
70+
this.rotationPid.reset(robotPose.getRotation().getZ());
71+
72+
// Set PIDs to target
73+
this.xAxisPid.setGoal(targetPos.getX());
74+
this.yAxisPid.setGoal(targetPos.getY());
75+
this.rotationPid.setGoal(targetPos.getRotation().getZ());
76+
}
77+
78+
@Override
79+
public boolean isFinished() {
80+
return xAxisPid.atGoal() && yAxisPid.atGoal() && rotationPid.atGoal();
81+
}
82+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/* Black Knights Robotics (C) 2025 */
2+
package frc.robot.constants;
3+
4+
import edu.wpi.first.math.trajectory.TrapezoidProfile;
5+
6+
public class AlignConstants {
7+
public static final double X_AXIS_P = 0.0;
8+
public static final double X_AXIS_I = 0.0;
9+
public static final double X_AXIS_D = 0.0;
10+
public static final TrapezoidProfile.Constraints X_AXIS_CONSTRAINTS =
11+
new TrapezoidProfile.Constraints(3, 3);
12+
13+
public static final double Y_AXIS_P = 0.0;
14+
public static final double Y_AXIS_I = 0.0;
15+
public static final double Y_AXIS_D = 0.0;
16+
public static final TrapezoidProfile.Constraints Y_AXIS_CONSTRAINTS =
17+
new TrapezoidProfile.Constraints(3, 3);
18+
19+
public static final double ROTATION_P = 0.0;
20+
public static final double ROTATION_I = 0.0;
21+
public static final double ROTATION_D = 0.0;
22+
public static final TrapezoidProfile.Constraints ROTATION_CONSTRAINTS =
23+
new TrapezoidProfile.Constraints(Math.PI, Math.PI);
24+
}

src/main/java/frc/robot/subsystems/OdometrySubsystem.java renamed to src/main/java/frc/robot/framework/Odometry.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* Black Knights Robotics (C) 2025 */
2-
package frc.robot.subsystems;
2+
package frc.robot.framework;
33

44
import edu.wpi.first.math.Matrix;
55
import edu.wpi.first.math.Nat;
@@ -17,12 +17,12 @@
1717
import org.apache.logging.log4j.LogManager;
1818
import org.apache.logging.log4j.Logger;
1919

20-
public class OdometrySubsystem {
20+
public class Odometry {
2121
/** List of cameras used for vision-based measurements to refine odometry. */
2222
private ArrayList<Camera> cameras = new ArrayList<>();
2323

2424
/** Singleton instance of the OdometrySubsystem. */
25-
private static OdometrySubsystem INSTANCE = null;
25+
private static Odometry INSTANCE = null;
2626

2727
/** Logger for recording debug and error messages related to odometry subsystem operations. */
2828
private static final Logger LOGGER = LogManager.getLogger();
@@ -66,22 +66,22 @@ public class OdometrySubsystem {
6666
1
6767
}));
6868

69-
private OdometrySubsystem() {}
69+
private Odometry() {}
7070

7171
/**
72-
* Get the instance of OdometrySubsystem, creating a new one if it doesn't exist
72+
* Get the instance of Odometry, creating a new one if it doesn't exist
7373
*
7474
* @return The instance
7575
*/
76-
public static OdometrySubsystem getInstance() {
76+
public static Odometry getInstance() {
7777
if (INSTANCE == null) {
78-
INSTANCE = new OdometrySubsystem();
78+
INSTANCE = new Odometry();
7979
}
8080
return INSTANCE;
8181
}
8282

8383
/**
84-
* Add a camera to the odometry subsystem for vision-based localization.
84+
* Add a camera to the Odometry for vision-based localization.
8585
*
8686
* @param camera The {@link Camera} to add to the system.
8787
*/
@@ -107,13 +107,14 @@ public Pose3d getRobotPose() {
107107
public void addWheelOdometry(
108108
Rotation3d gyroRotation, SwerveModulePosition[] swerveModulePositions) {
109109
if (swerveModulePositions.length != 4) {
110-
// LOGGER.error("Wrong length for module positions");
110+
LOGGER.error("Wrong length for module positions");
111111
return;
112112
}
113113

114114
this.poseEstimator.update(gyroRotation, swerveModulePositions);
115115
}
116116

117+
@Override
117118
public void periodic() {
118119
NTTelemetry.setArrayEntry(
119120
"Pose",

0 commit comments

Comments
 (0)