当前位置:网站首页>GPS从入门到放弃(二十)、天线偏移
GPS从入门到放弃(二十)、天线偏移
2022-07-06 13:46:00 【追捕的风】
天线偏移(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]);
}
边栏推荐
- 袁小林:安全不只是标准,更是沃尔沃不变的信仰和追求
- 十一、服务介绍及端口
- Depth first traversal (DFS) and breadth first traversal (BFS)
- NPM run dev start project error document is not defined
- Checkpoint of RDD in spark
- Binary tree node at the longest distance
- 抖音将推独立种草App“可颂”,字节忘不掉小红书?
- Univariate cubic equation - relationship between root and coefficient
- 强化学习-学习笔记5 | AlphaGo
- C language: comprehensive application of if, def and ifndef
猜你喜欢
Set up a time server
Vit paper details
麦趣尔砸了小众奶招牌
Five wars of Chinese Baijiu
Z function (extended KMP)
功能强大的国产Api管理工具
Why does MySQL index fail? When do I use indexes?
Uni app app half screen continuous code scanning
Tiktok will push the independent grass planting app "praiseworthy". Can't bytes forget the little red book?
红杉中国,刚刚募资90亿美元
随机推荐
C how to set two columns comboboxcolumn in DataGridView to bind a secondary linkage effect of cascading events
Mysql相关术语
20 large visual screens that are highly praised by the boss, with source code templates!
R3live notes: image processing section
【MySQL】Online DDL详解
Basic introduction of figure
ROS error: could not find a package configuration file provided by "move_base“
Quick news: the flybook players' conference is held online; Wechat payment launched "education and training service toolbox"
Four common ways and performance comparison of ArrayList de duplication (jmh performance analysis)
MySQL related terms
Sql: stored procedures and triggers - Notes
用aardio写一个旋转验证码标注小工具
Guava: three ways to create immutablexxx objects
From campus to Tencent work for a year of those stumbles!
What is the RDD operator in spark
Huawei has launched attacks in many industries at the same time, and its frightening technology has made European and American enterprises tremble
AI 企业多云存储架构实践 | 深势科技分享
Redistemplate common collection instructions opsforset (V)
Numpy download and installation
Search map website [quadratic] [for search map, search fan, search book]