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 输出 RTCM3GPS_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_TYPE | 1 (AUTO) | 18 / 17 | 流动站 / 基准角色选择 |
| GPS_AUTO_CONFIG | 2 | 2 | 飞控自动下发模块配置 |
| GPS_RATE_MS | 200 | 100 | 解算输出周期(10Hz) |
| GPS_DRIVER_OPTIONS | 0 | 1 | bit0:基准 RTCM3 走 UART2 |
| GPS_MB_TYPE | 0 | 0 | 0=相对备用 GPS 实例 |
| GPS_MB_BASE_OFFSET_X/Y/Z | 0 | 实测值 | 基准天线相对机身坐标偏移(m) |
| GPS_AUTO_SWITCH | 0 | 2 或 3 | 0 关 / 2 普通混合 / 3 RTK 混合 |
| EK2_GPS_TYPE | 0 | 1 | 是否融合 GPS 速度 |
| EK2_GLITCH_RAD | 25 | 50~100 | 位置跳变判据(cm),太小会误拒 RTK 数据 |
| EK2_GPS_POS_X | 0.02 | 0.01 | GPS 位置噪声(m),固定解下可压低 |
效果验证
上机后按下面验收,全部达到"合格"以上才算 RTK 链路真正可用:
| 指标 | 优秀 | 合格 | 需改进 |
|---|---|---|---|
| 固定解收敛时间 | <30s | 30~90s | >3min |
| 水平精度 HAcc | <0.05m | 0.05~0.15m | >0.3m |
| RTK 固定解占比(飞行全程) | >95% | 80~95% | <80% |
| 可见卫星数 | >10 | 6~10 | <6 |
| 落点重复精度(静止 60s 采样) | <3cm | 3~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),仅供参考