RTKLIB源码之单点定位/相对定位后处理简化版—第一版

将RTKLIB读取Rinex数据部分进行简化,同时,去掉与SPP/RTK无关的代码;

在实现时,只需要在main函数中,输入压缩/不压缩的Rinex观测文件、导航文件,即可实现SPP/RTK功能;

简化后的代码框架如下:

一、相对定位/RTK处理流程:

1、读取移动站观测文件:rcv=1

3 readobsnav: ts=2019/04/01 00:00:00 n=3
3 readrnxt: file=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUT00\CUT000AUS_R_20190910000_01D_30S_MO.rnx rcv=1
3 expath  : path=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUT00\CUT000AUS_R_20190910000_01D_30S_MO.rnx nmax=1024
3 readrnxfile: file=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUT00\CUT000AUS_R_20190910000_01D_30S_MO.rnx flag=0 index=1
3 rtk_uncompress: file=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUT00\CUT000AUS_R_20190910000_01D_30S_MO.rnx
3 rtk_uncompress: stat=0
3 readrnxfp: flag=0 index=1
3 readrnxh:
4 decode_obsh: ver=3.03
  • 进入readonsnav函数,读取观测文件,rcv=1;
  • 将文件路径替换/expath,读取观测文件;
  • 初始化移动站/sta参数,如果输入路径是压缩类型,则解压路径;
  • 进入readrnxfp函数,在这里面读取观测文件,包括文件头和数据记录:
3 readrnxfp: flag=0 index=1
3 readrnxh:
4 decode_obsh: ver=3.03
读取观测文件,文件头循环:n行内容
4 readrnxobs: rcv=1 ver=3.03 tsys=16517496
针对,某一频率多个信号,还要对优先级低的信号抛弃;
4 decode_obsepoch: ver=3.03
4 decode_obsepoch: time=2019/04/01 00:00:00.000 flag=0
读取观测文件,数据记录:
  • 读取文件头,对应输出 decode_obsh: ver=3.03;
  • 循环读取数据记录,对应输出 4 readrnxobs: rcv=1 ver=3.03 tsys=16517496
  • 读取数据记录时,根据RTKLIB MANUAL中每个导航系统中对应的某频点的观测数据优先级原则,每个频点只保留一个有效数据,多余的进行抛弃;

2、读取基准站观测文件:rcv=2

3 readrnxt: file=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUTA0\CUAI00AUS_R_20190910000_01D_30S_MO.rnx rcv=2
3 expath  : path=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUTA0\CUAI00AUS_R_20190910000_01D_30S_MO.rnx nmax=1024
3 expath  : file=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUTA0\CUAI00AUS_R_20190910000_01D_30S_MO.rnx
3 readrnxfile: file=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUTA0\CUAI00AUS_R_20190910000_01D_30S_MO.rnx flag=0 index=2
3 rtk_uncompress: file=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUTA0\CUAI00AUS_R_20190910000_01D_30S_MO.rnx
3 rtk_uncompress: stat=0
3 readrnxfp: flag=0 index=2
3 readrnxh:
4 decode_obsh: ver=3.03
读取观测文件,文件头循环:n行内容
针对,某一频率多个信号,还要对优先级低的信号抛弃;
4 decode_obsepoch: ver=3.03
4 decode_obsepoch: time=2019/04/01 00:00:00.000 flag=0
读取观测文件,数据记录:

读取顺序和步骤,与移动站观测数据一致;

3、读取导航文件:rcv=3

3 readrnxt: file=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUT00\CUT000AUS_R_20190910000_01D_MN.rnx rcv=3
3 expath  : path=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUT00\CUT000AUS_R_20190910000_01D_MN.rnx nmax=1024
3 expath  : file=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUT00\CUT000AUS_R_20190910000_01D_MN.rnx
3 readrnxfile: file=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUT00\CUT000AUS_R_20190910000_01D_MN.rnx flag=0 index=3
3 rtk_uncompress: file=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUT00\CUT000AUS_R_20190910000_01D_MN.rnx
3 rtk_uncompress: stat=0
3 readrnxfp: flag=0 index=3
3 readrnxh:
4 decode_navh:

读取导航电文和观测数据区别有两个:

  • sta=NULL;
  • 读取导航电文时,进入对应的导航电文读取函数;

4、观测、导航数据预处理

3 sortobs: nobs=9586
3 uniqnav: neph=2127 ngeph=455 nseph=0
3 uniqeph: n=2127
4 uniqeph: n=2059
3 uniqgeph: ng=455
4 uniqgeph: ng=455
3 uniqseph: ns=0

完成观测文件、导航文件读取后,对观测数据和导航电文进行排序;

5、读取卫星、接收机天线参数

此部分参数由输入的天线文件得到,在简化版本或RTK定位中,一般不输入卫星和接收机的天线文件,因此,此部分可以不用考虑。

如果没有输入文件,那么函数运行后的输出为;

3 searchpcv: sat= 1 type=
3 no satellite antenna pcv: G01
3 searchpcv: sat= 2 type=
3 no satellite antenna pcv: G02
比如,设置G导航系统为:GPS;则按照prn号,输出卫星参数……
循环
3 searchpcv: sat=32 type=
3 no satellite antenna pcv: G32
3 searchpcv: sat= 0 type=
2 no receiver antenna pcv: 
3 searchpcv: sat= 0 type=
2 no receiver antenna pcv: 
最后两个分别为:移动站、基准站接收机天线参数;

6、获取基准站坐标

根据设置中,基准站坐标的获取方式,选择对应的函数;

比如,此例中,选择通过Rinex文件头获取,则需要注意需要将pco、pcv进行转换后加到APPROX POSITION XYZ中。

 -2364337.4414  4870285.6211 -3360809.6724                  APPROX POSITION XYZ

                           0.0000        0.0000        0.0000                  ANTENNA: DELTA H/E/N

7、新建日志流/.trace文件

rtkopenstat

8、输出文件头到.pos文件

outhead

% program   : RTKLIB ver.2.4.3
% inp file  : E:\专业资料\网友交流\Curtin GNSS Research Centre\CUT00\CUT000AUS_R_20190910000_01D_30S_MO.rnx
% inp file  : E:\专业资料\网友交流\Curtin GNSS Research Centre\CUTA0\CUAI00AUS_R_20190910000_01D_30S_MO.rnx
% inp file  : E:\专业资料\网友交流\Curtin GNSS Research Centre\CUT00\CUT000AUS_R_20190910000_01D_MN.rnx
% obs start : 2019/04/01 00:00:00.0 GPST (week2047  86400.0s)
% obs end   : 2019/04/01 01:00:00.0 GPST (week2047  90000.0s)
% pos mode  : kinematic
% freqs     : L1
% solution  : forward
% elev mask : 15.0 deg
% dynamics  : off
% tidecorr  : off
% ionos opt : broadcast
% tropo opt : saastamoinen
% ephemeris : broadcast
% amb res   : fix and hold
% val thres : 3.0
% antenna1  :                       ( 0.0000  0.0000  0.0000)
% antenna2  :                       ( 0.0000  0.0000  0.0000)
% ref pos   :-32.003958382  115.894804118    22.7063
%
% (lat/lon/height=WGS84/ellipsoidal,Q=1:fix,2:float,3:sbas,4:dgps,5:single,6:ppp,ns=# of satellites)
%  GPST                  latitude(deg) longitude(deg)  height(m)   Q  ns   sdn(m)   sde(m)   sdu(m)  sdne(m)  sdeu(m)  sdun(m) age(s)  ratio    vn(m/s)    ve(m/s)    vu(m/s)      sdvn     sdve     sdvu    sdvne    sdveu    sdvun

注意:输出信息流,先存储在缓冲区中,只有fclose(fp)时,才会将头信息写入.pos文件。

9、定位模式/定位部分—转第二部分

示例中,设置前向处理,Kinematic解算模式;

则进入procpos函数进行处理。

10、释放导航电文、观测数据,程序结束

freeobsnav(&obss,&navs);

二、相对定位处理:(定位部分)

3 openfile: outfile=E:\专业资料\网友交流\Curtin GNSS Research Centre\CUT00\myposbyVS.pos
3 procpos : mode=0
3 rtkinit :

1、rtk引擎初始化

根据设置,确定待估计参数个数,并赋初值。

2、返回当前历元,移动站、基准站总的观测数个数

3 infunc  : revs=0 iobsu=0 iobsr=0 isbs=0
  • 查找移动站当前历元的观测数据数/nu;
  • 查找基准站当前历元的观测数据数/nr;
  • 按照先移动站后基准站的顺序将观测数据保存到obs数组中;

2.1 排除某颗卫星/某导航系统

2.2 RTKPOS/定位的核心部分—转第三部分

2.3 每个历元的定位结果输出到.pos文件中

继续读取下一个历元观测数据,进行2.1 2.2 2.3 的循环……

三、定位核心部分:(RTKPOS)

输出当前解算的历元时间,rover和base的总观测数; 输出数据,格式如下:

数据格式为: i+1,str,id,obs[i].rcv,obs[i].L[0],obs[i].L[1],obs[i].P[0],obs[i].P[1],obs[i].LLI[0],obs[i].LLI[1],
                        obs[i].code[0],obs[i].code[1],obs[i].SNR[0]*0.25,obs[i].SNR[1]*0.25);

3 rtkpos  : time=2019/04/01 00:00:00.000 n=20
4 obs=
 ( 1) 2019/04/01 00:00:00.000 G10 rcv1 120050886.836  93546193.248  22844927.648  22844935.605 0 0 1 20 42.3 28.8
 ( 2) 2019/04/01 00:00:00.000 G15 rcv1 133170840.646 103769514.088  25341571.102  25341576.727 0 0 1 20 38.5 17.5
 ( 3) 2019/04/01 00:00:00.000 G16 rcv1 121154370.326  94406004.185  23054909.773  23054913.051 0 0 1 20 42.3 27.3
 ( 4) 2019/04/01 00:00:00.000 G20 rcv1 109653773.466  85444533.792  20866423.617  20866428.176 0 0 1 20 48.0 38.8
 ( 5) 2019/04/01 00:00:00.000 G21 rcv1 104962761.251  81789181.746  19973750.305  19973753.613 0 0 1 20 49.8 43.3
 ( 6) 2019/04/01 00:00:00.000 G25 rcv1 125173342.553  97537692.643  23819693.758  23819703.176 0 0 1 20 37.3 21.5
 ( 7) 2019/04/01 00:00:00.000 G26 rcv1 109603186.451  85405106.616  20856791.555  20856799.270 0 0 1 20 50.0 41.5
 ( 8) 2019/04/01 00:00:00.000 G27 rcv1 131614766.178 102556946.696  25045448.063  25045457.105 0 0 1 20 37.0 20.5
 ( 9) 2019/04/01 00:00:00.000 G29 rcv1 119006335.892  92732281.822  22646165.547  22646170.109 0 0 1 20 46.5 32.5
 (10) 2019/04/01 00:00:00.000 G31 rcv1 123959471.699  96591805.651  23588708.320  23588713.297 0 0 1 20 41.5 24.8
 (11) 2019/04/01 00:00:00.000 G10 rcv2 120052934.976  93547751.117  22845312.788  22845315.992 0 0 1 20 42.3 30.3
 (12) 2019/04/01 00:00:00.000 G15 rcv2 133172840.022 103771047.566  25341947.906  25341949.806 0 0 1 20 36.3 16.8
 (13) 2019/04/01 00:00:00.000 G16 rcv2 121156311.275  94407509.915  23055280.971  23055280.395 0 0 1 20 42.3 27.5
 (14) 2019/04/01 00:00:00.000 G20 rcv2 109655808.954  85446078.005  20866805.629  20866805.471 0 0 1 20 48.3 41.3
 (15) 2019/04/01 00:00:00.000 G21 rcv2 104964741.822  81790696.860  19974124.553  19974123.397 0 0 1 20 49.0 45.3
 (16) 2019/04/01 00:00:00.000 G25 rcv2 125175352.646  97539253.877  23820079.359  23820083.472 0 0 1 20 37.0 22.3
 (17) 2019/04/01 00:00:00.000 G26 rcv2 109605150.529  85406621.451  20857166.696  20857169.697 0 0 1 20 48.8 43.5
 (18) 2019/04/01 00:00:00.000 G27 rcv2 131616683.812 102558460.192  25045822.761  25045825.275 0 0 1 20 38.0 22.3
 (19) 2019/04/01 00:00:00.000 G29 rcv2 119008381.027  92733806.425  22646541.302  22646542.488 0 0 1 20 45.8 33.5
 (20) 2019/04/01 00:00:00.000 G31 rcv2 123961485.192  96593350.204  23589090.969  23589090.884 0 0 1 20 39.8 22.8

3.1 设置基准站坐标

3.2 确定移动站和基准站观测数据分数,nu和nr

3.3 单点定位确定移动站位置

3.4 如果定位模式为PMODE_SINGLE,将相关的定位信息输出到.stat

3.5 进入relpos: relpos(rtk,obs,nu,nr,nav);—转第四部分

3.6 进入outsolstat(rtk);

将RTK定位中,产生的结果有关的信息,输出到.stat文件中。

分别为:

"$POS,%d,%.3f,%d,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f\n",week,tow,rtk->sol.stat,rtk->x[0],rtk->x[1],rtk->x[2],xa[0],xa[1], xa[2]);

"$VELACC,%d,%.3f,%d,%.4f,%.4f,%.4f,%.5f,%.5f,%.5f,%.4f,%.4f,%.4f,%.5f,%.5f,%.5f\n"          week,tow,rtk->sol.stat,vel[0],vel[1],vel[2],acc[0],acc[1], acc[2],vela[0],vela[1],vela[2],acca[0],acca[1],acca[2]);

"$ION,%d,%.3f,%d,%s,%.1f,%.1f,%.4f,%.4f\n",week,tow, rtk->sol.stat,id,ssat->azel[0]*R2D,ssat->azel[1]*R2D,rtk->x[j],xa[0]);

"$TROP,%d,%.3f,%d,%d,%.4f,%.4f\n",week,tow, rtk->sol.stat,i+1,rtk->x[j],xa[0]); 

"$HWBIAS,%d,%.3f,%d,%d,%.4f,%.4f\n",week,tow, rtk->sol.stat,i+1,rtk->x[j],xa[0]); 

"$SAT,%d,%.3f,%s,%d,%.1f,%.1f,%.4f,%.4f,%d,%.0f,%d,%d,%d,%d,%d,%d\n",
                    week,tow,id,j+1,ssat->azel[0]*R2D,ssat->azel[1]*R2D,ssat->resp[j],ssat->resc[j],ssat->vsat[j],ssat->snr[j]*0.25,
                    ssat->fix[j],ssat->slip[j]&3,ssat->lock[j],ssat->outc[j],ssat->slipc[j],ssat->rejc[j]); 

四、relpos部分

输出待估参数个数,移动站、基准站在当前历元下,观测数目。

3 relpos  : nx=164 nu=10 nr=10

4.1 计算所有卫星的位置、钟差/m、方差、svh等信息

4 2019/03/31 23:59:59.923713 sat=10 rs= -9595494.872  23302867.909   8126055.867 dts=   84076.035 var=  5.760 svh=00
4 2019/03/31 23:59:59.915790 sat=15 rs=-26271582.525  -3256693.006  -4245027.729 dts= -320748.009 var=  5.760 svh=00
4 2019/03/31 23:59:59.923126 sat=16 rs=  9188077.759  11853277.141 -22065467.082 dts=  -29360.744 var=  5.760 svh=00
4 2019/03/31 23:59:59.929874 sat=20 rs=-14155680.460  22270134.228  -2326077.131 dts=  523584.395 var=  5.760 svh=00
4 2019/03/31 23:59:59.933596 sat=21 rs= -6843837.823  16344533.645 -19026393.582 dts= -221423.617 var=  5.760 svh=00
4 2019/03/31 23:59:59.921286 sat=25 rs=-19106429.163  15486546.571   9478153.472 dts= -740182.709 var=  5.760 svh=00
4 2019/03/31 23:59:59.930265 sat=26 rs=  1276282.022  20061715.548 -17285581.782 dts=  164112.133 var=  5.760 svh=00
4 2019/03/31 23:59:59.916556 sat=27 rs= 18647200.584  11886120.000 -15028506.963 dts=  -98288.601 var=  5.760 svh=00
4 2019/03/31 23:59:59.924224 sat=29 rs=-23490722.649   4089040.905 -11731994.987 dts=  236224.696 var=  5.760 svh=00
4 2019/03/31 23:59:59.921268 sat=31 rs=  6205009.012  24942532.543   5681593.250 dts=   48214.566 var=  5.760 svh=00
4 2019/03/31 23:59:59.923712 sat=10 rs= -9595494.871  23302867.908   8126055.871 dts=   84076.035 var=  5.760 svh=00
4 2019/03/31 23:59:59.915789 sat=15 rs=-26271582.526  -3256693.006  -4245027.725 dts= -320748.009 var=  5.760 svh=00
4 2019/03/31 23:59:59.923125 sat=16 rs=  9188077.761  11853277.139 -22065467.083 dts=  -29360.744 var=  5.760 svh=00
4 2019/03/31 23:59:59.929872 sat=20 rs=-14155680.460  22270134.229  -2326077.127 dts=  523584.395 var=  5.760 svh=00
4 2019/03/31 23:59:59.933595 sat=21 rs= -6843837.822  16344533.648 -19026393.580 dts= -221423.617 var=  5.760 svh=00
4 2019/03/31 23:59:59.921285 sat=25 rs=-19106429.163  15486546.572   9478153.468 dts= -740182.709 var=  5.760 svh=00
4 2019/03/31 23:59:59.930264 sat=26 rs=  1276282.024  20061715.546 -17285581.785 dts=  164112.133 var=  5.760 svh=00
4 2019/03/31 23:59:59.916554 sat=27 rs= 18647200.586  11886120.000 -15028506.961 dts=  -98288.601 var=  5.760 svh=00
4 2019/03/31 23:59:59.924223 sat=29 rs=-23490722.647   4089040.905 -11731994.990 dts=  236224.696 var=  5.760 svh=00
4 2019/03/31 23:59:59.921267 sat=31 rs=  6205009.013  24942532.543   5681593.246 dts=   48214.566 var=  5.760 svh=00

4.2 基准站非差残差计算: zdres

for (i=0;i<n;i++){ // n为基准站观测到的卫星数

       4.2.1 计算基准站接收机与卫星的几何距离

                包含地球校正。

       4.2.2 计算基准站接收机观测到卫星的方位角、高度角,并与最小高度角做比较

       4.2.3 剔除设置中不参与的导航卫星

       4.2.4 上面计算的几何距离减去卫星钟差

       4.2.5 几何距离加上对流层延迟,对流程映射函数NMF

       4.2.6 计算接收机(基站和移动站都需要改)天线的PCO、PCV,并存储到dant钟;

       4.2.7 计算载波残差(单位:m)、伪距残差

/* residuals = observable - pseudorange */
// 首先保存 载波残差,单位:m;然后保存伪距残差
if (obs->L[i]!=0.0) y[i   ]=obs->L[i]*lam[i]-r-dant[i];
if (obs->P[i]!=0.0) y[i+nf]=obs->P[i]       -r-dant[i];

}

.trace中,对于上述操作,有如下显示:

  • 基准站位置:XYZ、LLH;
  • 卫星号、位置、钟差、方位角、高度角;
  • 非差残差:首先是载波/m,然后是伪距;每颗星为一列!
4 rr_=-2364335.465 4870280.691 -3360815.696
4 pos=-32.003958382 115.894804118 22.706
4 sat=10  -9595494.871  23302867.908   8126055.871  0.0000840760  355.6  27.7
4 sat=15 -26271582.526  -3256693.006  -4245027.725 -0.0003207480   87.9   7.1
4 sat=16   9188077.761  11853277.139 -22065467.083 -0.0000293607  221.5  28.4
4 sat=20 -14155680.460  22270134.229  -2326077.127  0.0005235844   14.2  54.3
4 sat=21  -6843837.822  16344533.648 -19026393.580 -0.0002214236  188.2  69.9
4 sat=25 -19106429.163  15486546.572   9478153.468 -0.0007401827   27.7  18.5
4 sat=26   1276282.024  20061715.546 -17285581.785  0.0001641121  241.4  57.4
4 sat=27  18647200.586  11886120.000 -15028506.961 -0.0000982886  242.5   8.6
4 sat=29 -23490722.647   4089040.905 -11731994.990  0.0002362247   97.6  30.9
4 sat=31   6205009.013  24942532.543   5681593.246  0.0000482146  312.8  18.1
4 y=
    -20493.686         0.000    -20501.530    -20498.061    -20498.720    -20494.652    -20495.929         0.000    -20499.287    -20504.071
    -20494.825         0.000    -20500.015    -20499.062    -20500.403    -20492.892    -20495.885         0.000    -20499.904    -20499.404

4.3 选择共视卫星 selsat

3 selsat  : nu=10 nr=10
4 ( 0) sat= 10 iu= 0 ir=10
4 ( 1) sat= 16 iu= 2 ir=12
4 ( 2) sat= 20 iu= 3 ir=13
4 ( 3) sat= 21 iu= 4 ir=14
4 ( 4) sat= 25 iu= 5 ir=15
4 ( 5) sat= 26 iu= 6 ir=16
4 ( 6) sat= 29 iu= 8 ir=18
4 ( 7) sat= 31 iu= 9 ir=19

4.4 时间更新 udstate

3 udstate : ns=8

4.4.1 更新位置、速度、加速度 udpos

如果是第一个历元,则根据是否设置dynamic,对rtk->x[i]和rtk->P[i+j*rtk->nx] 进行赋值;

如果定位模式为:PMODE_STATIC;则退出函数;

如果非第一个历元,则根据定位模式,进入对应的分支;

如果估计的位置方差大于预设值,则重置位置、速度、加速度方差为系统默认值;

统计有效的待估参数个数/nx,如果待估参数小于9,则退出函数;

根据上面确定的待估参数/nx,设置状态转移矩阵F、误差协方差矩阵P、等;

完成:Kalman滤波中时间更新, x=F*x, P=F*P*F+Q

对应的参数为:rtk->x rtk->P

 4.4.2  更新电离层参数 udion

电离层估计参数和协方差阵参数的调整

 4.4.3  更新对流层参数 udtrop

对流层估计参数和协方差阵参数的调整

 4.4.4  更新receiver h/w bias  udrcvbias

 4.4.5  更新站间单差模糊度  udbias

1、首先进行周跳探测:

周跳探测顺序为:detslp_ll、detslp_gf_L1L2、detslp_gf_L1L5、detslp_dop

for(i=0;i<MAXSAT;i++) //遍历所有卫星

{

2、设置模糊度固定不同,对应不同的模糊度更新方式:

  • 模糊度固定方式:ARMODE_INST,并且某颗卫星单差模糊度不为0;则对pos、vel、acc以及单差模糊度参数全部置0;
  • 如果载波相位失锁数超过设定值,则RESET=1,并且某颗卫星单差模糊度不为0;则对pos、vel、acc以及单差模糊度参数全部置0;
  • 模糊度固定方式不是:ARMODE_INST,并且载波相位失锁数超过设定值,则RESET=1;则:rtk->ssat[i-1].lock[f]=-rtk->opt.minlock;

}

for(i=0;i<MAXSAT;i++) //遍历共视卫星

{

3、如果共视卫星存在周跳,其标识slip,是在上述“1”中得到;则对此卫星模糊度置0,并增加P矩阵中对应的噪声

}

for(i=0;i<MAXSAT;i++) //遍历共视卫星

{

4、利用载波、伪距计算单差模糊度

(1) 计算站间单差模糊度:

站间载波单差=移动站载波-基准站载波,单位:cycle

站间伪距单差=移动站伪距-基准站伪距,单位:m

站间单差模糊度=站间载波单差 - 站间伪距单差/波长;单位:cycle

以上,是针对非电离层无关模型;对于电离层无关模型,需要两个频点的数据,进行同样的处理。

(2) 单差模糊度处理

如果某颗卫星的模糊度非0,则进行如下计算:

offset+=bias[i]-rtk->x[IB(sat[i],f,&rtk->opt)];

}

for(i=0;i<MAXSAT;i++) //遍历所有卫星

{

5、存在模糊度且模糊度不为0的卫星,处理方法:

如果某颗卫星存在模糊度,则将上述计算的平均偏差进行累加:

rtk->x[IB(i,f,&rtk->opt)]+=offset/j;

}

for(i=0;i<MAXSAT;i++) //遍历共视卫星

{

6、如果bias不为0,且卫星单差模糊度为0,则;

对此颗卫星模糊度参数赋初值,初值为:bias[i]

 initx(rtk,bias[i],SQR(rtk->opt.std[0]),IB(sat[i],f,&rtk->opt)); 

}

4.5 变量、参数导入

    xp=mat(rtk->nx,1); Pp=zeros(rtk->nx,rtk->nx); xa=mat(rtk->nx,1);
    matcpy(xp,rtk->x,rtk->nx,1); // 参数传进入
    
    ny=ns*nf*2+2; // nf=1时,
    v=mat(ny,1); H=zeros(rtk->nx,ny); R=mat(ny,ny); bias=mat(rtk->nx,1);

4.6 移动站非差残差计算: zdres

过程与4.2一致!此处不再赘述。

4.7 双差

for (i=0;i<MAXSAT;i++) for (j=0;j<NFREQ;j++)

{

4.7.1 伪距、载波残差数组置0

}

for(i=0;i<ns;i++) //遍历共视卫星

{

4.7.2 电离层设置>=IONOOPT_EST ,对流层设置>=TROPOPT_EST

1、移动站和基准站电离层估计值求和,取平均;

2、分别估计移动站、基准站延迟;

}

for(f=0;f<2;f++)

{

for(i=0;i<ns;i++) //遍历共视卫星

{

4.7.3 对 载波、伪距,共视卫星;循环以下动作:

1、高度角最高的卫星,当作参考星

2、双差

(1)残差:【参考星(移动站) - 参考星(基准站)】- 【非参考星(移动站) - 非参考星(基准站)】

其中,以上四项都是经过非差zdres处理得到的;

v[nv]=(y[f+iu[i]*nf*2]-y[f+ir[i]*nf*2])-(y[f+iu[j]*nf*2]-y[f+ir[j]*nf*2]);

(2)构建H矩阵: 移动站非参考星视线向量 - 移动站参考星视线向量

/* partial derivatives by rover position */
if (H) {
    for (k=0;k<3;k++) {
         Hi[k]=-e[k+iu[i]*3]+e[k+iu[j]*3];
         }
       }

(3)双差电离层估计参数,修正残差,并构建H矩阵

            /* double-differenced ionospheric delay term */
            if (opt->ionoopt==IONOOPT_EST) {
                fi=lami/lam_carr[0]; fj=lamj/lam_carr[0];
                didxi=(f<nf?-1.0:1.0)*fi*fi*im[i];
                didxj=(f<nf?-1.0:1.0)*fj*fj*im[j];
                v[nv]-=didxi*x[II(sat[i],opt)]-didxj*x[II(sat[j],opt)];
                if (H) {
                    Hi[II(sat[i],opt)]= didxi;
                    Hi[II(sat[j],opt)]=-didxj;
                }
            }

 (4)双差对流层估计参数,修正残差,并构建H矩阵

            /* double-differenced tropospheric delay term */
            if (opt->tropopt==TROPOPT_EST||opt->tropopt==TROPOPT_ESTG) {
                v[nv]-=(tropu[i]-tropu[j])-(tropr[i]-tropr[j]);
                for (k=0;k<(opt->tropopt<TROPOPT_ESTG?1:3);k++) {
                    if (!H) continue;
                    Hi[IT(0,opt)+k]= (dtdxu[k+i*3]-dtdxu[k+j*3]);
                    Hi[IT(1,opt)+k]=-(dtdxr[k+i*3]-dtdxr[k+j*3]);
                }
            }

(5)双差模糊度,修正残差,并构建H矩阵

            /* double-differenced phase-bias term */
            if (f<nf) {
                if (opt->ionoopt!=IONOOPT_IFLC) {
                    v[nv]-=lami*x[IB(sat[i],f,opt)]-lamj*x[IB(sat[j],f,opt)]; //单位为米/m
                    if (H) {
                        Hi[IB(sat[i],f,opt)]= lami;
                        Hi[IB(sat[j],f,opt)]=-lamj;
                    }
                }
                else {
                    v[nv]-=x[IB(sat[i],f,opt)]-x[IB(sat[j],f,opt)];
                    if (H) {
                        Hi[IB(sat[i],f,opt)]= 1.0;
                        Hi[IB(sat[j],f,opt)]=-1.0;
                    }
                }
            }

(6)/* glonass receiver h/w bias term */

(7)/* glonass interchannel bias correction */

(8)将双差载波/m,伪距残差,输出到相应的结构体中

if (f<nf) rtk->ssat[sat[j]-1].resc[f   ]=v[nv];
else      rtk->ssat[sat[j]-1].resp[f-nf]=v[nv];

(9)每一颗卫星残差与设置新息值进行判断:新息判断

            /* test innovation */
            if (opt->maxinno>0.0&&fabs(v[nv])>opt->maxinno) { //新息
                if (f<nf) {
                    rtk->ssat[sat[i]-1].rejc[f]++; // reject counter
                    rtk->ssat[sat[j]-1].rejc[f]++;
                }
                errmsg(rtk,"outlier rejected (sat=%3d-%3d %s%d v=%.3f)\n",
                       sat[i],sat[j],f<nf?"L":"P",f%nf+1,v[nv]);
                continue;
            }

(10)单差方差,i为参考星,j为非参考星

            /* single-differenced measurement error variances */
            Ri[nv]=varerr(sat[i],sysi,azel[1+iu[i]*2],bl,dt,f,opt);
            Rj[nv]=varerr(sat[j],sysj,azel[1+iu[j]*2],bl,dt,f,opt);

 (11)有效卫星标识

首先是载波,然后是伪距;根据f<nf判断:

            /* set valid data flags */
            if (opt->mode>PMODE_DGPS) {
                if (f<nf) rtk->ssat[sat[i]-1].vsat[f]=rtk->ssat[sat[j]-1].vsat[f]=1;
            }
            else {
                rtk->ssat[sat[i]-1].vsat[f-nf]=rtk->ssat[sat[j]-1].vsat[f-nf]=1;
            }

(12)输出载波、伪距双差残差;参考星、非参考星的方差

trace(4,"sat=%3d-%3d %s%d v=%13.3f R=%8.6f %8.6f\n",sat[i],
                  sat[j],f<nf?"L":"P",f%nf+1,v[nv],Ri[nv],Rj[nv]);
4 sat= 21- 10 L1 v=       -1.019 R=0.000038 0.000101
4 sat= 21- 16 L1 v=       -1.896 R=0.000038 0.000098
4 sat= 21- 20 L1 v=       -0.314 R=0.000038 0.000045
4 sat= 21- 25 L1 v=       -0.633 R=0.000038 0.000197
4 sat= 21- 26 L1 v=       -0.148 R=0.000038 0.000043
4 sat= 21- 29 L1 v=       -1.734 R=0.000038 0.000086
4 sat= 21- 31 L1 v=       -2.050 R=0.000038 0.000204
4 sat= 21- 10 P1 v=       -1.019 R=0.384101 1.011280
4 sat= 21- 16 P1 v=       -1.896 R=0.384101 0.977060
4 sat= 21- 20 P1 v=       -0.314 R=0.384101 0.452860
4 sat= 21- 25 P1 v=       -0.633 R=0.384101 1.967567
4 sat= 21- 26 P1 v=       -0.148 R=0.384101 0.433886
4 sat= 21- 29 P1 v=       -1.734 R=0.384101 0.863966
4 sat= 21- 31 P1 v=       -2.050 R=0.384101 2.041239

}

}

4.7.4 Moving Baseline

    /* baseline length constraint for moving baseline */
    if (opt->mode==PMODE_MOVEB&&constbl(rtk,x,P,v,H,Ri,Rj,nv)) {
        vflg[nv++]=3<<4;
        nb[b++]++;
    }

4.7.5 输出 H 矩阵

 if (H) {trace(5,"H=\n"); tracemat(5,H,rtk->nx,nv,7,4);}

部分元素如下:

5 H=
 -0.0911  0.7256 -0.3355 -0.4841  0.3988 -0.7043  0.5875 -0.0911  0.7256 -0.3355 -0.4841  0.3988 -0.7043  0.5875
  0.2295 -0.2731  0.2510 -0.1263  0.1502 -0.6101  0.2739  0.2295 -0.2731  0.2510 -0.1263  0.1502 -0.6101  0.2739
  1.2879 -0.0248  0.8353  1.3297  0.1207  0.4179  1.1689  1.2879 -0.0248  0.8353  1.3297  0.1207  0.4179  1.1689
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
 -0.1903  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000 -0.1903  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000 -0.1903  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.1903  0.1903  0.1903  0.1903  0.1903  0.1903  0.1903  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000 -0.1903  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000 -0.1903  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000
  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000  0.0000

4.7.6 双差测量方差矩阵

/* double-differenced measurement error covariance ---------------------------*/
static void ddcov(const int *nb, int n, const double *Ri, const double *Rj,
                  int nv, double *R)
{
    int i,j,k=0,b;
    
    trace(3,"ddcov   : n=%d\n",n);
    
    for (i=0;i<nv*nv;i++) R[i]=0.0;
    for (b=0;b<n;k+=nb[b++]) {
        
        for (i=0;i<nb[b];i++) for (j=0;j<nb[b];j++) {
            R[k+i+(k+j)*nv]=Ri[k+i]+(i==j?Rj[k+i]:0.0);
        }
    }
    trace(5,"R=\n"); tracemat(5,R,nv,nv,8,6);
}

输出R矩阵;

5 R=
 0.000140 0.000038 0.000038 0.000038 0.000038 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000136 0.000038 0.000038 0.000038 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000084 0.000038 0.000038 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000038 0.000235 0.000038 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000038 0.000038 0.000082 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000038 0.000038 0.000038 0.000125 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000038 0.000038 0.000038 0.000038 0.000243 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.395381 0.384101 0.384101 0.384101 0.384101 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 1.361161 0.384101 0.384101 0.384101 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.836961 0.384101 0.384101 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.384101 2.351667 0.384101 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.384101 0.384101 0.817987 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.384101 0.384101 0.384101 1.248066 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.384101 0.384101 0.384101 0.384101 2.425340

4.8 Kalman 测量更新

4.8.1 将rtk->P 赋值给 Pp

 matcpy(Pp,rtk->P,rtk->nx,rtk->nx);

4.8.2 kalman 测量更新实现

info=filter_(x_,P_,H_,v,R,k,m,xp_,Pp_);

K=P*H*Q^-1
xp=x+K*v
Pp=(I-K*H')*P

4.8.3 输出移动站坐标浮点解

4 x(1)= -2364337.4053  4870285.1492 -3360808.1346

4.9 移动站非差

主要改变是移动站坐标为当前历元浮点解,因此,残差也对应改变。

4.9.1 浮点解,双差

3 ddres   : dt=0.0 nx=164 ns=8
4 sat= 21- 10 L1 v=       -0.001 R=0.000038 0.000101
4 sat= 21- 16 L1 v=       -0.001 R=0.000038 0.000098
4 sat= 21- 20 L1 v=       -0.000 R=0.000038 0.000045
4 sat= 21- 25 L1 v=       -0.002 R=0.000038 0.000197
4 sat= 21- 26 L1 v=       -0.000 R=0.000038 0.000043
4 sat= 21- 29 L1 v=       -0.001 R=0.000038 0.000086
4 sat= 21- 31 L1 v=       -0.002 R=0.000038 0.000204
4 sat= 21- 10 P1 v=       -0.047 R=0.384101 1.011280
4 sat= 21- 16 P1 v=       -0.238 R=0.384101 0.977061
4 sat= 21- 20 P1 v=       -0.322 R=0.384101 0.452860
4 sat= 21- 25 P1 v=        0.924 R=0.384101 1.967567
4 sat= 21- 26 P1 v=        0.084 R=0.384101 0.433886
4 sat= 21- 29 P1 v=       -0.299 R=0.384101 0.863966
4 sat= 21- 31 P1 v=       -0.518 R=0.384101 2.041240
3 ddcov   : n=2
5 R=
 0.000140 0.000038 0.000038 0.000038 0.000038 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000136 0.000038 0.000038 0.000038 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000084 0.000038 0.000038 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000038 0.000235 0.000038 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000038 0.000038 0.000082 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000038 0.000038 0.000038 0.000125 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000038 0.000038 0.000038 0.000038 0.000243 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.395381 0.384101 0.384101 0.384101 0.384101 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 1.361161 0.384101 0.384101 0.384101 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.836961 0.384101 0.384101 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.384101 2.351668 0.384101 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.384101 0.384101 0.817987 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.384101 0.384101 0.384101 1.248067 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.384101 0.384101 0.384101 0.384101 2.425340

4.9.2 浮点解有效性判断

3 valpos  : nv=14 thres=4.0

1、浮点解赋值、浮点解对应协方差矩阵赋值;更新到rtk->x、rtk->P

2、更新模糊度相关的结构体

typedef struct {        /* satellite status type */
    unsigned char sys;  /* navigation system */
    unsigned char vs;   /* valid satellite flag single */
    double azel[2];     /* azimuth/elevation angles {az,el} (rad) */
    double resp[NFREQ]; /* residuals of pseudorange (m) */
    double resc[NFREQ]; /* residuals of carrier-phase (m) */
    unsigned char vsat[NFREQ]; /* valid satellite flag */
    unsigned char snr [NFREQ]; /* signal strength (0.25 dBHz) */
    unsigned char fix [NFREQ]; /* ambiguity fix flag (1:fix,2:float,3:hold) */
    unsigned char slip[NFREQ]; /* cycle-slip flag */
    unsigned char half[NFREQ]; /* half-cycle valid flag */
    int lock [NFREQ];   /* lock counter of phase */
    unsigned int outc [NFREQ]; /* obs outage counter of phase */
    unsigned int slipc[NFREQ]; /* cycle-slip counter */
    unsigned int rejc [NFREQ]; /* reject counter */
    double  gf;         /* geometry-free phase L1-L2 (m) */
    double  gf2;        /* geometry-free phase L1-L5 (m) */
    double  mw;         /* MW-LC (m) */
    double  phw;        /* phase windup (cycle) */
    gtime_t pt[2][NFREQ]; /* previous carrier-phase time */
    double  ph[2][NFREQ]; /* previous carrier-phase observable (cycle) *///怎么保存的?
} ssat_t;

4.10 宽巷、窄巷求解模糊度

    /* resolve integer ambiguity by WL-NL */
    if (stat!=SOLQ_NONE&&rtk->opt.modear==ARMODE_WLNL) {
        
        if (resamb_WLNL(rtk,obs,sat,iu,ir,ns,nav,azel)) {
            stat=SOLQ_FIX;
        }
    }

4.11 三频 求解模糊度

    /* resolve integer ambiguity by TCAR */
    else if (stat!=SOLQ_NONE&&rtk->opt.modear==ARMODE_TCAR) {
        
        if (resamb_TCAR(rtk,obs,sat,iu,ir,ns,nav,azel)) {
            stat=SOLQ_FIX;
        }
    }

4.12 LAMBDA求解模糊度

3 resamb_LAMBDA : nx=164 

4.12.1 resamb_LAMBDA

1、如果模糊度求解方式:ARMODE_OFF 或定位模式为 PMODE_DGPS及以下,则跳出函数

    if (rtk->opt.mode<=PMODE_DGPS||rtk->opt.modear==ARMODE_OFF||
        rtk->opt.thresar[0]<1.0) {
        return 0;
    }

2、单差转双差矩阵 D

矩阵D,行大小为nx,列大小为3+共视卫星个数

3 ddmat   :
5 D=
  1  0  0  0  0  0  0  0  0  0
  0  1  0  0  0  0  0  0  0  0
  0  0  1  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  1  1  1  1  1  1  1
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0 -1  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0 -1  0  0  0  0  0
  0  0  0  0  0 -1  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0 -1  0  0  0
  0  0  0  0  0  0  0 -1  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0 -1  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0 -1
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0

3、通过 D,进行状态、协方差矩阵转换

y=D'*x;
Qy=D'*P*D);

输出双差模糊度浮点解:

4 N(0)=    -34.932      2.333    -10.090    -35.366    -30.833     44.986    -24.026

4、 lambda     mlambda integer least-square estimation

LD分解,LD factorization

(1)降相关,得到Z;

(2)z=Z'*a;

(3)模糊度搜索;F=Z'\E

 输出模糊度固定解:

4 N(1)=    -39.000      1.000    -14.000    -36.000    -34.000     41.000    -24.000
4 N(2)=    -30.000      2.000     -8.000    -34.000    -29.000     49.000    -23.000

ratio检测:

        rtk->sol.ratio=s[0]>0?(float)(s[1]/s[0]):0.0f;
        if (rtk->sol.ratio>999.9) rtk->sol.ratio=999.9f;

通过 ration判断后,进行的操作:

      /* validation by popular ratio-test */
        if (s[0]<=0.0||s[1]/s[0]>=opt->thresar[0]) {
            
            /* transform float to fixed solution (xa=xa-Qab*Qb\(b0-b)) */
            for (i=0;i<na;i++) {
                rtk->xa[i]=rtk->x[i];
                for (j=0;j<na;j++) rtk->Pa[i+j*na]=rtk->P[i+j*nx];
            }
            for (i=0;i<nb;i++) {
                bias[i]=b[i];
                y[na+i]-=b[i];
            }
            if (!matinv(Qb,nb)) {
                matmul("NN",nb,1,nb, 1.0,Qb ,y+na,0.0,db);
                matmul("NN",na,1,nb,-1.0,Qab,db  ,1.0,rtk->xa);
                
                /* covariance of fixed solution (Qa=Qa-Qab*Qb^-1*Qab') */
                matmul("NN",na,nb,nb, 1.0,Qab,Qb ,0.0,QQ);
                matmul("NT",na,na,nb,-1.0,QQ ,Qab,1.0,rtk->Pa);
                
                trace(3,"resamb : validation ok (nb=%d ratio=%.2f s=%.2f/%.2f)\n",
                      nb,s[0]==0.0?0.0:s[1]/s[0],s[0],s[1]);
                
                /* restore single-differenced ambiguity */
                restamb(rtk,bias,nb,xa);
            }
            else nb=0;
        }
3 resamb : validation ok (nb=7 ratio=4.13 s=1.17/4.83)

4.12.2 移动站固定解后,移动站非差

3 zdres   : n=10

4.12.3 移动站固定解后,双差

3 ddres   : dt=0.0 nx=164 ns=8
4 sat= 21- 10 L1 v=       -0.003 R=0.000038 0.000101
4 sat= 21- 16 L1 v=       -0.003 R=0.000038 0.000098
4 sat= 21- 20 L1 v=       -0.002 R=0.000038 0.000045
4 sat= 21- 25 L1 v=        0.002 R=0.000038 0.000197
4 sat= 21- 26 L1 v=       -0.000 R=0.000038 0.000043
4 sat= 21- 29 L1 v=       -0.002 R=0.000038 0.000086
4 sat= 21- 31 L1 v=       -0.002 R=0.000038 0.000204
4 sat= 21- 10 P1 v=        0.695 R=0.384101 1.011281
4 sat= 21- 16 P1 v=       -0.271 R=0.384101 0.977061
4 sat= 21- 20 P1 v=        0.166 R=0.384101 0.452860
4 sat= 21- 25 P1 v=        1.551 R=0.384101 1.967568
4 sat= 21- 26 P1 v=        0.225 R=0.384101 0.433886
4 sat= 21- 29 P1 v=       -0.315 R=0.384101 0.863966
4 sat= 21- 31 P1 v=        0.231 R=0.384101 2.041241
3 ddcov   : n=2
5 R=
 0.000140 0.000038 0.000038 0.000038 0.000038 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000136 0.000038 0.000038 0.000038 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000084 0.000038 0.000038 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000038 0.000235 0.000038 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000038 0.000038 0.000082 0.000038 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000038 0.000038 0.000038 0.000125 0.000038 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000038 0.000038 0.000038 0.000038 0.000038 0.000038 0.000243 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.395381 0.384101 0.384101 0.384101 0.384101 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 1.361161 0.384101 0.384101 0.384101 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.836961 0.384101 0.384101 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.384101 2.351669 0.384101 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.384101 0.384101 0.817987 0.384101 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.384101 0.384101 0.384101 1.248067 0.384101
 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.384101 0.384101 0.384101 0.384101 0.384101 0.384101 2.425341

4.12.4  定位有效性判断,主要是残差 validation of fixed solution

3 valpos  : nv=14 thres=4.0

4.13 如果固定了模糊度,保存相关信息到结构体

4.14 如果未固定模糊度,保存相关信息到结构体

4.15 保存本历元观测时间和载波相位,(移动站和基准站),目的是下一个历元周跳探测

……

 

至此结束!

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值