|
|
@ -0,0 +1,146 @@ |
|
|
|
# Sprint 3 技术文档 |
|
|
|
|
|
|
|
**识别到控制闭环打通 + 支持游戏操作** |
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 一、概述 |
|
|
|
|
|
|
|
本阶段实现了一个运行于浏览器端的手势识别系统,结合 MediaPipe 和 WebSocket,打通从摄像头手势识别 → 系统控制(鼠标、滚动、键盘) → 控制小游戏角色的全流程。 |
|
|
|
|
|
|
|
新增支持多种系统控制动作和游戏动作,包括:左右移动、跳跃、组合跳跃等。 |
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 二、模块结构概览 |
|
|
|
|
|
|
|
模块分工如下: |
|
|
|
|
|
|
|
- **Detector.ts** |
|
|
|
加载并初始化 MediaPipe 手势模型,检测手部关键点与手势状态,并调用 `GestureHandler`。 |
|
|
|
- **GestureHandler.ts** |
|
|
|
将识别出的手势映射为系统操作(鼠标、滚动、键盘指令等),支持连续确认、平滑处理、动作节流。 |
|
|
|
- **TriggerAction.ts** |
|
|
|
封装 WebSocket 通信,向后端发送 JSON 格式的控制命令。 |
|
|
|
|
|
|
|
``` |
|
|
|
[摄像头视频流] |
|
|
|
↓ |
|
|
|
[VideoDetector.vue] |
|
|
|
- 捕捉视频帧 |
|
|
|
- 显示实时画面 |
|
|
|
↓ |
|
|
|
[Detector.ts] |
|
|
|
- 使用 MediaPipe Tasks WASM 模型进行手势识别 |
|
|
|
- 返回关键点、手势类型 |
|
|
|
↓ |
|
|
|
[GestureHandler.ts] |
|
|
|
- 将识别结果转为行为 |
|
|
|
- 识别特定组合,如食指 + 拇指 → 滚动 |
|
|
|
↓ |
|
|
|
[TriggerAction.ts] |
|
|
|
- 向 WebSocket 发送控制指令 |
|
|
|
- 控制鼠标/键盘/后端动作 |
|
|
|
↓ |
|
|
|
[后端 Python] |
|
|
|
- WebSocket 接口接收指令 |
|
|
|
- 准备语音接口/控制中枢 |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 三、识别手势说明(扩展后) |
|
|
|
|
|
|
|
每帧识别手指竖起状态(拇指到小指,0 或 1),组合为状态串,查表识别对应手势: |
|
|
|
|
|
|
|
| 状态串 | 手势名 | 动作描述 | |
|
|
|
| ----------- | ------------------- | ------------------------- | |
|
|
|
| `0,1,0,0,0` | only_index_up | 鼠标移动 | |
|
|
|
| `1,1,0,0,0` | index_and_thumb_up | 鼠标点击 | |
|
|
|
| `0,0,1,1,1` | scroll_gesture_2 | 页面滚动 | |
|
|
|
| `1,0,1,1,1` | scroll_gesture_2 | 页面滚动(兼容变体) | |
|
|
|
| `0,1,1,1,1` | four_fingers_up | 发送快捷键(如播放/全屏) | |
|
|
|
| `1,1,1,1,1` | stop_gesture | 暂停/开始识别 | |
|
|
|
| `1,0,0,0,1` | voice_gesture_start | 启动语音识别 | |
|
|
|
| `0,0,0,0,0` | voice_gesture_stop | 停止语音识别 | |
|
|
|
| `0,1,1,0,0` | jump | 小人跳跃(上键) | |
|
|
|
| `1,1,1,0,0` | rightjump | 小人右跳(右+上组合) | |
|
|
|
| 自定义判断 | direction_right | 小人右移(长按右键) | |
|
|
|
| 自定义判断 | delete_gesture | 小人左移(长按左键) | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 四、控制行为逻辑说明 |
|
|
|
|
|
|
|
### 鼠标控制 |
|
|
|
|
|
|
|
- **移动**:基于食指指尖位置映射至屏幕坐标,支持平滑处理,减少抖动。 |
|
|
|
- **点击**:食指与拇指同时上举,节流处理防止重复点击。 |
|
|
|
- **滚动**:捏合(拇指+食指)后上下移动控制滚动方向,带阈值判断。 |
|
|
|
|
|
|
|
### 快捷键/系统操作 |
|
|
|
|
|
|
|
- 四指上举 → 发送自定义按键(如全屏、暂停、下一集等)。 |
|
|
|
- 五指上举 → 暂停/开始识别。支持进度提示。 |
|
|
|
- 删除手势(右手拇指伸出,其余收起)→ 连续发送 Backspace/方向键。 |
|
|
|
- 自定义 holdKey 方法支持模拟长按。 |
|
|
|
|
|
|
|
### 游戏控制扩展(键盘模拟) |
|
|
|
|
|
|
|
| 手势名 | 动作 | |
|
|
|
| --------------- | -------------------- | |
|
|
|
| delete_gesture | 向左移动(左键长按) | |
|
|
|
| direction_right | 向右移动(右键长按) | |
|
|
|
| jump | 向上跳跃(上键) | |
|
|
|
| rightjump | 右跳(右后延迟上) | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 五、性能与稳定性处理 |
|
|
|
|
|
|
|
| 问题 | 解决方案 | |
|
|
|
| ------------------ | ------------------------------------------------------ | |
|
|
|
| 手势误判 | 连续帧确认(minGestureCount ≥ 5) | |
|
|
|
| 鼠标抖动 | 屏幕坐标引入平滑系数 `smoothening` | |
|
|
|
| 动作重复触发 | 节流控制点击/滚动/快捷键/方向键(如 `CLICK_INTERVAL`) | |
|
|
|
| WebSocket 中断重连 | 异常断线后自动重连,带重试时间间隔 | |
|
|
|
| 滚动误触 | 拇指与食指距离阈值控制是否处于“捏合”状态 | |
|
|
|
| UI 状态提示不同步 | 使用全局 store(如 `app_store.sub_window_info`)更新 | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 六、技术特性总结 |
|
|
|
|
|
|
|
- 支持 MediaPipe WASM 模型在前端本地运行,低延迟识别 |
|
|
|
- 所有动作模块化封装,便于未来扩展新手势、新控制指令 |
|
|
|
- 手势控制与后端通过 WebSocket 实时交互,接口稳定 |
|
|
|
- 支持游戏场景(虚拟角色)控制,具备实际互动展示能力 |
|
|
|
- 控制逻辑可配置:如识别区域、快捷键内容、手势灵敏度 |
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 七、后续优化建议(下一阶段) |
|
|
|
|
|
|
|
| 方向 | 目标 | |
|
|
|
| -------------------- | ----------------------------------------------- | |
|
|
|
| 增加左手手势组合识别 | 允许双手协同控制,比如捏合+四指等 | |
|
|
|
| 提升模型识别精度 | 支持定制 MediaPipe .task 文件、自采样训练 | |
|
|
|
| UI 设置面板 | 提供手势→动作自定义、阈值调节、快捷键修改 | |
|
|
|
| 引入语音控制 | Whisper/Vosk 实现语音命令解析,结合手势联动使用 | |
|
|
|
| 多模式切换 | 视频控制、PPT 控制、游戏控制等可切换交互模式 | |
|
|
|
| 场景演示/视频录制 | 准备真实交互展示视频,用于演示或上线宣传 | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 八、结语 |
|
|
|
|
|
|
|
本轮迭代成功实现了从手势识别到控制动作的完整闭环,扩展支持了游戏角色控制(多方向移动与跳跃),并在操作流畅性、准确性与系统解耦方面都取得实质进展。后续可以围绕用户可配置性、语音识别联动与多场景适配进一步扩展系统能力。 |