移动机器人车队整合
在这里,我们将介绍如何集成移动机器人车队,该车队提供完全控制类别的车队适配器,如 RMF 核心概述 章节中讨论的那样。 这意味着我们假设移动机器人车队管理器允许我们为机器人指定要遵循的明确路径,并且可以随时中断该路径并用新路径替换。 此外,每个机器人的位置都将在机器人移动时实时更新。
路线图
在集成这样的车队之前,您需要采购或制作路线图,如 上一节 中所述。车队适配器使用路线图为其控制的车辆规划可行的路线,同时考虑所有其他车辆的时间表。当发生调度冲突时,它还将使用路线图来决定如何与其他车队适配器协商。适配器只会考虑沿着路线图上指定的路线移动机器人,因此路线覆盖全面非常重要。同时,如果路线图上有多余的航点,适配器可能会花费比实际需要更多的时间来考虑所有可能性,因此最好在全面性和精简性之间取得平衡。
C++ API
可以在 rmf_ros2
存储库的 rmf_fleet_adapter
包中找到用于 Full Control 自动导引车 (AGV) 车队的 C++ API。该 API 由四个关键类组成:
Adapter
- 初始化并维持与其他核心 RMF 系统的通信。使用它来注册一个或多个舰队并接收每个舰队的“FleetUpdateHandle”。FleetUpdateHandle
- 允许您通过添加机器人并指定机器人组的设置(例如,指定机器人组可以执行哪些类型的配送)来配置机器人组。您可以随时将新机器人添加到机器人组。RobotUpdateHandle
- 使用它来更新机器人的位置,并在机器人的进度中断时通知适配器。RobotCommandHandle
- 这是一个纯抽象接口类。必须实现该类的功能才能调用正在适配的特定车队管理器的 API。
Easy Full Control 机群的 C++ API 为用户提供了一种简单且更易于访问的方式,可与 Full Control 库集成,而无需修改其内部逻辑。可以在 rmf_ros2
仓库的 rmf_fleet_adapter 包中找到它。EasyFullControl
类包含有用的方法,用户可从封装重要机群配置参数和导航图的 YAML 文件创建 Configuration
对象,以及使用 Configuration
对象制作自己的机群适配器。为用户提供了 add_robot(~)
方法,用于将机器人添加到新的机群适配器。此方法接受用户应编写的各种回调,并且每当 RMF 从舰队检索机器人状态信息或发出命令执行特定过程(导航、对接、操作等)时都会触发。EasyFullControl 舰队适配器的示例可以在 rmf_demos
repo 下的 fleet_adapter.py
中找到。
还可以在 rmf_ros2
repo 的 rmf_fleet_adapter
包中找到用于 交通灯控制 车队(即仅允许 RMF 暂停/恢复每个移动机器人的车队)的 C++ API。该 API 重用了 Adapter
类,并要求用户使用 此处 中的任一 API 来初始化其车队。用户可以选择通过 TrafficLight
API 进行集成,或者为了更方便,也可以通过 EasyTrafficLight
API 进行集成。
开发舰队适配器的基本工作流程如下:
- 创建一个链接到
rmf_fleet_adapter
库的应用程序。 - 让应用程序以所需的任何方式读取运行时参数(例如命令行参数、配置文件、ROS 参数、REST API 调用、环境变量等)。
- 为该应用程序为其提供适配器的每个舰队构建路线图(单个适配器应用程序可以为任意数量的舰队提供服务),和/或使用
rmf_fleet_adapter::agv::parse_graph
实用程序从 YAML 文件解析路线图。 - 使用
Adapter::make(~)
或Adapter::init_and_make(~)
实例化rmf_fleet_adapter::agv::Adapter
。 - 添加应用程序将负责适配的车队,并保存传回的
rmf_fleet_adapter::agv::FleetUpdateHandlePtr
实例。 - 为正在适配的车队管理器 API 实现
RobotCommandHandle
类。 - 添加适配器负责控制的机器人。可以根据启动配置添加机器人,也可以在运行时通过车队管理器 API 发现机器人时动态添加机器人(或两者兼而有之)。
- 添加机器人时,您需要创建您实现的自定义
RobotCommandHandle
的新实例。 - 您还需要提供一个回调,当适配器完成注册机器人时将触发该回调。此回调将为您的机器人提供一个新的
RobotUpdateHandle
。必须保存此更新句柄,以便您可以使用它来随时间更新机器人的位置。
- 当来自车队管理器 API 的新信息到达时,使用“RobotUpdateHandle”类的集合来使适配器保持机器人位置的更新。
可以在 full_control
向后兼容适配器 中找到一个可运行的舰队适配器应用程序示例。这是一个舰队适配器,其舰队端 API 是“舰队驱动程序 API”,这是 RMF Full Control 类别舰队适配器的弃用原型 API。此舰队适配器暂时存在,以保持与旧“舰队驱动程序”实现的向后兼容性,并作为如何使用新 C++ API 实现舰队适配器的示例。
Python Bindings
您也可以选择使用 Python 来实现您的舰队适配器。您可以在 rmf_fleet_adapter_python repo 中找到 C++ API 的 Python 绑定。Python 绑定实际上只是将 C++ API 移植到 Python,以便您可以使用 Python 而不是 C++ 开发舰队适配器。上述 API 和工作流程完全相同,只是改用 Python。这对于使用 REST API 的舰队来说应该非常有用,因为您将可以访问 Swagger 等工具,这些工具可以帮助您为舰队的 REST API 服务器生成客户端代码。
Fleet Adapter Template
为了使机器人队列与 RMF 的集成过程更加简单,我们开源了一个 完全控制 模板包,用户只需使用 API 调用更新特定代码块即可。这样,用户可以在队列适配器和机器人之间使用他们喜欢的 API 来集成 RMF。请注意,此模板只是将队列与基于 REST 或 websocket 的 API 集成的众多方法之一。下图说明了 RMF 如何使用用户和机器人供应商选择的 API 与队列机器人进行通信。

该舰队适配器系统也与我们的模拟机器人演示世界集成在一起,下一节将进一步阐述。
由于车队适配器模板已经应用了 C++ API 和 Python 绑定,您可以按照以下步骤在给定模板之上构建车队适配器:
- 修改
RobotCommandHandle.py
。如上所述,将为车队中的每个机器人创建一个新的RobotCommandHandle
实例。您应该查看代码并实现特定于应用程序的导航、到达估计和对接逻辑。 - 创建一个与您的车队机器人交互的车队管理器。您的车队管理器应该能够通过您的机器人供应商的 API 从您的机器人检索状态信息并向您的机器人发送导航命令。这可以是 ROS 消息或任何自定义 API。如果您有多个使用不同机器人 API 的车队,请确保为这些车队创建单独的车队管理器。您还应该选择一个 API 来与适配器通信,并相应地设计您的车队管理器。
- 在
RobotClientAPI.py
中填写缺失的代码。这是集成中最重要的部分。根据您选择在适配器和管理器之间交互的 API,您必须相应地格式化机器人的数据并返回模板中指定的值。这很关键,因为当适配器正在计划任务或更新交通时间表时,RobotClientAPI
中的函数会从RobotCommandHandle
调用。 - 对于每个机器人车队,创建一个
config.yaml
文件以包含重要的车队参数。这些参数将传递给舰队适配器并在初始化舰队时进行配置。
完成后,您可以运行舰队适配器和自定义舰队管理器。请记住在启动适配器时解析配置文件和导航图。
案例研究:RMF Demos Fleet Adapter
demos fleet adapter 演示了 Full Control fleet 适配器类的 Python 实现。基于 fleet 适配器模板,demos fleet 适配器使用 REST API 作为适配器和模拟机器人之间的接口:适配器向机器人发送命令,而机器人根据其当前状态信息更新适配器。这是通过创建一个 fleet_manager
节点来实现的,该节点包含 RobotClientAPI
交互所需的 REST 端点。

Demos Fleet Manager
每当有命令准备从适配器的“RobotCommandHandle”发送时,它就会调用“RobotClientAPI”中定义的相关 API 函数,并从“fleet_manager”节点中的 API 服务器查询相应的端点。每个函数要么检索有关机器人当前状态的特定信息(包括但不限于其最后已知位置、剩余电池电量以及是否已完成请求),要么向机器人发送命令以执行请求。机器人状态信息是车队适配器更新交通时间表、规划后续任务以及引导机器人穿越环境中的不同路径所必需的。
demos 车队适配器与模拟机器人集成,后者通过内部 ROS2 消息发布其状态信息,因此“fleet_manager”还用于整合其车队中不同机器人发布的消息,并将它们发送到正确机器人的“RobotCommandHandle”。 API 端点的设计使得适配器可以通过指定机器人的名称来查询信息或向特定机器人发送命令。fleet_manager
将确保机器人存在于机器人队列中,然后再返回请求的状态信息或将命令传递给模拟机器人。此外,适配器可以检索整个机器人队列的状态。
车队配置
我们的演示模拟中有四个完全控制车队,每个车队都有自己的车队特定参数。为了在初始化车队时更好地整合和设置这些配置,它们存储在 config.yaml
文件中。运行车队适配器和管理器时需要配置和导航图文件的路径。常规车队设置和功能在 rmf_fleet
部分下定义。
配置文件还负责处理车队内机器人特定的参数,例如车队中的机器人数量、每个机器人的名称及其起始航点。例如,Office 演示世界中的 tinyRobot
车队有两个机器人,因此我们将每个机器人的配置附加到配置文件中的 robots
部分。
对于在与 RMF 不同的坐标系中操作机器人的用户,配置文件中的“reference_coordinate”部分有助于执行任何必要的转换。请注意,RMF 和 slotcar 模拟机器人共享相同的坐标系,因此此转换未在演示车队适配器中实现。