Send april corners for foxglove displaying
Deleted AprilDebug and switched to foxglove image annotations.
Also made the displayed points a more visible color (pink).
Signed-off-by: milind-u <milind.upadhyay@gmail.com>
Change-Id: Ifb89784d00c80406237587acf17c40424632069b
diff --git a/y2023/BUILD b/y2023/BUILD
index 1c4ef71..3824ba1 100644
--- a/y2023/BUILD
+++ b/y2023/BUILD
@@ -110,7 +110,6 @@
"//frc971/vision:calibration_fbs",
"//frc971/vision:target_map_fbs",
"//frc971/vision:vision_fbs",
- "//y2023/vision:april_debug_fbs",
"@com_github_foxglove_schemas//:schemas",
],
target_compatible_with = ["@platforms//os:linux"],
diff --git a/y2023/vision/BUILD b/y2023/vision/BUILD
index 419217f..a0b0ce5 100644
--- a/y2023/vision/BUILD
+++ b/y2023/vision/BUILD
@@ -1,5 +1,3 @@
-load("@com_github_google_flatbuffers//:build_defs.bzl", "flatbuffer_cc_library")
-
cc_binary(
name = "camera_reader",
srcs = [
@@ -33,7 +31,6 @@
"//frc971/constants:constants_sender_lib",
"//frc971/vision:vision_fbs",
"//third_party:opencv",
- "//y2023/vision:april_debug_fbs",
"//y2023/vision:vision_util",
"@com_google_absl//absl/strings",
],
@@ -75,14 +72,6 @@
],
)
-flatbuffer_cc_library(
- name = "april_debug_fbs",
- srcs = ["april_debug.fbs"],
- gen_reflections = 1,
- target_compatible_with = ["@platforms//os:linux"],
- visibility = ["//visibility:public"],
-)
-
cc_library(
name = "aprilrobotics_lib",
srcs = [
@@ -92,7 +81,6 @@
target_compatible_with = ["@platforms//os:linux"],
visibility = ["//y2023:__subpackages__"],
deps = [
- ":april_debug_fbs",
":vision_util",
"//aos:init",
"//aos/events:shm_event_loop",
diff --git a/y2023/vision/april_debug.fbs b/y2023/vision/april_debug.fbs
deleted file mode 100644
index 4442448..0000000
--- a/y2023/vision/april_debug.fbs
+++ /dev/null
@@ -1,21 +0,0 @@
-namespace y2023.vision;
-
-// Stores image xy pixel coordinates of apriltag corners
-struct Point {
- x:double (id: 0);
- y:double (id: 1);
-}
-
-// Corner locations for each apriltag
-table AprilCorners {
- id:uint64 (id: 0);
- // Will always have 4 values, one for each corner
- points: [Point] (id: 1);
-}
-
-// List of positions of all apriltags detected in current frame
-table AprilDebug {
- corners: [AprilCorners] (id: 0);
-}
-
-root_type AprilDebug;
diff --git a/y2023/vision/aprilrobotics.cc b/y2023/vision/aprilrobotics.cc
index 07eee64..b132f85 100644
--- a/y2023/vision/aprilrobotics.cc
+++ b/y2023/vision/aprilrobotics.cc
@@ -27,8 +27,8 @@
chrono::milliseconds(5)),
target_map_sender_(
event_loop->MakeSender<frc971::vision::TargetMap>("/camera")),
- april_debug_sender_(
- event_loop->MakeSender<y2023::vision::AprilDebug>("/camera")) {
+ image_annotations_sender_(
+ event_loop->MakeSender<foxglove::ImageAnnotations>("/camera")) {
tag_family_ = tag16h5_create();
tag_detector_ = apriltag_detector_create();
@@ -80,7 +80,7 @@
void AprilRoboticsDetector::HandleImage(cv::Mat image_grayscale,
aos::monotonic_clock::time_point eof) {
std::vector<std::pair<apriltag_detection_t, apriltag_pose_t>> detections =
- DetectTags(image_grayscale);
+ DetectTags(image_grayscale, eof);
auto builder = target_map_sender_.MakeBuilder();
std::vector<flatbuffers::Offset<frc971::vision::TargetPoseFbs>> target_poses;
@@ -136,7 +136,8 @@
}
std::vector<std::pair<apriltag_detection_t, apriltag_pose_t>>
-AprilRoboticsDetector::DetectTags(cv::Mat image) {
+AprilRoboticsDetector::DetectTags(cv::Mat image,
+ aos::monotonic_clock::time_point eof) {
const aos::monotonic_clock::time_point start_time =
aos::monotonic_clock::now();
@@ -153,9 +154,9 @@
std::vector<std::pair<apriltag_detection_t, apriltag_pose_t>> results;
- std::vector<flatbuffers::Offset<AprilCorners>> corners_vector;
+ std::vector<std::vector<cv::Point2f>> corners_vector;
- auto builder = april_debug_sender_.MakeBuilder();
+ auto builder = image_annotations_sender_.MakeBuilder();
for (int i = 0; i < zarray_size(detections); i++) {
apriltag_detection_t *det;
@@ -195,33 +196,19 @@
.count()
<< " seconds for pose estimation";
- std::vector<Point> corner_points;
-
+ std::vector<cv::Point2f> corner_points;
corner_points.emplace_back(det->p[0][0], det->p[0][1]);
corner_points.emplace_back(det->p[1][0], det->p[1][1]);
corner_points.emplace_back(det->p[2][0], det->p[2][1]);
corner_points.emplace_back(det->p[3][0], det->p[3][1]);
- auto corner_points_fbs =
- builder.fbb()->CreateVectorOfStructs(corner_points);
-
- AprilCorners::Builder april_corners_builder =
- builder.MakeBuilder<AprilCorners>();
-
- april_corners_builder.add_id(det->id);
- april_corners_builder.add_points(corner_points_fbs);
-
- corners_vector.emplace_back(april_corners_builder.Finish());
+ corners_vector.emplace_back(corner_points);
}
}
- auto corners_vector_fbs = builder.fbb()->CreateVector(corners_vector);
-
- AprilDebug::Builder april_debug_builder = builder.MakeBuilder<AprilDebug>();
-
- april_debug_builder.add_corners(corners_vector_fbs);
-
- builder.CheckOk(builder.Send(april_debug_builder.Finish()));
+ const auto annotations_offset =
+ frc971::vision::BuildAnnotations(eof, corners_vector, 5.0, builder.fbb());
+ builder.CheckOk(builder.Send(annotations_offset));
apriltag_detections_destroy(detections);
diff --git a/y2023/vision/aprilrobotics.h b/y2023/vision/aprilrobotics.h
index 66b0aac..bbc1661 100644
--- a/y2023/vision/aprilrobotics.h
+++ b/y2023/vision/aprilrobotics.h
@@ -17,7 +17,6 @@
#include "third_party/apriltag/apriltag_pose.h"
#include "third_party/apriltag/tag16h5.h"
#include "y2023/constants/constants_generated.h"
-#include "y2023/vision/april_debug_generated.h"
DECLARE_int32(team_number);
@@ -36,7 +35,7 @@
void UndistortDetection(apriltag_detection_t *det) const;
std::vector<std::pair<apriltag_detection_t, apriltag_pose_t>> DetectTags(
- cv::Mat image);
+ cv::Mat image, aos::monotonic_clock::time_point eof);
const std::optional<cv::Mat> extrinsics() const { return extrinsics_; }
const cv::Mat intrinsics() const { return intrinsics_; }
@@ -64,7 +63,7 @@
frc971::vision::ImageCallback image_callback_;
aos::Sender<frc971::vision::TargetMap> target_map_sender_;
- aos::Sender<y2023::vision::AprilDebug> april_debug_sender_;
+ aos::Sender<foxglove::ImageAnnotations> image_annotations_sender_;
};
} // namespace vision
diff --git a/y2023/vision/viewer.cc b/y2023/vision/viewer.cc
index 7877a57..4fb96bc 100644
--- a/y2023/vision/viewer.cc
+++ b/y2023/vision/viewer.cc
@@ -10,7 +10,6 @@
#include "frc971/vision/vision_generated.h"
#include "opencv2/calib3d.hpp"
#include "opencv2/imgproc.hpp"
-#include "y2023/vision/april_debug_generated.h"
#include "y2023/vision/vision_util.h"
DEFINE_string(config, "aos_config.json", "Path to the config file to use.");
@@ -28,10 +27,8 @@
using frc971::vision::CameraImage;
bool DisplayLoop(const cv::Mat intrinsics, const cv::Mat dist_coeffs,
- aos::Fetcher<CameraImage> *image_fetcher,
- aos::Fetcher<AprilDebug> *april_debug_fetcher) {
+ aos::Fetcher<CameraImage> *image_fetcher) {
const CameraImage *image;
- std::optional<const AprilDebug *> april_debug = std::nullopt;
// Read next image
if (!image_fetcher->Fetch()) {
@@ -41,12 +38,6 @@
image = image_fetcher->get();
CHECK(image != nullptr) << "Couldn't read image";
- if (april_debug_fetcher->Fetch()) {
- april_debug = april_debug_fetcher->get();
- } else {
- VLOG(2) << "Couldn't fetch next target map";
- }
-
// Create color image:
cv::Mat image_color_mat(cv::Size(image->cols(), image->rows()), CV_8UC2,
(void *)image->data()->data());
@@ -66,17 +57,6 @@
cv::Mat undistorted_image;
cv::undistort(bgr_image, undistorted_image, intrinsics, dist_coeffs);
-
- if (april_debug.has_value() && april_debug.value()->corners()->size() > 0) {
- for (const auto *corners : *april_debug.value()->corners()) {
- std::vector<cv::Point> points;
- for (const auto *point_fbs : *corners->points()) {
- points.emplace_back(point_fbs->x(), point_fbs->y());
- }
- cv::polylines(undistorted_image, points, true, cv::Scalar(255, 0, 0), 10);
- }
- }
-
cv::imshow("Display", undistorted_image);
int keystroke = cv::waitKey(1);
@@ -109,14 +89,11 @@
aos::Fetcher<CameraImage> image_fetcher =
event_loop.MakeFetcher<CameraImage>(FLAGS_channel);
- aos::Fetcher<AprilDebug> april_debug_fetcher =
- event_loop.MakeFetcher<AprilDebug>("/camera");
// Run the display loop
event_loop.AddPhasedLoop(
[&](int) {
- if (!DisplayLoop(intrinsics, dist_coeffs, &image_fetcher,
- &april_debug_fetcher)) {
+ if (!DisplayLoop(intrinsics, dist_coeffs, &image_fetcher)) {
LOG(INFO) << "Calling event_loop Exit";
event_loop.Exit();
};
diff --git a/y2023/y2023_pi_template.json b/y2023/y2023_pi_template.json
index b6eaf04..9abc08d 100644
--- a/y2023/y2023_pi_template.json
+++ b/y2023/y2023_pi_template.json
@@ -217,15 +217,6 @@
]
},
{
- "name": "/pi{{ NUM }}/camera",
- "type": "y2023.vision.AprilDebug",
- "source_node": "pi{{ NUM }}",
- "frequency": 40,
- "num_senders": 2,
- "max_size": 40000,
- "logger": "LOCAL_LOGGER"
- },
- {
"name": "/pi{{ NUM }}/aos/remote_timestamps/imu/pi{{ NUM }}/camera/frc971-vision-TargetMap",
"type": "aos.message_bridge.RemoteMessage",
"frequency": 80,