blob: f36f3eb81d98f77d79a6a8872fbb13f8af309493 [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"
6#include "aos/init.h"
7#include "aos/network/team_number.h"
8#include "aos/realtime.h"
9#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"
19#include "y2023/vision/calibration_data.h"
20
21DECLARE_int32(team_number);
22
23namespace y2023 {
24namespace vision {
25
26class AprilRoboticsDetector {
27 public:
28 AprilRoboticsDetector(aos::EventLoop *event_loop,
29 std::string_view channel_name);
30
31 ~AprilRoboticsDetector();
32
33 void SetWorkerpoolAffinities();
34
35 std::vector<std::pair<apriltag_detection_t, apriltag_pose_t>> DetectTags(
36 cv::Mat image);
37
38 private:
39 void HandleImage(cv::Mat image);
40
41 flatbuffers::Offset<frc971::vision::TargetPoseFbs> BuildTargetPose(
42 const apriltag_pose_t &pose,
43 frc971::vision::TargetMapper::TargetId target_id,
44 flatbuffers::FlatBufferBuilder *fbb);
45
46 static const frc971::vision::calibration::CameraCalibration *
47 FindCameraCalibration(
48 const frc971::vision::calibration::CalibrationData *calibration_data,
49 std::string_view node_name) {
50 for (const frc971::vision::calibration::CameraCalibration *candidate :
51 *calibration_data->camera_calibrations()) {
52 if (candidate->node_name()->string_view() != node_name) {
53 continue;
54 }
55 if (candidate->team_number() != FLAGS_team_number) {
56 continue;
57 }
58 return candidate;
59 }
60 LOG(FATAL) << ": Failed to find camera calibration for " << node_name
61 << " on " << FLAGS_team_number;
62 }
63
64 static cv::Mat CameraIntrinsics(
65 const frc971::vision::calibration::CameraCalibration
66 *camera_calibration) {
67 cv::Mat result(3, 3, CV_32F,
68 const_cast<void *>(static_cast<const void *>(
69 camera_calibration->intrinsics()->data())));
70 result.convertTo(result, CV_64F);
71 CHECK_EQ(result.total(), camera_calibration->intrinsics()->size());
72
73 return result;
74 }
75
76 static cv::Mat CameraDistCoeffs(
77 const frc971::vision::calibration::CameraCalibration
78 *camera_calibration) {
79 const cv::Mat result(5, 1, CV_32F,
80 const_cast<void *>(static_cast<const void *>(
81 camera_calibration->dist_coeffs()->data())));
82 CHECK_EQ(result.total(), camera_calibration->dist_coeffs()->size());
83 return result;
84 }
85
86 apriltag_family_t *tag_family_;
87 apriltag_detector_t *tag_detector_;
88
89 const aos::FlatbufferSpan<frc971::vision::calibration::CalibrationData>
90 calibration_data_;
91 const frc971::vision::calibration::CameraCalibration *calibration_;
92 cv::Mat intrinsics_;
93 cv::Mat camera_distortion_coeffs_;
94
95 aos::Ftrace ftrace_;
96
97 frc971::vision::ImageCallback image_callback_;
98 aos::Sender<frc971::vision::TargetMap> target_map_sender_;
99};
100
101} // namespace vision
102} // namespace y2023