从米级到 2 厘米:ArduPilot RTK 定位与 EKF 融合实战指南
从米级到 2 厘米ArduPilot RTK 定位与 EKF 融合实战指南【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilotArduPilot 的 RTK 厘米级定位能把无人机的位置误差从米级压到 1~2 厘米。测绘无人机跑完一圈航迹偏了 3 米问题多半出在定位链路上——这条链路到底由哪几段组成、每一段断了会出什么症状值得拆开来逐个看一遍。精度差 1 米意味着什么先算一笔账。精准农业里行距 20 厘米的喷洒作业如果定位漂了 1 米相邻两趟药带要么重复喷施烧苗、要么留下漏喷的空当电力巡线时镜头指向偏差 1 米缺陷点直接落在画面外这趟飞了等于没飞。对测绘建模来说米级误差还会拉低航线间的重叠质量后期拼接和实景重建的精度天花板直接被定位误差锁死。三种常见定位水平的差别如下定位方式精度与收敛典型用途单点定位2~5 米瞬时可用基础导航、户外穿越DGPS亚米级收敛需数分钟中等精度测量、粗略建模RTK 固定解1~2 厘米数秒至数分钟测绘、喷洒、巡线等精密作业RTK 链路最小配置3 分钟搭通第一条数据链 一条 RTK 链路最短路径是一台静态放置的机载飞控当基站它通过串口或 MAVLink 把 RTCM3 差分改正流发给执行任务的移动站。参数层面两边都只需要动几个关键项源码里接收器的驱动与协议解析集中在 AP_GPS 库改参数前先翻一眼它总没坏处。基站侧# 基站静态 U-blox RTK 基准站 GPS_TYPE17 # GPS_TYPE_UBLOX_RTK_BASE GPS_AUTO_CONFIG1 # 自动下发 U-blox 配置 GPS_RATE_MS100 # 100Hz 输出数据链余量更足基站全程固定不动它测得的载波相位噪声里与卫星相关的公共误差会被共享给移动站扣除。位置一定要选开阔、远离金属和玻璃的地方基站自身差发出去的改正就全是垃圾。移动站侧# 移动站U-blox RTK rover GPS_TYPE18 # GPS_TYPE_UBLOX_RTK_ROVER GPS_AUTO_CONFIG1 GPS_RATE_MS100 # 改正数经 MAVLink GPS_RTCM_DATA 注入本机接收器GPS_TYPE的取值在 AP_GPS.h 里定义17/18 这对组合就是移动基线Moving Base模式的入口。两边接好后数据流是这样走的链路健康验证点打开数据日志盯住rtk_age_ms最后一次基线改正的年龄持续低于 500 毫秒说明改正流实时在线它归 0 表示根本没收到改正跳到秒级则链路已经在断断续续地喂旧数据。RTK 怎么把误差压进 2 厘米先把三个概念说透。载波相位GPS 信号是电磁波测量它到达时的相位比测码距离细得多但起点差了整多少个周期是 RTK 的原料整周模糊度相位测量缺失的那个整数周期数解对了就是厘米级解错一个就是几十米是全部难点RTCM3一套标准化的差分数据打包协议是运输工具。流程串起来就三句话基站把本站的观测值和参考点信息按 RTCM3 协议打包广播出去移动站收下后在我的相位测量减去公共误差剩下的量里搜索那个整周模糊度一旦模糊度固定fixed载波相位就从漂亮但带模糊的数变成真尺子位置误差瞬间落进厘米区间。搜索失败的窗口期就是 FLOAT 态浮点解模糊度还没锁死精度只有分米级这也是为什么 RTK 有时卡住不动。ArduPilot 里解析这一层的类是 RTCM3_Parser它逐字节扫描以0xD3开头的帧头重组后单包最长 720 字节——因为经 MAVLinkGPS_RTCM_DATA传输时要拆成 4 段 180 字节的碎片。消息流的骨架大致是移动站收到一切之后固件会把自己的定位等级映射成 AP_GPS_FixType 里这套状态值GCS 地面站显示的 fix 类型就来自它状态值白话含义3 FIX_3D普通三维定位米级4 DGPS差分增强过亚米级5 RTK_FLOAT模糊度还在漂浮分米级6 RTK_FIXED模糊度已固定厘米级7 STATIC基准站静态模式状态机里还有一个容易忽略的字段组rtk_num_satsRTK 实际用上的卫星数和rtk_baseline_x/y/z_mm相对基线分量毫米。这些字段连同rtk_age_ms一起构成了判断链路质量的原始证据后面踩坑部分全靠它们。EKF 与 GSF脏数据怎么拧成干净航迹RTK 给的是偶尔跳一下的厘米级位置IMU 给的是高频但会漂的推算气压计给的是粗糙的高度。EKF扩展卡尔曼滤波干的活儿一句话两个节拍先预测再更新。IMU 一到就按物理方程把上一秒的位置、速度、姿态向前外推同时承认我推得越久越不靠谱把不确定性协方差撑大GPS 样本一到就算预测值与观测值的差新息 innovation做合理性检验——跳变太大直接扔掉没被扔掉的样本按卡尔曼增益加权把状态拉向观测、把不确定性压小。整条流水线可以压成一行IMU 高频推算(预测) → GPS 观测做新息检验 → 卡尔曼增益加权(更新) → 输出位置/速度/姿态为什么还需要 GSF因为上电那一刻的航向yaw往往最没把握而航向错了水平速度观测就全拧着劲。ArduPilot 的办法是并行养一小群 EKF每套假设一个不同的初始航向多假设高斯和滤波Gaussian Sum Filter跑几秒后 GPS 一致性会自然淘汰掉假设错的、加权留下对的实现代码可以看 EKFGSF_yaw.h 与 AP_NavEKF3。这套机制解释了为什么起飞后头几秒 EKF 位置会抖一下再稳下来——那不是故障是假设在收束。自适应权重则是 EKF 对链路质量的后门HDOP 变差、卫星数掉到 8 颗以下时把 GPS 观测噪声调大等价于降权让 IMU 多担一会儿RTK 固定且rtk_age_ms健康时反过来收紧 GPS 权重。参数入口在EK2_*一族EK2_GPS_TYPE、EK2_GLITCH_RAD等不用追求一次调到位先看日志再动一个参数。踩坑速查 ⚠️症状RTK 长期 FLOAT 不固定→ 最可能是改正链路时断时续或可见卫星几何差动作先查rtk_age_ms是否稳定低于 500再看rtk_num_sats是否够数数据链丢包就重拉链路或挪到更开阔的位置。症状靠近楼宇/铁塔时航迹漂移、抖动→ 多半是载波多路径信号经金属反射后走了歪路或天线装反动作天线挪离金属面板、检查馈线方向条件允许换带地面板的天线。症状EKF 位置突跳、滤波器报警→ 通常是 IMU/罗盘未校准或安装松动脏样本绕过新息检验进了滤波动作重新校准加速度计与罗盘固定好硬件再观察 glitch 计数是否归零。这条线还会往哪走多频段L1/L5 双频乃至三频接收机进入主流模糊度收敛更快、抗干扰更强。视觉辅助GPS 被树冠或隧道遮挡时视觉里程计与惯性导航接力维持定位连续性。ML 自适应调参用机器学习根据历史飞行数据动态推荐观测噪声参数省掉手工试错。5G 融合蜂窝网络提供辅助改正与网络定位备份城市峡谷里的定位体验会明显变好。那 3 米偏差的航迹现在你知道该去链路的哪一段找答案了。下一步就一件打开参数日志盯住rtk_age_ms那一列持续低于 500 毫秒链路才算真正健康。【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考