巢惠世,梁宏斌,蔡土淇
(遼寧科技大學 機械工程與自動化學院,遼寧 鞍山 114051)
21世紀以來,我國工業(yè)機器臂取得了巨大的進步,隨著我國傳統(tǒng)制造業(yè)的轉(zhuǎn)型升級,我國的機械臂市場的潛力是巨大的,所以對機械臂的研究具有重要意義[1-2]?,F(xiàn)在機械臂常用的操作系統(tǒng)像VxWorks都是商用的操作系統(tǒng),雖然實時性好,但是價格昂貴,而價格低廉、開源且可裁剪的Linux則非常適合機械臂系統(tǒng)的自主開發(fā)。由于標準的Linux操作系統(tǒng)不具備實時性,需要對其進行實時性改造。
在Linux的實時改造方面,有采用雙內(nèi)核路線的美國新墨西哥州立大學研制的RT-Linux、意大利米蘭學院研制的RTAI以及移植性更好的Xenomai[3-4];還有采用直接修改內(nèi)核路線的加州大學開發(fā)的RED-Linux,堪薩斯大學開發(fā)的Kurt-Linux,以及實時搶占補丁RT-Patch[5]。經(jīng)過改造的Linux可以在數(shù)控系統(tǒng)、機器人系統(tǒng)、航空領(lǐng)域等得到應用。趙翔宇[6]采用嵌入式Linux對六自由度機械臂控制系統(tǒng)進行設計,運用CAN總線的分布式控制方式,實現(xiàn)了機械臂點到點的抓取控制;應思齊[7]利用Linux系統(tǒng)的嵌入式平臺作為SCARA機械臂的控制端,并基于Qt應用軟件對機械臂進行運動控制,提高了系統(tǒng)的實時性;中科院沈陽自動化研究所采用RT-Linux實時嵌入式操作系統(tǒng),研制出基于對話方式設計實現(xiàn)的機器人示教器[8]。
本文針對機械臂實時控制系統(tǒng)開發(fā),采用RT-Patch的改造方法對Linux進行實時性改造,在經(jīng)過改造的Linux環(huán)境下對機械臂下位機進行系統(tǒng)架構(gòu)搭建,實現(xiàn)譯碼、插補、逆解、通信功能;同時結(jié)合示教器軟件設計,完成機械臂從示教器端的指令輸入到下位機的數(shù)據(jù)處理功能,具有示教再現(xiàn)功能,同時使機械臂在實時性達到要求的前提下運行平穩(wěn)且滿足一定的運動精度要求。
Linux作為開放源碼項目的典型代表,在各個領(lǐng)域都有廣泛的應用,但是標準的Linux是一款分時操作系統(tǒng),追求的是高的信息吞吐量和公平性[9],雖然Linux的內(nèi)核在2.4版本后支持和優(yōu)化了實時性,但是它本質(zhì)上并不是一個實時操作系統(tǒng)。主要體現(xiàn)在以下方面[10]:(1)內(nèi)核的不完全搶占;(2)中斷不可搶占;(3)時鐘顆粒粗糙;(4)實時調(diào)度策略不足;(5)優(yōu)先級反轉(zhuǎn);(6)虛擬內(nèi)存。
為解決Linux的實時性問題,本文采用的方法是在Linux社區(qū)kernel的基礎上加上RT-Preempt補丁,以使得Linux滿足實時的需求[11]。RT-Preempt補丁對Linux內(nèi)核的主要改造包括:(1)通過用rtmutexes重新實現(xiàn),使內(nèi)核內(nèi)鎖定原語(使用自旋鎖)可搶占;(2)受spinlock_t和rwlock_t保護的關(guān)鍵部分現(xiàn)在可以搶占;(3)將中斷處理程序轉(zhuǎn)換為可搶占的內(nèi)核線程,RT-Preempt補丁在內(nèi)核線程上下文中處理軟中斷處理程序,該任務由task_struct表示,就像普通的用戶空間進程一樣,但是也可以在內(nèi)核上下文中注冊IRQ;(4)將舊的Linux計時器API轉(zhuǎn)換為用于高分辨率內(nèi)核計時器的單獨基礎結(jié)構(gòu),再加上用于超時的基礎結(jié)構(gòu),從而產(chǎn)生具有高分辨率的用戶空間POSIX計時器;(5)豐富了實時調(diào)度策略算法;(6)實現(xiàn)內(nèi)核內(nèi)自旋鎖和信號量的優(yōu)先級繼承;(7)提供內(nèi)存鎖定功能,避免實時處理中存儲頁被換出。
測試環(huán)境為Ubuntu10.10,在安裝配置完實時補丁后,再在Linux下安裝RT測試工具集,運行其中的cyclictest測試工具,默認創(chuàng)建5個SCHED_FIFO策略的RT線程,優(yōu)先級76~80,運行周期是1 000 μs、 1 500 μs、2 000 μs、2 500 μs、3 000 μs,分別在標準Linux環(huán)境下和改造后的Linux環(huán)境下進行測試,測試結(jié)果如圖1所示。由圖可知標準Linux內(nèi)核中RT線程投入運行時間非常不穩(wěn)定,而按照相關(guān)文檔加入實時補丁的Linux系統(tǒng)的最大延遲時間為436 μs,平均延遲時間為192 μs,本次測試的最大延遲時間為241 μs,證明Linux系統(tǒng)實時改造是滿足要求的。
圖1 延遲調(diào)用時間圖
機械臂的伺服控制系統(tǒng)如圖2所示,主要由指令平臺(示教器端,即PC機)、實時平臺(控制器端,即內(nèi)嵌Linux系統(tǒng)的工控機)以及關(guān)節(jié)模塊的伺服驅(qū)動器和伺服電機組成三級控制。本文主要對指令平臺和實平臺進行設計。
機器臂示教器作為控制系統(tǒng)的上位機是運動控制器與操作人員之間連接的橋梁,一方面負責對操作人員的操作進行處理,例如機器人作業(yè)文件編寫、示教再現(xiàn)等;另一方面在圖形界面上監(jiān)控機器人運動過程中的狀態(tài)信息,并向控制器發(fā)送指令使機械臂完成相應的動作。
圖2 機械臂伺服控制系統(tǒng)框圖
示教器的軟件編寫是在Windows環(huán)境下以Qt作為開發(fā)工具進行的,主要進行4方面設計。
(1)設計一款合適的人機交互界面。整個示教器主要分為主界面和控制界面兩個界面進行顯示。主界面主要顯示的是示教編程功能,在該界面可進行指令的輸入;控制界面主要進行狀態(tài)顯示、數(shù)據(jù)點顯示、模擬仿真視圖顯示和通信功能接口。同時示教器也具有指令的插入編輯等功能對應各自的界面。主界面圖如圖3所示。
圖3 主界面圖
(2)示教器與機器人控制器進行實時交互。示教器與機器人控制器的通信通過基于TCP/IP協(xié)議的以太網(wǎng)通信實現(xiàn)。
(3)提供了機器人操作的基本功能,含有直線、圓弧、關(guān)節(jié)的插補運動指令,在控制界面還添加了插補點坐標的顯示和插補點的仿真試圖。
(4)通過界面上的狀態(tài)信息顯示出當前機械臂的狀態(tài),遇到故障或者錯誤時及時反饋到示教器界面。
下位機采用Linux系統(tǒng)(加入實時補丁)作為多任務控制系統(tǒng)的編寫環(huán)境平臺,具有多進程設計的控制系統(tǒng)其穩(wěn)定性比較高,因此多任務采用多進程進行處理。本次多任務分為四個進程,分別為:TCP通信進程、I/O進程(實時RT進程)、譯碼進程、插補逆解進程(實時RT進程)。
TCP通信進程:與上位機進行TCP通信實現(xiàn)數(shù)據(jù)信息的交互,上位機獲得的人機運動指令TXT文檔傳遞給下位機[12]。上位機先發(fā)送文件的頭部信息,發(fā)送完畢后延時5 ms,然后循環(huán)讀取4 KB內(nèi)存大小的文件數(shù)據(jù),再發(fā)送給下位機直到文件讀取結(jié)束。下位機先接收文件的頭部信息,然后再連續(xù)接收文件的內(nèi)部信息,從而實現(xiàn)人機涌動指令TXT文檔的接收。
I/O進程:此進程為實時進程,以20 ms的周期來讀取相關(guān)GPIO口的狀態(tài)置位信息,和內(nèi)部設置好的GPIO口置位信息對比從而進行相關(guān)的程序處理。
譯碼進程:逐行讀取人機運動指令TXT文檔,根據(jù)每行的運動指令類型添加特征符變量,然后將每行識別的位置、速度、歐拉角的信息和特征符變量依次添加到鏈表當中,然后通過管道通信給插補逆解進程(實時RT進程)傳輸鏈表信息。具體過程如圖4所示。
圖4 譯碼流程框圖
圖5 插補逆解流程圖
插補逆解進程:設置定時器,以10 ms為周期觸發(fā)定時器(設計的插補周期為10 ms),進程開始依次讀取鏈表信息進行加減速、軌跡插補、逆解計算,然后進程移出工作隊列放入等待隊列,任務進入阻塞狀態(tài),等待定時器觸發(fā)喚醒進程的下一次程序處理,直到鏈表全部讀取完。流程圖見圖5。
前面已經(jīng)驗證安裝RT補丁后的系統(tǒng)實時性是滿足要求的,這里進行系統(tǒng)調(diào)用插補逆解進程完成機械臂運動控制的實時性檢驗,仍然用rt-test測試工具集對其進行實時性測試,測試結(jié)果如圖6所示。
圖6 程序執(zhí)行時間圖
圖中橫坐標為所有插補點,縱坐標為每次執(zhí)行插補逆解所需要的執(zhí)行時間,從圖中可以看到最大執(zhí)行時間為310 μs,加上進程最大延遲調(diào)用時間436 μs,一共耗時不超過1 ms,為后續(xù)添加更復雜功能提供了可能性,證明此系統(tǒng)設計具有良好的實時性和擴展性。
在機械臂的建模方法上采用D-H參數(shù)法[13]建立關(guān)節(jié)坐標系,以PUMA560為原型建立機器人連桿坐標系。利用MATLAB環(huán)境下的Robotic工具箱[14]的Link和robot函數(shù)建立機器人處于零點位置的位姿,根據(jù)表1給出的D-H參數(shù)建立機械臂的模型,建立第i個連桿的命令如下:
Li=Link(θi,di,ai,αi)
利用SerialLink函數(shù)將六個連桿依次序連接起來,命令如下:
robot=SerialLink([L1,L2,L3,L4,L5,L6])
調(diào)用teach函數(shù)調(diào)節(jié)6個關(guān)節(jié)變量,實現(xiàn)對機器人模型進行控制,關(guān)節(jié)變量由實時平臺的Linux系統(tǒng)計算得到。整個過程模擬焊接軌跡過程,包括三段直線,一段圓弧。機械臂的運動仿真結(jié)果如圖7所示,從仿真中可以直觀地看到末端執(zhí)行器的整個連續(xù)平穩(wěn)的運動軌跡。
本文在Linux內(nèi)核上外加RT補丁的實時改造的基礎上,獨立完成對六自由度機械臂控制系統(tǒng)的搭建。進行以示教器為上位機的示教器軟件設計,完成了通信、指令輸入、視圖仿真等功能,下位機則進行了包括TCP通信、I/O、譯碼、插補逆解進程的系統(tǒng)架構(gòu)搭建。
通過實驗,驗證了Linux外加RT補丁的實時性改造的可行性,并且完全可以應用到機械臂的控制系統(tǒng)當中,實時性可以滿足,同時對整個控制系統(tǒng)進行仿真,仿真結(jié)果為連續(xù)平穩(wěn)的曲線,證明了機械臂控制系統(tǒng)的運動控制的正確性和可行性。
圖7 機械臂運動仿真圖