3、坐标系入门:世界坐标系、相机坐标系、图像坐标系、像素坐标系、激光雷达坐标系

好,咱们正式开始聊坐标系。说实话,我刚入行那会儿,被这五个坐标系绕得晕头转向。明明都是三维空间里的点,怎么换个坐标系就完全不一样了?后来我才明白——坐标系就是不同传感器各自的「语言」。你想想看,激光雷达说「前方5米」,相机说「第300列第200行」,这俩怎么对上话?

所以这一节,咱们就把这五个坐标系彻底捋清楚。我保证,搞懂了它们,联合标定你就已经成功了一半。

3.1 世界坐标系:那个「绝对」的参考系

世界坐标系,说白了就是整个场景的「上帝视角」。它是一个固定的三维坐标系,通常用 (X_w, Y_w, Z_w) 表示。你车上的所有传感器、所有障碍物,最终都要映射到这个坐标系里。

我个人习惯把世界坐标系的原点设在车辆后轴中心,Z轴朝上,X轴朝前。当然,这不是硬性规定——你设在哪都行,只要整个系统统一就好。我在项目里见过有人把原点设在停车场入口的,结果换了个停车场,所有标定参数全废了。嗯,这里要注意:世界坐标系一旦定下来,就别轻易改。

关键点:世界坐标系是「锚」,所有其他坐标系都是相对于它定义的。

3.2 相机坐标系:以镜头为中心的「眼睛」

相机坐标系 (X_c, Y_c, Z_c) 是以相机光心为原点的三维坐标系。Z轴指向相机正前方,X轴向右,Y轴向下(这个跟图像坐标系有关,后面会讲)。

为什么要有相机坐标系?因为相机看到的世界,是以它自己为中心的。你想想看,一个物体在世界坐标系里是 (10, 5, 2),但在相机坐标系里可能是 (3, -1, 8)——这中间的转换,就是所谓的「外参」。

我记得有一次调试,发现激光雷达和相机的投影总对不上。查了半天,原来是相机坐标系Y轴方向搞反了。你以为Y轴向上?不,在相机坐标系里,Y轴通常向下——这是为了跟图像坐标系对齐。这个坑,我踩过。

避坑指南:相机坐标系的Y轴方向,不同厂家定义可能不同。标定前一定要确认清楚。

3.3 图像坐标系:从三维到二维的「投影」

图像坐标系 (x, y) 是二维的,单位是毫米。它的原点在图像平面的中心(也就是光轴与图像平面的交点),x轴向右,y轴向下。

这里有个关键概念:相机坐标系到图像坐标系的转换,靠的是「针孔相机模型」。说白了,就是用一个矩阵把三维点投影到二维平面上。这个矩阵叫内参矩阵,里面包含了焦距、主点偏移等参数。

我曾经在项目里遇到一个问题:标定出来的内参矩阵,投影误差总是很大。后来发现是图像坐标系的原点没对齐——相机传感器和图像坐标系的原点之间有个偏移量。这个偏移量,就是内参矩阵里的 cxcy

// 相机坐标系到图像坐标系的投影公式
// (X_c, Y_c, Z_c) 是相机坐标系下的点
// (x, y) 是图像坐标系下的点
// f 是焦距

x = f * X_c / Z_c
y = f * Y_c / Z_c

3.4 像素坐标系:你看到的「数字图像」

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

你可能会问:图像坐标系和像素坐标系有什么区别?区别大了去了。图像坐标系是物理单位(毫米),像素坐标系是离散单位(像素)。从图像坐标系到像素坐标系,其实就是个缩放和平移——把毫米变成像素,把原点从中心移到左上角。

这个转换公式很简单:

// 图像坐标系到像素坐标系
// dx, dy 是每个像素的物理尺寸(毫米/像素)
// u0, v0 是图像坐标系原点在像素坐标系中的位置

u = x / dx + u0
v = y / dy + v0

我个人习惯把 u0, v0 记作主点偏移。为什么叫「偏移」?因为理想情况下,主点应该在图像正中心,但实际相机总会有制造误差。这个偏移量,就是内参标定要算的东西之一。

小技巧:如果你用OpenCV做标定,内参矩阵K就是上面两个转换的合并:

K = [fx, 0, cx;
     0, fy, cy;
     0,  0,  1]

其中 fx = f/dxfy = f/dycx = u0cy = v0

3.5 激光雷达坐标系:点云的「母语」

激光雷达坐标系 (X_l, Y_l, Z_l) 是以激光雷达中心为原点的三维坐标系。通常Z轴向上,X轴指向雷达正前方,Y轴向左。

但这里有个大坑:不同厂家的激光雷达,坐标系定义可能完全不同。比如Velodyne的坐标系是Z轴向上,X轴指向雷达后方;而Hesai的坐标系是Z轴向上,X轴指向雷达前方。你想想看,如果不搞清楚这个,标定出来的结果能对吗?

我记得有一次,用某款国产激光雷达做标定,怎么都对不上。后来翻手册才发现,它的Y轴方向跟常规定义相反。嗯,从那以后,我拿到新雷达的第一件事就是——看坐标系定义。

重要提醒:激光雷达坐标系的方向,一定要以厂家手册为准。不要想当然。

3.6 五个坐标系的关系:一张图说清楚

好了,五个坐标系都讲完了。它们之间的关系,其实就是一个链条:

  1. 世界坐标系 → 相机坐标系:靠外参(旋转+平移)
  2. 相机坐标系 → 图像坐标系:靠内参(投影)
  3. 图像坐标系 → 像素坐标系:靠缩放和平移
  4. 激光雷达坐标系 → 世界坐标系:靠外参(或者反过来)

说白了,联合标定要做的,就是找到激光雷达坐标系和相机坐标系之间的转换关系。而这个转换,通常是通过世界坐标系作为桥梁来实现的。

我建议你记住这个核心公式:

// 激光雷达点投影到像素坐标
// P_l 是激光雷达坐标系下的点
// T_l_to_c 是激光雷达到相机的变换矩阵(外参)
// K 是相机内参矩阵

P_c = T_l_to_c * P_l
pixel = K * P_c

这个公式,就是整个联合标定的数学基础。后面的所有内容,都是围绕它展开的。

3.7 小结

这一节我们讲了五个坐标系:世界坐标系是「锚」,相机坐标系是「眼睛」,图像坐标系是「投影」,像素坐标系是「数字」,激光雷达坐标系是「点云母语」。它们之间的关系,就是一条从三维到二维的转换链。

下一节,我们会聊到具体的标定方法——怎么用数学工具把这些坐标系串起来。到时候你会发现,坐标系搞清楚了,标定其实就是解方程。

一句话总结:坐标系是传感器的语言,标定就是翻译。语言不通,标定白做。