ArduPilot RTK 固定解避坑实战:从基站接线到野外验证
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
Meta Description:拆解 ArduPilot RTK 链路:基站接线、RTCM3 注入、基线收敛与四级定位类型,附实测排查顺序与 U-blox 配置清单,帮你稳拿厘米级固定解。
上个月跑测绘任务,我在现场调 ArduPilot RTK,基站一直报固定解,移动站却卡在浮点四十分钟不锁。折腾半天,最后发现是移动站的 RTCM 流里只有 1033/1045,缺了 1005 站播,整周模糊度自然收敛不了。这个坑让我意识到:问题清单其实很短,短到可以按顺序一遍查完。以下内容把"基站 → 链路 → 移动站 → 滤波"整条链路拆开,每个痛点下都给出该看的技术事实和排查顺序,参数与字段名全部取自 AP_GPS 模块 源码。
基站先确认:它自己真的固定解吗
STATIC=7 是基站自己的定位类型
别假设"基站肯定是固定的"。ArduPilot 里定位类型是AP_GPS_FixType枚举:FIX_3D=3、DGPS=4、RTK_FLOAT=5、RTK_FIXED=6,另外 STATIC=7 是基站自身上报的固定解状态,PPP=8(精密单点)容易被误当 RTK 看,注意区分。调 ArduPilot RTK 时,第一步永远是在地面站确认基站实例的 fix type 确实是 7,再看移动站。
| 定位类型 | FixType 值 | 典型水平精度 | 能承载的任务 |
|---|---|---|---|
| FIX_3D 单点 | 3 | 2~5 m | 粗定位、起飞参考 |
| DGPS 差分 | 4 | 1~2 m | 一般航测底图 |
| RTK 浮点解 | 5 | 10~20 cm | 慢速精细飞行、落点保持 |
| RTK 固定解 | 6 | 1~2 cm | 巡检、喷洒等精密作业 |
(STATIC=7 是基站的状态标签,不属于精度档位,所以没进表。)
最小可行差分链路
最常见的注入方式是 MAVLink 中转:基站把 RTCM3 协议消息发出来,ArduPilot 重组碎片后注入移动站。链路长这样:
关键事实:GPS_RTCM_DATA每包只带 180 字节,RTCM3 解析器按0xD3同步头重组,上限 4 片共 720 字节。无线数率给小了,分片丢失就是链路层面丢校正值,比任何参数都致命。
固定解不锁:先查 RTCM 到没到移动站
ArduPilot RTK 固定解不锁是最常见的痛点,但九成原因不在"锁"本身,而在校正值根本没到位。按下面顺序查,别跳步。
RTCM 日志流直接告诉你流没到
移动站收到 RTCM3 协议流时,ArduPilot 会写RTCM日志流,字段是TimeUS,Chan,RTCMId,Len,CRC。打开日志看RTCMId的构成:整周模糊度解算至少要 1005(站坐标)+1004(天线高),再加 1033/1045(码与载波相位修正)和 1044(周跳)。如果只有 1033/1045,就是典型的"有浮点不锁"——修正到了、站播没到,基线收敛无从谈起。
时延与基线收敛是两个隐形杀手
代码里对移动站实例的时延容忍度放宽到了 333 ms(非移动站是 215 ms),超龄的校正报文会被直接丢弃,接收机只能吃旧修正甚至退回单点。另外基线收敛本身需要数秒到十几秒:开机后浮点解稳定、rtk_iar_num_hypotheses(整周模糊度假设数)在逐步减少,说明正在收敛,此时千万别重启、别动参数,让它跑完。
| 排查方向 | 现场表现 | 检查动作 |
|---|---|---|
| RTCM 未到 | 无RTCM日志流 | 查注入口与GPS_INJECT_TO掩码 |
| 消息种类缺失 | RTCMId只见 1033/1045 | 基站侧确认 1005/1004 站播已开启 |
| 校正值过老 | rtk_age_ms反复逼近 333 ms | 加大无线带宽,降低链路负载 |
| 多路径干扰 | 遮挡环境下 fix type 抖动 | 抬高天线,远离竖直墙面 |
| 滤波器拒收 | EKF 日志出现 GPS 拒收 | 查EK3_GLITCH_RAD与天线馈线走向 |
浮点固定来回跳:三个字段分清接收机还是滤波的问题
先读接收机自报的三个字段
ArduPilot RTK 的 fix type 在 5 和 6 之间反复横跳时,先看GPS_State里三个字段:rtk_age_ms(最近一次基线校正的年龄,毫秒)、rtk_num_sats(RTK 计算实际用到的卫星数)、rtk_iar_num_hypotheses(整周模糊度假设数)。age 稳定、num_sats 够、状态仍跳,问题多半在接收机或天线安装;age 偶发尖峰,就是链路丢包或时延。
EKF 融合滤波侧只有一个关键值
定位一旦交给 EKF 融合滤波,相关参数是 AP_NavEKF3 里的EK3_GLITCH_RAD,默认 25(单位 cm)。它的语义是"重置阈值":GPS 位置与滤波预测位置之差超过该值,滤波直接重置位置状态。⚠️ 固定解偶发跳变时,把它抬到 30~40 能换来容忍度;但不建议再往上——IMU 或罗经有漂移时,重置反而来得更晚。
换到更空旷的地方反而更差:天线安装与多路径
基线是毫米级、有坐标系的
固定解建立后,ArduPilot RTK 日志里的基线分量是rtk_baseline_x_mm / y_mm / z_mm,单位毫米,rtk_baseline_coords_type区分 0=ECEF 与 1=NED,rtk_accuracy是接收机自报的三维基线精度估计。跑双 GPS 移动基线时,MovingBase参数组只有两种类型:RelativeToAlternateInstance=0(相对另一个 GPS 实例)和RelativeToCustomBase=1(自定义基站)。两根天线的安装偏移没填进去,基线就差出这个量,精度表格里再漂亮的数字都是虚的。
多路径不在乎天有多空
"换更空旷地方反而更差"几乎全是天线安装问题:天线贴在金属顶盖上、或离竖直墙体太近,反射信号以微秒级延迟到达,载波相位直接被污染。现场先试两个动作:把天线抬高 30~50 cm,或远离墙面 2 m,观察抖动是否停止。这一步的解决率高于任何参数改动。仍不行的话,检查馈线是否盘绕、是否与金属框架贴走——这也是等效的多路径源。
U-blox 差分一页调完:配置项与坑位
🔧 这一页 U-blox 配置是 ArduPilot RTK 里 U-blox 方案的标准姿势,按顺序过一遍即可。
GPS_INJECT_TO:127 到底在干什么
仓库里参数名是_INJECT_TO,地面站显示为GPS_INJECT_TO,默认 127 是位掩码 0b1111111,即"注入到所有实例"。注入逻辑有一条硬规则:目标实例若是 rover(is_rtk_rover)会被跳过,ArduPilot 不会往自己的移动基线里注 RTCM。多 GPS 实例共存时,建议显式写成 1 或 2,别留 127,省得排查"为什么没注进去"。
两个 TYPE 值与移动基线选项位
基站端设为GPS_TYPE_UBLOX_RTK_BASE,移动站端设为GPS_TYPE_UBLOX_RTK_ROVER,驱动会自动下发对应配置。GPS_TYPE还有一组选项位:bit0 选 UART2 走移动基线数据,bit1 用基站航向做 SBF 双天线定向,另有位可让 L5 频带健康度从 L1 推断(抗干扰场景有用)。配合上文的MovingBase类型,双天线载具就能配成不依赖外部基站的"相对基线"。
# 基站侧(独立板卡,实例 1) GPS1_TYPE = UBLOX_RTK_BASE GPS1_RATE_MS = 100 # 移动站侧(实例 2) GPS2_TYPE = UBLOX_RTK_ROVER GPS_INJECT_TO = 2 # 只注入实例 2,多实例别留 127 # 移动基线(可选,双 GPS 载具) GPS_MB_TYPE = 0 # 相对另一个 GPS 实例厘米级怎么验证是真的:野外观测与起飞前三步
第一步:基线对物理距离
固定解漂亮不等于厘米级是真的。把载具停在两个已知间距的控制点,读rtk_baseline_*分量与 fix type,和实测值比对。偏差超过分米级,问题在天线偏移量或基站坐标,而不是"浮点/固定"的显示。rtk_accuracy只是接收机自报估计,不能替代地面真值。
第二步:让 EKF 融合滤波确认在用它
固定解之后,看 EKF 日志的 GPS 拒收计数:真固定解的水平新息应该小而平稳。顺带一提,固定解之后有两个值得跟的方向:一是 L5 频带增强抗干扰能力,二是视觉里程计进滤波,在拒止环境兜底。两者默认都不开,先把 ArduPilot RTK 链路本身跑稳再动它们。
起飞前检查顺序
① 基站 fix type=7 且rtk_age_ms正常;② 移动站RTCMId含 1005/1004/1033/1045;③ 固定解下飞一圈,EKF 无持续 GPS 拒收。三步全过再谈任务精度。
落到现场就两句话:先确认基站 STATIC=7,再看移动站的 RTCMId 构成与校正年龄,两样干净了才轮到 U-blox 配置和 EKF。在 ArduPilot RTK 这件事上,问题几乎从不在参数页,而在链路与天线。
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考