坐标系与地理基础:WGS84、经纬度与UTM、海拔、地磁偏角

做航点规划,说白了就是回答三个问题:飞机在哪儿?要去哪儿?朝哪个方向飞?这三个问题都绕不开坐标系和地理基础。我见过不少新手,一上来就调参数、写航线,结果飞机飞出去偏了几百米,回来一查——坐标系搞混了。

嗯,这一章咱们就把这些基础打牢。别嫌枯燥,这些是后面所有航点任务的根基。

WGS84坐标系——全球统一的“尺子”

WGS84(World Geodetic System 1984)是目前全球卫星导航系统(GPS、北斗、GLONASS)通用的坐标基准。它把地球近似为一个椭球体,用经纬度来描述位置。

我个人习惯把WGS84理解为“地球的骨架”。所有GPS接收机输出的原始数据,都是基于这个骨架的。它的核心参数:

参数 值 说明
长半轴 (a) 6,378,137.0 m 赤道半径
短半轴 (b) 6,356,752.3142 m 极半径
扁率 (f) 1/298.257223563 地球“压扁”的程度

关键点:WGS84的经纬度单位是度(°),不是度分秒。大部分飞控和地面站软件内部都使用十进制度数。如果你拿到的是度分秒格式,记得先转换。

经纬度与UTM坐标转换

经纬度虽然直观,但有个大问题:它不是平面坐标。你想想看,在赤道附近1°经度对应的距离约111km,但在北极附近可能只有几公里。这导致直接用经纬度计算距离、面积非常麻烦。

UTM(Universal Transverse Mercator)投影就是为了解决这个问题。它把地球分成60个带(Zone),每个带6°经度宽,投影到平面上。这样我们就可以用东向(Easting)和北向(Northing)两个米制坐标来描述位置。

我在项目中遇到过最典型的坑:UTM带号搞错。有一次同事在新疆做测试,用的UTM 45N带号,但实际应该用44N。结果航线整体偏移了将近400米。嗯,从那以后我每次都会先确认带号。

转换公式(简化版):

// 经纬度 → UTM(伪代码示例)
function latLonToUTM(lat, lon) {
    // 1. 计算带号
    zone = floor((lon + 180) / 6) + 1;
    
    // 2. 中央经线
    centralMeridian = (zone - 1) * 6 - 180 + 3;
    
    // 3. 墨卡托投影计算(省略详细公式)
    easting = 500000 + k0 * N * [A + (1 - T + C) * A^3/6 + ...];
    northing = k0 * (M - M0 + N * tan(phi) * [A^2/2 + ...]);
    
    // 北半球:northing不变;南半球:加10000000
    if (lat < 0) northing += 10000000;
    
    return { zone, easting, northing };
}

实用技巧:大多数飞控SDK(如PX4、ArduPilot)都内置了坐标转换函数。你不需要手写公式,但一定要理解:航点规划时,内部计算用UTM(米),存储和传输用WGS84(度)。

海拔与相对高度

这是最容易出问题的地方。我见过太多炸机案例,根源就是高度理解错了。

无人机的高度通常有三种:

  • 绝对海拔(AMSL):相对于平均海平面的高度。WGS84椭球体高度。
  • 相对高度(AGL):相对于起飞点或地面的高度。
  • 气压高度:通过气压传感器推算的高度,受天气影响大。

举个例子:你在海拔500米的山顶起飞,设置航点相对高度100米。那么飞机的绝对海拔是600米。但如果你的航线文件里写的是绝对海拔600米,而换了一个海拔200米的起飞点……飞机就会直接往地下钻。

避坑指南:我曾经因为没搞清楚“相对高度”和“绝对海拔”的区别,在山区做测绘时差点让飞机撞山。从那以后,我定了一条铁律:所有航点文件必须明确标注高度类型。要么在文件名加后缀(_AMSL / _AGL),要么在文件头用注释写明。

高度转换关系:

绝对海拔 = 相对高度 + 起飞点海拔
相对高度 = 绝对海拔 - 起飞点海拔

地磁偏角与航向角

无人机飞行的方向,不是简单的“指北”。这里有两个概念必须分清:

  • 真北(True North):地理北极,所有经线交汇的点。
  • 磁北(Magnetic North):地磁场的北极,位置在不断漂移。

地磁偏角(Declination)就是真北与磁北之间的夹角。东偏为正,西偏为负。这个值随地点和时间变化。

我习惯在每次飞行前做两件事:

  1. 查当地最新的地磁偏角(可以用NOAA的在线计算器)。
  2. 在飞控参数里设置正确的磁偏角。

航向角(Heading)通常以真北为0°,顺时针增加。但磁罗盘输出的是磁航向。转换关系:

真航向 = 磁航向 + 地磁偏角

举个例子:在北京(偏角约-6°),磁罗盘显示航向90°(正东),那么真航向是90° + (-6°) = 84°。如果不修正,飞机实际会往北偏6°飞行。短距离还好,飞个10公里就偏出去1公里多了。

知识体系总览

下面这张图把本章的核心逻辑串起来了。你可以把它当作坐标系转换的“思维导图”:

坐标系与地理基础知识体系 坐标系与地理基础 · 知识体系 WGS84 坐标系 经纬度 (Lat/Lon) UTM 投影坐标 海拔与相对高度 地磁偏角与航向 航点任务规划实战 核心原则:存储用WGS84(度),计算用UTM(米),高度明确类型,航向修正磁偏角

这张图你看懂了吗?从上到下,WGS84是源头,分出经纬度和UTM两条路。左边处理高度,右边处理航向,最终汇到航点规划这个应用层。每一层都有坑,但只要你理解了转换逻辑,就能避开。

我的个人习惯:在写航点规划代码时,我会封装一个GeoUtils类,把WGS84↔UTM转换、高度类型判断、磁偏角修正都放在里面。这样不管换什么飞控平台,核心逻辑都不用改。你也不妨试试。