RTKlib软件源码学习(观测文件与星历文件读取)

2023-11-16

本文基于本人对rtklib源码的学习进行顺序汇总,为记录个人的学习与理解,并根据个人需要对部分代码对其进行注释,如有错误或者不完善的地方烦请提出建议或改正方法。

目录

1、execses函数

2、readobsnav函数

3、readrnxt函数

4、readrnxfile函数

5、readrnxfp函数

5.1、readrnxh函数

 5.1.1、decode_obsh函数

 5.1.2、decode_navh函数

5.1.3、decode_gnavh和decode_hnavh函数

5.2、readrnxobs函数

 5.2.1、readrnxobsb函数

5.2.2、 addobsdata

5.3、readrnxnav函数

5.3.1、readrnxnavb函数

5.3.2 、add_eph函数

5.3.3、add_geph函数

5.3.4、add_seph函数

 5.4、readrnxclk函数


1、execses函数

/* execute processing session ------------------------------------------------*/
static int execses(gtime_t ts, gtime_t te, double ti, const prcopt_t *popt,
                   const solopt_t *sopt, const filopt_t *fopt, int flag,
                   char **infile, const int *index, int n, char *outfile)
{
    FILE *fp,*fptm;
    rtk_t *rtk_ptr = (rtk_t *)malloc(sizeof(rtk_t)); /* moved from stack to heap to avoid stack overflow warning */
    prcopt_t popt_=*popt;
    solopt_t tmsopt = *sopt;
    char tracefile[1024],statfile[1024],path[1024],*ext,outfiletm[1024]={0};
    int i,j,k;
    
    trace(3,"execses : n=%d outfile=%s\n",n,outfile);
    
    /* open debug trace */
    if (flag&&sopt->trace>0) {
        if (*outfile) {
            strcpy(tracefile,outfile);
            strcat(tracefile,".trace");
        }
        else {
            strcpy(tracefile,fopt->trace);
        }
        traceclose();
        traceopen(tracefile);
        tracelevel(sopt->trace);
    }
    /* read ionosphere data file */
    if (*fopt->iono&&(ext=strrchr(fopt->iono,'.'))) {
        if (strlen(ext)==4&&(ext[3]=='i'||ext[3]=='I')) {
            reppath(fopt->iono,path,ts,"","");
            readtec(path,&navs,1);
        }
    }
    /* read erp data */
    if (*fopt->eop) {
        free(navs.erp.data); navs.erp.data=NULL; navs.erp.n=navs.erp.nmax=0;
        reppath(fopt->eop,path,ts,"","");
        if (!readerp(path,&navs.erp)) {
            showmsg("error : no erp data %s",path);
            trace(2,"no erp data %s\n",path);
        }
    }
    /* read obs and nav data */
    if (!readobsnav(ts,te,ti,infile,index,n,&popt_,&obss,&navs,stas)) {
        /* free obs and nav data */
        freeobsnav(&obss, &navs);
        free(rtk_ptr);
        return 0;
    }//通过这部分调用readobsnav来对观测文件和星历文件进行读取
    
    /* read dcb parameters */
    if (*fopt->dcb) {
        reppath(fopt->dcb,path,ts,"","");
        readdcb(path,&navs,stas);
    } else {
        for (i=0;i<3;i++) {
            for (j=0;j<MAXSAT;j++) navs.cbias[j][i]=0;
            for (j=0;j<MAXRCV;j++) for (k=0;k<2;k++) navs.rbias[j][k][i]=0;
        }
    }
    /* set antenna parameters */
    if (popt_.mode!=PMODE_SINGLE) {
        setpcv(obss.n>0?obss.data[0].time:timeget(),&popt_,&navs,&pcvss,&pcvsr,
               stas);
    }
    /* read ocean tide loading parameters */
    if (popt_.mode>PMODE_SINGLE&&*fopt->blq) {
        readotl(&popt_,fopt->blq,stas);
    }
    /* rover/reference fixed position */
    if (popt_.mode==PMODE_FIXED) {
        if (!antpos(&popt_,1,&obss,&navs,stas,fopt->stapos)) {
            freeobsnav(&obss,&navs);
            free(rtk_ptr);
            return 0;
        }
        if (!antpos(&popt_,2,&obss,&navs,stas,fopt->stapos)) {
            freeobsnav(&obss,&navs);
            free(rtk_ptr);
            return 0;
        }
    }
    else if (PMODE_DGPS<=popt_.mode&&popt_.mode<=PMODE_STATIC_START) {
        if (!antpos(&popt_,2,&obss,&navs,stas,fopt->stapos)) {
            freeobsnav(&obss,&navs);
            free(rtk_ptr);
            return 0;
        }
    }
    /* open solution statistics */
    if (flag&&sopt->sstat>0) {
        strcpy(statfile,outfile);
        strcat(statfile,".stat");
        rtkclosestat();
        rtkopenstat(statfile,sopt->sstat);
    }
    /* write header to output file */
    if (flag&&!outhead(outfile,infile,n,&popt_,sopt)) {
        freeobsnav(&obss,&navs);
        free(rtk_ptr);
        return 0;
    }
    /* name time events file */
    namefiletm(outfiletm,outfile);
    /* write header to file with time marks */
    outhead(outfiletm,infile,n,&popt_,&tmsopt);

    iobsu=iobsr=isbs=revs=aborts=0;
    
    if (popt_.mode==PMODE_SINGLE||popt_.soltype==0) {
        if ((fp=openfile(outfile)) && (fptm=openfile(outfiletm))) {
            procpos(fp,fptm,&popt_,sopt,rtk_ptr,0); /* forward */
            fclose(fp);
            fclose(fptm);
        }
    }
    else if (popt_.soltype==1) {
        if ((fp=openfile(outfile)) && (fptm=openfile(outfiletm))) {
            revs=1; iobsu=iobsr=obss.n-1; isbs=sbss.n-1;
            procpos(fp,fptm,&popt_,sopt,rtk_ptr,0); /* backward */
            fclose(fp);
            fclose(fptm);
        }
    }
    else { /* combined */
        solf=(sol_t *)malloc(sizeof(sol_t)*nepoch);
        solb=(sol_t *)malloc(sizeof(sol_t)*nepoch);
        rbf=(double *)malloc(sizeof(double)*nepoch*3);
        rbb=(double *)malloc(sizeof(double)*nepoch*3);
        
        if (solf&&solb) {
            isolf=isolb=0;
            procpos(NULL,NULL,&popt_,sopt,rtk_ptr,1); /* forward */
            revs=1; iobsu=iobsr=obss.n-1; isbs=sbss.n-1;
            procpos(NULL,NULL,&popt_,sopt,rtk_ptr,1); /* backward */
            
            /* combine forward/backward solutions */
            if (!aborts&&(fp=openfile(outfile))  && (fptm=openfile(outfiletm))) {
                combres(fp,fptm,&popt_,sopt);
                fclose(fp);
                fclose(fptm);
            }
        }
        else showmsg("error : memory allocation");
        free(solf);
        free(solb);
        free(rbf);
        free(rbb);
    }
    /* free rtk, obs and nav data */
    rtkfree(rtk_ptr);
    free(rtk_ptr);
    freeobsnav(&obss,&navs);
    
    return aborts?1:0;
}

execses目前只是把函数放在这里,以此来展示最初调用readobsnav函数的部分

2、readobsnav函数

/* read obs and nav data -----------------------------------------------------*/
static int readobsnav(gtime_t ts, gtime_t te, double ti, char **infile,
                      const int *index, int n, const prcopt_t *prcopt,
                      obs_t *obs, nav_t *nav, sta_t *sta)
{
    int i,j,ind=0,nobs=0,rcv=1;
    
    trace(3,"readobsnav: ts=%s n=%d\n",time_str(ts,0),n);
    
    obs->data=NULL; obs->n =obs->nmax =0;
    nav->eph =NULL; nav->n =nav->nmax =0;
    nav->geph=NULL; nav->ng=nav->ngmax=0;
    /* free(nav->seph); */ /* is this needed to avoid memory leak??? */
    nav->seph=NULL; nav->ns=nav->nsmax=0;
    nepoch=0;
    //给各个指针数据赋初值为空以及0
    for (i=0;i<n;i++) {
        if (checkbrk("")) return 0;
        
        if (index[i]!=ind) {
            if (obs->n>nobs) rcv++;
            ind=index[i]; nobs=obs->n; 
        }
        /* read rinex obs and nav file */
        if (readrnxt(infile[i],rcv,ts,te,ti,prcopt->rnxopt[rcv<=1?0:1],obs,nav,
                     rcv<=2?sta+rcv-1:NULL)<0) {
            checkbrk("error : insufficient memory");
            trace(1,"insufficient memory\n");
            return 0;
        }//调用readrnxt函数对观测文件进行读取
    }
    if (obs->n<=0) {
        checkbrk("error : no obs data");
        trace(1,"\n");
        return 0;
    }//检测观测文件是否正常
    if (nav->n<=0&&nav->ng<=0&&nav->ns<=0) {
        checkbrk("error : no nav data");
        trace(1,"\n");
        return 0;
    }//检测星历文件是否正常
    /* sort observation data */
    nepoch=sortobs(obs);
    //按照时间、接收机、卫星来分类观测信息

    /* delete duplicated(重复) ephemeris */
    uniqnav(nav);
   

    /* set time span for progress display */
    if (ts.time==0||te.time==0) {
        for (i=0;   i<obs->n;i++) if (obs->data[i].rcv==1) break;
        for (j=obs->n-1;j>=0;j--) if (obs->data[j].rcv==1) break;
        if (i<j) {
            if (ts.time==0) ts=obs->data[i].time;
            if (te.time==0) te=obs->data[j].time;
            settspan(ts,te);
        }
    }
    return 1;
}

readobsnav函数首先对所有数据指针赋0初值,然后再检验观测文件或者星历文件是否存在,并调用readrnx函数对文件进行下一步判断。

3、readrnxt函数


extern int readrnxt(const char *file, int rcv, gtime_t ts, gtime_t te,
                    double tint, const char *opt, obs_t *obs, nav_t *nav,
                    sta_t *sta)
{
    int i,n,stat=0;
    const char *p;
    char type=' ',*files[MAXEXFILE]={0};
    
    trace(3,"readrnxt: file=%s rcv=%d\n",file,rcv);
    
    if (!*file) {
        return readrnxfp(stdin,ts,te,tint,opt,0,1,&type,obs,nav,sta);
    }
    for (i=0;i<MAXEXFILE;i++) {
        if (!(files[i]=(char *)malloc(1024))) {
            for (i--;i>=0;i--) free(files[i]);
            return -1;
        }
    }//为每个输入文件分配地址
    /* expand wild-card */
    if ((n=expath(file,files,MAXEXFILE))<=0) {
        for (i=0;i<MAXEXFILE;i++) free(files[i]);
        return 0;
    }//扩大通配符,不清楚具体有什么用
    /* read rinex files */
    for (i=0;i<n&&stat>=0;i++) {
        stat=readrnxfile(files[i],ts,te,tint,opt,0,rcv,&type,obs,nav,sta);
    }//解压和读rinex文件
    /* if station name empty, set 4-char name from file head */
    if (type=='O'&&sta) {
        if (!(p=strrchr(file,FILEPATHSEP))) p=file-1;
        if (!*sta->name) setstr(sta->name,p+1,4);
    }//如果测站名字为空,就给依据文件自动赋4个字符的名字
    for (i=0;i<MAXEXFILE;i++) free(files[i]);释放文件内存
    
    return stat;
}
/* read RINEX OBS and NAV files -----------------
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RTKlib软件源码学习(观测文件与星历文件读取) 的相关文章

  • 华为OD机试真题-快递员的烦恼-2023年OD统一考试(C卷)

    题目描述 快递公司每日早晨 给每位快递员推送需要送到客户手中的快递以及路线信息 快递员自己又查找了一些客户与客户之间的路线距离信息 请你依据这些信息 给快递员设计一条最短路径 告诉他最短路径的距离 注意 1 不限制快递包裹送到客户手中的顺序
  • 欧拉操作系统

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 这个章节主要是介绍一下欧拉操作系统 欧拉系
  • 计算机基础:一颗芯片是怎样诞生的?

    一颗芯片是怎样诞生的 芯片属于半导体 半导体是介于导体和绝缘体之间的一类物质 元素周期表中硅 锗 硒 硼的单质都属于半导体 这些单质通过掺杂其他元素生成的一些化合物 也属于半导体的范畴 这些化合物在常温下可激发载流子的能力大增 导电能力大大
  • 华为OD机试真题-查找一个有向网络的头节点和尾节点-2023年OD统一考试(C卷)

    题目描述 给定一个有向图 图中可能包含有环 图使用二维矩阵表示 每一行的第一列表示起始节点 第二列表示终止节点 如 0 1 表示从0到1的路径 每个节点用正整数表示 求这个数据的首节点与尾节点 题目给的用例会是一个首节点 但可能存在多个尾节
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 【数据结构】单链表的定义和操作

    目录 1 单链表的定义 2 单链表的创建和初始化 3 单链表的插入节点操作 4 单链表的删除节点操作 5 单链表的查找节点操作 6 单链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 【华为OD机考 统一考试机试C卷】高效货运(C++ Java JavaScript Python)

    华为OD机考 统一考试 C卷 D卷 B卷 A卷 2023年11月份 华为官方已经将 华为OD机考 OD统一考试 A卷 B卷 切换到 OD统一考试 C卷 和 OD统一考试 D卷 根据考友反馈 目前抽到的试卷为B卷或C卷 D卷 其中C卷居多 按
  • 如何利用CHAT写C程序?

    问CHAT 用c语言编写在二维字符数组中查找某个字符串 CHAT回复 以下是一个简单的C程序 它将在二维字符数组中查找特定的字符串 c include
  • 华为OD机试真题-螺旋数字矩阵-2023年OD统一考试(C卷)

    题目描述 疫情期间 小明隔离在家 百无聊赖 在纸上写数字玩 他发明了一种写法 给出数字 个数n 和 行数m 0 lt n 999 0 lt m 999 从左上角的1开始 按照 顺时针螺旋向内写 方式 依次写出2 3 n 最终形成一个 m行矩
  • C/C++编程:令人印象深刻的高级技巧案例

    C C 编程语言在软件开发领域有着悠久的历史 由于其高效 灵活和底层访问能力 至今仍然被广泛应用 本文将介绍一些在C C 编程中令人印象深刻的高级技巧 帮助读者提升编程水平 更加高效地使用这两种强大的编程语言 一 指针运算与内存管理 C C
  • VScode配置mingw C语言环境变量

    C语言IDE VScode VScode是个人比较喜欢的一款IDE软件 鄙人曾同时在VScode软件中运行三个终端 开发Python Golang和C语言 下载地址如下 code visualstudio com VScode配置mingw
  • C 库函数 - mktime()

    描述 C 库函数 time t mktime struct tm timeptr 把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数 发生错误时返回 1 声明 下面是 mktime 函数的声明 time
  • 《妙趣横生的算法》(C语言实现)- 第6章 数学趣题(二)

    6 1 连续整数固定和问题 找出任意输入的整数n的全部的连续整数固定和 题目分析 至少要找出两个连续整数的固定和 一个整数的话就是本身了呢 那如何确定这些连续整数呢 想明白了 第一个整数设为a 第二个整数是a 1 假设有m个连续整数 那么第
  • linux ARM64 处理器内存屏障

    一 内存类型 ARMv8架构将系统中所有的内存 按照它们的特性 划分成两种 即普通内存和设备内存 并且它们是互斥的 也就是说系统中的某段内存要么是普通内存 要么是设备内存 不能都是 1 普通内存 Normal Memory 普通内存的特性是
  • 华为OD机试真题-部门人力分配-2023年OD统一考试(C卷)

    题目描述 部门在进行需求开发时需要进行人力安排 当前部门需要完成N个需求 需求用requirements 表示 requirements i 表示第i个需求的工作量大小 单位 人月 这部分需求需要在M个月内完成开发 进行人力安排后每个月的人
  • 华为OD机试真题-部门人力分配-2023年OD统一考试(C卷)

    题目描述 部门在进行需求开发时需要进行人力安排 当前部门需要完成N个需求 需求用requirements 表示 requirements i 表示第i个需求的工作量大小 单位 人月 这部分需求需要在M个月内完成开发 进行人力安排后每个月的人
  • linux ARM64 处理器内存屏障

    一 内存类型 ARMv8架构将系统中所有的内存 按照它们的特性 划分成两种 即普通内存和设备内存 并且它们是互斥的 也就是说系统中的某段内存要么是普通内存 要么是设备内存 不能都是 1 普通内存 Normal Memory 普通内存的特性是
  • 串口流控(CTS/RTS)使用详解

    1 流控概念 在两个设备正常通信时 由于处理速度不同 就存在这样一个问题 有的快 有的慢 在某些情况下 就可能导致丢失数据的情况 如台式机与单片机之间的通讯 接收端数据缓冲区已满 则此时继续发送来的数据就会丢失 流控制能解决这个问题 当接收
  • 【C++项目】【报错】[错误] new: No such file or directory, compilation terminated【及解决方法】

    一 问题描述 C源代码文件在编译过程中报错 错误 new No such file or directory compilation terminated 代码如下 include
  • c语言学生管理系统

    创建结构体里面包含学生的各种信息 struct xs int xh char xm 20 int gs yy wl double pj struct xs next 创建菜单 void menu printf n n printf 学生管理

随机推荐

  • 深度、广度优先搜索

    文章目录 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 应用 2 2 广度优先搜索 BFS 基本操作 应用 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 Vertextype GetVex ALGraph G int v
  • ewiews面板回归模型操作_【视频教程】Eviews系列25

    点击上方关注我们 本期我们学习Eviews统计建模最后一部分 面板数据回归分析Hausman检验及本章常见问题解答 实操 Hausman检验判断是固定效应模型还是随机效应模型 上期我们讲到模型判断若选择模型2 需进一步通过Hausman检验
  • Qt: 信号与槽机制

    一 信号和槽机制是什么 1 Qt信号槽机制 是Qt的核心机制 它是Qt定义的一种对象间的通讯机制 且独立于标准C C 语言 2 信号 signals 当某个类对象发生内部改变时 发射 信号 随后与关联的 槽函数 被立即执行 信号槽机制 完全
  • Node快速切换版本、版本回退(降级)、版本更新(升级)

    场景 最近遇到一些node的坑 比如6 3 0版的node用不了公司最新的工作流 升级到10 x版的node后 又用不了另一套工作流 问题 怎么实现node版本降级 升级 是否可以安装多个版本按需要进行切换 解决方案 1 安装node版本管
  • 【FPGA项目】进阶版沙盘演练——报文收发(报文处理、CDC、CRC)

    前言 书接上文 FPGA项目 沙盘演练 基础版报文收发 子墨祭的博客 CSDN博客 前面我们做了基础版的报文收发 相信对逻辑设计有了一定的认知 在此基础上 继续完善一个实际报文收发可能会遇到的一些处理 报文处理 握手与反压 跨时钟域处理CD
  • 金币(代码)

    今天 先更一道题的代码 目录 题目描述 输入输出格式 输入格式 输出格式 样例 输入输出样例 1 输入 输出 输入输出样例 2 输入 输出 数据范围与提示 AC 代码 题目描述 国王将金币作为工资 发放给忠诚的骑士 第一天 骑士收到一枚金币
  • 什么是软连接,以及软连接在linux系统中的用法

    软连接是linux中一个常用命令 它的功能是为某一个文件在另外一个位置建立一个同步的链接 软连接类似与c语言中的指针 传递的是文件的地址 更形象一些 软连接类似于WINDOWS系统中的快捷方式 例如 在a文件夹下存在一个文件hello 如果
  • 微信小程序反编译微信小程序

    微信小程序反编译跳一跳 项目地址 https github com shunyue1320 decompile wx 反编译 wxapkg 文件 微信开发者工具打开
  • 【python】详解threading模块:Event类的使用

    测试代码 import threading import time event threading Event event set def func 1 print t1线程开启等待状态 event wait print t1线程并没有处于
  • 计算机网络-应用层

    1 概述 定义 为应用进程的通信提供服务 主要功能 文件传输 访问和管理 电子邮件 虚拟终端 查询服务和远程作业登录 重要协议 FTP SMTP POP3 HTTP DNS 应用层的两种模型 客户服务器模型 C S P2P模型 Peer t
  • 为什么使用Lambda表达式

    视频地址 https b23 tv gfH0PjR 在使用Lambda表达式之前 先看一下 匿名内部类的一个使用 匿名内部类详情 http t csdn cn nMZpB 匿名内部类 就是没有名字的一种嵌套类 它是Java对类的定义方式之一
  • java倒叙遍历list

    for int i list size 1 i gt 0 i System out println list get i
  • MIDI 音乐程序设计 (可以自己编曲的快乐)

    乐器数字接口 MIDI 简介 乐器数字接口 Musical Instrument Digital Interface MIDI 是20世纪80年代初为解决电声乐器之间的通信问题而提出的 是电子乐器制造商们建立的通信标准 是电子乐器之间以及电
  • linux网站重启命令res,linux

    服务进程 实时观察cpu 进程 内存 top q键退出 load average 0 05 0 11 0 08 1分钟 5分钟 15分钟 平均负载 Cpu s 0 7 us 1 4 sy 0 0 ni 97 8 id 0 0 wa 0 0
  • unity 之 Particle 内置粒子系统二

    Emission module 这个模块影响发射速率和发射的时间 Properties Property Function Rate over Time 单位时间内发射的粒子数 Rate over Distance 每移动一单位距离所发射的
  • SpringBoot八种bean的加载方式

    目录 第一种bean的加载方式 配置文件 第二种加载bean方式 注解和扫描 创建第三方的bean对象 第三种加载bean方式 不使用配置文件 扩展 bean的加载方式扩展FactoryBean lt gt 扩展 ImportResourc
  • 华为云服务器,新用户福利!!0元免费体验云产品最长可达一年

    华为云官网最新活动 新用户完成个人实名认证 参与问卷调研后即可免费试用 云产品0元试用 最长可达一年 华为云服务立足于互联网领域 依托于华为公司雄厚的资本和强大的云计算研发实力 面向互联网增值服务运营商 大中小型企业 政府 科研院所等广大企
  • global::System.Runtime.Versioning.TargetFrameworkAttribute 特性重复问题处理

    今天编译程序遇到global System Runtime Versioning TargetFrameworkAttribute 特性重复错误 原因是编译时生成的 NETFramework Version v4 6 1 AssemblyA
  • 记一次MySql还原导致的无法连接

    问题 昨天同事使用服务器的MySql数据库还原了一个5GB 的备份 结果一直卡住 他就将数据库强行关闭 没再执行任何其他操作 结果今天客户反馈登录异常 逐步排查 定位到是数据库无法访问 于是远程查看服务器 发现 MySql服务是正在运行的
  • RTKlib软件源码学习(观测文件与星历文件读取)

    本文基于本人对rtklib源码的学习进行顺序汇总 为记录个人的学习与理解 并根据个人需要对部分代码对其进行注释 如有错误或者不完善的地方烦请提出建议或改正方法 目录 1 execses函数 2 readobsnav函数 3 readrnxt