ROS发布消息与接受消息的机制

在 ROS (Robot Operating System) 中,消息的发布和接收是通过一个基于主题的发布/订阅模型来实现的。这个模型允许节点之间的松耦合通信,即发布者(publisher)和订阅者(subscriber)不需要知道对方的存在。下面详细解释这一机制:

消息发布(Publishing)

  1. 定义发布者(Publisher)

    • 节点使用 ros::NodeHandle 对象创建一个发布者对象,并指定要发布的消息类型和主题。
    • 示例代码:ros::Publisher pub = nh.advertise("topic_name", queue_size);
  2. 创建和发送消息

    • 节点创建特定类型的消息,并填充数据。
    • 使用发布者对象发布消息。消息被发送到指定的主题上。
    • 示例代码:std_msgs::String msg; msg.data = "hello"; pub.publish(msg);
  3. ROS主节点(Master)

    • 发布者告知ROS主节点它将发布到哪个主题。
    • ROS主节点维护主题和发布者之间的映射。

消息接收(Subscribing)

  1. 定义订阅者(Subscriber)

    • 节点使用 ros::NodeHandle 对象创建一个订阅者对象,指定要订阅的主题、队列大小以及收到消息时调用的回调函数。
    • 示例代码:ros::Subscriber sub = nh.subscribe("topic_name", queue_size, callbackFunction);
  2. 接收和处理消息

    • 当消息在订阅的主题上发布时,ROS调用定义的回调函数,并传入接收到的消息。
    • 订阅者在回调函数中处理消息。
    • 示例回调函数:void callbackFunction(const std_msgs::String::ConstPtr& msg) { /* 处理消息 */ }
  3. ROS主节点(Master)

    • 订阅者告知ROS主节点它希望从哪个主题接收消息。
    • ROS主节点负责通知发布者有新的订阅者。

通过这种机制,ROS能够在不同的节点之间有效地传递信息,从而实现复杂的机器人控制和数据处理流程。  例如下面代码:

 pubGlobalMap          = nh.advertise("liorf_localization/localization/global_map", 1);

创建了一个发布者(publisher)来发送 sensor_msgs::PointCloud2 类型的消息:

  1. pubGlobalMap:这是发布者对象的变量名。这个变量用于控制发布操作,比如发布消息或者关闭发布者。

  2. nh.advertise("liorf_localization/localization/global_map", 1);

    • nh:是一个 ros::NodeHandle 的实例,用于处理 ROS 节点的创建和通信。NodeHandle 是与 ROS 网络通信的主要接口。
    • advertise:这是一个模板函数,用于告诉 ROS 你想要发布什么类型的消息。消息类型是 sensor_msgs::PointCloud2,这是一个标准的 ROS 消息类型,用于表示三维点云。
    • "liorf_localization/localization/global_map":是发布的主题名。其他 ROS 节点可以订阅这个主题来接收消息。
    • 1:这是发布者的队列大小。队列大小决定了在消息被处理之前可以在缓冲区中积累的消息数量。在这个例子中,队列大小为 1 意味着如果新消息到达而旧消息尚未被订阅者处理,旧消息将被丢弃。

在 ROS 网络上创建一个用于发布 sensor_msgs::PointCloud2 消息的发布者,该发布者将消息发布到 "liorf_localization/localization/global_map" 主题,且队列大小为 1。

 

你可能感兴趣的:(SLAM,人工智能)