RTKLIB学习记录【postpos、execses_b、execses_r】

本文主要记录对RTKLIB源码中postpos、execses_b、execses_r 函数的源码解读,不涉及其中的天线、星历等文件读取的内容,且为个人理解,如果有误,欢迎交流讨论。
一、postpos 函数部分
/rxn2rtkp函数 → postpos函数传递参数:
![]()
postpos函数接收参数:

各参数含义:
• gtime_t ts: 处理开始时间。ts.time == 0 表示没有时间限制。
• gtime_t te: 处理结束时间。te.time == 0 表示没有时间限制。
• double ti: 处理时间间隔(秒)。ti == 0 表示处理整个时间段。
• double tu: 处理段时间(秒)。tu == 0 表示处理所有时间。
• const prcopt_t *popt: 处理选项,包含数据处理的各种参数配置。
• const solopt_t *sopt: 解算选项,定义输出格式等参数。
• const filopt_t *fopt: 文件选项,包含输入输出文件的路径等。
• char **infile: 输入文件列表,包含观测文件、导航文件等。
• int n: 输入文件数量。
• char *outfile: 输出文件路径(可为空字符串,表示输出到标准输出)。
• const char *rov: 移动站(rover)的ID列表。(用空格分隔)
• const char *base: 基准站(base station)的ID列表。(用空格分隔)
• 备注: 输入文件应包含观测数据、导航数据、精密星历/钟差数据(可选)、SBAS 日志文件(可选)、SSR
• 消息日志文件(可选)和 TEC 网格文件(可选)。只有第一个输入文件中的观测数据被视为流动站数据。
• 输入文件的类型通过文件扩展名识别,如下:
• .sp3,.SP3,.eph*,.EPH*: 精密星历 (sp3c)
• .sbs,.SBS,.ems,.EMS : SBAS 消息日志文件 (rtklib 或 ems)
• .rtcm3,.RTCM3 : SSR 消息日志文件 (rtcm3)
• .*i,.*I : TEC 网格文件 (ionex)
• 其他 : RINEX 观测、导航、GNAV、HNAV、QNAV 或钟差文件
• 输入文件可以包含通配符(*):如果文件包含通配符,将会使用展开后的多个文件。
• 输入文件可以包含关键词:如果文件包含关键词,关键词将会被日期、时间、流动站 ID 和基准站 ID 替换,进
• 行多次会话分析。请参阅 reppath() 了解关键词。
• 输出文件同样可以包含关键词:如果输出文件不包含关键词,所有多次会话分析的结果将输出到一个单一的输
• 出文件中。
• SSR 改正仅对前向估计有效。
- 第一个 if 语句:如果开始时间、结束时间 ≠0,处理单元时间 > 0:







reppath函数:将文件路径中的关键字替换为 - 日期、时间、基准站流动站ID * args : char *path I 文件路径
* char *rpath O 存储替换关键字后的文件路径
* gtime_t time I time (gpst) (time.time==0: not replaced)
* char *rov I 流动站ID ("": not replaced)
* char *base I 基准站ID ("": not replaced) 1. extern int reppath(const char *path, char *rpath, gtime_t time, const char *rov,
2. const char *base)
3. { //初始化参数
4. double ep[6],ep0[6]={2000,1,1,0,0,0}; //用于存储时间的各部分(年、月、日、小时、分钟、秒)
5. int week,dow,doy,stat=0; //GPS周、周内天(0-6)、年积日(一年中的第几天)、记录替换状态
6. char rep[64];
7.
8. strcpy(rpath,path); //将path(主函数传参过来的infile或outfile)中的路径复制到rpath(postpos函数内部定义的用于后续传参的ifile或ofile) 9. if (!strstr(rpath,"%")) return 0; //检查路径中是否有%关键字,没有直接返回0
10. if (*rov ) stat|=repstr(rpath,"%r",rov ); //检查rov、base是否非空,替换路径中%r、%b关键字
11. if (*base) stat|=repstr(rpath,"%b",base); //rov、base为流动站和基准站的ID列表
12. // |= 位或操作符,其实就是判断返回值是否为非0,就成功
13.
14. if (time.time!=0) { //如果传入时间不为0,执行后续所有代码
15. time2epoch(time,ep); //将传入gps时间转换为历元时间(年月日时分秒),并存储在 ep 数组中
16. ep0[0]=ep[0]; //更新初始参数时间为当前时间的年份
17. dow=(int)floor(time2gpst(time,&week)/86400.0); //计算 GPS 周内天数
(0表示星期天,1 表示星期一,以此类推)
18. doy=(int)floor(timediff(time,epoch2time(ep0))/86400.0)+1; //计算当年第几天 //根据路径中不同关键字对应格式进行替换(这里要注意传入的时间代表什么)
19. sprintf(rep,"%02d", ((int)ep[3]/3)*3); stat|=repstr(rpath,"%ha",rep);
20. sprintf(rep,"%02d", ((int)ep[3]/6)*6); stat|=repstr(rpath,"%hb",rep);
21. sprintf(rep,"%02d", ((int)ep[3]/12)*12); stat|=repstr(rpath,"%hc",rep);
22. sprintf(rep,"%04.0f",ep[0]); stat|=repstr(rpath,"%Y",rep);
23. sprintf(rep,"%02.0f",fmod(ep[0],100.0)); stat|=repstr(rpath,"%y",rep);
24. sprintf(rep,"%02.0f",ep[1]); stat|=repstr(rpath,"%m",rep);
25. sprintf(rep,"%02.0f",ep[2]); stat|=repstr(rpath,"%d",rep);
26. sprintf(rep,"%02.0f",ep[3]); stat|=repstr(rpath,"%h",rep);
27. sprintf(rep,"%02.0f",ep[4]); stat|=repstr(rpath,"%M",rep);
28. sprintf(rep,"%02.0f",floor(ep[5])); stat|=repstr(rpath,"%S",rep);
29. sprintf(rep,"%03d", doy); stat|=repstr(rpath,"%n",rep);
30. sprintf(rep,"%04d", week); stat|=repstr(rpath,"%W",rep);
31. sprintf(rep,"%d", dow); stat|=repstr(rpath,"%D",rep);
32. sprintf(rep,"%c", 'a'+(int)ep[3]); stat|=repstr(rpath,"%H",rep);
33. sprintf(rep,"%02d", ((int)ep[4]/15)*15); stat|=repstr(rpath,"%t",rep);
34. }
35. //如果路径中存在以下时间关键字,但没有给出有效时间,则返回-1 2
36. else if (strstr(rpath,"%ha")||strstr(rpath,"%hb")||strstr(rpath,"%hc")||
37. strstr(rpath,"%Y" )||strstr(rpath,"%y" )||strstr(rpath,"%m" )||
38. strstr(rpath,"%d" )||strstr(rpath,"%h" )||strstr(rpath,"%M" )||
39. strstr(rpath,"%S" )||strstr(rpath,"%n" )||strstr(rpath,"%W" )||
40. strstr(rpath,"%D" )||strstr(rpath,"%H" )||strstr(rpath,"%t" )) {
41. return -1; /* no valid time */
42. }
43. return stat; //这个返回状态是只要有路径中关键字被替换就会返回非0值
44. }
* notes : 路径中的以下关键字将被日期、时间和名称替换
* %Y -> yyyy : year (4 digits) (1900-2099)
* %y -> yy : year (2 digits) (00-99)
* %m -> mm : month (01-12)
* %d -> dd : day of month (01-31)
* %h -> hh : hours (00-23)
* %M -> mm : minutes (00-59)
* %S -> ss : seconds (00-59)
* %n -> ddd : day of year (001-366)
* %W -> wwww : gps week (0001-9999)
* %D -> d : day of gps week (0-6)
* %H -> h : hour code (a=0,b=1,c=2,...,x=23)
* %ha-> hh : 3 hours (00,03,06,...,21)
* %hb-> hh : 6 hours (00,06,12,18)
* %hc-> hh : 12 hours (00,12)
* %t -> mm : 15 minutes (00,15,30,45)
* %r -> rrrr : rover id
* %b -> bbbb : base station id

二、 execses_b 函数
/postpos函数 → execses_b函数传递参数:
在postpos函数中根据是否输入了开始时间、结束时间和段时间对输入文件进行处理,但是不管如何处理,将输入文件分成多少个,传递到exceses_b函数都是对某段时间进行处理,只需要知道开始时间、结束时间和采样频率就可以。
该函数其实就是
- if (ts.time!=0&&te.time!=0&&tu>=0.0)
![]()
- else if (ts.time!=0)
![]()
- else
![]()
execses_b函数接收参数:




三、 execses_r 函数

四、总体分析


相关文章:
RTKLIB学习记录【postpos、execses_b、execses_r】
本文主要记录对RTKLIB源码中postpos、execses_b、execses_r 函数的源码解读,不涉及其中的天线、星历等文件读取的内容,且为个人理解,如果有误,欢迎交流讨论。 一、postpos 函数部分 /rxn2rtkp函数 → postpos函数传递参数&#x…...
docker,docker-desktop,docker-compose download
docker docker-compose download 百度网盘获取离线包链接release-notes 参考dockerdocker-composewlspowershell...
C#_带参数的委托进入队列执行
我们经常会遇到一些函数多个地方调用,但是只能单独执行的就需要把它放到队列中执行。 1.创建对应该方法的委托(传参和回参类型需要一致)。 //委托: public delegate void CameraTaskDelegate(byte cs, ref byte[] buffer);//对应函数: public void CameraSettingRead(by…...
【OpenCV】(二)—— 图片读取展示和保存
上一小节中我们成功安装了opencv,我们这次学习使用opencv最基础的功能,读取和展示图片,首先准备一张用于实验的样例图片【cat.jpg】如下: 然后就是创建一个python项目并导入相关依赖 import cv2读取图片 读取图片使用imread方法…...
【花卉识别系统】Python+卷积神经网络算法+人工智能+深度学习+图像识别+算法模型
一、介绍 花朵识别系统。本系统采用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,并基于前期收集到的5种常见的花朵数据集(向日葵、玫瑰、蒲公英、郁金香、菊花)进行处理后进行模型训练,最…...
k8s、prometheus、grafana数据采集和展示的链路流程
k8s集群中,容器级别的数据采集是由cAdvisor程序实现 cAdvisor # Container Advisor 容器顾问 cAdvisor程序是kubelet组件的一部分。 每个节点,包括master节点,都有一个kubelet系统服务, kukelet负责管理pod和容…...
sentinel dashboard改造落地设计实现解释(一)-分布式fetcher和metrics存储/搜索
背景 微服务是目前java主流架构,微服务架构技术栈有,服务注册中心,网关,熔断限流,服务同学,配置中心等组件,其中,熔断限流主要3个功能特性,限流,熔断,快速失败。Sentinel是阿里开源的熔断限流组件,sentinel dashboard是演示级别,表现在metrics采集是单机版,metri…...
LabVIEW提高开发效率技巧----时序分析
一、什么是时序分析? 时序分析是优化LabVIEW程序性能的重要步骤。它通过分析程序各个部分的执行时间,帮助开发者找到程序运行中的瓶颈,并进行有针对性的优化。在LabVIEW中,Profile Performance and Memory工具是进行时序分析的关…...
python不用ide也能进行调试
import pdb pdb.set_trace()import pdb 和 pdb.set_trace() 是 Python 中用于调试代码的工具。以下是它们的具体含义和用法: import pdb pdb 是 Python 的内置调试器模块,允许开发者在运行时进行代码调试。 通过 import pdb 语句,你可以引入…...
Django学习笔记之Django基础学习
Django笔记 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录…...
smartctl 设置硬盘的 write-caching
sg3 一、sg3查看缓存状态 您可以使用sg_modes命令来查看SAS盘和SATA盘的缓存状态。例如,要查看/dev/sdb设备的缓存状态,您可以执行以下命令: sg_modes -p 8,0 /dev/sdb 二、sg3关闭机械盘写缓存状态(仅适用于SAS盘)…...
【Spring AI】Java实现类似langchain的向量数据库RAG_原理与具体实践
介绍一下RAG: 检索增强生成(RAG)是一种技术,它结合了检索模型和生成模型来提高文本生成的质量。通过从企业私有或专有的数据源中检索相关信息,并将这些信息与大型语言模型相结合,RAG能够显著减少模型产生幻…...
linux下使用systemctl设置开机自动运行程序
本文介绍在Linux下,使用systemctl设置开机自动运行程序,实现创建一个systemd服务单元文件,并启用该服务的方法。 1、创建.service文件 在/etc/systemd/system/目录下创建一个以.service结尾的文件,例如myapp.service:…...
复位电路的亚稳态
复位导致亚稳态的概念: 同步电路中,输入数据需要与时钟满足setup time和hold time才能进行数据的正常传输(数据在这个时间段内必须保持不变:1不能变为0,0也不能变为1),防止亚稳态; …...
针对考研的C语言学习(循环队列-链表版本以及2019循环队列大题)
题目 【注】此版本严格按照数字版循环队列的写法,rear所代表的永远是空数据 图解 1.初始化部分和插入部分 2出队 3.分部代码解析 初始化 void init_cir_link_que(CirLinkQue& q) {q.rear q.front (LinkList)malloc(sizeof(LNode));q.front->next NULL…...
系统架构设计师教程 第12章 12.4 信息系统架构案例分析 笔记
12.4 信息系统架构案例分析 ★★★★☆ 12.4.1 价值驱动的体系结构——连接产品策略与体系结构 1.价值模型概述 价值模型核心的特征可以简化为三种基本形式。 (1)价值期望值:表示对某一特定功能的需求,包括功能、质量和不同 级别质量的实用性。 (2)…...
web1.0,web2.0,web3.0 有什么区别 详解
Web 的发展经历了多个阶段,每个阶段都有其独特的特点和技术进步。下面是 Web 1.0、Web 2.0 和 Web 3.0 之间的主要区别和详细解释: Web 1.0 时间范围:大约在 1991 年至 1995 年。 Web 1.0 是互联网的最初形态,也被称为静态 Web…...
将图片添加到 PDF 的 5 种方法
需要一种称为 PDF 编辑器的特定工具才能将图片添加到 PDF。尽管大多数浏览器在查看和注释 PDF 文件方面都非常出色,但如果您使用图像到 PDF 技术,则只能将照片放入 PDF 中。无需修改即可将 PDF 文件恢复为原始格式的能力是使用此类软件程序甚至在线服务的…...
TiDB 优化器丨执行计划和 SQL 算子解读最佳实践
导读 在数据库系统中,查询优化器是数据库管理系统的核心组成部分,负责将用户的 SQL 查询转化为高效的执行计划,因而会直接影响用户体感的性能与稳定性。优化器的设计与实现过程充满挑战,有人比喻称这是数据库技术要持续攀登的珠穆…...
初学51单片机之I2C总线与E2PROM以及UART简单实例应用
这是I2C的系列的第三篇,这篇主要是写一个简单的程序来实践一下相关的内容。前面博主写过一个电子密码锁的程序初学51单片机之简易电子密码锁及PWM应用扩展_51单片机设计电子密码锁-CSDN博客 本篇主要是在此基础上修改下程序,让密码存储在E2PROM中&#…...
Swiper动画进阶:手把手教你用Swiper Animate制作节日主题动画(2023最新版)
Swiper动画进阶:手把手教你用Swiper Animate制作节日主题动画(2023最新版) 当节日氛围遇上交互设计,如何让静态页面"活"起来?Swiper Animate作为Swiper生态中的动画引擎,能通过简单的类名配置实现…...
如何快速实现ngx-bootstrap国际化:多语言应用开发完整指南
如何快速实现ngx-bootstrap国际化:多语言应用开发完整指南 【免费下载链接】ngx-bootstrap Fast and reliable Bootstrap widgets in Angular (supports Ivy engine) 项目地址: https://gitcode.com/gh_mirrors/ng/ngx-bootstrap ngx-bootstrap作为Angular生…...
TP-LINK路由器IPTV功能实战:解决浙江电信DHCP+获取失败问题
TP-LINK路由器IPTV功能深度解析:从LLDP协议到浙江电信DHCP故障排查 浙江电信的IPTV用户最近频繁反馈一个棘手问题:当使用TP-LINK路由器的IPTV功能时,机顶盒无法通过DHCP协议获取IP地址。这个看似简单的网络故障背后,实则隐藏着LLD…...
好用还专业!AI智能降重工具深度测评与推荐
2026年真正好用的AI论文降重与改写工具,核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...
4个关键步骤:用vscode-ai-toolkit实现智能应用开发全流程
4个关键步骤:用vscode-ai-toolkit实现智能应用开发全流程 【免费下载链接】vscode-ai-toolkit 项目地址: https://gitcode.com/GitHub_Trending/vs/vscode-ai-toolkit AI Toolkit for Visual Studio Code是一款专为简化生成式AI应用开发设计的强大VS Code扩…...
如何在A100显卡上快速部署Wan2.1图生视频API(含FastAPI配置详解)
高性能显卡实战:A100部署Wan2.1图生视频API全流程解析 当NVIDIA A100显卡遇上Wan2.1图生视频模型,会碰撞出怎样的创意火花?作为当前最先进的生成式AI视频工具之一,Wan2.1凭借其14B参数的强大模型,正在改变内容创作的工…...
7yuv调试神器+RGA组合拳:快速定位GStreamer解码数据异常区域
7yuv调试神器与RGA组合拳:高效解决NV12解码数据异常问题 在视频处理开发中,经常会遇到解码后的NV12数据出现异常区域(如绿边、花屏)的情况。这不仅影响视觉效果,还可能导致后续处理算法失效。本文将介绍如何利用7yuv可…...
B端企业拓客:如何在精准度与成本之间找到真正平衡?氪迹科技法人股东号码核验系统,阶梯式价格
在B端市场存量竞争愈发激烈的当下,“拓客精准度”与“获客成本”的平衡,成为所有B端企业都要面对的核心课题。对绝大多数深耕B端业务的企业而言,拓客之路始终被两大难题困扰:一方面,线索质量参差不齐,空号、…...
COMSOL激光烧蚀激光融覆选区激光融化 激光直接沉积过程中,快速熔化凝固和多组分粉末的加入导...
COMSOL激光烧蚀激光融覆选区激光融化 激光直接沉积过程中,快速熔化凝固和多组分粉末的加入导致了熔池中复杂的输运现象。 热行为对凝固组织和性能有显著影响。 通过三维数值模型来模拟在316L上直接激光沉积过程中的传热、流体流动、凝固过程。 通过瞬态热分布可以获…...
高效音频录制实战:如何为你的Web应用选择最佳编码方案
高效音频录制实战:如何为你的Web应用选择最佳编码方案 【免费下载链接】Recorder html5 js 录音 mp3 wav ogg webm amr g711a g711u 格式,支持pc和Android、iOS部分浏览器、Hybrid App(提供Android iOS App源码)、微信,…...


