从零开始Rtklib解读篇-简单的编程理论和算法及结构分析(一)

Rtklib一直开源,资源比较容易找到,功能也非常强大。因为专业有点相关,但是之前不用这个平台,一直未能好好沉下心来学习,然而学到用时方恨少。这个系列也算是自己的一个小小的总结吧,因为我对VS、对Rtklib、对算法的理解也比较浅,很多内容未必正确,写的时候也不一定非常有条理,不当之处,还请指出并海涵。

本系列采用的Rtklib版本是2.3.4,采用的编程平台是VS2010. 书籍参考李征航、黄劲松老师的《GPS测量与数据处理》,面向的是完全的从零开始初学者。

本文从安装开始。

VS的安装就不多说了,请百度。

Rtklib的安装网上也有教程,我是从同门那里考过来的,不一定和网上的版本完全一致,在此仅简述一下几个基本问题。

1、解压。将src文件夹下除了“streamsvr.c”、“stream.c”、“rtksvr.c”、“rtkra

w.h”、“ convrnx.c”这5个文件之外的所有文件添加到工程。

2、打开rinex.c中的outrnxobsh()函数,将“prn[MAXPRNGLO]”声明改为:

“int*prn=(int*)malloc(sizeof(int)*MAXPRNGLO)”

3、打开rtkcmn.c,在“#include ”rtklib.h“”后添加:“#pragma comment(lib,"winmm.lib")”

4、打开rtkcmn.c,按如下注释即可:

//#ifdef DLL

extern intshowmsg(char *format,...) {return 0;}

extern void settspan(gtime_t ts,gtime_t te) {}

extern void settime(gtime_t time) {}

//#endif

5、按理到此即可直接编译。

PS1:遇到warning C4133问题,从char[1024]到‘LPCWSTR’的类型不兼容问题,从项目-属性-配置-常规找到字符集,把Unicode字符集改成未设置。

PS2:我这里并没有pthread问题,不过网上http://blog.sciencenet.cn/home.php?mod=space&uid=858128&do=blog&id=990823给出了一些解决方案。

PS3:Rtklib有自带的工程,可以直接进入配置。

下个部分简单介绍一下Rtklib的目录构成

app里面有各个项目,bin里面给出了大部分功能的exe文件,可以直接使用,主入口为rtklaunch.exe,doc里面给出了官方文档,可以参考看看。src是源文件。lib给出了链接库。除了从工程进入,通常也可以用exe文件直接处理数据。

如果是SPP,请准备对应的O文件,P文件(n文件,g文件),根据电离层模型和观测数据选择是否准备对应的电离层文件,PPP相关的DCB,clk,sp3文件等。还有天线改正文件。

这里简述一下各类误差的改正手段:

伪距包含了多种误差,最终通过最小二乘给出最终定位结果,因此,误差的改正效果对最终的定位结果影响较大。

根据定位方式的不同,可以分为SPP,DGPS,RTK,PPP。SPP通常只改较为简单的误差,采用实时的广播星历,在PPP中作为定位的初始解。DGPS用基站计算出伪距修正值,并传递给流动站,达到对流动站中影响较大的大气误差的影响进行削弱的效果,提升了定位精度,这种方式基于基站和流动站误差的距离相关性,随着基线的变长,相关性降低,定位效果变差。RTK采用站星双差,消去了站间共有误差(卫星钟差,bias等)和星间共有误差(接收机钟差,bias等),根据基线距离的长短,中短基线下大气误差也得到了有效的抑制,再利用载波相位的模糊度的整周特性,再利用无电离层组合消去电离层影响,通过模糊度搜索和固定,可以获得厘米级的定位精度。PPP通过对可模型化误差进行模型化改正(对流层ZTD,相对论,海潮,卫星多路径等),多频组合消去电离层影响,对难以模型化的误差作为参数进行估计(模糊度,对流层WTD,DCB等),最后通过模糊度固定之后,能够给出高精度的定位结果。

当然我说的很浅薄也很片面,因为有些方向专业无关,未必准确,欢迎大家指正并补充。

精度排行通常情况下是PPP>RTK>DGPS>SPP.

简要提一下参数估计问题,通常的参数估计手法有两种,一种是根据参数的特性,建立模型,模型化改正;另外一种是作为未知参数放入总的方程中,进行平差给出解。参数的估计方法也包括最小二乘平差和kalman滤波。最小二乘平差只是一种多约束条件下的最小方差解法,在很多领域都是共用的,详情可以参考《平差》和吴恩达的机器学习课程。GPS领域中的最小二乘平差,是通过高斯-牛顿迭代的方法给出的,吴恩达的课程中也有一课专门讲了这个部分,简要来说就是使用泰勒级数展开式去近似地代替非线性回归模型,然后通过多次迭代通过不断修正系数,收敛到一定的结果后跳出,高斯-牛顿算法是一种二阶修正算法,通常来说效率更高。

其余的定位方式还有TDOA,FDOA,AOA等方式,精度相对较低,适用环境不同,不做赘述。

增强系统也包括WAAS、LAAS等。从星基和地基的角度也被称为SBAS和GBAS等,在此也不做赘述。




你可能感兴趣的:(RTKlib解读)