一篇关于GPS定位写得最详实清晰的文章之一

一篇关于GPS定位写得最详实清晰的文章之一


介绍篇

过去,如果你的女友是个路痴,大概会有这样的对话……

——你在哪儿呢?

——啊?我在马路上啊。

——有什么特征?

——头顶有个月亮。

——你旁边有什么啊?

——有个路灯。

——有没有路牌啊?路牌上写的什么?

——我看看啊。还真的有,上边写着“禁止停车 违者罚款”。

——姑奶奶,我真是服了你了……

——哼,你是不是不爱我了,你肯定是不爱我了,你是不是喜欢上了新来的那个前台?

——。。。

——我跟你说那个前台绝对是个伪娘!(开启八卦模式)还有还有,小王买了个新口红真好看,你也给我买好不好……

——(一脸崩溃的表情)

(路人甲:你是不可能有女友的!)

 

现在,如果你的女友是个路痴……

——你在哪儿啊?

——我发定位给你!乖乖的来接老娘。

——遵命。。。

 

作为一个标准路痴,曾经有N次陷入绝境黑历史。正所谓:手持一纸地图,双眼紧盯道路,环顾四周茫然,我现身在何处?

 

后来随着智能手机的普及,我以为情况能有所改善,后来才发现是我想多了——为嘛xx地图、xx导航还是总让我往死胡同里跑,非让我开车过湖?

 

再后来,随着手机操作系统的迭代,芯片的升级,定位才慢慢变得精准、可靠。我再也不用湖里游泳了……当然,这都是后话了。

 

 

(哥开的不是车,是!寂!寞!)

 

慢慢的随着了解的深入,才明白原来定位有这么多区别,里边的学问可大着呢。

 

定位给方式有很多种,室外定位有基站定位,卫星定位等方式;室内定位有BLE、RFID、Wi-Fi等方式;还有其他IP定位,惯性导航等等方式。

定位方式

定位原理

定位方案

应用场景

成本

设备要求

精度

基站定位

上报设备周边基站信息,服务器查表、解析并返回定位结果

单基站定位

多基站定位

室外

极低

设备成本低

需后端支持*

500m

卫星定位

使用天线搜索卫星向地表发射的电波,解算后输出定位结果

多星定位

室外

较低

设备成本低

5m

差分定位

卫星+结合基准站的数据进行定位

多星定位

室外

很高

设备成本高

需专有后端支持*

5mm

BLE iBeacon

使用设备接收蓝牙信号,根据信号强弱计算距离,输出定位结果

单点定位

多点定位

室内

较高

设备成本较高

30cm

RFID

使用设备接收射频信号,根据信号强弱计算距离,输出定位结果

单点定位

多点定位

室内

很高

设备成本较高

10cm

Wi-Fi

上报设备周边路由器MAC信息,服务器查表、解析并返回定位结果

单机定位

多机定位

室内

较低

设备成本低

需后端支持*

10m

IP 定位

上报目标设备公网IP地址,服务器查表并返回定位结果

-

不限

极低

设备成本低

需后端支持*

10km

佛系

手持佛珠

念念有词

-

不限

0成本

无需设备

随缘


“需后端支持”指需要连接到服务器进行数据解析,才能获得定位结果;

“需专有后端支持”指可能需要付费才能获得相关数据,终端设备才可以进行定位。

 

本文咱们就说说和物联网关系最密切的卫星定位那些事儿。

 

 

 

众多卫星定位系统中,最广为人知的就是GPS (Global Positioning System)了。它是美国在1958年开始研发,1964年投入使用,1994年实现全球覆盖的全球卫星定位系统。 

 


 

GPS由24颗工作星和4颗备用星组成。卫星工作在互成55度的6条高度为2.02万KM的非同步轨道上。如此一来,在全球的任何地方、任何时间都可观测到4颗以上的GPS卫星。GPS卫星向地球发射导航电文(系统时间、星历、历书、卫星时钟修正参数、导航卫星健康状况、电离层延时参数等内容),GPS终端收到卫星发送的数据,经解算即可确定当前位置,并以NMEA0183格式,WGS-84坐标系输出数据。 

 

    

 

也许有的读者会问,万一卫星坏了怎么办,GPS岂不是要失准了?其实这个担心是多余的啦,轨道上不仅有备用卫星,每年NASA也会委托Space X补发和替换寿终的卫星。

 

当然,卫星定位系统不是GPS一家独大的。只是因为GPS的先驱地位,所以很多人也都习惯性的把所有卫星定位系统都称之为“GPS”。

 

毕竟,使用GPS卫星之时,就是被美国钳制之日。GPS卫星是被美国军方控制的,他们可以随意调节某地区的定位精度(如中东地区),甚至让终端设备解算结果南辕北辙。而且GPS卫星是单向广播的,不具备双向通信能力,功能略显单一。

 

有鉴于此,很多国家也都在建设或已建成卫星定位系统。如中国的北斗(BeiDou)、欧洲的伽利略(Galileo)、俄罗斯的格洛纳斯(GLONASS)、印度的IRNSS等。

 

目前,中国的BeiDou北斗已经具备商用能力。配合基准站,甚至能给客户提供精确到毫米的定位服务。同时,BeiDou北斗也弥补了GPS的不足,具备短报文能力(驴友、海航必备。绝非手机的基站可比拟,只是资费超超超感人)。

 

既然太空中有那么多卫星,又有那么多种不同的卫星定位系统,那么如何知道某一片区域是否有定位卫星覆盖,以及有哪些卫星覆盖呢?Android手机请在应用商店搜索“GPS Data+”并安装,打开后即可看到当前正在使用的定位卫星:

 


 

由于智能手机操作系统、定位芯片、天线、算法的差异,所以并不能搜索到所有用于定位的卫星系统。通常来说,智能手机只能搜到并使用部分(如图,即GPS+Beidou+GLONASS+QZSS,没有Galileo、IRNSS)。

 

各导航系统不同频段的工作频率

导航系统

国家

频段

工作频率

GPS

美国

L1

1575.42MHZ ±1.023MHZ

L2

1227.60MHZ ±1.023MHZ

L5

1176.45MHZ ±1.023MHZ

GLONASS

俄罗斯

L1

1602.5625MHZ ±4MHZ

L2

1246.4375MHZ ±4MHZ

BD1

中国

S

2491.75MHZ ±4.08MHZ

L

1615.68MHZ ±4.08MHZ

(左旋圆极化)

BD2

B1

1561.098MHZ ±2.046MHZ

B2

1207.520MHZ ±2.046MHZ

B3

1268.520MHZ ±10.23MHZ

Galileo

欧洲

L1

1575.420MHZ ±1.023MHZ

E5b

1207.140MHZ ±1.023MHZ

E5a

1176.450MHZ ±1.023MHZ

E6

1278.750MHz ±1.023MHZ

QZSS

日本

L1C

L1CD

1575.42 MHz

L1CP

L1-C/A

L2C

1227.6 MHz

L5

L5I

1176.45 MHz

L5Q

L1-SAIF

1575.42 MHz

LEX

1278.75 MHz

IRNSS

印度

L5

1176.45 MHz

S

2492.028 MHz

 

观察一下表格,我们可以发现,日本简直是太“鸡贼”了——L1 C/A、L1C、L2C、L5信号跟GPS卫星信号是完全兼容的,同时L1-SAIF还可以给日本地区提供高精度定位服务;LEX信号频点和欧洲Galileo系统的E6频点重合。也就是说,日本的QZSS当前可以作为GPS的补充,日后等到Galileo系统正式提供服务,QZSS也能实现Galileo系统的补充。

 

接下来进入喜闻乐见的“你问我答”环节:

Q:为什么有的时候手机定位还是很慢?

A:信号问题、基带问题等,一切皆有可能。如果想要提高定位精度,最简单方式就是——买!个!新!手!机!

 

Q:我想试试伽利略,有没有支持的手机呢?

A:华为有部分机型支持。

 

Q:小米8刘海屏不好看啊,你看VIVO NEX多美。对了,小米8说是全球第一个支持GPS双频定位(L1、L5)的手机,好像很牛逼,能做到厘米级定位吗?

A:不能。没有基准站的支持,双频顶多是减小误差,对高精度定位无助。所以,还是洗洗睡吧。

 

Q:北斗的短报文资费究竟有多感人?

A:十几块一条吧。你可以去某猫、某宝查看一下报价。

至于说语音通信,也有海事卫星电话可用,不同国家资费不同,从十几块到几十块一分钟;什么?你想用卫星上网?按量计费$10/1M,怎么样,用的起吗?

 

Q:既然已有GPS,为什么还要重造轮子?

A:因为GPS的L1、L5是民码,大众可用,但是美军曾经在战时关闭过某些战区的数据覆盖,为了避免这种被人卡住喉舌的尴尬,所有必要发展自己的卫星定位系统。

 

Q:卫星定位系统只在地表有用吗?

A:非也。负海拔地区(只要有信号)、空中、甚至大气层外都可以。需要注意的是,水体、岩石等密度高的物体内无法使用。

大气层外使用,还要注意广义相对论对时钟造成的影响。

 

Q:《007 明日帝国》中,大反派使用了某种很牛逼的设备,通过某些手段改变了卫星参数,劫持了一艘船,这种事情可能发生吗?

A:这种事情,世界上已经发生过了。

因为GPS信号没有认证方式,且信号极弱,非常容易被劫持。例如HackRF One就可以模拟并发射GPS信号;甚至让大疆无人机在禁飞区起飞。

伊朗也是用过类似的技术,成功捕获美国的无人机。

 

Q:最少搜到多少颗卫星才能定位成功呢?

A:因为采用三角定位的原理,所以至少3颗卫星才能实现精准定位;具体要求如下:

使用卫星数

能否定位

备注

0

无法定位


1

无法定位

可以更新UTC时间和日期;

2

无法定位


3

可实现2D Fix,输出经纬度

不可输出海拔信息

4

可实现3D Fix

可输出正确海拔信息

>4(多频)

可实现3D Fix

可输出伪距

 

Q:你为什么懂得那么多啊?

A:大概是因为我比高吧。


定位篇

有的人会问,既然天上多卫星,为什么我看输出结果只是用了其中有限的几个呢?这是因为单片机使用的小尺寸的陶瓷天线,一般只能做到兼容2个频段(一般软件上也是多选2),无法做到同时兼容3个频段。所以通常是单选GPS或北斗;或者是GPS+北斗、GPS+GLONASS等两两组合的方式。

 

有的开发者实测时发现,为什么代码无误,但是定位模块就是搜不到卫星,无法定位呢?

 

实际上排查这种问题既简单,又复杂。之所以说简单的,是因为搜不到卫星唯一的原因就是信号问题。复杂是因为即便知道了病因,开发者也可能会觉得束手无策。

 

信号问题,那就是“卫星→天线→模块→代码→输出”的某个环节出现异常了。在这里,结合“望闻问切”的方法,针对可能出现的问题逐项击破。

 

首先,开发者应谨记,任何时候都应该避免空间上存在异物遮蔽天线(如树木、建筑、高架桥),物理上存在金属外壳等遮挡天线等情况(如铝壳、铁壳)。应确保测试环境是空旷的,无遮挡的,信号良好的。

 

之所以一直在强调天线、信号、无遮挡,是因为卫星的发射功率并不大,信号到达地面时已经很弱。这种信号强度相当于1.6万公里外一个25瓦的灯泡发出的光。再做个比喻,它比电视机天线所接收到的功率还要低10亿倍。

 

信号弱、无信号,都会表现为无法定位,或者定位慢。那么,如何判断究竟是信号问题导致的定位慢,还是真·无信号呢?观察模块输出的GGA、RMC和GSA: 

GGA:

格式:

$--GGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh

示例:

$GPGGA,065545.789,2109.9551,N,12023.4047,E,1,9,0.85,18.1,M,8.0,M,,*5E


名称

样例

单位

描述

消息ID

$GPGGA


GGA 协议头

UTC 时间

065545.789


hhmmss.sss

纬度

2109.9551


ddmm.mmmm

N/S

N


N=北,S=南

经度

12023.4047


dddmm.mmmm

E/W

E


W=西,E=东

定位指示

1


0:未定位

1:SPS 模式,定位有效

2:差分,SPS 模式,定位有效

3:PPS 模式,定位有效

卫星数目

9


范围 0 到 12

HDOP

0.85


水平精度

MSL 幅度

18.1


单位

M


大地

-2.2


单位

M


-

差分时间


当没有 DGPS 时,无效

差分站ID




校验和

*5E



<CR><LF>



消息结束

RMC:

格式:

$--RMC,hhmmss.ss,A,llll.ll,a,yyyyy.yy,a,x.x,x.x,xxxx,x.x,a*hh

例句:

$GPRMC,100646.000,A,3109.9704,N,12123.4219,E,0.257,335.62,291216,,,A*59

名称

样例

单位

描述

消息ID

$GPRMC


RMC 协议头

UTC 时间

100646.000


hhmmss.sss

状态

A


A=数据有效;V=数据无效

纬度

2109.9704


ddmm.mmmm

N/S

N


N=北,S=南

经度

11123.4219


dddmm.mmmm

E/W

E


W=西,E=东

地面速度

0.257

Knot(节)


方位

335.62


日期

291216


ddmmyy

磁变量



-

校验和

*59



<CR><LF>



消息结束

GSA:

格式:

$--GSA,a,a,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x.x,x.x,x.x*hh

例句:

$GPGSA,A,3,10,24,12,32,25,21,15,20,31,,,,1.25,0.85,0.91*04

名称

样例

单位

描述

消息ID

$GPGSA


GSA 协议头

模式 1

A


M=手动(强制在2D或3D模式)

A=自动

模式 2

3


1:定位无效

2:2D 定位

3:3D 定位

卫星使用

10


通道1

卫星使用

24


通道2

卫星使用

12


通道3

卫星使用

32


通道4

卫星使用

25


通道5

卫星使用

21


通道6

卫星使用

15


通道7

卫星使用

20


通道8

,,,

,,,

,,,


卫星使用



通道12

PDOP

1.25


位置精度

HDOP

0.85


水平精度

VDOP

0.91


垂直精度

校验和

*04



<CR><LF>



消息结束

 

·如果GGA中的UTC时间错误,定位指示为0,卫星数目不为0;或者RMC的UTC时间错误,日期错误;GSA中卫星数目不为0,但是载噪比都很低,则可能是搜星慢,定位慢,信号差;

·如果GGA中的UTC时间错误,定位指示为0,卫星数目始终为0;或者RMC的UTC时间错误,日期错误;GSA完全没有任何有效输出,则可能是完全无信号。

 

对于搜星慢,定位慢,信号差的情况,应改善天线设计,保证天线面朝上的安装使用状态;并且天线周边没有金属物件遮挡,无射频干扰;在空间容许的情况下尽量选择大尺寸的陶瓷天线,必要时应使用有源天线。

 

对于完全无信号的情况,大概率是天线设计错误。譬如,没有给有源天线开启供电,错误使用天线型号(如芯片仅支持GPS,天线仅支持北斗;错误的使用GSM天线接收信号)等。

 

扩展阅读:《Luat模块GPS天线设计建议》

http://blog.sina.com.cn/s/blog_5b0121350102xy8v.html

 

还有一种常见情况是开发者在室内(含窗口、窗台)进行测试,这是不行的。因为室内没有卫星信号,并不能实现定位。

 

如果开发者不便于去户外进行测试,可以在某宝搜索“GPS 转发”并购买相关设备。这样一来,开发者就不用“风吹日晒,饱经风雨”的,“不辞辛劳”的在户外调试啦。

 

接下来进入大快人心的“你问我答”环节:

Q:有没有体积小、信号好强的天线?

A:鱼和熊掌不可兼得。只有最适合的,没有最好的。

 

Q:NMEA-0183哪里格式说明呢?

A:请到http://www.openluat.com/产品中心的GPS模块“下载中心”下载。

 

Q:GNSS和GPS什么关系啊?

A:严格来说,GPS∈GNSS。

所有的卫星定位系统都是可以称之为GNSS,GPS是GNSS的子集。

这一点在输出中也有体现,例如:GNGGA,GPGGA,BDGGA,即“混合定位”(多卫星系统)、“GPS定位”、“北斗定位”。

语句标识符:

标识符

含 义

BD

BDS,北斗二代卫星系统

GP

GPS

GL

GLONASS

GA

Galileo

GN

GNSS,全球导航卫星系统

 

Q:GGA、RMC、RSV有什么分别?

A:都是NMEA-0183标准的要求。他们的释义如下:

标识符

含 义

GGA

时间、位置、卫星数量、定位方式

GSA

GPS 接收机操作模式,定位使用的卫星,DOP值,定位状态

GSV

可见GPS卫星信息、仰角、方位角、信噪比

RMC

时间、日期、位置、速度

VTG

地面速度信息

  

Q:UTC时间有办法换算成当地时间吗?

A:陆地的话,因为很多国家可能跨越非常多的时区,却使用统一时间,所以只能查表啦(如北京时间UTC+8)。如果是海洋,则根据经度计算时区。

 

Q:有没有手机能用的,测试GPS的,比较牛逼的app?

A:Android:GPS Status;GPS Test+;GPS Data+

iOS:GPS Test+

 

Q:为什么手机定位那么快那么准,定位模块那么慢,误差还很大?

A:因为手机是牺牲个人隐私为前提的多重定位(基站+WiFi+蓝牙+GPS+AGPS+历史数据),而模块只是用GPS天线,所以显得略慢一些。但是使用“AGPS辅助定位”后,一样可以做到秒定位。

 

Q:你为什么懂得那么多啊?

A:大概是因为我比较富吧。

 

PS: 那么,怎么使用“AGPS辅助定位”呢?请关注下文哦。


秒定位篇

为什么信号极好的情况下,定位速度也不快?有没有办法实现“秒定位”呢?答案当然是肯定的啦。 

 

 

常规情况下,定位模块上电开机后,通过天线搜索卫星,解析卫星发射的数据(导航电文),然后内部生成星历,再经过复杂的计算,从而得到当前精确的位置(3D Fix)。这个过程称之为“冷启动”。根据信号强度、芯片运算能力,通常耗时几十秒到几分钟不等。

 

这个过程中,搜星+生成星历文件耗时最久。

 

不过有的读者可能会问,为什么有的时候定位模块只用了几秒就成功定位了呢?原因有二:1、非“冷启动”方式,即“温启动”或“热启动”;

2、使用了AGPS辅助定位。

 

那么,“冷启动”、“温启动”和“热启动”有什么区别呢?也许大家会以为,这里的“X启动”和电脑的开机、待机(睡眠)、重启近似吧?实际上并非如此哦。由于卫星所处空间位置、终端设备所处地表位置是不固定的,所以此处的“X启动”都是以最后一次定位时间和位移距离作为判断依据的:

 

启动方式

解释

自主秒定位*

辅助秒定位*

冷启动

1、初次使用时;

2、电池耗尽导致星历信息丢失时;

3、关机状态下,移动1000公里以上距离时。

×

温启动

距离上次定位时间超过2个小时,不足4个小时;

没有较大距离的位移发生。

热启动

距离上次定位时间不足2个小时;

没有较大距离的位移发生。


*自主秒定位:根据模块内保存的星历,实现快速搜星、定位。

*辅助秒定位:使用AGPS辅助,实现快速搜星、定位。

 

也就是说,“温启动”和“热启动”情况下,定位模块是可以实现自主秒定位的。

 

那么,什么又是“AGPS辅助定位”呢?在传统GPS定位方式中,定位模块需要全频段搜索以找到可用卫星,因而耗时较长。而“AGPS辅助定位”方式,是通过网络直接下载当前地区的可用卫星星历数据,并将之发送给定位模块,定位模块只搜索特定的卫星,从而提高了搜星速度,减少设备耗电。

 

举个例子:冷启动像是多项选择题,要把所有选项计算一遍,才能找到正确答案;而“AGPS辅助定位”就像是作弊器,排除掉了很多错误答案,只要计算少数几个即可。从而提高效率和准确率。

 

不过,这个世界上没有圣杯,“AGPS辅助定位”不是万金油。它的应用条件还是需要比较苛的:

·卫星信号接收条件必须良好,至少可观测到4颗卫星(如果有条件,推荐使用有源天线);

·定位芯片必须支持AGPS辅助定位;

·必须可以准确获取当前地区星历数据;

·如果是冷启动,需要等待通信芯片附着成功,接收到星历数据后,传输给定位模块;

·如果是温启动/热启动,亦需要重新搜星;

 

由此可见,只有上述条件满足的时候,才能实现秒定位。如果是冷启动 + GPRS附着传输星历数据,实际上需要等待的时间也不短呢(甚至有可能定位模块已经3D Fix,GPRS才刚刚附着成功,把星历数据发过来)。

 

以上海合宙通信科技有限公司的Air8xx系列模块为例,它的AGPS辅助定位基本流程如下:

1、设备从蜂窝基站获取到当前位置的小区信息;

2、设备通过蜂窝网络,将当前蜂窝小区信息传送给网络中的AGPS位置服务器;

3、APGS位置服务器根据当前小区信息查询该区域当前可用的卫星信息(包括卫星的频段、方位、仰角等相关信息),生成对应星历文件,并返回给设备;

4、通信模块通过串口把收到的星历文件传输给定位模块;

5、定位模块根据星历文件,得到的可用卫星信息,快速找到当前可用的GPS卫星,针对性的搜星,大大提升定位时间。

 

接下来进入普天同庆的“你问我答”环节:

Q:我的模块没有GPS芯片,能否使用“AGPS辅助定位”实现定位?

A:当然不行。这个问题就相当于“我有增压器,没有发动机,能跑100迈吗”一样。“AGPS辅助定位”,只是辅助加速定位,而不是一项独立可用的定位服务。

 

Q:“AGPS辅助定位”能否提高定位精度?

A:不能,它只能加快定位速度。无法提升定位精度。

 

Q:如何根据NMEA-0183判断AGPS是否成功写入了呢?

A:看GGA、RMC的UTC时间是否被修正,看GSV数据是否生成;

 

GSV:

格式:

$--GSV,x,x,x,x,x,x,x,...*hh

例句:

$GPGSV,3,1,12,14,75,001,31,32,67,111,38,31,57,331,33,26,47,221,20*73

名称

样例

单位

描述

消息ID

$GPGSV


GSV 协议头

消息数目

3


1~3

消息编号

1


1~3

卫星数目

12



卫星ID

14


1~32

仰角

75

0~90

方位角

001

0~359

载噪比(C/No)

31

dBHz

0~99(无跟踪时为空)

卫星ID

32


1~32

仰角

67

0~90

方位角

111

0~359

载噪比(C/No)

38

dBHz

0~99(无跟踪时为空)

卫星ID

31


1~32

仰角

57

0~90

方位角

331

0~359

载噪比(C/No)

33

dBHz

0~99(无跟踪时为空)

卫星ID

26


1~32

仰角

47

0~90

方位角

221

0~359

载噪比(C/No)

20

dBHz

0~99(无跟踪时为空)

校验和

*73



<CR><LF>



消息结束

 

Q:“AGPS辅助定位”的星历文件消耗流量多吗?

A:很少,几k而已。

 

Q:星历文件是否需要定期更新?更新频率是多少?

A:需要根据自己的情况进行分析。如果是冷启动后,不关闭定位模块,下载一次“AGPS辅助定位”数据(星历文件)即可。运行中,定位模块内会自动生成对应的星历文件,无需重复下载;

如果是不定时启动、关闭,那么关闭4小时内启动是没必要更新的(“温启动”范畴);如果大于4小时,模块内保存的星历已失效,则必须更新星历文件(重新下载),否则和“冷启动”无异。

 

Q:能否自己搭建AGPS星历数据服务器?

A:可以。不过较麻烦。建议使用我司提供的接口(请参考例程中agps.lua的代码)。

简述一下如何搭建。首先在NASA下载brdc当日的导航电文数据(以2018年2月1日为例):

ftp://cddis.gsfc.nasa.gov/pub/gps/data/daily/2018/brdc/brdc0320.18n.Z

(备用)ftp://igs.ensg.ign.fr/pub/igs/data/2018/032/brdc0320.18n.Z

GPS卫星的历书(Almanac)包含在导航电文的第四和第五子帧中,可以看作是卫星星历参数的简化子集。服务端收到客户端的请求,从导航电文中提取当日的星历,然后发送给客户端。

扩展阅读:《GPS卫星星历与历书》

https://blog.csdn.net/Csdn_Darry/article/details/72052686

 

 

Q:以GK9501定位芯片为例,怎么把“AGPS辅助定位”的数据发送给它?

A:请参考厂商提供的相关文档,以规定格式将数据通过串口发送给定位芯片(请参考例程中agps.lua的代码)。

扩展阅读:《AIR系列GPS模块测试用例》

http://blog.sina.com.cn/s/blog_5b0121350102xy8w.html

 

Q:你为什么懂得那么多啊?

A:大概是因为我比较帅吧。 


火星坐标(纠偏)篇

历经磨难,终于成功定位,获取正确输出。但是怎么看起来格式不太对呢,经度纬度都是4位、5位的,那岂不是要绕地球好几圈了?

 

其实这是NMEA-0183输出格式和我们日常使用的格式不同造成的误解。我们再来看一下GGA格式:

格式:

$--GGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh

示例:

$GPGGA,065545.789,2109.9551,N,12023.4047,E,1,9,0.85,18.1,M,8.0,M,,*5E


名称

样例

单位

描述

消息ID

$GPGGA


GGA 协议头

UTC 时间

065545.789


hhmmss.sss

纬度

2109.9551


ddmm.mmmm

N/S

N


N=北,S=南

经度

12023.4047


dddmm.mmmm

E/W

E


W=西,E=东

(省略部分GGA)

 

有没有发现问题所在呢?

GGA输出格式:ddmm.mmmm(度-分)

日常使用格式:dd.dddddd(度)

 

那么如何把GGA输出的数据转换为我们日常使用的格式呢?学霸看一眼就会说,这个问题很简单嘛,balabala~~~作为学渣的我,一头雾水。

 

咳咳,还是直接套用公式吧。

公式如下:

ddmm.mmmm → 小数点前移两位 → dd.mmmm → dd + 0.(mmmm/60) = dd.dddddd 

举例:

12023.4047 → 120.234047 → 120 + 0.(234047÷60) = 120.390078

 

经过如此换算,我们就可以把获取到的数值放到地图软件里啦。

 

一切看似都很美好,但是……直到……你用了百度地图……我靠,卧槽……为什么误差那么大?偏差达几百米?

 

 

明明在楼里,为什么地图显示我在河里?为什么!是不是定位模块有问题?还是我的又写了个bug?还是天线存在故障?黑人问号脸。 

 


 

之所以会产生“偏差”,这就涉及到一个有关坐标系转换的问题:GCJ-02 火星坐标系统纠偏。

 

前文提到,模块输出数据的格式为NMEA-0183,使用的坐标系是WGS-84。通常,国际上其他国家的地图软件也都是使用WGS-84,相安无事。不过,中国国家测绘局要求所有从事地理测量、地图绘制的公司、单位机构、个人必须使用GCJ-02坐标系(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)。

 

也就是说,国内的地图软件大都是使用的GCJ-02坐标系。所以开发者/用户如果将WGS-84的经纬度填入国内的地图软件,就会产生极大的偏差。

 

(所有的电子地图、导航设备,都需要使用GCJ-02坐标系。第一步,地图公司测绘地图,测绘完成后,送到国家测绘局,将真实坐标WGS-84的电子地图,加密成“GCJ-02火星坐标”,这样的地图才是可以出版和发布的。第二步,所有的面向客户的设备厂商,要在软件中加入该转换算法,将定位模块输出的真实WGS-84坐标,转换成GCJ-02的坐标。这样一来,“以偏治偏”,坐标系才可以完全匹配,也就没有“偏差”了)

 

那么,是不是所有的国内地图都使用了GCJ-02坐标系呢?非也……百度、搜狗又自成体系,自立坐标了。

坐标系

地图

WGS-84

Google Map

Bing Map

Here Map

etc.

CGJ-02

高德地图

腾讯地图

谷歌地图(中国)

BD-09

百度地图

其他

搜狗地图

 

其中百度较为特殊,需要 WGS-84 → GCJ-02 → BD-09 两次转换。

 

由于转换算法较为复杂,本文不赘述。转换算法涉及浮点运算,推荐开发者将运算任务交给服务端或者上位机。

 

为了方便测试,开发者在此网址 http://www.openluat.com/GPS-Offset.html 测试纠偏效果。 


开发者根据数据格式填入对应的经纬度(支持ddmm.mmmm、dd.dddd和dd°mm′ss″),点击“坐标转换”按钮,即可看到纠偏后的效果。同时该页面也提供了坐标转换、坐标轴纠偏算法的下载。

 

接下来进入奔走相告的“你问我答”环节:

Q:为什么无中生有搞一个GCJ-02坐标系?用WGS-84不是挺好?

A:你哦,图样图森破了。加偏收费一次,定位设备纠偏收费一次。每年车机、定位终端出货量就是几亿台,能拉动多少GDP哟。

 

Q:如果我在外国的地图软件上使用WGS-84可以吗?

A:没问题的,只是外国的地图软件中,大陆数据更新滞后且不完整。

 

Q:如果我不涉及地图加偏/纠偏,仅需要速度、方向角等数据是否受到这个的影响呢?

A:纠偏仅是坐标值的转换,和其他数据无关。

 

Q:为什么推荐开发者把纠偏算法放在上位机呢?

A:因为单片机真的——算不过来。

 

Q:为什么感觉GPS芯片上报的经纬度,在一个小范围内飘来飘去?

A:这个是需要软件静态抑漂的。可以采用技术手段进行过滤,比如设置速度门限——在低于一定速度时,认为是静止不动的。或者事先知道用户处于什么运动模式,是静止、步行、还是开车。 

 

Q:我发现纠偏后还是不够精准,定位误差较大,能不能做到真·厘米级定位?

A:可以哦。请看下文“细致入微的厘米级定位”。


细致入微的厘米级定位

通常情况下,GPS提供5m左右的定位精度,可以满足大多数大多数情况下的定位需求。不过,有一些场景,有更高精度的定位需求。譬如测绘、滑坡监控、无人机、无人驾驶汽车等。

 

基于GPS的特性,很难提供亚米级的定位,那么如何是好呢?经过N次技术创新和持久的基准站建设,现在可以做到覆盖全国的厘米级定位技术。

 

其实简单来说,高精度定位的核心就是消除误差。卫星定位精度不高,是因为误差积累导致,只要把可控的误差消除到最低,就能获得更高精度的定位结果。

 

卫星定位的误差来源通常有:

误差来源

误差项

误差原因

定位误差影响

卫星

卫星星历误差

星历中,卫星空间位置与卫星实际位置间的偏差

-

卫星钟差

指GPS卫星时钟与GPS标准时间的差别

偏差和漂移和漂移总量仍在1ms~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值