返回专辑
·Johan·4 分钟阅读

双目与 RGB-D SLAM:尺度来源与失效边界

从视差深度公式出发分析双目基线与 RGB-D 噪声模型,讨论标定、红外干扰与室外强光下的传感器选型与 VIO 融合策略。

双目与 RGB-D SLAM:尺度来源与失效边界

1. 「有深度」不等于「深度可靠」

单目 SLAM 的尺度漂移刻在基因里——除非加 IMU 或已知尺寸物体,否则地图可整体缩放。双目与 RGB-D 的核心价值是米制尺度可观。但户外 RealSense 阳光直射下深度大面积空洞;工厂 IR 结构光与环境光打架,Z 值跳变 30 cm。深度图「看起来有颜色」不代表 SLAM 能用——我会画 depth valid ratio 的 time series,比看 RViz 点云 honest。

2. 双目:视差给深度

针孔模型下,左目像素 与视差

焦距(像素), 基线(米)。深度误差:

关键推论:基线 越大,同样 下深度越准,但最小可测距离也增大;远距离误差二次增长——10 m 处 是 5 m 处的 4 倍;小视差(远距、窄基线)→ 深度爆炸。ORB-SLAM2 Stereo 用双目匹配 + BA 联合优化,比「先算深度再 SLAM」更鲁棒——BA 可修正匹配误差。

3. 双目标定:不能跳过

需要精确内参 、畸变、外参(左右目相对位姿)。外参错 0.5° → 远距深度系统偏差;时间不同步 → 运动物体深度错;只用 factory 标定 → 安装后机械应力改变外参。Kalibr / OpenCV stereoCalibrate,重投影 RMSE < 0.5 px。标定后 rectification,极线对齐后匹配才能用 SGBM/BM。

4. RGB-D:主动深度的失效边界

结构光(D400 系)或 ToF 直接输出深度。弱纹理也有深度;但:

问题表现
室外阳光IR 被淹没,深度大面积无效
透明/反光玻璃、金属返回错误深度
边缘飞点深度不连续处 Z 跳变
距离衰减>4–10 m 噪声急剧增大

ORB-SLAM2 RGB-D、RTAB-Map 把深度 unproject 成 3D 点或伪激光,配合 RGB 特征。深度噪声应进入信息矩阵——不是所有深度点同等权重。D435 室内 4 m 尚可,超过 6 m 噪声急剧上升——若 SLAM 把远距深度当硬约束,走廊尽头会鼓包。设 max_depth 截断,信息矩阵按距离加权。

RGB 与 depth 差 30 ms,快速侧移时对齐像素错行,点云在物体边缘「拉丝」。align_depth_to_color 应在驱动层做;SLAM 节点里再 align 往往已带着错几何。

5. 与 VIO 融合与选型

即使有双目/RGB-D,IMU 仍有价值:帧间预测给匹配好初值;短时遮挡 IMU 维持 pose;动态物体检测异常。VIO 初始化时,双目/RGB-D 提供尺度,IMU 提供重力方向——比纯单目 VIO 简单。但 cam-IMU 外参和时间偏移仍是瓶颈。

场景倾向
室内仓库RGB-D 或短基线双目
户外远距宽基线双目或激光
高速运动双目 + IMU,全局快门
玻璃/金属多避免 RGB-D,用激光

6. 深度进 BA 的权重契约

RGB-D SLAM 常把深度 unproject 成 3D 观测,残差权重应随距离与入射角变化。近距 小、远距大——统一权重会让远距噪声主导优化,地图在走廊尽头鼓包或收缩。ORB-SLAM2 RGB-D 模式对无效深度(0 或 NaN)有 mask;部署时设 depth_thresholddepth_scale_factor 必须与驱动一致,RealSense 默认 mm 单位若当 m 用,尺度直接错 1000 倍。

双目 stereo matching 在弱纹理区域视差不可靠,BA 应依赖多帧三角化而非单帧 SGBM 硬深度。我会监控「由 stereo 直接初始化 vs 由多帧三角化」的地图点比例——前者过高说明匹配质量存疑。

7. 硬件验收先于算法

部署前用 lux meter + 正午户外录 5 min bag,看 depth valid ratio,比 datasheet range 诚实。结构光与阳光竞争 IR band;户外往往只剩 RGB 可用,此时应切 VIO 或激光,而不是硬跑 RGB-D SLAM。

8. 验收

  • 有效深度像素比例(每帧)
  • 深度标准差 vs 距离曲线
  • 双目匹配失败率 / 无效视差比例
  • 三角化/map point 平均视差角
  • 与激光 ground truth 的深度 RMSE(标定场景)
  • 正午户外 5 min bag 的 depth valid ratio
  • depth_scale_factor 与驱动单位一致性

双目/RGB-D 把尺度从 Sim(3) 拉到 SE(3),但失效边界比单目更隐蔽——深度「有值」与深度「可信」是两回事。SLAM 后端只该吃后者。

← 全部文章

johan's blog