返回

掌握ROS2:利用发布者和订阅者开启C++开发之旅

人工智能

使用 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" 接收消息,并在控制台中打印收到的消息。

常见问题解答

  1. 什么是 ROS2?

    ROS2 是一个机器人操作系统框架,用于构建机器人应用程序,具有高性能、多语言和跨平台等特点。

  2. 什么是发布者和订阅者?

    发布者负责向 Topic 发布消息,而订阅者负责从 Topic 接收消息。

  3. 如何创建发布者?

    使用 ros2 node create --name my_publisher 创建发布者节点,并编写发布消息的代码。

  4. 如何创建订阅者?

    使用 ros2 node create --name my_subscriber 创建订阅者节点,并编写订阅消息的代码。

  5. 如何使用发布者和订阅者进行通信?

    启动发布者和订阅者节点,发布者开始向 Topic 发布消息,订阅者开始接收消息并进行处理。