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

2023-05-16

将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 保存本历元观测时间和载波相位,(移动站和基准站),目的是下一个历元周跳探测

……

 

至此结束!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 【STM32F10x】二:利用结构体访问外设

    之前了解使用寄存器操作GPIOA口的LED灯亮灭程序 xff0c 原理是将寄存器的地址强制转换成指针形式 xff0c 然后对指针进行操作 这一章尝试通过将外设定义成结构体的形式来操作外设寄存器 本章重点在于理解和使用 lt 结构体 gt 来
  • TortoiseGit 解决冲突(万能方法)

    思路 xff1a 别人提交了代码 xff0c 你改了代码 xff0c 此时 xff0c 如果不更新或者直接提交都会造成冲突 xff0c 所以最好是在不跟新的情况下 xff0c 把冲突解决掉 xff0c 然后提交代码 xff01 1 右键 t
  • 求正整数n所有可能的和式的组合

    求正整数n所有可能的和式的组合 xff08 如 xff1b 4 61 1 43 1 43 1 43 1 1 43 1 43 2 1 43 3 2 43 1 43 1 2 43 2 xff09 首先说一下 xff0c 群里面很多人在问这个东东
  • 根据PCB扫描图反推原理图

    工具 相机 xff08 拍摄电路板正反面 xff0c 记录元器件位置 xff09 扫描仪 xff08 扫描拆掉元器件的电路板 xff0c 作为底图用于对照着绘制PCB xff09 Photoshop xff08 处理扫描出的图片 xff09
  • 链路聚合原理与配置

    文章目录 一 链路聚合简介链路聚合实现条件 二 链路聚合配置三 总结 一 链路聚合简介 链路聚合 xff1a 指将多个物理端口汇聚在一起 xff0c 形成一个逻辑端口 xff0c 以实现出 入流量吞吐量在各成员端口的负荷分担 xff0c 交
  • 防火墙命令

    防火墙命令 https blog csdn net calm programmer article details 124194093 1 查看防火墙的状态 dead代表关闭 running代表已经开启 systemctl status f
  • 国科大机器人作业四:基于线性的扩展卡尔曼滤波器的机器人定位(实验部分)

    文章目录 练习4 xff1a 基于线性的扩展卡尔曼滤波器的机器人定位1 Introduction2 Kalman Filter Localization2 1 状态预测 State Prediction2 2 状态更新 xff1a Stat
  • React - Context的简单使用

    Context 通过组件树提供了一个传递数据的方法 xff0c 从而避免了在每一个层级手动的传递 props 属性 在一个典型的 React 应用中 xff0c 数据是通过 props 属性由上向下 xff08 由父及子 xff09 的进行
  • cppflow加载tensorflow模型

    用tensorflow框架训练的pb模型在C 43 43 环境下使用的时候 xff0c 总是会出现版本不匹配的情况 xff0c 最近在github看到用cppflow来加载 xff0c 不用重新编译tensorflow xff0c 特别是t
  • 书,永远的朋友

    我自己认为我是一个不大喜欢看书的人 xff0c 相对于书 xff0c 我可能跟喜欢看视频和同高手一起讨论交流 但是 xff0c 真正静下心来 xff0c 想着这么多年来 xff0c 对我影响很大的一些书 xff0c 也能想到一些 索性 xf
  • 我的2013

    今天是2013年的最后一天 xff0c 天气格外的晴朗 xff0c 站在公司的写字楼上 xff0c 能够看到远处的山水 一直都习惯在一年的最后总结一下 xff0c 总结自己哪些地方在成长 xff0c 哪些地方有收获 xff0c 哪些地方需要
  • 项目管理中的TR点

    TR的意思是技术评审 xff0c 是英语Technical Review的简写 一般项目管理中有以下一些技术评审点需要关注 xff1a TR1 概念阶段技术评审点 xff1a 产品需求和概念技术评审 xff08 业务需求评审 xff09 T
  • linux ln 命令使用参数详解(ln -s 软链接)

    这是linux中一个非常重要命令 xff0c 请大家一定要熟悉 它的功能是为某一个文件在另外一个位置建立一个同不的链接 xff0c 这个命令最常用的参数是 s 具体用法是 xff1a ln s 源文件 目标文件 当 我们需要在不同的目录 x
  • 别再让C++头文件中出现“using namespace xxx;”

    在这里 xff0c 我毫不回避地说了这句话 xff1a 引用 我再也不想在任何头文件中看到 using namespace xxx 了 作为一个开发者 团队领导者 xff0c 我经常会去招聘新的项目成员 xff0c 有时候也帮助其他组的人来
  • Linux 查看监听端口的方法

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • 一口气说出 OAuth2.0 的四种授权方式

    上周我的自研开源项目开始破土动工了 xff0c 开源项目迈出第一步 xff0c 10 选 1 xff1f 页面模板成了第一个绊脚石 xff0c 密谋很久才付诸行动 xff0c 做这个的初衷就是不想让自己太安稳 xff0c 技术这条路不进步就
  • SVN MERGE 和冲突

    摘要 xff1a 最佳做法是避免冲突 冲突时 xff0c 不要把branch merge到trunk 先由最新版本的trunk得到branch 然后再修改文件 xff0c 直接merge过去就行 这样不会有冲突 先用svn merge dr
  • Linux命令之basename使用

    basename 命令 首先使用 help 参数查看一下 basename命令参数很少 xff0c 很容易掌握 basename help 用法示例 xff1a basename usr bin sort 输出 34 sort 34
  • 各种编码知识简介

    本文主要介绍我们在日常开发中接触到了latin1 xff0c GBK xff0c GB18030 xff0c UTF 8 编码几种 下面首先来看看这几种编码的的区别 latin1 1 先来看看latin1 参考百度百科 Latin1 是IS
  • Linux 技巧:让进程在后台可靠运行的几种方法

    我们经常会碰到这样的问题 xff0c 用 telnet ssh 登录了远程的 Linux 服务器 xff0c 运行了一些耗时较长的任务 xff0c 结果却由于网络的不稳定导致任务中途失败 如何让命令提交后不受本地关闭终端窗口 网络断开连接的

随机推荐