2. 坐标系与空间变换基础

做BEV感知,说白了就是要把不同视角的摄像头图像,统一到一个“上帝视角”的鸟瞰图里。这中间最绕不开的,就是坐标系和空间变换。我刚开始接触这块时,也被这些坐标系绕得头晕。但搞懂了它们,你就能理解摄像头是如何“看”世界的。

四个核心坐标系

我们先从最熟悉的开始,一步步说清楚这四个坐标系的关系。

1. 世界坐标系

世界坐标系是真实世界的绝对参考系。你可以把它想象成一个“宇宙原点”。比如,我们定义路面上某个红绿灯杆的底部为(0,0,0),那么周围所有物体——车辆、行人、路标——都有了唯一的三维坐标(Xw, Yw, Zw)。

我个人习惯把世界坐标系的Z轴朝上,这样更符合直觉。在自动驾驶中,世界坐标系通常以车辆后轴中心为原点,或者以高精地图的某个固定点为原点。

2. 相机坐标系

相机坐标系是以摄像头光心为原点的三维坐标系。它的Z轴指向镜头前方,X轴向右,Y轴向下(注意,这和世界坐标系的Y轴方向可能不同)。

为什么要引入它?因为世界坐标系里的物体,要“进入”摄像头,必须先转换到以摄像头为中心的坐标系里。说白了,就是回答一个问题:“这个物体相对于我的摄像头,到底在哪个方向?”

3. 图像坐标系

图像坐标系是二维的,单位是毫米。它位于成像平面上,原点在光轴与成像平面的交点(也就是图像中心)。

这里有个关键点:相机坐标系里的三维点,通过透视投影,会落到图像坐标系上。这个投影过程,就是小孔成像模型的数学表达。

4. 像素坐标系

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

图像坐标系和像素坐标系之间,只差一个缩放和平移。说白了,就是把物理尺寸(毫米)转换成离散的像素坐标。

一句话总结:世界坐标系→相机坐标系(刚体变换)→图像坐标系(透视投影)→像素坐标系(离散化)。

坐标系转换公式

搞清楚了四个坐标系,接下来就是它们之间的数学关系。这部分公式是核心,我建议你亲手推导一遍。

世界坐标系 → 相机坐标系

这是一个刚体变换,包含旋转和平移。公式如下:

Xc = R * Xw + T

其中:

  • Xc 是相机坐标系下的坐标
  • Xw 是世界坐标系下的坐标
  • R 是3x3旋转矩阵
  • T 是3x1平移向量

R和T合起来,就是相机的外参。外参描述了摄像头在世界坐标系中的位置和朝向。

相机坐标系 → 图像坐标系

这是透视投影,利用相似三角形原理:

x = f * Xc / Zc
y = f * Yc / Zc

其中f是焦距,(x,y)是图像坐标系下的坐标。注意,这里Zc不能为0,否则投影无意义。

图像坐标系 → 像素坐标系

这是一个仿射变换,加上一个偏移:

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

其中dx、dy是每个像素的物理尺寸,u0、v0是图像中心在像素坐标系中的坐标。

我的经验:在实际项目中,我们通常把上面三步合并成一个矩阵乘法,也就是相机内参矩阵K。K包含了焦距、像素尺寸、主点偏移等信息。这样做的好处是,一次矩阵运算就能完成从相机坐标系到像素坐标系的转换。

外参与内参详解

外参和内参,是理解相机模型的两把钥匙。我分别说说。

外参(Extrinsic Parameters)

外参描述的是摄像头在世界坐标系中的位姿。它包含:

  • 旋转矩阵R:3x3,表示摄像头相对于世界坐标系的旋转
  • 平移向量T:3x1,表示摄像头光心在世界坐标系中的位置

外参的物理意义很直观:你把摄像头放在哪里,朝哪个方向看。在BEV感知中,外参的标定精度直接影响鸟瞰图的拼接效果。

避坑指南:我曾经在项目里遇到过外参标定不准导致车道线错位的问题。后来发现是旋转矩阵的欧拉角顺序搞错了。不同库(比如OpenCV和MATLAB)对旋转顺序的定义可能不同,一定要确认清楚。

内参(Intrinsic Parameters)

内参描述的是摄像头本身的内部几何特性。它包含:

  • 焦距fx, fy:单位是像素,通常fx和fy很接近
  • 主点u0, v0:图像中心在像素坐标系中的坐标
  • 畸变参数:径向畸变(k1,k2,k3)和切向畸变(p1,p2)

内参矩阵K通常写成:

K = [[fx, 0, u0],
     [0, fy, v0],
     [0,  0,  1]]

内参是摄像头出厂时就确定的,但实际使用中会因为温度、震动等因素发生微小变化。所以,定期标定内参是个好习惯。

注意:畸变校正必须在投影之前完成。否则,你得到的像素坐标会带有畸变误差,导致BEV视角下的物体位置偏移。我见过有人跳过畸变校正直接做投影,结果车辆位置偏差了半米多。

知识体系结构图

下面这张图,把整个坐标系转换的流程串起来了。你可以把它当作一个“路线图”。

世界坐标系 相机坐标系 图像坐标系 像素坐标系 外参(R,T) 透视投影 离散化 内参矩阵K 图:坐标系转换流程(外参决定“在哪看”,内参决定“怎么看”)

实际项目中的坑与技巧

理论说完了,聊聊实战中容易踩的坑。

  • 坐标系方向:不同传感器(摄像头、激光雷达、IMU)的坐标系定义可能不同。比如,有的把Z轴朝前,有的朝上。做融合时,必须先统一到同一个坐标系下。
  • 畸变校正顺序:一定要先做畸变校正,再做投影。顺序反了,结果全错。
  • 外参标定精度:外参的微小误差,在远距离处会被放大。比如,一个0.1度的角度误差,在50米外会导致约8.7厘米的位置偏差。所以,标定板要尽量大,覆盖整个视野。
  • 内参稳定性:摄像头内参不是一成不变的。温度变化、镜头松动都可能导致内参漂移。我建议每3-6个月重新标定一次内参。

一个小技巧:在代码里,我习惯用齐次坐标来表示所有变换。这样,旋转和平移可以合并成一个4x4矩阵,一次乘法搞定。既简洁又高效。

好了,坐标系与空间变换的基础就讲到这里。这部分内容虽然偏理论,但它是BEV感知的基石。你想想看,如果连摄像头怎么“看”世界都没搞懂,后面做BEV特征提取、目标检测,那不就成了空中楼阁吗?