摘 要:高架庫虛擬仿真系統是在C++環境下運用Vega的C++函數庫進行開發的,但是在開發過程中常規的Windows應用程序與Vega應用程序代碼混雜在一起,不利于編寫和維護。因為核心系統任務主要是用Vega應用程序實現的,所以可將核心系統任務分離出來,其處理程序單獨開發。設計了一個系統運行框架,即引擎,它只有在必要的時候才調用核心系統任務處理程序。在引擎設計完成后,核心系統任務的實現就成為系統開發的中心工作,而且避免Windows應用程序繁雜代碼的干擾。在高架庫虛擬仿真系統的開發中應用引擎技術來提高系統開發的效率和可維護性。
關鍵詞:高架庫虛擬仿真;Vega;引擎技術;類
中圖分類號:TP311文獻標識碼:B
文章編號:1004-373X(2010)02-185-03
Application of Engine Technology in Overhead Warehouse Virtual Simulation System
GUO Feng,LIU Chenyu,SHI Yumin
(Navy Aeronautical Engineering Institue,Qingdao,266041,China)
Abstract:The overhead warehouse virtual simulation system is developed in C++ environment using Vega′s C++ function library,but in the process of developing the codes of conventional Windows applications and Vega applications are mixed,which is not conducive to compile and maintaining.Because the main task of the core system applications is realized with Vega applications,the core system task can be separated from the development work,and its process programe is developed solely,and then,to design a framework of system running,that is the engine,it can call the core of the system task process programe when necessary.After completion of design of the engine,realization of the core system task has become the central work of system development,and interference with complex code of Windows applications is avoided.The application of engine technology to improve the efficiency and maintainability of system development in the development of the overhead warehouse virtual simulation system.
Keywords:overhead warehouse virtual simulation;Vega;engine technology;class
0 引 言
高架庫是一種適合大規模儲存貨物的高效自動倉庫,由高層貨架、貨箱、巷道堆垛起重機(即有軌堆垛機)、出入庫輸送機系統、自動化控制系統、計算機倉庫管理系統及輔助設備組成,對集裝單元貨物實現了自動化保管和計算機管理。但是高架庫造價昂貴,所用的自動化設備費用很高,為了減少因為訓練學習所帶來的損耗,有必要開發一套高架庫虛擬仿真系統,即利用虛擬現實技術[1]和視景仿真技術[2]實現倉庫的業務流程、設備工作過程、信息管理等的模擬仿真效果。
虛擬仿真系統其實是一種特殊的程序類型,仍然只是一個以某種程序語言編寫的程序,所以可以像其他任何Windows程序那樣開發該類系統。該系統采用的是Windows環境下的C++編程語言[3],因此需要一個能夠使用Win32 API創建Windows應用程序的編譯器,即Visual C++ [4-6]。仿真軟件采用Vega[7],它使用一套特有的C++函數庫驅動虛擬場景或者三維模型進行模擬仿真[8,9]。
在高架庫的虛擬仿真系統中,必須執行各種不同的任務,如設定所取貨物位置、取貨柜、送貨柜、記錄所做操作等,這是系統的特有任務。在開發過程中,系統特有任務的代碼與常規的Windows應用程序的繁雜代碼混在一起,使程序代碼的編寫和維護變得很困難,因此有必要將系統特有任務與Windows應用程序的開發工作分離開來;而分離的最好措施就是創建一個引擎,它允許隱藏針對Windows應用程序而與系統任務無關的代碼,即創建了引擎后只需要專注于系統各任務的實現,這才是整個系統最重要的工作。
1 引擎的設計
引擎的設計思想是一次性開發某些核心系統任務程序,然后將這些任務程序調入引擎中,只有在必要時才再次處理它們。具體來說,設計一個系統引擎,首先,要分析該系統可分解為哪些事件;然后,再為各事件創建相應的事件處理函數;其次,創建一個引擎類并把這些事件處理函數設置為引擎類的成員函數,也就是系統的任務接口;最后是設計引擎的執行程序,使系統運行時按需調用引擎類的成員函數。
引擎程序設計完畢后,剩下的工作就是編寫引擎類的事件處理函數,這樣就把與系統特有任務無關的Windows程序代碼分離出來,從而將程序開發工作的重心集中在系統特有任務的開發上。
1.1 事件分析
該系統中的事件包括Windows事件和系統特有事件。Windows事件主要是程序初始化事件,系統特有事件要根據系統的特有任務來確定。
特有任務實際上就是虛擬場景中三維模型的仿真運動。該系統中的模型包括運動模型和靜止模型兩種。運動模型主要包括觀察者(用于在虛擬場景中漫游)、堆垛機(用于取送貨)、輸送機(用于傳送貨箱)。靜止模型主要包括地面、倉庫、貨架、控制臺等。該系統需要完成的特有任務有:控制觀察者漫游;觀察者和其他模型需要進行碰撞檢測;控制臺的控制屏幕需要進行貨位坐標設置,并將其發送給堆垛機;取貨箱與送貨箱;錄制系統運行過程并能夠回放。所以,漫游、設置貨位坐標、碰撞、取貨箱、送貨箱、錄制、回放等都是系統的特有事件。
1.2 事件處理函數設計
在程序運行過程中發生一個事件時,就會調用相應的事件處理程序,即事件處理函數。該系統主要事件的事件處理函數設計如下:
(1) 程序初始化事件函數為SystemInitialize(),用來創建一個引擎類對象,并將其指定給一個全局變量,這樣就可以在外部通過訪問器(Accessor)方法訪問該引擎;
(2) Vega程序的初始化函數為VegaInitialize(),用來加載三維場景、初始化Vega窗口、配置Vega程序;
(3) 漫游事件函數為Wander(),用來控制觀察者在虛擬場景中的坐標位置,使其進行自動漫游或者手動漫游;
(4) 設置貨位坐標事件函數為SetPositionData(),用來設置需要取或送的貨箱的貨位坐標;
(5) 碰撞事件函數為Collision(),用來對觀察者與虛擬場景中的其他對象進行碰撞檢測;
(6) 取貨箱事件函數為GetBox(),用來根據要取的貨箱的貨位坐標去取貨箱;
(7) 送貨箱事件函數為SendBox(),用來根據要送的貨箱的貨位坐標去送貨箱;
(8) 錄制事件函數為Record(),用來把虛擬場景中的操作情況和設備的工作過程錄制并保存下來;
(9) 回放事件函數為Replay(),用來重播錄制好的虛擬場景的片斷。
1.3 引擎類設計
高架庫引擎類設計的關鍵就是按照面向對象(OOP)的設計原則,把上述事件處理函數都放在引擎類中,具體設計如下:
class SystemEngine
{
protected:
//成員變量:存儲窗口大小、窗口類名稱、觀察者和貨箱的坐標等
public:
//構造函數/析構函數
SystemEngine();
virtual _SystemEngine();
//常規方法
Initialize();
HandleEvent();
//訪問器方法
//事件函數
SystemInitialize();
VegaInitialize();
Wander();
…
};
其中:
(1) SystemEngine()是構造函數,用來初始化引擎成員變量;析構函數保持為空,以備將來需要時使用。
(2) Initialize()方法用來處理通常在標準Windows函數WinMain()中執行的任務,即創建主窗口類、注冊窗口類、設置窗口大小和位置、創建窗口、顯示和更新窗口。另外,Initialize()方法還有兩個非常重要的任務,即為Vega程序處理函數vgLoop()的執行創建一個獨立的線程以及把Vega窗口嵌入到Windows窗口中。
(3) HandleEvent()方法用來處理引擎內的標準Windows事件,即將Windows消息傳遞給引擎成員函數,如程序初始化、漫游、取貨、送貨、碰撞等事件函數,由它們來響應對應的Windows消息。
與Initialize()方法把WinMain()函數中的程序代碼隔離一樣,HandleEvent()方法也把通常在標準Windows函數WndProc()中執行的代碼隔離,其目的是更好地隱藏常規Windows代碼。
(4) 訪問器方法用于訪問成員變量。
(5) 事件函數,即該系統的事件處理函數,它包括Windows事件和系統特有事件的事件處理函數。
1.4 引擎程序設計
該系統引擎程序主要包括WinMain(),vgLoop(),WndProc()三個函數,設計如下:
(1) 函數WinMain()是Windows程序的入口函數,主要執行的任務包括:一是系統程序的初始化,由引擎類的事件函數SystemInitialize()完成;二是Windows窗口和Vega線程的創建、Vega窗口嵌入Windows窗口,由引擎類的常規方法Initialize()完成。
(2) 函數vgLoop()是在函數WinMain()中創建的Vega線程中執行,主要執行的任務包括:一是Vega窗口的創建和Vega程序的初始化,由引擎類的事件函數VegaInitialize()完成;二是系統特有事件的處理,由引擎類的事件函數VegaInitialize()、Wander()等來完成。另外,因為系統特有事件都是實時事件,所以在vgLoop()函數中需要創建一個虛擬場景的渲染主循環,在該循環內由Vega函數完成虛擬場景的實時渲染和更新。
(3) 函數WndProc()是與用戶交互的一個接口,它使用戶能夠在Vega窗口中通過調用引擎類的常規方法HandleEvent()來處理Windows消息。
2 結 語
引擎技術可以把系統的開發重心轉換為任務接口函數的編寫,使系統的開發效率和可維護性都大大提高。同時,它對其他虛擬仿真系統或者各種二維和三維游戲的開發具有很大的借鑒意義和實用價值[10]。
但是,該系統的引擎不能直接應用到其他系統的開發,主要原因是通用性不足,建議把核心Windows事件從引擎類中分離出來即因為核心Windows事件雖然與引擎聯系緊密,但二者實際上是獨立的——雖然這樣做會破壞OOP原則,但就結構而言,把引擎單獨放在自己的類中是更好的選擇。
參考文獻
[1]曾芬芳.虛擬現實技術[M].上海:上海交通大學出版社,2005.
[2]王冬海.三維視景仿真技術在地鐵列車運行控制系統仿真中的應用[D].北京:北京交通大學,2004.
[3]揣錦華.C++程序設計語言[M].西安:西安電子科技大學出版社,2006.
[4]懷紅旗,王愛民.基于MFC和Vega 的導航仿真系統[J].現代電子技術,2009,32(2):167-170.
[5]侯俊杰.深入淺出MFC[M].武漢:華中科技大學出版社,2006.
[6]黃維通.邊學邊用Visual C++編程[M].北京:清華大學出版社,2006.
[7]王乘.Vega實時三維視景仿真技術[M].武漢:華中科技大學出版社,2005.
[8]譚淑婷,沈曉峰.基于Vega的機載SAR場景仿真[J].現代電子技術,2009,32(10):58-60.
[9]龔卓蓉.Vega程序設計[M].北京:國防工業出版社,2006.
[10]張舸,林世勇.基于嵌入式系統的游戲程序設計[J].現代電子技術,2009,32(6):86-90.