关于ROS 2中间件实现
ROS中间件实现是一组 |包|,用于实现一些内部ROS接口,例如 rmw
、 rcl
和 rosidl
APIs。 [Alyssa@9924]
DDS中间件包的通用包 [Alyssa@9925]
当前所有ROS中间件实现均基于全部或部分DDS实现。例如,有一个使用RTI's Connext DDS 实施的中间件和一个使用 eProsima'Fast DDS的中间件实现。因此,在大多数基于DDS的中间件实现中,有一些共享的 |包|。 [Alyssa@9926]
在 GitHub 上的 ros2/rosidl_dds 仓库中,有以下 |包|: [Alyssa@9927]
rosidl_generator_dds_idl
: 提供从rosidl
文件(例如.msg
文件,.srv
文件等)生成DDS.idl
文件的工具。 [Alyssa@9928]
rosidl_generator_dds_idl
|包| 为每个 rosidl
文件(例如 .msg
文件)生成一个DDS .idl
,由 |包| 包含的消息定义。目前,基于DDS的ROS中间件实现利用该生成器的输出 .idl
文件来生成针对供应商的预编译类型支持。 [Alyssa@9929]
ROS中间件实现的结构
ROS中间件实现的一般由单个仓库中的几个 |包| 组成: [Alyssa@9931]
<implementation_name>_cmake_module
:包含CMake模块,用于发现和公开所需的依赖关系 [Alyssa@9932]rmw_<implementation_name>_<language>
: 包含特定语言的rmw
API 的实现,典型的如 C++ [Alyssa@9933]rosidl_typesupport_<implementation_name>_<language>
: 包含为rosidl
文件生成静态类型支持代码的工具,根据特定语言的实现量身定制,典型地像 C或C ++ [Alyssa@9934]
<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实现使用,而无需额外的包装器。 [Alyssa@9935]
rmw_<implementation_name>_<language>
|包| 在特定语言中实现 rmw
C API。实现本身可以是C++,它只需要将头文件的符号公开为 外部 "C"
,这样C应用程序就可以链接到它。 [Alyssa@9936]
rosidl_typesupport_<implementation_name>_<language>
|包| 提供一个生成器,该生成器以特定语言生成DDS代码。这是使用由 rosidl_generator_dds_idl
|包| 生成的 .idl
文件和DDS供应商提供的DDS IDL代码生成器来完成的。它还生成用于在DDS消息结构和ROS消息结构之间转换的代码。该生成器还负责为其正在使用的消息包创建共享库,该共享库特定于消息包中的消息和正在使用的DDS供应商。 [Alyssa@9937]
如上所述,如果rmw实现支持消息的运行时解释,则可以使用 rosidl_typesupport_introspection_<language>
代替供应商特定类型的支持包。通过支持 DDS X-Types Dynamic Data standard 实现了在话题上以程序编写的方式发送和接收类型而无需事先生成代码的能力。因此,rmw实现可以为X-type标准提供支持,和/或为在编译时生成的特定于其DDS实现的类型支持提供包。 [Alyssa@9938]
作为rmw实现仓库的一个示例, Eclipse Cyclone DDS
ROS中间件实现位于 GitHub 的 ros2/rmw_cyclonedds 仓库。 [Alyssa@9939]
Fast DDS
的rmw实现在 GitHub 的 ros2/rmw_fastrtps_cpp 仓库。 [Alyssa@9940]
Connext DDS
的rmw实现在 GitHub 的 ros2/rmw_connextdds 仓库。 [Alyssa@9941]
GurumDDS
的rmw实现在 GitHub 的 ros/rmw_gurumdds 仓库。 [Alyssa@9942]
要了解有关为ROS创建新的中间件实现所需的更多信息,请参阅此页面: [Alyssa@9943]
警告
待办事项: 链接到更详细的中间件实现文档和/或教程。 [Alyssa@9944]