周星宇,李春濤,姚 瑞,范 影
(南京航空航天大學自動化學院,南京 210016)
隨著無人機飛行任務(wù)越來越多樣化,功能越來越復雜,飛行控制系統(tǒng)的任務(wù)負載日益繁重[1],為提高飛行控制系統(tǒng)性能,出現(xiàn)了分布式架構(gòu)的飛行控制系統(tǒng),系統(tǒng)各節(jié)點均進行任務(wù)解算,需要將解算任務(wù)合理分配至多個節(jié)點上,共同完成復雜的飛行控制任務(wù)[2]。與此同時,隨著系統(tǒng)的運行,各個功能模塊的負載會發(fā)生變化,進而導致各個節(jié)點的負荷變得不均衡,造成系統(tǒng)運行效率下降以及資源的極大浪費。
針對上述問題,本文以基于CAN總線的飛行控制計算機為硬件平臺,VxWorks操作系統(tǒng)為軟件平臺,利用軟件總線設(shè)計了飛行控制軟件的靜態(tài)和動態(tài)負荷均衡策略,對各個解算節(jié)點的負荷進行合理分配,保證了各個節(jié)點的高效持續(xù)運行,進而提高了飛行控制系統(tǒng)的可靠性。
基于CAN總線的分布式架構(gòu)飛行控制計算機如圖1所示。該目標機由4個節(jié)點組成,節(jié)點之間采用分工協(xié)作的方式,分別負責不同的功能模塊,通過CAN總線進行數(shù)據(jù)的通信。與其他總線相比,CAN總線數(shù)據(jù)傳輸速度較高、具有自我診斷能力以及抗干擾能力強的優(yōu)勢[3],滿足了飛行控制系統(tǒng)內(nèi)部通信的需求。
系統(tǒng)的功能和資源分布在不同的節(jié)點上,當某一個節(jié)點負荷不均衡時,可執(zhí)行相應(yīng)的處置邏輯,將部分功能模塊進行遷移,達到分擔負荷的目的。同時,當系統(tǒng)接口需求增加時,可通過增加節(jié)點實現(xiàn)接口資源的擴展。
圖1 飛行控制計算機結(jié)構(gòu)Fig.1 The structure of flight control computer
飛行控制系統(tǒng)作為硬實時系統(tǒng),對系統(tǒng)的響應(yīng)時間有嚴格的要求,要求系統(tǒng)對外部事件能夠做到快速響應(yīng)以及多任務(wù)處理。VxWorks是專門為實時嵌入式系統(tǒng)設(shè)計開發(fā)的操作系統(tǒng)軟件,具有易裁剪、高性能、高可靠性以及高實時性等優(yōu)點[4]。VxWorks高效的實時任務(wù)調(diào)度、較短的中斷調(diào)度時間使其能夠滿足飛行控制軟件對實時性的要求。
為了能夠?qū)崿F(xiàn)整個系統(tǒng)的負荷分擔和功能模塊遷移,需要軟件總線提供功能模塊的注冊和刪除、資源的統(tǒng)一管理和調(diào)度以及保證各節(jié)點內(nèi)存資源一致性的功能。軟件總線的結(jié)構(gòu)如圖2所示。飛行控制軟件按功能和任務(wù)間的耦合性大小劃分為遙控遙測功能模塊、傳感器數(shù)據(jù)采集模塊、傳感器數(shù)據(jù)融合模塊、故障監(jiān)測與處置模塊、導航制導模塊、控制律解算模塊及控制輸出管理模塊等,對其進行統(tǒng)一的接口封裝使其能夠方便地掛接到軟件總線上。軟件總線內(nèi)部的模塊管理器可以對模塊進行相應(yīng)的加載和刪除[5]。同時,軟件總線能夠利用自身的資源管理器對內(nèi)存資源池進行管理,完成節(jié)點內(nèi)不同功能模塊之間數(shù)據(jù)資源的交互以及節(jié)點之間數(shù)據(jù)的傳輸,保證節(jié)點的解算同步[6-7]。
圖2 軟件總線結(jié)構(gòu)圖Fig.2 The construction of software bus
飛行控制系統(tǒng)節(jié)點的負載與節(jié)點中運行的功能模塊數(shù)量、模塊的運行時間和調(diào)用頻率有關(guān),即模塊數(shù)量越多,運行時間越長,調(diào)用頻率越高,則CPU的利用率越高。因此,定義模塊的負載為1 s內(nèi)模塊運行花費時間的總和,即該模塊完成一次運行所花費的時間與模塊調(diào)用頻率之積。因為各功能模塊的負載是負荷均衡處理時的主要判斷依據(jù),所以首先需要完成對飛控系統(tǒng)各個功能模塊的運行時間的統(tǒng)計。各個功能模塊參數(shù)見表1。
表1 功能模塊參數(shù)統(tǒng)計表Table 1 Parametric statistics of function module
靜態(tài)負載均衡是指在飛控系統(tǒng)運行的初始時刻,主節(jié)點根據(jù)各模塊負載的統(tǒng)計結(jié)果,通過靜態(tài)負載均衡算法進行計算,再將所有功能模塊均衡地分配至3個解算從節(jié)點上,使得飛控系統(tǒng)在開始運行時能夠合理地利用各節(jié)點的資源,為后續(xù)系統(tǒng)實現(xiàn)動態(tài)負載均衡奠定基礎(chǔ)。
為了能夠?qū)崿F(xiàn)靜態(tài)負載均衡,分配功能模塊時,需要遵循以下兩個原則。
1) 功能模塊完全分配原則,即各個節(jié)點功能模塊的個數(shù)總和應(yīng)該與全局的功能模塊個數(shù)相等,不允許出現(xiàn)功能模塊未被分配的情況。
2) 節(jié)點負載均衡原則,即根據(jù)飛控軟件中的功能模塊負載的大小,將各個節(jié)點的負荷分布在一個負載均值范圍內(nèi)。假設(shè)每個功能模塊的負載大小為Mi(i=1,2,…,n),每個節(jié)點的負載為Pi(i=1,2,3),理想負載為Pideal,則各個節(jié)點的實際負載與理想負載和功能模塊負載之間的關(guān)系為
(1)
根據(jù)上述兩個原則,設(shè)計靜態(tài)負載均衡算法:假設(shè)各個節(jié)點的負載為nodeload[i](i=1,2,…,n),首先對節(jié)點1進行分配,對所有功能模塊依次進行判斷,如果節(jié)點1的負載加上該功能模塊后使節(jié)點1的負載與理想負載Pideal的偏差更小,即滿足式(2)時則將該模塊分配至節(jié)點1,否則不進行分配。節(jié)點1分配完成后,節(jié)點2同理。根據(jù)功能模塊完全分配原則,在為節(jié)點3分配功能模塊時,需要將所有未分配的功能模塊分配至節(jié)點3中,這樣可以避免出現(xiàn)部分功能模塊未被分配解算節(jié)點的情況。
|Pideal-nodeload[i]-Mj|<|Pideal-nodeload[i]|。
(2)
靜態(tài)負載均衡的具體流程如圖3所示,其中,i為節(jié)點號,j為功能模塊ID號,n為模塊總個數(shù)。
圖3 靜態(tài)負載分配算法Fig.3 Static load allocation algorithm
隨著系統(tǒng)運行時間的推移,無人機飛行階段會進行切換,飛行模態(tài)會發(fā)生改變,各個功能模塊的數(shù)據(jù)解算量會發(fā)生變化,同時飛行控制軟件中存在事件觸發(fā)型的任務(wù),如當部分傳感器受到外界干擾而發(fā)生故障時,相應(yīng)的故障處置任務(wù)會被激活,從而各個節(jié)點的負荷會產(chǎn)生變化,與最初利用靜態(tài)負載均衡劃分的結(jié)果產(chǎn)生一定的偏差,此時就需要使用動態(tài)負荷均衡策略才能實現(xiàn)各個節(jié)點在運行過程中始終保持較為合理的負荷,保證系統(tǒng)的正常運行[8-9]。動態(tài)負載均衡主要涉及負載均衡的決策和功能模塊的動態(tài)遷移。
根據(jù)國軍標要求,每個處理器的CPU利用率不應(yīng)超過70%。當CPU利用率超過70%時,系統(tǒng)的穩(wěn)定性會下降,需要留出一定的裕度,因此設(shè)定CPU利用率U
的上限和下限分別為60%和10%。超過上限的為過載節(jié)點,低于下限的則為輕載節(jié)點,在上下限之間的為中載節(jié)點,如圖4所示。節(jié)點負載過重可能會導致相關(guān)的飛控任務(wù)不能及時得到執(zhí)行,出現(xiàn)安全隱患,因此該節(jié)點要主動向主節(jié)點提出申請,將部分功能模塊遷移至負載相對較輕的節(jié)點;同時負載較輕的節(jié)點由于執(zhí)行任務(wù)較少,會造成資源浪費,因此負載較輕的節(jié)點要主動向主節(jié)點申請成為模塊遷入節(jié)點,接收相應(yīng)的功能模塊的遷入。
圖4 不同負載狀態(tài)下的節(jié)點類型劃分Fig.4 Node type partitioning in different load states
由于各個節(jié)點均使用MPC565作為主控芯片,可以認為各個節(jié)點的處理能力相當,只需要將負載最小的節(jié)點作為遷入節(jié)點即可,所以實現(xiàn)動態(tài)負載均衡的重點在于確定需要遷出的功能模塊,這時需要考慮兩方面的因素:功能模塊遷移后對遷入和遷出節(jié)點負載的影響以及模塊遷移對通信開銷的影響。
在進行模塊遷移時,可能出現(xiàn)遷移的模塊負載過小,完成模塊遷移后,當前節(jié)點仍處于過載狀態(tài),以及遷移的模塊負載過大,導致遷入節(jié)點的負載大大增加,進入了過載狀態(tài)的情況。為了避免上述情況的發(fā)生,在完成模塊遷移后,遷出節(jié)點和遷入節(jié)點的負載比較接近是最理想的狀態(tài),即使得遷移的功能模塊的負載接近于理想負載U0,即
(3)
(4)
圖5 數(shù)據(jù)耦合性的變化Fig.5 Changes in data coupling
對于節(jié)點內(nèi)的數(shù)據(jù)耦合,功能模塊需要的資源可以直接從軟件總線的資源池中讀取。但是對于節(jié)點間的數(shù)據(jù)耦合,則需要考慮節(jié)點間數(shù)據(jù)的傳輸和更新的時間。因此,節(jié)點內(nèi)的數(shù)據(jù)耦合對系統(tǒng)造成的影響與節(jié)點間的數(shù)據(jù)耦合造成的影響相比可以忽略。所以僅考慮節(jié)點間的數(shù)據(jù)耦合對功能模塊遷移造成的影響,則模塊遷移后對系統(tǒng)造成的數(shù)據(jù)耦合變化為
(5)
由于上述模塊遷移過程中兩個因素的量綱不一致,在進行評估時需要進行標準化處理,具體的方法為
(6)
(7)
因為上述兩個因素對模塊遷移產(chǎn)生的影響大小不同,所以利用權(quán)重因子作為在對一個功能模塊進行綜合評價時兩個因素所占比重,分別定義模塊負載所占比重和節(jié)點間通信開銷所占比重為Wload和Wcoup,所以各個功能模塊綜合評價結(jié)果為
vi=Wload*li+Wcoup*ci
(8)
式中,vi是模塊Mi的綜合評價結(jié)果,因此將遷出節(jié)點中功能模塊的vi的最小值作為遷出模塊。這樣的評價機制能夠避免將數(shù)據(jù)耦合較大的模塊分配至不同的節(jié)點,同時考慮了遷移前后負載的影響,使得飛控系統(tǒng)的各節(jié)點能夠處于負載均衡狀態(tài)。
無人機飛行控制系統(tǒng)具有高實時性的要求,模塊遷移延遲時間是衡量遷移算法的重要指標,即延遲時間越小對系統(tǒng)影響越小。而傳統(tǒng)的基于網(wǎng)絡(luò)通信的動態(tài)遷移算法,如內(nèi)存預拷貝算法,由于需要將源主機的全部狀態(tài)通過反復迭代的方法傳輸至目標主機而產(chǎn)生數(shù)據(jù)重復拷貝導致總時間增加[10]。針對上述問題,本文利用VxWorks操作系統(tǒng)中提供的動態(tài)加載機制和軟件總線設(shè)計了模塊預加載算法。
飛行控制系統(tǒng)中每個節(jié)點均利用VxWorks操作系統(tǒng)的TrueFFS功能組件建立文件系統(tǒng)[11],并在文件系統(tǒng)中存儲所有功能模塊的文件,當相應(yīng)的功能模塊需要運行時,利用軟件總線中的模塊管理器將相應(yīng)的目標文件從文件系統(tǒng)加載至內(nèi)存中執(zhí)行。同時,各個功能模塊運行所需的信息在各節(jié)點上均是互相備份的,因此與傳統(tǒng)的動態(tài)遷移方法相比,當模塊遷出時,不需要將相應(yīng)的信息傳輸至目標節(jié)點,只需要利用軟件總線的模塊管理器卸載相應(yīng)的功能模塊,減少了功能模塊遷移時系統(tǒng)資源的開銷和傳輸?shù)难舆t。
模塊預加載算法的具體流程如下:首先從遷入節(jié)點的文件系統(tǒng)中讀取需要進行遷移的功能模塊,實現(xiàn)預加載并進入運行狀態(tài),使能各個節(jié)點中軟件總線的仲裁功能,即各個節(jié)點對內(nèi)部資源池的更新仍使用遷出節(jié)點解算的結(jié)果,并向主節(jié)點發(fā)送加載完成應(yīng)答信號;主節(jié)點接收到應(yīng)答信號后,發(fā)送模塊卸載信號至相應(yīng)的遷出節(jié)點,遷出節(jié)點調(diào)用VxWorks操作系統(tǒng)提供的unld()庫函數(shù)完成該模塊的卸載后向主節(jié)點發(fā)送卸載完成信號;主節(jié)點在接收到卸載完成信號后,再在物理總線上廣播仲裁功能關(guān)閉信號幀,使各個節(jié)點關(guān)閉仲裁功能,此時對資源池的更新使用遷入節(jié)點解算的結(jié)果。具體的遷移過程如圖6所示。
圖6 功能模塊遷移流程Fig.6 The process of functional module migration
可靠性作為飛行控制系統(tǒng)的一項重要指標,決定了無人機飛行的安全。為了定量分析系統(tǒng)的可靠性,利用可靠性分析模型對樣例飛行控制系統(tǒng)和基本三余度飛行控制系統(tǒng)的可靠性進行對比分析。
系統(tǒng)可靠性的度量稱為可靠度,記作R(t)。由文獻[12]可知,在一個無冗余系統(tǒng)(即單節(jié)點系統(tǒng))中,系統(tǒng)的可靠度可以表示為
R(t)=e-λt
(9)
式中,λ為失效率,單位為失效數(shù)/h,在系統(tǒng)正常生命周期中為常數(shù)。
通常采用將飛行控制系統(tǒng)設(shè)計為雙余度和三余度等結(jié)構(gòu)的方法來提高飛行控制系統(tǒng)的可靠性?;救喽冉Y(jié)構(gòu)如圖7所示,該結(jié)構(gòu)中包括3個解算單元和1個表決器,各解算單元運行同樣的解算任務(wù),表決器根據(jù)各解算單元的結(jié)果進行處理,輸出最終的結(jié)果,即該結(jié)構(gòu)為并-串聯(lián)結(jié)構(gòu)。
圖7 基本三余度飛行控制系統(tǒng)Fig.7 Basic triplex-redundancy flight control system
由于3個解算單元和表決器具有相同的結(jié)構(gòu),因此各解算單元和表決器具有相同的可靠度。假設(shè)失效率為λnode,則各節(jié)點的可靠度為R(t)=e-λnodet。根據(jù)并-串聯(lián)可靠度公式[13]可得該系統(tǒng)的可靠度為
Ra(t)=(1-(1-e-λnodet)3)·e-λnodet。
(10)
樣例飛行控制系統(tǒng)的可靠性分析結(jié)構(gòu)如圖8所示,該結(jié)構(gòu)為并聯(lián)系統(tǒng)結(jié)構(gòu)。
圖8 樣例飛行控制系統(tǒng)可靠性分析結(jié)構(gòu)Fig.8 The construction of sample flight control system for reliability analysis
假設(shè)樣例飛行控制系統(tǒng)各節(jié)點與三余度飛控系統(tǒng)的解算單元結(jié)構(gòu)相同,可以得到各節(jié)點的可靠度為R(t)=e-λnodet。由于功能模塊可以由系統(tǒng)中任一節(jié)點加載運行,因此根據(jù)并-串聯(lián)可靠度公式可得該系統(tǒng)的可靠度為
Rb(t)=1-(1-e-λnodet)4。
(11)
根據(jù)文獻[13]和工程經(jīng)驗,取λnode為10-5/h,繪制了兩種結(jié)構(gòu)的飛行控制系統(tǒng)的可靠度對比曲線,如圖9所示。
圖9 可靠度對比曲線Fig.9 The curves of reliability
從圖9中可以看出,負載均衡的飛行控制系統(tǒng)與基本三余度結(jié)構(gòu)相比,可靠度得到大幅度提高,滿足飛行控制系統(tǒng)可靠性的要求。
為了驗證負荷分擔策略的正確性和合理性,需要對功能模塊分配結(jié)果以及各個節(jié)點的CPU利用率是否能夠動態(tài)地處于中載狀態(tài)進行測試與分析。
整個飛行控制系統(tǒng)上電后,首先進行各個節(jié)點的初始化,待所有節(jié)點初始化完成后,主節(jié)點根據(jù)表1中的數(shù)據(jù)執(zhí)行靜態(tài)負載均衡分配算法,并將功能模塊分配的結(jié)果輸出至各從節(jié)點,分配結(jié)果如圖10所示。
圖10 靜態(tài)負載均衡分配結(jié)果Fig.10 The result of static load allocation
從圖10中可以看出,節(jié)點1分配的功能模塊分別為GPS模塊、IMU模塊、空速計/高度計模塊和導航制導模塊,節(jié)點2分配的功能模塊分別為數(shù)據(jù)融合模塊、控制輸出模塊、故障監(jiān)測與處置模塊和遙控接收模塊,節(jié)點3分配的功能模塊分別為控制律解算模塊和遙測發(fā)送模塊。根據(jù)計算,3個解算節(jié)點的CPU利用率應(yīng)分別為27.2%,26.7%和24.8%。
在完成靜態(tài)負載均衡后,對各個節(jié)點的負載情況進行實時監(jiān)測,結(jié)果如圖11所示。由監(jiān)測結(jié)果可知,各個解算節(jié)點在完成靜態(tài)負載均衡后CPU利用率均在26%左右,與理論計算值相符。結(jié)果表明,負荷分擔式飛行控制軟件在進行靜態(tài)負載均衡時能夠做到準確均衡地分配各個功能模塊,使系統(tǒng)的初始狀態(tài)處于一個較為合理安全的狀態(tài)。
圖11 靜態(tài)負載均衡分配后各節(jié)點負載情況Fig.11 Load of each node after static load allocation
為了便于驗證動態(tài)負載均衡及估計各個節(jié)點的負載,同時模擬系統(tǒng)受到外界干擾時的情況,在靜態(tài)負載均衡的基礎(chǔ)上進行手動分配,將IMU模塊、數(shù)據(jù)融合模塊、控制輸出模塊以及故障監(jiān)測與處置模塊分配至解算節(jié)點3。通過圖12可以看出,完成功能模塊手動分配后,節(jié)點1的CPU利用率為14.56%,節(jié)點2的CPU利用率為1.4%,節(jié)點3的CPU利用率為62.3%。負荷較輕的節(jié)點2首先會根據(jù)主節(jié)點的調(diào)度結(jié)果,加載需要遷移的功能模塊,待系統(tǒng)穩(wěn)定運行后,過載節(jié)點3將遷出的功能模塊卸載,此時,進行了負荷分擔的2個節(jié)點的CPU利用率比較接近,均在32%左右,達到了預期的效果。
圖12 某一個節(jié)點過載時的動態(tài)負載均衡Fig.12 The process of dynamic load balancing when a node is overloaded
綜合上述測試分析,當系統(tǒng)受到外界干擾時,動態(tài)負載均衡策略能夠根據(jù)系統(tǒng)與理想負載的偏差進行調(diào)整,使得系統(tǒng)各節(jié)點的負載始終處于合理的狀態(tài),能夠保證系統(tǒng)持續(xù)高效運行以及節(jié)點間的負載均衡,提高了分布式架構(gòu)無人機飛行控制軟件的可靠性和安全性,能滿足系統(tǒng)的要求。
本文結(jié)合分布式飛控系統(tǒng)的結(jié)構(gòu)特點,設(shè)計了飛行控制軟件的負荷均衡策略,最終實現(xiàn)了分布式架構(gòu)下節(jié)點間的靜態(tài)和動態(tài)負載均衡,使得整個系統(tǒng)能夠持續(xù)高效地運行。通過測試和分析,表明系統(tǒng)中各個節(jié)點均能夠動態(tài)地處于中載狀態(tài),多個節(jié)點能夠可靠、穩(wěn)定地協(xié)同工作,為分布式飛行控制軟件設(shè)計提供了新思路。
參考文獻
[1] 孟沖.小型無人機負荷分擔式容錯飛行控制軟件設(shè)計[D].南京:南京航空航天大學,2014.
[2] 張增安,陳欣,呂迅竑.一種用于無人機的分布式飛行控制系統(tǒng)設(shè)計[J].計算機系統(tǒng)應(yīng)用,2010,19(8):16-19,61.
[3] 吳建軍,鄭國輝,張小林.中小型無人飛行器二余度CAN總線網(wǎng)絡(luò)設(shè)計[J].計算機測量與控制,2012,20(3):813-815.
[4] 張楊,于銀濤.VxWorks內(nèi)核、設(shè)備驅(qū)動與BSP開發(fā)詳解[M].2版.北京:人民郵電出版社,2011:36-42.
[5] 靳朋飛.基于VxWorks的軟件總線及其自主恢復技術(shù)[D].西安:陜西師范大學,2013.
[6] 賈振宇.基于軟總線的組件式飛行控制軟件設(shè)計[D].南京:南京航空航天大學,2016.
[7] BRUCE-BOYE C,KAZAKOV D A.Distributed data acquisition and control by software bus[J].自動化博覽,2004,21(5):98-99.
[8] 劉洋,李林峰.調(diào)度機制對CPU-MEM負載共享系統(tǒng)的性能影響[J].計算機工程與設(shè)計,2008,29(3):633-638.
[9] 寧濤.面向嵌入式應(yīng)用的動態(tài)加載機制研究[D].重慶:重慶大學,2008.
[10] 李建彬.基于虛擬機的分布式容災備份技術(shù)研究[D].長沙:國防科學技術(shù)大學,2010.
[11] 譚明.TrueFFS文件系統(tǒng)的底層結(jié)構(gòu)與性能研究[D].長沙:國防科學技術(shù)大學,2010.
[12] 袁由光.容錯計算原理[M].哈爾濱:哈爾濱工程大學出版社,2005.
[13] 石賢良.飛行控制計算機系統(tǒng)余度管理技術(shù)研究[D].西安:西北工業(yè)大學,2006.