第2章:标定基础理论:坐标系定义与变换

各位同学,大家好。今天我们聊聊标定里最基础、也最容易搞混的东西——坐标系。

说实话,我刚入行那会儿,被这几个坐标系绕得晕头转向。相机坐标系、车辆坐标系、图像坐标系……每个项目都要重新捋一遍。后来我发现,搞懂它们之间的关系,标定就成功了一半。

2.1 车辆坐标系

先说说车辆坐标系。这是整个ADAS系统的“世界原点”。

我个人习惯用ISO 8855标准。简单来说:

  • X轴:指向车辆前方(正方向)
  • Y轴:指向车辆左侧(正方向)
  • Z轴:指向车辆上方(正方向)

嗯,这里要注意:不同车厂可能有自己的定义。比如有些用右手系,有些用左手系。我遇到过一家供应商,他们的坐标系Z轴朝下……结果融合数据时,高度值全是负的。排查了整整两天。

避坑指南: 我曾经在项目里吃过亏——车辆坐标系的原点位置也很关键。通常放在后轴中心,或者车辆质心。标定前一定要确认清楚,否则外参算出来全是错的。

2.2 相机坐标系

相机坐标系,说白了就是“以摄像头为原点”的坐标系。

它的定义是这样的:

  • X轴:指向相机右侧
  • Y轴:指向相机下方(注意,是下方!)
  • Z轴:指向相机前方(沿着光轴方向)

为什么Y轴朝下?因为图像坐标系的原点在左上角,Y轴朝下。这样从相机坐标系投影到图像坐标系时,符号不会乱。你想想看,如果Y轴朝上,投影时还得取反,多麻烦。

我记得有一次做环视标定,四个鱼眼相机的坐标系定义不一致。左前的相机Y轴朝下,右前的相机Y轴朝上……结果拼接出来的全景图,地面是扭曲的。后来我强制统一了定义,问题才解决。

2.3 图像坐标系

图像坐标系,就是像素的“地盘”。

它分两种:

  • 像素坐标系:以图像左上角为原点,u轴向右,v轴向下。单位是像素。
  • 物理坐标系:以图像中心(主点)为原点,x轴向右,y轴向下。单位是毫米。

两者之间就差一个平移和缩放。公式很简单:

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

其中dx、dy是每个像素的物理尺寸,u0、v0是主点坐标。

小技巧: 我建议你在代码里把像素坐标和物理坐标分开存储。混在一起容易出错。我曾经见过一个同事,直接把像素坐标当物理坐标用,结果投影出来的3D点全偏了。

2.4 内参与外参

好了,坐标系定义清楚了,接下来就是怎么把它们联系起来。这就涉及到内参和外参。

2.4.1 内参

内参,是相机本身的“性格”。它描述了从相机坐标系到图像坐标系的映射关系。

内参矩阵K长这样:

K = [fx  0  cx
     0  fy  cy
     0   0   1]

其中:

  • fx, fy:焦距(像素单位)
  • cx, cy:主点坐标(像素单位)

为什么会有两个焦距?因为像素不一定是正方形的。我遇到过一些工业相机,fx和fy能差5%以上。如果不校正,测距误差会很大。

内参还包括畸变系数。径向畸变(桶形/枕形)和切向畸变(镜头安装倾斜)。

核心要点: 内参是出厂就定死的,但会随温度、震动变化。我建议每半年重新标定一次内参。尤其是鱼眼相机,畸变变化更明显。

2.4.2 外参

外参,是相机在车辆坐标系里的“位置和姿态”。

它由旋转矩阵R和平移向量t组成:

P_vehicle = R * P_camera + t

说白了,就是把相机坐标系下的点,变换到车辆坐标系下。

旋转矩阵R有3个自由度(俯仰角、偏航角、翻滚角)。平移向量t有3个自由度(X、Y、Z)。一共6个自由度。

嗯,这里要注意:外参是动态的。车辆载重变化、轮胎气压变化,都会影响外参。我曾经在项目里发现,空载和满载时,相机俯仰角能差0.5度。对于100米外的目标,测距误差能到1米。

避坑指南: 我曾经吃过一个亏——外参标定完,没有做验证。结果上路测试,车道线投影全偏了。后来我养成了习惯:每次标定完,必须用已知距离的参照物做验证。

2.5 刚体变换与透视投影

这两个概念,是坐标系变换的“灵魂”。

2.5.1 刚体变换

刚体变换,就是物体在三维空间里“平移+旋转”,不改变形状和大小。

数学上,它用一个4x4的齐次变换矩阵表示:

T = [R  t
     0  1]

其中R是3x3旋转矩阵,t是3x1平移向量。

为什么用齐次坐标?因为可以把旋转和平移合并成一次矩阵乘法。方便,也容易求逆。

我个人习惯用欧拉角表示旋转,但要注意万向锁问题。如果你做连续旋转,建议用四元数。我在做IMU融合时,就吃过万向锁的亏——俯仰角到90度时,偏航角和翻滚角突然“跳变”。

2.5.2 透视投影

透视投影,就是把3D点“拍扁”到2D图像上。

公式很简单:

u = fx * X / Z + cx
v = fy * Y / Z + cy

注意,这里有个除法——除以Z。这就是为什么远处的物体看起来小,近处的看起来大。

你想想看,如果Z=0,公式就炸了。所以相机正前方的点(Z=0)是投影不出来的。这也是为什么标定板不能放在相机正前方。

小技巧: 我建议你在代码里先做刚体变换,再做透视投影。顺序不能乱。先投影再变换?那结果就是错的。因为投影会丢失深度信息,再变换就找不回来了。

2.6 总结

好了,这一章的内容就这些。我们来捋一下:

  • 车辆坐标系:世界原点,X前Y左Z上
  • 相机坐标系:X右Y下Z前
  • 图像坐标系:像素坐标和物理坐标
  • 内参:相机本身的焦距、主点、畸变
  • 外参:相机在车辆坐标系下的位置和姿态
  • 刚体变换:旋转+平移,用齐次矩阵
  • 透视投影:3D到2D,除以Z

下一章,我们聊聊具体的标定方法——怎么用标定板算出这些参数。到时候我会分享一些实战中的“骚操作”。

记住:坐标系搞清楚了,标定就成功了一半。别嫌基础,我见过太多工程师在这上面翻车了。