asp资源下载网站,wordpress lamp 教程,网站建设免费教程,wordpress缩略图加边框#前言 如果要详细了解RTKLIB或进行二次开发#xff0c;了解obs指针所存储每个历元的卫星观测数据是必不可少的环节#xff0c;此文对RTKLIB的#xff08;由于后处理和实时运行都要用到前向滤波#xff09;前向滤波#xff08;从文件头读取观测数据到obs结构体中#xff0…#前言 如果要详细了解RTKLIB或进行二次开发了解obs指针所存储每个历元的卫星观测数据是必不可少的环节此文对RTKLIB的由于后处理和实时运行都要用到前向滤波前向滤波从文件头读取观测数据到obs结构体中进行每个历元的解算进行详细的分析。结合代码调试来学习效果更佳
procpos函数
procpos是开启历元循环所在的函数也是循环读取每个历元观测数据所在的函数。
solstaticsopt-solstatic//静态解(popt-modePMODE_STATIC||popt-modePMODE_PPP_STATIC);rtkinit(rtk,popt);rtcm_path[0]\0;//实时数据流while ((nobsinputobs(obs,rtk.sol.stat,popt))0) {在这个函数中循环读取一个历元的观测数据而广播星历则是一次读取完。
/* exclude satellites 排除没有参与定位的卫星*/for (in0;inobs;i) {if ((satsys(obs[i].sat,NULL)popt-navsys)popt-exsats[obs[i].sat-1]!1) obs[n]obs[i];}if (n0) continue;//n为一个历元有效观测卫星数if (!rtkpos(rtk,obs,n,navs)) continue;正式进入定位模块后面的条件判断则是一个历元定位结束后根据滤波方向决定下一个读取的历元。
inputobs()
在inputobs中通过不同的滤波方式读取基准站流动站观测数据由于后向滤波(从文件末尾读)只适用于后处理在这里只介绍前向滤波(从文件头读取数据)。
其中obss.data[] 存储了所有历元的卫星观测数据在inputobs(函数中通过流动站索引 iobsu基准站索引 iobsr 从 obss.data 中获取 obsd_t *obs 其中存储了一个历元的所有卫星的观测数据由于在spp,ppp,模式中不涉及到基准站inputobs()函数对基准站的处理不易读懂算法很巧妙需要下一定的功夫理通
* input obs data, navigation messages and sbas correction -------------------*/
static int inputobs(obsd_t *obs, int solq, const prcopt_t *popt)
{gtime_t time{0};char path[1024];int i,nu,nr,n0;trace(3,infunc : revs%d iobsu%d iobsr%d isbs%d\n,revs,iobsu,iobsr,isbs);if (0iobsuiobsuobss.n) {settime((timeobss.data[iobsu].time));if (checkbrk(processing : %s Q%d,time_str(time,0),solq)) {aborts1; showmsg(aborted); return -1;}}if (!revs) { /* input forward data 从第一个历元读取*/if ((nunextobsf(obss,iobsu,1))0) return -1;//获取流动站观测卫星数/,iobsu是上一个历元的基准站观测值索引需要更新到当前历元的流动站观测值索引if (popt-intpref) {//内插参考观测值时将iobsr索引(上一个历元的基准站索引)定位到当前历元的流动站索引for (;(nrnextobsf(obss,iobsr,2))0;iobsrnr)//最终iobsr被定位到当前历元流动站索引if (timediff(obss.data[iobsr].time,obss.data[iobsu].time)-DTTOL) break;//iobsr所在历元时间段与当前历元的流动站历元时间差大于阈值时退出}else {//不内插参考观测值时for (iiobsr;(nrnextobsf(obss,i,2))0;iobsri,inr)//获取上一个历元基准站观测数iobsr被定位到当前历元基准站索引if (timediff(obss.data[i].time,obss.data[iobsu].time)DTTOL) break;//上一个历元基准站索引时间与当前历元流动站索引时间差大于阈值时}注
①当 popt-intpref 为1时表明参考站观测值是内嵌到流动站观测中的也就是说一个历元观测值为(流动站观测值基准站观测值)
iobsr 初始为上一个历元的基准站索引nr上一历元基准站观测数假设历元时间段为30s此时timediff -30阈值iobsrnr成为了当前历元的流动站索引值nr当前历元的流动站数timediff0;结束循环
②popt-intpref 为0时流动站观测值和基准站观测值是分开的。
iobsr 初始为上一个历元的基准站索引nr上一历元基准站观测数假设历元时间段为30s此时timediff -30阈值iobsri不变i nr,成为了当前历元基准站索引timediff0阈值; iobsri 成为了当前历元基准站索引i nr成为了下一个历元的基准站索引timediff30阈值结束循环
nrnextobsf(obss,iobsr,2);//确保iobsr被定位到当前历元基准站索引获取当前历元基准站观测数如果 popt-intpref 为1时 iobsr从当前历元的流动站索引定位到基准站索引然后获取观测卫星数popt-intpref 为0时只获取观测卫星数。
如果是单点定位模式则在第一次调用nextobsf() 时由于观测数据的rcv无法匹配到给定参数为“2的rcv,iobsr 被遍历到最后一个历元在之后调用nextobsf() 时不会进入到if语句 的内部
for (i0;inunMAXOBS*2;i) obs[n]obss.data[iobsui];//复制流动站观测卫星数据
for (i0;inrnMAXOBS*2;i) obs[n]obss.data[iobsri];//复制基准站观测卫星数据
iobsunu;//流动站索引此时变为参考站索引 或下一个历元的流动站索引(spp,ppp)nextobsf()
search next observation data index 前向滤波的方式--------------------------*/
static int nextobsf(const obs_t *obs, int *i, int rcv)
{double tt;int n;/*如果rcv为流动站i在上一级函数中通过nu成为了上一个历元的基准站索引如果是rtk模式一个历元段包括(rcv1:流动站段 rcv2:基准站段)(参考观测值内插时)*/for (;*iobs-n;(*i)) if (obs-data[*i].rcvrcv) break;//rtk模式:rcv1(基准站索引-当前历元流动站站索引)rcv2(--下一段索引可能是基准站也可能是流动站)for (n0;*inobs-n;n) {//遍历当前段观测卫星tttimediff(obs-data[*in].time,obs-data[*i].time);//第n个观测卫星时间与索引观测卫星时间差if (obs-data[*in].rcv!rcv||ttDTTOL) break;//如果卫星rcv改变或者历元时差过大,结束循环}return n;//返回索引所在历元rcv观测卫星数