聊无人机定位很多人都觉得GPS、北斗这些已经很成熟了天线一插、模块一连就能用。但真到跑自主飞行、精准喷洒、测绘航线的时候普通单点定位那种三五米的误差直接能把一次精心规划的作业毁掉。我前阵子给一台四轴DIY无人机折腾RTK定位系统最后用UM982模组把整条链路搭通了在开阔场地上固定解的定位精度稳定到了厘米级。这篇文章就把我从选型、接线、配置到飞控集成的完整过程写下来给想在无人机上做精准定位的朋友当一份实战参考。这套方案适合三类人一是想给自己组装的飞控系统加RTK能力的DIY玩家二是做精准农业、航测、电力巡检这类需要厘米级定位的项目开发者三是在无人车、机器人平台上做定位感知想快速验证RTK方案的工程师。UM982这颗模组本身不贵支持双频多系统输出RTCM3差分数据也方便是我对比过几个方案之后觉得性价比最均衡的选择。1. 项目定位与整体方案设计1.1 为什么无人机需要厘米级RTK定位普通无人机上用的大多是单点定位的GNSS模块精度通常在2到5米之间。这个精度用于手动飞、看个大概位置完全没问题但一旦涉及自动航线、定点悬停、精准降落、测绘打点这类任务误差就会被放大得很明显。比如做农田变量喷洒航线间距靠厘米级定位来保证如果位置飘了半米喷出来的药就可能重了或漏了再比如航测建模照片的POS数据不够准后期空三解算就容易出现模型变形、接边错位。RTK实时动态差分定位解决的就是这个定位精度问题。它的思路很直接在地面架一个位置已知的基准站移动站通过差分改正数消除卫星信号传播过程中的公共误差最终把定位精度推到厘米级。UM982这颗模组本身就是为这种场景设计的支持GPS、BDS、GLONASS、Galileo多个系统内置RTK解算能直接输出固定解状态不需要外接独立解算板卡非常适合集成到无人机这类体积和功耗都有要求的平台上。1.2 关键器件选型UM982模组与其他方案对比我在选型阶段对比过几类方案普通消费级GPS、专业测绘级板卡、UM982这类集成RTK的模组。普通GPS不提了精度摆在那。专业测绘级板卡像天宝、徕卡的接收机精度确实最好但价格和体积对DIY项目来说完全不现实。中间这个档位UM982的优势就很明显了。UM982属于国产和芯星通的双频RTK模组支持BDS和GPS等系统关键特性包括内置RTK解算、支持RTCM3协议、20Hz的高更新率输出功耗也比较低。它的输出协议比较开放既能输出标准的NMEA语句也能输出二进制协议方便对接飞控、单片机或者自己的上位机软件。从系统集成的角度讲这比一些封闭协议的五金模块省心得多。我见过不少人在DIY项目中选了相对小众的RTK模块结果协议文档不公开接线定义含糊折腾到最后发现精度再高也调不通数据只能弃用。UM982至少在资料获取、技术支持、社区案例这几个维度上是比较友好的这对一个人单打独斗做DIY项目来说非常重要。1.3 系统架构基准站移动站差分链路搭建RTK系统核心是“基准站移动站差分数据链路”这三板斧。基准站架设在一个已知坐标的固定点持续接收卫星观测数据并生成差分改正数移动站就是无人机上装的那套设备接收差分改正数后和自身的卫星观测数据一起解算输出厘米级定位结果。差分数据链路可以走几种方案。最传统的是数传电台基准站和移动站之间点对点传输RTCM3数据优点是不依赖公网适合野外没有信号的环境缺点是电台本身有成本和重量距离受限。现在更流行的是4G网络NTRIP方案基准站的数据通过网络推送到云服务器移动站通过4G模块从服务器拉取适合开阔场地和城市环境。我这次做测试用的是短距离串口直连验证后面飞航线时切到4G链路。对于UM982来说它的角色既可以当基准站也可以当移动站取决于固件配置模式。我这次把地面端和空中端都用了UM982一套当基准站一套当移动站串口之间用数传模块中转差分数据。这套架构的好处是两端模组一致配置起来不用来回切换协议。2. RTK定位原理“为什么能到厘米级”的通俗拆解2.1 单点定位的误差从哪来要理解RTK的价值首先得知道普通单点定位为什么不准。GNSS定位的基本原理是测量卫星信号从卫星到接收机的传播时间乘以光速得到距离。这个距离称为伪距因为它并不是精确的距离里面混着一堆误差。这些误差主要来自几个方面卫星星历误差、卫星钟差、电离层延迟、对流层延迟、多路径效应、接收机噪声等。其中电离层和对流层延迟是最主要的误差源在恶劣天气或者低仰角卫星较多的环境下误差能放大到好几米。普通单点定位就是拿这些带误差的伪距去解方程解出来的结果自然飘。RTK的思路不是逐个去消除这些误差而是利用了误差的空间相关性。两台接收机如果距离不是特别远同一颗卫星的信号经过的路径非常相似电离层和对流层延迟几乎一样。把基准站的观测值和移动站的观测值做差这些公共误差就被大幅消掉了。剩下的主要是接收机噪声和多路径这类局部误差量级小很多。2.2 载波相位观测与整周模糊度只靠伪距差分能做到分米级就不错了因为伪距观测本身的噪声就在分米到米级。RTK能推到厘米级靠的是载波相位观测。简单说卫星信号除了有码信息还有一个高频的载波。接收机可以测量载波相位精度远高于码相位。打个比方伪距测量就像用一把厘米刻度的尺子量距离能读到厘米但手抖一下就读不准了。载波相位像是一把毫米刻度的精密尺子但麻烦的是接收机只能测到尺子最末端的一小段读数不知道前面到底过了多少整格。这个“不知道的整格数”就是整周模糊度。RTK解算的核心任务就是通过差分观测值、卡尔曼滤波或者最小二乘的搜索算法把这个整周模糊度解出来。模糊度一旦固定坐标精度就能从分米级跳到厘米级。UM982内置的解算器就是干这个事的。所以你在配置完RTK之后一定会在输出数据里看到几个状态单点解、浮点解、固定解。固定解就意味着整周模糊度已经解出来了这个状态下输出的定位结果才是厘米级。浮点解说明模糊度还在逼近过程中精度只有几十厘米到米级这时候飞自动航线是要冒风险的。2.3 RTK差分的工作方式与坐标系对齐RTK的差分处理分两种常见方式实时差分和事后差分。无人机项目里用的是实时差分基准站实时计算改正数并发送给移动站移动站实时解算并输出。事后差分也叫PPK是在飞行结束后用软件处理原始观测值得到高精度轨迹适合测绘类项目但对无人机实时控制没有帮助。关于坐标UM982输出的经纬度坐标是基于WGS84椭球或者与之兼容的坐标系。好消息是飞控里做位置控制时内部会把经纬度转换成当地水平坐标比如PX4和ArduPilot都有这套坐标转换逻辑所以RTK输出的坐标可以直接接入飞控的导航滤波器不需要自己再做坐标系转换。但有一个点必须注意RTK天线的相位中心位置和飞控IMU的几何中心不重合这个偏移量如果不补偿飞机会在倾斜姿态下产生明显的位置偏差这个问题我在后文会专门讲。3. 硬件准备与接口连线3.1 器件清单与天线选型这套系统需要准备的硬件如下UM982模组核心板两套一套基准站一套移动站也可以只买一套轮流刷配置有源GNSS双频天线两根要求支持GPS L1/L2、BDS B1/B2频段串口转USB模块一个用于连接电脑配置模组飞控一套我用的是Pixhawk系列兼容UM982的UART输入数传模块或者4G模块用于差分数据链路传输稳压电源模块给模组提供稳定3.3V供电天线是这套系统里最容易忽视的环节。RTK要达到厘米级天线质量直接决定观测值质量。我一开始贪便宜用了一根普通的单频有源天线结果在树荫下测试时固定解总是丢了。后来换了一根双频有源天线情况立刻改善。选天线时注意三个指标是否支持双频、噪声系数是否够低、相位中心稳定性是否好。无人机装机时天线最好放在机身上方远离碳板、电池和电机因为碳纤维会屏蔽卫星信号电机和电调是强电磁干扰源。3.2 UM982模组接口与供电要求UM982模组的接口在核心板上一般都有标注常用的包括UART串口、电源脚、天线馈电脚、PPS秒脉冲输出等。我用的核心板是把引脚引出来的直接通过排针连接。供电上UM982模组需要3.3V电流峰值大概在100多毫安带天线馈电时还要额外给天线供电多数核心板板上都集成了天线馈电不需要外接。接线的时候有几个容易踩的坑。第一电源纹波要小GNSS模组对电源噪声比较敏感如果直接并联在电机的电源线上很大的概率会出现定位跳变。第二串口电平要匹配UM982的串口是3.3V TTL电平接飞控的UART串口时一定要确认飞控那边的电平也是3.3V不能直接怼5V。第三天线馈电电压要和有源天线匹配一般天线用3.3V或者5V馈电买模块的时候问清楚。3.3 与飞控/开发板的接线图示例我这边移动站部分的接线是这样做的UM982的TX1连接Pixhawk的TELEM2 RXUM982的RX1连接Pixhawk的TELEM2 TXGND共地3.3V供电从Pixhawk的AUX口或者独立稳压模块取。基准站那边UM982通过USB转串口连接到一台笔记本或者树莓派树莓派上跑一个串口转发服务把RTCM3数据通过4G网络送上NTRIP服务器。这里说一个走线经验UM982和飞控之间的串口线尽量短最好用双绞线或者屏蔽线并远离电调输出线和大电流线。我刚开始直接用了普通的杜邦线顺着机身走飞起来之后发现RTK固定解会频繁丢失还以为是天线问题。后来加长了天线馈线、把串口线重新走到机臂内侧问题就消失了。高频电路里布线就是玄学其实都是电磁兼容的问题。4. 配置代码与通信协议实操4.1 串口通信参数与连接工具在配置UM982之前先确认模组和电脑之间能正常通信。我用的方法是USB转串口模块连接到模组的UART1打开串口工具设置波特率115200、数据位8、停止位1、无校验。UM982默认的NMEA输出波特率一般是115200如果之前有人改过配置可以尝试9600或者38400逐个试。连接正常后串口终端里能看到模组输出的GNGGA、GNRMC这类NMEA语句。其中GNGGA语句里的定位质量指示字段是关键如果是4代表RTK固定解5代表RTK浮点解1代表单点定位。我先习惯用这个字段快速判断RTK状态不用解读一堆二进制数据。不同批次的UM982固件版本不同命令集可能会有差异所以下面的配置流程是基于我手头这个模组的固件版本验证过的具体命令字符如果和你的模组不一致以官方命令手册为准。4.2 移动站模式初始化配置UM982默认上电后可能工作在单点定位模式要让它进入移动站模式、接收差分数据并输出结果需要在串口里发配置命令。我用的核心板支持通过ASCII指令和二进制协议两种方式配置。下面这段是典型的初始化流程# 恢复默认配置 RESTOREDEFAULTS # 设置输出GGA、RMC语句用于状态监视 GNGGA,10 GNRMC,10 GNGST,10 # 设置定位更新率为20Hz适合无人机动态场景 RATEPOS,20 # 开启RTCM3差分数据输入 RTCM3,IN,ENABLE # 保存配置到Flash SAVECFG这里有几个关键点要解释。GNGGA,10表示每隔10秒输出一帧GNGGA语句这个频率用来查看RTK解状态够用了但实际送给飞控的数据要靠后面的设定。RATEPOS,20是把导航定位输出频率设为20Hz无人机飞行时姿态变化快低频输出会让位置控制滞后所以这个频率建议至少10Hz最好20Hz。RTCM3,IN,ENABLE是让模组接收来自基准站的RTCM3格式差分数据。移动站本身不做差分改正数生成它只管接收并使用差分数据。如果你在串口工具里收到RTCM3格式的二进制数据后模组没有从单点解变成固定解先检查这条是否启用了。4.3 基准站模式与RTCM3差分数据输出基准站的配置略有不同。它需要固定在已知坐标并持续输出RTCM3差分数据。已知坐标可以通过两种方式获得一是用测绘级的站点坐标二是让基准站自己连续观测几分钟做单点定位平均精度虽然不如前者但对短距离RTK测试完全够用。基准站模式的关键配置如下# 设置基准站模式 STATION,1 # 设置基准站自身坐标格式为经度、纬度、高度 STATIONPOS,东经116.397,北纬39.909,50.0 # 设置输出RTCM3差分数据 RTCM3,OUT,ENABLE # 设置差分数据输出频率 RTCMOUT,RATE,10 # 保存配置 SAVECFG基准站坐标的准确性会影响整个系统的绝对精度。如果基准站坐标偏了半米那移动站固定解的绝对坐标也会跟着偏半米相对精度是厘米级但绝对位置找不到北。做航测这类对绝对精度敏感的任务基准站最好架在已知控制点上做自主飞行这类只需要相对位置稳定的场景自测平均坐标就够了。RTCMOUT,RATE,10表示RTCM3数据每秒输出10次这个频率要和移动站的定位更新率匹配。我建议基准站和移动站的更新率保持一致这样移动站每次融合差分数据时都能拿到最新的改正数不会因为数据率不匹配导致固定解频繁退出。4.4 飞控参数调整与数据链路打通UM982配置好之后输出的是NMEA语句和二进制协议数据。Pixhawk飞控默认就可以识别常见的GNSS协议但为了让它正确解析UM982的数据需要做两件事。第一把UM982的串口输出协议切换到二进制协议因为飞控的EKF滤波器对二进制协议的处理效率更高、时间戳也更精确。第二在飞控参数里把对应的串口开启为GPS端口。以ArduPilot为例我通过Mission Planner连接飞控在全部参数表里做如下调整SERIAL2_PROTOCOL5 # TELEM2端口设置为GPS协议 GPS1_TYPE1 # GPS1启用 GPS_AUTO_SWITCH1 # 允许自动切换GPS EK3_SRC1_POSXY3 # 使用GPS作为水平位置源 EK3_SRC1_VELXY3 # 使用GPS作为水平速度源如果是PX4固件主要在参数编辑器里设置GPS_1_CONFIGTELEM2 # 将GPS数据映射到TELEM2 EKF2_AID_MASK1248 # 启用GPS位置、速度、偏航辅助这里面最容易出问题的是串口号对应关系。不同飞控的UART编号和物理接口不一样Pixhawk 4的TELEM2、TELEM3、GPS1这些端口各有定义。我一开始把UM982接在GPS1口上结果死活没数据后来才发现GPS1口默认是给传统GPS模块用的我用的那个固件版本并不支持在GPS1口直接输入UM982的二进制数据。换到TELEM2口之后飞控地面站里立刻就能看到定位状态从单点解变成了固定解。5. 实测数据与精度评估5.1 静态固定解测试结果配置完成后我先做了一次静态测试。把移动站天线放在空旷场地的一个固定点上天线朝向天空无遮挡基准站同样架在开阔位置距离约200米。通过串口持续观察GNGGA语句记录了半小时内的定位状态变化。实测数据如下测试条件定位状态水平精度垂直精度无遮挡空地RTK固定解±2-3厘米±4-6厘米少量树荫遮挡RTK浮点解20-50厘米50-100厘米遮挡严重/天线位置不佳单点解1-3米3-5米需要说明的是这些数值是多次采样后的统计结果具体数值会随卫星几何分布、环境多路径、天气等因素波动但“固定解明显优于浮点解、浮点解明显优于单点解”这个规律是稳定的。我这边固定解在整个半小时里占到了95%以上只有几次因为头顶有鸟群飞过导致信号短暂中断。5.2 动态测试与无人机航点飞行对比静态测试只能验证模组本身真正检验RTK系统的是装机后的动态测试。我装好机后先在GPS模式下飞了一个航点任务然后切到RTK固定解状态重复同一个任务对比两次的航线执行情况。差别非常直观普通GPS模式下无人机在航点转弯处经常冲出路径一大圈才开始调整航线轨迹像是画了朵花RTK模式下无人机基本沿着预设航线走转弯干脆利落悬停时几乎没有肉眼可见的飘移。这背后的原因是飞控的导航滤波器在位置反馈更准确时能够更自信地控制飞机控制量更稳定不会因为位置噪声干扰导致频繁修正。尤其是做航线作业时直线段不会出现锯齿状轨迹节省了实际作业时间和能源消耗。5.3 精度影响因素与优化方向RTK能不能稳定出固定解核心受三个因素影响。第一是卫星可见数与几何分布用PDOP值衡量PDOP越小代表卫星几何分布越好。我这边观察到的规律是PDOP小于2时固定解很稳定大于3时开始频繁浮动。第二是差分链路的稳定性和延迟差分数据如果隔三差五丢包移动站的解算质量会明显下降。第三是多路径效应这个与天线安装位置和周围环境直接相关。基于这些影响我建议的优化方向有三个天线尽量远离碳纤维结构和金属遮挡物差分链路优先用数传或者低延迟4G方案避免使用公网延迟不稳定的人人都在用的中转服务飞行前先在地面站里观察定位质量确认固定解率达到95%以上再解锁起飞别急。6. 常见问题与排查技巧实录6.1 定位状态不固定的排查顺序RTK搭建过程中最让人头疼的问题就是固定解出不来。我整理了一个排查顺序遇到问题按这个顺序走基本能快速定位现象优先排查项处理办法一直是单点解差分数据链路是否通基准站是否持续发送RTCM3移动站是否开启RTCM3输入一直是浮点解天线是否遮挡天线位置抬高、远离碳纤维结构固定解频繁丢失差分链路延迟检查数传信号强度降低差分更新间隔固定解但坐标跳变电源纹波/天线松动更换稳压模块、紧固天线接头检查差分链路时我习惯在移动站的串口终端里直接看是否有RTCM3二进制数据不断涌入如果只有NMEA语句输出没有RTCM3输入问题基本出在基准站或者链路上。还要检查基准站是否真的进入了基准站模式我曾经遇到过配置没保存断电后基准站又回到单点模式的情况导致移动站一直等不到差分数据。6.2 串口通讯异常与数据解析问题UM982的串口通讯问题大多集中在波特率不匹配和接线错误上。我遇到过一种情况地面站能收到数据但飞控一直没有定位信息最后发现是飞控那个端口的波特率被改成57600了而UM982默认输出115200两边各说各话。解决方法是手动把飞控对应端口的波特率改成115200或者在模组上把输出波特率降到9600总之要让两边一致。另外注意UM982输出的二进制协议和NMEA协议不要混着发尤其不要同时在两个串口上输出不同协议这样容易让飞控误判协议类型。我最终的配置是串口1输出二进制协议给飞控串口2保留NMEA输出用来做调试监测两边互不干扰。6.3 经验心得和避坑指南最后说几句大实话。RTK这套系统最怕的不是配置复杂而是基础工作做得不够细致。我踩过最大的坑就是天线没有固定结实起飞后振动导致天线相位中心位置抖动RTK解算器频繁重新初始化模糊度固定解掉了又解、解了又掉白白浪费了很多时间排查。还有杆臂补偿这个问题很多教程不提。无人机上RTK天线的相位中心和飞控IMU的几何中心不在同一点两者之间的X、Y、Z三个方向偏移需要在飞控参数里补偿。ArduPilot里是GPS_POS1_X、GPS_POS1_Y、GPS_POS1_ZPX4里是GPS_POS_X、GPS_POS_Y、GPS_POS_Z。我一开始没做这个补偿飞机在急刹车或者快速转向时位置反馈会明显偏一下后来量好尺寸填进去问题立刻好了。这算是这类DIY项目里最容易被忽略的细节。平时测试尽量在固定解状态下进行不要拿着浮点解甚至单点解的数据去调自动航线那样你会分不清到底是飞控调参的问题还是定位数据的问题。先把位置源搞干净再谈控制算法这是所有无人机定位相关项目的底层逻辑。