(三)RTKLIB学习——从main函数开始手撕代码

因为之前学过单点定位,所以把pntpos函数先拿出来讲了一下,对于RTK和PPP,是本次学习的重点,所以今天开始从main开始,一步一步手撕代码,如有错误,欢迎指正~

1.配置结构体初始化

prcopt_t prcopt=prcopt_default;
solopt_t solopt=solopt_default;
filopt_t filopt={""};
gtime_t ts={0},te={0};
double tint=0.0,es[]={2000,1,1,0,0,0},ee[]={2000,12,31,23,59,59},pos[3];
int i,j,n,ret;
char *infile[MAXFILE],*outfile="";
prcopt.mode  =PMODE_KINEMA;
prcopt.navsys=SYS_GPS|SYS_GLO;
prcopt.refpos=1;
prcopt.glomodear=1;
solopt.timef=0;

定位模型:kinematic

定位系统:GPS或GLO

refpos:base position for relative mode, 1表示average of single pos

glomodear:1表示on

timef:时间格式,0为以秒的方式

2.读取配置文件resetsysopts(), loadopts(), getsysopts()

for (i=1;i<argc;i++) {
    if (!strcmp(argv[i],"-k")&&i+1<argc) {
        resetsysopts();
        if (!loadopts(argv[++i],sysopts)) return -1;
        getsysopts(&prcopt,&solopt,&filopt);
    }
}

读取完之后再赋值给相应的变量,关注算法的话这些就不需要一点一点的读了,节省点时间。

3.进入postpos后处理主入口

ret=postpos(ts,te,tint,0.0,&prcopt,&solopt,&filopt,infile,n,outfile,"","");

函数定义:

extern int postpos(gtime_t ts, gtime_t te, double ti, double tu,
                   const prcopt_t *popt, const solopt_t *sopt,
                   const filopt_t *fopt, char **infile, int n, char *outfile,
                   const char *rov, const char *base)
  • gtime_t ts:处理开始时间。如果ts.time==0,则没有限制
  • gtime_t te:处理结束时间。如果te.time==0,则没有限制
  • double ti:处理间隔(s)。如果为0,则处理全部数据
  • double tu:处理单位时间(s)。如果为0,则处理全部数据(时间窗口)
  • prcopt_t *popt:处理配置
  • solopt_t *sopt:解的输出配置
  • fileopt_t *fopt:文件配置
  • char **infile:输入的文件
  • int n:输入的文件数
  • char *outfile:输出文件
  • char *rov:流动站id表,以" "划分
  • char *base:基站id表,以" "划分

最后返回status,0表示成功,0>表示错误,1表示中止。

输入文件应该包含观测数据,导航数据,精密星历/时钟(可选),SBAS日志文件(可选),SSR消息日志文件(可选)和TEC网格文件(可选)。在输入文件中,第一个观测数据文件被识别为流动站数据。

输入文件的类型通过文件扩展名来识别,具体如下:

  • .sp3, .SP3, .eph*, .EPH*:精密星历(sp3c)
  • .sbs, .SBS, .ems, .EMS:SBAS消息日志文件(RTKLIB或EMS)
  • .lex, .LEX:QZSS LEX消息日志文件
  • .rtcm3, .RTCM3:SSR消息日志文件(RTCM3)
  • .*i, .*I:TEC网格文件(IONEX)
  • 其他:RINEX OBS, NAV, GNAV, HNAV, QNAV或时钟文件  

今天主要看看postpos的处理流程,具体的实现后面再深究。

  1. 调用openses(),其通过调用readpcv(), opengeiod()读取天线,大地水准面文件
  2. 起止时间判断,划分解算单元
  3. 遍历infile[],调用reppath()展开文件时间通配符到ifile,ofile
  4. execses_b基准站处理,替换通配符

下面按顺序来解析一下其中一些要注意的点。

if
ts.time!=0 && te.time!=0 && tu>=0.0

不等于0,这说明处理的起止时间有限制的,处理的是从ts到te之间的数据,tu为窗口大小

if(tu==0.0 || tu>86400.0*MAXPRCDAYS) tu=86400.0*MAXPRCDAYS;

tu为0说明不限制窗口大小,86400s正好是一天,这说明最大的处理窗口为100天。

tunit=tu<86400.0?tu:86400.0;
tss=tunit*(int)floor(time2gpst(ts,&week)/tunit);

主要目的是确定是一个时间点ts所在的最近的tunit时间单位的开始时刻。

else if
ts.time!=0
else 

三个判断主要是处理周期和间隔不同,最终执行的都是execses_b函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值