Human grasp(MYO手环开发项目)
Posted ErroMaker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Human grasp(MYO手环开发项目)相关的知识,希望对你有一定的参考价值。
linux平台基于python语言的MYO手环手势识别开发(一)
这是笔者在CSDN上发表的第一次文章也是值得纪念的日子,希望在这里和大家一起学习一起讨论一起进步!
文章目录
一、实现myo手环数据读取
1.引入库
这里我们先从github上下载作者sebastiankmiec发布的
PythonMyoLinux项目文件中的pymyolinux(myo核心模块)
以下是下载地址:
URL:https://github.com/sebastiankmiec/PythonMyoLinux/tree/master/pymyolinux
接着importMyoDongle模块
from pymyolinux.core.myo import MyoDongle
2.定义方法joint_event_handler
收集8个肌电传感器信号,4个4元数方向数据,3个加速度计值数据,3个陀螺仪数据(对应Myo上的EMG和IMU单元,并且整合为dic数据结构,代码如下:
def joint_event_handler(emg_list, orient_w, orient_x, orient_y, orient_z, accel_1, accel_2, accel_3, gyro_1, gyro_2,
gyro_3, sample_num):
MYOHW_ACCELEROMETER_SCALE = 2048.0
MYOHW_GYROSCOPE_SCALE = 16.0
MYOHW_ORIENTATION_SCALE = 16384.0
# CoreDataDic
myoDataDictionary = {'emg_1:': emg_list[0], 'emg_2': emg_list[1], 'emg_3': emg_list[2], 'emg_4': emg_list[3],
'emg_5': emg_list[4], 'emg_6': emg_list[5], 'emg_7': emg_list[6], 'emg_8': emg_list[7],
'orient_w': orient_w / MYOHW_ORIENTATION_SCALE, 'orient_x': orient_x / MYOHW_ORIENTATION_SCALE,
'orient_y': orient_y / MYOHW_ORIENTATION_SCALE, 'orient_z': orient_z / MYOHW_ORIENTATION_SCALE,
'accel_1': accel_1 / MYOHW_ACCELEROMETER_SCALE, 'accel_2': accel_2 / MYOHW_ACCELEROMETER_SCALE,
'accel_3': accel_3 / MYOHW_ACCELEROMETER_SCALE,
'gyro_1': gyro_1 / MYOHW_GYROSCOPE_SCALE, 'gyro_2': gyro_2 / MYOHW_GYROSCOPE_SCALE,
'gyro_3': gyro_3 / MYOHW_GYROSCOPE_SCALE
}
二、把收集的数据转化为csv格式
注:csv数据格式有利于之后机器学习用sklearn的数据处理分析,本来想用txt文件形式但是感觉不能很好的表达出数据样本特征
1.引入库
import os
import pandas
import pandas as pd
2.在方法joint_event_handler中添加代码
代码如下:
#covert to csv
# 实例化DataFrame对象(记得索引index=[0])
df=pd.DataFrame(myoDataDictionary,index=[0])
# 防止循环时标题头被重复写入(若文件还没创建标题头可写,否则header=False不可写)
if not os.path.exists('data.csv'):
df.to_csv('data.csv', encoding='utf_8_sig', mode='a',index_label=False)
else:
df.to_csv('data.csv', encoding='utf_8_sig', mode='a', header=False,index=True)
三、主方法实现蓝牙链接及测试数据收集情况
主方法主要用 MyoDongle()API实现终端对MYO手环的链接同步
代码如下:
if __name__ == '__main__':
device_1 = MyoDongle("/dev/ttyACM0")
device_1.clear_state()
myo_devices = device_1.discover_myo_devices()
if len(myo_devices) > 0:
device_1.connect(myo_devices[0])
else:
print("No devices found, exiting...")
exit()
device_1.enable_imu_readings()
device_1.enable_emg_readings()
device_1.add_joint_emg_imu_handler(joint_event_handler)
# device_1.scan_for_data_packets_conditional()
device_1.scan_for_data_packets(3)
好了让我们来看看运行情况:
注:若遇到端口/dev/ttyACM0’权限问题
raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyACM0: [Errno 13] Permission denied: '/dev/ttyACM0'
用以下代码解决:
sudo chmod 777 /dev/ttyACM0
但是这种方法只能一次使用,所以每次都要这样,暂时没什么好的方法解决,如果各位有好的办法欢迎留言!
四、未来规划
对收集到的csv文件针对握拳手势进行特征提取及数据处理
五、最后
写文章可能要压榨一些本来不多的课余时间,更新进度可能比较缓慢请大家原谅!这个项目是我在本科生期间加入校内实验室需要研究的项目,希望能在这些天里有不错的进展,给自己的校园生活添一点乐趣,各位共勉!
***更新(2021.9.22)
问题1.原来csv文件第一列检索都是0,其实应该可以删去但是语法一定要添加index[0]
改进办法:在主方法中加入全局变量index=0在joint_event_handler中加入global index,把index[0]改成index[index]进行累加
问题2.一次收集数据量少了些
改进方法:把主方法device_1.scan_for_data_packets(3)改成device_1.scan_for_data_packets(5),经过测试差不多每加1,样本多200列,现在一次性可以搜集1000个样本
以上是关于Human grasp(MYO手环开发项目)的主要内容,如果未能解决你的问题,请参考以下文章
小米手环7使用 Zeus + 表盘自定义工具 为小米手环7开发和安装小程序
案例分享——定位手环(日常看护社区智慧养老实时定位一键远程报警)