1. 坐标系基础:为什么需要坐标变换?从几何直观理解世界坐标系、相机坐标系、图像坐标系
大家好,我是老张。今天咱们聊聊坐标变换——这个在自动驾驶感知里绕不开的话题。
说实话,我刚入行那会儿,也觉得坐标变换不就是几个矩阵乘来乘去嘛,有啥好学的?直到有一次,我在项目里把一个激光雷达点云投影到图像上,结果所有点都飘到了天上……嗯,从那以后,我再也不敢小看坐标系这件事了。
1.1 为什么需要坐标变换?
你想想看,一辆自动驾驶车上,传感器少说也有五六个:
- 前视摄像头看到的是「前方视角」的画面
- 激光雷达扫到的是「以自身为中心」的3D点云
- 毫米波雷达给出的是「目标相对我的距离和速度」
- GPS告诉你是「在地球上的经纬度」
每个传感器都有自己的「小世界」——也就是它自己的坐标系。但车要做出决策,必须把所有信息统一到同一个「大世界」里。这就是坐标变换存在的意义。
核心思想:坐标变换的本质,就是把一个点在「A的坐标系」里的位置,换算成它在「B的坐标系」里的位置。说白了,就是让不同传感器说同一种「语言」。
1.2 三个核心坐标系:从世界到像素
在感知系统里,我们最常打交道的坐标系有三个。我习惯把它们理解成一个「流水线」:
世界坐标系 → 相机坐标系 → 图像坐标系
下面咱们一个一个看。
1.2.1 世界坐标系(World Coordinate System)
世界坐标系是「绝对参考系」。它固定在地面上,不随车移动而改变。通常我们用 (X_w, Y_w, Z_w) 来表示。
举个例子:你站在天桥上,看到一辆车从桥下经过。天桥的位置是固定的,车的位置在变化——这个「固定」的参考系,就是世界坐标系。
在自动驾驶里,世界坐标系通常以某个参考点(比如地图原点)为原点,X轴指向东,Y轴指向北,Z轴指向天。这就是我们常说的ENU坐标系。
我的习惯:做多传感器融合时,我一般把世界坐标系作为「最终战场」。所有传感器的数据,最终都要统一到这个世界坐标系里,才能做全局路径规划和决策。
1.2.2 相机坐标系(Camera Coordinate System)
相机坐标系是以相机光心为原点的坐标系。它跟着相机一起运动。我们用 (X_c, Y_c, Z_c) 表示。
这里有个关键点:相机坐标系的Z轴指向相机的前方(也就是镜头朝向的方向),X轴指向右侧,Y轴指向下方。嗯,这个定义和世界坐标系不太一样,要注意。
我记得有一次,一个同事把相机坐标系的Y轴方向搞反了,结果投影出来的图像上下颠倒,排查了半天才发现是坐标系定义的问题。所以,坐标系的方向定义一定要在项目一开始就统一好。
1.2.3 图像坐标系(Image Coordinate System)
图像坐标系就是我们最终看到的像素坐标。它是在图像平面上的2D坐标系,用 (u, v) 表示。
图像坐标系的原点通常在图像的左上角,u轴向右,v轴向下。注意,这里的v轴是向下的——这和数学里常见的y轴向上正好相反。
避坑指南:我曾经在写投影代码时,直接把相机坐标系的Y坐标当作图像坐标系的v坐标,结果所有点都投影到了图像的上半部分。后来才意识到,相机坐标系的Y轴向下,而图像坐标系的v轴也向下,但它们的尺度不一样——一个是物理单位(米),一个是像素单位。所以,中间还需要一个「内参矩阵」来做缩放和平移。
1.3 从几何直观理解:一个点是怎么从世界跑到图像上的?
咱们用一个具体的例子来走一遍流程。
假设路边有一根路灯杆,它的顶部在世界坐标系里的坐标是 (10, 5, 3)(单位:米)。现在,车上的摄像头拍到了这根杆子。我们想知道:杆顶在照片上的哪个像素位置?
这个过程分三步:
- 世界 → 相机:用外参矩阵(旋转+平移)把世界坐标
(10, 5, 3)变成相机坐标(X_c, Y_c, Z_c)。这一步相当于把「绝对位置」变成「相对相机的方位」。 - 相机 → 图像(归一化平面):用透视投影,把
(X_c, Y_c, Z_c)变成归一化坐标(x, y) = (X_c/Z_c, Y_c/Z_c)。这一步相当于把3D点「压」到2D平面上。 - 归一化平面 → 像素:用内参矩阵(焦距、主点偏移)把
(x, y)变成像素坐标(u, v)。这一步相当于把物理尺寸转换成像素尺寸。
整个过程可以用一个公式概括:
s * [u, v, 1]^T = K * [R | t] * [X_w, Y_w, Z_w, 1]^T
其中:
K是内参矩阵(相机本身的属性)[R | t]是外参矩阵(相机在世界坐标系中的位姿)s是尺度因子
一句话总结:坐标变换就是「世界坐标 → 相机坐标 → 图像坐标」的流水线。每一步都有明确的数学对应关系,搞清楚了,多传感器融合就不再是玄学。
1.4 本章知识体系:一张图看懂
下面我用一张SVG图来展示这三个坐标系之间的关系,以及它们在整个感知流程中的位置。
1.5 一个小练习:感受一下坐标变换
咱们不用代码,就用几何直观来感受一下。
假设你站在一个十字路口中央,面朝北。你面前有一根路灯杆,在你前方10米、右侧5米的位置。杆高3米。
现在,你往右转了90度,面朝东。这时候,那根杆子在你什么位置?
嗯,答案应该是:在你前方5米、左侧10米的位置。因为你的朝向变了,所以「前方」和「左侧」的定义都变了——这就是坐标变换的直观体现。
在自动驾驶里,车在转弯时,所有传感器的坐标系都在跟着转。如果不做坐标变换,车就会「以为」物体在左边,实际上物体在右边。后果嘛……你懂的。
我的建议:刚开始学坐标变换时,不要急着看公式。先用几何直观去理解「旋转」和「平移」到底在做什么。等你想明白了,公式自然就记住了。
1.6 本章小结
咱们这一章主要讲了三个事:
- 为什么需要坐标变换?——因为不同传感器有自己的坐标系,必须统一到同一个参考系里才能协同工作。
- 三个核心坐标系:世界坐标系(绝对参考)、相机坐标系(以相机为中心)、图像坐标系(像素坐标)。
- 变换流程:世界→相机(外参)→图像(内参),每一步都有明确的几何意义。
下一章,咱们会深入拆解「旋转矩阵」和「平移向量」的数学细节。到时候我会分享一个我在项目中用过的「旋转矩阵速查表」,保证实用。
可可精品资料库