ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零实现GNSS伪距单点定位:MATLAB代码详解与最小二乘法实践

从零实现GNSS伪距单点定位:MATLAB代码详解与最小二乘法实践 简介本资源是一份面向卫星导航与定位方向初学者及MATLAB实践者的伪距定位算法实现脚本聚焦GPS接收机位置解算这一核心问题适用于导航工程、测绘、智能交通等领域的课程设计、算法验证与仿真实验。压缩包为RAR格式仅含1个MATLAB源文件.m体积精简至741B代码直接封装伪距定位核心流程包括WGS84坐标系下的卫星位置计算、四星伪距方程构建、非线性最小二乘求解基于迭代优化思想及用户三维位置与接收机钟差联合估计。已有394人学习下载脚本结构清晰、注释明确无需额外数据文件即可运行演示可作为理解GPS定位数学原理、掌握MATLAB数值求解工具如lsqnonlin的轻量级教学范例亦可快速嵌入更复杂的GNSS仿真系统中复用关键定位模块。1. 项目背景与核心需求解析最近在整理硬盘时翻到了一个名为calculateuserpositon.rar的压缩包里面是一个用MATLAB写的伪距定位程序。这让我想起了当年刚接触卫星导航定位时自己动手从零实现定位解算的那段经历。对于很多测绘、导航、通信相关专业的学生和工程师来说理解并亲手实现一个基础的伪距单点定位算法是打通理论到实践的关键一步。这个程序虽然名字起得有点“直白”但它的核心价值在于它用最直接的代码揭示了GNSS全球导航卫星系统定位中最基础、也最核心的数学模型是如何在计算机中“跑”起来的。简单来说伪距定位就是通过测量用户接收机到多颗卫星的“伪距离”包含各种误差的距离观测值来反推出接收机自身在地球坐标系中的三维位置X, Y, Z和接收机钟差这个参数。这听起来像是一个解方程的问题但实际上由于观测方程是非线性的我们通常需要采用线性化的迭代方法——最小二乘法来逐步逼近真实解。这个MATLAB程序干的就是这个事它模拟或读取一组卫星的坐标和对应的伪距观测值然后通过迭代计算最终输出用户的位置。为什么这件事值得单独拿出来说因为市面上很多教材和论文把原理讲得很透但一到代码实现往往就语焉不详或者直接给个“调用某工具箱函数”了事。对于学习者而言中间那个“黑箱”恰恰是最需要弄明白的。自己写一遍你会对观测矩阵H的构建、权矩阵P的设定、迭代收敛的判断、以及结果精度评价等关键环节有刻骨铭心的理解。这个calculateuserpositon项目就是一个绝佳的“解剖”样本。2. 伪距定位的数学模型与线性化过程要读懂并改进这个MATLAB程序我们必须先回到最根本的数学公式上。伪距观测方程可以表示为[ \rho^{(i)} \sqrt{(X^{(i)} - X_u)^2 (Y^{(i)} - Y_u)^2 (Z^{(i)} - Z_u)^2} c \cdot \delta t_u \varepsilon^{(i)} ]这里(\rho^{(i)}) 是接收机测量到的到第 (i) 颗卫星的伪距((X^{(i)}, Y^{(i)}, Z^{(i)})) 是该卫星在ECEF地心地固直角坐标系下的坐标((X_u, Y_u, Z_u)) 是待求的用户接收机坐标(c) 是光速(\delta t_u) 是接收机钟差以时间为单位(\varepsilon^{(i)}) 包含了所有未模型化的误差如大气延迟、多路径、噪声等。这个方程对 ((X_u, Y_u, Z_u, \delta t_u)) 是非线性的。为了用最小二乘法求解我们需要在某个初始近似值 ((X_0, Y_0, Z_0, \delta t_0)) 处进行泰勒展开并忽略高阶项从而得到线性化的误差方程[ l^{(i)} \rho_{measured}^{(i)} - \rho_{computed}^{(i)} \approx -\frac{X^{(i)}-X_0}{R_0^{(i)}} \cdot \Delta X - \frac{Y^{(i)}-Y_0}{R_0^{(i)}} \cdot \Delta Y - \frac{Z^{(i)}-Z_0}{R_0^{(i)}} \cdot \Delta Z c \cdot \Delta \delta t ]其中(\rho_{computed}^{(i)} \sqrt{(X^{(i)}-X_0)^2(Y^{(i)}-Y_0)^2(Z^{(i)}-Z_0)^2} c \cdot \delta t_0)是在初始值处计算出的“计算伪距”。(R_0^{(i)}) 是初始位置到卫星的几何距离。(l^{(i)}) 就是观测值减去计算值的残差通常称为“OMC”Observed Minus Computed。对于 (m) 颗卫星(m \ge 4)我们可以将上述方程写成矩阵形式[ \mathbf{l} \mathbf{H} \cdot \Delta \mathbf{x} \mathbf{\varepsilon} ]这里(\mathbf{l}) 是一个 (m \times 1) 的向量每个元素是 (l^{(i)})。(\Delta \mathbf{x} [\Delta X, \Delta Y, \Delta Z, \Delta \delta t]^T) 是一个 (4 \times 1) 的待求状态改正数向量。(\mathbf{H}) 是一个 (m \times 4) 的几何矩阵或称设计矩阵其第 (i) 行为 [ \mathbf{h}_i \left[ -\frac{X^{(i)}-X_0}{R_0^{(i)}}, -\frac{Y^{(i)}-Y_0}{R_0^{(i)}}, -\frac{Z^{(i)}-Z_0}{R_0^{(i)}}, 1 \right] ] 注意前三个元素是卫星到初始位置连线的方向余弦第四个元素对应钟差通常为1因为钟差直接以时间为单位乘以光速c后进入伪距。至此我们就把一个非线性问题转化为了在每个迭代步中需要求解的线性最小二乘问题(\mathbf{l} \mathbf{H} \Delta \mathbf{x})。其最小二乘解为 [ \Delta \mathbf{x} (\mathbf{H}^T \mathbf{P} \mathbf{H})^{-1} \mathbf{H}^T \mathbf{P} \mathbf{l} ] 其中(\mathbf{P}) 是权矩阵通常可以假设为对角阵其对角线元素是各卫星观测值方差的倒数反映了我们对不同卫星观测质量的信任程度。在最简单的等权模型中(\mathbf{P}) 可以设为单位阵。得到 (\Delta \mathbf{x}) 后更新状态量(X_u X_0 \Delta X) 其他参数同理。然后用更新后的值作为新的初始值重新计算几何距离、设计矩阵 (\mathbf{H}) 和残差向量 (\mathbf{l})进行下一次迭代。这个过程反复进行直到 (\Delta \mathbf{x}) 的范数小于某个预设的阈值例如1e-3米或者达到最大迭代次数为止。3. MATLAB程序calculateuserpositon的核心代码拆解基于上面的数学模型我们来看一个典型的calculateuserpositon程序可能包含的核心模块。我会假设一个基本的程序结构并补充关键细节和代码注释。3.1 数据准备与初始化程序的第一步是准备输入数据。通常需要两类数据卫星星历与位置至少4颗卫星在信号发射时刻的ECEF坐标 ((X^{(i)}, Y^{(i)}, Z^{(i)}))。在教学中这些数据可能是预先计算好并存储在矩阵中的。伪距观测值接收机测量到的到对应卫星的伪距 (\rho^{(i)})单位通常是米。同时我们需要一个用户位置的初始猜测值 ((X_0, Y_0, Z_0))。一个非常粗糙但常用的初始值是地心坐标 (0,0,0) 或者地球表面某个粗略估计点如通过IP地址获取的城市坐标。接收机钟差初始值 (\delta t_0) 通常设为0。% 假设我们有m颗卫星的数据 m 6; % 卫星数量 % 卫星ECEF坐标 (米) 每一行是一颗卫星的[X, Y, Z] sat_pos [ 2294702.023, 13572219.107, 19329032.784; % 卫星1 953256.234, -21915564.567, 12511342.345; % 卫星2 -20465543.456, 8765432.123, 14567890.234; % 卫星3 ... ]; % 补充其他卫星 % 对应的伪距观测值 (米) pseudo_ranges [ 22228278.123, 24123456.789, 21567890.456, ... ]; % 用户位置和钟差初始值 X0 0; Y0 0; Z0 0; dt0 0; % 非常粗略的初始值 state [X0; Y0; Z0; dt0]; % 状态向量 % 光速 c 299792458; % 米/秒 % 迭代控制参数 max_iter 20; threshold 1e-3; % 收敛阈值单位米3.2 迭代最小二乘解算核心循环这是整个程序的“心脏”。我们需要在一个循环中反复计算几何距离、设计矩阵、残差并求解状态改正数。for iter 1:max_iter % 1. 计算当前状态下的几何距离和计算伪距 geo_range zeros(m, 1); % 几何距离 computed_pr zeros(m, 1); % 计算伪距 H zeros(m, 4); % 设计矩阵 for i 1:m % 提取卫星i的坐标 Xs sat_pos(i, 1); Ys sat_pos(i, 2); Zs sat_pos(i, 3); % 计算卫星到当前估计用户位置的几何距离 dx Xs - state(1); dy Ys - state(2); dz Zs - state(3); geo_range(i) sqrt(dx^2 dy^2 dz^2); % 计算伪距 几何距离 光速*钟差 computed_pr(i) geo_range(i) c * state(4); % 构建设计矩阵H的第i行 % 方向余弦: (Xs - Xu) / R, 注意符号在我们的误差方程中是负号 H(i, 1) -dx / geo_range(i); % 对X的偏导 H(i, 2) -dy / geo_range(i); % 对Y的偏导 H(i, 3) -dz / geo_range(i); % 对Z的偏导 H(i, 4) 1; % 对接收机钟差的偏导 (注意是1不是c因为我们的状态dt是以时间为单位) end % 2. 计算观测值残差向量 l 观测伪距 - 计算伪距 l pseudo_ranges - computed_pr; % 3. 求解最小二乘解 (这里采用等权模型P为单位阵) % 公式: delta_x inv(H * H) * H * l % 在实际编程中应避免直接求逆使用左除运算符更稳定高效。 delta_x (H * H) \ (H * l); % 4. 更新状态向量 state state delta_x; % 5. 检查收敛条件状态改正数的范数是否小于阈值 if norm(delta_x(1:3)) threshold % 通常只检查位置改正数 fprintf(迭代在第 %d 次收敛。\n, iter); break; end % 6. 如果达到最大迭代次数仍未收敛发出警告 if iter max_iter warning(达到最大迭代次数 (%d)可能未完全收敛。, max_iter); end end % 输出最终结果 X_user state(1); Y_user state(2); Z_user state(3); clock_bias state(4); % 以时间为单位的接收机钟差 fprintf(解算结果\n); fprintf( X: %.3f m\n, X_user); fprintf( Y: %.3f m\n, Y_user); fprintf( Z: %.3f m\n, Z_user); fprintf( 接收机钟差: %.9f s\n, clock_bias); fprintf( 等效距离误差: %.3f m\n, clock_bias * c);3.3 结果转换与精度评估解算出的ECEF坐标 ((X, Y, Z)) 对于普通人来说并不直观。我们通常需要将其转换为大地坐标经度、纬度、高度或当地切平面坐标。% 将ECEF坐标转换为WGS-84大地坐标 (BLH) a 6378137.0; % WGS-84椭球长半轴 f 1/298.257223563; % 扁率 e2 2*f - f*f; % 第一偏心率平方 X X_user; Y Y_user; Z Z_user; p sqrt(X^2 Y^2); theta atan2(Z*a, p* (a*(1-e2))); % 辅助量 lon atan2(Y, X); % 经度 (弧度) lat atan2(Z e2 * (a*(1-e2)) * (sin(theta))^3 / (1-e2), p - e2 * a * (cos(theta))^3); % 纬度 (弧度) N a / sqrt(1 - e2 * sin(lat)^2); % 卯酉圈曲率半径 h p / cos(lat) - N; % 高度 % 转换为度 lon_deg rad2deg(lon); lat_deg rad2deg(lat); fprintf(大地坐标 (WGS-84)\n); fprintf( 经度: %.6f°\n, lon_deg); fprintf( 纬度: %.6f°\n, lat_deg); fprintf( 椭球高: %.3f m\n, h);精度评估通常通过计算位置精度因子PDOP和后验单位权中误差来实现。% 计算PDOP (Position Dilution of Precision) % 首先计算几何矩阵H的权逆阵 (这里权矩阵P为单位阵) Qxx inv(H * H); % 状态参数的协因数阵 PDOP sqrt(trace(Qxx(1:3, 1:3))); % 位置参数的PDOP % 计算后验单位权中误差 sigma0 v l - H * delta_x; % 观测值残差 (平差后的残差) m length(l); % 观测值个数 n 4; % 待估参数个数 if m n sigma0 sqrt((v * v) / (m - n)); else sigma0 NaN; warning(观测值数量不足无法计算有意义的单位权中误差。); end fprintf(精度评估\n); fprintf( PDOP: %.3f\n, PDOP); if ~isnan(sigma0) fprintf( 后验单位权中误差: %.3f m\n, sigma0); endPDOP值越小说明卫星几何构型越好理论上定位精度越高。sigma0反映了观测值的内符合精度。4. 从理论到实践关键细节与常见陷阱自己动手实现一遍你会立刻遇到一系列在理论推导中容易被忽略但在编程中至关重要的问题。下面是我在实现和调试类似程序时踩过的坑和总结的经验。4.1 初始值的选取与迭代收敛性程序里我们简单地将初始位置设为地心(0,0,0)。这在很多情况下会导致迭代不收敛或收敛到错误解。为什么因为泰勒展开线性化只在初始值足够接近真值时才有效。当地心距离真值几千公里时线性化误差巨大最小二乘解可能“跑偏”。更稳健的初始值策略单点定位初值如果你没有任何先验信息可以先用三颗卫星和假设钟差为0解算一个粗略位置。虽然不准确但通常比地心好得多。上次定位结果对于连续定位直接用上一次的解作为本次迭代的初始值。外部辅助从其他传感器如IMU、里程计或网络如Cell-ID获取一个粗略位置。在代码中可以增加一个简单的初值鲁棒性检查。例如如果第一次迭代后的位置改正数超过1000公里就认为初值太差可以尝试切换初值策略或直接报错。% 在迭代循环开始前或第一次迭代后加入检查 if iter 1 norm(delta_x(1:3)) 1e6 % 改正数大于1000公里 warning(初始值可能偏离真值过远迭代可能不收敛。建议提供更好的初始位置估计。); % 可以尝试将初始位置设为地球表面一个合理点例如 (a, 0, 0) % state(1:3) [a; 0; 0]; end4.2 权矩阵P的设置等权与非等权模型上面的示例代码采用了最简单的等权模型P I。在现实中不同卫星的观测质量差异很大。低仰角卫星信号受大气影响大、多路径效应严重其观测值噪声大、可靠性低应该赋予较小的权重。一个常用的权函数是基于卫星高度角的[ P_{ii} \frac{1}{\sigma_i^2} \frac{\sin^2(el_i)}{\sigma_0^2} ] 其中(el_i) 是卫星的高度角(\sigma_0) 是基准中误差。高度角越高权重越大。在程序中我们需要在迭代循环内每次更新用户位置估计后重新计算每颗卫星的高度角从而更新权矩阵P。% 在迭代循环内计算每颗卫星的高度角 for i 1:m % ... 计算dx, dy, dz, geo_range ... % 计算卫星在用户站心坐标系下的向量 % 注意需要知道用户的粗略大地坐标(B, L)来计算旋转矩阵 % 这里简化处理假设我们已经有了一个近似的lat, lon (可以从state转换得到) % R rotation_matrix_ECEF_to_ENU(lat, lon); % enu_vector R * [dx; dy; dz]; % el_rad atan2(enu_vector(3), sqrt(enu_vector(1)^2 enu_vector(2)^2)); % 一个更简单但不那么精确的近似用几何关系估算sin(el) sin_el sqrt(dx^2 dy^2) / geo_range(i); % 近似 P(i, i) (sin_el^2) / (sigma0^2); % 设置权矩阵对角线元素 end % 然后使用加权最小二乘解delta_x (H * P * H) \ (H * P * l);注意权矩阵P必须在每次迭代中重新计算因为用户位置在变卫星的高度角也在变。同时要确保P是正定矩阵避免数值问题。4.3 地球自转改正Sagnac效应这是一个容易被忽略但影响可达数十米的系统误差。卫星信号在传播过程中约0.07秒地球已经自转了一个小角度导致信号发射时刻的卫星坐标系和接收时刻的用户坐标系之间存在旋转。我们需要对卫星坐标进行修正。改正公式如下[ \begin{bmatrix} X_s \ Y_s \ Z_s \end{bmatrix} \begin{bmatrix} \cos(\omega_e \tau) \sin(\omega_e \tau) 0 \ -\sin(\omega_e \tau) \cos(\omega_e \tau) 0 \ 0 0 1 \end{bmatrix} \begin{bmatrix} X_s \ Y_s \ Z_s \end{bmatrix} ] 其中(\omega_e 7.2921151467 \times 10^{-5} , \text{rad/s}) 是地球自转角速度(\tau \rho / c) 是信号传播时间伪距除以光速的近似。这个改正应该在计算几何距离和设计矩阵之前进行。在迭代中由于伪距和用户位置都在变传播时间τ也在变理论上每次迭代都应重新计算改正。但在实际编程中如果迭代收敛很快用第一次估计的τ进行改正带来的误差通常可以忽略。% 在数据准备或每次迭代开始时对卫星坐标进行地球自转改正 omega_e 7.2921151467e-5; % rad/s for i 1:m tau pseudo_ranges(i) / c; % 使用观测伪距估算传播时间 theta omega_e * tau; R [cos(theta), sin(theta), 0; -sin(theta), cos(theta), 0; 0, 0, 1]; sat_pos_corrected(i, :) (R * sat_pos(i, :)); % 改正后的卫星坐标 end % 后续计算使用 sat_pos_corrected 代替 sat_pos4.4 数值稳定性与矩阵病态问题当卫星几何构型很差时例如所有卫星都在一个方向上设计矩阵 (\mathbf{H}) 的条件数会变得非常大导致最小二乘解 (\Delta \mathbf{x} (\mathbf{H}^T \mathbf{H})^{-1} \mathbf{H}^T \mathbf{l}) 对观测噪声极其敏感计算结果可能溢出或完全错误。这就是所谓的“病态”问题。应对策略增加卫星数量这是最根本的方法更多的卫星通常能改善几何构型。使用正则化岭估计在 ((\mathbf{H}^T \mathbf{H})) 的对角线上加一个小的正数 (\lambda)即 (\Delta \mathbf{x} (\mathbf{H}^T \mathbf{H} \lambda I)^{-1} \mathbf{H}^T \mathbf{l})。这相当于给解增加了一个约束倾向于小范数的解能稳定数值计算但会引入微小偏差。使用更稳健的求解器MATLAB的\运算符左除在求解病态方程时已经比直接求逆稳定得多。对于严重病态问题可以考虑使用pinv伪逆或lsqminnorm函数。% 使用岭估计 (Tikhonov regularization) 增强稳定性 lambda 1e-6; % 一个很小的正则化参数 delta_x (H * H lambda * eye(4)) \ (H * l);在程序中可以计算矩阵的条件数进行预警。cond_number cond(H * H); if cond_number 1e10 warning(设计矩阵条件数过大 (%e)解可能不稳定。建议检查卫星几何构型或使用正则化。, cond_number); end5. 程序功能扩展与性能优化思路一个基础的定位程序跑通后我们可以从多个维度对其进行扩展和优化使其更贴近实际应用。5.1 扩展处理真实观测数据文件教学程序的数据常写在代码里。一个实用的程序应该能读取标准格式的观测文件如RINEX和星历文件如广播星历。你需要编写解析器来提取每颗卫星在每个历元的伪距观测值C1C, P1, P2等卫星IDPRN信号发射时间以及从星历中计算对应时刻的卫星坐标。这涉及到开普勒轨道参数的计算、卫星钟差改正等是另一个复杂的模块。MATLAB中也有第三方工具箱可以辅助处理RINEX文件。5.2 扩展引入误差模型基础伪距包含大量误差。要提高定位精度必须引入误差改正模型卫星钟差使用广播星历中的钟差参数a0, a1, a2进行改正。电离层延迟可以使用Klobuchar等模型进行改正或使用双频观测值组合消除如果有多频数据。对流层延迟使用Saastamoinen、Hopfield等模型根据测站温度、气压、湿度进行改正。相对论效应、地球潮汐等对于高精度应用这些也需要考虑。这些改正量需要在计算“计算伪距”computed_pr时被减去因为它们是实际信号传播中的延迟使观测伪距变长。% 在计算 computed_pr 时加入误差改正 computed_pr(i) geo_range(i) c * (state(4) - sat_clock_bias(i)) ... % 减去卫星钟差 - iono_delay(i) - tropo_delay(i) ... % 减去大气延迟 relativity_corr(i); % 加上相对论改正通常为正注意符号延迟使伪距变长需要减去改正项如相对论效应需要根据其定义加上或减去。5.3 优化向量化编程与算法效率上面的示例代码使用了for循环遍历卫星在MATLAB中这不是最高效的。我们可以利用MATLAB的矩阵运算进行向量化大幅提升计算速度。% 向量化计算几何距离和设计矩阵 % sat_pos 是 m x 3 矩阵 state(1:3) 是 1 x 3 向量 delta_xyz sat_pos - state(1:3); % m x 3 矩阵每行是 [dx, dy, dz] geo_range_vec sqrt(sum(delta_xyz.^2, 2)); % m x 1 向量几何距离 % 计算设计矩阵 H % 方向余弦 -[dx, dy, dz] ./ R H [-delta_xyz ./ geo_range_vec, ones(m, 1)]; % m x 4 矩阵 % 计算计算伪距向量 computed_pr_vec geo_range_vec c * state(4); % m x 1 向量 % 残差向量 l pseudo_ranges - computed_pr_vec; % 最小二乘解 (假设等权) delta_x (H * H) \ (H * l);向量化后的代码不仅更简洁而且对于成百上千个历元的批处理性能提升会非常明显。5.4 可视化定位结果与卫星天空图对于分析和教学可视化至关重要。可以绘制定位轨迹如果是动态数据绘制用户位置的ENU坐标随时间的变化。误差椭圆根据协方差矩阵绘制水平位置的可信椭圆。卫星天空图绘制当前时刻所有卫星的方位角和高度角直观显示几何构型。残差序列图绘制每颗卫星的观测残差随时间的变化用于粗差探测和模型评估。% 示例绘制卫星天空图极坐标 figure; polaraxes; hold on; for i 1:m % 计算卫星的方位角az和高度角el需要站心坐标转换 % [az_deg, el_deg] calculate_az_el(delta_xyz(i,:), lat, lon); % polarplot(deg2rad(az_deg), 90 - el_deg, o); % 高度角越大点越靠近中心 end title(卫星天空图); rlim([0 90]); thetaticks(0:30:330); thetaticklabels({N,30,60,E,120,150,S,210,240,W,300,330});一个清晰的天空图能立刻告诉你为什么当前PDOP值很高卫星都挤在天空的一角。6. 调试、验证与下一步学习方向当你写完代码它很可能第一次运行不会给出正确结果。别慌这是常态。调试建议使用仿真数据自己构造一个已知用户位置和一组卫星坐标计算出“干净”的伪距观测值加上一个已知的接收机钟差。用你的程序去解算应该能精确恢复出已知的位置和钟差。这是验证算法逻辑正确性的黄金标准。分步输出在迭代循环中打印出每次迭代的delta_x、state和norm(delta_x)。观察它们是否在向合理值收敛。检查设计矩阵H在第一次迭代后查看H矩阵的值。方向余弦的绝对值应该小于1且每行前三个元素的平方和应接近1。如果出现极大或极小的数检查几何距离geo_range的计算是否正确。检查残差l第一次迭代的残差l可能非常大因为初始值差但随后应迅速减小。如果残差始终很大可能是观测值或卫星坐标数据有问题。验证方法对比商业软件如果有条件将同样的观测数据输入专业GNSS处理软件如RTKLIB、GrafNav等对比定位结果。静态已知点测试在已知精确坐标的测站上采集数据用你的程序处理比较解算坐标与已知坐标的差值。下一步深入学习方向卡尔曼滤波将最小二乘改为序贯处理的卡尔曼滤波可以更好地处理动态定位并融合其他传感器信息。精密单点定位PPP使用精密星历和钟差产品并引入更精细的误差模型实现厘米级甚至毫米级的绝对定位。差分定位RTK通过基站和移动站的观测值求差消除公共误差实现实时厘米级定位。这需要处理载波相位观测值涉及整周模糊度固定这一核心难题。多系统融合同时处理GPS、GLONASS、BDS、Galileo等多系统数据增加卫星数量提升在复杂环境下的可用性和精度。回过头看这个calculateuserpositon.rar里的程序就像是一把钥匙。它打开了一扇门让你看到了卫星导航定位这座大厦最底层的一块砖是如何砌成的。理解了这块砖你才能更好地理解上面更复杂的结构差分、PPP、RTK。自己动手把这块砖的烧制过程算法实现走一遍远比只看教科书上的图纸来得深刻。当你下次再使用任何GNSS定位库或软件时你就能更清楚地知道当你调用那个getPosition()函数时底层究竟发生了什么。这种“知其所以然”的踏实感是单纯调用API无法给予的。本文还有配套的精品资源点击获取
返回列表