13class USB :
public PoseEstimateSensor {
43 using VisionFilter = std::function<bool(std::span<frc::AprilTagDetection const* const> detections, frc::Pose3d estimate,
44 const Config& config,
const frc::AprilTagFieldLayout& fieldLayout)>;
46 using ScoreCalculator = std::function<double(
const frc::AprilTagDetection& detection, frc::Pose3d estimate,
const Config& config,
47 const frc::AprilTagFieldLayout& fieldLayout)>;
49 using DoubtCalculator =
50 std::function<
PoseEstimate::Doubts(std::span<frc::AprilTagDetection const* const> detections, frc::Pose3d estimate,
Config& config,
51 const frc::AprilTagFieldLayout& fieldLayout)>;
53 USB(std::shared_ptr<cs::UsbCamera> camera, frc::AprilTagPoseEstimator::Config config,
54 frc::AprilTagField field = frc::AprilTagField::kDefaultField);
56 constexpr const Config& GetConfig()
const {
return config; }
58 constexpr void SetConfig(
const Config& c) { config = c; }
60 inline void SetVisionFilter(VisionFilter f) { visionFilter = f; }
62 inline void SetScoreCalculator(ScoreCalculator s) { scoreCalculator = s; }
64 inline void SetDoubtCalculator(DoubtCalculator d) { doubtCalculator = d; }
66 constexpr std::vector<PoseEstimate> GetAllEstimates()
const {
return estimates; }
68 static frc::AprilTagDetector& GetDetector();
70 static bool StandardVisionFilter(std::span<frc::AprilTagDetection const* const> detections, frc::Pose3d estimate,
const Config& config,
71 const frc::AprilTagFieldLayout& fieldLayout);
73 static double StandardScoreCalculator(
const frc::AprilTagDetection& detection, frc::Pose3d estimate,
const Config& config,
74 const frc::AprilTagFieldLayout& fieldLayout);
76 static PoseEstimate::Doubts StandardDoubtCalculator(std::span<frc::AprilTagDetection const* const> detections, frc::Pose3d estimate,
77 const Config& config,
const frc::AprilTagFieldLayout& fieldLayout);
80 bool ConvertGrayMat();
81 void DrawTag(
const frc::AprilTagDetection& detection);
82 std::optional<PoseEstimate> CalculateHighestScore(std::span<frc::AprilTagDetection const* const>);
83 std::optional<PoseEstimate> CalculatePnP(std::span<frc::AprilTagDetection const* const>);
84 std::optional<PoseEstimate> GetEstimate();
87 std::vector<PoseEstimate> estimates;
90 cs::CvSource outputStream;
95 cv::Mat distortionCoefficients = cv::Mat::zeros(4, 1, CV_64F);
99 std::vector<cv::Point3d> objectPoints;
100 std::vector<cv::Point2d> imagePoints;
102 std::shared_ptr<cs::UsbCamera> camera;
103 frc::AprilTagPoseEstimator estimator;
104 frc::AprilTagFieldLayout layout;
106 VisionFilter visionFilter = StandardVisionFilter;
107 ScoreCalculator scoreCalculator = StandardScoreCalculator;
108 DoubtCalculator doubtCalculator = StandardDoubtCalculator;