1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 树莓派连接GPS模块 python获取GPS数据

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

时间:2022-03-23 20:59:42

相关推荐

树莓派连接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:校验值($与*之间的数异或后的值)参考:/p/f164c433baa1

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

安装库

pip3 install pynmea2

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

import serialimport pynmea2import timedef gps_get():print("开始测试:")#创建gps串口的句柄ser = serial.Serial("/dev/ttyUSB0", 9600 ) print("获取句柄成功,进入循环:")count = 0while(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 + 1if(count == 100):breakif __name__ == "__main__":gps_get()

我们需要注意一下点:

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

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。