GPS從入門到放棄(二十) --- 天線偏移

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度,正好也是 (ZEN2ZEN1)/DZEN=18(ZEN2-ZEN1)/DZEN=18 個值。“DAZI” 這一行的值爲0.0表示這個衛星的天線偏移數據是不依賴於方位角的(non-azimuth-dependent)。“NOAZI” 表示的也是不依賴方位角的值。若依賴於方位角,則 “DAZI” 爲步長,“NOAZI” 行的下方會有 360/DAZI360/DAZI 行,每一行也有(ZEN2ZEN1)/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]);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章