2. 坐标系与变换基础:世界坐标系、相机坐标系、IMU坐标系、刚体变换与李群李代数

做传感器融合,说白了就是跟坐标系打交道。你想想看,激光雷达扫出来的点云是在雷达自己的坐标系里,IMU 报的加速度和角速度是在 IMU 本体坐标系里,相机拍到的像素是在图像坐标系里。这些数据要融合到一起,第一步就是得把它们对齐到同一个参考系下。

我个人习惯把坐标系比作「语言」。每个传感器都在说自己的方言,你要做的是当个翻译官,让它们用普通话交流。这个「普通话」,就是世界坐标系。

2.1 四大核心坐标系

先搞清楚我们日常打交道的几个坐标系长什么样。

坐标系 原点位置 轴定义(右手系) 典型用途
世界坐标系 人为选定(如第一帧位置) Z 轴朝上(ENU)或朝下(NED) 全局定位、地图构建
相机坐标系 相机光心 Z 轴指向拍摄方向,X 向右,Y 向下 视觉 SLAM、3D 重建
IMU 坐标系 IMU 芯片中心 X 前,Y 左,Z 上(常见) 惯性导航、姿态估计
车身/机器人坐标系 车辆后轴中心或机器人质心 X 前,Y 左,Z 上 运动控制、路径规划

这里有个坑,我刚开始做项目时踩过。IMU 的坐标系定义各家厂商不一样。有的把 Z 轴朝上,有的朝下。你拿到一个 IMU 数据手册,第一件事就是看它的轴定义,别想当然。

2.2 刚体变换:旋转 + 平移

把一个坐标系下的点变换到另一个坐标系下,数学上就是刚体变换。它由两部分组成:旋转和平移。

公式很简单:

P_w = R * P_c + t

其中 P_w 是世界坐标系下的点,P_c 是相机坐标系下的点,R 是旋转矩阵,t 是平移向量。

旋转矩阵 R 是 3x3 的正交矩阵,行列式为 +1。它有 9 个元素,但自由度只有 3。说白了,你只需要 3 个参数就能描述一个旋转——比如欧拉角(横滚、俯仰、偏航)。

欧拉角警告: 欧拉角有万向锁问题。当俯仰角接近 ±90° 时,横滚和偏航会耦合,丢失一个自由度。我在做无人机飞控时遇到过这个问题,飞机大角度俯冲时姿态解算直接崩了。后来全部改用四元数或旋转矩阵。

2.3 齐次坐标与变换矩阵

为了把旋转和平移写成一个矩阵,我们引入齐次坐标。把三维点 (x, y, z) 扩展成 (x, y, z, 1)。

变换矩阵 T 是 4x4 的:

T = [ R  t ]
    [ 0  1 ]

这样,一次变换就变成了矩阵乘法:

P_w_homo = T * P_c_homo

我个人习惯把所有传感器到车身的变换都写成 4x4 矩阵,存成一个配置文件。标定的时候只需要更新这个矩阵里的数值,代码逻辑不用动。

2.4 李群与李代数:为什么需要它?

你可能会问:旋转矩阵不是挺好的吗?为什么还要搞什么李群李代数?

原因很简单:优化。

旋转矩阵有正交约束(R * R^T = I),你不能直接对它做加法。比如 R1 + R2 大概率不是一个合法的旋转矩阵。但在优化问题里,我们经常需要求导、迭代更新。

李群和李代数就是来解决这个问题的。

  • SO(3):三维旋转群,元素是旋转矩阵。
  • se(3):三维旋转的李代数,元素是 3 维向量(其实就是旋转轴乘以角度)。
  • SE(3):三维刚体变换群,元素是 4x4 变换矩阵。
  • se(3):三维刚体变换的李代数,元素是 6 维向量(平移 + 旋转)。

李代数是一个向量空间,你可以直接对它做加法、求导。然后通过指数映射回到李群。

R = exp(φ^)    // 从李代数到李群
φ = log(R)     // 从李群到李代数

其中 φ 是 3 维向量,φ^ 是它的反对称矩阵。

核心思想: 在优化时,我们在李代数上做增量更新,然后映射回李群。这样既保证了约束,又方便求导。

2.5 实战中的坐标系变换链

在一个典型的自动驾驶或机器人系统中,坐标系变换链是这样的:

  1. 传感器原始数据:在各自坐标系下(雷达点云、IMU 加速度、相机像素)。
  2. 传感器到车身:通过外参标定得到 T_sensor_to_body。
  3. 车身到世界:通过定位模块(如 GPS+IMU 融合)得到 T_body_to_world。
  4. 传感器到世界:T_sensor_to_world = T_body_to_world * T_sensor_to_body。

我曾经在一个项目中,激光雷达和相机的外参标定差了 2 厘米。结果点云投影到图像上总是偏了几个像素。找了三天 bug,最后发现是标定板角点提取时有一个像素级的系统误差。嗯,标定这件事,细节决定成败。

2.6 知识结构图

下面这张图总结了本章的核心知识点和它们之间的关系:

坐标系与变换基础 — 知识结构 世界坐标系 相机坐标系 IMU 坐标系 车身/机器人坐标系 刚体变换:P' = R * P + t 齐次坐标:T = [R t; 0 1] 李群 SO(3) / SE(3) ↔ 李代数 so(3) / se(3) 指数映射 exp(φ^) → R   |   对数映射 log(R) → φ 优化:李代数上求导 → 增量更新 → 映射回李群 避免万向锁 无约束优化
我的建议: 刚开始学的时候,先把旋转矩阵和齐次坐标搞熟。李群李代数可以先理解概念,用到优化时再深入。别一上来就啃李代数,容易劝退。

2.7 常见坐标系约定

不同领域对坐标系的定义有差异。做融合时一定要确认好约定,否则数据对齐全是错的。

领域 常用坐标系 Z 轴方向 备注
自动驾驶 ENU(东-北-天) 向上 与 GPS 经纬度对齐方便
无人机 NED(北-东-地) 向下 与飞控惯导对齐
机器人 FLU(前-左-上) 向上 ROS 默认约定
计算机视觉 RDF(右-下-前) 指向场景 OpenCV 相机坐标系

我记得有一次做车路协同项目,路侧激光雷达用的是 ENU,车端用的是 FLU。两个坐标系差了 90 度旋转。一开始没注意,融合出来的轨迹直接飞到了天上。嗯,坐标系约定这种事,提前对齐比事后 debug 省心一万倍。