ESP 手势识别系统:Arduino 101/ADXL335 加速度计 + 机器学习实时识别动作
元件清单
| 方案 | 元件 | 数量 |
|---|---|---|
| 方案 A(内置加速度计) | Arduino 101 | 1 |
| – | – | |
| 方案 B(外挂加速度计) | Arduino UNO(或其他) | 1 |
| ADXL335 三轴模拟加速度计模块 | 1 | |
| 面包板 + 杜邦线 | 1 套 |
系统架构
ESP(Embedded Signal Processing) 是运行在电脑端的手势识别应用,基于 GRT(Gesture Recognition Toolkit) 的 DTW(动态时间规整) 算法。Arduino 仅负责采集加速度计数据(9600 波特率,制表符分隔,三轴),经 USB 串口发送给 ESP;ESP 实时匹配训练样本,识别出手势后通过串口回传标签(如 1\n)给 Arduino,同时也可通过 TCP(localhost:5204)推送给其他应用(Processing、游戏等)。
软件准备
- Arduino IDE + 对应板型支持
- ESP 手势识别应用(跨平台):
- macOS:
ESP-Gestures-Mac-20161028.zip - Windows:
ESP-Gestures-Win-20161028.zip(需 VC++ Redistributable Update 3) - Ubuntu:
ESP-Gestures-Ubuntu-20161028.tar.gz
- macOS:
- 示例手势文件:
ForehandBackhandServe.grt(网球正手/反手/发球)
操作步骤
- 接线:Arduino 101 免接线;UNO+ADXL335 按 X→A5, Y→A4, Z→A3 接模拟口,或插针直插模拟口并用代码配置供电引脚。
- 上传采集代码:两份代码分别适配 Arduino 101 内置传感器与 ADXL335,均以 9600 波特率输出三轴数据。
- 串口监视器/绘图器验证:观察三轴波形随动作变化,确认无乱码。
- 关闭串口工具,启动 ESP 应用,配置菜单选择对应串口。
- 校准:传感器 Z 轴朝上平放,按 1 记录“直立”;倒置平放,按 2 记录“倒立”。ESP 据此推算 0g/1g 对应数值。
- 训练样本采集:切换到 Training 标签(或按 T),按住数字键(1–9)做对应手势,每类建议 5–10 个高质量样本。样本应包含完整动作,避免多余静止段;可事后删减/修剪/重标记/重命名。
- 训练模型:按 t 训练,提示 “training successful”。实时做动作,ESP 绘图区将显示识别出的手势名。
- 参数调优:配置面板可调 variability(容差,越大越宽松)与 timeout(最小识别间隔,ms),改动后需重新训练。
- 集成到项目:Arduino 读串口收到标签即可触发相应动作(舵机、LED、蜂鸣器等)。
Arduino 代码要点
Arduino 101 内置加速度计版
#include <CurieIMU.h>
void setup() {
Serial.begin(9600);
CurieIMU.begin();
CurieIMU.setAccelerometerRange(2); // ±2g
}
void loop() {
int ax, ay, az;
CurieIMU.readAccelerometer(ax, ay, az);
Serial.print(ax); Serial.print('\t');
Serial.print(ay); Serial.print('\t');
Serial.println(az);
delay(20); // ~50 Hz
}
ADXL335 模拟输出版(X→A5, Y→A4, Z→A3)
const int xpin = A5, ypin = A4, zpin = A3;
void setup() { Serial.begin(9600); }
void loop() {
Serial.print(analogRead(xpin)); Serial.print('\t');
Serial.print(analogRead(ypin)); Serial.print('\t');
Serial.println(analogRead(zpin));
delay(20);
}
算法原理:DTW(动态时间规整)
DTW 通过在时间轴上拉伸/压缩实时信号,使其与各训练样本对齐,计算累积距离。距离小于阈值(由 variability 控制)则判定匹配。适合离散、时长可变的单次手势;不适用于连续流式动作分割。
扩展方向
- GRT 还提供 HMM、SVM、神经网络等分类器,可在 ESP 框架下切换算法。
- ESP GitHub 提供颜色识别、姿态检测、音频识别等示例,可移植到其他传感器。
- 结合 BLE/WiFi 模块,实现无线手势控制器。
注意事项
- 采样率固定 50 Hz(delay 20 ms),若改动需同步修改 ESP 端配置。
- 训练样本质量远比数量重要:动作幅度一致、起止干净、方向固定。
- 环境震动、手抖会干扰识别,必要时加机械减震或软件滤波。
- 本系统仅识别离散手势,不输出动作质量评分。
制造工艺
- 基于 Arduino 与 Python 的可靠 RFID 考勤系统
- 基于 Arduino、1Sheeld 与红外控制的万能安卓遥控器
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- 智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
- 基于Arduino UNO的精准频率与占空比测量
- Firmata + Xbox 手柄无线遥控 Arduino 小车:UWP 应用桥接方案
- Arduino 声纳实时测距与 Processing 可视化
- Bolt IoT + Arduino UNO 实现 6 路 LED 无级调光
- DIY 智能 Arduino 机械臂:主从控制与动作记忆教程
- 在 Arduino Due 上实现语音识别与语音合成 - BitVoicer Server 方案
- 通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
- Arduino 实时数字罗盘:HMC5883L + Processing 可视化教程