第 6 章 空间定位与建图

开篇段落

对于任何需要在物理世界中行动和交互的智能体而言,空间感知是其所有高级能力(如对话、任务执行)得以实现的基石。本章将深入探讨具身智能的“眼睛”和“内耳”——空间定位与建মণ্ড(Simultaneous Localization and Mapping, SLAM)。我们将从底层多传感器融合的物理原理和数学模型出发,详细解构现代 SLAM 系统中“前端-后端-回环”这一经典架构。您将学到不同技术路线(如滤波 vs. 优化,特征法 vs. 直接法)的核心思想与工程权衡。在此基础上,我们将重点讨论真实世界中最大的挑战:动态环境下的鲁棒性。更进一步,本章将引领您从纯粹的几何世界迈向语义丰富的空间理解,探讨如何构建和利用语义地图来真正“接地”语言指令。最后,我们将量化和利用系统固有的不确定性,将其从一个需要克服的“问题”转变为指导智能体做出更安全、更明智决策的“信号”。学完本章,您将具备设计、评估和调试一个能够在复杂、动态的人类环境中可靠运行的空间感知系统的核心知识。


6.1 轮速计/IMU/VIO 融合

具身系统的状态估计(State Estimation)几乎从不依赖单一信源。一个鲁棒的定位系统,其本质是一个精心设计的多传感器融合引擎,它能取长补短,在各种严苛条件下提供连续、准确的位姿输出。轮速计、惯性测量单元(IMU)和视觉惯性里程计(VIO)是构成这一引擎的核心部件。

  • 轮速计 (Wheel Odometry)

    • 原理:通过轮子上的编码器测量转动圈数,结合机器人运动学模型如差分驱动模型)推算其在 2D 平面上的位移和航向角。
    • 优点:成本极低,数据频率高(~100Hz),不受环境外观影响,短期内精度较高。
    • 缺点:典型的航位推算(Dead Reckoning)系统,误差会无限累积。对地面打滑、凹凸不平、轮胎磨损等物理效应非常敏感。它本质上是 2D/3-DoF 的,无法感知高度变化或车身的俯仰/翻滚。
    • 模型:对于差分驱动机器人,其运动可由线速度 v 和角速度 ω 描述。这些值可以从左右轮速 v_L, v_R 和轮距 B 计算得出。
  • 惯性测量单元 (IMU)

    • 原理:由三轴加速度计和三轴陀螺仪构成,直接测量本体坐标系下的线加速度 a 和角速度 ω。通过对这些量进行积分,可以推算系统的姿态、速度和位置(6-DoF)。
    • 优点:极高的数据更新率(200Hz - 1000Hz),完全自主,不依赖外部环境特征,能精确捉高频运动。
    • 缺点:存在两种主要误差:1) 确定性误差,如偏置(bias)和尺度因子,可通过标定部分消除;2) 随机误差,如高斯白噪声和随机游走。由于需要二次积分才能得到位置,其位置误差会随时间成立方级增长(t^3),漂移极其严重。
    • 运动学模型: $$ \begin{aligned} \dot{p}_t &= v_t \\ \dot{v}_t &= R_t(a_m - b_a - n_a) - g \\ \dot{R}_t &= R_t \cdot \text{skew}(\omega_m - b_g - n_g) \end{aligned} $$ 其中 p, v, R 分别是位置、速度和姿态(旋转矩阵),a_m, ω_m 是测量值,b_a, b_g 是缓慢变化的偏置,n_a, n_g 是噪声,g 是重力向量。
  • 视觉惯性里程计 (VIO)

    • 原理:将相机和 IMU 的优点结合。相机通过跟踪环境中的视觉特征点,可以提供对外部世界的观测,从而有效抑制 IMU 的长期漂移。反之,IMU 的高频读数可以在相机快速运动导致图像模糊、或场景缺乏纹理时,提供可靠的运动估计,并为单目相机提供绝对尺度。
    • 耦合方式
      • 松耦合 (Loosely-coupled):将视觉里程计和 IMU 视为两个独立的位姿估计模块。然后用一个独立的滤波器(如 EKF)将这两个模块输出的位姿进行融合。实现简单,计算量小,但一个模块的失败可能导致整个系统崩溃,且没有充分利用信息的内在关联性。
      • 紧耦合 (Tightly-coupled):将 IMU 的积分模型和相机的重投影模型共同放入一个大的优化问题中。直接使用 IMU 的原始读数和图像的原始特征点作为输入,联合估计系统的状态(位姿、速度、IMU偏置)以及三维路标点的位置。虽然实现复杂、计算量大,但精度和鲁棒性远超松耦合方法,是目前的主流方案(如 VINS-Mono, ORB-SLAM3)。

Rule-of-Thumb: 系统设计的起点应是一个紧耦合的 VIO 系统。IMU 的选型至关重要,消费级 MEMS IMU 的性能差异巨大,应关注其“零偏不稳定性”和“角度随机游走”指标。在系统集成后,必须进行精确的内外参标定(相机内参、相机-IMU 外参)和时间戳同步(硬件同步优于软件同步),这是决定 VIO 性能上限的关键,任何捷径都会在后续带来无尽的调试痛苦。


6.2 SLAM:前端/后端/回环与重定位

SLAM 将短期、增量的里程计估计(Odometry)扩展为一个全局一致的定位与建图框架。它通过识别历史场景(回环)来修正累积误差,从而实现“从哪里来到哪里去”的长期一致性。

+-----------+   Features/   +------------------+   Keyframes,    +------------------+   Optimized    +----------+
|  Sensors  | ------------> |     Frontend     | ------------> |     Backend      | ------------> |   Map    |
| (Cam/IMU) |   Raw Data    | (VO/VIO, Local BA) |   Pose Graph    | (Global Opt.)    |   Poses        | (Global) |
+-----------+               +------------------+   Constraints   +--------^---------+                +----------+
                                     |                           |
                                     +--------- Loop ----------->+
                                     |       Candidates          |

                                     |       Candidates          |
                                     |                           |

                                     +---- Relocalization ------>+
                                             Request
  • 前端 (Frontend)

    • 职责:处理高频的传感器数据流,快速计算出帧间的相对运动,生成局部地图。前端是系统的“反应堆”,必须保证实时性。
    • 技术路线
      • 特征法 (Feature-based):检测图像中的稀疏角点(如 ORB, SIFT),通过描述子进行匹配,然后最小化重投影误差来求解相机位姿。优点是对光照变化和快速运动相对鲁棒,技术成熟。缺点是在弱纹理区域容易失效。
      • 直接法 (Direct):不依赖特征点,直接使用像素的灰度值信息,通过最小化光度误差来求解位姿。优点是可以在弱纹理区域工作,并能构建稠密的地图。缺点是对光照变化和相机曝光参数敏感。
      • 混合法:结合两者的优点,是当前的研究趋势。
    • 关键帧 (Keyframe):前端并不会处理每一帧数据,而是选择那些与上一关键帧有足够视差或足够多新信息的帧作为关键帧。这极大地降低了后端优化的计算负担。
  • 后端 (Backend)

    • 职责:接收前端生成的关键帧及其之间的运动约束,进行全局优化,以获得一个全局最优的轨迹和地图。后端是系统的“精算师”,可以在非实时的情况下运行。
    • 核心技术:因子图优化 (Factor Graph Optimization)

      • 将 SLAM 问题建模为一个图。图中的变量节点代表需要优化的量(如每个关键帧的位姿 x_i,路标点的位置 l_j)。图中的因子节点代表观测或先验信息带来的约束(如 IMU 预积分因子、视觉重投影因子、回环约束因子)。
      • 每个因子都关联一个误差函数,其大小表示当前变量估计值与观测的符合程度。整个 SLAM 问题就转化为一个大规模的非线性最小二乘问题: $$ x^* = \arg\min_x \sum_k || e_k(x_{k_1}, x_{k_2}, ...) ||^2_{\Sigma_k} $$

      • 通过高斯-牛顿法或列文伯格-马夸尔特法等迭代优化算法求解,找到使总误差最小化的状态估计。

Factor Graph Example:

      Pose_1 (x1) --------- Pose_2 (x2) --------- Pose_3 (x3)
         |                     |                     |
  (Odometry Factor)     (Odometry Factor)            |
         |                     |                (Loop Closure
         +---- Landmark_A (l_A) ----+                  Factor)
         |  (Measurement Factor)  |                     |
         |                        |---------------------
         +---- Landmark_B (l_B) ---+
  • 回环检测 (Loop Closure) 与重定位 (Relocalization)
    • 职责:识别出当前场景是否曾经到访过,为后端提供强大的长程约束,这是消除累积误差的唯一途径。
    • 常用技术:基于外观的场景识别,如词袋模型 (Bag-of-Words, BoW)。通过离线训练一个视觉词典,将每张图像表示为一个稀疏的词频向量。通过高效查询相似的向量,可以快速找到潜在的回环候选帧。
    • 验证:找到候选帧后,必须进行严格的几何验证(如通过 RANSAC 进行对极几何约束检验或 PnP 求解),以剔除因场景相似(如两个一模一样的办公室)而导致的错误回环。重定位也遵循类似流程。

6.3 局部/全局坐标与地图管理

在机器人操作系统(如 ROS)中,坐标系管理是一个核心概念。混淆它们是导致机器人行为混乱的根源。

  • 核心坐标系变换链 (Transform Chain)

    • mapodombase_link
    • base_link:机器人的本体坐标系。所有传感器数据都以它为参考,所有运动指令都最终转换到这个坐标系下执行。
    • odom:里程计坐标系。由前端(VIO)高频输出,保证轨迹的短期平滑性和连续性。它的原点通常是机器人启动时的位置。odom 坐标系会随着时间漂移,但绝不会发生跳变。这对于需要平滑速度和加速度反馈的运动控制器至关重要。
    • map:全局地图坐标系。由后端维护,是全局一致的参考系。当后端进行了回环优化或重定位后,mapodom 这个变换会发生一次非连续的跳变,以修正 odom 坐标系的历史累积误差。所有长期目标点、语义标签都必须定义在 map 坐系下。
  • 地图的表示与管理

    • 占据栅格地图 (Occupancy Grid Map):将 2D 或 3D 空间划分为均匀的栅格,每个栅格存储其被障碍物占据的概率。是路径规划最常用的地图形式。
    • 点云地图 (Point Cloud Map):直接由大量三维点构成,能够精细地表示环境的几何细节。适用于可视化、精细操作和 3D 目标识别。
    • 截断符号距离场 (TSDF):常用于三维重建,每个体素存储到最近表面的距离(带符号)。可以方便地提取高质量的三角网格模型(Mesh)。
    • 多层地图管理:一个强大的系统会分层管理地图,例如,一个基本不变的“建筑结构层”,一个可能会变化的“大型家具层”,以及一个高度动态的“杂物层”。这使得地图更新更加高效和有针对性。

Rule-of-Thumb: 务必在你的系统中实现一个健壮的 TF(坐标变换)系统。可视化各个坐标系之间的关系是调试定位问题的最有效手段。一个简单的测试:手动推着机器人走一个大圈回到起点,观察 odom 坐标系下的轨迹是否漂移,而 map 坐标系下的轨迹在回环后是否能闭合。


6.4 动态场景下的鲁棒定位

真实世界是动态的。行人、宠物、开关的门、移动的椅子,都是对传统 SLAM 静态世界假设的严峻挑战。

  • 策略分类
    1. 基于异常值剔除的鲁棒方法:这类方法假设动态物体是少数,在优化问题中将其视为异常值(outliers)。例如,在后端优化时使用鲁棒核函数(Robust Kernels),如 Huber 或 Cauchy M-estimators,它们会自动降低大残差项(很可能由动态物体引起)在总成本函数中的权重。
    2. 显式检测与剔除:这是更主动的策略。在前端,利用现代深度学习模型进行实时语义分割或目标检测。将识别出的、具有高动态可能性的类别(如 person, car)对应的特征点或像素在匹配前直接屏蔽掉(Masking)
      • 优点:直接、有效。
      • 缺点:依赖于模型的准确性和实时性,且模型的类别定义可能不完备(例如,一个滚动的球)。
    3. 多目标跟踪与场景流估计:这是最复杂也最全面的方法。不仅仅是剔除动态物体,而是主动地去检测和跟踪它们(DATMO, Detection and Tracking of Moving Objects)。通过估计每个像素或点的三维运动向量(场景流,Scene Flow),系统可以区分出自身运动和场景中物体的独立运动。这不仅能提升定位鲁棒性,还能为预测和交互提供重要的环境动态信息。

Rule-of-Thumb: "先剔除,再定位"。在资源允许的情况下,集成一个轻量级的实时语义分割网络(如 Fast-SCNN)来屏蔽常见动态物体,是提升 SLAM 在人居环境中鲁棒性的性价比最高的投资。不要等到后端才去处理动态问题,那时的代价会大得多。


6.5 语义地图与可交互对象建模

一个只会定位的机器人是“盲”的,它不知道空间中物体的意义。语义地图为几何空间赋予了意义,是连接语言和物理世界的关键桥梁。

  • 从几何到语义: 语义地图是在几何地图层之上构建的一个或多个信息层。它将“一堆在 (x,y,z) 的点”升级为“一个位于客厅中央、ID为sofa_01的沙发”。

  • 构建与表示

    • 在线构建:在 SLAM 运行时,同步运行一个 3D 目标检测或实例分割模型(如基于点云的 VoteNet 或基于多视图融合的模型)。将检测到的物体(类别、3D 边界框)与其在几何地图中的对应实体进行关联。
    • 数据结构:语义地图通常被组织成一个场景图 (Scene Graph)。节点代表物体(如 sofa, table)或空间区域(living_room),边代表它们之间的关系(如 on(cup, table), in(table, living_room))。
  • 可交互对象的精细建模: 对于一个需要与环境交互的机器人,对象模型需要更加丰富:

Object: coffee_table_01

- uuid: string (globally unique id)
- label: string ("coffee_table")
- pose: SE(3) (position and orientation in 'map' frame)
- bounding_box: 3D (dimensions)
- affordances: list [
    "placeable_surface",  // 可放置物品的表面
    "pushable"            // 可推动
  ]

- relationships: list [
    (on, cup_03),
    (near, sofa_01)
  ]

- last_seen: timestamp
这个模型让系统能够理解“把桌上的杯子拿过来”这样的指令。系统首先查询语义地图,找到所有 `label` 为“桌子”的实例,然后通过用户上下文(如视线、距离)确定具体是哪个桌子,再在其关系中找到 `on` 在上面的“杯子”实例,最后规划抓取和放置动作。

Rule-of-Thumb: 将语义地图的设计视为一数据库设计问题。考虑其 Schema、索引和查询效率。一个常见的错误是只存储标签,而忽略了物体间的拓扑关系和功能属性(affordances),这会极大限制上层应用的智能程度。


6.6 置信度与定位不确定性表达

专业的机器人系统从不假设其状态估计是完美的。相反,它会持续地量化和传播不确定性。

  • 表达方式:协方差矩阵 Σ: 机器人的 6-DoF 位姿 x = [px, py, pz, roll, pitch, yaw] 的不确定性通常用一个 6x6 的协方差矩阵 Σ 来表示。

    • 对角线元素 Σ(i, i):表示第 i 个状态分量的方差。值越大,该方向上的不确定性越高。
    • 非对角线元素 Σ(i, j):表示第 i 和第 j 个状态分量之间的相关性。
    • 可视化:在 2D 空间中,位置的不确定性可以被可视化为一个置信椭圆
  Y
  ^
  |
  |          /-----\
  |         | Robot | ----> High uncertainty along X-axis
  |          \-----/        (e.g., in a long corridor)
  |
  +---------------------> X
  • 不确定性的应用
    1. 主动感知 (Active SLAM):机器人可以规划一条路径,其目标是最大化信息增益,即最小化未来的定位不确定性。例如,如果机器人在一条长廊中,它可能会选择去观察墙上的一幅画,以获得在走廊方向上的强约束。
    2. 风险感知的路径规划:在定位不确定性高(协方差椭圆大)的区域,路径规划器应该自动增加与障碍物的安全距离,甚至降低行驶速度。
    3. 任务执行的先决条件:对于需要高精度定位的任务(如机械臂插充电桩),系统必须检查当前的定位协方差。如果大于预设阈值,任务将被拒绝执行,并优先触发一个“精定位”子程序(如原地旋转扫描)。
    4. 引导澄清式对话:当系统不确定它是否用户指令所指的位置时(例如,指令是“去厨房”,但系统定位协方差显示它可能在厨房门口也可能在餐厅),它可以生成对话:“我正在去厨房的路上,马上就到。”或者更谨慎地:“确认一下,您是指有岛台的那个厨房吗?”

Rule-of-Thumb: 将定位协方差矩阵的行列式或最大特征值作为一个核心的系统健康度指标,并将其流式传输到所有上层决策模块。建立明确的规则:当不确定性超过 T1 时黄灯警告(行为更保守),超过 T2 时红灯报警(停止高风险任务,请求帮助)。这是一种简单而极其有效的“防御性设计”。


本章小结

本章深入剖析了具身智能体的空间感知核心,从传感器物理到全局优化,再到语义理解和不确定性管理。

  • 核心原理:鲁棒的定位来自于多传感器(轮速计、IMU、相机)的紧耦合融合,以及 SLAM 框架中前端(实时里程)、后端(全局优化)和回环检测(大尺度纠错)的协同工作。
  • 关键抽象mapodombase_link 构成的坐标系变换链是理解机器人运动和状态的关键。map 追求全局一致性,允许跳变;odom 追求局部平滑性,不允许跳变。
  • 现实挑战:在动态环境下的鲁棒性是工程实践的重中之重。采用鲁棒核函数基于深度学习的动态物体屏蔽是当前最有效的策略。
  • 智能的飞跃语义地图/场景图将纯粹的几何空间转化为可被语言理解和交互的对象与关系网络,是实现高级指令接地的基础。
  • 工程智慧:系统必须时刻量化和利用不确定性(通过协方差矩阵 Σ)。不确定性不是敌人,而是指导系统进行主动感知、安全规划和智能对话的重要依据。

常见陷阱与错误 (Gotchas)

  1. 标定漂移与忽视:传感器内外参不是一次标定就一劳永逸。机械振动、热胀冷缩都可能导致其发生微小变化,日积月累,严重影响 VIO 性能。调试技巧:建立定期的自动校准流程。在系统日志中监控关键指标(如重投影误差),当指标长期恶化时,发出重新标定的警报。

  2. 时间戳的“地狱”:在复杂的分布式系统中(如通过网络传输图像),确保所有数据源的时间戳在同一个时钟域下且精度足够高,是一项巨大的挑战。几十毫秒的误差就足以摧毁一个紧耦合 VIO 系统。调试技巧:尽可能使用硬件时间戳同步(如 PTP 协议)。如果没有,则必须在软件层面实现精确的时钟偏移和延迟估计。用工具(如 rqt_plot)可视化不同数据流的时间戳,检查对齐情况。

  3. 对称与重复环境的噩梦:在充满重复纹理的环境(如酒店长廊、大型仓库),基于外观的回环检测极易产生错误的匹配,导致地图被严重破坏。调试技:提高几何验证的阈值。融合其他传感器(如 Wi-Fi 或 UWB 信号强度)作为回环的额外证据。在检测到潜在错误回环时,不立即接受,而是进入一个“观察期”,等待更多证据。

  4. 地图的“幽灵”与“固化”:在动态环境中,短暂出现的物体(如走过的人)可能会在栅格地图上留下“幽灵”般的痕迹。反之,一个被移走的家具可能会永久地“固化”在地图上,成为一个虚拟障碍物。调试技巧:使用概率衰减机制更新占据栅格地图。对于观测到的 free space,要果断地降低其被占据的概率。对于长期未被观测到的区域,应降低其置信度。

  5. 重定位的“阈值”难题:重定位成功与否的判断标准很难设定。阈值太松,会导致错误的重定位;阈值太紧,则机器人可能在能找回位置的地方也宣告失败。调试技巧:不要只依赖一个分数。采用多指标决策,例如,配的内点(inliers)数量、重投影误差的分布、以及重定位后姿态的连续性。允许系统进入一个“候选重定位”状态,在该状态下低速移动以收集更多证据来确认或否决该次重定位。

  6. 初始化依赖与脆弱性:许多 VIO/SLAM 系统需要一个特定的初始化过程(如缓慢平移)来完成尺度估计和特征点三角化。在实际使用中,用户可能一开机就拿起机器人快速移动,导致初始化失败。调试技巧:设计一个明确引导用户的初始化流程,并通过语音或界面给出反馈(“请将我平稳地向前移动一点”)。开发能够从更剧烈运动中恢复或完成初始化的算法。