李建亮,王從慶,展文豪,曲思霖,張 民
(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種手勢解碼算法的驗證,在以后的研究中可以進行更多種手勢解碼算法的研究,讓航天員能夠使用更加豐富的手勢操作靈巧手。