本科生如何入门GNSS算法(三)- rtklib单点定位解算基础知识储备.docx

目录

写在前边:

rtklib运行

rtklib中的指针用法

rtklib中的观测量存储

SPP定位基本原理

最小二乘

一些基本概念

综上

欢迎关注个人公众号


写在前边:

其实我近几天翻网上的博客,关于rtklib的源码解析有很多,所以我如果去一个函数一个函数的去解析源码,完全没有意义。

所以后续,我主要是从一个初学的角度,介绍学习过程中可能遇到的问题,以及如何去解决这些问题,从哪些地方可以获取解决这些问题的知识,并将这个过程与已发布的博客结合起来,以及一些相对难以理解的知识点,我会尽量用通俗的语言介绍一下。


rtklib运行

直接打开rtkpos.c, 在第1780行打上一个断点。什么叫断点,以及如何打断点自行百度学习。按F5启动程序运行,可以发现如下图所示,程序运行到此。pntpos这个函数就是单点定位的入口。当然可以接着往下单步调试,看一下跳出这个函数后其他函数在干啥。其他的都是处理配置/读取文件等操作,与算法关系不大,所以可以直接运行到这一步,不必浪费太多时间在与算法逻辑相关较小的代码逻辑上。

​按F11,可以进入这个函数。自行百度F5/F10/F11/F12 vs快捷键的用法,以及简单的vs调试方法。

pntpos()这个函数的注释写的很明白,这个函数的功能/输入量/输出量/返回值。

rtklib中的指针用法

需要注意的是,关于指针的一些概念需要很搞得很明白;指针,其实是指向数据存储的地址。rtklib中使用了较多的指针来对数据进行存储,需要搞明白。比如:

double num[30];

如果有一个函数功能如下,即对输出的数组做挨个做+1处理,默认输出的数组就是十维:

void add_number_one(double *num){ 
    for(int i=0;i<10;i++){ 
        *(num+i) += 1; 
    }
}

那么如果我们想让定义的num都通过add_number_one函数实现+1,则可以如下调用

add_number_one(num+0); 
add_number_one(num+10); 
add_number_one(num+20);

写的很不规范,就是想让大家理解指针的含义。

rtklib中的观测量存储

rtklib中的观测量存储都是指针加个数的形式,即const obsd_t *obs, int n; 用来表示观测量。而 const nav_t *nav 就是一个,并没有说是存储了多少个星历,nav_t里面包含了多个卫星星历;const prcopt_t *opt, sol_t *sol也都是一个,就是用于传递信息;而 double *azel确又是一个数组;ssat_t *ssat也是一个数组。ssat是按卫星编号存储的,即rtklib将所有的卫星从1编号到MAXSAT,然后不管这个卫星是否可观测到,都申请内存,放在那,方便快速检索。

所以啊,rtklib中的数据存储要尤其留意,有的是按实际个数存储,传入地址加个数,有些则申请的大块内存,按卫星编号存储。


SPP定位基本原理

做定位算法之前,肯定要先了解定位的基本原理:

​有人写的很好,直接贴过来,原文链接:

GPS基础原理 ,可以多加学习,看不懂就多看几遍,再看不懂就去看书,然后找blog看,多读几遍就懂了,或者记住了。这个博客的系列文章都挺好,很多人写的都挺好,但是就是一堆知识扔过来,接受起来比较慢。

学习就一个点一个点的去进行,由点到线,由线到面。慢慢的把所有的知识点穿起来,形成知识脉络,那再学习新知识就快了很多。

定位的原理很简单,还有个学术名称,叫作前方交会原理。比较的难的是如何把简单的原理数学化,如何将抽象的问题转化为数学公式,是比较难以理解的。

比较抽象的知识点在于如何组方程以及计算得到结果:基础的概念参考博文 定位方程解算和定位精度 ,如果你高中泰勒级数展开学的比较好的话,那么将非线性公式线性化,就相对容易理解。如果忘记了什么叫泰勒级数,百度搜索和bilibili学习。

最小二乘

另外需要的知识点是最小二乘,最小二乘是解决方程数大于未知数个数的问题。

最简单的一个例子就是,比如测室内温度,理论上测一次我们就可以得到一个温度值,如果测三次呢?那么我们可以取个平均,计算得到一个值;那如果用了三个温度计测了三次,每个温度计的精度不一样,又如何计算最后结果?这都是典型的最小二乘问题。不要被各种数学公式的推到吓到,多搜搜博文和bilibili视频,多看几遍就可以入门。

另外一个需要的知识点,就是矩阵的基础知识,只需要明白一些基本的矩阵运算即可。这个在网上有大把的视频,可以先往下看代码,矩阵处理不懂的地方后续在去翻视频。rtklib中的矩阵处理都是自己实现的代码,其实有很成熟的开源库。rtklib代码比较老,现在大量的程序都是使用Eigen矩阵库,感兴趣的可以关注一下。

掌握了最小二乘和泰勒级数,以及矩阵的一些基本知识,基本可看懂单点定位的代码逻辑。先需要掌握一些基本的概念,就是我们通过观测卫星,可以获得的观测量。

一些基本概念

伪距与载波相位 这个博文的伪距介绍中可以初步了解到观测卫星得到的是什么,伪距也是一个距离,就是我们到卫星的距离。虽然有大气误差和卫星钟以及接收机钟误差的影响,但是伪距的大小基本也就是卫星离我们的高度,大约两万公里。钟差也很好理解,就是因为卫星钟和接收机钟不准确。钟是个新名词,就是一个能告诉你现在时间的手表,只是精度很高。

看完伪距,以及熟悉了最小二乘,那么接下来看如何去组方程以及计算残差等,这个写的很明白 定位方程解算和定位精度,写了我们的待估参数只有三个坐标分量和接收机钟差。其他的比如电离层和对流层模型计算的逻辑,完全不用看,除非你想做此类的研究。可以简单了解模型实现,但没必要去弄明白每行代码的含义。随便一个开源代码就有此类模型实现,没有任何需求需要自己维护或者实现。

综上

综合以上,你至少要有的一些简单基础知识,就是编程语言的数组,rtklib用了很多;最小二乘原理,估计位置的数学方法;泰勒级数展开,把距离转换成线性矩阵的方法;卫星的伪距,了解我们使用的观测值的产生以及存在误差;定位的方程,如何把问题用数学描述,输入到计算机。

欢迎关注个人公众号

个人公众号 GNSS和自动驾驶,会持续更新GNSS的基础教程/进阶教程/GNSS在自动驾驶中的应用/自动驾驶技术进展等。

猜你喜欢

转载自blog.csdn.net/dong20081991/article/details/126323779