|
1 | | -// 加入SDK头文件 |
2 | 1 | #include "infinite_sense.h" |
3 | | -// 加入工业相机头文件 |
4 | 2 | #include "mv_cam.h" |
| 3 | + |
| 4 | +#include <ros/ros.h> |
| 5 | +#include <cv_bridge/cv_bridge.h> |
| 6 | +#include <image_transport/image_transport.h> |
| 7 | +#include <sensor_msgs/Imu.h> |
| 8 | + |
5 | 9 | using namespace infinite_sense; |
6 | | -// 自定义回调函数 |
7 | | -void ImuCallback(const void *msg, size_t) { |
8 | | - const auto *imu_data = static_cast<const ImuData *>(msg); |
9 | | - // 处理IMU数据 |
| 10 | +inline ros::Time CreateRosTimestamp(const uint64_t mico_sec) { |
| 11 | + uint32_t nsec_per_second = 1e9; |
| 12 | + auto u64 = mico_sec * 1000; |
| 13 | + uint32_t sec = u64 / nsec_per_second; |
| 14 | + uint32_t nsec = u64 - (sec * nsec_per_second); |
| 15 | + return {sec, nsec}; |
10 | 16 | } |
11 | 17 |
|
12 | | -// 自定义回调函数 |
13 | | -void ImageCallback(const void *msg, size_t) { |
14 | | - const auto *cam_data = static_cast<const CamData *>(msg); |
15 | | - // 处理图像数据 |
16 | | -} |
| 18 | +class UdpDemoNode { |
| 19 | + public: |
| 20 | + UdpDemoNode(ros::NodeHandle &nh) : node_(nh), it_(node_), camera_name_("cam_1"), imu_name_("imu_1") {} |
| 21 | + |
| 22 | + void ImuCallback(const void *msg, size_t) { |
| 23 | + const auto *imu_data = static_cast<const ImuData *>(msg); |
| 24 | + sensor_msgs::Imu imu_msg_data; |
| 25 | + imu_msg_data.header.frame_id = "/base_imu_link"; |
| 26 | + imu_msg_data.header.stamp = CreateRosTimestamp(imudata.time_stamp_us); |
| 27 | + |
| 28 | + imu_msg_data.angular_velocity.x = imu_data->g[0]; |
| 29 | + imu_msg_data.angular_velocity.y = imu_data->g[1]; |
| 30 | + imu_msg_data.angular_velocity.z = imu_data->g[2]; |
| 31 | + |
| 32 | + imu_msg_data.linear_acceleration.x = imu_data->a[0]; |
| 33 | + imu_msg_data.linear_acceleration.y = imu_data->a[1]; |
| 34 | + imu_msg_data.linear_acceleration.z = imu_data->a[2]; |
| 35 | + |
| 36 | + imu_msg_data.orientation.w = imu_data->a[0]; |
| 37 | + imu_msg_data.orientation.x = imu_data->a[1]; |
| 38 | + imu_msg_data.orientation.y = imu_data->a[2]; |
| 39 | + imu_msg_data.orientation.z = imu_data->a[3]; |
| 40 | + imu_pub_.publish(imu_msg_data); |
| 41 | + } |
| 42 | + |
| 43 | + // 自定义回调函数 |
| 44 | + void ImageCallback(const void *msg, size_t) { |
| 45 | + const auto *cam_data = static_cast<const infinite_sense::CamData *>(msg); |
| 46 | + std_msgs::msg::Header header; |
| 47 | + header.stamp = rclcpp::Time(cam_data->time_stamp_us * 1000); |
| 48 | + header.frame_id = "map"; |
| 49 | + const cv::Mat image_mat(cam_data->image.rows, cam_data->image.cols, CV_8UC1, cam_data->image.data); |
| 50 | + const sensor_msgs::msg::Image::SharedPtr image_msg = cv_bridge::CvImage(header, "mono8", image_mat).toImageMsg(); |
| 51 | + image_pub_.publish(image_msg); |
| 52 | + } |
| 53 | + void Init() { |
| 54 | + synchronizer_.SetUsbLink("/dev/ttyACM0", 921600); |
| 55 | + mv_cam_ = std::make_shared<MvCam>(); |
| 56 | + mv_cam_->SetParams({{"cam_1", CAM_1}}); |
| 57 | + synchronizer_.UseSensor(mv_cam_); |
| 58 | + imu_pub_ = node_.advertise<sensor_msgs::Imu>(imu_name_, 1000); |
| 59 | + image_pub_ = it_.advertise(camera_name_, 30); |
| 60 | + synchronizer_.Start(); |
| 61 | + std::this_thread::sleep_for(std::chrono::milliseconds(5000)); |
| 62 | + Messenger::GetInstance().SubStruct("imu_1", ImuCallback); |
| 63 | + Messenger::GetInstance().SubStruct("cam_1", ImageCallback); |
| 64 | + } |
17 | 65 |
|
18 | | -int main() { |
19 | | - // 1.创建同步器 |
20 | | - Synchronizer synchronizer; |
21 | | - synchronizer.SetUsbLink("/dev/ttyACM0", 921600); |
22 | | - |
23 | | - // 2.配置同步接口 |
24 | | - auto mv_cam = std::make_shared<MvCam>(); |
25 | | - mv_cam->SetParams({{"cam_1", CAM_1}}); |
26 | | - synchronizer.UseSensor(mv_cam); |
27 | | - |
28 | | - // 3.开启同步 |
29 | | - synchronizer.Start(); |
30 | | - |
31 | | - // 4.接收数据 |
32 | | - Messenger::GetInstance().SubStruct("imu_1", ImuCallback); |
33 | | - Messenger::GetInstance().SubStruct("cam_1", ImageCallback); |
34 | | - // 阻塞线程 |
35 | | - while (true) { |
36 | | - std::this_thread::sleep_for(std::chrono::milliseconds(100)); |
| 66 | + void Run() { |
| 67 | + ros::Rate loop_rate(1000); |
| 68 | + while (ros::ok()) { |
| 69 | + ros::spinOnce(); |
| 70 | + loop_rate.sleep(); |
| 71 | + } |
| 72 | + synchronizer_.Stop(); |
37 | 73 | } |
38 | | - // 5.停止同步 |
39 | | - synchronizer.Stop(); |
| 74 | + |
| 75 | + private: |
| 76 | + ros::NodeHandle &node_; |
| 77 | + image_transport::ImageTransport it_; |
| 78 | + ros::Publisher imu_pub_; |
| 79 | + image_transport::Publisher image_pub_; |
| 80 | + std::shared_ptr<MvCam> mv_cam_; |
| 81 | + Synchronizer synchronizer_; |
| 82 | + std::string camera_name_; |
| 83 | + std::string imu_name_; |
| 84 | +}; |
| 85 | + |
| 86 | +int main(int argc, char **argv) { |
| 87 | + ros::init(argc, argv, "udp_demo", ros::init_options::NoSigintHandler); |
| 88 | + ros::NodeHandle node; |
| 89 | + UdpDemoNode demo_node(node); |
| 90 | + demo_node.Init(); |
| 91 | + demo_node.Run(); |
| 92 | + |
40 | 93 | return 0; |
41 | 94 | } |
0 commit comments