30 photon::PhotonCamera &cam)
38 Eigen::Matrix<double, 3, 1> singleTagStdDevs,
39 Eigen::Matrix<double, 3, 1> multiTagStdDevs)
40 : m_cameraEstimators{estms}, m_singleTagStdDevs{singleTagStdDevs},
41 m_multiTagStdDevs{multiTagStdDevs} {
42 for (
auto &est : m_cameraEstimators) {
43 est.estimator.SetMultiTagFallbackStrategy(
44 photon::PoseStrategy::LOWEST_AMBIGUITY);
48 std::vector<photon::EstimatedRobotPose>
50 photon::PhotonCamera &camera,
double maxAmbiguity = 0.2) {
51 est.SetReferencePose(prevPose);
53 std::vector<photon::EstimatedRobotPose> validPoses;
57 for (
const auto &result : camera.GetAllUnreadResults()) {
59 if (result.HasTargets() &&
60 (result.targets.size() > 1 ||
61 result.targets[0].GetPoseAmbiguity() <= maxAmbiguity)) {
63 std::optional<photon::EstimatedRobotPose> visionEst =
67 if (visionEst.has_value()) {
68 auto estimatedPose = visionEst.value().estimatedPose;
69 if (estimatedPose.X() > 0_m && estimatedPose.X() <= 100_m &&
70 estimatedPose.Y() > 0_m && estimatedPose.Y() <= 100_m) {
72 validPoses.push_back(visionEst.value());
90 for (
auto &est : m_cameraEstimators) {
93 est.estimator, est.camera);
99 if (camPoses.size() > 0) {
100 for (
auto &pose : camPoses) {
101 AddVisionMeasurement(pose, estimator, est);
107 Eigen::Matrix<double, 3, 1>
111 Eigen::Matrix<double, 3, 1> estStdDevs = m_singleTagStdDevs;
113 units::meter_t avgDist = 0_m;
114 for (
const auto &tgt : pose.targetsUsed) {
116 photonEst.
estimator.GetFieldLayout().GetTagPose(tgt.GetFiducialId());
117 if (tagPose.has_value()) {
119 avgDist += tagPose.value().ToPose2d().Translation().Distance(
120 pose.estimatedPose.ToPose2d().Translation());
130 estStdDevs = m_multiTagStdDevs;
133 if (numTags == 1 && avgDist > 4_m) {
134 estStdDevs = (Eigen::MatrixXd(3, 1) << std::numeric_limits<double>::max(),
135 std::numeric_limits<double>::max(),
136 std::numeric_limits<double>::max())
139 estStdDevs = estStdDevs * (1 + (avgDist.value() * avgDist.value() / 30));
146 void AddVisionMeasurement(photon::EstimatedRobotPose &estimate,
147 frc::SwerveDrivePoseEstimator<4U> &estimator,
148 PhotonCameraEstimator &photonEst) {
150 wpi::array<double, 3> newStdDevs{stdDevs(0), stdDevs(1), stdDevs(2)};
151 estimator.AddVisionMeasurement(estimate.estimatedPose.ToPose2d(),
152 estimate.timestamp, newStdDevs);
155 std::vector<PhotonCameraEstimator> &m_cameraEstimators;
156 Eigen::Matrix<double, 3, 1> m_singleTagStdDevs;
157 Eigen::Matrix<double, 3, 1> m_multiTagStdDevs;
159 units::second_t lastEstTimestamp{0_s};