因为之前学过单点定位,所以把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的处理流程,具体的实现后面再深究。
- 调用openses(),其通过调用readpcv(), opengeiod()读取天线,大地水准面文件
- 起止时间判断,划分解算单元
- 遍历infile[],调用reppath()展开文件时间通配符到ifile,ofile
- 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函数。