RTKLIB专题学习(十一)—GNSS信号量测模型
今天一起来学习一下,GNSS的基础知识,有关于GNSS信号测量模型的相关内容
1.GNSS信号结构
GNSS信号典型结构如图所示。GNSS
信号一般由载波频率(carrier)
、扩频码(code)
和导航数据(data)
相乘组成。扩频码也称为伪随机噪声码(PRN
)。GPS、GLONASS、Galileo、QZSS、北斗和SBAS提供的这些GNSS信号的详细规范见手册的附录F。
2.伪距测量模型
伪距定义为“从接收机天线到卫星天线的距离,这个距离包括接收机和卫星钟差(以及其他偏差,如大气延迟)”。Li
伪距Pi
可以用接收机时钟测量的信号接收时间tr和卫星时钟测量的信号传输时间ts表示为:
上式方程可以由接收机和卫星天线之间的几何距离、接收机和卫星钟差、电离层和对流层延迟、以及测量噪声组成:
伪距模型如下:
3.载波相位和相位距离测量模型
载体相位是实际上是对卫星信号的接收载波和接收机产生的参考频率之间的差频的测量”。Li
的载波相位可以表示为:
其中t0是初始时间;
其余参数分别代表,t
时刻接收机本地振荡器的Li相位和导航信号的Li
相位;t0
时刻接收机本地振荡器的Li
初始相位和导航信号的Li
初始相位;
Li
的载波距离可以定义为载波相位与载波波长(m)
的乘积,也可使用载波相位偏差以及偏差改正项来表示,这个改正项包括天线相位中心偏差和变化、固体潮引起的站点位移、相位缠绕、以及卫星钟的相对论改正:
对于改正项的详细内容,前面博客已经讲过,这里不再赘述
4.接收机和卫星天线间的几何距离
几何距离定义为卫星天线相位中心位置与接收机天线相位中心位置在惯性坐标系下的物理距离。首先,信号发送时间可由下式得到:
可以看到,方程两边都有ts,因此解该方程需要迭代;几何距离可以用信号接收时刻的接收机天线相位中心位置和信号发射时刻卫星天线相位中心位置(ECEF)表示:
式中,U(t)
为t时刻ECEF
到ECI
(地心惯性)坐标变换矩阵。对于ECEF
坐标下的表达式,要得到几何距离,就必须考虑地球自转效应。该方程可在1mm
水平下的足够精度用下列方程进行适当的逼近。当前版本RTKLIB
总是使用方程(F.3.8b)
计算几何距离。(F.3.8b)
中的最后一项有时被称为萨奈克克效应。
求取几何距离的源码如下:
* geometric distance ----------------------------------------------------------
* compute geometric distance and receiver-to-satellite unit vector
* args : double *rs I satellilte position (ecef at transmission) (m)
* double *rr I receiver position (ecef at reception) (m)
* double *e O line-of-sight vector (ecef)
* return : geometric distance (m) (0>:error/no satellite position)
* notes : distance includes sagnac effect correction
*-----------------------------------------------------------------------------*/
extern double geodist(const double *rs, const double *rr, double *e)
{
double r;
int i;
if (norm(rs,3)<RE_WGS84) return -1.0;
for (i=0;i<3;i++) e[i]=rs[i]-rr[i];
r=norm(e,3);
for (i=0;i<3;i++) e[i]/=r;
return r+OMGE*(rs[0]*rr[1]-rs[1]*rr[0])/CLIGHT;
}
可以看到,代码可以很好地对应到公式
5.卫星方向的方位角和高度角
从接收机到卫星的单位视线矢量在ECEF坐标下可以表示为:
上述方程中,忽略了地球自转效应;从接收机位置到卫星方向的方位角和高度角可表示为:
其中Er
为从ECEF
到接收机位置局部坐标(站心地平坐标)的旋转矩阵。
该部分源码如下:
/* satellite azimuth/elevation angle -------------------------------------------
* compute satellite azimuth/elevation angle
* args : double *pos I geodetic position {lat,lon,h} (rad,m)
* double *e I receiver-to-satellilte unit vevtor (ecef)
* double *azel IO azimuth/elevation {az,el} (rad) (NULL: no output)
* (0.0<=azel[0]<2*pi,-pi/2<=azel[1]<=pi/2)
* return : elevation angle (rad)返回值为高度角弧度
*-----------------------------------------------------------------------------*/
extern double satazel(const double *pos, const double *e, double *azel)
{
double az=0.0,el=PI/2.0,enu[3];
if (pos[2]>-RE_WGS84) {
ecef2enu(pos,e,enu);
az=dot(enu,enu,2)<1E-12?0.0:atan2(enu[0],enu[1]);
if (az<0.0) az+=2*PI;
el=asin(enu[2]);
}
if (azel) {azel[0]=az; azel[1]=el;}
return el;
}