ROS 2 中间件实现
目录
DDS 中间件包的常用包
ROS 中间件实现的结构
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
包为每个 rosidl
文件生成一个 DDS .idl
文件,例如 .msg
文件,由包含消息的包定义。目前,基于 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>
包在特定语言中实现了 rmw
C API。实现本身可以是 C++,只需将头文件的符号暴露为 extern "C"
,以便 C 应用程序可以链接到它。
rosidl_typesupport_<implementation_name>_<language>
包提供了一个生成器,用于生成特定语言的 DDS 代码。这是通过 rosidl_generator_dds_idl
包生成的 .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。 https://github.com/ros2/rmw_cyclonedds
Fast DDS
的 rmw 实现在 GitHub 上,位于 ros2/rmw_fastrtps_cpp。 https://github.com/ros2/rmw_fastrtps_cpp
Connext DDS
的 rmw 实现在 GitHub 上,位于 ros2/rmw_connextdds。 https://github.com/ros2/rmw_connextdds
GurumDDS
的 rmw 实现在 GitHub 上,位于 ros/rmw_gurumdds。https://github.com/ros2/rmw_gurumdds