Gary 发表于 2015-3-2 16:09:08

GPS模块使用 FAQ


楼主近期使用了DFRobot公司的两块GPS模块。一块是GPS/GPRS/GSM模块V3.0(TEL0051),另一块是DFRduino GPS Shield-LEA-6H(TEL0044),使用的过程中出现了很多问题,也对GPS的知识有了初步的了解。
本帖将主要解决在GPS模块使用的过程中出现的一些问题,对于模块的工作原理将不做进一步说明。

问题一:在浦东进行的定位,为何在地图上却是闵行?
这个涉及到了GPS的单位转化问题,在GPRMC协议(以上提到的两块GPS模块所使用的协议)中,$GPGGA一行的第三位和第五位为GPS收集到的经纬度信息,如楼主在浦东软件园Y1座进行GPS测量,收集到的GPRMC信息中的$GPGGA一行信息如下:
$GPGGA,062351.000,3112.136400,N,12135.895059,E,1,4,2.92,29.357,M,8.341,M,,*5B
其中3112.136400,N,12135.895059,E即为经纬度信息。
该经纬度的格式为ddmm.mmmmmm,其小数点前倒数两位为分,小数点倒数两位之前的数字为度,小数点后的数字为分的小数位。这个格式一不是单纯的小数制的单位换算,二也不是我们熟悉的度分秒的单位秒转换,而是单纯的度分转换。所以得到的数据的具体含义为,当前点的经度为东经121度35.895059分,北纬31度12.136400分。了解了这个也就可以理解了为什么明明在浦东却定位在闵行了。
地图中的经纬度单位为度,比如百度地图的坐标拾取系统中,天安门的经纬度为116.40386,39.915291,其含义为东经116.40386度,北纬39.915291度。地图所使用的经纬度和GPRMC中的经纬度有单位的差距,如果没有经过换算就使用的话就会造成偏差。比如在坐标拾取系统中输入121.35895059,31.12136400。然后再进行单位转换,即121+35.895059/60=121.598251;31+12.136400/60=32.202273。在坐标拾取系统中输入121.598251, 31.202273。将两次结果整合到一张图中即可理解为何明明在浦东测量的GPS反而定位到了闵行。
在具体的使用过程中我发现出了GPRMC协议使用度分的格式之外,其他地方所使用的皆为度的单位。其中百度的标准为经度在前,纬度在后,谷歌的标准为纬度在前,经度在后。使用时需记得区分。

问题二:为何在地图上显示出来和我测量的位置相差了一千米左右的距离?是因为GPS模块不精确么?这个涉及到了地图的参考点的问题,具体的内容无需了解,只需要了解的是现如今,在国内一共有三种坐标系,第一种为大地坐标系统WGS-84,第二种为火星坐标系统GCJ-02,第三种是百度坐标系统BD-09。第一种即为全球通用的坐标系统,GPRMC中的经纬度信息即按照该坐标系统选取,第二种为国家保密加偏后的坐标系统,即对真实的坐标系统进行了人为的加偏处理,国内很多地图公司(除百度地图)的坐标系均为此坐标系,第三种是百度在火星坐标系统上又进行了一次加密。网上有很多的算法,可以在各种坐标系之间进行转换,但是楼主使用下来之后感觉还是百度提供的坐标转换API最为方便好用。因为在百度的自己的官方文件中也曾提到,可能会因为时间的不同在定位出来的点上面有一些偏差,这说明百度坐标系的加密算法可能并不是固定的。由于百度坐标系算法并不开源,所以楼主也不敢下更多结论。百度地图坐标转换的API链接为:百度坐标转换。转换结果如下图:参考信息:地图坐标系介绍:http://www.cnblogs.com/milkmap/p/3768379.html某些坐标系的纠偏算法:http://blog.csdn.net/wildboy2001/article/details/39497681



Grey 发表于 2015-3-2 16:14:04

本帖最后由 Grey 于 2015-3-2 16:15 编辑

感谢分享!

hnyzcj 发表于 2015-3-2 18:21:28

楼主真有钱,一买弄两块,

hnyzcj 发表于 2015-3-2 18:22:53

我估计可能是模块中的定位算法不够精确,安理工的测绘学院做的定位算法可以精确到米,南京青奥使用的是他们的方案。
页: [1]
查看完整版本: GPS模块使用 FAQ