ROS2是使用节点之间的发布者/订阅者消息传递的分布式架构
ROS2在其消息传递层采用了不同的方法,现在采用了称为数据分布式服务(DDS)的行业标准。
但是,DDS是一种用于通信的中间件,也支持发布者/订阅者。
那么,我们可以直接使用DDS,为什么要使用ROS2?
DDS是OMG提出的通信标准。它的目标市场更为通用,如军事,空中交通管制,自动驾驶汽车,医疗设备......很少有供应商提供企业和开源版本,但只有极少数人或市场可以决定他们未来的工作或设计。
任何想要将DDS用于其产品的人都需要从头开始。
ROS2更像是一个生态系统。 ROS2的领导者 - OSRF为想要创建机器人应用程序的人提供了生态系统,文档和友好框架。
任何人都可以将自己的想法提交给核心设计或为社区提供自己的贡献。
参与者,主题,出版商,订户,datareader和数据编写者
是的,DDS有出版商和订阅者。此外,它有参与者,主题,出版商,订阅者,数据编写者和数据头,他们在DDS的数据共享空间中被称为实体。
每个实体拥有不同的QoS属性,并影响实体管理数据交付或数据生命周期的方式。
参与者控制整个实体的创建,删除,分组。它有能力知道新实体加入或离开。
不同的参与者由域ID(整数)标识。
主题就像拥有QoS信息的目标一样,数据编写者和数据头可以相互链接。
发布者和订阅者控制数据传递和数据可用性,使其拥有自己的datareader和数据编写器。
Publisher只能有多个数据写入器,而Subscriber只能有多个datareader。
DataWriter是数据提供者,DataReader是数据使用者。他们需要与目标主题具有相同的QoS。
DDS主题命名:
取消链接其他发布/订阅模型,他们不会大量使用斜杠/
,相反,它们是面向对象的。
命名空间和节点。
它就像主题,但有命名空间。
ROS2高度使用命名空间和削减/
。它的命名空间以/
开头。例如,/turtle/cmd_vel
,turtle是命名空间,cmd_vel是它的基本名称。
只是提供或使用数据的基本元素。
您可以查看ros2 topic and service names以获取ROS2 pub / sub命名设计。
ROS2更专注于机器人应用程序设计,消除了编写DDS复杂pub / sub应用程序的难度。
我同意ROS2提供比DDS更高级别的抽象,特别是对于某些类型的机器人应用程序。此外,ROS2还提供专为机器人设计的现成数据类型和组件。所以你得到了很多构建块。这肯定使在该域中构建系统变得更容易。
这就是说你需要知道使用ROS2而不是原生DDS也需要花费成本。 ROS2简化的一种方法是预先选择DDS支持的Qos子集和信息交换模式。因此,使用ROS2无法访问某些DDS功能和Qos。有许多与发布 - 订阅通信相关的事情,您可以使用DDS但不使用基于DDS的ROS2 API。还有许多数据类型可以使用DDS IDL定义,这些数据类型不能使用ROS2 IDL进行描述。因此,您还限制了可以发送和接收的数据类型,类型演变和兼容性规则等。对于某些系统,这些限制可能很重要。这些功能已添加到DDS中,原因是...
性能也受到添加的层以及某些DDS API未被利用的事实的负面影响。
从根本上说,DDS所针对的应用范围要广泛得多,因此API,Qos,类型等对我来说更加通用和灵活。
添加一点Stoogy already wrote:
ROS不仅仅是通信层。例如,它提供了
实际上,ROS2基于DDS进行通信。 (https://github.com/ros2/ros2/wiki/DDS-and-ROS-middleware-implementations)
使用ROS2是因为它增加了抽象,使DDS更易于使用。 DDS需要大量的设置和配置(分区,主题名称,发现模式,消息创建......),这在ROS2的RMW包中完成。此包还负责在发布/接收(获取)消息时处理错误。
您可以直接使用DDS(如果您正确配置了您的发布者和订阅者,您也可以与ROS2发布者和订阅者进行通信),但是您必须创建消息(.idl),调用生成器以获取相应的结构和源文件,创建一个域,分配一个主题,配置datawriters / datareader,..(看看一些例子https://github.com/rticommunity/rticonnextdds-examples/tree/master/examples/listeners/c)
所以ROS2让你的生活更轻松。此外,还有许多可以在消息上方使用的包。