内部 ROS 接口是公共 C API ,供创建客户端库或添加新的底层中间件的开发人员使用,但不适合典型 ROS 用户使用。
ROS客户端库提供大多数 ROS 用户熟悉的面向用户的API,并且可能采用多种编程语言。
内部API架构概述
内部接口主要有两个:
-
ROS中间件接口(rmw API)
-
ROS客户端库接口(rcl API)
API rmw
是ROS 2 软件堆栈和底层中间件实现之间的接口。 ROS 2 使用的底层中间件是 DDS 或 RTPS 实现,负责发现、发布和订阅机制、服务的请求-回复机制以及消息类型的序列化。
该rcl API
是一个稍高级别的API,用于实现客户端库,不直接接触中间件实现,而是通过 ROS 中间件接口 ( rmw API ) 抽象来实现。
如图所示,这些API是堆叠在一起的,因此典型的 ROS 用户将使用客户端库 API,例如rclcpp,来实现他们的代码(可执行文件或库)。客户端库的实现,例如rclcpp,使用rcl提供对 ROS 图和图事件的访问的接口。该rcl实现又使用rmw API来访问 ROS 图。实现的目的是为各种客户端库rcl可以使用的更复杂的 ROS 概念和实用程序提供通用实现,同时保持对所使用的底层中间件的不可知性。该接口的目的是捕获支持 ROS 客户端库所需的绝对最小中间件功能。最后, API的实现由中间件实现特定包提供。
在上图中,还有一个标记为 的框ros_to_dds,该框的目的是表示一类可能的包,这些包允许用户使用 ROS 等效项访问 DDS 供应商特定的对象和设置。该抽象接口的目标之一是将ROS用户空间代码与正在使用的中间件完全隔离,以便用户代码 对 DDS服务或者中间件的改动影响降到最小。
特定类型接口
通俗来讲下面主要的表达就是注入用户自定义的类对象到ros 系统,让ros 也认识你定义的这些类
在一些特定的业务场景下,有些 API的某些部分必然特定于正在交换的消息类型,例如发布消息或订阅主题,因此需要为每种消息类型生成代码。下图布局了从用户定义的rosidl文件(例如.msg文件)到用户和系统用于执行类型特定功能的类型特定代码的路径:
图:“静态”类型支持生成的流程图,从rosidl文件到面向用户的代码
该图的右侧显示了如何.msg将文件直接传递到特定于语言的代码生成器,例如rosidl_generator_cpp
或rosidl_generator_py
。这些生成器负责创建用户将包含(或导入)的代码,并将其用作文件中定义的消息的内存中表示形式.msg。例如,考虑消息std_msgs/String,用户可能会在 C++ 中使用此文件以及语句,或者他们可能会在 Python 中使用该语句。这些语句之所以有效,是因为这些文件是由这些特定于语言的(但与中间件无关的)生成器包生成的。
#include <std_msgs/msg/string.hpp>from std_msgs.msg import String
rosidl API
该rosidl存储库位于GitHub上的ros2/rosidl,定义了消息 IDL 语法,即.msg文件、.srv文件等的语法,并包含用于解析文件、提供 CMake 基础设施以从消息生成代码、生成与实现无关的包。代码(头文件和源文件),以及用于建立默认的生成器集。该存储库包含这些包:
-
rosidl_cmake:提供CMake函数和模块,用于从rosidl文件(例如.msg文件、.srv文件等)生成代码。
-
rosidl_default_generators:定义默认生成器列表,确保它们作为依赖项安装,但也可以使用其他注入的生成器。
-
rosidl_generator_c:提供为文件生成C头文件(.h)的工具rosidl。
-
rosidl_generator_cpp:提供为文件生成C++头文件(.hpp)的工具rosidl。
-
rosidl_generator_py:提供为文件生成Python模块的工具rosidl。
-
rosidl_parser:提供Python API用于解析rosidl文件。
当然ros还有更多的api 内部接口,有兴趣的小伙伴可以去ros 官网看看