单点定位2——伪距残差计算
上篇文章讲到单点定位之卫星位置的计算,得到卫星的位置、速度和钟差。接下来要求取电离层、对流层延迟等改正后的伪距,并求取伪距残差。
1、几何距离计算
观测瞬间接收机至卫星的几何距离可通过两点距离公式求得,rtklib通过norm函数求取,在此基础上考虑了地球自转影响。
/* 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;
}
2、电离层延迟改正
单频接收机的电离层改正利用广播星历中的参数,通过克罗布歇模型实现;双频接收机改正可通过双频无电离层组合模型实现。
2.1 克罗布歇模型 电离层改正:
/* ionosphere model ------------------------------------------------------------
* compute ionospheric delay by broadcast ionosphere model (klobuchar model)
* args : gtime_t t I time (gpst)
* double *ion I iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3}
* double *pos I receiver position {lat,lon,h} (rad,m)
* double *azel I azimuth/elevation angle {az,el} (rad)
* return : ionospheric delay (L1) (m)
*-----------------------------------------------------------------------------*/
extern double ionmodel(gtime_t t, const double *ion,
const double *pos,const double *azel)
{
const double ion_default[]