头盔数据手套人机交互实验报告Word下载.docx
《头盔数据手套人机交互实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《头盔数据手套人机交互实验报告Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
6.6自由度(DOF)运动跟踪传感器:
Flock六自由度电磁位置跟踪器一套。
四、实验所用硬件及软件
4.1实验硬件
系统的基本结构如图1所示:
图1系统基本结构图
如系统基本结构可知,实验中使用的硬件主要包括:
三台通用PC机、网络/通信设备、监视器、头盔式显示器、数据手套一只和6自由度(DOF)运动跟踪传感器六大部分。
PC1:
中心控制计算机(服务器)
PC2:
左眼成像计算机(客户端1)
PC3:
右眼成像计算机(客户端2)
三台计算机组成一个局域网,IP地址分别为192.168.0.1~3。
监视器:
两台通用PC机显示器。
左右两台监视器的图像分别对应头盔左右两个通道。
通过监视器可以在不带头盔的情况下,从外部监视图像的生成是否正确。
头盔式显示器(HeadMountDisplay,简称HMD):
VirtualResearchV6,LCD双通道头盔显示器一个,全彩色,分辨率为640
480。
数据手套(DataGlove):
VirtualTechnologies公司的CyberGlove手套一只,右手,18个传感器,不带触觉、力反馈和手势识别,该手套用来测量右手18个关节的角度。
6自由度(DOF)运动跟踪传感器:
AscensionTechnology公司的FlockofBirds六自由度电磁位置跟踪器一套,配有二个接收器,采用主从结构,其中装有发射器的一方为主,另一方为从。
用一根RS232接口电缆从主接收器连接到中心控制计算机。
各部分实物图如图2所示:
图2系统硬件实物图
4.2实验软件
操作系统:
MicrosoftWindows2000Professional
开发平台:
1.MultiGenCreator用于建模(三维图像制作),OpenFlight数据格式是一种分层结构的景观描述数据库,生成的文件为*.flt。
2.CG2VTree/OpenGL,用于文件类型转换,模型处理等。
3.MicrosoftVisualC++用于运行所建模型,实现人机交互操作。
4.底层开发工具:
VirtualHandSuit。
5.自研VRLabHome、VRLabPiano、VRLabFit动态链接库。
其中本次实验使用的主要开发工具为MultigenCreator三维建模软件系统,应用该软件设计制作房屋的三维模型,生成.flt文件,并转化为.vt文件,最终在Vtree程序中导入测试。
Creator提供了非常强大的建模工具。
通过平面图形、几何体等工具箱中的多边形绘制、圆的绘制、墙体、平移旋转等工具,制作出虚拟场景的基本几何模型。
而且,考虑到整个系统的实时显示性能,保证虚拟现实系统的交互性,在保证模型基本框架的基础上,尽量减少多边形数量,优化模型结构。
如图3所示,可以使用Creator的工具条、建模工具箱、菜单命令,在数据库窗口内完成创建模型、调整视图、编辑模型等多种操作。
工具窗口的图表列于主窗口的左侧,通过点击可以打开工具窗口,并可以利用鼠标任意拖动到屏幕上的任何位置。
VTree的功能为:
1、模型建立后,利用实时三维视景系统软件(VTree)使模型在已建立的场景中动起来,即在VisualC++6.0的界面上,使用VTree的语句实现;
2、在Creator里面建立的虚拟模型,其输出格式为.flt,而在实时仿真软件VTree里面以及之后VisualC++中编程实现系统功能时候,所要用到的文件格式为.vt,所以需要通过VTree工具将所建立的模型文件.flt转换为.vt。
图3MultiGenCreator软件界面
五、实验目的及原理
5.1实验目的
1.通过在实验平台上的硬件设备和软件环境,学习头盔式显示器和数据手套的基本功能和基本工作原理。
2.通过在实验平台上的硬件设备和软件环境,学习头盔式显示器和数据手套的基本功能和基本工作原理。
3.学习建模方法和建模步骤,并利用头盔显示器和数据手套及相关的其它硬件设备建立一个小型的虚拟现实环境。
5.2实验原理
虚拟现实(VR)是一种可以创建和体验虚拟世界的计算机系统。
虚拟环境是由计算机生成的,通过看、听、触觉等作用于用户,使之产生身临其境感觉的交互式视景仿真。
虚拟现实(VR)具有三个最突出的特征,即三“I”特征:
交互性、沉浸感、想象性。
本实验是虚拟现实技术的一个应用实例,系统的原理图如图4所示:
图4系统原理图
其中:
1.FLOCK:
通过RS232串口电缆将数据输入到中心控制计算机(PC1)中进行处理;
2.HUB集线器:
网络连接设备,将三台计算机组成局域网,一发多收,主计算机发,左右眼计算机收,通过局域网将手的运动和姿态信息、位置信息以及两眼点的位置信息、视线方向信息发送给成像计算机PC2、PC3;
3.分频器:
将PC机的视频输出分给两个设备:
显示器和头盔;
4.控制盒:
将左眼计算机与右眼计算机的输出合成给头盔,将两幅略有差别的图像在头盔显示器中叠加后,便会产生立体的显示效果;
5.监视器:
即计算机的显示器。
原计算机输出直接给显示器,现在计算机输出给了分频器,由分频器再分别给显示器和控制盒;
6.T发送机:
发送电磁场信号;
7.R接收机:
头盔和手套上带有传感器,感受头盔所在位置(图中虚线表示),接收机接收到的位置信号传给FLOCK,再传给主计算机,由主计算机进行计算;
8.FBB(FastBirdBus),Flock-of-Bird(简称Flock):
电磁运动跟踪系统之间连接线,是一种串口数据传送;
9.头盔:
位于头盔显示器顶部和数据手套腕部的运动跟踪传感器测量头部和手部的位置与姿态;
10.手套:
数据手套测量手部各关节的姿态。
系统由3台通用计算机(PC1,PC2,PC3)和相应的VR设备组成。
计算机通过基于TCP/IP协议的100MHUB相连。
PC1(服务器)为中心控制计算机,主要完成数据手套和6自由度运动跟踪传感器信号的采集、计算,网络数据的管理,头盔显示器的双眼同步等任务。
两台成像计算机PC2、PC3分别完成左、右眼三维图像的实时生成任务,并将生成的视频信号输出到头盔显示器。
头盔显示器顶部和数据手套腕部的运动跟踪传感器测量头部和手部的位置与姿态,数据手套测量手部各关节的姿态;
数据手套连接传感器和头盔显示器分别连接接收器,都通过RS232电缆将数据输入到中心控制计算机中进行处理。
然后,通过局域网将头部与手的2个传感器的位置及角度信息、手掌及各关节的角度信息发送给两台成像计算机。
2台成像计算机分别根据这些信息生成左右眼的显示画面以及虚拟手的图像,传送给双通道头盔显示器并显示出来。
六、实验具体步骤
6.1头盔、数据手套人机交互系统平台搭建
1、将传感器1固定于数据手套的腕部(测量手的位置姿态信息),与从接收器相连。
将传感器2固定于头盔显示器的顶部(测量头部的位置姿态信息),与主接收器相连。
将发射器置于实验者前方1米距离内,其电缆线方向背离实验者,发射器信号的有效范围约为以发射器中心为球心,半径为0.91米的球体空间。
主从接收器通过FBB线连接,主接收器通过RS232串口线与计算机PC1串口COM1连接。
2、连接数据手套线路,将其RS232串口线与计算机PC1串口COM2连接(传送手套各关节角度信息)。
3、连接头盔线路,通过两个分频器分别将左眼显示器与计算机PC2显示器对应,右眼与计算机PC3显示器对应。
4、通过Windows2000网上邻居属性或ipconfig命令查看各台计算机IP设置,再通过网上邻居或ping命令检验三台计算机是否正常连接。
方法如下:
开始->
程序->
附件->
命令提示符,这时屏幕显示为:
5、开通各设备电源,在计算机PC1运行VRServer.exe程序,在PC2和PC3各自运行VRClient.exe程序,若一切正常,则可看到虚拟现实实验的完整实现,戴上头盔和数据手套,体验虚拟现实的震撼效果。
若不正常,检验以上各步骤,直到正确。
6.2房屋模型建立
6.2.1定制数据库参数
(1)新建一个名为Farm.flt的文件,拖动窗口分割栏将窗口分为透视视图和模型结构视图两部分。
(2)设置默认数据单位为英尺(feet),打开视图面板,根据需要设置栅格显示状态。
(3)在模型结构视图中,将g2节点设为当前父节点,重命名为House,如图5所示。
图5定制数据库参数
6.2.2建立地基
(1)选择体模式为当前建模模式。
(2)打开面工具箱选择矩形工具,以(-15,-13)和(+16,+10)作为两个参数点建造地基的地面,如图6所示:
图6使用矩形工具建造地基的地面
(3)打开体工具箱选择柱体工具,将底面沿Z轴方向提升1.3单位长,如图7所示:
图7使用柱体工具提升底面
6.2.3检查模型结构视图中的数据组织结构
(1)在模型结构视图中,此时House节点下有一个体节点,将其改名为Foundation。
(2)将House节点设为当前父节点,打开创建工具箱,选择创建组节点工具,在House节点下新建一个组节点,命名为Walls,如图8所示:
图8创建新的主节点
6.2.4建造房屋的墙壁
(1)重新定位跟踪面
将Walls设为当前父节点,使用视图面板中的以面定位跟踪面工具(FAC),将跟踪面定位到地基的表面上,如图9所示,再使用以点定位跟踪面工具(VTX),把跟踪面栅格中心点调整到地基表面的左下角,如图10所示。
图9使用以面定位跟踪面工具定位跟踪面
图10使用以点定位跟踪面工具调整跟踪面栅格中心位置
(2)绘制墙壁的底面
使用多边形工具绘制墙壁的底面,各点坐标为(0,4),(14,4),(14,9),(31,9),(31,23),(0,23)。
(3)提升墙体
选中刚刚绘制的底面,使用主体工具提升12各单位长,如图11所示。
图11提升墙体
6.2.5对屋顶建模
(1)创建山墙
在Face模式下,选中墙的侧面,使用点工具箱里的中心点工具,标出侧面的中心,如图12所示,然后使用FAC工具把跟踪面定位到侧面墙上,并使用CTR工具将跟踪面的的栅格中心定位到侧面的中心,再使用多边形工具绘制出山墙的轮廓,如图13所示。
图12定位侧面墙的中心点
图13绘制山墙轮廓
(2)做另一侧的山墙
通过复制的形式,将上一步绘制好的山墙轮廓复制到墙的另一个侧面,复制后,还需要翻转面的朝向。
(3)创建正面的山墙
重复
(1)创建山墙的过程,创建正面的山墙,如图14所示。
图14创建正面的山墙
(4)提升山墙
创建了三个山墙后,使用跟踪面偏移工具和投影工具将三个山墙提升到相同的高度,首先设置当前建模模式为点模式,单击视图面板的XY按钮,将跟踪面恢复到XY平面,然后设置跟踪面在Z方向上的偏移量为20个单位长,再选中三个山墙的上顶点,打开体工具箱选择投影工具,是选中的点都投影到跟踪面上,即三个山墙具有相同的高度,如图15所示。
图15使用投影工具提升山墙到同一高度
6.2.6制作屋顶
(1)将House节点设为当前父节点,打开创建工具箱,选择创建组节点工具,创建一个新的组节点,并命名为Roof。
(2)将跟踪面定位到侧面山墙上,使用多边形工具绘制屋顶的横截面。
(3)选中上一步绘制的截面,使用柱体工具进行拉伸,如图16所示。
图16制作屋顶横截面并拉伸
(4)将跟踪面定位到屋顶表面,在模型结构视图中选中构成屋顶的所有多边形,打开调整工具箱选择缩放工具,使屋顶两边伸出一个单位长,形成屋顶的外悬效果。
(5)创建正面屋顶的横截面,并向外拉伸一个单位长,然后使用缩放工具,沿Y轴将屋顶延长到房屋后面,如图17所示。
(6)使用FAC工具将跟踪面定位在较长的屋顶面上,打开体修改工具箱选择切割工具,沿着跟踪面将Y轴方向的屋顶分为两部分,然后删除不需要的部分。
图17延长正面屋顶
(7)删除轮廓点
将当前模式改为点(Vertex)模式,选择红色轮廓点,使用Edit/ClearConstruction菜单命令删除,删除后选择面模式。
6.2.7制作门窗
(1)制作子面
在透视视图中,以FAC工具定位正面的墙上,再以CTR工具将栅格中心置于墙的左下角,然后选择绿色为当前面颜色,将正面的墙设为当前父节点,使用矩形工具创建一个窗户面(子面),两个参数点为(4,2),(9,5)。
(2)把窗户嵌入墙中
首先选择父面,然后选择Edit/CutSubfaces菜单命令,就可以取消父面和子面的结构,即将窗户嵌入墙中。
(3)按上述方法,制作剩下的窗户和门。
6.2.8制作走廊
(1)将跟踪面定位于地基的上表面,并将栅格中心定位于地基上表面的左下角,将House节点设为当前父节点,创建一个名为Porch的新组,再将其设为当前父节点,将建模模式改为体模式。
(2)选择红色作为当前主色,用矩形工具绘制一个正方形,两点坐标分别为(0,0)和(1,0)。
(3)使用柱体工具将廊柱提升8单位长,然后复制三个廊柱,调整好位置,如图18所示。
图18创建廊柱
(4)将跟踪面定位到廊柱顶端面上,绘制走廊顶的截面,拉伸一个单位长,如图19所示。
图19创建走廊顶
6.2.9制作烟囱
(1)设置House节点为当前父节点,创建一个名为Chimney的新组,设置当前建模模式为体模式,把跟踪面定位到XZ坐标平面上。
(2)将Chimney节点设为当前父节点,使用多边形工具绘制出半个烟囱截面的轮廓,如图20所示。
图20半个烟囱的截面
(3)在体工具箱中选择回转体工具,以烟囱的中心线为轴,输入回转角度360°
,设置Steps为4,结果如图21所示,再删除上一步所创建的面。
图21使用回转体工具制作烟囱
(4)将跟踪面定位于XY坐标平面,使用调整工具箱中的绕点旋转工具,绕烟囱的下底面中心旋转45°
,调整烟囱的位置。
(5)将跟踪面定位于较长的屋顶上,选择整个烟囱,打开体修改工具箱选择植入工具(Plant),将烟囱放置在屋顶上,如图22所示。
图22使用植入工具将烟囱于屋顶连为一体
6.2.10优化模型结构
最后给模型添加颜色、材质和纹理。
添加颜色时,点击快捷键“CurrentPrimaryColor”选择相应的颜色,然后在模型中选择要改变颜色的区域,选择“Edit/InsertColor”即可;
添加材质时,点击快捷键“CurrentMaterial”选择相应的材质,然后在模型中选择要改变颜色的模块,选择“Edit/InsertMaterial”即可;
纹理的添加过程比较繁琐,首先要准备好纹理图案,本实验中使用的图案格式为.jpeg格式;
然后点击快捷键“CurrentTexture”,在弹出的对话框中双击黑色区域或者选择菜单“File/ReadPattern”,并在接下来的打开对话框中选择之前准备好的图片,点击“打开”按钮;
最后选择要插入的纹理图案,并将其插入到对应的位置即可。
最终的效果图如图23所示。
图23房屋模型效果图
6.3建立虚拟场景(在客户端PC2或PC3进行)
此部分建立进行虚拟现实人-机交互实验的场景,用到的类vrScene,vrScene类可以从外部文件加载场景,并对场景进行设置,如位置、灯光、观察场景的方向等。
(1)模型文件的建立,运行MultigenCreator,打开Farm.flt文件,观察房间及灯罩模型,查看坐标原点位置,实验的场景将基于这个模型。
(2)运行VTree中的OpenFlight2VTree应用程序,将上述home.flt、lampshade.flt文件转换为home.vt、lampshade.vt文件,这个文件格式适用于我们的软件编程,以便在VC++下调用。
(3)启动VisualC++6.0,使用AppWizard新建一个基于单文档的MFCAppWizard工程(在此假设该工程命名为MyVr),建立过程中请选中WindowsSockets,方便以后进行网络编程。
将以下文件添加到此工程所在目录下:
Farm.vt、1.wav、VRLabHome.dll、VRLabHome.lib、VRLab_Home.h。
为了使用VRLabHome.dll动态链接库,对工程做以下设置:
打开ProjectSettings对话框(通过菜单Project/Settings),选择C/C++标签页:
1)在C/C++标签页的Category下拉菜单中选择general,在Preprocessordefinition中原来基础上添加VTREE_INC_ALL;
2)在C/C++标签页的Category的下拉菜单中选择C++Language,选中RTTI;
3)在C/C++标签页的Category的下拉菜单中选择Preprocessor,在Additionalincludedirectories中添加*\cg2\vtree4\include;
选择Link标签页,在Category下拉菜单中选择general,在Object/librarymodules中添加VTree.libVRLabHome.lib;
下拉菜单中选择input,在Additionallibrarypath中添加*\cg2\vtree4\lib。
(4)利用VisualC++6.0的主菜单View中ClassWizard为CmyVrView视图类建立消息响应函数OnInitialUpdate(),为CmyVrApp应用程序类建立消息响应函数OnIdle(),客户端的所有软件编程都将在这两个函数中进行。
(5)初始化场景
在OnInitialUpdate()函数中调用vrScene:
:
InitScene()函数初始化场景类对象(假设对象名为MyVrScene)。
其函数原型如下:
voidInitScene(HWNDm_vrhwnd);
参数m_vrhwnd是建立场景所需要的窗口句柄,在此即这个应用程序的m_hWnd。
(6)加载场景
LoadFromFile()函数从*.vt文件加载场景。
voidLoadFromFile(CONSTintFilenum,CONSTchar*Filename[]),第一个参数是要加载的文件个数,第二个参数是各个文件名。
如:
CONSTchar*filename[1];
filename[0]="
Farm.vt"
;
myapp->
MyvrScene.LoadFromFile(1,filename);
//加载场景文件
(7)设置场景
SetScene()设置场景,其函数原型如下:
virtualvoidSetScene(vtVectorPos[]);
参数Pos为各文件对应的模型原点在世界坐标系中的位置,默认设置为将各模型放在世界坐标系原点。
此函数中设置场景位置,还设置灯光等(若实验者自行设置,可重载此函数)。
世界坐标系是一个右手坐标系,其X轴为沿屏幕水平向右,Y轴为沿屏幕垂直向上,Z轴则为垂直屏幕面向外指向用户。
Pos设置方法如下:
vtVectorvec[2];
vtSet(vec[0],0.0f,0.0f,0.0f);
vtSet(vec[1],0.0f,0.0f,0.0f);
函数vtSet详情请参看VTreeUsersManual(PDF格式)
(8)显示场景
以上已经建立并设置了场景,下面将其显示出来。
方法是在OnIdle()函数中添加语句:
MyvrScene.vtreeApp->
Window(0)->
Render();
//渲染
Frame();
//切换
(9)动态观察场景
在OnIdle()中利用vrScene:
LookFromTo()函数不断改变观察位置和角度,达到动态观察场景的效果。
此函数原型如下:
voidLookFromTo(constvtVectorfrom,constvtVectorto,constvtVectorup);
voidLookFromTo(floatfx,floatfy,floatfz,
floattx,floatty,floattz,
floatux,floatuy,floatuz);
voidLookFromTo(pos_headpos);
观察位置在“from”,观察方向为“from”到“to”,观察者头顶方向为“up”。
在此实验者可按一定的规律改变参数值,在以后的实验中此参数将由传感器的数据获得。
6.4数据采集及转换(在服务器PC1进行)
此部分用到的类有vrGlove、vrTracker和结构体recdata。
vrGlove为数据手套类,采集数据手套各关节角度信息;
vrTracker为跟踪器类,采集头部和腕部位置及角度信息,并进行数据的格式转换;
recdata定义如下:
typedefstruct
{
floatreceiver1[4][4];
floatreceiver2[4][4];
}recdata;
此结构体存储vrTracker格式转换后两个传感器的数据。
1)启动VisualC++6.0,使用AppWizard新建一个基于对话框的MFCAppWizard工程(在此假设该工程命名为dlgserve),建立过程中请选中WindowsSockets,方便以后进行网络编程。
对工程的设置与前相同,另外在Link标签页Object/librarymodules中添加
libVHTCore.liblibVHTVClip.liblibVClip.liblibQHull.liblibdemoBase.lib