3、相机模型与标定:针孔模型、畸变模型、内参标定方法、双目与RGB-D相机模型
视觉惯性SLAM系统的前端感知完全依赖于相机如何将三维世界投影为二维像素。无论是单目、双目还是RGB-D相机,其成像几何都遵循统一的物理规律——针孔模型。然而,真实镜头存在畸变,且不同深度感知原理差异巨大,这直接决定了VINS系统中特征提取、三角化、深度估计与回环检测的精度上限。本章将系统梳理相机内参的数学本质、畸变校正流程、标定实施方法,并对比双目与RGB-D相机在VINS融合定位中的适用边界。
3.1 针孔模型:从三维世界到像素坐标
针孔模型是相机成像的理想化近似,它假设光线沿直线传播,穿过光心(投影中心)后在成像平面上形成倒像。在VINS中,我们通常将成像平面虚拟到光心前方,形成正立像,从而简化数学表达。设世界坐标系下一点 P = (X, Y, Z),经过相机外参(旋转矩阵R和平移向量t)变换到相机坐标系,再通过内参矩阵K投影到像素平面。
内参矩阵K的完整形式为:
K = [fx 0 cx]
[ 0 fy cy]
[ 0 0 1]
其中,fx和fy分别为x、y方向上的归一化焦距(单位:像素),cx和cy为主点坐标(光轴与成像平面的交点)。归一化焦距与物理焦距f的关系为 fx = f/dx,dy为单个像素的物理尺寸。在VINS前端中,特征点坐标必须通过内参矩阵反投影到归一化平面(Z=1),才能进行后续的对极几何约束或三角化计算。
3.2 畸变模型:径向与切向校正
真实镜头因加工和装配误差,会产生径向畸变(桶形或枕形)和切向畸变(透镜与成像平面不平行)。径向畸变可用k1、k2、k3三个参数描述,切向畸变用p1、p2描述。设归一化平面上的理想坐标为(x, y),畸变后的坐标为(x_dist, y_dist),则:
r² = x² + y²
x_dist = x(1 + k1·r² + k2·r⁴ + k3·r⁶) + 2·p1·x·y + p2·(r² + 2x²)
y_dist = y(1 + k1·r² + k2·r⁴ + k3·r⁶) + p1·(r² + 2y²) + 2·p2·x·y
在VINS中,畸变校正通常在特征提取后立即执行。OpenCV的undistortPoints函数或VINS自带的liftProjective函数均可完成此操作。校正后的特征坐标才能用于帧间匹配和三角化。
| 畸变类型 | 参数 | 典型影响 | 校正优先级 |
|---|---|---|---|
| 径向畸变 | k1, k2, k3 | 图像边缘弯曲,直线变弧线 | 高(k1影响最大) |
| 切向畸变 | p1, p2 | 图像梯形失真,主点偏移 | 中(通常较小) |
3.3 内参标定方法:从棋盘格到Kalibr
内参标定的核心是求解K和畸变系数。最经典的方法是张正友标定法,使用平面棋盘格在不同姿态下拍摄15-20张图像,通过单应性矩阵分解获得内参初值,再用非线性优化(如Levenberg-Marquardt)最小化重投影误差。对于VINS系统,推荐使用Kalibr工具,它支持多相机-IMU联合标定,能同时估计相机内参、相机间外参以及相机与IMU之间的时间延迟。
- 数据采集:使用棋盘格或AprilGrid,在光照均匀、纹理清晰的环境下,缓慢移动标定板覆盖图像各个区域(尤其是边缘和角落),避免运动模糊。
- 角点检测:使用OpenCV的
findChessboardCorners或Kalibr的检测器,确保亚像素精度。 - 参数求解:Kalibr会输出K、畸变系数、重投影误差以及相机-IMU的外参(T_ic)和时延(td)。
- 验证:将标定结果应用于测试图像,检查直线是否恢复笔直,边缘特征是否对齐。
3.4 双目相机模型:视差与深度估计
双目相机通过两个水平放置的相机模拟人眼立体视觉。理想情况下,两个相机光轴平行,且仅在x方向上有基线距离b。对于空间点P,其在左、右图像上的投影点分别为(u_l, v_l)和(u_r, v_r),视差定义为 d = u_l - u_r。根据相似三角形原理,深度Z = f·b / d。在VINS中,双目配置不仅提供尺度信息,还能通过左右目特征匹配直接三角化深度,加速初始化。
实际双目系统存在立体校正(Stereo Rectification)过程,通过旋转和平移将左右图像变换到同一平面且行对齐,使得极线水平,从而将二维搜索简化为一维搜索。VINS-Fusion中,双目特征点会同时计算左目和右目的描述子,并利用视差一致性检查剔除误匹配。
3.5 RGB-D相机模型:结构光与ToF
RGB-D相机直接提供像素对齐的深度图,省去了立体匹配的计算开销。主流技术包括结构光(如Kinect v1)和飞行时间法(ToF,如Kinect v2、RealSense D435)。结构光通过投射已知红外图案,根据图案变形计算深度;ToF则通过测量红外光发射与接收的相位差或时间差获取深度。在VINS中,RGB-D数据可直接将像素坐标反投影为三维点云,为视觉里程计提供稠密深度约束。
然而,RGB-D相机存在明显的局限性:室外强光下红外信号受干扰严重,深度值噪声大;透明物体和镜面表面无法正确测量;测量范围有限(通常0.2-6m)。因此,VINS-Fusion对RGB-D输入的处理策略是:仅使用深度值有效的特征点,并设置深度阈值(如0.3-4m),超出范围的特征点退化为纯视觉观测。
| 相机类型 | 深度原理 | 优点 | 缺点 | VINS适用场景 |
|---|---|---|---|---|
| 双目 | 视差三角化 | 室外鲁棒,无额外光源 | 计算量大,弱纹理失效 | 室外无人机、自动驾驶 |
| 结构光 | 红外图案变形 | 室内精度高,成本低 | 室外失效,功耗高 | 室内机器人、AR |
| ToF | 飞行时间 | 帧率高,无基线限制 | 分辨率低,多机干扰 | 室内SLAM、动态场景 |
3.6 案例拆解:VINS-Fusion中双目与RGB-D的深度融合策略
在某室内轮式机器人平台上,我们使用RealSense D435(RGB-D)与双目相机(基线12cm)同时采集数据,运行VINS-Fusion进行定位。初始阶段,系统仅使用RGB-D深度,发现轨迹在走廊尽头(约8m处)出现明显漂移,原因是D435的深度有效范围仅为4m,远处特征点全部退化为单目观测,尺度信息丢失。
随后,我们修改了VINS-Fusion的配置,将双目视差作为主要深度来源,RGB-D深度仅用于近距离(<2m)的稠密建图。具体操作包括:在config.yaml中设置depth_type: 1(双目),并调整min_depth为0.3m、max_depth为6m。同时,在特征管理器中,对RGB-D深度值进行时间戳同步校验,剔除深度跳变超过5%的异常点。最终,轨迹误差从RMS 0.35m降至0.12m,且回环检测的准确率提升了18%。
3.7 常见误区与总结
- 误区一:认为内参标定一次即可永久使用。温度变化、镜头松动、振动都会导致内参漂移,建议每次实验前快速验证(如拍摄标定板检查重投影误差)。
- 误区二:忽略畸变校正对特征匹配的影响。未校正的特征坐标在图像边缘处误差可达数十像素,直接导致对极几何计算失败。
- 误区三:在VINS中直接使用RGB-D的原始深度值,未进行时间戳同步和深度有效性检查。传感器延迟会导致深度与图像错位,产生虚假的深度突变。
- 误区四:双目相机标定只关注内参,忽略左右目外参(相对位姿)的精度。外参误差会直接导致视差计算偏差,进而影响深度精度。
总结而言,相机模型是VINS系统的几何基石。针孔模型提供了投影的数学框架,畸变模型保证了像素坐标的准确性,内参标定是这一切的前提,而双目与RGB-D相机则分别代表了主动与被动深度感知的典型路径。在实际工程中,应根据应用场景的尺度、光照、功耗和成本约束,选择合适的深度传感器,并严格遵循标定与验证流程,才能为VINS提供稳定可靠的视觉输入。