ROS2中的发布者与订阅者

71 阅读2分钟

在ROS (Robot Operating System) 中,发布者(Publisher)和订阅者(Subscriber)是实现节点间通信的两个基本概念。发布者负责发布消息到一个话题(Topic),而订阅者则订阅这个话题以接收消息。

以《权力的游戏》为背景,假设我们有一个名为WesterosNews的发布者,它负责发布关于七大王国最新动态的消息。另一方面,我们有一个订阅者名为Citizen,它订阅WesterosNews以获取最新的新闻。

#include "ros/ros.h"
#include "std_msgs/String.h"

// 订阅者回调函数,当接收到WesterosNews话题的消息时调用
void newsCallback(const std_msgs::String::ConstPtr& msg)
{
  ROS_INFO("Citizen hears: [%s]", msg->data.c_str());
}

int main(int argc, char **argv)
{
  // 初始化ROS节点
  ros::init(argc, argv, "citizen_node");

  // 创建节点句柄
  ros::NodeHandle n;

  // 创建一个订阅者,订阅名为WesterosNews的话题
  ros::Subscriber sub = n.subscribe("WesterosNews", 1000, newsCallback);

  // 进入ROS事件循环
  ros::spin();

  return 0;
}

在这个例子中,Citizen节点订阅了WesterosNews话题,并通过newsCallback函数处理接收到的消息。每当WesterosNews发布者发布新消息时,Citizen订阅者就会接收到并打印出来。

现在,让我们添加一个发布者Raven,它负责将消息发送到WesterosNews话题。

#include "ros/ros.h"
#include "std_msgs/String.h"

int main(int argc, char **argv)
{
  // 初始化ROS节点
  ros::init(argc, argv, "raven_node");

  // 创建节点句柄
  ros::NodeHandle n;

  // 创建一个发布者,发布到名为WesterosNews的话题
  ros::Publisher pub = n.advertise<std_msgs::String>("WesterosNews", 1000);

  // 设置循环频率
  ros::Rate loop_rate(10);

  while (ros::ok())
  {
    // 创建一个String消息
    std_msgs::String msg;

    // 设置消息内容
    msg.data = "Winter is coming!";

    // 发布消息
    pub.publish(msg);

    // 按照循环频率休眠
    loop_rate.sleep();
  }

  return 0;
}

在这个例子中,Raven节点作为发布者,定期向WesterosNews话题发布消息“Winter is coming!”。每当这个消息被发布时,所有订阅了WesterosNews话题的订阅者,如Citizen,都会接收到这条消息。

通过这样的发布/订阅机制,ROS节点可以灵活地进行通信,而不需要知道其他节点的具体实现细节,从而实现了松耦合的系统设计。这在《权力的游戏》中的角色之间传递信息的场景中非常有用,比如乌鸦传书就是一个现实中的发布/订阅模式的例子。