linux平台基于python语言的MYO手环手势识别开发(一)

MYO手环基本数据读取及csv文件保存

这是笔者在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个样本

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值