ROS 2 中间件实现

ROS 中间件实现是一组 |包|,用于实现一些内部 ROS 接口,例如 rmwrclrosidl API

DDS 中间件包的常用包

所有当前的 ROS 中间件实现均基于完整或部分 DDS 实现。 例如,有一个使用 RTI 的 Connext DDS 的中间件实现,还有一个使用 eProsima 的 Fast DDS 的实现。 因此,大多数基于 DDS 的中间件实现之间存在一些共享的 |包|

在 GitHub 上的 ros2/rosidl_dds 存储库中,有以下 |包|

  • rosidl_generator_dds_idl:提供从 rosidl 文件生成 DDS .idl 文件的工具,例如 .msg 文件、.srv 文件等。

rosidl_generator_dds_idl package 为每个 rosidl 文件生成一个 DDS .idl 文件,例如 .msg 文件,由包含消息的 packages 定义。

目前基于 DDS 的 ROS 中间件实现利用此生成器的输出 .idl 文件来生成特定于供应商的预编译类型支持。

ROS 中间件实现的结构

ROS 中间件实现通常由单个存储库中的几个 |包| 组成:

  • <implementation_name>_cmake_module:包含用于发现和公开所需依赖项的 CMake 模块

  • rmw_<implementation_name>_<language>:包含特定语言(通常为 C++)中 rmw API 的实现

  • rosidl_typesupport_<implementation_name>_<language>:包含用于为 rosidl 文件生成静态类型支持代码的工具,这些代码针对特定语言(通常为 C 或 C++)的实现而量身定制

<implementation_name>_cmake_module |包| 包含查找中间件实现的支持依赖项所需的任何 CMake 模块和函数。 例如,“rti_connext_dds_cmake_module”为 RTI Connext DDS 附带的 CMake 模块提供了包装器逻辑,以确保所有依赖它的包都将选择相同的 RTI Connext DDS 安装。 类似地,“fastrtps_cmake_module”包含一个 CMake 模块来查找 eProsima 的 Fast DDS,而“gurumdds_cmake_module”包含一个 CMake 模块来查找 GurumNetworks GurumDDS。 并非所有实现都会有这样的包:例如,Eclipe 的 Cyclone DDS 已经提供了一个 CMake 模块,其 RMW 实现直接使用它,而无需额外的包装器。

“rmw_<implementation_name>_<language>”package 以特定语言实现“rmw”C API。 实现本身可以是 C++,它只需将标头的符号公开为“extern “C””,以便 C 应用程序可以链接到它。

“rosidl_typesupport_<implementation_name>_<language>”package 提供了一个生成器,该生成器以特定语言生成 DDS 代码。 这是使用“rosidl_generator_dds_idl”package 生成的“.idl”文件和 DDS 供应商提供的 DDS IDL 代码生成器完成的。 它还生成用于将 ROS 消息结构转换为 DDS 消息结构的代码。 该生成器还负责为其正在使用的消息包创建一个共享库,该库特定于消息包中的消息和正在使用的 DDS 供应商。

如上所述,如果 rmw 实现支持消息的运行时解释,则可以使用“rosidl_typesupport_introspection_<language>”代替特定于供应商的类型支持包。 这种无需事先生成代码即可通过编程方式发送和接收主题类型的能力是通过支持 DDS X-Types 动态数据标准 实现的。 因此,rmw 实现可以提供对 X-Types 标准的支持,和/或提供针对其 DDS 实现在编译时生成的类型支持包。

作为 rmw 实现存储库的示例,Eclipse Cyclone DDS ROS 中间件实现位于 GitHub 上的 ros2/rmw_cyclonedds

Fast DDS 的 rmw 实现位于 GitHub 上的 ros2/rmw_fastrtps_cpp

“Connext DDS” 的 rmw 实现位于 GitHub 上的 ros2/rmw_connextdds

“GurumDDS” 的 rmw 实现位于 GitHub 上的 ros/rmw_gurumdds