当前位置:网站首页>rtklib postpos 梳理(以单点定位为例)
rtklib postpos 梳理(以单点定位为例)
2022-06-22 10:50:00 【haoming Hu】
Email:[email protected]
Updatetime:2022年6月14日23:36:26
数据源:使用NEO-M8T的UBLOX数据,通过数据转化,得到观测文件和导航电文文件。
prcopt_t 结构体配置
- 使用默认配置prcopt_t prcopt=prcopt_default;
- 修改配置:
a) 修改定位模式prcopt.mode=PMODE_SINGLE;
b) 修改定位系统:prcopt.navsys = SYS_GPS|SYS_CMP;
main.c 代码
#include “src\rtklib.h”
void main(){
gtime_t ts={
0},te={
0};
prcopt_t prcopt=prcopt_default;
solopt_t solopt=solopt_default;
filopt_t filopt={
0};
char* infile[] = {
{
"D:\\USER\\M8T单点数据\\m8tsingledata.obs"},
{
"D:\\USER\\M8T单点数据\\m8tsingledata.nav"} };
char* outfile ="D:\\USER\\M8T单点数据\\20220614.pos";
prcopt.mode=PMODE_SINGLE;
prcopt.navsys = SYS_GPS|SYS_CMP;
solopt.posf=SOLF_LLH;
postpos(ts,te,0,0,&prcopt,&solopt,&filopt,infile,2,outfile,NULL,NULL);
}
Debug调试
事后定位代码时序图


预处理部分
openses函数:预处理 读取输入文件(postpos.c)
static int openses(const prcopt_t *popt, const solopt_t *sopt,const filopt_t *fopt, nav_t *nav, pcvs_t *pcvs, pcvs_t *pcvr)
https://blog.csdn.net/wuwuku123/article/details/106068946(参考博客)
通过读取filopt_t fopt中的参数,其中filopt_t结构体定义如下,实现对‘文件的读取’,读取子函数为openses!
输入文件包括观测文件、导航文件、精密星历文件等,postpos在处理输入文件时有两种方法,一种是输入文件可以只包含关键词,然后通过函数处理,将关键词用时间、基准站编号、流动站编号等代替另一种是直接调用输入文件的文件名,postpos主要是来判断是哪一种输入方式,然后调用相应函数。
execses_b函数 处理基站信息(postpos.c)
如果输入的时间都是0,那么直接跳入最后的else部分
精密GPS动态测量需要利用基准站信息进行差分定位,execses_b函数用于处理基站信息,https://www.cnblogs.com/ahulh/p/15368212.html(参考博客)
execses_b流程:(循环进行)
[1] readpreceph:读取精密星历文件 /* read prec ephemeris and sbas data */
[2] execses_r:处理每一个移动站的信息
execses:正式开始执行处理操作,包括文件函数readobsnav和数据处理函数antpos、procpos
文件读取 readobsnav (execses的第一步)
读取观测值文件和导航电文文件之前会判断是否有电离层和对流层数据需要读取。
RINEX格式的文件头用于存放与整个文件有关的全局性信息,位于每个文件的最前部,其最后一个记录为“END OF HEADER”.文件头中,每一记录的第6180列为该行记录的标签,用于说明第160列中所表示的内容。文件头存放有文件的创建日期、单位名、测站名、天线信息、测站近似坐标、观测值数量及类型、观测历元间隔等信息。
读取文件都是通过readrnxt函数(rinex.c)读取的,readrnxt函数处理的流程如下:
在readrnxfp的时候判断文件类型,根据不同的文件类型去调用不同的具体文件读取函数
- 观测文件(O文件)读取
RINEX格式的记录数据紧跟在文件头的后面,在观测文件中存放的是观测过程中每一观测历元所观测到的卫星及载波相位、伪距和多普勒等类型的观测值数据等。
在观测值文件中,所记录的载波相位数据的单位为周,伪距数据的单位为m。观测值所对应的时标(即观测时刻)是依据接收机钟的读数所生成的,而不是标准的GPS时,因而在该时标中含有接收机的钟差。
最后递进调用函数:readrnxobs,readrnxobsb - 导航电文文件(N文件)读取
导航电文文件文件头的格式与观测文件头基本相同,但包含内容略有不同。导航电文文件的文件头存放有文件创建日期、单位名及其他一些相关信息,另外,还有可能会包含电离层模型的参数以及说明GPS时与UTC间关系的参数和跳秒等。
导航电文文件中存放的是所观测卫星的钟差改正模型参数及卫星轨道数据等。由于广播星历每2h更新一次,因此,在导航电文文件中可能会出现某颗卫星具有多个不同参考时刻钟差模型改正参数和轨道数据的情况。
GPS导航电文文件数据记录节中的内容为按卫星和参考时刻存放的各颗卫星的时钟和轨道数据,每颗卫星一个参考时刻的数据占8行,第1行为卫星的PRN号和该卫星钟的参考时刻及其改正模型参数,第2~8行为该卫星的广播轨道数据。
最后递进调用函数:readrnxnav,readrnxnavb - 在读完o文件和n文件之后需要进行观察数据的排序和剔除重复的星历。分别通过sortobs、uniqnav函数进行排序和剔除。(这两个函数在rtkcmn.c文件)
处理数据 procpos(execses的第二步)
读取完o文件和n文件之后,开始根据不同的定位模式进行不同的操作
处理之前需要先判断定位类型,如果需要修改的话,可以在调用postpos之前修改传入的prcopt_t结构体,prcopt_t.mode = x x可以取一下9种值,在rtklib.h中进行了相关的宏定义。
#define PMODE_SINGLE 0 /* positioning mode: single */
#define PMODE_DGPS 1 /* positioning mode: DGPS/DGNSS */
#define PMODE_KINEMA 2 /* positioning mode: kinematic */
#define PMODE_STATIC 3 /* positioning mode: static */
#define PMODE_MOVEB 4 /* positioning mode: moving-base */
#define PMODE_FIXED 5 /* positioning mode: fixed */
#define PMODE_PPP_KINEMA 6 /* positioning mode: PPP-kinemaric */
#define PMODE_PPP_STATIC 7 /* positioning mode: PPP-static */
#define PMODE_PPP_FIXED 8 /* positioning mode: PPP-fixed */
在本次debug中,使用的是单点模式,即:PMODE_SINGLE
在执行完写输出文件头之后,可以看到输出文件中已经添加了文件头。

在这里根据设置的滤波器选择不同的操作,在默认设置中,采用了前向滤波器。但是在第一个if条件中似乎不管这个滤波器的类型,因为单点模式已经满足了或的条件,直接进入了procpos的具体定位操作。
滤波器的前、后、结合的方式大概是指计算的时候 计算的顺序问题,从前往后算还是从后往前算,还是算两遍的意思?(这里不太确定)
经过层层判断,最终进入procpos函数(*****)
1.首先是进行rtk结构体的初始化,主要将popt结构体赋值给rtk的部分成员。
2. 然后就是对每一个历元进行遍历求解和输出(两个操作)
3.while循环通过inputobs 读入具体数据
4. 在rtkpos函数中进行具体定位
a) 记录上一历元的时间 time=rtk->sol.time; /* previous epoch */
b) 在pntpos函数中进行定位解算
compute receiver position, velocity, clock bias by single-point positioning
计算接收机位置 速度 钟差
c) 因为不是精密单点定位(PPP),所以不需要设置电离层和对流层模型,直接进入下一步的位置等信息的计算
d) 计算位置、速度、钟差 satposs
e) 用伪距估计接收机位置 estpos
f) 用多普勒估计接收器速度 estvel(obs,n,rs,dts,nav,&opt_,sol,azel_,vsat);(如果estpos中返回非零才进行速度估计)
g) 当完成 d\e\f 的步骤的时候,可以看到解算结果以及得到了,往后循环多次解算即可。
这就是整个时候定位的大致流程,具体的解算可以深入pntpos函数中进行理解
下一篇大概会结合课本的理论去分析 satposs、estpos这两个主要的解算函数!
边栏推荐
- 推荐一款M1芯片电脑快速搭建集群的虚拟机软件
- QQ email for opencv face recognition
- Leetcode algorithm Delete the node of the linked list
- The data intelligence infrastructure upgrade window is approaching? See Chapter 9 how Yunji dingodb breaks through data pain points
- Detailed explanation of rules and ideas for advance sale of deposit
- 高考生父亲深夜自述,最在意的不是孩子成绩,转折点一点都不假
- [JMeter] shell script automatically executes JMeter
- Kirin software and Geer software focus on the development of network data security
- 7-1 框架发布 - 通过npm发布框架
- Use of libevent
猜你喜欢

Path Join() and path The difference between resolve()

等重构完这系统,我就提离职!

Inftnews | view: market cooling or opportunities for NFT applications

Spark streamlined interview

【毕业季·进击的技术er】青春不散场

QQ email for opencv face recognition

关于 GIN 的路由树

解决win7任务栏谷歌浏览器chrome图标丢失、异常空白的问题

将有色液体图像转换成透明液体,CMU教机器人准确掌控向杯中倒多少水

ONES 出席首届「精益软件工程大会」,分享效能改进实践
随机推荐
PHP开发的网站,如何实现批量打印快递单的功能?
Common thread scheduling methods
交换类排序法
scrapy.Request() 的 meta参数 数据的传递
学会用VisualStudio开发人员工具查看对象模型
事业发展规划
[graduation season · advanced technology Er] youth never ends
npm install 命令的介绍
nvm use之后重新打开终端还是显示修改之前的版本
Construction details of Danzhou clean animal laboratory
字节三面:到底知不知道什么是Eureka?
Backbone! Youxuan software was selected as one of the top 100 digital security companies in China in 2022
MySQL uses SQL statements to add and delete fields
MySQL uses SQL statements to modify field length and field name
Program architecture design for embedded software development task scheduling
Batch create / delete files, folders, modify file name suffixes
MySQL daily experience [02]
字节二面:Redis主节点的Key已过期,但从节点依然读到过期数据是为什么?怎么解决?
投资交易管理
In depth analysis of business model of blind box software development in 2022