第一章:标定基础与坐标系

各位同学好,我是老张。搞了这么多年感知融合,我最大的体会就是——坐标系这东西,你绕不过去。说白了,它就是整个标定系统的「通用语言」。今天咱们就把这四个坐标系掰开揉碎了讲清楚。

1.1 为什么坐标系这么重要?

我记得刚入行那会儿,有个项目让我头疼了好几天。激光雷达和摄像头的数据怎么都对不上,明明检测到同一个目标,位置却差了半米。后来一查,原来是两个传感器的坐标系定义不一致。嗯,从那以后,我每次做标定前都会先确认坐标系定义。

你想想看,自动驾驶系统里有多个传感器:摄像头、激光雷达、毫米波雷达、IMU……每个传感器都有自己的「视角」。如果不把这些视角统一到一个坐标系下,那融合出来的结果就是一团乱麻。

核心概念:坐标系转换的本质,就是把一个传感器看到的点,映射到另一个传感器的视野中。这中间涉及四个关键坐标系。

1.2 四大坐标系详解

1.2.1 世界坐标系 (World Coordinate System)

世界坐标系,你可以理解为「绝对坐标系」。它固定在地面上,不随车辆移动而改变。通常我们以车辆初始位置或某个地标为原点,X轴指向车辆前方,Y轴指向左侧,Z轴指向上方。

我在项目中遇到过一个问题:如果世界坐标系定义不统一,不同时刻采集的数据就无法对齐。所以我的习惯是,在项目启动时就定好世界坐标系的原点和轴向,所有传感器都基于这个坐标系来标定。

1.2.2 相机坐标系 (Camera Coordinate System)

相机坐标系是以摄像头光心为原点的坐标系。它的Z轴指向镜头前方(也就是拍摄方向),X轴向右,Y轴向下。注意,这里的Y轴方向和世界坐标系是反的。

为什么会这样?因为图像坐标系的原点在左上角,Y轴向下为正。为了和图像坐标系保持一致,相机坐标系也沿用了这个习惯。

我的经验:在做相机标定时,一定要确认相机坐标系的原点位置。有些资料把原点放在图像中心,有些放在光心。我个人习惯用光心,因为这样投影关系更直观。

1.2.3 图像坐标系 (Image Coordinate System)

图像坐标系是二维的,单位是毫米。它的原点在图像平面的中心(也就是主点位置),X轴向右,Y轴向下。这个坐标系的作用,是把相机坐标系中的三维点投影到二维平面上。

说白了,图像坐标系就是「相机看到的画面」的数学描述。它和相机坐标系之间通过内参矩阵关联。

1.2.4 像素坐标系 (Pixel Coordinate System)

像素坐标系也是二维的,但单位是像素。它的原点在图像的左上角,u轴向右,v轴向下。每个像素点(u, v)对应图像中的一个位置。

你可能会问:图像坐标系和像素坐标系有什么区别?区别就在于单位不同。图像坐标系用毫米,像素坐标系用像素。两者之间通过像素尺寸(dx, dy)来转换。

注意:像素坐标系的原点在左上角,而图像坐标系的原点在中心。这个偏移量就是主点坐标(cx, cy)。很多初学者会忽略这个偏移,导致投影结果偏差很大。

1.3 坐标系转换关系

好了,四个坐标系都介绍完了。现在咱们看看它们之间怎么转换。我画了一张图,帮你理清思路。

坐标系转换关系图 世界坐标系 (Xw, Yw, Zw) 相机坐标系 (Xc, Yc, Zc) 图像坐标系 (x, y) 像素坐标系 (u, v) 外参矩阵 (R, t) 内参矩阵 (K) 像素尺寸 (dx, dy) 完整转换公式: Zc * [u, v, 1]^T = K * [R | t] * [Xw, Yw, Zw, 1]^T

从这张图可以看得很清楚:世界坐标系先通过外参矩阵(旋转R和平移t)转换到相机坐标系,然后通过内参矩阵K投影到图像坐标系,最后通过像素尺寸转换到像素坐标系。

1.4 数学公式与代码实现

光看图还不够,咱们得动手算一算。下面是完整的转换公式:

// 世界坐标系到相机坐标系
Xc = R * Xw + t

// 相机坐标系到图像坐标系(归一化平面)
x = Xc / Zc
y = Yc / Zc

// 图像坐标系到像素坐标系
u = fx * x + cx
v = fy * y + cy

// 完整形式(齐次坐标)
Zc * [u]   [fx  0  cx] [R11 R12 R13 t1] [Xw]
     [v] = [ 0 fy cy] * [R21 R22 R23 t2] * [Yw]
     [1]   [ 0  0  1]   [R31 R32 R33 t3]   [Zw]
                                              [1 ]

我的建议:在实际编码时,别手写这些矩阵运算。用OpenCV的cv2.projectPoints()函数,它已经帮你封装好了。我早期犯过的一个错误就是自己实现投影,结果矩阵乘法顺序搞反了,调试了一整天。

1.5 避坑指南

最后,分享几个我踩过的坑:

  • 坐标系方向搞反:我曾经把相机坐标系的Y轴方向搞反了,导致投影结果上下颠倒。后来我养成了一个习惯:每次标定完,先投影几个已知点验证一下。
  • 单位不统一:世界坐标系用米,相机坐标系用毫米,结果投影出来差1000倍。嗯,这个错误我只犯过一次。
  • 忽略畸变:摄像头镜头都有畸变,不做畸变校正直接投影,边缘区域误差很大。我的做法是:先做畸变校正,再做投影。

重要提醒:坐标系转换的精度直接影响后续的感知融合效果。我建议你在项目初期就建立一套坐标系转换的验证流程,每次修改标定参数后都跑一遍验证。

好了,坐标系的基础知识就讲到这里。记住一句话:坐标系是标定的基石,基础不牢,地动山摇。下一节咱们聊聊具体的标定方法。


可可精品资料库