[学习]RTKLib详解:rtksvr.c与streamsvr.c
本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。
[学习] RTKlib详解:功能、工具与源码结构解析
[学习]RTKLib详解:pntpos.c与postpos.c
[学习]RTKLib详解:rtkcmn.c与rtkpos.c
[学习]RTKLib详解:ppp.c与ppp_ar.c
[学习]RTKLib详解:ephemeris.c与rinex.c
文章目录
- Part A : `rtksvr`
- 一、整体作用与工作流程分析
- 二、函数详细说明
- 1. `writesolhead`:写入解算结果头部
- 2. `saveoutbuf`:保存输出缓冲区
- 3. `writesol`:输出解算结果
- 4. `updatenav`:更新导航数据波长
- 5. `updatefcn`:更新GLONASS频率信道
- 6. `updatesvr`:更新服务器状态
- 7. `decoderaw`:解码原始数据
- 三、函数调用关系图(Mermaid)
- 四、数学原理与公式
- 五、关键数据结构
- Part A:`streamsvr.c`
- 一、整体作用与工作流程分析
- 二、函数详细说明
- 1. `strconvnew`:创建流转换器
- 2. `raw2rtcm`:原始数据转 RTCM
- 3. `write_obs`:生成观测数据消息
- 4. `nextsat`:选择下一颗卫星
- 三、函数调用关系图(Mermaid)
- 四、数学原理与关键公式
- 五、关键数据结构
Part A : rtksvr
–
一、整体作用与工作流程分析
rtksvr.c
是RTK(实时动态定位)服务器的核心模块,负责处理多源输入数据(如观测值、星历、SSR修正等),执行实时动态差分定位解算,并输出高精度定位结果。其工作流程如下:
- 数据输入:通过多个流(
stream
)接收原始观测数据、星历、SSR修正等。 - 数据解码:调用
decoderaw
解析原始数据或RTCM格式数据,提取观测值、星历等信息。 - 状态更新:通过
updatesvr
更新服务器状态,包括导航数据、天线位置、SSR修正等。 - 定位解算:利用RTK算法(如双差载波相位处理)计算移动站位置。
- 结果输出:通过
writesol
将解算结果写入输出流,并保存至缓冲区或监控端口。
二、函数详细说明
1. writesolhead
:写入解算结果头部
- 功能:生成并写入解算结果的头部信息(如坐标系、时间格式)。
- 参数:
stream_t *stream
:输出流指针。solopt_t *solopt
:解算选项(如输出格式)。
- 流程:调用
outsolheads
生成头部数据,通过strwrite
写入流。
2. saveoutbuf
:保存输出缓冲区
- 功能:将解算结果存入环形缓冲区,支持多线程安全。
- 参数:
rtksvr_t *svr
:RTK服务器结构体。unsigned char *buff
:待保存的数据缓冲区。int n
:数据长度。int index
:缓冲区索引(区分不同输出流)。
- 关键操作:加锁(
rtksvrlock
)后复制数据至svr->sbuf[index]
,更新缓冲区指针nsb
。
3. writesol
:输出解算结果
- 功能:将定位结果写入输出流,并保存至缓冲区和监控端口。
- 参数:
rtksvr_t *svr
(服务器状态)、int index
(流索引)。 - 流程:
- 调用
outsols
生成标准解算结果,outsolexs
生成扩展结果。 - 通过
strwrite
写入流,并调用saveoutbuf
保存数据。 - 监控端口输出使用简化格式(
solopt_default
)。
- 调用
4. updatenav
:更新导航数据波长
- 功能:计算卫星信号的波长( λ \lambda λ),用于载波相位解算。
- 数学原理:波长公式为 λ = c / f \lambda = c / f λ=c/f,其中 c c c为光速, f f f为频率。
- 参数:
nav_t *nav
(导航数据结构体)。 - 实现:遍历所有卫星和频率,调用
satwavelen
计算波长并更新nav->lam
。
5. updatefcn
:更新GLONASS频率信道
- 功能:同步不同数据流中的GLONASS卫星频率信道号(
frq
)。 - 参数:
rtksvr_t *svr
。 - 流程:遍历GLONASS卫星,从任意流中获取有效
frq
,更新其他流的导航数据。
6. updatesvr
:更新服务器状态
- 功能:根据解码结果更新导航数据、观测值、SSR修正等。
- 参数:
rtksvr_t *svr
:服务器状态。ret
:数据类型标识(如1=观测值,2=星历)。obs_t *obs
:观测数据结构体。nav_t *nav
:导航数据结构体。
- 关键逻辑:
- 观测值:筛选有效数据并排序。
- 星历:更新GPS/GLONASS星历,确保时效性。
- SSR修正:检查轨道与钟差IOD一致性,避免数据冲突。
7. decoderaw
:解码原始数据
- 功能:解析原始数据或RTCM消息,提取观测值、星历等信息。
- 参数:
rtksvr_t *svr
、int index
(流索引)。 - 返回:解码结果状态(如1=观测值解码成功)。
三、函数调用关系图(Mermaid)
四、数学原理与公式
RTK定位基于双差载波相位观测模型,关键公式如下:
-
双差观测方程:
∇ Δ ϕ = ∇ Δ ρ + λ ∇ Δ N + ∇ Δ ϵ \nabla\Delta\phi = \nabla\Delta\rho + \lambda\nabla\Delta N + \nabla\Delta\epsilon ∇Δϕ=∇Δρ+λ∇ΔN+∇Δϵ- ∇ Δ ϕ \nabla\Delta\phi ∇Δϕ:双差载波相位(单位:周)。
- ∇ Δ ρ \nabla\Delta\rho ∇Δρ:双差几何距离。
- ∇ Δ N \nabla\Delta N ∇ΔN:双差整周模糊度。
- λ \lambda λ:信号波长。
-
Kalman滤波状态更新:
x ^ k = x ^ k − 1 + K k ( z k − H k x ^ k − 1 ) \hat{x}_k = \hat{x}_{k-1} + K_k(z_k - H_k\hat{x}_{k-1}) x^k=x^k−1+Kk(zk−Hkx^k−1)- K k K_k Kk:卡尔曼增益。
- z k z_k zk:观测向量。
- H k H_k Hk:设计矩阵。
五、关键数据结构
rtksvr_t
:包含服务器状态、缓冲区、导航数据(nav
)、解算结果(rtk
)等。nav_t
:存储星历、电离层参数、SSR修正等。solopt_t
:定义解算结果的输出格式选项。
Part A:streamsvr.c
一、整体作用与工作流程分析
streamsvr.c
是 RTKLIB 流服务器模块的核心部分,主要用于 多源数据流的格式转换与分发,支持将输入流(如接收机原始数据)转换为指定格式(如 RTCM 消息)并输出。其核心功能包括:
- 数据流转换:支持从原始数据(
raw_t
)或 RTCM 数据(rtcm_t
)转换为目标格式。 - 消息生成:按配置生成观测数据(OBS)、导航数据(NAV)及站信息(STA)的 RTCM 消息。
- 周期性输出:根据时间间隔(
tint
)控制消息的发送频率,支持循环发送导航数据。
工作流程:
- 初始化转换器:调用
strconvnew
创建流转换器,解析消息类型与时间间隔。 - 数据解码与转换:根据输入流类型(
itype
)调用raw2rtcm
或rtcm2rtcm
将数据复制到目标结构。 - 消息生成与发送:通过
write_obs
和write_nav
生成 RTCM 消息,调用strwrite
写入输出流。 - 循环导航数据:
write_nav_cycle
使用nextsat
选择下一颗卫星的星历,周期性发送。
二、函数详细说明
1. strconvnew
:创建流转换器
- 功能:初始化流转换器,解析消息类型与时间间隔,分配内存并配置 RTCM/原始数据结构。
- 参数:
int itype
:输入流类型(如STR_RAW
或STR_RTCM
)。int otype
:输出流类型(如STRFMT_RTCM3
)。const char *msgs
:消息类型与间隔(如"1019(30),1020(30)"
)。int staid
:站 ID。int stasel
:站信息选择(0=远程,1=本地)。
- 关键逻辑:
- 解析
msgs
字符串,提取消息类型(如 1019)和间隔(如 30 秒)。 - 初始化
rtcm_t
和raw_t
结构,配置选项(如-EPHALL
强制包含所有星历)。
- 解析
2. raw2rtcm
:原始数据转 RTCM
- 功能:将接收机原始数据(
raw_t
)复制到 RTCM 结构(rtcm_t
)。 - 参数:
rtcm_t *out
:目标 RTCM 结构。const raw_t *raw
:源原始数据。int ret
:数据类型标识(1=观测值,2=星历,9=UTC/电离层参数)。
- 数据映射:
- 观测值:
out->obs.data[i] = raw->obs.data[i]
。 - 星历:根据卫星系统(GPS/GLONASS)复制到
nav.eph
或nav.geph
。
- 观测值:
3. write_obs
:生成观测数据消息
- 功能:按配置生成观测数据 RTCM 消息并写入输出流。
- 参数:
gtime_t time
:当前时间。stream_t *str
:输出流指针。strconv_t *conv
:流转换器。
- 逻辑:
- 检查消息类型是否为观测数据(
is_obsmsg
)且满足时间间隔(is_tint
)。 - 调用
gen_rtcm2
或gen_rtcm3
生成消息,通过strwrite
发送。
- 检查消息类型是否为观测数据(
4. nextsat
:选择下一颗卫星
- 功能:循环选择下一颗卫星的星历,用于周期性导航数据输出。
- 参数:
nav_t *nav
:导航数据结构。int sat
:当前卫星编号。int msg
:消息类型(如 1019=GPS 星历)。
- 逻辑:
- 根据消息类型确定卫星系统(如 1019 对应 GPS),遍历 PRN 号寻找有效星历。
- 返回下一颗有效卫星编号,若无则重置为起始 PRN。
三、函数调用关系图(Mermaid)
四、数学原理与关键公式
-
时间间隔检查:
is_tint ( t ) = { 1 if mod ( t GPST + Δ , T ) ≤ 2 Δ 0 otherwise \text{is\_tint}(t) = \begin{cases} 1 & \text{if } \text{mod}(t_{\text{GPST}} + \Delta, T) \leq 2\Delta \\ 0 & \text{otherwise} \end{cases} is_tint(t)={10if mod(tGPST+Δ,T)≤2Δotherwise- 其中 t GPST t_{\text{GPST}} tGPST 为 GPS 时间, T T T 为间隔, Δ \Delta Δ 为容差(
DTTOL
)。
- 其中 t GPST t_{\text{GPST}} tGPST 为 GPS 时间, T T T 为间隔, Δ \Delta Δ 为容差(
-
星历循环逻辑:
- 对卫星 PRN 号进行模运算,确保周期性遍历所有有效星历:
p next = { p 1 if p ≥ p 2 p + 1 otherwise p_{\text{next}} = \begin{cases} p_1 & \text{if } p \geq p_2 \\ p + 1 & \text{otherwise} \end{cases} pnext={p1p+1if p≥p2otherwise- p 1 p_1 p1 和 p 2 p_2 p2 为 PRN 范围(如 GPS: 1-32)。
- 对卫星 PRN 号进行模运算,确保周期性遍历所有有效星历:
五、关键数据结构
strconv_t
:流转换器配置,包含消息列表、时间间隔、RTCM/原始数据实例。rtcm_t
:存储 RTCM 消息的观测值、星历、站信息及生成缓冲区。nav_t
:导航数据,包括星历(eph
)、GLONASS 星历(geph
)、电离层参数等。
研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)
相关文章:
[学习]RTKLib详解:rtksvr.c与streamsvr.c
本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解:pntpos.c与postpos.c [学习]RTKLib详解&…...
Docker使用小结
概念 镜像( Image ) :相当于一个 root 文件系统;镜像构建时,分层存储、层层构建;容器( Container ) :镜像是静态的定义,容器是镜像运行时的实体;…...

串口屏调试 1.0
http://wiki.tjc1688.com 先把商家的链接贴过来 淘晶驰T1系列3.2寸串口屏tft液晶屏显示屏HMI触摸屏超12864液晶屏 这是主包的型号 打开这个玩意 有十个基本的功能区 新建工程 在界面的右边,指令一定要写在page前面,这里的波特率等等什么的都可以…...

windows 环境下 python环境安装与配置
运行环境安装 第一步安装包下载 python开发工具安装包下载官网: https://www.python.org/ 根据自己的实际需求选择。 这里记录了各个版本的区别和差异。根据区别和差异选择适合自己的版本。 Windows Installer和Windows embeddable package是两种不同的软件包类…...

浅谈装饰模式
一、前言 hello大家好,本次打算简单聊一下装饰者模式,其实写有关设计模式的内容还是蛮有挑战性的,首先呢就是小永哥实力有限担心说不明白,其次设计模式是为了解决某些问题场景,在当前技术生态圈如此完善的情况下&#…...

LeetCode 270:在二叉搜索树中寻找最接近的值(Swift 实战解析)
文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在日常开发中,我们经常需要在一组有序的数据中快速找到最接近某个目标值的元素。LeetCode 第 270 题“Closest Binary Search Tree Value”正是这样一个问题。本文将深入解析该…...

WPF 3D图形编程核心技术解析
一、三维坐标系系统 WPF采用右手坐标系系统,空间定位遵循: X 轴 → 右 Y 轴 → 上 Z 轴 → 观察方向 X轴 \rightarrow 右\quad Y轴 \rightarrow 上\quad Z轴 \rightarrow 观察方向 X轴→右Y轴→上Z轴→观察方向 三维坐标值表示为 ( x , y , z ) (x, y,…...
分布式锁原理
1.锁是什么 一个线程拿到锁,另一个线程就拿不到,满足互斥性。 2.Redis的setnx实现 加锁后解锁,但是要先判断是否是当前线程持有的锁,只能释放本线程的锁。 先判断后释放,两步操作Lua实现原子性 3.为什么要给锁加过期…...

暗物质卯引力挂载技术
1、物体质量以及其所受到的引力约束(暗物质压力差) 自然界的所有物体,其本身都是没有质量的。我们所理解的质量,其实是物体球周空间的暗物质对物体的挤压,压力差。 对于宇宙空间中的单个星球而言,它的球周各处压力是相同的,所以,它处于平衡状态,漂浮在宇宙中。 对于星…...
实现三个采集板数据传送到一个显示屏的方案
实现三个采集板数据传送到一个显示屏的方案 要实现三个相同采集板的数据都传送到一个显示屏上,可行的方案: 方案:串行通信(推荐) 硬件连接: 使用RS485总线连接(适合较长距离)或使用…...

comfyui 如何优雅的从Hugging Face 下载模型,文件夹
如下图所示 使用git 下载整个仓库然后把需要的放到对应的位置...

通过user-agent来源判断阻止爬虫访问网站,并防止生成[ error ] NULL日志
一、TP5.0通过行为(Behavior)拦截爬虫并避免生成 [ error ] NULL 错误日志 1. 创建行为类(拦截爬虫) 在 application/common/behavior 目录下新建BlockBot.php ,用于识别并拦截爬虫请求: <?php name…...
动态规划法:爬楼梯
假如你现在爬楼梯,需要n阶才能到达楼顶,每次可以爬1或2 台阶,你有多少中不同的方法可以爬到楼顶。 例如: 输入:n2 输出:2 //有两种方法可以到达楼顶,1阶1阶,2阶。 输入&…...

IBM BAW(原BPM升级版)使用教程第七讲
续前篇! 一、团队 在 IBM Business Automation Workflow (BAW) 中,团队(Team) 是流程管理的关键部分,用于定义参与某个流程的用户、角色、组以及服务等。在团队配置中,有许多重要概念,特别是 …...

【论文阅读】Efficient and secure federated learning against backdoor attacks
Efficient and secure federated learning against backdoor attacks -- 高效且安全的可抵御后门攻击的联邦学习 论文来源问题背景TLDR系统及威胁模型实体威胁模型 方法展开服务器初始化本地更新本地压缩高斯噪声与自适应扰动聚合与解压缩总体算法 总结优点缺点 论文来源 名称…...

Java中的代理机制
目录 什么叫代理 静态代理 优缺点 优点: 缺点: 动态代理 JDK动态代理 核心类 JDK动态代理的实现 步骤 示例 特点 CGLIB动态代理 代理机制对比 总结 什么叫代理 代理模式是一种比较好理解的设计模式。简单来说就是我们使用代理对象来代替…...
Kotlin扩展函数提升Android开发效率
在Android开发中,Kotlin的扩展函数(Extension Functions)犹如一把神奇的瑞士军刀,它能显著提升代码简洁性和开发效率。以下是通过实战案例展示的扩展函数魔法手册: 一、扩展函数基础原理 // 给View添加渐显动画扩展 f…...

Jenkins linux安装
jenkins启动 service jenkins start 重启 service jenkins restart 停止 service jenkins stop jenkins安装 命令切换到自己的下载目录 直接用命令下载 wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.190.3-1.1.noarch.rpm 下载直接安装 rpm -ivh jenkins-2.190.3-…...
加速pip下载:永久解决网络慢问题
一文教你解决 pip 下载太慢了的问题 || 下载时因为网络不好中断下载的问题 一、找到 pip 配置文件路径 1.配置文件位置: Windows 系统的 pip 配置文件默认不存在,需要手动创建,路径为: C:\Users\你的用户名\pip\pip.ini 用户目…...
WPF 触发器 Trigger
触发器 Trigger 触发器(Trigger)是 WPF 中的一种机制: 当某个条件满足时,自动改变控件的某些属性,比如颜色、大小、透明度等。 换句话说,就是"如果……那么就……" 的一种规则。 常见触发器类…...

Webug4.0靶场通关笔记-靶场搭建方法(3种方法)
目录 一、虚拟机绿色版本 1. 开启phpstudy 2. 访问靶场 二、Docker版本 1.拉取镜像 2.启动镜像 三、源码安装版本 1. 搭建环境 (1)安装PHPStudy (2)WeBug4.0靶场源码 (3)安装Navicat ÿ…...
Python核心编程深度解析:作用域、递归与匿名函数的工程实践
引言 Python作为现代编程语言的代表,其作用域管理、递归算法和匿名函数机制是构建高质量代码的核心要素。本文基于Python 3.11环境,结合工业级开发实践,深入探讨变量作用域的内在逻辑、递归算法的优化策略以及匿名函数的高效应用,…...

【Web】LACTF 2025 wp
目录 arclbroth lucky-flag whack-a-mole arclbroth 看到username为admin能拿到flag 但不能重复注册存在的用户 这题是secure-sqlite这个库的问题,底层用的是C,没处理好\0字符截断的问题 (在 Node.js 中,由于其字符串表示方式…...

【日撸 Java 三百行】综合任务 1
目录 Day 10:综合任务 1 一、题目分析 1. 数据结构 2. 相关函数基本知识 二、模块介绍 1. 初始化与成绩矩阵的构建 2. 创建总成绩数组 3. 寻找成绩极值 三、代码与测试 小结 拓展:关于求极值的相关算法 Day 10:综合任务 1 Task&…...
yocto的每个recipe都是在工作路径中完成
Yocto项目中每个Recipe的编译过程都会将源文件解压或搬运到tmp/work/下的特定工作目录,并在此完成所有构建任务。具体流程可分为以下关键步骤: 一、源码处理阶段 源码获取(do_fetch) Recipe通过SRC_URI变量指定源码来源(如Git仓库、HTTP下载或本地文件)。这些文件会被下载…...
玩转Docker | 使用Docker部署DailyTxT日记工具
玩转Docker | 使用Docker部署DailyTxT日记工具 一、DailyTxT介绍DailyTxT简介DailyTxT 特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署DailyTxT服务下载DailyTxT镜像编辑部署文件创建容器检查容器状态检查服务端口安全设置四、访问DailyTxT服务访问D…...
初等数论--欧拉定理及证明
0. 证明前置知识 同余类(剩余类) r n ‾ { x ∣ x m n r , m ∈ Z } \overline{r_n} \{ x| xmnr,m \in Z\} rn{x∣xmnr,m∈Z} r n ‾ \overline{r_n} rn表示模 n n n后余 r r r的同余类(剩余类) 比如 2 5 ‾ { ⋯…...
Oracle非归档模式遇到文件损坏怎么办?
昨天夜里基地夜班的兄弟,打电话说有个报表库连不上了,赶紧起来连上VPN查看一下,看到实例宕机了,先赶紧startup起来。 1.查看报错信息 环境介绍:Redhat 6.9 Oracle 11.2.0.4 No Archive Mode 查看alert log 关键报…...
机器人领域和心理学领域 恐怖谷 是什么
机器人领域和心理学领域 恐怖谷 是什么 恐怖谷是一个在机器人领域和心理学领域备受关注的概念,由日本机器人专家森政弘于1970年提出。 含义 当机器人与人类的相似度达到一定程度时,人类对它们的情感反应会突然从积极变为消极,产生一种毛骨悚然、厌恶恐惧的感觉。这种情感…...
树莓派4的v4l2摄像头(csi)no cameras available,完美解决
根据2025年最新技术文档和树莓派官方支持建议,no cameras available错误通常由驱动配置冲突或硬件连接问题导致。以下是系统化解决方案: 一、核心修复步骤 强制禁用传统驱动 sudo nano /boot/firmware/config.txt确保包含以下配置(2025年新版…...