Skip to content

Commit 7eddec9

Browse files
committed
add ROS2 node here
1 parent 238760d commit 7eddec9

File tree

5 files changed

+72
-28
lines changed

5 files changed

+72
-28
lines changed

example/GigeCam/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ using namespace infinite_sense;
66
// 自定义回调函数
77
void ImuCallback(const void* msg, size_t) {
88
const auto* imu_data = static_cast<const ImuData*>(msg);
9+
LOG(INFO) << imu_data->time_stamp_us << " " << "Accel: " << imu_data->a[0] << " " << imu_data->a[1] << " " << imu_data->a[2] << " Gyro: " << imu_data->g[0] << " " << imu_data->g[1] << " " << imu_data->g[2] << " Temp: " << imu_data->temperature;
910
// 处理IMU数据
1011
}
1112
// 自定义回调函数

example/GigeCam/main_ros2.cpp

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,69 @@
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+
}
-242 KB
Binary file not shown.

infinite_sense_core/include/messenger.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
#include <unordered_set>
88
#include <unordered_map>
99
#include <functional>
10+
11+
#include "config.h"
12+
1013
namespace infinite_sense {
1114
class Messenger {
1215
public:
@@ -22,7 +25,7 @@ class Messenger {
2225
void Sub(const std::string& topic, const std::function<void(const std::string&)>& callback);
2326
void SubStruct(const std::string& topic, const std::function<void(const void*, size_t)>& callback);
2427

25-
private:
28+
private:
2629
Messenger();
2730
~Messenger();
2831
void CleanUp();

infinite_sense_core/src/messenger.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ void Messenger::Pub(const std::string& topic, const std::string& metadata) {
4646
}
4747
}
4848

49-
void Messenger::PubStruct(const std::string& topic, const void* data, size_t size) {
49+
void Messenger::PubStruct(const std::string& topic, const void* data, const size_t size) {
5050
try {
5151
publisher_.send(zmq::buffer(topic), zmq::send_flags::sndmore);
5252
publisher_.send(zmq::buffer(data, size), zmq::send_flags::dontwait);
@@ -56,12 +56,11 @@ void Messenger::PubStruct(const std::string& topic, const void* data, size_t siz
5656
}
5757

5858
void Messenger::Sub(const std::string& topic, const std::function<void(const std::string&)>& callback) {
59-
sub_threads_.emplace_back([=, this]() {
59+
sub_threads_.emplace_back([this, topic, callback]() {
6060
try {
6161
zmq::socket_t subscriber(context_, zmq::socket_type::sub);
6262
subscriber.connect(endpoint_);
6363
subscriber.set(zmq::sockopt::subscribe, topic);
64-
6564
while (true) {
6665
zmq::message_t topic_msg, data_msg;
6766
if (!subscriber.recv(topic_msg) || !subscriber.recv(data_msg)) {
@@ -82,9 +81,9 @@ void Messenger::Sub(const std::string& topic, const std::function<void(const std
8281
}
8382

8483
void Messenger::SubStruct(const std::string& topic, const std::function<void(const void*, size_t)>& callback) {
85-
sub_threads_.emplace_back([=, this]() {
84+
sub_threads_.emplace_back([this, topic, callback]() {
8685
try {
87-
zmq::context_t context = zmq::context_t(1);
86+
auto context = zmq::context_t(1);
8887
zmq::socket_t subscriber(context, zmq::socket_type::sub);
8988
subscriber.connect(endpoint_);
9089
subscriber.set(zmq::sockopt::subscribe, topic);

0 commit comments

Comments
 (0)