mybreathtaking

文章 › 身边的物理

手机怎么知道你在哪?

· Read in English

上一篇《时间真的会变慢吗?》说到 GPS 卫星上的钟:「GPS 卫星离地球远,引力弱,钟每天快约 45 微秒;减去速度让它慢的 7 微秒,合起来每天快约 38 微秒。」卫星上的一只钟快了几十微秒,和你手机上的那个蓝点,有什么关系?这一篇就来看看,手机到底是怎么知道你在哪的。

先猜一猜

常听到的说法有:「手机给卫星发信号,卫星就找到了你」;「卫星从天上看得见你」。

都不对。手机从来不给 GPS 卫星发信号,卫星也看不见你,它们甚至不知道有多少人在用。手机只是在「听」:听天上的卫星报时。在室内,手机还会借助 Wi-Fi 和通信基站来定位,这一篇只讲卫星。

打雷:数一数,就知道多远

看到闪电以后,数一数几秒才听到雷声:声音每秒走约 340 米,数到 3,打雷的地方就在 1 公里左右以外。

GPS 用的是同一个道理,只是把声音换成了无线电,速度是光速,每秒约 30 万公里。每颗卫星都在不停地广播:「我是几号卫星,我现在在这里,现在是几点几分几秒」。手机记下收到的时刻,减去卫星发出的时刻,就知道信号在路上走了多久,乘上光速,就是离这颗卫星多远。卫星离地面约 2 万公里,信号要走 67 到 86 毫秒(1 毫秒是千分之一秒)。

天上的 32 颗 GPS 卫星

天上的 GPS 卫星(按真实轨道推算)。左:从太空看,32 颗卫星分在 6 个轨道面上,红点是北京,跟着地球转。右:从北京抬头看,圆心是头顶,圆边是地平线;橙色是此刻在地平线 10° 以上、手机用得上的卫星。时间是北京时间 11 月 7 日早上 8 点起的 12 小时。

GPS 是美国的卫星导航系统。第一颗卫星 1978 年发射,1995 年全面运行,现在由美国太空军管理,正在工作的有 32 颗。它们离地面约 2 万公里,分在 6 个倾斜 55° 的轨道面上,每 11 小时 58 分绕地球一圈。《地球转一圈,真的是 24 小时吗?》里说过,地球对着星星转一圈只要 23 小时 56 分,卫星正好绕两圈。所以过了 23 小时 56 分,卫星又回到你头顶同一片天空,比前一天早了 4 分钟左右。

这样安排,是为了让地球上任何地方、任何时候,头顶都有好几颗卫星。上面的模拟里,北京在地平线 10° 以上,一直能看到 7 到 10 颗。每颗卫星上都装着三台原子钟(铷钟,有的还有一台铯钟),一台在用,其余备用;用来发民用信号的功率只有几十瓦,和一只老式灯泡差不多。

一个距离,一个圆

所有卫星的钟都对着同一个标准时间,地面站每天都在校。卫星同时报时,可它们离你远近不同,信号到达手机的时刻也就不同:近的先到,远的要晚几毫秒。手机记下每个信号的到达时刻,就能算出离每颗卫星有多远。

只知道离一颗卫星有多远,还定不了位置:离它这么远的点,在空间里围成一个大球面。为了好画,先在平面上看:离一颗卫星的距离确定了,你就在以它为圆心的一个圆上;加上第二颗卫星,两个圆交于两点;再加上第三颗,三个圆只有一个公共点,就是你所在的地方。

听卫星报时:一个距离,一个圆(二维示意)。左:三颗卫星同时发出信号,以光速传开。右:放大看你附近。手机的钟要是快了 1 毫秒,每个距离都多算 300 公里,三个圆就碰不到一起;把钟差也当成一个未知数去调,三个圆正好交于一点。

可是这里有个大问题:记录到达时刻,用的是手机自己的钟。手机里负责定位的芯片带着一块普通的石英钟,远远比不上卫星上的原子钟。它也不是屏幕上显示的那个时间:屏幕上的时间是从通信网络对来的,差个零点几秒,平时谁也不会注意,可定位差不起。钟差 1 微秒(百万分之一秒,10−6 秒),距离就差 300 米;钟差 1 毫秒,就差 300 公里。

解决的办法很巧妙:干脆把「手机的钟差了多少」也当成一个未知数。手机的钟要是快了,每个信号都显得晚到了同样一段时间,每个距离都多算同样一截,三个圆就交不到一点上(上图右边);把钟差一点点往回调,等到三个圆正好交于一点,位置和钟差就都算出来了。在平面上,未知数是两个方向加上钟差,一共三个,所以图里用了三颗卫星;在真实的三维空间里,未知数是东西、南北、上下,再加上钟差,一共四个,所以至少要收到 4 颗卫星。

顺便,手机也就得到了一个和原子钟对齐的时间,误差不到一微秒。通信基站、电网、银行交易,很多都靠 GPS 来对时。

藏在噪声里的信号

GPS 信号从 2 万公里外传来,到了地面已经非常弱,大约只有 10−16 瓦,比接收机自己的噪声还弱几十倍。那手机是怎么听出来的?

靠「对暗号」。每颗卫星都有自己的一串暗号:1023 个「正、负」排成的固定序列,叫 C/A 码,每毫秒重复一遍。手机事先知道每颗卫星的暗号,把它挪来挪去,和收到的一团噪声逐一对比:没对齐的时候,正负互相抵消,什么也没有;一旦对齐,1023 位每一位都对上,就冒出一个高高的尖峰。

藏在噪声里的信号:对暗号(模拟)。① 手机收到的:噪声的功率是信号的约 30 倍,什么也看不出。② 1 号卫星的「暗号」,按 GPS 的规范生成。③ 把暗号挪来挪去,和 10 毫秒的数据对一对:在第 351 位码处冒出尖峰。

尖峰出现的位置,就是信号的延迟。一位码只有 977.5 纳秒(1 纳秒是 10−9 秒),光在这段时间里走 293 米;接收机还能把尖峰的位置找得更细,细到一位码的百分之一左右,也就是几米。

卫星的位置和时刻,也藏在信号里,每秒只发 50 位,把完整的轨道参数发一遍要约 30 秒。所以手机通常先从网上把这些数据下好(叫「辅助 GPS」),打开地图几秒就能定位。

从地心出发,几步就算准

有了到 4 颗以上卫星的距离,还得解出位置。这些方程不好直接解,手机用的是「先猜、再改」:先随便猜一个位置和钟差,算一算按这个猜测,到各颗卫星应该是多远,和测到的比一比,差多少就往那个方向挪一点,再算、再改。

从地心出发,几步就算准(计算)。用 11 月 7 日早上 8 点北京上空 8 颗 GPS 卫星的真实位置,假设手机的钟快了 1 毫秒,每个距离还带 3 米的随机误差。从地球中心出发,每改进一次,离真实位置的距离缩小一大截。

上图就是这样算出来的:从地球中心出发,离北京有 6369 公里;改一次,剩 1362 公里;再改,52 公里、76 米,第四次就到了 4 米,再改也不变了。剩下的 4 米来自测距本身的误差。同时,手机的钟快了多少,也算出来了:0.999997 毫秒,和我们假设的 1 毫秒只差几纳秒。

定位为什么会「飘」

在开阔的地方,手机定位一般能准到 5 米左右。可在高楼之间,蓝点常常乱跳。原因有好几个。

第一,卫星的分布。距离测得一样准,卫星分得越开,交点就越准;卫星挤在一小片天上,几个圆几乎平行,交点就会沿着某个方向拉得很长。

卫星分得越开,定得越准(模拟)。上:北京上空同一时刻的 GPS 卫星,左边是开阔地,8 颗都看得到;右边是一条东西向的街,两边高楼挡住了大半个天空,只剩 4 颗。下:每个距离都带 3 米的随机误差,各解 2000 次,每个点是一次定位结果。

同样 3 米的测距误差,开阔地上 95% 的结果落在 6 米以内;在街上只剩 4 颗卫星,结果沿南北方向拉成一长条,95% 落在 109 米以内。好在今天的手机不只收 GPS:同一时刻,北京上空地平线 10° 以上,GPS 有 8 颗,中国的北斗有 26 颗,欧洲的伽利略有 8 颗,俄罗斯的格洛纳斯有 10 颗,一共 52 颗。北斗 2020 年开始全球服务,在亚太地区卫星特别多。

第二,楼房的反射。信号撞到玻璃幕墙再弹过来,路就绕远了,算出的距离偏长。

第三,电离层。离地面几十到几百公里高的地方,空气被阳光电离成带电的粒子,信号穿过它会被拖慢,相当于多走了几米到几十米。高端一点的手机(2018 年起)能同时收两个频率的信号:两个频率被拖慢的程度不一样,一比较,就能把电离层的影响算掉大半。

电离层还会被太阳搅乱。《太阳除了光,还送来了什么?》里说:「2024 年 5 月,这股风猛地一吹,芝加哥、纽约,一直到美国南方,很多人都在自家后院看到了极光。」同一场磁暴把电离层搅得一团乱,美国北达科他州的农民,本来能准到几厘米的自动驾驶拖拉机,那几天偏了 3 米左右,有的农民只好停下来不播种了。

还有一段历史:2000 年 5 月 2 日以前,GPS 给民用信号故意加了误差,定位只能准到四五十米。那天美国关掉了这个误差,一夜之间,民用定位就准到了 6 米左右。

卫星上的钟:相对论要算两笔账

现在回到开头那只每天快 38 微秒的钟。

卫星上的钟:相对论要算两笔账(计算)。① 如果不调:速度让卫星钟每天慢 7.2 微秒,引力弱让它每天快 45.7 微秒,合起来每天快约 38.5 微秒,乘上光速约 11.5 公里。② 调好以后,只剩轨道不是正圆带来的一点周期起伏:图里这颗卫星(PRN 07)的轨道偏心率 0.021,起伏最多约 49 纳秒,相当于 15 米。

第一笔账,工程师在卫星上天以前就算好了:把卫星钟的频率调低一点点,从标准的 10.23 兆赫,调到 10.229 999 995 43 兆赫,低了 4.4647 × 10−10。卫星上天以后,引力和速度的效应正好把它「补」回来,从地面看,它就走得和地面的钟一样快。

第二笔账,每颗卫星不一样。卫星的轨道并不是正圆,离地球近的时候跑得快、引力强,钟慢一点;离得远的时候,钟快一点。这个起伏最多有几十纳秒,相当于十几米。手机在计算每颗卫星的时刻时,按一个公式把它算掉。

上一篇说:「38 微秒,光能跑 11 公里多:如果不把相对论算进去,卫星定位每天会偏出 10 公里左右。」这是把 38 微秒直接乘上光速的估算,很多书里都这么讲。真实的系统还要更复杂一点:所有卫星一起快出来的那一部分,手机会当成自己的钟差一起算掉;地面站也每天在测每颗卫星的钟,发上去修正。所以就算不调,定位也不一定真的每天偏 10 公里。可是不调的话,卫星的钟会和地面的标准时间越差越远,一年就差 14 毫秒,靠 GPS 对时的基站和电网都会跟着错;每颗卫星轨道不一样,各自偏出的那一部分,手机也消不掉。所以这两笔账,一笔也不能少。

一句话:手机只听不说,听每颗卫星报时,算出离它多远,画圆找交点;钟不准,就多听一颗卫星,把钟差也算出来。几米的精度背后,是原子钟、藏在噪声里的暗号,和爱因斯坦的相对论。

我们怎么知道

  • 自己看看天上的卫星。安卓手机可以装一个叫 GPSTest 的免费应用,打开就能看到一张和图 1 右边一样的「天空图」:每颗卫星在哪个方向、多高、信号多强,属于 GPS、北斗还是别的系统。站在空地上和站在窗边比一比,看看能收到几颗。苹果手机不给应用看这些数据;可以装 GNSS View 这类免费应用,看按轨道算出来的卫星在天上的位置,但看不到手机实际收到了哪几颗、信号多强。
  • 手机的原始数据。从 2016 年起,安卓手机可以把测到的原始距离和时刻输出给应用,研究人员用它来测试新的定位方法。苹果手机没有开放这类数据。
  • 厘米级的定位。测量队用的设备不只数码,还数电磁波本身的波峰:GPS 的 L1 信号,一个波长只有 19 厘米,数清楚了就能准到一两厘米。

还不知道什么

太阳什么时候会把电离层搅乱,搅到什么程度,现在还很难提前几天准确预报,就像天气预报里最难的强对流一样。另一个难题是信号太弱:近几年,一些冲突地区附近,常有飞机遇到 GPS 被干扰,甚至收到伪造的信号。怎样让定位不怕干扰,或者在没有卫星的时候也能知道自己在哪,各国都还在想办法。

进阶:方程、信号和数据

伪距方程。第 ii 颗卫星在发射时刻的位置是 𝒓i\mathbf{r}_i,手机的位置是 𝒓\mathbf{r},手机的钟差是 bb(秒)。测到的「伪距」

ρi=|𝒓i−𝒓|+cb+εi\rho_i = |\mathbf{r}_i - \mathbf{r}| + c\,b + \varepsilon_i

εi\varepsilon_i 包括电离层、对流层、多路径和噪声。未知数是 𝒓\mathbf{r} 的三个分量和 bb,所以至少要 4 颗卫星。线性化:在猜测值 𝒙=(𝒓,cb)\mathbf{x} = (\mathbf{r}, cb) 附近,Δρ=GΔ𝒙\Delta\rho = G\,\Delta\mathbf{x},GG 的每一行是 (−𝒖̂i,1)(-\hat{\mathbf{u}}_i, 1),𝒖̂i\hat{\mathbf{u}}_i 是指向卫星的单位矢量;用最小二乘 Δ𝒙=(GTG)−1GTΔρ\Delta\mathbf{x} = (G^T G)^{-1} G^T \Delta\rho 迭代。图 4:起点 𝒙=0\mathbf{x} = 0,误差依次约 6369 公里、1362 公里、52 公里、76 米、4.0 米。

几何精度因子(DOP)。测距误差为 σ\sigma 时,位置误差约为 σ×DOP\sigma \times \mathrm{DOP},DOP 由 (GTG)−1(G^T G)^{-1} 算出。图 5:开阔地 8 颗卫星,水平 DOP 约 1.2;街上 4 颗,水平 DOP 约 18。

C/A 码。按 IS-GPS-200 的规定,由两个 10 位移位寄存器生成:G1 的反馈多项式 1+x3+x101 + x^3 + x^{10},G2 的 1+x2+x3+x6+x8+x9+x101 + x^2 + x^3 + x^6 + x^8 + x^9 + x^{10},1 号卫星取 G2 的第 2、6 位相加。码率 1.023 兆码片每秒,长 1023 码片,周期 1 毫秒,一个码片 977.5 纳秒,对应 293 米。L1 载波 1575.42 兆赫,波长 19.0 厘米。导航电文每秒 50 位。

信号强度。规范规定 L1 C/A 信号到达地面的最低功率为 −128.5 dBm(约 1.4×10−161.4 \times 10^{-16} 瓦);室温下 2 兆赫带宽内的热噪声约 −111 dBm,信号弱约 17.5 dB(约 1/56)。图 3 的模拟:载噪比 C/N0=45C/N_0 = 45 dB-Hz,每个码片一个采样,信号与噪声的功率比为 C/N0C/N_0 除以码率,约 1/32;对 10 毫秒的数据做相关,尖峰约是背景起伏的 16 倍。

相对论。卫星轨道半径约 26560 公里,速度约 3.87 公里每秒。速度效应:−v22c2×86400≈−7.2-\frac{v^2}{2c^2} \times 86400 \approx -7.2 微秒每天;引力效应:GMc2(1R⊕−1a)×86400≈+45.7\frac{GM}{c^2}\left(\frac{1}{R_\oplus} - \frac{1}{a}\right) \times 86400 \approx +45.7 微秒每天。把地面钟随地球自转的速度和地球的扁形也算进去,规范给出的频率偏移是 −4.4647×10−10-4.4647 \times 10^{-10},即每天 38.58 微秒,一年约 14.1 毫秒。椭圆轨道的周期项:Δtr=FeAsin⁡E\Delta t_r = F\,e\sqrt{A}\,\sin E,F=−2GM/c2=−4.442807633×10−10F = -2\sqrt{GM}/c^2 = -4.442807633 \times 10^{-10} 秒每米1/2^{1/2},ee 是偏心率,AA 是半长轴,EE 是偏近点角;PRN 07 的 e=0.0212e = 0.0212,振幅约 49 纳秒。另有萨尼亚克效应:信号在路上的 70 多毫秒里,地球带着手机转动了一点(北京的地面速度约 356 米每秒,约 27 米),计算时要在地固坐标系里扣除。

轨道数据和模拟。卫星轨道:CelesTrak 的 GP 根数(GPS、北斗、伽利略、格洛纳斯,历元 2026 年 11 月 4 日到 6 日),按开普勒轨道推算,不计摄动,半天内误差几十公里,用来画图和数可见卫星足够;北斗去掉了不提供公开服务的试验卫星(北斗三号试验星)。北京取北纬 39.90°、东经 116.41°,高度 50 米;时间从 2026 年 11 月 7 日 0 时(世界时)起。图 4、图 5 的「测量值」是用卫星位置算出的真实距离,加上 1 毫秒钟差和 3 米的高斯随机误差。

其他数据。手机在开阔地的定位精度:美国政府 GPS 网站(gps.gov)引用美国导航学会的数据,约 4.9 米。2000 年 5 月 2 日关闭「选择可用性」:美国政府 GPS 网站(gps.gov)公布的一个连续运行参考站(肯塔基州)5 月 1 日和 3 日各 24 小时的对比,水平误差(95%)从 45.0 米降到 6.3 米。2024 年 5 月的拖拉机:新闻报道引用美国国家海洋和大气管理局空间天气预报中心的说法,偏差约 10 英尺。2026 年 4 月起,正在工作的 GPS 卫星为 32 颗(美国太空军)。