blob: 1e5b2e83e51e344a7fd99dfdfe5f4cff8063a434 [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"
Maxwell Hendersonfebee252023-01-28 16:53:52 -080020
Maxwell Hendersonfebee252023-01-28 16:53:52 -080021namespace y2023 {
22namespace vision {
23
24class AprilRoboticsDetector {
25 public:
26 AprilRoboticsDetector(aos::EventLoop *event_loop,
27 std::string_view channel_name);
Maxwell Hendersonfebee252023-01-28 16:53:52 -080028 ~AprilRoboticsDetector();
29
30 void SetWorkerpoolAffinities();
31
milind-uf2a4e322023-02-01 19:33:10 -080032 // Undistorts the april tag corners using the camera calibration
33 void UndistortDetection(apriltag_detection_t *det) const;
34
Maxwell Hendersonfebee252023-01-28 16:53:52 -080035 std::vector<std::pair<apriltag_detection_t, apriltag_pose_t>> DetectTags(
milind-u7aa29e22023-02-23 20:22:01 -080036 cv::Mat image, aos::monotonic_clock::time_point eof);
Maxwell Hendersonfebee252023-01-28 16:53:52 -080037
James Kuszmaul258e4ee2023-02-23 14:22:30 -080038 const std::optional<cv::Mat> extrinsics() const { return extrinsics_; }
milind-uf2a4e322023-02-01 19:33:10 -080039 const cv::Mat intrinsics() const { return intrinsics_; }
40 const cv::Mat dist_coeffs() const { return dist_coeffs_; }
41
Maxwell Hendersonfebee252023-01-28 16:53:52 -080042 private:
milind-u09fb1252023-01-28 19:21:41 -080043 void HandleImage(cv::Mat image, aos::monotonic_clock::time_point eof);
Maxwell Hendersonfebee252023-01-28 16:53:52 -080044
45 flatbuffers::Offset<frc971::vision::TargetPoseFbs> BuildTargetPose(
milind-u681c4712023-02-23 21:22:50 -080046 const apriltag_pose_t &pose, const apriltag_detection_t &det,
Maxwell Hendersonfebee252023-01-28 16:53:52 -080047 flatbuffers::FlatBufferBuilder *fbb);
48
Maxwell Hendersonfebee252023-01-28 16:53:52 -080049 apriltag_family_t *tag_family_;
50 apriltag_detector_t *tag_detector_;
51
James Kuszmauld67f6d22023-02-05 17:37:25 -080052 const frc971::constants::ConstantsFetcher<Constants> calibration_data_;
Maxwell Hendersonfebee252023-01-28 16:53:52 -080053 const frc971::vision::calibration::CameraCalibration *calibration_;
54 cv::Mat intrinsics_;
milind-uf2a4e322023-02-01 19:33:10 -080055 cv::Mat projection_matrix_;
James Kuszmaul258e4ee2023-02-23 14:22:30 -080056 std::optional<cv::Mat> extrinsics_;
milind-uf2a4e322023-02-01 19:33:10 -080057 cv::Mat dist_coeffs_;
Maxwell Hendersonfebee252023-01-28 16:53:52 -080058
59 aos::Ftrace ftrace_;
60
61 frc971::vision::ImageCallback image_callback_;
62 aos::Sender<frc971::vision::TargetMap> target_map_sender_;
milind-u7aa29e22023-02-23 20:22:01 -080063 aos::Sender<foxglove::ImageAnnotations> image_annotations_sender_;
Maxwell Hendersonfebee252023-01-28 16:53:52 -080064};
65
66} // namespace vision
67} // namespace y2023