译者注: 原文地址,翻译仅作学习交流,不可用于任何商业用途。

GPS

全球定位系统毫无疑问是 20 世纪最有用的发明之一。 它让轮船、飞机、汽车以及远足的人们能够弄清楚自己精准的位置。

环绕地球的卫星是这个系统最令人兴奋的方面之一。 下面是当前活跃卫星的星座图,你可以拖拽视图从不同的角度观察:

然而,卫星只是让 GPS 成为可能的一个方面。 通过这篇文章我会详细解释卫星的运动,卫星如何帮助 GPS 接收器确定自己的位置,以及这套系统是通过什么聪明的方法 让来自太空的信号是在地球上被可靠地解码。

首先我们来建立一个能够告诉我们在哪里的位置系统。 第一个版本非常简单,但是我们会以此为基础不断迭代,在过程中理解 GPS 的定位原理。

简单定位

下面是一小块可以操作的世界。那个小的 黄色雕像 代表我们的位置,你可以在场景里随意的拖拽它。 你也可以拖拽场景本身来改变视角。 右边的视图是这场景的地图,接下来我们的目标是尽可能 准确 地在图上标出 雕像 的位置:

这个任务看起来有点令人生畏,但请留意场景里有 三个 地标 ,它们很容易在地图上参考。 利用这三个参照物我们就可以把雕像的位置近似地标记在地图上。

如果我们站在其中一个彩色地标上,我们可以直接在地图上标出我们的位置。 但当我们迈出一小步后,精确度就会下降, 虽然还是可以估计出我们的位置,但是如果离得越来越远,估计的不确定性就会逐渐增加。

我们可以在地图上画一个 黄色区域 来代表估计位置。 圈的大小代表了不确定性 - 猜的越不准圈就越大。 根据我们和地标的相对位置,可以大致标出 黄色区域 的位置。 比如,如果我们在 绿色地标蓝色地标 之间,在地图上也是在两个点之间:

我们离地标越远不确定性就越大,但我们到地标的 距离 本身就带着某种信息。 如果把 绳子的一头系在 地标上,拽着另一头向外走,到某个程度就不能再继续了。 实际上,如果我们一直拉紧绳子,那我们的动作就会被到限制到围着地标的一个圆形路径里:

因为 绳子 的长度是固定的, 所以圆上每个点到 地标 的距离也是固定的。 如果不用 绳子 我们可以拿一个卷尺来测量我们到地标的距离。 测得距离后我们可以在地图上画一个等比例的圈。 我们知道自己肯定在圈上某处,因为圈上各个点到 地标 的距离都一样:

如果我们同时记录着到 第二个地标 的距离,我们便可以知道自己的位置就在这两个圆交界的地方,因为只有交界处到两个地标的距离是确定的:

如果测量两个距离那么可能的位置只有两个。通过测量到 第三个地标 的距离可以把可能的位置缩减到一个:

注意这第三个距离通常是多余的。一般我们通过观察到地表的相对位置就能 “知道” 这两个可能的位置哪一个是准确的。 下面的例子里我们分别测量了到两个地标的距离,只要不是和地标几乎处在同一直线上,处于哪个位置显而易见:

通过测量距离计算位置的方法叫做 三角定位法,这是 GPS 接收器的核心。 但是 GPS 显然 不是 靠两三个卷尺工作的,所以我们来继续改进我们的定位系统吧:

飞行时间

卷尺唯一的作用就是测量距离,但是测量距离的方法绝不是只有这一种。 举个例子,当我们以 60 英里60 公里 每小时的 匀速 驾驶一辆小汽车,我们可以很容易计算出我们在 15 分钟内移动的距离大约是 15 英里15 公里 标注:这里我使用的是 英制 公制,你也可以 切换公制 英制

从一个点到另一个点除了开车,我们也可以飞无人机。下面这个例子里我们用一个滑块控制 时间 进度。 无人机旅途的开始和结束用手表上的 蓝色弧线 表示:

示例底部有一个时间线来跟踪飞行时间,你可以想象把表上的弧线拉成直线。 注意蓝色条的长度就代表着飞行时间,也就是飞行距离。 当你 改变 雕像位置的时候,预计飞行时间也会跟着改变:

无人匀速飞行让我们可以用 时间 测量距离,因为距离 s 等于飞行时间 t 乘以飞行速度 v

s = v × t

让我们来看看怎么用两个无人机代替卷尺进行距离的测量。 在下面这个例子里,我们同时放飞了两台无人机,还是通过滑块控制 time

随着无人机到达目的地,我们直接得到和各个地标的距离并在时间线上用对应条的长度表示。 依据此数据我们可以画出两个圈从而定位我们的位置。

使用无人机测量距离的方法比拿尺子量限制少得多,但是听起来还是有一点荒谬。 不过引入飞行时间的主意很不错,我们需要做的找到一个更快更便捷的信使。

幸运的是并没有找太久。我们可以利用无人机飞行依赖的介质 - 空气 本身。 我们可以制造点噪声并让空气自己来传播 声音,而不是通过小型机器的快速移动来产生升力。

你听得到我吗?

虽然很近的时候声音的传播几乎是瞬间的,但是当距离拉长后,我们一定会见识到声音的传播速度是受限的 - 你很可能经历过打雷时先 看到 闪电,间隔一段时间后才 听到 声音。 甚至有一个很有用的经验法则:每隔 5 3 秒 就意味着闪电和你的距离增加 1 英里1 公里

简单设置后我们就可以用声音来测量距离。 我们在每个地标上放一个麦克风和一个灯泡 - 麦克风收到声音的时候会点亮。 要测量到地标的距离,我们会发出一个声音 - 声音的传播用 深色的环 表示。 随着 时间 声波会越传越远,我们记录下灯泡亮起的时间:

我们先暂时忽略光速导致的延迟,因为它在我们目前有限的尺度上继续可以忽略不计。 如果我们在另一个地标上也装上麦克风和灯泡, 我们就得到了一个能测量距离的可靠系统,进而可以在地图上画圈和标记我们的位置:

这套方案工作得很好,但是有一个致命的缺陷。 一旦其他人也在定位的时候,我们就很难分辨出灯泡的闪光是由自己还是其他人导致的。 下面这个例子我们增加了一个也在定位的 红色的雕像 看看会发生什么:

请注意我们并不知道是应该在灯泡第一次还是第二次闪光的时候停止计时,也许这个测量的方法根本就是错误。 即使我们用了更健壮的方法来计算三个圆圈的交集,我们也经常无法收敛到一个点。 只要同一时间测量的人越多,每个人估算的误差就越大,更不用说大家发出声音的时刻不尽相同。

这套方法的问题是我们创建了一个 主动 的系统,在这样的系统里地标会主动的响应使用者获得信息的请求。 一旦使用者增多,系统的复杂性就会大幅地增加。 即使我们想出巧妙的方法来让地标甄别输入信号并给出不同的响应,也无法保证不会有部分用户使整个系统过载。

幸运的是,我们可以将整个系统调转来解决问题。 即让地标发出声音信号、使用者接收声音而不是倒过来。

我听到你吗?

我们来改造地标,装上一个喇叭并每隔 1 分钟,且在 分钟的开始 的时候也就是表上秒针指向 0 的时候发出声音。 当我们听到一个信号就检查手表看看多长时间进而算出距离:

这个方案看起来行得通,但还有一点要注意。 这里用到了 块表,一块在我们手上,另一块在地标里驱动声音发出。 这两块表并不绝对同步。

在下里面这个例子里你可以认为地标的时间为 系统时间, 手表时间作为 用户时间, 手表时间或多或少都存在一定的 偏差。 不过还好如果两个钟是并排放的,我们可以通过第二个滑块手动修正这个偏差

注意底部的时间线上同时显示了 系统时间用户时间, 如果时钟不保持同步我们就无法准确的跟踪时间。

不过当我们在户外探索的时候就没有办法访问到 系统时钟 了,进而没有办法照着 系统时间 调整我们的 用户时钟。 即使我们开始的时候调整好了时钟, 但是随着时间它们会发生漂移。 这样我们测出的时间就和 系统时间 存在偏差。

这会导致可怕的结果 - 地标总是在 系统时间 每分钟开始的时候发出信号,但在我们看来这是在 用户时间 每分钟开始的时候发出的。 我们对实际开始的时间的估算可能并不准确。 却决于 用户时钟 偏差多少,我们得到的飞行时间可能有少有多:

为清楚起见我在时间线上画出了 蓝色的条, 但是要记住实际上我们并不知道当前的 系统时间。 这套系统总是在 蓝条 位于 0 秒的时候发出信号, 但是 我们 认为系统发出信号的时间是 红条 位于 0 秒的时候。

如果我们足够幸运,我们的时钟系统时钟 是同步的, 那么我们认为信号发出的时间就和实际发出的时间 一致。 如果我们的时钟 有点滞后, 那么当我们认为 刚发出信号 的时候,其实信号已经在空气中传播了一段距离。 相反,如果我们的时钟 快了一点 ,那么我们认为的已经在空气中传播了一段距离的信号其实才 刚刚发出

由于这个未知的 时间偏差 我们无法计算 真正的 飞行时间 , 进而无法算出 真正的 距离。 实际上我们算出来的距离叫做 伪距。 伪距的长度取决于我们认为的偏差。 距离的不确定性听起来是个麻烦,接下来我们就看一下 偏差 的出现是如何具体影响我们在图上画圈的:

注意现在地图上的圆的半径会随着未知的 偏差 被考虑进来而变化。 我们已经没有办法仅仅依靠两个圆了,因为交汇点会随着 偏差 的改变而移动。

我们似乎遇上大麻烦了,但是我们可以做另外一个假设:我们可以放心地假设所有的地标的时钟是互相同步的。 地标的位置是固定的,这意味着他们可以使用庞大而精确的时钟并且持续监控以保持同步。 因为所有的地标的有相同 系统时间 , 所以 我们的时钟 和每个地标的 偏差 是一模一样的。

因为这个 偏差 是相同的, 所以三个计算得出的距离都是要么 一起 偏短,要么 一起 偏长。 具体的偏差取决于我们的 用户时钟系统时钟 的偏差。 这正是第三个距离不可或缺的地方:

当我们收到所有 三个信号后, 我们可以试着猜这个 偏差 的具体是多少, 只有 唯一值 能够让三个圈在同一个点交汇,这个点正是我们在地图上的位置。

这是一个值得纪念的成就。 我们不仅准确地计算出了位置,而且连 用户时钟 时钟的 偏差 也得到了。 这就让我们可以将 用户时钟定位系统的时钟 同步 - 这样我们就获得了一个准确时间的可靠来源。 唯一需要多付出的代价仅仅是引入第三个位置已知的发射器。

此外,我们刚建立的这套体系与服务的用户数量完全无关。 发出的声音并不在乎有多少接收者在听,每个接收器都可以接收声音而不干扰其人的测量:

方案升级

目前我们的动作还限制在 2D 平面内,但如果允许 雕像 脱离地面,情况就变得有趣了。 在下面这个例子里你可以通过滑块控制雕像的高度。 为了简化我们还是回到刚开始用尺子测量距离的方法:

注意随着雕像 远离地面, 和地标的距离在增加。 我们已经无法用在地图上画圈的方法了,因为他们已经无法收敛到相同的位置。

当我们允许三维空间中的动作后,我们把距离转换成平面上的圆,方法就失效了。 实际上,到一个标记点固定的距离形成了一个 球体。 为了更简单的可视化,我们先让三个地标自由漂浮在在三维空间。 如果得到离第一个地标的 距离, 那我们的位置会在一个球体表面:

如果得到离 第二个地标 的距离, 那我们便可以把可能的位置缩小到两个球体的交汇处:

如果得到了第三个距离,我们可以增加 第三个 交汇球体,这样我们就可以把可能的位置缩减到 两个点, 也就是三个圆的交汇点:

虽然理论上我们需要第四个球体来区分这 两个点, 但是通常三个距离就够了 - 因为在球体中心距离足够远的情况下,这两个点中的其中一个要么在地上要么在空中。

我们来看这些概念如何应用到地图上。为了将球体可视化我们无法再让它的表面平坦了。 为了方便参考,我将地图和主视图同步旋转。 注意三个球体的交点让我们可以准确定位位置 高度,即使你拖拽 雕像

上面这些例子里,我们使用的都是基于卷尺的简单系统,现在让我们试着回到之前基于声波和伪距的方案。 回想一下,它并不需要用户的时钟完美同步:

注意新增加的维度带来的复杂性。 虽然在平面场景下我们可以找到一个 偏差 让三个圆相交于一点, 但是要让三个球体相交于一点我们会找到若干个 不同的 偏差, 结果就是不能同时准确地定位我们所处的位置和高度。

类比于平面场景,我们需要引入 第四个 地标来解决这个问题。 之后便可以找到未知 偏差 让四个球体相交于同一个位置:

这种需要至少四个发射装置来计算伪距的方法 正是 GPS 用的来计算接收器位置和时钟偏差的方法。

在继续开发我们的简单系统前,很值得停一下来,来展示我们到目前为止球体变大变小背后的数学原理。 我们要处理到四个发射器距离,归结为四个方程:

方程的左边是接收器的 未知位置绿 四个发射器用 3D 勾股定理计算出来的距离。 右边是从四个发射器到接收器的时间 t, 未知的接收器的偏差 b, 和传播速率 v 在这里是声速的乘积。

我们最终会解这组方程从而得到接收器的位置 x y z 和时间偏差 b, 但是本文剩下的部分,我还是会用对问题的更抽象描述来替代, 毕竟数学运算并不是我们理解 GPS 的关键。

更高、更好、更快、更强

我们目前建立的这套体系似乎已经能够在距离地标较近的情况下,正确地计算我们的位置和时钟偏差。 如果我们想让我们的定位系统像 GPS 那样对整个地球都可用,还有几个问题等着我们去解决。

首先,声波并不是传递信号最好的方式。 周期性的响亮的哔声很恼人,而且更严重的是,声音在空气中四散很快。 你几乎听不到几十 英里公里 外的声音。

传输介质更好的一个候选者是光。 和声音类似,我们可以利用光的传播速度有一个上限这点来计算光传播的距离。 光在真空中的传播速度 c 是非常快的, 它有一个精确的值,按照定义用公制单位表示:

c = 299 792 458 m/s

光传输 1 英尺30 厘米 只需要十亿分之一秒。 但不幸的是,光很容易被雾、沙尘、云和烟等大气现象阻挡。 因此,我们不用可见光而是用 电磁辐射 的另一种形式 - 特定频率的电磁波。

第二个阻止我们把这套系统部署到全球的问题和信号发射源的可见性有关。 目前为止我们都假设我们的环境是完全扁平的,但实际上电磁波遇到山丘会被阻挡,就像下面这个场景演示的那样。 在很多的情况下,接收器永远都无法收到信号,除非我们用滑块控制发射器升到足够高的位置:

把发射器升到 一定的高度 我们就可以在一定范围内缓解这个问题。 但是新的问题又来了,我们忘了另外一个重要的障碍物 - 那就是地球本身的曲率。 要看到地球曲率,我们就必须进入黑暗的太空。

在这个例子里,你可看到 发射器 发射出的电磁波是怎么随着高度变化而被地球的形状重塑的:

地球曲率本身就像山一样遮挡了 发射器 的视平线。不过谢天谢地,我们把 发射器 放得越高,能看到的区域就越大。 在三维世界我们可以用锥形来可视化这片区域:

我们当然没有办法把塔建的想有多高就有多高, 所以为了把 发射器 放到远高于地面的地方,我们把它装到卫星上, 只要卫星足够高,它就能看到地球上一片相对较大的区域。 人们可能会天真地希望我们能把卫星放在太空的任何地方,然后它就会一直呆在那里,但事实没那么简单。

轨道

假设我们能够把一个物体奇迹般地放在地球周围的太空里并且保持静止不动,看看接下来会发生什么。 在下面这个例子里你可以拖拽 黄色物体。 一旦你松开它就会被用 蓝色小箭头表示的地球引力吸过去, 随着 物体 开始移动, 黄色箭头 代表了物体的移动速度。

注意 物体 被拉向地球的力与距离有关。 物体受到的引力的大小 F 和 物体的质量 m, 地球的质量 M 成正比, 但是和质心间的距离 r 的p平方成反比。

F = G × m × M / r2

常量 G引力常量 的缩写,它非常小 - 因此只有质量像地球那么大的物体才会产生人类可以感知到的引力。

不管在太空中何处放置一个 静止 的物品,它最终都会落到地球表面, 但是如果物体的初速度不为零,这时有趣的事情就会发生了。 在下面这个例子里你依旧可以拖拽 物体, 但是这一次它会拥有一定的初速度,也许是火箭给它的吧。 一旦你松开,物体 会在该方向上开始移动,但是地球的 引力 依旧作用于它:

注意 物体 的运动更有趣了 - 引力 的作用使 物体 不断地向着地心移动, 但是它总是领先于这个力并形成了一个椭圆轨道。 注意 物体 的速度 用 黄色箭头的长短表示, 随着行程而变化。 当物体距离地球很远的时候,重力场小,引力 改变 物体 的方向需要一点时间, 但是距离地球近的时候又会被重力很快地加速。

如果轨道和 地球相交 ,那么物体还是会落向地面,但是在 其它场景下 它会以椭圆轨道为绕地球 运行。 你可能也 成功地 使轨道变成了红色,这样物体就进入了 双曲线轨道 ,并且越飞越远最终再也不会回来。

我们当然想让无线电波发射器待地球附近,这样就只有椭圆轨道可用。 我曾经在 这篇博客 里讨论过椭圆,值得可以快速回顾一下。

在我们继续之前,需要提醒大家下面的例子很多是动画 - 你可以 点击 左下角的按钮来的播放和暂停。 动画默认都是 开启的,但是如果你觉得它们让你分神或者你想省点电可以 全部暂停 所有的动画。

画椭圆最简单的方法是拿两个 图钉并用一根绳子环绕在周围。 然后我们在环里放一只 黄色铅笔 , 在绳子处于紧绷状态下移动 铅笔, 这样就能画出一个椭圆来。 将两个 图钉 彼此靠近或远离,我们能改变生成的形状:

注意绳子的不同段被我涂上了不同的颜色。 沿着曲线运动的时候红色 蓝色 互相交换了长度,但是它们的 总长度 是不变的, 这是椭圆的定义属性。 而这两个 图钉 也被称作椭圆的焦点。

椭圆的形状由 离心率决定。 在绳子的这个例子里等于 绿色段 比上 红色段蓝色段 的长度和。 椭圆的大小是最长的轴的一半即 半长轴决定的, ,也就是 红色段蓝色段 长度和的一半。 当离心率 为零的时候椭圆就成了圆,半长轴也就成了半径。

半长轴的长度是卫星椭圆轨道最重要的参数之一。前面我们已经知道了卫星的距离与地球可见面积的关系。 更重要的是,正如开普勒发现并形式化的 第三定律 那样,半长轴的长度 a 与天体完成公转一周的时间 T 紧密相关,这个时间也称作 轨道周期

a3 = T2 × G × M / 4 × π2

结果就是,卫星越远,它完成一个完整椭圆轨道的时间就越长,如下图所示。 注意椭圆嵌在一个被称作 轨道平面 的平面里,图中用 黄色圆盘 表示。

例如国际空间站离地球 很近, 完成绕地一周只需要不到 93 分钟,相当于一天 15.5 次。 注意只有 一个轨道 会花费 23 小时 56 分 4 秒, 即地球自转一周的时间,也被称作一个 恒星日。 拥有这样的轨道周期的卫星被称作 地球同步轨道卫星。 当我们靠近点看会发现地球上有一个 红点, 在这个点观察着的正上方是一颗地球同步轨道卫星。

注意当绕着地球完成公转一周后卫星又会回到起始位置。你可能已经注意到了, 红色滑块 控制着轨道的 倾角。 倾角是 轨道平面 和穿过地球赤道的被称为赤道平面平面 所形成的角度。 当倾角为 的时候,地球上的红点几乎静止不动,卫星总是停留在空中的同一位置,这个轨道被称为 地球静止 轨道。

地球静止轨道听起来像是放置我们一系列定位系统卫星的一个好选择, 因为这样每颗卫星都会在空中有一个固定且预先知道的位置, 接收器只用测量到它能见到的卫星的距离就可以,但是这个方案有一些问题。

在下面这个例子里,你可以控制地球静止轨道卫星的个数,它们会被均匀分配到对应轨道上。 每一个卫星只对地球上的某片区域可见,但是随着卫星数量的增加,地球上的某些区域可以看到越来越多的卫星。 某个位置可见卫星的数量越多,这里

如果有 10 颗 卫星 ,地球上所有靠近赤道的地方就都可以满足至少有 4 颗卫星可见并计算自己的位置和时钟偏差的需求。 不幸的是,即使拥有了数量众多的地球同步卫星,南极和北极还是一颗卫星也看不到,这样的系统不能称为全球定位系统。

另一个问题和所有的地球同步卫星都位于同一平面这一任意设定有关。 我们来看看其中一个设定,这里为了方便观察卫星离地球较近。 在下面的例子里,你可以拖拽 红点 在地球上的位置。 深红色的线条代表它到可见卫星计算得出的距离:

注意由于对称性,在另一个半球上有一个 白色的点, 到各个卫星的距离 完全 相同。 如果定位卫星全都被放在地球静止轨道上,我们在仅使用三角定位法作为唯一线索的情况下就没有办法区分北纬和南纬, 因为没有办法明确这两个位置哪一个才是正确的。

了解了这些限制后我们开始来讨论 GPS 是如何通过 地球静止轨道的卫星解决这些问题的, 对地球上的观察者来说这些卫星并不固定在天空的某个位置。

GPS 轨道

我们来看其中一颗 GPS 围绕地球的轨道。地球上的 红点 代表观察者,而正上方是一颗卫星:

一个单独的 GPS 轨道的倾角是 55 度左右,轨道周期为 11 小时 58 分钟 2 秒,即恒星日的一半 , 这样它们一天会经过地球同一位置两次。 这一点在 GPS 还在开发阶段的时候非常有用,因为那个时候卫星数量很有限, 这样一来你就准能持续的在固定的时刻在空中看到它们。

GPS 由围绕地球的 6 个不同的轨道组成。起初设计的时候,每个轨道包含 4 颗卫星合计 24 颗卫星。 然而目前实际上有 30 颗活跃的卫星来改进精度和提供冗余。 在下面的例子里,你可以选择 6 个轨道中的 1 个或者或 星座 里所有的卫星:

注意轨道里的卫星并不呈均匀分布。由于地球的自转和卫星的不断移动,地球上某个点可见的卫星数量也在不断变化。 下面的例子里你可以拖动地球上的 红点 查看它可见的卫星:

我们也可以显示出地球上所有位置可见的卫星数量。 让我们为地表不同区域涂上 来看看卫星覆盖的情况 - 颜色的亮度代表这个区域可见的卫星数量:

虽然我没有考虑山丘和建筑,但是你可以看到地球上的任何位置都能够轻松的被至少 4 颗卫星覆盖, 这样接收器就可以计算自己的位置和时钟偏差。 我们很快就会发现卫星数量越多,预测位置的精度就越高,但也并不是任何一种卫星布局都是有利的。

天空中有那么多卫星你可能会想接收器怎么知道卫星的位置。这个问题的解决的方法很简单也很巧妙 - 每一个卫星都会在自己的广播信号中包含自己的位置然后 告诉 接收器。

开普勒元素

有很多方法在太空中指定一个位置,比较常用的方法是经典的 6 个 开普勒元素 方法, 前两个元素分别是 半长轴离心率,分别对应着椭圆轨道的大小和比例。 对卫星来说,地球即椭圆的一个焦点:

GPS 卫星轨道半长轴是 16503 英里 26560 公里 左右, 曲率在 0.02 左右或者更小。

接下来的两个元素是 倾角升交点的经度, 它们指明了轨道平面相对地球和远处恒星的方向:

我们已经介绍过了 倾角 - GPS 卫星运行的倾角大约是 55° 。 接下来更多地解释下 升交点的经度。 注意卫星的轨道和 赤道平面 在两个点上相交,称为 轨道交点 - 图中分别用 红点绿点 表示, 绿点 即为 升交点, 因为卫星从这点向 升起 并向北继续移动。

升交点的经度 是和 赤道平面 上与地球自转无关的固定在遥远恒星上的参考方向 ( 春分点 )的角度。 GPS 星座一共有 6 个不同的轨道,它们的 升交点的经度 彼此呈 60° 平均分布。

最后两个元素分别是 近地点幅角真近点角, 指明了椭圆轨道和卫星的位置:

近地点幅角 是轨道平面内升交点和椭圆上里地球最近的 近地点 的角度 - 图中用 黄点 表示。 最后一个参数是 真近点角, 它是某一时刻卫星和近地点构成的角度。

在理想情况下,如果确定了 6 个参数就可以计算卫星的当前和 未来 任意时刻的位置,但不幸的是还存在其它影响因素。 例如受地球并非一个完美球体、月亮和太阳的引力、太阳辐射等因素影响,卫星的轨道会偏离理论上的开普勒路径。 所以 GPS 广播的信息里还会包含这里某些参数的 变化率,便于接收器随着时间计算必要的修正。

你可能会好奇 GPS 卫星怎么会知道这些参数的。 实际上所有的 GPS 卫星都被地面监控站跟踪着。 这些跟踪站是 GPS 控制段 的一部分,负责管理卫星和卫星广播的消息。 更新后的轨道参数和时钟调校会每隔 2 小时上传到卫星上,来确保卫星发往接收器的信息尽可能准确。

知道了卫星在轨道上的位置,人们就可以把开普勒元素转换成地球上笛卡尔坐标系的 x y z 。具体的细节在这里就不展开了,但是计算会考虑很多的因素, 像是从信号发射到接收这短短的时间里地球的自转。 正如前面所讨论的,计算位置的过程中需要精确的时间,这值得进一步阐述。

时间

利用飞行时间计算距离的三角定位方法要求所有的发射器保持时钟同步,GPS 就是这么做的。 每颗卫星上都装备有一个精确的原子钟,并且地面控制站也会对每颗卫星做单独调整,以此保证所有卫星的时间是同步的。 这个统一的时间被称为 GPS 时间 ,因为技术原因它是自 “标准” 协调世界时 的整数秒。

谈到这些卫星上的时间 流动,就不得不提爱因斯坦相对论里的两个重要方面。 狭义相对论 指出当一个物体高速移动的时候会经历时间膨胀 - 它的时钟相对一个静止的观察者会变慢。 高度越低、卫星速度越快,这种效应造成的时间减慢就越明显。 另一方面, 广义相对论 指出在引力场较低的情况下时钟运行会变快,所以高度越高,这种加速就越明显。

这两种效应并不相等而是随着高度的变化此消彼长。 在下面这个例子里,你可以看到卫星高度变化是怎么导致相对于地球上的时间发生膨胀的。 时间的进展用两个进度条表示。 黄色条 被填满代表 卫星上经过了 1 秒。 蓝色条 被填满代表 地球上经过了 1 秒。 注意当高度很高的情况下, 卫星 上的 1 秒比 地球上要更早结束 ,而是在较低的高度,卫星 上的 1 秒比 地球上要更晚结束。 由于实际的时间膨胀非常细微,所以为了便于观察所以进度条的长度的变化被夸大了:

GPS 高度 的卫星以大概 2.4 英里3.87 公里/秒 的速度相对地球运行,这会让时间变慢,但同时它们受到的引力比在地球上小,这会让时间变快。 后者的影响的 更大 一些,所以实际结果是卫星上的 1 秒快了大概 4.467 x 10 -10 秒, 累积一天下来就是 38 毫秒。

不幸的是有很多消息来源错误地解读了这个结果。人们经常错误地声称如果 GPS 不把卫星时钟调慢来对抗相对论效应, 系统的定位误差就会每天增加 7.2 mi 11.6 km, 即光在 38 毫秒内传播的距离。

这样的结论并不正确。如果不管相对论效应让卫星的时钟偏移,伪距 每天是会出现那么多的误差。 但如前文所述,时钟偏差并不会阻止我们计算出正确的 位置。 计算出的接收器的时钟偏差可能也是正确的,只不过是相对发生了漂移的卫星的时钟偏差,所以没那么有用。

此外,卫星的时钟并不需要刻意调慢来修正由于相对论效应导致的时间加速。 因为卫星广播的消息里带有三个接收器可以用来修正卫星时钟的偏差或速度变化的系数。

有一个问题 必须 考虑,那就是相对论效应导致的 GPS 卫星轨道细微偏心。 当卫星绕着地球运动并且相对地球的距离和速度不断变化时,卫星时钟的速度也会周期性的发生变化。 由于接收器知道卫星的位置,所以在计算时间校正的时候会考虑相对论作用的影响。

不幸的是,这并不是计算飞行时间唯一要面对的难题。

信号传播

虽然 GPS 信号的大部分旅途是在真空中毫无阻碍的传播,但它们终究会进入地球大气层并受到两种不同作用的影响。 大气层顶部是由太阳辐射电离气体形成的 电离层, 这里自由移动的电子会让消息信号的传播变慢。 自由电子的数量和变慢的程度取决于一天中的时间以及整体的太阳活动。

在大气层底部,主要是在 对流层 中, 随着气体和水蒸气的密度增加,反射率 也会增加, 从而导致无线电信号的传播变慢。由于水蒸气含量飘忽不定,所以信号飞行时间的延迟更难预测。

电离层对流层导致的延迟大小还取决于无线电信号在 大气层 中传播的路径长度, 而这又取决于 卫星信号 相对于接收器的 仰角 。 如下图地球的 背光视角所示:

随着该 角度增大, 来自卫星的信号 会更加偏向地面并有更多的部分受到 大气层影响。 考虑到这点,GPS 接收器会忽略从仰角非常低的卫星测出的距离。

虽然大气层影响是 GPS 定位不准的主要原因,但还是有一些其它的干扰。 例如,所有卫星不可能 分秒不差。 轨道参数和它们的变化率的测量存在一定的误差, 导致接收到的卫星位置和时间戳不一定都准确。 信号在地球上可能会被不同的表面反弹,到达接收器的路径比直接接收更长。

虽然我们一定程度上考虑到了这里的种种因素,但是测得的卫星的距离还是存在一定程度上的误差 - 我们不再仅仅处理单个距离而是若干个允许一定 范围 的距离。 这意味着我们一直相交的球体存在一定的厚度,我们可能永远无法得到一个完美的解决方案来让若干个存在范围的球体相交于单个点。

我们可以试着用实际的卫星来可视化这种厚度,但是不得不说很难通过拖拽来看清 红点 处的情况, 即使我为了减少混乱程度只绘制了半个球体:

为了容易理解我们先短暂回到二维场景,并且把场景简化到只有三颗卫星的信号。 在下面的例子里,你可以控制两个参数: 测得距离的 不确定性 用范围圈边的厚度表示, 以及卫星的 相对位置

接收器的位置就处在这三个区域的 相交区, 该区域越小,位置预测就越精确。 范围不确定性 越大 位置的模糊度自然就越高,但是卫星的相对位置也很重要。 如果卫星 分布得不好, 计算出的位置精确度也会受影响。 在这个例子里我们也假设所有距离的 不确定性 是相同的, 实际并非如此。

为了解决所有这些问题, GPS 接收器会尝试找到这样的一组 4 个解,其中包括 3 个位置坐标和 1 个时钟偏差, 能够从某种意义上成为将误差最小化的最优解。 这也是为什么如果至少有 4 颗卫星的会提高数据准确度。

计算得到的时钟偏差与更想得到的位置信息一比好像是个微不足道的副产品, 但它对于很多需要同步时钟的应用来说至关重要 - 实际上我们用一种简单的方法,间接访问了原子钟

既然我们讨论到了地球上的接收器,那我们最好还是从黑暗的太空回到明亮的地球表面吧。

到目前为止我对接收器接收到的消息还是相当模糊,包括消息内容和如何被解码等,那些细节是精华 - 我会用本文的最后两章来讨论它们。

导航电文

GPS 卫星发送的消息统称为 导航电文。 我会逐一介绍它的组成部分,但首先还是让我们来研究一下它的结构。 整个电文由 25 个 组成, 每个 由 5 个 子帧 组成。 每个 子帧 是一行, 由 10 个 组成, 而每个 是 30 位:

TLMHOWClock corrections, health
TLMHOWEphemeris
TLMHOWEphemeris
TLMHOWAlmanac/other – page 1
TLMHOWAlmanac – page 1
TLMHOWClock corrections, health
TLMHOWEphemeris
TLMHOWEphemeris
TLMHOWAlmanac/other – page 2
TLMHOWAlmanac – page 2
···
TLMHOWClock corrections, health
TLMHOWEphemeris
TLMHOWEphemeris
TLMHOWAlmanac/other – page 25
TLMHOWAlmanac – page 25

每个 子帧开头的 2 个 都是相同的结构。 TLM 或称遥测字,包含一个易于识别的前缀和几个用来验证消息完整性的校验位。 HOW 或称交接字,是对 GPS 工作非常重要的,它为 子帧 加上了时间戳, 接收器通过它能够得到帧是何时发出的。

每个 子帧 后续 8 个 携带不同的有效负载。 第一个 子帧 包含了 卫星时钟的校正值和 GPS 周数,它们和交接字提供的更精细的时间戳一起 使得接收器能够计算出消息发出的准确时间。

这个 子帧 还包含一个健康位, 用来表示导航数据是否状态良好。 当一颗 GPS 卫星的轨道需要调整的时候,控制段会临时调整这个位, 来让接收器知道不应该依赖于来自这颗卫星的信息,因为它正在调整位置。

接下来的两个 子帧 包含前面提到的轨道参数和扩展的速度信息,它们统称为 星历 参数 - 接收器可据此计算卫星的位置。

前三个 子帧 在每个 里都存在,它们包含该卫星的数据, 而最后两个 子帧 包含着 所有 卫星的粗星历数据 - 被称作年历。 依靠这些接收器就能够预估卫星从地平线升起的时间。 这两个 子帧 还包含了其它卫星的健康状态以及可被接收器尝试用来计算电离层延迟的参数。

可以想象,整个有效载荷是比较大的,所以它被分成了 25 页 - 每一 包含一页,并被放在最后两个 子帧 里。 接收器需要收集到所有 25 帧才能完全解码补充信息。

GPS 卫星发送信号的速率是异常慢的 - 它们每秒只传输 50 比特。 如果用这个速度,光是发送本文的文字部分就需要 2.5 个小时。 这意味着一个由 10 个 组成的 子帧, 每个字占用 30 位,需要 6 秒来发送, 单个 就需要 30 秒才能接收完毕。

每个 子帧 中的 6 秒时间戳粒度看起来很粗糙, 但是很快我们就会看到,导航电文的编码和解码方式带来了很多额外的精确度。

GPS 信号

GPS 卫星发送的消息统称为 导航电文。 我会逐一介绍它的组成部分,但首先还是让我们来研究一下它的结构。 整个电文由 25 个 组成, 每个 由 5 个 子帧 组成。 每个 子帧 是一行, 由 10 个 组成, 而每个 是 30 位:

虽然导航电文在比较高的级别被分为 子帧, 但是它最终都是由单个等于 0 或 1 的 数据 位组成的。 我们可以用曲线的动画来演示 GPS 卫星随着时间发送这些位。 在下面这个例子里,如果 数据源 等于 1 曲线就会跳到水平轴的上方,但如果是 0 曲线就停在水平轴上:

数据有效数据载荷是通过无线电频谱里 特定范围 的电磁波传输的,这个范围不会受到大气层的阻挡,并且不管室外条件如何都能到达地球上接收器。 虽然现代的 GPS 卫星能用不同的频率的发送信号,但是所有卫星都以 1575.42 MHz 的频率广播主要的民用信号。 下面我用正弦波来表示这种 载波

像这样稳定的电磁波本身是不会传递太多消息的,但是我们可以利用它作为 波来并通过调制来传递有效载荷。 这样的调制有很多种方法。 例如,我们可以用 载波 乘以 数据位 流, 从而有效地打开或关闭 发射的信号

为了传输信号,GPS 使用了一种 不同的 被称作 二进制相移键控 的方法。 从概念上讲,就是调整由 0 和 1 组成的二进制 信号 , 用 -1 代替所有的 0,然后用该信号乘以 载波

乘以 -1 的结果就是改变了信号的 相位, 这种方法因此得名。 如果我们只处理一颗卫星,那么这种编码方式就足够了, 因为接收器只要从 输入信号 里移除载波就能够解码得到 数据位

现实情况要更复杂。很多卫星会同时广播导致它们的数据位会互相重叠。 并且,到达地球的 GPS 信号非常弱的且被噪声淹没,这就使原始的数据有效载荷难以辨认:

GPS 通过引入另一种二进制码解决了这个问题。 这种 编码 随着时间重复,由预定数量的被称作 码片 的部分组成。 下面的例子里 编码 有 6 个码片:

码片的变化率要高于数据位。 为了对信号进行编码,卫星需要将导航电文的 数据位 乘以该 编码 。 我们来看看这个想法如何付诸实践:

在这个例子里,针对 数据信号 的每个位, 我们重复两组相同的 编码 。 注意,数据信号 里的负值最终也会翻转 编码信号

输入数据编码载波相乘起来我们就能够得到卫星发射的 最终信号

需要指出的是,为清楚起见,我用了视觉上比较紧凑的例子 - 导航电文 的每个位用两个重复的 编码表示, 每个 编码 由 6 个码片组成, 每个码片持续 2 个波长。

在真正的 GPS 信号里这些数字要大得多。电文的每个位由 20 个重复的码组成。 每个码有 1023 个独立的码片。 每个码片持续 1540 个波周期。 如果我们把这些数字乘起来,得到每个位持续 31508400 个波周期, 以每秒 50 个位计算,最终的结果正是 1575.42 MHz。

另外,因为每颗卫星都有一个唯一的码,我们要处理的实际上一整个码的家族。 在下面这个例子里你可以看到 GPS 卫星发送的所谓 PRN 码中的前三种:

虽然这些码看起来像随机的二进制噪声,但它们其实是 伪随机的,这解释了它们的名字 - PRN 代表伪随机噪声。 每一个这样的码都是众所周知的并且可以很容易的被重新生成。

码的引入可能看起来是不必要的复杂性,但它实际上非常有用。 那些伪随机码有两个很重要的属性。 第一个属性定义了码和它时间偏移后的副本的相关度。 我们用一个更短的 63 个码片的例子来看看它在实践中意味着什么。 在下面的例子里,你可以滑动 码副本 并观察它和 原始码 相乘后的结果:

例子的底部显示了 区域里 和它的 副本 的乘积和,以及两个区域 差异。 注意当 副本没有对齐 的时候 差异 相对较小, 但一旦将码和码副本 成功对齐差异 就会激增。 码信号和自身的副本的相关性被称为 自相关性,只有当一切对齐的时候会非常最高, 我们正是用这一 差异 的大幅跃升来检测是否对齐的。

第二个非常重要的属性和 互相关性 有关,即一颗卫星的码信号和 另一颗卫星的相关性。 我们来看看,当滑动来自 卫星 1 的码副本 时相对 卫星 2 的码副本 会发生什么:

如你所见,当我们滑动 副本的时候, 区域差异 会有一点点上升, 但是永远不会达到我们在自相关性中看到的明显的高峰。

这两个属性揭示了接收器里的魔法。我们来看一个这个过程简化后的版本,首先,用同一个卫星的 清晰的输入信号举例。 接收器移除了正弦载波,得到一个由导航电文和码片乘积的 信号

接着,接收器可以创建一个想要跟踪卫星的码片 副本, 然后在高亮区域检测 输入信号副本 是否会出现一个相关性的高峰。 接收器不断调整偏移值,直到能够找到一个较高的 区域差异 ,这意味着找到了正确的偏移值:

当你观察 正区域 减去 负区域区域差异 的时候 ,如果找到了 正确的偏移量 ,你会注意到信号随着时间在正和负之间来回翻转。 因为编码信号最初就是和用于翻转符号的数据信号相乘的,所以你在图里看到的翻转其实就是解码后的数据 - 你可以比较例子的底部 面积差 的曲线和原始 数据信号 的曲线来检查完整性。 一旦找到正确的偏移量,接收器就只用关注 差异 的符号就可以解码数据位了。

副本 的时间偏移量为接收器计算精确的飞行时间提供了额外的计时信息。 回忆一下, GPS 消息的每个子帧被打上了一个以 6 秒为粒度的时间戳,仅依靠它自己是极低的精度。

然而,通过跟踪接收到了多少位,多少次码的重复,以及码片的偏移量,我们可以显著地提高进度。 接收器知道每个组件的耗时并能够把延迟加到被编码到子帧开头的时间戳上。 我们可以有效地为每个码片甚至是碎片打上时间戳。 通过这种方法,接收器可以非常精确地测量飞行时间。

最后,我们来看看互相关性怎么让接收器得以区分不同的卫星。 下面的例子里, 输入信号 是由若干可见卫星的信号以及噪声组合而成的, 你可以选择接收器生成的副本并调整偏移以调谐到卫星的信号:

经过一些调整后我们能够找到解码 卫星1卫星2卫星3 信号所必须的时间偏移量, 但却找不到适合卫星 4 的。 这种情况是可能的,因为同一时刻 30 颗卫星中只有部分可见。

我需要强调的是本文只是对信号处理的简单分析,目的是说明接收器如何利用码片来恢复原始数据位。 实际的接收器的行为要比我描述的复杂得多。 其中一个值得一提的额外复杂度就是卫星相对于地表观察者的移动速度。 由于 多普勒效应, 接收器实际收到的信号频率会发生改变。 为了正确地接收到信号,接收器需要同时调谐到正确的时间偏移量和频率。

最后,值得重申的是,接收器不需要向卫星发送任何东西,它只要负责监听就可以了,卫星不管有没有人收到都会源源不断发出信号。

延伸阅读

GPS MOOC 是斯坦福大学在 2014 年出品的在线课程。 幸运的是,课程视频在 Youtube 上 可以找到 ,我非常推荐观看它们来更深入地理解 GPS 工作原理。 两位讲师都是各自领域的专家因此专题讲得非常好。

由 Pratap Misra 和 Per Enge 合著的教科书 《Global Positioning System》 更详细地解答了本文的一些话题。 这是一本关于 GPS 和卫星导航的非常详尽,可读性很强的出版物。 实际上它是我这篇文的主要来源。 我非常喜欢这本书,先是提纲挈领地展示了系统的各个组成部分,再分章节各个击破。

对于 GPS 历史的个人描述,我推荐你看对 Brad parkinson 的 采访 ,他是 GPS 系统首席架构师。 虽然采访是在 1999 年进行的,那个时候 GPS 的消费级应用还处在非常早期,但是 Brad 成功预测了即将到来的个人应用的爆发式增长。

结束语

在手机地图上查看某人位置这样简单的动作背后居然隐藏着这么多令人着迷的复杂性和创造性。 而最令人赞叹的还是 GPS 成功背后需要的诸多技术进步。

仅仅是卫星本身就需要开发火箭,掌握轨道控制和制造能够抵御太空极端环境的设备。

原子钟的发明使精确计时成为可能,而无线电传输的进步和编码算法的优化让卫星发出的微弱信号能够被 地球上的接收器正确解码,而这又依赖于芯片和数字革命。

很难不被这些推动科学技术进步的人的不懈努力所感染。是他们的工作让 GPS 成为了日常生活不可获取的工具。