A-A+

ROS 通讯层模型——by 西工大一小学生

2015年04月09日 Other 暂无评论 阅读 9,288 次

(翻译论文 A LIGHTWEIGHT OPEN-SOURCECOMMUNICATION FRAMEWORK FOR NATIVE INTEGRATION OF RESOURCE-CONSTRAINED ROBOTICS DEVICES WITH ROS 中的第四章,再加上一些自己的理解)

 

  1. 术语定义
  2. 远程过程调用 (RPC)
  3. 链接模式
  4. 数据流

 

 

  • 术语定义:

Name: 图模型中的Name 在ROS的封装体系中非常重要,所有的resource(从node到topic到service和parameter等)都是在某个namespace中用特定的Name进行了定义。 一般来说,resource 可以在自己的namespace中创建新的resource,访问和使用已有的resource。链接可以建立在不同的资源之间,namespace保证了不同resource间的Name不会冲突,也封装了resource内部。

 

(可以参考C++中namespace的概念。因为ROS分布式系统的设计思路,对与不同主机上,不同功能区块,都可以用namespace对其中的resource name 包括 topic name 等 进行保护,使得name管理更加结构化,更多体现在对于代码重用性的提高)

 

Computation graph: Computation graph是一个p2p的网络结构。Node之间的链接关系的拓扑结构为 mesh(网状)

 

Node:node是一个处理计算的进程。(操作系统中的一个进程,因为要占用端口号进行通讯,多机分布式系统中还要标明ip,详见后面的uri)Node在graph中使用topic service和parameter相互通讯,协调工作。在不同的系统设计中,node承载的功能粒度也不一样。比如大部分的设备驱动都是单独占用一个node,为了提高代码复用率经常会有细粒度的划分,而在很多视觉处理的系统避免使用多节点结构,传递图像数据会造成系统资源浪费(nodelet的应用)。Node的使用极大的增加了系统模块化和代码封装的程度,也给系统带来了一些错误容忍的能力。

 

Master node: master node 给ros系统中其他节点提供命名与注册的服务。它跟踪节点中的publisher与subscriber,service 的server与client,记录其他节点的位置(uri标明,host与port),并将这些信息通知给需要建立链接的节点。(从分布式系统的角度分析,ros这样p2p网络中集中式管理peer信息,也为仿真环境提供虚拟时钟 /clock 重要:ROS多机系统中,ros的全局时钟仅是本机的系统时钟,多机需要同步系统时间的工具来实现ros内时钟同步,一般是ntp,pr2应用 linux中的chrony进行基于ntp的系统时间同步)

 

Message: node之间通讯规定的统一数据格式,ros内部有数据格式规定语言来定义,然后由相应语言的client library中的message_generation 组件生成目标代码。提供统一的串行化/解串行化 方法。

 

Topic:ros中广为使用的是异步的 publish-subscribe 通讯模式。这种方式将信息的产生和使用双方解耦。一般来说,节点没有通讯对方那边的信息。Node从需要的topic那取得消息,topic 可以有多个 subscriber 与publisher。Topic 一般用于单向,消息流通讯。Node 需要同步通讯交换信息时一般使用service。Topic 一般拥有很强的类型定义:一种类型的topic只能接受/发送特定数据类型(message type)的message。Publisher 没有被要求类型一致性,但是接受时subscriber会检查类型的md5,进而报错。

 

Service: service 用于处理ros通讯中的同步通讯,采用server/client 语义。每个service type拥有 request 与 response两部分,对于service中的 server,ros不会检查重名(name conflict),只有最后注册的server会生效,与client建立连接。

 

Parameter: parameter 可以看作为ros系统运行时中定义的全局变量,而master node 中有parameter server 来维护这些变量。而namespace的存在使得parameter 拥有了非常清晰的层次划分,避免了重名,而且使得parameter访问可以单独访问也可以树状访问(层层解析namespace)

URI:定位node在分布式系统中的位置,格式为: protocol://host:port,protocol一般为http或者 rosrpc, host为 hostname 或者 ip 地址,port则为端口号。

TCPROS:基于tcp协议的ros应用层数据协议,用于解析topic 与 service的二进制数据流。

 

  • 远程过程调用(RPC)

ROS 通讯中,节点通过远程过程调用来实现建立连接,传输数据。ROS 中远程过程调用采用XML-RPC 实现。远程调用负责管理节点对计算图中信息的获取与更改,还有一些全局的设置。RPC不直接支持数据的流传输(通过TCPROS与 UDPROS支持)。XML-RPC 优势在于支持它的语言类型很多,而XML本身的文本属性导致方便人调试。XML-RPC被封装在http协议中传输,XML-RPC 调用时无状态的(stateless),没有状态信息需要追踪,简化了控制逻辑。

1》数据类型:

在XML-RPC中,方法参数和其返回值被封装在value 的实体中,value有以下几种固定的类型可以选择。(xml中体现为value的子标签)

string 为ascii 码的字符串,为value的默认格式。不合法的字符只有& 和 <,s & &lt;表示。

int 或者 i4 是32位的有符号整型,十进制表示中,前缀-号则为负数。

boolean 只有两种取值,0和1,用于表示布尔类型。

double  实数类型,前缀-号表示负数。

dataTime.iso8601 日期时间,用iso-8601格式表示。

base64 用 base64算法编码的二进制字符串。

array values组成的表,在data实体下一层

Struct 又称为map 表示关系的集合,每一个struct实体是由一个 name 与 value的键值对组成。

2》 请求与应答:

远程过程调用由两个阶段组成:请求(request) 与 应答(response)。 一个调用者将方法调用请求发给 被调用者,然后被调用者返回调用是否成功与相应返回值。

  1. 连接模式:

下面将简述节点与其他节点如何进行连接,最后初始化一个topic data的流传输,service 的实现有些许不同。

在之前对于节点与计算图的介绍中,节点在master node处注册 自己在publish /subscribe topic。通过registerPublisher()和 registerSubscriber() 。节点在master处注册完自己的subscribe/publish topic后,master都会返回一个成功的应答,其中包含所有publisher节点的URI,然后 subscriber去与相应的publisher建立连接传输 topic 相关信息(topic name,树蕨类型,传输类型等)。有任何新的节点去publisher 一个topic并且在master处已经完成自己的注册时,master会给所有subscribe 这个topic的节点发出一个publisherUpdate() 请求,里面包含所有可用的 publisher的URI,topic 消息的数据由TCPROS协议传输。

简单来说就是各个节点在 master处注册信息,master发现有节点subscribe/publish相同的topic时,将publisher的 信息通过 RPC 分发给各个subscriber,subscriber与publisher建立第一次连接,传输topic信息,然后再根据publisher返回的topic 信息,建立第二次连接,publisher开始 传输具体的数据。

service

 

而对称的过程是 注销(unregisteration), publisher 通过远程调用unregisterPublisher(), 然后subscriber通过unregisterSubscriber()注销,然而,是否关闭publisher与 subscriber间的数据流传输取决于节点本身。

Service的工作原理与topic有些许不同,同一个service能被多个节点注册,但是只有最后一个能被其他节点接受。一个节点调用service时,通过lookupService() 远程调用在master处查找相应service的URI。然后它将通过一个request 消息调用service的提供者,如果成功了,service提供者将返回一个相应的response 消息,失败了返回相应错误消息,(所有的消息传输默认都是通过 TCPROS协议。)

subscribe_publisher

 

  • 数据流

XML-RPC为我们提供了方便整洁的远程调用协议,但是它的冗长与以文本为中心的编码格式使得它不适合高带宽,低延迟的数据传输任务。ROS定义了自己的二进制数据流传输协议,减少了冗余的协议增加从而增加带宽,协议设计使得数据几乎不需要解析(相对于rpc),从而减少延迟。详细的TCPROS协议内容可以在 wiki.ros.org/ROS/TCPROS 找到。

(现在ROS中也有实现的UDPROS协议,可以通过TransportHints 数据结构指定下层传输协议,甚至通过继承Trasport 类 自己实现本机的进程间通讯方法)。

下面捡一些TCPROS中的重点说一下:

Md5:TCPROS为了保证两边传输数据类型一致,会在协议头中给出topic name 的md5 hash算法处理过的值,而每次你生成新的msg 时,md5的值都会因为你内部数据类型的变动而改变,这样就避免了新msg与 旧msg 传输类型不一致的问题。

Subscriber 选项tcp_nodelay :如果是“1” 则给socket 设置 TCP_NODELAY 选项,降低延迟,可能会降低传输效率。

Service client 选项:persistent 设置为1,则service的链接会一直开放给多个 service request

(下面是一些理解:

  • TCPROS的协议头占的字节数比较固定,所以传输一帧中只传输有效位几个字节是非常不划算的,很多情况下可以附上 std_msgs/header ,seq可以检测丢包,stamp可以检测消息实时性,frame_id很多情况下必备。
  • Roscpp 对 数据流的控制api比rospy要丰富很多,比如roscpp中有对callback queue的操作,多线程回调函数的支持等,对数据传输要求比较高的节点还是老老实实用cpp吧
  • 在一些对延迟要求比较高而又有一些无线通讯等高延迟传输介质存在的应用中,可以考虑用低延迟的方式互联,比如xbee模块代替wifi(自己写一些与其他节点的bridge),或者udpros代替tcpros,并且避免tcpros的协议头占用过多带宽)

 

最后的展望:

之前的老王说ros的系列已经吐槽的很有水平了,ros现有的通讯中间层也就是个勘用的水平,比起现代一些网络分布式中间件渣渣啊,没有qos一方面网络云应用什么的没法搞,另一方面本身实时性也不行。也无可厚非,毕竟是一群搞机器人的工程师,5月份要release的ros 2.0 我是满怀期待,把基础做好了,以后ros成为机器人界的标准平台指日可待啊。

(navigation 的进阶部分还得等一段时间,mavlink pixhawk小飞机上位机攻略近两个星期release吧,本科伤不起啊,另外有大神给介绍哪里上研比较好那就感谢了)

标签:

给我留言

Copyright © ExBot易科机器人实验室 保留所有权利.   Theme   Robin modified by poyoten

用户登录

分享到: