GAMIT/GLOBK 10.71 高精度GNSS数据处理:从Linux环境搭建到首次基线解算实战

发布时间:2026/8/2 10:00:36
GAMIT/GLOBK 10.71 高精度GNSS数据处理:从Linux环境搭建到首次基线解算实战
1. 从零开始为什么选择GAMIT/GLOBK如果你刚接触GNSS数据处理面对GAMIT/GLOBK这个“上古神器”第一反应可能是这都什么年代了界面这么原始为什么不用商业软件或者更“现代”的开源工具我刚开始接触时也有这个疑问但真正用它处理了几个项目的数据后才明白它在高精度科研和特定工程领域不可替代的地位。简单来说GAMIT/GLOBK是一套由麻省理工学院MIT和斯克里普斯海洋研究所SIO开发、维护的用于高精度GNSS全球导航卫星系统数据处理的科研级软件。它的核心优势在于“绝对精度”和“完全可控”。商业软件或一些集成化平台为了易用性往往将底层模型和参数选择做了大量封装和默认设置你只需要点“处理”按钮。但当你需要研究某个特定的大气延迟模型、深入分析某一类系统误差、或者处理极端基线比如上万公里的洲际基线时GAMIT/GLOBK提供的这种从底层模型到处理策略的完全可定制性就变得至关重要。它能让你清楚地知道数据处理的每一个环节到底发生了什么。对于入门者学习GAMIT/GLOBK有双重意义。第一是“练内功”。通过手动配置各种文件、理解处理流程你能从根本上掌握高精度GNSS数据处理的原理比如卫星轨道、地球自转、大气延迟、相位模糊度固定等核心概念是如何在软件中具体实现的。这比单纯使用“黑箱”软件收获大得多。第二是“获得一把利器”。一旦掌握你便拥有了处理从区域网到全球网、从静态到动态需结合其他工具、满足毫米级精度要求科研数据的能力。许多国际上的地球动力学研究、参考框架维持、高精度工程变形监测其底层数据处理依然依赖于GAMIT/GLOBK或其衍生版本。我这次分享的基于10.71版本的入门教程目标就是帮你跨过“从安装到跑通第一个算例”这个最艰难的门槛。网上资料虽多但往往年代久远、步骤缺失、环境不一让新手无所适从。我会结合最新的Linux环境Ubuntu 20.04/22.04 LTS把每一步的操作意图、可能遇到的“坑”以及背后的原因都讲清楚。请记住本教程是“入门级别仅供参考”旨在构建一个可运行的基础环境并完成一次标准的静态数据处理更复杂的策略和科研应用需要你在基础上继续探索。2. 环境奠基Linux系统准备与软件安装详解GAMIT/GLOBK 10.71版本虽然相对较老但其编译和运行对Linux系统仍有特定要求。盲目安装最新系统可能会遇到库文件不兼容的问题。经过多次测试Ubuntu 20.04 LTS或22.04 LTS是比较稳妥的选择它们提供了较新的编译器同时保留了必要的兼容库。2.1 系统基础环境配置首先我们需要安装一系列编译和运行所需的依赖库。打开终端执行以下命令更新软件源并安装核心工具链sudo apt-get update sudo apt-get upgrade -y sudo apt-get install -y gcc gfortran make csh libx11-dev tcsh \ gmt gmt-dcw gmt-gshhg netcdf-bin libnetcdf-dev \ libhdf5-serial-dev libgmt-dev这里解释一下几个关键包的作用gcc,gfortran,make: 编译器的“铁三角”。GAMIT主体由Fortran编写需要gfortran部分工具和脚本用C需要gcc。csh,tcsh: GAMIT的大量控制脚本是基于C Shell编写的所以必须安装。在Ubuntu上默认的bash shell无法直接运行这些脚本。libx11-dev: 提供X11图形库的头文件某些图形化工具如sh_gamit的编译需要它。gmt系列通用制图工具。GAMIT的结果可视化工具sh_plot会调用GMT进行绘图虽然入门处理不一定立即用到但预先安装能避免后续麻烦。netcdf系列网络通用数据格式库用于处理大气模型等数据。libhdf5-serial-dev: HDF5格式支持库某些数据读取需要。注意如果你使用的是Ubuntu 22.04或更新版本可能会发现libhdf5-serial-dev包已被替换。如果安装失败可以尝试安装libhdf5-dev。但需注意HDF5库版本过高有时会导致编译时链接错误这是后续可能遇到的一个“坑”。2.2 获取GAMIT/GLOBK源代码并解压GAMIT/GLOBK并非通过包管理器安装我们需要从其官方FTP服务器手动下载源代码。建议在主目录下创建一个专门的工作目录。cd ~ mkdir gamit_work cd gamit_work # 使用wget下载压缩包。请注意FTP链接有时可能不稳定。 wget ftp://garner.ucsd.edu/pub/gamit/install_software/gamit_10.71.tar.gz wget ftp://garner.ucsd.edu/pub/gamit/install_software/gamit_10.71_libs.tar.gz wget ftp://garner.ucsd.edu/pub/gamit/install_software/gamit_10.71_src.tar.gz # 解压所有文件 tar -xzf gamit_10.71.tar.gz tar -xzf gamit_10.71_libs.tar.gz tar -xzf gamit_10.71_src.tar.gz解压后你会看到三个主要的目录com、gamit、kf。com存放公共库和头文件gamit是主程序源代码kf是GLOBK卡尔曼滤波部分源代码。2.3 编译安装步步为营破解常见错误编译是安装过程中最容易出错的一环。我们需要按顺序编译库、工具和主程序。首先设置必要的环境变量。编辑你的shell配置文件如果你用的是bash通常是~/.bashrc如果你为了兼容GAMIT脚本而使用了tcsh则是~/.cshrc。这里以bash为例echo # GAMIT/GLOBK Environment Variables ~/.bashrc echo export PATH$PATH:~/gamit_work/gamit/bin:~/gamit_work/kf/bin ~/.bashrc echo export HELP_DIR~/gamit_work/gamit/help ~/.bashrc # 使环境变量立即生效 source ~/.bashrc接下来进入安装脚本目录并开始编译cd ~/gamit_work/gamit/install # 运行安装脚本 ./install_software安装脚本会交互式地提问。对于大多数问题直接按回车采用默认值即可。但有几个关键点需要你关注或手动干预编译器选择脚本通常会检测到gfortran和gcc确认即可。库路径确认库文件路径为~/gamit_work/com。最大站数、最大卫星数等入门学习使用默认值即可。这些参数决定了程序数组的维度如果后续处理超大规模网络可能需要重新编译修改这些参数。编译过程可能持续10-30分钟。在这个过程中极有可能遇到错误。以下是两个最常见的错误及其解决方案错误一make: gfortran: Command not found这通常意味着gfortran虽然安装了但安装脚本没有找到。请检查gfortran --version。有时需要安装gfortran-9或特定版本并使用sudo update-alternatives --config gfortran来确保系统默认使用的是正确的版本。错误二与HDF5库相关的链接错误如undefined reference toH5Fopen这是高版本Ubuntu如22.04的常见问题。因为系统自带的HDF5库版本较新而GAMIT 10.71的代码可能链接了旧版本的函数。解决方案是修改Makefile配置。找到~/gamit_work/com/Makefile.config文件。寻找以HDF5_LIB、HDF5_INC开头的行。将其注释掉在行首加#或者将其值改为空。这相当于告诉编译器不要链接HDF5库。对于入门级的基线解算不依赖HDF5格式的输入数据所以可以安全禁用。保存文件回到install_software脚本运行的终端按回车键继续脚本通常会等待你修复错误后继续。编译成功后脚本最后会提示你运行sh_gamit来测试。在终端输入sh_gamit如果出现一个图形界面可能需要X11转发支持或者至少没有报“command not found”说明主程序安装基本成功。同时检查~/gamit_work/gamit/bin和~/gamit_work/kf/bin目录下是否生成了大量的可执行文件如doysh_gamitgfzrnx等。3. 数据与表文件构建解算的“弹药库”软件安装好比准备好了枪械但真正开始“射击”解算前还需要子弹和校准器——也就是数据和表文件。GAMIT/GLOBK的运行严重依赖于一系列标准化的表文件Tables和观测数据。3.1 表文件Tables详解与获取表文件存放在~/gamit_work/gamit/tables目录下它们定义了数据处理所需的各类模型和参数。对于初次使用最关键的是获取当年或你所处理数据时间段的、版本一致的表文件。表文件需要从SOPAC、CDDIS等数据中心下载。我们将使用GAMIT自带的一个非常实用的工具sh_get_rinex来同时获取表文件和观测数据。首先我们需要准备一个测站列表文件。创建一个名为station.list的文本文件内容如下IISC 2024 001 2024 365 L1L2这行命令的含义是下载测站IISC印度班加罗尔的一个IGS站从2024年年积日001到365的观测数据L1L2表示双频数据。选择IGS核心站是因为其数据质量高、连续性好非常适合做第一个练习。接下来运行命令获取数据和表文件cd ~/gamit_work # 创建本次实验的目录 mkdir first_test cd first_test # 使用sh_get_rinex脚本。它会自动下载表文件到../tables下载数据到当前目录。 sh_get_rinex -archive sopac -yr 2024 -list ../station.list-archive sopac指定从SOPAC数据中心下载。这个脚本的强大之处在于它会自动检查并下载你本地tables目录中缺失的或版本过旧的所有必要表文件包括luntab.月亮星历表soltab.太阳星历表pole.极移表ut1.UT1-UTC表leap.sec闰秒文件rcvant.dat接收机天线类型及相位中心改正文件svnav.dat卫星天线相位中心改正文件dcb.dat差分码偏差文件实操心得sh_get_rinex是入门阶段最好的朋友。手动一个个寻找和下载这些表文件极其繁琐且容易出错。务必确保运行此脚本时网络通畅。如果下载中断可以重新运行脚本会跳过已存在的文件继续下载。3.2 观测数据与星历文件准备上一步的命令也会将IISC站2024年第一天的观测数据RINEX格式下载到当前目录文件名类似iisc0010.24o.Z压缩格式。我们需要解压它uncompress iisc0010.24o.Z解压后得到iisc0010.24o。这就是我们需要的观测值文件。除了测站观测数据我们还需要卫星的精密星历。同样可以使用sh_get_rinex或专门的sh_get_orbits脚本下载。这里我们手动下载当天的精密星历SP3格式和广播星历BRDC# 从CDDIS下载精密星历igs表示IGS最终轨道sp3格式 sh_get_orbits -yr 2024 -doy 001 -archive cddis -orbit igs # 下载广播星历brdc格式 sh_get_rinex -archive cddis -yr 2024 -doy 001 -type brdc执行后你会在目录下看到igs00100.sp3.Z和brdc0010.24n.Z解压它们。最终你的first_test目录里应该至少包含iisc0010.24o观测文件brdc0010.24n广播星历igs00100.sp3精密星历以及station.info一个由下载过程生成的测站信息文件但通常需要手动检查修改。3.3 关键配置文件station.info 与 session.infostation.info是GAMIT解算中最重要的控制文件之一它描述了每个测站的元信息。自动生成的文件往往不完整或不准确必须手动核对和编辑。用文本编辑器打开station.info你会看到类似以下内容IISC 2024001 2024365 IISC BANGALORE 13.0210 77.5701 0.0000 G GPS格式为测站代号 起始年积日 结束年积日 接收机类型 天线类型 近似经度 近似纬度 近似高 标记 GPS。这里的问题在于接收机类型和天线类型被错误地都填成了IISC而近似经度/纬度/高的精度也不够。我们需要根据测站的实际信息进行修正。访问IGS站日志网站如https://igs.org/network/station-info/搜索IISC。找到其接收机类型如TRIMBLE NETR9、天线类型如TRM59800.00以及精确的近似坐标可从日志或SINEX文件中获取。修改后的行应类似IISC 2024001 2024365 TRIMBLE NETR9 TRM59800.00 77.570100 13.021000 850.0000 G GPS注意近似坐标的精度很重要它用于计算模型改正如大气延迟的初始值。误差最好在几十米内。可以从RINEX文件头或IGS提供的坐标文件中获取。另一个文件是session.info它定义了本次处理的基本参数。我们可以在运行处理流程时由脚本自动生成但了解其结构有益无害。一个简单的session.info可以手动创建2024 001 001 0 0 0 0 86400 30 IISC含义起始年2024、起始年积日001、结束年积日001、起始秒0、结束秒0、采样间隔30秒、测站列表IISC。0 0 86400表示处理全天数据。4. 首次解算实战流程拆解与结果解读万事俱备现在可以开始我们的第一次解算了。我们将使用GAMIT的自动化脚本sh_gamit来驱动整个流程。虽然它有一个图形界面GUI但为了深入理解我们从命令行开始并解释其背后每一步在做什么。4.1 使用 sh_gamit 进行流程化处理在first_test目录下执行以下命令sh_gamit -expt test -d 2024 001 -orbit IGSF -pres ELEV -noftp -dopts -c我们来分解这个命令的每一个参数-expt test: 设置实验名为test所有输出文件将以test为前缀。-d 2024 001: 指定处理日期为2024年年积日001。-orbit IGSF: 使用IGS最终精密星历igs00100.sp3。如果下载的是快速星历IGR则用IGRF。-pres ELEV: 设置截止高度角为10度ELEV是默认值代表10度。低于此高度的卫星数据将被剔除。-noftp: 不要从网络自动下载数据。因为我们已手动下载好所有文件。-dopts -c: 这是-dopts处理选项后面跟的子选项。-c表示进行“Clean”处理即删除中间过程文件只保留最终结果。第一次运行时可以不加-c以便查看中间文件来调试。执行命令后脚本会开始运行。它会依次调用多个核心程序sh_check_sess: 检查会话和测站信息。makexp: 根据session.info和station.info生成本次解算的流程控制文件test.makexp.batch。fixdrv: 读取上一步生成的文件创建驱动整个批处理的脚本test.batch。执行test.batch: 这是一个C Shell脚本它会按顺序调用makej生成精密星历文件test.j。makex从RINEX观测文件生成GAMIT格式的观测文件test.obs。fixnav生成广播星历文件test.n。cview可选的数据检查工具。arc轨道积分将精密星历拟合为轨道参数。model计算观测值的理论值几何距离并施加各种模型改正天线相位中心、潮汐、大气延迟等。autcln自动数据清理标记和周跳修复。cfmr单差模糊度形成。solve最小二乘参数估计生成解算结果。整个过程如果顺利会在终端看到一系列程序执行输出最后提示“Processing completed”。在目录下会生成大量文件其中对我们最重要的结果是test.apr、test.org、test.sum。4.2 结果文件解读与质量评估第一次运行很可能不会一帆风顺。我们需要学会看日志和总结文件来诊断问题。首先检查处理总结文件test.sum。用文本编辑器打开滚动到最后部分。你会看到类似这样的总结表格POST-FIT SUMMARY Site East(m) North(m) Height(m) E-N(m) E-H(m) N-H(m) Revs Total Good RMS IISC 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0 0 0 0.000糟糕所有参数都是零没有有效解。这是新手最常见的结果。原因通常是多方面的我们需要向上查看test.sum文件中的错误和警告信息以及各个程序的日志文件如autcln.post.sum、solve.post.sum。一个非常常见的原因是测站近似坐标误差太大导致model程序计算的理论距离和实际观测值相差巨大autcln无法有效修复周跳最终solve无法解算参数。回顾我们之前station.info中的近似坐标如果只是随意填的就可能出现此问题。如何获取更好的近似坐标从下载的RINEX文件头中获取。使用命令grep -A 5 APPROX POSITION iisc0010.24o。从sh_get_rinex下载时如果使用了-pos选项它会尝试从数据库获取并写入station.info但有时不准。使用广播星历和单点定位快速估算。GAMIT的sh_sp3fit或其他开源工具如RTKLIB的rnx2rtkp可以快速计算一个坐标。假设我们从RINEX头文件中获取到精确的近似坐标XYZ地固坐标系我们需要将其转换为经纬高。可以使用GAMIT自带的doy工具进行粗略转换或者使用在线计算器。更新station.info中的近似坐标后必须删除旧的解算中间文件重新运行sh_gamit。# 删除上一次运行产生的主要中间文件和结果文件但保留原始数据 rm test.* # 再次运行sh_gamit sh_gamit -expt test -d 2024 001 -orbit IGSF -pres ELEV -noftp这次再看test.sum的POST-FIT SUMMARY你可能会看到POST-FIT SUMMARY Site East(m) North(m) Height(m) E-N(m) E-H(m) N-H(m) Revs Total Good RMS IISC 0.0012 -0.0005 0.0023 0.0011 0.0018 0.0012 24 1200 1156 0.012这看起来就健康多了解读如下East,North,Height: 测站坐标相对于先验值的改正数单位米。数值很小毫米/厘米级说明先验坐标很准解算收敛。E-N,E-H,N-H: 坐标参数之间的相关系数。Revs: 成功固定模糊度的弧段数量。Total,Good: 总观测值数和被采用的好观测值数。RMS: 观测值残差的均方根单位是米。0.012米12毫米对于单天单站解算来说是一个合理的值。此外检查autcln.post.sum文件看数据利用率如何。如果Good数量远小于Total说明数据剔除严重可能需要调整autcln的控制参数在sestbl.文件中。4.3 单基线解算尝试单站解算严格说是“单点定位”但GAMIT的model和solve是基于相对定位原理的单站解算意义有限更多是用于验证流程。更标准的入门练习是处理一条基线。我们需要再下载一个IGS站的同一天数据。修改station.list为IISC 2024 001 2024 001 L1L2 HRAO 2024 001 2024 001 L1L2HRAO是南非哈特贝斯霍克的一个IGS站。再次运行sh_get_rinex下载数据和更新表文件。更新station.info添加HRAO的准确信息。然后再次运行sh_gamit记得先清理旧文件。这次在test.sum中你会看到两个站的结果并且解算类型是“基线解”。关注整体的RMS和Chi-square卡方值统计量。一条健康的短基线相位残差RMS通常在5毫米以下。踩坑实录在第一次处理基线时我遇到了solve程序报错“Matrix singular or ill-conditioned”。这通常意味着参数之间强相关无法求解。对于双站基线最常见的原因是两个测站的接收机或天线类型在station.info中定义错误或缺失导致某些参数无法被正确区分。另一个原因是process.defaults或sestbl.文件中的参数设置过于宽松导致待估参数过多。解决方案是仔细核对station.info并确保使用了正确的rcvant.dat和svnav.dat表文件。对于短基线可以在sestbl.中将天顶对流层延迟参数ZEN设置为“ESTIMATE”而不是“RELAX”或者将模糊度解算模式设置为“LC_AUTCLN”在process.defaults中设置use_ion为LC以简化模型。