坐标系基础:为什么感知系统需要坐标变换?

做感知的人,天天跟坐标系打交道。我刚开始入行时,觉得坐标变换不就是乘几个矩阵嘛,有啥难的?结果第一次联调就被狠狠上了一课——激光雷达检测到的障碍物,投影到图像上差了十几个像素,车的位置完全对不上。

说白了,感知系统就像一个人,有眼睛(相机)、有耳朵(毫米波雷达)、有触觉(激光雷达)。每个传感器都有自己的"视角",看到的都是局部信息。要让它们协同工作,就必须有一个统一的"语言"——坐标系。

为什么需要坐标变换?

你想想看,一辆自动驾驶车上,至少装了这些传感器:

  • 前视相机:看到的是2D图像,像素坐标(u, v)
  • 激光雷达:返回的是3D点云,极坐标(ρ, θ, φ)或直角坐标(x, y, z)
  • 毫米波雷达:给出目标距离、速度、角度
  • GPS/IMU:提供全球位置和姿态

这些数据格式完全不同,参考系也各不相同。如果不做坐标变换,你根本没法回答一个最基本的问题:"相机里看到的那个行人,在激光雷达点云里对应哪个点?"

核心结论:坐标变换是感知融合的基石。没有统一的坐标系,多传感器融合就是一句空话。

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

我习惯把感知系统涉及的坐标系分成四层,从大到小排列:

1. 全局坐标系(World Coordinate System)

也叫世界坐标系。它是个绝对参考系,通常用经纬度+海拔,或者UTM坐标。全局坐标系的作用是:

  • 告诉车"我在哪"——定位
  • 告诉车"要去哪"——导航
  • 让多辆车共享信息——V2X

我记得有一次做高精地图融合,发现两辆车对同一个红绿灯的定位差了2米。查了半天,原来是其中一辆车的GPS坐标系用了WGS84,另一辆用了CGCS2000。嗯,坐标系选型没统一,后面全是坑。

2. 车身坐标系(Vehicle Coordinate System)

这是感知系统的"主场"。车身坐标系的原点通常在后轴中心或车辆质心,遵循ISO 8855标准:

  • X轴:车头方向(前进方向)
  • Y轴:车身左侧
  • Z轴:车顶方向(向上)

我的习惯:项目中统一用后轴中心作为车身坐标系原点。为什么?因为车辆运动学模型(比如阿克曼模型)都是基于后轴中心计算的,这样坐标变换更自然。

3. 传感器坐标系(Sensor Coordinate System)

每个传感器都有自己的"小天地":

传感器 坐标系定义 常见原点
相机 相机光心为原点,Z轴指向拍摄方向,X轴向右,Y轴向下 光学中心
激光雷达 旋转中心为原点,通常X轴向前,Y轴向左,Z轴向上 激光发射器中心
毫米波雷达 天线中心为原点,Z轴指向车头,X轴向右,Y轴向上 天线阵列中心

这里有个容易搞混的地方——相机坐标系。很多教材说相机Z轴向前,但实际工程中,不同相机厂商的定义可能不一样。我踩过这个坑:某款相机的坐标系是Y轴向前,Z轴向上,跟标准定义差了90度。如果不仔细看手册,投影结果全乱套。

4. 像素坐标系(Pixel Coordinate System)

这个只属于相机。原点在图像左上角,u轴向右,v轴向下。它是2D的,单位是像素。

从传感器坐标系到像素坐标系,中间还隔着图像坐标系(物理单位,如毫米)。完整的链路是:

传感器坐标系 → 相机坐标系 → 图像坐标系 → 像素坐标系

坐标系之间的关系

说白了,坐标变换就是回答三个问题:

  1. 传感器相对于车身在哪?——外参(平移+旋转)
  2. 传感器内部怎么映射?——内参(焦距、畸变等)
  3. 车身相对于全局在哪?——定位(GPS/IMU/里程计)

用一张图来表示它们的关系:

全局坐标系 车身坐标系 激光雷达坐标系 相机坐标系 毫米波雷达坐标系 像素坐标系 定位(GPS/IMU) 外参(平移+旋转) 内参(投影) 注:箭头方向表示数据流动方向 每个箭头背后都是一组变换矩阵

坐标变换的数学本质

坐标变换说白了就是矩阵乘法。一个3D点从传感器坐标系变换到车身坐标系:

P_vehicle = R * P_sensor + T

其中:

  • R:3×3旋转矩阵(描述朝向)
  • T:3×1平移向量(描述位置)
  • P_sensor:传感器坐标系下的点
  • P_vehicle:车身坐标系下的点

如果写成齐次坐标形式,更简洁:

| P_vehicle |   =   | R  T |   *   | P_sensor |
|    1      |       | 0  1 |       |    1     |

注意:旋转矩阵必须是正交矩阵,即R^T * R = I。我曾经遇到过标定程序输出的R不满足正交性,导致点云投影后出现扭曲。检查方法很简单:计算R * R^T,看是不是单位矩阵。

一个真实案例

去年做的一个项目,需要把激光雷达检测到的障碍物投影到环视图像上。问题来了:

  • 激光雷达坐标系:X向前,Y向左,Z向上
  • 环视相机坐标系:Z向前,X向右,Y向下

这两个坐标系之间差了90度旋转。我一开始直接用标定文件里的外参矩阵,结果投影点全跑到图像外面去了。

排查了半天,发现是标定文件里的旋转矩阵定义跟代码里用的不一致——标定文件用的是欧拉角(ZYX顺序),而代码里默认是XYZ顺序。这就是典型的"坐标系约定不一致"的坑。

我的建议:项目一开始就定好坐标系规范,包括:

  • 每个传感器的坐标系定义(画图存档)
  • 旋转矩阵的表示方式(欧拉角/四元数/旋转矩阵)
  • 欧拉角的旋转顺序(ZYX还是XYZ)
  • 平移向量的单位(米还是毫米)

把这些写进团队的开发规范文档里,能省掉后面80%的联调时间。

小结

坐标系变换是感知系统的"通用语言"。没有它,激光雷达说"前方5米有障碍物",相机说"图像中心有个行人",这两句话永远对不上。

记住三个关键点:

  1. 统一参考系:所有传感器数据最终都要变换到车身坐标系或全局坐标系
  2. 标定是前提:外参和内参的精度直接决定变换的准确性
  3. 约定要一致:坐标系定义、旋转顺序、单位,这些细节决定了联调能不能顺利通过

下一节我们会深入讲旋转矩阵、欧拉角和四元数——这些是坐标变换的"硬核"部分。嗯,到时候我会分享一些手算矩阵的小技巧,保证实用。


可可精品资料库