一、Air530定位模块基本介绍
这个GPS模块是自己参加这期FOLLOW-ME活动的主要原因。这次使用的GPS模块是Seeed推出的Air530,不仅仅支持GPS,还有咱们中国的北斗,包括: GPS / Beidou / Glonass / Galileo / QZSS / SBAS。
该模块有4个引脚,分别是:
GND | 接地 |
TX | 串口发送 |
RX | 串口接收 |
VCC | 电源 |
硬件连接图:
二、GPS数据解析
下面是本文的核心,主要是该如何从接收到的数据中解析出定位信息。
其实通过读取UART数据,可以发现有非常多种格式的卫星数据可以获取,
$GNGGA:GPS/北斗定位信息
$GNGSA:当前卫星信息
$GPGSV:可见GPS卫星信息
$BDGSV:可见北斗卫星信息
$GNRMC:推荐定位信息
$GNVTG:地面速度信息
$GNGLL:大地坐标信息
$GNZDA:当前时间UTC(1)信息
本文选择了其中一种:GNGLL。
$GNGLL,<1>,<2>,<3>,<4>,<5>,<6>,<7>*<8><CR><LF>
<1>纬度ddmm.mmmm,度分格式(前导位数不足则补0)
<2>纬度N(北纬)或S(南纬)
<3>经度dddmm.mmmm,度分格式(前导位数不足则补0)
<4>经度E(东经)或W(西经)
<5>UTC时间,hhmmss.sss格式
<6>状态,A=定位,V=未定位
<7>模式指示,A-自动模式;D-差分模式;E-估算(航位推算)模式;M-手动
输入模式;S-模拟器模式
< 8>校验值
主要的代码如下:
def getGPS(gpsModule):
global FIX_STATUS, TIMEOUT, latitude, longitude, satellites, GPStime
timeout = time.time() + 8
while True:
gpsModule.readline()
buff = str(gpsModule.readline())
parts = buff.split(',')
print(buff)
if (parts[0] == "b'$GNGLL" and len(parts) == 8):
if(parts[1] and parts[2] and parts[3] and parts[4] and parts[5] and parts[6] and parts[7]):
print(buff)
latitude = convertToDegree(parts[1])
if (parts[2] == 'S'):
latitude = -latitude
longitude = convertToDegree(parts[3])
if (parts[4] == 'W'):
longitude = -longitude
#satellites = parts[7]
GPStime = str((int(parts[5][0:2])+8)%24) + ":" + parts[5][2:4] + ":" + parts[5][4:6]
FIX_STATUS = True
break
if (time.time() > timeout):
TIMEOUT = True
break
utime.sleep_ms(500)
def convertToDegree(RawDegrees):
RawAsFloat = float(RawDegrees)
firstdigits = int(RawAsFloat/100)
nexttwodigits = RawAsFloat - float(firstdigits*100)
Converted = float(firstdigits + nexttwodigits/60.0)
Converted = '{0:.6f}'.format(Converted)
return str(Converted)
控制台输出结果如下,可以看到在获取到有效的GNGLL数据后,接下来程序正确解析出了精度和纬度。
----------------------
mytime is: 2023-06-06 Tues 09:09:44
mytime is: 2023-06-06 Tues 09:09:45
mytime is: 2023-06-06 Tues 09:09:46
mytime is: 2023-06-06 Tues 09:09:47
mytime is: 2023-06-06 Tues 09:09:48
b'$GNGSA,A,3,06,08,09,16,24,39,,,,,,,3.7,2.1,3.0,4*3C\r\n'
b'$GNGLL,3168.46110,N,12176.26956,E,010943.000,A,A*49\r\n'
b'$GNGLL,3418.46110,N,12156.26956,E,010943.000,A,A*49\r\n'
Printing GPS data...
Latitude: 33.307686
Longitude: 123.437828
Satellites:
Time: 9:09:43
----------------------
本帖最后由 慕容雪花 于 2023-6-6 11:28 编辑
引用: Jacktang 发表于 2023-6-7 07:31 看来正确解析出了精度和纬度的前提是获取有效的GNGLL数据,,
我只选择了一个比较简单的GNGLL,还有别的好多格式可以用,可以先在控制台看看哪个格式的信号比较好
$GPGGA | Global Positioning System Fix Data. It provides 3D location and accuracy data |
$GPGSA | It provides GPS DOP and active satellites |
$GPGSV | It provides the detailed information of the GPS satellite |
$GPGLL | It provides the geographic Latitude and Longitude |
$GPRMC | It provides the position, velocity and time |
$GPVTG | It provides the dual ground/water speed |
比如:
$GPGGA, 103005, 3807.038, N, 07128.99030, E, 1, 07, 1.43, 134.5, M, 42.9, M, , *7