3. GNSS 定位原理:从伪距到 RTK

GNSS 定位,说白了就是让无人机知道自己在哪。天上几十颗卫星,每颗都在喊“我是谁、我在哪、现在几点”。无人机收到这些信号,算一算距离,就能解出自己的位置。听起来简单,但实际坑不少。我做了这么多年仿真,踩过的雷能写满一页纸。

这一章我们聚焦四个核心概念:伪距测量、载波相位测量、单点定位与差分定位、RTK 技术。搞懂这些,你就能理解为什么普通 GPS 只能飞个大概,而 RTK 能精确到厘米级。

核心逻辑图:GNSS 定位技术演进路径

GNSS 定位技术演进路径 卫星信号 伪距测量 载波相位测量 单点定位(SPP) 差分定位(DGNSS) RTK 定位 精度:米级(3-10m) 精度:亚米级(0.3-1m) 精度:厘米级(1-5cm)

3.1 伪距测量:最基础的测距方式

伪距,就是“假装的距离”。卫星发信号时带上时间戳,接收机收到后对比本地时间,算出信号传播时间,再乘以光速,就得到了距离。为什么叫“伪”?因为卫星钟和接收机钟不同步,还有大气延迟、多径效应等误差,算出来的距离不是真距。

伪距测量的公式长这样:

ρ = r + c·(δt_u - δt_s) + I + T + ε

其中:

  • ρ — 伪距观测值
  • r — 卫星到接收机的真实几何距离
  • c — 光速
  • δt_u — 接收机钟差
  • δt_s — 卫星钟差
  • I — 电离层延迟
  • T — 对流层延迟
  • ε — 其他噪声

解算时,接收机钟差是未知数,所以至少需要 4 颗卫星 才能解出三维位置加时间。我记得刚入行时,有次仿真里只用了 3 颗星,结果解出来的高度一直在漂,查了半天才发现少算了一个钟差参数。

仿真小技巧: 在 MATLAB 或 Python 里模拟伪距时,记得给每颗卫星的钟差加上随机漂移。我习惯用 randn 生成高斯噪声,标准差设 1-2 米,这样更贴近真实场景。

3.2 载波相位测量:精度更高,但更复杂

伪距精度大概在米级,对于无人机定高、悬停来说不够用。这时候就要请出载波相位测量了。

载波相位测量,说白了就是测量卫星载波信号的相位差。L1 载波波长约 19 cm,L2 约 24 cm。如果能精确测量相位到 0.01 周,理论上精度能到毫米级。但有个大问题——整周模糊度。接收机只能测到小数部分,不知道信号传播了多少个整周。

载波相位观测方程:

Φ = λ⁻¹·r + N + (c·δt_u - c·δt_s)/λ + I/λ + T/λ + ε

其中 N 就是整周模糊度,一个未知整数。解出 N 是载波相位定位的核心难点。

我曾在一次仿真联调中,故意把整周模糊度设错了一个整数,结果定位结果直接偏了 19 cm。你想想看,如果飞无人机时出现这种偏差,降落时可能就偏到停机坪外面去了。

注意: 载波相位测量对信号遮挡非常敏感。一旦失锁,整周计数就会中断,需要重新初始化模糊度。在无人机仿真中,我建议在飞行路径上模拟几次短时遮挡,测试算法能否快速恢复。

3.3 单点定位 vs 差分定位

单点定位(SPP)就是只用一台接收机,直接解算位置。精度受限于卫星钟差、轨道误差、大气延迟,一般 3-10 米。飞个航拍还行,但要做精准降落、编队飞行,完全不够。

差分定位(DGNSS)的原理很简单:在已知坐标的基准站上放一台接收机,算出误差改正数,发给附近的无人机。因为误差在空间上相关,无人机用改正数修正后,精度能提升到亚米级。

对比项 单点定位(SPP) 差分定位(DGNSS)
基准站需求 不需要 需要已知坐标的基准站
典型精度 3-10 米 0.3-1 米
误差来源 全部误差独立 公共误差被消除
适用范围 开阔环境、低精度需求 有基准站覆盖的区域
仿真复杂度 低 中

我个人习惯在仿真初期先用 SPP 验证算法框架,等基本逻辑跑通了,再切换到差分模式。这样调试效率高,不会一上来就被复杂的误差模型搞晕。

3.4 RTK 技术:厘米级定位的利器

RTK(Real-Time Kinematic,实时动态定位)是差分定位的进阶版。它利用载波相位测量,通过基准站和流动站之间的差分,消除大部分公共误差,再解算整周模糊度,最终实现厘米级定位。

RTK 的核心流程:

  1. 基准站观测:基准站已知坐标,计算载波相位观测值与理论值的差值。
  2. 数据链路:基准站通过电台或 4G 把改正数发给无人机。
  3. 流动站解算:无人机接收改正数,构建双差方程,消除钟差和大气延迟。
  4. 模糊度固定:用 LAMBDA 等方法解算整周模糊度,得到固定解。
  5. 输出位置:固定成功后,输出厘米级坐标。

RTK 定位流程示意图

RTK 定位流程 基准站观测 数据链路传输 流动站解算 模糊度固定 输出厘米级坐标 关键:整周模糊度固定成功与否,直接决定 RTK 能否达到厘米级精度

RTK 的精度受限于几个因素:基准站与流动站的距离(一般不超过 20 km)、数据链路的延迟、多路径效应。我曾经在仿真中模拟过 30 km 的基线长度,结果模糊度固定率从 95% 掉到了 60%。所以做无人机仿真时,基线长度一定要设对。

仿真建议: 在 Gazebo 或 AirSim 中模拟 RTK 时,可以用 rtklib 的 rtkrcv 模块做后处理解算。我习惯先录一段原始观测数据,再用不同参数回放,对比固定率的变化。

3.5 避坑指南:仿真中常见的 GNSS 问题

做 GNSS 仿真联调,有几个坑我踩过,写出来给你参考:

  • 钟差模型太简单:别用固定钟差,要用随机游走模型。我一开始用常数钟差,结果定位精度看起来很好,一上真机就崩了。
  • 忽略大气延迟:电离层和对流层延迟在低仰角卫星上特别明显。仿真时至少加个 Klobuchar 模型。
  • 整周模糊度初始化时间不够:RTK 需要几秒到几十秒才能固定模糊度。仿真中如果一开机就要求厘米级定位,那肯定不行。
  • 数据链路延迟:差分改正数有延迟,仿真中要加 0.1-0.5 秒的随机延迟,否则结果过于理想。

重要提醒: 在无人机仿真中,GNSS 模块的输出频率一般设为 5-20 Hz。如果仿真步长是 1 ms,记得做时间对齐。我见过有人直接把 10 Hz 的 GNSS 数据塞进 1000 Hz 的控制循环里,结果位置跳变导致 PID 震荡。