4. 坐标系基础:WGS84坐标系、UTM投影、局部坐标系
做定位,说白了就是回答三个问题:我在哪?我要去哪?我怎么去? 但回答这些问题之前,你得先有个「尺子」——也就是坐标系。
我刚开始接触高精地图时,就被各种坐标系绕晕了。WGS84、UTM、车身坐标系、传感器坐标系…… 每个都长得像,但用法完全不同。今天咱们就把它们彻底捋清楚。
核心观点: 全局定位用WGS84,局部计算用UTM,实时控制用车体/传感器坐标系。三者缺一不可。
4.1 WGS84坐标系:地球的「身份证」
WGS84 全称 World Geodetic System 1984。它是目前全球最通用的地理坐标系。GPS 卫星发下来的原始数据,就是 WGS84 坐标。
它的表示方式很简单:经度、纬度、海拔。
- 经度(Longitude):东西方向,范围 -180° ~ 180°
- 纬度(Latitude):南北方向,范围 -90° ~ 90°
- 海拔(Altitude):相对于海平面的高度
举个例子,北京天安门的 WGS84 坐标大概是:
纬度: 39.9042° N
经度: 116.3974° E
海拔: 44 米
我的经验: 实际项目中,WGS84 的精度受卫星信号、大气延迟、多路径效应影响很大。我曾在城市峡谷(高楼密集区)做过测试,同一位置不同时间测出的经纬度能差 5-10 米。所以千万别迷信 GPS 的原始数据,一定要做滤波和融合。
4.2 UTM投影:把球面变平面
WGS84 是球面坐标,但我们的地图、路径规划、控制算法都是在平面上算的。这就需要一个投影——把球面坐标映射到平面坐标。
UTM(Universal Transverse Mercator) 是最常用的投影方式之一。
它的核心思想:把地球切成 60 个带,每个带宽度 6 度经度。每个带独立投影,误差控制在 1:2500 以内。
UTM 坐标用两个值表示:东向(Easting) 和 北向(Northing),单位是米。
| 参数 | 说明 |
|---|---|
| 东向 (Easting) | 从中央经线向东的距离,单位米 |
| 北向 (Northing) | 从赤道向北的距离,单位米 |
| 带号 (Zone) | 1-60,表示所在投影带 |
| 南北半球 | 北半球 N,南半球 S |
还是天安门的例子,转换成 UTM 坐标(带号 50N):
东向: 454,700 米
北向: 4,417,000 米
带号: 50N
注意: 不同投影带之间不能直接计算距离!我见过有人把两个不同带的 UTM 坐标直接做减法算距离,结果差了上百米。跨带计算时,要么统一到一个带,要么用 WGS84 经纬度算大圆距离。
4.3 局部坐标系:车身与传感器
全局坐标系(WGS84/UTM)适合做地图和导航,但实时控制不行。为什么?因为车在动,传感器在动,你需要一个「跟着车走」的坐标系。
4.3.1 车身坐标系
车身坐标系的原点通常放在车辆后轴中心(或质心)。
- X轴:指向车辆前进方向
- Y轴:指向车辆左侧(或右侧,看定义)
- Z轴:垂直向上
这个坐标系的好处是:车辆的运动控制(油门、刹车、转向)天然在这个坐标系下描述。
// 车身坐标系下的速度
vx = 10.5 m/s // 前进速度
vy = 0.2 m/s // 侧向速度(通常很小)
vz = 0.0 m/s // 垂直速度(忽略)
4.3.2 传感器坐标系
每个传感器都有自己的坐标系。比如:
- 激光雷达:原点在雷达中心,X轴朝前,Y轴朝左,Z轴朝上
- 摄像头:原点在镜头光心,Z轴朝前(相机坐标系通常 Z 朝前)
- IMU:原点在 IMU 芯片中心,三轴与芯片封装对齐
这些传感器坐标系之间、以及和车身坐标系之间,都需要做外参标定。
避坑指南: 我曾经在项目里遇到一个问题——激光雷达和摄像头融合时,目标位置总是对不上。查了两天才发现,激光雷达的坐标系定义是「X朝前、Y朝左」,而摄像头是「Z朝前、X朝右」。坐标系定义不一致,导致转换矩阵算错了。所以,拿到传感器数据的第一件事:确认它的坐标系定义。
4.4 坐标系之间的转换
实际工作中,你需要在三个坐标系之间来回切换。最常见的转换链路是:
- WGS84 → UTM:用投影公式(或调用库函数)
- UTM → 车身坐标系:通过车辆位姿(位置+朝向)做平移旋转
- 车身坐标系 → 传感器坐标系:通过外参矩阵
举个代码示例(Python 伪代码):
import pyproj
# WGS84 转 UTM
transformer = pyproj.Transformer.from_crs(
"EPSG:4326", # WGS84
"EPSG:32650", # UTM 50N
always_xy=True
)
utm_x, utm_y = transformer.transform(116.3974, 39.9042)
# UTM 转车身坐标系(假设车辆位姿已知)
vehicle_x = utm_x - vehicle_pose.x
vehicle_y = utm_y - vehicle_pose.y
# 再旋转到车身朝向
body_x = vehicle_x * cos(yaw) + vehicle_y * sin(yaw)
body_y = -vehicle_x * sin(yaw) + vehicle_y * cos(yaw)
我的习惯: 项目中我会把所有传感器数据统一到车身坐标系下处理。这样后续的融合、规划、控制都只用一套坐标,省去很多麻烦。统一坐标系后,调试也方便——你只需要盯着车身坐标系下的数据看就行。
4.5 知识体系总览
下面这张图总结了本章的核心逻辑:
嗯,这张图把三个坐标系的关系讲得很清楚了。从上到下,从全局到局部,每一步转换都对应着具体的算法和参数。
总结一下:
- WGS84 是地球的「身份证」,全球通用但球面坐标不好算
- UTM 把球面变平面,适合做地图和路径规划
- 车身/传感器坐标系跟着车走,适合实时控制
- 三者之间的转换是定位系统的核心能力
我个人习惯在项目初期就把坐标系转换链路画清楚,标出每个环节的输入输出和误差来源。这样后面调试定位问题时,能快速定位到是哪个环节出了问题。
好了,坐标系基础就讲到这里。记住一句话:定位的精度,取决于你对坐标系的掌控程度。