RTKLib详解:rtkcmn.c与rtkpos.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详解:sbas.c与rtcm.c
[学习]RTKLib详解:rtksvr.c与streamsvr.c
[学习]RTKLib详解:convkml.c、convrnx.c与geoid.c
[学习]RTKLib详解:datum.c、download.c与lambda.c
[学习]RTKLib详解:ionex.c、options.c与preceph.c
[学习] RTKLib详解:qzslex.c、rcvraw.c与solution.c
Part A、Rrtkcmn.c
一、总体功能
r t k c m n . c rtkcmn.c rtkcmn.c 是RTKLIB的核心公共模块,是GNSS数据处理的核心,涵盖了从原始观测数据到高精度定位解算的全流程,依赖高效的矩阵运算与数值方法(如卡尔曼滤波),实现动态环境下的实时定位,主要提供以下四类功能:
- 时间系统转换:GPS时间、UTC时间、年月日时分秒等格式的相互转换,如 g p s t 2 u t c ( ) gpst2utc() gpst2utc()
- 坐标系统转换:地心地固坐标系(ECEF)与大地坐标系(WGS84)的相互转换,如 e c e f 2 p o s ( ) ecef2pos() ecef2pos()
- 矩阵运算:提供基础线性代数运算,支持最小二乘解算等算法需求,如 m a t m u l ( ) matmul() matmul()
- 数据校验:实现GNSS通信协议中使用的CRC24Q、CRC32等校验算法,如 c r c 24 q ( ) crc24q() crc24q()
二、关键API列表
| 分类 | 函数原型 | 功能说明 |
|---|---|---|
| 时间转换 | void gpst2utc(const gtime_t t, double *utc) |
GPS时间转UTC时间 |
| 坐标转换 | void ecef2pos(const double *r, double *pos) |
ECEF转经纬高(WGS84) |
| 矩阵运算 | void matcpy(double *A, const double *B, int n, int m) |
矩阵复制 |
| 数据校验 | uint32_t crc24q(const uint8_t *buff, int len) |
计算CRC24Q校验值 |
| 几何计算 | double geodist(const double *rs, const double *rr) |
计算卫星与接收机几何距离 |
三、核心算法实现
-
CRC校验算法:
- 使用查表法优化计算速度
- 多项式定义:
#define POLYCRC24Q 0x1864CFBu /* CRC24Q多项式 */ - 实现特点:逐字节异或运算,支持数据流式处理
-
坐标转换算法:
- 使用迭代法求解大地纬度
ϕ k + 1 = arctan ( z + e ′ 2 b sin 3 θ ( p − e 2 a cos 3 θ ) ) \phi_{k+1} = \arctan\left(\frac{z + e'^2 b \sin^3\theta}{(p - e^2 a \cos^3\theta)}\right) ϕk+1=arctan((p−e2acos3θ)z+e′2bsin3θ)
其中 p = x 2 + y 2 p=\sqrt{x^2+y^2} p=x2+y2, θ = arctan ( z a / p b ) \theta=\arctan(z a / p b) θ=arctan(za/pb)
- 使用迭代法求解大地纬度
-
矩阵运算优化:
- 内存连续存储提高缓存命中率
- 使用
memcpy实现矩阵快速复制 - 矩阵求逆采用LU分解法:
A = P L U ⇒ A − 1 = U − 1 L − 1 P T A = PLU \Rightarrow A^{-1} = U^{-1}L^{-1}P^T A=PLU⇒A−1=U−1L−1PT
四、函数功能与参数说明
1. uniqnav
- 功能:清理导航数据中的重复星历,更新载波波长。
- 输入:
nav_t *nav(导航数据结构)。 - 输出:无返回值,修改
nav中的星历数据与波长表。
2. lsq
- 功能:加权最小二乘估计,求解参数
x及协方差矩阵Q。 - 输入:
const double *A:设计矩阵的转置(n×m)。const double *y:观测向量(m×1)。int n, m:参数数量与观测数。
- 输出:
double *x:估计参数(n×1)。double *Q:协方差矩阵(n×n)。
3. filter
- 功能:卡尔曼滤波更新步骤,计算增益矩阵
K并修正状态与协方差。 - 输入:
double *x, *P:当前状态与协方差。const double *H, *v, *R:观测矩阵转置、残差、观测噪声协方差。int n, m:状态数与观测数。
- 输出:
double *xp, *Pp:更新后的状态与协方差。
4. matmul
- 功能:矩阵乘法(支持转置),计算
C = alpha*A*B + beta*C。 - 输入:
const char *tr:转置标志(“N”/“T”)。int n, k, m:矩阵维度。double alpha, beta:标量系数。
- 输出:结果矩阵
C(n×k)。
5. satazel
- 功能:计算卫星方位角与仰角。
- 输入:
const double *pos:接收机地心坐标(纬度、经度、高度)。const double *e:卫星至接收机单位向量(ECEF)。
- 输出:
double *azel:方位角(02π)与仰角(-π/2π/2)。
6. ionmapf
- 功能:电离层映射函数(投影因子),将垂直延迟转换为斜路径延迟。
- 输入:
const double *pos:接收机位置(纬度、经度、高度)。const double *azel:卫星方位角/仰角。
- 输出:返回斜路径与垂直路径延迟比值。
7. geodist
- 功能:计算接收机与卫星之间的几何距离(含地球自转修正)。
- 输入:
const double *rs:卫星位置(ECEF)。const double *rr:接收机位置(ECEF)。
- 输出:修正后的几何距离(米)。
8. timeadd
- 功能:对时间结构
gtime_t增加指定秒数。 - 输入:
gtime_t t:原始时间。double sec:秒数(可为负)。
- 输出:更新后的时间结构。
9. dgetrf_ / dgetri_(LAPACK接口)
- 功能:LU分解与矩阵求逆(底层线性代数运算)。
- 输入:
int *n:矩阵阶数。double *A:输入矩阵。
- 输出:分解后的矩阵或逆矩阵。
五、工作流程说明
4.1 模块在RTKLib中的位置
在RTKlib内部,该模块调关系如下所示:
4.2 整体作用与工作流程分析
该代码是RTKLIB库的核心模块(rtkcmn.c),实现了GNSS数据处理中的基础功能,包括:
- 导航数据处理:管理卫星轨道、钟差、电离层模型等数据。
- 观测数据处理:观测值去重、筛选、时间同步。
- 矩阵运算:线性代数运算(乘法、求逆、最小二乘解)。
- 卡尔曼滤波:状态更新与协方差矩阵调整。
- 时空转换:坐标系转换(ECEF/ENU)、时间系统转换(GPS/UTC)。
- 卫星几何计算:方位角/仰角、相位缠绕修正、潮汐效应。
工作流程:
- 输入:原始观测数据、导航电文、配置参数。
- 处理:通过矩阵运算和卡尔曼滤波优化定位解,结合星历数据计算卫星位置,修正观测值误差(如电离层延迟)。
- 输出:高精度定位结果(位置、速度、时间)及质量指标(DOP值)。

最低0.47元/天 解锁文章
1306

被折叠的 条评论
为什么被折叠?



