王福印,呂???/p>
(南京航空航天大學(xué) 機電學(xué)院,江蘇 南京 210016)
工業(yè)機器人解釋器是機器人軟件系統(tǒng)的關(guān)鍵組成部分。作為機器人控制系統(tǒng)與機器人語言的接口,解釋器負(fù)責(zé)讀取機器人源程序,并生成運動控制模塊所識別的目標(biāo)數(shù)據(jù)。解釋器的效率與質(zhì)量是影響機器人運行精度、實時性與穩(wěn)定性的控制性因素[1]。
解釋器一般包括詞法分析、語法分析、語義分析3個基本邏輯環(huán)節(jié)。傳統(tǒng)詞法分析與語法分析一般是依次讀入單字符,將字符分成運算符、終結(jié)符和非終結(jié)符等,再按照一定的文法規(guī)則進行歸約,構(gòu)造語法樹并識別語法錯誤;語義分析階段則通過遍歷語法樹來實現(xiàn)語法制導(dǎo)的翻譯過程[2],最終生成目標(biāo)代碼。然而單字符讀取與語法樹遍歷的解釋模式往往導(dǎo)致解釋過程算法復(fù)雜,效率低下。
正則表達式采用直接匹配的解釋模式,具有開放性、高效性等特點,在機器人解釋器設(shè)計中被廣泛采用。如文獻[2]應(yīng)用Linux系統(tǒng)自帶的regcomp()和regexec()正則表達式處理庫函數(shù),完成機器人語言解釋器的語法分析;文獻[3]基于QT設(shè)計了機器人語言系統(tǒng),采用QRegExp正則表達式規(guī)范機器人語言編輯格式,簡化了詞法分析、語法分析過程;文獻[4]在VC開發(fā)環(huán)境下,通過調(diào)用GREAT正則表達式模板類庫,對指令代碼進行語法分析。
本文基于PCRE正則表達式,提出兩遍掃描的解釋模式:在第一遍掃描中應(yīng)用PCRE正則表達式完成程序指令的詞法、語法分析;第二遍掃描中采用雙向鏈表結(jié)構(gòu)形式,管理程序中的每條指令,通過查關(guān)鍵字表跳轉(zhuǎn)到相應(yīng)的處理函數(shù),完成語義分析、信息提取及目標(biāo)代碼的生成。實驗結(jié)果表明,解釋算法穩(wěn)定可靠,具有較高的執(zhí)行效率。
動作級機器人語言以控制指令和尺寸信息為主,每一行程序即為一條指令,形式簡單,格式固定。這一特征可以直接通過匹配完成語法分析,通過查詢關(guān)鍵字表,直接轉(zhuǎn)入行指令對應(yīng)的處理模塊,實現(xiàn)快速語義分析。鑒于此,在解釋器的實現(xiàn)過程中,綜合考慮程序結(jié)構(gòu)、執(zhí)行效率和內(nèi)存消耗等因素,采用兩遍掃描的方式[2,5-6]。其流程如圖1所示。
第一遍掃描只進行詞法和語法分析即錯誤檢測,不進行有關(guān)數(shù)據(jù)的處理。解釋器逐行讀取源程序,與初始化后的正則表達式進行整行匹配,若匹配有誤,說明程序指令存在語法錯誤,則對該指令進行詞法匹配,輸出錯誤信息。若指令沒有錯誤則進行第二遍掃描,完成語義分析、信息提取和目標(biāo)代碼生成。兩遍掃描相互獨立,可單獨調(diào)用。
圖1 解釋器整體流程圖
正則表達式是由一系列普通字符和元字符組成的,能明確描述文本字符串的文字匹配模式[7]。PCRE是一個用C語言編寫的正則表達式函數(shù)庫,比Boost之類的正則表達式庫小得多,簡單易用,性能超過了POSIX正則表達式庫和一些經(jīng)典的正則表達式庫。
PCRE在VS2010編譯環(huán)境下的配置過程十分方便,步驟如下:1) 新建篩選器,命名為pcre;2) 將PCRE軟件包頭文件及可執(zhí)行文件添加至pcre文件夾;3) 將pcre中可執(zhí)行文件屬性改為不使用預(yù)編譯頭;4) 修改工程屬性,添加宏“_DEBUG”和“HAVE_CONFIG_H”。
Pcre正則表達式提供了19個接口函數(shù)。本文采用PCRE進行語法、詞法分析時只需調(diào)用現(xiàn)有的IsMathch(const char *szPattern,const char *szSrc)函數(shù),參數(shù)szPattern為宏定義的指令代碼字符串,參數(shù)szSrc為要匹配的指令代碼。若匹配成功,函數(shù)返回值>0,反之<0。該函數(shù)中已封裝了PCRE正則表達式的pcre_compile()和pcre_exec()接口函數(shù),與傳統(tǒng)調(diào)用正則表達式的過程相比,實現(xiàn)方式簡單、編程難度明顯減小。
研究的語言屬于動作級機器人語言,結(jié)構(gòu)清晰固定,如運動指令MOVJ P* ,V20 ,Z0 ;流程控制指令JUMP LAB0。此外,在工業(yè)機器人實際編程中通常以“選擇題式”輸入的方式編程,每一行的程序格式由指令編輯器軟件嚴(yán)格設(shè)定,這種形式有效避免了非字符及非法語法的產(chǎn)生。本文設(shè)計的指令窗口,如圖2所示。指令代碼由樹形控件管理,當(dāng)雙擊選中的指令,指令將顯示在程序編輯窗口中。為檢查在參數(shù)修改過程中,人為因素帶來的詞法語法錯誤,本文提出利用PCRE正則表達式進行先語法后詞法的的快速檢查方法,其流程圖如圖3所示。
首先,解釋器根據(jù)PCRE正則表達式規(guī)則建立指令代碼的語法和詞法匹配表達式,并定義成宏的形式,再將語法匹配表達式裝載到數(shù)組中以備循環(huán)匹配。以運動指令MOVJ為例,定義其語法匹配的正則表達式如下:
#define PCRE_MOVJ “MOVJ (\s+)P\d{1,3}(\s*),(\s*)V(\d{1,2}|100)(\s+),\s*Z[0-4](\s+)”;對應(yīng)的詞法匹配正則表達式為:#define PCRE_P “P\d{1,3}(\s+)”、#define PCRE_V “V(\d{1,2}|100)(\s+)”、#define PCRE_Z “Z[0-4](\s+);”。
圖2 指令窗口
圖3 第一遍掃描流程圖
初始化后,程序讀取一行代碼進行整體匹配。若匹配正確,則說明此行代碼語法正確,程序跳出循環(huán)進行下一行代碼匹配;若整體匹配有誤,則程序跳轉(zhuǎn)到該指令對應(yīng)的處理函數(shù)完成詞法分析,并在輸出窗口輸出發(fā)生錯誤的行號和類型。然后讀取下一行代碼繼續(xù)匹配,直至代碼行為空,完成對全部指令程序的錯誤檢查。
第一遍掃描如果沒有錯誤則進行第二遍掃描完成語義分析、信息提取和目標(biāo)代碼的生成。在此采用一個雙向鏈表結(jié)構(gòu)管理源程序段,即鏈表中每一節(jié)點對應(yīng)一行指令;鏈表結(jié)構(gòu)如下:
Struct SProc_Codelist
{
int rowNum;
char comName[100];//指令代碼
int nType;// 指令關(guān)鍵字的宏定義
struct SProc_Codelist *front;
struct SProc_Codelist *next;
};
雙鏈表結(jié)構(gòu)的特點是從雙鏈表中的任意一個結(jié)點開始,都可以很方便地訪問它的前驅(qū)結(jié)點和后驅(qū)結(jié)點,使得上下級存在制約關(guān)系的指令代碼的分析變得簡單方便。語義檢查、信息提取和目標(biāo)代碼的生成均通過讀取鏈表實現(xiàn),分析流程圖如圖4所示。
圖4 第二遍掃描流程圖
nType用于存儲宏形式定義的指令關(guān)鍵字,如運動指令MOVJ的宏定義為:#define MOVJ 1。nType的值通過查找關(guān)鍵字?jǐn)?shù)組表獲得。若讀取指令不為空,根據(jù)關(guān)鍵字調(diào)用相應(yīng)的語義分析函數(shù),若語義分析正確,則進行該指令代碼的信息提取并生成目標(biāo)代碼;若語義分析有誤,則輸出錯誤信息,程序停止運行。本文對于每一種指令類型,都設(shè)計了對應(yīng)的分析處理函數(shù)接口。結(jié)構(gòu)形式如下:
switch(Codelist_p->nType)
{
case MOVJ:deal_Motion_MOVJ();break;
case MOVL:deal_Motion_MOVL();break;
case MOVC:deal_Motion_MOVC();break;
…
default:break;
}
圖5以VS2010作為開發(fā)工具實現(xiàn)的離線編程系統(tǒng)主界面,含三維視圖顯示窗口、指令選擇窗口、程序編輯窗口、運動控制窗口和信息輸出窗口??梢酝ㄟ^離線編程或?qū)朐闯绦蛭募崿F(xiàn)運動模擬。
為驗證該解釋器的有效性,應(yīng)用上述系統(tǒng)對機器人指令進行了大量解釋試驗。結(jié)果顯示該解釋器能夠正確解釋機器人指令,當(dāng)代碼出錯時,能夠正確輸出錯誤信息。在指令信息提取的正確性方面,以圖5所示的編輯代碼為例,結(jié)果顯示,機器人能夠正確按照指令實現(xiàn)運動模擬。在DOS環(huán)境下輸出解釋器提取的示教點信息和生成的目標(biāo)代碼(圖6),與實際數(shù)據(jù)吻合。
圖5 離線仿真系統(tǒng)
圖6 指令代碼信息提取結(jié)果
針對工業(yè)機器人語言形式簡單、格式固定等特點,提出了兩遍掃描的解釋模式?;赑CRE正則表達式,采用先整體后局部的匹配方法完成首次掃描,實現(xiàn)了語法、詞法的快速檢測;為每一指令建立了相應(yīng)處理函數(shù),并生成了關(guān)鍵字表以便于函數(shù)查詢。二次掃描過程中,采用雙向鏈表結(jié)構(gòu)形式進行指令管理,通過關(guān)鍵字表查詢快速跳轉(zhuǎn)至相應(yīng)處理函數(shù),完成語義分析、信息提取及目標(biāo)代碼的生成。程序結(jié)構(gòu)清晰,解釋算法簡單且各模塊相互獨立,易于維護。實驗結(jié)果表明,該解釋器能夠快速完成錯誤檢測,并可靠提取指令相關(guān)信息。
[1] 周澤湘, 丁躍澆,張敏. 工業(yè)機器人解釋器的研究與設(shè)計[J]. 機械設(shè)計與制造, 2012(12): 154-156.
[2] 郭顯金. 工業(yè)機器人編程語言的設(shè)計與實現(xiàn)[D]. 武漢:華中科技大學(xué),2013.
[3] 楊杏,陳富林,周霏. 基于Qt的工業(yè)機器人語言系統(tǒng)的設(shè)計[J]. 組合機床與自動化加工技術(shù),2015(3):71-74.
[4] 何嘉健,李偉光. 基于GRETA正則表達式的機器人解釋器的研究[J]. 組合機床與自動化加工技術(shù),2012(1):17-19,24.
[5] 王浩,謝存禧. 開放式機器人解釋器的研究[J]. 機械設(shè)計與制造,2010(8) :167-168.
[6] 王浩. 基于XML的開放式工業(yè)機器人解釋器的研究[D]. 廣州:華南理工大學(xué),2010.
[7] Jeffrey E.F.Friedl. 精通正則表達式[M]. 北京:電子工業(yè)出版社,2007.