
把UM982装到无人机上之前我先劝退一波如果你只是想飞个航拍、做个视觉跟随那普通GPS完全够用没必要折腾RTK。但如果你要做的是农田变量作业、电力巡检的厘米级航线复飞、或者无人机起降平台的精准对接那单点定位那个两三米的误差会让你的航线每次画出来的都是“平行世界”。我这次用和芯星通的UM982模组给四轴DIY无人机搭了一套厘米级RTK定位系统从硬件接线到差分数据链路、再到飞控参数配置全部走通这篇文章把完整过程和配置代码整理出来给打算自己动手的人一条能直接抄的近路。UM982这个模组最大的特点是双频四系统且内置RTK解算也就是说它不只输出原始观测值自己就能算出固定解不需要像传统方案那样再挂一个树莓派跑RTKLIB。这对于机载端减重、降功耗来说非常关键。整篇文章会围绕三个问题展开为什么用UM982、怎么把差分数据和定位结果接进飞控、以及实际调试中会遇到哪些坑。中间会给出我实测可用的串口配置命令、Python配置脚本和ArduPilot/PX4侧的对接参数适合已经有一定无人机DIY经验、想往高精度定位方向进阶的玩家参考。1. 方案选型思路为什么是UM9821.1 UM982的核心优势UM982属于和芯星通推出的双频RTK模组支持BDS B1I/B2I、GPS L1/L2、GLONASS L1/L2和Galileo E1/E5b可以同时跟踪多个频点的卫星信号。RTK的厘米级效果很大程度上依赖双频观测值来快速消掉电离层延迟所以双频是硬门槛。单频模块也能做RTK但初始化时间长、固定率低在无人机这种动态场景下基本没法用。另一个关键点是UM982内部已经集成了RTK解算引擎填好基准站差分数据后模块直接输出固定解坐标数据格式是标准的NMEA 0183和UBX协议。对比一下市面上常见的几种方案方案定位能力机载端计算要求功耗部署复杂度普通单频GPS模块米级无低低单频RTK如NEO-M8P厘米级但固定慢无中中UM980/UM982厘米级双频四系统无内置解算中中原始观测值RTKLIB后处理厘米级高需单板机高高当时我也纠结过是否直接用原始观测值输出、然后在机载树莓派上跑RTKLIB后来放弃了。原因很实际RTKLIB在动态场景下的解算参数调起来很费劲而且树莓派在无人机上受振动、温度影响跑着跑着进程崩溃也是常有的事。UM982把解算放到模块内部完成机载端只要通过串口读取结果就行稳定性和实时性都更有保障。1.2 这套系统能解决什么问题从应用场景来说UM982上无人机最直接的收益是把位置误差从两三米压缩到两三厘米。具体到任务层面农业无人机按预设航线喷洒或采集田间数据时同一航带每次飞行不会偏离后期拼接和处理数据不再需要大量人工校正电力巡检场景中无人机可以沿电线走廊的厘米级航线自动飞行吊舱指向更稳定无人机起降平台上飞行器能精确降落到指定位置不再依赖视觉标志或人工遥控微调这套方案适合两类人一是已经会折腾Pixhawk、ArduPilot或PX4的飞控玩家想给自己的机器加高精度定位能力二是做测绘、农业、工程监测相关项目开发的技术人员需要低成本验证RTK技术路线。纯新手建议先熟悉基本飞控调参再上手RTK否则外场调试时出了定位问题会跟飞控问题混在一起很难排查。2. 硬件准备与接线要点2.1 模块的引脚和供电UM982模组是邮票孔封装需要自己画转接板或者买现成的开发板。硬件准备清单如下UM982模组或最小系统板一块双频有源天线一根要求支持BDS B1I/B2I和GPS L1/L2USB转TTL串口工具一个CH340或CP2102均可3.3V稳压电路推荐使用低纹波的LDO无人机飞控一套ArduPilot或PX4均可供电方面UM982核心电压是3.3V但天线馈电通常是3.3V或5V具体看天线规格。我踩过的坑是直接用飞控的5V引脚给模块供电结果飞控电调一启动电压跌落导致UM982反复重启。后来改成独立LDO给模组供电天线馈电单独从稳压模块取问题才消失。无人机环境的电源噪声问题比桌面开发严重得多务必在供电上下点功夫。2.2 天线选择的两个关键参数RTK天线不能随便用普通GPS天线。第一必须是有源天线内置LNA放大电路否则长馈线损耗会直接吃掉卫星信号第二最好是双频有源天线支持L1/L2或B1/B2频段。单频天线接在UM982上虽然也能用但RTK解算会损失很多卫星观测量固定速度明显变慢。天线安装位置同样影响很大。无人机的机架结构、电池、图传模块都会对GNSS信号造成遮挡和多路径干扰。我把天线装在机架顶部的碳纤维桅杆上下方垫一块接地良好的金属地平面这样天线能获得更好的天空视野。实测同样的环境下天线抬高15厘米并加装地平面后固定率从80%左右提升到了98%以上。2.3 接线关系和串口分配UM982一般有两个UART一个用于输出定位结果到飞控另一个用于接收基准站差分数据。以ArduPilot飞控为例接线如下UM982 UART1 TX - 飞控GPS端RXUM982 UART1 RX - 飞控GPS端TX串口波特率默认先设115200UM982 UART2 RX - 数传或4G模块TX用于接收RTCM差分数据模块和天线之间用SMA接口同轴馈线连接尽量短这里有个容易搞混的地方飞控的GPS串口是全双工还是半双工。Pixhawk系列部分GPS串口支持全双工可以同时收发数据但有些飞控的UART是单向的只能接收GPS数据这时候差分数据就不能走飞控串口转发了。我的做法是差分链路完全独立通过数传模块直接进UM982的UART2飞控只负责读取定位结果各管各的互不干扰。3. RTK定位原理与数据链路设计3.1 RTK的厘米级是怎么来的RTK全称实时动态差分定位核心思路是“空间相关误差互相抵消”。卫星信号从太空到地面接收机会经过电离层和对流层这两层带来的延迟误差在同一时刻、同一小范围内是高度相关的。基准站架在已知位置把观测到的误差算出来然后通过差分数据告诉移动站移动站用这个误差修正自己的观测值精度就能从米级提升到厘米级。UM982在移动站模式下做的事情比传统RTK接收机更简化它接收基准站发来的RTCM 3.x格式差分数据结合自身采集的双频载波相位观测值在模块内部完成双差解算直接输出NMEA GGA语句和UBX协议的位置信息。GGA语句中的质量标识字段可以区分定位状态4代表RTK固定解5代表RTK浮点解这两个状态决定了你的无人机能不能按厘米级精度飞行。3.2 差分数据来源自建基站还是NTRIP差分数据不是凭空来的至少需要一套基准站。最简单的方案是自建基准站用第二块UM982或者其他RTK接收机架在已知坐标点上通过电台、WiFi或4G把RTCM数据播发给无人机。自建基站的问题是基准站本身要静态放置坐标要准确否则移动端解算出来的位置会整体偏移。另一种更轻量的方案是接入网络RTK服务。国内主流的连续运行参考站系统或商业RTK服务商都提供NTRIP协议接入无人机端用4G数传模块连接NTRIP服务器获取当前区域的高精度差分数据。我的建议是外场测试阶段先用网络RTK减少一套基准站的设备投入等确定无人机作业区域固定后再考虑自建基站降低长期流量成本。3.3 数据流和控制闭环整个系统的数据流可以拆成两路来看。一路是差分数据流基准站或NTRIP服务器 - 数传链路 - UM982 UART2另一路是定位结果流UM982 UART1 - 飞控GPS接口 - 飞控EKF滤波器 - 位置速度估计。飞控最终关心的是当前定位是否可信。ArduPilot和PX4都有GPS定位精度检测机制如果RTK固定解丢掉了飞控的EKF会切回普通GPS模式无人机在航线任务中可能出现位置漂移。因此我在地面站里设置了一个监控项实时查看GGA语句的质量标识和飞控的定位状态只要发现连续丢固定解就立即切换手动模式避免航线执行过程中出现不可控偏移。4. 配置实操与配置代码4.1 串口连接和环境准备开始配置前先把UM982通过USB转TTL模块连接到电脑用串口助手或者PuTTY打开对应的COM口。首次连接建议把波特率设置为115200这是UM982的默认串口参数8位数据位、1位停止位、无校验。打开串口后先给模块发送一个空行或者查看指令确认模块有响应输出。正常状态下模块会按设定频率输出NMEA语句通常默认是GGA、RMC、GSA等。如果没有任何输出优先检查TX/RX有没有接反再查波特率是否匹配。4.2 基础配置设置输出语句和更新率UM982支持通过串口发送配置命令来调整输出语句和频率。以常见的UBX协议配置为例配置思路是把不用的语句关掉、只保留需要的GGA和UBX状态语句同时把更新率调到5Hz甚至10Hz保证无人机快速运动时的位置更新不滞后。下面是我实际使用的配置流程发送关闭默认输出语句的配置命令减少串口带宽占用发送设置GGA输出频率为5Hz的命令发送设置UBX位置解算结果输出频率为5Hz的命令发送设置动态模式为“空中模式”的命令该模式下的滤波参数更适合无人机快速机动场景发送保存配置的命令避免断电后配置丢失需要注意的是UM982不同固件版本对命令的格式定义可能略有差别拿到模块后先查看官方数据手册的配置章节。上面的配置逻辑是通用的具体字节流要以固件对应文档为准。4.3 用Python脚本批量配置和验证每次用串口助手手动发命令太慢而且容易漏发我写了一个简单的Python脚本用pyserial库批量发送配置命令并自动检查模块返回结果。import serial import time SERIAL_PORT COM3 BAUDRATE 115200 def send_config(ser, cmd_bytes, note): ser.write(cmd_bytes) time.sleep(0.2) if note: print(f[配置] {note}) def main(): ser serial.Serial(SERIAL_PORT, BAUDRATE, timeout1) time.sleep(0.5) # 进入配置模式具体指令参考UM982手册的CFG部分 # 这里以通用的配置命令格式示意实际使用时替换为固件支持的完整命令 send_config(ser, bytes.fromhex(B5 62 06 00 14 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00), 设置串口参数) # 设置GGA输出频率为5Hz send_config(ser, bytes.fromhex(B5 62 06 08 06 00 C8 00 01 00 01 00), 设置GGA输出频率) # 设置动态模式为空中模式 send_config(ser, bytes.fromhex(B5 62 06 24 24 00 FF FF 06 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00), 设置动态模式) # 保存配置 send_config(ser, bytes.fromhex(B5 62 06 09 0C 00 00 00 00 00 FF FF 00 00 00 00 00 00), 保存配置) # 读取并打印一段时间内的GGA语句验证配置是否生效 print([验证] 开始读取GGA语句...) start time.time() while time.time() - start 10: line ser.readline().decode(ascii, errorsignore).strip() if line.startswith($GNGGA): print(line) ser.close() if __name__ __main__: main()这段脚本的核心逻辑是先通过串口把各个配置项写进模块然后回读GGA语句确认配置生效。在实际项目里建议把脚本参数化把波特率、输出语句、更新率这些配置项单独放到一个配置文件里方便不同飞机复用时快速切换。4.4 配置完成后的验证方法配置完成后把UM982放在开阔场地连上差分数据源观察模块输出的GGA语句。重点关注GGA中的质量标识字段位置在第6个逗号后面。质量标识为4表示固定解5表示浮点解1表示单点定位。固定解状态下经纬度的小数位会稳定在厘米级的变化范围肉眼观察时小数部分不再大幅跳动。我还习惯同时记录GST语句它包含位置标准差的估计值。水平标准差小于2厘米且垂直标准差小于5厘米基本可以判断模块工作正常。如果固定解迟迟不出现直接把天线换到楼顶或空旷操场再试绝大部分初始化失败都是信号环境问题而不是模块本身的问题。5. 接入飞控与整机联调5.1 ArduPilot侧的参数配置UM982输出的是标准NMEA协议ArduPilot可以直接识别但需要配置GPS类型和波特率。以ArduPilot 4.x固件为例参数名推荐值说明GPS1_TYPE5串口GPSNMEA协议SERIAL4_PROTOCOL5GPS协议SERIAL4_BAUD115对应115200波特率GPS_AUTO_CONFIG1自动配置部分GPS参数GPS_GNSS_MODE3允许GPS北斗需要注意ArduPilot中如果用NMEA协议某些自动配置能力会比UBX协议弱。UM982如果不改为UBX输出模式建议把GPS_AUTO_CONFIG保持默认然后手动检查EKF是否正常接收位置数据。地面站地图上飞行器位置不再跳变、并且能显示RTK固定状态时说明飞控已经正确识别UM982的定位结果。5.2 PX4侧参数设置PX4的配置逻辑和ArduPilot有所不同。PX4通常把GPS挂在TELEM或GPS专用的串口上需要设置GPS协议为NMEA并开启RTK相关参数。关键参数大致如下GPS_1_CONFIG设置为对应串口的设备路径GPS_1_BAUD设置为115200GPS_1_PROTOCOL选择NMEA或UBX取决于UM982输出的协议GPS_RTCM_PASSTHROUGH启用RTCM透传如果差分数据是从飞控串口转发到UM982就需要开启我在PX4上走的是差分数据独立链路所以没有开启RTCM透传UM982的UART2直接接数传模块。这样飞控只负责消费定位结果不参与差分数据转发链路更简单也更容易排查问题。5.3 联调检查清单和实际飞行表现整机联调时我按照下面的顺序逐项确认避免上天后才发现问题上电后检查UM982是否正常输出GGA飞控日志中GPS状态是否为3D Fix确认差分数据源在线UM982的定位状态从单点切换到浮点再到固定解检查飞控EKF状态GPS位置创新值是否小于阈值切换至Loiter或Auto模式观察飞行器能否稳定悬停悬停时位置漂移是否在厘米级实际测试中我用的是一台轴距550毫米的四轴整套RTK系统加上天线和线缆重量不到60克。固定解状态下Loiter模式悬停10分钟位置漂移基本保持在5厘米以内。对比同一台飞机换回普通GPS后的表现普通GPS的悬停漂移半径大约在1米到1.5米提升非常明显。6. 常见问题与排查6.1 问题速查表现象可能原因处理方法串口无输出TX/RX接反、波特率不匹配、供电不足检查接线确认串口参数测量供电电压一直单点定位差分数据未到达、天线遮挡严重检查数据链路查看RTCM接收状态换开阔场地长期浮点解不固定基线过长、差分数据延迟大、卫星数少换更近的基站或网络RTK缩短数据链路时延固定解频繁丢失动态场景下观测值中断、天线相位中心偏移检查天线安装牢固性调整动态模式参数飞控显示GPS但位置跳变NMEA协议下GGA频率不足、EKF未正确识别RTK状态提高GGA输出频率检查飞控参数配置模块异常发热或反复重启供电电压不稳、天线馈电短路检查电源纹波更换稳压模块其中差分数据未到达是最常见的问题。我在调试中遇到过数传链路显示数据在收发但UM982始终停留在单点定位的情况。后来抓包一看数传发的数据被分帧了UM982收到的RTCM并不完整模块无法解析出差分改正信息。解决办法是调整数传的空中波特率和帧策略确保RTCM数据包不被截断。6.2 天线安装的细节陷阱无人机上的RTK天线安装是个很容易被低估的问题。碳纤维机架会屏蔽GPS信号所以天线必须安装在机架最高点以上周围不能有碳板遮挡。另外螺旋桨气流和电机振动虽然不会直接改变天线接收能力但会导致天线相位中心轻微晃动在多路径环境下引起定位噪声。我给无人机装天线时特意在碳纤维板上开了一个圆孔把天线底部的磁吸底座换成尼龙螺钉固定避免金属螺丝在射频近场形成反射。看起来很小的改动实际固定率提升了10个百分点以上。如果你发现某架飞机RTK固定率始终上不去先检查天线周围有没有金属物体遮挡再怀疑模块本身。6.3 数据链路时延的影响RTK差分数据的时效性直接决定定位精度。基准站播发的RTCM数据经过无线电、4G链路传输到移动站如果时延超过2秒移动站计算固定解时使用的差分改正数已经“过时”解算结果会从厘米级退化到分米级甚至浮点解。我在外场测试时用网络RTK服务4G信号的延迟在40到80毫秒之间正常作业没有问题。但如果飞行区域处于4G弱信号环境差分链路时延会明显增加这时候建议改用大功率数传电台做本地基准站播发延迟可以压到10毫秒以内。选择差分链路时优先保证低时延而不是高带宽RTCM 3.x数据类型的数据量并不大但实时性要求极高。6.4 飞控端RTK状态识别还有一个容易被忽略的问题UM982算出固定解并不代表飞控知道。ArduPilot和PX4是通过NMEA GGA语句中的质量标识来判断RTK状态的如果UM982输出协议配置错误或者GGA语句被飞控解析异常即使模块已经在输出固定解飞控依然按普通GPS模式处理飞行精度上不去。我建议在地面站的HUD或日志监控里直接查看GPS的定位状态字段而不是只用眼睛看UM982的指示灯。只有飞控层面确认固定解状态才能保证自动航线执行时用的是厘米级精度。如果不确定飞控是否识别RTK状态可以把GPS串口的原始数据在Mission Planner的串口监视窗口打印出来人工核对GGA语句的完整性。简单总结一下我折腾这套系统的体会UM982的硬件性能和集成度确实让人省心只要差分链路不断、天线安装合理稳定输出厘米级固定解不是什么难事。真正的坑反而都在细节里电源纹波、天线位置、数据链路时延、飞控协议匹配每一项都能让你排查很久。如果你也要做类似的DIY项目我建议不要一上来就追求极限精度先用网络RTK把整条链路跑通确认飞控能稳定识别固定解状态再逐步优化天线安装和差分链路。最后再分享一个实用技巧把UM982的配置脚本和飞控参数表都存到版本管理里外场调试时出了问题可以直接回滚而不是在现场一条条命令重新敲。这套系统我已经在农业地块数据采集无人机上连续工作了几十个小时固定率和精度表现都相当稳定希望这篇文章能帮你少走一些弯路。