1. 双目视觉进入SLAM的切入点与整体设计思路
双目相机在SLAM和三维建图里,最直接的吸引力就两个字:尺度。单目SLAM跑起来,轨迹和地图都挺像那么回事,但整个地图可以任意缩放——你没法判断眼前那个盒子是鞋盒还是集装箱。双目通过左右目视差,把深度直接算出来,尺度就锁死了。这个特性让双目在机器人导航、无人机避障、手持扫描等场景里,比单目省心太多。
我最早接触双目SLAM是做室内移动机器人建图,当时用单目跑ORB-SLAM,地图尺度飘得厉害,机器人按规划路径走,实际位移和地图位移对不上,导航直接崩。换成双目后,尺度问题基本消失,建图精度也上了一个台阶。所以这篇文章,我想把双目在SLAM和三维建图里的核心问题拆开讲:尺度怎么来的、精度受什么影响、双目和IMU或激光怎么融合。适合正在选传感器方案、调SLAM参数、或者想从单目转双目的朋友参考。
整体设计上,双目SLAM系统可以分成四块:标定与校正、视差与深度计算、视觉里程计与后端优化、地图构建与融合。这四块环环相扣,标定不准,后面全白搭;视差算不好,深度就是噪声;后端优化不到位,轨迹和地图会漂;融合策略选错,多传感器反而互相拖累。下面我按这个顺序,把每个环节的关键细节和实操经验展开。
1.1 为什么选双目而不是单目或RGB-D
单目SLAM的尺度问题前面说了,本质上是单张图像丢失了绝对深度信息,只能靠运动恢复结构,尺度不可观。RGB-D相机(比如结构光或ToF)能直接给深度,但室外强光下基本废掉,测量距离也有限,通常5米以内。双目则不同,它靠视差算深度,室内外都能用,作用距离取决于基线和分辨率,几米到几十米都可以覆盖。
双目还有一个隐藏优势:左右目图像本身可以做特征匹配的交叉验证。单目里一个误匹配可能就带偏位姿,双目里左目特征在右目有对应极线约束,误匹配容易被剔除。这个特性在纹理重复的场景(比如走廊、货架)里特别有用。
当然双目也有代价:标定更麻烦,计算量更大,弱纹理区域视差算不出来。所以选双目之前,先想清楚场景:如果室内近距离、光照可控,RGB-D可能更省事;如果室外、中远距离、需要绝对尺度,双目是更稳的选择。
1.2 系统框架的模块划分与数据流
一个典型的双目SLAM系统,数据流是这样的:左右目图像同步采集 → 去畸变和立体校正 → 特征提取与匹配 → 视差计算 → 深度恢复 → 视觉里程计估计位姿 → 后端优化(局部BA、回环检测) → 地图点云/栅格/网格构建 → 多传感器融合。
这里面,立体校正是把左右目图像行对齐,让同名点在同一行上,这样视差搜索从二维降到一维,计算量大幅下降。校正靠的是标定得到的内参和外参。视差计算有稀疏和稠密两条路:稀疏法只算特征点视差,快但地图稀疏;稠密法算每个像素视差,慢但能建稠密点云。ORB-SLAM这类特征法SLAM用稀疏视差,而三维建图往往需要稠密视差,所以实际系统里经常两套并行。
后端优化里,双目给BA带来的好处是重投影误差可以直接约束三维点深度,不像单目需要额外处理尺度自由度。回环检测用词袋模型或深度学习特征,检测到回环后做位姿图优化,消除累积漂移。
2. 双目相机标定与视差测量原理的硬核细节
标定是双目系统的地基。我见过太多人拿着出厂参数直接跑,结果深度图歪七扭八,还以为是算法问题。双目标定要拿到四组参数:左目内参、右目内参、左右目之间的旋转和平移(外参)、以及畸变系数。内参决定像素和物理尺寸的映射,外参决定两个相机的位置关系,畸变系数用来去畸变。
2.1 标定流程与关键参数计算
标定通常用棋盘格或圆点标定板,采集20到30对左右目图像,覆盖不同角度和距离。用OpenCV的stereoCalibrate或者MATLAB的Stereo Camera Calibrator都行。标定完成后,重点看两个指标:重投影误差和极线误差。重投影误差一般要小于0.3像素,极线误差要小于0.5像素,否则说明标定质量不够,需要重新采集。
标定完还要做立体校正,用stereoRectify得到校正映射表,再用initUndistortRectifyMap生成映射矩阵。校正后,左右目图像的极线水平对齐,同名点在同一行。你可以用一张有丰富纹理的图,校正后左右目叠加,看边缘是否对齐,对齐了就说明校正没问题。
注意:标定板不要只在一个距离采集,远近都要有,否则外参估计不准。另外,标定时的光照要和实际使用场景接近,避免过曝或过暗导致角点检测失败。
2.2 视差测量原理与深度恢复公式
视差就是同一个三维点在左右目图像上横坐标的差值:d = x_left - x_right。深度公式是:
Z = (f * B) / d其中f是焦距(像素单位),B是基线(米),d是视差(像素)。这个公式说明,深度和视差成反比。视差越小,深度越大,误差也越大。所以双目在远距离精度下降很快,这是物理限制,不是算法能完全弥补的。
举个例子:基线0.1米,焦距500像素,视差10像素时,深度是5米;视差1像素时,深度是50米。如果视差测量有0.5像素误差,5米处深度误差约0.25米,50米处误差约25米。所以双目适合中近距离,远距离要么加大基线,要么融合其他传感器。
视差计算有块匹配(BM)、半全局匹配(SGM)、深度学习视差等方法。BM快但精度一般,SGM精度好但慢,深度学习视差(如PSMNet、RAFT-Stereo)精度高但需要GPU。实际SLAM里,如果只做稀疏特征,视差直接在特征匹配时算;如果做稠密建图,SGM或深度学习更合适。
2.3 标定与视差环节的避坑清单
- 标定板材质要平整,打印后贴在硬板上,不要有翘曲。
- 采集图像时避免运动模糊,快门速度要够快。
- 校正后检查极线对齐,不对齐就重新标定。
- 视差图要做左右一致性检查,剔除遮挡区域的错误视差。
- 深度图边缘会有飞点,建图前做滤波(中值滤波、双边滤波)。
3. 双目SLAM的精度影响因素与调参实战
双目SLAM的精度不是单一因素决定的,标定、特征、视差、优化、融合都会影响。我按影响程度从大到小排:标定质量 > 视差精度 > 特征匹配 > 后端优化 > 融合策略。标定不准,后面全错;视差噪声大,深度就抖;特征匹配错,位姿就跳;后端优化差,轨迹就漂。
3.1 特征提取与匹配的双目约束
双目SLAM里,特征提取通常在左目做,然后在右目沿极线搜索匹配。ORB特征因为速度快、旋转不变性好,是主流选择。匹配时用描述子距离加极线约束,再配合左右一致性检查。如果场景纹理弱,可以降阈值多提特征,但误匹配也会增多,需要RANSAC剔除。
我实测下来,ORB在室内场景够用,但在室外强光或弱纹理(比如白墙、天空)下容易丢。这时候可以换SuperPoint或SIFT,但速度会慢。另一个技巧是把右目特征也提出来,做双向匹配,提高匹配率。
3.2 局部BA与全局优化的参数设置
局部BA优化的是滑动窗口内的位姿和地图点。关键参数有:窗口大小、迭代次数、鲁棒核函数阈值。窗口太大,计算量高;太小,优化不充分。一般窗口设10到20帧,迭代5到10次。鲁棒核函数用Huber或Cauchy,阈值根据重投影误差分布设,通常1到2像素。
全局优化包括回环检测和位姿图优化。回环检测用DBoW2或DBoW3,词典要针对场景训练。检测到回环后,先做相似变换估计,再做位姿图优化。位姿图优化的信息矩阵要根据协方差设,不能全设成单位阵,否则优化结果不靠谱。
提示:调参时先用小数据集快速迭代,别一上来就跑大场景。记录每次参数变化后的ATE(绝对轨迹误差)和RPE(相对位姿误差),用数据说话。
3.3 精度评估与误差来源分析
评估双目SLAM精度,常用ATE和RPE。ATE看全局轨迹误差,RPE看局部相对误差。测试用EuRoC、KITTI、TUM等数据集,有真值对比。实测时如果没有真值,可以用卷尺量几个关键点距离,粗略验证尺度。
误差来源主要有:标定误差、视差噪声、特征误匹配、运动模糊、时间同步误差。时间同步特别容易被忽略,左右目图像如果不同步,运动物体或快速运动时视差会错。硬件触发同步最稳,软件同步要时间戳对齐。
4. 双目与IMU、激光雷达的融合方法
双目单独跑SLAM,在快速运动、弱纹理、光照变化时容易丢。融合IMU或激光雷达能显著提升鲁棒性。融合方法分松耦合和紧耦合。松耦合各自跑,然后融合位姿;紧耦合把双目观测和IMU预积分或激光点云一起优化。
4.1 双目视觉惯性融合的紧耦合方案
VINS-Fusion、ORB-SLAM3都支持双目+IMU紧耦合。IMU预积分提供短时高频位姿,双目提供绝对尺度和低频校正。融合时,IMU的偏置和速度也要估计。关键参数有:IMU频率、双目频率、外参(双目到IMU的旋转平移)、时间偏移。
我调VINS-Fusion时,发现IMU和双目时间偏移对精度影响很大,必须在线估计。另外,IMU噪声参数要按实际器件设,不能照搬默认值。标定IMU和双目外参可以用Kalibr,但标定过程比较繁琐,需要充分激励。
4.2 双目与激光雷达的模态融合策略
双目和激光雷达融合,常见的是激光提供深度和结构,双目提供纹理和颜色。融合可以在数据层、特征层、决策层。数据层融合是点云着色,特征层是联合优化,决策层是各自建图后合并。
实际做三维建图时,我倾向用激光雷达做骨架,双目做稠密纹理。激光点云准但稀疏,双目稠密但噪声大。用激光点云做深度监督,校正双目视差,能得到又准又稠密的地图。融合时要注意外参标定和时间同步,激光和双目频率不同,要做时间对齐。
4.3 融合中的时间同步与外参标定
时间同步是融合的命门。硬件同步用触发信号,软件同步用时间戳插值。外参标定可以用标定板,也可以用运动法。标定完要验证:把激光点云投影到双目图像上,看边缘是否对齐。不对齐就重新标定。
注意:融合不是越多越好,传感器多了,标定和同步的复杂度指数上升。先跑通双目,再逐步加IMU和激光,别一上来就全上。
5. 三维建图与常见问题排查实录
双目三维建图,输出可以是稀疏点云、稠密点云、栅格地图、网格模型。稀疏点云用于定位,稠密点云用于展示和测量,栅格用于导航,网格用于渲染。建图时要注意尺度一致性、地图更新、内存管理。
5.1 稠密点云构建与滤波处理
稠密点云靠稠密视差。SGM算视差,然后三角化得到点云。点云会有噪声和飞点,要做滤波:统计滤波剔除离群点,体素滤波降采样,双边滤波平滑。颜色从左目图像取,注意校正后的图像坐标对应。
我建室内地图时,点云噪声主要来自弱纹理区域和反光表面。弱纹理区域视差算不出来,深度缺失;反光表面视差错误,深度飞点。解决办法:弱纹理区域补纹理或降低分辨率,反光表面用偏振片或调整曝光。
5.2 常见问题速查表
| 问题 | 可能原因 | 排查方法 | 解决 |
|---|---|---|---|
| 深度图整体偏斜 | 标定外参不准 | 检查极线对齐 | 重新标定 |
| 深度图有空洞 | 弱纹理或遮挡 | 看视差图 | 补纹理或滤波 |
| 轨迹漂移大 | 特征误匹配 | 看匹配内点率 | 换特征或调阈值 |
| 尺度跳变 | 视差噪声大 | 看视差时序 | 加滤波或融合IMU |
| 建图重影 | 位姿不准 | 看回环 | 加回环或优化 |
| 运行卡顿 | 计算量大 | 看CPU/GPU占用 | 降分辨率或稀疏化 |
5.3 实操心得与避坑技巧
- 标定完先跑校正,看极线对齐,别急着跑SLAM。
- 视差图先做左右一致性检查,再算深度。
- 特征匹配内点率低于30%就警惕,可能场景不适合。
- 融合IMU时,先标定时间偏移,再调噪声参数。
- 建图内存不够就降采样,别硬撑。
- 回环检测词典要针对场景,别用通用词典跑所有场景。
双目SLAM和三维建图,说到底是一个系统工程,标定、视差、优化、融合每一环都要扎实。我踩过的坑,大多是因为跳过标定直接调算法,或者融合时忽略时间同步。把基础打牢,后面调参才有意义。这个方向后续还可以结合深度学习视差和语义SLAM,让建图不仅准,还能理解场景。