天天看點

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度,正好也是 ( 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/DAZI 360/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]);
}