当前位置: 首页 > article >正文

RK3588中使用Serial转发订阅的话题数据

我们在ROS的使用中常常会通过rostopic echo /***来订阅某个话题数据的输出我想通过串口对其通串口进行转发。#查看ros话题列表 rostopic list找到一个你想要订阅的话题如/IMU_data#订阅话题通过终端查看 rostopic echo /IMU_data就会看到以下这种数据的输出但是我们看不到组包的结构所以我们还需要进一步操作查看 /IMU_data 的组包结构fireflyfirefly:~$ rostopic info /IMU_data Type: sensor_msgs/Imu Publishers: None Subscribers: * /rostopic_11294_1774864513981 (http://firefly:34133/) * /imu_range_serial (http://firefly:42065/) * /ov_msckf (http://firefly:44037/) * /all_serial_forward (http://firefly:34671/)我们可以看到Type sensor_msgs/Imu然后通过rosmsg show sensor_msgs/Imu即可查看其组包结构然后我们就可以开始串口转发该ros话题数据的脚本编写了# 创建空的 test.py 文件 touch test.py # 编辑修改 test.py 文件 gedit test.py # 增加运行权限 chmod x test.py # 运行脚本 ./test.py个人的代码(包含:IMU 激光测距 经纬度 海拔高度#!/usr/bin/env python3 # -*- coding: utf-8 -*- import rospy import serial from sensor_msgs.msg import Range, Imu, NavSatFix # 串口配置 SERIAL_PORT /dev/ttyUSB1 BAUD_RATE 115200 ser None # ------------------- 激光测距 ------------------- def range_callback(msg): distance msg.range rospy.loginfo(f测距: {distance:.3f} m) try: ser.write(frange:{distance:.3f}\r\n.encode(utf-8)) except Exception as e: rospy.logerr(f串口发送失败: {e}) # ------------------- IMU ------------------- def imu_callback(msg): ax msg.linear_acceleration.x ay msg.linear_acceleration.y az msg.linear_acceleration.z gx msg.angular_velocity.x gy msg.angular_velocity.y gz msg.angular_velocity.z qx msg.orientation.x qy msg.orientation.y qz msg.orientation.z qw msg.orientation.w rospy.loginfo(fIMU加速度: [{ax:.2f}, {ay:.2f}, {az:.2f}]) try: send_str fimu:{ax:.2f},{ay:.2f},{az:.2f},{gx:.2f},{gy:.2f},{gz:.2f},{qx:.3f},{qw:.3f}\r\n ser.write(send_str.encode(utf-8)) except Exception as e: rospy.logerr(f串口发送失败: {e}) # ------------------- GPS 经度 纬度 海拔 ------------------- def gps_callback(msg): lat msg.latitude # 纬度 lon msg.longitude # 经度 alt msg.altitude # 海拔 rospy.loginfo(fGPS: 纬度{lat:.6f}, 经度{lon:.6f}, 海拔{alt:.2f}) try: send_str fgps:{lat:.6f},{lon:.6f},{alt:.2f}\r\n ser.write(send_str.encode(utf-8)) except Exception as e: rospy.logerr(f串口发送失败: {e}) # ------------------- 主函数 ------------------- if __name__ __main__: rospy.init_node(all_serial_forward) ser serial.Serial(SERIAL_PORT, BAUD_RATE, timeout0.01) rospy.loginfo(串口打开成功) # 订阅三个话题 rospy.Subscriber(/range, Range, range_callback) rospy.Subscriber(/IMU_data, Imu, imu_callback) rospy.Subscriber(/geovins_gps, NavSatFix, gps_callback) # GPS已加 rospy.spin() ser.close()通过串口接到电脑的串口助手上进行测试baudrate 115200串口转发成功。但是在测试过程中发现无法自动识别USB口和手动断开串口再连接脚本就死掉了所以升级代码新增自己寻找USB设备和支持热插拔#!/usr/bin/env python3 # -*- coding: utf-8 -*- import rospy import serial import serial.tools.list_ports from sensor_msgs.msg import Range, Imu, NavSatFix import time BAUD_RATE 115200 ser None # ------------------- 自动找串口 ------------------- def find_usb_serial(): ports list(serial.tools.list_ports.comports()) for p in ports: if USB in p.description or usb in p.description: return p.device return None # ------------------- 安全发送自动重连核心 ------------------- def safe_send(data): global ser try: # 尝试发送 ser.write(data.encode(utf-8)) except: # 发送失败 → 重新找串口 重新打开 rospy.logwarn(串口断开正在重连...) port find_usb_serial() if port: try: ser serial.Serial(port, BAUD_RATE, timeout0.01) rospy.loginfo(f重连成功{port}) time.sleep(0.1) ser.write(data.encode(utf-8)) except: pass # ------------------- 激光 ------------------- def range_callback(msg): distance msg.range safe_send(frange:{distance:.3f}\r\n) # ------------------- IMU ------------------- def imu_callback(msg): ax msg.linear_acceleration.x ay msg.linear_acceleration.y az msg.linear_acceleration.z gx msg.angular_velocity.x gy msg.angular_velocity.y gz msg.angular_velocity.z qx msg.orientation.x qy msg.orientation.y qz msg.orientation.z qw msg.orientation.w safe_send(fimu:{ax:.2f},{ay:.2f},{az:.2f},{gx:.2f},{gy:.2f},{gz:.2f},{qx:.3f},{qw:.3f}\r\n) # ------------------- GPS ------------------- def gps_callback(msg): lat msg.latitude lon msg.longitude alt msg.altitude safe_send(fgps:{lat:.6f},{lon:.6f},{alt:.2f}\r\n) # ------------------- 主函数 ------------------- if __name__ __main__: rospy.init_node(all_serial_forward) # 第一次打开 port find_usb_serial() while not port: rospy.logwarn(未找到串口等待插入...) time.sleep(1) port find_usb_serial() ser serial.Serial(port, BAUD_RATE, timeout0.01) rospy.loginfo(f串口打开成功{port}) rospy.Subscriber(/range, Range, range_callback) rospy.Subscriber(/IMU_data, Imu, imu_callback) rospy.Subscriber(/geovins_gps, NavSatFix, gps_callback) rospy.spin() ser.close()

相关文章:

RK3588中使用Serial转发订阅的话题数据

我们在ROS的使用中,常常会通过rostopic echo /***来订阅某个话题数据的输出,我想通过串口对其通串口进行转发。#查看ros话题列表 rostopic list 找到一个你想要订阅的话题如/IMU_data#订阅话题通过终端查看 rostopic echo /IMU_data就会看到以下这种数据…...

3步完成系统深度净化:Win11Debloat工具让旧电脑性能提升60%

3步完成系统深度净化:Win11Debloat工具让旧电脑性能提升60% 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简…...

Gurobi优化求解器状态码全解析:从model.status到对偶变量获取

Gurobi优化求解器状态码深度实战指南 当你在深夜调试一个复杂的供应链优化模型时,控制台突然弹出"STATUS: 3"的提示——这意味着什么?该如何快速定位问题?又该如何提取关键诊断信息?作为数学优化领域的工业级求解器&…...

别再只盯着data://协议了!详解Nginx日志文件包含漏洞的另类利用与防御

从日志污染到权限沦陷:Nginx文件包含漏洞的攻防全景解析 当Web服务器的日志文件成为攻击者的跳板,一场关于权限与防御的暗战便悄然展开。Nginx作为现代互联网基础设施的核心组件,其日志机制在记录访问轨迹的同时,也可能成为系统安…...

泛微E8流程管理进阶:从数据库角度理解流程状态与节点关系

泛微E8流程管理进阶:从数据库角度理解流程状态与节点关系 在企业的数字化转型浪潮中,流程管理系统扮演着越来越重要的角色。作为国内领先的协同办公平台,泛微E8凭借其强大的流程引擎和灵活的定制能力,成为众多企业的首选。然而&am…...

单片机IO口驱动能力解析与LED驱动设计

1. 单片机IO口驱动能力基础概念刚接触单片机开发时,很多同学对IO口的驱动能力概念感到困惑。实际上,驱动能力直接决定了单片机引脚能带动多大的负载。以常见的51单片机为例,其IO口在输出低电平时的灌电流能力通常为10-20mA,而输出…...

ASPICE 的起源与发展历程(二)

ASPICE 并非汽车行业原生创造,其核心底层源自通用软件过程评估体系,是汽车行业基于自身高安全、高可靠的产业特性,定制化迭代的行业专属标准。(一)底层起源:通用SPICE 准的诞生1994 年,国际标准…...

PyCharm 2025.2 离线安装与配置全攻略:绕过登录,直接使用完整汉化版

PyCharm 2025.2 离线安装与配置全攻略:企业级免登录解决方案 在企业开发环境中,Python开发者常常面临网络限制、账号管理繁琐等问题。PyCharm作为最受欢迎的Python IDE之一,其官方版本需要联网激活和登录JetBrains账户,这对内网开…...

基于偏振无关的传输相位调控技术,实现可见光超透镜的优化设计

基于传输相位的可见光超透镜 偏振无关搞过光学设计的工程师都知道,传统透镜那个笨重的曲面有多让人头疼。现在有了一种黑科技——可见光波段的超透镜,厚度只有几百纳米,却能实现传统透镜的光学效果。关键是这玩意儿还搞定了偏振相关性这个老大…...

为什么conda装不上opencv-python?深入解析conda与pip的包管理差异

为什么conda装不上opencv-python?深入解析conda与pip的包管理差异 在Python生态系统中,conda和pip是最常用的两种包管理工具。许多开发者习惯使用conda创建和管理虚拟环境,但在安装某些特定包如opencv-python时,却常常遇到"P…...

零门槛!30分钟搭建本地化数字人交互系统:从安装到对话全流程

零门槛!30分钟搭建本地化数字人交互系统:从安装到对话全流程 【免费下载链接】Fay Fay 是一个开源的数字人类框架,集成了语言模型和数字字符。它为各种应用程序提供零售、助手和代理版本,如虚拟购物指南、广播公司、助理、服务员、…...

终极Ryzen处理器调校指南:免费SMU调试工具快速解锁AMD性能潜力

终极Ryzen处理器调校指南:免费SMU调试工具快速解锁AMD性能潜力 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...

突破平台限制:基于Go+Qt5的喜马拉雅音频下载解决方案

突破平台限制:基于GoQt5的喜马拉雅音频下载解决方案 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 喜马拉雅FM作为国内…...

给客户发固件,别再傻傻传源码了!手把手教你用ESP32 Download Tool烧录PlatformIO生成的bin文件

专业级ESP32固件交付方案:从PlatformIO编译到客户安全烧录全流程 当我们需要将开发完成的ESP32固件交付给客户时,直接发送源代码往往不是最佳选择。这不仅涉及知识产权保护问题,还可能因为客户缺乏开发环境而导致沟通成本激增。本文将详细介绍…...

逆向思维:用VSCode Remote+X11转发打造无缝远程Python开发环境(避坑指南)

逆向工程:VSCode Remote与X11转发的深度整合实践 远程开发环境中GUI应用的调试一直是工程师们的痛点。想象一下这样的场景:你在本地用VSCode愉快地编写着Python数据分析脚本,所有代码都在云端服务器运行,突然需要可视化一个Matpl…...

Treap(树堆)实战:从原理到代码实现与性能对比

1. 什么是Treap:当二叉搜索树遇上堆 第一次听说Treap这个数据结构时,我正被红黑树的旋转操作折磨得焦头烂额。直到某天在算法竞赛讨论区看到有人用20行代码实现了一个"魔法平衡树",才真正打开了新世界的大门。Treap这个名字本身就揭…...

从BIOS到BMC:手把手拆解Redfish协议在服务器开机时的‘数据握手’全过程

从BIOS到BMC:手把手拆解Redfish协议在服务器开机时的‘数据握手’全过程 凌晨3点的数据中心,一台刚上电的服务器正以毫秒级速度完成自检。在这不足5秒的瞬间里,BIOS与BMC之间正通过Redfish协议进行着精密的数据舞蹈——这不是简单的信息交换&…...

免费获取!最新政府机构位置数据应用指南:从地图标注到业务分析

政府机构位置数据的商业应用与合规实践指南 在数字化转型浪潮中,政府机构位置数据正成为企业开发者和政务信息化人员关注的焦点资源。这类数据不仅包含各级政府部门的精确地理位置信息,还蕴含着丰富的行政区划层级关系,为商业地图服务、政务系…...

WiX Toolset 安装全攻略:从命令行到Visual Studio的三种方法对比

WiX Toolset 安装全攻略:从命令行到Visual Studio的三种方法对比 在Windows应用开发领域,安装包的制作一直是项目交付的关键环节。WiX Toolset作为微软官方推荐的安装包创建工具,凭借其开源特性和强大的灵活性,已经成为众多开发团…...

Todo 时代结束了:当 AI 开始自己管项目,人类管理者该管什么?

AI 不再只是执行你的指令,它开始管理自己的项目了。这是 Anthropic Claude Code 团队成员 Thariq Shihipar 在 2026 年悄悄发出的一条技术更新公告里,藏着的一个巨大信号。大多数人划过去了,没有停下来。Claude Code 宣布:将 Todo…...

嵌入式电子罗盘教学原型:磁力计与IMU传感器融合实践

1. 项目概述 “LCD-Ecompass-Postemsky”是一个面向嵌入式教学实践的简易电子罗盘(E-Compass)系统,由阿根廷圣路易斯国立大学(Universidad Nacional de San Luis, UNSL)电子工程系为本科生实验课程设计。项目名称中的“…...

写作压力小了!2026年首选推荐的专业降AI率软件

2026年论文降AI率工具已从“基础改写”升级为智能优化系统,核心评价维度包括AIGC识别精度、文本自然度、学术合规性、查重适配性、多语言支持与操作便捷性。本次测评覆盖6款主流工具,涵盖中英文论文、全流程与专项功能、免费与付费版本,让你高…...

JavaScript基础课程三十三、性能优化与工程化高级

本课是前端从入门到高级开发的核心进阶课,聚焦性能优化与高级工程化两大核心能力。性能优化以用户体验为核心,覆盖渲染、构建、网络全链路,从指标检测到落地优化,形成完整的优化方法论;高级工程化则是企业级项目开发的…...

ESP32Cam与YOLOv3构建边缘图像识别系统

1. 项目概述:ESP32CamYOLOv3图像识别系统这个项目构建了一个完整的嵌入式图像识别系统,核心由ESP32Cam模块和YOLOv3算法组成。作为一名长期从事嵌入式视觉开发的工程师,我认为这种组合是目前性价比最高的边缘计算视觉方案之一。ESP32Cam模块集…...

OMO·赶考小状元AI自习室:破解线下自习室困局,引领学习新范式

近年来,一个有趣的现象在教培领域悄然发生:传统线下自习室逐渐遇冷,客流量与用户粘性面临挑战;而与此同时,一种名为“AI自习室”的新形态却异军突起,展现出强大的市场吸引力。这背后,并非简单的…...

Libero SoC v2021.1离线安装全攻略:从下载到IP核配置(附避坑指南)

Libero SoC v2021.1离线安装全攻略:从下载到IP核配置(附避坑指南) 在企业内网开发环境中,离线安装EDA工具往往面临诸多挑战。本文将手把手指导您完成Libero SoC v2021.1的完整离线部署流程,涵盖从安装包获取到IP核配置…...

yuzu模拟器中文显示问题深度解析与专业调校指南

yuzu模拟器中文显示问题深度解析与专业调校指南 【免费下载链接】yuzu-downloads 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu-downloads yuzu模拟器作为目前最优秀的任天堂Switch模拟器,在运行中文游戏时常常面临字体渲染和显示兼容性问题。本…...

用MQTT协议玩转OneNet物联网:STM32F103+ESP8266实现温湿度监控(附心跳包优化技巧)

STM32F103与ESP8266的物联网实战:MQTT协议深度优化与温湿度监控系统设计 1. 资源受限环境下的物联网通信架构设计 在嵌入式物联网设备开发中,资源优化始终是核心挑战。STM32F103C8T6作为经典的Cortex-M3内核微控制器,仅有64KB Flash和20KB RA…...

从‘它又挂了’到‘稳如老狗’:我是如何用Prometheus+Grafana给自家小破站做监控的

从“它又挂了”到“稳如老狗”:我是如何用PrometheusGrafana给自家小破站做监控的 凌晨三点,手机突然响起钉钉告警——这已经是本周第三次被“502 Bad Gateway”的提示音吵醒。揉着惺忪睡眼重启Nginx时,我突然意识到:这个用业余时…...

保姆级教程:用C语言数组扫描法,搞定智能车摄像头识别赛道‘L型’拐点

智能车竞赛实战:C语言数组扫描法精准识别L型赛道拐点 在智能车竞赛的赛道上,L型拐点往往是让许多参赛队伍"翻车"的关键节点。传统横向巡线算法在这里容易丢失赛道边界,而基于纵向扫描的数组分析法却能像手术刀般精准定位特征点。本…...