殷冰磊,董伯麟
(合肥工業(yè)大學(xué) 機(jī)械工程學(xué)院,安徽 合肥 230009)
工業(yè)機(jī)器人控制系統(tǒng)的設(shè)計(jì)包括硬件設(shè)計(jì)和軟件系統(tǒng)設(shè)計(jì)。目前對(duì)工業(yè)機(jī)器人軟件系統(tǒng)的設(shè)計(jì)主要研究有:(1)依托第三方內(nèi)核實(shí)現(xiàn)可拓展的工業(yè)機(jī)器人控制軟件系統(tǒng)。高美原[1]等結(jié)合ROS和Linux CNC構(gòu)建了一個(gè)可配置的軟件架構(gòu);畢魯雁[2]等采用強(qiáng)實(shí)時(shí)能力的RTX和具備豐富資源的工業(yè)計(jì)算機(jī)為平臺(tái)搭建了一個(gè)開放的可拓展的控制系統(tǒng)平臺(tái)。(2)以總線及以太網(wǎng)技術(shù)為基礎(chǔ)建立易擴(kuò)展的機(jī)器人控制軟件系統(tǒng)。王力宇[3]等采用EtherCAT總線技術(shù)簡(jiǎn)化機(jī)器人軟件系統(tǒng)結(jié)構(gòu),提高了系統(tǒng)的穩(wěn)定性。(3)通過采用組件與模塊化技術(shù)建立工業(yè)機(jī)器人軟件系統(tǒng)的開放性結(jié)構(gòu);曹波[4]等基于模塊化的思想將整個(gè)控制系統(tǒng)按功能進(jìn)行了子系統(tǒng)化;周偉花[5]研究了面向制造者和面向用戶的可重構(gòu)模塊化設(shè)計(jì)在機(jī)器人系統(tǒng)上的應(yīng)用。(4)采用分層理論對(duì)機(jī)器人軟件系統(tǒng)進(jìn)行層次劃分。陸偉[6]構(gòu)建的三層軟件架構(gòu)系統(tǒng)有效地避免了機(jī)器人在數(shù)據(jù)處理過程中的信息冗余問題;Fang Jian[7]等將機(jī)器人軟件系統(tǒng)分為交互層、決策層和物理層以提高軟件的穩(wěn)定性和執(zhí)行效率。
以上的軟件研究設(shè)計(jì)均是面向系統(tǒng)的設(shè)計(jì)。當(dāng)系統(tǒng)功能增加、系統(tǒng)行為變得復(fù)雜時(shí),上層應(yīng)用對(duì)象數(shù)目急劇增加,對(duì)象之間和與底層組件之間的交互就會(huì)變得交錯(cuò)復(fù)雜,導(dǎo)致系統(tǒng)的運(yùn)行及維護(hù)繁瑣和低效。
針對(duì)上述問題,基于面向?qū)ο笤O(shè)計(jì)范式,提出主動(dòng)對(duì)象計(jì)算模型來構(gòu)建工業(yè)機(jī)器人系統(tǒng)的方法。主動(dòng)對(duì)象具有低耦合高聚合的特性,能夠降低應(yīng)用對(duì)象交互的復(fù)雜度,有效提高系統(tǒng)軟件的靈活性、可移植性和開放性。
主動(dòng)對(duì)象(Active Object,AO)來自建模統(tǒng)一語言(Unified Modeling Language,UML),在UML規(guī)范里,一個(gè)主動(dòng)對(duì)象是“一個(gè)對(duì)象,它有自己的控制的線程”,以一種運(yùn)行到完成的方式來處理事件,和其他事件通過異步交換事件來通信[8]。簡(jiǎn)單來說,主動(dòng)對(duì)象=狀態(tài)機(jī)+控制的線程+事件隊(duì)列。
繼承在軟件構(gòu)建過程中是基礎(chǔ)性的。在面向?qū)ο笤O(shè)計(jì)里,類繼承描述了對(duì)象類之間的關(guān)系,并對(duì)軟件的組織及代碼的重用極為重要。主動(dòng)對(duì)象計(jì)算模型則采用了一種行為重用的方法,被稱為行為繼承,如同Ultimate Hook模式[9]里所采用的差異化編程方式,應(yīng)用程序僅需實(shí)現(xiàn)與系統(tǒng)標(biāo)準(zhǔn)行為不同的部分。行為繼承使得主動(dòng)對(duì)象即使在建模系統(tǒng)復(fù)雜度增加的情況下,行為重用的機(jī)會(huì)也在增加,能夠有效地減少系統(tǒng)的復(fù)雜性。
在這個(gè)模型中,狀態(tài)機(jī)是這個(gè)主動(dòng)對(duì)象的核心。傳統(tǒng)的狀態(tài)機(jī)是有限狀態(tài)機(jī)(Fine State Machine,F(xiàn)SM),當(dāng)所需解決的問題規(guī)模較小時(shí),F(xiàn)SM是一個(gè)很好的選擇。然而,當(dāng)所需搭建的系統(tǒng)規(guī)模較大時(shí),即使規(guī)模適中,采用FSM也很難對(duì)所搭建的系統(tǒng)進(jìn)行管理。這是由于FSM所搭建的狀態(tài)圖具有爆炸性、重復(fù)性的特點(diǎn),使得FSM的復(fù)雜性劇增,超過了所描述的基于反應(yīng)性系統(tǒng)的復(fù)雜度。模型中的主動(dòng)對(duì)象基于面向?qū)ο蟮乃枷?,結(jié)合了抽象和層次的處理方式,采用行為繼承的方法,建立層次式狀態(tài)機(jī),簡(jiǎn)化了狀態(tài)機(jī)設(shè)計(jì),極大地減少了重復(fù)性,從而擺脫了狀態(tài)機(jī)狀態(tài)爆炸的現(xiàn)象。圖1展示了簡(jiǎn)單形式下的層次狀態(tài)機(jī)。
圖1 層次式狀態(tài)機(jī)
如圖2所示,主動(dòng)對(duì)象的控制線程中,都有一個(gè)對(duì)事件循環(huán)處理的泵,只要事件隊(duì)列中存在事件,它就不斷地通過Queue.get()操作提取事件進(jìn)行處理。而當(dāng)事件隊(duì)列空閑時(shí),它便有效地阻塞這個(gè)循環(huán),直到新的事件到來。
主動(dòng)對(duì)象的執(zhí)行模型是采用運(yùn)行到完成(Run-To-Complete,RTC)方式。RTC意味著狀態(tài)機(jī)對(duì)每個(gè)到來的事件的處理都是不可分割的,當(dāng)前事件Dispatch()操作處理完成之前,新到來的事件只能在隊(duì)列中等待,而不能中斷當(dāng)前執(zhí)行過程。RTC模型并不意味著當(dāng)前執(zhí)行的狀態(tài)機(jī)不能被搶斷,在多任務(wù)系統(tǒng)中,如Windows環(huán)境下不同線程中執(zhí)行的任務(wù)也是可以執(zhí)行的,它可能搶占了其他線程中正在執(zhí)行RTC步驟的任務(wù)。然而采用RTC模型的主動(dòng)對(duì)象要實(shí)現(xiàn)這樣的多任務(wù)搶占性、并發(fā)性,就必須要求主動(dòng)對(duì)象之間的耦合性降到最低,即它們之間不共享資源,這樣才不會(huì)出現(xiàn)并發(fā)性、搶占性危險(xiǎn)。
圖2 主動(dòng)對(duì)象系統(tǒng)
圖3展示了出版-訂閱式模式下主動(dòng)對(duì)象之間的交互通信。主動(dòng)對(duì)象相互之間不需要共享資源,通過中間層平臺(tái)(Quantum Platform,QP)來實(shí)現(xiàn)彼此的通信,并通過中間層的平臺(tái)抽象層(Platform Abstract Layer,PAL)提供接口訪問底層的組件/庫和實(shí)時(shí)操作系統(tǒng)提供的服務(wù),實(shí)現(xiàn)了低耦合高聚合的特性。QF是這個(gè)QP架構(gòu)的核心,它負(fù)責(zé)上層主動(dòng)對(duì)象的核心調(diào)度、事件池的管理、時(shí)間事件管理、通信、注冊(cè)等。主動(dòng)對(duì)象通過出版-訂閱式異步通信,采用事件零復(fù)制機(jī)制實(shí)現(xiàn)通信。每個(gè)主動(dòng)對(duì)象在注冊(cè)初始化時(shí)訂閱它們所關(guān)心的事件,每個(gè)主動(dòng)對(duì)象產(chǎn)生的事件通過QF中間層進(jìn)行發(fā)布。
圖3 出版-訂閱式中間層平臺(tái)
圖4展示了主動(dòng)對(duì)象的類實(shí)現(xiàn)圖。主動(dòng)對(duì)象繼承基類CActiveObject,CActiveOject類則包含了前面所述的主動(dòng)對(duì)象的三個(gè)要素:狀態(tài)機(jī)(CHsm類)、控制的線程Thread和事件隊(duì)列Queue。
圖4 主動(dòng)對(duì)象類實(shí)現(xiàn)圖
采用主動(dòng)對(duì)象計(jì)算模型需要設(shè)計(jì)一個(gè)新的工業(yè)機(jī)器人軟件系統(tǒng)架構(gòu),傳統(tǒng)的工業(yè)機(jī)器人軟件系統(tǒng)架構(gòu)需要改變。根據(jù)主動(dòng)對(duì)象計(jì)算模型,構(gòu)建如圖5所示的體系架構(gòu)。
圖5 系統(tǒng)體系架構(gòu)圖
運(yùn)行系統(tǒng)總體架構(gòu)可分為以下幾部分:
(1)實(shí)時(shí)操作系統(tǒng)層:實(shí)時(shí)操作系統(tǒng)負(fù)責(zé)提供整個(gè)控制軟件運(yùn)行的基本環(huán)境、系統(tǒng)資源。不同的實(shí)時(shí)操作系統(tǒng)有著不同的實(shí)時(shí)性特性。
(2)中間層:中間層是這個(gè)分層體系架構(gòu)的核心層。它包含了平臺(tái)抽象、組件接口服務(wù)、實(shí)時(shí)框架服務(wù)三個(gè)部分。平臺(tái)抽象將實(shí)時(shí)操作系統(tǒng)相關(guān)的一些資源和接口封裝起來。組件接口服務(wù)功能是對(duì)組件層提供的接口進(jìn)一步抽象封裝,以提供對(duì)系統(tǒng)可重構(gòu)性和開放性的支持。實(shí)時(shí)框架采用QF來負(fù)責(zé)任務(wù)的調(diào)度、事件管理、時(shí)間管理、通信管理以及應(yīng)用層的管理。中間層的三個(gè)部分不是獨(dú)立工作的,QF提供了上層運(yùn)行時(shí)的基本的環(huán)境,而平臺(tái)抽象則隱藏了運(yùn)行時(shí)硬件和軟件的差異,組件接口服務(wù)則實(shí)現(xiàn)了系統(tǒng)動(dòng)態(tài)配置的功能。
(3)應(yīng)用層:應(yīng)用層是由各個(gè)主動(dòng)對(duì)象構(gòu)成的,不同的主動(dòng)對(duì)象負(fù)責(zé)處理不同的事務(wù)。由于應(yīng)用層的平臺(tái)無關(guān)性,當(dāng)?shù)讓影l(fā)生變動(dòng)時(shí),若客戶需求沒有改變,應(yīng)用層同樣也不需改動(dòng),極大地提高了系統(tǒng)軟件的可移植性,減少了系統(tǒng)軟件的設(shè)計(jì)開發(fā)成本。
HN-Robot是以Windows CE6.0為軟件平臺(tái)的開放式可重構(gòu)嵌入式機(jī)器人控制系統(tǒng),可以根據(jù)具體需求實(shí)現(xiàn)對(duì)Scara、Puma等多種機(jī)器人的控制。表1所示為HN-Robot 機(jī)器人控制系統(tǒng)的規(guī)格參數(shù)。在這一部分將重點(diǎn)展示中間層和應(yīng)用層的實(shí)現(xiàn)。
表1 HN-Robot系統(tǒng)規(guī)格參數(shù)
3.1.1框架服務(wù)
為了實(shí)現(xiàn)對(duì)上層應(yīng)用的管理,部分框架的接口定義如下。
void QF_init()
//初始化框架
void QF_poolInit()
//初始化上層事件池
void QF_psInit()
//初始化事件訂閱表
void QActive_ctor()
//初始化上層活動(dòng)對(duì)象
void QActive_start()
//開啟活動(dòng)對(duì)象線程
int16_t QF_run()
//運(yùn)行框架服務(wù)
void QF_publish()
//事件出版
void QAcitve_subscribe()
//事件訂閱
框架提供上層應(yīng)用運(yùn)行時(shí)的環(huán)境。例如,上層主動(dòng)對(duì)象之間通過框架的出版-訂閱式的服務(wù)接口QF_publish()和QActive_subscribe()就能實(shí)現(xiàn)通信。這樣,框架便隱藏了操作系統(tǒng)的異構(gòu)性,使得上層應(yīng)用與實(shí)時(shí)操作系統(tǒng)解耦,大大提高了上層應(yīng)用的可移植性。
3.1.2組件接口服務(wù)
為了實(shí)現(xiàn)對(duì)組件/庫的管理,部分組件接口服務(wù)定義如下。
bool CLI_OpenHMI()
//打開HMI模塊
void CLI_CloseHMI()
//關(guān)閉HMI模塊
void CLI_MOVEP()
//機(jī)器人指定點(diǎn)位運(yùn)動(dòng)
void CLI_MOVEL()
//機(jī)器人指定直線運(yùn)動(dòng)
void CLI_MOVEC()
//機(jī)器人指定圓弧運(yùn)動(dòng)
int CLI_HOME()
//機(jī)器人回原點(diǎn)
int CLI_Stop()
//機(jī)器人停止運(yùn)動(dòng)
void CLI_ReadDO()
//讀取輸出口狀態(tài)
組件接口服務(wù)對(duì)那些提供相似服務(wù)的接口進(jìn)行抽象,這種抽象能夠在不改變系統(tǒng)其他部分的情況下實(shí)現(xiàn)組件的替換或更新。如在實(shí)現(xiàn)四自由度和六自由度的點(diǎn)位運(yùn)動(dòng)中,將具有這些相似功能的點(diǎn)位運(yùn)動(dòng)接口定義為CLI_MOVEP(P1,P2,…),就能實(shí)現(xiàn)控制這類型的運(yùn)動(dòng)。通過這樣一種抽象封裝,上層就無需了解底層的實(shí)現(xiàn)細(xì)節(jié),系統(tǒng)也能夠在不改動(dòng)的情況下實(shí)現(xiàn)正常運(yùn)行。
3.1.3平臺(tái)抽象
平臺(tái)抽象通過一系列的宏定義和接口定義,將不同操作系統(tǒng)的資源和API接口進(jìn)行了統(tǒng)一。這樣,平臺(tái)抽象層就能隱藏框架運(yùn)行時(shí)軟硬件環(huán)境的不同。部分抽象層宏定義和接口定義如下。
//宏定義,通過改寫宏進(jìn)行相應(yīng)系統(tǒng)移植
#define QF_INT_LOCK …
#define QF_INT_UNLOCK …
#define QACITVE_EQUEUE_WAT …
#define QACITVE_EQUEUE_SIGNAL …
#define QACITVE_EQUEUE_ONEMPTY …
主動(dòng)對(duì)象采用UML進(jìn)行設(shè)計(jì),并使用QM建模工具(QM Modeling Tool,QMMT)進(jìn)行開發(fā)。以下給出了HN-Robot機(jī)器人控制系統(tǒng)中幾個(gè)主動(dòng)對(duì)象UML狀態(tài)圖設(shè)計(jì),它們隱藏了大部分的細(xì)節(jié),從整體上給出狀態(tài)分析及轉(zhuǎn)換的實(shí)現(xiàn)方式。
3.2.1譯碼主動(dòng)對(duì)象
如圖6所示,譯碼主動(dòng)對(duì)象負(fù)責(zé)管理對(duì)程序的編譯處理。初始化后,主動(dòng)對(duì)象處于Get_Code狀態(tài),等待用戶選擇相應(yīng)程序。當(dāng)收到CODE事件后,轉(zhuǎn)換到Interpret狀態(tài),之后根據(jù)DECODE事件對(duì)程序進(jìn)行編譯。如果操作失敗,則進(jìn)入Error狀態(tài)報(bào)錯(cuò)。
圖6 譯碼主動(dòng)對(duì)象UML圖
3.2.2運(yùn)行主動(dòng)對(duì)象
如圖7所示,運(yùn)行主動(dòng)對(duì)象負(fù)責(zé)管理程序的運(yùn)行。初始化后,主動(dòng)對(duì)象處于wait狀態(tài),等待用戶設(shè)置運(yùn)行程序。用戶可以進(jìn)行自動(dòng)運(yùn)行或者單步運(yùn)行操作,主動(dòng)對(duì)象則根據(jù)相應(yīng)的事件進(jìn)行處理,并進(jìn)入working狀態(tài)。主動(dòng)對(duì)象接收到PAUSE事件后進(jìn)入Pause狀態(tài),暫停等待用戶進(jìn)一步操作。
圖7 運(yùn)行主動(dòng)對(duì)象UML圖
3.2.3示教主動(dòng)對(duì)象
如圖8所示,示教主動(dòng)對(duì)象負(fù)責(zé)管理HMI中的示教操作。初始化后,主動(dòng)對(duì)象從disable狀態(tài)轉(zhuǎn)換到enable的ready子狀態(tài),等待用戶的示教指令。當(dāng)有示教指令產(chǎn)生后,主動(dòng)對(duì)象會(huì)根據(jù)不同的指令進(jìn)行不同的事件處理。
圖8 示教主動(dòng)對(duì)象UML圖
各個(gè)事務(wù)處理的主動(dòng)對(duì)象設(shè)計(jì)好后,就可以在中間層上進(jìn)行創(chuàng)建了。設(shè)計(jì)譯碼主動(dòng)對(duì)象的偽代碼實(shí)現(xiàn)如下:
//主動(dòng)對(duì)象創(chuàng)建實(shí)例
$declare(AOs::Interpret)
//封裝了譯碼主動(dòng)對(duì)象的聲明
static Interpret l_Interpret;
//唯一的譯碼主動(dòng)對(duì)象實(shí)例
//譯碼主動(dòng)對(duì)象唯一的公共接口
QActive *AO_Interpret = (QActive *)&l_Interpret;
$define(AOs::Interpret_ctor)
//譯碼主動(dòng)對(duì)象創(chuàng)建函數(shù)
$define(AOs::Interpret)
//譯碼主動(dòng)對(duì)象狀態(tài)機(jī)實(shí)現(xiàn)
//主動(dòng)對(duì)象創(chuàng)建運(yùn)行
int Create_ActiveObject(){
Interpret_ctor();
//譯碼主動(dòng)對(duì)象創(chuàng)建
…
//其他主動(dòng)對(duì)象創(chuàng)建
QF_init();
//框架服務(wù)初始化
….
//其他初始化
QActive_start(AO_Interpret,…)
//譯碼主動(dòng)對(duì)象運(yùn)行線程創(chuàng)建
…
//其他主動(dòng)對(duì)象運(yùn)行線程創(chuàng)建
QF_run();
//框架服務(wù)啟動(dòng)運(yùn)行}
代碼中首先創(chuàng)建唯一一個(gè)譯碼主動(dòng)對(duì)象l_Interpret,并采用QM內(nèi)置函數(shù)MYMdefine(AOs::Interpret)將UML圖的狀態(tài)機(jī)轉(zhuǎn)化成代碼,最后通過QActive_start(AO_Interpret,…)函數(shù)創(chuàng)建主動(dòng)對(duì)象的運(yùn)行線程。當(dāng)所有主動(dòng)對(duì)象完成創(chuàng)建后,就可以通過調(diào)用QP中間層平臺(tái)提供的接口QF_run()啟動(dòng)框架的服務(wù)。
圖9為HN-Robot機(jī)器人控制系統(tǒng)的HMI整體展示。從整體上可將區(qū)域劃分為菜單區(qū)、功能區(qū)、狀態(tài)區(qū)、信息提示區(qū)。該圖展示了手動(dòng)模式下進(jìn)行手動(dòng)示教的過程。
圖9 HN-Robot 人機(jī)界面
從上述軟件設(shè)計(jì)過程可以看出:
(1)層次式狀態(tài)能夠幫助設(shè)計(jì)者隱藏內(nèi)部細(xì)節(jié),行為繼承方式使得主動(dòng)對(duì)象通過重用機(jī)制(Umltimate Hook模式)減小系統(tǒng)復(fù)雜性。中間層架構(gòu)的出版-訂閱式平臺(tái)降低了主動(dòng)對(duì)象之間的耦合性,有效提高了程序的靈活性和可維護(hù)性。
(2)可視化主動(dòng)對(duì)象設(shè)計(jì)。應(yīng)用層采用UML圖形化設(shè)計(jì)開發(fā),如圖6、圖7、圖8所示,使得軟件分析和邏輯結(jié)構(gòu)清晰,能夠有效、快速開發(fā)出機(jī)器人控制軟件相應(yīng)的業(yè)務(wù)功能,降低了軟件設(shè)計(jì)的復(fù)雜度。
(3)采用主動(dòng)對(duì)象計(jì)算模型設(shè)計(jì)的分層架構(gòu)有效實(shí)現(xiàn)對(duì)各個(gè)資源的有效劃分和管理。在該架構(gòu)的實(shí)現(xiàn)中,底層對(duì)上層而言是透明的,中間層封裝了實(shí)時(shí)操作系統(tǒng)和組件的服務(wù)接口,隱藏了軟/硬件的差異,為應(yīng)用層提供了獨(dú)立于平臺(tái)的運(yùn)行環(huán)境,提高了軟件的可移植性。
[1] 高美原, 秦現(xiàn)生, 白晶,等. 基于ROS和LinuxCNC的工業(yè)機(jī)器人控制系統(tǒng)開發(fā)[J]. 機(jī)械制造, 2015, 53(10):21-24.
[2] 畢魯雁, 劉立生. 基于RTX的工業(yè)機(jī)器人控制系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J]. 組合機(jī)床與自動(dòng)化加工技術(shù), 2013(3):87-89.
[3] 王力宇, 曹其新, 董忠. 基于EtherCAT總線的工業(yè)機(jī)器人控制系統(tǒng)設(shè)計(jì)[J]. 組合機(jī)床與自動(dòng)化加工技術(shù), 2017(10):79-81,86.
[4] 曹波, 曹其新, 陳培華. 基于模塊化設(shè)計(jì)的碼垛機(jī)器人控制系統(tǒng)開發(fā)[J]. 機(jī)床與液壓, 2012, 40(23):90-92.
[5] 周偉花. 軟件構(gòu)件化技術(shù)在工業(yè)機(jī)器人集成系統(tǒng)的應(yīng)用研究[D]. 長(zhǎng)沙:中南大學(xué), 2013.
[6] 陸偉. 一種工業(yè)機(jī)器人三層軟件架構(gòu)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電氣自動(dòng)化, 2016, 38(2):18-19.
[7] Fang Jian, Zhao Jianghai, He Feng, et al. Design and research of three-layers open architecture model for industrial robot software system[C]// IEEE International Conference on Mechatronics and Automation. IEEE, 2013:104-109.
[8] MIRO S.Practical UML Statcharts in C/C++ (Second Edition)[M]. Burlington: Newnes, 2008.
[9] PETZOLD C, PAUL Y. Programming Windows 95[M].Microsoft Press, 1996.