ArduPilot RTK 配置完全指南:把定位精度从米级压到厘米级(附参数与排查清单)
2026/9/11 17:06:15 网站建设 项目流程

ArduPilot RTK 配置完全指南:把定位精度从米级压到厘米级(附参数与排查清单)

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

在 ArduPilot 上跑自主任务时,单点 GPS 的米级误差往往就是任务成败的分界线。这篇指南带你完成一套可用的 RTK 部署:基站怎么配、移动站怎么配、EKF 侧的噪声上限怎么设、如何验证真的拿到了厘米级固定解,以及最常见的 4 个坑怎么排。学完你应该能独立把一台四旋翼或固定翼的定位状态从"3"推到"6"。

为什么单点定位到不了厘米级

普通 GPS 单点解(SPP)的误差主要来自两块:卫星星历误差和信号穿过大气层的延迟。这两项误差对相距不远的两台接收机几乎是相同的——这就是差分的原理。RTK(Real-Time Kinematic,实时动态差分)把这件事做到了极致:一台固定在已知位置的接收机(基站)把自己解算出的误差修正量发给你飞控上的接收机(移动站),移动站套用修正量后,共享误差被抵消,剩下的就是厘米级噪声。

整个数据流可以拆成四步:

  1. 基站锁星,持续生成 RTCM3 格式的修正报文(这是 RTK 数据链路的通用编码格式);
  2. 修正报文通过串口或数传链路发给移动站一侧的飞控;
  3. 移动站把修正量与自身的载波相位观测做基线解算,状态从浮点解(Float)过渡到固定解(Fixed);
  4. 飞控里的 EKF(扩展卡尔曼滤波器,负责把 GPS、IMU、气压计等数据融合成位置和姿态的模块)把 RTK 位置当作高置信度输入参与融合。

前 3 步由 GPS 模块和参数完成,第 4 步靠 EKF 参数,这正是下面要动的地方。

硬件接线:基站、接收机和飞控怎么连

先确认硬件层面的三件事,否则后面参数怎么调都没用:

  • 移动站 GPS 天线必须远离金属结构和电机,天空视野尽量开阔,天线下方不要压着电源模块;
  • 基站选在开阔、稳固、无遮挡的位置,且与移动站距离在基站链路带宽允许范围内(同频 RTK 一般建议在 10~25 km 量级内使用,具体看你的数据链路);
  • 串口波特率留足余量。RTCM3 报文比单点导航报文大得多,低速波特率下丢包会让浮点解迟迟无法固定。

上图是一张典型 ArduPilot 飞控的接线示意,注意左上角 "Ground Station Signal Receiver"(地面基站信号接收模块)单独接出一路——RTK 场景下移动站一侧常常就是这么接的:一路普通 GPS 报文进主 GPS 口,修正数据从另一路进来。如果你的接收机只有一路串口,就把修正数据和导航报文合并到同一串口(U-blox 系列支持这种混合模式)。

固定解到底长什么样?看libraries/AP_GPS/AP_GPS_FixType.h里的定义最直观:

状态值名称含义典型精度
0NO_GPS没检测到 GPS 设备
1NONE收到报文但无定位
3FIX_3D普通 3D 单点解1~3 m
4DGPS差分改善解亚米
5RTK_FLOATRTK 浮点解10 cm~0.5 m
6RTK_FIXEDRTK 固定解(你要的状态)1~3 cm
7STATIC静态定位(基站常用)
8PPP精密单点定位分米级

后面验证环节,所有判断都围绕"状态值是否稳定停在 6"展开。

基站侧参数:让飞控变成一台 RTK 基站

下面的参数块用于把一台飞控配置成 ArduPilot RTK 基站(U-blox 模块),改完重启飞控,参数会在首次上电时自动下发给 GPS 模块。关键是_TYPE_AUTO_CONFIG两个值,其余按需调整。

# 基站角色:接收机进入静态模式并生成 RTCM3 修正 GPS_TYPE = 17 # GPS_TYPE_UBLOX_RTK_BASE,枚举定义见 libraries/AP_GPS/AP_GPS.h GPS_AUTO_CONFIG = 2 # ENABLE_ALL:自动配置模块的串口与 RTK 相关设置 GPS_RATE_MS = 50 # 20Hz 导航报文,基站静止时用不上更高频率 GPS_INJECT_TO = 127 # 把修正数据同时注入到所有 GCS 数据链路(127 = 全链路位掩码)

GPS_INJECT_TO是基站配置的命门:它决定 RTCM3 修正从哪条 GCS 链路(USB、数传、MAVLink 网络等)发出去,默认值 127 表示全部链路都发。如果飞控只通过一条数传与地面通信,保持 127 即可,不必逐个链路枚举。

再补两点容易被忽略的配置:

  • 基站要固定、要锁好:基站状态最终应显示为静态定位(7)。基站自己漂了,所有移动站的固定解都是错的,而且你很难发现;
  • 基站的 AUTO_CONFIG 只在首次或清参后需要"全量"模式:模块配置正确后,长期运行建议保留自动配置以抵抗模块异常,但如果你发现基站行为怪异,先用GPS_AUTO_CONFIG = 3(清参后重新全量下发)恢复一次。

移动站侧参数:飞控上接收 RTK 修正

移动站参数结构和基站几乎一样,区别只在角色:

# 移动站角色:接收修正、解算厘米级固定解 GPS_TYPE = 18 # GPS_TYPE_UBLOX_RTK_ROVER GPS_AUTO_CONFIG = 2 # ENABLE_ALL,自动配置模块 GPS_RATE_MS = 100 # 10Hz;高速平台(固定翼)可提高到 50(20Hz)

如果你的飞控带两颗 GPS(冗余或移动基线测航向),参数变成按实例命名:主接收机用GPS1_TYPE = 18,副接收机用GPS2_TYPE选对应类型,天线偏移量写在GPS1_ANT_*/GPS2_ANT_*(单位厘米)里。多 GPS 场景下 EKF 融合的是"主传感器"的解,切换逻辑由系统自动处理,你只需要保证每路的_TYPE_AUTO_CONFIG各自正确。

EKF 侧调优:让滤波器信任你的 RTK 数据

GPS 出了固定解,EKF 还会按它"认为的" GPS 精度去加权。这里有两个必须检查的参数(以 EK3 实例为例,EK2 对应EK2_*前缀):

  • EK3_EPH_MAX(GPS 水平精度上限,单位米):EKF 会参考 GPS 模块自报的精度,但用这个值封顶。RTK 固定解自报精度可能只有 1cm 量级,如果你不显式收紧上限,滤波器在数据质量抖动时给的权重就不稳定。固定解场景建议设为0.3左右:既承认厘米级精度,又留了 10 倍余量;
  • EK3_GLITCH_RAD(GPS 跳变容限,单位米,默认 25):当 EKF 预测位置与 GPS 实测位置之差超过此值,滤波器直接把自己拉回 GPS 并重置速度。RTK 场景下数据本身干净,保持默认 25 即可;如果你把 RTK 和单点 GPS 混用、经常发生解的类型跳变,可以适当调大到 50 以减少误重置。

一个容易踩的反面案例:有人把EPH_MAX设成 0.01 来"榨"精度。GPS 模块自报精度偶尔尖刺时,EKF 会瞬间过度信任一个坏点,表现为位置瞬移。0.3 这个量级是精度和鲁棒性的平衡点,先跑起来再微调。

验证:固定解到底成没成

配置完成后按下面的顺序检查,每一步的判据都可以直接抄走。先看遥测/地面站的实时值:

  1. 定位状态 = 6(RTK_FIXED),且持续稳定,不是偶尔闪一下;
  2. RTK 数据年龄(rtk_age_ms)< 10000:这个字段表示上一条基线修正的时延,超 10 秒说明数据链路在丢包,固定解随时会掉;
  3. 水平精度(HAcc)在 0.05~0.2 m 之间:RTK 固定解应报厘米级,如果你看到 0.5 m 以上,大概率还停在浮点解;
  4. 可见卫星 ≥ 8,HDOP < 200(HDOP 原始值乘 100 上报,200 即 2.0)。

再交叉验证日志:回放 DataFlash 时,GPSR(GPS Raw)相关消息里能看到 RTK 卫星数、基线长度等字段,与实时值对得上说明整条链路是通的。收敛时间方面,冷启动拿到第一个固定解,开阔场地 30~60 秒属正常;超过 3 分钟基本是基站选址或数据链路的问题。

常见坑排查:4 个高频故障

  1. 浮点解迟迟不固定先查数据链路:串口波特率是否足够、rtk_age_ms是否持续增大。链路没问题再查几何条件——基站与移动站之间距离、天线周围有无金属反射物(多路径会让相位观测"看起来合理但就是定不住")。处理顺序:波特率→天线环境→基站位置,别一上来就动 EKF。

  2. 状态在 5 和 6 之间反复横跳通常是修正数据时断时续。检查数传链路丢包率,以及基站端GPS_INJECT_TO是否覆盖了你在用的那条链路。横跳本身对 EKF 影响有限(它会按精度变化自动调权),但持续横跳说明系统不可用,必须修链路。

  3. EKF 报 GPS rejected固定解拿到了但 EKF 拒收,常见原因排序:天线偏移参数GPS1_ANT_*没填或填错(多 GPS 时尤其明显)、模块自报精度异常导致权重计算出错、位置参考(home 点)漂移。依次核对这三项。

  4. AUTO_CONFIG 把你的模块配置冲了症状是重启后 RTK 行为变了。GPS_AUTO_CONFIG = 2会在每次上电按飞控预期重新配置模块,如果你手工在模块里改过特殊设置,要么把这些设置写进自动配置流程,要么把该路设为0(禁用)并全程手工管理。二选一,别混着来。

兜底行为说明一下:RTK 失锁后 EKF 会自动退化——先用 DGPS/单点解维持定位,长时间无 GPS 则转入惯性推算(IMU 航位推算),航向会随时间漂移。这是设计好的降级路径,不需要你干预,但任务规划时要知道这个窗口有多长。

快速自查清单

部署前 2 分钟过一遍,能挡掉 90% 的失败:

  • 移动站天线:开阔天空视野、下方无金属和电源
  • 基站:稳固固定、开阔、远离遮挡物
  • 基站参数:GPS_TYPE = 17GPS_INJECT_TO = 127,状态最终显示静态定位(7)
  • 移动站参数:GPS_TYPE = 18GPS_AUTO_CONFIG = 2,串口波特率留足
  • 遥测确认:状态 6、HAcc < 0.2 m、rtk_age < 10 s、卫星 ≥ 8
  • EKF 侧:EK3_EPH_MAX收到 0.3 量级,GLITCH_RAD保持默认或按解型跳变情况放宽
  • 冷启动收敛时间在 60 秒内,日志与实时值交叉验证一致

下一步建议:先读 libraries/AP_GPS/ 里AP_GPS_UBLOX.cpp的自动配置流程,理解AUTO_CONFIG到底往模块里写了什么;再看 libraries/AP_NavEKF3/ 中 GPS 融合的注入逻辑,把"GPS 状态 6 → EKF 高权重输入"这条链路的每个环节都对应到参数上。做到这一步,你对 ArduPilot RTK 的排障就不再靠猜了。

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

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

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

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

立即咨询