简介PDF文档聚焦商用GNSS数据处理软件的解算精度对比面向测绘工程、国土空间规划及GNSS数据处理相关技术人员。内容以TBC3.6V、HGO1.1.0V、SGO16.05.26三款软件为对象利用双星和三星实测数据进行基线解算与整网平差实验并以GAMIT/GLOBK结果作为精度参考通过7条长度约1km至86km的基线比较中误差与较差分析卫星高度角、时间采样率、多模卫星信号组合等因素对解算质量的影响。全文共1个PDF文件大小478KB下载后即可直接阅读。已有664人学习下载。读者可从中获得三款商用软件在基线解算和网平差方面的性能差异、参数设置对成果质量的作用规律以及复杂野外环境下GNSS数据处理软件的选择思路对开展高精度测量、工程应用或石漠化地区空间开发研究都有一定参考价值。1. 同样一段数据两家软件能差上厘米先把商用GNSS精度对比这件事想清楚同样一段 48 小时静态观测数据上周我用 A 软件解出来平面误差 5 毫米换 B 软件一跑变成 1.1 厘米高程更夸张从 8 毫米直接漂到接近 2 厘米。这不是哪个软件坏了而是精度对比的口径没对齐。商用GNSS数据处理软件解算精度对比分析核心并不是「谁跑出的数字小谁就赢」而是你要先回答三个问题基准是什么、参数是否公平、统计指标是否同口径。这篇笔记写给两类人一类是拿软件做测量方案选型和投标比测的工程师另一类是做成果验收、被两份报告数字差异问得头疼的项目负责人。如果你只是想「跑个数据看谁准」那可以关掉了如果你想搞清楚「差出来的那几毫米到底从哪来」下面这套对比流程可以直接照搬。2. 把对比的账算明白基准、数据与五个硬指标2.1 三种对比场景决定你该信哪个数字精度对比不是把两个软件的解算结果放一起比大小场景不同指标含义完全不同。我做对比时一般先分三类。第一类是已知点检核也叫外部符合检验。手上有参考站的精确坐标比如某机构发布的年度站点成果把观测数据分别用软件 A、B 解算算解算坐标和已知坐标的差值。这类场景最直接适合投标比测和验收但前提是参考站坐标要足够权威最好来自多家机构联合解算的长期成果而不是单次解算值。第二类是网内闭合检核适用于没有外部已知点的加密控制网。用两套软件分别解独立基线再组成闭合环看环闭合差。闭合差反映的是软件内部自洽性不能直接换算成绝对精度但能暴露基线解算的系统性偏差。我见过某种软件固定率很高但闭合环就是不闭最后查出来是参考站选取逻辑不同。第三类是重复性自检也可以叫内符合检验。同一时段数据切分成不同子时段或者把同一基线的不同解算策略结果放一起算重复性。这一项最考验软硬件稳定性和参数一致性也是后面自动化脚本里最值得长期跟踪的指标。三类场景没有谁完全替代谁我的做法是选型期做第一类项目期做第二类交付前三种各跑一轮。2.2 五个硬指标比「误差 5 毫米」这种话靠谱得多对比报告里最怕只写一句「点位误差优于 1 厘米」。点位误差是合成量平面和高程误差源完全不同混在一起等于把信息藏起来。我固定用五个指标含义和参考阈值如下。指标计算口径常见合格线三维点位误差解算坐标与已知坐标的三维距离短基线优于 1.5 厘米平面误差NE北、东方向分量 RMS优于 5 毫米 1ppm高程误差U高程分量 RMS优于 2 倍平面误差基线重复性同基线多时段解算值的离散程度优于 5 毫米 1ppm模糊度固定率固定解时段数 / 总时段数静态 ≥ 95%另外还有一个常被略掉的指标叫 NRMS归一化均方根残差我习惯在长基线解算里必看。NRMS 反映的是残差相对于理论噪声的比值接近 0.5 以内说明噪声模型合理超过 1.0 说明观测值里混进了未建模误差比如周跳没修干净或电离层残差太大。两个软件如果固定率同为 98%NRMS 一个 0.3 一个 0.9我会毫不犹豫选前者因为后者的「固定」很可能建立在过度宽松的验后残差阈值上。2.3 数据准备时长、采样、文件清单缺一项对比就偏指标再齐全数据质量不行也是白做。这里踩过不少坑按我的习惯整理成硬规矩。时长上短基线20 公里以内单时段最少 4 小时长基线100 公里以上至少 24 小时。对比实验不能只用一天数据至少三个连续天、每天两个独立时段否则相位的多路径周期性和卫星几何重复会掩盖软件差异。采样率统一设置为 15 秒或 30 秒不要用 1 赫兹高频数据直接灌给静态解算数据量大且对精度没有贡献。数据文件方面按这份清单准备文件作用缺了会怎样观测文件 OBS伪距、相位、信噪比无米之炊广播星历 NAV短基线快速解算长基线精度明显下降精密星历 SP3长基线、高精度解算高程方向吃大亏天线相位中心文件 ANTEX相位中心改正高程差 0.52 厘米测站信息文件天线类型、量高、测站名坐标错、高程全废补充一条血泪经验天线量高必须写进文件而且要让两个软件读同一份测量值。有人把天线高输错 2 毫米最后对比出来高程差 2 厘米查了一下午结果是其中一边单位写成了米。3. 参数对齐是第一步三个全局设置和五个必调解算参数3.1 先统一坐标框架与历元再谈解算精度这类对比最容易被忽略的一环是坐标框架。不同软件默认的参考框架和参考历元不同A 软件可能默认输出最近的框架历元坐标B 软件则直接输出观测历元坐标。两者在地壳运动活跃区域能差到厘米级比软件本身的解算差异还大。我一般这样处理给两个软件显式指定同一个参考框架和参考历元比如 ITRF 的某个参考历元同时打开板块运动模型改正。注意观测历元坐标和参考历元坐标之间隔着板块运动改正如果不统一短基线还好跨省的长基线上误差是系统性的。潮汐改正也必须对齐。固体潮对高程影响最大可达 12 厘米海潮负荷在沿海区域也有 13 厘米量级。商用软件通常默认开启但有的软件默认只开固体潮海潮要手动选对比前检查这三个开关状态固体潮、海潮负荷、极潮。建议全部开启保持同一配置。3.2 五个必调参数统一下来两边的数字才有的比参数对齐是精度对比的重头戏也是扯皮最多的地方。下面五个参数我每次必调顺序也固定。截止高度角。默认值五花八门有的 10 度、有的 15 度。低高度角卫星受多路径影响大但能增加几何图形强度设太高则短基线冗余度不足。对比实验统一用 10 度如果数据来自城市峡谷之类多路径严重的环境再用 15 度重算一组做敏感性分析。采样间隔。解算前把观测数据抽稀成 30 秒。很多人以为采样越密越好实际上静态解算相位观测强相关加密采样不能显著提高精度反而放大了电离层闪烁和多路径的短周期噪声。解算时清空原有采样率设置强制统一为 30 秒。模糊度固定策略。这是软件差异最大的地方。固定策略通常分连续固定和瞬时固定对比时统一选「固定解」模式同时记录固定的检验阈值比如 Ratio 值下限。我见过某软件固定率 100%但解算坐标比浮点解还差原因是对模糊度残差没有做卡方检验假固定。对流层延迟处理。短基线可以用差分方式消掉大部分但长基线和跨高度角地区必须建模。统一用 Saastamoinen 模型加映射函数气象参数用标准大气模型不要一个软件用实测气象、另一个用默认气象否则高程能差 2 厘米。电离层处理。双频数据统一用消电离层组合 LC单频数据则要关闭电离层估计选项。有一点常被忽略LC 组合放大了相位噪声所以 LC 解算的 NRMS 会比单频组合略高这不是软件坏了是数学特性。表格汇总一下我在三款软件里的统一配置参数项统一建议值备注截止高度角10°城市环境再用 15° 做敏感性测试采样间隔30s静态解算抽稀模糊度固定LAMBDA Ratio≥3.0打开验后残差卡方检验对流层Saastamoinen 映射函数长基线加估天顶湿延迟电离层LC 消电离层组合单频选 Brute 组合或关闭估计3.3 轨道产品广播星历和精密星历是两条精度路线每次对比前先定轨道产品。广播星历是实时产品精度大概在 1 米量级误差属于低频系统性偏差在差分处理中对短基线影响不大但基线超过 50 公里时误差开始露头精密星历是事后产品精度到 2.55 厘米长基线必须用。这个选择直接影响两个软件的可比性——一个用广播、一个用精密数字差再大也不说明任何问题。我是这么做的短基线对比统一用广播星历模拟实际生产环境长基线或高精度场景统一用最终精密星历并给两个软件喂完全相同的 SP3 文件。注意 SP3 文件里可能包含多个系统轨道要检查两个软件读取的系统数和星历钟差是否一致。3.4 最小实操统一文件格式与坐标输出商用软件输出格式差异很大有的给 XYZ有的给 BLH有的给站心坐标系还有的单位是度分秒。对比前用一个小脚本统一成同一格式可以省掉之后所有麻烦。下面是我常用的预处理脚本核心段。# 统一坐标输出格式把不同软件的结果转成标准文本 # 输入示例软件A输出 NEU 分量软件B输出 BLH import re def normalize_solution(text: str, source: str) - dict: 解析软件输出文本返回统一格式: { station: 站名, x: 0.0, y: 0.0, z: 0.0 } sol {} if source A: # A软件输出形如: NEU_station deltaN deltaE deltaU m re.search(rNEU_(\w)\s([-\d.])\s([-\d.])\s([-\d.]), text) # 简化处理: 这里假设 A 输出的是相对于已知点的增量 sol[station] m.group(1) sol[delta] (float(m.group(2)), float(m.group(3)), float(m.group(4))) elif source B: # B软件输出形如: station X Y Z m re.search(r(\w)\s([-\d.])\s([-\d.])\s([-\d.]), text) sol[station] m.group(1) sol[x] float(m.group(2)) sol[y] float(m.group(3)) sol[z] float(m.group(4)) return sol这段逻辑很简单就是把两边的文本输出收拢到同一个字典结构里。注意正则表达式的星号、锚点细节真实软件输出里站名和数字之间可能有多个空格用\s而不是单个空格。我建议把这段脚本扩展成一个小模块专门处理三家软件各自的注释头、单位标记和参数统计段落这样后续批量处理时不用每次改正则。4. 用脚本把对比跑起来结果解析与 NRMS、重复性统计4.1 结果解析别靠肉眼抄数字写个解析器商用软件的结果文件长得千奇百怪有的带表头、有的用空格分列、有的单位是度不是弧度。肉眼抄数字最不靠谱一是抄错行二是单位换算错。我把解析逻辑分成两步先解出测站坐标和固定率再解出基线向量。解析思路概括为按行扫描匹配关键字所在行抽取关键字后面的数值列。写代码时有一个容易被绊倒的地方就是两个软件一个用科学计数法一个用普通小数统一用正则[-]?\d*\.?\d(?:[eE][-]?\d)?抽取所有数值。4.2 计算脚本NRMS、RMS、重复性一次算齐拿到坐标之后就能跑指标计算了。下面这段代码完成三件事把地心直角坐标差值转到站心 NEU、计算 RMS、计算基线重复性。# 精度对比指标计算脚本 import numpy as np def ecef_to_neu(dx, dy, dz, lat_deg, lon_deg): 地心直角坐标差 (dX,dY,dZ) 转到站心 (dN,dE,dU) lat/lon 是参考站的经纬度 lat, lon np.deg2rad(lat_deg), np.deg2rad(lon_deg) sin_lat, cos_lat np.sin(lat), np.cos(lat) sin_lon, cos_lon np.sin(lon), np.cos(lon) dN -sin_lat * cos_lon * dx - sin_lat * sin_lon * dy cos_lat * dz dE -sin_lon * dx cos_lon * dy dU cos_lat * cos_lon * dx cos_lat * sin_lon * dy sin_lat * dz return dN, dE, dU def rms(values): RMS sqrt(mean(v^2))用于衡量偏差的典型大小 return float(np.sqrt(np.mean(np.square(values)))) def baseline_repeatability(lengths_m): 基线重复性: 多时段解算长度的标准差 / 平均长度 返回 (标准差, 相对 ppm) arr np.array(lengths_m) std float(np.std(arr, ddof1)) mean float(np.mean(arr)) return std, std / mean * 1e6 # 示例两组软件解算的 dN/dE/dU 列表单位米 dN_a, dE_a, dU_a [0.004, 0.005, 0.003], [0.003, 0.002, 0.004], [0.008, 0.010, 0.009] dN_b, dE_b, dU_b [-0.002, -0.001, 0.001], [0.001, 0.002, 0.000], [0.002, 0.003, 0.001] print(软件A 平面RMS:, rms(dN_a dE_a), 高程RMS:, rms(dU_a)) print(软件B 平面RMS:, rms(dN_b dE_b), 高程RMS:, rms(dU_b))这段代码里的ecef_to_neu是最容易写错的函数旋转矩阵的行列顺序跟参考椭球的定位有关。我推荐直接抓取参考站的已知经纬度作为旋转参数这比用待定坐标稳定得多因为偏差量只在毫米到厘米级时经纬度取值的微小差异不会影响结果。baseline_repeatability算出来的 ppm 值可以直接对标厂商标称精度比如标称「5mm 1ppm」基线 200 公里时允许误差就是 205 毫米这个数在长基线工程里经常被大家记错。4.3 用统计口径说结论均值、最大值和分布都要看只报 RMS 是远远不够的。我通常会看三个统计量RMS典型偏差、最大值最差时段、符号偏向正负偏差的分布。如果是正态分布的偶然误差正负应该大致对称如果符号明显偏向一边哪怕 RMS 很小也说明存在系统性误差——通常指向坐标框架或对流层模型。还有一个判断技巧把同一时段的两个软件解算结果做差值时间序列。如果差值曲线呈现明显的周期波动周期接近卫星轨道重复周期约 1 天说明某个软件的某些时段没有正确修复周跳导致相位模糊度解算不一致。这种情况光看 RMS 看不出问题但画出来立刻暴露。5. GNSS 精度对比的五个坑现象、原因和对应的解决5.1 坐标框架不一致整体偏移 2 厘米现象两台软件解算的坐标都通过了单点检核误差都在 5 毫米内但两套坐标之间的差值高达 2 厘米并且所有测站差值方向一致。 原因A 软件默认输出 ITRF 参考历元坐标B 软件输出了观测历元坐标板块运动改正没有对齐。 解决在两边输出文件里查找参考框架和历元字段没有字段的就手动加上已知的框架转换参数。最容易的办法是两套结果统一转到同一历元的同一框架之后再对比不要直接拿原始输出比。5.2 模糊度固定率虚高假固定骗过所有人现象某软件报告固定率 99%但坐标解算结果比另一家浮点解还差固定率越高偏差反而越大。 原因模糊度固定的检核阈值没开或者 Ratio 检验阈值设得太低把大量未收敛的模糊度「硬固定」了。 解决检查固定策略里的 Ratio 阈值静态解算没有特殊理由不要低于 3.0同时打开验后方差检验。对比时把两家软件的检验阈值统一并在报告里注明判断标准。5.3 天线相位中心模型不一致高程差出 1.5 厘米现象平面方向两个软件几乎一致高程方向稳定差出 1.5 厘米左右。 原因一个软件默认使用绝对相位中心校正PCC另一个软件默认使用相对相位中心模型再加上天线罩参数读没读对叠加起来就是厘米级。 解决统一使用同一份 ANTEX 天线相位中心文件并检查测站天线类型和天线罩类型是否一致。特别提醒天线类型写错一个字改正值就会变成另一个型号的数据这种错最难查。5.4 对流层参数不一致长基线高程被系统性吃低现象基线超过 80 公里时高程方向误差与基线长度强相关误差还全是负值。 原因两个软件对天顶湿延迟的处理不同一个在估计湿延迟另一个只做了干延迟模型改正或者映射函数不同导致高仰角权重分配不一致。 解决长基线对比统一设置「估计天顶湿延迟 梯度」并且两个软件使用相同的气象标准大气参数。如果还不放心可以额外输出对流层估计值数值差超过 3 毫米就得回头查参数。5.5 参考站选取不一致网成果直接不闭合现象同一条基线A 软件解算结果比 B 软件长 4 毫米反过来用 B 软件解另一条基线又不闭合对照 CORS 参考站也不吻合。 原因软件开发者在参考站自动选取逻辑上有差异有的默认选最近的 3 个站有的选观测质量最好的 5 个站导致网型不同。 解决对比实验统一手动指定同一组参考站关闭自动选站。检查选站时顺便看一眼参考站自身的多路径指标超过某阈值就换成备用站。6. 把交叉对比变成交付前的例行检查上面的流程跑通之后我把这个对比方案做成了一个接近半自动的检查流程现在每次交付前多花十分钟就能跑完。核心就三步先跑脚本出指标再按阈值自动判读是否合格最后把两套软件结果差异超过阈值的点单独挑出来人工复核。这里有一个很实用的技巧与其每次手动比数字不如给两个软件的解算差值设一个硬门槛。平面差超 8 毫米、高程差超 1.5 厘米时自动告警超过阈值的一律不合并出报告先排查是参数问题还是数据问题。写一个简单的 bash 判断就能完成# 检查 A/B 两套解算结果的高程差是否超限 # 第3列是高程(单位 m)第4列是测站名 awk {if ($3 - prev 0.015) print 高程超限:, $0, 差值, $3 - prev} \ (paste (grep -P .* dis_A.txt) (grep -P .* dis_B.txt))这个命令把两套结果按站逐行拼接直接比较差值。awk 里$3 - prev的写法是简化的示意真实场景建议写一个 python 脚本做稳健的比较。重点不在命令本身而在「阈值判读」这个习惯把对比从人的肉眼判断变成自动化检查结果更可靠也更能追溯。我现在的习惯已经固定下来只要换一版星历、改一次参数配置或者换一个商业软件版本都会先把同一组静态数据用 A/B 两套软件跑一遍交叉对照确认差值在阈值内才动项目数据。这个方法帮我挡掉过至少三次让成果返工的隐患。精度对比不是要找「最准的软件」而是要找到「在你自己参数口径下、结果最可控的方案」。希望帮到你。本文还有配套的精品资源点击获取