宗曉萍,朱玲玲,齊興敏
(河北大學 電子信息工程學院,河北 保定 071000)
自動化立體倉庫是一種適合大規模儲存貨物的高效立體倉庫,由高層貨架、貨箱、巷道、堆垛起重機、出入庫輸送機系統、自動控制系統、計算機倉庫管理系統及輔助設備組成,對集裝單元貨物實現了自動化存儲和計算機管理[1]。隨著現代工業生產的迅猛發展,產品的多樣化和需求的個性化不斷地對自動化倉庫的規劃和設計提出更高的要求,但是面對自動化立體倉庫成本高,投資大的現實,對自動化立體倉庫系統采用三維虛擬仿真技術可以提前測試實際建設中方案是否符合要求,并對各種方案建立相應的仿真模型,進行多次仿真,確定最適合的方案,避免因盲目建設而導致經濟損失。
自動化立體倉庫的系統仿真是通過系統建模,計算機編程模擬實際系統運行狀態,并將計算模擬過程中的相關數據作為實際規劃設計與運作管理的理論依據,同時統計和分析模擬結果,用以指導實際物流系統的規劃設計與運作管理。對于圖形化的物流仿真軟件的研究,國外研究起點高,發展比較成熟,因此出現了很多專業化的物流仿真軟件。其中比較常用的有3i公司設計開發SIMAnimation和AutoSimulation公司開發的AutoState(AutoMod),日本的RaLC(樂龍),美國的Flexsim等[2]。但是諸如以上仿真軟件大多不提供源碼,不利于進行二次開發,且價格昂貴。國內對物流業的仿真都是依靠先進的仿真軟件,如文獻[3]采用Flexsim仿真軟件對某物流中心的倉儲作業系統進行了建模和深入分析,并從補貨策略設備配置及利用率等方面對模型進行了優化,提出了改進意見和建議。對于物流系統仿真方面,我國目前還處于起步發展階段。
此三維仿真平臺主要在VC++6.0環境下利用三維圖形庫OpenGL搭建立體倉庫的三維虛擬仿真平臺,并具體分析了碰撞檢測算法,實現了自動化立體倉庫存儲貨物實際流程的動畫演示,以便提前獲得倉庫的運行情況,使自動化倉儲在物流系統和企業生產系統中發揮更大的作用。
OpenGL只能通過其基本圖元來繪制圖形,不具備實體造型能力。3DMAX擁有強大的造型功能,可以將由3DMAX生成的圖形文件通過轉換軟件將模型轉換為OpenGL顯示形式,再用OpenGL進行編程控制[4]。此仿真平臺導入*.3DS格式,再對其進行編程控制,由此可避免在OpenGL中用點、線和多邊形來建立三維立體模型的繁重勞動。3DS模型文件由許多Chunk組成,其中編輯Chunk、顏色Chunk、材質Chunk、紋理Chunk起著關鍵的作用。因此,讀入以上的關鍵塊就可以實現模型的外部導入[5]。
在MFC框架中定義一個名為LOAD3DS的類,用于3DS文件的讀入與重繪,該類中主要定義的幾個結構體及主要函數如下:
(1)主要結構體:顏色結構體,頂點結構,對象結構體。
(2)主要函數:
3DSObject·Load3DSObject();//讀取3DS文件函數
void Draw3DSObject();//3DS模型重繪函數
void Unitize3DSObject();//模型平移到原點,并縮放到立方體中。
LOAD3DS類編寫完成后即可按下面的步驟導人3DS模型:
(1)文檔類中添加成員變量用于存取導人的模型。
(2)添加OnOpenDocument的消息響應函數,采用顯示列表的方法加載模型。
(3)在視圖類中添加成員函數DrawWithOpenGL()重繪導入模型。
(4)在視圖類中添加響應OnPaint()函數,并在該函數下調用DrawWithOpenGL()函數顯示3DS模型。
碰撞檢測是交互式場景漫游需要解決的一個關鍵環節,針對三維漫游場景的情況,碰撞檢測主要解決的問題是隨著視點的移動,新的視點可能會穿越場景中設備對象或者進入物體內部的情況。
由于仿真場景中的設備大多是較為規則的模型,所以根據具體設備的形狀將設備盡可能簡化為簡單的三角形,同時將視點看作一個點。這樣碰撞檢測就轉化為一個點與三角形相交的問題,從而加快實時響應速度,取得較好的漫游效果[6]。高層貨架的漫游效果如圖1所示。
視點碰撞檢測的主要步驟:
(1)確定并記錄下當前視點位置m_vPos,并記錄下用戶輸入的新視點位置m_vNewPos;
(2)遍歷場景中的三角形,找到新舊視點之間的三角形平面;
(3)判斷過兩視點的直線與三角形平面交點是否在三角形的內部。若此點在其內部,則發生碰撞;反之,按以下步驟繼續;

圖1 漫游效果圖
(4)繼續判斷此點是否位于三角形邊上,若是,則碰撞發生;反之,不發生碰撞。
碰撞檢測完成后,若碰撞發生,則將新的視點還原為原來視點的位置;若無碰撞,則視點原位置更新為用戶輸入的新視點。
其判斷方法為:遍歷場景內的三角形平面,并判斷新視點到原來視點的射線是否與場景中的三角形平面相交,且交點位于兩點之間。具體算法如下:
確定兩視點變量:m_vPos和m_vNewPos,則此射線的方向向量為:m_v=m_vNewPos-m_vPos;
(1)遍歷場景沒所有三角形并確定所在平面的法向量:m_vNormal;
(2)求取上述的兩向量夾角,若小于90度則返回步驟(2),反之則繼續步驟(3);
(3)計算得出與三角面的交點坐標;
(4)判斷交點坐標是否在三角形的內部,若在內部,則碰撞發生,反之,無碰撞發生。
判斷一個點是否位于三角形的內部有許多方法,鑒于編程的方便,采用簡單易行的求交角的方法來進行判斷,如圖2所示。

圖2 視點在三角形內部
當角α、β、γ 相加之和為360度時,則說明交點位于三角形內部,則碰撞發生,除此之外的其他情況均為未發生碰撞。部分代碼段如下:
For(int i=0;i<3;i++)
{
//當前頂點到交點的向量
vA=Triangle[i]-vCutpoint;
//下一個頂點到交點的向量
vB=Triangle[(i+1)%3]-vCutpoint;
//得出交點vCutpoint與三角形三個頂點夾角之和,并判斷是否為360度。
Angle+=AngleBetween(vector vA,vector vB);
}
為了提高碰撞檢測的效率,加快實時反應,在碰撞檢測之前在場景中建立了AABB包圍盒,這樣可以將距視點比較遠的不可能發生碰撞的物體排除,即將參與檢測的物體僅限于視點附近。進一步的精確檢測時,只需考慮所劃范圍內的包圍盒對象即可,從而簡化程序的遍歷過程,提高程序運行過程。最終的碰撞檢測流程圖如圖3所示。

圖3 碰撞檢測流程圖
在自動化立體倉庫系統中,出入庫是物流系統的主要操作活動,本系統按照單入庫作業流程進行作業,即:堆垛機從入庫臺取貨并運行至目的地;堆垛機將貨物送至貨架的貨格中;堆垛機返回原地等待下次作業。
在MFC中添加數據庫連接類ADOcnn,結合windows系統中ado動態連接庫msado15.dll,實現數據庫與底層設備數據的連接。其中在入庫命令下達時,系統會通過數據庫查詢貨架存儲狀態,貨架的數據庫結構表見表1。

表1 貨位的數據庫結構表
一旦用戶輸入入庫指令,目標貨位fram[j][k][l]就確定,貨物的行進路線也隨之確定:一級傳送帶ID,二級傳送帶ID,堆垛機的水平和垂直運動量都將確定。貨物從貨物發生器start出發,經過一級傳送帶,尋找距離最近的未滿的入庫緩沖區Trans[i],然后在貨物到達緩沖區最前端,且巷道堆垛機lift[m]處于I/O臺待命狀態時,貨物移到堆垛機上,之后的貨物同堆垛機一起運動,堆垛機將貨物送到指定貨格fram[j][k][l]。如圖4所示。出庫的流程與入庫流程類似,其出庫調度算法,同樣可以后期開發定制,并隨時更換,也可以對幾種不同的算法進行比較驗證。

圖4 貨物入庫程序流程圖
為了生成平滑的動畫,本仿真系統采用了OpenGL雙緩存技術(DoubleBuffering),即前臺緩存和后臺緩存,后臺緩存主要是計算場景、生成動畫,前臺緩存顯示后臺緩存已畫好的畫面,從而增強三維仿真動畫顯示的連續性和逼真感。動作函數
void CMyPick1View::move (CLoadOBJ&a,CLoadOBJ&b,CLoadOBJ&c)實現出庫入庫等基本功能仿真動畫,該函數以三個設備對象為形參,其中對象b為運動的設備對象,對象a為對象b運動的起點,對象c為對象b運動的終點。
對于一個三維漫游場景來說,交互性是指用戶可以從不同的角度進行觀察和對模型的操作。
本平臺利用在OpenGL中的gluLookAt(g_eye[0],g_eye[1],g_eye[2],g_look[0],g_look[1],g_look[2],upx,upy,upz)函數實現視點的轉換,達到漫游效果,其中內部函數變量(g_eye[0],g_eye[1],g_eye[2])決定初始視點空間位置,(g_look[0],g_look
[1],g_look[2])表示目標點,(upx,upy,upz)表示視點運動的方向。該函數作用是可以改變用戶在虛擬世界中的觀察點,當視點的位置及視點的參考方向發生改變時,視景中的物體相對于觀察者的方位也發生了改變,同時系統定義了鍵盤上的‘↑’,‘↓’,‘←’,‘→’鍵來控制視點的前進后退左轉右轉,Page Up,Page Down分別控制視點上仰下俯,從而達到場景的漫游效果。
場景的平移是通過OpenGL的函數glTranslatef()來實現的。通過參考文獻[7]和文獻[8],利用鼠標選中模型,則可以在模型上確定一點,通過拖動鼠標移動此點,從而實現對模型的間接控制,平移或者旋轉。
對于模型的旋轉是通過建立旋轉軸實現的,將兩個鼠標矢量所構成平面的法向量作為旋轉軸,兩鼠標矢量的夾角作為旋轉角度。通過參考文獻[9],由旋轉軸和旋轉角度計算出四元旋轉向量,從而由旋轉向量構造旋轉矩陣,實現模型的旋轉。
在本仿真平臺下,搭建一個簡單的立體倉庫,并設置好各個設備的參數屬性:對象名稱、空間坐標、運動速度以及某些對象的特有屬性,比如傳送帶的功能分類:主傳送帶、入庫緩沖傳送帶、出庫緩沖傳送帶。貨架的基本元素:層數和列數,并按照以下的平面方案布局搭建,該虛擬立體倉庫具備了一般自動化立體倉庫的主要功能,同時可以改變視角,并在場景中漫游。其主要模型和平面示意圖如圖5所示。
其中:a-主傳送帶,b-入庫緩沖區,c-貨物,d-出/入庫貨臺,e-巷道堆垛機,f-高層貨架。

圖5 仿真場景平面示意圖
三維仿真效果圖如圖6所示。

圖6 立體倉庫三維仿真效果圖
選用可視化編程語言VC作為仿真系統開發平臺,實現了自動化立體倉庫出入庫作業流程的模擬仿真,用戶可以更換布局方案,改變背景和視角,實現虛擬漫游,對自動化立體倉庫實際運行情況進行演示,同時此三維仿真系統具有友善的人機交互界面和簡便的操作方法,并兼顧系統功能擴充時易于修改和擴展。現今我國自動化立體倉庫的系統仿真方面處于起步階段,本三維仿真平臺作為一個探索和嘗試,對今后的后續開發和拓展具有重要的實際意義。
[1]劉臣宇,郭峰,李衛靈.基于Creator的虛擬自動化立體倉庫的研究與實現[J].價值工程,2010,(29).
[2]柳賽男.基于Web的制造業倉庫管理物流平臺關鍵技術及其應用研究[D].杭州:浙江大學,2007.
[3]朱小蓉.基于Flexsim的倉儲作業系統仿真及優化[J].物流技術,2012,(2).
[4]張志剛,曹西京,劉昌祺,王棟生.自動化立體倉庫系統仿真的研究[J].計算機仿真,2005,(7).
[5]高海芳,王天雷,邱杰,康獻民,王大承.基于OpenGL的3DS模型的導入與控制[J].五邑大學學報(自然科學版),2010,(3).
[6]董晶晶,陳兵,王磊.虛擬場景漫游中基于視點的碰撞檢測研究及實現[J].海洋測繪,2011,(5).
[7]張正波,牟彥,黃華,劉波.OPENGL實現3ds文件中的模型自由旋轉[J].計算機工程與應用,2005,41(13):98-100.
[8]馬新武,趙國群,王廣春.用虛擬球實現交互式OpenGL 3D圖形的旋轉[J].計算機應用,2001,21(8):169-170.
[9]Terence JGrant,Jeff Molofee.ArcBall rotation control revisited[EB/OL].http://nehegame lev.net/tutorial/arcball_rotation/19003/.