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 坐标系之间的转换

实际工作中,你需要在三个坐标系之间来回切换。最常见的转换链路是:

  1. WGS84 → UTM:用投影公式(或调用库函数)
  2. UTM → 车身坐标系:通过车辆位姿(位置+朝向)做平移旋转
  3. 车身坐标系 → 传感器坐标系:通过外参矩阵

举个代码示例(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 坐标系 经度 / 纬度 / 海拔 全球统一,球面坐标 GPS 原始输出 UTM 投影 东向 / 北向 / 带号 平面坐标,米为单位 适合地图与导航 局部坐标系 车身 / 传感器 实时控制用 需要外参标定 投影 位姿转换 核心流程 GPS (WGS84) → UTM 平面坐标 → 车身坐标系 → 传感器坐标系 每一步都需要精确的转换参数,否则定位误差会逐级放大

嗯,这张图把三个坐标系的关系讲得很清楚了。从上到下,从全局到局部,每一步转换都对应着具体的算法和参数。

总结一下:

  • WGS84 是地球的「身份证」,全球通用但球面坐标不好算
  • UTM 把球面变平面,适合做地图和路径规划
  • 车身/传感器坐标系跟着车走,适合实时控制
  • 三者之间的转换是定位系统的核心能力

我个人习惯在项目初期就把坐标系转换链路画清楚,标出每个环节的输入输出和误差来源。这样后面调试定位问题时,能快速定位到是哪个环节出了问题。

好了,坐标系基础就讲到这里。记住一句话:定位的精度,取决于你对坐标系的掌控程度。

可可精品资料库