自动化立体仓库三维仿真平台的研究与实现

2014-02-20 03:49:18宗晓萍朱玲玲齐兴敏
物流技术 2014年1期
关键词:立体仓库碰撞检测堆垛

宗晓萍,朱玲玲,齐兴敏

(河北大学 电子信息工程学院,河北 保定 071000)

1 引言

自动化立体仓库是一种适合大规模储存货物的高效立体仓库,由高层货架、货箱、巷道、堆垛起重机、出入库输送机系统、自动控制系统、计算机仓库管理系统及辅助设备组成,对集装单元货物实现了自动化存储和计算机管理[1]。随着现代工业生产的迅猛发展,产品的多样化和需求的个性化不断地对自动化仓库的规划和设计提出更高的要求,但是面对自动化立体仓库成本高,投资大的现实,对自动化立体仓库系统采用三维虚拟仿真技术可以提前测试实际建设中方案是否符合要求,并对各种方案建立相应的仿真模型,进行多次仿真,确定最适合的方案,避免因盲目建设而导致经济损失。

自动化立体仓库的系统仿真是通过系统建模,计算机编程模拟实际系统运行状态,并将计算模拟过程中的相关数据作为实际规划设计与运作管理的理论依据,同时统计和分析模拟结果,用以指导实际物流系统的规划设计与运作管理。对于图形化的物流仿真软件的研究,国外研究起点高,发展比较成熟,因此出现了很多专业化的物流仿真软件。其中比较常用的有3i公司设计开发SIMAnimation和AutoSimulation公司开发的AutoState(AutoMod),日本的RaLC(乐龙),美国的Flexsim等[2]。但是诸如以上仿真软件大多不提供源码,不利于进行二次开发,且价格昂贵。国内对物流业的仿真都是依靠先进的仿真软件,如文献[3]采用Flexsim仿真软件对某物流中心的仓储作业系统进行了建模和深入分析,并从补货策略设备配置及利用率等方面对模型进行了优化,提出了改进意见和建议。对于物流系统仿真方面,我国目前还处于起步发展阶段。

此三维仿真平台主要在VC++6.0环境下利用三维图形库OpenGL搭建立体仓库的三维虚拟仿真平台,并具体分析了碰撞检测算法,实现了自动化立体仓库存储货物实际流程的动画演示,以便提前获得仓库的运行情况,使自动化仓储在物流系统和企业生产系统中发挥更大的作用。

2 三维实体模型的建立

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模型。

3 碰撞检测

碰撞检测是交互式场景漫游需要解决的一个关键环节,针对三维漫游场景的情况,碰撞检测主要解决的问题是随着视点的移动,新的视点可能会穿越场景中设备对象或者进入物体内部的情况。

由于仿真场景中的设备大多是较为规则的模型,所以根据具体设备的形状将设备尽可能简化为简单的三角形,同时将视点看作一个点。这样碰撞检测就转化为一个点与三角形相交的问题,从而加快实时响应速度,取得较好的漫游效果[6]。高层货架的漫游效果如图1所示。

视点碰撞检测的主要步骤:

(1)确定并记录下当前视点位置m_vPos,并记录下用户输入的新视点位置m_vNewPos;

(2)遍历场景中的三角形,找到新旧视点之间的三角形平面;

(3)判断过两视点的直线与三角形平面交点是否在三角形的内部。若此点在其内部,则发生碰撞;反之,按以下步骤继续;

图1 漫游效果图

(4)继续判断此点是否位于三角形边上,若是,则碰撞发生;反之,不发生碰撞。

碰撞检测完成后,若碰撞发生,则将新的视点还原为原来视点的位置;若无碰撞,则视点原位置更新为用户输入的新视点。

3.1 判断视点移动与三角形面是否相交

其判断方法为:遍历场景内的三角形平面,并判断新视点到原来视点的射线是否与场景中的三角形平面相交,且交点位于两点之间。具体算法如下:

确定两视点变量:m_vPos和m_vNewPos,则此射线的方向向量为:m_v=m_vNewPos-m_vPos;

(1)遍历场景没所有三角形并确定所在平面的法向量:m_vNormal;

(2)求取上述的两向量夹角,若小于90度则返回步骤(2),反之则继续步骤(3);

(3)计算得出与三角面的交点坐标;

(4)判断交点坐标是否在三角形的内部,若在内部,则碰撞发生,反之,无碰撞发生。

3.2 判断交点是否位于三角形的内部

判断一个点是否位于三角形的内部有许多方法,鉴于编程的方便,采用简单易行的求交角的方法来进行判断,如图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 碰撞检测流程图

4 出入库动画模拟

在自动化立体仓库系统中,出入库是物流系统的主要操作活动,本系统按照单入库作业流程进行作业,即:堆垛机从入库台取货并运行至目的地;堆垛机将货物送至货架的货格中;堆垛机返回原地等待下次作业。

在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运动的终点。

5 交互式设计

对于一个三维漫游场景来说,交互性是指用户可以从不同的角度进行观察和对模型的操作。

5.1 视点转换

本平台利用在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分别控制视点上仰下俯,从而达到场景的漫游效果。

5.2 场景平移

场景的平移是通过OpenGL的函数glTranslatef()来实现的。通过参考文献[7]和文献[8],利用鼠标选中模型,则可以在模型上确定一点,通过拖动鼠标移动此点,从而实现对模型的间接控制,平移或者旋转。

对于模型的旋转是通过建立旋转轴实现的,将两个鼠标矢量所构成平面的法向量作为旋转轴,两鼠标矢量的夹角作为旋转角度。通过参考文献[9],由旋转轴和旋转角度计算出四元旋转向量,从而由旋转向量构造旋转矩阵,实现模型的旋转。

6 三维仿真实验

在本仿真平台下,搭建一个简单的立体仓库,并设置好各个设备的参数属性:对象名称、空间坐标、运动速度以及某些对象的特有属性,比如传送带的功能分类:主传送带、入库缓冲传送带、出库缓冲传送带。货架的基本元素:层数和列数,并按照以下的平面方案布局搭建,该虚拟立体仓库具备了一般自动化立体仓库的主要功能,同时可以改变视角,并在场景中漫游。其主要模型和平面示意图如图5所示。

其中:a-主传送带,b-入库缓冲区,c-货物,d-出/入库货台,e-巷道堆垛机,f-高层货架。

图5 仿真场景平面示意图

三维仿真效果图如图6所示。

图6 立体仓库三维仿真效果图

7 小结

选用可视化编程语言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/.

猜你喜欢
立体仓库碰撞检测堆垛
全新预测碰撞检测系统
搬易通推出MCC系列人上型三向堆垛车
基于Flexsim的自动化立体仓库仿真研究
基于BIM的铁路信号室外设备布置与碰撞检测方法
自动化立体仓库用堆垛机的几种换轨方式及应用案例
密集型自动化立体仓库解析
Unity3D中碰撞检测问题的研究
电子测试(2018年1期)2018-04-18 11:53:00
基于B7A接口的钢板立体仓库控制系统设计
BIM技术下的某办公楼项目管线碰撞检测
自动化立体仓库在现代制造企业中的应用与优势