1. 为什么厘米级定位是无人机作业的分水岭
搞无人机飞控这几年,我最大的感受就是:定位精度决定了你能接什么活。普通GPS模块在开阔环境下水平精度大概在1.5到3米之间漂移,垂直方向更差,有时候能到5米以上。这个精度拿来航拍娱乐没问题,但一旦涉及测绘、电力巡检、农业植保的精准喷洒、或者建筑工地的土方量计算,米级误差就是灾难——测绘出图对不上、喷洒重喷漏喷、巡检拍不到绝缘子串的细节。
RTK(Real-Time Kinematic,实时动态差分)就是把定位从米级拉到厘米级的核心技术。它的原理说白了不复杂:地面基准站知道自己精确坐标,同时接收卫星信号,算出当前卫星信号的误差修正量,通过数据链路把修正量发给无人机上的移动站,移动站用修正量校正自己的观测值,从而实现厘米级解算。这里面的关键是“共视卫星”和“差分龄期”——基准站和移动站必须看到同一批卫星,修正量才有意义;差分龄期则是修正量从基准站算出来到移动站用上之间的时间差,龄期越大精度越差。
PX4作为目前开源飞控里生态最完整的方案,对RTK的支持已经相当成熟,但“支持”和“配好”之间隔着大量细节。固件版本选错、EKF2参数没调对、串口映射搞混、QGroundControl版本不匹配,任何一个环节出问题都会导致RTK无法进入固定解(Fixed Solution),只能停在浮点解(Float Solution)甚至单点定位。我见过太多人卡在“RTK模块买了、线接了、参数设了,但就是不变绿”的状态。
这篇内容面向的是已经有一定PX4基础、准备上RTK做实际作业的飞手和开发者。我会从硬件选型、固件版本、参数配置、EKF2融合逻辑、QGC设置、差分龄期排查这几个维度,把整套流程拆开讲清楚。新手也能看懂原理部分,老手可以直接跳到参数配置和避坑章节抄作业。
2. 硬件选型与接线:别在第一步埋雷
2.1 RTK模块怎么选才不踩坑
市面上RTK模块大致分三类:单频、双频、双频多系统。单频模块(比如早期的一些基于u-blox M8P的方案)只能跟踪L1频段,初始化时间长,在遮挡环境下容易失锁,现在基本不推荐新项目用了。双频模块(u-blox F9P是典型代表)同时跟踪L1和L2/L5频段,能更快固定、更抗多路径干扰,是目前PX4搭配的主流选择。
选模块的时候重点看几个参数:支持星座数量(GPS、GLONASS、Galileo、北斗越多越好)、更新率(至少5Hz,测绘建议10Hz以上)、接口类型(UART还是USB,PX4走UART)、以及是否支持外接天线馈电。F9P方案在国内用得最多,性价比高,社区资料也全。
注意:有些便宜模块标称“RTK”,但实际只支持基站模式或者需要额外付费解锁移动站功能。买之前确认清楚是否支持移动站(Rover)模式,以及是否自带RTK解算引擎。
2.2 接线:串口映射是第一个大坑
PX4飞控上通常有多个UART口,RTK模块一般接到GPS口或者TELEM口。以Pixhawk系列为例,GPS口对应的是GPS1,通常映射为/dev/ttyS3或者/dev/ttyS0,具体取决于飞控型号和固件版本。接线就四根:VCC(5V)、GND、TX、RX。注意TX和RX要交叉——模块的TX接飞控的RX,模块的RX接飞控的TX。
我遇到过最常见的问题就是线接对了但参数没配对。PX4里需要设置两个参数:GPS_1_CONFIG指定GPS1对应的串口,SER_GPS1_BAUD设置波特率。F9P默认波特率是38400,但很多模块出厂固件可能设成了115200或者9600。如果你发现GPS灯不亮或者QGC里看不到GPS信息,先查波特率。
# 在QGC的MAVLink Console里检查GPS状态 gps status # 查看串口配置 param show GPS_1_CONFIG param show SER_GPS1_BAUD如果用的是TELEM口接RTK,那就需要把GPS_1_CONFIG改成对应的TELEM口,同时注意TELEM口默认可能被MAVLink占用,需要先禁用该口的MAVLink功能。
2.3 天线安装的讲究
RTK天线分基准站天线和移动站天线,移动站天线要装在无人机上。安装位置有几个原则:尽量远离电磁干扰源(电调、图传、数传天线),尽量高,尽量保证天线地面平面(Ground Plane)完整。F9P的陶瓷天线需要至少70mm×70mm的金属地面平面才能发挥最佳性能,很多小机架直接贴碳纤维板上,效果会打折扣。
基准站天线要架高、视野开阔,周围不要有建筑物或金属遮挡。基准站和移动站之间的距离理论上没有硬性上限,但实际使用中建议控制在10公里以内,超过这个距离共视卫星数量会下降,固定解会变难。
3. 固件版本选择:1.14和1.12的差异比你想的大
3.1 PX4固件版本对RTK支持的影响
PX4的RTK支持在1.12到1.14之间有几个关键变化。1.12.x是很多老飞控的稳定版本,RTK基本功能没问题,但EKF2对RTK观测值的融合逻辑相对保守,固定解收敛速度偏慢。1.13开始引入了改进的GPS融合策略,1.14.3进一步优化了RTK失锁后的恢复逻辑。
我实测下来,1.14.3在RTK固定解收敛速度上比1.12.3快大概30%到40%,尤其是在部分遮挡环境下差异明显。但1.14.x对飞控硬件资源要求更高,一些F4处理器的老飞控刷1.14后可能出现CPU负载过高的问题。所以选版本要看硬件:H7系列飞控直接上1.14.3,F4系列如果资源紧张可以留在1.12.3。
提示:不要用1.13.0到1.13.2这几个版本,RTK相关有几个已知bug,具体表现在EKF2偶尔会把RTK观测值标记为无效导致定位跳变。1.13.3修复了,但既然有1.14.3,没必要停在1.13。
3.2 固件编译与烧录的实操细节
如果你用的是官方发布的稳定版固件,QGC里直接刷就行。但如果你需要改参数默认值或者做二次开发,就得自己编译。编译环境推荐Ubuntu 22.04,WSL2也可以但USB设备直通偶尔会有问题。
# 克隆PX4源码,指定1.14.3分支 git clone https://github.com/PX4/PX4-Autopilot.git --recursive cd PX4-Autopilot git checkout v1.14.3 git submodule update --init --recursive # 安装依赖 bash Tools/setup/ubuntu.sh # 编译Pixhawk 6C目标 make px4_fmu-v6c_default编译完成后用QGC的自定义固件烧录功能刷入。注意烧录前备份参数,刷完固件后参数会重置。
3.3 固件版本与QGC版本的匹配
QGC的版本也要注意。4.2.x系列对PX4 1.14的RTK状态显示支持最好,4.3.x有一些界面变化但功能没问题。我遇到过用QGC 4.1.x连接PX4 1.14.3时RTK状态栏不显示差分龄期的问题,升级QGC就好了。
| PX4固件版本 | 推荐QGC版本 | RTK支持状态 |
|---|---|---|
| 1.12.3 | 4.1.7以上 | 基本可用,收敛慢 |
| 1.13.3 | 4.2.0以上 | 稳定,修复了跳变bug |
| 1.14.3 | 4.2.4以上 | 最优,收敛快,恢复逻辑好 |
4. EKF2参数配置:RTK融合的核心逻辑
4.1 EKF2怎么用RTK数据
EKF2是PX4的状态估计器,它把IMU、气压计、磁力计、GPS、光流、视觉等传感器的数据融合在一起,输出无人机的位置、速度、姿态估计。RTK数据进入EKF2后,不是直接替换GPS位置,而是作为位置观测值参与融合。
这里有个关键参数:EKF2_GPS_CTRL。这个参数决定了EKF2如何使用GPS数据。默认值是3(使用3D速度+2D位置),对于RTK应用,建议设为7(使用3D速度+3D位置+偏航)。但注意,偏航观测需要双天线RTK才能提供,单天线模块不要开偏航。
EKF2_GPS_P_NOISE控制GPS位置观测的噪声方差。RTK固定解时位置精度高,这个值可以设小一点(比如0.1),让EKF2更信任RTK数据。浮点解时可以适当放大到0.5到1.0,避免错误观测值污染状态估计。
4.2 关键参数逐项拆解
# GPS控制模式 param set EKF2_GPS_CTRL 7 # GPS位置观测噪声(米) param set EKF2_GPS_P_NOISE 0.1 # GPS速度观测噪声(米/秒) param set EKF2_GPS_V_NOISE 0.3 # GPS高度观测噪声(米) param set EKF2_GPS_P_GATE 5.0 # 是否使用GPS高度 param set EKF2_GPS_P_NOISE 0.1 # 差分龄期超时阈值(毫秒) param set EKF2_GPS_DELAY 0EKF2_GPS_DELAY这个参数容易被忽略。它表示GPS数据从测量到进入EKF2的延迟。RTK模块的差分龄期会引入额外延迟,如果这个值设得不准,EKF2的位置估计会出现滞后振荡。一般F9P模块设0到10毫秒,具体值可以通过日志分析确定。
4.3 RTK固定解与浮点解的切换策略
EKF2内部会根据RTK的固定状态自动调整观测噪声。固定解时使用EKF2_GPS_P_NOISE,浮点解时会自动放大噪声。但如果你发现浮点解时定位漂移严重,可以手动设置EKF2_GPS_P_NOISE为一个较大的值,等固定解后再通过参数调整。
实操心得:我通常会在起飞前等RTK进入固定解后再解锁。如果一直停在浮点解,先检查差分龄期和共视卫星数,不要强行起飞。浮点解下水平误差可能到分米级,垂直误差更大,对于精准作业来说不够用。
5. QGroundControl里的RTK状态监控与设置
5.1 在哪里看RTK状态
QGC连接飞控后,在“GPS状态”页面可以看到当前定位类型。RTK固定解显示为“RTK Fixed”,浮点解显示为“RTK Float”,单点定位显示为“3D Fix”。同时可以看到卫星数、差分龄期、水平/垂直精度估计。
差分龄期(Age of Differential)是重点关注的指标。它表示最近一次收到基准站修正数据到现在的时间。龄期越小越好,一般要求小于2秒,最好在1秒以内。如果龄期持续增大,说明数据链路有问题——可能是数传延迟、丢包,或者基准站和移动站之间的通信中断。
5.2 数据链路配置
RTK修正数据的传输方式有几种:数传电台、4G网络、WiFi。数传电台延迟低但距离受限,4G网络覆盖广但延迟不稳定。我常用的是数传电台方案,基准站通过电台广播修正数据,移动站接收。
在QGC里需要设置MAVLink消息转发,把RTK修正数据从地面站转发到飞控。具体在“应用设置”->“MAVLink”里,勾选“转发RTCM消息”。如果你用的是串口直连的RTK模块(模块自己接收基准站数据),那就不需要QGC转发。
5.3 用QGC控制台排查RTK问题
QGC的MAVLink Console是个好东西,可以直接在飞控上执行命令查看状态。
# 查看GPS原始信息 gps status # 查看EKF2状态 ekf2 status # 查看传感器融合详情 listener sensor_gps # 查看RTK状态 listener rtk_statuslistener rtk_status会输出当前RTK的固定状态、差分龄期、基线长度等信息。如果差分龄期一直很大,检查基准站数据是否正常发送。
6. 差分龄期计算与常见故障排查
6.1 差分龄期到底怎么算的
差分龄期 = 当前时间 - 基准站观测时间。基准站每秒(或更高频率)计算一次修正量,打上时间戳发给移动站。移动站收到后,用当前时间减去时间戳就是龄期。这个过程中涉及基准站处理延迟、传输延迟、移动站处理延迟。
如果龄期突然跳变或者持续增大,可能的原因有:基准站数据中断、传输链路拥塞、移动站处理不过来。我遇到过数传电台波特率设太低导致RTK数据排队的情况,把波特率从57600提到115200后龄期从3秒降到0.5秒。
6.2 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| RTK一直浮点解 | 共视卫星不足 | 查看卫星数 | 调整天线位置,等待更长时间 |
| 差分龄期持续增大 | 数据链路中断 | 检查数传状态 | 重启数传,检查波特率 |
| 固定解后频繁失锁 | 多路径干扰 | 查看环境 | 远离建筑物,更换天线位置 |
| EKF2位置跳变 | GPS观测噪声设太小 | 查看日志 | 增大EKF2_GPS_P_NOISE |
| QGC不显示RTK状态 | QGC版本不匹配 | 检查版本 | 升级QGC到4.2.4以上 |
| 串口无数据 | 波特率不匹配 | 用示波器或串口助手 | 统一模块和飞控波特率 |
6.3 日志分析定位RTK问题
PX4的飞行日志里记录了GPS和EKF2的详细数据。用Flight Review或者PlotJuggler打开ulog文件,重点看几个话题:sensor_gps里的fix_type和differential_age,ekf2_innovations里的位置新息。
如果fix_type在3和4之间频繁跳变(3是3D Fix,4是RTK Float,5是RTK Fixed),说明RTK解算不稳定。如果differential_age经常超过2000毫秒,说明数据链路有问题。如果ekf2_innovations里的位置新息很大,说明EKF2对GPS观测值不信任,需要检查噪声参数。
避坑技巧:日志分析时注意时间同步问题。如果飞控没有接GPS的PPS信号,日志时间戳可能和实际时间有偏差,分析差分龄期时要注意。
7. 实操全流程:从零到固定解
7.1 基准站架设与配置
基准站有两种模式:已知坐标模式和自架站模式。已知坐标模式需要输入基准站的精确坐标(通过静态测量获得),自架站模式则让基准站自己估算坐标,精度稍差但方便。
架设步骤:选开阔位置,架高三脚架,安装天线,连接RTK模块和数传电台,供电。基准站模块通过串口配置为基站模式,设置输出RTCM消息。常见RTCM消息类型有1005(基站坐标)、1074(GPS观测值)、1084(GLONASS观测值)、1094(Galileo观测值)、1124(北斗观测值)。确保这些消息都开启。
7.2 移动站配置与飞控连接
移动站模块配置为Rover模式,波特率与飞控GPS口一致。接线确认TX/RX交叉。上电后在QGC里检查GPS状态,等待固定解。首次固定可能需要30秒到2分钟,取决于卫星环境和基线长度。
7.3 飞行验证与精度检查
固定解后不要急着飞任务,先做地面验证。把无人机放在已知点上,对比QGC显示的位置和实际坐标。水平误差应该在2厘米以内,垂直误差在5厘米以内。如果误差偏大,检查天线相位中心偏移参数是否设置正确。
飞行验证时先做简单航线,观察日志里的位置精度估计。RTK固定解下,EKF2的水平位置标准差应该在0.05米以下。
8. 我踩过的那些坑和最后的小技巧
第一个大坑是固件版本。我最开始用1.12.3配F9P,固定解要等将近两分钟,换了1.14.3之后缩短到40秒左右。但1.14.3在F4飞控上CPU负载确实高,后来换了H7飞控才彻底舒服。
第二个坑是串口映射。PX4的串口编号和物理接口的对应关系在不同飞控上不一样,我对着文档查了半天才发现GPS1在某个飞控上映射的是/dev/ttyS0而不是/dev/ttyS3。最靠谱的方法是在QGC控制台里用dmesg看启动日志,找到GPS对应的串口设备。
第三个坑是差分龄期。有次数传电台天线没拧紧,差分龄期一直在2到3秒之间跳,固定解时有时无。后来换了根好天线,龄期稳定在0.3秒,固定解再也没掉过。
最后分享一个小技巧:如果你经常在同一个区域作业,可以把基准站坐标固定下来,用已知坐标模式。这样每次架站不需要等待自解算,开机就能输出修正数据,移动站固定解速度会快很多。基准站坐标可以通过长时间静态观测加后处理获得,精度能到毫米级。
另外,EKF2的EKF2_GPS_P_NOISE不要设得太激进。我试过设0.05,结果RTK偶尔的异常观测值直接把EKF2带偏了,飞机在空中画了个大圈。后来改回0.1,稳定多了。RTK虽然准,但也不是百分百可靠,给EKF2留一点容错空间是必要的。