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前的激光点云——这融合出来的结果,你敢信吗?
时间同步分两个层面:
- 硬件同步:用PPS(秒脉冲)信号对齐所有传感器的采样时刻。
- 软件同步:在算法层面对齐时间戳,做插值或外推。
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 坐标系转换实战:从传感器到全局
好了,理论讲完了,咱们来点实际的。
假设你有一个激光雷达点云,要投影到全局地图里。步骤是这样的:
- 点云从激光雷达坐标系转到车体坐标系(用外参标定结果)。
- 车体坐标系转到ENU局部坐标系(用当前位姿)。
- ENU转到ECEF(用参考点的经纬高)。
- 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 本章知识体系
下面这张图,是我自己总结的坐标系与时空基准的核心逻辑。你照着这个思路搭系统,基本不会出大问题。
嗯,这张图我画了好几次才满意。你把它存下来,做系统设计时对照着看,能少走很多弯路。
最后提醒一句:坐标系和时间同步,是融合定位的「地基」。地基没打好,上面盖多漂亮的房子都得塌。我见过太多团队在这上面栽跟头,希望你不是下一个。
公众号:蓝海资料掘金营,微信deep3321