RTKLIB学习--前向滤波
#前言
如果要详细了解RTKLIB或进行二次开发,了解obs指针所存储每个历元的卫星观测数据是必不可少的环节,此文对RTKLIB的(由于后处理和实时运行都要用到前向滤波)前向滤波(从文件头读取观测数据到obs结构体中,进行每个历元的解算)进行详细的分析。结合代码调试来学习效果更佳
procpos函数
procpos是开启历元循环所在的函数,也是循环读取每个历元观测数据所在的函数。
solstatic=sopt->solstatic&&//静态解(popt->mode==PMODE_STATIC||popt->mode==PMODE_PPP_STATIC);rtkinit(&rtk,popt);rtcm_path[0]='\0';//实时数据流
while ((nobs=inputobs(obs,rtk.sol.stat,popt))>=0) {
在这个函数中循环读取一个历元的观测数据,而广播星历则是一次读取完。
/* exclude satellites 排除没有参与定位的卫星*/for (i=n=0;i<nobs;i++) {if ((satsys(obs[i].sat,NULL)&popt->navsys)&&popt->exsats[obs[i].sat-1]!=1) obs[n++]=obs[i];}if (n<=0) continue;//n为一个历元有效观测卫星数
if (!rtkpos(&rtk,obs,n,&navs)) continue;
正式进入定位模块,后面的条件判断则是一个历元定位结束后根据滤波方向决定下一个读取的历元。
inputobs()
在inputobs中通过不同的滤波方式读取基准站,流动站观测数据;由于后向滤波(从文件末尾读)只适用于后处理,在这里只介绍前向滤波(从文件头读取数据)。
其中obss.data[] 存储了所有历元的卫星观测数据,在inputobs()函数中通过流动站索引 iobsu,基准站索引 iobsr 从 obss.data 中获取 obsd_t *obs 其中存储了一个历元的所有卫星的观测数据,由于在spp,ppp,模式中不涉及到基准站,inputobs()函数对基准站的处理不易读懂,算法很巧妙,需要下一定的功夫理通
* input obs data, navigation messages and sbas correction -------------------*/
static int inputobs(obsd_t *obs, int solq, const prcopt_t *popt)
{gtime_t time={0};char path[1024];int i,nu,nr,n=0;trace(3,"infunc : revs=%d iobsu=%d iobsr=%d isbs=%d\n",revs,iobsu,iobsr,isbs);if (0<=iobsu&&iobsu<obss.n) {settime((time=obss.data[iobsu].time));if (checkbrk("processing : %s Q=%d",time_str(time,0),solq)) {aborts=1; showmsg("aborted"); return -1;}}if (!revs) { /* input forward data 从第一个历元读取*/if ((nu=nextobsf(&obss,&iobsu,1))<=0) return -1;//获取流动站观测卫星数/,&iobsu是上一个历元的基准站观测值索引,需要更新到当前历元的流动站观测值索引if (popt->intpref) {//内插参考观测值时,将iobsr索引(上一个历元的基准站索引)定位到当前历元的流动站索引for (;(nr=nextobsf(&obss,&iobsr,2))>0;iobsr+=nr)//最终iobsr被定位到当前历元流动站索引if (timediff(obss.data[iobsr].time,obss.data[iobsu].time)>-DTTOL) break;//iobsr所在历元时间段与当前历元的流动站历元时间差大于阈值时,退出}else {//不内插参考观测值时for (i=iobsr;(nr=nextobsf(&obss,&i,2))>0;iobsr=i,i+=nr)//获取上一个历元基准站观测数;iobsr被定位到当前历元基准站索引if (timediff(obss.data[i].time,obss.data[iobsu].time)>DTTOL) break;//上一个历元基准站索引时间与当前历元流动站索引时间差大于阈值时}
注:
①当 popt->intpref 为1时,表明参考站观测值是内嵌到流动站观测中的,也就是说一个历元观测值为(流动站观测值+基准站观测值);
&iobsr 初始为上一个历元的基准站索引,nr=上一历元基准站观测数,(假设历元时间段为30s)此时timediff= -30<阈值;iobsr+=nr成为了当前历元的流动站索引值,nr=当前历元的流动站数,timediff=0;结束循环
②popt->intpref 为0时,流动站观测值和基准站观测值是分开的。
&iobsr 初始为上一个历元的基准站索引,nr=上一历元基准站观测数,(假设历元时间段为30s)此时timediff= -30<阈值;iobsr=i不变,i +=nr,成为了当前历元基准站索引,timediff=0<阈值; iobsr=i 成为了当前历元基准站索引,i +=nr成为了下一个历元的基准站索引,timediff=30>阈值,结束循环
nr=nextobsf(&obss,&iobsr,2);//确保iobsr被定位到当前历元基准站索引,获取当前历元基准站观测数
如果 popt->intpref 为1时 iobsr从当前历元的流动站索引定位到基准站索引,然后获取观测卫星数,popt->intpref 为0时只获取观测卫星数。
如果是单点定位模式,则在第一次调用nextobsf() 时,由于观测数据的rcv无法匹配到给定参数为“2"的rcv,&iobsr 被遍历到最后一个历元,在之后调用nextobsf() 时,不会进入到if语句 的内部
for (i=0;i<nu&&n<MAXOBS*2;i++) obs[n++]=obss.data[iobsu+i];//复制流动站观测卫星数据
for (i=0;i<nr&&n<MAXOBS*2;i++) obs[n++]=obss.data[iobsr+i];//复制基准站观测卫星数据
iobsu+=nu;//流动站索引此时变为参考站索引 或下一个历元的流动站索引(spp,ppp)
nextobsf()
search next observation data index 前向滤波的方式--------------------------*/
static int nextobsf(const obs_t *obs, int *i, int rcv)
{double tt;int n;/*如果rcv为流动站,i在上一级函数中通过+=nu成为了上一个历元的基准站索引;如果是rtk模式一个历元段包括(rcv=1:流动站段 + rcv=2:基准站段)(参考观测值内插时)*/for (;*i<obs->n;(*i)++) if (obs->data[*i].rcv==rcv) break;//rtk模式:rcv=1(基准站索引->当前历元流动站站索引);rcv=2(-->下一段索引,可能是基准站,也可能是流动站)for (n=0;*i+n<obs->n;n++) {//遍历当前段观测卫星,tt=timediff(obs->data[*i+n].time,obs->data[*i].time);//第n个观测卫星时间与索引观测卫星时间差if (obs->data[*i+n].rcv!=rcv||tt>DTTOL) break;//如果卫星rcv改变或者历元时差过大,结束循环}return n;//返回索引所在历元rcv观测卫星数
相关文章:
RTKLIB学习--前向滤波
#前言 如果要详细了解RTKLIB或进行二次开发,了解obs指针所存储每个历元的卫星观测数据是必不可少的环节,此文对RTKLIB的(由于后处理和实时运行都要用到前向滤波)前向滤波(从文件头读取观测数据到obs结构体中࿰…...
利用C++与Python调用千帆免费大模型,构建个性化AI对话系统
千帆大模型已于2024年4月25日正式免费,调用这个免费的模型以实现自己的AI对话功能,遵循以下步骤: 了解千帆大模型: 千帆大模型是百度智能云推出的一个平台,提供了一系列AI能力和工具,用于快速开发和应用A…...
VTK9.2.0+QT5.14.0绘制三维显示背景
背景 上一篇绘制点云的博文中,使用的vtkCameraOrientationWidget来绘制的坐标轴,最近又学习到两种新的坐标轴绘制形式。 vtkOrientationMarkerWidget vtkAxesActor 单独使用vtkAxesActor能够绘制出坐标轴,但是会随着鼠标操作旋转和平移时…...
Vue.js2+Cesium1.103.0 十六、多模型轨迹运动
Vue.js2Cesium1.103.0 十六、多模型轨迹运动 Demo <template><div id"cesium-container" style"width: 100%; height: 100%;"><ul class"ul"><li v-for"(item, index) of deviceInfo" :key"index" cl…...
Matlab|基于PMU相量测量单元进行电力系统电压幅值和相角状态估计
主要内容 程序采用三种方法对14节点和30节点电力系统状态进行评估: ①PMU同步相量测量单元结合加权最小二乘法(WLS)分析电力系统的电压幅值和相角状态; ②并采用牛顿-拉夫逊方法进行系统潮流计算,结果作为理论分…...
【C++】---二叉搜索树
【C】---二叉搜索树 一、二叉搜索树概念二、二叉搜索树操作(非递归)1.二叉搜索树的查找 (非递归)(1)查找(2)中序遍历 2.二叉搜索树的插入(非递归)3.二叉搜索树…...
FastAPI - 依赖注入3
在FastAPI中,依赖注入是一种强大的功能,它允许你轻松地将依赖项注入到你的路由处理程序函数中,以处理不同的任务,例如数据库访问、认证和配置管理。 FastAPI支持依赖注入通过以下方式: 使用参数注解: 你可…...
【网络运维的重要性】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
YOLOv5改进 | 注意力机制 | 添加双重注意力机制 DoubleAttention【附代码/涨点能手】
💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 在图像识别中,学习捕捉长距离关系是基础。现有的CNN模型通常通过增加深度来建立这种关系,但这种形式效率极低。因此&…...
自用网站合集
总览 线上工具-图片压缩 TinyPNG线上工具-url参数解析 线上工具-MOV转GIF UI-Vant微信小程序版本其他-敏捷开发工具 Leangoo领歌 工具 线上工具-图片压缩 TinyPNG 不能超过5m,别的没啥缺点 线上工具-url参数解析 我基本上只用url参数解析一些常用的操作在线…...
【Golang】gin框架如何在中间件中捕获响应并修改后返回
【Golang】gin框架如何在中间件中捕获响应并修改后返回 本文讲述如何捕获中间件响应以及重写响应如果想在中间件中记录响应日志等操作,我们该如何获取响应数据呢?假如需要统一对响应数据做加密,如何修改这个返回数据再响应给客户端呢…...
电脑同时配置两个版本mysql数据库常见问题
1.配置时,要把bin中的mysql.exe和mysqld.exe 改个名字,不然两个版本会重复,当然,在初始化数据库的时候,如果时57版本的,就用mysql57(已经改名的)和mysqld57 代替 mysql 和 mysqld 例如 mysql -u root -p …...
Java | Leetcode Java题解之第112题路径总和
题目: 题解: class Solution {public boolean hasPathSum(TreeNode root, int sum) {if (root null) {return false;}if (root.left null && root.right null) {return sum root.val;}return hasPathSum(root.left, sum - root.val) || has…...
HaloDB 的 Oracle 兼容模式
↑ 关注“少安事务所”公众号,欢迎⭐收藏,不错过精彩内容~ 前倾回顾 前面介绍了“光环”数据库的基本情况和安装办法。 哈喽,国产数据库!Halo DB! 三步走,Halo DB 安装指引 ★ HaloDB是基于原生PG打造的新一代高性能安…...
【Python】解决Python报错:TypeError: ‘xxx‘ object does not support item assignment
🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…...
Spring-注解
Spring 注解分类 Spring 注解驱动模型 Spring 元注解 Documented Retention() Target() // 可以继承相关的属性 Inherited Repeatable()Spirng 模式注解 ComponentScan 原理 ClassPathScanningCandidateComponentProvider#findCandidateComponents public Set<BeanDefin…...
旧手机翻身成为办公利器——PalmDock的介绍也使用
旧手机有吧!!! 破电脑有吧!!! 那恭喜你,这篇文章可能对你有点用了。 介绍 这是一个旧手机废物利用变成工作利器的软件。可以在 Android 手机上快捷打开 windows 上的文件夹、文件、程序、命…...
期货交易的雷区
一、做自己看不懂的行情做交易计划一样要做有把握的,倘若你在盘中找机会交易,做自己看不懂的行情,即便你做进去了,建仓时也不会那么肯定,自然而然持仓也不自信,有点盈利就想平仓,亏损又想扛单。…...
东方通TongWeb结合Spring-Boot使用
一、概述 信创需要; 原状:原来的服务使用springboot框架,自带的web容器是tomcat,打成jar包启动; 需求:使用东方通tongweb来替换tomcat容器; 二、替换步骤 2.1 准备 获取到TongWeb7.0.E.6_P7嵌入版 这个文件,文件内容有相关对应的依赖包,可以根据需要来安装到本地…...
6.S081的Lab学习——Lab5: xv6 lazy page allocation
文章目录 前言一、Eliminate allocation from sbrk() (easy)解析: 二、Lazy allocation (moderate)解析: 三、Lazytests and Usertests (moderate)解析: 总结 前言 一个本硕双非的小菜鸡,备战24年秋招。打算尝试6.S081࿰…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
