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)(单位:米)。现在,车上的摄像头拍到了这根杆子。我们想知道:杆顶在照片上的哪个像素位置?

这个过程分三步:

  1. 世界 → 相机:用外参矩阵(旋转+平移)把世界坐标 (10, 5, 3) 变成相机坐标 (X_c, Y_c, Z_c)。这一步相当于把「绝对位置」变成「相对相机的方位」。
  2. 相机 → 图像(归一化平面):用透视投影,把 (X_c, Y_c, Z_c) 变成归一化坐标 (x, y) = (X_c/Z_c, Y_c/Z_c)。这一步相当于把3D点「压」到2D平面上。
  3. 归一化平面 → 像素:用内参矩阵(焦距、主点偏移)把 (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图来展示这三个坐标系之间的关系,以及它们在整个感知流程中的位置。

坐标系变换流程 世界坐标系 (X_w, Y_w, Z_w) 绝对参考系,固定在地面 不随车移动 外参矩阵 [R | t] 相机坐标系 (X_c, Y_c, Z_c) 以光心为原点 Z轴指向镜头前方 透视投影 (X/Z, Y/Z) 图像坐标系 (u, v) 像素坐标 原点在左上角 关键说明: • 外参矩阵 [R | t]:描述相机在世界坐标系中的位置和朝向 • 内参矩阵 K:描述相机的焦距、主点等内部参数 • 整个流程:世界坐标 → 相机坐标 → 归一化坐标 → 像素坐标

1.5 一个小练习:感受一下坐标变换

咱们不用代码,就用几何直观来感受一下。

假设你站在一个十字路口中央,面朝北。你面前有一根路灯杆,在你前方10米、右侧5米的位置。杆高3米。

现在,你往右转了90度,面朝东。这时候,那根杆子在你什么位置?

嗯,答案应该是:在你前方5米、左侧10米的位置。因为你的朝向变了,所以「前方」和「左侧」的定义都变了——这就是坐标变换的直观体现。

在自动驾驶里,车在转弯时,所有传感器的坐标系都在跟着转。如果不做坐标变换,车就会「以为」物体在左边,实际上物体在右边。后果嘛……你懂的。

我的建议:刚开始学坐标变换时,不要急着看公式。先用几何直观去理解「旋转」和「平移」到底在做什么。等你想明白了,公式自然就记住了。

1.6 本章小结

咱们这一章主要讲了三个事:

  • 为什么需要坐标变换?——因为不同传感器有自己的坐标系,必须统一到同一个参考系里才能协同工作。
  • 三个核心坐标系:世界坐标系(绝对参考)、相机坐标系(以相机为中心)、图像坐标系(像素坐标)。
  • 变换流程:世界→相机(外参)→图像(内参),每一步都有明确的几何意义。

下一章,咱们会深入拆解「旋转矩阵」和「平移向量」的数学细节。到时候我会分享一个我在项目中用过的「旋转矩阵速查表」,保证实用。


可可精品资料库