树莓派连接GPS模块,python获取GPS数据

文章主要内容:

  • 模块之间的连接
  • 树莓派识别gps模块
  • 使用Python语言获取GPS数据

1.连线 ---- 使用 USB转TTL转换器,将树莓派和GPS模块连接

需要的设备:gps模块,gps天线,串口转usb转换器,杜邦线

1.1.我使用的gps模块如下,但是gps模块是串口的,和树莓派连接太麻烦,后期的串口调试对初学者也比较困难。所以,小白可以选择一个串口转USB转换器,使用USB连接树莓派,这样用起来比较简单。

                                        

1.2.转换器和gps模块连线方法如下图(只需要连四根线,图是盗来的),串口针脚处有字母标记,不要连错了:

       

1.3.GPS模块需要连接天线,天线有两种接口可以选择smr 和 ipex  (下图):

                    

我使用的是smr接口的gps天线,天线长这样(下图):

                 


2.树莓派识别GPS设备

把连接好天线和usb转接器的gps设备插到树莓派上,建议插到树莓派4个usb口的最上面靠里的usb口,那个口好像对应usb0

具体查看你插到了哪个usb口,可以使用命令:

ls /dev/ttyUSB*

然后会显示你使用了哪个usb口,如下图:

 在这里插入图片描述

接下来,用软件测试连接是否成功,我们是用minicom这个软件来测试

首先,安装minicom  :

sudo apt-get install minicom

然后,安装gpsd相关库:

 sudo apt-get install gpsd gpsd-clients python-gps

安装好之后,使用命令,获取串口上的数据(注意波特率,我的gps设备是9600,usb口是usb0)

minicom -b 9600 -o -D /dev/ttyUSB0

 注:  -b 设定的是波特率,是模块参数而定;-o 是不初始化Modem且不锁定文件;-D 设定的是接口

 如果一切顺利,会看到这样的图片(懒得截图了,网上盗一个) 

 

 

minicom一些使用技巧:

在 minicom 界面里,可以按Ctrl+A,然后按Z获取帮助;Ctrl+A、然后按Q来退出


3.python语言获取解析gps数据

想要用python解析gps数据,就要了解gps模块的数据协议。根据NMEA协议,我们从传感器上接收到的GPS经纬度数据的其中一行---GPRMC行的格式如下:

注:根据上一张命令行图片里面的数据,我们发现gps模块发送了好多行数据,其中,有很多行数据都可以用来定位,比如GPGGA,GPRMC。这里,我们选择的是GPRMC行(百度百科:推荐定位信息GPRMC

例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息
字段1:UTC时间,hhmmss.sss格式
字段2:状态,A=定位,V=未定位
字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段4:纬度N(北纬)或S(南纬)
字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段6:经度E(东经)或W(西经)
字段7:速度,节,Knots
字段8:方位角,度
字段9:UTC日期,DDMMYY格式
字段10:磁偏角,(000 - 180)度(前导位数不足则补0)
字段11:磁偏角方向,E=东W=西
字段12:模式,A=自动,D=差分,E=估测,N=数据无效(3.0协议内容)
字段13:校验值($与*之间的数异或后的值)

参考:https://www.jianshu.com/p/f164c433baa1

然后,我们使用Python现成的库 pymea2来解析gps数据:

安装库

pip3 install pynmea2

如何使用 pymea2 库来解析 gps 数据的代码如下:

import serial
import pynmea2
import time

def gps_get():
    print("开始测试:")
        
    #创建gps串口的句柄
    ser = serial.Serial("/dev/ttyUSB0", 9600 )  

    print("获取句柄成功,进入循环:")
    count = 0
    while(True):
        #读取一行gps信息
        #line = ser.readline()
        line = str(str(ser.readline())[2:])  # 将读取到的字节码转化成字符串(去掉前2位的无用字符)
        print(line)
            
        # 寻找有地理坐标的那一行数据
        if line.startswith('$GPRMC'):
            print("*********************")
            line = line.replace('\\r\\n\'', '')  #  字符串结尾的无用换行符
            print(line)
            rmc = pynmea2.parse(line)
            print("当前坐标:")
            print("北纬(度分秒):", float(rmc.lat)/100 , "度")
            print("东经(度分秒):", float(rmc.lon)/100 , "度")
            print("************")
            print("北纬(十进制):", rmc.latitude , "度")
            print("东经(十进制):",  rmc.longitude, "度")
            
            print("***************")
        count = count + 1
        if(count == 100):
            break

if __name__ == "__main__":

    gps_get()

我们需要注意一下点:

【1】 使用 pynmea2.parse(line)  来解析GPS的数据坐标,其输入必须严格按照其解析格式来,不能有其他非法字符(所以我的代码中,当我把数据转换成字符串以后,去掉了字符串首位的无用字符,去掉了结尾的换行符等转义字符,否则无法解析(试错n遍。。。))

【2】解析结果,返回的是一个类,我称之为 rmc ,其中有很多有意义的变量,你们可以自己百度拓展。我代码中使用到的,是 度分秒格式 的 经度lon 和纬度 lat ,还有十进制格式(float类型)的纬度latitude和 经度longitude 。我建议只用后者10进制,因为在地图中显示好像也是用的十进制

 

有任何疑问可以在评论区提出哦,点个赞再走呗(* ̄︶ ̄)

  • 34
    点赞
  • 158
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值