当前位置: 首页 > news >正文

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,基准站索引 iobsrobss.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或进行二次开发&#xff0c;了解obs指针所存储每个历元的卫星观测数据是必不可少的环节&#xff0c;此文对RTKLIB的&#xff08;由于后处理和实时运行都要用到前向滤波&#xff09;前向滤波&#xff08;从文件头读取观测数据到obs结构体中&#xff0…...

利用C++与Python调用千帆免费大模型,构建个性化AI对话系统

千帆大模型已于2024年4月25日正式免费&#xff0c;调用这个免费的模型以实现自己的AI对话功能&#xff0c;遵循以下步骤&#xff1a; 了解千帆大模型&#xff1a; 千帆大模型是百度智能云推出的一个平台&#xff0c;提供了一系列AI能力和工具&#xff0c;用于快速开发和应用A…...

VTK9.2.0+QT5.14.0绘制三维显示背景

背景 上一篇绘制点云的博文中&#xff0c;使用的vtkCameraOrientationWidget来绘制的坐标轴&#xff0c;最近又学习到两种新的坐标轴绘制形式。 vtkOrientationMarkerWidget vtkAxesActor 单独使用vtkAxesActor能够绘制出坐标轴&#xff0c;但是会随着鼠标操作旋转和平移时…...

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节点电力系统状态进行评估&#xff1a; ①PMU同步相量测量单元结合加权最小二乘法&#xff08;WLS&#xff09;分析电力系统的电压幅值和相角状态&#xff1b; ②并采用牛顿-拉夫逊方法进行系统潮流计算&#xff0c;结果作为理论分…...

【C++】---二叉搜索树

【C】---二叉搜索树 一、二叉搜索树概念二、二叉搜索树操作&#xff08;非递归&#xff09;1.二叉搜索树的查找 &#xff08;非递归&#xff09;&#xff08;1&#xff09;查找&#xff08;2&#xff09;中序遍历 2.二叉搜索树的插入&#xff08;非递归&#xff09;3.二叉搜索树…...

FastAPI - 依赖注入3

在FastAPI中&#xff0c;依赖注入是一种强大的功能&#xff0c;它允许你轻松地将依赖项注入到你的路由处理程序函数中&#xff0c;以处理不同的任务&#xff0c;例如数据库访问、认证和配置管理。 FastAPI支持依赖注入通过以下方式&#xff1a; 使用参数注解&#xff1a; 你可…...

【网络运维的重要性】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

YOLOv5改进 | 注意力机制 | 添加双重注意力机制 DoubleAttention【附代码/涨点能手】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 在图像识别中&#xff0c;学习捕捉长距离关系是基础。现有的CNN模型通常通过增加深度来建立这种关系&#xff0c;但这种形式效率极低。因此&…...

自用网站合集

总览 线上工具-图片压缩 TinyPNG线上工具-url参数解析 线上工具-MOV转GIF UI-Vant微信小程序版本其他-敏捷开发工具 Leangoo领歌 工具 线上工具-图片压缩 TinyPNG 不能超过5m&#xff0c;别的没啥缺点 线上工具-url参数解析 我基本上只用url参数解析一些常用的操作在线…...

【Golang】gin框架如何在中间件中捕获响应并修改后返回

【Golang】gin框架如何在中间件中捕获响应并修改后返回 本文讲述如何捕获中间件响应以及重写响应如果想在中间件中记录响应日志等操作&#xff0c;我们该如何获取响应数据呢&#xff1f;假如需要统一对响应数据做加密&#xff0c;如何修改这个返回数据再响应给客户端呢&#xf…...

电脑同时配置两个版本mysql数据库常见问题

1.配置时&#xff0c;要把bin中的mysql.exe和mysqld.exe 改个名字&#xff0c;不然两个版本会重复&#xff0c;当然&#xff0c;在初始化数据库的时候&#xff0c;如果时57版本的&#xff0c;就用mysql57(已经改名的)和mysqld57 代替 mysql 和 mysqld 例如 mysql -u root -p …...

Java | Leetcode Java题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; 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 兼容模式

↑ 关注“少安事务所”公众号&#xff0c;欢迎⭐收藏&#xff0c;不错过精彩内容~ 前倾回顾 前面介绍了“光环”数据库的基本情况和安装办法。 哈喽&#xff0c;国产数据库&#xff01;Halo DB! 三步走&#xff0c;Halo DB 安装指引 ★ HaloDB是基于原生PG打造的新一代高性能安…...

【Python】解决Python报错:TypeError: ‘xxx‘ object does not support item assignment

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…...

Spring-注解

Spring 注解分类 Spring 注解驱动模型 Spring 元注解 Documented Retention() Target() // 可以继承相关的属性 Inherited Repeatable()Spirng 模式注解 ComponentScan 原理 ClassPathScanningCandidateComponentProvider#findCandidateComponents public Set<BeanDefin…...

旧手机翻身成为办公利器——PalmDock的介绍也使用

旧手机有吧&#xff01;&#xff01;&#xff01; 破电脑有吧&#xff01;&#xff01;&#xff01; 那恭喜你&#xff0c;这篇文章可能对你有点用了。 介绍 这是一个旧手机废物利用变成工作利器的软件。可以在 Android 手机上快捷打开 windows 上的文件夹、文件、程序、命…...

期货交易的雷区

一、做自己看不懂的行情做交易计划一样要做有把握的&#xff0c;倘若你在盘中找机会交易&#xff0c;做自己看不懂的行情&#xff0c;即便你做进去了&#xff0c;建仓时也不会那么肯定&#xff0c;自然而然持仓也不自信&#xff0c;有点盈利就想平仓&#xff0c;亏损又想扛单。…...

东方通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)解析&#xff1a; 二、Lazy allocation (moderate)解析&#xff1a; 三、Lazytests and Usertests (moderate)解析&#xff1a; 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。打算尝试6.S081&#xff0…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...