[学习]RTKLib详解:convkml.c、convrnx.c与geoid.c

发布于:2025-05-13 ⋅ 阅读:(16) ⋅ 点赞:(0)

RTKLib详解: datum.cdownload.clambda.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: datum.c 文件解析

一、文件整体说明

datum.c 是 RTKLIB 中用于坐标系统转换和基准转换的核心模块。它实现了不同坐标系(如 WGS84、ITRF、本地坐标系)之间的转换,并支持基于七参数法(Bursa-Wolf 模型)的基准面变换。该文件广泛用于 GNSS 数据预处理和后处理中的坐标系统对齐。

主要功能:

  • 实现不同地球坐标系(ECEF)之间的转换。
  • 支持七参数法(平移、旋转、缩放)基准转换。
  • 提供地理坐标(LLH)与 ECEF 的相互转换。

主要特色:

  • 支持多种标准坐标系(如 ITRFyy, PZ90)。
  • 可扩展性强,便于添加新的基准参数。
  • 高精度计算,适用于精密定位场景。

二、执行流程与函数调用关系

程序执行流程如下:

  1. 加载基准参数(如七参数)。
  2. 将输入坐标转换为 ECEF 格式。
  3. 应用基准转换模型进行坐标变换。
  4. 输出目标坐标系下的结果。

函数调用关系如下:

main
read_datumpars
convert_coordinates
datum_transform
xyz2enu
output_result

三、主要函数说明

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)RXsource= Δ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 加密协议。
  • 可配置超时和重试机制。

二、执行流程与函数调用关系

程序执行流程如下:

  1. 解析命令行参数和 URL。
  2. 建立网络连接。
  3. 发送 HTTP/FTP 请求并接收响应。
  4. 写入本地文件并关闭连接。

函数调用关系如下:

main
parse_url
open_connection
download_file
write_to_disk
close_connection

三、主要函数说明

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 算法)。
  • 整数最小二乘搜索。

主要特色:

  • 高效的搜索策略。
  • 支持多频段和多系统。
  • 可配置搜索阈值和维度。

二、执行流程与函数调用关系

程序执行流程如下:

  1. 初始化模糊度协方差矩阵。
  2. 应用降相关变换(如 LLL)。
  3. 执行整数最小二乘搜索。
  4. 输出最优整数解。

函数调用关系如下:

main
lambda_init
reduce_covariance
search_integer
validate_solution

三、主要函数说明

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 方法核心步骤
  1. 降相关变换:
    通过正交变换矩阵 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

  2. 整数最小二乘搜索:
    寻找满足:

    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}) aZnmin(a~a)TQa~1(a~a)

    的最优整数解 a \mathbf{a} a

该方法显著降低了搜索空间复杂度,是当前 GNSS 模糊度固定的标准算法。


研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)



网站公告

今日签到

点亮在社区的每一天
去签到