[学习]RTKLib详解:rtkcmn.c与rtkpos.c

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数据处理的核心,涵盖了从原始观测数据到高精度定位解算的全流程,依赖高效的矩阵运算与数值方法(如卡尔曼滤波),实现动态环境下的实时定位,主要提供以下四类功能:

  1. 时间系统转换:GPS时间、UTC时间、年月日时分秒等格式的相互转换,如 g p s t 2 u t c ( ) gpst2utc() gpst2utc()
  2. 坐标系统转换:地心地固坐标系(ECEF)与大地坐标系(WGS84)的相互转换,如 e c e f 2 p o s ( ) ecef2pos() ecef2pos()
  3. 矩阵运算:提供基础线性代数运算,支持最小二乘解算等算法需求,如 m a t m u l ( ) matmul() matmul()
  4. 数据校验:实现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) 计算卫星与接收机几何距离

三、核心算法实现

  1. CRC校验算法

    • 使用查表法优化计算速度
    • 多项式定义:
      #define POLYCRC24Q 0x1864CFBu  /* CRC24Q多项式 */
      
    • 实现特点:逐字节异或运算,支持数据流式处理
  2. 坐标转换算法

    • 使用迭代法求解大地纬度
      ϕ 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((pe2acos3θ)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)
  3. 矩阵运算优化

    • 内存连续存储提高缓存命中率
    • 使用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=PLUA1=U1L1PT

四、函数功能与参数说明

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内部,该模块调关系如下所示:

调用
调用
调用
rtkpos.c
rtkcmn.c
postpos.c
solution.c
矩阵运算
坐标转换
时间转换
4.2 整体作用与工作流程分析

该代码是RTKLIB库的核心模块(rtkcmn.c),实现了GNSS数据处理中的基础功能,包括:

  1. 导航数据处理:管理卫星轨道、钟差、电离层模型等数据。
  2. 观测数据处理:观测值去重、筛选、时间同步。
  3. 矩阵运算:线性代数运算(乘法、求逆、最小二乘解)。
  4. 卡尔曼滤波:状态更新与协方差矩阵调整。
  5. 时空转换:坐标系转换(ECEF/ENU)、时间系统转换(GPS/UTC)。
  6. 卫星几何计算:方位角/仰角、相位缠绕修正、潮汐效应。

工作流程

  • 输入:原始观测数据、导航电文、配置参数。
  • 处理:通过矩阵运算和卡尔曼滤波优化定位解,结合星历数据计算卫星位置,修正观测值误差(如电离层延迟)。
  • 输出:高精度定位结果(位置、速度、时间)及质量指标(DOP值)。

4.3 模块内部函数调用关系
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客不孤独

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值