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
    英文地址,請注明出處:http://en.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歲的葉珉雪以超越年齡的藝術掌控力,呈現了一場融合歌唱、舞蹈…