ArduPilot GPS导航实战:配出RTK固定解,让无人机稳定停在厘米级精度内
2026/9/11 3:09:40 网站建设 项目流程

ArduPilot GPS导航实战:配出RTK固定解,让无人机稳定停在厘米级精度内

【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot

做测绘飞行时,地面站的航迹点突然乱跳两三米,落点比规划偏了一截——这种"GPS漂移"几乎每个飞ArduPilot的人都遇到过。好消息是:ArduPilot的GPS导航链路里内置了一条通往厘米级定位的完整通路,叫RTK(实时动态定位,基站算好误差再喂给飞机)。这篇就从原理讲到参数,帮你把固定解跑起来,并弄懂背后的EKF滤波器到底怎么对待这份精准数据。

为什么普通GPS只值1米,RTK却能到1厘米

先给结论:单点定位的误差来自卫星星历和大气延迟,属于"先天不足";RTK不消灭误差,而是用一台就近的基站把误差"量"出来,再实时报给飞机。

可以把基站想象成站在操场上的裁判:他和你在同一场比赛里(同时受电离层、轨道误差影响),他知道自己脚下坐标,就能把你测到的偏差算出来。RTK更进一步,利用载波相位测量——它不是数脉冲,而是测信号波形的相位,精度能到波长的一小部分。两者结合,移动站就能从米级收敛到厘米级。

看懂GCS上的定位等级:你现在拿到的是哪种"解"

判断RTK是否工作,最直接的办法就是盯住地面站的定位类型。ArduPilot在源码里定义了一套明确的等级,见 AP_GPS_FixType.h,对照下表读就行:

定位等级典型精度说明
FIX_2D / FIX_3D2~5米最基本的单点解,能飞但别指望落点准
DGPS1~2米用了伪距差分校正,比单点好一档
RTK_FLOAT(浮点解)20~50厘米整周模糊度还没解干净,先收敛到这个状态
RTK_FIXED(固定解)1~2厘米模糊度锁定,厘米级目标达成
STATIC基站自己上报的状态,说明它已按静态基准运行

一个容易忽略的细节:基站的定位类型显示为STATIC才是正常的,如果你看到它还在报FIX_3D,多半是基站配置没生效。

ArduPilot RTK配置:基站和移动站分别填什么 📡

RTK链路涉及两个角色:一台接电源插在地上不动的基站,和装在飞机上的移动站。以最常见的U-blox为例,关键参数只有两个——驱动类型和双口分配。

# 基站端(例如用串口接RTCM数据源) GPS_TYPE = 17 # GPS_TYPE_UBLOX_RTK_BASE # 移动站端 GPS_TYPE = 18 # GPS_TYPE_UBLOX_RTK_ROVER GPS_MB_USE = 4 # bit3:两串口间走CAN/差分链路,按需选择

这里GPS_TYPE的枚举值来自AP_GPS.h源码:17和18分别是U-blox的基站与移动站驱动;GPS_MB_USE是一个位掩码参数,bit0选择UART2做差分口、bit3走GPS间的专用链路,bit1则给SBF系统用基站定航向。配置完重启,等基站报出STATIC,再观察移动站从FLOAT爬到FIXED,整个收敛过程通常只需几秒到几十秒。

RTCM数据流:校正数据从哪里来、到哪里去

固定解不是配个参数就有的,它依赖一条持续流动的数据链——RTCM3报文。这条链路上有三个角色:基站(或网络NTRIP服务)产生报文、链路(串口/CAN/网络)搬运报文、移动站里的解析器消费报文。

ArduPilot里这一步藏在AP_GPS模块中:地面站或链路发来的MAVLink GPS_RTCM_DATA消息会进入AP_GPS的接收路径,先在内部缓冲区分片拼装,再交给对应驱动解析注入。源码位置在AP_GPS源码的handle_gps_rtcm_data函数附近。

这带来一个实用的排错思路:如果你的移动站收得到RTCM但就是不定解,先确认数据链路带宽是否够。RTCM报文是流式的,丢帧或延迟会直接拖垮模糊度求解,表现就是长期停在浮点解、或age(数据龄期)持续偏大。

EKF传感器融合:滤波器为什么敢信你的RTK

拿到厘米级坐标后,真正"用"它的不是某个模式,而是EKF(扩展卡尔曼滤波,一种把IMU推算和GPS观测加权平均成最优估计的融合器)。ArduPilot当前的主力实现是AP_NavEKF3,代码在AP_NavEKF3。

融合逻辑可以概括成三步:IMU先按惯性推算出"我应该在哪儿",GPS给出"我实际在哪儿",滤波器按两边的信任度分配权重——RTK固定解的观测噪声被设得很小,所以它的话语权远大于普通单点解。反过来,如果RTK突然跳变,EKF的"一致性检验"会发现新测量和预测值差得离谱,直接把这条观测拒掉,而不是让滤波器被带着跑偏。

这就是为什么配置RTK之后,你不需要动EKF的融合开关:GPS类型(如EK3_SRC1_VEL/POS)本来就允许用最高等级的观测,滤波器会自适应。

EKF参数怎么调:GLITCH_RAD和I_GATE别乱动 ⚠️

新手最容易犯的错,是看到"GPS被拒绝"就猛调EKF门限。先记住结论:这两个参数是安全网,不是精度旋钮。

  • EK3_GLITCH_RAD:允许"GPS预测位置与实测位置最大径向偏差",超过就重置滤波器位置状态到GPS。调大能容忍更大的跳变,但会让IMU或罗盘自身的误差被掩盖更久。
  • EK3_POS_I_GATE / EK3_VEL_I_GATE:创新门限,以标准差倍数表示。偏小会把好数据当坏数据丢掉,偏大又可能让多路径干扰钻进来。

我的建议是保持默认值,只在日志里反复出现GPS拒收、且确认数据源本身干净之后再微调。RTK固定解下这两个参数基本不用动,因为喂给滤波器的数据质量已经高了一个量级。

排错清单:固定解丢失时按顺序查这4件事

  1. 基站状态:是否报STATIC?基站点是否被遮挡(基站的"好视野"决定了整个系统上限)?
  2. 数据链路:RTCM是否在持续到达?用串口助手抓一下,看帧率和延迟。
  3. 天线距离:移动站和基站基线太长(比如超过10公里且无合适频段)会让模糊度更难锁定,近距离测试先行。
  4. 日志中的GPS质量:打开日志查看HDOP、卫星数、RTK age字段——age持续增大说明链路在"饿",卫星数不足则是环境问题而非配置问题。

按这个顺序走一遍,绝大多数"RTK不固定"的案子都能定位到具体环节,而不是盲目重刷参数。

ArduPilot的GPS导航体系把RTK链路、数据解析和滤波融合做成了一条自动衔接的流水线:你负责把基站摆好、参数填对,剩下的收敛、加权、拒收都由系统自己完成。跑通第一个固定解之后,把日志里的定位等级和RTK age养成日常检查习惯,厘米级精度就会稳定地留在你的落点里。

【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询