vrpn

更新时间:2024-04-29 00:26:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

在Windows下安装VRPN(Virtual Reality Peripheral Network)

2013-05-30 13:20:25| 分类: 项目 | 标签:教程 项目 学习 |举报 |字号大中小 订阅

以下教程是参考这篇文章,并在自己的电脑上成功安装了。以后可以好好研究下VRPN了。

安装VRPN (Virtual Reality Peripheral Network) ,我的机器是Windows XP(Winodws 7应该也适用),然后是Microsoft Visual C++ 2010学习版。然后还使用了之前介绍的CMake GUI(具体介绍请看之前的文章)。 第一步:

下载VPRN 07.30,下载好vrpn_07_30.zip后,进行解压,在我的电脑上是E盘的software文件夹下。 第二步:

在其它位置创建一个文件夹,例如我是在E盘下创建了一个vrpn文件夹。然后打开CMake GUI,进行下图设置:

一个是源文件的位置,即你解压vrpn_07_30.zip后的文件位置,还有一个是你需要构件二进制文件的位置,即空的vrpn文件夹。之后在CMake中点击Configure按钮,之后会让你指定这个项目的生成器。选择“Visual Studio 10”(即Microsoft Visual C++ 2010)和“Use default native compilers”。当配置完成后,点击“generate”按钮。当生成完成后,我们就完成了CMake的工作。 第三步:

之后到vrpn文件夹中,其中会生成一些文件,双击VRPN.sln文件,这样Microsoft Visual C++ 2010就打开了这个文件。之后注意以下几点:

a.确保这个解决方案配置在Debug模式下,然后解决方案平台是Win32.

b.找到名为ALL_BUILD的项目,右键点击ALL_BUILD,然后选择Build(生成)。这会在debug配置下生成解决方案。当这完成后,重复这两步,使用Release配置。

在这两种模式(Debug和Release)下都完成生成后,我们想要在我们的机器下安装这个二进制文件。

c.我们需要重复以上的过程,但这一次是在名为INSTALL的项目。右键点击INSTALL,选择Debug模式进行生成。之后是在Release下完成。这样,VRPN就在我们的机器上安装好了。这时在电脑的C盘会生成一个usr文件夹。 第四步:

为了创建自己的项目,使用VRPN,你只需要设置链接到可执行文件。按照下面的步骤,使用Debug或Release模式。 你会在“C:\%usr\\local”下找到可执行文件。

- 首先,添加bin(“C:\%usr\\local\\bin”)的路径到PATH环境变量。 - 然后到Visual Studio下,右键点击你的项目,选择Properties(属性)

- 然后,点击C/C++ General,添加路径“C:/usr/local/include”到Additional Include Directories

- 然后,点击Linker General,添加路径“C:/usr/local/lib”到Additional Library Directories

- 最后,添加“vrpn.lib”到Additional Dependencies of the Linker Input

【转载】教程——使用VRPN(1)

2013-07-07 22:14:36| 分类: 默认分类 |举报 |字号大中小 订阅

本文转载自hailin_xin《教程——使用VRPN(1)》

前面已经介绍了如何安装VRPN,这篇文章将简单的介绍如何使用VRPN。这篇文章翻译自“Tutorial - Use VRPN”。 介绍:

VRPN(Virtual Reality Peripheral Network)是免费,开源,工具,用于控制许多VR设备。

VRPN作用为一个设备服务器。配置VRPN来使用你的设备,然后你的程序可

以很容易连接服务器,以一种标准的方式来得到设备上的数据。

VRPN被许多VR应用所使用:商业的有Virtools、WorldViz,也包括一些免费的应用如OpenSceneGraph或Panda3D。

VRPN是跨平台的,可以运行在许多不同的系统如Windows,Linux和MaxOS...

理解VRPN:(这段翻译的很难受,建议看原文)

VRPN“转换”来自许多设备的数据为通用的三种类型:Tracker、Analog和Button。

Tracker保留一个位置和一个方向。(The Tracker type holds a position and an orientation.)

Analog用于任何类型的轴类:游戏摇杆,鼠标轴...(The Analog type is used for any type of axis : joystick axis, mouse axis ...)

Button用于任何类型的二进制按钮:操纵杆按钮,鼠标按钮...(The Button type is used for any type of binary button : joystick button, mouse button ...) 例如:一个鼠标有二通道Analog和三通道Button。

一个典型的VR设备Wand,有一个Tracker,一个Analog数据给它的操纵杆,以及Buttons。

Wiimote被视为有许多Analog通道以及一些Button通道。

配置VRPN server:

我们会为鼠标配置VRPN server。对于其它设备,这一过程是一样的。你可能需要添加一些配置参数。

要做的第一件事是配置VRPN server。

按照前一篇文章介绍的,在编译好的VRPN文件夹中的server_src文件夹下有一个'vrpn.cfg'文件,将这个文件拷贝到和vrpn_server.exe文件在同一个目录下。vrpn_server.exe文件应该在server_src文件的Debug或Release目录中。'vrpn.cfg'文件是用来对vrpn_server.exe进行配置。

修改'vrpn.cfg'文件,位于\这一行。说明启用“vrpn_Mouse Mouse0”。

移除\,然后运行vrpn_server.exe。这一行的第一个词是我们使用的驱动类型,第二个词是你选择的设备名称,以及你会用到的客户端连接。

(说明:这个图片是翻译的文章中的图片,自己的情况是运行vrpn_server.exe后,没有输出内容,不知道什么原因,但是VRPN server应该是已经运行了,下面可以验证。)

VRPN server现在正在运行。我们使用vrpn_print_devices应用来测试这个server。

在Windows下,用cmd打开DOS,进入到“...\\vrpn\\client_src\\Debug”,然后运行vrpn_print_devices应用,带上这个参数“Mouse0@localhost”,即:“vrpn_print_devices Mouse0@localhost”

“Mouse0”是你在vrpn.cfg中定义的,'localhost'是你的server网络地址。 当你移动鼠标,并点击几次,你应该能够看到一些东西像下图所示:

(说明:这个图是自己电脑上运行时,截的图。在移动鼠标时会不断的输出一个值。)

下面一篇文章会介绍如何利用VRPN编写简单的程序。

【转载】教程——使用VRPN(3)

2013-07-07 22:12:56| 分类: 默认分类 |举报 |字号大中小 订阅

本文转载自hailin_xin《教程——使用VRPN(3)》

前一篇文章介绍了编写一个简单的client,这里要介绍添加Buttons和Trackers。

和Analog类似,添加Buttons和Trackers代码如下:

#include \#include \#include \#include using namespace std; void VRPN_CALLBACK handle_analog( void* userData, const vrpn_ANALOGCB a ) { int nbChannels = a.num_channel; cout << \; for( int i=0; i < a.num_channel; i++ ) { cout << a.channel[i] << \; } cout << endl;

} void VRPN_CALLBACK handle_button( void* userData, const vrpn_BUTTONCB b ) { cout << \<< b.button << \<< b.state << endl; } void VRPN_CALLBACK handle_tracker(void* userData, const vrpn_TRACKERCB t ) { cout << \<< t.sensor << \<< t.pos[0] << \<< t.pos[1] << \<< t.pos[2] << endl; } int main(int argc, char* argv[]) { vrpn_Analog_Remote* vrpnAnalog = new vrpn_Analog_Remote(\); vrpn_Button_Remote* vrpnButton = new vrpn_Button_Remote(\); vrpn_Tracker_Remote* vrpnTracker = new vrpn_Tracker_Remote( \); vrpnAnalog->register_change_handler( 0, handle_analog ); vrpnButton->register_change_handler( 0, handle_button ); vrpnTracker->register_change_handler( 0, handle_tracker ); while(1) { vrpnAnalog->mainloop(); vrpnButton->mainloop(); vrpnTracker->mainloop(); } return 0; } (说明:这个图也是原文中的图片,自己测试时不是很方便截图,不过效果是类似的,点击鼠标按键时会有“Button”。)

不太清楚原文中的tracker是如何测试的。

下面是Wiimote,由于没有这东西,就不详细介绍了,原文中介绍的也不多。

Going further with VRPN

The VRPN server can be on another machine. You can have access to the devices plugged to another machine simply by specifying the network address of the vrpn_server when you create your remote devices.

教程——使用VRPN(2)

2013-06-02 11:21:16| 分类: 学习 | 标签:学习 教程 |举报 |字号大中小 订阅

前面一篇文章介绍了如何配置VRPN server,以及进行了一个简单的测试。这里将介绍如何用VRPN编写简单的程序。在进行下面的学习前,首先应该按照“在Windows下安装VRPN(Virtual Reality Peripheral Network)”这篇文章介绍的,安装好VRPN,并进行配置。同样的这篇文章也是翻译的这篇文章。

一个简单的client

下面是得到Analog值的简单代码: #include \ #include using namespace std; void VRPN_CALLBACK handle_analog( void* userData, const vrpn_ANALOGCB a ) { int nbChannels = a.num_channel; cout << \; for( int i=0; i < a.num_channel; i++ ) { cout << a.channel[i] << \; } cout << endl; } int main(int argc, char* argv[]) { vrpn_Analog_Remote* vrpnAnalog = new vrpn_Analog_Remote(\); vrpnAnalog->register_change_handler( 0, handle_analog ); while(1) { vrpnAnalog->mainloop(); } return 0; } 这是一个控制台程序,在Debug模式下没有编译成功,在Release模式下编译成功了,不知道什么原因。在运行时,应该先打开vrpn_server.exe,启动server。之后运行这个程序,效果如下:

现在进行一些解释:

vrpn_Analog_Remote* vrpnAnalog vrpn_Analog_Remote(\); = new vrpn_Analog_Remote是一个类,允许你连接到一个已经定义了驱动和一个Analog输出的vrpn server。这个构造函数吸收驱动的名字和server的网络地址。

vrpnAnalog->register_change_handler( 0, handle_analog ); 然后我们需要注册一个回调函数,这会在任何情况下被调用,当有一个来自vrpn server的更新时。 这里是回调函数:

void VRPN_CALLBACK handle_analog( void* userData, const vrpn_ANALOGCB a ) { int nbChannels = a.num_channel; cout << \; for( int i=0; i < a.num_channel; i++ ) { cout << a.channel[i] << \; } cout << endl; } 这个回调有一个vrpn_ANALOGCB参数,包含了在'channel'数组中的更新值。Analog的channels的数目可以在vrpn_ANALOGCB结构的num_channel成员中找到。

现在我们唯一要确定的是vrpn_Analog_Remote对象能够正确的更新。 while(1) { vrpnAnalog->mainloop(); } 2014-03-25

DTrack :http://www.hitlab.utas.edu.au/wiki/DTrack

在VisionSpace中,Studio是一个跟踪系统,它有能力观察反射回来被标记物的位置和角度的变化。现在可获得的标记物是”Spikey”,”Glasses”,”Flystick2”,后来又有了按钮和八向轮(analog joystick)。所有的这些标记物都可以同时被成功的捕捉。对于“Glasses”并不建议在用于头部跟踪的其他时候使用,因为当速度很快时这些会不再显示而失去信号。

由于在场景中只有四个相机,因此每一个标记物必须有三个点。

通过VRPN获得被标记物

Vrpn是一个开源的软件接口,她为在虚拟显示软件中使用的跟踪设备之间的交

流提供软件接口。DTrack能很好的支持VRPN,不管是被标记物还是flysticks,只要是能在VRPN客户端得到的设备。

由于VRPN将DTrack作为一个单独的设备,尽管它由多个独立的带有按钮的标记,每个标记被认为是在一组TrackerRemote ButtonRemote DTrack AnalogRemote中的一个单独传感器。被标记物的位置和角度数据在一个TrackRemote中编码,然而每个flystick的按钮和模拟杆在一个ButtonRemote和AnalogRemote中编码。每个ButtonRemote将为每个flystick分配8按钮(max)和2个类似物(水平/垂直)。

来自ButtonRemote和AnalogRemote设备的数据是没有身份可以区分的标记的,只有TrackerRemote设备,这可能会导致轻微的混乱如果被动标记和Flysticks同时使用。每个ButtonRemote将有8按钮分配给每个Flystick2 Flystick2 # 1小组编号,Flystick2 # 2地位等等;AnalogRemote也是如此,但每个Flystick2 有2个类似物。

VRPN:Flystick2 DTrack Console Application

准备: 一个C++编译器,VRPN(编译了库文件和头文件)

创建一个新的C++项目,你将需要3个文件:Flystick.h,Flystick.cpp,VRPNFlystickConsole.cpp(主要的方法都在这个函数中)。然后包含一些VRPN头文件到你的项目中:vrpn_Tracker.h,vrpn_Button.h,vrpn_Analog.h,quat.h(在quat包中)。

编写Flystick头文件:

在头文件中定义Flystick类

我们需要在每次更新时保存这些数据,包括位置,角度,analog,button。定义如下:

每次调用mainloop()时vrpn将会根据server处理更新信息。处理完后将会调用我们写的更新函数,一些此类模板如下:

还需要添加两个函数:

Flystick类的实现非常简单,我们只需要初始化的静态变量,编写一个构造函数和更新函数,回调函数在头文件处理更新Flystick的状态,首先初始化静态变量:

我们使用DTrack VRPN server 的地址初始化我们所创建的每一个远程遥控,注册回调函数并且忽略远程遥控端的警告。

回调函数将会被用户频繁的调用,因为它只处理在缓存中的旧的UDP包,如果程序需要很长时间打电话给UpdateFlystick这可能引入一些滞后的标记。

为了提供独立的输出,我们提供了一个非常简单的主函数,它将会持续不断的更新和输出flystick的状态直到程序结束。VRPNFlystickConsole.cpp:

#include \#include \#include

int _tmain(int argc, _TCHAR* argv[]) {

Flystick *flystick = new Flystick(\

// Endless update loop while (true) {

// Update the flystick remotes flystick->UpdateFlystick();

// Clear console system(\

// Output updated data

printf(\%d\\nY: %d\\nZ: %d\flystick->_position[0], flystick->_position[1], flystick->_position[2]); printf(\flystick->_eulerOrientation[0], flystick->_eulerOrientation[2]);

%d\\nPitch: %d\\nRoll: %d\flystick->_eulerOrientation[1],

printf(\0 Pressed? %i\\nButton 1 Pressed? %i\\nButton 2 Pressed? %i\\nButton 3 Pressed? %i\\nButton 4 Pressed? %i\\nButton 5 Pressed? %i\

flystick->_buttonState[0], flystick->_buttonState[1], flystick->_buttonState[2], flystick->_buttonState[3], flystick->_buttonState[4], flystick->_buttonState[5]); printf(\stick:\\nHorizontal: %d\\nVertical: flystick->_analogHorizontal, flystick->_analogVertical); }

return 0;

%d\

本文来源:https://www.bwwdw.com/article/140g.html

Top