楊曉鈞,井孟凱,李 朋,周紹帆
機(jī)器人語(yǔ)言系統(tǒng)是工業(yè)機(jī)器人與用戶交流的接口,用戶可以借助語(yǔ)言系統(tǒng)以機(jī)器人指令編寫的方式實(shí)現(xiàn)對(duì)機(jī)器人的控制[1]。機(jī)器人語(yǔ)言系統(tǒng)一般包括:機(jī)器人編程語(yǔ)言,代碼編輯器和代碼解釋器。
整個(gè)語(yǔ)言系統(tǒng)的處理過(guò)程為:用戶根據(jù)自己的意圖,按照機(jī)器人語(yǔ)言規(guī)定的格式編寫出機(jī)器人指令,經(jīng)由編輯器輸入編輯得到機(jī)器人源程序,但通過(guò)編輯器輸入的機(jī)器人源程序并不能直接被機(jī)器人后端的運(yùn)動(dòng)控制模塊所理解,需由代碼解釋器翻譯與數(shù)據(jù)處理完成從源程序到中間程序的轉(zhuǎn)換,作為后端運(yùn)動(dòng)控制模塊的輸入[3],控制器調(diào)用軌跡規(guī)劃模塊進(jìn)行插補(bǔ)運(yùn)算,最后送給執(zhí)行機(jī)構(gòu)去控制工業(yè)機(jī)器人的動(dòng)作,如圖1所示。
其中代碼解釋系統(tǒng)連接著機(jī)器人語(yǔ)言系統(tǒng)和控制系統(tǒng),是語(yǔ)言系統(tǒng)最主要的子模塊。它的作用是將用戶編寫的源程序指令翻譯成機(jī)器人控制系統(tǒng)能夠識(shí)別的目標(biāo)指令[2]。本文將以代碼解釋器為主要任務(wù)完成對(duì)機(jī)器人語(yǔ)言系統(tǒng)的開(kāi)發(fā)。

圖1 機(jī)器人語(yǔ)言系統(tǒng)結(jié)構(gòu)圖Fig.1 Structure of the robot language system
在機(jī)器人領(lǐng)域中,通常有專用的機(jī)器人編程語(yǔ)言。不同的工業(yè)機(jī)器人編程語(yǔ)言并不一樣,但是基本的功能是必要的。指令代碼主要以動(dòng)作級(jí)語(yǔ)言AL語(yǔ)言為主體,并在其基礎(chǔ)上進(jìn)行修改作為工業(yè)機(jī)器人的編程語(yǔ)言。不僅具有基本的運(yùn)動(dòng)指令及運(yùn)算指令,還擁有與外部傳感器交互的輸入輸出指令,以及改變操作流程的控制指令,同時(shí)還具有根據(jù)用戶需求添加特定指令的功能,實(shí)現(xiàn)了很好的開(kāi)放性。機(jī)器人程序格式舉例如表1示。

表1 機(jī)器人編程語(yǔ)言指令格式Tab.1 Examples of Robot Programming Language
所開(kāi)發(fā)的解釋器系統(tǒng)軟件結(jié)構(gòu)如圖2所示。

圖2 解釋系統(tǒng)軟件結(jié)構(gòu)Fig.2 Structure of the Code Interpreter
本文采用三遍掃描的方式[4]來(lái)實(shí)現(xiàn)解釋器的工作,即各子模塊作為獨(dú)立程序,按步驟依次運(yùn)行。機(jī)器人源程序輸入后,調(diào)用解釋器的詞法分析函數(shù)檢查并轉(zhuǎn)換源程序,輸出為規(guī)定格式的中間代碼1;中間代碼1進(jìn)而輸入到語(yǔ)法分析函數(shù),完成對(duì)源程序語(yǔ)法結(jié)構(gòu)的檢查,并輸出中間代碼2,記錄語(yǔ)句類型信息;然后將中間代碼1、2輸入到語(yǔ)義分析函數(shù),進(jìn)行指令內(nèi)容的檢查,通過(guò)后將被提取信息到符號(hào)表并翻譯成最終的目標(biāo)代碼;對(duì)中途識(shí)別出的非法指令將記錄狀態(tài)并轉(zhuǎn)入相應(yīng)的錯(cuò)誤處理函數(shù)[5]。
詞法分析的主要任務(wù)是識(shí)別出源程序中的各個(gè)單詞,把源程序中的字符轉(zhuǎn)換成一種內(nèi)部形式,遇到識(shí)別不出的符號(hào),要進(jìn)行錯(cuò)誤處理。選用的機(jī)器人語(yǔ)言包括以下幾種單詞符號(hào):(1)關(guān)鍵字,如SUB、OFF、IF等;(2)標(biāo)識(shí)符,如QI0、QD2、KI#3、P1等給定變量名;(3)常量,如整形或浮點(diǎn)型;(4)判斷符以及位置參數(shù)等。詞法分析程序除了識(shí)別單詞外,還輸出該單詞類型,所以為每一個(gè)基本命令字都設(shè)置了標(biāo)號(hào)值與屬性值[6],部分對(duì)應(yīng)關(guān)系如表2。

表2 單詞符號(hào)對(duì)照表Tab.2 Intermediate Format 1

圖3 分離單詞流程圖Fig.3 Lexical Analysis Diagram
分析每行代碼時(shí),識(shí)別單詞分為兩步:先通過(guò)函數(shù)Separword()將各單詞分離出來(lái);然后調(diào)用函數(shù)Recogword()負(fù)責(zé)具體識(shí)別每個(gè)單詞。當(dāng)識(shí)別出單詞后,同時(shí)需輸出并存儲(chǔ)單詞的標(biāo)號(hào)與屬性值,以及所在位置,為此在VC程序中,定義一個(gè)類CWordInfor來(lái)存儲(chǔ)以上信息,該類型具有五個(gè)數(shù)據(jù)成員與兩個(gè)成員函數(shù)。
通過(guò)對(duì)機(jī)器人語(yǔ)言規(guī)則的研究,可以對(duì)每行指令以空格符或判斷符為界來(lái)劃分單詞,為此,設(shè)計(jì)分離單詞的流程圖,如圖3,按照規(guī)劃好的流程圖即可設(shè)計(jì)分離單詞的算法。當(dāng)單詞完成分離之后即可由Recogword()函數(shù)進(jìn)行識(shí)別工作,單詞識(shí)別后,輸出單詞的同時(shí)建立CWordInfor類的對(duì)象,保存對(duì)應(yīng)單詞的標(biāo)號(hào)值與屬性值等相關(guān)信息用于后續(xù)的語(yǔ)法分析處理。對(duì)于無(wú)法識(shí)別的單詞將進(jìn)行特殊賦值,并轉(zhuǎn)入錯(cuò)誤處理。
語(yǔ)法分析的任務(wù)是將輸入的單詞流進(jìn)行組合,按照特定的語(yǔ)法規(guī)則去分析源程序的語(yǔ)法結(jié)構(gòu)并檢查語(yǔ)法錯(cuò)誤,當(dāng)發(fā)生錯(cuò)誤時(shí)輸出相應(yīng)的錯(cuò)誤信息,檢查無(wú)誤則輸出合法語(yǔ)句[7]。

圖4 語(yǔ)法分析流程圖Fig.4 Syntax Analysis Diagram
本文采用的機(jī)器人語(yǔ)言指令結(jié)構(gòu)比較固定,所以可以采用將單詞的標(biāo)號(hào)值與規(guī)范的標(biāo)號(hào)值相匹配的方法進(jìn)行語(yǔ)法分析。首先建立規(guī)范指令的數(shù)字串集合,稱為序列號(hào)表。將語(yǔ)法結(jié)構(gòu)正確的指令中所有的單詞標(biāo)號(hào)值連成數(shù)字串,作為序列號(hào)存入序列號(hào)表中;當(dāng)處理一行指令時(shí),將指令中所有單詞的標(biāo)號(hào)值提取并連為數(shù)字串,通過(guò)matc_nu1()函數(shù)與序列號(hào)表中的序列號(hào)進(jìn)行查詢,查詢到相同的數(shù)字串則表明匹配成功。若匹配成功,則代表語(yǔ)法結(jié)構(gòu)正確;若失敗,則對(duì)該行指令進(jìn)行錯(cuò)誤處理。例如“MOVJ P2 VJ=50 PL=0”這條指令中所有單詞按順序組合出的序列號(hào)為“51359266026”,分析首單詞“MOVJ”的標(biāo)號(hào)值為51,則進(jìn)入MOVJ指令的序列號(hào)表進(jìn)行匹配查詢。對(duì)應(yīng)序列號(hào)表為:{"51359286026","51359266026","51360265926", "51360265928", "5135926", "5135928"},根據(jù)查詢對(duì)比,與表中第二項(xiàng)序列號(hào)匹配,證明該行指令語(yǔ)法格式正確。可進(jìn)行中間代碼2的生成,進(jìn)入語(yǔ)義分析模塊的處理。語(yǔ)法分析模塊流程如圖4所示。
語(yǔ)法分析是檢查句子的結(jié)構(gòu),語(yǔ)義分析則是檢查句子的意思。因此語(yǔ)義分析的任務(wù)為對(duì)源程序中每行指令的具體意思進(jìn)行剖析,檢查指令中的靜態(tài)語(yǔ)義錯(cuò)誤。若同時(shí)滿足語(yǔ)法層面的“形式”正確和語(yǔ)義層面上的“內(nèi)容”正確,則指令無(wú)誤,可翻譯成等效的中間代碼。因此在語(yǔ)義分析和中間代碼生成階段,解釋系統(tǒng)要做的工作是進(jìn)行靜態(tài)語(yǔ)義檢查和翻譯[8]。
語(yǔ)義分析的方法主要依照編譯原理中的語(yǔ)法制導(dǎo)翻譯的思想。即對(duì)每一種指令類型都編制其各自的語(yǔ)義子程序,其中包括語(yǔ)義檢查模塊和目標(biāo)代碼生成模塊。當(dāng)用語(yǔ)法分析匹配出一條指令時(shí),立即調(diào)用相應(yīng)的語(yǔ)義子程序進(jìn)行處理[9]。基本流程如圖5所示。
由于在前面詞法分析模塊中,將每個(gè)單詞的類型與屬性值等各項(xiàng)信息已提取為類CWordInfor的對(duì)象,作為中間代碼1;又經(jīng)過(guò)語(yǔ)法分析模塊,識(shí)別出每行指令的種類等信息,并保存在類CWordInfor的對(duì)象中,作為中間代碼2。因此可將中間代碼1與中間代碼2作為語(yǔ)義分析模塊的輸入,根據(jù)中間代碼2中指令類型及其參數(shù)信息,調(diào)用相應(yīng)的語(yǔ)義動(dòng)作:通過(guò)該指令的靜態(tài)語(yǔ)義檢查模塊對(duì)中間代碼1中信息進(jìn)行查錯(cuò)與變量表的填充,然后通過(guò)翻譯子程序模塊對(duì)中間代碼1進(jìn)行信息的提取[10],完成中間代碼的輸出。語(yǔ)義分析檢查無(wú)誤后,進(jìn)入翻譯模塊,需要對(duì)當(dāng)前指令進(jìn)行信息的提取,以生成中間代碼,在這里采用對(duì)每種指令類型創(chuàng)建一種數(shù)據(jù)結(jié)構(gòu)的形式,指令的參數(shù)作為數(shù)據(jù)結(jié)構(gòu)的成員,定義在頭文件Struct.h中。例如對(duì)運(yùn)動(dòng)指令MOVJ,其數(shù)據(jù)結(jié)構(gòu)定義為:
typedef struct Traj_linear_move
{
int type; //命令類型

圖5 語(yǔ)義分析流程圖Fig.5 Semantic Analysis Diagram
EEPose end; //目標(biāo)點(diǎn)
double maxvel;//速度
int feed_mode; //平滑度
}Traj_joint_move;
對(duì)運(yùn)算指令A(yù)DD、SUB、MUL、DIV等,其數(shù)據(jù)結(jié)構(gòu)定義為:
typedef struct Cal_asmd
{
int type; //命令類型
int caltype;//運(yùn)算符類型
Vari var1;//操作數(shù):變量1
Vari var2;//操作數(shù):變量2
}Cal_asmd;
其中Vari作為變量類型,用于表示指令中各變量,包括整形變量QIn、浮點(diǎn)型變量QDn、布爾型變量QBn,以及IO接口KI#(n)、KO#(n)等。定義的數(shù)據(jù)結(jié)構(gòu)為:
typedef struct Vari
{
int vtype;//變量類型
union{
int num; //變量標(biāo)號(hào)
double value;//常量數(shù)值
}vdata;
}Vari;
將各行指令創(chuàng)建為相應(yīng)的數(shù)據(jù)結(jié)構(gòu)對(duì)象后,即可將其提取在消息列表中,定義在頭文件Struct.h中的消息列表的數(shù)據(jù)結(jié)構(gòu)為:
struct CODE_INTERP_LIST_MSG
{
int line_number;//指令行號(hào)
int cmd_type; //命令類型
union{ //各指令對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)
Traj_circular_move tcmd;
Traj_linear_move tlmd;
IF_Condition ic;
Traj_joint_move tjm;
Ctl_begin cb;
……
}cmd_data;
};
其中數(shù)據(jù)成員line_number表示當(dāng)前指令所在行的位置,cmd_type表示所存儲(chǔ)的指令類型,聯(lián)合體cmd_data則用于存儲(chǔ)當(dāng)前指令的數(shù)據(jù)結(jié)構(gòu)對(duì)象。這樣,創(chuàng)建的消息列表即為當(dāng)前行生成的中間代碼。
進(jìn)行解釋系統(tǒng)的實(shí)例測(cè)試,通過(guò)在基于MFC開(kāi)發(fā)的程序編輯器中編寫機(jī)器人的運(yùn)動(dòng)測(cè)試指令,經(jīng)過(guò)代碼解釋器最終生成中間代碼以驗(yàn)證機(jī)器人語(yǔ)言系統(tǒng)尤其是代碼解釋系統(tǒng)的正確性。測(cè)試指令在程序編輯器中輸入如圖6所示。

圖6 測(cè)試指令輸入Fig.6 The Testing Code
經(jīng)過(guò)解釋系統(tǒng)后生成的中間代碼如圖7所示。
可以證明,本文開(kāi)發(fā)的代碼解釋器可以準(zhǔn)確地將機(jī)器人指令翻譯輸出為規(guī)定的中間代碼。代碼執(zhí)行過(guò)程中,當(dāng)用戶給定的機(jī)器人運(yùn)行軌跡為連續(xù)直線形移動(dòng)時(shí),有的目標(biāo)點(diǎn)并不需要精確移動(dòng)到,此時(shí)為使機(jī)器人平穩(wěn)運(yùn)行,可以采用貝塞爾曲線路徑對(duì)原始路徑在目標(biāo)點(diǎn)處進(jìn)行平滑擬合,降低機(jī)構(gòu)的沖擊。因此連續(xù)型軌跡可規(guī)劃為精確定位的插補(bǔ)和軌跡逼近的插補(bǔ)。

圖7 目標(biāo)代碼輸出結(jié)果Fig.7 The Object Code
這在機(jī)器人運(yùn)動(dòng)指令中體現(xiàn)為位置精度等級(jí)的選取,即在指令MOVL的參數(shù)中,PL的值代表過(guò)渡路徑的平滑度,PL設(shè)定值越大,則過(guò)渡曲線越平緩,但接近原始路徑的程度越低。當(dāng)PL設(shè)為0時(shí),機(jī)器人將按規(guī)劃路徑精確移動(dòng)而不進(jìn)行過(guò)渡曲線的擬合。對(duì)于精度的劃分,如圖8所示,過(guò)渡點(diǎn)Q1與Q2的選取遵循λ∈[0,1]的規(guī)則,其中λ作為精度系數(shù),取值大小直接影響過(guò)渡。精度等級(jí)對(duì)照如表3所示。

表3 精度等級(jí)對(duì)照表Tab.3 Precision control table
插補(bǔ)器采用了直線段的五次方多項(xiàng)式軌跡插補(bǔ)函數(shù),四階貝塞爾曲線路徑平滑函數(shù)及曲線段的五次多項(xiàng)式軌跡插補(bǔ)函數(shù)。在插補(bǔ)器中經(jīng)軌跡插補(bǔ)后的路徑點(diǎn)擬合如圖9所示。

圖9 路徑點(diǎn)插值結(jié)果Fig.9 The results of path interpolation

圖8 位置等級(jí)規(guī)劃Fig.8 Position Levels
本文在工程需求分析的基礎(chǔ)上,以Delta機(jī)器人為工作平臺(tái),重點(diǎn)開(kāi)發(fā)了機(jī)器人軟件模塊中的語(yǔ)言系統(tǒng)的解釋模塊。選用AL機(jī)器人語(yǔ)言并擴(kuò)充作為用戶輸入語(yǔ)言,基于MFC設(shè)計(jì)了機(jī)器人程序編輯器,并基于C語(yǔ)言重點(diǎn)開(kāi)發(fā)了機(jī)器人代碼解釋系統(tǒng),通過(guò)三次掃描依次調(diào)用詞法分析程序、語(yǔ)法分析程序、語(yǔ)義分析及中間代碼生成程序以完成源指令到目標(biāo)指令的翻譯。經(jīng)指令測(cè)試,驗(yàn)證了各模塊運(yùn)行的正確性。
參考文獻(xiàn):
[1]彭慧,尹朝萬(wàn).機(jī)器人語(yǔ)言研究[J].機(jī)器人,1991,13(5):36-41.
[2]張瑋光.面向復(fù)雜作業(yè)的微操作機(jī)器人編程語(yǔ)言[D].天津:南開(kāi)大學(xué),2008.
[3]黃永華.機(jī)器人語(yǔ)言編程系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].南京:東南大學(xué),2004.
[4]王浩,謝存禧.工業(yè)機(jī)器人解釋器的研究[J].機(jī)械設(shè)計(jì)與制造,2010(3):160-161.
[5]郭顯金.工業(yè)機(jī)器人編程語(yǔ)言的設(shè)計(jì)與實(shí)現(xiàn)[D].武漢:華中科技大學(xué),2013.
[6]別衛(wèi)春,朱志紅,葉伯生,等.HNC-IR機(jī)器人語(yǔ)言解釋系統(tǒng)的研究與實(shí)踐[J].機(jī)電一體化,2000,6(3):27-30.
[7]王偵,馬旭東.工業(yè)機(jī)器人語(yǔ)言解釋器的設(shè)計(jì)與實(shí)現(xiàn)[J].工業(yè)控制計(jì)算機(jī),2015,28(3):6-8.
[8]伍春香.編譯原理[M].北京:清華大學(xué)出版社,2001.
[9]熊巍.機(jī)器人編程語(yǔ)言解釋器的研究與開(kāi)發(fā)[D].北京:北京工業(yè)大學(xué),2005.
[10]LOUDEN KENNETH C.編譯原理及實(shí)踐(計(jì)算機(jī)科學(xué)叢書)[M].北京:機(jī)械工業(yè)出版社,2011.