调优指南
本指南旨在帮助用户调整其导航系统。虽然 配置指南 包含了Nav2的所有参数列表,但对于如何使用其中最重要的参数进行调优,它并没有提供太多的指导。本指南的目的是在第一次设置之后提供更多关于如何设置系统的建议,您可以在 首次机器人设置指南 中找到第一次设置的相关信息。这并不意味着涵盖了所有参数(因此,请查阅感兴趣的软件包的配置指南),但会提供一些有用的提示和技巧。
这个调优指南是一个持续进行中的工作。如果你发现有一些你缺失的见解,请随时提交一个工单或拉取请求,分享你想要分享的智慧。这是一个由Nav2用户和维护人员慷慨支持的开放部分。请考虑回馈。
膨胀潜力场
许多用户和生态系统的导航配置文件中,维护人员发现实际上忽略了膨胀层的要点。虽然你可以简单地在墙壁周围膨胀一个小半径以避免严重碰撞,但是膨胀层的真正价值在于创建一个始终如一的势场,覆盖整个地图。
一些最受欢迎的ROS导航/Nav2调优指南甚至在 这方面特别指出 ,在应用内刻画成本之后,在地图的宽度上创建一个平滑的潜力场会带来实质性的好处,但实际上很少有用户这样做。
这种做法实际上会导致NavFn、Theta*和Smac Planner生成的路径略显次优。它们实际上更希望寻找一个平滑的势场,而不是广阔开放的零代价空间,以便保持在空间的中间位置并更好地处理附近的移动障碍物。这将允许搜索在搜索算法遇到膨胀引起的障碍物之前就偏向于自由空间,从而使规划器尽可能地远离障碍物。
因此,根据维护者的建议以及ROS中提供的所有其他成本感知搜索规划器,为了在整个地图上充分产生平滑的潜力场,您需要增加膨胀层的成本比例和半径。对于非常大的开放空间,在中间有0成本区域是可以接受的,但对于大厅、过道和类似的区域,请**创建一个平滑的潜力场以获得最佳性能**。
机器人足迹与半径
Nav2允许用户以两种方式指定机器人的形状:几何“footprint”或包围机器人的圆的半径。在ROS(1)中,通常指定一个近似的机器人半径是相当合理的,因为全局规划算法不使用它,并且本地规划器/成本图设置了圆形的假设。
然而,在Nav2中,我们现在有多个规划和控制算法使用完整的SE2足迹。如果你的机器人不是圆形的,建议你给规划器和控制器提供机器人的实际几何足迹。这将使规划器和控制器能够规划或创建进入更狭小空间的轨迹。例如,如果你有一个非常长但瘦的机器人,圆形的假设将不允许机器人规划进入只比机器人稍宽一点的空间,因为机器人无法长度方向上适应。
如果提供了实际足迹,运动可行的规划器(例如Smac Hybrid-A*,Smac State Lattice)将使用SE2足迹进行碰撞检查,以创建运动可行的路径规划。截至2021年12月,所有的控制器插件都支持完整的足迹碰撞检查,以确保路径跟踪的安全性。如果您提供了机器人的足迹,它将被用于确保轨迹的有效性,建议您这样做。这将防止一些可能本可以轻松避免的"卡住的机器人"情况的发生。
如果你的机器人确实是圆形的,请继续使用``robot_radius``参数。非圆形机器人使用半径而不是SE2足迹的三个有效原因:
相对于环境来说,机器人非常小(例如在仓库中的遥控车)
机器人的计算能力非常有限,使用SE2足迹检查会增加太多的计算负担(例如嵌入式微处理器)。
如果您打算使用全向规划器(例如Theta*,Smac 2D-A*或NavFn),您可以继续使用圆形足迹,因为这些规划器不是运动可行的,也不会使用SE2足迹。
就地旋转行为
通过使用:ref:configuring_rotation_shim,机器人将在开始跟踪全向路径之前简单地原地旋转。这使开发人员可以调整控制器插件以优化路径跟踪并为您提供干净的旋转效果。
由于某些现有控制器存在问题,调整控制器以完成任务可能会使其僵硬,或者在使用全向路径时根本无法就地旋转(如果这是一种理想的特性)。结果是,当机器人的初始朝向和路径朝向明显不同时,会出现尴尬、抽搐或旋转行为。给控制器一个更好的起点来跟踪路径,可以大大简化控制器的调整,并为观察者创造更直观的结果(至少在某一维护人员的看法中是这样的)。
注意:如果使用非全向的运动可行规划器(例如Smac Hybrid-A*,Smac State Lattice),这不是必要的行为优化。这类规划器将创建考虑到机器人起始朝向的路径规划,不需要任何旋转行为。
此行为最适用于:
能够原地旋转的机器人,如差分驱动和全向驱动机器人。
当开始跟踪一个与机器人当前朝向明显不同的新路径时,或者当调整控制器以完成任务时,紧密旋转变得困难时,首选就地旋转。
规划器插件选择
Nav2提供了许多规划插件。对于首次设置,请参阅:ref:`select_algorithm`以获取有关Nav2中算法风格的更详细说明,以及:ref:`plugins`以获取当前可用插件的完整列表(可能会随时间更新)。
总的来说,下表是针对不同类型的机器人底盘的最佳规划插件的良好指南:
插件名称 |
支持的机器人类型 |
---|---|
NavFn规划器 |
圆形差分,圆形全向 |
Smac 2D规划器 |
|
Theta Star Planner |
|
Smac混合A*规划器 |
非圆形或圆形阿克曼,非圆形或圆形腿式 |
Smac格栅规划器 |
非圆形差分,非圆形全向,任意 |
如果您使用的是非圆形机器人且计算能力非常有限,评估使用全向规划器(例如粒子假设规划器)的好处可能是值得的。维护者建议首先开始使用适合您的平台的更高级算法,但如果需要,可以缩小规划器。可行规划器的运行时间通常与它们的全向对应物相当(或有时更快),所以不要被它们较新的特性所迷惑。
由于规划问题主要受机器人类型驱动,该表格准确总结了维护者向用户提供的建议。在圆形机器人领域内,规划算法的选择取决于应用和所需行为。NavFn通常会产生宽广的曲线;Theta*更偏好直线并支持任意角度;而Smac 2D本质上是一种具有成本感知惩罚的经典A*算法。
注解
这些只是社区提供的默认和可用插件。针对特定应用/平台,您也可以选择不使用这些插件并自己创建,这是Nav2框架的目的。有关详细信息,请参阅:ref:`writing_new_nav2planner_plugin`教程。如果您愿意将这项工作贡献给社区,请提交工单或联系维护者!他们会很乐意听取您的意见。
控制器插件选择
Nav2提供了一系列现成的控制器插件。对于首次设置,请参阅:ref:`select_algorithm`以获取有关Nav2中算法样式的更详细解释,以及:ref:`plugins`以获取当前可用插件的完整列表(可能会随时间更新)
一般而言,下表是对不同类型机器人底盘可用的控制器插件的良好初步描述:
插件名称 |
支持的机器人类型 |
任务 |
---|---|---|
DWB控制器 |
差动、全向 |
动态障碍物避免 动态障碍物避免 |
TEB 控制器 |
差动、全向、阿克曼、腿式 |
|
RPP 控制器 |
差动、阿克曼、腿式 |
精确路径跟随 |
旋转衬垫 |
差动、全向 |
旋转至粗略方向 |
上述所有控制器都可以处理圆形和任意形状的机器人配置。
调整纯追踪(Regulated Pure Pursuit)适用于精确路径跟随,并通常与其中一个运动学可行的规划器(例如状态网格、混合A*等)配对使用,因为这些路径在给定严格物理约束的情况下可以行驶。然而,它也可以应用于差分驱动机器人,它们可以轻松转动以匹配任何全向路径。如果您只希望您的机器人按照路径行驶,而不需要任何动态障碍物避免或偏离,那么这就是首选插件。它简单而几何,同时在附近有障碍物 并且 进行急转弯时会减速机器人。
DWB 和 TEB 都是可以追踪路径的选项,但是如果存在动态障碍物,它们也会偏离路径(以避免碰撞)。DWB 通过在一组评价器上对多条轨迹进行评分来实现这一点。这些轨迹也是通过可以替换的插件生成的,但支持开箱即用的 Omni 和 Diff 机器人类型,并遵守有效速度和加速度限制。这些评价器是可以在运行时选择的插件,并包含可以调节的权重,以创建所需的行为,例如最小化路径距离、最小化距离到目标或航向,以及其他可以设计的动作惩罚。对于特定的平台、应用和所需的行为,这需要进行一些调整,但可以调整 DWB 以实现几乎任何单一目标的良好表现。
另一方面,TEB 实现了一种基于优化的方法,为存在障碍物的路径跟踪生成了一个图解问题。TEB 在处理场景中存在其他移动代理时表现出色,但计算成本要高得多,因此它在较小的计算平台机器人(例如最低配置为i3,以20hz运行)上大部分不适用。通常情况下,这种方法的效果相当不错,但要调整特定行为,您可能需要修改优化引擎参数,这些参数不如DWB直观或根植于某种物理概念,但具有相当不错的默认值。
最后,Rotation Shim 插件有助于辅助 TEB 和 DWB(以及其他插件)将机器人原地旋转到新路径的航向上,然后开始追踪路径。这样可以使您调整本地轨迹规划器以实现所需的行为,而不必担心能否在非常小的欧几里得距离上迅速旋转并在角度上产生显著偏差。有些控制器在进行准确路径追踪时,由于受到其动作限制,无法非常清晰地旋转到新的航向。其他控制器具有“螺旋外扩”的行为,因为它们的采样需要一定的平移速度,这使得它无法简单地原地旋转。这有助于缓解这个问题,使机器人能够平稳地原地旋转。
注解
这些只是社区中默认和可用的插件。对于特定的机器人平台/公司,您也可以选择不使用这些插件,而是创建自己的插件。有关更多详细信息,请参阅 编写新的控制器插件 教程。如果您愿意将这项工作贡献给社区,请提交工单或联系维护人员!他们将非常乐意听取您的意见。
在 Smac 规划器中缓存障碍物启发式函数
Smac的混合A*和状态格规划器提供了一个选项,cache_obstacle_heuristic
。这个选项可以用来在重新规划到相同目标位姿时缓存启发式函数,从而可以显著提高规划器的速度(取决于许多因素,速度提高了40-300%)。障碍启发式函数用于将机器人引导到空间中间,遵循成本,并沿着走廊进行运动学可行性搜索,朝着有效解决方案。可以将其视为一个二维成本感知搜索,用于在完全可行的搜索/ SE2碰撞检测中,为规划器提供关于需要在何处进行更多努力的提示。
这有助于提高性能以实现更快的重规划速度。但是,如果缓存这个启发式函数,它将不会根据代价地图的最新信息进行更新以引导搜索。在规划过程中,规划器仍会使用最新的碰撞检查代价信息,因此这不会影响路径的安全性。然而,它可能会将搜索引导到新封闭的通道或可能存在新的动态障碍物的区域,如果整个解空间被阻塞,这可能会显著减慢速度。
因此,维护者建议只在在大部分静态环境中工作(例如,没有太多移动物体或变化,在全局代价地图中不使用实时传感器更新等情况下),在规划跨越大空间到单一目标时启用此选项。在目标更改到Nav2时,这个启发式函数将会根据最新的信息进行更新,因此如果您频繁更改目标,它并不是非常有帮助。
其他我们愿意提供的页面
如果你愿意贡献一些想法,可以参考 https://github.com/ros-planning/navigation.ros.org/issues/204,但我们对你认为有洞察力的任何想法都持开放态度!