一篇关于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~ |