ArduPilot RTK高精度定位实战指南:从移动基站到厘米级固定解
2026/9/11 2:38:11 网站建设 项目流程

ArduPilot RTK高精度定位实战指南:从移动基站到厘米级固定解

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

ArduPilot 是覆盖固定翼(ArduPlane)、多旋翼(ArduCopter)、车(Rover)、水下艇(Sub)的开源飞控系统,内置完整的 RTK(Real-Time Kinematic,实时动态差分)定位与多传感器融合栈。本文解决"RTK 基站怎么配、移动基线怎么打通、EKF 怎么吃进厘米级数据"三个问题,读完你可以在 U-blox F9P 双天线配置上跑通 RTK 固定解,并拿到一份可复现的参数清单。

场景:不想在起降场旁边架一台固定基站

RTK 固定解的前提是附近 20km 内有一台播发校正数据的基站。固定基站需要独立供电和通信链路,而 ArduPilot 支持移动基线(Moving Baseline)模式:第二台 GPS 接收器充当"可移动的基站",跟随主机一起飞,实时向主 GPS 播发 RTCM3 校正数据(RTK 的差分报文格式)。典型用法是双 GPS 模块的多旋翼——一台接固定式天线做基准,一台做流动站,主机自己播、自己收,落点精度稳定在厘米级。

核心机制:定位状态机与 EKF3 融合链路

ArduPilot 用一套定位状态枚举描述 GPS 解算质量,源码在 libraries/AP_GPS/AP_GPS_FixType.h:

// AP_GPS_FixType.h 中的解算状态 enum class AP_GPS_FixType : uint8_t { NO_GPS = 0, // 无GPS FIX_3D = 3, // 普通3D定位,精度约1~3米 DGPS = 4, // 差分GPS RTK_FLOAT = 5, // RTK浮点解,分米级 RTK_FIXED = 6, // RTK固定解,厘米级 STATIC = 7, // 基站静态解 PPP = 8, // 精密单点定位 };

状态码 5 和 6 就是调 RTK 时最关注的两个数字:卡在 5 说明浮点解没收敛,稳定在 6 才算真正工作。移动基线的数据流如下:

融合端在 libraries/AP_NavEKF3/,其中 GPS 观测量量测与故障剔除逻辑集中在 libraries/AP_NavEKF3/AP_NavEKF3_Measurements.cpp——它负责判断某帧 GPS 数据是可信融合还是当作 glitch(跳变)丢弃。RTCM3 报文的解析器 libraries/AP_GPS/RTCM3_Parser.cpp 按 0xD3 前导码逐字节同步,单包最大支持 720 字节(MAVLink GPS_RTCM_DATA 拆 4 片)。

动手实操:三步配出 RTK 固定解

前置条件:两块 U-blox F9P(或同类支持 RTK 的模块),天线之间基线距离建议 1 米以上且互不遮挡。以双旋翼、GPS1 为流动站、GPS2 为基准为例。

步骤 1:设定基准角色

GPS2_TYPE = 17 # UBLOX_RTK_BASE,基准模式 GPS2_AUTO_CONFIG = 2 # 由飞控自动下发配置 GPS2_RATE_MS = 100 # 10Hz 解算输出

设完后观察地面站:验证方法是 GPS2 的状态码变为 7(STATIC),表示基准站自身锁定了静态解,具备了播发校正数据的前提。

步骤 2:设定流动站并打通数据通道

GPS1_TYPE = 18 # UBLOX_RTK_ROVER,流动站模式 GPS1_AUTO_CONFIG = 2 # 自动配置 GPS_DRIVER_OPTIONS = 1 # 基准走 UART2 输出 RTCM3

GPS_DRIVER_OPTIONS是位掩码(bit0=1 即 MB_USE_UART2),让基准的 RTCM3 数据走 UART2 而不是串口透传。验证方法是 GPS1 状态码从 3 → 5(浮点)→ 6(固定),收敛一般 1~2 分钟。

步骤 3:用 EKF 参数接住厘米级数据

EK2_GPS_TYPE = 1 # 位置+速度一起融合 EK2_GLITCH_RAD = 50 # 跳变检测半径, 单位cm EK2_GPS_POS_X = 0.01 # GPS位置噪声, 固定解可压低

验证方法是查看 EKF 日志(GPS 相关健康位)无bad_gpos/bad_gvel置位,且导航位置与实际落点误差 <10cm。此时 libraries/AP_GPS/ 下的驱动层与 EKF3 已经闭环,RTK 数据不再被滤波端当噪声扔掉。

可选:双 GPS 自动切换做冗余

若 GPS1 是普通模块、GPS2 是 RTK,可配GPS1_TYPE/GPS2_TYPE后启用GPS_AUTO_SWITCH = 2(普通混合)或 3(RTK 优先混合),信号差的那路会被自动降权。逻辑实现在 libraries/AP_GPS/AP_GPS_Blended.cpp,切换判据基于定位状态与更新间隔。

关键参数对照

参数默认值建议值作用
GPS_TYPE / GPS2_TYPE1 (AUTO)18 / 17流动站 / 基准角色选择
GPS_AUTO_CONFIG22飞控自动下发模块配置
GPS_RATE_MS200100解算输出周期(10Hz)
GPS_DRIVER_OPTIONS01bit0:基准 RTCM3 走 UART2
GPS_MB_TYPE000=相对备用 GPS 实例
GPS_MB_BASE_OFFSET_X/Y/Z0实测值基准天线相对机身坐标偏移(m)
GPS_AUTO_SWITCH02 或 30 关 / 2 普通混合 / 3 RTK 混合
EK2_GPS_TYPE01是否融合 GPS 速度
EK2_GLITCH_RAD2550~100位置跳变判据(cm),太小会误拒 RTK 数据
EK2_GPS_POS_X0.020.01GPS 位置噪声(m),固定解下可压低

效果验证

上机后按下面验收,全部达到"合格"以上才算 RTK 链路真正可用:

指标优秀合格需改进
固定解收敛时间<30s30~90s>3min
水平精度 HAcc<0.05m0.05~0.15m>0.3m
RTK 固定解占比(飞行全程)>95%80~95%<80%
可见卫星数>106~10<6
落点重复精度(静止 60s 采样)<3cm3~8cm>10cm

避坑清单

现象原因解决
GPS2 状态一直是 3,不播 RTCM基准未进入 STATIC,天线被遮挡基准天线独立架高,远离金属与电机
流动站长期浮点(状态 5)基线过短/多路径/校正数据丢包拉开天线距离,检查 UART2 波特率与线缆
地面站显示 RTK 但 EKF 拒绝EK2_GLITCH_RAD过小,固定解跳变被判为 glitch提升到 50~100,看 EKF 日志 bad_gpos 位
切换后定位漂移AUTO_SWITCH 频繁来回切固定主用某一路,或调混合阈值
飞行中 RTK 掉回 3D基准天线振动/供电跌落检查基准电源纹波与天线固定
配置没生效GPS_AUTO_CONFIG被设为 0/1回到 2,重启后再查模块实际配置

延伸与收尾

三个进阶方向:一是把 GPS 处理整体搬到协处理器,AP_Periph 支持 GPS 卸载与 RC 透传,源码在 Tools/AP_Periph/,可减轻主 MCU 负担;二是深入研究 EKF3 的观测量故障剔除,libraries/AP_NavEKF3/AP_NavEKF3_Measurements.cpp 是 GPS 拒绝逻辑的落点;三是先用 SITL 仿真跑通参数再上真机,避免烧板调参。移动基线 RTK 把基站从起降场解放出来,配合双 GPS 冗余,厘米级定位可以做成飞行器的"出厂配置"。

核心源码与文档入口:

  • GPS 驱动与 RTK 实现:libraries/AP_GPS/
  • EKF3 导航滤波:libraries/AP_NavEKF3/
  • RTCM3 解析器:libraries/AP_GPS/RTCM3_Parser.cpp
  • 项目文档:docs/

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

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

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

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

立即咨询