项目心得——发布者和订阅者问题解决思路

项目心得------发布者和订阅者问题解决思路

在发布者和订阅者项目中,当我运行订阅者的时候,发现订阅者espeak执行不了朗读的问题,我用了以下的步骤去解决问题。

一、检查订阅者代码是否有问题

我把每个关键的代码都进行输出,即在下一行添加,self.get_logger.info(f' ')来检测代码到哪运行不了。例如下图:

python 复制代码
import rclpy
from rclpy.node import Node
from example_interfaces.msg import String #从example_interfaces包中导入String消息类型
import threading
from queue import Queue
import time
import espeakng


class NovelSubNode(Node):
    def __init__(self, node_name):
        super().__init__(node_name)
        self.get_logger().info('小说朗读节点启动')

        self.novels_queue_= Queue()
        self.get_logger().info('正在创建小说订阅者...')

        self.novel_subscriber_ = self.create_subscription(
            String,'novel',self.novel_callback,10
        )
        self.get_logger().info('小说订阅者创建成功,正在等待小说内容...')

        self.speech_thread_=threading.Thread(target=self.speak_thread)
        self.get_logger().info('启动小说朗读线程...')

        self.speech_thread_.start()
        self.get_logger().info('小说朗读线程启动成功')




    def novel_callback(self, msg):
        # if msg.data=='':
        #     self.get_logger().info('收到空小说内容,忽略该消息')
        # else:
            self.novels_queue_.put(msg.data)
            self.get_logger().info('收到小说内容,已加入朗读队列')

    def speak_thread(self):
        speaker = espeakng.Speaker()
        self.get_logger().info('初始化语音引擎...')

        speaker.voice = 'zh'
        self.get_logger().info('语音引擎初始化完成,开始朗读小说内容...')

        
        
        
    
        while rclpy.ok() :
            if self.novels_queue_.qsize() > 0:
                self.get_logger().info('检测到朗读队列中有小说内容,开始朗读...')
                text=self.novels_queue_.get()
                self.get_logger().info(f'正在朗读小说内容:{text}')
                speaker.say(text)
                
                speaker.wait()
                self.get_logger().info('小说内容朗读完成')
            else:
                time.sleep(1)
                self.get_logger().info('朗读队列为空,等待新的小说内容...')
                # 等待一段时间再检查队列,避免忙等待




def main(args=None):
    rclpy.init(args=args)

    node = NovelSubNode("novel_read")
    rclpy.spin(node)
    rclpy.shutdown()

运行到,while rclpy.ok() :之后的代码都执行不下去。后来把代码重打之后,内容可执行。

二、发现订阅者队列,还是接收不了数据

我就对代码的内容重新运行,但是订阅者代码没问题,找了2小时,由于订阅者和发布者之间数据是具有传递关系。

三、检查发布者代码问题

虽然在一开始运行发布者demo是可以运行的,但还是发现变量命名的问题(无关痛痒)。

后来发现两端的传输数据格式有问题。
四、若你实在找不到问题

把你的项目代码之间传到ai,这里笔者用豆包,一定一定要把代码放入,不然干问效率很低。笔者就犯了此错误,已记住。还有就是不要太相信vscode的代码补齐,在疏忽下很容易犯错误。

相关推荐
特立独行的猫A4 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
cpolar技术支持4 小时前
「我这边连不上你那个服务」—— 用清单驱动的 TCP 连通性只读看板,cpolar 让远端同事自己取证
python·内网穿透·tcp·cpolar·网络诊断
云和数据.ChenGuang4 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
天诰5 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
benchmark_cc6 小时前
用 QuantDash 读取美股行情:AAPL.US 的运行前检查、排错顺序与数据校验清单
python·数据分析·pandas·量化交易·股票数据·quantdash
La Pulga6 小时前
【FreeRTOS源码学习笔记】任务延时列表
笔记·mcu·学习·嵌入式·freertos·实时操作系统
2035去旅行6 小时前
bootcmd 详细讲解
linux·嵌入式·arm·soc
陈希1237 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
蜗牛一步步往上爬8 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
女神下凡8 小时前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范