-
Notifications
You must be signed in to change notification settings - Fork 148
Virtual HMDs
There are several head-mounted displays that have orientation tracking using an IMU (accelerometer+gyro) but do not have positional tracking. The most common use case of this was for mobile VR using RiftCat's VRidge. Until v0.9-alpha8.4.0, PSMoveService had no official support for this. If you wanted to track a mobile headset you needed to attach a third PSMove controller to your VR headset, as shown in Chris Daley's video:
Chris Daley and others later figured out that you could attach a ping pong ball illuminated with an LED to your headset:
However, even in this case, you still needed to have a third PSMove controller hidden out of view of the camera that PSMoveService thought it was tracking, when in fact it was actually tracking the ping pong ball.
Ideally you could track the ping pong ball without having to have a third psmove controller at all since all you care about for the HMD is the tracking position and not the button data or controller IMU data (the headsets IMU data is used for orientation instead). As of v0.9-alpha8.4.0 this use case is finally officially supported.
There are two main parts to making this work. The first step is tell PSMoveService that we have a virtual HMD that we want to track. We need to tell PSMoveService that there is a Virtual HMD since it has no way to automatically know that there is a ping pong ball that it needs to track.
- Open
%appdata%\PSMoveService\HMDManagerConfig.json
- If this file doesn't exist for you, open and close PSMoveService. That should create the missing file.
- Set "virtual_hmd_count" to "1"
- Launching PSMoveService will create
%appdata%\PSMoveService\VirtualHMD__0.json
config file - Edit
%appdata%\PSMoveService\VirtualHMD__0.json
and set the "bulb_radius" to the appropriate size- 2cm for a regulation ping pong ball
- Launch the PSMoveConfig tool and select "HMD Settings"
- Assign a tracking color for your virtual HMD (yellow is good for orange ping pong balls)
- Go to the "Tracker Settings" menu and select "Calibrate HMD Tracking Colors"
- Calibrate the ping pong ball tracking on all trackers
- Select "Test Tracking Pose" for the HMD to make sure the virtual HMD is tracking correctly
- Note: Virtual HMDs always have an orientation pointed forward
- Launch the updated version your favorite tracking client API (see below)
The second part of getting virtual HMD tracking working involves routing the tracking data through FreePIE. FreePIE acts as a common middle man rerouting input device data. Other VR tracking systems can connect to FreePIE to get an HMD pose instead of having to support a bunch of different tracking systems.
PSMoveService only provides the tracking data Client API. It's up to client programs to use this client API and actually do something with the data. To get the virtual HMD tracking data to FreePIE, Elliot Hawkins wrote a simple bridge application called PSMoveFreePIEBridge that routes tracking data from PSMoveService to FreePIE. It was originally created for routing PSMove controller data to FreePIE, but has since been extended to also support the new VirtualHMD client API.
- Download and install FreePIE if you haven't already
- Download Release >=13 of PSMoveFreePIEBridge
- Launch PSMoveService (if not running already)
- Launch PSMoveFreePieBridge
- Select "1) HMD" as the option you wish to track
- Enter the HMD "Device ID" you wish to track
- This will almost always be "0" since you typically only have a single virtual HMD
- Open FreePIE
- File>Open the
freepie example script.py
that comes with PSMoveFreePieBridge
One of the more common mobile VR streaming solutions is VRidge by RiftCat. It allows you to stream the HMD video feed from a running SteamVR game to a mobile phone. In order to get headset positional tracking information to VRidge they added support for connecting to FreePIE. Once you have VRidge set up, make sure to set the tracking source to either "Phone orientation and FreeTrack position" or "FreeTrack orientation and position" in the desktop app's settings.
Chris Daley has a full setup video for this process, though this version assumes you are using a third psmove controller instead of a VirtualHMD (because it was created before the VirtualHMD feature was written):
If you have a desktop HMD that doesn't have positional tracking, like the DK1 or Deepoon E2, you can use FreePieConnector to get the head tracking data into SteamVR. It works by pulling tracking data from FreePIE and then overriding the position tracking data in an existing SteamVR HMD plugin. No complicated setup or configuration is needed once you have FreePIE setup.
The intended purpose of PSMoveSteamVRBridge is to provide support for Sony controllers (PSMove, DualShock4, and PSNavi) in SteamVR, not generic HMD tracking support. This is in part to keep PSMoveSteamVRBridge simple, but also because the maintainers of this project don't have time to support all the different headset configurations. We only have the bandwidth to provide a way to track colored bulbs and a client API.
As we have time we are always trying to improve the usability of PSMoveService. Zelmon and others have done a lot of great work to improve the the user experience, but obviously there is still plenty of work to do in this department. If you have thoughts about a UX improvement you would like to see, consider starting a conversation about it over in the PSMoveService Google group. Just understand that we do this work in our free time, so there should be no expectation that any given feature request will be implemented with any immediacy.
Alternatively, you might consider other low cost commercial tracking solutions. Recently NoloVR has released a low cost mobile and desktop PC tracking solution for SteamVR. Chris Daley has a good video debating the value proposition of this system as well as several gameplay videos showing off NoloVR.