PPP定位实现--基于RTKlib

PPP定位实现—part1

实现的函数主体在postpos.c->rtkpos.c->pppos中,在利用pppos求解时,首先要利用单点定位所得到的数据作为初始化,故此直接调用rtkpos函数进行求解。

  1. 在postpos.c中找寻队rtk_t进行初始化的方法。

    调用函数rtkinit时,对prcopt也需要进行初始化,在rnx2rtkp模块中,找初始化的方法.

    对于mode的选取:PPP下分为KINEMA,STATIC,FIXED。其中FIXED是用于固定PPP,进行残差分析,因为数据是对于一个基站的数据,采用STATIC进行求解。

    refpos:对初始定位的选取,可以选择从文件中读取,也可以选择从单点定位的解中得到。

    sateph:星历的选择,直接选取精密星历进行求解

  2. rtkpos输入参数n是number of observation data

  3. 判断此时解的状态:sol.stat==SOLQ_PPP,打印接收机的位置信息,否则输出解的类型,sol.type。

  4. 编译完成后求解只得到了后面一种情况,打开ppp.trace发现出现错误的问题是lack of valid sats ns=4,在之前单点定位时也出现了这样的问题,载波相位波长lambda需要进行初始化。

  5. 重新编译,可以计算得到结果。

  6. 再次观察到pppos函数中对整周模糊度进行固定时,如果固定成功了,则stat=SOLQ_FIX,而现在是对于所有的sol.stat==SOLQ_PPP都进行输出,不论固定是否成功。

    增加解算指标opt->modear==ARMODE_PPPAR,在ppp.trace中按照函数中设置的trace,没有找到pppamb的内容,tracelevel设置的也是3

    (解决方法:观察ppp_ar中的pppamb函数的条件,在prcopt.default里面,将电离层的修正给关掉了,需要将其打开。number of freq不能小于2,在default中恰好设置为2。)

    此时在有些时间段能够输出解算的值,但大部分时间还是未能进行输出。观察ppp.trace,在每个时间段都有pppamb的输出语句,说明进入到了模糊度固定的程序中,必然有些步骤的返回值stat!=SOLQ_FIX,当pppamb函数的返回值不是0时,返回固定解SOLQ_FIX,找返回值设置的函数

    if (rtk->opt.modear==ARMODE_PPPAR) {
            stat=fix_amb_ROUND(rtk,sat1,sat2,NW,m);
        }
    

    fix_amb_ROUND函数中对stat的值与两部分相关,与sel_amb fix_sol函数相关,需要每个历元下固定的模糊度的数量m>=3

    对于sel_amb,其功能是select fixed ambiguities,m是选择的线性无关组合(两两一组pair)的个数。

    对于fix_sol,可能出现filter error的情况,这样return=0,但在tracelevel(1)下,并没有输出结果。说明这样的错误并没有出现,其余情况下返回值都为1(SOLQ_FIX=1)

  7. 但显然,进入到pppamb函数中,不一定全部固定成功。那么只有可能先行无关的模糊度的数量不足,导致对宽巷的模糊度无法固定。

    暂时的解决方法是对于SOLQ_FIX的部分进行打印,其余按照没有固定的SOLQ_PPP进行打印

  8. 定位的历元时间再调用rtkpos之前没有进行约束

    rtk.sol.time = obs.data[i].time;
    

    重新执行后,定位的误差与给出来的要更小,XYZ方向上分别做到了3m,1m,2m的误差(这与之前的误差在4m有极大的改善)

    **猜测:**也存在着其他的初始化的设置(譬如时间,初始位置),导致没有达到PPP理想的定位精度。

结果对比

  1. 首先与sp3的结果进行对比(sp3文件中只有各个卫星的数据,不包含基站的位置坐标),与观测文件中进行对比。与文件中所给的APPROX POSITION XYZ,对比之下,各个方向上都有大致4m的差距。

    再采用进行了模糊度固定的解SOLQ_FIX(一部分历元可以,另一部分历元因为线性无关的模糊度的数量不够,导致只能达到SOLQ_PPP的程度),通通打印。

    偏差出现如此之大的原因:

  2. 将PPP的结果与SPP的结果进行对比

    SPP在各个方向上比PPP更差了2-3m,和文件所给的位置相差6-7m左右。但是对比钟差发现,PPP的sol.dtr数值很大,不像在SPP中钟差很小。

    结果分析:求解的应该不是钟差值,在pppos中计算sol.dtr的值:

    rtk->sol.dtr[0]=rtk->x[IC(0,opt)];
    rtk->sol.dtr[1]=rtk->x[IC(1,opt)]-rtk->x[IC(0,opt)];
    ----------------------------------------------------------------------------
    define NP(opt)     ((opt)->dynamics?9:3) /* number of pos solution */
    define IC(s,opt)   (NP(opt)+(s))      /* state index of clocks (s=0:gps,1:glo) */
    

    rtk->x在进行Kalman滤波时重新被更新,理论上应该不存在问题。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值