ros2在同一个节点发布和订阅消息
时间: 2024-09-23 17:08:26 浏览: 53
ROS2-Python-Node:基本ROS2节点,以便发布和订阅点云数据
在Robot Operating System (ROS) 2中,一个节点(Node)可以同时发布(Publish)和订阅(Subscribe)消息。这是通过ROS的消息传递系统(Message Passing)来完成的。以下是基本流程:
1. 发布消息:当你创建一个发布者(Publisher)时,你需要指定你想发布的消息的主题(Topic),以及消息的数据类型(Datatype)。发布者将消息放入该主题,并其他节点可以通过订阅这个主题来接收。
```cpp
#include <rclcpp/rclcpp.hpp>
#include <sensor_msgs/msg/image.hpp>
class ImagePublisher : public rclcpp::Node
{
public:
ImagePublisher()
{
img_msg_ = std::make_shared<sensor_msgs::msg::Image>();
// 创建发布者
image_publisher_ = this->create_publisher<sensor_msgs::msg::Image>("image_topic", 10);
}
void publishImage(const cv::Mat& image)
{
// 将OpenCV图像转换为ROS Image Message
toROSImage(image, *img_msg_);
// 发布消息
image_publisher_->publish(*img_msg_);
}
private:
rclcpp::Publisher<sensor_msgs::msg::Image>::SharedPtr image_publisher_;
sensor_msgs::msg::Image img_msg_;
};
```
2. 订阅消息:另一个节点可以通过创建订阅者Subscriber来监听特定的话题。当发布者发送消息时,订阅者会收到并处理这些消息。
```cpp
class ImageSubscriber : public rclcpp::Node
{
public:
ImageSubscriber()
{
// 创建订阅者
image_subscriber_ = this->create_subscription<sensor_msgs::msg::Image>("image_topic", 10,
[this](const sensor_msgs::msg::Image::SharedPtr msg) { handleReceivedImage(*msg); });
}
private:
void handleReceivedImage(const sensor_msgs::msg::Image::SharedPtr img_msg)
{
// 处理接收到的图像消息
cv::Mat received_image;
fromROSImage(img_msg, received_image);
// ... 进行进一步处理
}
rclcpp::Subscription<sensor_msgs::msg::Image>::SharedPtr image_subscriber_;
};
```
阅读全文