ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Matlab重写RTKLIB:单点定位SPP算法详解与实现

Matlab重写RTKLIB:单点定位SPP算法详解与实现 简介本资源是RTKLIB开源GNSS工具包的单点定位功能MATLAB实现版本面向卫星导航方向的高校师生、科研人员及GNSS算法初学者解决在MATLAB环境中快速复现与调试单频单点定位算法的需求适用于教学演示、算法验证及原型开发等场景。压缩包共22个文件含16个核心MATLAB脚本如singlepos.m、estpos.m、ReadObsData.m、satpos.m等覆盖数据读取O/N文件、电离层/对流层建模校正、ECEF-ENU坐标转换、几何距离迭代解算及结果输出全流程另有2个观测文件.O、2个导航文件.mat、1个星历数据.n和1个测试结果.dat总大小3.35MB。已有796人学习下载提供完整可运行的单点定位主程序链路与配套实测数据用户可直接调参、可视化定位轨迹、分析误差源并深入理解伪距解算、时间系统转换GPST/JD、卫星位置预报等关键技术环节。 搞GNSS定位的人应该都有这种感觉RTKLIB 是个好东西但真正想上手看到那一堆 C 文件还是挺劝退的。我当初就是为了在 Matlab 里跑通单点定位SPP翻了很久 RTKLIB 源码最后干脆照着它的思路把最核心的 SPP 流程用 Matlab 重写了一遍也就是 rtkilb_singlepos 这个项目。它的作用很直接输入 RINEX 格式的观测文件和广播星历文件在 Matlab 里逐历元解算接收机位置、接收机钟差、各颗卫星的距离残差以及 DOP 值输出格式和 RTKLIB 的结算结果可以对得上。这篇文章就围绕这个项目展开从原理到实现到踩坑都摊开讲一遍希望对正在学 GNSS 定位或者想在 Matlab 里做定位算法仿真的朋友有帮助。1. 项目整体设计与思路拆解1.1 rtkilb_singlepos 到底做了什么先说清楚这个项目不是什么。它没有把 RTKLIB 的所有功能都搬到 Matlab 里不做 RTK、不做 PPP也不处理模糊度固定只专注一件事把 RTKLIB 里的单点定位Single Point Positioning简称 SPP这条链路用 Matlab 独立实现一遍。SPP 这个名字在 RTKLIB 的源码里经常出现对应的是最基础的伪距绝对定位模式。接收机拿到至少 4 颗卫星的伪距观测值结合广播星历算出来的卫星位置和卫星钟差就能估计出接收机自身的坐标和接收机钟差。听起来简单但里面每一个环节展开都有不少细节。这个项目的整体结构大致是下面这几块RINEX 观测文件解析提取每个历元的伪距、载波相位、信噪比等观测值RINEX 导航文件解析提取每颗卫星的广播星历参数和钟差参数卫星位置计算单元输入星历参数和信号发射时刻输出卫星在 ECEF 坐标系下的坐标误差改正单元包括卫星钟差、相对论效应、地球自转、电离层、对流层等改正最小二乘解算单元逐历元迭代求解接收机位置和钟差质量控制单元进行高度角截止、残差检验、DOP 超标等处理。在输出端每个历元会得到接收机的 ECEF 坐标、经纬度高程、接收机钟差、东/北/天方向的位置标准差、参与解算的卫星数、PDOP/GDOP 值以及每颗卫星的验后残差。这些字段基本和 RTKLIB 的结算文件对齐方便后续对照。这个项目最适合两类人一类是刚接触 GNSS 数据处理的学生想在 Matlab 里把课本上的伪距定位公式真正跑起来另一类是做算法验证的工程师需要在 Matlab 仿真链路里嵌入一个可配置的单点定位模块而不是每次都要调外部 C 程序。1.2 为什么选择在 Matlab 里重写而不是直接调 RTKLIB这是一个很实际的问题。RTKLIB 是开源软件直接在工程里调用确实可行但有几个痛点第一C 代码的阅读成本高。RTKLIB 里 SPP 相关的逻辑分散在多个文件中比如pntpos.c负责定位解算satposs.c负责卫星位置计算eph2clk()负责广播钟差计算geoid.c里还有一堆坐标转换。初学者想搞明白一个伪距观测值从文件里读出来到最终参与定位中间到底经过了哪些处理往往要来回跳转很多文件。而在 Matlab 版本里每个功能模块就是一个独立的.m文件按名称就能找到调试时可以单步运行矩阵变量直接在工作区里查看学习路径直观得多。第二RTKLIB 的参数配置复杂。它把定位模式、高度角截止、电离层/对流层模型、DOP 阈值、动态/静态模式等全部集中在配置结构体里参数之间还有关联性。如果在调试中某个配置项没配对定位结果可能一直正常但精度就是不达标排查起来非常痛苦。Matlab 版本可以把参数设计成函数输入参数或者脚本头部的常量每次实验改一处就能看到效果。第三做算法实验需要灵活改造。比如我想看“不加电离层改正对 SPP 结果有多大影响”在 RTKLIB 里要把电离层模型选项关掉还要确认代码路径确实没有默认调用模型而在 Matlab 版本里直接注释掉一行iono iono_corr(...)就可以对比。这种“把每个改正项单独抽出来做对照实验”的能力对理解和研究定位算法价值极大。当然Matlab 版本也有自己的局限主要是性能。逐历元逐卫星的计算逻辑如果写得不注意处理长时间观测文件会比较慢。不过 SPP 本身计算量不大单历元解算一次最小二乘也就是毫秒级做几小时数据的后处理完全在可接受范围内。这也是我最后选择在 Matlab 里完整实现的原因。2. 单点定位原理从伪距方程到最小二乘2.1 伪距观测方程与未知量分析单点定位的基本观测方程可以写成P ρ c(dt_r − dt_s) I T ε先解释几个符号P是接收机测得的伪距单位米ρ是接收机到卫星的几何距离等于||r_sat − r_rx||dt_r是接收机钟差单位秒dt_s是卫星钟差单位秒c是光速I是电离层延迟等效距离T是对流层延迟等效距离ε是未模型化的误差包括码偏差、多路径效应、观测噪声等。在这个方程里接收机坐标(x, y, z)和接收机钟差dt_r是未知数。卫星位置r_sat可以由广播星历计算出来卫星钟差dt_s由导航电文里的钟差参数算出电离层和对流层延迟通过各种模型改正。所以一共有 4 个未知数至少需要 4 颗卫星才能形成可解的方程组。很多教材把接收机钟差说成“毫秒级”这个量级大家要有概念。GPS 卫星钟是原子钟误差被控制在纳秒级但接收机里通常用的是普通晶振和真正 GPS 时间之间可能差出几毫秒甚至几十毫秒折算成距离就是几百公里。所以在定位解算里接收机钟差是必须作为未知数估计的不能当作已知量。2.2 从观测方程到迭代加权最小二乘当观测卫星数超过 4 颗时方程组是超定的通常采用加权最小二乘求解。把第i颗卫星的伪距观测值和计算值之差写出来y_i P_i − (ρ_i c*dt_s_i − I_i − T_i)注意接收机钟差项还没有处理因为它是未知的。经过线性化后待求的修正向量是dx [Δx, Δy, Δz, c*dt_r]这里把接收机钟差乘以光速单位统一成米。观测矩阵H的第i行是H_i [−e_ix, −e_iy, −e_iz, 1]其中e_i是从接收机概略位置指向卫星的单位视线向量。为什么第四列是 1因为接收机钟差对所有卫星的伪距影响都是一样的相当于一个公共偏置。加权最小二乘的解是dx (H^T W H)^{-1} H^T W yW是权重矩阵通常取对角阵。RTKLIB 的 SPP 中权重的设置和卫星高度角有关低高度角卫星的电离层误差、对流层误差和多路径误差更严重所以权重更小。常见的一种加权方式是σ^2 a^2 b^2 / sin^2(el)el是卫星高度角a和b是经验常数。实际实现时可以先从伪距残差估算一个单位权方差再结合高度角定权。由于观测方程是线化后的解算必须迭代。初始坐标可以从 RINEX 观测文件头部的APPROX POSITION XYZ字段读取也可以直接设成地球中心附近某个粗略值。迭代过程是根据当前接收机位置和钟差估计逐卫星计算几何距离和各类改正组H矩阵和残差向量y求解dx更新位置和钟差判断位置修正量是否小于阈值比如 1e-4 米或达到最大迭代次数迭代结束后统计残差、DOP 等质量指标。这里有个容易忽略的细节在每次迭代后信号发射时刻也会因为接收机钟差的更新而变化进而影响卫星位置的计算。严格的做法是每次迭代时用更新后的钟差重新推算发射时刻再重新算卫星位置。实际 SPP 里这个变化很小但还是建议实现时保留这个迭代链路和 RTKLIB 的行为保持一致。2.3 每一个误差改正项都要掰开卫星位置和卫星钟差是所有改正里面最基础的。卫星位置不准确直接导致几何距离有偏卫星钟差不准确所有卫星的伪距会带上一个公共偏置。广播星历给出的开普勒轨道参数计算过程包括平近点角、偏近点角迭代、真近点角、轨道半径、轨道倾角、升交点经度等步骤最终得到 ECEF 坐标。这一套计算有标准公式Matlab 里写起来并不复杂唯一要注意的是单位必须严格统一星历参数里半长轴给的是sqrtA要平方后才得到真正的长轴角度参数单位是弧度不是度。相对论效应是卫星钟差计算里常被初学者漏掉的一项。GPS 卫星在椭圆轨道上运动星载钟受到引力位和速度的影响相对论效应导致卫星钟频率偏快。广播星历计算出的钟差参数实际上已经包含了大部分长期相对论效应但还有一个周期项需要用轨道偏心率修正dtr −2 * sqrt(mu * a) * e * sin(E) / c^2这一项的量级可以达到几十纳秒直接乘光速就是几米到十几米不改正的话确实没法用。地球自转改正也特别容易被忽略。信号从卫星传播到接收机大约需要 0.07 秒在这段时间里地球自转了一个小角度。ECEF 坐标系下的卫星位置如果直接用发射时刻的坐标参与几何距离计算会和真实接收时刻的坐标不一致。改正方法是在计算几何距离之前把卫星坐标绕 Z 轴旋转一个小角度Ω ω_e * τω_e是地球自转角速度τ是信号传播时间。赤道附近的卫星这个改正可以达到几十米不加它定位结果会有系统性偏差。电离层改正在单频 SPP 场景下一般用 Klobuchar 模型。导航电文里的α0~α3和β0~β3共 8 个参数描述了全球电离层延迟的近似分布。Klobuchar 模型能改正掉大约 50% 到 70% 的电离层延迟剩余部分会进入残差。如果接收机支持双频可以用无电离层组合彻底消除一阶电离层影响但单点定位最常用的情况还是单频加 Klobuchar 模型。对流层改正在 SPP 里通常用 Saastamoinen 模型或 UNB3 模型。对流层延迟在天顶方向大约是 2.3 米随高度角降低而增大。Saastamoinen 模型需要输入测站气压、温度和相对湿度在没有实测气象数据时可以用标准大气替代。对流层天顶延迟中干分量占比约 90%湿分量占比约 10%但由于湿分量的不确定性更大低高度角的湿延迟误差往往成为 SPP 精度的瓶颈之一。下面这个表把各误差项的量级和常用改正手段汇总一下方便对照误差项典型量级等效距离单点定位常用改正方法卫星星历误差1~2 m广播星历米级精度卫星钟差几米到十几米广播钟差参数 相对论改正接收机钟差几十到几百公里作为未知数估计电离层延迟白天可达 10~30 mKlobuchar 模型单频对流层延迟天顶约 2.3 mSaastamoinen 模型地球自转改正最大可达 30 m信号传播时间内旋转改正多路径效应0.5~2 m高度角截止、信噪比筛选3. Matlab 版本实现细节与实操要点3.1 RINEX 文件解析最容易消磨耐心的部分SPP 的第一步是把 RINEX 数据读进 Matlab。RINEX 文件的解析本身没有任何算法难度但格式细节很多稍不注意就踩坑。RTKLIB 用的是纯 C 的字符解析我在 Matlab 版里选择用fgetl逐行读取再用字符串处理函数提取字段。对于观测文件O 文件头文件部分要重点提取几个字段APPROX POSITION XYZ接收机概略坐标作为最小二乘迭代初值TIME OF FIRST OBS第一个观测历元时间# / TYPES OF OBSERV观测类型列表比如C1C L1C D1C S1C顺序决定了后面数据段各列的含义END OF HEADER头文件结束标志。数据段的格式通常以开头表示新历元例如 2024 01 01 00 00 00.000 0 8 G01 24238530.884 126956.456 ... G02 23214507.123 123045.789 ...这里第一行2024 01 01 00 00 00.000是历元时刻最后一个数字8表示该历元有 8 颗卫星。后面每行是卫星号加各观测值。我实际开发中的解析技巧是不要试图写一个万能解析器而是先确认你的数据是哪一版 RINEX3.02、3.03 还是 3.04再按照对应格式解析。RINEX 3.x 的观测类型标识里面C1C表示 L1 C/A 码伪距L1C表示 L1 载波相位D1C表示多普勒S1C表示信噪比。不同接收机文件的观测类型可能不同比如有的接收机用C1X或C1P解析时要动态读取头部的观测类型列表而不是固定取某一列。导航文件N 文件相对规整。GPS 广播星历在 RINEX 3.x 里每个历元 8 行解析时按卫星号、历元时刻和参数顺序读入结构体后面计算卫星位置时直接调用。解析导航文件时很容易踩的坑是同一个文件里可能存在多组同一颗卫星不同历元的星历使用时必须选择观测时刻之前最近的一组星历或者直接选择与观测时刻最接近的星历。3.2 卫星位置与钟差计算代码级拆解把广播星历变成 ECEF 坐标是 SPP 里最“硬核”的一段。下面这个 Matlab 函数是我在项目里实际使用的版本省略了部分边界检查和注释核心流程完整function sat_pos calc_satpos(eph, t) % eph: 广播星历结构体 % t: 信号发射时刻GPS周内秒 mu 3.986005e14; omega_e 7.2921151467e-5; A eph.sqrtA^2; n0 sqrt(mu / A^3); n n0 eph.Delta_n; tk t - eph.toe; if tk 302400 tk tk - 604800; end if tk -302400 tk tk 604800; end M eph.M0 n * tk; E M; for i 1:10 E M eph.e * sin(E); % 开普勒方程迭代 end v atan2(sqrt(1 - eph.e^2) * sin(E), cos(E) - eph.e); u v eph.omega; r A * (1 - eph.e * cos(E)) eph.Crs * sin(2*u) eph.Crc * cos(2*u); i eph.i0 eph.IDOT * tk eph.Cis * sin(2*u) eph.Cic * cos(2*u); OMEGA eph.OMEGA0 (eph.OMEGADOT - omega_e) * tk - omega_e * eph.toe; x_p r * cos(u); y_p r * sin(u); sat_pos(1) x_p * cos(OMEGA) - y_p * cos(i) * sin(OMEGA); sat_pos(2) x_p * sin(OMEGA) y_p * cos(i) * cos(OMEGA); sat_pos(3) y_p * sin(i); end这里有几个细节必须强调开普勒方程迭代收敛很快。GPS 卫星轨道偏心率不大一般不超过 0.02初始值EM后迭代五六次就收敛了10 次迭代绰绰有余。但用atan2计算真近点角时要注意参数顺序是(sin, cos)习惯写atan( ... )容易在角度象限上出错。tk要做周翻转处理。如果观测时刻和星历参考时刻之间跨越了一周边界直接做差会出现超过 604800 秒的偏差导致卫星位置严重错误。RTKLIB 源码里也有类似的tk timerseconds(t, eph.toe);然后截断的逻辑。升交点经度的计算里为什么是(OMEGADOT - omega_e)因为OMEGADOT是升交点赤经的变化率而地球自转导致 ECEF 坐标系的 Z 轴也在旋转两者必须同时考虑。后面的- omega_e * eph.toe是把参考时刻的升交点经度从惯性系换算到地固系这个公式在 GNSS 相关教材里都有但新手最容易搞混。卫星钟差计算也同样要注意单位。广播星历给出的钟差参数af0, af1, af2单位分别是秒、秒/秒、秒/秒²直接代入dt t - eph.toc; clk eph.af0 eph.af1 * dt eph.af2 * dt^2;再加相对论改正dtr和群延迟改正-eph.TGD。这里特别提醒TGD 的符号在 RINEX 导航文件和 ICD 里定义一致一般对于 C/A 码用户是减去 TGD。不同教材写法可能不同最终效果要以定位结果是否发散来检验。3.3 SPP 主解算循环把公式变成逐历元的代码有了卫星位置和钟差剩下就是逐历元组方程、解最小二乘。我实现的 SPP 主循环核心片段如下x0 approx_pos; % 初始坐标米 clk0 0; % 初始接收机钟差米 for iter 1:10 H zeros(n_sat, 4); y zeros(n_sat, 1); W zeros(n_sat, n_sat); for i 1:n_sat e (sat_pos(:,i) - x0(1:3)) / norm(sat_pos(:,i) - x0(1:3)); rho_calc norm(sat_pos(:,i) - x0(1:3)); % 接收机钟差偏移导致发射时刻偏移重新算卫星坐标 t_tx_corr t_rx - clk0 / c - rho_calc / c; sat_pos_corr calc_satpos(eph(i), t_tx_corr); % 必要时加地球自转改正重新计算距离 ... H(i,:) [-e, 1]; y(i) rho_obs(i) - (rho_calc clk0 - c * dt_sat(i) iono(i) tropo(i)); % 高度角定权 sinel sin(el(i)); W(i,i) 1 / (0.3^2 0.3^2 / sinel^2); end dx (H * W * H) \ (H * W * y); x0 x0 dx(1:3); clk0 clk0 dx(4); if norm(dx(1:3)) 1e-4 break; end end这个代码片段的结构和 RTKLIB 里estpos()的迭代框架是一致的。有几个地方我想重点解释一下。第一为什么rho_obs要减去卫星钟差、电离层、对流层因为观测残差y是“观测伪距 − 计算伪距”。计算伪距里应该包含真实的几何距离、接收机钟差项但不包含卫星钟差和大气延迟所以把这些已知项从观测伪距里扣掉剩下的残差就是位置和接收机钟差的函数。第二权重矩阵用对角阵即可。不同卫星之间的伪距误差在统计上可以认为不相关所以W取对角阵是合理的。高度角定权的经验公式有很多变体核心思想都是低高度角给低权重。上面的参数0.3^2表示一个基准噪声方差具体数值可以根据你的数据质量调整不会对定位结果产生颠覆性影响但会影响最终位置解的精度的统计评估。第三迭代中是否要重新计算卫星位置我上面的代码里留了一个sat_pos_corr的位置。严格来说每次迭代更新了接收机钟差后信号发射时刻会改变约clk0/c对应卫星在轨道上的位置变化一般在几毫米到几厘米量级。SPP 对位置精度要求不高有些人会忽略这一步。但既然写 Matlab 版本就是为了对照 RTKLIB 的行为这里建议保留至少把逻辑体现在代码结构里。3.4 质量控制别让一颗坏卫星毁了整个历元SPP 解算结果的优劣不只取决于最小二乘本身更取决于输入观测值的质量。我在项目里加入了以下几层控制每一层在 RTKLIB 中都有对应逻辑。高度角截止。低于截止高度角的卫星直接不参与解算。默认 15 度观测环境好的时候可以降到 10 度城市峡谷里提高阈值反而能降低多路径影响。伪距残差检验。在最小二乘迭代收敛后计算每颗卫星的验后残差。如果某颗卫星的残差超过 3 倍单位权标准差就剔除该卫星后重新解算。这一步能有效排除大周跳、粗差和部分多路径污染。RTKLIB 里用的是类似思路通过rtk-opt.err[2]之类的噪声参数自动检测。参与解算卫星数检查。少于 4 颗卫星时直接标记该历元定位失败。这听着像废话但在处理中断数据时很容易出现某历元只剩 3 颗卫星的情况不做检查最小二乘矩阵就可能奇异。DOP 超标丢弃。GDOP 值过大时即使最小二乘能算出来位置误差也可能被几何构型放大好几倍这种解算结果没有参考意义。我的实现里设了一个 GDOP 阈值默认 20超过就直接把该历元定位状态置为无效。质量控制参数建议按下表设置参数推荐值说明截止高度角15°太低会引入多路径和大气误差最大迭代次数10收敛很快10 次足够位置收敛阈值1e-4 m达到即停止迭代残差剔除阈值3σ逐卫星剔除明显粗差最小卫星数4低于则定位失败GDOP 阈值20超过则放弃该历元4. 常见问题与排查技巧实录4.1 典型问题速查表把我在调试这个 Matlab SPP 项目过程中遇到的高频问题整理成一张表新手照着排查基本能解决大部分问题问题现象可能原因排查方向定位结果在非洲/海洋中间卫星位置计算错误最常见是开普勒方程单位或周翻转问题检查tk是否超出 ±302400 秒范围检查星历参数单位坐标对但高程明显偏高对流层模型没加或模型参数错误天气良好时 SPP 高程误差应在 5 米以内偏差十几米优先查对流层解算发散迭代不收敛初始坐标离真实位置太远或观测数据时间系统不统一从 RINEX 头部读APPROX POSITION XYZ确认 GPS 时和 UTC 的转换固定某颗卫星残差特别大该卫星伪距有粗差或多路径严重通过残差剔除后重解DOP 很高但卫星数也够卫星几何分布差一般出现在城市峡谷降低截止高度角或等待卫星分布变化结果与 RTKLIB 结算差别超过 2 米误差改正项有遗漏或符号不一致逐项对比各改正项数值Matlab 处理几千历元非常慢解析文件用了大量循环优化 RINEX 解析预分配矩阵尽量向量化4.2 与 RTKLIB 原程序的对照验证方法写 Matlab 版本最大的好处就是可以和 RTKLIB 的输出做交叉验证。我用一台双频观测文件跑 SPP然后把 RTKLIB 的结算结果和 Matlab 版本逐历元对比。首先要注意基准统一。RTKLIB 默认输出的坐标系是 WGS84我的 Matlab 版本也直接输出 WGS84 下的 ECEF 和经纬度这样可以直接比。如果发现两者的差值呈现稳定的系统性偏差先检查是不是坐标参考框架不同比如 ITRF 和 WGS84 之间的差异在分米级以内不过对于米级的 SPP 来说通常可以忽略。我实测下来的对比结果是在截止高度角 15 度、Klobuchar 电离层模型、Saastamoinen 对流层模型条件下Matlab 版本和 RTKLIB 结算的水平坐标差异在 0.5 米以内高程差异在 1 米左右。这个差异主要来自权重模型细节和卫星位置计算时迭代精度的微小差别属于正常范围。如果差异特别大我建议在 Matlab 里逐项打印每个改正项的具体数值和 RTKLIB 对应函数打出来的值对照。比如卫星钟差可以单独打印某颗卫星在某个时刻的钟差修正值看和RTKLIB里satclk()给的结果是否一致。这样很容易定位到具体是哪一项的符号错了或者单位错了。4.3 让定位精度再上一个台阶的几个细节当基础 SPP 跑通之后想进一步提升精度或者让结果更稳定可以从这几个细节入手。高度角定权参数要适配数据。我最早直接用恒定权重W I结果定位结果也能收敛但高程方向的抖动特别大。改成随高度角下降而降低权重后高程方向的稳定性明显改善。如果你手里的接收机噪声水平较高可以把0.3^2调大到0.5^2避免被高仰角卫星的观测噪声主导。伪距平滑可以大幅降低噪声。SPP 用的是伪距伪距噪声一般在 0.3 米左右但多路径导致的误差可能达到米级。如果观测文件里有载波相位观测值可以做载波平滑伪距把伪距噪声压到厘米级。RTKLIB 在rtkpos里也能开平滑选项这个功能在 Matlab 版本里可以作为扩展方向。多系统融合是重要扩展。现在 RINEX 3.x 数据普遍包含 GPS、GLONASS、Galileo、BDS 四个系统的观测值单系统 SPP 在城市里经常因为卫星数不足而无法定位多系统融合后可见卫星数大幅增加定位可用性显著提高。但要注意不同系统的时间基准和坐标基准差异GLONASS 时与 GPS 时差、各系统坐标框架间的差异都要处理实现复杂度会高一个台阶。如果想进一步研究可以从 SPP 扩展到 RTK 和 PPP。SPP 的最小二乘骨架和 RTK 的浮点解算非常相似误差改正项的框架也基本一致。你在 Matlab 里把 SPP 跑通之后再加一条载波相位观测方程、把模糊度作为未知数就离 RTK 的算法实现不远了。我个人在实际运行这个项目的过程中最大的体会是亲手用 Matlab 把 SPP 写一遍比读十遍公式都管用。你可能一开始觉得 RINEX 解析繁琐、卫星位置计算绕、各种改正项让人头大但每当一个历元从发散的坐标逐步收敛到真实位置附近时那种对定位算法“由内到外”的理解就建立起来了。后续再去看 RTKLIB 的 C 源码或者去读 RTK/PPP 的论文会发现很多概念都变得特别熟悉。这套 Matlab 实现现在也是我做 GNSS 算法验证的常用工具之一想改哪个模型、看哪项误差的影响直接改函数就能跑起来。最后再分享一个小技巧如果你也打算从零写这个项目不要一上来就追求多系统、多频点先拿一小段 GPS 单系统的短观测文件把链路跑通再逐步加功能。我最早调试的时候就是拿一个 10 分钟静态数据反复折腾把每个改正项都验证无误后才开始处理长时间数据。这样出了问题可以很快判断是哪个环节导致的不至于在几十个函数里抓瞎。本文还有配套的精品资源点击获取
返回列表