坐标系基础:世界坐标系、车辆坐标系、传感器坐标系、坐标系转换

各位同学,今天我们来聊聊坐标系。说实话,我刚入行那会儿,觉得坐标系不就是个数学概念嘛,有啥好学的?直到第一次做传感器融合,发现雷达和摄像头报的目标位置差了十万八千里……嗯,从那以后,我再也不敢小看坐标系了。

坐标系是整个传感器融合与标定的地基。地基不稳,上层建筑再漂亮也是白搭。今天我就把这几个坐标系和它们之间的转换关系,掰开了揉碎了讲清楚。

一、世界坐标系:一切测量的起点

世界坐标系,说白了就是一个固定的参考系。它不随车辆移动而改变,就像我们平时说的「东经北纬」一样,是个绝对位置。

在车载系统中,世界坐标系通常用 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)

我的建议: 在代码里,尽量用四元数做内部计算,只在人机交互时转成欧拉角显示。这样既避免了万向锁,又方便调试。

五、知识体系总览

下面这张图,是我自己总结的坐标系知识体系。你看一眼,就能明白今天讲的内容是怎么串起来的。

坐标系基础 - 知识体系 世界坐标系 (WCS) 车辆坐标系 (VCS) 传感器坐标系 (SCS) 坐标系转换方法 欧拉角 Yaw / Pitch / Roll 旋转矩阵 3×3 正交矩阵 四元数 w + xi + yj + zk ⚠️ 注意事项 万向锁 | 旋转顺序 | 坐标系原点定义 | 单位统一

六、实际项目中的坐标系转换流程

在项目中,我一般按这个流程做坐标系转换:

  1. 确认各传感器坐标系定义:拿到传感器手册,看清楚X/Y/Z轴方向
  2. 测量安装位置:用激光测距仪或标定板,测量传感器在车辆坐标系下的位置和姿态
  3. 构建转换矩阵:根据位置和姿态,构建4×4的齐次变换矩阵
  4. 数据转换:将传感器数据乘以变换矩阵,得到车辆坐标系下的数据
  5. 验证:用已知位置的目标做验证,确保转换误差在允许范围内

避坑指南: 我曾经在标定激光雷达时,发现转换后的点云总是有偏移。排查了两天,最后发现是安装支架有0.5°的倾斜。从那以后,我每次标定都会先用水平仪检查安装平面。

七、总结

坐标系这东西,说难不难,说简单也不简单。关键是要理解每个坐标系的意义,以及它们之间的转换关系。我个人觉得,只要掌握了欧拉角和四元数,大部分场景都能应付。

最后送大家一句话:坐标系转换做不好,传感器融合就是空中楼阁。 希望今天的分享对你有帮助。


专注资料整理