[学习]RTKLib详解:convkml.c、convrnx.c与geoid.c
RTKLib详解: datum.c
、download.c
与 lambda.c
本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。
[学习] RTKlib详解:功能、工具与源码结构解析
[学习]RTKLib详解:pntpos.c与postpos.c
[学习]RTKLib详解:rtkcmn.c与rtkpos.c
[学习]RTKLib详解:ppp.c与ppp_ar.c
[学习]RTKLib详解:ephemeris.c与rinex.c
文章目录
- RTKLib详解: `datum.c`、`download.c` 与 `lambda.c`
- Part A: datum.c 文件解析
- 一、文件整体说明
- 二、执行流程与函数调用关系
- 三、主要函数说明
- 3.1 `read_datumpars`
- 3.2 `convert_coordinates`
- 3.3 `datum_transform`
- 3.4 `xyz2enu`
- 四、关键算法数学原理与推导
- 七参数法(Bursa-Wolf 模型)
- Part B: download.c 文件解析
- 一、文件整体说明
- 二、执行流程与函数调用关系
- 三、主要函数说明
- 3.1 `parse_url`
- 3.2 `open_connection`
- 3.3 `download_file`
- 3.4 `write_to_disk`
- 四、关键算法数学原理与推导
- 数据校验与断点续传
- Part C: lambda.c 文件解析
- 一、文件整体说明
- 二、执行流程与函数调用关系
- 三、主要函数说明
- 3.1 `lambda_init`
- 3.2 `reduce_covariance`
- 3.3 `search_integer`
- 四、关键算法数学原理与推导
- LAMBDA 方法核心步骤
Part A: datum.c 文件解析
一、文件整体说明
datum.c
是 RTKLIB 中用于坐标系统转换和基准转换的核心模块。它实现了不同坐标系(如 WGS84、ITRF、本地坐标系)之间的转换,并支持基于七参数法(Bursa-Wolf 模型)的基准面变换。该文件广泛用于 GNSS 数据预处理和后处理中的坐标系统对齐。
主要功能:
- 实现不同地球坐标系(ECEF)之间的转换。
- 支持七参数法(平移、旋转、缩放)基准转换。
- 提供地理坐标(LLH)与 ECEF 的相互转换。
主要特色:
- 支持多种标准坐标系(如 ITRFyy, PZ90)。
- 可扩展性强,便于添加新的基准参数。
- 高精度计算,适用于精密定位场景。
二、执行流程与函数调用关系
程序执行流程如下:
- 加载基准参数(如七参数)。
- 将输入坐标转换为 ECEF 格式。
- 应用基准转换模型进行坐标变换。
- 输出目标坐标系下的结果。
函数调用关系如下:
三、主要函数说明
3.1 read_datumpars
int read_datumpars(const char *file, double *params)
功能:
从文件中读取七参数(平移、旋转、缩放)基准参数。
输入参数:
file
: 参数文件路径。params
: 存储参数的数组(7 个值)。
返回值:
- 成功返回 1,失败返回 0。
3.2 convert_coordinates
int convert_coordinates(int from, int to, double *pos, double *result)
功能:
主控函数,根据指定的源和目标坐标系进行转换。
输入参数:
from
: 源坐标系标识(如 COORD_WGS84)。to
: 目标坐标系标识。pos
: 输入坐标(如 LLH 或 XYZ)。result
: 输出转换后的坐标。
返回值:
- 成功返回 1,失败返回 0。
3.3 datum_transform
void datum_transform(const double *xyz, const double *params, double *xyz_out)
功能:
应用七参数法(Bursa-Wolf 模型)进行坐标转换。
输入参数:
xyz
: 输入 ECEF 坐标。params
: 七参数数组。xyz_out
: 输出转换后的 ECEF 坐标。
3.4 xyz2enu
void xyz2enu(const double *pos, const double *xyz, double *enu)
功能:
将 ECEF 坐标转换为本地东-北-天(ENU)坐标系。
输入参数:
pos
: 参考点的地理坐标(LLH)。xyz
: 输入 ECEF 坐标。enu
: 输出 ENU 坐标。
四、关键算法数学原理与推导
七参数法(Bursa-Wolf 模型)
七参数法通过以下公式实现坐标转换:
X t a r g e t = T + ( 1 + s ) R ⋅ X s o u r c e 其中 T = [ Δ x Δ y Δ z ] , R = [ 1 − γ β γ 1 − α − β α 1 ] \begin{aligned} \mathbf{X}_{target} &= \mathbf{T} + (1 + s)\mathbf{R} \cdot \mathbf{X}_{source} \\ \text{其中 } \mathbf{T} &= \begin{bmatrix} \Delta x \\ \Delta y \\ \Delta z \end{bmatrix}, \quad \mathbf{R} = \begin{bmatrix} 1 & -\gamma & \beta \\ \gamma & 1 & -\alpha \\ -\beta & \alpha & 1 \end{bmatrix} \end{aligned} Xtarget其中 T=T+(1+s)R⋅Xsource= ΔxΔyΔz ,R= 1γ−β−γ1αβ−α1
- Δ x , Δ y , Δ z \Delta x, \Delta y, \Delta z Δx,Δy,Δz: 平移参数。
- α , β , γ \alpha, \beta, \gamma α,β,γ: 旋转参数(弧度)。
- s s s: 尺度因子(单位 ppm)。
该模型广泛用于不同基准面之间的高精度转换。
Part B: download.c 文件解析
一、文件整体说明
download.c
是 RTKLIB 中用于从网络资源下载 GNSS 相关数据的工具。它支持 HTTP、FTP 协议,可自动解析 URL 并下载星历、观测文件、精密轨道等数据。该模块是 RTKLIB 实现自动化数据处理的关键组件。
主要功能:
- 通过 HTTP/FTP 下载文件。
- 支持断点续传和代理设置。
- 自动解析文件名和路径。
主要特色:
- 跨平台兼容性(Windows/Linux)。
- 支持 HTTPS 和 FTPS 加密协议。
- 可配置超时和重试机制。
二、执行流程与函数调用关系
程序执行流程如下:
- 解析命令行参数和 URL。
- 建立网络连接。
- 发送 HTTP/FTP 请求并接收响应。
- 写入本地文件并关闭连接。
函数调用关系如下:
三、主要函数说明
3.1 parse_url
int parse_url(const char *url, char *host, char *path, int *port)
功能:
解析 URL 为服务器地址、路径和端口。
输入参数:
url
: 完整的 URL。host
: 输出服务器主机名。path
: 输出文件路径。port
: 输出端口号。
返回值:
- 成功返回 1,失败返回 0。
3.2 open_connection
int open_connection(const char *host, int port)
功能:
建立 TCP 连接或 SSL 连接(HTTPS/FTPS)。
输入参数:
host
: 服务器地址。port
: 端口号。
返回值:
- 成功返回 socket 描述符,失败返回 -1。
3.3 download_file
int download_file(int sock, const char *path, FILE *fp)
功能:
发送 HTTP/FTP 请求并接收数据流。
输入参数:
sock
: 网络连接描述符。path
: 文件路径。fp
: 文件指针(用于写入数据)。
返回值:
- 成功返回 1,失败返回 0。
3.4 write_to_disk
int write_to_disk(FILE *fp, const char *buffer, size_t size)
功能:
将下载的数据块写入本地文件。
输入参数:
fp
: 文件指针。buffer
: 数据缓冲区。size
: 数据长度。
返回值:
- 成功返回写入字节数,失败返回 -1。
四、关键算法数学原理与推导
数据校验与断点续传
断点续传通过 HTTP Range 请求实现:
Range: bytes= s t a r t b y t e - e n d b y t e \text{Range: bytes=}start_byte\text{-}end_byte Range: bytes=startbyte-endbyte
服务器响应状态码 206 Partial Content
,客户端合并多个片段以完成完整文件下载。此机制提高了大文件传输的可靠性。
Part C: lambda.c 文件解析
一、文件整体说明
lambda.c
实现了 LAMBDA(Least-squares AMBiguity Decorrelation Adjustment)方法,用于 GNSS 整周模糊度固定。它是 RTK 定位中关键的整数优化算法模块,直接影响定位精度。
主要功能:
- 整周模糊度浮点解到整数解的转换。
- 降相关变换(如 LLL 算法)。
- 整数最小二乘搜索。
主要特色:
- 高效的搜索策略。
- 支持多频段和多系统。
- 可配置搜索阈值和维度。
二、执行流程与函数调用关系
程序执行流程如下:
- 初始化模糊度协方差矩阵。
- 应用降相关变换(如 LLL)。
- 执行整数最小二乘搜索。
- 输出最优整数解。
函数调用关系如下:
三、主要函数说明
3.1 lambda_init
int lambda_init(int n, double *Q, double *a)
功能:
初始化模糊度协方差矩阵和浮点解。
输入参数:
n
: 模糊度维度。Q
: 协方差矩阵(上三角存储)。a
: 浮点解向量。
返回值:
- 成功返回 1,失败返回 0。
3.2 reduce_covariance
int reduce_covariance(int n, double *Q, double *Z)
功能:
应用 LLL 算法对协方差矩阵进行降相关变换。
输入参数:
n
: 维度。Q
: 协方差矩阵。Z
: 输出变换矩阵。
返回值:
- 成功返回 1,失败返回 0。
3.3 search_integer
int search_integer(int n, const double *Q, const double *a, double *a_int)
功能:
执行整数最小二乘搜索,寻找最优整数解。
输入参数:
n
: 维度。Q
: 降相关后的协方差矩阵。a
: 浮点解。a_int
: 输出整数解。
返回值:
- 成功返回 1,失败返回 0。
四、关键算法数学原理与推导
LAMBDA 方法核心步骤
-
降相关变换:
通过正交变换矩阵 Z Z Z 使协方差矩阵 Q a ~ Q_{\tilde{a}} Qa~ 对角化:Q a ~ ′ = Z T Q a ~ Z Q_{\tilde{a}}' = Z^T Q_{\tilde{a}} Z Qa~′=ZTQa~Z
-
整数最小二乘搜索:
寻找满足:min a ∈ Z n ( a ~ − a ) T Q a ~ − 1 ( a ~ − a ) \min_{\mathbf{a} \in \mathbb{Z}^n} (\mathbf{\tilde{a}} - \mathbf{a})^T Q_{\tilde{a}}^{-1} (\mathbf{\tilde{a}} - \mathbf{a}) a∈Znmin(a~−a)TQa~−1(a~−a)
的最优整数解 a \mathbf{a} a。
该方法显著降低了搜索空间复杂度,是当前 GNSS 模糊度固定的标准算法。
研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)
相关文章:
[学习]RTKLib详解:convkml.c、convrnx.c与geoid.c
RTKLib详解: datum.c、download.c 与 lambda.c 本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解ÿ…...

Qwen智能体qwen_agent与Assistant功能初探
Qwen智能体qwen_agent与Assistant功能初探 一、Qwen智能体框架概述 Qwen(通义千问)智能体框架是阿里云推出的新一代AI智能体开发平台,其核心模块qwen_agent.agent提供了一套完整的智能体构建解决方案。该框架通过模块化设计,将L…...
LayerNorm vs RMSNorm 技术对比
1. 核心概念 LayerNorm (层归一化) 思想:对单个样本的所有特征维度进行归一化目标:使每个样本的特征分布 μ 0 \mu0 μ0, σ 1 \sigma1 σ1特点:同时调整均值和方差 RMSNorm (均方根归一化) 思想:基于均方根的简…...

可视化图解算法37:序列化二叉树-II
1. 题目 描述 请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。 二叉树的序列化(Serialize)是指:把一棵二叉树按照某种遍…...

C++GO语言微服务和服务发现②
01 创建go-micro项目-查看生成的 proto文件 02 创建go-micro项目-查看生成的main文件和handler ## 创建 micro 服务 命令:micro new --type srv test66 框架默认自带服务发现:mdns。 使用consul服务发现: 1. 初始consul服务发现&…...

【Web前端开发】CSS基础
2.CSS 2.1CSS概念 CSS是一组样式设置的规则,称为层叠样式表,用于控制页面的外观样式。 使用CSS能够对网页中元素位置的排版进行像素控制,实现美化页面的效果,也能够做到页面的样式和结构分离。 2.2基本语法 通常都是ÿ…...
Google LLM prompt engineering(谷歌提示词工程指南)
文章目录 基本概念AI输出配置:调整AI的回答方式输出长度温度(Temperature)Top-K和Top-P 提示技术:让AI更好地理解你零样本提示(Zero-shot)少样本提示(Few-shot)系统提示(…...
接口出现 请求参数格式错误 的解决方法
目录 前言1. 问题所示2. 原理分析3. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn Java基本知识: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理…...

Git实战经验分享:深入掌握git commit --amend的进阶技巧
一、工具简介 git commit --amend是Git版本控制系统的核心补救命令,主要用于修正最近一次提交的元数据。该命令不会产生新的提交记录,而是通过覆盖原提交实现版本历史的整洁性,特别适合在本地仓库进行提交优化。 二、核心应用场景 提交信息…...

PTA:jmu-ds-最短路径
给定一个有向图,规定源点为0,求源点0到其他顶点最短路径。###你要实现的 函数接口定义: void Dijkstra(MGraph g,int v);//源点v到其他顶点最短路径 裁判测试程序样例: #include <stdio.h> #include <iostream> …...
Uniapp编写微信小程序,使用canvas进行绘图
一、canvas文档: https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial 二、数据绘制(单位是像素): 1、绘制文本: 文字的长度超过设置的最大宽度,文字会缩在一起 ① 填充文本…...

WEB UI自动化测试之Pytest框架学习
文章目录 前言Pytest简介Pytest安装Pytest的常用插件Pytest的命名约束Pytest的运行方式Pytest运行方式与unittest对比主函数运行命令行运行执行结果代码说明 pytest.ini配置文件方式运行(推荐)使用markers标记测试用例 pytest中添加Fixture(测…...

深入理解 iOS 开发中的 `use_frameworks!`
在使用 CocoaPods 管理 iOS 项目依赖时,开发者经常会在 Podfile 文件中看到一个配置选项:use_frameworks!。本文将详细介绍这个配置选项的含义,以及如何决定是否在项目中使用它。 一、什么是 use_frameworks! 在 CocoaPods 中引入第三方库时…...

矩阵置零算法讲解
矩阵置零算法讲解 一、问题描述 给定一个 (m \times n) 的矩阵,如果一个元素为 (0) ,则将其所在行和列的所有元素都设为 (0) 。要求使用原地算法,即在不使用额外矩阵空间的情况下完成操作。 二、解题思路 暴力解法 最直观的想法是遍历矩阵,当遇到 (0) 元素时,直接将其…...

二本计算机,毕业=失业?
我嘞个豆,二本计算机,毕业即失业?! 今天咱们聊聊普通院校计算机专业的学生未来的发展方向。有些话可能不太中听,但希望大家能理性看待。 首先得承认,对于普通双非和二本的学生来说,就业率加上…...
Java 并发编程挑战:从原理到实战的深度剖析与解决方案
Java 作为企业级应用开发的主流语言,其多线程能力是支撑高并发场景的核心。然而,线程安全、死锁、性能瓶颈等问题仍是开发者难以绕过的暗礁。本文将从 JVM 内存模型、并发工具链到实际案例,系统性揭示 Java 并发编程的挑战与解决方案…...
机器学习第六讲:向量/矩阵 → 数据表格的数学表达,如Excel表格转数字阵列
机器学习第六讲:向量/矩阵 → 数据表格的数学表达,如Excel表格转数字阵列 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:…...

[docker基础二]NameSpace隔离实战
目录 一 实战目的 二 基础知识 1)dd 命令详解 2)mkfs命令详解 3)df命令详解 4)mount 命令详解 5)unshare命令详解 三 实战操作一(PID隔离) 四 实战操作二(MOunt隔离) 1)创建 Mount 隔离进程 2)在新进程里边,创建空白文件&#…...

Day22打卡-复习
复习日 仔细回顾一下之前21天的内容,没跟上进度的同学补一下进度。 作业: 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码 泰坦尼克号人员生还预测https://www.kaggle.com/competitions/titanic/overview K…...
Express知识框架
一、核心概念 1. Express 简介 Node.js 的 Web 框架,提供 HTTP 服务器封装 轻量级但灵活,支持中间件扩展 基于路由,支持 RESTful API 和传统 MVC 架构 无内置 ORM 或模板引擎,但可集成第三方库 2. 核心对象 express() - 创建…...

uniapp + vue3 + 京东Nut动作面板组件:实现登录弹框组件(含代码、案例、小程序截图)
uniapp + vue3 + 京东Nut动作面板组件:实现登录弹框组件(含代码、案例、小程序截图) 代码示下,不再赘述。 动作面板组件:https://nutui-uniapp.netlify.app/components/feedback/actionsheet.html 项目背景 业务需求 描述: uniapp + vue3 + 京东Nut框架:实现登录弹框组…...

C++类和对象--中阶
C类和对象中阶 01. 类的6个默认成员函数 在 C 中,类有 6 个特殊的默认成员函数(不是 6 个构造函数),它们会在特定情况下由编译器自动生成。包括构造函数,析构函数,拷贝构造和赋值运算符重载,取…...
OSPF的四种特殊区域(Stub、Totally Stub、NSSA、Totally NSSA)详解
OSPF的四种特殊区域(Stub、Totally Stub、NSSA、Totally NSSA)通过限制LSA的传播来优化网络性能,减少路由表规模。以下是它们的核心区别: 1. Stub 区域(末梢区域) 允许的LSA类型:Type 1-3&#…...

数据签名在区块链中的独特应用与挑战
随着信息技术的飞速发展,分布式系统因其高效、可靠、可扩展等显著优点,在众多领域得到了极为广泛的应用。分布式系统通过网络将多个独立的计算节点连接在一起,协同完成复杂的任务,这种架构使得系统具备了强大的容错能力和负载均衡…...

数据可视化大屏——物流大数据服务平台(二)
代码分析: 物流大数据平台代码分析 这是一个基于 Bootstrap 和 ECharts 构建的物流大数据平台前端页面,设计采用了经典的三栏布局,主要展示河南省及全国的物流数据可视化内容。下面从多个维度进行分析: 1. 页面结构分析 整体采…...
5倍无损压缩+50 倍速转换HD Video 4K/8K 视频处理
各位视频处理小达人们,我跟你们说啊!有个超厉害的专业视频处理软件,叫HD Video Converter Factory Pro,简称HDVC,是WonderFox公司开发的。这软件功能老强大了,下面我给你们详细唠唠! 先说说它的…...
Vue学习百日计划-Deepseek版
阶段1:基础夯实(Day 1-30) 目标:掌握HTML/CSS/JavaScript基础,理解Vue核心概念和基础语法。 每日学习内容(2小时): HTML/CSS(Day 1-10) 学习HTML标签语义化…...

Maven 处理依赖冲突
Maven处理依赖冲突 什么是依赖冲突?如何解决?Maven自动处理依赖冲突的规则路径优先原则第一声明优先原则注意 子模块覆盖父模块父模块声明dependency子模块覆盖dependency父模块声明dependencyManagement 子模块覆盖dependency父模块声明dependencyManag…...

5.12第四次作业
实验要求:完成上图内容,要求五台路由器的环回地址均可以相互访问 AR1 AR2 AR3 AR4 AR5 AS 200 ospf配置 AR2 AR3 AR4 BGP配置 AR1(AS100) AR2(AS200) AR4 AR5(AS300) 结果...

【Lattice FPGA 开发】Diamond在线调试Reveal逻辑乱跳的解决
在Vivado中在always块中写逻辑时如果出现always块中的异步复位敏感词在块内部未使用的情况,如下例的rst: always (posedge clk or posedge rst) begin if(~tx_sense_flag)o_rd_adr < d1;else if((o_rd_adr d94) & (bit_cnt d7))o_rd_adr <…...