ROS2学习笔记|Python实现订阅消息并朗读的详细步骤

本教程将详细介绍如何使用 ROS 2 实现一个节点订阅另一个节点发布的消息,并将接收到的消息通过 espeakng 库进行朗读的完整流程。以下步骤假设你已经安装好了 ROS 2 环境(以 ROS 2 Humble 为例),并熟悉基本的 Linux 操作。

注意:本文在上一篇的基础之上进阶,所以请先参考上一篇《。。》

编写发布者代码

(直接在上一篇的基础上改的)

1.进入功能包的 Python 代码目录:

cd ~/chapt3/topic_ws/src/demo_python_topic/demo_python_topic

2.创建 Python 脚本文件 novel_pub_node.py,内容如下:

import rclpy
from rclpy.node import Node
import os
from example_interfaces.msg import Stringclass NovelPubNode(Node):def __init__(self, node_name):super().__init__(node_name)self.get_logger().info(f'{node_name},启动!')self.publisher_ = self.create_publisher(String, 'novel', 10)def publish_novel_from_file(self):workspace_dir = '/home/elf/chapt3/topic_ws'file_path = os.path.join(workspace_dir, 'novel1.txt')self.get_logger().info(f"尝试打开文件: {file_path}")try:with open(file_path, 'r', encoding='utf-8') as file:content = file.read()self.get_logger().info('开始发布小说内容:')msg = String()msg.data = contentself.publisher_.publish(msg)self.get_logger().info('小说内容发布完成')except FileNotFoundError:self.get_logger().error('未找到 novel1.txt 文件,请检查文件是否存在。')except Exception as e:self.get_logger().error(f'读取文件时出现错误:{e}')def main():rclpy.init()node = NovelPubNode('novel_pub')node.publish_novel_from_file()node.destroy_node()rclpy.shutdown()if __name__ == "__main__":main()

解释:

  • 导入必要的模块,rclpy 用于 ROS 2 Python 开发,os 用于文件操作,example_interfaces.msg.String 是消息类型。
  • NovelPubNode 类继承自 Node,在构造函数中初始化节点并创建发布者。
  • publish_novel_from_file 方法读取指定文件内容,并将其发布到 novel 话题。

 编写订阅者代码

  1. 仍在 ~/chapt3/topic_ws/src/demo_python_topic/demo_python_topic 目录下,创建 Python 脚本文件 novel_sub_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.novel_queue = Queue()self.novel_subscriber = self.create_subscription(String, 'novel', self.novel_callback, 10)self.speech_thread = threading.Thread(target=self.speak_thread)self.speech_thread.start()def novel_callback(self, msg):self.novel_queue.put(msg.data)def speak_thread(self):speaker = espeakng.Speaker()speaker.voice = 'zh'while rclpy.ok():if self.novel_queue.qsize() > 0:text = self.novel_queue.get()self.get_logger().info(f'朗读:{text}')speaker.say(text)speaker.wait()else:time.sleep(1)def main():rclpy.init()node = NovelSubNode('novel_sub')rclpy.spin(node)rclpy.shutdown()

    解释:

  2. 导入必要的模块,espeakng 用于语音合成,rclpy 等用于 ROS 2 开发。
  3. NovelSubNode 类继承自 Node,在构造函数中初始化节点、创建订阅者和启动语音线程。
  4. novel_callback 方法将接收到的消息放入队列。
  5. speak_thread 方法从队列中取出消息并进行语音朗读。

配置setup.py文件

打开 ~/chapt3/topic_ws/src/demo_python_topic/setup.py 文件,在 entry_points 部分添加以下内容:

'console_scripts': ['novel_pub_node = demo_python_topic.novel_pub_node:main','novel_sub_node = demo_python_topic.novel_sub_node:main',
],

解释:console_scripts 用于定义命令行可执行脚本,分别指定了发布者和订阅者节点的可执行入口。

编译工作空间 

cd ~/chapt3/topic_ws
colcon build
source install/setup.bash

解释:重新编译工作空间,使新添加或修改的代码生效。编译完成后设置工作空间环境变量。 

    运行节点

    1. 打开一个新终端,运行发布者节点:
    ros2 run demo_python_topic novel_pub_node

    2.再打开一个新终端,运行订阅者节点:

    ros2 run demo_python_topic novel_sub_node

    此时,订阅者节点会接收到发布者节点发布的消息,并将消息内容通过 espeakng 库进行朗读。

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

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

    相关文章

    WPF封装常用的TCP、串口、Modbus、MQTT、Webapi、PLC通讯工具类

    WPF封装常用通讯工具类 下面我将为您封装常用的TCP、串口、Modbus、MQTT、WebAPI和PLC通讯工具类,适用于WPF应用程序开发。 一、TCP通讯工具类 using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;public class TcpClientHelper : …

    npm pnpm yarn 设置国内镜像

    国内镜像 常用的国内镜像: 淘宝镜像 https://registry.npmmirror.com 腾讯云镜像​​ https://mirrors.cloud.tencent.com/npm/ 华为云镜像​​ https://repo.huaweicloud.com/repository/npm/ CNPM(阿里系) ​​ https://r.cnpmjs.org/ 清华…

    P4552 [Poetize6] IncDec Sequence 题解

    P4552 [Poetize6] IncDec Sequence - 洛谷 差分贪心 根据题目:一段区间都加1或减1 , 可以想到差分 构建差分数组:sub 我们要让除了sub[1] , 其他全是0 我们可以的操作是:l1 , r-1 or l-1 , r1 or 一个数1 / -1 所…

    Power Query精通指南2:数据转换——透视/逆透视/分组、横向纵向合并数据、条件判断、处理日期时间

    文章目录 七、常见数据转换7.1 逆透视7.1.1 逆透视操作7.1.2 重建透视表,更新数据7.1.3 三种逆透视方式(逆透视列等价于逆透视其他列) 7.2 透视7.3 拆分列7.3.1 将列拆分为多列7.3.2 将列拆分为多行7.3.3 拆分到列后逆透视(保留列…

    使用线性表实现通讯录管理

    目录 🚀前言🦜任务目标🌟顺序表实现🐍链表实现 🚀前言 大家好!我是 EnigmaCoder。 本文介绍线性表的实验,使用顺序表和链表实现通讯录管理,包含初始化、插入、删除、查询、输出。 &a…

    firewall docker 冲突问题解决(亲测有效)

    # 关闭iptables,使用firewall systemctl disable iptables # 禁用服务 systemctl stop iptables # 关闭服务 systemctl status iptables # 查看服务状态 systemctl enable firewalld # 设置防火墙开机自启动 systemctl start firewalld # 开启服务 systemctl s…

    [250428] Nginx 1.28.0 发布:性能优化、安全增强及新特性

    目录 Nginx 1.28.0 稳定版发布主要亮点包括:功能增强:安全性改进:其他: Nginx 1.28.0 稳定版发布 Nginx 官方于 4 月 24 日发布了最新的 1.28.0 稳定版本。此版本基于之前的 1.27.x 主线分支,整合了多项新功能、性能优…

    昇腾的CANN是什么?跟英伟达CUDA的有什么联系和区别?【浅谈版】

    昇腾的CANN(Compute Architecture for Neural Networks)是华为专门为AI场景设计的异构计算架构,类似于英伟达的CUDA,但它针对的是华为自家的昇腾AI处理器(Ascend系列)。简单来说,CANN的作用是连…

    C++ STL vector高级特性与实战技巧

    引言 各位小伙伴们好!上一篇博客我们介绍了vector的基础知识和常见操作,今天我们将更深入地探讨vector的高级特性、内存管理细节以及实战应用技巧。 想象一下vector就像一辆能自动变长的公交车,我们上一篇讲了如何上下车(添加删…

    使用PageHelper实现分页查询(详细)

    一:需求分析与设计 1.1 产品原型 (1)分页展示,每页展示10条数据,根据员工姓名进行搜索 (2)业务规则 1.2 接口设计 (1)操作:查询,请求方式&#xf…

    手搓传染病模型(SEICR)

    模型描述 SEICR 模型是一种用于描述具有慢性期的传染病传播规律的数学模型。该模型将人群分为五个部分,分别是易感个体(Susceptible,S)、潜伏期个体(Exposed,E)、急性期感染个体(In…

    音视频开源项目列表

    音视频开源项目列表 一、多媒体处理框架 通用音视频处理 FFmpeg - https://github.com/FFmpeg/FFmpeg 最强大的音视频处理工具库支持几乎所有格式的编解码提供命令行工具和开发库 GStreamer - https://gitlab.freedesktop.org/gstreamer/gstreamer 跨平台多媒体框架基于管道…

    通往“共识空域”的系统伦理演化

    随着低空经济逐步从分布式运营向跨区域联动发展,AI无人系统不再只在本地决策,而开始涉及跨城市、跨机构的任务调度与行为协调。这一趋势带来了新的伦理挑战:多系统之间如何达成行动共识?算法背后的价值判断标准能否统一&#xff1…

    Elasticsearch 常用的 API 接口

    文档类 API Index API :创建并建立索引,向指定索引添加文档。例如:PUT /twitter/tweet/1 ,添加一个文档。 Get API :获取文档,通过索引、类型和 ID 获取文档。如GET /twitter/tweet/1。 DELETE API &…

    【Vue】性能优化与调试技巧

    个人主页:Guiat 归属专栏:Vue 文章目录 1. Vue 性能优化与调试技巧1.1 使用 v-if 替代 v-show 控制条件渲染示例代码: 1.2 组件懒加载(异步组件)示例代码:效果分析图(Mermaid 图表示&#xff09…

    广义线性模型三剑客:线性回归、逻辑回归与Softmax分类的统一视角

    文章目录 广义线性模型三剑客:线性回归、逻辑回归与Softmax分类的统一视角引言:机器学习中的"家族相似性"广义线性模型(GLMs)基础三位家族成员的统一视角1. 线性回归(Linear Regression)2. 逻辑回归(Logistic Regression)3. Softmax分类(Softm…

    【Linux系统篇】:Linux线程控制基础---线程的创建,等待与终止

    ✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:Linux篇–CSDN博客 文章目录 一.线程创建二.线程等待三.线程终止四.扩展内容1.重谈pthread_…

    More Effective C++学习笔记

    条款1 指针与引用的区别 条款2 尽量使用C风格的类型转换 条款3 不要对数组使用多态 条款4 避免无用的缺省构造函数 条款5 谨慎定义类型转换函数 条款6 自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别 条款7 不要重载“&&”,“||”, 或“,” 条款8 理…

    先知AIGC超级工场,撬动运营效率新杠杆

    北京先智先行科技有限公司,作为行业内的重要参与者,拥有“先知大模型”、“先行AI商学院”以及“先知AIGC超级工场”这三款旗舰产品。这些产品在不同领域发挥着关键作用,尤其是先知AIGC超级工场,正悄然改变着内容创作与产品推广的…

    十一岁少年叶珉雪用艺术点亮公益之路 个人原创公益演唱会传递大爱与担当

    4月29日晚,"韶华映雪益路同行"叶珉雪个人原创公益演唱会在广东碧桂园学校歌剧院圆满落幕。 这场由该校美育成果浇灌出的艺术盛宴,生动诠释了广东碧桂园学校育人理念。11岁的叶珉雪以超越年龄的艺术掌控力,呈现了一场融合歌唱、舞蹈…