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):
- 去畸变:先把像素坐标 (u, v) 通过内参的畸变系数,矫正成无畸变的像素坐标 (u', v')。
- 归一化平面:利用内参矩阵 K 的逆,把像素坐标转换到相机坐标系下的归一化平面 (xc, yc, 1)。这个平面距离相机光心是1米。
- 逆外参变换:利用外参的逆矩阵 R-1 和 -t,把归一化平面上的点,从相机坐标系变换到车辆坐标系。但这里有个问题——我们不知道深度 Zc。
- 假设地面高度:在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都出在坐标变换上。要么是坐标系搞反了,要么是畸变没矫正,要么是外参的旋转矩阵写错了。
嗯,这里要提醒你:一定要养成“可视化验证”的习惯。每次做完坐标变换,都把结果画出来看看。比如,把车辆坐标系下的点云,投影到图像上,看看是否对齐。这一步能帮你省下大量的调试时间。
下一章,我们会聊到“相机模型与图像特征提取”。到时候,你会看到这些坐标系知识是如何被应用到具体的网络结构中的。