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 模糊度固定的标准算法。
研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)