2. 坐标系基础:地理坐标系、车辆坐标系、传感器坐标系与转换原理
各位同学,欢迎来到第二讲。
这一讲,我们聊聊坐标系。说实话,坐标系这东西,刚入行时觉得它就是个数学概念,没什么大不了的。直到我第一次做多传感器融合,发现激光雷达和相机对同一个障碍物的位置描述差了半米多——嗯,那会儿我才真正意识到:坐标系,是所有感知数据的“语言”。语言不通,数据就是废的。
2.1 地理坐标系:WGS84 与 UTM
先说地理坐标系。高精地图里,我们最常用的就是 WGS84 和 UTM。
2.1.1 WGS84
WGS84 是个全球统一的大地坐标系。说白了,就是用经纬度来描述地球上任何一个点。GPS 直接输出的就是 WGS84 坐标。
但有个问题:经纬度是球面坐标,单位是度。你没法直接用米去算距离。比如,经度1度对应的地面距离,在赤道和北极是完全不同的。所以,WGS84 适合做全球定位,但不适合做局部计算。
关键点:WGS84 坐标是 (纬度, 经度, 海拔),单位是度、度、米。注意纬度在前,经度在后,别搞反了。我见过有人把经纬度写反,结果地图上的点跑到了另一个半球。
2.1.2 UTM
UTM 是通用横轴墨卡托投影。它把地球切成60个带,每个带6度宽,然后投影到平面上。这样,坐标就变成了 (东向, 北向),单位是米。
我个人习惯,在局部区域做融合时,优先用 UTM。为什么?因为它是平面坐标,加减乘除都方便。而且,UTM 的精度在带内可以做到厘米级,完全够用。
小技巧:如果你在做多传感器融合,建议先把所有传感器的 WGS84 数据转成 UTM,再去做后续计算。这样能省掉很多球面几何的麻烦。
2.2 车辆坐标系
车辆坐标系,是定义在车身上的坐标系。ISO 8855 标准里,车辆坐标系的原点通常在后轴中心,或者车辆质心。
- X轴:车辆前进方向为正
- Y轴:车辆左侧为正(注意,有些标准用右侧为正,要确认)
- Z轴:车辆上方为正
为什么用后轴中心?因为后轴是车辆转向的基准点。我记得有一次做泊车融合,用的质心做原点,结果转弯时车辆模型和实际轨迹差了十几厘米。后来改成后轴中心,问题就解决了。
避坑指南:我曾经遇到过,不同供应商给的车辆坐标系定义不一样。有的用 ISO 标准,有的用 SAE 标准。SAE 标准里 Y 轴是右侧为正。所以,拿到数据第一件事,先确认坐标系定义,别想当然。
2.3 传感器坐标系
每个传感器都有自己的坐标系。常见的几个:
2.3.1 相机坐标系
相机坐标系的原点在光心。Z 轴指向镜头前方,X 轴向右,Y 轴向下(图像坐标系里 Y 轴是向下的)。
这里有个容易混淆的点:相机坐标系和图像坐标系不一样。图像坐标系是二维的,单位是像素。相机坐标系是三维的,单位是米。两者之间通过内参矩阵转换。
2.3.2 激光雷达坐标系
激光雷达坐标系,原点在激光雷达的旋转中心。通常,X 轴指向车辆前方,Y 轴指向左侧,Z 轴向上。但不同厂家定义可能不同。比如,Velodyne 的坐标系和 Hesai 的就不完全一样。
2.3.3 IMU 坐标系
IMU 坐标系,原点在 IMU 芯片内部。X 轴指向车辆前方,Y 轴指向左侧,Z 轴向上。IMU 输出的是加速度和角速度,都是在自身坐标系下的。
重要提醒:传感器坐标系的原点位置,直接影响外参标定的结果。安装时,一定要记录传感器在车上的精确位置。我见过有人用“大概位置”做标定,结果融合出来的轨迹歪歪扭扭。
2.4 坐标系转换原理
坐标系转换,说白了就是“把一个点从一个坐标系搬到另一个坐标系”。核心是两步:旋转 + 平移。
2.4.1 旋转矩阵
旋转矩阵是一个 3x3 的正交矩阵。它描述了坐标系之间的旋转关系。比如,从相机坐标系转到车辆坐标系,就需要一个旋转矩阵 R。
// 绕 Z 轴旋转 θ 角的旋转矩阵
R_z(θ) = [
[cosθ, -sinθ, 0],
[sinθ, cosθ, 0],
[0, 0, 1]
]
实际项目中,我们很少手动算旋转矩阵。都是用标定工具,比如 Kalibr、LiDAR-Camera Calibration 工具,自动算出来。
2.4.2 平移向量
平移向量 t 是一个 3x1 的向量,表示两个坐标系原点之间的位移。
完整的转换公式:
P_vehicle = R * P_sensor + t
其中,P_sensor 是传感器坐标系下的点,P_vehicle 是车辆坐标系下的点。
2.4.3 齐次坐标与变换矩阵
为了把旋转和平移写成一个矩阵,我们引入齐次坐标。齐次坐标就是在三维坐标后面加一个 1,变成四维向量。
// 变换矩阵 T
T = [
[R, t],
[0, 1]
]
// 转换公式
P_vehicle_homo = T * P_sensor_homo
这样做的好处是,多个坐标系转换可以连乘。比如,从激光雷达到车辆,再到 UTM,可以写成:
P_utm = T_utm_vehicle * T_vehicle_lidar * P_lidar
个人经验:我习惯把所有外参都存成 4x4 的齐次变换矩阵。这样,不管多少个传感器,只要把矩阵连乘就行。代码写起来也干净。
2.5 实际项目中的坐标系管理
在自动驾驶系统中,坐标系管理是个大工程。我建议用树状结构来管理:
- 根节点:UTM 坐标系(或局部地图坐标系)
- 子节点:车辆坐标系
- 孙节点:各传感器坐标系
每个节点都存一个相对于父节点的变换矩阵。这样,任意两个坐标系之间的转换,只需要在树里找路径,然后连乘矩阵。
避坑指南:我曾经在一个项目里,发现融合结果有周期性抖动。查了两天,最后发现是 IMU 坐标系定义和车辆坐标系差了 90 度。因为安装时 IMU 没放正,但标定文件里没更新。所以,每次装完传感器,一定要重新标定,别偷懒。
2.6 总结
这一讲,我们聊了:
- WGS84 和 UTM 的区别与使用场景
- 车辆坐标系的定义和注意事项
- 相机、激光雷达、IMU 的传感器坐标系
- 坐标系转换的数学原理:旋转矩阵、平移向量、齐次坐标
坐标系是传感器融合的基石。你想想看,如果坐标系都搞错了,后面的融合、规划、控制,全都会错。所以,花时间把坐标系理清楚,绝对值得。
下一讲,我们会聊传感器标定的具体方法。到时候,我会拿一个实际项目中的标定案例,带大家走一遍流程。
课后思考:如果你拿到一个激光雷达的点云,发现所有点都偏移了 10 厘米,你会怎么排查?是标定问题,还是安装问题,还是坐标系定义问题?