diff --git a/src/main/java/frc/robot/poseestimator/WPILibPoseEstimator/WPILibPoseEstimatorConstants.java b/src/main/java/frc/robot/poseestimator/WPILibPoseEstimator/WPILibPoseEstimatorConstants.java index 8909c4a2c1..0f67e7733d 100644 --- a/src/main/java/frc/robot/poseestimator/WPILibPoseEstimator/WPILibPoseEstimatorConstants.java +++ b/src/main/java/frc/robot/poseestimator/WPILibPoseEstimator/WPILibPoseEstimatorConstants.java @@ -13,8 +13,6 @@ public class WPILibPoseEstimatorConstants { public static final StandardDeviations2D DEFAULT_VISION_STD_DEV = new StandardDeviations2D(0.0003, 0.0003, 0.003); - public static final StandardDeviations2D VISION_STD_DEV_COLLISION_REDUCTION = new StandardDeviations2D(); - public static final double MINIMUM_COLLISION_IMU_ACCELERATION_G = 2; public static final Rotation2d MINIMUM_TILT_IMU_ROLL = Rotation2d.fromDegrees(4); @@ -29,6 +27,8 @@ public class WPILibPoseEstimatorConstants { public static final double SKID_ODOMETRY_ACCURACY_REDUCTION_FACTOR = 0; + public static final double CALIBRATED_IMU_OFFSET_VISION_ANGLE_STD_DEVS_ADDITION = 0; + /** * constant represents the addition to odometryAccuracy when the compensated vision X and Y StdDevs average is equal to one */ diff --git a/src/main/java/frc/robot/poseestimator/WPILibPoseEstimator/WPILibPoseEstimatorWrapper.java b/src/main/java/frc/robot/poseestimator/WPILibPoseEstimator/WPILibPoseEstimatorWrapper.java index 56f03ed0ee..7d190c589d 100644 --- a/src/main/java/frc/robot/poseestimator/WPILibPoseEstimator/WPILibPoseEstimatorWrapper.java +++ b/src/main/java/frc/robot/poseestimator/WPILibPoseEstimator/WPILibPoseEstimatorWrapper.java @@ -229,11 +229,16 @@ private void updateOdometryAccuracy(OdometryData data) { } private void updateVision(RobotPoseObservation visionRobotPoseObservation) { - addVisionMeasurement(visionRobotPoseObservation); + RobotPoseObservation compensatedVisionObservation = new RobotPoseObservation( + visionRobotPoseObservation.timestampSeconds(), + visionRobotPoseObservation.robotPose(), + compensateByPoseEstimatorConditions(visionRobotPoseObservation.stdDevs()) + ); + addVisionMeasurement(compensatedVisionObservation); getEstimatedPoseToIMUYawDifference( - imuYawBuffer.getSample(visionRobotPoseObservation.timestampSeconds()), - visionRobotPoseObservation.timestampSeconds() + imuYawBuffer.getSample(compensatedVisionObservation.timestampSeconds()), + compensatedVisionObservation.timestampSeconds() ).ifPresent(yawDifference -> { poseToIMUYawDifferenceBuffer.insert(yawDifference); @@ -247,11 +252,25 @@ private void addVisionMeasurement(RobotPoseObservation visionObservation) { poseEstimator.addVisionMeasurement( visionObservation.robotPose(), visionObservation.timestampSeconds(), - compensateByOdometryAccuracy(visionObservation.stdDevs()).asColumnVector() + visionObservation.stdDevs().asColumnVector() ); this.lastVisionObservation = visionObservation; } + private StandardDeviations2D compensateByPoseEstimatorConditions(StandardDeviations2D visionStdDevs) { + return compensateByIsIMUOffsetCalibrated(compensateByOdometryAccuracy(visionStdDevs)); + } + + private StandardDeviations2D compensateByIsIMUOffsetCalibrated(StandardDeviations2D visionStdDevs) { + return new StandardDeviations2D( + visionStdDevs.xStandardDeviations(), + visionStdDevs.yStandardDeviations(), + isIMUOffsetCalibrated + ? visionStdDevs.angleStandardDeviations() + WPILibPoseEstimatorConstants.CALIBRATED_IMU_OFFSET_VISION_ANGLE_STD_DEVS_ADDITION + : visionStdDevs.angleStandardDeviations() + ); + } + private StandardDeviations2D compensateByOdometryAccuracy(StandardDeviations2D visionStdDevs) { StandardDeviations2D compensatedStdDevs = new StandardDeviations2D( visionStdDevs.xStandardDeviations() * odometryAccuracy,