rtklib是一个非常不错的开源软件,研究GNSS方向的同学、学者都或多或少会接触到,里面的源代码适合很多类似我这样的新手进行学习,我就是分享一下我学习过程的一些心得想法和感悟,欢迎大家一起交流(接口程序postpos的参数配置、读取数据我这里不提及,只说spp的具体实现)
话不多说,直接开整。
pntpos函数参数设置与解释
1.检查卫星个数是否大于 0
2.当处理选项 opt中的模式不是单点模式时,电离层校正采用 Klobuchar模型,对流层校正则采用 Saastamoinen模型;相反,当其为单点模式时,对输入参数 opt不做修改。
3.调用 satposs函数,按照所观测到的卫星顺序计算出每颗卫星的位置、速度{钟差、频漂}。
4.调用 estpos函数,通过伪距实现绝对定位,计算出接收机的位置和钟差,顺带返回实现定位后每颗卫星的{方位角、仰角}、定位时有效性、定位后伪距残差。
5.调用 raim_fde函数,对上一步得到的定位结果进行接收机自主正直性检测(raim)。通过再次使用 vsat数组,这里只会在对定位结果有贡献的卫星数据进行检测。
6.调用 estvel函数,依靠多普勒频移测量值计算接收机的速度。这里只使用通过了上一步 raim_fde操作的卫星数据,所以对于计算出的速度就没有再次进行raim了。
7.首先将 ssat_t结构体数组的 vs(定位时有效性)、azel(方位角、仰角)、resp(伪距残余)、resc(载波相位残余)和 snr(信号强度)都置为 0,然后再将实现定位后的 azel、snr赋予 ssat_t结构体数组,而 vs、resp则只赋值给那些对定位有贡献的卫星,没有参与定位的卫星,这两个属性值为 0。
具体函数的介绍:限于篇幅原因,本篇文章只介绍有关于计算卫星位置、速度的Satposs函数,以及它所调用的函数。
(1)按照观测数据的顺序,首先将将当前观测卫星的 rs、dts、var和svh数组的元素置 0。
(2)通过判断某一频率下信号的伪距是否为 0,来得到此时所用的频率个数。注意,频率个数不能大于 NFREQ(默认为 3)。
(3)用数据接收时间减去伪距信号传播时间,得到卫星信号的发射时间。
(4)调用 ephclk函数,由广播星历计算出当前观测卫星的钟差。
(5)用 3中的信号发射时间减去 4中的钟偏,得到 GPS时间下的卫星信号发射时间。
(6)调用 satpos函数,计算信号发射时刻卫星的 P(ecef,m)、V(ecef,m/s)、C((s|s/s))。
(7)如果由 6中计算出的钟偏为 0,就再次调用 ephclk函数将其计算出的卫星钟偏作为最终的结果。
(1)首先调用 satsys函数根据卫星编号确定该卫星所属的导航系统和该卫星在该系统中的 PRN编号。
(2)对于 GPS导航系统,调用 seleph函数来选择 toe值与星历选择时间标准 teph最近的那个星历。
(3)调用 eph2clk函数,通过广播星历和信号发射时间计算出卫星钟差。
(1)为处理意外情况(卫星号不在 1-MAXSAT之内),先令卫星系统为 SYS_NONE。
(2)按照 RTKLIB中定义相应宏的顺序来判断是否是 GPS、GLO、GAL系统等,判断标准是将卫星号减去前面的导航系统所拥有的卫星个数,来判断剩余卫星个数是否小于等于本系统的卫星个数。
(3)确定所属的系统后,通过加上最小卫星编号 PRN再减去 1得到该卫星在该系统中的 PRN编号。
(2)利用二项式校正计算出卫星钟差,从 dt中减去这部分,然后再进行一次上述操作,得到最终的 dt。
(3)使用二项式校正得到最终的钟差。
(1)判断星历选项的值,如果是 EPHOPT_BRDC,调用 ephpos函数,根据广播星历计算出算信号发射时刻卫星的 P、V、C
(2)如果该卫星属于 GPS系统,则调用 seleph函数来选择广播星历。
(3)根据选中的广播星历,调用 eph2pos函数来计算信号发射时刻卫星的位置、钟差和相应结果的误差。
(4)在信号发射时刻的基础上给定一个微小的时间间隔,再次计算新时刻的位置和钟差。
(1)与大部分资料上计算卫星位置和钟差的过程是一样的,只是这里在计算偏近点角 E时采用的是牛顿法来进行迭代求解(计算卫星位置代码过多不予附图见源码)。
(3)计算误差直接采用 URA值来标定,具体对应关系可在 ICD-GPS-200C P83中找到。
看代码的过程中确实感觉到了自己的基础理论知识不够扎实,需要学习的东西还有很多,以后也会不定期的更新一些有关于GNSS的基础知识,希望能和大家一起探讨学习。
完整代码我也放在了我的资源中,可以免费下载,文中的截图均是自己根据参考的解析进行的截图,是按照一个函数为一个模块顺序进行截取的,然后依次进入它们所调用的函数。
参考:
RTKLIB源码解析(一)——单点定位(pntpos.c).