基于虚拟现实的机器人仿真系统

  • 格式:pdf
  • 大小:219.82 KB
  • 文档页数:4

第7卷第2期 

2008年6月 宁夏工程技术 

Ningxia Engineering Technology V01.7 No.2 

Jun.2008 

文章编号:1671—7244(2008)02—0127—03 

基于虚拟现实的机器人仿真系统 

李 鉴 , 李 源 , 冒东奎 

(1.北方民族大学计算机学院宁夏银川 750021;2.重庆正大软件集团,四川重庆400074) 

摘要:为了对机器人仿真系统主控代码的接口作设计上的改进和扩展,在论述用C++程序设计实现在虚拟世 界中行走、跳跃、跑步、旋转、翻跟斗机器人系统原型的基础之上,给出了改进部分的设计思路和关键代码,并保 

留了一些扩展接口,为通过虚拟现实技术开发机器人仿真系统的用户提供了多种视角和自由拓展的空间. 关键词:虚拟现实;机器人仿真;人工智能 

中图分类号:TP273 文献标志码:A 

虚拟现实(Virtual Reality,简称VR)是一种基 

于可计算信息的沉浸式交互环境.它利用计算机技 

术生成逼真的视、听、触觉一体化的虚拟环境,使用 

户借助必要的设备即可与虚拟环境中的对象进行交 

互作用,从而产生“沉浸”于等同真实环境的感受和 

体验[1].当需要构造当前不存在的环境(合理虚拟现 

实)、人类不可能达到的环境(夸张虚拟现实)或纯粹 

虚构的环境(虚幻虚拟现实)以取代需要耗资巨大的 

真实环境时,就可以利用虚拟现实技术圆. 

目前,国内通过虚拟现实设计机器人仿真的工 

作大都集中在扩展计算机的接口能力方面嘲.本文主 

要对机器人仿真系统主控代码的接口作设计上的改 

进和扩展,并保留了一些扩展接口,为那些想基于虚 

拟现实开发机器人仿真系统的用户提供了多种视角 

和自由拓展的空间. 

1系统设计 

1.1系统概述 

该系统模拟一个机器人在3D的环境中,像人 

图1分散的机器人部件 Fig.1 robot’S scattered components 一样行走、转弯、跑步、翻跟斗.在三维空间中,可以 

从不同的角度观看,并改变观看的角度和位置,是一 

个让人感觉非常逼真的系统[41. 

在开发过程中,机器人系统使用了Direct X 

9.0 SDK开发包,其中,使用了微软公司SDK包中 

提供的快速开发C++公共框架,以提高开发速度. 

这个公共框架提供了一个经过严格测试的开发基 

础,大大减少了开发者花在基本问题上的调试时间. 

该系统引用了这个框架,并修改了一些代码. 

机器人的地板是由3D的一个平面加上一张贴 

图组成,结构非常简单,大小中等,就如同2D世界 

里面画的一条线一样,目的是区分开机器人和背景 

的关系,增加机器人系统虚拟世界的真实感.在该系 

统中,机器人的制作相对比较复杂,是用3D Studio 

Max精心制作的,它的每一个部位都是一个3D对 

象,如图1所示.只是在使用的时候,把它连在一 

起,将一个3D模型的结构体形象地用网格来表 

示,网格像蜂窝一样,再通过贴图,构造出图2所示 

的机器人. 

(a)侧面图 (b)跳跃动作 

图2机器人侧面和跳跃动作 

Fig.2 robot’S side and jumping action 

收稿日期:2007—09—05 作者简介:李

鉴(1983一),男,硕士研究生,主要从事计算机应用、信息系统工程研究 维普资讯 http://www.cqvip.com 128 宁夏工程技术 第7卷 

1.2系统整体设计[41 o); 在C++程序中最核心的部分就是如何处理好消 else 息循环.当程序运行,初始化后,用户可以按照需要 踮 ge(&Ⅱ玛g’NuLL,ou,ou) =o); 

进行键盘鼠标输入,控制命令到达消息循环处理解 A。。。l兰NuL lIm hWnd::NULLII 

析后,有3个方向:如果是退出命令则退出事件发0==TranslateAccelerator(m_hWnd,hAccel,&mss)) 生,程序释放系统资源后结束;如果命令是一组控制TranslateMess ge(&msg); 机器人运动的指令,那么程序进入运动事件处理,在D isp批h 船明 。【&m ;JJ 

这里处理移动、跳跃、空翻等功能计算,最后调用3D if(m bD。 i。。Lo t1 f 

场景将计算结果显示出来;而消息循环会受一个时 ::WaitForSingleObject(NULL,lOO);l 

间变量控制,自发地产生一个控制命令,这个命令直 if(m_bActive) { 苎 堡 妻 在警 ! 是 墨 、刷isf (F耐AMIL E D (Re(rnnde rw3D Edn,vwirMon me∞nt0s)E),。,o); 

新等基本操作.该系统设计流程图如图3所示. 。1 。if f!O。n d fn 一 一 

束 l消息循环l l开始I— 生 I用户 

退出l l 3D场景 

图3系统设计流程图 

Fig.3 flow diagram of system design 

2系统实现 

2.1消息控制四 

消息控制是该系统设计的核心,与面向过程的 

程序相比,面向对象的C++程序的主要特点是在程 

序中加入了消息控制循环,实现了对象间的通信. 

在面向对象的C++程序中,程序人口处一定会有一 

段消息循环代码,它处理消息的接收与触发.消息 

循环的控制流程图如图4所示. 

图4消息循环的控制流程图 

Fig.4 controlled flow diagram of message cycle 

2.2消息循环的关键代码 

while(WM—QUIT!=msg.message){ if(m_bAetive) bGotMsg=(PeekMessage(&msg,NULL,0U,0U,PM—REMOVE)!= 2.3主控设计 

主控设计采用面向对象技术和插件式管理,目 

的是通过提供代码接口搭建起一个虚拟世界编程框 

架【6】.主控代码的运行结果,只是一个空的虚拟环境. 

此后只需要利用这些代码接口添加需要的实体.这 

些实体大部分属于CD3DMesh类.CD3DMesh是其 

中一个能够定义实体的类,只有像CD3DMesh这样 

类的实例才能被主控代码接收. 

2.3.1 主控代码主控代码具有显示、计算、刷新等 

功能,而实体需要通过代码接口,告诉主控代码需要 

怎样的运动以及运动的参数. 

2.3.2 CD3DMesh定义3D对象的类,大部分的 

3D对象特点都封装在该类里.CD3DMesh类的Create 

方法可以为3D对象添加由3Ds Max制作的导出文 

件.x文件数据添加到3D对象中,让3D对象有意 

义,这样CD3DMesh类的对象的m_pLocalMesh成员 

则包含了该3D对象所用网格的信息.m pTextures 

成员包含了该3D对象所用材质信息。 

2.3-3 class MainWindow程序的主控代码是在类 

MainWindow里面完成的.public cD3DApplication 

来自CD3DApplication.CD3DApplication是Direct 

X SDK包公共框架的一个类,该类需要实现的接口 

如下. 

(1)接口HRESULT OneTimeSceneInit0里使用 

了预编译指令,这是为了与64位机兼容。实际上调 

用的是SetClassLong0,这个Windows API函数修改 

鼠标在工作区的图标,只是为了反映位置的不同. 

(2)接口HRESULT InitDeviceObiectsO安装驱 

动信息和读人x文件,把所需要的网格装载进来.5 

个不同机器人网格按顺序装入同一个缓冲区里.将 

第1个机器人的网格存人索引缓冲区中,这样,按照 

第1个机器人的网格类名,一一对应起来.在该接 维普资讯 http://www.cqvip.com 第2期 李鉴等:基于虚拟现实的机器人仿真系统 129 

口中,还完成了3个数据流定义.机器人的运动大 

致从原始状态开始,到发生状态,再回到原始状态. 

3个数据流输人也就是这3种状态的网格.在这里 

读人了Android.vsh文件.文件后缀是按照Direct 

X SDK开发包中的例子程序取用的.Android.vsh 

的内容是汇编代码,包含了从一个网格变换到另一 

个网格的计算方法.该系统引用了一个作线性变换 

的算法.汇编格式是严格按照Direct X SDK开发包 

提供的格式要求写的,并且有固定的格式和固定的 

API函数读取使用它. 

(3)接ISl HRESULT Rest0reDevice0bjects O对 

灯光、视点、视线进行初始化,更重要的是对显示区 

域进行初始化. 

(4)接ISl HRESULT FrameMove0是读取共享变 

量,并把共享变量反映到物体上去的函数.在这里, 

物体的位置是共享变量,操作的标志是共享变量,因 

为从这个函数的处理结构上看,程序进行完该流程 

后会进人睡眠阶段,于是在这个函数里面可以添加 

一些在消息处理函数里面不能办到的事情,比如对 

键盘的检测.假设由键盘事件来处理一些键钮被一 

直按下时触发的事件,那么调用后必须马上更改场 

景,并且马上返回调用,否则程序将陷人一个消息未 

处理完,不能做其他消息处理的尴尬状态,然而,更 

改场景必须在程序空闲后,由专门的事件来处理,那 

么当键盘事件在占有了系统资源的情况下等待控制 

场景更新的事件发生时,工作不能顺利进行.这是 

一个标准的死锁.因此,只能在空闲函数或者 

FrameMove0/ ̄数中完成这些工作. 

在该系统中,对每一个功能键利用API函数 

GetKeyState0进行检测,如果发现功能键被按下,则 

立刻根据上一次移动和当前的时间计算应该移动的 

偏移量,并对物体的参数进行修改.这些移动涉及 

到对与物体对应的标志矩阵的修改,这些都通过调 

用简单的Direct 3D API函数就能完成.机器人的 

移动是有技巧性的,机器人在3个流中切换,这需要 

定义切换时间安排. 

(5)接口HRESULT Render0实现场景的渲染, 

按照参数把场景显示出来.对这个函数值得一提的 

是3D图像采用的现实方法.网格是由顶点构成,存 

储在缓冲区中,而Direct X有好几种存储格式,该 

系统设计的机器人和地面是2种不同的存储顶点格 

式,所以需要切换. 

(6)接ISl HRESULT InvalidateDevice0bjects0可 以让窗ISl变换,使场景[x5】中的对象信息无效,等待 

重新装载. 

(7)接口HRESULT DeleteDevice0bjectsO删除 

场景中的3D对象,准备结束程序. 

(8)接ISl HRESULT FinalCleanup()最后完成清 

除对象工作. 

(9)接ISl LRESULT MsgProc0是响应系统所有 

消息的函数,键盘消息可以在这里进行处理.比起 

MFC框架来说它的功能非常弱,因为这里不需要处 

理太多的消息.调用完该函数后,必须将消息转交 

给基类处理,这样才能完善消息机制.整个程序流程 

从宏观上实现了消息驱动,这是面向对象程序设计 

的特点之一. 

在该系统的源码中还设计了许多接口,用来实 

现其他功能.例如,可以拓展机器人完成更多更复 

杂的动作,并增强其适应性. 

3结语 

目前,国内虚拟现实技术所取得的成就绝大部