发布网友 发布时间:15分钟前
共1个回答
热心网友 时间:16分钟前
关于ROS 2的内部接口涉及一些公用的C API,面向那些创建客户端库或增加新底层中间件的开发人员,而非一般ROS使用者。ROS的客户端库提供面向用户的API,可能源自多种编程语言。
ROS有两大类主要内部接口:
1. ROS中间件接口(rmw API):负责ROS 2软件堆栈与底层中间件实现之间的交互。底层中间件可以是特定的DDS或RTPS实现,负责话题发现、发布、订阅,服务请求-响应以及消息序列化。
2. ROS客户端库接口(rcl API):更高级接口,用于实现客户端库,不直接接触中间件实现,而是通过ROS中间件接口(rmw API)抽象来间接接触中间件。
这些API层层堆叠,普通ROS使用者使用客户端库API,如rclcpp,实现代码。rclcpp实现rcl接口,提供访问ROS状态图及事件的工具。rcl接口实现则使用rmw API访问状态图,旨在提供通用实现,与所使用的底层中间件无关。rmw接口专注于提供最轻量级的中间件功能,由特定中间件实现的软件包(如rmw_fastrtps_cpp)提供,基于DDS接口和类型编译。
内部接口还支持类型专用接口,允许特定于消息类型的代码生成,以便执行发布、订阅等操作。这些代码由特定编程语言和中间件无关的生成器软件包生成,确保与中间件实现无关。通过使用特定于中间件的ros_to_dds软件包,可以避免公开供应商特定的符号和头文件,同时检查依赖关系以识别可能侵犯供应商可移植性的代码。
动态类型支持方法提供通用发布功能,无需为每种消息类型生成版本。这类方法使用元信息执行发布,并在实际执行工作时调用中间件特定API。动态类型支持代码中间件无关,且生成的代码量较少,可减少编译时间和大小。然而,动态类型支持要求底层中间件支持动态类型支持,通常比静态类型支持慢,且静态类型支持的特定于类型的生成代码更高效。
客户端库如rclc、rclcpp、rclpy等使用ROS客户端库接口(rcl API)来避免复制逻辑和功能,实现更瘦且一致的客户端库。rcl API位于GitHub上的ros2/rcl存储库,包含用于定义接口的C头文件,实现则由同一存储库中的rcl软件包提供。
ROS中间件接口(rmw API)是构建ROS所需原始中间件功能集的顶层,不同中间件实现供应商必须实现此接口。rmw API位于ros2/rmw存储库,实现由不同DDS供应商的rmw实现软件包提供。
rosidl API定义消息相关的静态函数和类型,以及消息定义,明确不同编程语言应该生成哪些代码。此API包含解析rosidl文件、生成代码的软件包,以及用于获取消息类型类型支持结构的方法。rosidl存储库还包含与消息类型类型支持有关的软件包,以及用于解析和为rosidl文件生成头文件的软件包。
rcutils存储库包含ROS 2 C实用程序API,主要用于错误处理、命令行参数解析和日志记录,这些实用程序可以由客户端层和中间件层共用。rcutils API位于ros2/rcutils存储库。