组合惯导串口数据解析

首先是给串口usb以权限:

sudo chmod 666 /dev/ttyUSB0

但是不能每次启动都执行一次,所以需要给一个永久的权限指令:

sudo gedit /etc/udev/rules.d/70-ttyusb.rules
KERNEL==“ttyUSB[0-9]*, MODE=0666

然后就能让ttyUSB0-ttyUSB9默认的权限都变成了666,普通用户也可以读写串口了。

或者将其添加到一个组:

ls -l /dev/ttyUSB0
whoami

当前用户加入到dialout用户组

sudo usermod -aG dialout username

然后重启即可。
然后是用python解析串口的数据:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-import json
import serial
import rospy
import std_msgs.msg
from car_interfaces.msg import GpsImuInterface, GpsImuAddInterface
import math
from datetime import datetime, timedelta
import time
import pyproj
import signal
import os
import sys# 获取当前脚本文件的所在目录
script_directory = os.path.dirname(os.path.abspath(__file__))
# 图片文件相对于脚本文件的路径
image_relative_path = 'lib'
# 构建图片文件的完整路径
icon_path = os.path.join(script_directory, image_relative_path)
# absolute_path = os.path.abspath(icon_path)# print(absolute_path)
sys.path.append(icon_path)
from base_function import *buf_pos_lat = 0
buf_pos_lon = 0
buf_vel = 0
buf_angle_heading = 0def connect_to_serial(port_name, baud_rate):try:return serial.Serial(port_name, baudrate=baud_rate, timeout=1)except serial.SerialException as e:rospy.logerr(f"Unable to connect to {port_name} with baud rate {baud_rate}: {e}")return Nonedef read_from_port(serial_port):global buf_pos_latglobal buf_pos_longlobal buf_velglobal buf_angle_headingcontent = {}# 此处放置读取串口的逻辑 ...# start = time.time()buf_new = serial_port.readline()# print("buf new",buf_new,"serial_port",serial_port)# print(buff)# print()if ("INSPVAXA" in buf_new.decode() and "FINESTEERING" in buf_new.decode()):buf_whole_array = buf_new.decode().split(";")buf_front_arary = buf_whole_array[0].split(",")# print(buf_whole_array)buf_back_array = buf_whole_array[1].split(",")buf_pos_lon = float(buf_back_array[3])buf_pos_lat = float(buf_back_array[2])# buf_pos_alt = float(buf_back_array[4])buf_vel_east= float(buf_back_array[7])buf_vel_north= float(buf_back_array[6])buf_vel_u= float(buf_back_array[8])# 车速通过串口拿不到数据buf_vel= math.sqrt(buf_vel_east**2+buf_vel_north**2+buf_vel_u**2)buf_angle_heading = angle_2_angle(float(buf_back_array[11]))if(buf_back_array[0] == "INS_SOLUTION_GOOD"):buf_system_state = 3else:buf_system_state = 0# 搜星数量buf_gps_num_sats_used = 0buf_gps_num_sats_1 = 0buf_gps_num_sats_2 = 0if buf_front_arary[4] == "FINEBACKUPSTEERING":buf_satellite_status = 1else:buf_satellite_status = 0# 差分延时buf_gps_age = 0buf_pos_x = 0buf_pos_y = 0# 进程处理时间buf_process_time=0# 惯导通信故障buf_gps_cfault = Falsecontent["time_stamp"] = time.time()content["Lat"] = buf_pos_lat # GPS_MSG.PosLatcontent["Lon"] = buf_pos_lon # GPS_MSG.PosLoncontent["Head"] = buf_angle_heading # GPS_MSG.AngleHeadingcontent["Speed"] = buf_vel # GPS_MSG.Velcontent["UTM_x"] = from_latlon(buf_pos_lat, buf_pos_lon)[0]content["UTM_y"] = from_latlon(buf_pos_lat, buf_pos_lon)[1]# print(content)# msg.PosLon =1# # msg.PosLan =1# msg.VelE =2# # msg.posX =  388652.2938084109# # msg.posY =  4963429.720356053# msg.posX =  from_latlon(buf_pos_lat, buf_pos_lon)[0]# msg.posY =  from_latlon(buf_pos_lat, buf_pos_lon)[1]# msg.Vel = buf_vel# msg.AngleHeading = buf_angle_heading# msg.GpsNumSatsUsed = 20return contentdef main():global buf_pos_latglobal buf_pos_longlobal buf_velglobal buf_angle_headingsignal.signal(signal.SIGINT, quit)# 使用ROS参数服务器来获取参数# serial_port_name = rospy.get_param("~serial_port", "/dev/ttyUSB0")# baud_rate = rospy.get_param("~baud_rate", 115200)serial_port_name = "/dev/ttyUSB0"baud_rate = 115200rospy.init_node("gps_imu_pub", anonymous=True)pub_location = rospy.Publisher('/ztbus/location', std_msgs.msg.String, queue_size=10)pub = rospy.Publisher("gps_imu", GpsImuInterface, queue_size = 10) msg = GpsImuInterface()while not rospy.is_shutdown():start = time.time()try:serial_port = connect_to_serial(serial_port_name, baud_rate)# print()data = read_from_port(serial_port)# print(data,"#"*8)except:print("except")continueif data :msg.PosLon =buf_pos_lonmsg.PosLat =buf_pos_latmsg.posX = from_latlon(buf_pos_lat, buf_pos_lon)[0]msg.posY = from_latlon(buf_pos_lat, buf_pos_lon)[1]msg.Vel = buf_velmsg.AngleHeading = buf_angle_headingpub_location.publish(json.dumps(data))pub.publish(msg)# rospy.loginfo("Data published to /ztbus/location topic.")prGreen("pub ok")end = time.time()interval = end -startprint('gps_interval = ', interval)# rospy.loginfo("Shutting down GPS IMU publisher node.")if __name__ == "__main__":main()

这里我的建议是将串口改成CAN口,协议也比较好确定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/16978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024/5/27 ARMday9SPI实验八段数码管显示

main.c #include "spi.h" extern void printf(const char *fmt, ...); void delay_ms(int ms) {int i,j;for(i 0; i < ms;i)for (j 0; j < 1800; j); } //保存0-9编码的数组 int num[10] {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0x3E,0xE0,0xFE,0xF6}; int main…

2024年上半年软件设计师试题及答案(回忆版)--选择题

基础知识选择题 基础知识选择题 1,2,3][4,5,6][1,2,3,4,5,6] &#xff08;总&#xff1a;1分&#xff09; &#xff08;注意&#xff1a;括号内的是截止当前题目总分&#xff09; vlan不能隔绝内外网 &#xff08;2分&#xff09; 链路层使用交换机&#xff0c;…

智慧树下做游戏

游戏开发工程师致力于游戏总体设计 &#xff0c;负责游戏开发工具和运营维护工具的设计与开发 &#xff0c;并配合主程序完成游戏架构及各大功能的设计、开发、调试和其他技术支持 就业方向&#xff1a; 一般有客户端游戏开发和服务器游戏开发 客户端开发&#xff1a; 主要负…

光伏开发是用什么工具提高效率?

随着全球对可再生能源的日益重视&#xff0c;光伏产业作为其中的佼佼者&#xff0c;已经取得了长足的发展。然而&#xff0c;如何提高光伏开发的效率&#xff0c;降低成本&#xff0c;成为了业内关注的焦点。本文将探讨光伏开发过程中所使用的工具&#xff0c;以及这些工具如何…

【软件设计师】——11.多媒体

目录 11.1 多媒体种类和数据压缩 11.2 音频 11.3 图像 11.4 视频 11.1 多媒体种类和数据压缩 多媒体种类 感觉媒体&#xff1a;人接触信息的感觉形式&#xff0c;直接作用于人的感觉器官&#xff0c;使人产生直接感觉的媒体。如视觉、听觉、触觉、嗅觉、味觉等 显示媒体/表…

设计软件有哪些?建模和造型工具篇(2),渲染100邀请码1a12

之前介绍了一批建模工具&#xff0c;这次我们继续介绍。 1、Forest Pack Forest Pack是由iToo Software公司开发的3ds Max插件&#xff0c;专门用于创建大规模自然环境。它提供了丰富的植被和物体库&#xff0c;用户可以快速创建树木、植物、岩石等元素&#xff0c;并将它们分…

STM32HAL(一)外设驱动框架与回调函数应用

前言&#xff1a;这段时间开始学习STM32F4&#xff0c;同时为了以后的便捷性性就开始学HAL库了 目录 HAL库文件 基本文件结构 API命名规则 HAL库回调函数 HAL_ XXX _MspInit() / _MspDeInit() HAL_PPP_MspInit() HAL_PPP_MspDeInit() HAL_PPP_ProcessCpltCallback HA…

刚上手Java会踩的坑

1. 用号比较的坑 对Integer类型的两个参数使用号比较是否相等&#xff0c;或者使用String类型的两个变量进行比较&#xff0c;天真的认为他们是理所应当的。 其实操作只适用于基本数据类型如int , byte, boolean, short, char, long, float, double这些基本数据类型。 其它…

instanceof 关键字的作用

instanceof 严格来说是 Java 中的一个双目运算符&#xff0c;用来测试一个对象是否为一个类的实例&#xff0c;用法为&#xff1a; boolean result obj instanceof Class其中 obj 为一个对象&#xff0c;Class 表示一个类或者一个接口&#xff0c;当 obj 为 Class 的对象&…

JavaEE-JPA(相关概念及Spring JPA)

JPA JPA 相关概念 ORM 框架 (Object Relational Mapping) 建立 Java 程序实体类与数据库表之间的映射关系。使用 ORM 框架进行编程 Java 程序会根据开发者配置&#xff0c;在运行时自动把数据对象持久化到数据库中&#xff0c;比直接使用 JDBC 编程更为方便和强大。 常见的 …

Android面试题之Kotlin常见集合操作技巧

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 list 创建和修改 不可变list,listOf var list listOf("a","d","f") println(list.getOrElse(3){"Unkn…

Kubernetes可视化界面之DashBoard

1.1 DashBoard Kubernetes Dashboard 是 Kubernetes 集群的一个开箱即用的 Web UI&#xff0c;提供了一种图形化的方式来管理和监视 Kubernetes 集群中的资源。它允许用户直接在浏览器中执行许多常见的 Kubernetes 管理任务&#xff0c;如部署应用、监控应用状态、执行故障排查…

用循环神经网络预测股价

循环神经网络可以用来对时间序列进行预测&#xff0c;之前我们在介绍循环神经网络RNN,LSTM和GRU的时候都用到了正弦函数预测的例子&#xff0c;其实这个例子就是一个时间序列。而在众多的时间序列例子中&#xff0c;最普遍的就是股价的预测了&#xff0c;股价序列是一种很明显的…

链表练习题

返回倒数第K个节点 快慢指针 让快指针先走k步&#xff0c;再使得快指针与慢指针同时走一步&#xff0c;这样没有开额外空间&#xff0c;空间复杂度较低。 代码实现如下&#xff1a; struct ListNode {int val;struct ListNode* next;}; int kthToLast(struct ListNode* head…

第 52 期:MySQL 半同步复制频繁报错

社区王牌专栏《一问一实验&#xff1a;AI 版》全新改版归来&#xff0c;得到了新老读者们的关注。其中不乏对 ChatDBA 感兴趣的读者前来咨询&#xff0c;表达了想试用体验 ChatDBA 的意愿&#xff0c;对此我们表示感谢 &#x1f91f;。 目前&#xff0c;ChatDBA 还在最后的准备…

el-table实现合并特定列的所有行

el-table实现合并特定列的所有行 示例&#xff1a; 在这里插入图片描述 const objectSpanMethod ({ row, column, rowIndex, columnIndex }) > {if (columnIndex 5 || columnIndex 7) {// 就是只保留第一行&#xff0c;其他直接不要&#xff0c;然后行数是列表长度if …

2024年03月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 下列哪个命令,可以将2024转换成’2024’ 呢?( ) A:str(2024) B:int(2024) C:float(2024) D:bool(2024) 答案:A 本题考察的是str() 语句,将数字转换成字符串用到的是str() 语句。 …

Java:IO

首 java.io中有百万计的类&#xff0c;如何找到自己需要的部分&#xff1f; 流 IO涉及到一个“流”stream的概念&#xff0c;可以简单理解成数据从一个源头到一个目的地。明白数据从哪来&#xff0c;要到哪里去&#xff0c;数据流中是字节还是字符之后&#xff0c;才能找到自…

回顾下Java中的基本数据类型以及Integer与int的区别

一、Java中的基本数据类型&#xff08;Primitive Data Types&#xff09;共有八种&#xff0c;它们分别是&#xff1a; byte&#xff1a;字节型&#xff0c;用于表示8位整数&#xff0c;取值范围从-128到127&#xff08;包括-128和127&#xff09;。 short&#xff1a;短整型&…

由于找不到d3dx9_39.dll,无法继续执行代码的5种解决方法

在现代科技发展的时代&#xff0c;电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;由于各种原因&#xff0c;我们可能会遇到一些电脑问题&#xff0c;其中之一就是“d3dx9_39.dll丢失”。这个问题可能会导致我们在运行某些游戏或应用程序时遇到错误提示&#xff0c;…