Skip to content

选择算法

本指南介绍机器人如何利用不同的规划器和控制器算法来完成导航任务,并列举一些可用的算法插件,供你根据机器人类型和运行环境进行选择。

Nav2 的导航算法以插件形式运行在 ROS 动作服务器(action server)上,涵盖规划器、控制器和行为服务器等。本节聚焦规划器和控制器服务器——它们是导航栈的核心。每台服务器可加载一个或多个算法插件,各插件拥有独立配置,针对特定任务或机器人状态进行优化。本指南按机器人类型和部署环境介绍不同算法,不涉及行为服务器和平滑器等内容,因为它们取决于具体应用场景,难以给出与硬件或环境相关的通用建议。

规划器服务器负责为机器人计算路径。例如,可配置一个插件计算近距离两点间的最短路径,另一个插件则用于覆盖整个环境的长距离路径规划。

控制器服务器负责生成局部控制指令,确保机器人完成各项任务,包括沿规划路径行驶、躲避动态障碍物,甚至在对接站(docking station)充电等。

规划器和控制器服务器各维护一组插件映射,在不同环境、场景或任务下选用相应插件。例如,控制器服务器可配置一个插件在长走廊中保持居中行驶,另一个插件在拥挤场景中避障。导航系统通过行为树根据机器人当前任务选择要执行的算法。

注意:想更深入了解导航服务器(Navigation Servers),可参阅导航概念(Navigation Concepts)章节中的 Navigation Servers 部分。

本节介绍规划器和控制器服务器可用的一些算法插件,说明各算法的适用场景及推荐的机器人类型,并给出相应的 YAML 配置示例。

注意:可用算法插件不限于本节列出的这些。也可以创建自定义插件,Nav2 也会定期添加新插件。编写自定义插件的教程可参阅编写新的规划器插件和编写新的控制器插件。所有 Nav2 插件及其描述可在 Navigation Plugins 页面查阅。

规划器插件利用各传感器采集的环境信息来计算机器人路径。部分算法通过搜索代价地图网格空间来规划路径,另一些则在扩展机器人状态空间时兼顾路径的运动学可行性。

网格空间规划插件包括 NavFn Planner(NavFn 规划器)、Smac Planner 2D(Smac 2D 规划器)和 Theta Star Planner(Theta* 规划器)。NavFn 规划器基于 Dijkstra 或 A* 实现导航函数计算。Smac 2D 规划器采用 4 或 8 连通邻域实现 2D A* 算法,并支持平滑器和多分辨率查询。Theta Star 规划器是 Theta* 的一种实现,利用视线(line of sight)检测生成非离散步进的路径段。

网格空间算法的局限在于:不一定能为所有类型机器人生成可行驶的路径。例如,NavFn Planner 用机器人的最大横截面半径近似为圆形足迹,再逐个代价地图网格单元检查碰撞,因此无法保证在狭窄空间中为非圆形机器人规划出可行路径。此外,这类算法也不适合阿克曼(ackermann)和腿式(legged)机器人,因为它们存在转弯半径约束。总的来说,这些插件最适合能向任意方向行驶或可原地安全旋转的机器人,例如圆形差速和圆形全向机器人。

Smac Hybrid-A* 规划器支持任意形状的阿克曼和腿式机器人。它是一个高度优化、完全可配置的 Hybrid-A* 实现,支持 Dubins 和 Reeds-Shepp 运动模型。该算法在扩展候选路径时同时考虑机器人的最小转弯半径约束和完整足迹碰撞检测。因此,它适用于需要完整足迹碰撞检查的任意形状机器人,也适用于高速机器人——这类机器人在导航时需格外小心,以避免高速翻转、打滑或甩落负载。

Smac Lattice planner(Smac 状态格栅规划器)基于状态格栅(State Lattice)方法实现。它通过扩展机器人状态空间来规划路径,同时确保路径符合机器人的运动学约束。该算法提供最小控制集,能以极少的重新配置支持任何形状和大小的差速、全向和阿克曼车辆。

插件名称支持的机器人类型
NavFn Planner圆形差速、圆形全向
Smac Planner 2D圆形差速、圆形全向
Theta Star Planner圆形差速、圆形全向
Smac Hybrid-A* Planner非圆形或圆形阿克曼、非圆形或圆形腿式
Smac Lattice Planner非圆形差速、非圆形全向
planner_server:
ros__parameters:
planner_plugins: ['GridBased']
GridBased:
plugin: 'nav2_navfn_planner::NavfnPlanner' # In Iron and older versions, "/" was used instead of "::"

上面是规划器服务器的配置示例。planner_plugins 参数接受一组插件名称列表。对于 planner_plugins 中定义的每个插件命名空间(示例中为 GridBased),通过 plugin 参数指定要加载的插件类型,然后根据所用算法在该命名空间下进行其他配置。更多细节请参阅配置指南。

默认的控制器插件是 DWB 控制器。它实现了改进的动态窗口法(DWA)算法,通过可配置的插件来计算机器人的控制指令。控制器先由 Trajectory Generator plugin(轨迹生成器插件)生成一组候选轨迹,再由一个或多个 Critic plugin(评估器插件)逐一评分,各评估器按自身配置给出不同分值。所有评估器评分之和即为该轨迹的总分,得分最高的轨迹决定输出的指令速度。

DWB controller 可用于圆形或非圆形差速,以及圆形或非圆形全向机器人。若提供考虑机器人最小曲率约束的 Trajectory Generation plugin(轨迹生成插件),也可配置用于阿克曼和腿式机器人。

TEB 控制器是一种 MPC 时间最优控制器,实现了时间弹性带(Timed Elastic Band,TEB)方法,综合考虑执行时间、与障碍物的距离以及运动学约束下的可行性来优化轨迹。该控制器可用于差速、全向、阿克曼和腿式机器人。

受限纯追踪控制器(Regulated Pure Pursuit,RPP)实现了纯追踪算法的一个变体,增加了约束启发式函数来控制碰撞和速度。该变体专为服务和工业机器人的需求设计,适用于差速、阿克曼和腿式机器人。

矢量追踪控制器(Vector Pursuit Controller)实现了矢量追踪算法,利用螺旋理论(screw theory)计算指令速度。该控制器适用于高速路径跟随和急转弯场景,也可用于计算资源有限的场合。它支持差速、阿克曼和腿式机器人。

插件名称支持的机器人类型任务
DWB controller差速、全向动态避障
TEB Controller差速、全向、阿克曼、腿式动态避障
RPP controller差速、阿克曼、腿式精确路径跟随
MPPI controller差速、阿克曼、腿式、全向现代 MPC 控制器
VP controller差速、阿克曼、腿式高速路径跟随

所有这些算法都适用于圆形和非圆形机器人。

controller_server:
ros__parameters:
controller_plugins: ["FollowPath"]
FollowPath:
plugin: "dwb_core::DWBLocalPlanner"

上面是控制器服务器的基本配置示例。与规划器服务器类似,controller_plugins 参数定义了一组插件名称,其中每个命名空间(示例中为 FollowPath)通过 plugin 参数指定所用的插件类型,然后在该命名空间下根据所选算法进行其他配置。更多细节请参阅配置指南。

注意:规划器、控制器及 Nav2 的其他服务器均通过 ROS 2 生命周期节点(lifecycle node)启动,便于统一管理服务器的启动和关闭。生命周期节点的管理将在下一篇教程中讨论。

本教程介绍了 Nav2 规划器和控制器服务器的角色与配置方式。这些服务器各维护一组算法插件,可根据机器人结构和运行环境灵活选择。同时列举了一些常用的规划器和控制器插件,帮助你为机器人选择合适的算法,并给出了基本的配置示例,演示如何实例化各插件。如需了解各插件配置参数的详细说明,可参阅相应算法插件的配置指南。