导览机器人产品讲解(模拟固定输出)
实现效果说明识别节点每秒自动发布手机识别数据讲解节点接收数据读取 json 对应文案自动语音播报内容线程隔离避免卡顿播报中自动屏蔽重复消息防止程序阻塞一、前期环境配置1-1 依赖安装# 更新最新软件库列表 sudo apt update # 安装Python语音库 sudo apt install espeak-ng alsa-utils -y二、创建工作空间与功能包1. 新建工作目录mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src2. 创建功能包ros2 pkg create --build-type ament_python product_robot cd product_robot mkdir config三、编写配置文件1. 新建讲解词文件config/product_info.jsoncat ~/ros2_ws/src/product_robot/config/product_info.json EOF { cell phone: { script: 检测到手机这是一款常用的通讯娱乐设备。 }, person: { script: 检测到人员。 }, laptop: { script: 检测到笔记本电脑。 } } EOF四、编写业务节点代码1.模拟识别节点 yolo_detect_node.py路径product_robot/product_robot/yolo_detect_node.pyimport rclpy from rclpy.node import Node from std_msgs.msg import String class YoloDetectNode(Node): def __init__(self): super().__init__(yolo_detect_node) self.publisher_ self.create_publisher(String, /detection_result, 10) self.timer self.create_timer(1.0, self.timer_callback) self.get_logger().info(✅ 识别节点启动) def timer_callback(self): msg String() msg.data cell phone self.publisher_.publish(msg) self.get_logger().info(f发布识别结果{msg.data}) def main(argsNone): rclpy.init(argsargs) node YoloDetectNode() rclpy.spin(node) rclpy.shutdown() if __name__ __main__: main()2. 语音讲解节点 product_talker_node.py路径product_robot/product_robot/product_talker_node.pyimport rclpy from rclpy.node import Node from std_msgs.msg import String import pyttsx3 import json import os import threading class ProductTalkerNode(Node): def __init__(self): super().__init__(product_talker_node) self.subscription self.create_subscription( String, /detection_result, self.detect_callback, 10 ) self.engine pyttsx3.init() self.engine.setProperty(rate, 220) self.is_speaking False pkg_path os.path.dirname(os.path.dirname(os.path.abspath(__file__))) json_path os.path.join(pkg_path, config, product_info.json) with open(json_path, r, encodingutf-8) as f: self.product_db json.load(f) self.get_logger().info(✅ 讲解节点启动) def detect_callback(self, msg): if self.is_speaking: return obj msg.data text self.product_db.get(obj, {}).get(script, 未知物品) def speak(): self.is_speaking True self.get_logger().info(f讲解{text}) self.engine.say(text) self.engine.runAndWait() self.is_speaking False threading.Thread(targetspeak, daemonTrue).start() def main(argsNone): rclpy.init(argsargs) node ProductTalkerNode() rclpy.spin(node) rclpy.shutdown() if __name__ __main__: main()3. 配置入口文件 setup.py找到setup.py中 entry_points 字段替换内容entry_points{ console_scripts: [ yolo_detect_node product_robot.yolo_detect_node:main, product_talker_node product_robot.product_talker_node:main, ], },五、编译部署cd ~/ros2_ws colcon build source install/setup.bash六、运行测试1.终端 1 启动识别节点ros2 run product_robot yolo_detect_node2.终端 2 启动讲解节点source install/setup.bash ros2 run product_robot product_talker_node七、后续进阶步骤接入 OpenCV替换模拟固定输入调用摄像头实时采集画面做物体检测扩充 JSON 物品库增加更多讲解文案调试音频、播报间隔优化交互体验