学习rtklib(一)

因为在最近的相对定位程序中遇到了瓶颈(卫星的起降,卫星信号的失锁等等),无法突破,因此想要参考一下开源代码,就选择了rtklib。
rtklib是导航中最基本的一个库。其中包含了几乎所有的导航工程的源代码。所以我想要学习一下它的源码,为了防止忘记学过的东西(rtklib太多了,代码又长又难看),在这里做一个备忘,希望大家可以指出其中的错误之处。首先先学习读取文件卫星星历和观测值文件的函数。这些函数在rtklib中的rinex.c文件中,涉及到的一些结构体和数学运算的函数存在了rtklib.h和rtkcmn.c文件中。从文件名就可以看出来,rtklib是用C语言而非C++进行编写的,这刷新了我对C语言的认识。看来C语言还有很多我不知道的用法啊…
在rinex.c文件的开头,利用宏定义了几个常量,如果这里面有不知道含义的宏,可以到rtklib.h中查询。这些结构体在这里先不介绍,等到下面介绍每个函数的时候在说明结构体的用处。
下面来介绍一下各个函数的用处(我之前已经看过一遍,但是两周没看发现忘得差不多了,所以就当复习一下了)。

1.setstr函数

static void setstr(char *dst, const char *src, int n)

这个函数是用来截取src中长度为n的一个子串复制给dst,同时将dst最后的字符设置为’/0’,并且将dst中的空格全部设置为’/0’。这是一个辅助函数。

2.adjweek函数

static gtime_t adjweek(gtime_t t, gtime_t t0)

这个函数的返回值和参数都是gtime_t类型的,在rtklib.h文件中查看gtime_t类型,可以看到这个类型是含有一个time_t类型数据和一个double类型的数据。time_t是从一个时间点(一般是1970年1月1日0时0分0秒)到某个时间的秒数,但是是长整型的数据。double类型的那个数据是来表示不足一秒的小数部分。也就是说,time_t类型合起来表示从1970年1月1日0时0分0秒到某个时刻的准确时间。
下面再来说这个函数,这个函数是用来调整t与t0的周数在同一周,至于为什么这样,在下面的其它函数中可以看到。

3.adjday函数

static gtime_t adjday(gtime_t t, gtime_t t0)

与上述的adjweek函数相同的原理,只不过是调整t,让t与t0在同一天。

4.timestr_rnx函数

static void timestr_rnx(char *str)

获取系统的时间,将时间结果按照yyyymmdd hhmmss UTC的格式存入str字符串中。

5.sat2code函数

static int sat2code(int sat, char *code)

这个函数是将各种卫星(GPS,BEIDOU,GALILEO,GLONASS等卫星)的卫星种类和prn号一起转化为特定的字符串,以供后续使用。这个函数中主要就有一个函数。

extern int satsys(int sat, int *prn)

这个函数位于rtkcmn.c中,输入的卫星总的序号,输出的是卫星的种类和在这个种类中的卫星的prn号。这样可能使大家有些迷惑,举个例子吧。比如sat的值等于24,就会直接判断为是GPS种类的卫星,从而得到的返回值int就是SYS_GPS(一个在rtklib.h文件中定义的宏),prn中存的就是GPS的卫星号;在比如sat的值等于36,那么就会判断是GALILEO卫星,整个函数的返回值就是SYS_GAL,prn中存的就是GALILEO的卫星号。大家或许会有疑问,这个sat是怎么来的,下面的函数会不经意的算出sat。
回头看主函数,经过satsys得到卫星的种类和prn号之后,就会把卫星的prn信息以指定的格式写在code中。

6.init_sta函数

static void init_sta(sta_t *sta)

初始化测站信息函数,也就是将测站的各个信息设置为0。

总结

上面的这几个函数就是比较基础的函数,接下来的函数就进入真正的读取RINEX格式的函数。这些函数既包括了RINEX 2版本,有包括了RINEX 3版本。但是由于我用的是RINEX 3版本,就选择性的略过了RINEX 2版本的一些函数。总之,学习rtklib是一个比较繁琐的过程,但是也很有用处。我们不仅要会使用,还要会自己编写。任重而道远,加油ヾ(◍°∇°◍)ノ゙

你可能感兴趣的:(学习rtklib(一))