[经验分享] 【得捷电子Follow me第1期】-4- 实现定位功能

慕容雪花   2023-6-6 09:14 楼主

一、Air530定位模块基本介绍

这个GPS模块是自己参加这期FOLLOW-ME活动的主要原因。这次使用的GPS模块是Seeed推出的Air530,不仅仅支持GPS,还有咱们中国的北斗,包括: GPS / Beidou / Glonass / Galileo / QZSS / SBAS。

image.png   相关的参数如下:

  • Supply voltage 3.3V/5V
  • Working current up to 60mA
  • Interface UART
  • Time of warm start 4s 
  • Time of cold boot 30s 

该模块有4个引脚,分别是:

GND 接地
TX 串口发送
RX 串口接收
VCC 电源

 

硬件连接图:

image.png  

二、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 编辑

回复评论 (2)

看来正确解析出了精度和纬度的前提是获取有效的GNGLL数据,,

点赞  2023-6-7 07:31
引用: 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

  • $: This indicates the start of the NMEA sentence
  • GPGGA : Global Positioning System Fix Data
  • 103005 : This is the UTC time when the data was accessed in HH:MM:SS. In this case the time is 10:30:05 UTC
  • 3807.038, N : Latitude 38 degrees 07.038′ N
  • 07128.99030, E : Longitude 71 degrees 28.00030′ E
  • 1 : GPS fix
  • 07 : Number of satellites being tracked
  • 1.43 : Horizontal dilution of position
  • 134.5, M : This shows the altitude (m) above the sea level
  • 42.9, M : Height of geoid (mean sea level)
  • Empty field : time in seconds since last DGPS update
  • Empty field : DGPS station ID number
  • *78 : the checksum data
点赞  2023-6-7 08:27
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复