11#include " infinite_sense.h"
2+ #include " mv_cam.h"
23#include " rclcpp/rclcpp.hpp"
3- #include " std_msgs/msg/string.hpp"
4- #include " sensor_msgs/msg/image.hpp"
54#include " sensor_msgs/image_encodings.hpp"
65#include " image_transport/image_transport.hpp"
7- #include " opencv2/highgui/highgui.hpp"
8- #include " opencv2/imgproc.hpp"
9- class InfiniteSenseGigeDriver : public rclcpp ::Node {
10- public:
11- InfiniteSenseGigeDriver ()
12- : Node(" gige_driver" ),
13- node_handle_ (),
14- transport_(node_handle_),
15- img_pub_(transport_.advertise(" camera/image_raw" , 1 )) {}
16-
17- private:
18- rclcpp::Node::SharedPtr node_handle_;
19- image_transport::ImageTransport transport_;
20- image_transport::Publisher img_pub_;
6+ #include " sensor_msgs/msg/imu.hpp"
7+ #include < cv_bridge/cv_bridge.h>
8+ class CamDriver final : public rclcpp::Node {
9+ public:
10+ CamDriver ()
11+ : Node(" gige_driver" ),
12+ node_handle_ (std::shared_ptr<CamDriver>(this , [](auto *) {})),
13+ transport_ (node_handle_) {
14+ synchronizer_.SetUsbLink (" /dev/ttyACM0" , 921600 );
15+ const auto mv_cam = std::make_shared<infinite_sense::MvCam>();
16+ mv_cam->SetParams ({{" cam_1" , infinite_sense::CAM_1}});
17+ synchronizer_.UseSensor (mv_cam);
18+ synchronizer_.Start ();
19+ imu_pub_ = this ->create_publisher <sensor_msgs::msg::Imu>(" imu/data" , 10 );
20+ img_pub_ = transport_.advertise (" image_raw" , 10 );
21+ {
22+ using namespace std ::placeholders;
23+ infinite_sense::Messenger::GetInstance ().SubStruct (" imu_1" , std::bind (&CamDriver::ImuCallback, this , _1, _2));
24+ infinite_sense::Messenger::GetInstance ().SubStruct (" cam_1" , std::bind (&CamDriver::ImageCallback, this , _1, _2));
25+ }
26+ }
27+ void ImuCallback (const void * msg, size_t ) const {
28+ const auto * imu_data = static_cast <const infinite_sense::ImuData*>(msg);
29+ sensor_msgs::msg::Imu imu_msg;
30+ rclcpp::Time stamp (static_cast <uint64_t >(imu_data->time_stamp_us ) * 1000 ); // 微秒 -> 纳秒
31+ imu_msg.header .stamp = stamp;
32+ imu_msg.header .frame_id = " imu_link" ;
33+ imu_msg.linear_acceleration .x = imu_data->a [0 ];
34+ imu_msg.linear_acceleration .y = imu_data->a [1 ];
35+ imu_msg.linear_acceleration .z = imu_data->a [2 ];
36+ imu_msg.angular_velocity .x = imu_data->g [0 ];
37+ imu_msg.angular_velocity .y = imu_data->g [1 ];
38+ imu_msg.angular_velocity .z = imu_data->g [2 ];
39+ imu_msg.orientation .w = imu_data->q [0 ];
40+ imu_msg.orientation .x = imu_data->q [1 ];
41+ imu_msg.orientation .y = imu_data->q [2 ];
42+ imu_msg.orientation .z = imu_data->q [3 ];
43+ imu_pub_->publish (imu_msg);
44+ }
45+ void ImageCallback (const void * msg, size_t ) {
46+ const auto * cam_data = static_cast <const infinite_sense::CamData*>(msg);
47+ // 构造 ROS2 图像消息
48+ std_msgs::msg::Header header;
49+ header.stamp = rclcpp::Time (cam_data->time_stamp_us * 1000 ); // us -> ns
50+ header.frame_id = " camera_link" ;
51+ const cv::Mat image_mat (cam_data->image .rows , cam_data->image .cols , CV_8UC1, cam_data->image .data );
52+ sensor_msgs::msg::Image::SharedPtr image_msg =
53+ cv_bridge::CvImage (header, " mono8" , image_mat).toImageMsg ();
54+ img_pub_.publish (image_msg);
55+ }
56+ private:
57+ infinite_sense::Synchronizer synchronizer_;
58+ rclcpp::Node::SharedPtr node_handle_;
59+ image_transport::ImageTransport transport_;
60+ image_transport::Publisher img_pub_;
61+ rclcpp::Publisher<sensor_msgs::msg::Imu>::SharedPtr imu_pub_;
2162};
2263
23- int main (int argc, char * argv[]) {
24- rclcpp::init (argc, argv );
25- rclcpp::shutdown ( );
26-
27- return 0 ;
28- }
64+ int main (const int argc, char * argv[]) {
65+ printf ( " Starting GigeCam ROS2 driver... \n " );
66+ rclcpp::init (argc, argv );
67+ rclcpp::spin (std::make_shared<CamDriver>());
68+ return 0 ;
69+ }
0 commit comments