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

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

本教程将详细介绍如何使用 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.xdnf.cn/news/3646.html

    相关文章:

  1. Easy云盘总结篇-登录注册
  2. C# 编程核心:控制流与方法调用详解
  3. 力扣每日一题 ​838. 推多米诺​
  4. PyCharm中全局搜索无效
  5. 软件测试名词科普:驱动模块、桩模块
  6. springAop代理责任链模式源码解析
  7. Socket-TCP
  8. 【信息系统项目管理师】【2017年-2024年】计算画图题汇总——案例分析
  9. [更新完毕]2025东三省B题深圳杯B题数学建模挑战赛数模思路代码文章教学:LED显示屏颜色转换设计与校正
  10. ES6入门---第二单元 模块三:对象新增、
  11. 深入理解 HttpExchange_Java 中构建 HTTP 服务的基础组件
  12. 0基础 | STM32 | TB6612电机驱动使用
  13. 2025年- H22-Lc130-206. 反转链表(链表)---java版
  14. FreeRtos实战从入门到精通--任务创建和删除(动态方法)--事了拂衣去,深藏功与名
  15. scikit-learn在监督学习算法的应用
  16. linux下,ollama会把模型文件保存在哪里?
  17. 神经网络基础-从零开始搭建一个神经网络
  18. 【掌握 DDL】:SQL 中的数据库与表管理
  19. 安卓基础(悬浮窗分级菜单和弹窗)
  20. 【现代深度学习技术】现代循环神经网络04:双向循环神经网络
  21. 游戏引擎学习第256天:XBox 控制器卡顿和修复 GL Blit 伽玛问题
  22. java学习之数据结构:三、八大排序
  23. 生成器模式(Builder Pattern)
  24. 【Hive入门】Hive与Spark SQL深度集成:通过Spark ThriftServer高效查询Hive表
  25. 【Unity】XLua访问C#文件
  26. 第十四篇:系统分析师第三遍——15章
  27. LeetCode —— 145. 二叉树的后序遍历
  28. [Linux开发工具]gcc/g++
  29. LangChain:重构大语言模型应用开发的范式革命
  30. 大数据Spark(五十八):Spark Pi介绍