楊曉鈞,井孟凱,李 朋,周紹帆
機器人語言系統(tǒng)是工業(yè)機器人與用戶交流的接口,用戶可以借助語言系統(tǒng)以機器人指令編寫的方式實現(xiàn)對機器人的控制[1]。機器人語言系統(tǒng)一般包括:機器人編程語言,代碼編輯器和代碼解釋器。
整個語言系統(tǒng)的處理過程為:用戶根據(jù)自己的意圖,按照機器人語言規(guī)定的格式編寫出機器人指令,經(jīng)由編輯器輸入編輯得到機器人源程序,但通過編輯器輸入的機器人源程序并不能直接被機器人后端的運動控制模塊所理解,需由代碼解釋器翻譯與數(shù)據(jù)處理完成從源程序到中間程序的轉(zhuǎn)換,作為后端運動控制模塊的輸入[3],控制器調(diào)用軌跡規(guī)劃模塊進行插補運算,最后送給執(zhí)行機構(gòu)去控制工業(yè)機器人的動作,如圖1所示。
其中代碼解釋系統(tǒng)連接著機器人語言系統(tǒng)和控制系統(tǒng),是語言系統(tǒng)最主要的子模塊。它的作用是將用戶編寫的源程序指令翻譯成機器人控制系統(tǒng)能夠識別的目標(biāo)指令[2]。本文將以代碼解釋器為主要任務(wù)完成對機器人語言系統(tǒng)的開發(fā)。
圖1 機器人語言系統(tǒng)結(jié)構(gòu)圖Fig.1 Structure of the robot language system
在機器人領(lǐng)域中,通常有專用的機器人編程語言。不同的工業(yè)機器人編程語言并不一樣,但是基本的功能是必要的。指令代碼主要以動作級語言AL語言為主體,并在其基礎(chǔ)上進行修改作為工業(yè)機器人的編程語言。不僅具有基本的運動指令及運算指令,還擁有與外部傳感器交互的輸入輸出指令,以及改變操作流程的控制指令,同時還具有根據(jù)用戶需求添加特定指令的功能,實現(xiàn)了很好的開放性。機器人程序格式舉例如表1示。
表1 機器人編程語言指令格式Tab.1 Examples of Robot Programming Language
所開發(fā)的解釋器系統(tǒng)軟件結(jié)構(gòu)如圖2所示。
圖2 解釋系統(tǒng)軟件結(jié)構(gòu)Fig.2 Structure of the Code Interpreter
本文采用三遍掃描的方式[4]來實現(xiàn)解釋器的工作,即各子模塊作為獨立程序,按步驟依次運行。機器人源程序輸入后,調(diào)用解釋器的詞法分析函數(shù)檢查并轉(zhuǎn)換源程序,輸出為規(guī)定格式的中間代碼1;中間代碼1進而輸入到語法分析函數(shù),完成對源程序語法結(jié)構(gòu)的檢查,并輸出中間代碼2,記錄語句類型信息;然后將中間代碼1、2輸入到語義分析函數(shù),進行指令內(nèi)容的檢查,通過后將被提取信息到符號表并翻譯成最終的目標(biāo)代碼;對中途識別出的非法指令將記錄狀態(tài)并轉(zhuǎn)入相應(yīng)的錯誤處理函數(shù)[5]。
詞法分析的主要任務(wù)是識別出源程序中的各個單詞,把源程序中的字符轉(zhuǎn)換成一種內(nèi)部形式,遇到識別不出的符號,要進行錯誤處理。選用的機器人語言包括以下幾種單詞符號:(1)關(guān)鍵字,如SUB、OFF、IF等;(2)標(biāo)識符,如QI0、QD2、KI#3、P1等給定變量名;(3)常量,如整形或浮點型;(4)判斷符以及位置參數(shù)等。詞法分析程序除了識別單詞外,還輸出該單詞類型,所以為每一個基本命令字都設(shè)置了標(biāo)號值與屬性值[6],部分對應(yīng)關(guān)系如表2。
表2 單詞符號對照表Tab.2 Intermediate Format 1
圖3 分離單詞流程圖Fig.3 Lexical Analysis Diagram
分析每行代碼時,識別單詞分為兩步:先通過函數(shù)Separword()將各單詞分離出來;然后調(diào)用函數(shù)Recogword()負責(zé)具體識別每個單詞。當(dāng)識別出單詞后,同時需輸出并存儲單詞的標(biāo)號與屬性值,以及所在位置,為此在VC程序中,定義一個類CWordInfor來存儲以上信息,該類型具有五個數(shù)據(jù)成員與兩個成員函數(shù)。
通過對機器人語言規(guī)則的研究,可以對每行指令以空格符或判斷符為界來劃分單詞,為此,設(shè)計分離單詞的流程圖,如圖3,按照規(guī)劃好的流程圖即可設(shè)計分離單詞的算法。當(dāng)單詞完成分離之后即可由Recogword()函數(shù)進行識別工作,單詞識別后,輸出單詞的同時建立CWordInfor類的對象,保存對應(yīng)單詞的標(biāo)號值與屬性值等相關(guān)信息用于后續(xù)的語法分析處理。對于無法識別的單詞將進行特殊賦值,并轉(zhuǎn)入錯誤處理。
語法分析的任務(wù)是將輸入的單詞流進行組合,按照特定的語法規(guī)則去分析源程序的語法結(jié)構(gòu)并檢查語法錯誤,當(dāng)發(fā)生錯誤時輸出相應(yīng)的錯誤信息,檢查無誤則輸出合法語句[7]。
圖4 語法分析流程圖Fig.4 Syntax Analysis Diagram
本文采用的機器人語言指令結(jié)構(gòu)比較固定,所以可以采用將單詞的標(biāo)號值與規(guī)范的標(biāo)號值相匹配的方法進行語法分析。首先建立規(guī)范指令的數(shù)字串集合,稱為序列號表。將語法結(jié)構(gòu)正確的指令中所有的單詞標(biāo)號值連成數(shù)字串,作為序列號存入序列號表中;當(dāng)處理一行指令時,將指令中所有單詞的標(biāo)號值提取并連為數(shù)字串,通過matc_nu1()函數(shù)與序列號表中的序列號進行查詢,查詢到相同的數(shù)字串則表明匹配成功。若匹配成功,則代表語法結(jié)構(gòu)正確;若失敗,則對該行指令進行錯誤處理。例如“MOVJ P2 VJ=50 PL=0”這條指令中所有單詞按順序組合出的序列號為“51359266026”,分析首單詞“MOVJ”的標(biāo)號值為51,則進入MOVJ指令的序列號表進行匹配查詢。對應(yīng)序列號表為:{"51359286026","51359266026","51360265926", "51360265928", "5135926", "5135928"},根據(jù)查詢對比,與表中第二項序列號匹配,證明該行指令語法格式正確??蛇M行中間代碼2的生成,進入語義分析模塊的處理。語法分析模塊流程如圖4所示。
語法分析是檢查句子的結(jié)構(gòu),語義分析則是檢查句子的意思。因此語義分析的任務(wù)為對源程序中每行指令的具體意思進行剖析,檢查指令中的靜態(tài)語義錯誤。若同時滿足語法層面的“形式”正確和語義層面上的“內(nèi)容”正確,則指令無誤,可翻譯成等效的中間代碼。因此在語義分析和中間代碼生成階段,解釋系統(tǒng)要做的工作是進行靜態(tài)語義檢查和翻譯[8]。
語義分析的方法主要依照編譯原理中的語法制導(dǎo)翻譯的思想。即對每一種指令類型都編制其各自的語義子程序,其中包括語義檢查模塊和目標(biāo)代碼生成模塊。當(dāng)用語法分析匹配出一條指令時,立即調(diào)用相應(yīng)的語義子程序進行處理[9]。基本流程如圖5所示。
由于在前面詞法分析模塊中,將每個單詞的類型與屬性值等各項信息已提取為類CWordInfor的對象,作為中間代碼1;又經(jīng)過語法分析模塊,識別出每行指令的種類等信息,并保存在類CWordInfor的對象中,作為中間代碼2。因此可將中間代碼1與中間代碼2作為語義分析模塊的輸入,根據(jù)中間代碼2中指令類型及其參數(shù)信息,調(diào)用相應(yīng)的語義動作:通過該指令的靜態(tài)語義檢查模塊對中間代碼1中信息進行查錯與變量表的填充,然后通過翻譯子程序模塊對中間代碼1進行信息的提取[10],完成中間代碼的輸出。語義分析檢查無誤后,進入翻譯模塊,需要對當(dāng)前指令進行信息的提取,以生成中間代碼,在這里采用對每種指令類型創(chuàng)建一種數(shù)據(jù)結(jié)構(gòu)的形式,指令的參數(shù)作為數(shù)據(jù)結(jié)構(gòu)的成員,定義在頭文件Struct.h中。例如對運動指令MOVJ,其數(shù)據(jù)結(jié)構(gòu)定義為:
typedef struct Traj_linear_move
{
int type; //命令類型
圖5 語義分析流程圖Fig.5 Semantic Analysis Diagram
EEPose end; //目標(biāo)點
double maxvel;//速度
int feed_mode; //平滑度
}Traj_joint_move;
對運算指令A(yù)DD、SUB、MUL、DIV等,其數(shù)據(jù)結(jié)構(gòu)定義為:
typedef struct Cal_asmd
{
int type; //命令類型
int caltype;//運算符類型
Vari var1;//操作數(shù):變量1
Vari var2;//操作數(shù):變量2
}Cal_asmd;
其中Vari作為變量類型,用于表示指令中各變量,包括整形變量QIn、浮點型變量QDn、布爾型變量QBn,以及IO接口KI#(n)、KO#(n)等。定義的數(shù)據(jù)結(jié)構(gòu)為:
typedef struct Vari
{
int vtype;//變量類型
union{
int num; //變量標(biāo)號
double value;//常量數(shù)值
}vdata;
}Vari;
將各行指令創(chuàng)建為相應(yīng)的數(shù)據(jù)結(jié)構(gòu)對象后,即可將其提取在消息列表中,定義在頭文件Struct.h中的消息列表的數(shù)據(jù)結(jié)構(gòu)為:
struct CODE_INTERP_LIST_MSG
{
int line_number;//指令行號
int cmd_type; //命令類型
union{ //各指令對應(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表示所存儲的指令類型,聯(lián)合體cmd_data則用于存儲當(dāng)前指令的數(shù)據(jù)結(jié)構(gòu)對象。這樣,創(chuàng)建的消息列表即為當(dāng)前行生成的中間代碼。
進行解釋系統(tǒng)的實例測試,通過在基于MFC開發(fā)的程序編輯器中編寫機器人的運動測試指令,經(jīng)過代碼解釋器最終生成中間代碼以驗證機器人語言系統(tǒng)尤其是代碼解釋系統(tǒng)的正確性。測試指令在程序編輯器中輸入如圖6所示。
圖6 測試指令輸入Fig.6 The Testing Code
經(jīng)過解釋系統(tǒng)后生成的中間代碼如圖7所示。
可以證明,本文開發(fā)的代碼解釋器可以準(zhǔn)確地將機器人指令翻譯輸出為規(guī)定的中間代碼。代碼執(zhí)行過程中,當(dāng)用戶給定的機器人運行軌跡為連續(xù)直線形移動時,有的目標(biāo)點并不需要精確移動到,此時為使機器人平穩(wěn)運行,可以采用貝塞爾曲線路徑對原始路徑在目標(biāo)點處進行平滑擬合,降低機構(gòu)的沖擊。因此連續(xù)型軌跡可規(guī)劃為精確定位的插補和軌跡逼近的插補。
圖7 目標(biāo)代碼輸出結(jié)果Fig.7 The Object Code
這在機器人運動指令中體現(xiàn)為位置精度等級的選取,即在指令MOVL的參數(shù)中,PL的值代表過渡路徑的平滑度,PL設(shè)定值越大,則過渡曲線越平緩,但接近原始路徑的程度越低。當(dāng)PL設(shè)為0時,機器人將按規(guī)劃路徑精確移動而不進行過渡曲線的擬合。對于精度的劃分,如圖8所示,過渡點Q1與Q2的選取遵循λ∈[0,1]的規(guī)則,其中λ作為精度系數(shù),取值大小直接影響過渡。精度等級對照如表3所示。
表3 精度等級對照表Tab.3 Precision control table
插補器采用了直線段的五次方多項式軌跡插補函數(shù),四階貝塞爾曲線路徑平滑函數(shù)及曲線段的五次多項式軌跡插補函數(shù)。在插補器中經(jīng)軌跡插補后的路徑點擬合如圖9所示。
圖9 路徑點插值結(jié)果Fig.9 The results of path interpolation
圖8 位置等級規(guī)劃Fig.8 Position Levels
本文在工程需求分析的基礎(chǔ)上,以Delta機器人為工作平臺,重點開發(fā)了機器人軟件模塊中的語言系統(tǒng)的解釋模塊。選用AL機器人語言并擴充作為用戶輸入語言,基于MFC設(shè)計了機器人程序編輯器,并基于C語言重點開發(fā)了機器人代碼解釋系統(tǒng),通過三次掃描依次調(diào)用詞法分析程序、語法分析程序、語義分析及中間代碼生成程序以完成源指令到目標(biāo)指令的翻譯。經(jīng)指令測試,驗證了各模塊運行的正確性。
參考文獻:
[1]彭慧,尹朝萬.機器人語言研究[J].機器人,1991,13(5):36-41.
[2]張瑋光.面向復(fù)雜作業(yè)的微操作機器人編程語言[D].天津:南開大學(xué),2008.
[3]黃永華.機器人語言編程系統(tǒng)的設(shè)計與實現(xiàn)[D].南京:東南大學(xué),2004.
[4]王浩,謝存禧.工業(yè)機器人解釋器的研究[J].機械設(shè)計與制造,2010(3):160-161.
[5]郭顯金.工業(yè)機器人編程語言的設(shè)計與實現(xiàn)[D].武漢:華中科技大學(xué),2013.
[6]別衛(wèi)春,朱志紅,葉伯生,等.HNC-IR機器人語言解釋系統(tǒng)的研究與實踐[J].機電一體化,2000,6(3):27-30.
[7]王偵,馬旭東.工業(yè)機器人語言解釋器的設(shè)計與實現(xiàn)[J].工業(yè)控制計算機,2015,28(3):6-8.
[8]伍春香.編譯原理[M].北京:清華大學(xué)出版社,2001.
[9]熊巍.機器人編程語言解釋器的研究與開發(fā)[D].北京:北京工業(yè)大學(xué),2005.
[10]LOUDEN KENNETH C.編譯原理及實踐(計算機科學(xué)叢書)[M].北京:機械工業(yè)出版社,2011.