2. 坐标系与时空基准:全球坐标系、局部坐标系、时间同步机制与硬件触发方案

做多传感器融合,第一个绕不开的坑就是——坐标系。

我见过太多团队,算法调得漂漂亮亮,一上路就崩。查到最后,发现是IMU的坐标系定义跟GPS差了90度。嗯,这种问题,说白了就是基本功没打牢。

这一章,咱们把坐标系和时空基准彻底讲透。你想想看,传感器各自说各自的语言,你得先让它们说同一种话,才能谈融合对吧?

2.1 全球坐标系:你的车到底在哪儿

全球坐标系,就是给地球上的每个点一个唯一的地址。最常用的两个:WGS-84和ECEF。

  • WGS-84(经纬高):GPS直接输出的格式。纬度、经度、海拔高度。我习惯叫它「地理坐标」。
  • ECEF(地心地固系):原点在地球质心,X轴指向本初子午线与赤道交点,Z轴指向北极。说白了,就是一个三维直角坐标系。

核心要点:WGS-84适合给人看,ECEF适合给算法算。融合定位里,我们通常把GPS的经纬高转成ECEF再做处理。

我在项目中遇到过一件事:某次路测,定位结果在赤道附近精度还行,到了高纬度地区直接飘了。查了两天,发现是经纬高转ECEF时,曲率半径公式用错了。嗯,细节决定成败。

2.2 局部坐标系:你的车周围有什么

全球坐标系告诉你「车在地球上哪儿」,局部坐标系告诉你「车周围有什么」。

局部坐标系常见的有:

  • ENU(东-北-天):原点在载体位置,X向东,Y向北,Z朝天。这是自动驾驶里最常用的局部系。
  • 车体坐标系:原点在车辆后轴中心或IMU安装位置,X向前,Y向左,Z向上。传感器标定、控制都用这个。
  • 传感器坐标系:每个传感器自己的坐标系。比如激光雷达的X轴通常指向扫描方向。

你想想看,一个点云里的点,是在激光雷达坐标系下的。你要把它投影到全局地图里,中间要经过多少层变换?

我建议你画一张变换树:

全局坐标系 (ECEF/WGS-84)
  └── 局部ENU坐标系
       └── 车体坐标系
            ├── IMU坐标系
            ├── GPS天线坐标系
            ├── 激光雷达坐标系
            └── 相机坐标系

个人习惯:我会在代码里用一个TransformTree类来管理所有坐标系关系。每次新增传感器,只需要注册它的外参,剩下的自动计算。别手写变换矩阵,容易出错。

2.3 时间同步:所有传感器必须用同一个钟

坐标系对齐了,时间对不齐,照样白搭。

举个例子:你10ms前的GPS位置,配上20ms前的IMU数据,再配上30ms前的激光点云——这融合出来的结果,你敢信吗?

时间同步分两个层面:

  1. 硬件同步:用PPS(秒脉冲)信号对齐所有传感器的采样时刻。
  2. 软件同步:在算法层面对齐时间戳,做插值或外推。

2.3.1 硬件触发方案

我比较推荐的做法是:

  • GPS接收机输出PPS信号,同时输出UTC时间。
  • PPS信号接入主控的GPIO,触发中断。
  • 主控在中断里记录当前系统时间,并广播给所有传感器。
  • 传感器收到触发信号后,立即采集数据并打上时间戳。

注意:PPS信号本身有抖动,一般在几十纳秒级别。如果你用普通的GPIO中断,响应延迟可能到微秒级。对于高速运动场景(比如100km/h的车),1微秒的误差对应约0.028mm的位置误差——嗯,大多数场景下可以接受。

我曾经在一个项目中,IMU的采样率是200Hz,激光雷达是10Hz。硬件触发没做好,IMU的时间戳总是比激光雷达晚2-3ms。结果就是,车辆转弯时,IMU的角速度跟激光雷达的点云对不上,融合出来的姿态一直在抖。后来加了PPS同步,问题立刻解决。

2.3.2 软件时间同步

硬件同步不是万能的。有些传感器不支持外部触发,或者你用的是消费级设备。这时候就得靠软件了。

常用的方法:

  • 线性插值:假设两个传感器之间的时间偏移是常数,用最近的两个数据点插值。
  • 样条插值:精度更高,但计算量大。适合IMU这种高频数据。
  • 卡尔曼滤波的时间更新:在滤波框架里,直接用状态方程预测到目标时刻。
// 伪代码:线性插值示例
// 已知 t1 时刻的位姿 T1,t2 时刻的位姿 T2
// 求 t 时刻的位姿 T(t1 < t < t2)
double alpha = (t - t1) / (t2 - t1);
T.translation = (1 - alpha) * T1.translation + alpha * T2.translation;
T.rotation = slerp(T1.rotation, T2.rotation, alpha);

避坑指南:我曾经用线性插值处理IMU数据,结果在剧烈加速时误差很大。后来改用四阶龙格-库塔积分,精度提升了一个数量级。高频传感器,别省那点计算量。

2.4 坐标系转换实战:从传感器到全局

好了,理论讲完了,咱们来点实际的。

假设你有一个激光雷达点云,要投影到全局地图里。步骤是这样的:

  1. 点云从激光雷达坐标系转到车体坐标系(用外参标定结果)。
  2. 车体坐标系转到ENU局部坐标系(用当前位姿)。
  3. ENU转到ECEF(用参考点的经纬高)。
  4. ECEF转到WGS-84(如果需要给人看)。

每一步都是一个4x4的齐次变换矩阵。我建议你把所有变换矩阵缓存起来,别每次都重新算。

核心公式

P_global = T_global_local * T_local_vehicle * T_vehicle_sensor * P_sensor

其中 T_global_local 是ENU到ECEF的变换,T_local_vehicle 是车体位姿,T_vehicle_sensor 是传感器外参。

2.5 本章知识体系

下面这张图,是我自己总结的坐标系与时空基准的核心逻辑。你照着这个思路搭系统,基本不会出大问题。

坐标系与时空基准核心逻辑 传感器原始数据 GPS/IMU时间戳 PPS硬件触发 时间同步模块(硬件+软件) 坐标系转换链 传感器系 → 车体系 → ENU局部系 → ECEF → WGS-84 多传感器融合定位输出 注:时间同步和坐标系转换是融合定位的前置条件,缺一不可。

嗯,这张图我画了好几次才满意。你把它存下来,做系统设计时对照着看,能少走很多弯路。

最后提醒一句:坐标系和时间同步,是融合定位的「地基」。地基没打好,上面盖多漂亮的房子都得塌。我见过太多团队在这上面栽跟头,希望你不是下一个。


公众号:蓝海资料掘金营,微信deep3321