使用ROS2和c++设计两个节点进行通信: 节点一发布一个话题,话题内容为 Hello,EV。 节点二订阅节点一的话题并且在回调函数中打印出 Welcome to EV。并且对每一句代码进行解释
时间: 2023-07-15 21:13:21 浏览: 87
下面是使用ROS2和C++设计两个节点进行通信的代码:
Node 1:
```
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
auto node = std::make_shared<rclcpp::Node>("node1");
auto publisher = node->create_publisher<std_msgs::msg::String>("topic", 10);
auto message = std_msgs::msg::String();
message.data = "Hello, EV";
rclcpp::WallRate loop_rate(1);
while (rclcpp::ok()) {
publisher->publish(message);
RCLCPP_INFO(node->get_logger(), "Publishing: '%s'", message.data.c_str());
rclcpp::spin_some(node);
loop_rate.sleep();
}
rclcpp::shutdown();
return 0;
}
```
这个节点创建了一个ROS2节点,发布话题`topic`,话题内容为`Hello, EV`。在一个while循环中,它以1Hz的频率发布消息,并输出发布的消息。当ROS2节点停止时,它会关闭。
Node 2:
```
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
void callback(const std_msgs::msg::String::SharedPtr msg)
{
RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "I heard: '%s'", msg->data.c_str());
RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Welcome to EV");
}
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
auto node = std::make_shared<rclcpp::Node>("node2");
auto subscription = node->create_subscription<std_msgs::msg::String>("topic", 10, callback);
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
```
这个节点创建了一个ROS2节点,订阅话题`topic`,并在回调函数中打印出收到的消息和额外的一条消息`Welcome to EV`。然后它开始自旋ROS2节点以等待消息。当ROS2节点停止时,它会关闭。
解释:
- `rclcpp::init(argc, argv)`:初始化ROS2节点。
- `auto node = std::make_shared<rclcpp::Node>("node1");`:创建ROS2节点。
- `auto publisher = node->create_publisher<std_msgs::msg::String>("topic", 10);`:创建一个发布者,发布类型为`std_msgs::msg::String`,话题名称为`topic`,队列长度为10。
- `auto message = std_msgs::msg::String(); message.data = "Hello, EV";`:创建一个消息对象并设置消息内容。
- `publisher->publish(message)`:发布消息。
- `RCLCPP_INFO(node->get_logger(), "Publishing: '%s'", message.data.c_str());`:输出发布的消息内容。
- `rclcpp::spin_some(node)`:处理所有待处理的回调函数。
- `rclcpp::shutdown()`:关闭ROS2节点。
阅读全文