v2_humanoid_navigation_tutorial

第八章 — 传统导航方案(SLAM + 栅格/图 + 规划)

开篇段落

本章将深入探讨人形机器人在室内导航中最为经典和成熟的“三段式”算法方案:SLAM(同步定位与建图)、地图表示(代价地图)与路径规划。这套体系结构清晰、模块化、可解释性强,是工业界和学术界久经考验的导航框架。即便在端到端学习方案兴起的今天,理解这一经典范式仍至关重要,因为它不仅是现代复杂导航系统的基石,其诸多组件(如代价地图、运动规划器)也常作为 VLA 等新架构的“小脑”或安全冗余。我们将从 VIO/SLAM 如何构建环境的几何与语义认知开始,过渡到何用多层代价地图精细地表达动态、静态和语义约束,最后详细拆解从 A* 搜索到模型预测控制的各类规划算法。学完本章,你将能为人形机器人设计一个鲁棒、可解释且高效的传统导航算法栈,并深刻理解其设计哲学与工程权衡。

8.1 VIO/SLAM:特征/直/语义增强的定位与建图

传统导航的第一步是回答两个基本问题:“我在哪?”(定位)和“周围环境长什么样?”(建图)。SLAM (Simultaneous Localization and Mapping) 正是为此而生。对于具备多传感器(尤其是 IMU)且运动自由度高的人形机器人,视觉惯性里程计 (VIO) 或视觉惯性 SLAM 是主流选择,因其能提供鲁棒的 6-DoF 位姿估计。

Rule-of-Thumb (经验法则)

8.2 栅格地图与代价地图:动态层 + 衰减 + 通道分层

SLAM 构建了环境的静态“底图”,但导航需要一个能实时反映动态障碍物、机器人约束和任务偏好的数据结构。代价地图 (Costmap) 正是为此而生,它是一种二维或三维的栅格地图,每个栅格的值 C(x, y) 代表机器人通过该点的“成本”或“风险”。一个典型的代价地图是多个图层 (Layers) 叠加的结果。

      +-------------------------------------------------+
      | Semantic Layer (e.g., forbidden zones, speed   |  (来自语义地图和任务指令)
      |                  profiles)                      |
      +-------------------------------------------------+
                             | (叠加)
      +-------------------------------------------------+
      |      Inflation Layer (Safety Buffer)            |  (基于机器人尺寸的膨胀)
      +-------------------------------------------------+
                             | (叠加)
      +-------------------------------------------------+
      |      Obstacle Layer (Dynamic Obstacles)         |  (来自实时传感器, e.g., Depth, Sonar)
      +-------------------------------------------------+
                             | (叠加)
      +-------------------------------------------------+
      |       Static Layer (Base Map)                   |  (来自 SLAM 的全局地图)
      +-------------------------------------------------+
                                ||
      +-------------------------------------------------+
      |              Final Composite Costmap            |  (输入给路径规划器)
      +-------------------------------------------------+

Rule-of-Thumb (经验法则)

8.3 路径规划:A/D/Hybrid A/RRT/轨迹优化

有了代价地图,路径规划的目标就是在其中找到一条从起点到终点的总成本最低的、且符合机器人运动学约束的路径。

8.4 全局-局部层级与重规划策略

将全局和局部规划器组合成一个分层系统,是实现鲁棒导航的标准架构。

8.5 与语义的轻耦合:地标锚点与禁止区

传统导航方案虽以几何为核心,但通过代价地图这一灵活接口,可以非常高效地与语义信息进行“轻耦合”。

本章小结

本章系统地介绍了传统机器人导航的“三位一体”方案,这是一个经过充分验证、高度模块化的强大框架。

常见陷阱与错误 (Gotchas)

  1. SLAM 尺度漂移与地图跳变
    • 陷阱:仅使用单目 VIO 会导致尺度不确定性,尤其在长廊等场景。更严重的是,当 SLAM 执行一次大的闭环修正时,地图坐标系和机器人的估计位姿会发生突变(“跳变”),这会瞬间撕裂当前的全局路径,导致导航系统崩溃。
    • 调试技巧:引入立体视觉、深度相机或腿部里程计来提供绝对尺度。关键:SLAM 模块在执行闭环跳变后,必须通过一个明确的事件通知导航栈。导航栈收到通知后,应立即清除所有旧的路径和局部代价地图,并触发一次全新的全局规划。
  2. 代价地图参数调优地狱
    • 陷阱:代价地图的参数(分辨率、膨胀半径、衰减时间、各层权重等)相互影响,构成了一个复杂的优化问题。不当的参数会导致机器人行为怪异,例如过于胆小(离墙太远)、过于鲁莽(贴障太近)或在狭窄空间“振荡”。
    • 调试技巧:建立一套可复现的仿真评估场景(包括开阔地、狭窄通道、动态障碍物等)。使用版本控制系统(如 Git)严格管理参数文件。调参时,遵循“从粗到细”的原则:先确定核心几何参数(分辨率、机器人尺寸),再调整规划器行为参数(权重、速度限制),最后优化恢复行为。
  3. 坐标系混淆 (TF Hell)
    • 陷阱:在一个完整的导航系统中,至少存在 map(世界固定坐标系)、odom(里程计漂移坐标系)、base_link(机器人本体坐标系)和多个传感器坐标系。这些坐标系之间的转换(TF)关系一旦出错,是导航系统中最常见且最隐蔽的 bug。
    • 调试技巧:始终使用可视化工具(如 RViz)将所有 TF 树、地图、传感器数据和规划路径同时显示。编写自动化脚本来检查 TF 树的连通性和更新频率。rosrun tf tf_echo map base_link 是检查 mapbase_link 最终变换的利器。
  4. 全局与局部规划器“目标冲突”
    • 陷阱:全局路径可能穿过一个局部规划器认为无法通过(但理论上能过)的狭窄区域。局部规划器会不断尝试,但由于其目标函数的设计(例如,避障权重过高),它永远无法生成一条“勇敢”穿过的轨迹,导致机器人卡在入口处。
    • 调试技巧:确保全局规划器在规划时使用的机器人“足迹”(footprint) 模型至少与局部规划器一样大,甚至更保守一些。引入“路径可行性检查”模块,对全局路径的每个点,都在一个局部窗口内评估其可通行性。对于局部规划器,考虑设计动态调整参数的策略,例如,在接近全局路径上的狭窄通道点时,临时降低避障权重。
  5. 计算性能瓶颈
    • 陷阱:高分辨率的(尤其是3D)代价地图、高频率的传感器数据处理、以及基于采样的规划器(如 MPPI)都对计算资源要求很高。CPU/GPU 负载过高会导致系统延迟增加,使得机器人的反应“慢半拍”,在动态场景中极易发生碰撞。
    • 调试技巧:持续进行系统性能剖析(profiling)。使用多分辨率地图(在远离机器人的区域使用低分辨率)。对点云数据进行体素下采样(Voxel Grid Downsampling)。优化代码,例如使用 GPU 加速代价地图更新和轨迹采样。根据系统负载动态调整规划频率或局部窗口大小。