宗曉萍,朱玲玲,齊興敏
(河北大學 電子信息工程學院,河北 保定 071000)
自動化立體倉庫是一種適合大規(guī)模儲存貨物的高效立體倉庫,由高層貨架、貨箱、巷道、堆垛起重機、出入庫輸送機系統(tǒng)、自動控制系統(tǒng)、計算機倉庫管理系統(tǒng)及輔助設(shè)備組成,對集裝單元貨物實現(xiàn)了自動化存儲和計算機管理[1]。隨著現(xiàn)代工業(yè)生產(chǎn)的迅猛發(fā)展,產(chǎn)品的多樣化和需求的個性化不斷地對自動化倉庫的規(guī)劃和設(shè)計提出更高的要求,但是面對自動化立體倉庫成本高,投資大的現(xiàn)實,對自動化立體倉庫系統(tǒng)采用三維虛擬仿真技術(shù)可以提前測試實際建設(shè)中方案是否符合要求,并對各種方案建立相應(yīng)的仿真模型,進行多次仿真,確定最適合的方案,避免因盲目建設(shè)而導致經(jīng)濟損失。
自動化立體倉庫的系統(tǒng)仿真是通過系統(tǒng)建模,計算機編程模擬實際系統(tǒng)運行狀態(tài),并將計算模擬過程中的相關(guān)數(shù)據(jù)作為實際規(guī)劃設(shè)計與運作管理的理論依據(jù),同時統(tǒng)計和分析模擬結(jié)果,用以指導實際物流系統(tǒng)的規(guī)劃設(shè)計與運作管理。對于圖形化的物流仿真軟件的研究,國外研究起點高,發(fā)展比較成熟,因此出現(xiàn)了很多專業(yè)化的物流仿真軟件。其中比較常用的有3i公司設(shè)計開發(fā)SIMAnimation和AutoSimulation公司開發(fā)的AutoState(AutoMod),日本的RaLC(樂龍),美國的Flexsim等[2]。但是諸如以上仿真軟件大多不提供源碼,不利于進行二次開發(fā),且價格昂貴。國內(nèi)對物流業(yè)的仿真都是依靠先進的仿真軟件,如文獻[3]采用Flexsim仿真軟件對某物流中心的倉儲作業(yè)系統(tǒng)進行了建模和深入分析,并從補貨策略設(shè)備配置及利用率等方面對模型進行了優(yōu)化,提出了改進意見和建議。對于物流系統(tǒng)仿真方面,我國目前還處于起步發(fā)展階段。
此三維仿真平臺主要在VC++6.0環(huán)境下利用三維圖形庫OpenGL搭建立體倉庫的三維虛擬仿真平臺,并具體分析了碰撞檢測算法,實現(xiàn)了自動化立體倉庫存儲貨物實際流程的動畫演示,以便提前獲得倉庫的運行情況,使自動化倉儲在物流系統(tǒng)和企業(yè)生產(chǎn)系統(tǒng)中發(fā)揮更大的作用。
OpenGL只能通過其基本圖元來繪制圖形,不具備實體造型能力。3DMAX擁有強大的造型功能,可以將由3DMAX生成的圖形文件通過轉(zhuǎn)換軟件將模型轉(zhuǎn)換為OpenGL顯示形式,再用OpenGL進行編程控制[4]。此仿真平臺導入*.3DS格式,再對其進行編程控制,由此可避免在OpenGL中用點、線和多邊形來建立三維立體模型的繁重勞動。3DS模型文件由許多Chunk組成,其中編輯Chunk、顏色Chunk、材質(zhì)Chunk、紋理Chunk起著關(guān)鍵的作用。因此,讀入以上的關(guān)鍵塊就可以實現(xiàn)模型的外部導入[5]。
在MFC框架中定義一個名為LOAD3DS的類,用于3DS文件的讀入與重繪,該類中主要定義的幾個結(jié)構(gòu)體及主要函數(shù)如下:
(1)主要結(jié)構(gòu)體:顏色結(jié)構(gòu)體,頂點結(jié)構(gòu),對象結(jié)構(gòu)體。
(2)主要函數(shù):
3DSObject·Load3DSObject();//讀取3DS文件函數(shù)
void Draw3DSObject();//3DS模型重繪函數(shù)
void Unitize3DSObject();//模型平移到原點,并縮放到立方體中。
LOAD3DS類編寫完成后即可按下面的步驟導人3DS模型:
(1)文檔類中添加成員變量用于存取導人的模型。
(2)添加OnOpenDocument的消息響應(yīng)函數(shù),采用顯示列表的方法加載模型。
(3)在視圖類中添加成員函數(shù)DrawWithOpenGL()重繪導入模型。
(4)在視圖類中添加響應(yīng)OnPaint()函數(shù),并在該函數(shù)下調(diào)用DrawWithOpenGL()函數(shù)顯示3DS模型。
碰撞檢測是交互式場景漫游需要解決的一個關(guān)鍵環(huán)節(jié),針對三維漫游場景的情況,碰撞檢測主要解決的問題是隨著視點的移動,新的視點可能會穿越場景中設(shè)備對象或者進入物體內(nèi)部的情況。
由于仿真場景中的設(shè)備大多是較為規(guī)則的模型,所以根據(jù)具體設(shè)備的形狀將設(shè)備盡可能簡化為簡單的三角形,同時將視點看作一個點。這樣碰撞檢測就轉(zhuǎn)化為一個點與三角形相交的問題,從而加快實時響應(yīng)速度,取得較好的漫游效果[6]。高層貨架的漫游效果如圖1所示。
視點碰撞檢測的主要步驟:
(1)確定并記錄下當前視點位置m_vPos,并記錄下用戶輸入的新視點位置m_vNewPos;
(2)遍歷場景中的三角形,找到新舊視點之間的三角形平面;
(3)判斷過兩視點的直線與三角形平面交點是否在三角形的內(nèi)部。若此點在其內(nèi)部,則發(fā)生碰撞;反之,按以下步驟繼續(xù);
圖1 漫游效果圖
(4)繼續(xù)判斷此點是否位于三角形邊上,若是,則碰撞發(fā)生;反之,不發(fā)生碰撞。
碰撞檢測完成后,若碰撞發(fā)生,則將新的視點還原為原來視點的位置;若無碰撞,則視點原位置更新為用戶輸入的新視點。
其判斷方法為:遍歷場景內(nèi)的三角形平面,并判斷新視點到原來視點的射線是否與場景中的三角形平面相交,且交點位于兩點之間。具體算法如下:
確定兩視點變量:m_vPos和m_vNewPos,則此射線的方向向量為:m_v=m_vNewPos-m_vPos;
(1)遍歷場景沒所有三角形并確定所在平面的法向量:m_vNormal;
(2)求取上述的兩向量夾角,若小于90度則返回步驟(2),反之則繼續(xù)步驟(3);
(3)計算得出與三角面的交點坐標;
(4)判斷交點坐標是否在三角形的內(nèi)部,若在內(nèi)部,則碰撞發(fā)生,反之,無碰撞發(fā)生。
判斷一個點是否位于三角形的內(nèi)部有許多方法,鑒于編程的方便,采用簡單易行的求交角的方法來進行判斷,如圖2所示。
圖2 視點在三角形內(nèi)部
當角α、β、γ 相加之和為360度時,則說明交點位于三角形內(nèi)部,則碰撞發(fā)生,除此之外的其他情況均為未發(fā)生碰撞。部分代碼段如下:
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);
}
為了提高碰撞檢測的效率,加快實時反應(yīng),在碰撞檢測之前在場景中建立了AABB包圍盒,這樣可以將距視點比較遠的不可能發(fā)生碰撞的物體排除,即將參與檢測的物體僅限于視點附近。進一步的精確檢測時,只需考慮所劃范圍內(nèi)的包圍盒對象即可,從而簡化程序的遍歷過程,提高程序運行過程。最終的碰撞檢測流程圖如圖3所示。
圖3 碰撞檢測流程圖
在自動化立體倉庫系統(tǒng)中,出入庫是物流系統(tǒng)的主要操作活動,本系統(tǒng)按照單入庫作業(yè)流程進行作業(yè),即:堆垛機從入庫臺取貨并運行至目的地;堆垛機將貨物送至貨架的貨格中;堆垛機返回原地等待下次作業(yè)。
在MFC中添加數(shù)據(jù)庫連接類ADOcnn,結(jié)合windows系統(tǒng)中ado動態(tài)連接庫msado15.dll,實現(xiàn)數(shù)據(jù)庫與底層設(shè)備數(shù)據(jù)的連接。其中在入庫命令下達時,系統(tǒng)會通過數(shù)據(jù)庫查詢貨架存儲狀態(tài),貨架的數(shù)據(jù)庫結(jié)構(gòu)表見表1。
表1 貨位的數(shù)據(jù)庫結(jié)構(gòu)表
一旦用戶輸入入庫指令,目標貨位fram[j][k][l]就確定,貨物的行進路線也隨之確定:一級傳送帶ID,二級傳送帶ID,堆垛機的水平和垂直運動量都將確定。貨物從貨物發(fā)生器start出發(fā),經(jīng)過一級傳送帶,尋找距離最近的未滿的入庫緩沖區(qū)Trans[i],然后在貨物到達緩沖區(qū)最前端,且巷道堆垛機lift[m]處于I/O臺待命狀態(tài)時,貨物移到堆垛機上,之后的貨物同堆垛機一起運動,堆垛機將貨物送到指定貨格fram[j][k][l]。如圖4所示。出庫的流程與入庫流程類似,其出庫調(diào)度算法,同樣可以后期開發(fā)定制,并隨時更換,也可以對幾種不同的算法進行比較驗證。
圖4 貨物入庫程序流程圖
為了生成平滑的動畫,本仿真系統(tǒng)采用了OpenGL雙緩存技術(shù)(DoubleBuffering),即前臺緩存和后臺緩存,后臺緩存主要是計算場景、生成動畫,前臺緩存顯示后臺緩存已畫好的畫面,從而增強三維仿真動畫顯示的連續(xù)性和逼真感。動作函數(shù)
void CMyPick1View::move (CLoadOBJ&a,CLoadOBJ&b,CLoadOBJ&c)實現(xiàn)出庫入庫等基本功能仿真動畫,該函數(shù)以三個設(shè)備對象為形參,其中對象b為運動的設(shè)備對象,對象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)函數(shù)實現(xiàn)視點的轉(zhuǎn)換,達到漫游效果,其中內(nèi)部函數(shù)變量(g_eye[0],g_eye[1],g_eye[2])決定初始視點空間位置,(g_look[0],g_look
[1],g_look[2])表示目標點,(upx,upy,upz)表示視點運動的方向。該函數(shù)作用是可以改變用戶在虛擬世界中的觀察點,當視點的位置及視點的參考方向發(fā)生改變時,視景中的物體相對于觀察者的方位也發(fā)生了改變,同時系統(tǒng)定義了鍵盤上的‘↑’,‘↓’,‘←’,‘→’鍵來控制視點的前進后退左轉(zhuǎn)右轉(zhuǎn),Page Up,Page Down分別控制視點上仰下俯,從而達到場景的漫游效果。
場景的平移是通過OpenGL的函數(shù)glTranslatef()來實現(xiàn)的。通過參考文獻[7]和文獻[8],利用鼠標選中模型,則可以在模型上確定一點,通過拖動鼠標移動此點,從而實現(xiàn)對模型的間接控制,平移或者旋轉(zhuǎn)。
對于模型的旋轉(zhuǎn)是通過建立旋轉(zhuǎn)軸實現(xiàn)的,將兩個鼠標矢量所構(gòu)成平面的法向量作為旋轉(zhuǎn)軸,兩鼠標矢量的夾角作為旋轉(zhuǎn)角度。通過參考文獻[9],由旋轉(zhuǎn)軸和旋轉(zhuǎn)角度計算出四元旋轉(zhuǎn)向量,從而由旋轉(zhuǎn)向量構(gòu)造旋轉(zhuǎn)矩陣,實現(xiàn)模型的旋轉(zhuǎn)。
在本仿真平臺下,搭建一個簡單的立體倉庫,并設(shè)置好各個設(shè)備的參數(shù)屬性:對象名稱、空間坐標、運動速度以及某些對象的特有屬性,比如傳送帶的功能分類:主傳送帶、入庫緩沖傳送帶、出庫緩沖傳送帶。貨架的基本元素:層數(shù)和列數(shù),并按照以下的平面方案布局搭建,該虛擬立體倉庫具備了一般自動化立體倉庫的主要功能,同時可以改變視角,并在場景中漫游。其主要模型和平面示意圖如圖5所示。
其中:a-主傳送帶,b-入庫緩沖區(qū),c-貨物,d-出/入庫貨臺,e-巷道堆垛機,f-高層貨架。
圖5 仿真場景平面示意圖
三維仿真效果圖如圖6所示。
圖6 立體倉庫三維仿真效果圖
選用可視化編程語言VC作為仿真系統(tǒng)開發(fā)平臺,實現(xiàn)了自動化立體倉庫出入庫作業(yè)流程的模擬仿真,用戶可以更換布局方案,改變背景和視角,實現(xiàn)虛擬漫游,對自動化立體倉庫實際運行情況進行演示,同時此三維仿真系統(tǒng)具有友善的人機交互界面和簡便的操作方法,并兼顧系統(tǒng)功能擴充時易于修改和擴展?,F(xiàn)今我國自動化立體倉庫的系統(tǒng)仿真方面處于起步階段,本三維仿真平臺作為一個探索和嘗試,對今后的后續(xù)開發(fā)和拓展具有重要的實際意義。
[1]劉臣宇,郭峰,李衛(wèi)靈.基于Creator的虛擬自動化立體倉庫的研究與實現(xiàn)[J].價值工程,2010,(29).
[2]柳賽男.基于Web的制造業(yè)倉庫管理物流平臺關(guān)鍵技術(shù)及其應(yīng)用研究[D].杭州:浙江大學,2007.
[3]朱小蓉.基于Flexsim的倉儲作業(yè)系統(tǒng)仿真及優(yōu)化[J].物流技術(shù),2012,(2).
[4]張志剛,曹西京,劉昌祺,王棟生.自動化立體倉庫系統(tǒng)仿真的研究[J].計算機仿真,2005,(7).
[5]高海芳,王天雷,邱杰,康獻民,王大承.基于OpenGL的3DS模型的導入與控制[J].五邑大學學報(自然科學版),2010,(3).
[6]董晶晶,陳兵,王磊.虛擬場景漫游中基于視點的碰撞檢測研究及實現(xiàn)[J].海洋測繪,2011,(5).
[7]張正波,牟彥,黃華,劉波.OPENGL實現(xiàn)3ds文件中的模型自由旋轉(zhuǎn)[J].計算機工程與應(yīng)用,2005,41(13):98-100.
[8]馬新武,趙國群,王廣春.用虛擬球?qū)崿F(xiàn)交互式OpenGL 3D圖形的旋轉(zhuǎn)[J].計算機應(yīng)用,2001,21(8):169-170.
[9]Terence JGrant,Jeff Molofee.ArcBall rotation control revisited[EB/OL].http://nehegame lev.net/tutorial/arcball_rotation/19003/.