RTKlib相对定位源码解析:resamb_LAMBDA (整周模糊度求解)

本文对resamb_LAMBDA函数,以及其中的ddmat、restamb函数进行了解析。由于其中的lambda函数在参考论文中都给出了详细推导和计算步骤,因此没有解析。

lambda函数参考论文:
[1] P.J.G.Teunissen, The least-square ambiguity decorrelation adjustment: a method for fast GPS ambiguity estimation, J.Geodesy, Vol.70, 65-82,1995
[2] X.-W.Chang, X.Yang, T.Zhou, MLAMBDA: A modified LAMBDA method for integer least-squares estimation, J.Geodesy, Vol.79, 552-565, 2005

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

文章目录

    • resamb_LAMBDA
    • ddmat
    • restamb

resamb_LAMBDA

static int resamb_LAMBDA(rtk_t *rtk, double *bias, double *xa,int gps,int glo,int sbs)
  • 所在文件:Rtkpos.c
  • 功能说明:通过LAMBDA算法求解整周模糊度
  • 参数说明
        IO  rtk_t *rtk:      rtk solution structure
        I   double *bias     利用lambda算法计算得到的双差整周模糊度
        IO  double *xa       fixed states(在注意事项中进行了更为详细的解释)
  • 调用关系
Created with Raphaël 2.2.0 resamb_LAMBDA ddmat lambda restamb End
  • 处理过程
  1. 首先检查配置中所设置的AR阈值(LAMBDA算法最优解和次优解的比值,通常取3.0),如果该阈值小于0,则返回0。
  2. 检查卡尔曼滤波中位置状态量的协方差阵,如果位置方差超过所设定的方差阈值,则返回0,避免由于方差过大造成false fix。
  3. 调用ddmat函数,创建将卡尔曼状态量从单差转到双差的转换矩阵D’。主要是将单差相位偏移状态量转换为双差相位偏移,这里的D’阵实际就是RTKlib manual 165页中的G阵。
  4. 定义几个变量和矩阵,其中ny=na+nb,na实际就是之前卡尔曼滤波中除了单差相位偏移之外的所有状态量个数(例如:位置+速度+加速度+电离层+对流层……),nb则是双差相位偏移的个数(即需要解算的整周模糊度个数);
  5. 根据RTKlib manual 165页公式(E.7.15)、(E.7.16)计算双差状态量和双差协方差阵。之所以要在做LAMBDA算法前将单差转成双差,是为了去除接收机的初始相位偏移,这样就只剩下整周的模糊度。
  6. 计算公式(E.7.16)中的 Q N Q_N QN Q N R Q_{NR} QNR矩阵。
  7. 调用lambda函数计算双差整周模糊度最优解以及残差。
  8. 如果最优解和次优解的比值大于阈值,则利用公式(E.7.19),根据lambda算法得到的双差整周模糊度,计算除了单差相位偏移之外的所有状态量(例如:位置+速度+加速度+电离层+对流层……),存入rtk->xa中。这一步实际就是利用lambda算法得到的整数的整周模糊度对其他状态量进行修正。
  9. 调用restamb函数,利用lambda算法计算得到的双差整周模糊度,重新计算单差相位偏移,并存入xa中,同时将第8步中得到的其他状态量也存入xa中。
  • 注意事项
  1. 这个函数中的变量比较多,容易混乱。rtk->x是卡尔曼滤波的状态量,rtk->xa是利用lambda算法得到的整数解修正后的、与相位偏差无关的状态量(例如:位置+速度+加速度+电离层+对流层……),rtk->P和rtk->Pa同理。xa这个变量(注意不是rtk->xa,这是两个不同的变量)则包含了两部分,一部分是rtk->xa,另一部分则是利用lambda算法得到的双差整周模糊度计算得到的单差相位偏移。nx=rtk->nx是指卡尔曼滤波状态量的个数,na=rtk->na是除了单差相位偏差之外的所有状态量个数,所以通常相位偏差状态量的索引是从na开始;nb则是双差整周模糊度的个数。

ddmat

static int ddmat(rtk_t *rtk, double *D,int gps,int glo,int sbs)
  • 所在文件:Rtkpos.c
  • 功能说明:创建将卡尔曼状态量从单差转到双差的转换矩阵D’
  • 参数说明
        IO  rtk_t *rtk:      rtk solution structure
        I   double *D        single to double-difference transformation matrix (D')
  • 处理过程
  1. 首先将所有卫星的fix标志都清空置0:rtk->ssat[i].fix[j]=0。
  2. 将D矩阵中所有和相位偏移无关的状态量的对角线元素都置1。
  3. 对所有卫星系统进行循环,对所有频率进行循环,对所有卫星进行循环,如果该卫星没有被激活,则跳过。如果激活了,则寻找第一颗满足要求的卫星作为参考星,找到了就break,跳出所有卫星这个循环。
  4. 重新对所有卫星进行循环,检查每颗卫星是否符合要求,并根据该符合要求卫星和参考卫星的索引,对D矩阵进行赋值。

restamb

static void restamb(rtk_t *rtk, const double *bias, int nb, double *xa)
  • 所在文件:Rtkpos.c
  • 功能说明:根据lambda算法计算得到的双差整周模糊度,计算单差相位偏差
  • 参数说明
        IO  rtk_t *rtk:         rtk solution structure
        I   const double *bias  利用lambda算法计算得到的双差整周模糊度
        I   int nb              双差整周模糊度的个数
        I   double *xa          fixed states
  • 处理过程
  1. 首先用将xa状态量的前na个元素赋值为rtk->xa[i]:for (i=0;ina;i++) xa[i]=rtk->xa[i]; 而其余元素(相位偏差状态量)则赋值为卡尔曼滤波浮点解:xa[i]=rtk->x [i];这里需要理解这几个变量的含义,具体看resamb_LAMBDA函数注意事项中的解释。
  2. 对所有卫星系统进行循环,对所有频率进行循环,对所有卫星进行循环,找到该卫星相位偏移在卡尔曼滤波状态量中的索引,放到index数组中。
  3. 由于参考卫星是第一个符合要求的卫星,因此index[0]即为参考星的单差相位偏移,由此根据lambda算法计算得到的双差整周模糊度,计算其他卫星的单差相位偏移。

你可能感兴趣的:(RTKlib相对定位源码解析:resamb_LAMBDA (整周模糊度求解))