第 4 章 — 传感输入与多摄算法(不谈硬件)
开篇段落
本章是连接物理世界与算法模型的桥梁,其质量直接决定了整个导航系统的天花板。我们将纯粹从算法视角,深入探讨如何处理与融合来自多个传感器的原始数据流,尤其是复杂的、非理想的多摄像头系统。学习本章后,您将不仅理解理论模型,更能掌握在实践中如何将分散、带有噪声、时序偏差和几何形变的原始传感信号,转化为下游模块(如 SLAM、OCC、VLA)所需的,经过时空对齐且几何关系明确的、干净且带有不确定性量化的观测数据。我们将不讨论任何硬件选型或驱动实现,而专注于解决传感数据在法层面的核心挑战:精密的观测建模、亚毫秒级的时空同步、鲁棒的在线内外参标定以及一致性的多视角信息融合。
4.1 单/双/多摄像头观测模型与基线误差
一切视觉算法始于对成像过程的精确数学建模。这不仅是几何投影,还包括了光学系统带来的非线性畸变。
单目相机(Monocular Camera)的完整模型
针孔相机模型是理想化的第一步。一个在世界坐标系下的三维点 $P_w = [X_w, Y_w, Z_w]^T$ 到像素 $p = [u, v]^T$ 的投影,是一个多步过程:
-
世界坐标系 → 相机坐标系:通过外参 $T_{c \leftarrow w} = [R | t]$ 变换,得到点在相机坐标系下的坐标 $P_c = [X_c, Y_c, Z_c]^T$。
\(\begin{bmatrix} X_c \\ Y_c \\ Z_c \end{bmatrix} = R \begin{bmatrix} X_w \\ Y_w \\ Z_w \end{bmatrix} + t\)
-
相机坐标系 → 归一化平面:将点投影到焦距为1的虚拟平面上,得到归一化坐标 $p’ = [x’, y’]^T$
\(x' = X_c / Z_c, \quad y' = Y_c / Z_c\)
-
畸变模型:真实镜头存在畸变,必须对归一化坐标进行校正。最常用的是 Brown-Conrady 模型,包含径向畸变和切向畸变。
令 $r^2 = x’^2 + y’^2$,畸变后的坐标 $p’’ = [x’’, y’’]^T$ 为:
\(x'' = x'(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + 2p_1 x'y' + p_2(r^2 + 2x'^2)
y'' = y'(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + p_1(r^2 + 2y'^2) + 2p_2 x'y'\)
其中 $k_1, k_2, k_3$ 是径向畸变系数,$p_1, p_2$ 是切向畸变系数。
-
归一化平面 → 像素平面:最后,通过内参矩阵 $K$ 变换到最终的像素坐标 $(u, v)$。
\(K = \begin{bmatrix} f_x & s & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}\)
\(u = f_x x'' + s y'' + c_x
v = f_y y'' + c_y\)
$s$ 是坐标轴倾斜因子,现代相机中通常为 0。
核心困境:从最终的 $(u, v)$ 反推 $P_w$ 时,由于 $Z_c$ 在步骤2中被除掉,导致尺度信息丢失。这是单目视觉的“尺度模糊性”根源。
双目相机(Stereo Camera)的深度误差精析
双目系统通过三角化来恢复深度。假设左右相机已经过立体校正(共面且光轴平行),则视差 $d = u_l - u_r$ 与深度的关系为 $Z = (f_x \cdot b) / d$。
深度误差的来源与量化:
深度的不确定性 $\sigma_Z$ 主要来源于视差测量的误差 $\sigma_d$。$\sigma_d$ 通常与像素量化和匹配算法的亚像素精度有关,可近似为一个常数(如 0.2 像素)。通过误差传播定律,我们得到:
\[\sigma_Z \approx \left| \frac{\partial Z}{\partial d} \right| \sigma_d = \left| -\frac{f_x \cdot b}{d^2} \right| \sigma_d = \frac{Z^2}{f_x \cdot b} \sigma_d\]
Rule-of-thumb:
- 量化感知:对于一个焦距 $f_x = 600$ 像素,基线 $b = 0.15m$ 的双目系统,在 $Z=1m$ 处,深度误差约为 $1^2 / (600 * 0.15) * 0.2 \approx 0.0022m$ (2.2mm)。但在 $Z=10m$ 处,误差变为 $10^2 / (600 * 0.15) * 0.2 \approx 0.22m$ (22cm)。这个二次方增长是致命的。
- 设计权衡:宽基线 $b$ 增大了远距离精度,但也增大了左右视图的差异,使得特征匹配变得困难(称为“失匹配”),同时扩大了相机前方的共同视野盲区。人形机器人的设计必须在头部尺寸、视野覆盖和导航精度需求之间做出精细权衡。
多摄像头系统的拓扑构型
人形机器人的多摄系统通常是混合构型,服务于不同目的:
- 前视立体对 (Forward-facing Stereo Pair): 高精度深度感知,用于精细避障和操作。
- 环视相机 (Surround-view Cameras): 2-4个广角相机分布在头部四周,提供 360° 水平视场,用于全局定位、态势感知和检测来自侧后方的动态障碍物。它们的视场通常只有少量重叠。
- 斜视相机 (Oblique Cameras): 可能有朝向地面或天花板的相机,用于检测地面障碍物(如台阶)、辅助定位(利用天花板特征)或读取高处信息。
4.2 时间同步与漂移建模(算法层)
精确的时间戳是多传感器融合的“通用语言”。任何时间上的不确定性都会转化为空间上的不确定性,尤其是在机器人高速运动时。
\[ascii
真实事件: ----------------|----------------> Time
(Robot at Pos X)
相机流: -----[Frame @ t1]-------------> (Processing)
IMU流: -[IMU @ t_a]--[IMU @ t_b]-----> (Processing)
问题: t1, t_a, t_b 均带有各自的延迟和漂移.
我们需要精确知道 Frame 曝光中点的真实时刻,
并找到该时刻对应的 IMU 状态。\]
时钟漂移的物理模型:
传感器的时钟由石英晶体振荡器驱动。其频率会受温度、电压和老化的影响,导致与主时钟(如 CPU 的 $CLOCK_MONOTONIC$)之间存在一个微小但持续变化的频率差异。一阶线性模型 $t_{master} = \alpha_i \cdot t_{sensor_i} + \beta_i$ 是对这种行为的良好近似:
- $\beta_i$ (Offset): 系统启动时固有的固定时间差。
- $\alpha_i$ (Skew/Drift): 两个时钟“走”的速度不一样。$\alpha_i > 1$ 表示传感器时钟比主时钟慢。
在线估计算法:
- 滑动窗口最小二乘 (Sliding-window Least Squares): 在一个几秒到几十秒的窗口内,缓存到达的时间戳对 $(t_{sensor_i, k}, t_{master, k})$。当窗口填满或更新时,重新对窗口内的数据点进行线性回归,得到最新的 $(\alpha_i, \beta_i)$。这是一种简单有效的方法。
- 卡尔曼滤波器 (Kalman Filter): 可以将 $\alpha_i$ 和 $\beta_i$ 建模为状态变量。状态转移模型可以假设它们是随机游走的。每次收到新的时间戳对,就作为一次“测量”来更新状态估计。这种方法能更平滑地跟踪时变漂移。
致命影响与调试:
- VIO/SLAM: $1ms$ 的时间误差,对于一个以 $1m/s$ 速度和 $1rad/s$ 角速度运动的机器人,会引入 $1mm$ 的位置误差和 $1mrad$ 的姿态误差。这种误差是系统性的,会在积分过程中迅速累积,导致轨迹估计严重漂移甚至发散。
- 3D 重建: 如果多相机的曝光时间不同步,对动态场景进行三维重建会出现“重影”或“撕裂”现象。
- 调试技巧: 可视化是关键。将不同传感器的数据点按照其校正后的时间戳画在同一条时间轴上。如果同步正确,IMU 的高频数据应该均匀地分布在低频的相机帧之间。
4.3 外参/内参标定的算法问题
标定是从像素世界通往三维世界的唯一通行证。错误的标定参数是“万恶之源”,会导致后续所有算法从基础上就出现偏差。
内参标定 (Intrinsic Calibration) 的细节
除了张正友方法,更现代的 SLAM 系统(如 ORB-SLAM3)支持在线或自标定。但离线标定仍然是初始化阶段最可靠的方式。
- 优化目标: 标定的核心是最小化重投影误差 (Reprojection Error)。即,将标定板上的三维角点,根据当前的内外参估计,重新投影回图像上,计算投影点与实际检测到的角点之间的像素距离,并最小化所有点、所有图像的误差平方和。
\(\min_{K, D, \{R_i, t_i\}} \sum_{i} \sum_{j} || p_{ij} - \pi(K, D, R_i, t_i, P_j) ||^2\)
$\pi(.)$ 代表从 3D 点 $P_j$ 到像素 $p_{ij}$ 的完整投影过程。这是一个非线性优化问题,通常使用 Levenberg-Marquardt (LM) 算法求解。
外参标定 (Extrinsic Calibration) 的黄金标准
- 相机-相机外参:
- 基于标定物: 这是最精确的方法。对于有重叠视场的相机,可以通过联合优化(Bundle Adjustment)来同时精化所有相机的内外参、外参以及标定物的 3D 结构。工具如 Kalibr 在学术界和工业界被广泛使用。
- 基于运动 (Motion-based): 对于无重叠视场的相机,让机器人执行一段含丰富旋转和平移的轨迹。每个相机独立运行 VIO/SLAM 得到各自的轨迹 $T_{cam1,k}$ 和 $T_{cam2,k}$。外参 $T_{cam1 \to cam2}$ 的求解,就变成了对齐这两条轨迹的问题。
- 手眼标定 (Hand-Eye Calibration):$AX=XB$
- 问题拆解:
- $A_k = T_{body,k-1}^{-1} T_{body,k}$: 机器人基座在两次运动之间的相对变换,由里程计或运动学模型提供。
- $B_k = T_{cam,k-1}^{-1} T_{cam,k}$: 相机在两次运动之间的相对变换,由视觉里程计或对外部静态目标的观测提供。
- $X = T_{body \to cam}$: 待求的相机到机器人基座的变换。
- 求解条件: 为了让 $AX=XB$ 有唯一解,运动 $A_k$ 必须包含至少两个不同旋转轴的旋转。纯平移运动无法约束旋转部分。
- 鲁棒性: 实际应用中,$A$ 和 $B$ 都带有噪声。因此不能只用两次运动求解,而是采集数十次运动数据,构成一个超定方程组,通过线性优化求解 $X$,同时最小化所有运动的残差。
Rule-of-thumb:
- 标定结果的协方差: 好的标定工具会输出参数的协方差矩阵。这个矩阵的对角线元素告诉你每个参数的不确定性。如果某个平移或旋转分量的不确定性非常大,说明你的标定运动没有很好地激励这个自由度,标定结果不可靠。
- 在线监控: 系统运行中,可以通过检查多相机重叠区域特征点的重投影误差,或比较视觉里程计与轮式里程计的一致性,来持续监控外参是否发生偏移。一旦误差超过阈值,应触发告警或请求重新标定。
4.4 多摄时空融合
融合的目标是 $1+1>2$,通过整合多个有噪声、有遮挡的局部视图,生成一个更完整、更精确、更鲁棒的全局感知。
1. 特征级融合 (Tightly-coupled)
- 核心: 将多视图的特征匹配直接作为 SLAM 或 VIO 优化框架的一部分。
- 方法: 在后端优化的因子图中,一个 3D 路标点可以连接来自多个相机的观测因子。每个因子都基于该相机的内外参和位姿,计算重投影误差。这种方式能最大化利用几何约束,得到最精确的状态估计。
- 代价: 算法复杂度高,系统耦合紧密,实现难度大。
2. 体素级融合 (Intermediate Fusion)
这是构建环境三维表示(如 OCC)的主流方法。
- 贝叶斯更新与 Log-Odds: 对于每个体素 $v$,我们维护其被占据的对数几率 $L(v) = \log \frac{P(v=\text{occupied})}{P(v=\text{free})}$。
- 初始时,所有体素 $L(v) = 0$ (概率为 0.5,完全不确定)。
- 当一个深度传感器射线穿过体素 $v$ 并击中后面的物体时,$v$ 是空闲的。我们用 $L_{free}$ 更新 $L(v) \leftarrow L(v) + L_{free}$。$L_{free}$ 是一个负值,代表空闲的对数几率。
- 当射线终结于体素 $v$ 时,$v$ 是被占据的。我们用 $L_{occ}$ 更新 $L(v) \leftarrow L(v) + L_{occ}$。$L_{occ}$ 是一个正值。
- 这种加法形式的更新在计算上极其高效,并且天然地处理了观测冲突(正负更新会相互抵消)。
- TSDF (Truncated Signed Distance Function): 对于表面重建任务,TSDF 更优。它存储每个体素到最近表面的有符号距离,并通过加权平均融合新的距离测量。
3. 决策级融合 (Loosely-coupled)
- 方法: 每个相机或相机组独立运行自己的感知算法(如 2D 物体检测),然后将结果(如 2D Bounding Box)通过相机模型反投影为 3D 空间中的一个视锥或射线,最后在 3D 空间中对这些结果进行聚类或关联。
- 优点: 模块化、易于实现和并行。
- 缺点: 在融合前丢失了大量底层信息。例如,一个在相机A中被部分遮挡的物体可能无法被检测出来,从而失去了与相机B中的清晰观测进行融合的机会。
异常视角剔除的实践:
- 运动模糊检测: 对图像进拉普拉斯变换,计算方差。方差过低表明图像模糊,其提供的特征或深度信息不可靠。
- 曝光异常检测: 检查图像的直方图。如果像素值集中在极亮或极暗区域,说明过曝或欠曝,应降低其在融合中的权重。
- 几何一致性 (RANSAC): 当融合多个点云时,可以随机从一个点云中采样一小组点,然后在其他点云中寻找它们的对应点,计算一个变换。反复此过程,得票最多的变换被认为是正确的,未能被此变换解释的点云被视为“局外人”并剔除。
4.5 IMU/里程计/ToF/深度的算法级融合接口
为异构传感器设计干净的算法接口,是构建可维护、可扩展导航系统的关键。
- IMU - 预积分接口 (Pre-integration Interface)
- 动机: 在 VIO 的后端优化中,每次机器人位姿更新,都需要重新积分 $t_i$ 到 $t_j$ 之间的所有 IMU 测量。这非常耗时。
- 预积分理论: 关思想是将积分从世界系转换到 $t_i$ 时刻的局部坐标系。
\(\Delta R_{ij} = \prod_{k=i}^{j-1} \text{Exp}((\omega_k - b_{g,i})\Delta t)
\Delta v_{ij} = \sum_{k=i}^{j-1} \Delta R_{ik} (a_k - b_{a,i})\Delta t
\Delta p_{ij} = \sum_{k=i}^{j-1} (\Delta v_{ik}\Delta t + \frac{1}{2}\Delta R_{ik}(a_k-b_{a,i})\Delta t^2)\)
这些 $\Delta$ 量只依赖于 IMU 测量值和 $t_i$ 时刻的偏置 $b_{g,i}, b_{a,i}$。当 $t_i$ 时刻的位姿或偏置在优化中更新时,我们不需要重新积分,只需用一阶近似来修正预积分量,计算量极小。
- 接口: $get_preintegration(t_start, t_end)$ 返回一个包含 $(\Delta R, \Delta v, \Delta p)$ 和其协方差矩阵的对象。
- 里程计 - 带协方差的位姿增量接口 (Odometry Delta with Covariance)
- 接口: $get_delta_pose(t_start, t_end)$ 返回 $(T_{start \to end}, Cov)$。
- 协方差是灵魂: 一个简单的里程计可能报告 $\Delta x = 1m$。但这个 $1m$ 有多可信?协方差矩阵 $Cov$ 回答了这个问题。对于轮式里程计,前进方向的不确定性远小于侧滑方向,这会在协方差矩阵中体现出来。融合算法(如 EKF 或因子图)会利用这个信息,对置信度高的方向给予更高权重。
- 深度传感器 - 带噪声模型的注册深度图 (Registered Depth with Noise Model)
- 接口: $get_registered_depth(t, camera_id)$ 返回 $(DepthImage, NoiseModel)$。
- 噪声模型: 必须提供一个函数或查找表,描述深度测量标准差 $\sigma_z$ 与深度值 $z$ 的关系。例如,对于 ToF 传感器,$\sigma_z$ 可能是一个常数;对于双目,$\sigma_z \propto z^2$。下游的融合算法(如 TSDF fusion)会使用这个模型来对不同深度的测量值进行加权平均。
本章小结
本章从算法工程师的视角,系统性地梳理了处理多传感器输入的完整流程和核心挑战。
- 精密建模: 我们从包含畸变的完整相机模型出发,精确分析了双目深度的二次误差增长,并认识到多摄系统的拓扑构型服务于不同的算法目标。
- 时空圣杯: 时间同步是融合的基石。我们讨论了基于在线线性模型估计的时钟漂移补偿方法,并强调了亚毫秒级同步对 VIO 等系统的生死攸关性。
- 标定即真理: 内参、外参、手眼标定是所有三维感知的起点。其核心是最小化重投影误差的非线性优化,而标定结果的协方差矩阵是衡量其可靠性的关键。
- 融合的艺术: 多摄信息的融合可以在特征、体素、决策等不同层面进行。体素层面的贝叶斯对数几率更新是构建全局三维表示的高效方法。
- 接口定义一切: 为 IMU、里程计、深度等传感器设计标准化的、带有不确定性信息的算法接口(如预积分、带协方差的位姿增量),是构建复杂而鲁棒导航系统的工程基石。
常见陷阱与错误 (Gotchas)
- 坐标系混淆 (The Root of All Evil): 这个问题无论怎么强调都不过分。
- 调试技巧: 使用可视化工具(如 RViz, Foxglove)并显式地画出每一个坐标系。当机器人移动时,观察 $base_link$, $camera_link$, $camera_optical_frame$, $odom$, $map$ 等坐标系的相对运动是否符合预期。编写单元测试,对一个已知点在不同坐标系间反复变换,看其是否能回到原点。
- 时间戳的“最后一英里”问题: 即使用了 NTP 或 PTP,从数据包在网卡被盖上时间戳,到进入应用层被算法消费,中间仍有 OS 调度、缓冲区等延迟。对于硬实时要求,应考虑 RTOS 或 DPDK 等技术,但这已超出本章范围。算法层面,要意识到应用层时间戳总有抖动。
- 标定的“完美主义”陷阱: 过度拟合标定数据。例如,使用一个非常高阶的多项式去拟合畸变,可能会在标定图像上得到极低的投影误差,但在真实场景中泛化能力很差。应使用交叉验证来选择合适的畸变模型。
- 忽略传感器的物理限制:
- 卷帘快门 (Rolling Shutter): 大多数消费级相机的快门是逐行曝光的。在快速旋转时,这会导致图像扭曲(“果冻效应”)。VIO 算法必须对此进行建模和补偿,否则会引入系统误差。
- IMU 的温漂: IMU 的偏置对温度极其敏感。在机器人刚开机和运行一小时后,偏置可能有巨大差异。在线估计偏置是所有现代 VIO 系统的标配。
- 深度相机的材质依赖: ToF 和结构光对黑色吸光材质、透明材质和高反光材质基本无效。算法必须能处理深度图中的空洞和野点,而不是盲目相信其输出。
- 盲目相信默认参数: 无论是标定工具箱里的优化参数,还是 VIO 库里的噪声参数,都必须根据你的具体传感器和场景进行调整。例如,一个在室内低速移动机器人和一个在室外高速运动的机器人,其 IMU 噪声和运动模型参数应有显著不同。