在 ROS (Robot Operating System) 中,消息的发布和接收是通过一个基于主题的发布/订阅模型来实现的。这个模型允许节点之间的松耦合通信,即发布者(publisher)和订阅者(subscriber)不需要知道对方的存在。下面详细解释这一机制:
消息发布(Publishing)
-
定义发布者(Publisher):
- 节点使用
ros::NodeHandle
对象创建一个发布者对象,并指定要发布的消息类型和主题。 - 示例代码:
ros::Publisher pub = nh.advertise<std_msgs::String>("topic_name", queue_size);
- 节点使用
-
创建和发送消息:
- 节点创建特定类型的消息,并填充数据。
- 使用发布者对象发布消息。消息被发送到指定的主题上。
- 示例代码:
std_msgs::String msg; msg.data = "hello"; pub.publish(msg);
-
ROS主节点(Master):
- 发布者告知ROS主节点它将发布到哪个主题。
- ROS主节点维护主题和发布者之间的映射。
消息接收(Subscribing)
-
定义订阅者(Subscriber):
- 节点使用
ros::NodeHandle
对象创建一个订阅者对象,指定要订阅的主题、队列大小以及收到消息时调用的回调函数。 - 示例代码:
ros::Subscriber sub = nh.subscribe("topic_name", queue_size, callbackFunction);
- 节点使用
-
接收和处理消息:
- 当消息在订阅的主题上发布时,ROS调用定义的回调函数,并传入接收到的消息。
- 订阅者在回调函数中处理消息。
- 示例回调函数:
void callbackFunction(const std_msgs::String::ConstPtr& msg) { /* 处理消息 */ }
-
ROS主节点(Master):
- 订阅者告知ROS主节点它希望从哪个主题接收消息。
- ROS主节点负责通知发布者有新的订阅者。
通过这种机制,ROS能够在不同的节点之间有效地传递信息,从而实现复杂的机器人控制和数据处理流程。 例如下面代码:
pubGlobalMap = nh.advertise<sensor_msgs::PointCloud2>("liorf_localization/localization/global_map", 1);
创建了一个发布者(publisher)来发送 sensor_msgs::PointCloud2
类型的消息:
-
pubGlobalMap
:这是发布者对象的变量名。这个变量用于控制发布操作,比如发布消息或者关闭发布者。 -
nh.advertise<sensor_msgs::PointCloud2>("liorf_localization/localization/global_map", 1);
:nh
:是一个ros::NodeHandle
的实例,用于处理 ROS 节点的创建和通信。NodeHandle
是与 ROS 网络通信的主要接口。advertise<sensor_msgs::PointCloud2>
:这是一个模板函数,用于告诉 ROS 你想要发布什么类型的消息。消息类型是sensor_msgs::PointCloud2
,这是一个标准的 ROS 消息类型,用于表示三维点云。"liorf_localization/localization/global_map"
:是发布的主题名。其他 ROS 节点可以订阅这个主题来接收消息。1
:这是发布者的队列大小。队列大小决定了在消息被处理之前可以在缓冲区中积累的消息数量。在这个例子中,队列大小为 1 意味着如果新消息到达而旧消息尚未被订阅者处理,旧消息将被丢弃。
在 ROS 网络上创建一个用于发布 sensor_msgs::PointCloud2
消息的发布者,该发布者将消息发布到 "liorf_localization/localization/global_map"
主题,且队列大小为 1。