Skip to content

Commit 2e09594

Browse files
committed
Reef autoalignment (not accurate)
1 parent 5b4925f commit 2e09594

File tree

4 files changed

+134
-7
lines changed

4 files changed

+134
-7
lines changed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@
1717
import com.ctre.phoenix6.signals.SensorDirectionValue;
1818
import com.pathplanner.lib.config.ModuleConfig;
1919
import com.pathplanner.lib.config.RobotConfig;
20+
21+
import edu.wpi.first.math.Matrix;
2022
import edu.wpi.first.math.geometry.Rotation2d;
2123
import edu.wpi.first.math.geometry.Translation2d;
24+
import edu.wpi.first.math.numbers.N1;
25+
import edu.wpi.first.math.numbers.N3;
2226
import edu.wpi.first.math.system.plant.DCMotor;
2327
import edu.wpi.first.math.util.Units;
2428
import edu.wpi.first.wpilibj.RobotBase;
@@ -139,6 +143,13 @@ public static final class DriveConstants {
139143
public static final double driveSimKs = 0.184445; //0.0;
140144
public static final double driveSimKv = 0.093025; //0.0789;
141145

146+
public static final Matrix<N3, N1> driveStandardDevs = new Matrix<N3, N1>(
147+
N3.instance,
148+
N1.instance,
149+
new double[] {0.2516809574, 0.4502539169, 1.370530188}
150+
);
151+
152+
142153
// Turn motor configuration
143154
// public static final boolean turnInverted = false;
144155
public static final int turnMotorCurrentLimit = 40;

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import frc.robot.commands.DriveCommands;
3333
import frc.robot.commands.ManipulatorIntakeCoralCommand;
3434
import frc.robot.commands.OuttakeCoralCommand;
35+
import frc.robot.commands.AutoCommands.LimelightAlignWithReef;
3536
import frc.robot.commands.ElevatorCommands.ElevatorFineTuningCommand;
3637
import frc.robot.commands.ElevatorCommands.ElevatorGoToPositionPositionCommand;
3738
import frc.robot.commands.ElevatorCommands.ElevatorHoldCurrentPositionCommand;
@@ -175,6 +176,16 @@ private void competitionButtonBindings(){
175176
Trigger leftStickDown = operatorController.leftStick();
176177
leftStickDown.whileTrue(new ElevatorFineTuningCommand(elevator, () -> -operatorController.getRawAxis(1)));
177178

179+
Trigger leftReefAlignmentTrigger = new JoystickButton(flightStick, 3);
180+
leftReefAlignmentTrigger.whileTrue(
181+
new LimelightAlignWithReef(drive, false)
182+
);
183+
184+
Trigger rightReefAlignmentTrigger = new JoystickButton(flightStick, 4);
185+
rightReefAlignmentTrigger.whileTrue(
186+
new LimelightAlignWithReef(drive, true)
187+
);
188+
178189
}
179190

180191

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package frc.robot.commands.AutoCommands;
2+
3+
4+
import com.pathplanner.lib.auto.AutoBuilder;
5+
import com.pathplanner.lib.path.PathConstraints;
6+
7+
import edu.wpi.first.math.geometry.Pose2d;
8+
import edu.wpi.first.math.geometry.Rotation2d;
9+
import edu.wpi.first.math.geometry.Transform2d;
10+
import edu.wpi.first.math.util.Units;
11+
import edu.wpi.first.networktables.NetworkTableInstance;
12+
import edu.wpi.first.networktables.StructPublisher;
13+
import edu.wpi.first.wpilibj2.command.Command;
14+
import frc.robot.subsystems.drive.Drive;
15+
import frc.robot.util.FieldCoordinatePose2d;
16+
17+
public class LimelightAlignWithReef extends Command {
18+
19+
private Drive driveSubsystem;
20+
21+
private Command littleCommand;
22+
23+
private final boolean right;
24+
25+
private final double horizontalOffsetMeters = Units.inchesToMeters(5);
26+
27+
private boolean cantFindTag = false;
28+
29+
30+
public LimelightAlignWithReef(Drive _driveSubsystem, boolean _right){
31+
driveSubsystem = _driveSubsystem;
32+
right = _right;
33+
34+
addRequirements(driveSubsystem);
35+
}
36+
37+
@Override
38+
public void initialize(){
39+
40+
double horizontalOffset = horizontalOffsetMeters;
41+
horizontalOffset *= right ? 1.0 : -1.0;
42+
43+
Pose2d poseRelativeToAprilTag = new Pose2d(
44+
Units.inchesToMeters(15),
45+
horizontalOffset,
46+
new Rotation2d(Math.PI)
47+
);
48+
49+
FieldCoordinatePose2d tagPose = driveSubsystem.getViewedAprilTagPoseFieldSpace();
50+
51+
if(tagPose == null){
52+
cantFindTag = true;
53+
return;
54+
}
55+
56+
Pose2d desiredEndPose = tagPose.pose.
57+
transformBy(new Transform2d(new Pose2d(), poseRelativeToAprilTag));
58+
59+
StructPublisher<Pose2d> pub = NetworkTableInstance.getDefault().getStructTopic(
60+
"Pathfinding destination", Pose2d.struct
61+
).publish();
62+
63+
pub.set(desiredEndPose);
64+
65+
PathConstraints constraints = new PathConstraints(1.5, 2, Math.PI * 2.0, Math.PI * 2.0);
66+
67+
littleCommand = AutoBuilder.pathfindToPose(desiredEndPose, constraints);
68+
69+
70+
littleCommand.initialize();
71+
72+
}
73+
74+
75+
@Override
76+
public void execute() {
77+
littleCommand.execute();
78+
}
79+
80+
81+
@Override
82+
public void end(boolean isInterrupted) {
83+
littleCommand.end(isInterrupted);
84+
}
85+
86+
@Override
87+
public boolean isFinished() {
88+
return
89+
littleCommand.isFinished() ||
90+
cantFindTag;
91+
}
92+
}

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

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ public class Drive extends SubsystemBase {
7878
private final Alert gyroDisconnectedAlert =
7979
new Alert("Disconnected gyro, using kinematics as fallback.", AlertType.kError);
8080

81+
8182
private SwerveDriveKinematics kinematics = new SwerveDriveKinematics(Constants.DriveConstants.moduleTranslations);
8283
private Rotation2d rawGyroRotation = new Rotation2d(); // NOTICE: Try putting PI in these parenthesis to fix the autonomous problem.
8384
private SwerveModulePosition[] lastModulePositions = // For delta tracking
@@ -272,27 +273,39 @@ public void periodic() {
272273
poseEstimator.updateWithTime(sampleTimestamps[i], rawGyroRotation, modulePositions);
273274

274275
Pose2d visionPose = getRobotVisionPose();
275-
// if(visionPose != null){
276-
// poseEstimator.addVisionMeasurement(visionPose, sampleTimestamps[i]);
277-
// }
276+
if(visionPose != null){
277+
poseEstimator.addVisionMeasurement(visionPose, sampleTimestamps[i], Constants.DriveConstants.driveStandardDevs);
278+
// System.out.println(visionPose.getX() + "," + visionPose.getY() + "," + visionPose.getRotation().getRadians());
279+
}
278280
}
279281

280282
// Update gyro alert
281283
gyroDisconnectedAlert.set(!gyroInputs.connected && Constants.currentMode != Mode.SIM);
282284
}
283285

284286

285-
private Pose2d getRobotVisionPose(){
286-
double [] limelightData = LimelightHelpers.getBotPose_TargetSpace("limelight");
287-
//double[] limelightDataOld = LimelightHelpers.getTargetPose_RobotSpace("limelight");
287+
public FieldCoordinatePose2d getViewedAprilTagPoseFieldSpace(){
288+
288289
int tagId = (int)LimelightHelpers.getFiducialID("limelight");
289290

290291
Optional<Pose3d> tagPose3d = AprilTagDataLoader.field.getTagPose(tagId);
291292

292293
if(tagPose3d.isEmpty()) return null;
293294

294295
Pose2d actualTagCoordTemp = new Pose2d(tagPose3d.get().getX(), tagPose3d.get().getY(), tagPose3d.get().getRotation().toRotation2d());
295-
FieldCoordinatePose2d actualTagCoord = new FieldCoordinatePose2d(actualTagCoordTemp);
296+
297+
return new FieldCoordinatePose2d(actualTagCoordTemp);
298+
299+
}
300+
301+
private Pose2d getRobotVisionPose(){
302+
double [] limelightData = LimelightHelpers.getBotPose_TargetSpace("limelight");
303+
304+
FieldCoordinatePose2d actualTagCoord = getViewedAprilTagPoseFieldSpace();
305+
306+
if(actualTagCoord == null){
307+
return null;
308+
}
296309

297310
RelativeCoordinatePose2d aprilTagRelativePose = new RelativeCoordinatePose2d(Help.limelightCoordsToWPICoordsPose2d(limelightData));
298311
RelativeCoordinatePose2d robotPoseTagSpace = new RelativeCoordinatePose2d(new Pose2d(

0 commit comments

Comments
 (0)