李建亮,王从庆,展文豪,曲思霖,张 民
(1.南京航空航天大学 自动化学院,南京 210016;2.中国航天员科研训练中心 人因工程国防科技重点实验室,北京 100094)
近年来,人类对外太空探索日渐深入,但是空间中位置恶劣的环境给宇航员带来了严峻的威胁[1],很多作业人类无法直接进行。鉴于此,操控灵巧手辅助其完成任务是最有效的手段之一[2]。
表面肌电信号(surface electromyography,sEMG)是指通过电子仪器设备检测到人体肌肉的静止或者收缩时的电信号,在生物医学、生物机械等领域有很好的应用价值[3-5]。主要分为侵入式电极和非侵入式两类,侵入式电极需要将电极刺入肌肉组织获取肌肉的电信号,这种方法获取的信号干扰小,但是会给用户带来严重的损伤。非侵入式方法主要是通过贴片电极的方式采集表面肌电信号,这种方式对用户很友好,因此非常适合作为控制智能仿真灵巧手的输入信号[6]。
在利用sEMG进行人机交互方面,国内外很多科研单位进行了探索。著名的有加拿大的Thalmic Labs公司设计了MYO臂环,读取手臂肌群的肌电信号,实现了与无人机的人机交互[7]。上海交通大学和复旦大学合作进行了“神经的运动控制与控制信息源的研究”,通过提取神经信息来完成人机交互[8]。南京航空航天大学谢作述等人设计了一种16路肌电信号采集的神经接口,能够稳定地采集含有丰富运动信息的肌电信号[9]。利用肌电信号解码手势实现空间机器人的人机交互,摆脱了对肢体动作的要求,突破了依赖航天员操作鼠标键盘、操作杆等传统手动控制的局限性,有很大的应用价值。
基于肌电信号解码手势实现人机交互系统,设计一款用户体验良好的人机交互软件是必要的。因此,本文针对16路肌电信号采集神经接口设计了一款人机交互软件,包括肌电信号的显示,手势的实时解码,仿真灵巧手的控制等模块。
本文搭建的基于肌电信号解码手势控制仿真灵巧手系统总体结构如图1所示,分为下位机肌电信号采集和上位机交互软件两个部分。
图1 肌电信号解码与控制系统
下位机肌电信号采集模块实现了采集可靠的16路手臂动作电位,并将其发送至串口。首先是通过16路肌电信号手环上的电极采集原始肌电信号,然后经过滤波放大电路等作预处理[9],最后经过DSP28335将模拟信号转化成数字信号,在进行归一化处理后,发送至串口。归一化处理公式为:
(1)
其中:xmin、xmax分别是肌电信号样本中的最小值和最大值,x为转换前的肌电信号值,a为归一化后的增益,这里取256,y为转换后的肌电信号值。
针对基于肌电信号解码手势控制的仿真灵巧手系统,上位机人机交互软件需要实现以下几个功能:
1)实时接收DSP向串口发送的数据,实现肌电信号的数据可视化。当出现工频干扰、电池电量不足、参考电极未接触良好等外在不良因素,可以通过可视化界面可以高效定位错误原因。
2)对肌电信号进行实时解码。本文训练了基于支持向量机(SVM)的解码模型,设计了一种实时解码算法,可以将输入的肌电信号实时解码,转化成手势控制信号输出。此模块易于扩展其它解码模型,可扩展性强。
3)仿真灵巧手控制。本文通过Unity3d搭建了一个仿真灵巧手,可以自由调节手部关节的弯曲角度,模拟空间机械臂灵巧手,实现人机交互。
人机交互软件程序流程图如图2所示。首先进行界面的初始化,然后将信号与槽函数进行绑定,之后初始化串口,获取当前开启的所有串口号,并添加到下拉菜单中,接着初始化状态显示栏,最后运行主窗口的显示。当点击打开串口时,将会开启串读取线程,读取串口读取到的数据,并显示在窗体中。当点击链接动画按钮时,将会启动仿真灵巧手,此时等待接收控制信号。当点击解码按钮时,将会开启实时解码子进程,将肌电信号解码成手势发出控制信号。此时Unity3D仿真灵巧手接收到控制信号,手指关节将会转动,做出相应的手势。
图2 上位机软件程序流程图
软件设计中首先用到的技术是从串口实时读取数据[10],本文在串口功能实现模块和实时解码模块都用到了这个技术。在Qt5及以上版本中提供了QSerialPort模块,这里主要使用了其中的QSerialPort类和QSerialPortInfo类,前者提供了对串口的操作,后者提供了对串口信息的获取。首先,必须在项目.pro文件中添加QT+=serialport,实现支持串口功能。然后通过遍历,将所需要的串口添加到combox中,之后打开串口,设置波特率、数据位、校验位、停止位等,就可以通过read()和write()函数进行数据的读写。
仿真灵巧手控制模块实现了将肌电信号解码出的手势用于控制仿灵巧手。本文使用的基于Unity3D的灵巧手模型是专门为WISEGLOVE5数据手套开发的,每个手指具有3个自由度,有较高的刷新率,适用于各类实时仿真。本文在此基础上通过设置每个手指关节的旋转角度定义了3种手势,即石头、剪刀和布,便可以满足本文的仿真控制需求,仿真灵巧手的3种手势如图3所示。
图3 仿真灵巧手的3种手势
实时接收控制信号是通过UDP协议实现的,程序在刷新过程中一直在等待接收控制指令。当点击运行仿真按钮时,使用Qt中的Process类打开一个shell进程,在此shell中绑定了开启Unity3D的仿真灵巧手3D模型的启动。
采集到的肌电信号中包含了大量的手势信息,训练肌电信号解码模型模块使用了支持向量机(SVM)实现手势分类。SVM是一种基于统计学习理论的机器学习方法,肌电信号手势识别方面可以获得很好的效果[11]。其基本思想是寻找一个最佳判别超平面,使得其到不同类别的样本点的边界距离都能达到最大。具有学习能力强,训练时间短,设置参数少等优点。本文使用的是线性支持向量机,其分类超平面为:
w*·x+b*=0
(2)
决策函数为:
f(x)=sign(w*·x+b*)
(3)
其学习的优化问题为:
s.t.yi(wi+b)≥1-ξi;ξi≥0;i=1,2,…,N
(4)
训练好模型后,针对实时解码功能,本文设计了一种基于标签匹配的实时解码算法。首先将串口读到的数据进行预处理,串口数据具有17路,其中16路为肌电信号,一路为标签位并设置为255,通过标签位判别数据的完整性。根据经验,当采集1 700个数据时,进行一次手势识别,同时保证了实时性和准确性。同时将读取到的部分数据、识别的结果通过UDP协议发出。程序流程图如图4所示。当点击实时解码按钮时,同样使用Qt中的Process类打开一个shell进程,此shell种绑定了执行解码手势的代码。实时解码程序流程图如图4所示。
图4 实时解码程序流程图
信号与槽机制是Qt的核心机制之一。信号(Signal)是指在特定情况下被发射的事件,槽(Slot)是指对信号相应的函数,它们的关联是通过connect()函数实现的。使用信号与槽机制必须在类的定义中声明宏定义Q_OBJECT,此时元对象编译器moc在对此类进行编译时,会产生包含该类的元对象代码,其中元对象包含了全部信号与槽的名字以及指向这些函数的指针。本文设计的上位机软件充分地利用了信号与槽机制的便利,实现了高效开发。
本文设计的人机交互软件结合了多线程技术与多进程技术[12],开启了两个独立的进程,分别来启动仿真控制和实时手势解码,大大提高了主进程的效率。另外在接收串口数据和接收UDP协议发送的数据时,开启了独立的线程,可以实现在用户主界面不冻结的情况下执行接收串口数据这项耗时的工作。Qt中提供了的QThread模块和QProcess模块,可以很方便地实现多线程与多进程。
本文设计的上位机软件使用了基于UDP协议的网络通信[13]。Qt中使用QtNetwork模块来实现网络编程,提供了一层统一的套接字抽象用于编写不同层次的网络编程。QTcpSocket类和QUdpSocket类分别用来实现TCP通信和UDP通信。TCP是一种可靠的、面向连接、面向数据流的传输协议,非常适合数据的连续传输。而UDP协议是一个轻量级的、面向数据报的、无连接的协议,适用于大多为短信息或者相应需求高等情况。本文设计的上位机软件中实时解码模块需要向软件界面发送识别结果,向仿真控制模块发送控制指令,由于对实时性要求高且数据都为短消息,因此都采用UDP协议进行设计。由于是本机通信,IP地址都设为本机回环地址127.0.0.1即可,端口号分别设置为6 666、7 777。
本文设计的上位机软件是在台式机上开发的,系统为Ubuntu18.04发行版。安装的环境有Qt5.9.9、Unity2019.4.9f1、pycharm2020.2.1等。
实验机为一台戴尔笔记本电脑,也装了Ubuntu18.04发行版,不需要Qt和Unity环境。将在开发机上设计的上位机软件打包,拷贝到实验机上,即可使用。
下位机硬件部分包括16路肌电信号采集手环、滤波装置、DSP28335数字信号处理器等。
本文采集了十个人的3种手势的肌电信号,采样率为500 Hz,则波特率设为85 000。每1 700个数据设置一个标签,作为一个样本。每种手势采集3 000个样本。采集到的数据三分之二作为训练集,剩下作为测试集。
根据经验,设置支持向量机的惩罚因子为1e-4,平均训练时间为0.065 s,模型3种手势识别率达到98%以上。
首先连接好DSP28335相关电路,然后将程序下载到芯片中,通过数据线将DSP28335与上位机笔记本相连。测试者处于放松状态时,下位机实物图与结构原理图如图5所示。
图5 下位机肌电信号采集系统
打开本文设计的上位机软件,将自动检测到当前使用的串口,并将串口名填充在设置中,设置波特率为85 000,校验位为None,数据位为8,停止位为1,以16进制显示,然后点击打开串口,成功接收到串口的数据,如图6所示。
图6 上位机接收串口数据
可以看出串口数据正常,可以进行下面的解码控制模块。为了提高系统性能与解码效率,串口显示将关闭,点击链接动画,打开仿真灵巧手子进程,等待接收控制指令。接下来点击解码按钮,启动解码子进程,并向仿真灵巧手控制子进程发送控制信号。仿真子进程接收到控制信号后,将会立刻执行相应的手势,实时结果如图7所示。
图7 3种手势解码结果
实时解码手势并控制仿真灵巧手平均延迟为200 ms,能够满足大部分应用场景需求。同时,解码结果将会在显示窗口实时显示,此时界面如图8所示。
图8 上位机实时解码与控制界面
测试结果表明,本文设计的手势解码软件实时对3种“石头”、“剪刀”、“布”3种手势的识别有很好的结果,实现了基于肌电信号的稳定可靠识别与控制。
综上,本文设计的用于肌电信号神经接口的上位机软件操作简单、功能齐全,在准确性和实时性上都能满足基于表面肌电信号解码与控制系统的需求,不仅保证了系统的实用性,而且有着良好的人机界面,提升了用户体验。
本文设计了一款上位机人机交互软件,包括接收并显示串口数据、手势实时解码、仿真灵巧手控制3个模块,实现了基于肌电信号解码手势以及仿真灵巧手的准确、实时控制。但侧重于基于人机交互软件的实现,进行了3种手势解码算法的验证,在以后的研究中可以进行更多种手势解码算法的研究,让航天员能够使用更加丰富的手势操作灵巧手。