导览机器人产品讲解(摄像头 + YOLO 真实识别 + 语音讲解)
一、进阶要实现的效果
- 摄像头实时识别物体
- 自动语音讲解
- TTS语音播报
- 不卡顿、不重复播报(防抖动)
二、工程结构(标准 ROS2 包)
product_robot/ ├── launch/ │ └── product_detect.launch.py ├── scripts/ │ ├── camera_node.py │ ├── yolo_detect_node.py │ └── talker_node.py ├── config/ │ └── product_info.json # 讲解词库 └── package.xml三、安装依赖(OpenCV + YOLO)
执行以下命令,一键装完:
sudo apt update pip install opencv-python pip install ultralytics # YOLOv8 pip install ultralytics opencv-python pyttsx3 cv-bridge三、创建摄像头识别节点
文件路径:~/ros2_ws/src/product_robot/product_robot/camera_yolo_node.py
import rclpy from rclpy.node import Node from sensor_msgs.msg import Image from cv_bridge import CvBridge from ultralytics import YOLO import cv2 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.subscriber = self.create_subscription(Image, "/image_raw", self.callback, 10) self.bridge = CvBridge() self.model = YOLO("yolov8n.pt") # 通用模型,以后换客户模型 self.get_logger().info("✅ YOLO 目标检测启动") def callback(self, msg): frame = self.bridge.imgmsg_to_cv2(msg, "bgr8") results = self.model(frame, stream=True) for r in results: for box in r.boxes: cls = self.model.names[int(box.cls[0])] self.publisher.publish(String(data=cls)) def main(args=None): rclpy.init(args=args) node = YoloDetectNode() rclpy.spin(node) rclpy.shutdown()四、更新讲解节点
import rclpy from rclpy.node import Node from std_msgs.msg import String import json import pyttsx3 class ProductTalkerNode(Node): def __init__(self): super().__init__("product_talker_node") self.sub = self.create_subscription(String, "/detection_result", self.callback, 10) self.engine = pyttsx3.init() self.last = "" self.count = 0 with open("config/product_info.json", "r", encoding="utf-8") as f: self.products = json.load(f) self.get_logger().info("✅ 讲解节点启动") def callback(self, msg): label = msg.data if label == self.last: self.count +=1 else: self.count =0 self.last = label # 防抖:连续识别2次才讲解 if self.count >=2 and label in self.products: script = self.products[label]["script"] self.get_logger().info(f"讲解:{script}") self.engine.say(script) self.engine.runAndWait() self.count = -10 # 冷却,避免重复讲 def main(args=None): rclpy.init(args=args) node = ProductTalkerNode() rclpy.spin(node) rclpy.shutdown()四、把节点加入 setup.py
打开:~/ros2_ws/src/product_robot/setup.py
在entry_points里加一行:
'camera_yolo_node = product_robot.camera_yolo_node:main',最终变成:
entry_points={ 'console_scripts': [ 'yolo_detect_node = product_robot.yolo_detect_node:main', 'product_talker_node = product_robot.product_talker_node:main', 'camera_yolo_node = product_robot.camera_yolo_node:main', ], },五、编译
bash运行
cd ~/ros2_ws colcon build source install/setup.bash六、运行完整进阶系统
开3个终端:
终端 1:启动摄像头
ros2 run usb_cam usb_cam_node_exe终端 2:启动YOLO 识别
ros2 run product_robot camera_yolo_node终端 3:启动语音讲解
ros2 run product_robot product_talker_node七、如果你想加更多物体讲解
直接打开你的 JSON 文件加内容就行:
"keyboard": { "script": "检测到键盘,用于输入文字。" }八、对接客户自定义产品
- 收集客户各类展品多角度实拍图
- 使用标注工具标注数据集,训练专属
xxx.pt模型 - 仅修改检测节点内模型路径:
self.model = YOLO("自定义展品模型.pt") - 同步更新
product_speech.json内产品名与专属讲解话术即可
九、拓展点
1.增加识别置信度过滤,过滤低概率误识别
2. 新增界面可视化窗口,绘制识别框 + 产品名称
3. 接入机器人底盘逻辑,识别展品后自动靠近讲解
4. 切换离线 TTS / 云端语音合成,优化播报音色
