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。