blob: af2dcef7222de68618d2b350db788b7968b6bbc8 [file] [log] [blame]
Jim Ostrowskiba2edd12022-12-03 15:44:37 -08001#ifndef FRC971_VISION_VISUALIZE_ROBOT_H_
2#define FRC971_VISION_VISUALIZE_ROBOT_H_
3
Philipp Schrader790cb542023-07-05 21:06:52 -07004#include "Eigen/Dense"
5#include "Eigen/Geometry"
Jim Ostrowskiba2edd12022-12-03 15:44:37 -08006#include <opencv2/core.hpp>
7#include <opencv2/highgui.hpp>
8#include <opencv2/imgproc.hpp>
9
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080010namespace frc971::vision {
Jim Ostrowskiba2edd12022-12-03 15:44:37 -080011
12// Helper class to visualize the coordinate frames associated with
13// the robot Based on a virtual camera viewpoint, and camera model,
14// this class can be used to draw 3D coordinate frames in a virtual
15// camera view.
16//
17// Mostly useful just for doing all the projection calculations
18// Leverages Eigen for transforms and opencv for drawing axes
19
20class VisualizeRobot {
21 public:
milind-u2ab4db12023-03-25 21:59:23 -070022 VisualizeRobot(cv::Size default_size = cv::Size(1280, 720))
23 : default_size_(default_size) {}
24
Jim Ostrowskiba2edd12022-12-03 15:44:37 -080025 // Set image on which to draw
26 void SetImage(cv::Mat image) { image_ = image; }
27
milind-ua30a4a12023-03-24 20:49:41 -070028 // Sets image to all black.
milind-u2ab4db12023-03-25 21:59:23 -070029 // Uses default_size_ if no image has been set yet, else image_.size()
30 void ClearImage() {
31 auto image_size = (image_.data == nullptr ? default_size_ : image_.size());
milind-ua30a4a12023-03-24 20:49:41 -070032 cv::Mat black_image_mat = cv::Mat::zeros(image_size, CV_8UC3);
33 SetImage(black_image_mat);
34 }
35
Jim Ostrowskiba2edd12022-12-03 15:44:37 -080036 // Set the viewpoint of the camera relative to a global origin
37 void SetViewpoint(Eigen::Affine3d view_origin) {
38 H_world_viewpoint_ = view_origin;
39 }
40
41 // Set camera parameters (for projection into a virtual view)
42 void SetCameraParameters(cv::Mat camera_intrinsics) {
Jim Ostrowski49be8232023-03-23 01:00:14 -070043 camera_mat_ = camera_intrinsics.clone();
Jim Ostrowskiba2edd12022-12-03 15:44:37 -080044 }
45
46 // Set distortion coefficients (defaults to 0)
47 void SetDistortionCoefficients(cv::Mat dist_coeffs) {
Jim Ostrowski49be8232023-03-23 01:00:14 -070048 dist_coeffs_ = dist_coeffs.clone();
Jim Ostrowskiba2edd12022-12-03 15:44:37 -080049 }
50
Jim Ostrowski49be8232023-03-23 01:00:14 -070051 // Sets up a default camera view 10 m above the origin, pointing down
52 // Uses image_width and focal_length to define a default camera projection
53 // matrix
54 void SetDefaultViewpoint(int image_width = 1000,
55 double focal_length = 1000.0);
56
Jim Ostrowskiba2edd12022-12-03 15:44:37 -080057 // Helper function to project a point in 3D to the virtual image coordinates
58 cv::Point ProjectPoint(Eigen::Vector3d point3d);
59
60 // Draw a line connecting two 3D points
milind-ua30a4a12023-03-24 20:49:41 -070061 void DrawLine(Eigen::Vector3d start, Eigen::Vector3d end,
62 cv::Scalar color = cv::Scalar(0, 200, 0));
Jim Ostrowskiba2edd12022-12-03 15:44:37 -080063
64 // Draw coordinate frame for a target frame relative to the world frame
65 // Axes are drawn (x,y,z) -> (red, green, blue)
66 void DrawFrameAxes(Eigen::Affine3d H_world_target, std::string label = "",
milind-ua30a4a12023-03-24 20:49:41 -070067 cv::Scalar label_color = cv::Scalar(0, 0, 255),
Jim Ostrowskiba2edd12022-12-03 15:44:37 -080068 double axis_scale = 0.25);
69
Jim Ostrowski49be8232023-03-23 01:00:14 -070070 // TODO<Jim>: Also implement DrawBoardOutline? Maybe one function w/
71 // parameters?
milind-ua30a4a12023-03-24 20:49:41 -070072 void DrawRobotOutline(Eigen::Affine3d H_world_robot, std::string label = "",
73 cv::Scalar color = cv::Scalar(0, 200, 0));
Jim Ostrowskiba2edd12022-12-03 15:44:37 -080074
75 Eigen::Affine3d H_world_viewpoint_; // Where to view the world from
76 cv::Mat image_; // Image to draw on
milind-u2ab4db12023-03-25 21:59:23 -070077 cv::Mat camera_mat_; // Virtual camera intrinsics (defines fov, center)
78 cv::Mat dist_coeffs_; // Distortion coefficients, if desired (only used in
79 // DrawFrameAxes
80 cv::Size default_size_; // Default image size
Jim Ostrowskiba2edd12022-12-03 15:44:37 -080081};
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080082} // namespace frc971::vision
Jim Ostrowskiba2edd12022-12-03 15:44:37 -080083
84#endif // FRC971_VISION_VISUALIZE_ROBOT_H_