殷冰磊,董伯麟
(合肥工業大學 機械工程學院,安徽 合肥 230009)
工業機器人控制系統的設計包括硬件設計和軟件系統設計。目前對工業機器人軟件系統的設計主要研究有:(1)依托第三方內核實現可拓展的工業機器人控制軟件系統。高美原[1]等結合ROS和Linux CNC構建了一個可配置的軟件架構;畢魯雁[2]等采用強實時能力的RTX和具備豐富資源的工業計算機為平臺搭建了一個開放的可拓展的控制系統平臺。(2)以總線及以太網技術為基礎建立易擴展的機器人控制軟件系統。王力宇[3]等采用EtherCAT總線技術簡化機器人軟件系統結構,提高了系統的穩定性。(3)通過采用組件與模塊化技術建立工業機器人軟件系統的開放性結構;曹波[4]等基于模塊化的思想將整個控制系統按功能進行了子系統化;周偉花[5]研究了面向制造者和面向用戶的可重構模塊化設計在機器人系統上的應用。(4)采用分層理論對機器人軟件系統進行層次劃分。陸偉[6]構建的三層軟件架構系統有效地避免了機器人在數據處理過程中的信息冗余問題;Fang Jian[7]等將機器人軟件系統分為交互層、決策層和物理層以提高軟件的穩定性和執行效率。
以上的軟件研究設計均是面向系統的設計。當系統功能增加、系統行為變得復雜時,上層應用對象數目急劇增加,對象之間和與底層組件之間的交互就會變得交錯復雜,導致系統的運行及維護繁瑣和低效。
針對上述問題,基于面向對象設計范式,提出主動對象計算模型來構建工業機器人系統的方法。主動對象具有低耦合高聚合的特性,能夠降低應用對象交互的復雜度,有效提高系統軟件的靈活性、可移植性和開放性。
主動對象(Active Object,AO)來自建模統一語言(Unified Modeling Language,UML),在UML規范里,一個主動對象是“一個對象,它有自己的控制的線程”,以一種運行到完成的方式來處理事件,和其他事件通過異步交換事件來通信[8]。簡單來說,主動對象=狀態機+控制的線程+事件隊列。
繼承在軟件構建過程中是基礎性的。在面向對象設計里,類繼承描述了對象類之間的關系,并對軟件的組織及代碼的重用極為重要。主動對象計算模型則采用了一種行為重用的方法,被稱為行為繼承,如同Ultimate Hook模式[9]里所采用的差異化編程方式,應用程序僅需實現與系統標準行為不同的部分。行為繼承使得主動對象即使在建模系統復雜度增加的情況下,行為重用的機會也在增加,能夠有效地減少系統的復雜性。
在這個模型中,狀態機是這個主動對象的核心。傳統的狀態機是有限狀態機(Fine State Machine,FSM),當所需解決的問題規模較小時,FSM是一個很好的選擇。然而,當所需搭建的系統規模較大時,即使規模適中,采用FSM也很難對所搭建的系統進行管理。這是由于FSM所搭建的狀態圖具有爆炸性、重復性的特點,使得FSM的復雜性劇增,超過了所描述的基于反應性系統的復雜度。模型中的主動對象基于面向對象的思想,結合了抽象和層次的處理方式,采用行為繼承的方法,建立層次式狀態機,簡化了狀態機設計,極大地減少了重復性,從而擺脫了狀態機狀態爆炸的現象。圖1展示了簡單形式下的層次狀態機。

圖1 層次式狀態機
如圖2所示,主動對象的控制線程中,都有一個對事件循環處理的泵,只要事件隊列中存在事件,它就不斷地通過Queue.get()操作提取事件進行處理。而當事件隊列空閑時,它便有效地阻塞這個循環,直到新的事件到來。
主動對象的執行模型是采用運行到完成(Run-To-Complete,RTC)方式。RTC意味著狀態機對每個到來的事件的處理都是不可分割的,當前事件Dispatch()操作處理完成之前,新到來的事件只能在隊列中等待,而不能中斷當前執行過程。RTC模型并不意味著當前執行的狀態機不能被搶斷,在多任務系統中,如Windows環境下不同線程中執行的任務也是可以執行的,它可能搶占了其他線程中正在執行RTC步驟的任務。然而采用RTC模型的主動對象要實現這樣的多任務搶占性、并發性,就必須要求主動對象之間的耦合性降到最低,即它們之間不共享資源,這樣才不會出現并發性、搶占性危險。

圖2 主動對象系統
圖3展示了出版-訂閱式模式下主動對象之間的交互通信。主動對象相互之間不需要共享資源,通過中間層平臺(Quantum Platform,QP)來實現彼此的通信,并通過中間層的平臺抽象層(Platform Abstract Layer,PAL)提供接口訪問底層的組件/庫和實時操作系統提供的服務,實現了低耦合高聚合的特性。QF是這個QP架構的核心,它負責上層主動對象的核心調度、事件池的管理、時間事件管理、通信、注冊等。主動對象通過出版-訂閱式異步通信,采用事件零復制機制實現通信。每個主動對象在注冊初始化時訂閱它們所關心的事件,每個主動對象產生的事件通過QF中間層進行發布。

圖3 出版-訂閱式中間層平臺
圖4展示了主動對象的類實現圖。主動對象繼承基類CActiveObject,CActiveOject類則包含了前面所述的主動對象的三個要素:狀態機(CHsm類)、控制的線程Thread和事件隊列Queue。

圖4 主動對象類實現圖
采用主動對象計算模型需要設計一個新的工業機器人軟件系統架構,傳統的工業機器人軟件系統架構需要改變。根據主動對象計算模型,構建如圖5所示的體系架構。

圖5 系統體系架構圖
運行系統總體架構可分為以下幾部分:
(1)實時操作系統層:實時操作系統負責提供整個控制軟件運行的基本環境、系統資源。不同的實時操作系統有著不同的實時性特性。
(2)中間層:中間層是這個分層體系架構的核心層。它包含了平臺抽象、組件接口服務、實時框架服務三個部分。平臺抽象將實時操作系統相關的一些資源和接口封裝起來。組件接口服務功能是對組件層提供的接口進一步抽象封裝,以提供對系統可重構性和開放性的支持。實時框架采用QF來負責任務的調度、事件管理、時間管理、通信管理以及應用層的管理。中間層的三個部分不是獨立工作的,QF提供了上層運行時的基本的環境,而平臺抽象則隱藏了運行時硬件和軟件的差異,組件接口服務則實現了系統動態配置的功能。
(3)應用層:應用層是由各個主動對象構成的,不同的主動對象負責處理不同的事務。由于應用層的平臺無關性,當底層發生變動時,若客戶需求沒有改變,應用層同樣也不需改動,極大地提高了系統軟件的可移植性,減少了系統軟件的設計開發成本。
HN-Robot是以Windows CE6.0為軟件平臺的開放式可重構嵌入式機器人控制系統,可以根據具體需求實現對Scara、Puma等多種機器人的控制。表1所示為HN-Robot 機器人控制系統的規格參數。在這一部分將重點展示中間層和應用層的實現。

表1 HN-Robot系統規格參數
3.1.1框架服務
為了實現對上層應用的管理,部分框架的接口定義如下。
void QF_init()
//初始化框架
void QF_poolInit()
//初始化上層事件池
void QF_psInit()
//初始化事件訂閱表
void QActive_ctor()
//初始化上層活動對象
void QActive_start()
//開啟活動對象線程
int16_t QF_run()
//運行框架服務
void QF_publish()
//事件出版
void QAcitve_subscribe()
//事件訂閱
框架提供上層應用運行時的環境。例如,上層主動對象之間通過框架的出版-訂閱式的服務接口QF_publish()和QActive_subscribe()就能實現通信。這樣,框架便隱藏了操作系統的異構性,使得上層應用與實時操作系統解耦,大大提高了上層應用的可移植性。
3.1.2組件接口服務
為了實現對組件/庫的管理,部分組件接口服務定義如下。
bool CLI_OpenHMI()
//打開HMI模塊
void CLI_CloseHMI()
//關閉HMI模塊
void CLI_MOVEP()
//機器人指定點位運動
void CLI_MOVEL()
//機器人指定直線運動
void CLI_MOVEC()
//機器人指定圓弧運動
int CLI_HOME()
//機器人回原點
int CLI_Stop()
//機器人停止運動
void CLI_ReadDO()
//讀取輸出口狀態
組件接口服務對那些提供相似服務的接口進行抽象,這種抽象能夠在不改變系統其他部分的情況下實現組件的替換或更新。如在實現四自由度和六自由度的點位運動中,將具有這些相似功能的點位運動接口定義為CLI_MOVEP(P1,P2,…),就能實現控制這類型的運動。通過這樣一種抽象封裝,上層就無需了解底層的實現細節,系統也能夠在不改動的情況下實現正常運行。
3.1.3平臺抽象
平臺抽象通過一系列的宏定義和接口定義,將不同操作系統的資源和API接口進行了統一。這樣,平臺抽象層就能隱藏框架運行時軟硬件環境的不同。部分抽象層宏定義和接口定義如下。
//宏定義,通過改寫宏進行相應系統移植
#define QF_INT_LOCK …
#define QF_INT_UNLOCK …
#define QACITVE_EQUEUE_WAT …
#define QACITVE_EQUEUE_SIGNAL …
#define QACITVE_EQUEUE_ONEMPTY …
主動對象采用UML進行設計,并使用QM建模工具(QM Modeling Tool,QMMT)進行開發。以下給出了HN-Robot機器人控制系統中幾個主動對象UML狀態圖設計,它們隱藏了大部分的細節,從整體上給出狀態分析及轉換的實現方式。
3.2.1譯碼主動對象
如圖6所示,譯碼主動對象負責管理對程序的編譯處理。初始化后,主動對象處于Get_Code狀態,等待用戶選擇相應程序。當收到CODE事件后,轉換到Interpret狀態,之后根據DECODE事件對程序進行編譯。如果操作失敗,則進入Error狀態報錯。

圖6 譯碼主動對象UML圖
3.2.2運行主動對象
如圖7所示,運行主動對象負責管理程序的運行。初始化后,主動對象處于wait狀態,等待用戶設置運行程序。用戶可以進行自動運行或者單步運行操作,主動對象則根據相應的事件進行處理,并進入working狀態。主動對象接收到PAUSE事件后進入Pause狀態,暫停等待用戶進一步操作。

圖7 運行主動對象UML圖
3.2.3示教主動對象
如圖8所示,示教主動對象負責管理HMI中的示教操作。初始化后,主動對象從disable狀態轉換到enable的ready子狀態,等待用戶的示教指令。當有示教指令產生后,主動對象會根據不同的指令進行不同的事件處理。

圖8 示教主動對象UML圖
各個事務處理的主動對象設計好后,就可以在中間層上進行創建了。設計譯碼主動對象的偽代碼實現如下:
//主動對象創建實例
$declare(AOs::Interpret)
//封裝了譯碼主動對象的聲明
static Interpret l_Interpret;
//唯一的譯碼主動對象實例
//譯碼主動對象唯一的公共接口
QActive *AO_Interpret = (QActive *)&l_Interpret;
$define(AOs::Interpret_ctor)
//譯碼主動對象創建函數
$define(AOs::Interpret)
//譯碼主動對象狀態機實現
//主動對象創建運行
int Create_ActiveObject(){
Interpret_ctor();
//譯碼主動對象創建
…
//其他主動對象創建
QF_init();
//框架服務初始化
….
//其他初始化
QActive_start(AO_Interpret,…)
//譯碼主動對象運行線程創建
…
//其他主動對象運行線程創建
QF_run();
//框架服務啟動運行}
代碼中首先創建唯一一個譯碼主動對象l_Interpret,并采用QM內置函數MYMdefine(AOs::Interpret)將UML圖的狀態機轉化成代碼,最后通過QActive_start(AO_Interpret,…)函數創建主動對象的運行線程。當所有主動對象完成創建后,就可以通過調用QP中間層平臺提供的接口QF_run()啟動框架的服務。
圖9為HN-Robot機器人控制系統的HMI整體展示。從整體上可將區域劃分為菜單區、功能區、狀態區、信息提示區。該圖展示了手動模式下進行手動示教的過程。

圖9 HN-Robot 人機界面
從上述軟件設計過程可以看出:
(1)層次式狀態能夠幫助設計者隱藏內部細節,行為繼承方式使得主動對象通過重用機制(Umltimate Hook模式)減小系統復雜性。中間層架構的出版-訂閱式平臺降低了主動對象之間的耦合性,有效提高了程序的靈活性和可維護性。
(2)可視化主動對象設計。應用層采用UML圖形化設計開發,如圖6、圖7、圖8所示,使得軟件分析和邏輯結構清晰,能夠有效、快速開發出機器人控制軟件相應的業務功能,降低了軟件設計的復雜度。
(3)采用主動對象計算模型設計的分層架構有效實現對各個資源的有效劃分和管理。在該架構的實現中,底層對上層而言是透明的,中間層封裝了實時操作系統和組件的服務接口,隱藏了軟/硬件的差異,為應用層提供了獨立于平臺的運行環境,提高了軟件的可移植性。
[1] 高美原, 秦現生, 白晶,等. 基于ROS和LinuxCNC的工業機器人控制系統開發[J]. 機械制造, 2015, 53(10):21-24.
[2] 畢魯雁, 劉立生. 基于RTX的工業機器人控制系統設計與實現[J]. 組合機床與自動化加工技術, 2013(3):87-89.
[3] 王力宇, 曹其新, 董忠. 基于EtherCAT總線的工業機器人控制系統設計[J]. 組合機床與自動化加工技術, 2017(10):79-81,86.
[4] 曹波, 曹其新, 陳培華. 基于模塊化設計的碼垛機器人控制系統開發[J]. 機床與液壓, 2012, 40(23):90-92.
[5] 周偉花. 軟件構件化技術在工業機器人集成系統的應用研究[D]. 長沙:中南大學, 2013.
[6] 陸偉. 一種工業機器人三層軟件架構的設計與實現[J]. 電氣自動化, 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.