坐标系基础:为什么感知系统需要坐标变换?
做感知的人,天天跟坐标系打交道。我刚开始入行时,觉得坐标变换不就是乘几个矩阵嘛,有啥难的?结果第一次联调就被狠狠上了一课——激光雷达检测到的障碍物,投影到图像上差了十几个像素,车的位置完全对不上。
说白了,感知系统就像一个人,有眼睛(相机)、有耳朵(毫米波雷达)、有触觉(激光雷达)。每个传感器都有自己的"视角",看到的都是局部信息。要让它们协同工作,就必须有一个统一的"语言"——坐标系。
为什么需要坐标变换?
你想想看,一辆自动驾驶车上,至少装了这些传感器:
- 前视相机:看到的是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的,单位是像素。
从传感器坐标系到像素坐标系,中间还隔着图像坐标系(物理单位,如毫米)。完整的链路是:
传感器坐标系 → 相机坐标系 → 图像坐标系 → 像素坐标系
坐标系之间的关系
说白了,坐标变换就是回答三个问题:
- 传感器相对于车身在哪?——外参(平移+旋转)
- 传感器内部怎么映射?——内参(焦距、畸变等)
- 车身相对于全局在哪?——定位(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米有障碍物",相机说"图像中心有个行人",这两句话永远对不上。
记住三个关键点:
- 统一参考系:所有传感器数据最终都要变换到车身坐标系或全局坐标系
- 标定是前提:外参和内参的精度直接决定变换的准确性
- 约定要一致:坐标系定义、旋转顺序、单位,这些细节决定了联调能不能顺利通过
下一节我们会深入讲旋转矩阵、欧拉角和四元数——这些是坐标变换的"硬核"部分。嗯,到时候我会分享一些手算矩阵的小技巧,保证实用。
可可精品资料库