ROS 2 中间件实现
ROS中间件实现是一组|packages|,用于实现一些内部的ROS接口,例如``rmw``、``rcl``和``rosidl``|APIs|。
DDS中间件的常见包
所有当前的ROS中间件实现都基于完整或部分的DDS实现。例如,有一种中间件实现使用RTI的Connext DDS,另一种实现使用eProsima的Fast DDS。因此,在大多数基于DDS的中间件实现之间存在一些共享的|packages|。
在|GitHub|_上的`ros2/rosidl_dds <https://github.com/ros2/rosidl_dds>`_代码库中,有以下|package|:
rosidl_generator_dds_idl
package 会为每个包含消息的 packages 中定义的 rosidl
文件(例如 .msg
文件)生成一个 DDS .idl
文件。目前基于 DDS 的 ROS 中间件实现使用该生成器的输出 .idl
文件来生成供应商特定的预编译类型支持。
ROS 中间件实现的结构
一个 ROS 中间件实现通常由一个单一仓库中的几个 packages 组成:
<implementation_name>_cmake_module
:包含用于发现和公开所需依赖项的 CMake 模块rmw_<implementation_name>_<language>
:包含特定语言(通常是 C++)中rmw
API 的实现rosidl_typesupport_<implementation_name>_<language>
:包含用于为rosidl
文件生成静态类型支持代码的工具,适用于特定语言的实现(通常是 C 或 C++)
<implementation_name>_cmake_module
package 包含了查找中间件实现所需的所有 CMake 模块和函数。例如,rti_connext_dds_cmake_module
提供了围绕 RTI Connext DDS 提供的 CMake 模块的包装逻辑,确保所有依赖它的软件包将选择相同的 RTI Connext DDS 安装。类似地,fastrtps_cmake_module
包括一个用于查找 eProsima's Fast DDS 的 CMake 模块,而 gurumdds_cmake_module
包括一个用于查找 GurumNetworks GurumDDS 的 CMake 模块。并非所有实现都会有这样的包:例如,Eclipse 的 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 Dynamic Data 标准,实现了在生成代码之前以编程方式在主题上发送和接收类型的能力。因此,rmw 实现可以提供对 X-Types 标准的支持,并/或者提供一个在编译时生成的类型支持包,特定于其 DDS 实现。
以 Eclipse Cyclone DDS
作为 rmw 实现的示例,它的 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。