2025-Robot
Robot code for 2025 FRC season by Argos, FRC team #1756
Loading...
Searching...
No Matches
vision_subsystem.h
Go to the documentation of this file.
1
4
5#pragma once
6
7#include <frc/filter/LinearFilter.h>
8#include <frc/geometry/Pose3d.h>
9#include <frc/geometry/Transform3d.h>
10#include <frc2/command/SubsystemBase.h>
11#include <units/angle.h>
12#include <units/angular_velocity.h>
13#include <units/length.h>
14#include <wpi/DataLog.h>
15
16#include <stop_token>
17#include <string>
18#include <thread>
19
26#include "networktables/NetworkTable.h"
27#include "networktables/NetworkTableEntry.h"
28#include "networktables/NetworkTableInstance.h"
29#include "networktables/NetworkTableValue.h"
31
33
35 double forwardSpeed{0.0};
36 double leftSpeed{0.0};
37 double ccwSpeed{0.0};
38};
39
41 private:
42 frc::Pose3d m_robotPose;
43 frc::Pose3d m_robotPoseWPI;
47 units::degree_t m_pitch;
48 units::degree_t m_yaw;
49 double m_area;
50 units::millisecond_t m_totalLatency;
51 frc::LinearFilter<units::degree_t> m_txFilter;
52 frc::LinearFilter<units::degree_t> m_tyFilter;
53 frc::LinearFilter<units::meter_t> m_zFilter;
55 double m_tid;
56 int m_hb;
57
58 public:
60 : m_txFilter{frc::LinearFilter<units::degree_t>::SinglePoleIIR(0.01, 0.02_s)}
61 , m_tyFilter{frc::LinearFilter<units::degree_t>::SinglePoleIIR(0.01, 0.02_s)}
62 , m_zFilter{frc::LinearFilter<units::meter_t>::SinglePoleIIR(0.01, 0.02_s)}
63 , m_resetFilterFlag{false} {}
64
69 struct tValues {
70 frc::Pose3d robotPose;
71 frc::Pose3d robotPoseWPI;
72 frc::Pose3d tagPoseCamSpace;
73 frc::Pose3d tagPoseRobotSpace;
75 units::degree_t m_pitch;
76 units::degree_t m_yaw;
77 double m_area;
78 double tagID;
79 units::millisecond_t totalLatency;
80 int hb;
81 };
82
88 tValues GetTarget(bool filter, std::string cameraName);
89
96 bool HasTarget();
97
98 void ResetFilters(std::string cameraName);
99
100 void ResetOnNextTarget();
101};
102
108 public:
110
112
118 std::optional<LimelightTarget> GetClosestTarget();
119
125 void SetDriverMode(bool mode);
126
128};
129
132 std::chrono::time_point<std::chrono::steady_clock> sampleTime{};
134};
135
136class VisionSubsystem : public frc2::SubsystemBase {
137 public:
138 VisionSubsystem(const argos_lib::RobotInstance instance, SwerveDriveSubsystem* pDriveSubsystem);
139
141
148
155
156 void SetPipeline(uint16_t tag);
157
158 void RequestFilterReset();
159
160 void SetAimWhileMove(bool val);
161 [[nodiscard]] bool IsAimWhileMoveActive();
162
163 void SetOdometryAiming(bool val);
164 [[nodiscard]] bool IsOdometryAimingActive();
165
166 void SetEnableStaticRotation(bool val);
167 [[nodiscard]] bool IsStaticRotationEnabled();
168
172 void Periodic() override;
173
175 void Disable();
176
177 std::optional<LimelightTarget::tValues> GetSeeingCamera(bool resample = false);
178 std::optional<ActiveVisionTarget> getWhichCamera(bool resample = true);
179 std::optional<whichCamera> getLatestReefSide();
180 std::optional<frc::Pose2d> GetClosestReefTagPoseInCamSpace(bool resample = false);
181 std::optional<frc::Translation2d> GetFieldCentricReefAlignmentError(bool resample = false);
182 std::optional<frc::Translation2d> GetRobotSpaceReefAlignmentError(bool resample = false);
183 std::optional<units::degree_t> GetOrientationCorrection(bool resample = false);
184 void SetLeftAlign(bool val);
185 void SetRightAlign(bool val);
186 void SetAlgaeAlign(bool val);
187 [[nodiscard]] bool LeftAlignmentRequested();
188 [[nodiscard]] bool RightAlignmentRequested();
189 [[nodiscard]] bool AlgaeAlignmentRequested();
190 void SetL1Active(bool val);
191 [[nodiscard]] bool isL1Active();
192 void SetAlgaeModeActive(bool val);
193 [[nodiscard]] bool isAlgaeModeActive();
194
195 [[nodiscard]] bool robotAligned(bool resample = true);
196
197 [[nodiscard]] std::optional<unitlessChassisSpeeds> getVisionAlignmentSpeeds(double scalingFactor = 1.0);
198
199 private:
200 const std::string leftCameraTableName = "/limelight-left";
201 const std::string rightCameraTableName = "/limelight-right";
202
203 // Components (e.g. motor controllers and sensors) should generally be
204 // declared private and exposed only through public methods.
206 std::shared_ptr<nt::NetworkTable> m_leftCameraTable;
207 std::shared_ptr<nt::NetworkTable> m_rightCameraTable;
208
229 std::optional<whichCamera> m_latestReefSide;
230 std::chrono::steady_clock::time_point m_latestReefSpotTime;
233 std::jthread m_yawUpdateThread;
234
235 wpi::log::StructLogEntry<frc::Pose2d> m_leftCameraMegaTag2PoseLogger;
236 wpi::log::StructLogEntry<frc::Pose2d> m_rightCameraMegaTag2PoseLogger;
237
238 void UpdateYaw(std::stop_token stopToken);
239};
Provides methods for interacting with the camera on a high level.
Definition vision_subsystem.h:107
void SetDriverMode(bool mode)
Turns the camera's driver mode on and off.
std::optional< LimelightTarget > GetClosestTarget()
Get the closest target the camera can see CAN RETURN NONE.
void RequestTargetFilterReset()
Definition vision_subsytem.cpp:25
LimelightTarget m_target
object that holds the current target seen by the camera
Definition vision_subsystem.h:111
Definition vision_subsystem.h:40
bool HasTarget()
Does the camera see a target?
Definition vision_subsytem.cpp:496
units::degree_t m_pitch
Pitch of target relative to camera -24.85 to 24.85 degrees.
Definition vision_subsystem.h:47
units::millisecond_t m_totalLatency
Total latency.
Definition vision_subsystem.h:50
double m_area
Area of the target in percentage of total pixels.
Definition vision_subsystem.h:49
LimelightTarget()
Definition vision_subsystem.h:59
bool m_resetFilterFlag
Definition vision_subsystem.h:54
double m_tid
Tag ID.
Definition vision_subsystem.h:55
frc::Pose3d m_targetPoseRobotSpace
3d pose of Target relative to camera (Z - Up, Y - left, X - Forward)
Definition vision_subsystem.h:45
void ResetFilters(std::string cameraName)
Definition vision_subsytem.cpp:504
frc::Pose3d m_targetPoseCamSpace
3d pose of Target relative to camera (Z - Forward, X - right, Y - down)
Definition vision_subsystem.h:44
frc::Pose3d m_robotPose
3d pose of robot relative to field center
Definition vision_subsystem.h:42
frc::LinearFilter< units::meter_t > m_zFilter
Definition vision_subsystem.h:53
frc::LinearFilter< units::degree_t > m_tyFilter
Definition vision_subsystem.h:52
units::degree_t m_yaw
Yaw of target relative to camera -31.65 to 31.65 degrees.
Definition vision_subsystem.h:48
bool m_hasTargets
True if the camera has a target it can read.
Definition vision_subsystem.h:46
tValues GetTarget(bool filter, std::string cameraName)
Get the values of the camera's current target.
Definition vision_subsytem.cpp:412
frc::LinearFilter< units::degree_t > m_txFilter
Definition vision_subsystem.h:51
void ResetOnNextTarget()
Definition vision_subsytem.cpp:500
frc::Pose3d m_robotPoseWPI
3d pose of robot relative to WPI reference for active alliance
Definition vision_subsystem.h:43
int m_hb
heartbeat
Definition vision_subsystem.h:56
Subsystem for controlling the swerve drivetrain of the robot.
Definition swerve_drive_subsystem.h:75
Definition vision_subsystem.h:136
void SetEnableStaticRotation(bool val)
Definition vision_subsytem.cpp:144
bool RightAlignmentRequested()
Definition vision_subsytem.cpp:315
std::optional< units::degree_t > GetOrientationCorrection(bool resample=false)
Definition vision_subsytem.cpp:270
LimelightTarget::tValues m_oldTargetValues
The old robot poses and latencies.
Definition vision_subsystem.h:212
std::shared_ptr< nt::NetworkTable > m_leftCameraTable
Cached NetworkTable pointer for left camera.
Definition vision_subsystem.h:206
LimelightTarget::tValues GetLeftCameraTargetValues()
Get the robot poses and latencies from left camera.
Definition vision_subsytem.cpp:160
bool isL1Active()
Definition vision_subsytem.cpp:327
bool m_usePolynomial
specifies whether to use the polynomial to obtain shooter angle
Definition vision_subsystem.h:213
bool IsOdometryAimingActive()
Definition vision_subsytem.cpp:128
ActiveVisionTarget m_activeVisionTarget
Definition vision_subsystem.h:226
void SetRightAlign(bool val)
Definition vision_subsytem.cpp:294
bool IsAimWhileMoveActive()
Definition vision_subsytem.cpp:124
std::optional< ActiveVisionTarget > getWhichCamera(bool resample=true)
Definition vision_subsytem.cpp:348
argos_lib::NTSubscriber m_rightCameraFrameUpdateSubscriber
Subscriber to manage all updates from right camera.
Definition vision_subsystem.h:232
void SetOdometryAiming(bool val)
Definition vision_subsytem.cpp:132
void Disable()
it disables (duh)
Definition vision_subsytem.cpp:168
bool m_isRotationGoodEnough
true if robot rotation is good per alignment
Definition vision_subsystem.h:223
SwerveDriveSubsystem * m_pDriveSubsystem
Pointer to drivetrain for reading some odometry.
Definition vision_subsystem.h:211
VisionSubsystem(const argos_lib::RobotInstance instance, SwerveDriveSubsystem *pDriveSubsystem)
Definition vision_subsytem.cpp:29
InterpolationMode
Definition vision_subsystem.h:140
std::jthread m_yawUpdateThread
Definition vision_subsystem.h:233
std::optional< frc::Pose2d > GetClosestReefTagPoseInCamSpace(bool resample=false)
Definition vision_subsytem.cpp:189
wpi::log::StructLogEntry< frc::Pose2d > m_rightCameraMegaTag2PoseLogger
Definition vision_subsystem.h:236
int m_latestRightHeartbeat
Definition vision_subsystem.h:225
int m_latestLeftHeartbeat
Definition vision_subsystem.h:224
bool m_useTrigonometry
specifies whether to use the trigonometry to obtain shooter angle
Definition vision_subsystem.h:214
bool m_isAimWhileMoveActive
true if aiming trigger is pressed and locked
Definition vision_subsystem.h:215
std::optional< frc::Translation2d > GetFieldCentricReefAlignmentError(bool resample=false)
Definition vision_subsytem.cpp:255
bool m_isAlgaeModeActive
true if algae mode is active
Definition vision_subsystem.h:222
void RequestFilterReset()
Definition vision_subsytem.cpp:156
std::optional< frc::Translation2d > GetRobotSpaceReefAlignmentError(bool resample=false)
Definition vision_subsytem.cpp:208
void SetAlgaeAlign(bool val)
Definition vision_subsytem.cpp:303
void Periodic() override
Definition vision_subsytem.cpp:108
bool m_isRightAlignActive
true if right alignment is requested
Definition vision_subsystem.h:219
void SetAimWhileMove(bool val)
Definition vision_subsytem.cpp:136
void SetL1Active(bool val)
Definition vision_subsytem.cpp:323
std::optional< whichCamera > m_latestReefSide
Side of robot that most recently saw the reef.
Definition vision_subsystem.h:229
bool m_isLeftAlignActive
true if left alignment is requested
Definition vision_subsystem.h:218
bool LeftAlignmentRequested()
Definition vision_subsytem.cpp:311
std::optional< whichCamera > getLatestReefSide()
Definition vision_subsytem.cpp:402
CameraInterface m_cameraInterface
Interface to limelight camera.
Definition vision_subsystem.h:205
argos_lib::Debouncer m_rightFresh
Definition vision_subsystem.h:228
argos_lib::RobotInstance m_instance
Contains either the competition bot or practice bot. Differentiates between the two.
Definition vision_subsystem.h:210
std::optional< LimelightTarget::tValues > GetSeeingCamera(bool resample=false)
Definition vision_subsytem.cpp:339
std::shared_ptr< nt::NetworkTable > m_rightCameraTable
Cached NetworkTable pointer for right camera.
Definition vision_subsystem.h:207
std::optional< unitlessChassisSpeeds > getVisionAlignmentSpeeds(double scalingFactor=1.0)
Definition vision_subsytem.cpp:529
bool m_isAlgaeAlignActive
true if algae alignment is requested
Definition vision_subsystem.h:220
std::chrono::steady_clock::time_point m_latestReefSpotTime
Time when reef was last seen by a camera.
Definition vision_subsystem.h:230
const std::string rightCameraTableName
Definition vision_subsystem.h:201
void SetAlgaeModeActive(bool val)
Definition vision_subsytem.cpp:331
void UpdateYaw(std::stop_token stopToken)
Definition vision_subsytem.cpp:176
bool m_isL1Active
true if L1 is active
Definition vision_subsystem.h:221
const std::string leftCameraTableName
Definition vision_subsystem.h:200
argos_lib::NTSubscriber m_leftCameraFrameUpdateSubscriber
Subscriber to manage all updates from left camera.
Definition vision_subsystem.h:231
bool m_isOdometryAimingActive
true if we want to aim without vision
Definition vision_subsystem.h:217
bool isAlgaeModeActive()
Definition vision_subsytem.cpp:335
argos_lib::Debouncer m_leftFresh
Definition vision_subsystem.h:227
LimelightTarget::tValues GetRightCameraTargetValues()
Get the robot poses and latencies from right camera.
Definition vision_subsytem.cpp:164
void SetPipeline(uint16_t tag)
Definition vision_subsytem.cpp:148
wpi::log::StructLogEntry< frc::Pose2d > m_leftCameraMegaTag2PoseLogger
Definition vision_subsystem.h:235
void SetLeftAlign(bool val)
Definition vision_subsytem.cpp:285
bool m_enableStaticRotation
true if you want to rotate in the absence of translation input
Definition vision_subsystem.h:216
bool robotAligned(bool resample=true)
Definition vision_subsytem.cpp:520
bool AlgaeAlignmentRequested()
Definition vision_subsytem.cpp:319
bool IsStaticRotationEnabled()
Definition vision_subsytem.cpp:140
Definition debouncer.h:14
Subscribes to Network Tables entry updates and calls a specified callback to use the new value.
Definition nt_subscriber.h:17
RobotInstance
Differentiates between practice robot and competition robot.
Definition config_types.h:13
Definition custom_units.h:11
Definition vision_subsystem.h:130
std::chrono::time_point< std::chrono::steady_clock > sampleTime
Definition vision_subsystem.h:132
whichCamera cameraID
Definition vision_subsystem.h:131
LimelightTarget::tValues target
Definition vision_subsystem.h:133
Wraps members of LimelightTarget for use elsewhere.
Definition vision_subsystem.h:69
frc::Pose3d robotPoseWPI
3d pose of robot relative to WPI reference for active alliance
Definition vision_subsystem.h:71
units::degree_t m_yaw
Yaw of target relative to camera -31.65 to 31.65 degrees.
Definition vision_subsystem.h:76
bool hasTargets
True if the camera has a target it can read.
Definition vision_subsystem.h:74
frc::Pose3d tagPoseCamSpace
Definition vision_subsystem.h:72
units::degree_t m_pitch
Pitch of target relative to camera -24.85 to 24.85 degrees.
Definition vision_subsystem.h:75
int hb
heartbeat
Definition vision_subsystem.h:80
double tagID
Tag ID.
Definition vision_subsystem.h:78
frc::Pose3d tagPoseRobotSpace
Definition vision_subsystem.h:73
frc::Pose3d robotPose
3d pose of robot relative to field center
Definition vision_subsystem.h:70
units::millisecond_t totalLatency
Total latency.
Definition vision_subsystem.h:79
double m_area
Area of the target in percentage of total pixels.
Definition vision_subsystem.h:77
Definition vision_subsystem.h:34
double leftSpeed
Definition vision_subsystem.h:36
double ccwSpeed
Definition vision_subsystem.h:37
double forwardSpeed
Definition vision_subsystem.h:35
whichCamera
Definition vision_subsystem.h:32