2、坐标系与空间变换:车辆坐标系、相机坐标系、图像坐标系、世界坐标系之间的转换关系,外参内参标定基础。

好,咱们进入第二章。这一章可以说是BEV感知的“地基”。

你想想看,BEV模型要做的,就是把多个相机看到的2D图像,融合到一张俯视图里。这中间最核心的问题是什么?

就是坐标变换。

说白了,你得知道图像里的那个像素点,在真实世界里到底在哪儿。反过来,你也得知道真实世界里的一个点,会落在相机的哪个像素上。

我刚开始接触BEV时,就被这堆坐标系搞得晕头转向。后来发现,只要理清了它们之间的“亲戚关系”,一切就豁然开朗了。

2.1 四大坐标系,一个都不能少

在自动驾驶里,我们主要跟四个坐标系打交道。我习惯把它们分成“两对”:

  • 世界坐标系 (World Coordinate System):这是绝对的“老大哥”。它是一个固定的参考系,用来描述所有物体在真实世界中的位置。比如,你给车上的GPS定位,得到的就是世界坐标(通常是经纬度,或者UTM坐标)。
  • 车辆坐标系 (Vehicle Coordinate System):这是以车为原点的“小老弟”。通常原点在车辆后轴中心,X轴朝前,Y轴朝左,Z轴朝上。BEV的俯视图,本质上就是车辆坐标系下的一个局部地图。
  • 相机坐标系 (Camera Coordinate System):这是以相机光心为原点的“观察者”。Z轴指向相机前方(也就是镜头朝向),X轴朝右,Y轴朝下。嗯,这里要注意,相机坐标系的Y轴是向下的,跟车辆坐标系不一样。
  • 图像坐标系 (Image Coordinate System):这是最终的“画布”。它是一个2D平面,原点在图像左上角,U轴朝右,V轴朝下。我们看到的每一个像素,都活在这个坐标系里。

核心思路: 整个空间变换,就是一条“流水线”。从世界坐标 → 车辆坐标 → 相机坐标 → 图像坐标。反过来,就是“逆透视变换”,从图像坐标反推回世界坐标。

2.2 外参:把车和相机“绑”在一起

外参(Extrinsic Parameters)解决的是“相机在哪儿,朝哪儿看”的问题。

它描述的是相机坐标系相对于车辆坐标系(或者世界坐标系)的位姿。说白了,就是相机装在了车上的哪个位置,以及它有没有歪。

外参由一个旋转矩阵 R 和一个平移向量 t 组成。数学上,把一个点从车辆坐标系 Pv 变换到相机坐标系 Pc,公式是:

Pc = R * Pv + t

我在项目中遇到过一个问题:一辆车的环视相机,因为安装支架的微小公差,导致四个相机的视野拼接处出现了明显的“错位”。

后来排查发现,就是外参标定不够准。一个几毫米的平移误差,在10米外就会变成几十厘米的偏差。这在BEV感知里是致命的。

我的习惯: 外参标定通常用“棋盘格法”或“工厂标定间”。标定完成后,一定要做一次“重投影验证”——把标定板角点的世界坐标,通过外参投影回图像,看看跟实际像素位置的误差。误差小于1个像素,才算合格。

2.3 内参:相机的“眼睛”是怎么看世界的

内参(Intrinsic Parameters)描述的是相机本身的“光学特性”。它决定了从相机坐标系图像坐标系的映射关系。

内参矩阵 K 通常长这样:

K = [fx,  0, cx;
     0,  fy, cy;
     0,   0,  1]
  • fx, fy:焦距,单位是像素。它决定了物体在图像里有多大。
  • cx, cy:主点偏移,也就是光轴与图像平面的交点。通常靠近图像中心。

内参还有一个重要的东西——畸变系数。因为镜头不是完美的,会产生径向畸变(比如鱼眼镜头)和切向畸变(比如镜头装歪了)。

我曾经调试过一个模型,发现远处的车辆检测框总是偏左。折腾了半天,最后发现是内参标定没做畸变矫正。矫正之后,一切恢复正常。

注意: 内参是相机的“出厂属性”,理论上不会变。但如果你换了镜头、或者相机受过剧烈震动,内参就需要重新标定。我建议每半年或一万公里,做一次内参复检。

2.4 从像素到世界:完整的变换链条

好了,我们把所有环节串起来。假设你有一个图像上的像素点 (u, v),你想知道它在车辆坐标系下的位置 (Xv, Yv, Zv)

  1. 去畸变:先把像素坐标 (u, v) 通过内参的畸变系数,矫正成无畸变的像素坐标 (u', v')。
  2. 归一化平面:利用内参矩阵 K 的逆,把像素坐标转换到相机坐标系下的归一化平面 (xc, yc, 1)。这个平面距离相机光心是1米。
  3. 逆外参变换:利用外参的逆矩阵 R-1-t,把归一化平面上的点,从相机坐标系变换到车辆坐标系。但这里有个问题——我们不知道深度 Zc
  4. 假设地面高度:在BEV感知中,我们通常假设目标点在地面上,即 Zv = 0。然后通过解方程,反推出深度 Zc,最终得到 (Xv, Yv, 0)

这个“假设地面高度”的步骤,就是BEV模型里常说的IPM(逆透视映射)。说白了,就是利用“地面是平的”这个先验知识,把图像上的点“投影”到地面上。

关键点: 整个变换链条中,最脆弱的一环就是“地面假设”。如果路面有坡度、或者车辆颠簸,这个假设就不成立了。所以,很多高级的BEV模型会引入“可变形注意力”机制,不再依赖严格的几何投影,而是让模型自己学习如何从图像特征映射到BEV空间。

2.5 标定基础:怎么拿到这些参数?

标定,就是求解外参和内参的过程。我把它分为两类:

  • 离线标定:在实验室或工厂里,用标定板(棋盘格、AprilTag等)进行。精度高,但操作麻烦。适合量产前的“一次标定”。
  • 在线标定:车辆在路上跑的时候,利用SLAM或视觉特征点,实时估计外参的变化。精度稍低,但能应对“长期使用后的微小偏移”。

我记得有一次,客户反馈说车辆在行驶一段时间后,BEV的拼接效果变差了。我们排查后发现,是后视摄像头因为洗车时的高压水枪冲击,发生了微小的位移。从那以后,我就在系统里加了一个“在线外参监测”模块,一旦发现重投影误差超过阈值,就报警提示重新标定。

标定小技巧: 如果你用的是OpenCV的标定函数,记得把标定板的图片拍得“丰富”一些。多角度、多距离、多位置。我一般会拍30-50张,覆盖整个视野范围。太少的话,标定结果容易过拟合。

2.6 总结与思考

这一章的内容,说白了就是一句话:坐标系变换是BEV感知的数学基础,外参和内参是连接图像与世界的桥梁。

你可能会觉得这些公式有点枯燥。但相信我,当你真正动手去写一个BEV模型的预处理代码时,你会发现,90%的bug都出在坐标变换上。要么是坐标系搞反了,要么是畸变没矫正,要么是外参的旋转矩阵写错了。

嗯,这里要提醒你:一定要养成“可视化验证”的习惯。每次做完坐标变换,都把结果画出来看看。比如,把车辆坐标系下的点云,投影到图像上,看看是否对齐。这一步能帮你省下大量的调试时间。

下一章,我们会聊到“相机模型与图像特征提取”。到时候,你会看到这些坐标系知识是如何被应用到具体的网络结构中的。