RTKlib源码解析:ppp和rtkpost中的周跳检测函数

2023-05-16

文章目录

    • 前言
    • detslp_mw
    • detslp_gf
    • detslp_ll
    • detslp_dop

欢迎关注个人公众号:导航员学习札记

前言

本文解析了RTKlib ppp.c中两个周跳检测函数detslp_mw和detslp_gf,以及rtkpos.c中的detslp_ll和detslp_dop函数。

由于PPP中的detslp_ll直接根据LLI进行周跳判断,比较简单,根据Rinex中对LLI的定义即可明白,因此不进行解析。

rtkpos.c中的周跳检测函数包括detslp_ll、detslp_gf_L1L2、detslp_gf_L1L5、detslp_dop,其中detslp_gf_L1L2、detslp_gf_L1L5与PPP中的detslp_gf相似,只不过这里使用的是双差后的载波相位。由于rtkpost中的detslp_ll比PPP中稍微复杂一些,因此对detslp_ll和detslp_dop进行了解析。

我所基于的代码版本是RTKlib 2.4.3的一个拓展版本RTKexplore Demo5,这个版本主要针对低成本的GNSS定位。该版本整体算法并未做较大更改,只是针对低成本接收机进行了完善。

detslp_mw

static void detslp_mw(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
  • 所在文件:ppp.c
  • 功能说明:通过MW组合检测周跳
  • 参数说明
* args   : rtk_t  *rtk       IO  gps solution structure
*          obsd_t *obs       I   satellite observations
*          int     n         I   number of the user(rover) observations at current epoch
*          nav_t  *nav       I   satellite navigation data
/* detect slip by Melbourne-Wubbena linear combination jump ------------------*/
static void detslp_mw(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
{
    double w0,w1;
    int i,j;
    
    trace(4,"detslp_mw: n=%d\n",n);
    
    for (i=0;i<n&&i<MAXOBS;i++) {
        if ((w1=mwmeas(obs+i,nav))==0.0) continue;
        
        w0=rtk->ssat[obs[i].sat-1].mw;
        rtk->ssat[obs[i].sat-1].mw=w1;
        
        trace(4,"detslip_mw: sat=%2d mw0=%8.3f mw1=%8.3f\n",obs[i].sat,w0,w1);
        
        if (w0!=0.0&&fabs(w1-w0)>THRES_MW_JUMP) {
            trace(3,"detslip_mw: slip detected sat=%2d mw=%8.3f->%8.3f\n",
                  obs[i].sat,w0,w1);
            
            for (j=0;j<rtk->opt.nf;j++) rtk->ssat[obs[i].sat-1].slip[j]|=1;
        }
    }
}
  • 处理过程
  1. 先调用mwmeas函数计算Melbourne-Wubbena组合值 M W = λ 1 λ 2 λ 2 − λ 1 ( ϕ 1 − ϕ 2 ) − λ 2 P 1 + λ 1 P 2 λ 2 + λ 1 MW = \frac{\lambda_1\lambda_2}{\lambda_2 - \lambda_1} (\phi_1 - \phi_2)-\frac{\lambda_2 P_1+\lambda_1P_2}{\lambda_2 + \lambda_1} MW=λ2λ1λ1λ2(ϕ1ϕ2)λ2+λ1λ2P1+λ1P2,其中 ϕ 1 \phi_1 ϕ1 ϕ 2 \phi_2 ϕ2分别为L1,L2的载波相位测量值(单位:周), P 1 P_1 P1 P 2 P_2 P2为伪距测量值(单位:m);
  2. 将当前历元的MW组合值与上一次的组合值进行比较,如果差值的绝对值大于了阈值THRES_MW_JUMP(默认值10.0),则认为有周跳。
  • 注意事项
  1. M W MW MW组合本质上是计算 λ w N w \lambda_wN_w λwNw,其中 λ w = c f 1 − f 2 \lambda_w=\frac{c}{f1-f2} λw=f1f2c为宽巷组合的波长, N w = N 1 − N 2 N_w = N_1-N_2 Nw=N1N2是宽巷组合的整周模糊度。可想而知,如果没有周跳发生,那么上一历元和当前历元的 λ w N w \lambda_wN_w λwNw应该是一致的。
  2. M W MW MW组合的推导可以参考《GPS测量与数据处理》书中4.3.3节“不同类型观测值线性组合”一节。从MW组合的推导中可以看出该组合消除了电离层延迟误差、卫星、接收机钟差、卫星至接收机的几何距离。该组合虽有较高的检测精度,但是如果L1,L2同时发生相同大小的周跳,则不能成功检测。
  3. M W MW MW组合的噪声水平可根据其表达式进行推导,结果如下:
    σ M W = [ ( f 1 f 1 − f 2 ) 2 + ( f 2 f 1 − f 2 ) 2 ] σ L 2 + [ ( f 1 f 1 + f 2 ) 2 + ( f 2 f 1 + f 2 ) 2 ] σ p 2 \sigma_{MW} = \sqrt{[(\frac{f_1}{f_1-f_2})^2+(\frac{f_2}{f_1-f_2})^2]\sigma_L^2+[(\frac{f_1}{f_1+f_2})^2+(\frac{f_2}{f_1+f_2})^2]\sigma_p^2} σMW=[(f1f2f1)2+(f1f2f2)2]σL2+[(f1+f2f1)2+(f1+f2f2)2]σp2
    由于载波相位的噪声水平远低于伪距,因此:
    σ M W ≈ [ ( f 1 f 1 + f 2 ) 2 + ( f 2 f 1 + f 2 ) 2 ] σ p 2 \sigma_{MW}\approx\sqrt{[(\frac{f_1}{f_1+f_2})^2+(\frac{f_2}{f_1+f_2})^2]\sigma_p^2} σMW[(f1+f2f1)2+(f1+f2f2)2]σp2
    上式进一步近似,则: σ M W 2 ≈ 1 2 σ p 2 \sigma_{MW}^2\approx\frac{1}{2}\sigma_p^2 σMW221σp2
  4. M W MW MW组合周跳检测的阈值设定,可以根据3中的噪声水平,结合接收机的噪声大小,进行设定;也可采用滑动窗口计算平均值和标准差的方法。RTKlib中使用固定值10,另外开源代码GAMP中也有根据采样间隔、高度角进行阈值设定的方法,感兴趣可以进一步参考其论文和开源代码。

detslp_gf

static void detslp_gf(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
  • 所在文件:ppp.c
  • 功能说明:通过GF(几何无关)组合检测周跳
  • 参数说明
* args   : rtk_t  *rtk       IO  gps solution structure
*          obsd_t *obs       I   satellite observations
*          int     n         I   number of the user(rover) observations at current epoch
*          nav_t  *nav       I   satellite navigation data
/* detect cycle slip by geometry free phase jump -----------------------------*/
static void detslp_gf(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
{`在这里插入代码片`
    double g0,g1;
    int i,j;
    
    trace(4,"detslp_gf: n=%d\n",n);
    
    for (i=0;i<n&&i<MAXOBS;i++) {
        
        if ((g1=gfmeas(obs+i,nav))==0.0) continue;
        
        g0=rtk->ssat[obs[i].sat-1].gf;
        rtk->ssat[obs[i].sat-1].gf=g1;
        
        trace(4,"detslip_gf: sat=%2d gf0=%8.3f gf1=%8.3f\n",obs[i].sat,g0,g1);
        
        if (g0!=0.0&&fabs(g1-g0)>rtk->opt.thresslip) {
            trace(3,"detslip_gf: slip detected sat=%2d gf=%8.3f->%8.3f\n",
                  obs[i].sat,g0,g1);
            
            for (j=0;j<rtk->opt.nf;j++) rtk->ssat[obs[i].sat-1].slip[j]|=1;
        }
    }
}
  • 处理过程
  1. 先调用gfmeas函数计算GF组合值 G F = λ 1 ϕ 1 − λ 2 ϕ 2 GF = \lambda_1\phi_1-\lambda_2\phi_2 GF=λ1ϕ1λ2ϕ2,其中 ϕ 1 \phi_1 ϕ1 ϕ 2 \phi_2 ϕ2分别为L1,L2的载波相位测量值(单位:周), λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2为L1、L2的波长;
  2. 将当前历元的GF组合值与上一次的组合值进行比较,如果差值的绝对值大于了阈值(默认值0.05),则认为有周跳。
  • 注意事项
  1. GF组合本质上是计算 G F = λ 1 ϕ 1 − λ 2 ϕ 2 = λ 1 N 1 − λ 2 N 2 GF = \lambda_1\phi_1-\lambda_2\phi_2 =\lambda_1N_1-\lambda_2N_2 GF=λ1ϕ1λ2ϕ2=λ1N1λ2N2,如果没有周跳发生,那么上一历元和当前历元的GF值应该是一致的。
  2. GF组合根据其表达式可以推导其噪声: σ G F = 2 σ L \sigma_{GF}=\sqrt{2}\sigma_L σGF=2 σL。该周跳检测的阈值也可以根据噪声水平进行设定,GAMP中同样也根据采样间隔和高度角对阈值进行了调整,感兴趣可以参考其论文和代码。

detslp_ll

static void detslp_ll(rtk_t *rtk, const obsd_t *obs, int i, int rcv)
  • 所在文件:rtkpost.c
  • 功能说明:通过LLI标志进行周跳检测
  • 参数说明
* args   : rtk_t  *rtk       IO  gps solution structure
*          obsd_t *obs       I   satellite observations
*          int     i         I   index of obs
*          int    rcv        I   1: rover receiver; 2: base receiver 
  • 处理过程
  1. 由于前向处理和后向处理,在利用LLI进行周跳判断上有所不同。因此在处理过程中,仅以前向为例;
  2. LLI=getbitu(&rtk->ssat[sat-1].slip[f],0,2); 首先将上一历元该卫星的周跳标志取出存在LLI变量中,该变量之后会用来判断上一历元和当前历元,半周跳标志(LLI&2,即LLI的bit 1位)是否发生变化;
  3. slip=obs[i].LLI[f];将当前历元原始观测量中的LLI赋值给slip变量;
  4. 如果上一历元和当前历元的半周跳标志不同,则认为有周跳,将slip的第0位置1;
  5. 存放当前历元的LLI和周跳。
  • 注意事项
  1. 后向处理和前向处理之间的区别:仔细观察代码,会发现后向处理中,判断周跳利用的是前一历元的LLI,而不是当前历元的LLI,而前向处理,使用的是当前历元的LLI。原因:假设一组连续8个历元的整周模糊度为:1-1-1-1-50-50-50-50,在历元5时,LLI=1。那么在前向处理时,将第5个历元标记为周跳是没问题的,因为在历元5,整周模糊度由1跳变为50。但是在后向处理时,虽然原始数据中历元5的LLI为1,但是实际周跳应该在历元4,因为后向处理时,历元4的整周模糊度由50跳变为1。
  • 我的疑惑
  1. rtkpost.c中detslp_ll比较重要的特点是考虑了半周跳变化的情况,如果半周跳标志(LLI=2)前后两个历元发生变化,则认为有周跳。如果一直维持半周跳情况,并没有将slip的第0位置1,在之后的处理中仍然会使用该数据,这样似乎不太合理?

detslp_dop

static void detslp_dop(rtk_t *rtk, const obsd_t *obs, int i, int rcv, const nav_t *nav)
  • 所在文件:rtkpost.c
  • 功能说明:通过多普勒值进行周跳检测
  • 参数说明
* args   : rtk_t  *rtk       IO  gps solution structure
*          obsd_t *obs       I   satellite observations
*          int     i         I   index of obs
*          int    rcv        I   1: rover receiver; 2: base receiver 
* 		   nav_t  *nav       I   satellite navigation data
  • 处理过程
  1. 因为这个函数在RTKlib2.4.3中已经不再使用,所以有些变量的定义不太清楚具体的含义,但是大致处理方法和流程还是比较清晰的。
  2. 首先计算周跳检测阈值,thres=MAXACC*tt *tt/2.0/lam+rtk->opt.err[4]*fabs(tt)*4.0;
  3. 计算前后两个历元的载波相位差值:dph=obs[i].L[f]-rtk->ph[rcv-1][sat-1][f];计算多普勒的积分值,dpt=-obs[i].D[f]*tt;;
  4. 将上述两个计算值相减,如果差值的绝对值超过阈值,则认为有周跳。
  • 注意事项
  1. RTKlib注释中提到,detslp_dop函数由于clock-jump的问题,所以暂时没有使用。我猜测clock-jump可能是历元间时间的跳变,因为理论上 应该对多普勒进行连续积分,如果历元时间跳变,直接用dpt=-obs[i].D[f]*tt计算积分值,误差是很大的。
  2. 不考虑clock-jump的问题,利用前一历元和当前历元,这两个历元的平均多普勒进行梯形积分,可能会比仅使用当前历元的多普勒值进行矩形积分的效果更好。即多普勒积分值进行如下计算:
    d D ( k ) = − [ D ( k ) + D ( k − 1 ) ] ∗ 0.5 ∗ d t d_D(k) = - [D(k) + D(k-1)] *0.5*dt dD(k)=[D(k)+D(k1)]0.5dt
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RTKlib源码解析:ppp和rtkpost中的周跳检测函数 的相关文章

  • ThingsBoard源码解析-数据订阅与规则链数据处理

    前言 结合本篇对规则链的执行过程进行探讨 根据之前对MQTT源码的学习 xff0c 我们由消息的处理入手 org thingsboard server transport mqtt MqttTransportHandler void pro
  • Libev源码解析

    最近在看libev源码 xff0c 算是对libev的源码有个比较清晰的了解 总共分3部分来介绍libev 1 Libev是什么 Libev是基于Reactor模式的一个高性能 xff0c 支持高并发的事件库 它本身不仅支持IO xff0c
  • RTKLIB ppp rtk_post

    1 实时ppp xff1a IGS MGEX数据处理中心的播发的实时轨道钟差产品 xff0c 结合广播星历 xff0c 实现实时定位 2 事后的 xff08 近似实时 xff09 xff1a 下载精密星历 钟差产品 xff0c 结合其他的精
  • ArrayList源码解析

    构造函数 Constructs an empty list with an initial capacity of ten 使用10个初始容量构造一个空的集合 public ArrayList super 用一个空的数组进行初始化 this
  • Gson源码解析

    Gson简介 Gson xff0c 就是帮助我们完成序列化和反序列化的工作的一个库 日常用法 UserInfo userInfo 61 getUserInfo Gson gson 61 new Gson String jsonStr 61
  • Android-Handler源码解析-Message

    成员变量 标识Message public int what 存储简单数据 xff0c 如果存储复杂的数据使用setData 方法 public int arg1 public int arg2 发送给接收者的任意对象 public Obj
  • Android-Handler源码解析-Looper

    成员变量 Log的TAG private static final String TAG 61 34 Looper 34 线程本地变量 xff0c 保证了每个线程仅有唯一的Looper对象 64 UnsupportedAppUsage st
  • OutLine源码解析 -- 为什么要尽量避免使用OutLine

    相信很多人在刚入职Unity的时候都被告诫过尽量避免使用OutLine xff0c 只知道它很费性能 xff0c 但是很多人并不知道它为什么很费性能 今天通过源码来探索一下 首先看一下OutLine cs里的源码 public overri
  • Axios源码解析(部分)

    从 Github 上把 Axios 项目的 master 分支拷贝到本地 xff0c 用编辑器打开项目目录 首先我们先解析一下整个 Axios 项目的一些关键的文件结构 对照项目的文件目录 xff0c 梳理一下其中的一些关键文件夹以及它的作
  • mc_att_control源码解析

    目录 源码分析内环控制外环控制 之前写了博客分析了一下旋翼姿态控制的基础知识 mc att control基础知识 这次就对照代码将整个旋翼姿态控制过程呈现一遍 先看一下整个程序的框图 从图中可以看到 实际上整个控制分成内外两个环进行控制
  • yolov5源码解析--输出

    本文章基于yolov5 6 2版本 主要讲解的是yolov5是怎么在最终的特征图上得出物体边框 置信度 物体分类的 一 总体框架 首先贴出总体框架 xff0c 直接就拿官方文档的图了 xff0c 本文就是接着右侧的那三层输出开始讨论 Bac
  • RTKlib源码解析:ppp和rtkpost中的周跳检测函数

    文章目录 前言detslp mwdetslp gfdetslp lldetslp dop 欢迎关注个人公众号 xff1a 导航员学习札记 前言 本文解析了RTKlib ppp c中两个周跳检测函数detslp mw和detslp gf xf
  • RTKlib PPP代码解析

    文章目录 ppposudstate pppudbias pppcorr measppp res 欢迎关注个人公众号 xff1a 导航员学习札记 我所基于的代码版本是RTKlib 2 4 3的一个拓展版本RTKexplore Demo5 xf
  • rtklib--伪距单点定位(single-point positioning)学习(1)Satposs

    目录 前言pntpos总体调用流程图Satposs总体调用流程图 xff1a 1 Satposs 按照所观测到的卫星顺序计算出每颗卫星的位置 速度 钟差 频漂 2 ephclk 通过广播星历来确定卫星钟偏3 stasys 根据卫星编号确定该
  • GNSS PPP和PPK区别

    01 PPP PPP全称Precise Point Positioning xff0c 译为精密单点定位 xff0c 属于单点定位也叫绝对定位 xff0c 精密单点定位是指利用载波相位观测值以及由IGS等组织提供的高精度的卫星星历及卫星钟差
  • MMdetection的Proposal原理和代码解析

    一 算法原理 接受N级score bbox pred anchor和image shape作为输入 通过anchor和框的偏移 bbox pred 得到proposal 然后对这些proposal做NMS 最后选出前num个 二 执行步骤
  • LevelDB源码解析(2) SkipList(跳跃表)

    你也可以通过我的独立博客 www huliujia com 获取本篇文章 背景 SkipList是LevelDB的MemTable使用的底层存储结构 LevelDB实现了一个支持泛型的跳跃表 本文不会具体介绍跳跃表的数据结构 如果读者不了解
  • rtklib源码 rtk差分解算,rtkpos和replos函数流程梳理

    rtklib源码 rtk差分解算 rtkpos和replos函数流程梳理 rtkpos函数梳理 总体流程 replos函数梳理 replos总体流程 1 通过satposs函数计算卫星的位置 速度等参数 2 通过zdres函数计算基站伪距和
  • Android 相机库CameraView源码解析 (三) : 滤镜相关类说明

    1 前言 这段时间 在使用 natario1 CameraView 来实现带滤镜的 预览 拍照 录像 功能 由于 CameraView 封装的比较到位 在项目前期 的确为我们节省了不少时间 但随着项目持续深入 对于 CameraView 的
  • 我需要什么 uri 模式才能从手持设备与 PC 进行通信?

    正如我被提醒的那样here https stackoverflow com questions 22306678 why am i getting unable to connect to the remote server 我可能需要使用

随机推荐

  • VINS-Mono代码阅读笔记:feature_tracker代码阅读(转载)

    转载 xff1a https blog csdn net moyu123456789 article details 100988989 1 入口main函数 feature tracker结点的入口函数为feature tracker n
  • CMake:C/C++和Fortran混合编译

    C C 43 43 和Fortran混合编译构建 使用CMake构建C C 43 43 和Fortran混合项目 Fortran调用C C 43 43 函数 main F90 program main use iso c binding i
  • stm32 FreeRTOS中如何创建任务

    include 34 config h 34 include 34 global h 34 include 34 stdio h 34 include 34 PC h 34 include 34 FreeRTOS h 34 include
  • 串口HAL库函数

    HAL StatusTypeDef HAL UART Transmit UART HandleTypeDef huart uint8 t pData uint16 t Size uint32 t Timeout 串口发送 xff1b 发送指
  • KEIL 那些编辑技巧与方法

    来源 xff1a 公众号 鱼鹰谈单片机 作者 xff1a 鱼鹰Osprey ID xff1a emOsprey 本篇笔记介绍一些鱼鹰常用的 KEIL 编辑方法与技巧 xff0c 用于加快编辑速度 当然了 xff0c 很多人现在更多的是使用
  • PotPlayer优化与最高画质设置(最强本地播放器)

    一 前言 软件 xff1a PotPlayer 描述 xff1a 被誉为本地视频最好用的播放器 xff01 PotPlayer下载地址参考 xff1a https potplayer org 推荐Potplayer论坛 xff1a http
  • Arduino结构体变量使用

    Arduino结构体变量使用 x1f4dd 示例程序 span class token comment 本文使用arduino nano span span class token comment 声明 B span span class
  • 51单片机自定义串口通讯协议控制流水灯+Proteus仿真

    51单片机自定义串口通讯协议控制流水灯 Proteus仿真 Proteus仿真演示 注意不要使用Proteus 8 Professional 8 13版本串口通信会出错 需要利用虚拟串口工具提前创建2个虚拟串口 Proteus里面AT89C
  • Arduino struct结构体定义和使用方法详解

    Arduino struct结构体定义和使用方法 1 直接使用struct定义 示例 span class token keyword struct span span class token class name People span
  • 锂电池基于DW01组成的过充电、过放、短路保护电路

    锂电池基于DW01组成的过充电 过放 短路保护电路 原理图 该电路主要由锂电池保护专用集成电路 xff24 xff37 xff10 xff11 xff0c 充 放电控制MOSFET xff08 内含两只 xff2e 沟道 xff2d xff
  • STM32F103基于标准库开发串口中断接收数据环形队列例程

    STM32F103基于标准库开发串口中断接收数据环形队列例程 本示例源码来源于野火 STM32库开发实战指南 xff0c 是一个值得学习借鉴的资源 x1f4d1 一个完整的串口数据包通讯协议一般包含 xff1a 帧头 地址信息 数据类型 数
  • 基于STM32CubeIDE HAL库利用基本定时器实现串口接收不定长数据

    基于STM32CubeIDE HAL库利用基本定时器实现串口接收不定长数据 申明 xff1a 本文章仅发表在CSDN网站 xff0c 任何其他网见此内容均为盗链和爬取 xff0c 请多多尊重和支持原创 x1f341 对于文中所提供的相关资源
  • idea重构手法

    idea重构手法 四键齐发 xff1a ctrl 43 alt 43 shift 43 T 修改方法名 xff1a shift 43 F6修改方法参数 xff1a Ctrl 43 F6提取常量 xff1a Ctrl 43 Alt 43 C提
  • Linux下实现http的Get方法

    Linux如何实现http的GET数据方法 下载curl库源码 https curl se download html Linux编译 make拷贝库文件 xff0c 目录 curl 7 83 0 lib libs 下 libcurl so
  • 一篇关于GPS定位写得最详实清晰的文章之一

    一篇关于GPS定位写得最详实清晰的文章之一 介绍篇 过去 xff0c 如果你的女友是个路痴 xff0c 大概会有这样的对话 你在哪儿呢 xff1f 啊 xff1f 我在马路上啊 有什么特征 xff1f 头顶有个月亮 你旁边有什么啊 xff1
  • 基于HAL库STM32串口驱动不定长数据接收

    STM32串口驱动不定长数据接收带环形缓冲区 最新框架代码使用方法源码串口接口文件环形缓冲区接口文件 移植图示 使用涉及4个文件 xff0c UART Port c UART Port h CircularQueue h CircularQ
  • OptiTrack---Motive简单使用导出groundtruth

    文章目录 Motive介绍1 详细介绍 Motive使用1 详细使用2 简单使用导出groundtruth 1 首先安装Motive 2 启动Motive 3 建立body xff0c 进行录制 4 对结果进行保存 Motive介绍 1 详
  • 使用U盘安装Ubuntu20.04

    背景 今天自己鼓捣小电脑 xff0c 卖家发过来的时候已经按要求预装了Ubuntu20 04 xff0c 我想改一下卖家起的用户名 也许是计算机名 xff0c 分不太清 xff0c 结果搞的电脑输入密码却进不了桌面 xff0c 最终决定重装
  • 【ROS基础】rviz打开后如何显示实时2D地图

    1 背景 launch 了一个建图程序 xff0c 并打开了 rviz xff0c rviz 中也 add 了 map xff0c 但是 rviz 中并未出现期望的2D地图 xff0c 让人很是手足无措 2 问题解决 百度了才发现自己使用的
  • RTKlib源码解析:ppp和rtkpost中的周跳检测函数

    文章目录 前言detslp mwdetslp gfdetslp lldetslp dop 欢迎关注个人公众号 xff1a 导航员学习札记 前言 本文解析了RTKlib ppp c中两个周跳检测函数detslp mw和detslp gf xf