|
|
@ -0,0 +1,120 @@ |
|
|
|
## 一、本轮迭代目标 |
|
|
|
|
|
|
|
本 Sprint 主要目标是完成 **基于浏览器端的手势控制系统雏形**,实现如下基础功能: |
|
|
|
|
|
|
|
- 搭建前端 Web 应用结构与 UI 页面 |
|
|
|
- 集成 MediaPipe 手势识别模型,完成实时手势检测 |
|
|
|
- 映射部分手势为系统控制行为(鼠标移动、点击等) |
|
|
|
- 搭建基础手势处理逻辑与组件封装结构 |
|
|
|
- 支持语音识别指令发送流程(准备后端对接) |
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 二、本轮主要完成内容 |
|
|
|
|
|
|
|
| 类别 | 工作内容 | |
|
|
|
| -------- | ------------------------------------------------------------ | |
|
|
|
| 前端搭建 | 基于 Vite + Vue 3 + TypeScript 完成项目结构、模块划分、页面初始化 | |
|
|
|
| 手势识别 | 集成 Google MediaPipe WASM 模型,完成实时检测与渲染 | |
|
|
|
| 控制逻辑 | 封装 `GestureHandler`、`TriggerAction`,实现手势到系统操作的映射 | |
|
|
|
| UI设计 | 完成仪表盘式主界面设计,支持响应式、自定义手势预览等 | |
|
|
|
| 模型结构 | 初步梳理 `Detector` 识别流程,统一封装初始化与推理逻辑 | |
|
|
|
| 后端准备 | 初始化 Python 接口 WebSocket 构建,支持语音识别交互 | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 三、系统结构设计 |
|
|
|
|
|
|
|
``` |
|
|
|
[用户摄像头] |
|
|
|
↓ |
|
|
|
[VideoDetector.vue] → 捕捉视频帧,传入检测器 |
|
|
|
↓ |
|
|
|
[Detector.ts] → 调用 MediaPipe 识别手势 |
|
|
|
↓ |
|
|
|
[GestureHandler.ts] → 映射行为(鼠标/键盘/语音) |
|
|
|
↓ |
|
|
|
[TriggerAction.ts] → 向后端/系统发出控制指令 |
|
|
|
↓ |
|
|
|
[Python 后端](语音识别/扩展指令) ← WebSocket 接入 |
|
|
|
``` |
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 四、核心技术栈与理由 |
|
|
|
|
|
|
|
| 技术 | 用途 | 原因 | |
|
|
|
| ---------------- | -------------------- | ------------------------------------------ | |
|
|
|
| Vue 3 + Vite | 前端框架 + 构建工具 | 快速开发,热更新快,Composition API 更灵活 | |
|
|
|
| TypeScript | 增强类型约束 | 减少运行时错误,提升可维护性 | |
|
|
|
| MediaPipe Tasks | 手势识别模型 | 体积小,支持浏览器部署,准确率高 | |
|
|
|
| WebSocket | 前后端实时通信 | 保持实时交互流畅 | |
|
|
|
| Python + FastAPI | 后端扩展接口(语音) | 快速搭建接口,后续支持 Py 模型运行 | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 五、主要功能点与说明 |
|
|
|
|
|
|
|
### 1. Detector 类封装 |
|
|
|
|
|
|
|
- 初始化 WASM 模型与识别器 |
|
|
|
- 封装 `detect()` 每帧调用逻辑 |
|
|
|
- 支持获取 `landmarks`, `gestures`, `handedness` |
|
|
|
|
|
|
|
### 2. 手势识别与映射 |
|
|
|
|
|
|
|
- 仅识别食指 → 鼠标移动 |
|
|
|
- 食指 + 中指 → 鼠标点击 |
|
|
|
- 食指 + 拇指捏合 → 滚动 |
|
|
|
- 四指竖起 → 发送快捷键 |
|
|
|
- 小指+拇指 → 启动语音识别(前端 WebSocket) |
|
|
|
|
|
|
|
### 3. UI 界面模块 |
|
|
|
|
|
|
|
- 实时视频预览窗口 |
|
|
|
- 子窗口:手势反馈 / 执行动作提示 |
|
|
|
- 配置面板:开关检测 / 配置行为映射 |
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 六、识别代码示例(关键手势) |
|
|
|
|
|
|
|
```ts |
|
|
|
if (gesture === HandGesture.ONLY_INDEX_UP) { |
|
|
|
this.triggerAction.moveMouse(x, y) |
|
|
|
} |
|
|
|
if (gesture === HandGesture.INDEX_AND_THUMB_UP) { |
|
|
|
this.triggerAction.scrollUp() |
|
|
|
} |
|
|
|
``` |
|
|
|
|
|
|
|
- 每种手势匹配后,调用封装的 WebSocket + 系统接口发送动作 |
|
|
|
- `TriggerAction` 支持复用 |
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 七、问题与解决方案 |
|
|
|
|
|
|
|
| 问题描述 | 解决方法 | |
|
|
|
| --------------------------------- | ---------------------------------------------------- | |
|
|
|
| WebSocket 连接后反复断开 | 增加连接状态判断 `readyState !== OPEN`,避免提前发送 | |
|
|
|
| Tauri 插件调用 `invoke undefined` | 使用 `npm run tauri dev` 启动,而非普通浏览器启动 | |
|
|
|
| 页面刷新后路由丢失(404) | Vue Router 改为 `createWebHashHistory()` 模式 | |
|
|
|
| 模型未加载或报错提示 | 增加 loading 控制,捕捉初始化异常 | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
------ |
|
|
|
|
|
|
|
## 八、未来规划(Sprint 2 预告) |
|
|
|
|
|
|
|
| 方向 | 说明 | |
|
|
|
| ----------------- | --------------------------------------------------- | |
|
|
|
| 多手势拓展 | 三指滚动、多指触发多功能、多手联合判断 | |
|
|
|
| 自定义 .task 模型 | 支持用户采集数据,自定义模型替换现有 MediaPipe 模型 | |
|
|
|
| 后端语音指令集成 | Vosk 模型识别语音,触发系统控制 | |
|
|
|
| 设置项管理 | 实现用户自定义快捷键、手势配置界面 | |