坐标系基础:世界坐标系、车辆坐标系、传感器坐标系、坐标系转换
各位同学,今天我们来聊聊坐标系。说实话,我刚入行那会儿,觉得坐标系不就是个数学概念嘛,有啥好学的?直到第一次做传感器融合,发现雷达和摄像头报的目标位置差了十万八千里……嗯,从那以后,我再也不敢小看坐标系了。
坐标系是整个传感器融合与标定的地基。地基不稳,上层建筑再漂亮也是白搭。今天我就把这几个坐标系和它们之间的转换关系,掰开了揉碎了讲清楚。
一、世界坐标系:一切测量的起点
世界坐标系,说白了就是一个固定的参考系。它不随车辆移动而改变,就像我们平时说的「东经北纬」一样,是个绝对位置。
在车载系统中,世界坐标系通常用 WCS(World Coordinate System) 表示。一般遵循右手定则:
- X轴:指向正东
- Y轴:指向正北
- Z轴:指向天空(垂直于地面向上)
为什么这么定义?因为大多数地图和GPS数据都采用这个约定。你想想看,如果每家车企都用自己的世界坐标系,那地图数据就没法互通了。
实际项目中的坑: 我记得有一次,供应商给的GPS数据用的是WGS84经纬度,而我们内部用的是UTM投影坐标系。两者差了将近50米!后来我加了一个坐标转换模块,才把这个问题解决掉。
二、车辆坐标系:以车为本的视角
车辆坐标系 VCS(Vehicle Coordinate System) 是固定在车身上的。它随着车辆一起运动,描述的是「相对于车」的位置关系。
标准定义(ISO 8855):
- X轴:指向车辆前进方向
- Y轴:指向车辆左侧(注意,有些标准指向右侧)
- Z轴:指向车顶方向
原点通常放在车辆后轴中心,或者质心位置。我个人习惯放在后轴中心,因为这样计算运动学模型时更方便。
小技巧: 做标定时,一定要确认车辆坐标系的原点位置。不同车企定义不同,有的放在前保险杠,有的放在GPS天线处。我曾经因为没确认原点位置,导致融合结果偏差了30厘米。
三、传感器坐标系:每个传感器都有自己的「小世界」
每个传感器都有自己的坐标系 SCS(Sensor Coordinate System)。比如:
| 传感器类型 | X轴方向 | Y轴方向 | Z轴方向 |
|---|---|---|---|
| 摄像头 | 镜头指向方向 | 图像水平方向 | 图像垂直方向 |
| 激光雷达 | 扫描正前方 | 左侧方向 | 垂直向上 |
| 毫米波雷达 | 天线法线方向 | 水平方向 | 垂直方向 |
| IMU | 前进方向 | 左侧方向 | 垂直向上 |
这里有个关键点:每个传感器的坐标系定义可能完全不同。比如摄像头,它的Z轴是朝前的(指向拍摄方向),而车辆坐标系的Z轴是朝上的。这就涉及到坐标系转换了。
四、坐标系转换:把不同「语言」翻译成同一门语言
坐标系转换,说白了就是把传感器测到的数据,换算到车辆坐标系或世界坐标系下。常用的转换方法有三种:欧拉角、旋转矩阵、四元数。
4.1 欧拉角:最直观,但有坑
欧拉角用三个角度来描述旋转:偏航角(Yaw)、俯仰角(Pitch)、横滚角(Roll)。
- Yaw(ψ):绕Z轴旋转,像摇头
- Pitch(θ):绕Y轴旋转,像点头
- Roll(φ):绕X轴旋转,像歪头
⚠️ 万向锁问题: 当Pitch接近±90°时,Yaw和Roll会失去一个自由度。这就是著名的「万向锁」。我在做无人机姿态解算时遇到过这个问题,后来果断换成了四元数。
4.2 旋转矩阵:数学上最严谨
旋转矩阵是一个3×3的正交矩阵,满足 RT = R-1。绕三个轴的旋转矩阵分别为:
// 绕X轴旋转(Roll)
Rx(φ) = [1, 0, 0;
0, cosφ, -sinφ;
0, sinφ, cosφ]
// 绕Y轴旋转(Pitch)
Ry(θ) = [cosθ, 0, sinθ;
0, 1, 0;
-sinθ, 0, cosθ]
// 绕Z轴旋转(Yaw)
Rz(ψ) = [cosψ, -sinψ, 0;
sinψ, cosψ, 0;
0, 0, 1]
组合旋转时,顺序很重要。我习惯用 Z→Y→X 的顺序(即先Yaw,再Pitch,最后Roll)。
4.3 四元数:计算稳定,无万向锁
四元数用四个数表示旋转:q = [w, x, y, z],其中 w 是实部,[x, y, z] 是虚部。
为什么用四元数?因为它:
- 没有万向锁问题
- 插值平滑(SLERP)
- 计算效率高
欧拉角转四元数的公式:
w = cos(ψ/2)cos(θ/2)cos(φ/2) + sin(ψ/2)sin(θ/2)sin(φ/2)
x = cos(ψ/2)cos(θ/2)sin(φ/2) - sin(ψ/2)sin(θ/2)cos(φ/2)
y = cos(ψ/2)sin(θ/2)cos(φ/2) + sin(ψ/2)cos(θ/2)sin(φ/2)
z = sin(ψ/2)cos(θ/2)cos(φ/2) - cos(ψ/2)sin(θ/2)sin(φ/2)
我的建议: 在代码里,尽量用四元数做内部计算,只在人机交互时转成欧拉角显示。这样既避免了万向锁,又方便调试。
五、知识体系总览
下面这张图,是我自己总结的坐标系知识体系。你看一眼,就能明白今天讲的内容是怎么串起来的。
六、实际项目中的坐标系转换流程
在项目中,我一般按这个流程做坐标系转换:
- 确认各传感器坐标系定义:拿到传感器手册,看清楚X/Y/Z轴方向
- 测量安装位置:用激光测距仪或标定板,测量传感器在车辆坐标系下的位置和姿态
- 构建转换矩阵:根据位置和姿态,构建4×4的齐次变换矩阵
- 数据转换:将传感器数据乘以变换矩阵,得到车辆坐标系下的数据
- 验证:用已知位置的目标做验证,确保转换误差在允许范围内
避坑指南: 我曾经在标定激光雷达时,发现转换后的点云总是有偏移。排查了两天,最后发现是安装支架有0.5°的倾斜。从那以后,我每次标定都会先用水平仪检查安装平面。
七、总结
坐标系这东西,说难不难,说简单也不简单。关键是要理解每个坐标系的意义,以及它们之间的转换关系。我个人觉得,只要掌握了欧拉角和四元数,大部分场景都能应付。
最后送大家一句话:坐标系转换做不好,传感器融合就是空中楼阁。 希望今天的分享对你有帮助。