VRPN介绍及使用

2023-05-16

 

VRPN 介绍及使用

VRPN 简介

Virtual-Reality Peripheral Network VRPN )由一系列的类库组成,它也提供一系列的服务在虚拟现实系统中实现应用程序与外围物理设备( tracker 等)之间的网络透明接口。

VRPN 提供:

  • 通过易用和可扩展的接口访问各种 VR 外围设备。
  • 设备的网络透明接口。
  • 来往设备之间的消息的时间标记。
  • 处于不同机器中的客户端与服务器进行时钟同步。
  • 同一时间可与设备建立多个链接。
  • 与失效远程服务器重新自动建立链接。
  • 对交互会话进行存储和重放。

V RPN 的目标不是提供一套全面的 VR API VRPN 专注于为尽量多的设备提供统一的接口,实现网络透明访问设备的低延迟和可靠性。

设备类型和分层

不难想象 VRPN 不是为一套设备提供驱动程序,而是为一套功能提供接口。特定的设备属于一个或多个标准设备类型。每种设备类型指定一致的接口和语法通过设备实现这些功能。常用的设备列在下面。有新的设备类型提供就可以建立新的类型。

  •  
    • Tracker 记录姿势(位置和方向)姿势的速度和,或者加速度。
    • Button 记录按钮的按下与释放事件。
    • Analog 记录一个或多个模拟值。
    • Dial 记录增值旋转。
    • ForceDevice 指定三维空间中的表面和受力范围。

映射一系列设备到一个标准设备,需要映射每个设备的不同功能到同一个接口。是提供一个简单的接口还是提供一个功能齐全的接口是个两难的决定。 VRPN 通过以下解决:

  • 以功能区分设备。
  • 映射设备到 VRPN 中的连接。
  • 允许设备输出多种接口。
  • 舍弃那些不被支持的消息类型。
  • 应用程序层可以取得所有的消息。

实例解析:一个特定的设备可能实现不止一种的功能。一个该设备的 VRPN 驱动程序输出多种设备类型的接口。 SensAble™ Technologies Phantom™ haptic display 的服务器在相同的设备下输出 Tracker, Button, ForceDevice 三个接口 客户端处理 Phantom™ ,好像是三个设备各自提供各自的功能。虽然在 Phantom™ 系统中 Tracker, Button ForceDevice 设备在逻辑上时分开的,但是为了更有效的通信,在内部它们是一起被映射到相同的网络连接。

功能分解让应用程序在不同的输入 ¥ 输出设备移动变得容易。客户端程序不用变就可实现在不同 VR 设备之间的移动。

VRPN 的编译测试

Windows 系统 VS2005 为例,其他参见 http://www.cs.unc.edu/Research/vrpn/index.html

  • ftp://ftp.cs.unc.edu/pub/packages/GRIP/vrpn 下载最新的 VRPN 版本解压缩,得到两个文件 quat /, vrpn/ (网站说还有 vrpn_html/ ,我没见到 ~~ )。 vrpn/ 包含库源码和一些应用程序源码, quat/ 是一个实现的四元素的类。
  • 在编译之前,你必须首先查看下 vrpn_Configuration.h 文件 ,看是否需要更改其中的默认选项以符合你的需要。 例如 DirectInput 是不被配置的因为它需要 DirectX 的支持。
  • VS2005 下,打开 vrpn.sln 打开文件视图 ,可以看见很多工程文件。( client_and_server 是一个客户端和服务器端用一个程序实现的例子, vrpn_print_de vices 是一个很好的客户端测试程序, vrpn_server 是一个通用的服务端程序
  • 生成 quat, vrpn, vrpn_server, printvals and test_vrpn 工程(可通过生成 test_vrpn ,其他也就相应的自动生成)右击 test_vrpn 点击 生成 vrpn.lib 生成于 pc_win32/Debug 目录下,可执行程序在 pc_win32/client_src/[SERVER_NAME]/Debug pc_win32/server_src/[SERVER_NAME]/Debug 目录下。 vrpndll.lib vrpndll.dll 生成于 pc_win32/DLL/Debug 目录下;
  • 运行测试程序:运行 vrpn_server.exe ,需要一个配置文件,配置文件的设置见 VRPN 网页。运行 vrpn_print_devices.exe ,控制台应用程序,输入命令行 'vrpn_print_devices device@ hostname ' (设备名和运行 vrpn_server 的机器名)。

实例: DTrack 跟踪设备

  • DTrack DTrack controller 建立连接,并通过 DTrack 进行空间和物体坐标校准。
  • 运行 vrpn_server (设好配置文件),运行 vrpn_print_devices.exe vrpn_print_devices DTrack@localhost -trackerstride 100 )。
  • 移动被跟踪物体, vrpn_print_devices 打印数据。

编写自己客户端程序

  • 类似 vrpn_print_devices ,只是简单的打印位置数据。

#include <stdlib.h>

#include <stdio.h>

#include <vrpn_tracker.h>

 

//回调函数, vrpn_tracker 下有很多的回调函数,可以实现对各种数据的处理,//这里只是 得到位置和方向信息的 回调函数为例。

void    VRPN_CALLBACK handle_tracker(void *userdata, const vrpn_TRACKERCB t)

{

  printf("handle_tracker/tSensor %d is now at (%g,%g,%g)/n",

              t.sensor,

              t.pos[0], t.pos[1], t.pos[2]);

}

int main(int argc, char *argv[])

 

{      

        vrpn_Tracker_Remote *tkr;

 

        // 打开跟踪器

        tkr = new vrpn_Tracker_Remote(" DTrack @ localhost ");

                           

              // 设置回调函数

        tkr->register_change_handler(NULL, handle_tracker);

 

        // 主循环

 

        while ( ! done ) {

                            //得到更新数据并调用相应回调函数

                                                        tkr->mainloop();

        }

  • OSG DTrack 小程序

 

#include <osg/Notify>

#include <osg/MatrixTransform>

#include <osg/PositionAttitudeTransform>

#include <osg/Geometry>

#include <osg/Geode>

#include <osgUtil/Optimizer>

#include <osgDB/Registry>

#include <osgDB/ReadFile>

#include <osgGA/TrackballManipulator>

#include <osgGA/FlightManipulator>

#include <osgGA/DriveManipulator>

#include <osgSim/OverlayNode>

#include <osgViewer/Viewer>

#include <iostream>

 

#include <stdlib.h>

#include <stdio.h>

#include <vrpn_tracker.h>

 

int i = 0;

 

osg::Quat rota;

osg::Vec3 pv;

 

void    VRPN_CALLBACK handle_tracker(void *userdata, const vrpn_TRACKERCB t)

{

              rota.x() = t.quat[0];

              rota.y() = t.quat[1];

              rota.z() = t.quat[2];

              rota.w() = t.quat[3];

 

              pv.x() = t.pos[0] * 20;

              pv.y() = t.pos[1] * 20;

              pv.z() = t.pos[2] * 20;

 

}

 

int main(int argc, char *argv[])

 

{   

        vrpn_Tracker_Remote *tkr;

 

        tkr = new vrpn_Tracker_Remote("DTrack@localhost");

        tkr->register_change_handler(NULL, handle_tracker);

   

    osg::ArgumentParser arguments(&argc,argv);

   

    // initialize the viewer.

    osgViewer::Viewer viewer;

 

    // load the nodes from the commandline arguments.

    osg::Node* model = osgDB::readNodeFile("cessna.osg");

    if (!model)

    {

        return 1;

    }

    

    // tilt the scene so the default eye position is looking down on the model.

    osg::MatrixTransform* rootnode = new osg::MatrixTransform;

    rootnode->setMatrix(osg::Matrix::rotate(osg::inDegrees( 30.0f ), 1.0f , 0.0f , 0.0f ));

    rootnode->addChild(model);

 

    // run optimization over the scene graph

    osgUtil::Optimizer optimzer;

    optimzer.optimize(rootnode);

     

    // set the scene to render

    viewer.setSceneData(rootnode);

 

    viewer.setCameraManipulator(new osgGA::TrackballManipulator());

    viewer.realize();

    

              osg::Quat r;

    while (!viewer.done())

    {

                            tkr->mainloop();

              rootnode->setMatrix(osg::Matrix::rotate(rota) * osg::Matrix::translate(pv));

        viewer.frame();

    }

    

    return 0;

 

运行结果:通过跟踪物体改变,改变应用程序中飞机的位置和旋转变化

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VRPN介绍及使用 的相关文章

  • 流式套接字实现简单的客户端/服务端通信过程

    一 实验内容 熟悉流式套接字socket函数的使用方法 xff0c 包括建立连接 数据发送 接收和关闭连接等 xff1b 客户端可向服务端发送任意字符串 xff0c 服务端在接收到该字 符串后 xff0c 回送给客户端 xff1b xff0
  • 实现基于 TCP/IP 协议简单的客户端、服务器通信程序实例

    本篇文章实现了一个基于TCP 的一个非常简单的客户 服务器通信程序实例 该程序中通讯协议使用的是面向连接的TCP协议SOCK STREAM 服务器的ip地址为本地地址即 xff1a 127 0 0 1 xff0c 端口号为自定义的5099
  • ARM:FreeRTOS系统栈和任务栈

    ARM xff1a FreeRTOS系统栈和任务栈 背景 xff1a ARM 有两个栈指针PSP和MSP xff0c 通过Control 寄存器来决定SP R13 使用哪个栈 我们下面谈论的系统栈和任务栈 xff0c 就和这两个栈指针有关
  • cmake编译时对‘xxxx‘未定义的引用问题

    众所周知 c c 43 43 编译过程中在链接阶段偶尔会出现 34 对 xxxx 未定义的引用 34 问题 在复杂的项目中更为常见 经查 大部分博主的关于这方面的博客千篇一律 都指出是头文件未包含的原因 我还是建议大家仔细阅读编译错误信息
  • 进制转换(C++):十六进制、二进制、十进制(附源代码)

    思路如下 xff1a 十进制转二进制 xff1a 除二求余 xff0c 得到低位到高位的二进制数字排列 十进制转八进制 xff1a 除八求余 xff0c 得到低位到高位的八进制数字排列 十进制转十六进制 xff1a 除十六取余 xff0c
  • [C/C++]C语言中math.h和cmath的pow()精度问题

    帮小朋友们DEBUG的时候 xff0c 他们有个题无论怎么提交OJ都不给过 我回来后想了想 xff0c 估计是因为math h库返回值转int时精度丢失的问题 gt 测试代码 include lt stdio h gt include lt
  • c语言自定义寄存器操作的一些方法

    1 寄存器地址的定义 xff1a define UART BASE ADRS 0x10000000 串口的基地址 define UART RHR volatile unsigned char UART BASE ADRS 43 0 数据接受

随机推荐

  • 数字签名-数字证书-ca认证

    数字签名是什么 xff1f 作者 xff1a 阮一峰 今天 xff0c 我读到一篇好文章 它用图片通俗易懂地解释了 xff0c 34 数字签名 34 xff08 digital signature xff09 和 34 数字证书 34 xf
  • Cocos2d-android游戏引擎-介绍

    一 游戏引擎概念 什么是游戏引擎 游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式实时图像应用程序的核心组件 这些系统为游戏设计者提供各种编写游戏所需的各种工具 xff0c 其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开
  • JAVA语言的三种技术架构

    J2EE Java 2 Platform Enterprise Edition 企业版 是为开发企业环境下的应用程序提供的一套解决方案 该技术体系中包含的技术如Servlet Jsp等 xff0c 主要针对Web应用程序开发 J2SE Ja
  • java中数组排序Arrays.sort(arr)

    import java util 选择排序 class SwitchTest public static void main String args int arr 61 3 5 6 23 45 2 排序前 printArray arr 排
  • java中什么时候使用静态static,工具类的创建

    什么时候使用静态 xff1f 要从两方面下手 xff1a 因为静态修饰的内容有成员变量和函数 什么时候定义静态的变量 类变量 呢 xff1f 当对象中出现共享数据时 xff0c 该数据被静态所修饰 对象中的特有数据要定义成非静态存在于堆内存
  • java面向对象-包package-包与包之间访问-导入包import

    包 package 1 对类文件进行分类管理 2 给类提供多层命名空间 3 写在程序文件的第一行 4 类名的全称是 包名 类名 5 包也是一种封装形式 带包的java文件编译命令 编译 xff1a javac d PackageDemo j
  • String-练习3

    3 xff0c 获取一个字符串在另一个字符串中出现的次数 34 abkkcdkkefkkskk 34 思路 xff1a 1 xff0c 定义个计数器 2 xff0c 获取kk第一次出现的位置 3 xff0c 从第一次出现位置后剩余的字符串中
  • Java基础加强-java5的枚举

    枚举类 xff08 1 xff09 为什么需要枚举 xff1f 一些方法在运行时 xff0c 它需要的数据不能是任意的 xff0c 而必须是一定范围内的值 xff0c 此类问题在JDK5以前采用自定义带有枚举功能的类解决 xff0c Jav
  • Android核心基础-6.Android 耗时操作

    1 什么是ANR 在应用程序的主线程中执行一段耗时的代码 就有可能出现ANR异常 耗时的代码未执行结束时 界面会卡住 用户对界面进行了操作 10秒之后耗时代码如果还未结束 就会出现ANR异常 我们的布局文件中有个TextView和一个按钮B
  • 第9章-WebSocket、Socket.IO和DerbyJS的实时应用程序-9.2.Socket.IO和Express.js

    大多数的实时Web应用程序中 xff0c 服务器和客户端之间的通信发生在响应报文里 xff0c 或者是对用户行为的响应 xff0c 或者是从服务器获取数据更新的结果 安装Socket IO npm install socket io 64
  • 鸟哥的Linux私房菜-第二部分-Linux文件、目录与磁盘格式

    第6章 Linux的文件权限与目录配置
  • 使用中断方法实现UART不定长数据接收

    使用中断方法实现UART不定长数据接收 基础知识CubeMx配置函数说明代码实现 硬件平台 xff1a NUCLEO STM32F411RE 基础知识 嵌入式开发中 xff0c UART串口通信协议是我们常用的通信协议之一 xff0c 全称
  • 鸟哥的Linux私房菜-第二部分-Linux文件、目录与磁盘格式

    第7章 Linux文件与目录管理
  • 鸟哥的Linux私房菜-第二部分-Linux文件、目录与磁盘格式

    第8章 Linux磁盘与文件系统管理
  • windows连接远程ubuntu服务器进行本地代码编辑,服务器端运行代码

    windows连接远程服务器进行本地代码编辑 xff0c 服务器端运行代码 概述工具准备putty 基本使用Xming 使用看图片编辑文档 vscode相关将服务器代码保存到本地一份使用git使用pscp命令 xff08 putty带的 x
  • IMU加速度、磁力计校正--椭球拟合

    本文为博主 声时刻 原创文章 xff0c 未经博主允许不得转载 联系方式 xff1a shenshikexmu 64 163 com 问题 考虑到IM xff35 中 xff0c x y z轴的度量单位并不相同 xff0c 假设各轴之间相互
  • IMU校正以及姿态融合

    本文为博主 声时刻 原创文章 xff0c 未经博主允许不得转载 联系方式 xff1a shenshikexmu 64 163 com 缘起 有缘在简极科技兼职两年 接触了IMU xff0c 我去的时候那家公司还是一个要把IMU放进足球的公司
  • socket can 编程

    Socket can 文档原名称 can txt 位于 linux 3 2 0 m3352 Documentation networking can txt CAN 控制器局域网络协议族之 Readme 文件 aka Socket CAN
  • HiEV洞察 | 特斯拉HW4.0再爆猛料,高精定位、雷达均有变动

    作者 查理斯 编辑 王博 特斯拉 HW4 0 消息传出后 xff0c 有人爆料说在硬件层面发生了巨大变化 xff0c 引发行业轰动 大家都在猜测HW4 0 具体做了哪些改动 2月16日 xff0c Twitter用户greentheonly
  • VRPN介绍及使用

    VRPN 介绍及使用 VRPN 简介 Virtual Reality Peripheral Network xff08 VRPN xff09 由一系列的类库组成 xff0c 它也提供一系列的服务在虚拟现实系统中实现应用程序与外围物理设备 x