ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

GNSS广播星历计算全解:RINEX 3.04解析与卫星位置Python实现

GNSS广播星历计算全解:RINEX 3.04解析与卫星位置Python实现 简介本资源是一套基于RINEX 3.03格式的多系统GNSS广播星历数据及配套计算程序面向卫星导航、测绘工程与GNSS算法开发领域的初学者与中级开发者用于理解广播星历结构、实现卫星位置解算及验证RINEX标准解析逻辑。压缩包共33个文件含9个C#源码文件如Form1.cs、Program.cs构成主计算逻辑5个缓存文件支持星历参数高效读取2个可执行程序.exe提供开箱即用的星历解析与轨道计算功能另有配置文件.config、资源文件.resx、项目定义.csproj及解决方案.sln等完整开发环境支撑组件总大小466KB结构规范、模块清晰。已有584人学习下载使用者可直接运行调试、深入理解广播星历时间系统转换、开普勒轨道参数播发机制及多系统GPS/BDS/GALILEO等星历统一处理流程并基于源码快速拓展至RINEX 3.04兼容性适配与精度验证。 搞GNSS数据处理的朋友十有八九都跟RINEX文件打过交道。尤其是做PPP、精密单点定位或者自己写定位解算程序的时候手里拿到的观测文件一般不是事真正让人头疼的是怎么把广播星历用起来——从RINEX 3.04导航文件里把几十个参数读出来再算成卫星在ECEF坐标系下的位置和钟差这一套流程如果没理顺后面定位解算全白搭。这篇博文就把广播星历这条线完整捋一遍从RINEX 3.04文件解析到星历计算的核心公式再给出一份能直接上手的Python代码框架适合正在写GNSS数据处理程序、或者刚入坑需要对照资料做实现的同学参考。1. 广播星历在GNSS数据处理中的位置1.1 广播星历是什么能解决什么问题广播星历说白了就是导航卫星自己播发的轨道参数和钟差参数。每颗卫星通过L波段信号把这些参数实时发给用户地面接收机解调出来就能计算卫星在某一时刻的位置。它和我们常说的精密星历最大的区别在于精度和实时性广播星历精度一般在米级到分米级但胜在不依赖事后处理任何一台接收机开机就能用精密星历精度能做到厘米级甚至毫米级但需要IGS等机构事后提供实时场景下还得靠实时流服务。在GNSS数据处理链条里广播星历承担的是地基角色。伪距单点定位、SPS服务、实时动态定位的初始解、甚至部分RTK的浮点解都离不开广播星历提供的卫星位置。你要做定位解算第一步就是知道每颗卫星在信号发射时刻到底在哪儿这一步全靠星历。所以哪怕你的最终方案是精密星历PPP也绕不开广播星历做初始化和质量控制。实际写代码的时候广播星历的处理通常分三步从RINEX导航文件里提取参数把开普勒轨道参数代入系列公式计算卫星位置和速度最后再做钟差修正和坐标系统一。每一步都有坑我下面分节细说。1.2 为什么需要自己写星历计算代码有的朋友会说成熟的开源库比如RTKLIB、GPSTk、georinex不是都封装好了吗为什么还要自己写这个问题我自己也纠结过后来发现至少有三个理由值得自己动手。第一是理解数据本质。RINEX文件里的导航数据记录看起来就是一行行数字但每个数字对应什么物理量、单位是什么、用在哪个公式里只有自己手写一遍才能建立真正的直觉。用别人的库碰到异常数据时你只能看到计算失败四个字完全不知道问题出在哪个环节。第二是定制化需求。比如你要同时处理GPS和BDS还要对比不同版本的星历参数或者需要把星历计算嵌入到自己的实时解算流程里这时候通用库往往不够灵活。自己写的话精度控制、容错处理、输出格式都能按需设计。第三是排错效率。RTKLIB封装得比较黑盒RINEX文件里某些参数单位不一致或者格式异常时库的报错信息很泛。自己写的解析器你可以直接定位到哪一行数据有问题这在处理非标准数据源时尤其重要。当然我不是劝大家什么都自己造轮子。生产环境用成熟库没问题但作为博主我强烈建议至少把星历计算的核心公式亲手实现一遍跑通一个案例你的理解深度会完全不同。下面就从RINEX 3.04格式开始。2. RINEX 3.04导航文件解析实战2.1 RINEX 3.04文件结构速览RINEX 3.04是2018年发布的版本和早期的2.x相比3.04最大的变化是支持多系统混合文件文件命名规则也更灵活。一个典型的RINEX 3.04广播星历文件文件名类似BRDC00IGS_R_20240010000_01D_MN.rnx其中BRDC00IGS表示生成机构R表示导航文件20240010000是起始时间和文件时段MN表示混合导航文件包含多系统。文件内部由头段和数据记录两部分组成。头段用END OF HEADER标记结束里面包含文件版本、系统类型、时间系统修正参数、电离层参数等全局信息。数据记录部分则是逐颗卫星的星历参数每条记录以卫星PRN号开头后面跟多个小段数据。GPS和BDS的广播星历记录通常是8行GLONASS是4行Galileo也是类似的多行结构。新手最容易搞混的地方是两个第一同一份文件里不同系统的数据记录格式不一样解析时不能套用一种行数第二RINEX 3.04的数据记录里单位并不完全统一部分系统的时间基准也各不相同解析时要做归一化。我自己常用的做法是先把文件按行读入内存记录头段信息然后逐段定位到卫星数据块按系统类型分发到对应的解析函数。这样结构清晰也方便后续扩展新系统。2.2 导航文件头段信息与时间系统头段信息看着不起眼但处理多系统数据时非常关键。举两个我踩过的例子。第一个是时间系统修正参数。RINEX 3.04头段里有TIME SYSTEM CORR字段记录GPST-UTC、GAL-GPST、BDS-GPST等系统之间的时间差。如果你要把某一颗北斗卫星的星历时间统一到GPST就必须读这个字段做修正。否则你算出来的卫星位置沿轨道方向会偏出几十米甚至更远。第二个是电离层参数。RINEX 3.04头段有IONOSPHERIC CORR字段GPS的Klobuchar模型参数、BDS的北斗电离层模型参数都记录在这里。虽然广播星历计算本身不需要电离层参数但你在做单频定位的时候这些参数就是修正电离层延迟的唯一依据。解析头段时顺手把它们存下来后面定位时就不需要再从别的文件里找了。头段解析的细节其实不难主要是注意字段宽度和字符串截取。RINEX格式对列位置有严格要求一个字符错位就可能读到错误数据。我的建议是严格按照官方格式说明截取字段不要用简单的按空格切分因为某些字段是负数和空格混合按空格切会出错。2.3 数据记录格式与易错点进入数据记录部分真正容易出问题的地方来了。以GPS为例一行数据记录包含卫星PRN号、历元、星历参数等。第一行是卫星号和历元年、月、日、时、分、秒以及星历的钟差参数af0、af1、af2。第二行到第八行才是轨道参数和摄动参数G01-G07七个字段一组。易错点主要有这三个负号处理RINEX文件里负号用-字符但有时候会和空格连在一起比如-1.234567890000e01前面没有空格。解析时最好用float()直接转换字符串确保字符串截取范围正确。参数顺序GPS第二行以IODE开头接着是Crs、Δn、M0。很多新手会把Crs和Crc、Cus和Cuc搞混因为它们的名字太像了。建议对照RINEX 3.04官方文档逐字段核对或者干脆在代码里给每个字段起一个明确名字不要用data[0]data[1]这种索引。系统间差异BDS的GEO卫星轨道约束和GPS不同计算时需要不同的参考系GLONASS用的是直角坐标和速度分量不是开普勒参数需要单独处理。如果一个函数统吃所有系统绝对会算出离谱的结果。另外要注意的是某些非官方数据源或者转换工具生成的RINEX文件天线的相位中心偏移参数可能没填全或者头段里的版本号与实际内容不符。解析之前最好做一个格式自检比如检查文件中是否包含RINEX VERSION / TYPE字段卫星号是否在合法范围内避免后续计算被脏数据带偏。3. 广播星历计算核心流程3.1 轨道参数与物理量含义广播星历计算卫星位置本质上是在二体问题基础上加各种摄动修正。GPS和BDS、Galileo用的都是开普勒轨道参数加调和摄动修正的思路核心参数可以分为三组。第一组是轨道形状和方位参数轨道半长轴的平方根sqrt(A)、轨道偏心率e、轨道倾角i0、升交点赤经Ω0、近地点角距ω、平近点角M0。这六个参数决定了卫星的基准轨道。第二组是摄动修正参数Crs径向余弦调和修正、Crc径向正弦调和修正、Cus纬度辐角余弦修正、Cuc纬度辐角正弦修正、Cis倾角余弦修正、Cic倾角正弦修正。这些参数用来修正地球非球形引力、日月引力等引起的轨道偏差。第三组是长周期改正参数Δn平均角速度修正、IDOT轨道倾角变化率、Ω_DOT升交点赤经变化率。这三个参数反映了轨道随时间缓慢变化的趋势。搞清这些参数的含义代入公式的时候就不会一头雾水。比如算出来的uk是修正后的纬度辐角rk是修正后的向径ik才是计算ECEF坐标时真正用的轨道倾角而不是直接用初始的i0。3.2 卫星位置计算详细步骤从参数到ECEF坐标的完整流程我按GPS的标准算法列在下面每步都给出公式。这些公式在IS-GPS-200文档里都能查到我这里用看得懂的方式重写一遍。第一步计算轨道半长轴和平均角速度A (sqrt(A))^2n0 sqrt(GM / A^3)其中 GPS 的 GM 为3.986005e14 m^3/s^2。 然后修正平均角速度n n0 Δn。第二步计算从参考历元到目标时刻的时间差tk t - toe。注意t是信号发射时间toe是星历参考时刻两者都要统一到同一时间系统。当tk较大超过一定阈值时星历的精度会下降一般建议在±7200s内使用否则要考虑更换星历。第三步计算平近点角Mk M0 n * tk。第四步迭代求解偏近点角EkMk Ek - e * sin(Ek)。这个方程没有解析解需要用牛顿迭代法一般迭代5次以内就能收敛到1e-12的精度。给初始值Ek Mk然后反复迭代Ek Mk e * sin(Ek)直到收敛。第五步计算真近点角vkvk atan2(sqrt(1 - e^2) * sin(Ek), cos(Ek) - e)。用atan2函数而不是atan确保象限正确。第六步计算纬度辐角并加入摄动修正Φk vk ωδuk Cus * sin(2*Φk) Cuc * cos(2*Φk)δrk Crs * sin(2*Φk) Crc * cos(2*Φk)δik Cis * sin(2*Φk) Cic * cos(2*Φk)然后修正uk Φk δukrk A * (1 - e * cos(Ek)) δrkik i0 δik IDOT * tk第七步计算升交点赤经Ωk Ω0 (Ω_DOT - ωe) * tk - ωe * toe这里ωe为地球自转角速度值为7.2921151467e-5 rad/s。第八步计算轨道平面内坐标再转换到ECEFx rk * cos(uk) y rk * sin(uk) X x * cos(Ωk) - y * cos(ik) * sin(Ωk) Y x * sin(Ωk) y * cos(ik) * cos(Ωk) Z y * sin(ik)到这里卫星在ECEF坐标系下的三维坐标就出来了。整个过程看着公式不少但其实就是绕开普勒参数做一系列标量运算代码实现并不复杂。3.3 卫星钟差与相对论修正卫星位置算完接下来是钟差修正。星历参数给了三个钟差系数af0、af1、af2对应卫星钟相对于系统时间的偏差、频漂和频漂率。卫星钟差计算公式是Δt_sv af0 af1 * (t - toc) af2 * (t - toc)^2其中toc是钟参数的参考时刻通常在星历数据里给出。注意这里用的是toc而不是toe虽然大多数情况下两者相同但字段不同、含义不同别直接混用。光有这项还不够还得加上相对论效应修正。卫星在轨道上运动时间流速和地面不同这个效应等效于一个周期性的钟差公式为Δt_r -2 * sqrt(GM * A) * e * sin(Ek) / c^2工程上常用近似值Δt_r -4.442807633e-10 * e * sqrt(A) * sin(Ek)。 最终卫星钟差 Δt_sv Δt_r。我在实际调试中经常看到有人漏掉相对论修正结果伪距残差呈现出明显的周期性波动幅度能达到十几米。如果你发现计算出来的残差和卫星轨道周期吻合的周期性信号大概率就是相对论修正没加。3.4 GPS、BDS、Galileo、GLONASS的计算差异现在处理多系统数据是常态每个系统的星历计算都有自己的一些脾气。GPS作为基准系统算法最标准按IS-GPS-200实现即可。我的建议是先把GPS彻底跑通再拓展其他系统。北斗的BDS-2和BDS-3混在一起看。BDS-2的GEO地球同步轨道卫星比较特殊它用的是地球固定坐标系下的Ω修正计算时不能直接用GPS那套Ωk公式需要绕一个弯先把GEO卫星的坐标从轨道坐标系转到地固系再做极移和章动修正最后转到ECEF。BDS-3的MEO和IGSO卫星则和GPS差异不大只是时间系统要用北斗时BDTBDT和GPST相差14秒目前星历参数表里toc是BDT时刻。具体的系统时差RINEX头段的TIME SYSTEM CORR字段会给。Galileo和GPS类似采用开普勒参数时间系统是GST。GST相对GPST存在一个由闰秒导致的时差目前是几十秒量级。如果你把Galileo星历的toe直接当GPST用位置误差会非常大。处理Galileo时同样要读头段的GAL-GPST时差参数做统一。GLONASS则是完全不同的路子它不播发开普勒轨道参数而是播发卫星在PZ-90坐标系下的位置、速度和加速度甚至有时只有位置和速度。计算GLONASS卫星位置需要对运动方程做数值积分时间步长典型值为60秒步长太大精度不够步长太小计算量大。RTKLIB里用的是四阶Runge-Kutta积分我也推荐用这个方案。GLONASS星历精度相对较差广播星历轨道误差常在数米到十米量级处理时需要注意。这部分内容多但要义就一句话不要把GPS算法无脑套到其他系统上各系统的时间和坐标参考必须单独处理。4. 从参数到坐标Python实现关键代码4.1 解析RINEX 3.04导航文件的核心框架解析导航文件时我习惯写一个解析器类把不同系统的数据分开存储。下面给一个精简版框架供参考重点展示解析流程完整工程代码需要按需补充。import numpy as np def parse_rnx3_nav(filepath): 解析RINEX 3.04导航文件返回GPS/BDS/Galileo/GLONASS星历字典 with open(filepath, r) as f: lines f.readlines() i 0 header_done False nav {G: [], R: [], E: [], C: []} # 处理头段 while i len(lines) and not header_done: line lines[i] if END OF HEADER in line: header_done True i 1 # 处理数据记录 while i len(lines): line lines[i] # 第一行卫星号、历元、钟差参数 sat_id line[0:3].strip() sys sat_id[0] if sys not in nav: i 1 continue # GPS/BDS/Galileo8行一组 if sys in (G, C, E): # 解析第一行 year int(line[3:8]) month int(line[9:11]) day int(line[12:14]) hour int(line[15:17]) minute int(line[18:20]) second float(line[21:23]) # 钟差参数 af0 float(line[23:42]) af1 float(line[42:61]) af2 float(line[61:80]) # 读取剩余7行 params [] for j in range(7): i 1 seg lines[i] for k in range(4): params.append(float(seg[4k*19:23k*19])) i 1 # 存入字典 nav[sys].append({ sat_id: sat_id, year: year, month: month, day: day, hour: hour, minute: minute, second: second, af0: af0, af1: af1, af2: af2, params: params # 21个轨道参数按顺序排列 }) elif sys R: # GLONASS4行一组字段含义不同这里不展开 i 4 return nav这段代码把GPS、BDS、Galileo的星历参数都收进列表里后续不同系统的计算函数可以直接从字典取值。需要注意的是这里对参数顺序有严格要求实际使用时要和RINEX官方文档对照。4.2 卫星位置计算代码实现有了参数卫星位置计算就水到渠成了。下面是一个GPS系统的计算函数其他系统可以类推。GM 3.986005e14 # m^3/s^2 OMEGA_E 7.2921151467e-5 # rad/s (地球自转角速度) def gps_sat_position(nav_record, t): 根据GPS广播星历计算卫星在ECEF坐标系下的位置和钟差 Args: nav_record: 字典含星历参数 t: 信号发射时刻GPST秒 Returns: X, Y, Z (m), dtsv (s) # 从params中提取轨道参数顺序按RINEX 3.04定义 p nav_record[params] IODE p[0] Crs p[1] delta_n p[2] M0 p[3] Cuc p[4] e p[5] Cus p[6] sqrt_A p[7] toe p[8] Cic p[9] OMEGA0 p[10] Cis p[11] i0 p[12] Crc p[13] omega p[14] OMEGA_DOT p[15] IDOT p[16] A sqrt_A ** 2 n0 np.sqrt(GM / A**3) n n0 delta_n tk t - toe Mk M0 n * tk # 迭代求解偏近点角 Ek Mk for _ in range(10): Ek_new Mk e * np.sin(Ek) if abs(Ek_new - Ek) 1e-12: Ek Ek_new break Ek Ek_new # 真近点角 vk np.arctan2(np.sqrt(1 - e**2) * np.sin(Ek), np.cos(Ek) - e) # 摄动修正 Phi vk omega delta_uk Cus * np.sin(2*Phi) Cuc * np.cos(2*Phi) delta_rk Crs * np.sin(2*Phi) Crc * np.cos(2*Phi) delta_ik Cis * np.sin(2*Phi) Cic * np.cos(2*Phi) uk Phi delta_uk rk A * (1 - e * np.cos(Ek)) delta_rk ik i0 delta_ik IDOT * tk # 升交点赤经 Omega_k OMEGA0 (OMEGA_DOT - OMEGA_E) * tk - OMEGA_E * toe # 轨道平面内坐标 x_prime rk * np.cos(uk) y_prime rk * np.sin(uk) # 转到ECEF X x_prime * np.cos(Omega_k) - y_prime * np.cos(ik) * np.sin(Omega_k) Y x_prime * np.sin(Omega_k) y_prime * np.cos(ik) * np.cos(Omega_k) Z y_prime * np.sin(ik) # 钟差和相对论修正 toc nav_record.get(toc, toe) dt_sv nav_record[af0] nav_record[af1] * (t - toc) nav_record[af2] * (t - toc)**2 dt_rel -4.442807633e-10 * e * sqrt_A * np.sin(Ek) return X, Y, Z, dt_sv dt_rel这段代码可以直接跑通单个历元的卫星位置计算我建议在拿到参数后先设tk0验算一下如果结果和已知星历给的标准卫星位置一致说明参数提取和公式实现没有大问题。4.3 验证与对比广播星历vs精密星历写好了代码怎么确认算得对最好的办法是和IGS精密星历做对比。IGS的快速精密星历或者最终精密星历.sp3文件精度在厘米级可以作为参考真值。对比步骤很简单选一个已知历元用广播星历算出各颗卫星的位置再从SP3文件里插值出同一时刻的卫星位置求差值。正常情况下广播星历和精密星历在径向的差异应该在米级以内沿轨方向可能稍大但一般不超过几米。如果差异到了百米甚至千米量级说明你的计算流程里有bug。我自己调试时常用的验算点有两个一是从RINEX文件里挑一颗近期星历的卫星设tk为一个容易计算的值手工算一遍中间量二是选取某个时刻和IGS的广播星历结果直接对比IGS也会发布广播星历解算的卫星位置可以用来交叉验证。对BDS和Galileo系统也可以用相同思路只是参考精密星历要选对应系统。如果你有条件还可以拿RTKLIB的satposs输出和你的结果对比。RTKLIB的结果经过充分测试但注意它内部做了很多容错处理如果两者有微小差异先检查你的时间系统统一好了没有。5. 常见问题与排查技巧实录5.1 时间系统与坐标系的坑处理多系统数据时间系统是最容易翻车的地方。GPS用GPST北斗用BDTGalileo用GSTGLONASS虽然和UTC基本同步但有闰秒问题。如果你在不同系统之间混用t和toe卫星位置会直接漂出几千公里。另一个坑是tk过大。广播星历只在toe附近一个时间段内有效典型约束是|tk| 7200s。如果你的解算历元距离toe太远星历外推误差会急剧增大这时候应该切换更接近的星历或者从导航文件里找相邻时段的记录做插值。有些导航文件一天只有一个toe使用前请先检查文件的时间跨度。坐标系方面主要坑是地固系和惯性系的区别。广播星历计算出来的ECEF坐标是瞬时地固系而精密星历有时给出的是不同参考框架下的坐标。如果你需要做坐标框架转换比如ITRF到PZ-90、或者考虑固体潮改正必须在统一框架下进行不能混着用。5.2 计算中的常见错误与误差分析根据我带过的经验新手实现广播星历计算时典型错误大多集中在参数提取和单位上。单位问题是第一大类。RINEX文件里角度参数的单位是半圆half-cycle也就是弧度除以π。比如M0、OMEGA0、omega、i0都是半圆用到sin/cos前必须乘以π转成弧度。而Δn、IDOT、Ω_DOT的单位是半圆每秒或半圆每秒平方同样要做转换。我见过最多的错误就是忘了把半圆转弧度结果算出来的位置完全错乱。第二类是迭代不收敛。偏近点角迭代在e接近1的时候收敛很慢甚至可能震荡。GPS卫星的偏心率一般不大约0.01但某些系统卫星的偏心率稍高一些建议迭代时记录迭代次数超过一定次数直接报错防止死循环。同时设定收敛阈值为1e-12不然算出来的位置精度不够还会浪费计算时间。第三类是参数索引顺序搞错。特别是从RINEX文件读参数时G01-G07七个字段的顺序和官方文档里参数的排列顺序并不完全一致需要对照确认。我的建议是不要用魔数索引而是定义一个具名元组或者字典来存取参数这样即使将来RINEX格式升级维护成本也低。5.3 提升精度的几个实用技巧精度这件事其实广播星历本身有天花板。但是同样的广播星历不同人的计算结果精度可能差几米主要原因就是细节处理不到位。技巧一做地球自转改正。信号从卫星传到接收机大约需要几十毫秒在这段时间里地球转过了微小的角度尽管广播星历公式里已经考虑了地球自转角速度但在高精度应用例如PPP的浮点解中最好还是单独加一项Sagnac效应改正。严格来说这一步在观测方程里做但如果你的星历计算目标是和精密星历对比建议把这项一并考虑。技巧二检查星历的IODC星钟数据龄期。同一颗卫星的导航文件里可能包含多个版本的星历选择时尽量用IODC最新、toe离目标时刻最近的记录。如果你的数据源是IGS的广播星历文件里面可能每天有多组参数按时间段自动筛选很重要。技巧三针对BDS GEO卫星的特殊处理。北斗GEO卫星的广播星历算法里有个接地气的细节算完ECEF位置后需要加一个小的平移旋转才能得到最终的CGCS2000坐标。这个操作对应的是地球自转和极移改正的一阶近似RINEX 3.04格式里也叫GEO模式。如果不加GEO卫星的位置会有几十米的误差。IGS发布的BDS广播星历参数中通常已经包含了GEO修正参数但如果你是拿北斗系统的原始播发数据就得自己处理。技巧四多系统融合时最少用两种系统的卫星做交叉验证。比如GPS和Galileo的结果应该大致重合如果某一颗GPS卫星在某时刻算出来的位置比另一颗同轨道的Galileo卫星位置差出几百米那这颗星的广播星历可能本身就有问题或者你的动态切换逻辑没处理好。5.4 数据质量检查与容错策略最后聊一聊健壮性设计。现实世界的数据从来不是完美的RINEX文件里可能缺行、多行、字段错位也可能是某颗卫星的星历参数明显不合理。我的做法是在解析阶段就做三道检查。第一道基本格式检查。文件头是否有RINEX VERSION / TYPE版本号是否支持卫星号是否合法年份是否在合理范围。不合法的直接跳过不崩溃。第二道参数合理性检查。比如sqrt_A应该在2000到9000之间对应不同轨道高度轨道偏心率e应该在0到0.1之间超出范围的数据大概率是解析错位或者星历异常直接丢弃。第三道计算后检查。卫星到地心的距离应该在2.0e7米到4.5e7米之间超出这个范围说明算错了。卫星高度角、方位角也都可以做范围检查。三项检查都通过的数据才进入后续定位解算能省掉大量调bug的时间。6. 一些个人心得广播星历计算这块内容其实不算难但它处在一个不做不知道做了才知道细节多的位置。我最早自己手写这套程序时花了大半个晚上排查一颗Galileo卫星的位置偏差最后发现只是RINEX头段里的GST-GPST时差没读进来。从那以后我对时间系统的警觉性就特别高处理任何系统都会先问一句这个参数是什么时间基准如果你也打算手写广播星历计算我的建议是从单系统、单历元开始一步一步来。先用GPS把一个星历记录的所有中间量手算一遍再写代码代码跑通后再用SP3精密星历做对比最后再扩展到多系统、多频点。这个过程看起来慢但每一步踩过的坑都是后面的宝贵经验。真到了多系统融合解算的时候你会发现之前老老实实打的底子全都能派上用场。本文还有配套的精品资源点击获取
返回列表