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,实时动态差分)把这件事做到了极致:一台固定在已知位置的接收机(基站)把自己解算出的误差修正量发给你飞控上的接收机(移动站),移动站套用修正量后,共享误差被抵消,剩下的就是厘米级噪声。
整个数据流可以拆成四步:
- 基站锁星,持续生成 RTCM3 格式的修正报文(这是 RTK 数据链路的通用编码格式);
- 修正报文通过串口或数传链路发给移动站一侧的飞控;
- 移动站把修正量与自身的载波相位观测做基线解算,状态从浮点解(Float)过渡到固定解(Fixed);
- 飞控里的 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里的定义最直观:
| 状态值 | 名称 | 含义 | 典型精度 |
|---|---|---|---|
| 0 | NO_GPS | 没检测到 GPS 设备 | — |
| 1 | NONE | 收到报文但无定位 | — |
| 3 | FIX_3D | 普通 3D 单点解 | 1~3 m |
| 4 | DGPS | 差分改善解 | 亚米 |
| 5 | RTK_FLOAT | RTK 浮点解 | 10 cm~0.5 m |
| 6 | RTK_FIXED | RTK 固定解(你要的状态) | 1~3 cm |
| 7 | STATIC | 静态定位(基站常用) | — |
| 8 | PPP | 精密单点定位 | 分米级 |
后面验证环节,所有判断都围绕"状态值是否稳定停在 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 这个量级是精度和鲁棒性的平衡点,先跑起来再微调。
验证:固定解到底成没成
配置完成后按下面的顺序检查,每一步的判据都可以直接抄走。先看遥测/地面站的实时值:
- 定位状态 = 6(RTK_FIXED),且持续稳定,不是偶尔闪一下;
- RTK 数据年龄(rtk_age_ms)< 10000:这个字段表示上一条基线修正的时延,超 10 秒说明数据链路在丢包,固定解随时会掉;
- 水平精度(HAcc)在 0.05~0.2 m 之间:RTK 固定解应报厘米级,如果你看到 0.5 m 以上,大概率还停在浮点解;
- 可见卫星 ≥ 8,HDOP < 200(HDOP 原始值乘 100 上报,200 即 2.0)。
再交叉验证日志:回放 DataFlash 时,GPSR(GPS Raw)相关消息里能看到 RTK 卫星数、基线长度等字段,与实时值对得上说明整条链路是通的。收敛时间方面,冷启动拿到第一个固定解,开阔场地 30~60 秒属正常;超过 3 分钟基本是基站选址或数据链路的问题。
常见坑排查:4 个高频故障
浮点解迟迟不固定先查数据链路:串口波特率是否足够、
rtk_age_ms是否持续增大。链路没问题再查几何条件——基站与移动站之间距离、天线周围有无金属反射物(多路径会让相位观测"看起来合理但就是定不住")。处理顺序:波特率→天线环境→基站位置,别一上来就动 EKF。状态在 5 和 6 之间反复横跳通常是修正数据时断时续。检查数传链路丢包率,以及基站端
GPS_INJECT_TO是否覆盖了你在用的那条链路。横跳本身对 EKF 影响有限(它会按精度变化自动调权),但持续横跳说明系统不可用,必须修链路。EKF 报 GPS rejected固定解拿到了但 EKF 拒收,常见原因排序:天线偏移参数
GPS1_ANT_*没填或填错(多 GPS 时尤其明显)、模块自报精度异常导致权重计算出错、位置参考(home 点)漂移。依次核对这三项。AUTO_CONFIG 把你的模块配置冲了症状是重启后 RTK 行为变了。
GPS_AUTO_CONFIG = 2会在每次上电按飞控预期重新配置模块,如果你手工在模块里改过特殊设置,要么把这些设置写进自动配置流程,要么把该路设为0(禁用)并全程手工管理。二选一,别混着来。
兜底行为说明一下:RTK 失锁后 EKF 会自动退化——先用 DGPS/单点解维持定位,长时间无 GPS 则转入惯性推算(IMU 航位推算),航向会随时间漂移。这是设计好的降级路径,不需要你干预,但任务规划时要知道这个窗口有多长。
快速自查清单
部署前 2 分钟过一遍,能挡掉 90% 的失败:
- 移动站天线:开阔天空视野、下方无金属和电源
- 基站:稳固固定、开阔、远离遮挡物
- 基站参数:
GPS_TYPE = 17、GPS_INJECT_TO = 127,状态最终显示静态定位(7) - 移动站参数:
GPS_TYPE = 18、GPS_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),仅供参考