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度,正好也是 個值。“DAZI” 這一行的值爲0.0表示這個衛星的天線偏移數據是不依賴於方位角的(non-azimuth-dependent)。“NOAZI” 表示的也是不依賴方位角的值。若依賴於方位角,則 “DAZI” 爲步長,“NOAZI” 行的下方會有 行,每一行也有 個值,對應一個方位角時不同的天底角時的相位中心變化值。因爲步長分辨率有限,所以在實際應用中,若是角度在兩個值之間,則可以通過插值在進行計算。
在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]);
}