1. 引言:为什么需要 Kalibr?
在视觉-惯性里程计(VIO)或 SLAM 系统中,相机提供丰富的环境纹理信息,IMU 提供高速的角速度和加速度测量。两者的融合可以优势互补:视觉修正 IMU 漂移,IMU 填补视觉快速运动时的信息缺失。然而,这种融合依赖于精确的时空对齐:
-
空间对齐:相机坐标系与 IMU 坐标系之间的刚性变换(旋转和平移)。
-
时间对齐:相机图像时间戳与 IMU 时间戳之间的恒定延迟。
此外,相机本身的内参(焦距、主点、畸变)也必须准确标定。Kalibr 通过联合优化所有参数,一次性给出高精度的标定结果。它支持单目、双目、多目相机以及多种 IMU 模型,并提供丰富的诊断工具。
2. Kalibr 标定原理深度解析
2.1 问题定义与数学模型
待估参数:
-
相机内参(如针孔模型的
fx, fy, cx, cy和畸变系数k1, k2, p1, p2) -
多相机系统的外参
T_{Ci}^{C0}(从主相机到其他相机的变换) -
相机-IMU 外参
T_{C}^{I}(IMU 到相机的变换) -
时间偏移
t_d(图像时间戳对应的真实 IMU 时间:t_imu = t_cam + t_d)
输入数据:
-
图像序列(含时间戳)
-
IMU 测量数据(角速度、加速度,含时间戳)
-
标定板(如 Aprilgrid)的已知3D点
状态变量 (在联合优化中):
在离散的相机采样时刻 k(对应时间 t_k = t_cam,k + t_d),需要估计 IMU 在世界坐标系下的位姿 T_{IW}^k(包含位置 p_{IW}^k 和姿态 R_{IW}^k)、速度 v_{IW}^k,以及 IMU 零偏 b_g^k、b_a^k。此外,路标点(标定板角点)的3D坐标 p_l^W 也作为变量。
优化框架 :构建一个最大似然估计问题,最小化所有观测的负对数似然,等价于最小化以下代价函数:
J(X) = Σ ||r_proj||²_Σ_pix + Σ ||r_imu||²_Σ_imu + ||r_prior||²
其中 r_proj 是视觉重投影误差,r_imu 是 IMU 预积分误差,Σ 表示对应协方差矩阵的逆(信息矩阵)。
2.2 视觉重投影误差推导
设第 l 个路标点在世界坐标系下的坐标为 p_l^W。在时刻 k,根据当前估计的 IMU 位姿 T_{IW}^k 和外参 T_{IC}(相机到 IMU 的变换),可将该点转换到相机坐标系:
p_l^{C_k} = R_{IC}^T ( R_{IW}^k (p_l^W - p_{IW}^k) - p_{IC} )
然后归一化并施加畸变(以径向切向模型为例):
x_n = p_x^{C_k} / p_z^{C_k}, y_n = p_y^{C_k} / p_z^{C_k}
r^2 = x_n^2 + y_n^2
x_d = x_n (1 + k1 r^2 + k2 r^4) + 2 p1 x_n y_n + p2 (r^2 + 2 x_n^2)
y_d = y_n (1 + k1 r^2 + k2 r^4) + p1 (r^2 + 2 y_n^2) + 2 p2 x_n y_n
最后通过内参矩阵得到像素坐标预测值:
u_pred = fx * x_d + cx
v_pred = fy * y_d + cy
实际观测到的像素坐标为 (u_obs, v_obs),则重投影误差为:
r_proj = [u_obs - u_pred, v_obs - v_pred]^T
该误差的协方差通常取为像素噪声的协方差(如 diag(σ_u^2, σ_v^2))。
2.3 IMU 预积分理论
IMU 测量模型:
ω_m = ω_t + b_g + η_g
a_m = R_{IW}^T (a_t - g) + b_a + η_a
其中 ω_t、a_t 为真实角速度和加速度,g 为重力矢量,η_g、η_a 为高斯白噪声。
直接积分的问题 :若在优化过程中调整了 R_{IW}^k 或零偏,所有 IMU 积分需要重新计算,计算量巨大。
预积分思想 :将积分从世界坐标系转移到 局部坐标系(时刻 k 的 IMU 坐标系) ,得到仅依赖于 IMU 测量值和零偏的预积分量 ΔR、Δv、Δp。
旋转预积分(离散中值积分示例):
ΔR = ∏_{i=k}^{k+N-1} Exp( (ω_m,i - b_g,i) Δt )
速度预积分:
Δv = ∑_{i=k}^{k+N-1} ΔR_i (a_m,i - b_a,i) Δt
位置预积分:
Δp = ∑_{i=k}^{k+N-1} [ Δv_i Δt + 1/2 ΔR_i (a_m,i - b_a,i) Δt^2 ]
其中 ΔR_i 是从时刻 k 到 i 的累积旋转。
预积分误差 (连接两个关键帧 k 和 k+1):
r_ΔR = Log( (ΔR(b_g^k))^T (R_{IW}^k)^T R_{IW}^{k+1} )
r_Δv = (R_{IW}^k)^T (v_{IW}^{k+1} - v_{IW}^k - g Δt) - Δv(b_g^k, b_a^k)
r_Δp = (R_{IW}^k)^T (p_{IW}^{k+1} - p_{IW}^k - v_{IW}^k Δt - 0.5 g Δt^2) - Δp(b_g^k, b_a^k)
r_Δbg = b_g^{k+1} - b_g^k
r_Δba = b_a^{k+1} - b_a^k
预积分量的协方差可通过 IMU 噪声模型递推计算,用于加权该误差项。
2.4 时间偏移建模
图像时间戳 t_cam 对应的真实 IMU 时间为 t_imu = t_cam + t_d。在优化中,我们需要获取该时刻的 IMU 位姿,但由于 IMU 状态只在离散的关键帧时刻估计,通常采用线性插值:
-
位置和速度:线性插值
-
旋转:球面线性插值(SLERP)
t_d作为一个优化变量,其变化会影响插值结果,从而影响重投影误差和 IMU 预积分误差的连续性。Kalibr 通过联合优化同时估计t_d。
2.5 联合优化框架
将所有待估参数(包括所有关键帧的 IMU 状态、路标点、内参、外参、时间偏移)构成一个高维状态向量,使用 Ceres Solver 或 GTSAM 进行非线性最小二乘求解。优化算法通常采用 Levenberg-Marquardt 或 Dogleg,并利用自动微分或解析雅可比加速计算。
3. Kalibr ROS 功能包全流程
Kalibr 提供了多个 ROS 节点,分别用于不同标定任务。下图展示了整体流程:
3.1 数据采集与预处理
录制要求:
-
相机:保持标定板在视野内,充分覆盖图像各个区域,避免运动模糊。
-
IMU:充分激励所有轴,包含旋转、加速、减速,静止段用于零偏初始化。
-
话题:确保图像和 IMU 话题有准确的时间戳(建议使用硬件同步或近似时间同步)。
标定板配置 :
Kalibr 推荐使用 Aprilgrid,因为它提供唯一标识的角点,便于数据关联。target.yaml 示例:
target_type: 'aprilgrid' #gridtype
tagCols: 6 #number of apriltags
tagRows: 6 #number of apriltags
tagSize: 0.088 #size of apriltag, edge to edge [m]
tagSpacing: 0.3 #ratio of space between tags to tagSize
3.2 相机标定流程
对于单目或多目相机,使用 kalibr_calibrate_cameras:
-
特征提取:检测每一帧图像中的 Aprilgrid 角点,并关联到3D坐标。
-
初始化:通过估计单应性矩阵或本质矩阵,获得每帧相机的粗略位姿和内参初值。
-
光束法平差(BA):优化所有相机内参、外参(多目)和标定板位姿,最小化重投影误差。
-
输出 :生成
camchain.yaml包含内参和畸变系数,以及相机间外参。
3.3 相机-IMU 联合标定流程
使用 kalibr_calibrate_imu_camera,包含以下阶段:
-
视觉处理:独立运行视觉 BA,得到相机位姿轨迹和路标点。
-
IMU 预积分:对 IMU 数据进行预积分,得到相邻关键帧间的相对运动约束。
-
时空参数初始化:
-
时间偏移:通过互相关或线性搜索初步对齐。
-
空间外参:利用手眼标定(AX=XB)获得初值。
-
重力方向:从加速度计均值估计。
-
-
联合优化:构建包含视觉重投影误差、IMU 预积分误差的图优化问题,同时优化所有参数(包括内参、外参、时间偏移、IMU 状态、路标点)。
-
结果输出 :生成包含相机-IMU 外参
T_cam_imu和时间偏移t_d的 YAML 文件。
3.4 参数优化与求解
Kalibr 使用 Ceres Solver 进行优化,支持自动微分。优化过程中,可以实时输出代价下降、梯度范数等信息,帮助判断收敛情况。
4. 标定数据分析与评估
4.1 重投影误差分析
优化后,Kalibr 会输出每个观测的重投影误差。我们可以计算:
-
RMSE:√(1/N Σ e_i²)
-
平均误差:mean(|e_i|)
-
误差分布直方图:检查是否接近高斯分布,是否有异常值。
4.2 参数不确定性评估
从最终 Hessian 矩阵的逆可以得到参数协方差矩阵 Σ。对角线元素反映参数方差,非对角线元素反映相关性。Kalibr 会输出每个参数的估计值和标准差。例如:
fx: 535.2 +/- 1.3
td: -0.012 +/- 0.003
标准差较大表示该参数可观测性差或数据激励不足。
4.3 收敛过程监控
通过观察迭代过程中代价函数的变化,可以判断优化是否收敛。理想的收敛曲线应快速下降后趋于平稳。
4.4 可视化诊断
-
误差随图像变化图:检查是否有某些帧误差显著偏大。
-
残差散点图:如果残差存在明显模式(如系统性偏差),可能表明模型未正确建模。
-
时间偏移估计迭代图 :观察
t_d是否稳定收敛。
4.5 数据质量检查清单
-
是否包含足够的静止段(用于零偏初始化)?
-
标定板角点是否覆盖了整个图像平面?
-
IMU 数据是否包含充分的角速度和加速度激励?
-
图像与 IMU 数据的时间戳是否严格单调且无丢包?
5. 实战技巧与常见问题
5.1 如何录制高质量标定数据
-
运动设计:先静止 2-3 秒,然后进行"8"字形运动,包含绕各轴的旋转和各个方向的加速/减速,最后再静止几秒。
-
光照条件:避免过曝或过暗,确保标定板清晰可见。
-
数据时长:建议录制 1-2 分钟,保证有足够的视差和激励。
5.2 常见错误及解决方法
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 优化不收敛 | 初始值太差、数据关联错误 | 检查特征检测,尝试更严格的阈值;提供更好的初值(如先单独标定相机) |
| 时间偏移不确定度高 | 缺乏运动激励 | 增加快速旋转运动,使视觉-惯性延迟更明显 |
| 外参旋转可观测性差 | 旋转轴未充分激励 | 确保绕各个轴都有足够旋转 |
| 重投影误差过大 | 畸变模型错误、标定板翘曲 | 更换畸变模型(如 radtan → equidistant);使用更刚性的标定板 |
5.3 标定稳定性评估
建议进行多次标定(如 3-5 次),比较参数的一致性和重复性。如果参数标准差较大或不同次标定结果差异明显,说明标定不可靠,需要检查数据质量或增加激励。
6. 总结与展望
Kalibr 通过紧耦合的联合优化,解决了视觉-惯性传感器标定的核心难题。本文从数学原理出发,推导了视觉重投影误差和 IMU 预积分误差的公式,并详细解析了 Kalibr ROS 功能包的完整流程和数据分析方法。掌握这些内容后,你不仅能熟练使用 Kalibr,还能深入理解其背后的机制,从而在遇到问题时能够自主诊断并优化标定质量。
随着传感器融合技术的不断发展,标定的重要性日益凸显。未来,在线标定、自动标定等技术将进一步简化流程,但离线高精度标定始终是验证和基准的基础。希望本文能成为你探索多传感器融合世界的可靠指南。
参考文献
-
Furgale, P., et al. "Unified temporal and spatial calibration for multi-sensor systems." IROS 2013.
-
Forster, C., et al. "IMU preintegration on manifold for efficient visual-inertial maximum-a-posteriori estimation." RSS 2015.
-
Kalibr GitHub Wiki: https://github.com/ethz-asl/kalibr/wiki
附录:常用命令示例
bash
# 相机标定
kalibr_calibrate_cameras --bag data.bag --topics /cam0/image_raw /cam1/image_raw --models pinhole-radtan pinhole-radtan --target target.yaml
# 相机-IMU标定
kalibr_calibrate_imu_camera --bag data.bag --cam camchain.yaml --imu imu.yaml --target target.yaml