建立两个阿ros2节点,一个是发布者,一个是订阅者,订阅者能接受发布者的消息,发布者用来发送消息
时间: 2024-10-03 09:02:39 浏览: 25
ROS学习笔记5源码-发布者与订阅者.zip
建立一个ROS2(Robot Operating System version 2)发布者和订阅者的例子需要分为两部分:首先创建发布者节点,然后创建订阅者节点。以下是详细的步骤:
### 创建发布者节点 (Publisher)
1. **发布者节点代码**:
在 `src` 目录下新建一个文件如 `publisher_node.cpp`,并添加以下代码,它将定期发布 `std_msgs/msg/String` 类型的消息:
```cpp
#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/string.hpp>
class PublisherNode : public rclcpp::Node
{
public:
explicit PublisherNode(const std::string &name)
: Node(name),
publisher_(this->create_publisher<std_msgs::msg::String>("topic_name", 10)) // 假设话题名是 "topic_name"
{
auto timer = this->create_timer(1.0, [] { publish_message(); }); // 每秒发送一次消息
}
private:
void publish_message()
{
std_msgs::msg::String msg;
msg.data = "Hello from Publisher!";
RCLCPP_INFO(get_logger(), "Publishing message: %s", msg.data.c_str());
publisher_->publish(msg);
}
rclcpp::Publisher<std_msgs::msg::String> publisher_;
};
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
auto node = rclcpp::nodes::NodeFactory::create_node("publisher_node");
rclcpp::spin(node);
return 0;
}
```
2. **编译发布者**:
使用 `colcon build` 编译此节点。
### 创建订阅者节点 (Subscriber)
3. **订阅者节点代码**:
新建文件 `subscriber_node.cpp`,包含以下内容,它将从发布者那里接收并打印接收到的消息:
```cpp
#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/string.hpp>
class SubscriberNode : public rclcpp::Node
{
public:
explicit SubscriberNode(const std::string &name)
: Node(name),
subscription_(this->create_subscription<std_msgs::msg::String>("topic_name", 10,
[this](const std_msgs::msg::String::SharedPtr msg) { on_message_received(*msg); })) // 同样假设话题名是 "topic_name"
{
}
private:
void on_message_received(const std_msgs::msg::String::SharedPtr msg)
{
RCLCPP_INFO(get_logger(), "Received message: %s", msg->data.c_str());
}
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
auto node = rclcpp::nodes::NodeFactory::create_node("subscriber_node");
rclcpp::spin(node);
return 0;
}
```
4. **编译并运行订阅者**:
同样使用 `colcon build` 编译订阅者节点,然后分别通过 `colcon run publisher_node` 和 `colcon run subscriber_node` 运行这两个节点。
现在,发布者每隔一秒将消息发送到 "topic_name",而订阅者将在接收到消息时打印出来。
阅读全文