支持 SteamVR 的开源 VR 头戴设备
我是 Maxim xyz,当我和我最好的朋友 Gabriel Combe 15 岁时,因为买不起 VR 头戴设备,我们自己动手制作了一个。
5 年后:这个头戴设备成为了 Relativty。
- 完全开源 - 硬件、软件、固件。
- 支持 Steam VR。
- 原生显示 2K 分辨率,120FPS。
- 兼容 Arduino。
- 实验性的全身追踪
本仓库作为构建指南,要了解更多关于头戴设备的信息,请访问 Relativty.com
为黑客而生
Relativty 不是消费级产品。我们在卧室里用烙铁和 3D 打印机制作了 Relativty,我们希望你也能自己动手制作。
Relativty 本质上是一个支持 3 自由度 (3-DoF) 的 VR 头戴设备,没有内置控制器支持,设计用于配合 SteamVR 使用。 这可能会限制其在需要指节式 VR 控制器的游戏中的实用性。 如果你正在寻找一个功能更全面的 DIY VR 项目,包括 6 自由度追踪和控制器支持,我们推荐你查看 HadesVR。
无论你是在制作 Relativty 还是 HadesVR,或者只是想加入我们的社区和大家交流,我们邀请你加入 Discord 上的 Relativty 公会。
这里是 DIY/开源 VR 社区学习、成长、分享知识和寻求帮助的地方。
开始构建 Relativty
构建硬件
1. 当前推荐构建 - 截至 2023 年 5 月
1.1 简介
这是一个更新的构建指南,旨在帮助最近发现 Relativty 的人。它解释了如何构建最小功能产品,该产品可以根据个人喜好进行进一步改进和修改。原始构建指南仍可在下方找到。
按照本指南构建 Relativty 头戴设备需要对电子学和 Arduino 板编程有基本的了解。
VR 头戴设备是一个复杂的系统,如果在构建过程中遇到困难,可能很难确定哪里出了问题。
如果遇到任何问题,欢迎加入我们的 Discord 寻求帮助,我们很乐意协助。
1.2 电子部件
需要以下电子元件:
- 支持 USB HID 的 ATmega32U4 微控制器 (MCU),例如 Arduino Pro Micro
- 受 FastIMU 库支持的惯性测量单元 (IMU)
- 一个小型、高分辨率和高刷新率的 PC 显示屏 + 驱动板。HadesVR 文档的这一部分列出了一些可供选择的不错选项。需要注意的是,这些显示屏连接到驱动板,然后驱动板再连接到你的电脑。如果可能的话,务必将驱动板和显示屏作为一套购买,以确保它们相互兼容。如果你对显示屏有进一步的问题,欢迎加入 Discord 上的 Relativty 公会。
VR 显示屏注意事项:
- 显示屏不连接到微控制器,它只连接到运行 VR 应用程序的电脑。
- 理论上,任何 PC 显示器/显示屏都可以配置为 Relativty 使用的显示屏。因此,你可以先在 PC 显示器上测试你的构建,确保它能正常工作,然后再决定是否花大量资金购买镜头、显示屏和其他部件。
- 高性能、小型化的显示屏价格昂贵,而且通常非常脆弱。请小心处理!:)
1.2.1 连接 IMU 和 MCU
IMU 需要连接到 MCU 以获得电源和进行通信。 MCU通过USB连接到您的计算机,将IMU读数发送到SteamVR。
对于Arduino Pro Micro,您需要连接以下引脚:
Pro Micro IMU
VCC -> VCC
GND -> GND
SDA(2号引脚) -> SDA
SCL(3号引脚) -> SCL
如果您使用不同的MCU,SDA和SCL引脚可能映射到不同的引脚号。
另外,请确保MCU的VCC与IMU的额定工作电压兼容。
为电子元件供应不正确的电压可能会导致损坏。
MCU本身只需通过USB端口连接到您的计算机即可。
1.2.2 连接显示屏
如前所述,任何与个人电脑兼容的显示器都应该能够作为您的VR显示器使用。
如果您使用推荐的或类似的通过micro-USB或其他USB标准供电的组件,可能会遇到电路板无法开机的情况。这可能是因为您使用的micro-USB线太长(导致电压下降太多,无法启动电路板),或者电路板无法开机是因为计算机端连接的USB端口无法提供足够的功率。在这种情况下,您可能需要尝试计算机上的不同端口或有源USB集线器。
1.3 机械构建
机械构建需要以下部件:
- 外壳 - Relativty_Mechanical_build文件夹中提供了3D打印模型的.STL文件。
- 镜片 - 对于构建3D打印头戴设备,需要直径40mm/焦距50mm的镜片。您通常可以在速卖通或类似平台上找到这些。
- 头带和面部接触区 - 例如HTC Vive的替换头带+泡沫。您通常可以在速卖通或类似平台上找到这些。
如果您无法进行3D打印,也可以(而且更简单)使用Android VR手机壳,并对其进行改装以适配您的屏幕,并能够将IMU和MCU安装到上面。
这种方法的优点是您可以一次性获得所有东西,通常还包括IPD调节功能。
1.4 软件设置
1.4.1 简介
Relativty依赖两个主要软件组件:
- Arduino固件
- SteamVR驱动程序
由于系统设计为与SteamVR配合使用,您需要在计算机上安装Steam并下载SteamVR。
1.4.2 给MCU编程
如前所述,我们建议您使用Arduino Pro Micro和FastIMU库支持的IMU。 FastIMU是一个很棒的软件包,支持许多常用的IMU,并附带了一个预先编写好的、可与Relativty配合使用的Arduino草图。
首先,您需要安装Arduino IDE并通过USB连接器将MCU连接到计算机。
一旦连接并验证Arduino IDE可以与MCU正常工作,请从库管理器下载FastIMU。
按照1.2.1节中的建议连接IMU。
在Arduino IDE中找到Examples/Fastimu/Calibrated_relativty草图:
最后,将其上传到MCU。
FastIMU还包含一个内置的校准工具,可以将校准数据存储在IMU的EEPROM中。
校准IMU可能有助于减少使用Relativty时可能遇到的传感器漂移。
将Calibrated_relativty草图上传到IMU后,您可以打开Arduino串行监视器来启动校准序列:
注意:您只需执行一次,但请确保按照串行监视器中给出的说明操作。
1.4.3 安装SteamVR驱动程序
要安装Relativty SteamVR驱动程序:
- 下载master仓库
- 在Relativty-master中找到Relativty_Driver\Relativty文件夹,将其复制到SteamVR安装目录的drivers文件夹中。
1.4.4 配置SteamVR驱动程序
复制驱动程序文件后,是时候配置驱动程序以适配你的设置和计算机了。
在drivers\Relativty\resources\settings目录下,应该有一个名为default.vrsettings的文件。
这是驱动程序的配置文件。
有几处需要你修改。
配置驱动程序与MCU通信
假设你使用Arduino Pro Micro和FastIMU库:
在Relativty_hmd段中找到这些值:
- hmdPid
- hmdVid
- hmdIMUdmpPackets
并按如下方式更改值:
"hmdPid" : 32823,
"hmdVid": 9025,
"hmdIMUdmpPackets": false,
如果你使用不同的MCU,需要找出USB PID和VID值。
最简单的方法是将其通过USB连接到计算机,然后在Arduino IDE中查看。
在菜单栏中,选择工具/获取开发板信息:
获取PID和VID值,并使用十六进制转换器将其转换为十进制。
然后将转换后的值填入default.vrsettings中的hmdPid和hmdVid。
配置显示设置
现在让我们配置驱动程序以适配你的显示器。
显示器的配置变量在Relativty_extendedDisplay段中:
VR视口窗口的原点:
"windowX" : 3440,
"windowY" : 0,
VR视口的实际大小:
"windowWidth" : 1920,
"windowHeight" : 1080,
VR视口的渲染分辨率 - 通常应与大小相同:
"renderWidth" : 1920,
"renderHeight" : 1080,
以及一些其他设置:
"DistortionK1" : 0.4,
"DistortionK2" : 0.5,
"ZoomWidth" : 1,
"ZoomHeight" : 1,
"EyeGapOffsetPx" : 0,
"IsDisplayRealDisplay" : true,
"IsDisplayOnDesktop" : true
如果原点和大小配置不正确,驱动程序将崩溃,SteamVR将无法显示任何内容!
因此,我们需要了解SteamVR使用的显示坐标系统。
Windows始终假定其中一个连接的显示器为主显示器。
你可以在显示设置中验证哪一个是主显示器。
你可以用鼠标选择每个显示器。"将此显示器设为主显示器"复选框呈灰色的那个就是你的主显示器。
本指南假设所有显示器的上边缘在Windows显示设置中对齐(如屏幕截图所示)
因此,在另一个非主显示器上勾选相同的选项将使其成为主显示器。
主显示器的左上角是SteamVR显示坐标系统的原点。
为了能够告诉SteamVR在显示器上绘制VR视口的位置,你需要确保理解这一点,并因此能够确定视口的正确原点。
例如,在这样的设置中:
因为"1"屏幕是主屏幕,而"3"屏幕是VR显示器,所以原点(0,0坐标)位于"1"屏幕的左上角。 这个屏幕的分辨率是3440x1440。
这意味着它在X轴上占据了从0到3439的空间,下一个屏幕从3440点开始。
因此,在这种情况下,正确的windowX和windowY值为:
"windowX" : 3440,
"windowY" : 0,
如果"2"号屏幕是VR显示器(而"1"号仍是主显示器),正确的值应该是:
"windowX" : -1920,
"windowY" : 0,
因为"2"号屏幕的坐标占据了原点另一侧的空间。
对于windowWidth、windowHeight、renderWidth、renderHeight,只需设置为VR显示器的原生分辨率。
设置完成后,保存设置文件。
现在你应该可以启动SteamVR了。
如果一切设置正确,你应该直接进入VR全息甲板区域:
如果你在构建过程中遇到任何问题:
- 打开SteamVR Web控制台并复制整个日志文件
- 加入Relativty的Discord群组,告诉我们你遇到的问题,并在聊天中上传日志文件。
如果你的VR窗口在点击后消失:
打开Windows PowerShell并将这些命令粘贴到命令行中,然后按回车:
get-process vrcompositor | stop-process -Force;cd "C:\Program Files (x86)\Steam\steamapps\common\SteamVR\bin\win64";.\vrcompositor.exe
之后VRCompositor应该保持稳定,所以你每次会话只需要执行一次。
2. 旧版构建
硬件基于Relativty主板,包括Atmel SAM3X8E ARM Cortex-M3处理器,并使用MPU-6050作为其IMU。 或者,任何支持ArduinoCore并连接到MPU-6050/MPU-9250的处理器都可以用作Relativty的硬件。下面将解释这两种方法。
构建Relativty主板
PCB制造
我们首先从裸PCB开始。
可以在jlcpcb等网站上以约4美元的价格制造和购买。
你需要提供Gerber文件夹Relativty_Electronics_build/GerberFiles.zip
,其中描述了电路板的形状。
组装
将元件焊接到裸PCB上。
你需要购买以下两个BOM之一中列出的元件,具体取决于可用性:
Relativty_Electronics_build/Assembly/jlcpcb.com_motherboard_BOM.csv
Relativty_Electronics_build/Assembly/motherboard_BOM.xlsx
这些元件在PCB上的放置位置在文件Relativty_Electronics_source/motherboard.brd
中描述,可以用Eagle打开。
使用Arduino
Relativty主板的替代方案是使用Arduino Due并将其连接到MPU-6050。
5V -> VCC
GND -> GND
SDA(20) -> SDA
SCL(21) -> SCL
PIN 2 -> INT
如果你使用提供的替代固件的MPU-9250,引脚分布为:
5V -> VCC
GND -> GND
SDA(20) -> SDA
SCL(21) -> SCL
然后按下Arduino Due上的ERASE
和RESET
按钮,你就可以安装Relativty固件了。
安装Relativty固件
现在你需要在Arduino IDE中安装Relativty板。 要做到这一点,复制以下JSON URL: https://raw.githubusercontent.com/relativty/Relativty/master/Relativty_Firmware/package_Relativty_board_index.json 并打开Arduino IDE
在Arduino中,点击文件然后选择首选项:
- 如果你使用的是Relativty PCB,将JSON URL添加到"附加开发板管理器"文本框中。
- 转到"工具 > 开发板 > 开发板管理器",你应该能看到Relativty开发板,点击安装。
- 重启Arduino IDE,在工具 > 开发板下选择Relativty。
- 现在你可以打开
Relativty_Firmware/firmware/firmware.ino
并上传到你的开发板。
如果你使用的是其他开发板,例如Arduino Due:
- 将
Relativty_Firmware\Relativty_board\
的内容安装到Arduino IDE - 如果使用MPU-6050,使用
Relativty_Firmware/firmware/firmware.ino
- 如果使用MPU-9250,使用
Relativty_Firmware\MP9250-HID\MP9250-HID\MP9250-HID.ino
制作机械部件
组装头显
所有3D打印所需的文件都可以在Relativty_Mechanical_build
文件夹中找到,组装头显所需的螺丝列在screws_BOM.xlsx
中。
我们使用了来自阿里巴巴的零件:
头显的屏幕
Relativty头显运行双屏2K 120FPS,但由于Relativty的开放性,你可以搭配任何屏幕。
我们的型号可以在阿里巴巴上找到,但根据卖家不同,类似的屏幕价格从150美元到190美元不等。你需要寻找并可能等待合适的卖家以合适的价格获得显示器(或批量购买)。
这是我们使用的型号。
设置软件
为SteamVR安装Relativty驱动程序
Relativty驱动程序包含在Relativty_Driver/Relativty
文件夹中。
⚠️ 你需要通过编辑JSON文件Relativty_Driver/Relativty/resources/settings/default.vrsettings
来设置它
如果你不使用Relativty PCB,你需要更改以下内容:
"hmdPid" : 9,
"hmdVid": 4617,
这些是USB HID设备的唯一供应商和产品标识符(pid/vid)
如果你使用的是Arduino Due,正确的值应该是:
"hmdPid" : 62,
"hmdVid" : 9025,
如果你使用的是其他开发板,获取正确值的过程如下:
-
插入你的开发板
-
在Arduino IDE中选择你的开发板,点击工具/获取开发板信息。你会看到类似这样的信息:
BN: Arduino Due (Native USB Port)
VID: 2341
PID: 003e
SN: HIDHB
-
记下VID和PID数字。这些是十六进制值。
要将它们应用到配置中,需要将它们转换为整数。
如果你不确定如何操作,网上有很多可用的转换器。
比如: https://www.rapidtables.com/convert/number/hex-to-decimal.html
-
将你的hmdPid和hmdVid值更改为转换后的值。
接下来,你需要设置显示坐标和分辨率。
首先,你应该将HMD的显示设置为扩展你的桌面的辅助屏幕,
与主显示器的右上角对齐。
在配置文件的"Relativty_extendedDisplay"段中,找到并设置以下内容:
"windowX" : *你的主屏幕分辨率宽度*,
"windowY" : 0,
"windowWidth" : *HMD的原生分辨率宽度*,
"windowHeight" : *HMD的原生分辨率高度*,
"renderWidth":HMD 原生分辨率宽度, "renderHeight":HMD 原生分辨率高度,
在此段底部:
"IsDisplayRealDisplay":true, "IsDisplayOnDesktop":true
确保不要删除任何","符号,因为这会破坏配置。
配置中只有最后一项不应有","符号。
如果上述设置因任何原因不适合你,请尝试:
将HMD显示器设置为主显示器的镜像显示。
按如下方式更改配置:
"windowX":0, "windowY":0, "windowWidth":HMD 原生分辨率宽度, "windowHeight":HMD 原生分辨率高度, "renderWidth":HMD 原生分辨率宽度, "renderHeight":HMD 原生分辨率高度,
"IsDisplayRealDisplay":false, "IsDisplayOnDesktop":true
⚠️ 请注意,这可能导致VR窗口无法捕获键盘/鼠标输入,如果你的游戏需要它,可能会变得无法玩。
你还可以在配置文件中调整IPD(瞳距):
在"Relativty_hmd"段中找到并调整:
"IPDmeters":0.063,
你还可以通过更改以下内容来调整镜头畸变校正:
"DistortionK1":0.4, "DistortionK2":0.5,
现在你可以安装Relativty驱动程序:
- 找到你的`vrpathreg.exe`程序,通常位于`C:/Steam/steamapps/common/SteamVR/bin/win64/vrpathreg.exe`
- 然后打开Windows命令提示符并运行以下命令:
`cd C:/Steam/steamapps/common/SteamVR/bin/win64
vrpathreg.exe`
假设你的`Relativty_Driver/Relativty`驱动程序文件夹位于:
`C:/code/Relativty_Driver/Relativty`
- 运行`vrpathreg adddriver C:/code/Relativty_Driver/Relativty`
Relativty驱动程序现已安装。你可以随时通过运行以下命令卸载它:
- `vrpathreg removedriver C:/code/Relativty_Driver/Relativty`
#### 设置实验性3D跟踪
跟踪仍处于非常实验性的阶段,由于使用了CUDA,只能在NVIDIA GPU上运行。跟踪仅使用视频输入和经过训练的人工神经网络AI来估计3D身体位置。
这种方法在精度或动作自由度上远不及专用传感器,但我们相信模型可以经过训练和改进,提高数个数量级。
首先,你需要将网络摄像头连接到计算机,并安装Python 3.8.4,选择将其添加到路径的选项。然后安装`PyTorch`,你可以通过运行以下命令来完成:
`python -m pip install torch===1.6.0 torchvision===0.7.0 -f https://download.pytorch.org/whl/torch_stable.html`
然后继续安装`CUDA Toolkit 11.0`。
接下来,你需要在https://github.com/relativty/Relativty/releases下载`PYTHONPATH`文件夹,并将其位置添加到`JSON Relativty_Driver/Relativty/resources/settings/default.vrsettings`中的`PyPath`。
将`tracking`设置为1。跟踪现在已开启,可以随时通过将`tracking`设置为0来关闭。跟踪也可以根据你的摄像头进行校准,这可以通过调整`scalesCoordinateMeter`和`offsetCoordinate`来完成。`scalesCoordinateMeter`对应于在给定轴上移动1米时,AI计算的归一化后该轴坐标的增量。
**注意:**如果你计划使用mpu9250固件,别忘了在驱动程序中切换到它,方法是将`hmdIMUdmpPackets`设置为`false`:
`"hmdIMUdmpPackets":false,`
## 最后步骤
现在一切都设置好了,可以开始玩游戏了。
要开始使用Relativty:
- 将头戴设备放在平坦表面上,前面板朝下
- 插入头戴设备。
几秒钟后它会自动校准。
现在你可以运行任何SteamVR游戏了!