mirror of
https://github.com/m1ngsama/robot_arm.git
synced 2026-03-25 19:53:49 +00:00
184 lines
9.2 KiB
Markdown
184 lines
9.2 KiB
Markdown
# 基于多模态融合的具身智能机械臂控制系统
|
||
|
||
## 一、项目概述
|
||
|
||
本项目构建了一套完整的**具身智能(Embodied AI)机械臂控制系统**,实现了"语音下达指令 → 大模型语义解析 → 视觉定位目标 → 机械臂精准执行"的全链路闭环。系统在消费级硬件(RTX 3060 Laptop, 6GB 显存)上完成全部推理,无需联网,满足边缘部署需求。
|
||
|
||
### 核心能力
|
||
|
||
| 能力 | 描述 |
|
||
|:---|:---|
|
||
| **听** | 本地语音识别(Faster-Whisper),实时将中文语音转文本 |
|
||
| **想** | 微调大模型(DeepSeek-R1-1.5B + QLoRA),将自然语言解析为结构化 JSON 指令 |
|
||
| **看** | 目标检测(YOLOv8s)+ 单应性矩阵标定,像素坐标精准映射到机械臂坐标系 |
|
||
| **动** | D-H 运动学建模 + S-Curve 轨迹规划,实现平滑、无抖动的机械臂运动 |
|
||
|
||
---
|
||
|
||
## 二、系统架构
|
||
|
||
```
|
||
语音输入 (麦克风)
|
||
│
|
||
▼
|
||
┌──────────────────┐
|
||
│ Faster-Whisper │ 语音识别 (STT)
|
||
│ (Base, CUDA) │ 中文语音 → 文本
|
||
└────────┬─────────┘
|
||
│ "把削笔刀抬起5厘米"
|
||
▼
|
||
┌──────────────────┐
|
||
│ 规则解析引擎 │ 简单指令直接匹配(松开/复位/方向移动)
|
||
│ (正则匹配) │ ──命中──→ 直接生成 JSON
|
||
└────────┬─────────┘
|
||
│ 未命中(含物体名的复杂指令)
|
||
▼
|
||
┌──────────────────┐
|
||
│ DeepSeek-R1-1.5B │ 微调大模型推理
|
||
│ (QLoRA微调+FP16) │ 自然语言 → JSON 指令
|
||
└────────┬─────────┘
|
||
│ [{"action": "lift", "target": "part", "height": 50}]
|
||
▼
|
||
┌──────────────────┐
|
||
│ YOLOv8s 目标检测 │ 实时检测目标物体位置
|
||
│ + 单应性矩阵标定 │ 像素坐标 → 机械臂坐标
|
||
└────────┬─────────┘
|
||
│ 目标坐标 (rx=170, ry=3)
|
||
▼
|
||
┌──────────────────┐
|
||
│ 运动控制引擎 │ D-H 逆运动学 + S-Curve 插值
|
||
│ (ESP32 + MG996R) │ 平滑轨迹规划 → 舵机执行
|
||
└──────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 三、核心技术详解
|
||
|
||
### 3.1 语音识别 — Faster-Whisper
|
||
|
||
- **模型**:Faster-Whisper Base,CUDA FP16 加速
|
||
- **交互方式**:按住空格键录音,松开后识别
|
||
- **反幻觉优化**:
|
||
- 音频首尾静音裁剪,过滤空白段触发的重复幻觉
|
||
- 设置 `condition_on_previous_text=False`,防止上下文依赖导致的"向右向右向右..."循环
|
||
- 后处理纠错引擎:谐音修正("零米"→"厘米"、"小笔刀"→"削笔刀")+ 重复模式检测与去除
|
||
|
||
### 3.2 语义解析 — 微调大模型 + 规则引擎双通道
|
||
|
||
#### 微调大模型
|
||
|
||
| 项目 | 详情 |
|
||
|:---|:---|
|
||
| **基座模型** | DeepSeek-R1-Distill-Qwen-1.5B |
|
||
| **微调方法** | QLoRA(4-bit NF4 量化训练,FP16 推理) |
|
||
| **训练框架** | LLaMA-Factory |
|
||
| **训练数据** | ~500 条垂直领域样本(中文指令 → JSON) |
|
||
| **训练结果** | Loss 收敛至 0.0519,格式错误率 0% |
|
||
| **推理延迟** | < 200ms (RTX 3060) |
|
||
| **显存占用** | < 4GB (FP16) |
|
||
|
||
**关键技术点**:
|
||
|
||
1. **Prompt 对齐**:推理时的 System Prompt 必须与训练数据完全一致,否则模型输出偏移
|
||
2. **Pre-filling 截断**:手动追加 `<|Assistant|>` 标签,跳过模型的思考链(CoT),直接输出 JSON
|
||
3. **确定性解码**:`do_sample=False` 贪婪搜索,确保相同输入永远产生相同输出
|
||
|
||
#### 规则解析引擎(前置拦截)
|
||
|
||
对简单指令(纯方向移动/松开/复位)直接走**正则匹配**,不经过大模型:
|
||
- 避免模型将"向下三厘米"误判为 `lift`
|
||
- 响应更快(微秒级 vs 毫秒级)
|
||
- 只有包含物体名称的复杂指令(如"把削笔刀抬起5厘米")才交给大模型处理
|
||
|
||
### 3.3 视觉感知 — YOLOv8 + 手眼标定
|
||
|
||
| 项目 | 详情 |
|
||
|:---|:---|
|
||
| **检测模型** | YOLOv8s(自定义训练,50 张样本迁移学习) |
|
||
| **空间映射** | 单应性矩阵(Homography),4 点标定 |
|
||
| **交互标定** | 按 `C` 键实时点击标定点,支持摄像头移位后重新校准 |
|
||
| **镜像修正** | `cv2.flip` + 数学补偿公式 $r_y = C_{center} \times 2 - r_{y_{raw}}$ |
|
||
|
||
### 3.4 运动控制 — D-H 建模 + 减震系统
|
||
|
||
| 项目 | 详情 |
|
||
|:---|:---|
|
||
| **运动学** | D-H 参数建模 + Scipy SLSQP 数值逆解 |
|
||
| **姿态约束** | Pitch = -90°,强制抓手垂直地面 |
|
||
| **轨迹规划** | S-Curve 余弦插值(慢起 → 匀移 → 慢停) |
|
||
| **信号滤波** | EMA 移动平均 + 阻尼系数,抑制长力臂惯性震动 |
|
||
| **硬件适配** | 阶梯式上电(防浪涌)、互补数映射(统一电机极性) |
|
||
|
||
### 3.5 硬件平台
|
||
|
||
| 组件 | 型号/规格 |
|
||
|:---|:---|
|
||
| **主控** | ESP32-WROOM-32 |
|
||
| **舵机** | MG996R × 5(大扭矩金属齿轮) |
|
||
| **电源** | 6V / 6A 外部直流电源 |
|
||
| **GPU** | NVIDIA RTX 3060 Laptop (6GB VRAM) |
|
||
| **摄像头** | USB 广角摄像头 (1280×720) |
|
||
|
||
---
|
||
|
||
## 四、技术栈总览
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────┐
|
||
│ 应用层 │
|
||
│ voice_main.py(主程序) │
|
||
│ 语音交互 · 指令调度 · 状态管理 │
|
||
├────────────┬────────────┬───────────┬────────────┤
|
||
│ 语音识别 │ 语义解析 │ 视觉感知 │ 运动控制 │
|
||
│ │ │ │ │
|
||
│ Faster- │ DeepSeek │ YOLOv8s │ D-H IK │
|
||
│ Whisper │ R1-1.5B │ + Homog- │ + S-Curve │
|
||
│ (Base) │ (QLoRA) │ raphy │ + EMA │
|
||
│ │ + 规则引擎 │ │ │
|
||
├────────────┴────────────┴───────────┴────────────┤
|
||
│ 框架层 │
|
||
│ PyTorch · Transformers · OpenCV · Ultralytics │
|
||
│ SoundDevice · Scipy · NumPy │
|
||
├──────────────────────────────────────────────────┤
|
||
│ 硬件层 │
|
||
│ RTX 3060 (CUDA) · ESP32 · MG996R · USB Camera │
|
||
└──────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 五、指令支持与示例
|
||
|
||
| 语音指令 | 解析结果 (JSON) | 执行动作 |
|
||
|:---|:---|:---|
|
||
| "把削笔刀抬起5厘米" | `[{"action":"lift","target":"part","height":50}]` | 视觉定位 → 抓取 → 抬起 50mm |
|
||
| "向左移动3厘米" | `[{"action":"move_inc","axis":"y","value":30}]` | Y 轴正方向移动 30mm |
|
||
| "向下移动2厘米" | `[{"action":"move_inc","axis":"z","value":-20}]` | Z 轴负方向移动 20mm |
|
||
| "松开" | `[{"action":"release"}]` | 张开夹爪 |
|
||
| "回到原位" | `[{"action":"reset"}]` | 复位至初始姿态 |
|
||
|
||
---
|
||
|
||
## 六、关键问题与解决方案
|
||
|
||
| 问题 | 原因 | 解决方案 |
|
||
|:---|:---|:---|
|
||
| 舵机上电瞬间 ESP32 死机 | 5 路电机同时启动,浪涌电流导致掉电 | 阶梯式上电,间隔 0.5~1.5s 依次激活 |
|
||
| 机械臂移动轨迹走斜线 | 长连杆 (L4=130mm) 导致非线性偏移 | D-H 建模 + Pitch=-90° 姿态约束 + 数值逆解 |
|
||
| 机械臂剧烈抖动 | MG996R 响应过快 + 长力臂惯性 | S-Curve 插值 + EMA 滤波 + 阻尼系数 |
|
||
| Whisper 输出"向右向右向右..." | 静音段触发重复幻觉 | 音频裁剪 + `condition_on_previous_text=False` + 后处理去重 |
|
||
| "向下三厘米"被模型解析为 lift | 模型泛化不足,混淆方向移动与抬起 | 规则引擎前置拦截简单指令 |
|
||
| Ollama 推理输出废话/思维链 | GGUF 模板对齐失败 | 改用原生 Transformers + Pre-filling 截断 |
|
||
| 5 厘米输出 500 而非 50 | 推理 Prompt 与训练 Prompt 不一致 | 严格对齐 System Prompt |
|
||
|
||
---
|
||
|
||
## 七、项目结论
|
||
|
||
本项目通过**"硬件补偿 + 数学建模 + 深度学习"**的多层深度耦合,在消费级硬件上实现了完整的具身智能系统:
|
||
|
||
1. **数据质量 > 模型规模**:仅 500 条高质量训练数据,1.5B 小模型即可在垂直领域达到 100% 格式遵循率
|
||
2. **双通道解析架构**:规则引擎处理简单指令(快速、确定性),大模型处理复杂指令(灵活、语义理解),兼顾速度与智能
|
||
3. **全栈离线运行**:语音识别、语义解析、视觉检测、运动控制全部在本地完成,显存占用 < 4GB,满足边缘部署需求
|
||
4. **工程鲁棒性**:从硬件防浪涌、舵机减震到语音去幻觉,每一层都有针对性的容错机制
|