【手机定位原理揭秘第二期】GPS定位实现原理解析

见证革命友谊的时刻到了,还不快去关注我们

什么是GPS定位?

我们手机上的GPS定位,是卫星定位的一种约定俗成的说法,卫星定位的全称来说应该叫做GNSS(Global Navigation Satellite System)定位。GPS只是GNSS的一种,是美国部署的一套全球卫星系统。这套系统给个简单的描述,就是

天上有24颗卫星在不断的绕地球运动(图1),

每颗卫星不断发送“我是谁,我在哪里”的信号

接收机(比如手机GPS芯片)收到了多颗卫星发出的这样的信号,根据信号传播时间推算出离卫星的距离,进而解出了接收机自己的位置,顺便可以得到当前准确时间(图2)。

图1

图2

关于GPS基本原理问答

如果对这个原理稍微琢磨一下,就很容易出现不可理解之处,比如:

有人问,为什么能保证每时每刻都能定位呢?如果天上就两颗卫星,又如何唯一解算出设备位置?这就是天上为什么部署24颗卫星的原因,这种部署方式就可以保证无论何时天空中都能接收到>=4颗卫星的信号。

有人问,求解3D坐标只要三颗卫星就够了,为什么要四颗呢?问题就在于接收机(手机)的时钟和卫星的时钟是存在时间差的,我们需要解算出这两个时钟的真正时间差,否则便无法算出传播时间,也无法根据传播时间来反算传播距离,最终便无法定位。也就是说,我们要解的未知数,不是三个,而是四个。

有人问,既然卫星信号在卫星定位成功后,每秒都会定位一次,这足以说明信号传播是没有障碍的,那么为什么要花这么长的时间来搜星?这是个好问题,不过这个问题很复杂,一言蔽之就是最主要的时间用在了“等待电文”上,所谓电文就是卫星用来循环播报当前位置的信号(这里澄清下,卫星并不是如我们想的这样,每秒播报一次当前的位置,而是时刻发送连续循环的信号,要不然也不会有接收机能实现每秒几十次GPS定位了),这个信号播报周期为30秒,从而GPS的冷启动一般来说,至少要30秒才能完成。

有人问,为什么在汽车的导航上看到GPS的轨迹运动非常连续平滑,而手机上却是每秒跳一次,手机能否每秒定位n多次?这个要分两方面说,第一这个肯定是可以做到的,因为GPS卫星发射的信号是连续的,他不是每秒广播一个卫星位置,而是传输一个轨道参数,基于这个信息,就可以重构卫星的完整飞行轨迹,从而只要接收方愿意,它可以做到每秒解算几十次位置;第二从目前来看手机GPS模块因为成本和收益的折衷,设计成每秒定位一次,基本也是够用的。当然,作为一个完美主义的手机APP开发者,你如果真的反感每秒跳动的位置,也可以基于每秒一次的位置,用滤波来进行平滑推算,使得视觉效果非常平滑,这样看上去也就能以假乱真了。

中国的北斗是怎么回事?

先抛出一个常见的问题,既然说GPS总共24颗星,那么按道理地球某个半球最多也就能接收到12颗卫星(比如东半球的接收机,不可能接收到正在西半球天空中的卫星发射过来的信号),但是看看GPS软件的截图(iOS没有,Android可以用GPS Test之类的)就会发现,可见卫星远大于10颗,这是为什么?

上图中,可见22颗卫星,锁定使用了20颗卫星,左面的国旗揭露了奥秘,是的,现在手机的所谓GPS接收模块中,很多都拥有多种卫星的接收能力,实际可用的卫星主要是三种:GPS、格洛纳斯、北斗。多个卫星系统共同定位,产生比单一GPS更好的定位效果。

如何确定你的手机支持哪些卫星呢?作为一个使用者,可以直接下载GPS软件来看国旗的颜色来大致了解,作为一个开发者,可以获取GPS的卫星伪随机码作为编号,具体可参看Android中关于GPSStatus类的描述。

之所以多套卫星定位系统存在的原因,要从部署卫星定位系统的初衷说起。一个国家部署卫星定位系统,主要目的是为了在作战中,能精确定位,便于精确调度进行打击。当然在和平年代(比如说当代中国),这种卫星系统更普遍地出现在民用领域,如车载导航仪等。

那么就会有人问,既然这样,为什么要另起炉灶,部署那么多套呢?比如中国为什么不沿用GPS,而要花大量人力做一套北斗系统呢?原因就是GPS卫星的部署者(美国军方)是可以对信号设置干扰的,一旦干扰产生,普通的接收机便无法正确定位,而美国由于知道具体的干扰加密策略,它可以无损解密,依然正常定位。从技术角度说,形成GPS垄断难度并不大(当然这样也确实非常损人品),这样的后果却是很不可想象的——首先对中国主权构成很大的威胁,其次各行各业的正常生产也都会受到极大的影响。因此,一个有实力的国家,都应该有一套属于自己的卫星导航系统。

自从2000年中国发射了第一个北斗导航卫星至今,已经有17颗卫星在天空中默默地提供定位服务,目前北斗只能在亚太地区提供局部的定位能力,当所有35颗卫星都发射完毕后,就可以提供全球范围的定位服务,届时北斗系统的定位能力便可正式比肩GPS。

关于GPS搜星的速度讨论

刚才说到GPS定位慢,这个确实不假。接下来我们细致的讨论下,为什么慢,以及在手机里是如何解决这个问题的。

搜星时间长,主要是两个因素构成的:第一是GPS信号的解调,可以认为需要用类似穷举的方式解出来真正的信息;第二是GPS卫星发送30秒一次的循环电文,这个循环电文已经包含了这段时间每一瞬间的卫星位置,一般总得一个循环完成后,才能收集到足够可以推算设备位置的信息。对于冷启动来说,后者是免不了的,前者则取决于接收机软硬件的优劣,这就是所谓GPS在没有任何知识的情况下启动至少要持续30秒的原因。

但实际上,有时候打开地图软件,都是看到瞬间定位,而有时候则可能几分钟乃至几十分钟都无法定位成功,这又是为什么?

地图APP定位成功,不一定都是GPS定位

首先,WIFI定位已经可以做到很不错的精度,甚至在室内可以做到5M,这个精度已经不比GPS差了,在室外,WIFI定位也可以做到20M量级,也就是比GPS稍稍差一些,在高楼林立的区域,WIFI定位的精度会比GPS更好。

其次,在新版Android和市面上可见的iOS系统上,刻意屏蔽了“GPS是否定位成功”这么一个信息,表现为一旦使用定位,位置图标即展现,并且不闪烁(老Android系统,会有闪烁来表达GPS没有定位成功),以至于用户无法知道到底这个定位结果是谁产生的。

我们之前的讨论说起过,WIFI定位,是可以瞬间完成的,所以这一切产生了“GPS”定位很快的错觉。

卫星分布状态不一定允许快速定位

如果你在一个朝北的窗口,开始搜星,那么卫星分布很可能是这样的,你会注意到,可见卫星都在楼的北侧(南侧的信号都被楼本身给遮挡了),因此这些卫星的排列区域就非常有限,极端的情况下,卫星既少,信号又弱,又是线性排列,GPS接收机就很难解算出一个高质量的位置,远不如那些在空旷区域的定位速度快。

另外也要说明一点,有人会问,为什么当时可见的有5颗乃至更多的卫星依然不能定位?这也是卫星分布情况导致的,如果卫星信号强度很弱(用专业术语就是信噪比很弱,这个在Android系统里是可以得到的),或者尽管卫星很多,但是分布形态不够分散,那也会让接收机很为难,如果没有十足的把握,接收机是不会认为定位成功的。给出个几百米误差的定位结果(不过实际上手机GPS也经常干出这种事情),岂不是自砸招牌吗?

A-GPS等加速搜星措施的应用

我们经常听说A-GPS这个概念,因为A-GPS需要网络运营商的参与,所以这个概念容易和网络定位混淆,其实A-GPS不是基站定位,基站定位只是其中的一个步骤,A-GPS最终的精度和普通定位精度是一样的。只不过A-GPS可以从运营商这里做粗略定位后,将其发送给A-GPS服务器下载当时的卫星信息,以至于不用等待漫长的卫星轨道信息广播完毕后,才能知道卫星的位置。这样即使是冷启动,也能根据从网络传回来(而不是从卫星广播传过来)的卫星参数来迅速参与位置计算。在用户看来,搜星时间自然就大大缩短了。

但是这些加速措施,有时候并不好使,比如你在网上搜索gps.conf为关键字,有铺天盖地的帖子,大意就是Root后改这个文件,里面有A-GPS服务器的配置,改后即“秒定”。这类帖子多,足以说明搜星慢是个很大的痛点,但仔细一看就会发现,搞A-GPS几乎没有一个公认的办法可以通杀。这又是为什么?

问题在于三点:

第一,A-GPS首先要运营商支持,使之至少可以按照标准协议,提供一个粗略定位结果,但运营商是否积极、免费地支持呢?这个问题,留给读者读调研,你去看看中国运营商的主页吧。

第二,A-GPS需要网络流量可用,这样才可以连到A-GPS定位服务器上。这个环节基本没问题。

第三,A-GPS的服务器需要是可用,建议你看看gps.conf里写的A-GPS服务器到底是啥,是不是谷歌的服务器呢?如果是的话,那么A-GPS在国内不可用也就可以理解了。

这就是一个系统的依赖太多导致不work的典型例子,于是乎,手机厂商自然对此是很不满意的。随着高通芯片的大面积铺开,其主导的xtra辅助定位系统开始迅速流行,这个机制绕开了基站运营商,而是直接基于网络流量(3G、4G、WIFI)从芯片厂商这里得到卫星信息。比如在搭载高通最近这些年方案的手机上(典型例子是三星Galaxy S5),利用xtra方案,确实可以实现冷启动秒定,非常震撼。

出现这个后来者居上的局面,也是可以理解的,GPS能迅速定位,是手机和芯片的重要卖点(相比之下用户不会因为运营商不支持A-GPS就放弃运营商),所以手机和芯片厂商自然就会全力以赴的想办法解决这个问题。

GPS的痛点与机会:精度

如果要论GPS的问题,比较公认的是三个:第一是初始定位慢,但这个问题现在已经也好很多了,在辅助定位如xtra可用的机器上,GPS即使冷启动也是很快的,第二是室内没法用,但GPS原理就是那样,你要指望在室内可用是不现实的,何况室内的WIFI定位精度也不错,所以这个问题也还可以忍受。第三是GPS在室外某些区域的精度比较差,尤其是高楼区域,有时候可能有几百米的误差,这就很让人头疼了。

GPS误差产生的原因

GPS的误差,通俗的说主要由两种误差造成,第一种是电离层和接收设备的误差,不过,这个误差相对日产应用来说还不是那么致命,因为在空旷区域下,用手机进行GPS定位,这样的误差基本都在10米以内。要改善这个误差,需要改进手机的天线和芯片,比如双频差分GPS接收机,其精度就比普通手机GPS精度要高,可以做到一米以内,是不是非常厉害呢?不过话说回来,精度在5米之类的,也是不错的,所以手机厂商解决这个问题的动力并不是太强。第二种误差是遮挡、多径效应产生的误差,这个误差才是真正致命的,可以达到几百米,甚至上公里。

下图是在上海陆家嘴金融贸易区某高楼下绕着高楼行走的真实轨迹(黄色)和GPS轨迹(红色)的对比,是否让你感到触目惊心?

下图是上海延安路高架下在静安区的真实轨迹(黄色)和GPS轨迹(绿色)对比。

我相信你看到轨迹的第一反应,是不可思议,GPS怎么会有这么大的误差呢?发生GPS偏差的原因很多,高楼区域和高架下发生GPS误差的原因并不完全相同。我们遇到大部分GPS较大偏差,是高楼引起的,高楼林立区域(用学术界的说法就是城市峡谷地带)GPS偏差的原因是GPS接收机的测距机制导致的。下图大致说明了这个问题:

图中右面有个高楼,接收机(手机)收到的某卫星的信号,实际由两个分支构成,一部分是直射,一部分是发射到墙上再反射回来的卫星,GPS可能会被这样的信号所欺骗,甚至以为右面那部分信号才是直射过来的信号,于是就导致了它计算信号传播时间就错了,最终定位发生很大偏差。

GPS能知道自己算错了吗?

如果你是个开发者,就会知道,各种手机系统几乎都提供对GPS定位获取误差的API接口,那么GPS能知道自己算错了吗?它又是如何计算其误差的呢?

答案很复杂,一句话没法把这个问题说清楚,得分四种场景:

GPS定位实际误差小,GPS认为自己误差小:天空无遮挡,卫星分布均匀,每颗卫星信噪比都很好,GPS选择了形状最饱满、信噪比最高的几颗卫星加以定位,因此其对定位误差很有信心。

GPS定位实际误差小,GPS认为自己误差大:典型的是在较高的公共汽车和火车车厢里,这种情形信号强度很弱,但各颗卫星同等减弱,所以实际定位效果还可以,GPS却认为这个信噪比不靠谱,对此无信心,因此给出很大的误差半径。

GPS定位实际误差大,GPS认为自己误差小:这是个严重误判,主要出现在高楼区域(最典型的如CBD),这些区域其实信号遮挡并不明显,卫星数并不少,有时候还会非常多,但某些卫星通过光滑表面(玻璃高楼)反射到接收机,GPS接收机被欺骗,误以为这个卫星发射过来的信号是“单一直射”过来的,从而采纳了这颗卫星的传播时间用来定位,当多颗卫星存在这种情形,而且总卫星数非常多时,卫星分布也非常饱满,则GPS接收机就会乐观过度,悲剧就此发生。

GPS定位实际误差大,GPS认为自己误差大:主要出现在明确遮挡的区域(最典型的如高架下),某些的信号强度变得很差,从而接收机便不太信任这颗卫星。但身不由己,能用的卫星数太少,GPS接收机不得不用它来定位,所以卫星降低了对位置准确程度的预期,给出一个很大的半径。

如何改善高楼区域的GPS定位精度?

笔者先给出结论,纯粹靠端,并且把接收机当成黑盒,是无法做到的。

近年,学术界研究这玩意的Paper并不少,大致思路是两类:

第一个思路,真是实打实的在端上做,但不把接收机当成黑盒,而深入修改定位逻辑。显然这类事情最多也只是极少数对驱动精通的人能做,app开发者是做不了的——试问Android和iOS开放了GPS接收机内部解算逻辑了吗?没有。其实这和radio内部是黑盒一样的,你见过哪个开发者声称能改善手机拍照性能、改善音频播放音质、改善信号质量吗?iOS根本没把基本功能的实现逻辑开放出来,怎么改善?说能改善的都是耍流氓。

第二个思路,有可能能在手机上做,相关Paper一般基于楼的轮廓建立反射模型,举个例子,附近不是有个楼吗?这个楼多高,楼的地面轮廓是什么,我们都知道了,然后就根据卫星的细节情况(如方位、仰角、信噪比、是否参与定位)来猜测某些卫星发射到手机的信号,是不是会受到干扰,如果两者连线穿过了楼,那么我们就有理由认为,这个卫星信号的传播距离可能比实际的要长,从而我们就把定位结果朝这个卫星的位置做一些修正。

就第二个思路,要想做好也是很困难的,因为这个思路从原理上说,有很多想当然的前提。比如,当时用户真实的位置并不知道,所以判断是否有反射也就无从谈起,只能将其作为隐变量来迭代求解。其他的坑也很多,如楼的数据从哪里搞来?谁要说可以人肉采集的,那我想先问一个问题,先不说楼高度如何测量,你在人肉测绘楼轮廓的时候,是不是也用GPS了?那你是如何保证当时楼轮廓的测量结果是准确的呢?

不过,判断GPS是否真正的飘,这个比确定设备在GPS漂移时的真正位置,还是要容易一些的。首先GPS本身就给个半径出来,这个半径虽然不准,但也可以作为参考。其次GPS还有大量的卫星分布细节信息,是足以结合云端的统计结果来判断是否漂移的。只要能识别出GPS定位的真正误差,其意义就已经很大了,如在导航中,就会避免误偏航,在定位中,就可以用WIFI定位结果来替代GPS,做到真正的双向融合。不过,这个工作对开发者的模式识别功底,还是挺考验的,哪位同学能把这个事情搞定的,我们欢迎你加入百度,和我们一起把定位做得更好。

推荐阅读更多精彩内容