ROS2 的发布订阅模型是机器人通信的核心。下面是一个最小的 C++ 示例。

发布者节点

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

class Talker : public rclcpp::Node {
public:
  Talker() : Node("talker") {
    pub_ = this->create_publisher<std_msgs::msg::String>("chatter", 10);
    timer_ = this->create_wall_timer(std::chrono::seconds(1), [this]() {
      auto msg = std_msgs::msg::String();
      msg.data = "hello world";
      pub_->publish(msg);
    });
  }
private:
  rclcpp::Publisher<std_msgs::msg::String>::SharedPtr pub_;
  rclcpp::TimerBase::SharedPtr timer_;
};

int main(int argc, char** argv) {
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<Talker>());
  rclcpp::shutdown();
  return 0;
}

订阅者节点

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

int main(int argc, char** argv) {
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("listener");
  auto sub = node->create_subscription<std_msgs::msg::String>(
      "chatter", 10, [](const std_msgs::msg::String::SharedPtr msg) {
    RCLCPP_INFO(node->get_logger(), "I heard: %s", msg->data.c_str());
  });
  rclcpp::spin(node);
  rclcpp::shutdown();
}

这两个节点通过话题 chatter 通信,是 ROS2 里最简单的发布订阅模式。