李曉明,孫辰晨
(浙江理工大學(xué)機械與自動控制學(xué)院,浙江杭州310018)
現(xiàn)代的機電系統(tǒng)已經(jīng)朝著智能化、網(wǎng)絡(luò)化、分布式的方向發(fā)展,其對軟件的開發(fā)也提出了更高的要求。以機器人技術(shù)[1-4]為例,單個機器人本身就是一個復(fù)雜的機電系統(tǒng),需要通過自身的軟件設(shè)計來實現(xiàn)各種不同功能,適應(yīng)不同的環(huán)境。課題組研究了適用于機器人此類復(fù)雜機電系統(tǒng)的軟件開發(fā)方法和開發(fā)模式,提出了一種輕量級的基于組件的軟件框架[5-8],可簡化移動機器人應(yīng)用程序的結(jié)構(gòu),使設(shè)計工作變得省時。該架構(gòu)基于組件的軟件工程,保證最大限度的模塊化和可重用性。
該框架最大的不足是系統(tǒng)的實時性問題。以機器人控制為例,在現(xiàn)有軟件平臺上,研究者盡管可以設(shè)計出各個功能模塊,通過模塊之間的相互協(xié)作和數(shù)據(jù)交換實現(xiàn)諸如導(dǎo)航、避障等控制任務(wù),但由于其采用多線程實現(xiàn)機制,具體功能模塊在實際運行時無法確定自己的運行時刻,這對于一些有實時性要求的應(yīng)用場合來說是不符合其要求的。實時性要求系統(tǒng)必須對外來事件在限定時間內(nèi)做出反應(yīng)。例如,足球機器人的策略系統(tǒng)軟件,其功能模塊運行必須在兩次圖像采樣之間完成,且功能模塊的運行周期要求必須穩(wěn)定和精確,否則諸如預(yù)測模塊、運動控制、規(guī)劃等模塊就會失效。大部分機器人控制系統(tǒng)對實時性要求非常嚴(yán)格,各控制任務(wù)必須在一定的時間內(nèi)完成,否則各任務(wù)之間會產(chǎn)生資源和時間上的競爭,造成控制程序產(chǎn)生錯誤指令、死鎖甚至崩潰,對機器人的性能造成嚴(yán)重影響。所以機器人實時控制部分必須精確安排各任務(wù)的執(zhí)行順序和執(zhí)行時間,避免上述情況發(fā)生。
本研究將在上述軟件架構(gòu)的基礎(chǔ)上加入實時任務(wù)模塊的設(shè)計,完善系統(tǒng),使其可以實現(xiàn)機器人控制的實時性。
軟件整個框架的結(jié)構(gòu)包括:框架的模型、模塊的接口定義、模塊的加載和配置、模塊之間的通訊[9],即Platform平臺、Module模塊和Wire通訊連線等。
Platform 類負(fù)責(zé)模塊的加載、運行、停止以及銷毀,分析模塊的配置并建立模塊之間的通訊。
在軟件框架內(nèi)部,以模型Module的概念來表示一個功能模塊。一個軟件系統(tǒng)由許多個Module 組成,Module之間保證最大程度的獨立性,每個Module可以獨立運行于Platform 上(以線程的方式),并通過端口與外部進(jìn)行通訊。研究者通過合理劃分Module 的功能,以及不同模塊之間通過通訊管道進(jìn)行組合,可以實現(xiàn)不同的系統(tǒng)應(yīng)用,這也是組件編程思想的主要部分。這種模型驅(qū)動編程機制源于Auslander[10-11]提出的基于任務(wù)和狀態(tài)的機電系統(tǒng)軟件模型以及多智能體的基本模型。
平臺中組件之間的通訊采用了基于管道技術(shù)的通訊模型。管道資源由平臺分配,組件在平臺中注冊名字唯一的通訊管道,就可以向管道中寫入數(shù)據(jù)或者接收該管道中的數(shù)據(jù)。開發(fā)者采用這種方式可以方便地實現(xiàn)多個組件的協(xié)作。
該軟件系統(tǒng)框架的優(yōu)點是,開發(fā)者可以專注于組件的開發(fā),并可復(fù)用已經(jīng)開發(fā)的組件,通過XML 配置文件對組件進(jìn)行組合,實現(xiàn)自己所需要的具體控制應(yīng)用。但由于每個組件是以單獨線程的方式在運行,對于機器人控制系統(tǒng)而言,在任務(wù)這一層次上的管理較為困難;此外,每個模塊功能的執(zhí)行順序依賴于線程的同步,整體執(zhí)行效率比較低,而整個系統(tǒng)的控制周期是難以確定的,因此難以應(yīng)用于對實時性有一定要求的機器人應(yīng)用中。
在復(fù)雜機電系統(tǒng)或者機器人等應(yīng)用中通常會涉及到實時控制的問題,從簡單的溫度控制的應(yīng)用到復(fù)雜的機器人視覺伺服應(yīng)用等。由于存在著實時控制,要求研究者在開發(fā)這些軟件的時候必須考慮實時性問題。
對于任何一個計算機控制系統(tǒng)而言,其控制系統(tǒng)設(shè)計的一個重要前提都是采樣周期T。采樣周期決定了控制系統(tǒng)的許多性能,甚至穩(wěn)定性。同理,在實際控制中精確穩(wěn)定的采樣(控制)周期對控制系統(tǒng)的實際控制效果也同樣非常重要。首先,如果在實際軟件開發(fā)中不考慮控制周期的穩(wěn)定性問題,那么在實際控制中由于采樣周期的變化,原先設(shè)計的控制算法可能不會達(dá)到預(yù)想的控制效果,甚至失效;其次,即使考慮了控制周期的穩(wěn)定性,但如果實際執(zhí)行時控制周期與設(shè)計時的采樣周期不一致,同樣會導(dǎo)致控制系統(tǒng)效果變差或者失控。
以常用的PID控制器為例:
當(dāng)T的值發(fā)生變化時,控制器的輸出u也會發(fā)生變化,并最終影響系統(tǒng)的穩(wěn)定性。因此,對于面向?qū)崟r控制的機電系統(tǒng)軟件框架而言,實時性需求應(yīng)當(dāng)包括兩點:①能夠提供準(zhǔn)確的采樣周期;②能夠提供穩(wěn)定的采樣周期。
加入實時任務(wù)模塊的設(shè)計后,軟件框架的總體結(jié)構(gòu)圖如圖1所示。
該設(shè)計將Platform升級為具有實時功能的運行平臺,將組件升級為包含實時任務(wù)接口的組件模型,同時保留原組件模型為非實時組件。Platform平臺將主要包括實時時鐘設(shè)計、實時任務(wù)調(diào)度設(shè)計、組件管理模型設(shè)計、通訊模型設(shè)計等關(guān)鍵內(nèi)容。其中,組件管理模型設(shè)計、通訊模型設(shè)計和原模型基本相同,下面著重介紹實時時鐘和實時任務(wù)調(diào)度的設(shè)計。
(1)實時時鐘模塊。為了解決控制中的實時性問題,本研究在平臺模型中設(shè)置了實時時鐘模塊。實時時鐘模塊的實現(xiàn)在嵌入式系統(tǒng)中比較容易,但是在基于PC 的系統(tǒng)上很難保證其絕對的實時性,尤其是運行于諸如Windows等非實時的操作系統(tǒng)上時。一般情況下,在PC上運行的控制系統(tǒng)屬于監(jiān)督控制范疇,即屬于軟實時系統(tǒng),其實時性要求并非十分苛刻,因此可以采用宿主操作系統(tǒng)提供的時鐘信號,例如在Win?dows平臺下的多媒體時鐘中斷,可以提供精度為1 ms的時鐘周期,可以滿足大多數(shù)基于PC 的控制需求。例如在基于PC 的運動控制系統(tǒng)中,當(dāng)運動出現(xiàn)異常時,運動控制卡能自動進(jìn)入保護(hù)狀態(tài),因此對于該類控制問題,精度為1 ms的采樣周期完全符合要求。事實上,對于此類應(yīng)用,精度更差的普通定時器往往也能滿足要求[12]。但是對于工業(yè)上的一些實時性要求相對高的實時任務(wù),Windows 系統(tǒng)的多媒體擴展庫MMSYSTEM.LIB 提供的多媒體定時函數(shù)已經(jīng)不能滿足系統(tǒng)需要,例如點膠控制系統(tǒng)[13]。
(2)實時任務(wù)調(diào)度模塊。實時時鐘模塊產(chǎn)生精度為1 ms且指定時間間隔的時鐘信號,實時任務(wù)調(diào)度模塊負(fù)責(zé)當(dāng)檢測到時鐘信號時通過實時組件的接口調(diào)用組件中的實時任務(wù)程序進(jìn)行執(zhí)行。在設(shè)計時,本研究要求這些實時任務(wù)程序中的代碼應(yīng)盡量做到高效,執(zhí)行時間短;同時嚴(yán)格禁止在實時任務(wù)模塊中執(zhí)行非實時的工作。任務(wù)管理模型中采用了動態(tài)的數(shù)據(jù)結(jié)構(gòu)來維護(hù)平臺中注冊的所有實時組件,并可以通過設(shè)計算法動態(tài)地更新不同組件實時任務(wù)的優(yōu)先級和調(diào)用順序,將重要的模塊優(yōu)先執(zhí)行。實時任務(wù)調(diào)度模塊嚴(yán)格監(jiān)控每個任務(wù)的執(zhí)行時間,會對執(zhí)行時間過長的任務(wù)降低其優(yōu)先級,如果時間片即將用完,將會停止執(zhí)行后續(xù)任務(wù),保證下一時鐘信號來臨的時候可以進(jìn)行下一控制周期高優(yōu)先級的任務(wù)。實時任務(wù)調(diào)度示意圖如圖2所示。
上述實時任務(wù)的實現(xiàn)方法與點膠控制系統(tǒng)中的方法大致相同,都是利用定時器產(chǎn)生一定周期的定時中斷,在中斷中執(zhí)行實時任務(wù)。不同的是在點膠控制系統(tǒng)中,實時任務(wù)執(zhí)行完畢后可自行結(jié)束中斷;但本研究中實時時鐘控制周期一旦確定,即使實時任務(wù)結(jié)束后仍有空閑的時間片,也不能結(jié)束當(dāng)前中斷。
圖1 具有實時功能的軟件框架模型
圖2 實時任務(wù)調(diào)度
本研究所設(shè)計的面向機電系統(tǒng)的軟件框架是基于Java 平臺開發(fā)的,Java 平臺本身所提供的定時器顯然無法滿足前述實時性要求,因此必須采用操作系統(tǒng)所提供的精度更高的定時器中斷。為此,本研究在Windows平臺上設(shè)計實現(xiàn)了精度為1 ms的定時器,并通過JNI 技術(shù)將其與Java 平臺結(jié)合起來,從而實現(xiàn)了在框架內(nèi)的實時時鐘模型。
具體模型如圖3所示。
圖3 Java平臺的實時時鐘實現(xiàn)
在該系統(tǒng)模型中,本研究采用了Java/C 混合編程技術(shù),其中核心是JNI。首先,Java 的實時時鐘模塊在初始化時通過JNI調(diào)用響應(yīng)的基于C的多媒體時鐘初始化函數(shù)進(jìn)行初始化工作,最重要的是設(shè)置時鐘周期,以及設(shè)置回調(diào)函數(shù)入口地址等;其次Java 的實時時鐘模塊啟動時,也要調(diào)用相應(yīng)C函數(shù)啟動多媒體定時器計數(shù);啟動完畢后,多媒體定時器會按照預(yù)置的時間間隔定期調(diào)用C設(shè)置的回調(diào)函數(shù),而回調(diào)函數(shù)則通過JNI 與Java 虛擬機通訊,找到實時時鐘模塊并調(diào)用其時鐘觸發(fā)方法。此時,所有在Java平臺中注冊監(jiān)聽實時時鐘消息的所有對象都會得到通知。
本研究所采用的工具是Sun公司創(chuàng)建的Java De?velopment Kit(JDK)版本1.6.0_22,以及微軟公司的Vi?sual C++6 開發(fā)環(huán)境。本研究設(shè)計中的Java 語言與C語言相互調(diào)用,這就要用到JNI。JNI是Java Native In?terface 的縮寫,JNI 是一種機制,有了它就可以在Java程序中調(diào)用其他本地代碼,或者使本地代碼調(diào)用Java層的代碼。
在Java程序中,首先要編寫帶有native方法的類,要在該類中聲明所調(diào)用的庫名稱System.LoadLibrary(String libname);在該類中只需要聲明將要調(diào)用的本機方法,關(guān)鍵字為native,不需要具體實現(xiàn),實現(xiàn)放在由C編寫的DLL文件中實現(xiàn)。
本研究編寫好帶有本機方法的TimerManager 類后,進(jìn)行編譯,生成對應(yīng)的class 文件。再用javah scc.TimerManager 語句編譯,就會生成對應(yīng)的scc_Timer?Manager.h頭文件。
之后就可運用該頭文件中的函數(shù)原型:JNIEXPORT void JNICALL Java_scc_TimerManager_timer(JNIEnv*env,jobject obj)來編寫所需要的DLL文件,來產(chǎn)生固定周期的時鐘信號。
雖然Win 平臺下可視化開發(fā)工具如VC、Delphi、C++Builder 等都有專用的定時器控件Timer,而且使用很方便,可以實現(xiàn)一定的定時功能,但最小計時精度僅為55 ms,且定時器消息在多任務(wù)操作系統(tǒng)中的優(yōu)先級很低,不能得到及時響應(yīng),往往不能滿足實時控制環(huán)境下的應(yīng)用。不過Microsoft公司在Win32 API函數(shù)庫中已經(jīng)為用戶提供了一組用于高精度計時的底層函數(shù),如果用戶使用得當(dāng),計時精度可到1 ms。這個計時精度對于一般的實時系統(tǒng)控制完全可以滿足要求。具體應(yīng)用時,研究者可以通過調(diào)用timeSetEvent()函數(shù),將需要周期性執(zhí)行的任務(wù)定義在LpTimeProc回調(diào)函數(shù)中,從而完成所需處理的事件。需要注意的是,任務(wù)處理的時間不能大于所設(shè)置的時鐘周期。定時器使用完畢后,應(yīng)及時調(diào)用timeKillEvent()將之釋放。
前面分析過Java層和JNI層(即C語言模塊)應(yīng)該可以互相交互,通過Java 層中的native 函數(shù)可以進(jìn)入到JNI 層,而JNI 層的代碼則通過JNIEnv 操作Java 層中函數(shù)。JNIEnv是一個與線程相關(guān)的代表JNI環(huán)境的結(jié)構(gòu)體。JNIEnv實際上提供了一些JNI系統(tǒng)函數(shù)。通過這些系統(tǒng)函數(shù)可以調(diào)用java 層中的函數(shù)或者操作jobect。GetObjectClass()方法可以通過對象jobect 直接得到其所對應(yīng)的類的定義。GetMethodID()方法可以得到所需要用到函數(shù)的id。而CallXXXMethod()函數(shù)則實現(xiàn)了java類中相應(yīng)方法的調(diào)用。這樣就完成了JNI層向java層的調(diào)用。要注意的是這里JNI層中調(diào)用的方法實際上是java中對象的成員函數(shù),如果要調(diào)用static 函數(shù)可以使用CallStaticXXXMethod()。這種機制實現(xiàn)了native層回調(diào)Java代碼完成相應(yīng)操作。
該系統(tǒng)實現(xiàn)中,在回調(diào)函數(shù)void CALLBACK TimeProc()中調(diào)用CallXXXMethod(JNIEnv *env,jclass clazz)方法,從而調(diào)用java 程序中的TimerMan?ager 類中的方法來觸發(fā)一次時鐘事件,產(chǎn)生周期為100 ms(可配置)的時鐘。
實時時鐘模塊解決了實時性問題,但是大型控制應(yīng)用往往都是多任務(wù)的,為實現(xiàn)多任務(wù)的實時運行,就需要利用實時任務(wù)調(diào)度模塊。
本研究對實時任務(wù)的管理通過一種類似時間片的方式進(jìn)行。首先,實時任務(wù)模塊在初始化時需要在實時任務(wù)調(diào)度模塊中注冊實時任務(wù)信息,主要包括該實時任務(wù)的執(zhí)行周期和任務(wù)序號;任務(wù)調(diào)度模塊根據(jù)這些信息確定時鐘觸發(fā)的頻率以及任務(wù)模塊的調(diào)用順序。在任務(wù)執(zhí)行時,實時任務(wù)調(diào)度模塊會創(chuàng)建優(yōu)先級較高的線程來單獨運行實時任務(wù);而且其他非實時模塊的任務(wù)仍然在其他的線程中運行,由于Java線程管理采用的是搶占式,可以保證實時模塊的優(yōu)先運行。
對于超時運行時間片的實時模塊,目前的策略是監(jiān)測并給出警告。實時任務(wù)模塊的設(shè)計者應(yīng)當(dāng)保證實時模塊的任務(wù)能夠在最小的時間片長度內(nèi)運行完畢。對于因為運算量巨大且無法優(yōu)化從而需要較多計算時間的實時任務(wù),只能通過增大時間片的方法解決,此時整個系統(tǒng)的控制周期也會隨之增大。
控制周期、實時時鐘周期和時間片之間的關(guān)系如圖4所示。
從圖4 中可以看出,時間片是任務(wù)執(zhí)行的最小單位,一個任務(wù)只能占用一個時間片,時間片是由任務(wù)調(diào)度模塊在一個實時時鐘周期內(nèi)分配給各個實時任務(wù)模塊的,其時長是可變的,取決于任務(wù)的數(shù)量和實時時鐘周期的大小;實時時鐘周期是確定的不可改變的,控制周期則由多個時鐘周期組成,對于大部分實時控制系統(tǒng)而言,控制周期往往只有一個,因此可以將時鐘周期設(shè)置為控制周期同樣大??;如有多個實時控制對象,應(yīng)將時鐘周期設(shè)置為多個控制周期的最大公約數(shù)。
圖4 控制周期,時鐘周期和時間片之間的關(guān)系
為了測試系統(tǒng)的實時性,本研究只定義了一個實時模塊和一個非實時模塊來測試系統(tǒng)。該實時模塊只有一個實時任務(wù),其功能就是打印出運行時的系統(tǒng)時間,通過分析其間隔的時間精度與設(shè)計時的控制周期的誤差來驗證上述系統(tǒng)的實時性,加入非實時任務(wù)的目的是驗證實時任務(wù)的實時性是否受非實時任務(wù)的影響。
測試結(jié)果如圖5所示。從圖5中可以看到,第1次與第2次調(diào)用時鐘時系統(tǒng)時間間隔為98 ms,其余的時間間隔均為100 ms,與之前設(shè)定的時鐘周期一致??傻贸鼋Y(jié)論:前面設(shè)計的實時任務(wù)模塊每隔100 ms就將模塊中的實時性任務(wù)執(zhí)行一次,可以滿足整個系統(tǒng)的實時性要求。
圖5 測試結(jié)果
本研究在原基于組件的機器人控制軟件框架的基礎(chǔ)上,開發(fā)了實時任務(wù)模塊,將原系統(tǒng)改造為支持實時性軟件開發(fā)的軟件框架,基于該框架,可以快速開發(fā)具有實時性功能要求的控制軟件,重點解決了在Windows平臺上實時時鐘模塊以及實時任務(wù)調(diào)度模塊的實現(xiàn)方法。
目前,該軟件框架正用于本課題組RoboCup 小型組足球機器人控制策略軟件的開發(fā)中,在后續(xù)工作中,筆者將重點對實時任務(wù)的調(diào)度算法進(jìn)行研究,重點解決如何能夠發(fā)現(xiàn)用戶開發(fā)的實時任務(wù)中存在的問題,以及如何避免因某一實時模塊的問題引起整個應(yīng)用程序?qū)崟r性變差的問題等。
(References):
[1]陳萬米,張 冰,朱 明,等.智能足球機器人系統(tǒng)[M].北京:清華大學(xué)出版社,2009.
[2]李 策.基于DSP和FPGA的小型足球機器人控制系統(tǒng)的研究[D].大連:大連理工大學(xué)電子與信息工程學(xué)院,2006.
[3]徐璟業(yè).F-180 小型足球機器人的無線通信系統(tǒng)設(shè)計[J].電子技術(shù)應(yīng)用,2004(5):60-63.
[4]張叢榮.足球機器人運動控制系統(tǒng)的研究與完善[D].沈陽:東北大學(xué)信息學(xué)院,2006.
[5]LI Xiao-ming,JIN Yu-zhen,HU Xu-dong.An XML-driven component based Software Framework for Mobile Robotic Applications[C]//Proceedings of the 2nd IEEE/ASME Inter?national Conference on Mechatronic and Embedded Systems and Applications,MESA 2006.Beijing:[s.n.],2006.
[6]BRUGALI D,SCANDURRA P.Component-based robotic engineering(part 1)[J].IEEE Robotics and Automation Magazine,2009,16(4):84-96.
[7]BRUGALI D,SCANDURRA P.Component-based robotic engineering(part 2)[J].IEEE Robotics and Automation Magazine,2010,17(1):100-112.
[8]INGHAM M,RAGNO R,WILLIAMS B.A Reactive Mod?el-based Programming Language for Robotic Space Explor?ers[C]//Proceedings of ISAIRAS-01,2001.Montered:[s.n.],2000.
[9]胡海濤.面向?qū)ο蠹夹g(shù)在實時系統(tǒng)中的研究與應(yīng)用[D].西安:西北工業(yè)大學(xué)計算機學(xué)院,2003.
[10]AUSLANDER D M.What is mechatronics[J].IEEE/ASME Transactions on Mechatronics,1996,1(1):5-9.
[11]AUSLANDER D M,RIDGELY J R,RINGGENBERG J D.Control Software for Mechanical Systems:Object-oriented De?sign in a Real-time World[M].北京:清華大學(xué)出版社,2004.
[12]李曉明,肖亮亮,孫琛琛.基于VB的通用運動控制軟件模型設(shè)計[J].機電工程,2009,26(12):50-53.
[13]趙翼翔,陳新度,陳 新.全自動芯片粘片機點膠控制系統(tǒng)的設(shè)計與實現(xiàn)[J].機械與電子,2006(3):33-35.