ROS 2 中间件实现
ROS 中间件实现是一组 |包|,用于实现一些内部 ROS 接口,例如 rmw
、rcl
和 rosidl
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。