import edu.wpi.first.math.geometry.Translation2d;
import edu.wpi.first.math.util.Units;
import edu.wpi.first.wpilibj2.command.Command;
-import frc.robot.constants.VisionConstants;
+import frc.robot.constants.FieldConstants;
import frc.robot.subsystems.drivetrain.Drivetrain;
/**
double dist = Double.POSITIVE_INFINITY;
Translation2d closest = new Translation2d();
Translation2d driveTranslation = drive.getPose().getTranslation();
- for(AprilTag tag : VisionConstants.field.getTags()){
+ for(AprilTag tag : FieldConstants.field.getTags()){
Translation2d translation = tag.pose.toPose2d().getTranslation();
double dist2 = driveTranslation.getDistance(translation);
if(dist2 < dist){
package frc.robot.constants;
+import edu.wpi.first.apriltag.AprilTagFieldLayout;
+import edu.wpi.first.apriltag.AprilTagFields;
import edu.wpi.first.math.geometry.Translation3d;
import edu.wpi.first.math.util.Units;
/** Height of the field [meters] */
public static final double FIELD_WIDTH = Units.inchesToMeters(26*12 + 5);
+ /**Apriltag layout for 2026 REBUILT */
+ public static final AprilTagFieldLayout field = AprilTagFieldLayout.loadField(AprilTagFields.k2026RebuiltWelded);
+
/** Location of hub target */
public static final Translation3d HUB_TRANSLATION3D = new Translation3d(Units.inchesToMeters(156.8), 4.035, Units.inchesToMeters(72));
import org.photonvision.PhotonPoseEstimator.PoseStrategy;
-import edu.wpi.first.apriltag.AprilTagFieldLayout;
-import edu.wpi.first.apriltag.AprilTagFields;
import edu.wpi.first.math.Matrix;
import edu.wpi.first.math.Pair;
import edu.wpi.first.math.VecBuilder;
public static final int MAX_EMPTY_TICKS = 10;
- public static final AprilTagFieldLayout field = AprilTagFieldLayout.loadField(AprilTagFields.k2025ReefscapeWelded);
-
/**
* The camera poses
* <p>
import edu.wpi.first.wpilibj.Timer;
import edu.wpi.first.wpilibj2.command.SubsystemBase;
import frc.robot.constants.Constants;
+import frc.robot.constants.FieldConstants;
import frc.robot.constants.VisionConstants;
import frc.robot.constants.swerve.DriveConstants;
import frc.robot.constants.swerve.ModuleConstants;
if(!Vision.nearField(prevPose)){
// If the pose at the beginning of the method is off the field, reset to a position in the middle of the field
// Use the rotation of the pose after updating odometry so the yaw is right
- prevPose = new Pose2d(VisionConstants.field.getFieldLength()/2, VisionConstants.field.getFieldWidth()/2, pose2.getRotation());
+ prevPose = new Pose2d(FieldConstants.field.getFieldLength()/2, FieldConstants.field.getFieldWidth()/2, pose2.getRotation());
resetOdometry(prevPose);
}else if(!Vision.nearField(pose2)){
// if the drivetrain pose is off the field, reset our odometry to the pose before(this is the right pose)
import edu.wpi.first.math.geometry.Pose2d;
import edu.wpi.first.math.geometry.Rotation2d;
import edu.wpi.first.wpilibj.DriverStation.Alliance;
-import frc.robot.constants.VisionConstants;
+import frc.robot.constants.FieldConstants;
public class ConversionUtils {
*/
public static Pose2d absolutePoseToPathPlannerPose(Pose2d pose, Alliance alliance) {
if (alliance == Alliance.Red) {
- return pose.relativeTo(new Pose2d(VisionConstants.field.getFieldLength(), VisionConstants.field.getFieldWidth(), new Rotation2d(Math.PI)));
+ return pose.relativeTo(new Pose2d(FieldConstants.field.getFieldLength(), FieldConstants.field.getFieldWidth(), new Rotation2d(Math.PI)));
}
return new Pose2d(pose.getX(), pose.getY(), pose.getRotation());
}
import edu.wpi.first.wpilibj.DriverStation;
import edu.wpi.first.wpilibj.RobotBase;
import edu.wpi.first.wpilibj.Timer;
+import frc.robot.constants.FieldConstants;
import frc.robot.constants.VisionConstants;
import frc.robot.constants.swerve.DriveConstants;
import frc.robot.util.MathUtils;
NetworkTableInstance.getDefault().startServer();
// Sets the origin to the right side of the blue alliance wall
- VisionConstants.field.setOrigin(OriginPosition.kBlueAllianceWallRightSide);
+ FieldConstants.field.setOrigin(OriginPosition.kBlueAllianceWallRightSide);
if(VisionConstants.ENABLED){
// Puts the cameras in an array list
if(RobotBase.isSimulation()){
visionSim = new VisionSystemSim("Vision");
- visionSim.addAprilTags(VisionConstants.field);
+ visionSim.addAprilTags(FieldConstants.field);
for(VisionCamera c : cameras){
PhotonCameraSim cameraSim = new PhotonCameraSim(c.camera);
cameraSim.enableDrawWireframe(true);
}
public AprilTagFieldLayout getAprilTagFieldLayout(){
- return VisionConstants.field;
+ return FieldConstants.field;
}
/**
* @return If the pose is on the field
*/
public static boolean onField(Pose2d pose){
- return pose!=null && pose.getX()>0 && pose.getX()<VisionConstants.field.getFieldLength() && pose.getY()>0 && pose.getY()<VisionConstants.field.getFieldWidth();
+ return pose!=null && pose.getX()>0 && pose.getX()<FieldConstants.field.getFieldLength() && pose.getY()>0 && pose.getY()<FieldConstants.field.getFieldWidth();
}
/**
* @return If the pose is within an area with twice the length and width of the field
*/
public static boolean nearField(Pose2d pose){
- return pose!=null && pose.getX()>-VisionConstants.field.getFieldLength()/2 && pose.getX()<VisionConstants.field.getFieldLength()*1.5 && pose.getY()>-VisionConstants.field.getFieldWidth()/2 && pose.getY()<VisionConstants.field.getFieldWidth()*1.5;
+ return pose!=null && pose.getX()>-FieldConstants.field.getFieldLength()/2 && pose.getX()<FieldConstants.field.getFieldLength()*1.5 && pose.getY()>-FieldConstants.field.getFieldWidth()/2 && pose.getY()<FieldConstants.field.getFieldWidth()*1.5;
}
private class VisionCamera implements VisionIO {
public VisionCamera(String cameraName, Transform3d robotToCam) {
camera = new PhotonCamera(cameraName);
photonPoseEstimator = new PhotonPoseEstimator(
- VisionConstants.field,
+ FieldConstants.field,
robotToCam
);
lastPose = null;
continue;
}
// Stores target pose and robot to camera transformation for easy access later
- Pose3d targetPose = VisionConstants.field.getTagPose(id).get();
+ Pose3d targetPose = FieldConstants.field.getTagPose(id).get();
Transform3d robotToCamera = photonPoseEstimator.getRobotToCameraTransform();
double timestamp = result.getTimestampSeconds();
public boolean useTag(int id){
// Never use tags that don't exist
- if(id <= 0 || id > VisionConstants.field.getTags().size()){
+ if(id <= 0 || id > FieldConstants.field.getTags().size()){
return false;
}
// Return false if it is in the list of tags to ignore
Vision vision = new Vision(new ArrayList<Pair<String, Transform3d>>());
// we should have 22 tags
- assertEquals(22, VisionConstants.field.getTags().size());
+ assertEquals(22, FieldConstants.field.getTags().size());
assertEquals(22, vision.getAprilTagFieldLayout().getTags().size());
// Check each tag in the field layout
// Get the poses from the two sources
// From the ArrayList<AprilTag> source
- AprilTag apriltag1 = VisionConstants.field.getTags().get(i);
+ AprilTag apriltag1 = FieldConstants.field.getTags().get(i);
Pose3d p1 = apriltag1.pose;
// From the vision source
Pose3d p2 = vision.getTagPose(tagId);
// 1-11 should be on the right, and 12-22 should be on the left
if(tagId > 11){
- assertTrue(p1.getX() < VisionConstants.field.getFieldLength()/2);
+ assertTrue(p1.getX() < FieldConstants.field.getFieldLength()/2);
}else{
- assertTrue(p1.getX() > VisionConstants.field.getFieldLength()/2);
+ assertTrue(p1.getX() > FieldConstants.field.getFieldLength()/2);
}
}
}
@Test
public void testReefTags(){
- List<Pose3d> redPoses = VisionConstants.field.getTags().subList(5, 11).stream().map(tag->tag.pose).toList();
- List<Pose3d> bluePoses = VisionConstants.field.getTags().subList(16, 22).stream().map(tag->tag.pose).toList();
+ List<Pose3d> redPoses = FieldConstants.field.getTags().subList(5, 11).stream().map(tag->tag.pose).toList();
+ List<Pose3d> bluePoses = FieldConstants.field.getTags().subList(16, 22).stream().map(tag->tag.pose).toList();
Pose3d redCenter = findCenter(redPoses);
Pose3d blueCenter = findCenter(bluePoses);
assertEquals(redCenter.getZ(), blueCenter.getZ(), 0.0001);
// X should be mirrored
- assertEquals(redCenter.getX(), VisionConstants.field.getFieldLength()-blueCenter.getX(), 0.01);
+ assertEquals(redCenter.getX(), FieldConstants.field.getFieldLength()-blueCenter.getX(), 0.01);
// Compare each matching pair of tags
for(int i = 5; i < 11; i++){
- Pose3d red = VisionConstants.field.getTagPose(i+1).get();
- Pose3d blue = VisionConstants.field.getTagPose(i+12).get();
+ Pose3d red = FieldConstants.field.getTagPose(i+1).get();
+ Pose3d blue = FieldConstants.field.getTagPose(i+12).get();
assertEquals(red.getY(), blue.getY(), 0.0001);
assertEquals(red.getZ(), blue.getZ(), 0.0001);
assertEquals(red.getZ(), redCenter.getZ(), 0.0001);
- assertEquals(red.getX(), VisionConstants.field.getFieldLength()-blue.getX(), 0.01);
+ assertEquals(red.getX(), FieldConstants.field.getFieldLength()-blue.getX(), 0.01);
assertEquals(MathUtil.angleModulus(red.getRotation().getZ()), MathUtil.angleModulus(Math.PI-blue.getRotation().getZ()), 0.0001);
}
}