
动作捕捉手套是采集手部运动信息、实现AR/VR人机交互的有效载体。当前市面主流动态捕捉手套普遍造价高昂、集成功能冗余繁杂,面向日常民用及游戏操控场景时,多数附加功能并无实际应用价值。开发本低成本方案的初衷,是认为轻量化、低成本的人体动作指令采集工具,能够有效推动未来 AI 交互及 VR 穿戴设备的规模化普及,因此开展本次小型化低成本研发设计。

手指的运动可抽象为如图 2 所示的端点轨迹运动(或 “圆周运动模型”),各指尖在以掌部为圆心的运动范围内形成不同的空间位置分布,从而构成不同手势。手部关节虽具有多自由度特性,但其运动受骨骼结构约束,存在固定的运动行程与极限范围。因此,手势识别的本质可理解为对各手指运动信息(位置 / 姿态)的采集与解析。
结合以上特点:结构设计上需要考虑手指的伸和缩,手掌的正反识别,手部六个自由度方向的移动。
参考文章
“A Systematic Review of Hand Gesture Recognition: An Update From 2018 to 2024“
全面对比了视觉、传感器(IMU、电阻、柔性)以及混合方案在手势采集中的表现,特别讨论了传感器布局对精度的影响。
ResearchGate – Systematic Review of HGR
“Design of an Inertial-Sensor-Based Data Glove for Hand Function Evaluation“
详细讨论了如何利用 9轴 IMU 进行手指运动学解算,以及传感器融合在减少误差方面的作用。文中对比了机械传感器(电位器类)与 IMU 的优缺点。
PMC5982580 (NCBI)。
“Static Hand Gesture Recognition Using a Low-Cost Data Glove and Bayesian Neural Network“
该研究展示了如何使用低成本的弯曲传感器(基于电阻变化原理,类似于电位器的应用逻辑)配合 Arduino 实现手势识别,并利用贝叶斯神经网络提高识别准确度。
ResearchGate – Low-Cost Data Glove Study
“Simulation-driven design of smart gloves for gesture recognition”
讨论了如何通过模拟传感器数据(包括加速度、角速度等)来优化传感器在手套上的布局,是目前最前沿的工程化设计综述之一。
PMC11211502 (Nature-Scientific Reports)
参考了Lucas的资料思路基本形成:
采用电位器读取手指部位移动数据; (电位器*5 约 15元人民币)
采用IMU:MPU-9250读取手部位移翻转信息; (IMU芯片*1约 60元人民币)
采用3D打印机对需要的机械结构进行打样结构预留胶水空间粘接安装。 (打印机约2000找朋友借0元人民币)
结构设计:
1;收线器:如图3.





收线器核心由蓝色壳体、内置涡旋旋转弹簧与白色绕线传动结构配合组成;
涡旋弹簧一端固定在蓝色壳体内部,另一端与白色传动结构相连,实现弹性势能的蓄积与释放如 图3.5;
白色结构同步连接漆包线一端,将弹簧的扭力通过结构传递至线材;
拉线时:外力拉动漆包线带动白色结构旋转,扭转涡旋弹簧蓄积弹性势能;
收线时:涡旋弹簧释放储存的弹性势能,反向驱动白色结构回转,自动卷收漆包线,实现拉线伸出、自动回卷的功能。
2;指套结构:


指环与指套部位均开设通线孔,用以限位约束漆包线材,防止线材走位、偏移松脱;
指套结构连接漆包线材的另一端,与收线器白色传动结构形成两端力传递闭环,配合内置旋转弹簧完成弹性势能的攒积与释放,实现线材顺畅拉伸与自动回缩。
代码:
// I2Cdev 设备库代码采用 MIT 开源协议
include "Wire.h"
include "I2Cdev.h"
include "MPU6050.h"
// ====================== MPU6050 配置 ======================
MPU6050 accelgyro; // MPU6050 实例化对象
int16_t ax, ay, az; // 加速度计原始数据 (X, Y, Z)
int16_t gx, gy, gz; // 陀螺仪原始数据 (X, Y, Z)
define LED_PIN 2 // 板载指示灯引脚 (通常 ESP32 为 GPIO2)
// ====================== 4个电位器引脚配置 ======================
define POT1_PIN 34 // 电位器 1 连接 GPIO34
define POT2_PIN 35 // 电位器 2 连接 GPIO35
define POT3_PIN 32 // 电位器 3 连接 GPIO32
define POT4_PIN 33 // 电位器 4 连接 GPIO33
void setup() {
// 初始化 I2C 通信,设置 SDA=21, SCL=22
Wire.begin(21, 22);
// 初始化串口通信,波特率 115200
Serial.begin(115200);
while (!Serial); // 等待串口窗口打开
Serial.println("\n=== ESP32 多传感器系统启动 ===");
// 初始化 MPU6050 传感器
accelgyro.initialize();
if (accelgyro.testConnection()) {
Serial.println("✅ MPU6050 连接成功");
} else {
Serial.println("❌ MPU6050 连接失败,请检查接线");
}
// 配置 LED 和 ADC 分辨率
pinMode(LED_PIN, OUTPUT);
// 设置 ESP32 ADC 分辨率为 12位 (取值范围 0-4095)
analogReadResolution(12);
Serial.println("✅ 模拟引脚 D32, D33, D34, D35 初始化完成");
Serial.println("====================================\n");
}
void loop() {
// ---------- 1. 读取并处理 MPU6050 数据 ----------
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
Serial.print("传感器 -> 加速度: ");
Serial.print(ax); Serial.print(", ");
Serial.print(ay); Serial.print(", ");
Serial.print(az);
Serial.print(" | 陀螺仪: ");
Serial.print(gx); Serial.print(", ");
Serial.print(gy); Serial.print(", ");
Serial.println(gz);
// ---------- 2. 读取电位器数据 ----------
// 在连续读取 ADC 之间加入微小延迟,有助于减少引脚间的信号干扰 (串扰)
int pot1 = analogRead(POT1_PIN); delay(2);
int pot2 = analogRead(POT2_PIN); delay(2);
int pot3 = analogRead(POT3_PIN); delay(2);
int pot4 = analogRead(POT4_PIN); delay(2);
// 格式化输出 4 路电位器的原始 ADC 值
Serial.printf("电位器 -> P1(D34): %d | P2(D35): %d | P3(D32): %d | P4(D33): %d\n",
pot1, pot2, pot3, pot4);
// ---------- 3. 视觉反馈与状态更新 ----------
// 每次循环翻转 LED 状态,作为程序运行的心跳灯
static bool blinkState = false;
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);
Serial.println("------------------------------------");
// 设置采样间隔为 200ms
delay(200);
}
效果展示:
使用open glove设定输入参数可以实现如下视频效果: