基本概念(Marker, ARP, Phase center)
首先先来区分几个概念:
- Marker: 大地测量参考标尺,上面用三脚架或者直接固定天线
- ARP(antenna reference point):天线上定义良好的点,一般选取接收机天线底部与天线中轴的交点作为参考点
- Antenna Phase center(天线相位中心):即天线接收信号的电气中心,其空间位置在出厂时往往不在天线的几何中心上。天线所辐射出的电磁波在离开天线一定的距离后,其等相位面会近似为一个球面,该球面的球心即为该天线的等效相位中心,即天线相位中心(Antenna Phase Center )
这三个不同位置在天线中的偏差表示如下图:
天线位置修正
参考RINEX3.04定义,如下图,关于天线位置的两项必有的参数为:
- marker近似位置
- ARP相对marker的H/E/N偏差,即上图中的“Offset between ARP and marker”
对于相位中心与ARP之间的偏差,可以根据不同类型天线的天线模型参数获得,例如ngs14.atx文件中提供不同天线的PCO以及PCV参数。
由于GNSS原始数据测量的是卫星到相位中心的距离,因此在进行相位定位时,如果基站提供的位置是marker的位置(例如RINEX头中marker近似位置),我们需要将“Offset between ARP and marker”、“phase center offset”修掉。
RTKLIB中天线位置修正
从postpos.c文件中的antpos函数可知,如下图,如果基站的位置是RINEX头中的位置,会利用ARP和marker之间的偏差,计算得到ARP的位置。
在之后相位定位计算中,也会将对天线PCO和PCV进行修正,具体参见上一篇博客RTKLIB中的卫星天线与接收机天线修正。
对于移动站而言:
- 在没有Rover天线相关参数设置的情况下(没有勾选并设置antenna Type),计算出来的实际上是相位中心的位置
- 如果rovre atenna type是*auto,那么从RINEX头里面识别到的天线类型、以及DELTA H/E/N会起作用。如果有该天线参数,且RINEX头中的DELTA H/E/N都为0,那么计算出来的是ARP位置;如果DELTA H/E/N不为0,计算出来的是marker位置
- 如果rover antenna type不是*auto,而是自己配置的天线类型,那么该天线类型,以及配置的DELTA -E/N/U会起作用。如果有该天线参数,DELTA -E/N/U都为0,那么计算出来的是ARP位置;如果DELTA -E/N/U不为0,则计算出来的是marker位置。
/* antenna phase center position ---------------------------------------------*/
static int antpos(prcopt_t *opt, int rcvno, const obs_t *obs, const nav_t *nav,
const sta_t *sta, const char *posfile)
{
double *rr=rcvno==1?opt->ru:opt->rb,del[3],pos[3],dr[3]={0};
int i,postype=rcvno==1?opt->rovpos:opt->refpos;
char *name;
trace(3,"antpos : rcvno=%d\n",rcvno);
if (postype==POSOPT_SINGLE) { /* average of single position */
if (!avepos(rr,rcvno,obs,nav,opt)) {
showmsg("error : station pos computation");
return 0;
}
}
else if (postype==POSOPT_FILE) { /* read from position file */
name=stas[rcvno==1?0:1].name;
if (!getstapos(posfile,name,rr)) {
showmsg("error : no position of %s in %s",name,posfile);
return 0;
}
}
else if (postype==POSOPT_RINEX) { /* get from rinex header */
if (norm(stas[rcvno==1?0:1].pos,3)<=0.0) {
showmsg("error : no position in rinex header");
trace(1,"no position in rinex header\n");
return 0;
}
/* antenna delta */
if (stas[rcvno==1?0:1].deltype==0) { /* enu */
for (i=0;i<3;i++) del[i]=stas[rcvno==1?0:1].del[i];
del[2]+=stas[rcvno==1?0:1].hgt;
ecef2pos(stas[rcvno==1?0:1].pos,pos);
enu2ecef(pos,del,dr);
}
else { /* xyz */
for (i=0;i<3;i++) dr[i]=stas[rcvno==1?0:1].del[i];
}
for (i=0;i<3;i++) rr[i]=stas[rcvno==1?0:1].pos[i]+dr[i];
}
return 1;
}