ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RTKLIB RTK定位原理:从双差观测到卡尔曼滤波的完整链路

RTKLIB RTK定位原理:从双差观测到卡尔曼滤波的完整链路 搞GNSS的同行应该都有过这种体验同一台接收机、同一段观测数据有人跑RTKLIB出来全是Fixed解有人却眼睁睁看着屏幕上的Float飘了半天最后还给你跳出一个“positioning failed”。差别往往不在硬件而在你对RTKLIB背后那套RTK解算逻辑的理解深度。这篇文章是“RTKLIB中RTK定位原理”系列的第一篇我打算先把整个RTK解算链路和数学模型的主干讲透——为什么RTK能到厘米级双差观测方程是怎么搭起来的误差处理在哪里做取舍卡尔曼滤波在这个框架里的角色是什么。适合想搞懂RTKLIB原理的测绘工程师、GNSS方向的学生以及准备把RTKLIB集成到无人机或自动驾驶方案里的开发朋友。看完之后你再打开RTKLIB的配置界面应该不会只是瞎试参数了。1. 为什么要先做差分RTK能到厘米级的底层逻辑1.1 伪距和载波两种测距方式的天壤之别要理解RTK先得理解定位里两个最基础的观测量伪距和载波相位。伪距测距的原理很简单卫星发一个信号接收机本地复现一个同样的信号两者相关对齐之后比较时间差乘以光速就是距离。精度受码率限制民用L1 C/A码的码元宽度约为293米即使接收机环路能做到码相位测量的百分之一伪距噪声也在分米到米级。单点定位靠伪距只能做到米级这个数量级无论如何都追不上厘米。载波相位则完全不同。L1载波频率1575.42MHz波长大约19厘米接收机测量载波相位可以做到波长百分之一甚至更高的精度对应毫米级。载波相位观测量的代价是你测到的不是绝对距离而是“不足一整周的小数部分 不确定的整周数”。那个整周数N就是整周模糊度它才是RTK真正的命门。很多人第一次接触RTK会被“差分”这个词绕晕其实核心逻辑一句话利用基准站和流动站距离较近的事实把共同的误差项用“两次相减”的方式干掉。1.2 一次差分消掉的是谁的误差接收机接收到的卫星信号里误差来源可以分成几类卫星星历误差和卫星钟差同一颗卫星基准站和流动站“看”到的这部分误差几乎相同。接收机钟差每个接收机都有自己的晶振偏差基准站一个值流动站又一个值它们互相独立。大气延迟对流层延迟、电离层延迟在空间上相关两台接收机靠得越近路径上穿过的大气越相似差异越小。多路径和测量噪声随环境变化跟位置强相关差分消不掉。两个接收机对同一颗卫星的载波相位观测值相减这就是站间单差。一相减卫星钟差直接归零卫星星历误差变成距离差的比例量基线10公里以内时星历误差造成的影响非常小大气延迟从整段变成了两站路径上的差值短基线时趋近于零。但站间单差之后接收机钟差还留着因为两台接收机的钟差是各自独立的这一项必须处理掉。1.3 双差之后还剩什么接收机钟差虽然消不掉但它在同一历元、同一接收机对多颗卫星的观测里是同一个值。于是再做一次星间差分拿单差观测值选一颗高仰角的参考卫星其余卫星的单差都减去参考卫星的单差。这一减接收机钟差也没了。做完双差方程里剩下的是流动站到卫星和基准站到卫星的几何距离差包含流动站位置信息双差整周模糊度整数特性双差残余大气误差短基线可忽略长基线需要专门处理多路径和噪声只能压制、无法消除。到了这一步RTK问题的数学本质就清晰了用高精度的载波相位观测量建立“位置 模糊度”的观测方程组先解出模糊度的浮点估计再把它固定成整数最后用固定后的整周模糊度把位置约束到厘米级。所以差分不是目的把误差项“洗干净”、让整周模糊度露出整数真面目才是RTK的底层逻辑。2. RTKLIB的主流程从原始观测到最终坐标数据到底走了哪几步2.1 输入准备观测值、星历、基准站坐标缺一不可跑RTKLIB的RTK解算需要三类输入缺一个都跑不出结果。第一是流动站观测数据通常来自Rover端的接收机格式可能是RTCM、RINEX或者厂商原始格式。第二是基准站观测数据可以通过实时数据链路传输也可以事后拿RINEX文件做后处理。第三是星历文件广播星历或者精密星历都行RTK定位对星历要求不高广播星历已经能满足需求。容易被忽略的是基准站坐标。RTKLIB拿的是“基准站的天线相位中心坐标 流动站相对基准站的基线向量”最后拼出流动站的绝对坐标。基准站坐标本身带几厘米误差最终结果就带几厘米误差。很多人在开阔地带解出来坐标偏得离谱回头检查发现是基准站坐标源给了个WGS84的概略坐标就往上怼这问题真的非常常见。2.2 rtkpos这个核心入口在做什么RTKLIB的代码入口是rtkpos()函数它相当于整个RTK解算的调度中心。单历元的处理流程大致是状态更新根据上一历元的状态和过程模型预测当前历元的位置、速度、模糊度状态。观测值预处理把流动站和基准站的观测值按时间对齐挑出共视卫星检查周跳给观测值分配权重。双差组合选择参考卫星构建双差伪距和双差载波相位观测方程。卡尔曼滤波用当前历元的观测量更新状态向量得到位置浮点解和模糊度浮点解。模糊度固定对浮点模糊度做整数搜索和Ratio检验尝试固定。输出固定解或浮点解固定成功则输出固定解同时给出协方差矩阵这个矩阵后续可以用来评估定位精度。用现在流行的说法这就是一个“前向滤波 模糊度固定”的典型RTK流水线。理解了这个全貌你再去看rtklib代码目录下的rtkpos.c、pntpos.c、lambda.c就不至于一头扎进细节里出不来。2.3 配置参数为什么直接决定解算结果RTKLIB被吐槽“上手门槛高”一半的槽点在密密麻麻的配置项。定位模式、高度角、频率组合、电离层/对流层改正、模糊度固定模式、Ratio阈值、观测噪声参数……每一项都会直接改变解算结果。我自己见过最典型的例子同一段数据默认配置跑出来固定率只有60%把卫星截止高度角从15度降到10度固定率到了85%。但低高度角卫星容易带多路径如果数据质量不好降阈值反而会让解跳得更厉害。所以配置不是越大越好而是要匹配你的天线环境、基线长度和数据质量。后面我单独用一节讲这个。RTKLIB里这些参数的背后几乎都能落到数学模型上——改变了观测方程的权重、状态转移的噪声、或者模糊度固定的判定阈值。理解了模型再调参数才有方向。3. 双差观测方程RTKLIB里位置和模糊度是怎么被联系起来的3.1 从单站载波方程出发先列单站、单颗卫星的载波相位观测方程$$\Phi_i^j \rho_i^j c(dt_i - dt^j) T_i^j - I_i^j \lambda N_i^j \varepsilon_i^j$$其中$\Phi_i^j$是接收机$i$对卫星$j$的载波相位观测值以长度为单位$\rho_i^j$是接收机到卫星的几何距离$dt_i$是接收机钟差$dt^j$是卫星钟差$T_i^j$是对流层延迟$I_i^j$是电离层延迟$\lambda$是载波波长$N_i^j$是整周模糊度$\varepsilon$是噪声。这里所有符号都按“距离”单位统一载波相位已经乘上了波长。伪距方程长得很像只是没有模糊度项电离层项符号相反。正是因为伪距没有模糊度它通常被用来给位置和钟差做个初估计。3.2 站间单差和星间双差的数学过程用下标$r$表示流动站$b$表示基准站。对同一颗卫星$j$两站观测值相减得到单差$$\Phi_r^j - \Phi_b^j \rho_r^j - \rho_b^j c(dt_r - dt_b) (T_r^j - T_b^j) - (I_r^j - I_b^j) \lambda(N_r^j - N_b^j) \varepsilon$$注意卫星钟差$dt^j$已经在这一步被消掉了。对短基线来说$T_r^j - T_b^j$和$I_r^j - I_b^j$都趋于零这两项可以暂时丢进噪声里。单差方程里还剩接收机钟差项$c(dt_r - dt_b)$。选一颗参考卫星$k$拿卫星$j$的单差减参考卫星$k$的单差$$\left(\Phi_r^j - \Phi_b^j\right) - \left(\Phi_r^k - \Phi_b^k\right) \left(\rho_r^j - \rho_b^j\right) - \left(\rho_r^k - \rho_b^k\right) \lambda\left[\left(N_r^j - N_b^j\right) - \left(N_r^k - N_b^k\right)\right] \varepsilon$$接收机钟差也消掉了。于是双差观测方程简化为$$y \nabla\Delta\rho \lambda\nabla\Delta N \varepsilon$$这里$y$是已知的双差观测值$\nabla\Delta\rho$是双差几何距离流动站位置的非线性函数$\nabla\Delta N$是双差整周模糊度它依然保持整数特性。就这个方程一个历元里有多少颗共视卫星就能列多少个类似的式子交给滤波器去解。3.3 RTKLIB状态向量中的模糊度到底存的是什么明确了双差方程之后再看RTKLIB的实现有个容易困惑的细节它的状态向量里并不直接存“双差模糊度”而是以参考卫星为基准存星间单差形式的模糊度参数。这样做的好处是状态维数更小同时双差观测方程里两组模糊度的差仍然保持整数性不影响后续LAMBDA搜索。这一点在rtklib源码的rtkpos.c里体现得很直接状态向量按“位置、速度 每个历元的模糊度参数”排布模糊度部分的索引由“卫星编号 频率”决定。第一次看代码时别被这种别扭的排列吓到理解成“为了凑出双差而设计的状态压缩”就通了。3.4 几何距离的线性化与H矩阵双差方程里的$\nabla\Delta\rho$是流动站坐标的非线性函数。卡尔曼滤波和最小二乘都要求线性观测方程所以要在概略坐标$(x_0, y_0, z_0)$处做泰勒展开$$\rho_r^j \approx \rho_0^j - \mathbf{e}_j \cdot \delta\mathbf{x}$$其中$\mathbf{e}_j$是接收机到卫星方向的单位向量$\delta\mathbf{x}$是位置改正量。把多颗卫星的双差方程放在一起观测矩阵$H$的每一行就是“两个单位向量之差”加上对应的模糊度系数。这也就是为什么RTKLIB要先做一次伪距单点定位来获取初始位置卡尔曼滤波启动时需要概略坐标来确定$H$矩阵概略坐标太差线性化误差就会直接影响模糊度浮点解的质量。4. 消不干净的误差才是关键短基线和长基线的分水岭4.1 双差之后残留下来的误差项双差能消掉卫星钟差、接收机钟差和大部分共同误差但有几样东西是消不干净的。多路径是其中的大头它在差分过程中反而可能因两站环境不一致而恶化测量噪声无法消除大气延迟的残余量则跟基线长度直接相关。10公里以内的短基线对流层和电离层残余误差通常只有毫米到厘米级可以并入噪声到了20公里以上残余电离层和对流层延迟就可能达到分米级直接套“短基线模型”会严重污染模糊度估计。4.2 对流层和电离层在不同基线长度下的处理策略RTKLIB的配置里电离层和对流层都有好几档选项选错了结果差距非常大。短基线场景双差后大气残余可忽略把电离层选项设成不估计或采用简单模型即可计算量小、收敛也快。中长基线场景RTKLIB可以把电离层延迟作为未知参数放进状态向量里估计这就是所谓“电离层加权”模式对流层则通常估计天顶湿延迟或使用外部模型改正。我个人的基线经验分界是10公里以内随便用默认配置10到30公里重点关注对流层改正超过30公里电离层必须处理否则模糊度固定率会明显下降。你可以在RTKLIB的plot工具里画一下固定率的对数曲线换一档电离层选项差异一眼就能看出来。4.3 天线相位中心与地球物理改正容易被忽视的“小量”天线相位中心偏差PCO和变化PCV也是典型的“双差消不干净”项。基准站和流动站天线型号不同相位中心偏移量也不同短基线时量级在毫米到厘米看似小但在要求厘米级定位时已经不容忽视。RTKLIB支持通过外部ANTEX文件修正天线相位中心实际工程里强烈建议配置这个文件尤其是混用天线的时候。还有两项地球物理相关改正经常被人忽略地球固体潮和海洋潮汐负荷它们对测站坐标的影响能达到厘米级。RTKLIB中这两项改正默认在某些配置下是打开的但如果你做的是短基线RTK两站受到潮汐影响基本相同双差后基本抵消做长基线或单点定位时则必须保留。这些“小量”看似不起眼却是影响最后一两厘米定位精度的地方。5. 卡尔曼滤波RTKLIB如何一步步收敛出厘米级结果5.1 为什么不用一次最小二乘而要用滤波RTK定位跟静态后处理不同流动站时刻在动每个历元只有几十颗卫星的观测值而且模糊度在连续跟踪期间保持不变。如果每个历元独立做最小二乘模糊度参数在每个历元都会被当成新的未知数重新估计等于丢掉了几何约束和历史信息结果精度和稳定性都会很差。卡尔曼滤波天然适合这个问题模糊度在周跳发生之前是常数通过状态转移模型把上一历元的模糊度信息带进当前历元等价于一种“时间上的连续观测”模糊度浮点解因此能越估越准。位置状态则按运动模型变化静态模式位置不动动态模式按常速度或随机游走演进。5.2 状态向量、预测和更新的设计RTKLIB的RTK状态向量可以写成$$X [x, y, z, v_x, v_y, v_z, N_1, N_2, \ldots, N_m]^T$$前6个是流动站的位置和速度静态模式下没有速度项后面是当前共视卫星对应的模糊度参数。状态转移时位置按运动模型更新模糊度保持原值如果检测到周跳对应模糊度参数的方差会被放大或者直接重置让滤波器重新估计。这一套设计里判断周跳是关键。RTKLIB里GF无几何组合和电离层残差组合都是常用的周跳检测手段它们的原理细节我放到系列后面专门写这里你先记住周跳检测做不好模糊度连续性就断了固定率一定会崩。5.3 模糊度从浮点到固定LAMBDA与Ratio检验卡尔曼滤波输出的是模糊度浮点解$\hat{N}$和它的协方差矩阵$\hat{Q}$。所谓固定就是在满足整数约束的前提下搜索一组整数$\check{N}$使得$$\min_{N \in \mathbb{Z}^n} (\hat{N} - N)^T \hat{Q}^{-1} (\hat{N} - N)$$直接穷举搜索在高维情况下是不可能的RTKLIB用的LAMBDA算法的核心是先对模糊度做Z变换大幅降低模糊度之间的相关性再在变换后的空间里做整数搜索最后变换回去得到候选整数解。LAMBDA的详细推导和代码实现值得单独开一篇这里先把流程串联起来。固定是否可信用Ratio检验衡量。RTKLIB计算最优整数解和次优整数解的残差平方和比值默认阈值是3.0。比值越大说明最优解相对次优解越显著固定结果越可信。但要注意Ratio阈值只是经验指标在恶劣环境下调低阈值会引入错误固定风险调高则降低固定率。实际跑数据时我会结合后验残差和基线重复性来综合判断一个固定解是否真的可信而不是只看Ratio这一个数。5.4 观测噪声和过程噪声很多人调不明白的两个旋钮卡尔曼滤波里有个绕不开的平衡观测噪声协方差$R$和过程噪声协方差$Q$。$R$决定观测量在更新时被信任多少$Q$决定状态预测在预测时被信任多少。两者比值失衡滤波要么收敛过慢要么过度跟随噪声。RTKLIB的配置项里观测噪声是通过eratio等参数设置的过程噪声则体现在位置随机游走和模糊度过程噪声的配置上。一个我在实战中反复验证过的规律拿默认参数跑通数据后先定量分析残差再根据残差量级调整$R$而不要一上来就大改$Q$。过程噪声设太大会让位置解抖动设太小在动态环境下又会跟不上运动这个度跟交通工具的运动特性强相关没有万能值。6. 学RTKLIB第一周容易踩的坑以及我自己的经验6.1 时间同步和公共卫星选择RTKLIB做RTK有个前提流动站和基准站必须同步到同一个时间系统。默认配置下RTKLIB会做时间同步但如果数据链路延迟大或者RINEX文件里两站的观测历元对不齐共视卫星数量就会减少双差方程可能都列不满。先看日志里每个历元用了多少颗卫星如果卫星数量忽多忽少先排查时间对齐问题别去调滤波器参数。6.2 数据质量对固定率的影响固定率低很多时候不是算法问题是数据质量撑不住。低仰角卫星受多路径影响大阈值设太低会把垃圾观测值引进来阈值设太高又损失几何构型。比较好的习惯是先用RTKLIB的quality plot工具看多路径和信噪比分布确定一个跟实际环境匹配的高度角阈值再决定要不要开信噪比权重。采样率也很关键。动态场景建议用5Hz以上数据模糊度固定需要连续历元积累几何变化采样率太低会让模糊度浮点解迟迟不收敛。6.3 参数调优的优先级顺序如果你刚接触RTKLIB拿到一段数据先别急着调参。我的习惯顺序是先确认基准站坐标是否正确再看共视卫星数和高度角阈值然后检查周跳检测是否正常最后才去折腾电离层/对流层选项和模糊度固定阈值。这个顺序覆盖了RTK解算链路里每一环按这个顺序排查问题效率比我早期“这调调那调调”高得多。前面说过这篇是系列第一篇重点在RTK的整体链路和数学模型。到这里你再看RTKLIB的输出结果心里应该能勾勒出数据从原始观测量到固定解之间走过的路。下一篇我打算专门拆LAMBDA模糊度固定算法把Z变换和收缩搜索的细节一点点掰开那时候你会觉得RTKLIB的fixed解不再是一个黑盒子。
返回列表