RTKLIB专题学习(十二)—支持的信号ID/观测类型
基础理论知识
观测值类型
RTKLIB支持的信号id /观测类型如下表所示。表中还列出了RINEX 2、RINEX 3观测类型、RTCM 3 MSM信号id和BINEX观测代码id。使用RTKCONV和CONVBIN实现RTCM3和RINEX以及RTCM 2到RINEX的转换,当使用STRSVR和STR2STR实现RTCM 2和BINEX到RTCM3的转换,也使用了该表。




对于各系统的目前的频率和观测值类型,可参见如下:(表中观测值类型分别为:伪距观测值、载波相位观测值、多普勒观测值、信号强度观测值)







多信号默认优先级
如果输入的观测数据在同一频率内包含多个信号,RTKLIB将按照以下默认优先级选择一个信号进行处理。要选择合适的信号,请使用附录D.5中描述的RINEX选项或接收器相关选项。在用户ap中,要改变或获取信号优先级,可以使用API setcodepri()或getcodepri()。

可以看到,对于北斗系统来说,三个频率信号选择的优先级是C2I、C7I、C6I,也就是说当选择单频定位时,使用C2I信号对应的观测值,当选择L1+L2时,使用C2I+C7I信号对应的观测值进行观测方程的建立。
源码读取函数
源码简介
源码中,读取观测值文件和星历文件的函数为readobsnav,由execses函数调用,下面是readobsnav函数中的内容:
/* read obs and nav data -----------------------------------------------------*/
static int readobsnav(gtime_t ts, gtime_t te, double ti, char **infile,
const int *index, int n, const prcopt_t *prcopt,
obs_t *obs, nav_t *nav, sta_t *sta)
{
int i,j,ind=0,nobs=0,rcv=1;
trace(3,"readobsnav: ts=%s n=%d\n",time_str(ts,0),n);
obs->data=NULL; obs->n =obs->nmax =0;
nav->eph =NULL; nav->n =nav->nmax =0;
nav->geph=NULL; nav->ng=nav->ngmax=0;
nav->seph=NULL; nav->ns=nav->nsmax=0;
nepoch=0;
for (i=0;i<n;i++) {
if (checkbrk("")) return 0;
if (index[i]!=ind) {
if (obs->n>nobs) rcv++;
ind=index[i]; nobs=obs->n;
}
/* read rinex obs and nav file */
if (readrnxt(infile[i],rcv,ts,te,ti,prcopt->rnxopt[rcv<=1?0:1],obs,nav,
rcv<=2?sta+rcv-1:NULL)<0) {
checkbrk("error : insufficient memory");
trace(1,"insufficient memory\n");
return 0;
}
}
if (obs->n<=0) {
checkbrk("error : no obs data");
trace(1,"\n");
return 0;
}
if (nav->n<=0&&nav->ng<=0&&nav->ns<=0) {
checkbrk("error : no nav data");
trace(1,"\n");
return 0;
}
/* sort observation data */
nepoch=sortobs(obs);
/* delete duplicated ephemeris */
uniqnav(nav);
/* set time span for progress display */
if (ts.time==0||te.time==0) {
for (i=0; i<obs->n;i++) if (obs->data[i].rcv==1) break;
for (j=obs->n-1;j>=0;j--) if (obs->data[j].rcv==1) break;
if (i<j) {
if (ts.time==0) ts=obs->data[i].time;
if (te.time==0) te=obs->data[j].time;
settspan(ts,te);
}
}
return 1;
}
而readobsnav又通过调用readrnxt函数来进一步实现:
/* read RINEX OBS and NAV files ------------------------------------------------
* read RINEX OBS and NAV files
* args : char *file I file (wild-card * expanded) ("": stdin)
* int rcv I receiver number for obs data
* (gtime_t ts) I observation time start (ts.time==0: no limit)
* (gtime_t te) I observation time end (te.time==0: no limit)
* (double tint) I observation time interval (s) (0:all)
* char *opt I RINEX options (see below,"": no option)
* obs_t *obs IO observation data (NULL: no input)
* nav_t *nav IO navigation data (NULL: no input)
* sta_t *sta IO station parameters (NULL: no input)
* return : status (1:ok,0:no data,-1:error)
* notes : read data are appended to obs and nav struct
* before calling the function, obs and nav should be initialized.
* observation data and navigation data are not sorted.
* navigation data may be duplicated.
* call sortobs() or uniqnav() to sort data or delete duplicated eph.
*
* RINEX options (separated by spaces) :
*
* -GLss[=shift]: select GPS signal ss (ss: RINEX 3 code, "1C","2W"...)
* -RLss[=shift]: select GLO signal ss
* -ELss[=shift]: select GAL signal ss
* -JLss[=shift]: select QZS signal ss
* -CLss[=shift]: select BDS signal ss
* -ILss[=shift]: select IRN signal ss
* -SLss[=shift]: select SBS signal ss
*
* shift: carrier phase shift to be added (cycle)
*
* -SYS=sys[,sys...]: select navigation systems
* (sys=G:GPS,R:GLO,E:GAL,J:QZS,C:BDS,I:IRN,S:SBS)
*
*-----------------------------------------------------------------------------*/
extern int readrnxt(const char *file, int rcv, gtime_t ts, gtime_t te,
double tint, const char *opt, obs_t *obs, nav_t *nav,
sta_t *sta)
{
int i,n,stat=0;
const char *p;
char type=' ',*files[MAXEXFILE]={
0};
trace(3,"readrnxt: file=%s rcv=%d\n",file,rcv);
if (!*file) {
return readrnxfp(stdin,ts,te,tint,opt,0,1,&type,obs,nav,sta);
}
for (i=0;i<MAXEXFILE;i++) {
if (!(files[i]=(char *)malloc(1024))) {
for (i--;i>=0;i--) free(files[i]);
return -1;
}
}
/* expand wild-card */
if ((n=expath(file,files,MAXEXFILE))<=0) {
for (i=0;i<MAXEXFILE;i++) free(files[i]);
return 0;
}
/* read rinex files */
for (i=0;i<n&&stat>=0;i++) {
stat=readrnxfile(files[i],ts,te,tint,opt,0,rcv,&type,obs,nav,sta);
}
/* if station name empty, set 4-char name from file head */
if (type=='O'&&sta) {
if (!(p=strrchr(file,FILEPATHSEP))) p=file-1;
if (!*sta->name) setstr(sta->name,p+1,4);
}
for (i=0;i<MAXEXFILE;i++) free(files[i]);
return stat;
}
readrnxt函数又调用readrnxfp和readrnxfile函数;其中,readrnxfp函数用于读取未压缩的文件,而readrnxfile用于读取压缩之后的文件,代码分别如下:
/* read RINEX file -----------------------------------------------------------*/
static int readrnxfp(FILE *fp, gtime_t ts,

本文详细介绍了RTKLIB库在处理GNSS观测数据时的内部工作原理,包括支持的不同信号ID和观测类型,多信号的默认优先级选择,以及源码中用于读取观测值和星历文件的关键函数,如readobsnav、readrnxt、readrnxfile等。这些函数负责从RINEX文件中解析观测数据,进行排序和去重,为后续的定位解算提供准备。
4384

被折叠的 条评论
为什么被折叠?



