blob: 44778566091549e8eb4f3d0a9bfd5232734ce3e6 [file] [log] [blame]
Maxwell Hendersonfebee252023-01-28 16:53:52 -08001
2#include <string>
3
4#include "aos/events/event_loop.h"
5#include "aos/events/shm_event_loop.h"
Maxwell Hendersonfebee252023-01-28 16:53:52 -08006#include "aos/network/team_number.h"
7#include "aos/realtime.h"
milind-uf2a4e322023-02-01 19:33:10 -08008#include "frc971/constants/constants_sender_lib.h"
Maxwell Hendersonfebee252023-01-28 16:53:52 -08009#include "frc971/vision/calibration_generated.h"
10#include "frc971/vision/charuco_lib.h"
11#include "frc971/vision/target_map_generated.h"
12#include "frc971/vision/target_mapper.h"
13#include "frc971/vision/vision_generated.h"
14#include "opencv2/core/eigen.hpp"
15#include "opencv2/imgproc.hpp"
16#include "third_party/apriltag/apriltag.h"
17#include "third_party/apriltag/apriltag_pose.h"
18#include "third_party/apriltag/tag16h5.h"
James Kuszmauld67f6d22023-02-05 17:37:25 -080019#include "y2023/constants/constants_generated.h"
milind-uf2a4e322023-02-01 19:33:10 -080020#include "y2023/vision/april_debug_generated.h"
Maxwell Hendersonfebee252023-01-28 16:53:52 -080021
22DECLARE_int32(team_number);
23
24namespace y2023 {
25namespace vision {
26
27class AprilRoboticsDetector {
28 public:
29 AprilRoboticsDetector(aos::EventLoop *event_loop,
30 std::string_view channel_name);
Maxwell Hendersonfebee252023-01-28 16:53:52 -080031 ~AprilRoboticsDetector();
32
33 void SetWorkerpoolAffinities();
34
milind-uf2a4e322023-02-01 19:33:10 -080035 // Undistorts the april tag corners using the camera calibration
36 void UndistortDetection(apriltag_detection_t *det) const;
37
Maxwell Hendersonfebee252023-01-28 16:53:52 -080038 std::vector<std::pair<apriltag_detection_t, apriltag_pose_t>> DetectTags(
39 cv::Mat image);
40
milind-uf2a4e322023-02-01 19:33:10 -080041 const cv::Mat extrinsics() const { return extrinsics_; }
42 const cv::Mat intrinsics() const { return intrinsics_; }
43 const cv::Mat dist_coeffs() const { return dist_coeffs_; }
44
Maxwell Hendersonfebee252023-01-28 16:53:52 -080045 private:
milind-u09fb1252023-01-28 19:21:41 -080046 void HandleImage(cv::Mat image, aos::monotonic_clock::time_point eof);
Maxwell Hendersonfebee252023-01-28 16:53:52 -080047
48 flatbuffers::Offset<frc971::vision::TargetPoseFbs> BuildTargetPose(
49 const apriltag_pose_t &pose,
50 frc971::vision::TargetMapper::TargetId target_id,
51 flatbuffers::FlatBufferBuilder *fbb);
52
Maxwell Hendersonfebee252023-01-28 16:53:52 -080053 apriltag_family_t *tag_family_;
54 apriltag_detector_t *tag_detector_;
55
James Kuszmauld67f6d22023-02-05 17:37:25 -080056 const frc971::constants::ConstantsFetcher<Constants> calibration_data_;
Maxwell Hendersonfebee252023-01-28 16:53:52 -080057 const frc971::vision::calibration::CameraCalibration *calibration_;
58 cv::Mat intrinsics_;
milind-uf2a4e322023-02-01 19:33:10 -080059 cv::Mat projection_matrix_;
60 cv::Mat extrinsics_;
61 cv::Mat dist_coeffs_;
Maxwell Hendersonfebee252023-01-28 16:53:52 -080062
63 aos::Ftrace ftrace_;
64
65 frc971::vision::ImageCallback image_callback_;
66 aos::Sender<frc971::vision::TargetMap> target_map_sender_;
Yash Chainani728ae222023-02-04 19:48:12 -080067 aos::Sender<y2023::vision::AprilDebug> april_debug_sender_;
Maxwell Hendersonfebee252023-01-28 16:53:52 -080068};
69
70} // namespace vision
71} // namespace y2023