在OSVR,使用外部VRPN设备


  在OSVR,使用外部VRPN设备

  Ryan A. pavlik博士(Senscis软件工程师),于2015年4月27日发布此文

  介绍和需求

  为了提供可靠的性能和广泛的兼容性,部分的OSVR使用和推广VRPN(虚拟现实外设网络Virtual Reality Peripheral Network)软件和设备模型。早期版本的OSVR提供一个实验性的方式整合外部VRPN的跟踪器到OSVR,但0.2版本中OSVR为了完全支持使用通过VRPN服务器的追踪器,按键和模拟设备而删除了此实验性的支持。

  这个改变是需要将这些设备整合到OSVR使用的丰富的元数据”路径树”模型中。本地OSVR设备驱动程序不仅提供访问设备数据,而且一个提供一个描述设备能力和语义意义上的数字传感器:JSON“设备描述符描。作为标准的VRPN服务器缺乏这种额外的数据,在OSVR中使用VRPN装置要求用户提供这样的信息,通过配置文件来妥善整合设备。

  如上所述,本文所描述的方法需要一个0.2或更新版本的OSVR-Core。客户端(应用程序)DLL和服务器组件必须是0.2或更新版本,这样允许打破了元数据对协议兼容性的限制,得到了更大的功能性。

  至于外部VRPN服务器,它可以是任何一个07.xx允许(特别是按键设备)运行在本地或远程的设备。(这种支持包括整合VRPN服务器作为本地报告协议的设备,只要协议版本是7。)

  如果你在作为OSVR服务器的同一个设备上运行一个VRpn_server步骤,你必须通过一个交替地端口号(如3884)作为命令行参数到VRpn_server来避免与嵌入式VRPN服务器在OSVR的冲突。这样的外部服务器的配置已经超出了本文的范围:假定你知道设备的名称(通常是Tracker0)和服务器(通常只是一个主机名,如trackerserver,但也有可能是可能主机名和建议的本地VRpn_server端口是localhost:3884,甚至包括tcp://trackerserver:3884)。这两部分通常与@符号分隔指定,例如Tracker0@localhost:3884。

  对于此文件的目的,我们将假设你使用的一些设备在功能上类似追踪器或雷蛇的Hydra。也就是说,一个现有设备,提供跟踪,按键,和模拟数据的功能。这个过程可以重复添加任意数量的外部VRPN设备到系统中。

  提示

  你不妨从OSVR_server_config.externalVRpn.sample.json示例样本开始,去创造属于你自己的配置文件。下面的文档遍历这个配置文件部分的建设。

  一个支持JSON的文本编辑器是非常有用的,可以编辑这些配置文件,语法检查、代码折叠、自动缩进。

  · 如果你不能在本地安装软件JSON Editor OnlineJSON在线编辑器是一个很好的选择。在文本的上方最左边的按钮,是一个“美化”按钮,可自动重新缩进文件。有一个X在边缘会显示,用来解析错误(通常在你的错误输入时候)提供的一些细节上的建议。当注意到一个变化的表征的变化(文本或树形),必须用界面中心的箭头按钮手动同步到其他表征。

  如果你可以安装软件在本地,Atom原子编辑器是一个很好用来支持JSON的网页格式的文本编辑器。它缺乏上面的Web应用程序中的图形视图,但它有一些更有用的解析错误消息提醒。作为一个本地安装的应用程序,它更容易使用在本地编辑文件(在网页应用程序和文本编辑器间不需要复制和粘贴,或重命名从Web应用程序保存的文件)。然而,由于其使用的嵌入式框架与WebGL的启用,它遇到远程错误链接或错误转发就不会工作(见问题跟踪器issue tracker)。

  · 设置配置

  · 步骤1:导入和描述VRPN装置

  · 第一步是创建表示您的外部设备的路径树节点,设备名称、服务器和描述符数据。这是在配置文件的顶层要素(OSVR_server_config.json默认的)对象称为externalDevices下完成的。样本显示这段摘录如下。

  · 关键的externalDevices,是指一个JSON对象,其中每个关键是将创建设备节点,并且值是包含需要创建该节点的信息对象的“路径”。(在一个本地的OSVR装置,这条路径会有两个层次:第一个是插件名称,然后是设备名称,如/com_OSVR_Multiserver/OSVRHackerDevKit0。一旦这个externalDevices部分设置完成,您可以适用您的外部设备,就像一个本地的OSVR装置。)

  · 在上面的例子中,我们任意选择/myExternalDevice作为路径。deviceName包含我们名为(Tracker0)的VRPN设备,而server包含服务器信息(localhost:3884)。最后一个对象要素,标记为descriptor,是OSVR使用但VRPN不提供的元数据。在最基本的层面上,它可以是如下所示:只是一个嵌入式的有interfaces的JSON对象,包含您要访问的每个接口类型的成员对象。而不是一个对象,你也可以提供一个字符串,它将被解释为一个文件名中含有一个一个JSON设备的描述符。这是很有用的,特别是如果你在多个地方使用的是相同设备:你可以分别从服务器配置来共享设备描述符文件。

  · 最小嵌入式描述符的变更和上述变化足以遵循这些剩余的指示和在OSVR使用您的设备。因此,对完整设备描述符格式的进一步说明超出了本文档的范围。然而,如果你希望(例如,如果你要发布你的描述文件),你可以提供一个就像嵌入OSVR插件的功能齐全的设备描述符。完整设备描述符的一些例子:

  HDK tracker

  Razer Hydra

  · 你可以使用OSVR JSON EditorWeb应用程序来帮助你撰写这部分:这是一个使用device descriptor JSON Schema自动生成一个编辑界面的单页面应用程序。

  · 验证你的结果

  · 在这一点上,您可以停止并测试您的配置文件。当你在你的配置文件里运行OSVR_server,你应当可以看到一行类似下面的结果:

  运行OSVR_print_tree也应该如下展示:

  如果你看到DeviceElement线,但没有InterfaceElement线,那么这里会有一个问题解析你的描述符,而且它没有找到interfaces部分。你可以在OSVR_server的输出端查找到更多信息。

  步骤2:设置别名

  的OSVR系统强烈不建议硬件特定路径的使用,而是建议您的应用程序中使用“语义路径”,可以设置点对不同系统的不同的硬件资源。(在旧版本的OSVR,你可能已经看到提到“路线”,这个旧名和“别名“是同一个概念。与新的”别名“相比,基于配置文件的语法的老”路线“是过时的)对OSVR插件设备,他们的设备描述符通常设置一个在设备节点下的/semantic树型结构,也可能包括一个automaticAliases部分为全球别名路径提供建议。除非你已经添加了这些在步骤1中提供的设备描述符的功能,你必须在配置文件中设置适当的别名。

  常见的路径包括:

  · /me/head -头跟踪

  · /me/hands/left -用于一个持在左手的手部跟踪器或一个设备(操作杆等)。

  · /me/hands/right -用于一个持在右手的手部跟踪器或一个设备(操作杆等)。

  这里还有一个习惯:当输入端与追踪器非常关联时,设置“控制器”输入(按钮、触发器、操纵杆)下/controller,并进一步/controller/left和/controller/right。更少的具体路径是“著名的”在这部分的路树,你可以创建和使用其他语义路径别名(/行动/跳/控制器/)别名在您的应用程序和配置。

  别名,如外部设备,是与在配置文件中JSON对象配置在一起的。摘录如下:

  这个例子显示了两个不同的语法。最简单的,应用于配合OSVR全局坐标系统,用于模拟和按键的设备,包括用于追踪的设备,不需要任何转换,只需路径的别名去创建为键,路径和别名作为字符串值。上面的例子中的前两个条就是这种形式。

  第二个语法(第二个条目的前两条)是更复杂的,因为它使为追踪数据转换树型的应用成为可能。键,如前所说,是别名路径去创建。然而,在这种情况下,该值是一个JSON对象。这个对象可以有任意级别的嵌套,每个内部级别都由键child特定。最后一级必须以一个child子键终止,子键是一个字符串:别名转换和指向的路径。每个级别包含变换对象(如changeBasis和rotate,在这里所示)-看其他样本文件和/或单独的文件支持的转换。

  在所有情况下,别名终止在您在步骤1中设置的设备路径下的路径上。语法是/devicename/interfacename/sensornumber(或偶尔所有传感器来说是/devicename/interfacename)。当然,如果您设置了一个包含语义路径的设备描述符,您可以在这一步中引用那些,而不是原始设备路径。

  验证你的结果

  在这一点上,你可以再次用配置文件运行OSVR_server。服务器的输出不会发生变化,但运行OSVR_print_tree输出将反映你的别名构建的路径树的变化。对于上面的别名例子,你会看到这样的:

  有一些变化需要注意。首先,你会看到现在我们为AliasElement条目配置过的每一个别名,和OSVR_print_tree默认设置使显示每个别名目标成为可能,无论是字符串还是JSON转换的各种版本。此外,每个路径代表一个传感器,是一个有效的目标,此目标你现在已明确提到的别名,作为SensorElement。当处理别名时,这些传感器要素会自动生成。如果当你尝试目标时你没有看到SensorElement,那么你可能在指定了相应的别名时犯了一个错误,。

  作为对任何你已设置别名的追踪器进一步的测试,使用OSVR追踪查看器OSVR Tracker Viewer应用程序(从核心/服务器分别分布-点击这里下载的二进制追踪查看器click here for binary downloads for the tracker viewer)。用-h命令行参数运行它,看看如何指定路径树中你想可视化的路径。此应用在标准的OSVR坐标系统打开,这样你就可以验证您的转换是正确的。