陈 亚,张栗铭,张雪峰,李欢欢,寇海波
(北京石油化工学院机械工程学院,北京 102617)
随着科技的不断发展,机器人被广泛地运用在工业、医疗以及军事等领域[1]。让各种机器听懂人类的语言并根据获得的信息完成相应的任务,可以使人的双手从控制机器人工作中解脱出来,从而大幅提高工作效率[2]。语音识别技术的研究目的就是让机器“听懂”人类的语言,使机器人能够更好地为人类服务[3]。目前对特定人语音孤立词识别的主要方法包括动态时间规整(DTW)、矢量量化(DQ)和隐马尔可夫模型(HMM)等[4]。Microsoft公司的Speech SDK语音开发包就是以HMM为基础建立并提供有语音应用程序编程接口SAPI,是构建语音识别平台的基础,能够使语音技术与机器人控制系统有机结合。使用Speech SDK语音开发包能够缩短开发周期,方便进行二次开发[5]。
笔者采用Speech SDK语音开发包构建双驱双向AGV的语音识别开发平台,在基于平板电脑及其外围模块的控制方式基础上增加语音识别功能,在完成语音的准确识别后,驱动双驱双向AGV实现前进、后退、停止、左转、右转等一系列动作。该系统既能保证双驱双向AGV稳定可靠地运行,又能实现对双驱双向AGV实时的语音控制,丰富了人机交互方式,帮助企业提高了生产效率[6]。
以双驱双向AGV为控制对象,采用PMAC (programmable multi-axes controller)运动控制卡作为控制器,并基于Speech SDK语音开发包构建具有语音识别功能的双驱双向AGV控制系统,该系统结构如图1所示。
双驱双向AGV控制系统主要由2部分组成:上位机(工业平板电脑)和下位机(PMAC运动控制卡),共同构成开放式控制系统。其中上位机为工业平板电脑,选用对微软语音开发包兼容性好、安全性高、多任务处理稳定可靠的Window XP操作系统,该操作系统支持麦克风作为外设对语音输入进行数据采集,判断并识别语音,激活响应函数,控制双驱双向AGV的运动,同时处理其他传感器信息实现对AGV的实时导航纠偏控制。下位机为PMAC运动控制卡,主要负责实时采集外围传感器信号,并将数据通过网口送入上位机,实时处理上位机发出的指令,驱动电机完成相应动作。笔者采用工业平板电脑+PMAC运动控制卡作为双驱双向AGV的控制系统,不仅结构简单、开发周期短、稳定性好,而且可扩展性强,具有对运动实时控制的能力。
用户通过麦克风输入语音指令,上位机接收用户语音信号,提取语音命令,与语音模板中的信息匹配,若匹配成功,则执行响应函数,创建新线程并给下位机发送运动指令,实现对双驱双向AGV的运动控制,运动结束,则关闭线程;若匹配失败,则继续匹配。下位机接收上位机的运动指令,并根据上位机对磁导航传感器的处理信息,驱动直流无刷电机差速运转,实现对双驱双向AGV的运动控制。
运动学模型的建立是实现对AGV语音控制的基础。双驱双向AGV通过非接触式的磁条导引方式沿着预定路线循迹行走,双驱双向AGV的运动学模型如图2所示。通过实时调节前后驱动模块左右驱动轮A、B、C、D的速度,利用差速纠偏原理协调控制驱动电机,实现双驱双向AGV沿预定轨迹行驶的运动控制。
假定A和B为第1个驱动模块左右轮,运动速度分别为Va和Vb,C和D为第2个驱动模块左右轮,运动速度分别为Vc和Vd,2个驱动模块间距为S,2个驱动轮间距为L,驱动轮半径为R。A轮和B轮中点的速度为Vo1,C轮和D轮之间的中点的速度为Vo2。假定整个AGV是一个刚体在平面内运动,AGV 2个驱动模块左右各轮在平面内只做纯滚动,无滑动情况出现。
根据不同的运动路线,双驱双向AGV的运动可分为直线运动和转弯运动。当双驱双向AGV沿着直线运动时,2个驱动模块的4个驱动轮的速度相等。AGV沿着轨迹在运动的过程中不可避免的会产生一定的偏差,当AGV运动发生偏差时,根据磁导航传感器采集到的位置信息确定AGV偏离磁条中心的距离,通过纠偏算法,调节一侧驱动轮的速度下降,另一侧驱动轮的速度维持不变,利用差速原理实时调整两驱动模块左右驱动轮速度,控制AGV保持直线运动。
当AGV进入弯道时,转弯过程可以分为3个阶段,如图3所示。第1阶段,第1个驱动模块进入弯道,开始转弯,第2个驱动模块仍沿直线轨迹运动;第2阶段,2个驱动模块都进入弯道,同时转弯;第3阶段,第1个驱动模块已经完成转弯,开始沿直线轨迹运动,第2个驱动模块仍在转弯。
通过分析计算[7],得到在这3个阶段4个驱动轮的瞬时速度关系为:
(1)第1阶段:
其中:R为磁条铺设半径;θ为第1个驱动模块转过的角度。
(2)第2阶段:
Va=Vc, Vb=Vd
(3)第3阶段:
其中:σ为第2个驱动模块转过的角度。
通过分析4个驱动轮在转弯不同阶段的瞬时速度关系,当接收到转弯的语音指令后,控制驱动轮的运动速度继而实现对双驱双向AGV的转弯运动。
基于SAPI的双驱双向AGV软件控制流程如图4所示。首先系统进行语音识别模块初始化,SAPI提供了完善的COM接口,根据COM规范的要求,首先调用CoInitializeEx函数对COM库进行初始化。当进程不再使用COM库函数时,必须调用CoUninitializeEx函数释放系统资源[8]。然后初始化语音识别的各接口,完成识别引擎、识别上下文接口的创建,并设置识别消息和感兴趣的事件,最后对识别的语音内容建立语法规则,完成语音识别平台的构建。用户通过麦克风输入语音指令,进程对识别的语音进行匹配,如果匹配成功,则根据识别的语音内容进行消息响应,从而驱动AGV执行相应的动作;如果匹配失败,则继续进行语音识别并匹配。
微软的SDK提供有语音应用程序编程接口SAPI(Speech Application Programming Interface)、语音听写引擎TTS(Text To Speech)以及连续语音识别引擎MCSR (Microsoft Continuous Speech Recognition)[9]。SAPI是基于COM技术实现的组件编程接口,封装了操作系统底层硬件,提供具有高度适应性的直接语音管理、训练向导管理、资源、语音识别SR(Speech Recognition)管理等,所以,语音识别SAPI的调用符合COM规范。SAPI层、应用程序接口API层和设备驱动接口DDI(DeepSpar Disk Imager)层三者之间的结构图如图5所示。
应用程序是通过SAPI与API(Application Programming Interface)层之间进行交互,语音引擎是通过SAPI与DDI(DeepSpar Disk Imager)层进行通信[10]。利用接口函数,屏蔽了底层驱动与识别算法的开发,大大简化了语音开发的难度。根据开发的XML(Extensible Markup Language)文件确定需要匹配的词汇,开发者可以根据需要定义词汇,大大降低词汇检索量,提高识别速度。
利用SAPI开发语音应用程序,将程序嵌入到机器人运动控制系统中,通过用户的语音输入使双驱双向AGV接受指令,实现机器人前进、后退、转向以及停止等动作,具体步骤如下。
(1)创建XML文件(CmdCtrl.xml),定义需要机器人识别的命令。
前进
后退
左转
右转
停止
(2)语音识别系统初始化。语音识别系统初始化包含多个步骤,初始化模块流程图如图6所示。
通过CoInitializeEx函数初始化COM接口,在程序的头文件中定义建立语音识别需要的接口对象。
//语音识别引擎对象
CComPtr
//语音命令的语法对象
CComPtr
//语音识别的上下文接口对象
CComPtr
//初始化COM口
CoInitializeEx(NULL,COINIT_APARTMENTTHREADED) ;
//创建识别引擎:共享型服务
hr=m_cpRecognizer.CoCreateInstance (CLSID_SpInprocRecognizer);
//创建识别的上下文接口
hr=m_cpRecognizer->CreateRecoContext (&m_cpRecoCtxt);
//设置识别消息
hr=m_cpRecoCtxt->SetNotifyWindowMessage (m_hWnd,WM_RECOEVENT,0,0);
//设置触发事件
Const ULONGLONG ullInterest=SPFEI (SPEI_RECOGNITION);
hr=m_cpRecoCtxt-> SetInterest(ullInterest,ullInterest);
//设置语法规则
Hr=m_cpRecoCtxt-> CreateGrammar (100,&m_cpCmdGrammar);
//加载语法词典
Hr=m_cpCmdGrammar-> LoadCmdFromFile (wszXMLFile,SPLO_DYNAMIC);
(3)语音识别系统初始化之后,识别引擎开始工作,当系统匹配到正确的命令输入,在消息响应函数中对动作进行实现。
//消息相应函数RecoEvent()
void CSpeechReco::RecoEvent()
{
…
};
(4)在程序退出之前需要卸载系统资源,即在析构函数中释放COM。
CoUninitializeEx();
双驱双向AGV控制系统识别到正确的指令后,执行相应动作。
基于微软提供的Microsoft Visual C++6.0面向对象的可视化集成开发环境开发了人机交互界面,结果如图7所示。该控制程序采用的是命令识别模式自定义匹配词汇,通过点击“语音识别”,完成语音初始化的创建,经麦克风输入命令,再由系统匹配识别,从而控制AGV完成“前进”、“后退”、“左转”、“右转”以及“停止”等相关动作指令。
针对双驱双向AGV的语音识别以及指令控制效果进行实验测试。实验选择在安静的环境下进行,实验场地如图8所示。任意选择1人完成语音样本的录入,即前进、后退、停止、左转、右转等指令。并随机抽取5人,其中男生2人、女生3人完成语音字典中的5条指令,规定每位测试者随机读取5条指令20次,实验结果如表1所示。实验结果表明,该系统语音识别模块的正确识别率达到90%以上。
表1 语音实验结果
以双驱双向AGV为控制对象,基于SAPI语音应用程序编程接口完成了语音系统的开发,通过麦克风输入语音,再经语音识别处理能够控制双驱双向AGV完成前进、后退、左转、右转、停止等动作。该系统不仅增加了人机交互的多样性,而且也降低了设备操作的复杂性,提高了企业自动化水平和生产效率。实验结果表明,该系统语音模块在安静的环境下的正确识别率达90%,并且双驱双向AGV能在用户的指令下正确完成相应的运动。