sp0663/heterogeneous_hand_gesture_control_system
GitHub: sp0663/heterogeneous_hand_gesture_control_system
基于异构计算架构的手势识别系统,利用NVIDIA Jetson Nano进行关键点检测,FPGA实现低延迟规则分类。
Stars: 1 | Forks: 0
# 异构手势控制系统
一个基于异构计算架构构建的实时手势识别系统,结合使用 **NVIDIA Jetson Nano** 进行关键点检测,以及 **FPGA** 实现低延迟、基于规则的手势分类。
## 概述
本项目将手势识别流水线拆分到两个处理器上,以发挥各自的优势:
- **Jetson Nano** — 在其 GPU/CPU 上运行基于神经网络的手部关键点检测器(例如 MediaPipe),从相机帧中提取 21 个 3D 关键点。
- **FPGA** — 通过 UART 接收关键点坐标,并在硬件中应用用 Verilog 实现的定制规则分类引擎来识别手势。
这种异构方法在保持计算密集型机器学习推理在功能强大的主机处理器上的同时,实现了确定性、低延迟的分类。
## 系统架构
```
┌─────────────────────────────┐ UART ┌──────────────────────────────────────┐
Jetson Nano ──────────────────▶ FPGA
Camera → MediaPipe 21 landmarks (x,y) UART RX → Landmark Storage
Hand Landmark Detection → Feature Extraction
◀──────────────── → Rule-Based Classifier
Receives gesture ID gesture_id (4-bit) → UART TX
└─────────────────────────────┘ └──────────────────────────────────────┘
```
## FPGA 流水线(Verilog 模块)
FPGA 设计被组织为一个顺序处理流水线:
| 模块 | 文件 | 描述 |
|---|---|---|
| **UART 接收** | `uart_rx.v` | 低级串行接收器 |
| **波特率生成器** | `baud_generator.v` | UART 定时时钟分频器 |
| **关键点存储** | `landmark_storage.v` | 缓冲全部 21 个 (x, y) 坐标,直到一帧数据准备就绪 |
| **关键点距离** | `landmark_distance.v` | 计算关键点之间的欧几里得距离 |
| **角度计算器** | `angle_calculator.v` | 计算关键点点三元组之间的关节角度 |
| **特征提取器** | `feature_extractor.v` | 将距离与角度聚合成特征向量 |
| **手势分类器** | `gesture_classifier.v` | 应用基于规则的逻辑将特征映射到手势 ID |
| **UART 发送** | `uart_tx.v` | 低级串行发送器 |
| **顶层模块** | `gesture_system_top.v` | 将所有模块连接在一起 |
### 数据流
```
uart_rx → frame_sync / packet_formatter
→ landmark_storage (buffers 21 landmarks)
→ feature_extractor
├── landmark_distance (inter-keypoint distances)
└── angle_calculator (joint angles)
→ gesture_classifier (rule-based decision)
→ output_interface → uart_tx
```
## 通信协议
关键点数据从 Jetson Nano 通过 **UART** 流式传输到 FPGA。每个数据包编码一个关键点 ID(0–20)以及其 x 和 y 坐标。在接收到全部 21 个关键点之后,FPGA 断言 `frame_ready` 并开始分类。
分类后的手势 ID(4 位)通过第二条 UART 线路发送回 Jetson Nano。
## 手势分类
分类是 **基于规则** 的 —— FPGA 上不运行神经网络。相反,分类器评估提取特征上的几何条件:
- **手指伸展** — 通过比较每根手指上的关节角度来确定
- **关键点间距离** — 例如指尖到手掌的距离,用于区分张开手与闭合手状态
- **相对位置** — 例如拇指相对于食指的位置,用于识别捏合等手势
这种方法在最小化 FPGA 资源占用的同时,提供了具有确定性时钟周期延迟的分类。
## 硬件要求
| 组件 | 详情 |
|---|---|
| 主机处理器 | NVIDIA Jetson Nano |
| FPGA | 任何 Verilog 兼容的 FPGA(例如 Xilinx、Altera/Intel) |
| 相机 | 连接到 Jetson Nano 的 USB 或 CSI 相机 |
| 接口 | UART(3.3V 逻辑 — 如需要,请检查电平转换) |
## 软件要求(Jetson Nano)
- Python 3.x
- [MediaPipe](https://mediapipe.dev/) — 手部关键点检测
- OpenCV — 相机捕获
- `pyserial` — UART 通信
## 快速开始
### 1. 综合 FPGA 设计
将所有 `.v` 文件导入你的 FPGA 工具链(Vivado、Quartus 等),并将 `gesture_system_top.v` 设为顶层模块。配置 `baud_generator.v` 中的波特率以匹配你的 UART 设置。
### 2. 设置 Jetson Nano
安装依赖项:
```
pip install mediapipe opencv-python pyserial
```
将 Jetson 的 UART TX/RX 引脚分别连接到 FPGA 的 RX/TX 引脚。
### 3. 运行关键点流
在 Jetson 上运行你的关键点检测脚本。对于每一帧,将 21 个关键点 (x, y) 对序列化,并使用 `frame_sync.v` 期望的数据包格式通过 UART 发送到 FPGA。
### 4. 读取手势输出
FPGA 将在每帧分类完成后通过 UART 返回一个 4 位手势 ID。在 Jetson 端应用程序中读取并处理该值。
## 仓库结构
```
heterogeneous_hand_gesture_control_system/
├── gesture_system_top.v # Top-level module
├── uart_rx.v # UART receiver
├── uart_tx.v # UART transmitter
├── baud_generator.v # Baud rate clock divider
├── landmark_storage.v # Landmark frame buffer
├── landmark_distance.v # Distance computation
├── angle_calculator.v # Angle computation
├── feature_extractor.v # Feature aggregation
└── gesture_classifier.v # Rule-based classifier
```
## 设计原理
**为何在 Jetson + FPGA 之间拆分?**
关键点检测的神经网络推理对 GPU 友好,且在开发过程中频繁变更 — 这非常适合 Jetson。而基于关键点的几何关系进行分类是固定、低延迟且计算简单的操作 — 非常适合在 FPGA 硬件中实现。
**为何在 FPGA 上使用基于规则的分类?**
基于规则的方法避免了在 RTL 中实现神经网络推理引擎的成本。对于定义明确的手势词汇,基于手部关键点位置的几何规则出人意料地有效,并且以确定性的时钟周期运行。
## 合作者
* **Sri Prahlad Mukunthan**
* **Rushil Jain**
* **Shresh Parti**
标签:3D关键点, FPGA, Jetson Nano, MediaPipe, NVIDIA Jetson, TCP/UDP协议, UART通信, Verilog, 云计算, 低延迟, 多处理器协同, 实时识别, 嵌入式AI, 异构计算, 手 landmark 检测, 手势控制, 手势识别, 特征提取, 硬件加速, 自定义分类, 规则引擎, 边缘计算, 逆向工具