RTKLIB学习(二)——单点定位-卫星位置、速度、钟差的计算

RTKLIB学习(⼆)——单点定位-卫星位置、速度、钟差计算
**
单点定位1-卫星位置、速度、钟差的计算
**中央工艺美术学院
从readobsnav()函数读取O⽂件和N⽂件后,开始定位信息处理。核⼼函数为procpos(),主要包括数据输⼊inputobs(),数据处理rtkpos(),数据输出outsol()三部分。输⼊部分为读取观测数据,导航信息。核⼼处理单元为rtkpos,主要包括单点定位pntpos,精密单点定位pppos,相对定位relpos三部分。本节主要记录单点定位部分,公式如下:
由单点定位公式可知,要获取接收机的位置和钟差,需要先求得卫星的位置和钟差,加上电离层对流层等修正,代⼊⽅程解算。
本⽂先介绍卫星部分参数的计算。
1、计算卫星位置、速度、钟差
通过satposs实现,函数声明如下:
extern void satposs(gtime_t teph,const obsd_t *obs,int n,const nav_t *nav,int ephopt,double*rs,double*dts,double*var,int*svh);
其中,teph为当前历元,*obs为指向观测数据结构体的指针,n为总共卫星数,*nav为指向导航电⽂数据结构体的指针,ephopt为选项参数(默认0),*rs指向储存卫星位置和速度的数组,*dts指向储存卫星钟差的数组,*var为协⽅差矩阵,*svh为卫星健康状态。
卫星位置、钟差计算的核⼼:eph2pos函数,利⽤⼴播星历计算卫星位置和钟差,传⼊参数为:历元时刻、eph_t结构体(导航电⽂中获取的参数)、储存卫星位置、钟差及协⽅差矩阵的数组。
//⼴播星历参数的结构体
typedef struct{/* GPS/QZS/GAL broadcast ephemeris type */
int sat;/* satellite number */
int iode,iodc;/* IODE,IODC */
int sva;/* SV accuracy (URA index) */
int svh;/* SV health (0:ok) */
int week;/* GPS/QZS: gps week, GAL: galileo week */
int code;/* GPS/QZS: code on L2, GAL/CMP: data sources */
int flag;/* GPS/QZS: L2 P data flag, CMP: nav type */
gtime_t toe,toc,ttr;/* Toe,Toc,T_trans */
/* SV orbit parameters */
double A,e,i0,OMG0,omg,M0,deln,OMGd,idot;
double crc,crs,cuc,cus,cic,cis;
double toes;/* Toe (s) in week */
double fit;/* fit interval (h) */
double f0,f1,f2;/* SV clock parameters (af0,af1,af2) */
double tgd[4];/* group delay parameters */
/* GPS/QZS:tgd[0]=TGD */
/* GAL    :tgd[0]=BGD E5a/E1,tgd[1]=BGD E5b/E1 */
/* CMP    :tgd[0]=BGD1,tgd[1]=BGD2 */
double Adot,ndot;/* Adot,ndot for CNAV */
} eph_t;
//计算卫星在轨道⾯坐标系中的位置及卫星钟差
extern void eph2pos(gtime_t time,const eph_t *eph,double*rs,double*dts,double*var)`{
徐新国double tk,M,E,Ek,sinE,cosE,u,r,i,O,sin2u,cos2u,x,y,sinO,cosO,cosi,mu,omge;
double xg,yg,zg,sino,coso;
int n,sys,prn;
神户人工岛trace(4,"eph2pos : time=%s sat=%2d\n",time_str(time,3),eph->sat);
if(eph->A<=0.0){
rs[0]=rs[1]=rs[2]=*dts=*var=0.0;
return;
}
//计算卫星位置,⽤星历参考时刻toe,tk=t-toe(观测时刻-星历参考时刻)
tk=timediff(time,eph->toe);
switch((sys=satsys(eph->sat,&prn))){
case SYS_GAL: mu=MU_GAL; omge=OMGE_GAL;break;
case SYS_CMP: mu=MU_CMP; omge=OMGE_CMP;break;
default:      mu=MU_GPS; omge=OMGE;break;
default:      mu=MU_GPS; omge=OMGE;break;
}
//观测瞬间卫星的平近点⾓
M=eph->M0+(sqrt(mu/(eph->A*eph->A*eph->A))+eph->deln)*tk;
//迭代法计算偏近点⾓
for(n=0,E=M,Ek=0.0;fabs(E-Ek)>RTOL_KEPLER&&n<MAX_ITER_KEPLER;n++){
Ek=E; E-=(E-eph->e*sin(E)-M)/(1.0-eph->e*cos(E));
}
if(n>=MAX_ITER_KEPLER){
trace(2,"eph2pos: kepler iteration overflow sat=%2d\n",eph->sat);
牙周袋return;
}
sinE=sin(E); cosE=cos(E);
trace(4,"kepler: sat=%2d e=%8.5f n=%2d del=%10.3e\n",eph->sat,eph->e,n,E-Ek);
//计算真近点⾓f、升交⾓距u'、摄动改正u、r、i
u=atan2(sqrt(1.0-eph->e*eph->e)*sinE,cosE-eph->e)+eph->omg;
r=eph->A*(1.0-eph->e*cosE);
i=eph->i0+eph->idot*tk;
sin2u=sin(2.0*u); cos2u=cos(2.0*u);
u+=eph->cus*sin2u+eph->cuc*cos2u;
重庆市联合产权交易所
r+=eph->crs*sin2u+eph->crc*cos2u;
i+=eph->cis*sin2u+eph->cic*cos2u;
南山丽景度假酒店事件/
/计算卫星在轨道⾯坐标系中的位置
x=r*cos(u); y=r*sin(u); cosi=cos(i);
//利⽤卫星钟差系数计算卫星钟差,⽤参考时刻toc
tk=timediff(time,eph->toc);
*dts=eph->f0+eph->f1*tk+eph->f2*tk*tk;
/* 考虑到相对论效应,由于卫星钟频率误差引起的卫星信号传播的时间误差,*dts加上此项误差修正*/ *dts-=2.0*sqrt(mu*eph->A)*eph->e*sinE/SQR(CLIGHT);
/* 误差协⽅差矩阵 */
*var=var_uraeph(eph->sva);
};
卫星速度计算:利⽤微分逼近法,计算卫星速度。
/* satellite velocity and clock drift by differential approx */
tt=0.001;
for(i=0;i<3;i++) rs[i+3]=(rst[i]-rs[i])/tt;
dts[1]=(dtst[0]-dts[0])/tt;

本文发布于:2024-09-21 04:32:13,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/374405.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:钟差   位置   计算   定位   部分   单点   参数
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议