在 ROS (Robot Operating System) 中,消息的发布和接收是通过一个基于主题的发布/订阅模型来实现的。这个模型允许节点之间的松耦合通信,即发布者(publisher)和订阅者(subscriber)不需要知道对方的存在。下面详细解释这一机制:
定义发布者(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):
定义订阅者(Subscriber):
ros::NodeHandle
对象创建一个订阅者对象,指定要订阅的主题、队列大小以及收到消息时调用的回调函数。ros::Subscriber sub = nh.subscribe("topic_name", queue_size, callbackFunction);
接收和处理消息:
void callbackFunction(const std_msgs::String::ConstPtr& msg) { /* 处理消息 */ }
ROS主节点(Master):
通过这种机制,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。
?