宋玲玲
(濱州職業(yè)學院,山東濱州,256603)
在機器人運動控制研究中,有許多優(yōu)秀的控制成果都是采用基于CAN 總線的驅(qū)動方案,這些成果對于學習和研究機器人運動控制和應用有著極大的幫助。然而CAN 總線型伺服驅(qū)動器在國內(nèi)機器人行業(yè)并不是主流產(chǎn)品,一旦出現(xiàn)損壞,很難維修和更換,不利于這些優(yōu)秀成果的繼承和使用。
例如,Barrett Technology 公司推出的WAM 機器人就是這樣一款優(yōu)秀的、用于學習、研究和應用的協(xié)作機器人。WAM 機器人采用CAN 總線驅(qū)動,除驅(qū)動器等硬件外,所有控制部分為開源代碼,非常適合于進行底層驅(qū)動研究和高級編程的學習和應用。但是,WAM 機器人只使用特殊定制的基于CAN 總線的Puck 驅(qū)動器,維護成本高,不利于應用推廣和進一步的底層研究。
為此,根據(jù)國內(nèi)EtherCAT 總線型伺服驅(qū)動器在機器人行業(yè)的廣泛應用現(xiàn)狀,結(jié)合將WAM 機器人改造成基于EtherCAT 總線型驅(qū)動器的過程,本文提供一種用EtherCAT 驅(qū)動器替代CAN 驅(qū)動器軟件方案,來繼承和發(fā)揚這些優(yōu)秀的機器人成果,為其他驅(qū)動和控制領(lǐng)域技術(shù)提供一點借鑒。
本文共五個部分,第一部分介紹WAM 機器人驅(qū)動相關(guān)內(nèi)容;第二部分提出改造方案;第三部分講述改造實現(xiàn)過程;第四部分進行實驗并給出結(jié)果;第五部分進行總結(jié),給出類似改造的一點建議。
WAM 機器人[1]采用鋼絲繩輪組作為減速機,替代齒輪傳動,具有更小的關(guān)節(jié)摩擦阻力,是一款“繩驅(qū)”機器人。由于采用繩驅(qū),動力驅(qū)動后置,機器人易于操作,是一款優(yōu)秀的、既可以用于科研、也可以實際應用的協(xié)作機器人。
如圖1 所示,WAM 機器人主要包括,內(nèi)部PC、外部PC、驅(qū)動電機、安全模塊、控制面板和顯示面板等部分。其中,外部PC 為可選組件,可由用戶自己購買和配置;內(nèi)部PC 為機器人必選的進行機器人編程控制的計算機。WAM 所有電機均為直流無刷電機,其驅(qū)動器為Puck,由Barrett 公司特別定制,通信采用CAN 總線,應用層協(xié)議也為自定義。安全模塊可以監(jiān)控機器人的速度、指令扭矩的大小,控制PC 與Puck 之間通信速率,控制顯示與控制面板上的按鈕及狀態(tài)??刂泼姘搴惋@示面板用來控制和顯示機器人的狀態(tài)。上電后,WAM 有三種可能的狀態(tài):活動、空閑和故障。在執(zhí)行任何命令之前,必須手動激活WAM,如果出現(xiàn)問題,WAM 將自動進入空閑或故障狀態(tài)。
圖1 WAM 系統(tǒng)簡圖
WAM 機器人提供的控制接口為軟件開發(fā)包,libbarrett(實時版本1.2.4,非實時版本2.0),是C++開源庫,分為兩層,上層為用戶提供高級運動編程接口,下層執(zhí)行實時運動控制。該軟件系統(tǒng)運行環(huán)境為裝有Xenomai 實時內(nèi)核的Ubuntu 系統(tǒng)。圖2 給出來WAM 機器人的邏輯控制圖,用戶使用過編程方式將控制指令經(jīng)由Xenomai 發(fā)送到CAN 總線卡,再由CAN 總線卡發(fā)送到WAM 的各個Puck。命令控制周期最高為1kHz,默認速率為500Hz。
圖2 WAM 邏輯控制圖
2.1.1 軟件接口
WAM 機器人與硬件部分的通信是以CAN 總線卡為媒介的,用戶程序和實時代碼通過CAN 總線卡指揮硬件驅(qū)動機器人運動。為了不改變或者少改變libbarrett 庫代碼,需要設計好WAM 機器人與硬件部分通信的軟件接口。WAM 機器人的CAN 消息是自定義的應用層消息,不是標準的應用層協(xié)議,因此軟件接口需要有消息轉(zhuǎn)換的處理單元,能夠解析WAM 的自定義消息。
2.1.2 電機驅(qū)動器
WAM 機器人的電機驅(qū)動器為基于CAN 總線的Puck驅(qū)動器,是Barrett 公司定制開發(fā)的驅(qū)動器產(chǎn)品,不是大眾化產(chǎn)品,不支持EtherCAT,出現(xiàn)故障不能維修只能更換,因此,需要全部更換為基于EtherCAT 通信的通用型驅(qū)動器產(chǎn)品。
2.1.3 驅(qū)動電機
WAM 機器人上使用的直流電機是Barrett 公司定制的與Puck 驅(qū)動器相配合的電機,這些電機特性參數(shù)無法全部獲得,因此需要更換為廣泛使用的品牌電機。
2.1.4 安全模塊
安全模塊在WAM 機器人中具有重要的地位,起到對機器人限速、安全防護的功能,當機器人運動超速或電機電流過大時進行安全處理。因為安全模塊也是采用puck 進行管理的,改造后不能應用,且限速和限流功能在基于EtherCAT 的驅(qū)動器上都有配置,所以取消硬件安全模塊。
本次改造硬件部分選擇一種方案,選用BLM 無框無刷直流電機[2]替代原配電機,驅(qū)動器采用支持EtherCAT通信的Elmo 直流驅(qū)動器[3],編碼器采用多摩川磁編碼器。軟件部分有兩個備選方案,一是在用戶層開發(fā)CAN 消息與EtherCat 消息轉(zhuǎn)換接口,開發(fā)EtherCAT 主站,進行運動控制,在消息轉(zhuǎn)換接口提供部分WAM 安全模塊功能;二是在內(nèi)核上實現(xiàn)上述功能,軟件開發(fā)在Ubuntu 18.04上進行,WAM 軟件接口庫采用libbarrett-2.0.0 版本。EtherCAT主站采用SOEM主站代碼[4]移植。在改造實驗中,第一種軟件方案不能保證實時控制周期,所以采用第二種軟件方案進行改造。
硬件改造比較容易實現(xiàn),根據(jù)WAM 的技術(shù)規(guī)范就可以選擇出適合的電機功率及相應的編碼器和驅(qū)動。安全模塊的大部分功能在每個Elmo 驅(qū)動器上都有了相應的功能,例如限流、限速、報警和急停等。因此,此次改造就不單獨設立硬件的安全模塊,而是設立一個軟件“安全模塊”來實現(xiàn)單個驅(qū)動器無法實現(xiàn)安全模塊的功能的部分。
Ubuntu 系統(tǒng)下硬件驅(qū)動程序都是以內(nèi)核模塊(kernel module)形式存在的,這樣Ubuntu 可以像管理文件系統(tǒng)一樣管理各種硬件。為了在用戶層像訪問真實硬件CAN總線卡一樣,在內(nèi)核建立一塊虛擬CAN 總線卡,即在內(nèi)核創(chuàng)建一個CAN 總線虛擬驅(qū)動模塊,實現(xiàn)CAN 總線卡的各種功能,替代硬件總線卡。虛擬CAN 內(nèi)核模塊名字為“ec_CAN”,有兩個重要功能,一是CAN 消息處理單元,負責與用戶層CAN 通信的交互任務,由操作系統(tǒng)根據(jù)用戶層通信要求執(zhí)行調(diào)度;二是EtherCAT 總線處理單元,負責EtherCAT 主站及相關(guān)控制任務的處理,由一個內(nèi)核線程進行管理。
因為虛擬CAN 模塊不是真實硬件的驅(qū)動程序,所以不需要接收硬件上CAN 消息,僅需要處理與用戶層交互CAN 信息,即執(zhí)行用戶層消息發(fā)送處理和填充消息接收隊列。因此模塊接收函數(shù)直接返回處理成功即可,由發(fā)送函數(shù)處理CAN 消息發(fā)送和接收。
根據(jù)WAM 的CAN 消息規(guī)范,需處理的CAN 消息分為五類:
1)各電機驅(qū)動器一般消息:獲取各驅(qū)動的基本參數(shù),如編碼器分辨率、扭矩常數(shù)等。
2)WAM 主體關(guān)節(jié)各驅(qū)動器消息:獲取各關(guān)節(jié)編碼器值、設置驅(qū)動力矩。
3)手部關(guān)節(jié)各驅(qū)動器消息:獲取各關(guān)節(jié)編碼器值、設置驅(qū)動力矩。
4)力傳感器消息:獲取各維度受力和力矩的測量值。
根據(jù)以上分類,分別通過EtherCAT 主站存取各驅(qū)動器相應的參數(shù)和狀態(tài)數(shù)值。為了不影響EtherCAT 主站的控制周期,CAN 消息處理不直接訪問EtherCAT 主站,而是利用數(shù)據(jù)緩沖區(qū)進行數(shù)據(jù)交換。該緩沖區(qū)由EtherCAT主站主控循環(huán)更新。
CAN 消息處理提供八個主要接口函數(shù):
1)void activeWAM(bool ac) :負責執(zhí)行激活或停止WAM 機器人,在驅(qū)動器側(cè)使能或不使能驅(qū)動器。
2)unsigned int32 getEncoder(int8 index) :負責取各驅(qū)動器編碼器值。
3)void setTorque(int8 index, unsigned int16) :負責設置各驅(qū)動器力矩值。
4)unsigned int16 getStates(void) :負責取系統(tǒng)狀態(tài)。
5)void emergence(void) :負責執(zhí)行急停。
職業(yè)院校通信專業(yè)人才培養(yǎng)目標一般是:面向現(xiàn)代信息通信技術(shù)(Information and Communication Technology,ICT)服務產(chǎn)業(yè)相關(guān)工程設計、建設、監(jiān)理、督導、維護、優(yōu)化等崗位,培養(yǎng)熟悉現(xiàn)代通信系統(tǒng)及終端產(chǎn)品的性能和工作原理,具有通信系統(tǒng)及其設備生產(chǎn)、安裝、運維及工程管理、網(wǎng)絡規(guī)劃優(yōu)化、電信業(yè)務營銷等能力的高等技術(shù)技能型人才。
6)void resetDriver(int8 index) :負責復位每個驅(qū)動器。
7)unsigned int16 getInputs(void) :負責獲取各驅(qū)動器數(shù)字輸入值。
8)void setOutputs(unsigned int16 outputs) :負責設置各驅(qū)動數(shù)字輸出值。
總線處理單元負責與各個Elmo 驅(qū)動器進行通信,存取各種參數(shù),控制輸入輸出端子,實現(xiàn)驅(qū)動器的周期力矩控制。總線處理單元邏輯上包含一個EtherCAT 主站,該主站由SOEM 移植而成。
3.3.1 SOEM 主站移植
SOEM 是 簡 單 開 源EtherCAT 主 站(Simple Open EtherCAT Master)首字母縮寫,是一個用于學習和使用EtherCAT 主站功能的C 語言函數(shù)庫。在GNU/GPL2.0 許可下,用戶可以修改和發(fā)布源代碼。SOEM 由兩部分組成,一是操作系統(tǒng)相關(guān)的網(wǎng)卡驅(qū)動部分,負責建立RAW socket 通信、延時和線程處理任務,另一部分是純C 語言的EtherCAT 主站,支持COE、SOE、FOE 等常用應用層協(xié)議。本項目采用SOEM 作為EtherCAT 主站基礎(chǔ)代碼,選用版本為1.3.1[4]。
由于國內(nèi)基于EtherCAT 的運動控制主要使用COE應用層規(guī)范,而COE 規(guī)范完全支持canopen_ 402 協(xié)議,符合大眾化的使用習慣,所以本EtherCAT 主站應用層采用COE 規(guī)范。
SOEM 網(wǎng)卡驅(qū)動部分從用戶層移植到內(nèi)核層,需要處理以下幾個重要問題:
1)網(wǎng)卡搜索:搜索用戶指定的用于通信的網(wǎng)卡,搜索依據(jù)為用戶指定的MAC 值。由于在內(nèi)核中搜索,所以不能使用用戶層函數(shù),而是在模塊加載的時候枚舉整個以太網(wǎng)設備列表查找用戶指定的網(wǎng)卡。枚舉函數(shù)為for_each_netdev(&init_net, netdev),其中init_net 為內(nèi)核中全局網(wǎng)絡設備列表表頭,netdev 為枚舉到的網(wǎng)絡設備結(jié)構(gòu)體指針。
2)建立socket 鏈接:為EtherCAT 主站提供通信接口。采用內(nèi)核函數(shù)sock_create_kern()和kernel_bind()打開一個socket 并綁定到用戶指定的網(wǎng)卡。
3)收發(fā)消息: 使用kernel_sendmsg() 和kernel_recvmsg()替代應用層send()和recv()兩個函數(shù),完成對網(wǎng)卡的收發(fā)信息。
4)延時函數(shù):采用內(nèi)核延時函數(shù)封裝。
5)內(nèi)核線程:將用戶層線程的創(chuàng)建及管理移植為內(nèi)核線程的創(chuàng)建和管理。
6)互斥信號:將用戶層互斥信號量移植成內(nèi)核信號量。
在處理好以上幾個問題后,SOEM主站移植任務完成,就可以使用SOEM 編程控制各個Elmo 驅(qū)動器,完成機器人運動控制。
3.3.2 EtherCAT 主站初始化
主站初始化需要完成全部Elmo 驅(qū)動器的檢測與初始化、設定各驅(qū)動器的控制參數(shù)、使各驅(qū)動器進入COE的“操作”狀態(tài)。
驅(qū)動器在初始化時涉及兩個重要的參數(shù),一是最大速度,二是最大電流,這兩個參數(shù)是對安全模塊對速度和電流管理的分解,將這兩個參數(shù)設置在各個驅(qū)動器內(nèi),就起到了安全模塊的功能。
3.3.3 EtherCAT 處理主循環(huán)
主循環(huán)為EtherCAT 通信的周期循環(huán),除了進行通信外,還負責進行各驅(qū)動器狀態(tài)收集和轉(zhuǎn)換,實時處理各種異常情況。主站將所有驅(qū)動器的狀態(tài)抽象為三個:空閑、激活和異常,對應于WAM 機器人安全模塊提供的三種狀態(tài)。其中,空閑狀態(tài)代表所有驅(qū)動器工作在未使能且其他一切正常的狀態(tài);激活狀態(tài)代表所有驅(qū)動器已使能的狀態(tài);異常狀態(tài)代表任何一個驅(qū)動器出現(xiàn)報警或故障,需要人工處理的狀態(tài)。
實時異常處理有三個主要功能:一是動態(tài)檢測各驅(qū)動器工作狀態(tài),二是診斷和分析各驅(qū)動器工作狀態(tài)做出異常處理決策,三是進行不同狀態(tài)下異常處理。異常處理有以下幾類:
1)COE 狀態(tài)錯誤:一般情況下通過重新啟動過程來消除狀態(tài)操作。
2)驅(qū)動器警告:一些簡單警告可以用復位解決。
3)驅(qū)動器故障:提出用戶終止執(zhí)行,檢查硬件。
4)用戶急停:恢復初始化參數(shù)。
主循環(huán)由一個PD 定時器負責定時處理,能夠動態(tài)調(diào)整間隔時間,減少操作系統(tǒng)進程調(diào)度引起的周期時間跳動,保證EtherCAT 主站周期循環(huán)的實時性。主循環(huán)定時周期為0.5 毫秒,即頻率為2kHz,可以保證滿足用戶層最高1ms 實時循環(huán)的應用需求。
本項目試驗和驗證過程是統(tǒng)一的,由兩個計時過程分析組成。第一個計時分析是確定內(nèi)核模塊EtherCAT 主站主循環(huán)的實時性,這個實時性決定了用戶指令執(zhí)行的實時性。第二個計時分析是確定用戶層控制實時性,這個實時性決定了運動控制的實時性。
第一個計時分析采用內(nèi)核高精度定時器執(zhí)行,在2kHz 頻率驅(qū)動7 個Elmo 驅(qū)動器情況下,經(jīng)過幾次試驗,跳動量為0.1%~1.1%,表明主站的實時性很高。這個實時性的保障來源于兩個因素,一是內(nèi)核模塊的線程實時優(yōu)先級,二是PD 定時器的動態(tài)時間控制。
第二個計時分析采用libbarrett 自帶的分析方法。作為一個優(yōu)秀的機器人運動控制庫,libbarrett 除了提供重要的運動控制功能外,還提供了檢測自身控制實時性的方法。這個方法在real_time_execution_manager.cpp 源文件中,有專門代碼報告實時控制循環(huán)的狀態(tài),包含內(nèi)容見表1 所示。
表1 實時循環(huán)控制報告
經(jīng)過多次試驗,得到如表1 所示結(jié)果,可以看出,用戶層的實時控制循環(huán)有著相當好的實時性。
libbarrett 庫提供了兩個重要應用例程,bt-wamzerocal 和bt-wam-autotension,分別用于標定機器人工作零點和自動收緊各關(guān)節(jié)鋼絲繩。多次使用bt-wam-zerocal進行零點矯正試驗,每次都能夠正確執(zhí)行并完成零點矯正。多次使用bt-wam-autotension 進行鋼絲繩收緊功能試驗,收緊功能正常,并能夠完成各個關(guān)節(jié)鋼絲繩收緊。另外,運行l(wèi)ibbarrett 庫提供的運動測試例程,也達到了改造前的運動控制效果。
根據(jù)以上測試結(jié)果,可以認為基于EtherCAT 通信的驅(qū)動改造基本達到預期效果,成功達到此次改造目標。
基于CAN 總線的驅(qū)動和基于EtherCAT 總線的驅(qū)動最大的不同點是,EtherCAT 通信需要一個主站進行控制,通過以太網(wǎng)卡與驅(qū)動器進行通信,而CAN 總線沒有主站,直接與驅(qū)動器進行通信。將基于CAN 總線的通信轉(zhuǎn)換成基于EtherCAT 的通信,實際上是用一個以太網(wǎng)卡和EtherCAT 主站替代CAN 總線卡。雖然,EtherCAT 總線的機器人驅(qū)動方式改造是在WAM 機器人上進行的,但是,改造方案確是通用的,完全可能將一些基于CAN 總線運動控制設備,改造成基于EtherCAT 總線驅(qū)動的設備,并且能夠達到與原設備驅(qū)動相同的能力。