3. 传感器模型:针孔相机模型、畸变模型、IMU测量模型

做外参标定,说白了就是搞清楚「各个传感器之间到底怎么摆放的」。但在这之前,你得先弄明白每个传感器自己是怎么工作的。这就像你要把两个人绑在一起干活,总得先知道他们各自擅长什么、有什么毛病吧?

这一节,我们就来聊聊三个最核心的传感器模型。我个人习惯把它们称为「外参标定的地基」——地基不稳,楼盖得再高也得塌。

3.1 针孔相机模型

针孔相机模型,是所有视觉传感器的基础。你想想看,一个相机说白了就是一个带小孔的暗箱,光线透过小孔在后面的感光元件上成像。这就是针孔模型的物理原型。

数学上怎么描述?很简单,就是三维空间中的点,通过一个中心投影,映射到二维图像平面上。公式长这样:

// 针孔投影公式(齐次坐标形式)
// [u, v, 1]^T = K * [R|t] * [X, Y, Z, 1]^T

// 其中 K 是内参矩阵:
K = [fx,  0, cx;
      0, fy, cy;
      0,  0,  1]

这里 fx, fy 是焦距(以像素为单位),cx, cy 是主点坐标。我在项目中遇到过不少新手,一上来就拿着公式套,结果标定出来的外参总是差那么一点点。后来发现,问题出在「他们以为 cx, cy 就是图像中心」。其实不是的,主点往往有偏移,尤其是工业相机,偏移量可能还不小。

我的习惯:做外参标定前,先用棋盘格把相机内参标定一遍。别偷懒,这一步省了,后面全是坑。

3.2 畸变模型

针孔模型是理想情况。现实中的镜头,尤其是广角镜头,会有畸变。说白了就是图像边缘的直线变弯了。畸变主要分两种:径向畸变和切向畸变。

3.2.1 径向畸变

径向畸变是镜头形状造成的。光线通过透镜边缘时,折射角度和中心不一样,导致图像边缘被拉伸或压缩。数学上用泰勒展开来近似:

// 径向畸变校正
x_corrected = x * (1 + k1*r^2 + k2*r^4 + k3*r^6)
y_corrected = y * (1 + k1*r^2 + k2*r^4 + k3*r^6)

// 其中 r^2 = x^2 + y^2,k1, k2, k3 是畸变系数

k1 负责主要畸变,k2 负责边缘畸变,k3 一般用于鱼眼镜头。我记得有一次标定一个广角相机,只用了 k1 和 k2,结果边缘误差始终降不下来。后来加了 k3,效果立竿见影。

避坑指南:我曾经在标定一个畸变很大的镜头时,发现标定结果反复横跳。后来排查发现,是棋盘格图片数量不够,而且覆盖区域太集中。建议至少拍 20 张不同角度的图片,覆盖整个视野。

3.2.2 切向畸变

切向畸变,说白了就是镜头和成像平面不平行。这通常是镜头组装时产生的误差。公式如下:

// 切向畸变校正
x_corrected = x + (2*p1*x*y + p2*(r^2 + 2*x^2))
y_corrected = y + (p1*(r^2 + 2*y^2) + 2*p2*x*y)

// p1, p2 是切向畸变系数

切向畸变一般比径向畸变小得多。我个人的经验是,如果镜头质量还行,p1, p2 基本可以忽略。但如果是廉价镜头或者拆机镜头,还是老老实实标定一下。

3.3 IMU测量模型

IMU(惯性测量单元)是另一个主角。它测量的是加速度和角速度。但IMU有个毛病——它不直接测量位姿,而是测量「变化量」。你需要积分才能得到位置和姿态。这就带来了累积误差的问题。

IMU的测量模型可以写成:

// IMU测量模型
a_meas = a_true + b_a + n_a + g
w_meas = w_true + b_w + n_w

// 其中:
// a_meas, w_meas:测量值
// a_true, w_true:真实值
// b_a, b_w:零偏(bias)
// n_a, n_w:高斯白噪声
// g:重力加速度

这里有两个关键参数:零偏和噪声。零偏是IMU的固有误差,每次开机都不一样。噪声是随机波动,没法完全消除。

核心要点:IMU的零偏是外参标定中最容易忽略的变量。我见过不少案例,外参标定结果看起来很好,但实际融合时IMU数据总是飘。一查,原来是零偏没处理好。

3.4 三种模型的关联

你可能会问:这三个模型跟外参标定有什么关系?关系大了去了。

外参标定,本质上是求解相机坐标系和IMU坐标系之间的旋转和平移。但这两个传感器观测的是不同的物理量——相机看到的是图像特征点,IMU感受到的是加速度和角速度。要让它们「对齐」,你必须先把各自的测量值转换到统一的数学框架下。

我画了一张图,帮你理清这三者的关系:

传感器模型与外参标定的关系 针孔相机模型 三维点 → 二维像素 内参矩阵 K 投影关系 畸变模型 径向畸变 k1,k2,k3 切向畸变 p1,p2 校正像素位置 IMU测量模型 加速度 + 角速度 零偏 b_a, b_w 噪声 n_a, n_w 原始像素 校正后 外参标定 求解:旋转 R + 平移 t(相机 ↔ IMU) 三个模型共同为外参标定提供输入:相机提供特征点,IMU提供运动约束

从这张图你可以看到,相机模型和畸变模型负责把图像特征点从像素坐标转换到归一化坐标,IMU模型负责提供运动过程中的加速度和角速度约束。外参标定算法,就是在这两个数据流之间寻找最优的旋转和平移。

3.5 实际标定中的注意事项

讲完了理论,我分享几个实际标定中的经验:

  • 相机内参要准:外参标定依赖内参。内参不准,外参一定不准。我建议每换一次镜头或焦距,就重新标定一次内参。
  • IMU需要预热:IMU刚上电时零偏不稳定。我一般会等 5-10 分钟,等IMU稳定了再开始采集数据。
  • 畸变校正不能省:尤其是广角镜头,不校正畸变,外参标定结果会严重偏离真实值。
  • 数据同步是关键:相机和IMU的数据必须时间对齐。时间戳对不上,标定出来的外参就是错的。
一个小技巧:标定时尽量让IMU有充分的激励——也就是让设备做各种方向的运动。静止不动时,IMU提供的信息量很少,不利于标定。

好了,这一节的内容就到这里。传感器模型是外参标定的基础,理解透了,后面的内容学起来会轻松很多。

可可精品资料库