个人博客:xiuxiuing.gitee.io/blog

GPS定位实现原理解析

什么是GPS定位?

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

  1. 天上有24颗卫星在不断的绕地球运动(下图左),
  2. 每颗卫星不断发送“我是谁,我在哪里”的信号
  3. 接收机(比如手机GPS芯片)收到了多颗卫星发出的这样的信号,根据信号传播时间推算出离卫星的距离,进而解出了接收机自己的位置,顺便可以得到当前准确时间(下图右)。

关于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定位获取误差的API接口,那么GPS能知道自己算错了吗?它又是如何计算其误差的呢?
答案很复杂,一句话没法把这个问题说清楚,得分四种场景:

  • GPS定位实际误差小,GPS认为自己误差小:天空无遮挡,卫星分布均匀,每颗卫星信噪比都很好,GPS选择了形状最饱满、信噪比最高的几颗卫星加以定位,因此其对定位误差很有信心。
  • GPS定位实际误差小,GPS认为自己误差大:典型的是在较高的公共汽车和火车车厢里,这种情形信号强度很弱,但各颗卫星同等减弱,所以实际定位效果还可以,GPS却认为这个信噪比不靠谱,对此无信心,因此给出很大的误差半径。
  • GPS定位实际误差大,GPS认为自己误差小:这是个严重误判,主要出现在高楼区域(最典型的如CBD),这些区域其实信号遮挡并不明显,卫星数并不少,有时候还会非常多,但某些卫星通过光滑表面(玻璃高楼)反射到接收机,GPS接收机被欺骗,误以为这个卫星发射过来的信号是“单一直射”过来的,从而采纳了这颗卫星的传播时间用来定位,当多颗卫星存在这种情形,而且总卫星数非常多时,卫星分布也非常饱满,则GPS接收机就会乐观过度,悲剧就此发生。
  • GPS定位实际误差大,GPS认为自己误差大:主要出现在明确遮挡的区域(最典型的如高架下),某些的信号强度变得很差,从而接收机便不太信任这颗卫星。但身不由己,能用的卫星数太少,GPS接收机不得不用它来定位,所以卫星降低了对位置准确程度的预期,给出一个很大的半径。

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

笔者先给出结论,纯粹靠端,并且把接收机当成黑盒,是无法做到的。
近年,学术界研究这玩意的Paper并不少,大致思路是两类:
第一个思路,真是在端上做,但不把接收机当成黑盒,而深入修改定位逻辑,显然开发者是做不了这个事情的。最多也只是极少数对驱动精通的人能做,app开发者是做不了的——试问Android和IOS开放了GPS接收机内部解算逻辑了吗?没有。其实这和radio内部是黑盒一样的,你见过哪个开发者声称能改善手机拍照性能、改善音频播放音质、改善信号质量吗?OS根本没把基本功能的实现逻辑开放出来,怎么改善?说能改善的都是耍流氓。
第二个思路,有可能能在手机上做,但paper一般基于楼的轮廓建立反射模型,举个例子,附近不是有个楼吗?这个楼多高,楼的地面轮廓是什么,我们都知道了,然后就根据卫星的细节情况(如方位、仰角、信噪比、是否参与定位)来猜测某些卫星发射到手机的信号,是不是会受到干扰,如果两者连线穿过了楼,那么我们就有理由认为,这个卫星信号的传播距离可能比实际的要长,从而我们就把定位结果朝这个卫星的位置做一些修正。
就第二个思路,要想做好也是很困难的,因为这个思路从原理上说,有很多想当然的前提。比如,当时用户真实的位置并不知道,所以判断是否有反射也就无从谈起,只能将其作为隐变量来迭代求解。其他的坑也很多,如楼的数据从哪里搞来?谁要说可以去人肉采集的,那我想先问一个问题,先不说楼高度如何测量,你在人肉测绘楼轮廓的时候,是不是也用GPS了?那你是如何保证当时楼轮廓的测量结果是准确的呢?
不过,判断GPS是否真正的飘,这个比确定设备在GPS漂移时的真正位置,还是要容易一些的。首先GPS本身就给个半径出来,这个半径虽然不准,但也可以作为参考。其次GPS还有大量的卫星分布细节信息,是足以结合云端的统计结果来判断是否漂移的。只要能识别出GPS定位的真正误差,其意义就已经很大了,如在导航中,就会避免误偏航,在定位中,就可以用WIFI定位结果来替代GPS,做到真正的双向融合。不过,这个工作对开发者的模式识别功底,还是挺考验的。

地图定位技术揭秘(二)相关推荐

  1. 地图定位技术揭秘(三)

    个人博客:xiuxiuing.gitee.io/blog 室内定位技术原理揭秘 地图软件已经成为我们日常出行必不可少的工具之一,在导航和搜索上带来了很多便捷的帮助.而定位技术在地图软件里的应用可谓无法 ...

  2. 地图定位技术揭秘(一)

    个人博客:xiuxiuing.gitee.io/blog 手机定位的价值 目前智能手机的使用已经越来越普遍,手机定位也是手机上的一个核心基础功能.举一个常见的应用如叫车,司机需要知道你在哪里,同时打车 ...

  3. 安卓刷量技术揭秘(二) 高级攻防技巧

    标 题: [原创]安卓刷量技术揭秘(二) 高级攻防技巧 作 者: ckis 时 间: 2016-10-02,00:28:27 链 接: http://bbs.pediy.com/showthread. ...

  4. iOS关于地图定位基础(二)

    在前一篇文章 iOS关于地图定位基础(一) 中我们主要总结了 iOS 里面利用原生 CoreLocation 框架实现基本定位功能和一些注意点,侧重点主要是iOS8+之后的定位授权与授权状态的使用.接 ...

  5. 技术揭秘二:探讨12306两地三中心混合云架构

    前言 2015年春节最大的特色就是"摇一摇",微信红包在春晚摇一摇互动总量超过110亿次,峰值达8.1亿次/分钟,有185个国家传递微信祝福.支付宝钱包在除夕晚上8点达峰值,首页被 ...

  6. 无线定位技术实验二 TDOA最小二乘定位法

    前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看.(点击跳转人工智能学习资料) 微信公众号:创享日记 发送:tdoa最小二乘 获取完整报告(含源码+结 ...

  7. 【外挂编程】外挂编程技术揭秘(二)

    引言: 经过上一篇文章大家可能对外挂有了一个初步的认识,之前的内容比较简单,应该大家很容易掌握.我写作过程中我发现三个篇幅可能写不完,后续还可能要多加几个篇幅,这篇我们就先以内存挂为主吧.话不多说了, ...

  8. 【定位原理揭秘第三期】室内定位技术原理揭秘

    > > > >引言 地图软件已经成为我们日常出行必不可少的工具之一,在导航和搜索上带来了很多便捷的帮助.而定位技术在地图软件里的应用可谓无法替代,尤其是在小范围的室内定位环境下 ...

  9. 业内首发车道级导航背后——详解高精定位技术演进与场景应用

    导读 10月30日,华为联合高德.千寻发布了业内首家面向手机用户的车道级导航应用.在这背后是高精度定位技术不断演进发展,最终走向成熟量产的过程.本文将结合高德地图在车道级导航及自动驾驶等领域的工作,分 ...

  10. iOS关于地图定位基础(一)

    若看完这篇的朋友,可以查看我的下一篇iOS关于地图定位基础(二)    随着更多的LBS(Location Based Service)业务被集成到手机应用  同时鉴于在iOS中地图的学习是看了又忘, ...

最新文章

  1. java 调用office_JAVA调用PageOffice在线打开、编辑Word文档
  2. 程序猿老公去米国参加 WWDC,顺便想带渡老婆蜜月,如何办签证?
  3. 数据速率、载波频率和带宽的关系
  4. ICO取缔一锤定音,投资者、发起方、交易所如何处理后续风险,保障权益?
  5. centos samba 配置
  6. 一英寸芯片大小_科普:为什么标称1英寸的CMOS成像芯片,其对角线长度不是25.4mm?...
  7. SequoiaDB数据水平分区简介
  8. TensorFlow 教程 --进阶指南--3.10共享变量
  9. Get!程序员成为高级管理者的三次跃升
  10. 【python笔记】 for循环和while循环,break和continue语句
  11. 阿里内部刊物首次公开——《智慧之巅:DT时代的商业革命》出版
  12. SQLServer示例数据库AdventureWorks下载地址
  13. 如何添加PR视频特效?
  14. FBX模型格式和FbxSDK
  15. AOJ-AHU-OJ-5 渊子赛马
  16. Swift 学习总结三:数组,字典,枚举,闭包, 函数
  17. textview中划线效果
  18. 2020大数据面经整理
  19. tortoise-orm连接多个数据库
  20. 请19级的童鞋们接收一下

热门文章

  1. 乘风破浪,遇见未来新能源汽车(Electric Vehicle)之特斯拉提车必须知道的十个流程
  2. css-盒子模型详解以及远视图的制作
  3. 《Android框架揭秘》——2.5节应用程序Framework源码级别调试
  4. 订单同步有技巧,双十一高峰不再怕
  5. JSP九大内置对象及其作用
  6. 明华RD读卡器校验密码问题
  7. Educoder jQuery 入门
  8. 服务器版本虚拟打印机,虚拟打印机(ImagePrinter)
  9. 极光im支持android手机系统,极光IM- JMessage 产品简介 - 极光文档
  10. 银联在线支付B2C UnionPay.NET