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