ArduPilot RTK厘米级定位完整实战指南:从基站配置到EKF融合
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
你的多轴做精准归航,落点总差几十厘米;测绘机的航线在地面上看总是漂。根源是同一件事:米级单点GPS的漂移被直接喂进了导航滤波器。下面带你把ArduPilot的RTK定位能力跑通,让位置解从米级压到厘米级。
它解决什么问题:从"米级漂"到"厘米级钉住"
RTK(实时动态定位)的原理是差分:一个站在已知坐标的基站广播误差校正,移动站扣除同样的公共误差,就把精度从米级拉到厘米级。ArduPilot的GPS子系统(libraries/AP_GPS/)把解的质量分成了9个等级,从单点3D(状态3)、DGPS(4)、RTK浮点(5)、RTK固定(6)到PPP(8)。你要盯着的目标只有一个:让日志里的状态字段稳定停在6。
两个核心指标:
- 🎯定位精度:RTK固定解处于厘米级,实际水平受基站距离与卫星几何影响
- ⚡更新率:
GPSx_RATE_MS支持50~200ms,即10Hz~5Hz,高频控制回路常用10Hz
最小配置跑起来:4步点亮固定解
前提硬件:u-blox F9P级别支持RTK的模块、一台放在开阔处的基站、基站到移动站之间的串行链路。
- 硬件就位:基站天线视野开阔,移动站天线装在机体重心上方,远离金属与碳板。
- 移动站参数(地面站里设置):
GPS1_TYPE = 18 # u-blox移动基线Rover(移动站) GPS1_RATE_MS = 100 # 10Hz位置更新 GPS1_POS = 0.05 # 天线相对机体中心的X偏移(米)- 基站端(独立基站板时):
GPS1_TYPE = 17 # u-blox移动基线基站 GPS1_RATE_MS = 100 # 校正广播速率,10Hz- 上电等收敛:基站先开机,等约一分钟再开移动站,观察状态从5(浮点)跳到6(固定)。
最容易被忽略的一步是GPS1_POS天线偏移:天线不在机体原点就必须填实测值。尤其双GPS做GPS航向的场景,填错会直接变成位置与航向的系统性偏差。
如果你的机器是车载双GPS方案,把GPS1_MB_TYPE保持0(相对另一路GPS实例做基准),并用MB_OFS描述两副天线的相对偏移;用外部独立基站时则改为1。
它内部如何工作:一张图看懂校正数据流
可以把RTK类比成测量里的水准差分:基站和移动站受到的卫星钟差、电离层延迟几乎相同,用移动站的观测量减去基站的公共部分,公共误差被消掉,只剩微小残差——这就是厘米级的来源。
几个关键点:
- 驱动层把各模块上报的卫星状态统一成 FixType 枚举,6 即 RTK固定,7 是基站常用静态解
- EKF3(libraries/AP_NavEKF3/)按噪声模型把GNSS位置速度测量融进状态估计,并用跳变滤波器(glitch filter)拦截毛刺
- 一旦GNSS被滤波器拒绝,EKF退回IMU航位推算——所以"固定了解但位置乱跳"比没有固定解更危险
关键参数对照与调优建议
| 参数 | 默认值 | 建议值 | 何时调整 |
|---|---|---|---|
GPS1_TYPE | 0(关闭) | 18(移动站)/ 17(基站) | 启用RTK时必改,改完需重启 |
GPS1_RATE_MS | 200(5Hz) | 100(10Hz) | EKF需要更高更新率;注意部分模块10Hz下CPU负担明显 |
GPS1_MB_TYPE | 0(车内另一GPS做基准) | 0 或 1(外部基准) | 选择校正来源时 |
EK3_GLITCH_RAD | 25(cm) | 25,恶劣环境放宽到50 | 跳变滤波器频繁误触发或漏检时 |
EK3_GPS_CHECK | 31(全部检查开) | 31 | 确认某个检查项误报后,才按位关闭 |
总原则:先保GNSS链路本身健康,状态、卫星数、HDOP都正常了,再去动EKF的噪声与拒绝门限。反过来调参,等于用滤波器掩盖链路问题。
⚠️ 常见坑位自检:RTK不固定时查这里
| 现象 | 可能原因 | 自检方法 |
|---|---|---|
| 长期停在5(浮点) | 基线过远、卫星几何差、多径 | 确认基站距离与可见星数,换点位试基站 |
| 固定了但位置周期性跳 | 天线多径反射、馈线弯折 | 走查天线周围遮挡,看日志中GPS状态跳变 |
| EKF频繁拒绝GNSS | 检查位过严、跳变半径过小 | 核对EK3_GPS_CHECK=31、EK3_GLITCH_RAD=25,先验数据质量 |
| 两路GPS互相偏离大 | 天线偏移未设或设错 | 按实测填GPSx_POS与MB_OFS |
| 校正收不到 | 波特率不匹配、链路配置错 | 抓链路确认RTCM3报文有流动 |
自检顺序建议固定下来:硬件与链路 → 解的类型 → 精度指标 → EKF接受度,逐层推进,不跳步。
总结与下一步
ArduPilot上的RTK不是一个参数,而是一条链:基站、校正链路、驱动解类型、EKF接受度,任何一环断掉,你都会退回米级。固定解稳定之后,可以继续做三件事:
- 冗余:第二路GPS设为普通类型做备份,RTK失效时自动退回单点
- 下游应用:厘米级位置让精准着陆、自主对泊、高密度巡线的可用性直接上一个量级
- 深入源码:浏览 libraries/AP_GPS/MovingBase.cpp 的移动基线参数,以及 AP_NavEKF3 的位置速度融合逻辑,搞清每种 FixType 是如何被滤波器加权的
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考