GPS 工具包
用“爆炸性”或许最能形容近年来全球定位系统 (GPS) 市场的增长。促成因素有很多,或许最引人注目的是经济因素:访问 GPS 是完全免费的,而且硬件成本持续暴跌。因此,GPS 用户可以从各种提供位置估计的设备中进行选择。然而,长期以来,GPS 一直被用于探索定位以外的主题;空间天气、精确授时和大陆漂移只是三个例子。
为了将 GPS 用于高级主题或仅仅是为了提高定位精度,必须处理 GPS 接收器收集的原始观测数据。过去,此类处理的细节一直由专有软件负责。现在,一个名为 GPS 工具包或 GPSTk 的项目在 LGPL 许可下向开源和研究社区开放。GPSTk 是德克萨斯大学奥斯汀分校应用研究实验室 (ARL:UT) 自 1978 年第一颗卫星发射之前开展的 GPS 研究的副产品。它是许多软件工程师和科学家的共同努力。最近,ARL:UT 的研究人员决定将他们的大部分基本 GPS 处理软件开源,作为 GPSTk 发布。
全球定位系统实际上是美国政府的卫星导航系统,它提供民用信号。截至撰写本文时,该信号由 29 颗卫星组成的星座同时广播,每颗卫星的轨道周期为 12 小时。从地球上的任何给定位置,通常可以同时看到 8-12 颗卫星。

图 1. 来自航空航天公司网站的 GPS 卫星星座图像 (www.aero.org/news/current/gps-orbit.html)
每颗卫星以 1,575.42 和 1,227.6MHz 广播扩频信号,也称为 L1 和 L2。目前,民用信号仅在 L1 上广播。该信号包含两个组成部分:时间码和导航电文。通过将接收到的时间码与内部时间码进行差分,接收器可以确定信号传播的距离,即测距。此测距观测值会因(不完美的)接收器时钟中的误差而产生偏移;因此,它被称为伪距。导航电文包含卫星星历,它是卫星轨道的数值模型。
GPS 接收器除了记录伪距外,还记录一种称为载波相位或相位的测量值。相位也像伪距一样是测距观测值,只不过它添加了一个未知的常数,即相位模糊度。它也更平滑,测量噪声比伪距小约 100 倍,这使其对于精确定位非常有用。由于其测量方式,相位会发生随机的、突然的跳变。这些离散的变化总是以 GPS 信号波长的倍数出现,称为周跳。
用户位置的标准解算需要伪距测量值和视野中每颗卫星的星历。至少需要四个测量值,因为有四个未知数:位置的三个坐标加上接收器时钟偏移。官方 GPS 接口控制文件 ICD-GPS-200 中描述了解算的基本算法。位置解算会因两个误差源而受到破坏:观测误差和星历误差。
GPS 信号穿过地球大气层的每一层。每一层对信号的影响都不同。电离层是大气层中高海拔、带电的部分,它会在信号中引入延迟,从而产生测距误差。延迟与频率有关,因此如果您拥有两个 GPS 频率的数据,则可以直接计算延迟。对流层(大气层的较低部分)也会造成延迟。此延迟也可以建模并消除。许多其他误差与 GPS 信号相关。多径反射和相对论效应是两个例子。
更精确的应用通过一种称为差分 GPS (DGPS) 的技术来减少误差源的影响。通过对用户和附近的参考接收器同时收集的测量值进行差分,可以消除两个接收器共有的误差(大部分)。DGPS 定位的结果是相对于参考接收器的位置;将参考位置添加到 DGPS 解算中即可得到用户的绝对位置。
DGPS 的替代方法是显式地建模和消除误差。创建影响 GPS 信号的现象的新型稳健模型是 ARL:UT 和其他实验室的积极研究领域。定位算法可用于探索此类模型。本质上,基本方法是将定位算法内外颠倒,以查看校正本身。例如,来自接收器网络的观测值可以创建电离层的全局地图或模型。
可以通过使用更好的卫星星历来改进 GPS 位置解算。美国国家地理空间情报局 (NGA) 生成并公开提供许多精密星历,这些星历是更准确的卫星轨道。广播导航电文描述的卫星轨道误差约为米级,而精密星历的精度为分米级。国际 GPS 服务 (IGS) 是一项全球民用合作项目,也提供免费的精密星历产品。全球跟踪站网络产生观测数据,使精密星历的生成成为可能。
来自许多跟踪站的 GPS 观测数据可在互联网上免费获得。许多此类站点将其数据贡献给 IGS。此外,许多站点网络也将其数据发布到互联网上,例如澳大利亚区域 GPS 网络 (ARGN) 和包括 NASA 地壳动力学数据信息系统 (CDIS) 在内的全球合作组织。
通常,GPS 观测数据以研究人员开发和使用的标准化格式记录。此格式的基本思想是数据应独立于收集数据的接收器类型。因此,该格式称为接收机独立交换格式,或 RINEX。与 GPS 相关的另一种格式是 SP-3,它记录精密星历。GPSTk 支持 RINEX 和 SP-3 格式。
多年来,GPS 接收器变得越来越便宜,功能也越来越强大,尤其是手持式和移动 GPS 接收器。这些接收器有许多共同的特点。所有接收器每隔几秒钟都会输出一个位置解算。所有接收器都会存储位置列表,称为航点。许多接收器可以显示可以上传的地图。许多接收器可以与 PC 或手持设备通信,以存储信息或向绘图软件提供位置估计。
通常,与 PC 和其他系统的通信遵循国家海洋电子协会提供的标准,称为 NMEA-0183。NMEA-0183 定义了一种基于 ASCII 的格式,用于通信位置解算、航点和各种接收器诊断信息。以下是一行 NMEA 数据或语句的示例
$GPGLL,5133.81,N,00042.25,W*75
此处的数据是纬度、经度定位,位于北纬 51° 33.81 分,西经 0° 42.25 分。最后一部分是校验和。
作为公共标准,NMEA-0183 格式为 GPS 用户提供了选择自由。NMEA-0183 是使用接收器生成位置的开源应用程序最常使用的格式。
封闭标准也很常见。SiRF 是一种专有协议,已授权给接收器制造商。许多接收器制造商实施自己的二进制协议。尽管其中一些协议已向公众开放,但有些协议已被逆向工程。GPSBabel 是一个与消费级接收器通信的开源项目。Sharc 项目是一个类似的项目,旨在提供与测量级接收器的通信。
许多有趣的开源应用程序可用于消费级接收器。借助其中一个应用程序,您可以使用开源应用程序在您的汽车中导航。GPS Drive 项目可以帮助您做到这一点,它使用图形地图。GPS Drive 还可以链接到 Festival 应用程序,以语音输出的形式获取驾驶方向。WiGLE.net 等互联网站点列出了开放无线局域网的地理坐标;您可以使用您的 GPS 设备来查找这些网络。
传统上,DGPS 是通过两个或多个接收器利用无线电波通信位置信息来实现的。现在您可以使用开源应用程序通过 IP 进行 DGPS。名为 gpsd 的开源项目本质上是通过 TCP/IP 广播 NMEA-0183 语句。gps3d 项目允许您以 3D 方式可视化您的位置和 GPS 配置,它也可以使用 gps3d 服务器。
所有这些应用程序都基于标准定位。要将您的定位能力提升到一个新的水平,您必须直接处理接收器进行的观测。只有少数开源或免费程序可以为用户提供这种自由。OpenSourceGPS 是一个基于 Zarlink 芯片组创建 GPS 接收器的项目。UNAVCO 的 teqc 执行质量保证并处理来自接收器的原始数据以生成 RINEX,但它是闭源的。相比之下,GPSTk 的目的是使用户能够不仅操作 GPS 观测数据,而且还能改进处理算法。
GPS 工具包 (GPSTk) 完全用 ANSI C++ 编写。它是平台无关的,并且已经在 Linux、Solaris 和 Microsoft Windows 上构建和测试过。编写独立的、基于控制台的程序所需的一切都包含在内,以及几个完整的应用程序。
该设计是高度面向对象的。一切都包含在命名空间 gpstk:: 中。例如,读取和写入 RINEX 观测文件就像这样简单
// open, read and re-write a RINEX file using namespace gpstk; // input file stream RinexObsStream rin(inputfile); // output file stream RinexObsStream rout(outputfile, ios::out|ios::trunc); DayTime nextTime; //Date/time object RinexObsHeader head; //RINEX header object RinexObsData data; //RINEX data object // read the RINEX header rin >> head; rout.header = rin.header; rout << rout.header; // loop over all data epochs while (rin >> data) { nextTime = data.time; // change obs data& rout << data; }
该库的核心功能围绕 RINEX 文件 I/O 构建。它还包括一个完整的日期和时间类,用于处理 GPS 和许多其他格式的时间标签。
除了 RINEX I/O 之外,GPSTk 还包括用于处理大地坐标(纬度和经度)和 GPS 星历计算的类。还有一个完整的基于模板的矩阵和向量包。当然,还有 GPS 定位和导航算法,包括几个对流层模型。
最后,发行版中包含几个独立的程序。其中包括用于验证或修改 RINEX 文件的实用程序、摘要程序、用于删除或修改观测数据的实用程序、相位不连续性校正器以及用于计算标准误差和校正值(例如沿信号路径的电离层总电子含量 (TEC))的程序。
GPS 工具包可以 tarball 格式下载(请参阅在线资源部分)。要构建工具包,您需要使用 jam(make 的替代品)和 Doxygen(源代码文档生成器)。完整的构建序列如下所示
tar xvzf gpstk-1.0.tar.gz cd gpstk jam doxygen su jam -sPREFIX=/usr install
此序列构建并将 GPSTk 动态库和共享库以及头文件安装到 /usr 树中。此外,还会创建一个 doc 子目录,其中包含基于 HTML 的 GPSTk 库文档。
以下是 ARL:UT 创建的 GPSTk 的三个示例应用程序。第二个示例实际上是作为 GPSTk 的应用程序分发的。
与 GPS 接收器生成的位置解算相比,GPSTk 生成的位置解算提供更高的精度和鲁棒性。图 2 说明了这些优势;每个轴的范围从 -10 米到 10 米。
图 A 显示了位置计算以及它们如何沿东西方向和南北方向变化。这些结果代表了使用消费级 GPS 接收器创建的解算。图 B 显示了在考虑大气延迟后位置估计如何提高。直接处理不仅提高了精度,而且还提高了鲁棒性。图 C 显示了故障卫星的影响。在图 D 中,使用 GPSTk 检测并移除了故障卫星。
GPS 数据处理中的一个重要问题涉及载波相位的不连续性。在使用相位数据之前,必须找到并修复周跳。GPSTk 发行版包含一个名为不连续性校正器的应用程序,它正是做这件事的。此功能也在库中提供。
GPSTk 不连续性校正器的工作原理是形成双频相位数据的两个有用的线性组合,称为宽巷相位偏差和无几何相位。图 3 显示了正常数据的这些示例。宽巷偏差(红色)有噪声,但平均值恒定。无几何相位不依赖于接收器-卫星几何结构,但它强烈依赖于电离层延迟。事实上,它与该延迟成正比。通常,电离层是平静而平滑的,但有时它会变得活跃且粗糙;那么这个量可能会剧烈变化。无几何相位和宽巷噪声在数据集的两端都增加,因为卫星在那里正在升起或落下。因此,信号必须穿过更多的大气层。
不连续性校正器的工作原理是首先在宽巷相位偏差中查找周跳;图 4 说明了一个找到周跳的案例。当在宽巷周跳中发现周跳时,代码会转向无几何相位并在那里查找周跳。为了估计周跳的大小,将低阶多项式拟合到周跳两侧的数据,外推到周跳发生的点,然后进行差分。
ARL:UT 的另一个 GPSTk 应用程序涉及一颗携带 GPS 接收器的低地球轨道卫星。这颗卫星收集 GPS 数据,既用于其上方的卫星(称为顶部数据),也用于下方可见的卫星(或底部数据)。底部数据的 GPS 信号穿过大气层的路径长度很长,这非常适合大气的遥感。顶部数据用于计算 LEO 卫星在绕地球轨道运行时快速变化的位置。这里出现一个问题,因为顶部数据的收集数据速率(10 秒)低于底部数据(1 秒),但处理底部数据时需要 LEO 卫星的位置,且数据速率更高。为了解决这个问题,使用 GPSTk 编写了一个程序,该程序读取 GPS 数据,使用顶部数据计算 LEO 位置,然后将这些位置插值到 1 秒历元。结果如图 6 所示,它是 LEO 卫星绕地球轨道运行时位置的图。
GPS 工具包预期规模的开源 GPS 处理是前所未有的;我们对可能发展的情况感到兴奋。GPSTk 可能有广泛的受众。大学可以使用 GPSTk 通过开源代码处理 GPS 数据。嵌入式开发人员可以开发软件来执行 GPS 定位,并读取、写入和编辑 RINEX 数据文件。研究人员可能会发现,此代码是完全在软件中实现的 GPS 接收器(称为软件接收器)的绝佳基础。
尽管 GPSTk 的增长将很大程度上取决于用户反馈和参与,但变化也将受到卫星导航领域转变的驱动。在短期内,第一颗向民用人员提供双频伪距的卫星计划于 2005 年发射。此外,欧洲共同体正在创建 Galileo,它将提供与 GPS 兼容的公共监管服务,本质上是用一个新的星座增强当前的星座。从长远来看,GPS 将在 L5 和 M 代码中具有新的信号。GPSTk 凭借其对基础观测的强调,可以为探索和利用这些变化提供基础。
我们希望大学生、实验室研究人员、系统工程师和软件开发人员能够为 GPS 工具包做出贡献并从中受益。我们已经看到了在实验室内部使用此代码的许多好处,并相信 GPSTk 将激发许多创新型 GPS 应用。
本文的资源: /article/7651。
Brian W. Tolman 博士是德克萨斯大学应用研究实验室的研究科学家,在 GPS 相关研究、数据分析和软件开发方面拥有 18 年的经验。他拥有德克萨斯大学奥斯汀分校的理论物理学博士学位。
Ben Harris 是德克萨斯大学奥斯汀分校的工程科学家。当他不研究 GPS、攻读博士学位或与他美丽的家人共度时光时,他会重新编程电子动画鱼来表演《低俗小说》中的场景。