您的位置:首页 > 其它

ROS学习笔记2 消息发布与订阅

2017-11-26 16:19 435 查看
(1)ROS的消息机制

ROS的消息机制是多对多的广播机制。即一个或者多个节点(Node)向话题(Topic)发布消息,同时有一个或者多个节点(Node)从一个话题订阅消息。这是一种典型的多对多广播模式。这种广播模式意味着,发布者消息的节点不需要知道有多少节点或者哪个节点订阅了消息,发布者只需要发布即可。无需关心后续的消息处理。

(2)理解节点

节点是ROS中运行的一个计算过程。节点可以通过ROS话题(Topics)、Services(服务)和Parameters(参数)进行通讯。

一个机器人可能会包含许多节点(Nodes)。比如,一个节点用来处理摄像头图像,一个节点处理来自机器人的各种数据,一个节点用来处理里程计的数据。

所有运行的节点都应该自己独特的名字来和其它节点区分开。比如/camera_node 这个节点可能是用来对摄像头图像进行处理的节点的名称。

ROS提供了rosbash命令行工具来对节点进行管理。具体命令是rosnode,下面是rosnode命令的用法:

(1) $ rosnode info node-name : 打印节点信息。
(2) $ rosnode kill node-name : 结束一个节点的运行
(3) $ rosnode list : 列出所有正在运行的节点
(4) $ rosnode machine machine-name : 列出在某个机器上运行的节点
(5) $ rosnode ping : 检查节点的连接性
(6) $ rosnode cleanup : 消除无法接触到的节点


ROS消息工具:

ROS提供了rosmsg命令来查看消息信息:

(1) $ rosmsg show [message] : 显示对某个消息的描述
(2) $ rosmsg list  : 列出所有的消息
(3) $ rosmag md5 [message] : 显示一个消息的md5sum(用来校验信息传递的完整性)
(4) $ rosmsg package [package-name] : 列出一个节点的消息
(5) $ rosmag packages [package-l] : 列出包含消息的节点


ROS话题(Topics):

ROS 中话题(Topics)被称作总线(buses),即节点通过话题交换信息。 话题匿名地发布和接收消息。节点之间使用话题通讯是单向的,如果想使用请求(request)和回应(response)模式通讯,就需要使用ROS中的服务(Services)模式。

ROS中的节点之间通讯使用的话题是基于TCP/IP的,被称为TCPROS。这是ROS中的默认通讯模式。对于远程操作,还有一种低延迟的通讯是UDPROS。

ROS中话题的命令行工具是 rostopic,用法如下:

(1) $ rostopic bw /topic : 返回给定话题的传输带宽。
(2) $ rostopic echo /topic : 打印给定话题的内容。
(3) $ rostopic find /message_type : 找到使用给定消息的话题
(4) $ rostopic hz /topic : 显示给定话题的发布消息速度
(5) $ rostopic info /topic : 显示一个活跃话题的信息
(6) $ rostopic pub /topic message_type args : 向一个话题发送一个消息类型的值
(7) $ rostopic type /topic : 显示一个给定话题的消息类型


(3) 理解节点管理器

ROS中的节点管理其类似与DNS中的服务器,当系统中任何一个节点启动时,都会主动寻找节点管理器并且将自己的名字在节点管理器处登记。因此节点管理器有系统中所有正在运行的节点的详细信息。当某个节点的信息发生变化,节点管理器处就会知道这个变化。

当一个节点要发送话题时,就会首先将信息的名字、数据结构之类的信息告知节点管理器, 节点管理器就会在系统中运行的节点中查找是否有节点订阅了同样类型的话题,如果找到了这样的节点,节点管理器就会将话题发布节点的信息告知话题订阅节点,然后,两个节点就会通过TCP/IP协议通讯,节点管理器就失去了对两个节点的控制权。对于服务,上述过程一样。

在ROS_MASTER_URI环境变量中,包含着节点管理器的IP和接口。ROS中的节点就是通过这个变量找到节点管理器的。在单机系统中,可以直接使用本地主机作为节点管理器的IP ,但是在分布式系统中,必须指定一个机器上运行节点管理器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息