陳 亞,張栗銘,張雪峰,李歡歡,寇海波
(北京石油化工學院機械工程學院,北京 102617)
隨著科技的不斷發(fā)展,機器人被廣泛地運用在工業(yè)、醫(yī)療以及軍事等領域[1]。讓各種機器聽懂人類的語言并根據(jù)獲得的信息完成相應的任務,可以使人的雙手從控制機器人工作中解脫出來,從而大幅提高工作效率[2]。語音識別技術(shù)的研究目的就是讓機器“聽懂”人類的語言,使機器人能夠更好地為人類服務[3]。目前對特定人語音孤立詞識別的主要方法包括動態(tài)時間規(guī)整(DTW)、矢量量化(DQ)和隱馬爾可夫模型(HMM)等[4]。Microsoft公司的Speech SDK語音開發(fā)包就是以HMM為基礎建立并提供有語音應用程序編程接口SAPI,是構(gòu)建語音識別平臺的基礎,能夠使語音技術(shù)與機器人控制系統(tǒng)有機結(jié)合。使用Speech SDK語音開發(fā)包能夠縮短開發(fā)周期,方便進行二次開發(fā)[5]。
筆者采用Speech SDK語音開發(fā)包構(gòu)建雙驅(qū)雙向AGV的語音識別開發(fā)平臺,在基于平板電腦及其外圍模塊的控制方式基礎上增加語音識別功能,在完成語音的準確識別后,驅(qū)動雙驅(qū)雙向AGV實現(xiàn)前進、后退、停止、左轉(zhuǎn)、右轉(zhuǎn)等一系列動作。該系統(tǒng)既能保證雙驅(qū)雙向AGV穩(wěn)定可靠地運行,又能實現(xiàn)對雙驅(qū)雙向AGV實時的語音控制,豐富了人機交互方式,幫助企業(yè)提高了生產(chǎn)效率[6]。
以雙驅(qū)雙向AGV為控制對象,采用PMAC (programmable multi-axes controller)運動控制卡作為控制器,并基于Speech SDK語音開發(fā)包構(gòu)建具有語音識別功能的雙驅(qū)雙向AGV控制系統(tǒng),該系統(tǒng)結(jié)構(gòu)如圖1所示。
雙驅(qū)雙向AGV控制系統(tǒng)主要由2部分組成:上位機(工業(yè)平板電腦)和下位機(PMAC運動控制卡),共同構(gòu)成開放式控制系統(tǒng)。其中上位機為工業(yè)平板電腦,選用對微軟語音開發(fā)包兼容性好、安全性高、多任務處理穩(wěn)定可靠的Window XP操作系統(tǒng),該操作系統(tǒng)支持麥克風作為外設對語音輸入進行數(shù)據(jù)采集,判斷并識別語音,激活響應函數(shù),控制雙驅(qū)雙向AGV的運動,同時處理其他傳感器信息實現(xiàn)對AGV的實時導航糾偏控制。下位機為PMAC運動控制卡,主要負責實時采集外圍傳感器信號,并將數(shù)據(jù)通過網(wǎng)口送入上位機,實時處理上位機發(fā)出的指令,驅(qū)動電機完成相應動作。筆者采用工業(yè)平板電腦+PMAC運動控制卡作為雙驅(qū)雙向AGV的控制系統(tǒng),不僅結(jié)構(gòu)簡單、開發(fā)周期短、穩(wěn)定性好,而且可擴展性強,具有對運動實時控制的能力。
用戶通過麥克風輸入語音指令,上位機接收用戶語音信號,提取語音命令,與語音模板中的信息匹配,若匹配成功,則執(zhí)行響應函數(shù),創(chuàng)建新線程并給下位機發(fā)送運動指令,實現(xiàn)對雙驅(qū)雙向AGV的運動控制,運動結(jié)束,則關(guān)閉線程;若匹配失敗,則繼續(xù)匹配。下位機接收上位機的運動指令,并根據(jù)上位機對磁導航傳感器的處理信息,驅(qū)動直流無刷電機差速運轉(zhuǎn),實現(xiàn)對雙驅(qū)雙向AGV的運動控制。
運動學模型的建立是實現(xiàn)對AGV語音控制的基礎。雙驅(qū)雙向AGV通過非接觸式的磁條導引方式沿著預定路線循跡行走,雙驅(qū)雙向AGV的運動學模型如圖2所示。通過實時調(diào)節(jié)前后驅(qū)動模塊左右驅(qū)動輪A、B、C、D的速度,利用差速糾偏原理協(xié)調(diào)控制驅(qū)動電機,實現(xiàn)雙驅(qū)雙向AGV沿預定軌跡行駛的運動控制。
假定A和B為第1個驅(qū)動模塊左右輪,運動速度分別為Va和Vb,C和D為第2個驅(qū)動模塊左右輪,運動速度分別為Vc和Vd,2個驅(qū)動模塊間距為S,2個驅(qū)動輪間距為L,驅(qū)動輪半徑為R。A輪和B輪中點的速度為Vo1,C輪和D輪之間的中點的速度為Vo2。假定整個AGV是一個剛體在平面內(nèi)運動,AGV 2個驅(qū)動模塊左右各輪在平面內(nèi)只做純滾動,無滑動情況出現(xiàn)。
根據(jù)不同的運動路線,雙驅(qū)雙向AGV的運動可分為直線運動和轉(zhuǎn)彎運動。當雙驅(qū)雙向AGV沿著直線運動時,2個驅(qū)動模塊的4個驅(qū)動輪的速度相等。AGV沿著軌跡在運動的過程中不可避免的會產(chǎn)生一定的偏差,當AGV運動發(fā)生偏差時,根據(jù)磁導航傳感器采集到的位置信息確定AGV偏離磁條中心的距離,通過糾偏算法,調(diào)節(jié)一側(cè)驅(qū)動輪的速度下降,另一側(cè)驅(qū)動輪的速度維持不變,利用差速原理實時調(diào)整兩驅(qū)動模塊左右驅(qū)動輪速度,控制AGV保持直線運動。
當AGV進入彎道時,轉(zhuǎn)彎過程可以分為3個階段,如圖3所示。第1階段,第1個驅(qū)動模塊進入彎道,開始轉(zhuǎn)彎,第2個驅(qū)動模塊仍沿直線軌跡運動;第2階段,2個驅(qū)動模塊都進入彎道,同時轉(zhuǎn)彎;第3階段,第1個驅(qū)動模塊已經(jīng)完成轉(zhuǎn)彎,開始沿直線軌跡運動,第2個驅(qū)動模塊仍在轉(zhuǎn)彎。
通過分析計算[7],得到在這3個階段4個驅(qū)動輪的瞬時速度關(guān)系為:
(1)第1階段:
其中:R為磁條鋪設半徑;θ為第1個驅(qū)動模塊轉(zhuǎn)過的角度。
(2)第2階段:
Va=Vc, Vb=Vd
(3)第3階段:
其中:σ為第2個驅(qū)動模塊轉(zhuǎn)過的角度。
通過分析4個驅(qū)動輪在轉(zhuǎn)彎不同階段的瞬時速度關(guān)系,當接收到轉(zhuǎn)彎的語音指令后,控制驅(qū)動輪的運動速度繼而實現(xiàn)對雙驅(qū)雙向AGV的轉(zhuǎn)彎運動。
基于SAPI的雙驅(qū)雙向AGV軟件控制流程如圖4所示。首先系統(tǒng)進行語音識別模塊初始化,SAPI提供了完善的COM接口,根據(jù)COM規(guī)范的要求,首先調(diào)用CoInitializeEx函數(shù)對COM庫進行初始化。當進程不再使用COM庫函數(shù)時,必須調(diào)用CoUninitializeEx函數(shù)釋放系統(tǒng)資源[8]。然后初始化語音識別的各接口,完成識別引擎、識別上下文接口的創(chuàng)建,并設置識別消息和感興趣的事件,最后對識別的語音內(nèi)容建立語法規(guī)則,完成語音識別平臺的構(gòu)建。用戶通過麥克風輸入語音指令,進程對識別的語音進行匹配,如果匹配成功,則根據(jù)識別的語音內(nèi)容進行消息響應,從而驅(qū)動AGV執(zhí)行相應的動作;如果匹配失敗,則繼續(xù)進行語音識別并匹配。
微軟的SDK提供有語音應用程序編程接口SAPI(Speech Application Programming Interface)、語音聽寫引擎TTS(Text To Speech)以及連續(xù)語音識別引擎MCSR (Microsoft Continuous Speech Recognition)[9]。SAPI是基于COM技術(shù)實現(xiàn)的組件編程接口,封裝了操作系統(tǒng)底層硬件,提供具有高度適應性的直接語音管理、訓練向?qū)Ч芾?、資源、語音識別SR(Speech Recognition)管理等,所以,語音識別SAPI的調(diào)用符合COM規(guī)范。SAPI層、應用程序接口API層和設備驅(qū)動接口DDI(DeepSpar Disk Imager)層三者之間的結(jié)構(gòu)圖如圖5所示。
應用程序是通過SAPI與API(Application Programming Interface)層之間進行交互,語音引擎是通過SAPI與DDI(DeepSpar Disk Imager)層進行通信[10]。利用接口函數(shù),屏蔽了底層驅(qū)動與識別算法的開發(fā),大大簡化了語音開發(fā)的難度。根據(jù)開發(fā)的XML(Extensible Markup Language)文件確定需要匹配的詞匯,開發(fā)者可以根據(jù)需要定義詞匯,大大降低詞匯檢索量,提高識別速度。
利用SAPI開發(fā)語音應用程序,將程序嵌入到機器人運動控制系統(tǒng)中,通過用戶的語音輸入使雙驅(qū)雙向AGV接受指令,實現(xiàn)機器人前進、后退、轉(zhuǎn)向以及停止等動作,具體步驟如下。
(1)創(chuàng)建XML文件(CmdCtrl.xml),定義需要機器人識別的命令。
前進
后退
左轉(zhuǎn)
右轉(zhuǎn)
停止
(2)語音識別系統(tǒng)初始化。語音識別系統(tǒng)初始化包含多個步驟,初始化模塊流程圖如圖6所示。
通過CoInitializeEx函數(shù)初始化COM接口,在程序的頭文件中定義建立語音識別需要的接口對象。
//語音識別引擎對象
CComPtr
//語音命令的語法對象
CComPtr
//語音識別的上下文接口對象
CComPtr
//初始化COM口
CoInitializeEx(NULL,COINIT_APARTMENTTHREADED) ;
//創(chuàng)建識別引擎:共享型服務
hr=m_cpRecognizer.CoCreateInstance (CLSID_SpInprocRecognizer);
//創(chuàng)建識別的上下文接口
hr=m_cpRecognizer->CreateRecoContext (&m_cpRecoCtxt);
//設置識別消息
hr=m_cpRecoCtxt->SetNotifyWindowMessage (m_hWnd,WM_RECOEVENT,0,0);
//設置觸發(fā)事件
Const ULONGLONG ullInterest=SPFEI (SPEI_RECOGNITION);
hr=m_cpRecoCtxt-> SetInterest(ullInterest,ullInterest);
//設置語法規(guī)則
Hr=m_cpRecoCtxt-> CreateGrammar (100,&m_cpCmdGrammar);
//加載語法詞典
Hr=m_cpCmdGrammar-> LoadCmdFromFile (wszXMLFile,SPLO_DYNAMIC);
(3)語音識別系統(tǒng)初始化之后,識別引擎開始工作,當系統(tǒng)匹配到正確的命令輸入,在消息響應函數(shù)中對動作進行實現(xiàn)。
//消息相應函數(shù)RecoEvent()
void CSpeechReco::RecoEvent()
{
…
};
(4)在程序退出之前需要卸載系統(tǒng)資源,即在析構(gòu)函數(shù)中釋放COM。
CoUninitializeEx();
雙驅(qū)雙向AGV控制系統(tǒng)識別到正確的指令后,執(zhí)行相應動作。
基于微軟提供的Microsoft Visual C++6.0面向?qū)ο蟮目梢暬砷_發(fā)環(huán)境開發(fā)了人機交互界面,結(jié)果如圖7所示。該控制程序采用的是命令識別模式自定義匹配詞匯,通過點擊“語音識別”,完成語音初始化的創(chuàng)建,經(jīng)麥克風輸入命令,再由系統(tǒng)匹配識別,從而控制AGV完成“前進”、“后退”、“左轉(zhuǎn)”、“右轉(zhuǎn)”以及“停止”等相關(guān)動作指令。
針對雙驅(qū)雙向AGV的語音識別以及指令控制效果進行實驗測試。實驗選擇在安靜的環(huán)境下進行,實驗場地如圖8所示。任意選擇1人完成語音樣本的錄入,即前進、后退、停止、左轉(zhuǎn)、右轉(zhuǎn)等指令。并隨機抽取5人,其中男生2人、女生3人完成語音字典中的5條指令,規(guī)定每位測試者隨機讀取5條指令20次,實驗結(jié)果如表1所示。實驗結(jié)果表明,該系統(tǒng)語音識別模塊的正確識別率達到90%以上。
表1 語音實驗結(jié)果
以雙驅(qū)雙向AGV為控制對象,基于SAPI語音應用程序編程接口完成了語音系統(tǒng)的開發(fā),通過麥克風輸入語音,再經(jīng)語音識別處理能夠控制雙驅(qū)雙向AGV完成前進、后退、左轉(zhuǎn)、右轉(zhuǎn)、停止等動作。該系統(tǒng)不僅增加了人機交互的多樣性,而且也降低了設備操作的復雜性,提高了企業(yè)自動化水平和生產(chǎn)效率。實驗結(jié)果表明,該系統(tǒng)語音模塊在安靜的環(huán)境下的正確識別率達90%,并且雙驅(qū)雙向AGV能在用戶的指令下正確完成相應的運動。