定位数据基础:三大卫星系统与坐标体系

各位同学,今天我们来聊聊定位数据的基础。说白了,就是无人机怎么知道自己在哪儿的。我刚开始接触MAVLink的时候,看到一堆经纬度、海拔、相对高度,说实话也有点懵。但搞懂了背后的逻辑,你会发现其实没那么复杂。

GPS / GLONASS / 北斗:三大系统怎么选?

目前主流的卫星导航系统有三个:美国的GPS、俄罗斯的GLONASS、中国的北斗。我个人的习惯是,只要飞控支持,尽量让它们一起工作。为什么?因为卫星越多,定位越稳。

系统 卫星数量(约) 轨道高度 特点
GPS 31 20200 km 最成熟,全球覆盖好
GLONASS 24 19100 km 高纬度地区表现更好
北斗 30+ 21500 km 亚太区域精度高,有短报文
我的经验:在山区或城市峡谷飞行时,单GPS经常丢星。我建议至少开启GPS+GLONASS双模,北斗在亚太地区可以作为补充。MAVLink的GPS_RAW_INT消息里会告诉你当前用了哪些卫星。

WGS84坐标系:地球不是圆的

你看到的经纬度,背后其实是一个叫WGS84的坐标系。它把地球近似为一个椭球体——说白了,地球在赤道附近鼓出来一点,两极扁一点。这个椭球体的参数是固定的,全球通用。

经纬度的单位是度,但实际计算时我习惯转成弧度。为什么?因为后面算距离、算航向,三角函数用的都是弧度。MAVLink里传的经纬度是int32_t,单位是1e7度。举个例子:

// MAVLink原始数据
int32_t lat = 396000000;  // 实际纬度 = 39.6000000°
int32_t lon = 1163000000; // 实际经度 = 116.3000000°

// 转成浮点数
double lat_f = lat / 1e7;  // 39.6
double lon_f = lon / 1e7;  // 116.3
注意:我曾经遇到过有人直接把int32_t当浮点数用,结果算出来的位置差了十万八千里。记住,MAVLink里的经纬度必须除以1e7才是真正的度数。

海拔高度 vs 相对高度:别搞混了

这是新手最容易踩坑的地方。MAVLink里有两个高度字段:alt和relative_alt。前者是海拔高度(基于WGS84椭球体),后者是相对起飞点的高度。

我举个例子你就明白了:你在海拔50米的地方起飞,飞到100米高空。这时候:

  • alt ≈ 150米(海拔)
  • relative_alt ≈ 100米(相对高度)

为什么会有这个区别?因为气压计测的是相对高度,GPS测的是海拔高度。两者各有各的用处。我个人习惯:做航线规划时用相对高度,做地理标记时用海拔高度。

关键点:MAVLink的GLOBAL_POSITION_INT消息里同时包含这两个高度。解析时一定要区分清楚,否则你的无人机可能飞到地底下去了。

知识体系总览

下面这张图帮你理清本章的核心逻辑:

定位数据基础体系 定位数据基础体系 GPS GLONASS 北斗 WGS84 坐标系 经纬度 (int32_t / 1e7) 海拔高度 (alt) 相对高度 (relative_alt) MAVLink 消息:GPS_RAW_INT / GLOBAL_POSITION_INT

实际项目中的避坑指南

最后分享几个我踩过的坑:

  • 海拔高度不准:WGS84椭球体高度和真实海拔有偏差,尤其是在山区。我曾经在青藏高原测试,GPS海拔比实际低了近100米。这时候需要用EGM96大地水准面模型修正。
  • 相对高度归零:起飞后如果飞控重启,relative_alt会归零。我建议在日志里同时记录alt和relative_alt,方便事后排查。
  • 卫星数不足:在城市峡谷或室内,卫星数可能掉到4颗以下。这时候定位精度会急剧下降。我的做法是:当卫星数<6时,主动切换到视觉或惯导辅助定位。
小技巧:解析MAVLink数据时,我习惯先打印satellites_visible字段。如果这个值小于8,后面的经纬度数据就要打个问号了。

嗯,这一章的内容就到这里。定位数据看似简单,但细节很多。搞懂了这些基础,后面分析MAVLink的定位消息就会轻松很多。