大模型 + 机械臂:通过语音控制实现物体抓取(Gazebo 仿真验证)

大模型 + 机械臂:通过语音控制实现物体抓取(Gazebo 仿真验证)_第1张图片
1. 项目背景与目标

在工业自动化和服务机器人场景中,通过自然语言交互实现机械臂控制具有重要应用价值。本文结合语音识别视觉大模型(VLM)和机械臂运动控制,实现了一套通过语音指令控制机械臂在 Gazebo 仿真环境中抓取物体的系统。核心流程:

  1. 用户通过语音描述目标物体(如 “抓取红色积木”);

  2. 系统结合摄像头图像和大模型定位物体像素坐标;

  3. 将像素坐标转换为机械臂坐标系下的三维位置;

  4. 机械臂完成抓取并放置到指定位置。

    大模型 + 机械臂:通过语音控制实现物体抓取(Gazebo 仿真验证)-----非常简单,后续推出复杂行为规划

2. 系统架构设计

2.1 整体流程图

大模型 + 机械臂:通过语音控制实现物体抓取(Gazebo 仿真验证)_第2张图片

graph TD
    A[用户语音输入] --> B[语音识别为文本]
    B --> C[触发摄像头图像捕获]
    C --> D[图像编码并调用大模型API]
    D --> E[解析大模型返回的像素坐标(x,y)]
    E --> F[像素坐标转换为机械臂坐标系(x,y,z)]
    F --> G[发布/pickup_coords话题]
    G --> H[机械臂控制器订阅话题]
    H --> I[机械臂移动至目标上方(z+0.1)]
    I --> J[下降至目标高度并闭合夹爪]
    J --> K[发布/place_coords话题(固定位置)]
    K --> L[移动至放置位置并释放物体]
    L --> M[返回初始位置]

2.2 系统架构图

大模型 + 机械臂:通过语音控制实现物体抓取(Gazebo 仿真验证)_第3张图片


(说明:包含语音交互、视觉处理、大模型、坐标转换、机械臂控制五大模块,通过 ROS 话题通信)

3. 核心模块解析

3.1 语音交互模块
  • 功能:录制音频并通过 Google 语音识别转换为文本指令。

  • 关键代码

    python

    def record_audio():
        # 按键'q'停止录音,保存为WAV文件
    def recognize_speech(audio_file):
        # 使用SpeechRecognition库识别中文语音

  • 流程:用户按回车开始录音,按q结束,生成临时音频文件。

3.2 视觉处理与大模型接口
  • 功能:捕获 Gazebo 相机图像,通过阿里云大模型(Qwen-VL)定位物体中心点像素坐标。

  • 关键代码

    python

    def query_vlm(image_base64, question):
        # 构造API请求,获取大模型返回的坐标
    def extract_coordinates(answer):
        # 从大模型回答中解析(x,y)像素坐标

  • 坐标系说明:图像坐标系原点在左上角,x 轴向右,y 轴向下(符合计算机视觉标准)。

3.3 坐标转换算法
  • 功能:将图像像素坐标转换为机械臂末端执行器的三维坐标(Gazebo 世界坐标系)。

  • 数学模型

    1. 像素归一化:(x_pixel/640, y_pixel/480)

    2. 相机坐标系转换(相机位置:(-0.44, -0.5, 1.58),桌子高度:0.74):

      python

      x_arm = (x_pixel/640 - 0.5) * (-0.968) * (dist_tavolo/0.84) + cam_point[0]
      y_arm = (y_pixel/480 - 0.5) * 0.691 * (dist_tavolo/0.84) + cam_point[1]
      z_arm = DEFAULT_Z  # 固定抓取高度(高于桌面)

3.4 机械臂控制逻辑
  • 功能:订阅坐标话题,控制机械臂运动和夹爪动作,包含安全机制(忙状态标志is_busy)。

  • 关键代码

    python

    class LegoManipulator:
        def pickup_callback(self, msg):
            # 移动至目标上方→下降→闭合夹爪→发布放置坐标
        def place_callback(self, msg):
            # 移动至放置上方→下降→释放物体→返回初始位置

  • 运动规划

    • 夹取:目标位置上方 0.1m 处预定位,避免碰撞;

    • 放置:固定位置PLACE_POS,支持自定义扩展。

4. Gazebo 仿真环境搭建

4.1 环境配置
  1. 模型:使用 UR5 机械臂 + 夹爪模型,添加双目相机(配置深度图输出)。

  2. 启动命令

    bash

    # 启动Gazebo仿真环境
    roslaunch ur_gazebo ur5.launch
    # 运行机械臂控制节点
    python3 manipulator_node.py
    # 运行语音视觉节点
    python3 vision_voice_node.py

4.2 关键参数

参数名

含义

默认值

DEFAULT_POS

机械臂初始位置(x,y,z)

(-0.1, -0.2, 1.2)

PLACE_POS

固定放置位置(x,y,z)

(0.264589, -0.293903, 0.777)

DEFAULT_Z

抓取高度(高于桌面)

0.777777

dist_tavolo

桌子到相机的距离(深度图计算)

动态获取

5. 代码分步解析

5.1 初始化与订阅(LegoManipulator类)

python

def __init__(self):
    self.controller = ArmController()  # 机械臂运动控制
    self.gripper = GripperController()  # 夹爪控制
    self.place_coords_pub = rospy.Publisher('/place_coords', Point, queue_size=10)
    # 初始化位置与夹爪状态
    self.controller.move_to(*DEFAULT_POS, DEFAULT_QUAT)
    self.gripper.open()
    # 订阅坐标话题
    rospy.Subscriber("/pickup_coords", Point, self.pickup_callback)


 

  • 关键点:通过 ROS 话题实现模块解耦,初始化时回归安全位置。

5.2 语音→视觉→坐标发布(主流程)

python

def main():
    # 初始化节点与相机订阅
    subscriber = GazeboImageSubscriber()
    rospy.Subscriber('/camera/color/image_raw', Image, subscriber.image_callback)
    # 循环等待用户确认画面,触发语音和视觉处理
    while not rospy.is_shutdown():
        cv.imshow("Gazebo Camera", subscriber.cv_image)  # 显示实时画面
        if key == ord('q'):  # 用户确认画面后开始处理
            image_file = subscriber.capture_image()  # 保存当前帧
            audio_file = record_audio()  # 录制语音
            question = recognize_speech(audio_file)  # 识别为文本
            # 调用大模型获取像素坐标并转换
            x_arm, y_arm, z_arm = convert_pixel_to_arm_coords(x_pixel, y_pixel)
            publish_pickup_coords(x_arm, y_arm, z_arm)  # 发布抓取坐标


 

  • 用户交互:通过 OpenCV 窗口确认画面,按键触发后续流程,增强操作可控性。

6. 实验结果与演示

6.1 仿真效果截图
  1. 初始状态:机械臂位于安全位置,夹爪打开;

  2. 夹取过程:机械臂下降至目标物体,夹爪闭合;

  3. 放置过程:移动至固定位置,释放物体后回归初始位置。

6.2 关键日志输出

log

[INFO] Received pickup coordinates: x=0.12, y=-0.35, z=0.78  # 大模型返回坐标
[INFO] Moving to position: x=0.12, y=-0.35, z=0.88          # 预定位高度
[INFO] Closing gripper completely...                          # 夹爪闭合
[INFO] Received place coordinates: x=0.26, y=-0.29, z=0.78   # 固定放置点
[INFO] Object released.                                       # 夹爪打开
[INFO] Arm returned to initial position.                      # 回归安全位

7. 总结与扩展方向

7.1 技术亮点
  1. 多模态交互:结合语音与视觉,降低操作门槛;

  2. 大模型赋能:通过 Qwen-VL 快速定位物体,避免传统视觉算法复杂建模;

  3. 安全机制:忙状态标志防止多指令冲突,保障运动规划可靠性。

7.2 改进方向
  1. 动态环境适配:增加物体检测追踪,支持非固定位置抓取;

  2. 语音指令优化:支持更复杂指令(如 “将杯子放到盘子里”);

  3. 硬件迁移:从 Gazebo 仿真到真实机械臂部署,校准相机内外参数。

附录:完整代码结构

plaintext

project/  
├── src/  
│   ├── manipulator_node.py       # 机械臂控制核心代码  
│   ├── vision_voice_node.py      # 语音视觉处理代码  
│   ├── controller/              # 机械臂与夹爪控制模块  
│   │   ├── arm_controller.py  
│   │   └── gripper_controller.py  
├── launch/  
│   ├── gazebo.launch            # 启动Gazebo与模型  
│   └── nodes.launch             # 启动ROS节点  
└── outputs/                     # 图像与音频保存目录  

接下来推出复杂行为规划。

你可能感兴趣的:(人工智能,计算机视觉)