ROS2 是一种分布式架构,在节点之间使用发布者/订阅者消息传递。
ROS2 在其消息传递层采用了不同的方法,现在采用称为数据分布式服务 (DDS) 的行业标准。
但是,DDS 是一个通信中间件,也支持发布者/订阅者。
那么,我们可以直接使用DDS,为什么要使用ROS2呢?
ROS2 是一种分布式架构,在节点之间使用发布者/订阅者消息传递。
ROS2 在其消息传递层采用了不同的方法,现在采用称为数据分布式服务 (DDS) 的行业标准。
但是,DDS 是一个通信中间件,也支持发布者/订阅者。
那么,我们可以直接使用DDS,为什么要使用ROS2呢?
DDS是OMG提出的一种通信标准。它的目标市场更普遍,如军事、空中交通管制、自动驾驶汽车、医疗设备.. 提供企业版和开源版本的供应商很少,但只有少数人或市场可以决定他们未来的工作或设计。
任何想要在他们的产品中采用 DDS 的人都需要从头开始。
ROS2 更像是一个生态系统。ROS2 的领导者——OSRF 为那些想要创建机器人应用程序的人提供了一个生态系统、文档和友好的框架。
任何人都可以将他们的想法提交给核心设计或为社区做出自己的贡献。
参与者、主题、发布者、订阅者、数据读取器和数据写入器
是的,DDS 有发布者和订阅者。此外,它有参与者、主题、发布者、订阅者、数据写入者和数据读取者,它们被称为DDS数据共享空间中的一个实体。
每个实体拥有不同的 QoS 属性并影响实体如何管理数据交付或数据生命周期。
参与者控制整个实体的创建、删除、分组。它有能力知道新实体的加入或离开。
不同的参与者由域 ID(整数)标识。
Topic 就像一个拥有 QoS 信息的目标,datawriter 和 datareader 可以相互链接。
发布者和订阅者控制其拥有的数据读取器和数据写入器的数据交付和数据可用性。
Publisher only 可以有多个 datawriter,Subscriber only 可以有多个 datareader。
DataWriter 是数据提供者,DataReader 是数据消费者。他们需要对其目标主题具有相同的 QoS。
DDS 主题命名:
取消链接其他 pub/sub 模型,它们不会大量使用slash /
,而是面向对象的。
命名空间和节点。
它就像主题,但有命名空间。
ROS2 高度使用命名空间和斜线 /
。它的命名空间以/
. 例如/turtle/cmd_vel
,turtle 是命名空间,cmd_vel 是它的基本名称。
只是提供或使用数据的基本元素。
您可以检查 ROS2 发布/订阅命名设计的ros2 主题和服务名称。
ROS2 更侧重于机器人应用程序设计,消除了编写 DDS 复杂 pub/sub 应用程序的困难。
补充一点Stoogy 已经写过的内容:
ROS 不仅仅是通信层。例如,它提供
事实上,ROS2 是基于 DDS 进行通信的。(https://github.com/ros2/ros2/wiki/DDS-and-ROS-middleware-implementations)
使用 ROS2 是因为它添加了一个抽象,使 DDS 更易于使用。DDS 需要在 ROS2 的 RMW 包中进行大量设置和配置(分区、主题名称、发现模式、消息创建……)。此包还负责在发布/接收(获取)消息时处理错误。
您可以直接使用 DDS(如果您正确配置您的发布者和订阅者,您也可以与 ROS2 发布者和订阅者通信)但是您必须创建消息(.idl),调用生成器以获取相应的结构和源文件,创建域,分配主题,配置数据写入器/数据读取器,..(查看一些示例https://github.com/rticommunity/rticonnextdds-examples/tree/master/examples/listeners/c)
因此,ROS2 让您的生活更轻松。另外,还有很多可以在消息上方使用的包。
我同意 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、类型等对我来说需要更加通用和灵活。