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

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_threshold 与 depth_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