说说和物联网关系密切的卫星定位那些事儿。  
介绍篇
过去,如果你的女友是个路痴,大概会有这样的对话……
——你在哪儿呢?
——啊?我在马路上啊。
——有什么特征?
——头顶有个月亮。
——你旁边有什么啊?
——有个路灯。
——有没有路牌啊?路牌上写的什么?
——我看看啊。还真的有,上边写着“禁止停车 违者罚款”。
——姑奶奶,我真是服了你了……
——哼,你是不是不爱我了,你肯定是不爱我了,你是不是喜欢上了新来的那个前台?
——。。。
——我跟你说那个前台绝对是个伪娘!(开启八卦模式)还有还有,小王买了个新口红真好看,你也给我买好不好……
——(一脸崩溃的表情)
(路人甲:你是不可能有女友的!)
现在,如果你的女友是个路痴……
——你在哪儿啊?
——我发定位给你!乖乖的来接老娘。
——遵命。。。
作为一个标准路痴,曾经有N次陷入绝境黑历史。正所谓:手持一纸地图,双眼紧盯道路,环顾四周茫然,我现身在何处?
后来随着智能手机的普及,我以为情况能有所改善,后来才发现是我想多了——为嘛xx地图、xx导航还是总让我往死胡同里跑,非让我开车过湖?
再后来,随着手机操作系统的迭代,芯片的升级,定位才慢慢变得精准、可靠。我再也不用湖里游泳了……当然,这都是后话了。
(哥开的不是车,是!寂!寞!)
慢慢的随着了解的深入,才明白原来定位有这么多区别,里边的学问可大着呢。
定位给方式有很多种,室外定位有基站定位,卫星定位等方式;室内定位有BLE、RFID、Wi-Fi等方式;还有其他IP定位,惯性导航等等方式。
定位方式
定位原理
定位方案
应用场景
成本
设备要求
精度
基站定位
上报设备周边基站信息,服务器查表、解析并返回定位结果
单基站定位
多基站定位
室外
极低
设备成本低
需后端支持*
500m
卫星定位
使用天线搜索卫星向地表发射的电波,解算后输出定位结果
多星定位
室外
较低
设备成本低
5m
差分定位
卫星+结合基准站的数据进行定位
多星定位
室外
很高
设备成本高
需专有后端支持*
5mm
BLE iBeacon
使用设备接收蓝牙信号,根据信号强弱计算距离,输出定位结果
单点定位
多点定位
室内
较高
设备成本较高
30cm
RFID
使用设备接收射频信号,根据信号强弱计算距离,输出定位结果
单点定位
多点定位
室内
很高
设备成本较高
10cm
Wi-Fi
上报设备周边路由器MAC信息,服务器查表、解析并返回定位结果
单机定位
多机定位
室内
较低
设备成本低
需后端支持*
10m
IP 定位
上报目标设备公网IP地址,服务器查表并返回定位结果
-
不限
极低
设备成本低
需后端支持*
10km
佛系
手持佛珠
念念有词
-
不限
0成本
无需设备
随缘
“需后端支持”指需要连接到服务器进行数据解析,才能获得定位结果;
“需专有后端支持”指可能需要付费才能获得相关数据,终端设备才可以进行定位。
本文咱们就说说和物联网关系最密切的卫星定位那些事儿。
9f6c033d9f704de498bf51cecaddf3bd.gif
众多卫星定位系统中,最广为人知的就是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)。
各导航系统不同频段的工作频率 Screenshot-2018-7-11 一篇关于GPS定位写得最详实清晰的文章之一 - CSDN博客.png.png
观察一下表格,我们可以发现,日本简直是太“鸡贼”了——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哪里格式说明呢?
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~0.1ms以内,由此引起的等效误差将达到300km~30km
SA干扰误差
SA误差是美国军方为了限制非特许用户利用GPS进行高精度点定位而采用的降低系统精度的政策
-
相对论效应的影响
由于卫星钟和接收机所处的状态(运动速度和重力位) 不同引起的卫星钟和接收机钟之间的相对误差
20~30km
传播路径
电离层折射
当GPS信号通过电离层时,与其他电磁波一样,信号的路径要发生弯曲,传播速度也会发生变化,从而使测量的距离发生偏差
-
对流层折射
GPS信号通过对流层时,也使传播的路径发生弯曲,从而使测量距离产生偏差
-
多路径效应
测站周围的反射物所反射的卫星信号(反射波)进入接收机天线,将和直接来自卫星的信号(直接波) 产生干涉,从而使观测值偏离

接收机
接收机钟差
GPS 接收机一般采用高精度的晶振。接收机的钟面时与GPS标准时之间的差异称为接收机钟差

接收机的位置误差
接收机天线相位中心相对测站标石中心位置的误差

接收机天线相位中心偏差
观测时,天线的相位中心随着信号输入的强度和方向不同而有所变化,这种差别叫天线相位中心的位置偏差


计算误差
由于算法、硬件不稳定、辐射或热电效应等造成的计算错误

那么,如何修正这些误差误差,使得定位结果更精准呢?需要基准站通过数据链,将其载波观测值及基准站坐标信息一同传送给用户站,用户站接收GPS卫星的载波相位与来自基准站的载波相位,并组成相位差分观测值进行及时处理,能及时给出厘米级的定位结果。
通常,我们提到的DGPS指RTD,即Real Time Differential,伪距差分。基准站上,观测所有卫星,根据基准站已知坐标和各卫星的坐标,求出每颗卫星每一时刻到基准站的真实距离。再与测得的伪距比较,得出差分改正数,将其传输至用户接收机,提高定位精度。从而实现亚米级定位。
厘米级定位,则需要用到RTK,即Real Time Kinematic,载波相位差分,实时处理两个测站载波相位观测量的差分方法。即是将基准站采集的载波相位发给用户接收机,进行求差解算坐标,从而实现厘米级定位。
文字太空洞,举例说明:BOSS告诉人力,给你发工资¥8848.00。人力听错了,发给你¥8844.00。收到工资之后,觉得不太对——数字的谐音,这不是变相骂人嘛。
你赶紧登陆ERP查询,提交实发工资金额¥8844,查询一下。嚯,不得了,系统一阵卡机(查询后台中),然后duang的一声告诉你——少发了¥4.00。你去找人力,要回来了差额¥4.00,喜提锤子R1。
在这个故事中:
“BOSS”就是卫星——负责传达指令,不处理具体事物;
“人力”就是传播路径——上情下达,产生误差;
“ERP查询返值”就是基准站——根据“用户站”上传的数据,下发的“工资改正数”;
而你,就是用户站——将“接收值”(¥8844.00)上传给“基准站”,获得“工资改正数”(-¥4.00),你就知道是少发了¥4.00。经过计算(¥8844.00+¥4.00)即可求得正确解(¥8848.00)。
颇有点区块链的感觉了,不是吗?
扩展阅读:《DGPS与RTK的区别》
https://blog.csdn.net/foreverhuylee/article/details/25693893

目前,服务覆盖全国范围的,只有千寻位置®。
(千寻位置®是由中国兵器工业集团和阿里巴巴集团共同发起成立。千寻位置基于北斗卫星系统(兼容GPS、GLONASS、Galileo)基础定位数据,利用遍及全国的超过2000个地基增强站及自主研发的定位算法,通过互联网技术进行大数据运算,为遍布全国的用户提供精准定位及延展服务)
用户在千寻位置®购买相关套餐后,可以使用千寻位置®提供的SDK或NTRIP协议接收RTCM差分数据。
开发方式
支持架构
账号认证
上传语句
挂载点
返回数据格式
SDK
Android
iOS
Windows
STM32
自动
GGA
-
RTCM
NTRIP
不限
Base64编码传输
GGA
RTD
RTCM32_GGB
RTCM3.2
RTCM23_GPS
RTCM2.3
RTK
RTCM32_GGB
RTCM3.2
RTCM30_GG
参考资料:https://www.qxwz.com/help-document-location-service.html
https://www.qxwz.com/help-document-common-find-config-service.html
由于NTRIP认证方式较繁琐,所以本文不再赘述,有兴趣的读者可以点击下方链接了解更多内容:
扩展阅读:《Ntrip通讯协议》
https://www.cnblogs.com/hanford/p/6028156.html
定位效果如此拔群,当然条件也相当苛刻啦:

  • 定位芯片必须支持差分数据解算;
  • 场地净空条件良好,尽量不要有任何遮挡(高楼、树木等);
  • SNR应大于40;
  • 设备具有接收数据的能力(网络接入);
  • 流量消耗很高;
  • 测量点在基准站覆盖范围内;
固定解耗时较久。
我们可以通过模块输出的GGA语句判断当前定位状态:
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,5,9,0.85,18.1,M,8.0,M,1,0999,*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=GPS单点定位固定解
2=RTD差分定位
3=PPS模式
4=RTK固定解 (定位精度达厘米级)
5=RTK浮点解
6=惯导
7=手工输入模式
8=模拟模式
卫星数目
9

范围 0 到 12
HDOP
0.85

水平精度
MSL 幅度
18.1


单位
M


大地
8.0


单位
M

-
差分时间
1

(从接收到差分信号开始的秒数,如果不是差分定位将为空)
差分站ID
0999

差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)
校验和
*5E


<CR><LF>


消息结束
如果是GPS芯片已经进行解算,并输出差分定位结果,那么GGA语句中“定位指示”应为2、4、或5;查分时间应大于0(不为空);差分站ID应不为空。
只有同时满足上述条件,才能得到精确的测量结果。接下来,我们看一下实际测试结果。测试环境,某小区内:
测试中,使用 上海合宙通信科技有限公司提供的Air202 GPRS通信模块,对GPS芯片进行控制,连接千寻位置®平台。将模块输出的GGA原始语句上报到千寻位置®平台,将平台下发的数据传输给GPS芯片,然后打印GPS芯片解算后输出的GGA。
(手机APP输出数据)
(差分定位结果)
(对比)
通过对比图可以看出,手机定位偏差较大(并没有在顶天台测试嘛),RTK测试结果非常准确,符合测绘等需求。
接下来进入后会有期的“你问我答”环节:
Q:RTD、RTK服务贵吗?
A:可以到千寻位置®官网查询。参考价:RTD ¥6/月/设备;RTK ¥400/月/设备。
Q:如何判断我的定位结果是否为差分运算后的结果呢?
A:观察GGA语句中的定位指示输出值.
Q:流量消耗多少?
A:RTCM数据每秒下发一次,每次大约0.5k,大约需要60m/天(按24小时计)。
Q:大约需要多久才能得到RTK固定解?
A:固定点测量大约需要10分钟。
Q:有没有把办法减少流量消耗?
A:可以根据gps状态修改代码,当定位模式为“rtk固定解”时,主动断开连接。GPS定位状态改变再重连服务器。
Q:为什么设备一直处于浮点解定位状态,无法固定。
A:请确保终端设备天线对空观测环境良好,没有受到遮挡,或处于易产生多路径信号反射的物体附近,也请留意导航卫星信号接收正常,CN0处于正常范围内,未受到无线电干扰。
低功耗篇
——21世纪,物联网最重要的搭档有什么?
——电池。
从常见的的共享单车、车载定位器,到不常见的远程抄表、充电桩管理。在各种和物联网相关的应用中,供电始终是一个绕不开的话题。
如果是有常电(如汽车、自动贩卖机)还好,如果是使用电池,那么每一毫安的电都要精打细算才行(哪怕是用太阳能板充电的共享单车,也经常面临“低电”困扰呢)。
MCU、GPS、通信模块等,都是众所周知的耗电大户。其中,GPS芯片因为要承担搜星、计算,输出的任务,所以它的耗电量也是不容小觑的。那么,有没有什么办法让GPS芯片“节能降耗”呢?
答案当然是肯定的。前文提到过,GPS芯片搜星时耗电量最大了,如果能让模块尽量减少搜星和追踪的耗电量,就可以达到目的啦。如何做到这两点呢?接下来我们以物联网行业最常用的国科GK9501 GPS芯片为例,进行说明。
搜星
星历下载 和 星历预测
前文提到过,通过2G网络将星历文件传给GPS芯片,从而实现秒定位+省电,众人拍手欢呼。那么,忽然又出现了个“星历预测”,这是什么鬼呢?
Q:什么是“星历预测”?
A:GK9501的软件自带“星历预测”功能。它是指在信号正常(CN值大于27)的情况下,硬件连续运行5~10分钟,即可在内部自动生成星历,并预测出未来2~3天的星历,此过程不需要耗费任何流量。实现“通电5分钟,奔跑72小时”。
当然实现“星历预测”这个功能,是有条件的:
1、星历被下载过一次(外部输入给GPS芯片星历文件,或者GPS芯片自主3D Fix)
2、GPS信号CN值不低于27
3、正常定位过一次;
4、RTC不掉电(当主电源断开后,只有RTC电源不断,星历预测功能才可以使用,RTC断开后星历预测功能将不再起作用);
Q:“星历预测”和“星历下载”的区别是什么?对实际定位有什么帮助?
A:这个要从AGPS的发展史说起。
早期,服务器下发的星历文件是包含全部所有的可见卫星数据,将之发给GPS芯片,GPS芯片再根据星历文件去搜星。缺点是星历文件大,定位效果还差那么一丢丢;现在,首先是使用通信芯片进行基站定位,后台获取一个粗略的地理位置,查询导航电文后,再根据该地理位置精确下发当前可见卫星星历,GPS芯片再根据精确的星历文件去针对性地搜星。星历文件体积更小,定位效果更好。
由此可见:“星历预测”是芯片自动生成的,仅包含可见卫星的星历;而“星历下载”是包含全部可见(但是不可用)卫星的星历。
方式
实现方式
有效时间
优点
秒定位的限制
缺点
星历下载
通过2G网络将星历文件下载到GPS芯片
4小时
可以实现秒定位
无限制
需要消耗网络流量
星历预测
长时间有效运行(3D Fix)后,GPS芯片自动生成
2~3天
可以实现较快速度定位
较小位移情况下
限制条件较多
无论在什么状态下,都是GPS信号CN值越好,定位越快;6小时内的 星历下载 保存可以将RTC电源断开。
Q:如果“星历预测”可以用,那为什么还通过2G网络“星历下载”呢 ?
A:因为“星历预测”的前提是在“信号正常(CN值大于27)的情况下,连续运行5-10分钟”,电流28mA,相对比较耗电。所以大多数应用会倾向于每次都进行“星历下载”,而非使用“星历预测”——何况通过基站定位获取大概位置的动作,本身就需要2G联网服务器呢。
Q:为什么星历数据保存有效时间最长是6小时?
A:星历保存有效的时间和卫星的运行轨迹相关。
星历保存时间越长,原来星历里的可见卫星就越少。因为GPS卫星绕地一圈是12个小时,所以,星历数据有效期6小时已是极限值。超过这一时间后,原来的星历数据就没有意义了。
鉴于星历保存的时间越短,其对应星历里的可见星就越多,所以2小时内的星历比保存6小时内的星历对定位的帮助更大。
追踪
动态追踪也是很耗电的,那么有没有办法让芯片“半睡半醒”的工作呢?嘿嘿,还真有办法,GK9501可是会“达芬奇睡眠法”的哦。
模式
解释
唤醒方式
低功耗模式
CPU睡眠
通过串口唤醒
超低功耗模式
CPU掉电,只有RTC工作
需要force on唤醒
低功耗追踪模式
CPU睡眠,可以通过串口唤醒或者周期性自动唤醒进行定位输出。可以给出运行轨迹

超低功耗追踪模式
CPU掉电,只有RTC工作,需要force on唤醒或者周期性自动唤醒进行定位输出。可以给出运行轨迹

省功耗追踪模式实际上就是周期性自动唤醒:是GK9501根据当前的运动状态自动设置睡眠时间和运行时间。例如在运动比较快的情况下,会自动睡眠30秒,运行3秒;在运动比较慢的情况下,会自动睡眠60秒,运行3秒;达到在有大致轨迹的情况下,降低功耗的目的。如果主控也需要同步睡眠,可以通过GPIO来通知主控。当然也可以通过主控周期性切断GK9501电源的方式实现这一目的。
Q:好像其他友商的芯片也支持AGPS秒定位呢,和GK9501有什么区别呢?
A:uBlox、中科微、泰斗支持AGPS,MTK、国科GK9501支持秒定位。区别是前者只下载星历,后者不但下载星历,还会结合基站定位加速找星定位的过程。这个是AGPS和秒定位的本质区别。
Q:有没有推荐的GPS物联网模块呢?
A:上海合宙通信科技有限公司的Air8xx系列。使用RDA8955+GK9501平台,支持2G和GPS,稳定可靠。

作者:Luat  
来源:Delectate  
转载请注明来源和出处