Valkyrie 2026
Loading...
Searching...
No Matches
USB.h
1#include <cscore_cv.h>
2
3#include <frc/apriltag/AprilTagDetector.h>
4#include <frc/apriltag/AprilTagFieldLayout.h>
5#include <frc/apriltag/AprilTagPoseEstimator.h>
6
7#include "valkyrie/sensors/PoseEstimateSensor.h"
8
9namespace valor {
10namespace sensors {
11namespace apriltag {
12
13class USB : public PoseEstimateSensor {
14 public:
15 enum class Solver {
21 };
22
26 struct Config {
28 units::meter_t fieldBorderMargin = 0.5_m;
29
31 units::meter_t translationalStdDevCoefficient = 0.01_m;
33 units::radian_t rotationalStdDevCoefficient = 0.03_rad;
35 double tagWeight = 1;
36
38 double ambiguityThreshold = 0.4;
39
41 };
42
43 using VisionFilter = std::function<bool(std::span<frc::AprilTagDetection const* const> detections, frc::Pose3d estimate,
44 const Config& config, const frc::AprilTagFieldLayout& fieldLayout)>;
45
46 using ScoreCalculator = std::function<double(const frc::AprilTagDetection& detection, frc::Pose3d estimate, const Config& config,
47 const frc::AprilTagFieldLayout& fieldLayout)>;
48
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)>;
52
53 USB(std::shared_ptr<cs::UsbCamera> camera, frc::AprilTagPoseEstimator::Config config,
54 frc::AprilTagField field = frc::AprilTagField::kDefaultField);
55
56 constexpr const Config& GetConfig() const { return config; }
57
58 constexpr void SetConfig(const Config& c) { config = c; }
59
60 inline void SetVisionFilter(VisionFilter f) { visionFilter = f; }
61
62 inline void SetScoreCalculator(ScoreCalculator s) { scoreCalculator = s; }
63
64 inline void SetDoubtCalculator(DoubtCalculator d) { doubtCalculator = d; }
65
66 constexpr std::vector<PoseEstimate> GetAllEstimates() const { return estimates; }
67
68 static frc::AprilTagDetector& GetDetector();
69
70 static bool StandardVisionFilter(std::span<frc::AprilTagDetection const* const> detections, frc::Pose3d estimate, const Config& config,
71 const frc::AprilTagFieldLayout& fieldLayout);
72
73 static double StandardScoreCalculator(const frc::AprilTagDetection& detection, frc::Pose3d estimate, const Config& config,
74 const frc::AprilTagFieldLayout& fieldLayout);
75
76 static PoseEstimate::Doubts StandardDoubtCalculator(std::span<frc::AprilTagDetection const* const> detections, frc::Pose3d estimate,
77 const Config& config, const frc::AprilTagFieldLayout& fieldLayout);
78
79 private:
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();
85
86 Config config;
87 std::vector<PoseEstimate> estimates;
88
89 cs::CvSink sink;
90 cs::CvSource outputStream;
91
92 cv::Mat mat;
93 cv::Mat grayMat;
94 cv::Mat cameraMatrix;
95 cv::Mat distortionCoefficients = cv::Mat::zeros(4, 1, CV_64F);
96 cv::Mat rvec;
97 cv::Mat tvec;
98 cv::Mat R;
99 std::vector<cv::Point3d> objectPoints;
100 std::vector<cv::Point2d> imagePoints;
101
102 std::shared_ptr<cs::UsbCamera> camera;
103 frc::AprilTagPoseEstimator estimator;
104 frc::AprilTagFieldLayout layout;
105
106 VisionFilter visionFilter = StandardVisionFilter;
107 ScoreCalculator scoreCalculator = StandardScoreCalculator;
108 DoubtCalculator doubtCalculator = StandardDoubtCalculator;
109};
110
111} // namespace apriltag
112} // namespace sensors
113} // namespace valor
Solver
Definition USB.h:15
@ SOLVE_PNP
Uses OpenCV's solvePnPRansac to solve for a multi-tag pose.
Definition USB.h:17
Holds calculated uncertainty for a vision measurement.
Definition PoseEstimateSensor.h:13
Configuration parameters for the AprilTags sensor.
Definition USB.h:26
units::radian_t rotationalStdDevCoefficient
Rotational standard deviation coefficient for power-law scaling.
Definition USB.h:33
double ambiguityThreshold
Ambiguity threshold for MT1 solver to reject poor results.
Definition USB.h:38
double tagWeight
Weight factor applied based on the number of detected tags.
Definition USB.h:35
units::meter_t fieldBorderMargin
Field border margin for rejecting measurements too close to the edge.
Definition USB.h:28
units::meter_t translationalStdDevCoefficient
Translational standard deviation coefficient for power-law scaling.
Definition USB.h:31