Valkyrie 2026
Loading...
Searching...
No Matches
Limelight.h
1#pragma once
2
3#include <functional>
4#include <iostream>
5#include <memory>
6#include <optional>
7#include <string>
8#include <unordered_set>
9
10#include <Eigen/Core>
11#include <frc/apriltag/AprilTagFieldLayout.h>
12#include <frc/estimator/PoseEstimator.h>
13#include <frc/estimator/SwerveDrivePoseEstimator.h>
14#include <frc/geometry/Pose2d.h>
15#include <frc/geometry/Pose3d.h>
16#include <frc/geometry/Rotation3d.h>
17#include <frc/geometry/Twist3d.h>
18#include <networktables/NetworkTableEntry.h>
19#include <networktables/NetworkTableInstance.h>
20#include <units/angle.h>
21#include <units/angular_velocity.h>
22#include <units/dimensionless.h>
23#include <units/length.h>
24#include <units/time.h>
25#include <units/velocity.h>
26#include <wpi/array.h>
27
28#include "valkyrie/cameras/Limelight.h"
29#include "valkyrie/sensors/PoseEstimateSensor.h"
30
31namespace valor {
32namespace sensors {
33namespace apriltag {
34
42class Limelight : public PoseEstimateSensor {
43 public:
47 enum class Solver {
50 };
51
55 struct Config {
57 units::meter_t fieldBorderMargin = 0.5_m;
58
60 units::meter_t translationalStdDevCoefficient = 0.01_m;
62 units::radian_t rotationalStdDevCoefficient = 0.03_rad;
64 double tagWeight = 1;
65
67 units::second_t maxMeasurementAge = 2.0_s;
69 double ambiguityThreshold = 0.4;
70
71 Solver solver = Solver::MT1;
72 };
73
74 using VisionFilter = std::function<bool(const cameras::Limelight::PoseEstimate& estimate, const Config& config,
75 const frc::AprilTagFieldLayout& fieldLayout)>;
76 using DoubtCalculator = std::function<PoseEstimate::Doubts(const cameras::Limelight::PoseEstimate& estimate, const Config& config)>;
77
85
94 static bool StandardVisionFilter(const cameras::Limelight::PoseEstimate& context, const Config& _config,
95 const frc::AprilTagFieldLayout& fieldLayout);
96
103 Limelight(std::shared_ptr<cameras::Limelight> camera, frc::AprilTagField field);
104
114 void SetupSim(std::function<frc::Pose2d()> robotPoseGetter, std::unordered_set<int> tagIDs, units::degree_t horizontalFOV,
115 units::degree_t verticalFOV, units::meter_t maxDistance = units::meter_t{std::numeric_limits<double>::infinity()},
116 units::degree_t viewableAngle = 70_deg);
117
121 inline const Config& GetConfig() const { return config; }
122
123 inline void SetConfig(const Config& c) { config = c; }
124
128 inline void SetVisionFilter(const VisionFilter _visionFilter) { visionFilter = _visionFilter; }
129
133 inline void SetDoubtCalculator(const DoubtCalculator _doubtCalculator) { doubtCalculator = _doubtCalculator; }
134
135 inline std::shared_ptr<cameras::Limelight> GetCamera() const { return cam; }
136
137 protected:
141 struct SimState {
142 std::function<frc::Pose2d()> robotPoseGetter;
143 std::unordered_set<int> tagIDs;
144 units::degree_t horizontalFOV;
145 units::degree_t verticalFOV;
146 units::meter_t maxDistance;
147 units::degree_t viewableAngle;
148 };
149
150 std::unique_ptr<SimState> simState;
151
152 private:
162 std::optional<PoseEstimate> GetPoseEstimate();
163
164 void SimulationLoop();
165
166 std::shared_ptr<cameras::Limelight> cam;
167 Config config;
168
169 frc::AprilTagFieldLayout fieldLayout;
170
171 VisionFilter visionFilter = StandardVisionFilter;
172 DoubtCalculator doubtCalculator = StandardDoubtCalculator;
173};
174
175} // namespace apriltag
176} // namespace sensors
177} // namespace valor
void SetDoubtCalculator(const DoubtCalculator _doubtCalculator)
Set a custom doubt (uncertainty) calculation function.
Definition Limelight.h:133
void SetupSim(std::function< frc::Pose2d()> robotPoseGetter, std::unordered_set< int > tagIDs, units::degree_t horizontalFOV, units::degree_t verticalFOV, units::meter_t maxDistance=units::meter_t{std::numeric_limits< double >::infinity()}, units::degree_t viewableAngle=70_deg)
Configure the simulation state for this sensor.
Solver
Solvers for AprilTag pose estimation.
Definition Limelight.h:47
@ MT2
MegaTag2 solver.
Definition Limelight.h:49
@ MT1
MegaTag1 solver.
Definition Limelight.h:48
const Config & GetConfig() const
Get the current sensor configuration.
Definition Limelight.h:121
static bool StandardVisionFilter(const cameras::Limelight::PoseEstimate &context, const Config &_config, const frc::AprilTagFieldLayout &fieldLayout)
Standard filter for determining if a vision measurement is valid.
void SetVisionFilter(const VisionFilter _visionFilter)
Set a custom vision filtering function.
Definition Limelight.h:128
static PoseEstimate::Doubts StandardDoubtCalculator(const cameras::Limelight::PoseEstimate &context, const Config &_config)
Standard logic to calculate measurement uncertainty based on context.
std::unique_ptr< SimState > simState
Pointer to simulation configuration.
Definition Limelight.h:150
Limelight(std::shared_ptr< cameras::Limelight > camera, frc::AprilTagField field)
Construct a new Limelight object.
Pose Estimate of the Limelight.
Definition Limelight.h:223
Holds calculated uncertainty for a vision measurement.
Definition PoseEstimateSensor.h:13
Configuration parameters for the AprilTags sensor.
Definition Limelight.h:55
units::meter_t translationalStdDevCoefficient
Translational standard deviation coefficient for power-law scaling.
Definition Limelight.h:60
units::radian_t rotationalStdDevCoefficient
Rotational standard deviation coefficient for power-law scaling.
Definition Limelight.h:62
double tagWeight
Weight factor applied based on the number of detected tags.
Definition Limelight.h:64
units::second_t maxMeasurementAge
Maximum age of a measurement before it is rejected as stale.
Definition Limelight.h:67
double ambiguityThreshold
Ambiguity threshold for MT1 solver to reject poor results.
Definition Limelight.h:69
units::meter_t fieldBorderMargin
Field border margin for rejecting measurements too close to the edge.
Definition Limelight.h:57
Parameters for simulated vision processing.
Definition Limelight.h:141
units::degree_t viewableAngle
Sim max viewable angle.
Definition Limelight.h:147
std::unordered_set< int > tagIDs
Tags visible in sim.
Definition Limelight.h:143
units::degree_t verticalFOV
Sim vertical FOV.
Definition Limelight.h:145
units::degree_t horizontalFOV
Sim horizontal FOV.
Definition Limelight.h:144
units::meter_t maxDistance
Max simulated range.
Definition Limelight.h:146
std::function< frc::Pose2d()> robotPoseGetter
Robot pose source.
Definition Limelight.h:142