Skip to content

Commit cae7da9

Browse files
committed
fixes #4 finished ros1 demo
1 parent 4d5e664 commit cae7da9

1 file changed

Lines changed: 85 additions & 32 deletions

File tree

example/GigeCam/main_ros.cpp

Lines changed: 85 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,94 @@
1-
// 加入SDK头文件
21
#include "infinite_sense.h"
3-
// 加入工业相机头文件
42
#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+
59
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};
1016
}
1117

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+
}
1765

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();
3773
}
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+
4093
return 0;
4194
}

0 commit comments

Comments
 (0)