掌握ROS2:利用发布者和订阅者开启C++开发之旅
2023-12-17 19:54:11
使用 ROS2 发布者和订阅者进行通信
在机器人技术领域,ROS2(机器人操作系统 2)作为一个创新的软件框架,正在引发一场机器人开发革命。其高性能、多语言、跨平台等特性,使 ROS2 成为机器人开发的首选工具。掌握 ROS2 技能,将为开发者开启机器人应用开发的大门。
ROS2 将复杂系统分解为模块化节点,通过 ROS 图进行通信,其中 Topic 扮演着至关重要的角色。Topic 充当节点之间交换消息的总线,节点可以向任意数量的 Topic 发布消息,而订阅者可以订阅任意数量的 Topic。
发布者
发布者负责向 Topic 发布消息,可以发布任何类型的数据,但最常见的是字符串、数字和传感器数据。要创建一个发布者,需创建一个新节点。以下命令可在命令行中创建节点:
ros2 node create --name my_publisher
创建节点后,编写发布消息的代码:
#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/string.hpp>
class MyPublisher : public rclcpp::Node
{
public:
MyPublisher()
: Node("my_publisher")
{
publisher_ = create_publisher<std_msgs::msg::String>("my_topic");
}
void publish_message()
{
std_msgs::msg::String message;
message.data = "Hello, ROS2!";
publisher_->publish(message);
}
private:
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
};
订阅者
订阅者负责从 Topic 接收消息,可以订阅任意数量的 Topic,并处理接收到的消息。要创建一个订阅者,同样需创建一个新节点,命令行创建方式如下:
ros2 node create --name my_subscriber
创建节点后,编写订阅消息的代码:
#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/string.hpp>
class MySubscriber : public rclcpp::Node
{
public:
MySubscriber()
: Node("my_subscriber")
{
subscription_ = create_subscription<std_msgs::msg::String>("my_topic", 10, std::bind(&MySubscriber::callback, this, std::placeholders::_1));
}
private:
void callback(const std_msgs::msg::String::SharedPtr msg)
{
RCLCPP_INFO(this->get_logger(), "I received: '%s'", msg->data.c_str());
}
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};
使用发布者和订阅者进行通信
了解如何创建发布者和订阅者后,接下来展示如何使用它们进行通信。首先,启动发布者和订阅者节点:
发布者节点:
ros2 run my_publisher
订阅者节点:
ros2 run my_subscriber
启动节点后,发布者节点开始向 "my_topic" 发布消息,订阅者节点开始从 "my_topic" 接收消息,并在控制台中打印收到的消息。
常见问题解答
-
什么是 ROS2?
ROS2 是一个机器人操作系统框架,用于构建机器人应用程序,具有高性能、多语言和跨平台等特点。
-
什么是发布者和订阅者?
发布者负责向 Topic 发布消息,而订阅者负责从 Topic 接收消息。
-
如何创建发布者?
使用
ros2 node create --name my_publisher
创建发布者节点,并编写发布消息的代码。 -
如何创建订阅者?
使用
ros2 node create --name my_subscriber
创建订阅者节点,并编写订阅消息的代码。 -
如何使用发布者和订阅者进行通信?
启动发布者和订阅者节点,发布者开始向 Topic 发布消息,订阅者开始接收消息并进行处理。