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 里最简单的发布订阅模式。