背景:
ROS是在机器人领域大家常用的通信中间件。DDS是一个很古老的用在很多safe-critical领域的通信中间件(航天,汽车,战舰,金融等)。两者要解决的问题都是一样的:灵活,可靠的通信网络。并且两者都是在实际使用诞生的协议,所以都有很强的实用性。但两者有一些不同的价值观:
- ROS所在的机器人领域更加开放(基本都是开源软件),用户的参与度更高(大部分问题都是被社区人员回答)。但是在工业落地的应用相对于DDS少很多。
- DDS和ROS正好相反,基本所有问题都由开发商来回答,而且开源的代码很少。但是DDS的文档和案例库比ROS要强很多,而且通过很多落地项目的实践,验证了DDS的可靠性和实用性。
节点发现机制:
ROS需要一个中心节点ROS master来协调所有通信活动。而DDS完全摆脱了任何有集权作用的节点。自然DDS的容错能力更强。
组成:
- ROS中的node和DDS中的participent对应。ROS中一个进程只能有一个node,但是DDS中可以有多个participent。
- ROS和DDS中都有subscriber和publisher。ROS中的两者包含了具体的读写操作。但是DDS中的两者只是一个身份的标示。使用中还需要附带一个对应的DataReaders和DataWriters来处理具体怎么对不同的消息进行读写。DDS这样做的好处是可以来从不同的层级来设置各种属性。比如想要把某个特性(比如不需要正确性验证)应用到某个具体的消息传输上,可以对DataReaders进行修改。如果想要应用到所有Subscriber,就可以对subscriber进行修改。
- Topic的概念对ROS和DDS都相同。
QoS:
QoS是用来控制传输的行为的,比如:
- 在规定时间内没有发送成功就是放弃。
- 一定要阻塞到发送成功。
- 是否需要确认对方有收到消息。
- 是否需要错误验证等。
QoS在DDS中有很复杂的和灵活的设置方法。通过调整QoS系统,可以把整个系统从类UDP行为逐渐变成类TCP行为。而只是通过定义subscriber和publisher时几个有限的参数来控制QoS。这样做的好处是隐藏了很多普通用户不需要关心的复杂性。
效率上的比较:
ROS不用zero-copy的原因:ROS是基于TCP的,对于TCP的使用者可以一次性提供一大块需要传输的数据,然后由TCP来负责切分成小的package进行传输。在本地情况下(localhost),TCP自动的会把这一大块数据进行内存共享。所以在效率上,在本地环境下,通过TCP传输和zero-copy方式传输没有太大的效率差异。但是DDS是基于UDP,DDS会先把数据切成小块后,再给UDP进行传输,这样就和zero-copy的效率有很大的不同了。
另外使用ROS的时候,如果想要得到更快的大数据本地传输效率可以使用nodelets。nodelets把地址通过消息进行共享,是最快的共享方式。
服务和客户模式(Server/Client model):
目前DDS没有类似于ROS的Service功能
消息描述:
DDS使用的是.idl格式,ROS是自己定义的.msg格式。