文章目录
RTKLib详解:ephemeris.c与rinex.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: ephemeris.c
一、代码整体作用与工作流程分析
1.1 整体作用
该代码实现卫星星历与钟差计算的核心功能,支持多种卫星导航系统(GPS/Galileo/QZSS/北斗/GLONASS/SBAS),提供从广播星历、精密星历到SSR(State Space Representation)校正的多级精度支持,该代码通过模块化设计实现了多系统兼容,采用迭代法保证计算精度,结合误差模型和校正机制满足不同应用场景需求。主要功能包括:
- 卫星位置与速度计算(ECEF坐标系)
- 卫星钟差与钟漂计算
- 星历数据选择与有效性验证
- 坐标系旋转与相对论效应修正
- 误差方差建模(URA/SSR)
1.2 工作流程
二、核心函数说明
2.1 alm2pos (Almanac to Position)
功能: 通过卫星历书计算概略位置
输入:
time: 当前时间(GPST)alm: 阿尔曼历数据(alm_t结构体)
输出:rs: 卫星位置[x,y,z](m)dts: 钟差 (s)
数学原理:
- 计算平近点角 M = M0 + √(μ/A³) * tk
- 牛顿迭代法解开普勒方程 E = M + e·sinE
- 真近点角转换: ν = atan2(√(1-e²)sinE, cosE - e)
- 极坐标到直角坐标转换: r = A(1 - e·cosE)
2.2 eph2clk (Ephemeris to Clock)
功能: 广播星历钟差计算
输入:
time: 卫星时钟时间(GPST)eph: 广播星历数据(eph_t结构体)
输出:- 返回钟差 Δt = f0 + f1·t + f2·t²
特性: 双次迭代消除时间依赖性
2.3 eph2pos (Ephemeris to Position)
功能: 广播星历卫星位置计算
数学流程:
关键公式:
- 开普勒方程:E = M + e·sinE (迭代收敛精度1e-14)
- 相对论修正项:Δt_rel = -2√(μA)/c² * e·sinE
- 坐标旋转矩阵:涉及升交点赤经Ω的时变特性
2.4 geph2pos (GLONASS Ephemeris)
特殊性:
- 使用数值积分法解算轨道微分方程
- 包含地球扁率J2和自转角速度Ω的摄动项
- 微分方程形式:ẍ = [c+Ω²]x + 2Ωẏ + ax
2.5 satpos_ssr (SSR校正)
校正流程:
- 获取轨道偏差Δr [径向/切向/横向]
- 获取钟差校正Δt = dclk[0] + dclk[1]·t + dclk[2]·t²
- 天线相位中心修正
- 方差计算采用SSR URA模型
三、核心算法数学推导
3.1 开普勒方程求解
标准形式:
M = E − e sin E M = E - e \sin E M=E−esinE
牛顿迭代公式:
E n + 1 = E n − E n − e sin E n − M 1 − e cos E n E_{n+1} = E_n - \frac{E_n - e \sin E_n - M}{1 - e \cos E_n} En+1=En−1−ecosEnEn−esinEn−M
代码实现中设置最大迭代次数 30 30 30 次,相对容差 1 0 − 14 10^{-14} 10

最低0.47元/天 解锁文章
1552

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



