116-RTKLIB中的setpcv

RTKLIB中setpcv函数的定义如下:
/* set antenna parameters ----------------------------------------------------*/
static void setpcv(gtime_t time, prcopt_t *popt, nav_t *nav, const pcvs_t *pcvs,
                   const pcvs_t *pcvr, const sta_t *sta)
{
     
    pcv_t *pcv;
    double pos[3],del[3];
    int i,j,mode=PMODE_DGPS<=popt->mode&&popt->mode<=PMODE_FIXED;
    char id[64];
    
    /* set satellite antenna parameters */
    for (i=0;i<MAXSAT;i++) {
     
        if (!(satsys(i+1,NULL)&popt->navsys)) continue;
        if (!(pcv=searchpcv(i+1,"",time,pcvs))) {
     
            satno2id(i+1,id);
            trace(3,"no satellite antenna pcv: %s\n",id);
            continue;
        }
        nav->pcvs[i]=*pcv;
    }
    for (i=0;i<(mode?2:1);i++) {
     
        if (!strcmp(popt->anttype[i],"*")) {
      /* set by station parameters */
            strcpy(popt->anttype[i],sta[i].antdes);
            if (sta[i].deltype==1) {
      /* xyz */
                if (norm(sta[i].pos,3)>0.0) {
     
                    ecef2pos(sta[i].pos,pos);
                    ecef2enu(pos,sta[i].del,del);
                    for (j=0;j<3;j++) popt->antdel[i][j]=del[j];
                }
            }
            else {
      /* enu */
                for (j=0;j<3;j++) popt->antdel[i][j]=stas[i].del[j];
            }
        }
        if (!(pcv=searchpcv(0,popt->anttype[i],time,pcvr))) {
     
            trace(2,"no receiver antenna pcv: %s\n",popt->anttype[i]);
            *popt->anttype[i]='\0';
            continue;
        }
        strcpy(popt->anttype[i],pcv->type);
        popt->pcvr[i]=*pcv;
    }
}

首先对于时间time为所要处理的观测数据的第一个历元的时间;
对于pcvs_t结构体的两个关于卫星和接收机的变量是完全相同的,所以读取pcv时仅读取一次即可;
对于sta,存储了o文件头文件中的相关信息。

第一个for循环中,如果某颗卫星的pcopcv的时间区间包含第一个历元时间,则将其赋值到nav;
第二个for循环中,如果为相对定位,mode为1进行两次循环,分别处理基准站和流动站的天线信息,否则仅处理流动站的天线,这里需要注意的是,如果要使用配置文件中的天线信息,需要在配置文件中将相关参数配置好,即配置好天线类型及天线偏移量,如果要使用o文件头文件中的信息,需要在配置文件中将“ant1-anttype =*”,如果既不使用配置文件配置天线信息,也不将天线类型置为星号,那么解算结果会与真实值存在“实际偏移量”的偏差。使用星号配置时,o文件头文件中的偏移量会自动覆盖配置文件中设置的偏移量。

下面说一下setpcv调用的函数searchpcv:
/* search antenna parameter ----------------------------------------------------
* read satellite antenna phase center position
* args   : int    sat         I   satellite number (0: receiver antenna)
*          char   *type       I   antenna type for receiver antenna
*          gtime_t time       I   time to search parameters
*          pcvs_t *pcvs       IO  antenna parameters
* return : antenna parameter (NULL: no antenna)
*-----------------------------------------------------------------------------*/
extern pcv_t *searchpcv(int sat, const char *type, gtime_t time,
                        const pcvs_t *pcvs)
{
     
    pcv_t *pcv;
    char buff[MAXANT],*types[2],*p;
    int i,j,n=0;
    
    trace(3,"searchpcv: sat=%2d type=%s\n",sat,type);
    
    if (sat) {
      /* search satellite antenna */
        for (i=0;i<pcvs->n;i++) {
     
            pcv=pcvs->pcv+i;
            if (pcv->sat!=sat) continue;
            if (pcv->ts.time!=0&&timediff(pcv->ts,time)>0.0) continue;
            if (pcv->te.time!=0&&timediff(pcv->te,time)<0.0) continue;
            return pcv;
        }
    }
    else {
     
        strcpy(buff,type);
        for (p=strtok(buff," ");p&&n<2;p=strtok(NULL," ")) types[n++]=p;
        if (n<=0) return NULL;
        
        /* search receiver antenna with radome at first */
        for (i=0;i<pcvs->n;i++) {
     
            pcv=pcvs->pcv+i;
            for (j=0;j<n;j++) if (!strstr(pcv->type,types[j])) break;
            if (j>=n) return pcv;
        }
        /* search receiver antenna without radome */
        for (i=0;i<pcvs->n;i++) {
     
            pcv=pcvs->pcv+i;
            if (strstr(pcv->type,types[0])!=pcv->type) continue;
            
            trace(2,"pcv without radome is used type=%s\n",type);
            return pcv;
        }
    }
    return NULL;
}

if语句为天线搜索正确的pcv,else为接收机搜索正确的pcv。else下的for搜索带有整流罩的的pcv,第二个for搜索不带整流罩的pcv。

你可能感兴趣的:(RTKLIB,RTKLIB,setpcv)