使用 3LAWS 监管器增强 Nav2 安全性
本教程介绍如何将 3Laws Robotics 监管器(Supervisor)与 Nav2 技术栈集成,以提升导航任务的安全性。3Laws 监管器是一种动态碰撞避免(collision avoidance)解决方案,适用于对安全要求严苛的生产环境。它在 Nav2 之上提供一层监管,监控机器人的行为和传感器,实时调整期望轨迹,从而更好地避免碰撞和其他危险。
许多安全或碰撞监控系统(例如 nav2_collision_monitor 或安全等级激光雷达安全区)通常采用停止或减速的方式,而 3Laws 监管器则通过「力场(force-field)」或「偏转(deflection)」效应,在继续朝目标前进的同时主动避免碰撞。这为生产环境带来两方面效率提升:(1) 机器人减少停机时间,运行时间更长、产能更高;(2) 基础设施更高效,因为维持同等安全水平所需的物理性干预更少。当然,必要时它仍会停止机器人。
监管器并非完全替代其他系统,而应与安全等级系统、全局重规划、规划器和/或 Nav2 碰撞监控器协同集成。传统系统的安全区行为可以提供给监管器,使其感知安全系统的存在,从而在不触发安全系统的前提下智能调整机器人轨迹。监管器也可以作为独立的碰撞避免解决方案使用。
监管器提供免费的社区版(Supervisor ROS CE)和两个付费商业版(附带额外功能与支持)。社区版的碰撞避免功能与商业版相同,适用于许多应用场景,但仅限早期创业公司和研发用途。本教程只涉及社区版 Supervisor ROS(CE)的功能。商业版 Supervisor Pro 额外包含:地理围栏(geofencing)、稳定性(stabilization)、配置限制、命令监控、高度限制、专业设置与支持等。如需了解更多 Supervisor Pro 信息,请联系 3Laws Robotics。
注意:声明:本教程由 3Laws Robotics 与 Open Navigation 合作赞助。本教程的内容和演示由 Open Navigation 团队编写和制作。所分享的观点和想法是我们独立评估的真实反映。
AMR 和移动机器人的传统安全系统通常在检测到障碍物时停止或减速机器人。典型方案是使用带安全区(safety zone)的安全等级 2D 激光雷达:当在特定窗口内检测到障碍物时触发停止或减速。安全区的配置旨在确保机器人能在撞上障碍物前安全停止或减速到更安全的速度——安全区通常根据当前机器人速度动态调整。这些方案在正确实施时是有效的,但在动态操作中可能导致效率损失,且需要购买昂贵的安全等级硬件。AGV 则可能使用光幕(light curtain)和物理隔离等静态安全措施,这些措施需要改造场地且不易重新配置。为机器人增加自主安全能力可以免除这些静态措施的负担。
对于不需要安全等级认证或无法使用昂贵安全等级激光雷达的应用,通常可用 Nav2 碰撞监控器(Collision Monitor)或类似方案,在检测到障碍物时停止或减速机器人。这是一种基于软件的解决方案,监控机器人的传感器(激光雷达、深度相机、声纳等)来检测障碍物并触发停止或减速。它的作用类似于传统安全等级系统,但不能提供同等安全保证,且同样受制于停止/减速方式的固有局限。

Supervisor ROS 采用动态碰撞避免方法来增强安全性,同时解决效率挑战并减少调参负担。当检测到机器人附近有障碍物时,监管器不只是停止或减速,而是接管控制并实时调整机器人轨迹以避免碰撞,同时继续朝目标前进——如果存在底层安全约束(Pro 版本),也会一并考虑。这使得机器人能够动态响应环境:只要存在可行的机动空间,就不会过早停止或减速,从而避免触发安全系统的反应——进而提高吞吐量。当然,与其他安全系统一样,必要时它仍会停止机器人。
为获得最佳效果,系统仍应包含全局重规划机制和/或考虑碰撞的规划器。监管器应作为这些系统的补充而非替代,尤其是对于速度快、负载重或动态响应慢的机器人。这样可以减少 Nav2 控制器参数的调参工作量——Nav2 控制器虽然高度可配置,但参数复杂——从而加快部署上市。监管器也非常适合远程操作(teleoperation)场景——无论是本地摇杆操控还是远程监控系统操控,都能避免因操作延迟而导致的碰撞。

注意:监管器应与某种全局重规划和/或避障规划器配合使用,否则监管器可能与规划器相互矛盾,导致机器人无法绕开障碍物而只能停止。例如,如果使用纯跟踪(Pure Pursuit)算法精确跟踪路径且没有全局重规划,当监管器偏离路径时,该算法会尝试将机器人拉回路径,从而撞向障碍物。此时,沿路径前进的速度「意图」被替换为修正跟踪误差而撞向障碍物的指令,与监管器避开障碍物的意图产生冲突。因此,建议采用全局重规划来避开障碍物,和/或使用 MPPI 或 DWB 等避障规划器。
远程操作则不存在此问题,因为远程操作命令不会为了跟踪路径而调整。
如果你想了解监管器背后的更多技术,请查看 3Laws 知识库 页面。

0. 获取许可证密钥
Section titled “0. 获取许可证密钥”Supervisor ROS 提供免费社区版,但使用仍需许可证密钥(license key)。可通过 3Laws Robotics 免费试用 页面申请,或从 3Laws 主页点击右上角「Get Started」获取。审批通过后,许可证密钥将发送到申请表单中填写的电子邮箱。密钥可在下方第 1 步的 Supervisor 配置 GUI 中验证。
GUI 设置请参照 3Laws Robotics 安装 Supervisor 的说明。通过二进制文件安装 Supervisor,请运行以下命令:
bash <(curl https://raw.githubusercontent.com/3LawsRobotics/3laws/master/install.sh)如果当前终端未 source 任何 ROS 发行版,安装程序会提示你选择正在使用的 ROS 发行版和要安装的 Supervisor 版本。随后运行以下命令启动控制面板:
3laws control-panel autostart enable如果要将此脚本安装到自己的应用 Docker 镜像中,可通过 CLI 参数显式指定 ROS 发行版、架构、Ubuntu 版本和标签。
RUN bash <(curl https://raw.githubusercontent.com/3LawsRobotics/3laws/master/install.sh) -fy -r humble -a amd64 -v 22.04 -t latest要在此 Docker 容器中运行配置 GUI 服务器,还需在 Dockerfile 中添加以下 entrypoint.sh,用于启动 Supervisor 控制面板和 rosbridge 服务器:
#!/bin/bashset -e # Exit immediately if a command exits with a non-zero status
/opt/3laws/control_panel/control-panel-backend 8000 /opt/3laws/control_panel/build/ &source /opt/ros/humble/setup.bash # Replace with your ROS distribution if differentros2 launch rosbridge_server rosbridge_websocket_launch.xml port:=9091 &ros2 launch lll_supervisor supervisor.launch.py # If you want it to run automatically only
bash注意:首次启动 Supervisor 时(无论是否在 Docker 容器内),可能出现以下错误。这表示 Supervisor ROS 节点尚未配置,无法启动。由于接下来就要进行配置,这属于正常现象,后端控制面板仍在运行。配置完成后,如果使用 Docker,需要重启容器,以便用新配置运行 Supervisor 节点。
Terminal window [supervisor-1] [2025-07-23 17:44:48.878] [error] bad file: /home/3laws/.3laws/config/supervisor.yaml[supervisor-1] [2025-07-23 17:44:48.913] [critical] Exception thrown during 3laws Supervisor initialization[supervisor-1] [2025-07-23 17:44:48.913] [info] Stopping 3laws Supervisor...[supervisor-1] [2025-07-23 17:44:48.913] [info] 3laws Supervisor stopped![ERROR] [supervisor-1]: process has died [pid 56, exit code 1, cmd '/opt/ros/humble/lib/lll_supervisor/supervisor --ros-args --disable-stdout-logs --ros-args --params-file /tmp/launch_params_g1f3o7xg'].

无论使用二进制文件还是 Docker 镜像,现在都可以运行 Supervisor 控制面板来配置 Supervisor 并部署到机器人上。访问 http://localhost:8080 即可看到如下基于 Web 的 Supervisor 控制面板。
2. 初始配置演练
Section titled “2. 初始配置演练”使用 Nav2 初始化配置
Section titled “使用 Nav2 初始化配置”为简化 Supervisor 的配置,可使用 nav2_config_extractor_cli.py 脚本从一组 Nav2 和/或 Robot Localization 配置文件中提取参数,用于初始化 Supervisor 配置。将来这一步会直接集成到 Supervisor 控制面板中,但目前需手动运行脚本并将结果导入控制面板。
以下是参数提取器的可用选项:
--verbose -v启用详细日志输出。--files要提取的 Nav2 参数文件路径列表,以空格分隔。--output输出提取的共享配置的文件路径。--deconfliction处理共享配置重复值的策略(选项:‘first’ 使用第一个值,‘last’ 使用最后一个值,‘prompt’ 提示选择要使用的值)。
例如:
python3 nav2_config_extractor_cli.py \ --files /path/to/nav2_params.yaml /path/to/robot_localization_params.yaml \ --output /path/to/extracted_shared_configs.json \ --deconfliction prompt在控制面板提示时,导航到提取的共享配置文件并选择它。这将自动使用机器人的运动学、动力学、话题、frame ID 以及多种传感器配置来预填充 Supervisor 配置。不过仍需仔细验证配置 GUI 中的条目,确保符合预期行为。
监管器配置:常规
Section titled “监管器配置:常规”从 Nav2 配置中提取参数后,即可完成 Supervisor 配置。
在首页上:
- 在「License Key」字段输入许可证密钥,输入后应自动验证并在 GUI 中显示许可证状态。
- 为此配置所属的机器人命名,可以是特定机器人或机器人型号,取决于配置粒度。
- 将 ROS TF 世界坐标系选为
map(如果尚未设置)。
然后展开 Advanced Settings 部分。若机器人在 2D 平面运行(即大多数地面机器人和几乎所有室内机器人),启用 Project to SE2 开关。若在 3D 地形的室外环境中运行,可禁用此开关,允许 Supervisor 在 3D 模式下运行。
其他可配置的高级设置包括:
- Supervisor 进程的 niceness 值,用于设置 Supervisor 进程的相对用户空间优先级,与实时调度器优先级不同。
- 对传入消息重新打时间戳(re-timestamping),在消息缺少正确时间戳时添加当前时间戳。
- 与 Supervisor 和控制面板端口重映射相关的参数。除非有特定需求,不建议更改。
注意:为安全起见,应禁用重新打时间戳,并确保系统中所有消息都有正确时间戳。入门阶段如果对系统的时间戳处理没有把握,或使用仿真时间(simulation time),对所有传入消息重新打时间戳也是可接受的。
完成此页面后,单击底部「Save」按钮保存配置,然后点击「Next」进入下一页。
监管器配置:机器人模型
Section titled “监管器配置:机器人模型”下一页用于设置机器人的运动学和动力学模型。首先在选项框中选择与机器人最匹配的运动学模型。当前选项包括差速驱动(Differential Drive)或全向(Omnidirectional)。阿克曼(Ackermann)转向支持计划在未来版本中提供。

接下来,选择 Supervisor 用于碰撞避免计算的机器人形状。Supervisor 支持多种形状:
- Sphere(球体)
- Box(长方体)
- Capsule(胶囊体)
- Point(点)
- Cone(锥体)
- Cylinder(圆柱体)
- Mesh 文件(网格文件)
对于投影到 2D 的圆形机器人,Sphere 和 Cylinder 效果相同,都会在 2D 中投影为圆形。对于方形或矩形机器人,使用 Box。如果机器人形状不对称或较为复杂,可使用 Mesh 提供自定义网格文件,或选择一个能包住机器人形状的包围形状(bounding shape)。
根据所选形状填写机器人尺寸。如果机器人原点不在机器人中心,还可指定从原点到形状中心的偏移量;否则将机器人碰撞形状的位置和旋转保持为默认单位值。
机器人 frame ID 应已从 Nav2 配置中预填充,如有需要可更改。Supervisor 正确运行还需静态定义附加的 frame。需要定义的 frame 只有里程计和感知源(若与 base frame ID 不同)的 frame,稍后会在定位和感知配置步骤中使用。这些 frame 可从 URDF 文件中查找,或使用 TF2 的 Echo 工具获取:
ros2 run tf2_ros tf2_echo <source_frame> <target_frame>
ros2 run tf2_ros tf2_echo lidar_link base_link # For example如果不确定使用哪个模型,可为机器人选择直接动力学模型(direct dynamical model)。最大速度应已从 Nav2 配置中填充,如有需要可更改——特别是 Nav2 配置中定义了多个控制器插件时。
最后,如果已标定机器人的里程计噪声模型,可在此输入协方差对角线值。否则保持默认值即可。
完成此页面后,单击底部「Save」按钮保存配置,然后点击「Next」进入下一页。
监管器配置:定位
Section titled “监管器配置:定位”下一页用于设置机器人的定位信息。此页面上的定位话题为 Supervisor 运行时提供参考坐标系。如果不使用障碍物地图输入(即仅使用传感器数据),应为机器人里程计话题(例如 odom),该话题应已预填充。如果使用预定位的障碍物地图进行碰撞避免,应为提供机器人在障碍物地图坐标系中位置的话题。

为定位话题订阅器选择 QoS 设置,通常为 System Default,深度为 10,并设置定位话题的近似更新频率。3Laws Default QoS 将与此匹配。使用标准 nav_msgs/Odometry 消息时无需创建掩码(mask)。掩码用于消息填充字段不符合 ROS frame 约定的情况。
如果使用里程计话题,协方差可与上一节设置为相同值。
里程计话题(Odometries)可供 3Laws 诊断工具使用,用于检查机器人里程计数据的质量和一致性。如果不需要诊断,可留空。否则,填写每个要监控的里程计源,包括每个源提供的可用轴信息。为每个里程计源的 frame 选择在常规页面中设置的参考坐标系。如果之前未设置,请返回设置后再继续,该坐标系现已在下拉菜单中可用。
完成此页面后,单击底部「Save」按钮保存配置,然后点击「Next」进入下一页。
监管器配置:感知
Section titled “监管器配置:感知”下一页用于设置机器人接收感知数据的传感器。数据可来自 2D 激光雷达、3D 激光雷达、深度相机或预定位的障碍物。传感器的基本数据应已大致从 Nav2 代价地图(Costmap2D)配置中预填充,但仍需调整以补充更多信息。将传感器的 QoS 设置为 Sensor Data(如果还不是默认值)。

补充传感器的附加信息(射线数量、角度、量程、更新频率等),这些信息可从传感器文档中获取。如果使用消费级激光雷达,可点击 Edit Perception parameters (advanced) 按钮并启用 Accept laserscan with wrong size。受限于低成本硬件,这类传感器每次扫描提供的射线数量经常与应有数量不一致。启用该选项可绕过针对安全等级传感器的常规检查,使其可用于 Supervisor。同样,将高级的 Min distance mode 设置为 SET_AT_INFINITY,使无量程读数被设为无穷大而非最小值。
为每个感知源的 frame 选择在常规页面中设置的参考坐标系。如果之前未设置,请返回设置后再继续,该坐标系现已在下拉菜单中可用。
如果提供一组预定位的障碍物用于碰撞避免,请启用 Obstacles Map 并提供地图的话题名称。目前支持以下格式的障碍物:
lll_msgs/ObstacleArray
完成此页面后,单击底部「Save」按钮保存配置,然后点击「Next」进入下一页。
监管器配置:控制
Section titled “监管器配置:控制”此页面用于配置低层控制器的故障管理。例如,如果使用编码器控制电机,可监控编码器数据以确保电机收敛到期望设定点。这是一个不常用功能,并非 Supervisor 运行所必需——因此我们跳过此部分。
监管器配置:监管器
Section titled “监管器配置:监管器”最后一页用于设置 Supervisor 的系统参数。Supervisor Interface 部分包含输入命令速度话题和输出受监管(Supervised)话题的配置。应已预填充一个输入命令速度的 geometry_msgs/TwistStamped 话题和一个输出 Supervised 话题的 geometry_msgs/TwistStamped 话题,使用深度为 10 的 System Default QoS。因此只需更新话题名称以匹配 Nav2 配置。

将 Supervisor 输出信号设置为 /cmd_vel_supervised,以集成到 Nav2 的后处理管道中。随后将其重映射为 Nav2 碰撞监控器的输入。将 Motion planning 的输入信号改为 /cmd_vel_smoothed,以接收速度平滑器(Velocity Smoother)的输出消息。如果不同时使用 Nav2 碰撞监控器和 Supervisor,可直接将 cmd_vel_supervised 替换为 /cmd_vel。选择 Create Mask 按钮并创建一个 vx_cmd=0 和 wz_cmd=2 的掩码。
提示:如果将机器人系统设置为在 Nav2 输出上持续发布零速度,监管器可以在机器人停止的状态下根据接近的障碍物继续避免碰撞。
将信号频率更新为与 Nav2 控制器更新频率相同。与定位参数类似,使用标准 geometry_msgs/TwistStamped 消息时无需修改掩码。
Run-time Assurance Module 部分配置 Supervisor 用于碰撞避免的主要参数。默认情况下应已启用。
如果对障碍物的最小距离有容差要求,可在 Collision distance threshold(碰撞距离阈值)处设置。Filter rate 是 Supervisor 碰撞避免计算的更新频率,初始建议保持为 50 Hz。
Aggressiveness、Conservativeness、Pointiness 和 Evasion Aggressiveness 暂可保持默认值。这些参数控制 Supervisor 调整机器人轨迹以避免碰撞的激进程度,后续可根据机器人的实际表现和应用需求进行微调。
故障管理部分并非 Supervisor 运行所必需,但对监控机器人健康和性能很有用。打开 Can resume on failure 开关,以便在传感器和命令速度输入发生超时故障时自动恢复。本节其余部分暂且跳过,如有需要可自行启用。
在 Advanced Settings 部分中保持 Use Localization 禁用。它定义调试信息发布所参考的 frame,用于 MarkerArray 可视化。
Robot Diagnostics 部分用于监控机器人诊断和健康状态。这也并非 Supervisor 运行所必需,但对监控机器人健康和性能很有用。默认禁用,如有需要可启用并配置各话题或进程源,还可监控单个节点的输入输出是否符合预期。
完成此页面后,单击底部「Save」按钮保存配置。此时所有 6 个选项卡都应为白色,表示配置完整且有效。如果任何选项卡为黄色,说明仍有必填字段未填写,补充后再次保存。
完整配置应已保存在 ~/.3laws/config/supervisor.yaml 中。查看 tb4_supervisor.yaml 获取 TurtleBot 4 机器人的完整配置示例,可用于本教程的仿真演示。使用时请将此文件移动到 ~/.3laws/config/ 目录中,重命名为 supervisor.yaml,并在继续之前输入 API 密钥和期望的机器人名称。
遇到问题时,请在 Supervisor 运行期间查看 Supervisor 终端日志以及控制面板的 Operations 选项卡。如果某个框为绿色,表示正在接收并成功处理数据;蓝色表示正在接收数据但未正确处理;红色表示完全没有接收数据。
如果使用 use_sim_time 运行仿真时间,目前需将重新打时间戳设置为始终开启,使用系统时钟时间打时间戳。如果消息使用仿真时间打时间戳,可能导致框显示为蓝色。
设置完成后查看机器人小地图,确保传感器 frame 正确,数据在机器人附近的正确区域被处理。
TurtleBot 4 监管器示例
Section titled “TurtleBot 4 监管器示例”本教程演示了 Supervisor 与 Nav2 在 TurtleBot 4 机器人上的集成,使用 nav2_bringup 提供的标准仿真环境和地图。完整的 Supervisor 配置可在 tb4_supervisor.yaml 文件中找到。该配置使用上述步骤创建:
- 使用
nav2_bringup/params/nav2_params.yaml中的 Nav2 配置提取共享参数。 - 机器人名称设置为机器人计算机的主机名。
- 世界坐标系验证为
map,高级设置中的 Project to SE2 已启用。 - 模型验证为差速驱动,碰撞形状为半径 0.22 米、高度 0.7 米的胶囊体。
- 基础 frame 验证为
base_link,并为处理传感器数据添加了rplidar_link和oakd_link附加 frame。 - 使用直接速度模型,速度限制验证为线速度 -0.35 至 0.5 m/s,角速度 -1.9 至 1.9 rad/s。
- 定位使用
/odom话题,请验证是否正确。 - 感知预填充了 2D 激光雷达的
/scan话题。需添加额外的扫描传感器元数据:本例中为 336 条射线,角度范围 -3.14 到 3.14 弧度,量程 20 米。这些数据从仿真中的/scan话题获取。高级设置中已启用 Accept laserscan with wrong size,因为这是低成本激光雷达,每次扫描可能提供不同数量的射线。 - Supervisor 部分中,运动规划话题设置为
/cmd_vel_smoothed,Supervisor 输出信号设置为/cmd_vel_supervised。 - Supervisor 参数设置为 Aggressiveness 1.5、Conservativeness 0.01、Pointiness 0.0 和 Evasion Aggressiveness 500。
- 碰撞距离阈值设为 0.25 米,以提供良好的缓冲。
3. Nav2-Supervisor 配置
Section titled “3. Nav2-Supervisor 配置”碰撞监控器集成
Section titled “碰撞监控器集成”Supervisor 配置完成后,需要重映射 Nav2 的命令速度话题,将监管器集成到管道中。在第 1 步中,运动规划(即 Nav2)的输入话题已设置为 /cmd_vel_smoothed。因此需要将碰撞监控器的输入设为监管器的输出话题 /cmd_vel_supervised,使新的后处理管道变为:
/cmd_vel_nav (Controller Server)--> /cmd_vel_smoothed (Velocity Smoother)--> /cmd_vel_supervised (Supervisor)--> /cmd_vel (Collision Monitor)--> Robot Base Controller在 Nav2 参数文件中,将碰撞监控器的 cmd_vel_in_topic 改为 /cmd_vel_supervised。
collision_monitor: ros__parameters: base_frame_id: "base_footprint" odom_frame_id: "odom" cmd_vel_in_topic: "cmd_vel_supervised" # <-- Changed from cmd_vel_smoothed cmd_vel_out_topic: "cmd_vel"如果不需要碰撞监控器,可跳过此步骤,让 /cmd_vel_smoothed 直接发送到 Supervisor,由其输出 /cmd_vel。如果使用的是 Approach Footprint Collision Monitor 配置或仅使用停止区(stop zones),其功能可能与 Supervisor 有所重叠。
Nav2 可能需要进行一些自定义配置,才能在自主工作流中充分利用 Supervisor。控制器的更改取决于所使用的控制算法类别:
- 高级、预测式或反应式
- 几何式或代数式
对于考虑碰撞并主动避障的高级、预测式或反应式控制器,无需修改控制器的碰撞检测系统——这些控制器在路径被阻塞时会自动偏离路径并找到绕开障碍物的方法,因此可以保留原样。Supervisor 在某些情况下会操纵命令以提供额外的障碍物安全裕度,扮演的是辅助角色。虽然这些算法无需重规划即可偏离路线绕过障碍物,但在存在特别大的障碍物的环境中,利用重规划可能仍有帮助。使用 Supervisor 时,这些控制器可以调整为更激进的模式,或者在碰撞避免方面不需要那么精细的调参。
对于几何算法(如受限纯追踪(Regulated Pure Pursuit)和 Graceful 控制器),必须禁用碰撞检测和避免管道,以免控制器在检测到障碍物挡路时放弃并停止导航。检测障碍物并在必要时偏离或停止机器人的职责将转移到 Supervisor。只需在算法配置中设置 use_collision_detection: False 即可。Supervisor 需要额外的操作空间,如果因碰撞挡路而立即失败导航任务,它将无法介入。建议将这些基础路径跟随方法与重规划配合使用,以帮助绕开大型障碍物。增大几何算法的前瞻距离(lookahead)也可能有益。
要在应用中启动 Supervisor,可在 bringup 包中使用以下启动文件。
from ament_index_python.packages import get_package_share_directoryfrom launch import LaunchDescriptionfrom launch.actions import IncludeLaunchDescription, ExecuteProcessfrom launch.launch_description_sources import PythonLaunchDescriptionSourcefrom launch.substitutions import PathJoinSubstitution, EnvironmentVariableimport os
def generate_launch_description(): launchDesc = LaunchDescription() # If the Supervisor package is available on system (debian install) # then include the supervisor launch file pkg = get_package_share_directory("lll_supervisor") launchDesc.add_action( IncludeLaunchDescription( PythonLaunchDescriptionSource( PathJoinSubstitution( [ get_package_share_directory("lll_supervisor"), "launch", "supervisor.launch.py", ] ) ) ) )
return launchDesc这样就完成了——现在可以将 Supervisor 与 Nav2 一起使用了。重新构建 Nav2 配置包即可开始。
4. Nav2 TurtleBot 4 仿真演示
Section titled “4. Nav2 TurtleBot 4 仿真演示”此演示在 nav2_bringup 中使用 Nav2 TurtleBot 4 仿真与 Nav2 路线服务器(Route Server),并在路线图中插入一个托盘阻挡路线。演示目的是模拟工业应用场景:除非因阻塞而绝对必要,机器人不得偏离车道。车道由路线服务器的仓库地图拓扑图(graph)定义,自主软件将拓扑图生成的路径(不感知阻塞情况)发送给控制器跟踪。既没有路线路径的重规划,也没有自由空间规划。
Nav2 控制器可以通过调参来实现「先跟随路径、再在需要时避开障碍物」的行为,但要为给定应用和硬件系统找到正确的平衡可能繁琐且耗时。使用 Supervisor 可以更轻松地实现类似行为,如下所示。
此演示清楚地展示了 Supervisor 与 Regulated Pure Pursuit 控制器配合使用时,如何克服该控制器面临的一些挑战——无需停止、导航失败或执行行为树配置的系统级恢复行为。机器人使用参数少、易于配置的控制器跟随路径,并在必要时偏离路线以避开障碍物。虽然建议将这种几何方法与动态重规划配合以帮助避开大型障碍物,但此演示展示了一个完全可由 Supervisor 处理的场景——尽管重规划有助于进一步优化效率。
此外,可以看到 MPPI 也能利用 Supervisor 提供的推力(nudges)更快地通过目标,从而进入新的解决方案空间。这种更快的决策提高了系统的到达目标时间(time-to-goal)性能。虽然 MPPI 本身就能克服此障碍,但在类似的阻塞场景及多机器人设施中,提高吞吐量可为整个机器人解决方案带来可衡量的效率提升。
需要注意的是,类似效果也可通过中间配置的行为树实现:在路径无障碍时使用精确路径跟随算法(如 Regulated Pure Pursuit),在存在障碍物时切换到动态重规划和/或高级控制器绕开障碍物。但这需要更多的设置和管理工作,且仅在对机器人行为有严格管理要求时才有收益。如果已使用重规划和 MPPI(以及中高级的应用特定行为树),Supervisor 在这种场景下的改进相对有限,但仍可 (a) 略微提高吞吐量,(b) 作为更大安全体系的一部分提供额外的分层碰撞避免,(c) 减少在靠近障碍物时对预测式控制器行为的一些最繁琐的微调。
5. 硬件演示
Section titled “5. 硬件演示”硬件演示在拣料(bin-picking)环境中进行。两条双面通道通过 Nav2 路线服务器配置,模拟仓库或工厂的车道。每条路线车道设为双向,故意制造两台机器人之间的冲突,以演示多机器人和动态障碍物冲突避免。如前所述,Regulated Pure Pursuit 控制器的碰撞避免已禁用,改用 Supervisor 来避开机器人并为货架留出最大的通过空间。每台机器人在拣料区域前方的暂存点初始化,被发送到随机目标点。机器人之间的冲突消除(deconfliction)以及为给货架留出额外间隙而偏离路线图的情况如下所示。
为了进一步测试 Supervisor 的能力,机器人从最左侧货架的起点被发送到右侧,以创建一个人机交互测试环境。下面可以看到 Supervisor 如何处理各种动态障碍物,在没有重规划或更高级的 Nav2 控制器算法帮助的情况下解决冲突。注意:通常对于此类任务,生产环境中建议使用 MPPI 或 DWB 之类的控制器,这样 Supervisor 可以按需专注于偏转,而不必完全依赖它来实现智能和自主行为。此处单独展示是为了强调在自主控制器不尝试避免碰撞的极端情况下可以实现什么效果。
如图所示,这可以减少系统的停机次数,从而在整个任务过程中提高吞吐量和平均速度。它避免了机器人在安全区外停下来等待人或障碍物经过的情况。Supervisor 的「力场」效应使机器人能够继续移动并朝着目标前进,同时仍然避免碰撞。
穿过狭窄的门廊通常对自主导航系统来说是一个重大挑战。难点在于将机器人精确定位在门廊中心,以确保间隙最小的机器人能够可靠而优雅地通过。传统的路径规划和控制算法通常难以应对这种情况,因为偏离规划路径的微小偏差可能导致擦碰到门框或在入口处犹豫不决。
3Laws Supervisor 在这类情况下表现出色,它提供实时轨迹调整,自然地将机器人与狭窄通道的中心对齐。无需精确的路径跟随或复杂的控制器调参,Supervisor 的偏转场(deflection field)效应即可轻轻引导机器人保持与门廊两侧的安全间隙。这使得机器人无需停止、重规划或恢复行为即可平稳、自信地穿过狭窄空间。
下面的视频演示了 Supervisor 使机器人轻松穿过狭窄门廊,并在整个通过过程中保持正确的对齐和间隙:
如演示所示,Supervisor 处理狭窄通道的能力使其特别适用于:
- 具有标准门廊的办公室和仓库环境中的室内导航
- 具有较大外形尺寸或最小间隙余量的机器人
- 在狭小空间中进行远程操作,远程操作员可能难以判断间隙
- 减少针对特定环境特征的广泛控制器参数调参需求
更详细的信息可以在以下文档中找到:
相关的 GitHub 仓库可以在这里找到:
- https://github.com/open-navigation/opennav_3laws_demonstration
- https://github.com/3LawsRobotics/3laws-demos/tree/master
我们还有一个有趣的视频(它没能在别处自然安放,但值得一看)!