GPS从入门到放弃(二十)、天线偏移

天线偏移(Antenna Offsets)是指天线相位中心与物体质心的偏移,此偏移会给卫星定位带来厘米级的误差。在一般定位中,此误差可以忽略,但在精密定位中,需要消除此误差的影响。质心的概念中学物理都学过,不多说。这里解释一下天线相位中心。天线所辐射出的电磁波在离开天线一定的距离后,其等相位面会近似为一个球面,该球面的球心即为该天线的等效相位中心,即天线相位中心(Antenna Phase Center )。天线相位中心是一个理论上的点,也就是说,在理论上认为天线辐射的信号是以这个点为圆心向外辐射的。

天线偏移包括卫星的天线偏移以及接收机的天线偏移。

一、卫星天线偏移

卫星天线偏移(Satellite Antenna Offsets)是指卫星的天线相位中心与卫星质心的偏移。在精密定位中,我们需要用到精密星历。IGS 提供的精密星历是相对卫星质心的,而 GPS 的导航电文是相对天线相位中心的,我们在计算中必须考虑两者之间的差异。测量值因为是由接收到的信号得到的,所以其值也都是相对天线相位中心的。知道卫星天线偏移后,我们就可以将所有值统一转换成相对天线相位中心的,这样方便后面的定位解算。

那我们不是制造卫星的,怎么来知道卫星的天线偏移呢?理论上来说,卫星天线偏移只有制造卫星的才知道,而且每个卫星还可能各不相同。所幸我们有 IGS。卫星的天线偏移数据会上报给 IGS,而 IGS 统一整理发布提供所有的卫星天线偏移数据。数据可以从 IGS 的 ftp 服务器下载,地址为 ftp://ftp.igs.org/pub/station/general/

IGS 提供的与卫星天线偏移相关的文件主要有两个:rcvr_ant.tab 和 igs14.atx

rcvr_ant.tab
这个文件的内容是 IGS 对各个设备的命名规范,如接收机、天线、雷达天线罩、卫星天线等。只有符合规范的名字才能用在 IGS 站提供的各种文件中。换句话说,如果在 IGS 的一些文件中看到一些疑惑的名字,也可以到这个文件中来查找对应的意义。

igs14.atx
这是一个符号链接文件,链接到最新修改的的 igs14_wwww.atx 文件,这里的 wwww 表示 GPS 周数。此文件包含卫星和接收机天线相位校正值,基于 IGS14 地球参考框架。

atx 文件的格式是 Antenna Exchange Format (ANTEX),在 antex14.txt 文件中有详细的对这个格式的说明(antex14.txt 文件同样可以在 IGS 的 ftp 服务器下载),这里只做简单的介绍。

如下内容是截取的igs14.atx中的一部分:

                                                            START OF ANTENNA
BLOCK IIF           G01                 G063      2011-036A TYPE / SERIAL NO    
                                             0    29-JAN-17 METH / BY / # / DATE
     0.0                                                    DAZI                
     0.0  17.0   1.0                                        ZEN1 / ZEN2 / DZEN  
     2                                                      # OF FREQUENCIES    
  2011     7    16     0     0    0.0000000                 VALID FROM          
IGS14_2082                                                  SINEX CODE          
   G01                                                      START OF FREQUENCY  
    394.00      0.00   1501.80                              NORTH / EAST / UP   
   NOAZI    6.10    4.40    2.80    1.30   -0.20   -1.40   -2.80   -3.90   -4.40   -4.40   -3.70   -2.30   -0.20    3.00    5.70   12.40   18.20   23.50
   G01                                                      END OF FREQUENCY    
   G02                                                      START OF FREQUENCY  
    394.00      0.00   1501.80                              NORTH / EAST / UP   
   NOAZI    6.10    4.40    2.80    1.30   -0.20   -1.40   -2.80   -3.90   -4.40   -4.40   -3.70   -2.30   -0.20    3.00    5.70   12.40   18.20   23.50
   G02                                                      END OF FREQUENCY    
                                                            END OF ANTENNA

这是 GPS 系统中 PRN 为 01 的卫星的天线偏移数据。由 “# OF FREQUENCIES” 这一行可知它有 2 个频率。对第一个频率来说,“NORTH / EAST / UP” 这一行的三个数分别是三个方向的偏移值,单位为毫米。“ZEN1 / ZEN2 / DZEN” 这一行表示的是天底角的范围从 ZEN1 到 ZEN2,DZEN为步长,“NOAZI” 这一行中按照天底角的范围和步长给出了对应的相位中心变化值(pcv: phase center variations)。以第一个频率为例,“NOAZI” 行有18个值,对应 “ZEN1 / ZEN2 / DZEN” 这一行天底角0.0度到17.0度,步长1.0度,正好也是 ( Z E N 2 − Z E N 1 ) / D Z E N = 18 (ZEN2-ZEN1)/DZEN=18(ZEN2−ZEN1)/DZEN=18 个值。“DAZI” 这一行的值为0.0表示这个卫星的天线偏移数据是不依赖于方位角的(non-azimuth-dependent)。“NOAZI” 表示的也是不依赖方位角的值。若依赖于方位角,则 “DAZI” 为步长,“NOAZI” 行的下方会有 360 / D A Z I 360/DAZI360/DAZI 行,每一行也有( Z E N 2 − Z E N 1 ) / D Z E N (ZEN2-ZEN1)/DZEN(ZEN2−ZEN1)/DZEN 个值,对应一个方位角时不同的天底角时的相位中心变化值。因为步长分辨率有限,所以在实际应用中,若是角度在两个值之间,则可以通过插值在进行计算。

在RTKLIB中,是通过调用 readantex 函数来解析 atx 文件的,这里附上代码,过程很直接,就不多解释了。
 

static int readantex(const char *file, pcvs_t *pcvs)
{
    FILE *fp;
    static const pcv_t pcv0={0};
    pcv_t pcv;
    double neu[3];
    int i,f,freq=0,state=0,freqs[]={1,2,5,6,7,8,0};
    char buff[256];

    trace(3,"readantex: file=%s\n",file);

    if (!(fp=fopen(file,"r"))) {
        trace(2,"antex pcv file open error: %s\n",file);
        return 0;
    }
    while (fgets(buff,sizeof(buff),fp)) {

        if (strlen(buff)<60||strstr(buff+60,"COMMENT")) continue;

        if (strstr(buff+60,"START OF ANTENNA")) {
            pcv=pcv0;
            state=1;
        }
        if (strstr(buff+60,"END OF ANTENNA")) {
            addpcv(&pcv,pcvs);
            state=0;
        }
        if (!state) continue;

        if (strstr(buff+60,"TYPE / SERIAL NO")) {
            strncpy(pcv.type,buff   ,20); pcv.type[20]='\0';
            strncpy(pcv.code,buff+20,20); pcv.code[20]='\0';
            if (!strncmp(pcv.code+3,"        ",8)) {
                pcv.sat=satid2no(pcv.code);
            }
        }
        else if (strstr(buff+60,"VALID FROM")) {
            if (!str2time(buff,0,43,&pcv.ts)) continue;
        }
        else if (strstr(buff+60,"VALID UNTIL")) {
            if (!str2time(buff,0,43,&pcv.te)) continue;
        }
        else if (strstr(buff+60,"START OF FREQUENCY")) {
            if (sscanf(buff+4,"%d",&f)<1) continue;
            for (i=0;i<NFREQ;i++) if (freqs[i]==f) break;
            if (i<NFREQ) freq=i+1;
        }
        else if (strstr(buff+60,"END OF FREQUENCY")) {
            freq=0;
        }
        else if (strstr(buff+60,"NORTH / EAST / UP")) {
            if (freq<1||NFREQ<freq) continue;
            if (decodef(buff,3,neu)<3) continue;
            pcv.off[freq-1][0]=neu[pcv.sat?0:1]; /* x or e */
            pcv.off[freq-1][1]=neu[pcv.sat?1:0]; /* y or n */
            pcv.off[freq-1][2]=neu[2];           /* z or u */
        }
        else if (strstr(buff,"NOAZI")) {
            if (freq<1||NFREQ<freq) continue;
            if ((i=decodef(buff+8,19,pcv.var[freq-1]))<=0) continue;
            for (;i<19;i++) pcv.var[freq-1][i]=pcv.var[freq-1][i-1];
        }
    }
    fclose(fp);

    return 1;
}

而对于卫星天线偏移校正值的计算,RTKLIB 中则是调用 satantpcv 函数来进行的。个人觉得这个函数有点问题,其中只考虑了 phase center variations,而没有考虑 phase center offset。

二、接收机天线偏移

接收机天线偏移与卫星天线偏移有很多类似的地方,同样要用到 IGS 提供的这两个文件:rcvr_ant.tab 和 igs14.atx。rcvr_ant.tab 里面有接收机名字,igs14.atx 中有接收机天线偏移数据。

        有所区别的是,接收机还有另外一个文件 antenna.gra,它提供了接收机的天线参考点(ARP: antenna reference point)和北向参考点(NRP: north reference point)的定义,以及天线的物理尺寸等。这是一个纯文本的文件,然而里面有各种天线的示意图,这里不得不对作图人表示佩服,有兴趣的同学可以自己去看。

        在算法上,计算接收机天线偏移时不光要考虑计算卫星天线偏移时考虑的 phase center offset 和 phase center variations,还要考虑接收机的天线参考点位置。如在 RTKLIB 中,是通过 antmodel 函数来计算接收机的天线偏移校正值,代码如下。其中 del 为相对天线参考点偏移值,azel 为方位角和俯仰角,pcv->off 为 phase center offset,pcv->var 为 phase center variations。
 

void antmodel(const pcv_t *pcv, const double *del, const double *azel,
                     int opt, double *dant)
{
    double e[3],off[3],cosel=cos(azel[1]);
    int i,j;

    trace(4,"antmodel: azel=%6.1f %4.1f opt=%d\n",azel[0]*R2D,azel[1]*R2D,opt);

    e[0]=sin(azel[0])*cosel;
    e[1]=cos(azel[0])*cosel;
    e[2]=sin(azel[1]);

    for (i=0;i<NFREQ;i++) {
        for (j=0;j<3;j++) off[j]=pcv->off[i][j]+del[j];

        dant[i]=-dot(off,e,3)+(opt?interpvar(90.0-azel[1]*R2D,pcv->var[i]):0.0);
    }
    trace(5,"antmodel: dant=%6.3f %6.3f\n",dant[0],dant[1]);
}

猜你喜欢

转载自blog.csdn.net/hltt3838/article/details/120525798