ros2笔记-3.2python 话题订阅与发布

3.1 话题通信介绍

话题发布订阅模型,有4个关键点:发布者、订阅者、话题名称、话题类型

bohu@bohu-TM1701:~$ ros2 node info /turtlesim 
There are 2 nodes in the graph with the exact name "/turtlesim". You are seeing information about only one of them.
/turtlesimSubscribers:/parameter_events: rcl_interfaces/msg/ParameterEvent/turtle1/cmd_vel: geometry_msgs/msg/TwistPublishers:/parameter_events: rcl_interfaces/msg/ParameterEvent/rosout: rcl_interfaces/msg/Log/turtle1/color_sensor: turtlesim/msg/Color/turtle1/pose: turtlesim/msg/Pose

在小海龟模拟器节点启动后,可以查看节点信息,就有Publishers发布者、Subscribers接受者话题。

其中:ros2 topic echo /turtle1/pose 可以查看小海龟的位姿信息。

x: 2.833137035369873
y: 3.6268489360809326
theta: -2.7248146533966064
linear_velocity: 0.0
angular_velocity: 0.0

通过话题而不是之前的键盘也能控制小海龟移动。

ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 1.0, y: 0.0} , angular: {z: -1.0}}"

这个可以让小海龟转圈。

3.2 python话题订阅与发布

需求背景:先创建一个节点,用来下载和发布novel话题,然后再创建一个小说阅读节点。用于订阅novel话题,合成语音并进行播放。

3.2.1 通过话题发布小说

准备工作:

上一节那样打开终端,启动本地web服务器python3 -m http.server

编写业务代码,在3/topic_ws/src文件夹下,打开终端,创建demo_python_topic功能包

bohu@bohu-TM1701:~/3/topic_ws/src$ ros2 pkg create demo_python_topic --build-type ament_python --dependencies rclpy example_interfaces --license Apache-2.0
going to create a new package
package name: demo_python_topic
destination directory: /home/bohu/3/topic_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['bohu <13508678+bohu83@user.noreply.gitee.com>']
licenses: ['Apache-2.0']
build type: ament_python
dependencies: ['rclpy', 'example_interfaces']
creating folder ./demo_python_topic
creating ./demo_python_topic/package.xml
creating source folder
creating folder ./demo_python_topic/demo_python_topic
creating ./demo_python_topic/setup.py
creating ./demo_python_topic/setup.cfg
creating folder ./demo_python_topic/resource
creating ./demo_python_topic/resource/demo_python_topic
creating ./demo_python_topic/demo_python_topic/__init__.py
creating folder ./demo_python_topic/test
creating ./demo_python_topic/test/test_copyright.py
creating ./demo_python_topic/test/test_flake8.py
creating ./demo_python_topic/test/test_pep257.py

注意增加了2个依赖。在创建完成后再package.xml会发现。

创建完功能包之后,在src/demo_python_topic/demo_python_topic下创建novel_pub_node.py文件,代码如下

import rclpy
from rclpy.node import Node
import requests
from example_interfaces.msg import String
from queue import Queueclass NovelPubNode(Node):def __init__(self, node_name):super().__init__(node_name)self.get_logger().info(f'{node_name},启动')self.novels_queue_ = Queue() #创建队列self.novel_publisher_ = self.create_publisher(String,'novel',10)#发布者self.timer_ = self.create_timer(5,self.timer_callback)def timer_callback(self):if self.novels_queue_.qsize()>0:line = self.novels_queue_.get()msg = String();#组装消息msg.data = line;self.novel_publisher_.publish(msg)self.get_logger().info(f'发布了:{msg}')   def download(self,url):reponse = requests.get(url)reponse.encoding = 'utf-8'text = reponse.textself.get_logger().info(f'下载完成‘{url},{len(text)}’')for line in text.splitlines():self.novels_queue_.put(line)def main():rclpy.init()node = NovelPubNode('novel_pub')node.download('http://0.0.0.0:8000/novel1.txt')rclpy.spin(node)rclpy.shutdown()    

代码不长,可是我跟着视频敲了2遍才能跑起来有些不起眼有没提示的错误运行时会报错,下载逻辑跟之前一样,处理逻辑增加了按行处理,把每行放入队列。队列是个先进先出的数据结构,适合此业务场景。回调函数timer_callback 从队列获取数据,组装为String格式。调用发布者发布。

再setup.py注册novel_pub_node节点,并构建,运行novel_pub_node.

bohu@bohu-TM1701:~/3/topic_ws$ ros2 run demo_python_topic novel_pub_node 
[INFO] [1736161295.090347220] [novel_pub]: novel_pub,启动
[INFO] [1736161295.097754661] [novel_pub]: 下载完成‘http://0.0.0.0:8000/novel1.txt,447’
[INFO] [1736161300.097022327] [novel_pub]: 发布了:example_interfaces.msg.String(data='CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。1')
[INFO] [1736161305.093794085] [novel_pub]: 发布了:example_interfaces.msg.String(data='CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。2')
[INFO] [1736161310.095291773] [novel_pub]: 发布了:example_interfaces.msg.String(data='CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。3')
[INFO] [1736161315.094403770] [novel_pub]: 发布了:example_interfaces.msg.String(data='CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。4')
[INFO] [1736161320.095770036] [novel_pub]: 发布了:example_interfaces.msg.String(data='CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。5')
[INFO] [1736161325.093794607] [novel_pub]: 发布了:example_interfaces.msg.String(data='CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。6')
[INFO] [1736161330.093633498] [novel_pub]: 发布了:example_interfaces.msg.String(data='CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。7')
[INFO] [1736161335.094141394] [novel_pub]: 发布了:example_interfaces.msg.String(data='CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。8')
[INFO] [1736161340.094232710] [novel_pub]: 发布了:example_interfaces.msg.String(data='CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。9')
[INFO] [1736161345.093890803] [novel_pub]: 发布了:example_interfaces.msg.String(data='CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。10')
[INFO] [1736161350.095869992] [novel_pub]: 发布了:example_interfaces.msg.String(data='CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。11')
[INFO] [1736161355.093779808] [novel_pub]: 发布了:example_interfaces.msg.String(data='CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。12')

可以看到小说已经被成功下载和发布。再观察下话题是否发布。

bohu@bohu-TM1701:~$ ros2 topic list
/novel
/parameter_events
/rosout

bohu@bohu-TM1701:~$ ros2 topic echo /novel
data: CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。2
---
data: CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。3
---
data: CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。4
---
data: CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。5
---
data: CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。6
---
data: CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。7
---
data: CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。8
---
data: CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。9
---
data: CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。10
---
data: CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。11
---
data: CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。12
---

可以看到程序运行结果正常输出了小说内容。

3.2.2 订阅小说并合成语音

先安装依赖 sudo apt install python3-pip -y

pip3 install espeakng

sudo apt install espeak-ng

在src/demo_python_topic/demo_python_topic下创建novelsub_node.py文件。代码如下所示

import espeakng
import rclpy
from rclpy.node import Node
from example_interfaces.msg import String
from queue import Queue
import threading
import timeclass NovelSubNode(Node):def __init__(self, node_name):super().__init__(node_name)self.get_logger().info(f'{node_name},启动')self.novels_queue_ = Queue()self.novel_subscriber_ = self.create_subscription(String,'novel',self.novel_callback,10)self.speaker_thread_ = threading.Thread(target=self.speaker_thread)self.speaker_thread_.start()def novel_callback(self,msg):self.novels_queue_.put(msg.data )def speaker_thread(self):speaker = espeakng.Speaker()speaker.voice = 'zh'while rclpy.ok(): #检测当前ros上下文是否okif  self.novels_queue_.qsize()>0:text = self.novels_queue_.get()self.get_logger().info(f'朗读:{text}')speaker.say(text) #说speaker.wait() # 等他说完else:# 让当前线程休眠1stime.sleep(1)    def main():rclpy.init()node = NovelSubNode('novel_sub')rclpy.spin(node)rclpy.shutdown()    

相对上面的代码,基本结构类似,多了语音合成库espeakng.

因为朗读速度没有接受的快,所以使用队列存储接收到的数据。从话题接收到数据回调novel_callback就是往队列放。而朗读线程对应方法speaker_thread,创建了speaker对象,设置了声音为中文,调用rclpy.ok(): 检测当前ros上下文是否ok,不断循环判断队列是否有数据,有数据调用say进行朗读。没有数据就休眠1秒。

修改setup.py,注册节点,分别编译运行 

ros2 run demo_python_topic novel_sub_node

ros2 run demo_python_topic novel_pub_node

就能听见合成语音了。

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

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

相关文章

python常见绘图及代码

一、引言 在数据驱动的时代&#xff0c;将数据转化为直观的图形对于理解数据、发现模式和传达信息至关重要。Python作为一种功能强大且广受欢迎的编程语言&#xff0c;拥有丰富的绘图库&#xff0c;能满足不同场景下的数据可视化需求。本文将深入探讨Python中常见的绘图程序&am…

GWAS数据和软件下载

这部分主要是数据获取,以及软件配置方法。 一、配套数据和代码 数据和代码目前在不断的更新,最新的教程可以私信,我通过后手动发送最新版的pdf和数据代码。发送的压缩包,有电子版的pdf和数据下载链接,里面是最新的百度网盘的地址,下载到本地即可。然后根据pdf教程,结合配套的…

【pytorch-lightning】架构一览

pytorch-lightning是基于pytorch的一个套壳项目&#xff0c;适配pytorch的版本同步更新速度很快。 它将训练的几个主要流程模块化&#xff0c;减少重复工作&#xff0c;同时让支持分布式训练&#xff0c;不同平台的训练迁移变得更加简单。 官网链接

Uniapp Android 本地离线打包(详细流程)

一、简介 App 离线 SDK 暂时不支持 Kotlin&#xff0c;未来不清楚。 uniapp 提供了 云打包 与 本地打包 两种方案&#xff0c;云打包 需要排队且还有次数限制&#xff0c;本地打包 则就没有这些限制&#xff0c;而且会 本地打包 对开发 原生插件 有很大的帮助。 细节&#x…

NeurIPS 2024 | 像素级LLM实现图像视频理解、生成、分割和编辑大统一(昆仑万维等)

Accepted by NeurIPS 2024 文章链接&#xff1a;https://arxiv.org/pdf/2412.19806 项目链接&#xff1a;https://vitron-llm.github.io/ Github链接&#xff1a;https://github.com/SkyworkAI/Vitron 亮点直击 首次提出了一种通用的视觉多模态大语言模型&#xff08;MLLM&…

AMP 混合精度训练中的动态缩放机制: grad_scaler.py函数解析( torch._amp_update_scale_)

AMP 混合精度训练中的动态缩放机制 在深度学习中&#xff0c;混合精度训练&#xff08;AMP, Automatic Mixed Precision&#xff09;是一种常用的技术&#xff0c;它利用半精度浮点&#xff08;FP16&#xff09;计算来加速训练&#xff0c;同时使用单精度浮点&#xff08;FP32…

细说STM32F407单片机FSMC连接外部SRAM的方法及HAL驱动

目录 一、FSMC连接外部SRAM的原理 1、 FSMC控制区域的划分 2、SRAM芯片与MCU的连接 二、访问外部SRAM的HAL驱动程序 1、外部SRAM初始化与控制 2、外部SRAM读写函数 3、直接通过指针访问外部SRAM 4、DMA方式读写外部SRAM 本文介绍STM32F407单片机FSMC连接外部SRAM及以轮…

react axios 优化示例

使用 axios 是 React 项目中非常常见的 HTTP 请求库。为了提升 axios 在 React 中的性能、可维护性和用户体验,我们可以从 代码组织、请求优化 和 用户体验优化 多个角度进行详细的优化。 一、安装与基础配置 安装 axios npm install axios创建 Axios 实例 为了更好地管理…

Java mysql根据很长的富文本如何自动获取简介

在Java应用程序中&#xff0c;根据很长的富文本自动生成简介是一个常见的需求。富文本通常包含HTML标签、格式化信息等&#xff0c;因此处理富文本以提取简介需要对文本进行解析和处理。以下是实现这一功能的详细步骤&#xff0c;包括如何从富文本中提取纯文本&#xff0c;并生…

Gitee图形界面上传(详细步骤)

目录 1.软件安装 2.安装顺序 3.创建仓库 4.克隆远程仓库到本地电脑 提交代码的三板斧 1.软件安装 Git - Downloads (git-scm.com) Download – TortoiseGit – Windows Shell Interface to Git 2.安装顺序 1. 首先安装git-2.33.1-64-bit.exe&#xff0c;顺序不能搞错2. …

基于单片机洗衣机控制器的设计(论文+源码)

1需求分析 在智能洗衣机系统设计中&#xff0c;考虑到洗衣机在实际应用过程中&#xff0c;需要满足用户对于不同衣物清洁、消毒的应用要求&#xff0c;对设计功能进行分析&#xff0c;具体如下&#xff1a; 通过按键实现洗衣机不同工作模式的切换&#xff0c;包括标准模式&…

【学Rust开发CAD】2 创建第一个工作空间、项目及库

文章目录 一、 创建工作空间二、新建项目&#xff08;可执行文件&#xff09;三、 新建库&#xff08;库文件&#xff09;四、更新项目依赖五、编写代码七、总结 在 Rust 中&#xff0c;工作空间&#xff08;workspace&#xff09;允许你管理多个相关的包&#xff08;crate&…

STM32的LED点亮教程:使用HAL库与Proteus仿真

学习目标&#xff1a;掌握使用STM32 HAL库点亮LED灯&#xff0c;并通过Proteus进行仿真验证&#xff01; 建立HAL库标准工程 1.新建工程文件夹 新建工程文件夹建议路径尽量为中文。建立文件夹的目的为了更好分类去管理项目工程中需要的各类工程文件。 首先需要在某个位置建立工…

Unity Excel转Json编辑器工具

功能说明&#xff1a;根据 .xlsx 文件生成对应的 JSON 文件&#xff0c;并自动创建脚本 注意事项 Excel 读取依赖 本功能依赖 EPPlus 库&#xff0c;只能读取 .xlsx 文件。请确保将该脚本放置在 Assets 目录下的 Editor 文件夹中。同时&#xff0c;在 Editor 下再创建一个 Exc…

牛客网刷题 ——C语言初阶(6指针)——字符逆序

1. 题目描述&#xff1a;字符逆序 牛客网题目链接 将一个字符串str的内容颠倒过来&#xff0c;并输出。 输入描述: 输入一个字符串&#xff0c;可以有空格 输出描述: 输出逆序的字符串 示例1 输入 I am a student 输出 tneduts a ma I 2. 思路 首先字符串逆序&#xff0c;之…

【数据可视化】数据可视化看板需求梳理模板(含示例)

一、模板 设计一个数据可视化看板需要从多个方面梳理需求&#xff0c;以确保看板能够有效地传达信息并满足用户的需求。以下是一些关键方面&#xff1a; 1.目标和受众 ● 明确目标&#xff1a;确定看板的主要目的&#xff0c;例如监控业务指标、分析市场趋势、展示项目进度等…

【USRP】教程:在Macos M1(Apple芯片)上安装UHD驱动(最正确的安装方法)

Apple芯片 前言安装Homebrew安装uhd安装gnuradio使用b200mini安装好的路径下载固件后续启动频谱仪功能启动 gnu radio关于博主 前言 请参考本文进行安装&#xff0c;好多人买了Apple芯片的电脑&#xff0c;这种情况下&#xff0c;可以使用UHD吗&#xff1f;答案是肯定的&#…

141.《mac m系列芯片安装mongodb详细教程》

文章目录 下载从官网下载安装包 下载后双击解压出文件夹安装文件名修改为 mongodb配置data存放位置和日志log的存放位置启动方式一方式二方式二:输入mongo报错以及解决办法 本人电脑 m2 pro,属于 arm 架构 下载 官网地址: mongodb官网 怎么查看自己电脑应该下载哪个版本,输入…

Elasticsearch:基础概念

这里写目录标题 一、什么是Elasticsearch1、基础介绍2、什么是全文检索3、倒排索引4、索引&#xff08;1&#xff09;创建索引a 创建索引基本语法b 只定义索引名&#xff0c;setting、mapping取默认值c 创建一个名为student_index的索引&#xff0c;并设置一些自定义字段 &…

Dexcap复现代码数据预处理全流程(四)——demo_clipping_3d.py

此脚本的主要功能是可视化点云数据文件&#xff08;.pcd 文件&#xff09;&#xff0c;并通过键盘交互选择演示数据的起始帧和结束帧&#xff0c;生成片段标记文件 (clip_marks.json) 主要流程包括&#xff1a; 用户指定数据目录&#xff1a;检查目录是否存在并处理标记文件 -…