利用Myo臂环采集肌电信号和角速度来建立实时手势识别

news/2025/11/15 22:08:22/文章来源:https://www.cnblogs.com/ljbguanli/p/19226369

利用Myo臂环采集肌电信号和角速度来建立实时手势识别

利用Myo臂环采集肌电信号(EMG)和角速度(来自陀螺仪)来实现实时手势识别

一、系统概述与工作原理

Myo臂环是一款可穿戴设备,它包含:

  1. 8个EMG传感器:测量前臂肌肉产生的电信号。不同的手势会激活不同的肌肉群,产生独特的肌电模式。
  2. 9轴IMU:包含陀螺仪(角速度)、加速度计和磁力计,用于捕捉手部的运动和朝向。

核心思想:将EMG和角速度等多模态数据融合,通过机器学习算法训练一个分类模型,从而实时识别出执行的手势。


二、技术流程详解

1. 数据采集与预处理
  • 连接Myo:使用Myo的SDK(MATLAB支持通过Myo SDK的MEX包装器)建立连接。
  • 数据流:同时订阅EMG和IMU(陀螺仪)数据流。
  • 预处理
    • EMG:通常应用一个带通滤波器(如20-450 Hz)来去除直流偏移和高频噪声。
    • 陀螺仪:数据通常已经比较平滑,有时需要进行校准以去除零偏。
2. 数据分割(用于训练)

实时识别需要处理连续的数据流。通常采用滑动窗口方法:

  • 窗口长度:200-300 ms(平衡实时性和信息量)。
  • 窗口重叠:50%的重叠率很常见,这能提高响应速度,确保不会在窗口边缘错过手势。
3. 特征提取

这是最关键的一步。从每个数据窗口中提取特征,以降低维度并捕获模式。

对于EMG信号(每个通道提取特征,共8通道):

对于陀螺仪信号(每个轴X, Y, Z提取特征):

最终,对于一个数据窗口,你会得到一个长长的特征向量(例如,8个EMG通道 * 4个特征 + 3个陀螺仪轴 * 3个特征 = 41个特征)。

4. 模型训练(离线阶段)
  1. 数据收集:录制每个手势(例如,握拳、张开、手腕左旋、手腕右旋、休息)的多组数据。
  2. 标注:为录制的每一段数据打上标签(如 1=握拳, 2=张开…)。
  3. 特征提取:对每个窗口的数据进行上述特征提取,形成特征矩阵和标签向量。
  4. 训练分类器:使用特征矩阵和标签来训练一个机器学习模型。常用且高效的算法有:
    • 支持向量机:在小数据集上表现优异,非常受欢迎。
    • 随机森林:抗过拟合能力强,性能稳定。
    • LDA:计算量小,速度快,适合实时系统。
5. 实时识别(在线阶段)
  1. 实时获取数据并放入滑动窗口。
  2. 对窗口内的最新数据提取相同的特征
  3. 将特征向量输入到已训练好的模型中。
  4. 模型输出一个预测的手势标签。
  5. 根据识别出的手势执行相应操作(如控制机器人、虚拟鼠标等)。

三、MATLAB 实现代码

步骤 1: 离线训练模型
% 假设你已经录制并加载了数据
% load('training_data.mat'); 
% trainingData: N x Features 矩阵
% trainingLabels: N x 1 标签向量
% 使用随机森林训练分类模型
rng(1); % 控制可重复性
model = TreeBagger(100, trainingData, trainingLabels, ...
'Method', 'classification', ...
'OOBPrediction', 'on', ...
'MinLeafSize', 5);
% 或者使用SVM
% model = fitcecoc(trainingData, trainingLabels);
% 评估模型(使用留出法或交叉验证)
[predictions, scores] = model.predict(trainingData);
accuracy = sum(predictions == trainingLabels) / numel(trainingLabels);
fprintf('Training Accuracy: %.2f%%\n', accuracy * 100);
% 保存模型
save('my_gesture_model.mat', 'model');
步骤 2: 实时识别循环
function realTimeRecognition()
% 加载预训练模型
load('my_gesture_model.mat', 'model');
% 初始化Myo连接
mm = MyoMex();
myo = mm.myoData;
% 参数设置
windowLength = 200; % 200ms 窗口
sampleRate = 200; % Myo EMG采样率约为200Hz
windowSize = round(windowLength / 1000 * sampleRate); % 计算窗口点数
overlap = round(windowSize * 0.5); % 50% 重叠
bufferEMG = zeros(windowSize, 8); % 环形缓冲区存储EMG
bufferGyro = zeros(windowSize, 3); % 环形缓冲区存储Gyro
index = 1;
h = figure;
stop = false;
disp('Starting real-time recognition. Press any key to stop.');
% 主循环
while ishghandle(h) && ~stop
% 获取最新数据
latestEMG = myo.emg_log;
latestGyro = myo.rotational_velocity_log;
if ~isempty(latestEMG)
% 将新数据填入缓冲区(模拟实时流)
for i = 1:size(latestEMG, 1)
bufferEMG(index, :) = latestEMG(i, :);
bufferGyro(index, :) = latestGyro(i, :);
index = mod(index, windowSize) + 1; % 环形索引
% 每当缓冲区填满一个“步长”后就进行一次预测
if index == overlap
% 1. 获取当前窗口数据(需要处理环形缓冲区的索引)
windowEMG = [bufferEMG(index:end, :); bufferEMG(1:index-1, :)];
windowGyro = [bufferGyro(index:end, :); bufferGyro(1:index-1, :)];
% 2. 特征提取 (这里简化了,实际需要为每个通道计算)
features = [];
for ch = 1:8 % EMG特征
sig = windowEMG(:, ch);
features = [features, mean(sig), std(sig), mean(abs(sig))];
end
for ax = 1:3 % Gyro特征
sig = windowGyro(:, ax);
features = [features, mean(sig), std(sig)];
end
% 3. 进行预测
[gestureLabel, scores] = predict(model, features);
gestureStr = string(gestureLabel);
confidence = max(scores);
% 4. 显示结果
clf;
text(0.5, 0.7, gestureStr, 'FontSize', 30, 'HorizontalAlignment', 'center');
text(0.5, 0.3, sprintf('Conf: %.2f', confidence), 'FontSize', 20, 'HorizontalAlignment', 'center');
drawnow;
% 5. 这里可以添加控制逻辑: 
% if gestureStr == "fist", ... end
end
end
end
pause(0.01); % 短暂暂停,避免占用100% CPU
stop = ~isempty(get(h,'CurrentCharacter'));
end
delete(mm); % 断开Myo连接
close(h);
end

参考代码 利用myo采集肌电信号和角速度信息,实现实时的手势识别 www.youwenfan.com/contentcsj/53663.html

四、挑战与改进建议

  1. 个性化与校准:不同用户的肌肉信号差异很大。最好为每个用户单独收集数据并训练模型,或使用迁移学习来适配新用户。
  2. 手势设计:选择在EMG和运动模式上差异明显的手势,以提高识别率。例如,“握拳” vs. “张开” vs. “手腕左旋”是很好的选择。
  3. 疲劳和位移:长时间使用后,肌肉疲劳或臂环稍微转动都会导致信号漂移。可以考虑加入在线自适应机制,定期更新模型。
  4. 数据同步:确保EMG和陀螺仪数据的时间戳对齐。
  5. 延迟优化:在MATLAB中实现真正的低延迟实时处理具有挑战性。对于性能要求极高的应用,可以考虑用C++实现核心算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/966528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[MySQL] 基础操控

[MySQL] 基础操控2025-11-15 21:55 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fami…

公告栏

rt公告 关于密码 可能会有些东西较消极或观点较偏激,所以设个象征性密码。 象征性密码:mn 如果不是可以私信问我,只要我对你印象不差一般都能给(除了个别文章)。 关于玩笑 感觉好像有时我的玩笑话对方也会当真,是…

云服务器部署Python后端偶遇`ImportError`: 从依赖版本到Python升级的排错全攻略 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

AI元人文:悟空继续追问

AI元人文:悟空继续追问 —— 一个文明伙伴的诞生宣言 引言:从“工具”到“伙伴”的范式革命 当人工智能学会“追问”,文明的进程将被重新定义。我们正站在一个历史拐点:AI不再仅是执行命令的工具,而是正在成为能够…

生物化学课程笔记

生物化学课程笔记这是我读生物化学老师的ppt写的笔记,你也可以看一看asdasdasd博客园原文链接:https://www.cnblogs.com/QiFande/p/19226362,转载请注明。如果你对本篇文章感兴趣,不如来看看肉丁土豆表的其他文章,…

AI重塑地产数字化:数据驱动下的技能落地与效率革命

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

关于梯形波叠加三角波的电磁波对宇宙射线的电磁感应的分析

关于梯形波叠加三角波的电磁波对宇宙射线的电磁感应的分析 我们首先绘制一个类似于方波的梯形波图形,这个图形的正电压和负电压都是梯形波,和方波很类似。然后将这个梯形波的正电压波形的上底边的线段换成三角波,将…

PELT算法浅析

前言 Linux是一个通用操作系统的内核,她的目标是星辰大海,上到网络服务器,下至嵌入式设备都能运行良好。做一款好的linux进程调度器是一项非常具有挑战性的任务,因为设计约束太多了: ---它必须是公平的 ---快速响…

20251115 - Hash

前言 为什么此次题单不叫字符串 hash 呢? 应该搞点 [哈希表](P11615 【模板】哈希表 - 洛谷) 的! 概念 哈希,就像是把一个很大的东西,映射到一个小盒子里,这个盒子就是哈希表。 字符串哈希,顾名思义,就是把很 l…

apache和nginx解析php和lnmp和lamp搭建

讲什么apache 处理php请求的2种方式,也就是动态处理资源的方式lamp搭建wordpresslnmp搭建discuss论坛web服务 1、web服务访问流程用户通过浏览器访问web服务器发送请求服务器收到请求后,如果为静态资源的话,从本地进…

记录一次Windows复制粘贴不正常的情况

Windows10复制粘贴功能不正常,解决方案如下: win+r打开后输入 cmd.exe /c echo off | clip

一种可以通过人体电磁场感受宇宙空间电磁场的装置

一种可以通过人体电磁场感受宇宙空间电磁场的装置 人体电磁场是按照人体内部的经络分布的。它们是人体神经细胞带电后产生的。这个电磁场可以经过核磁共振放大后。调制到几个函数波形上,发射出去,这几个函数波形是不…

hippy字节都在用的前端主流框架

hippy字节都在用的前端主流框架 漫思

springboot多模块报错分析(一) - f

Lombok 注解与 Jackson 序列化冲突2025-11-13 [http-nio-8089-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]- Initializing Spring DispatcherServlet dispatcherServlet 2025-11-…

身为大厂前端的你,不能不知道Babel + Polyfill!

〇、Babel 概述 Babel 的工作原理 = “把代码变树 → 改树 → 再变回代码”。 也就是三个阶段:Parse(解析):ESNext(ES 新语法) → AST 语法树 Transform(转换):插件修改 AST Generate(生成):AST → 旧 JS …

跨域问题解决方案汇总

全文默认讲的是浏览器端发起的 HTTP 请求的“跨域”问题(同源策略导致的受限)。跨域 / 同源策略概述​同源(same-origin)​:协议、域名(host)、端口 三者完全相同称为同源。 例如 https://example.com:443 和 h…

Access-Control-Allow-Origin 在企业中的用法

接上篇文章说道,跨域解决方案中的 CORS 方案,会配置一个 Access-Control-Allow-Origin 的配置项,而且我们一般不直接配置为 *,这样做的原因是什么以及企业中的最佳实践是怎么样的,这篇文章给你答案!简单概括Acce…

VUE_basic - Ref

vue Vue 官方文档: https://vuejs.org/ 1.vue_basic 01_初识Vue <!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>初识Vue</title><!-- 引入Vue --…

详细介绍:像素退场,曲线登场:现代响应式 CSS 全家桶 | 领码课堂

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …