OpenHMD update

A while ago, I wrote a post about how to build and test my Oculus CV1 tracking code in SteamVR using the SteamVR-OpenHMD driver. I have updated those instructions and moved them to – so use those if you’d like to try things out.

The pandemic continues to sap my time for OpenHMD improvements. Since my last post, I have been working on various refinements. The biggest visible improvements are:

  • Adding velocity and acceleration API to OpenHMD.
  • Rewriting the pose transformation code that maps from the IMU-centric tracking space to the device pose needed by SteamVR / apps.

Adding velocity and acceleration reporting is needed in VR apps that support throwing things. It means that throwing objects and using gravity-grab to fetch objects works in Half-Life: Alyx, making it playable now.

The rewrite to the pose transformation code fixed problems where the rotation of controller models in VR didn’t match the rotation applied in the real world. Controllers would appear attached to the wrong part of the hand, and rotate around the wrong axis. Movements feel more natural now.

Ongoing work – record and replay

My focus going forward is on fixing glitches that are caused by tracking losses or outliers. Those problems happen when the computer vision code either fails to match what the cameras see to the device LED models, or when it matches incorrectly.

Tracking failure leads to the headset view or controllers ‘flying away’ suddenly. Incorrect matching leads to controllers jumping and jittering to the wrong pose, or swapping hands. Either condition is very annoying.

Unfortunately, as the tracking has improved the remaining problems get harder to understand and there is less low-hanging fruit for improvement. Further, when the computer vision runs at 52Hz, it’s impossible to diagnose the reasons for a glitch in real time.

I’ve built a branch of OpenHMD that uses GStreamer to record the CV1 camera video, plus IMU and tracking logs into a video file.

To go with those recordings, I’ve been working on a replay and simulation tool, that uses the Godot game engine to visualise the tracking session. The goal is to show, frame-by-frame, where OpenHMD thought the cameras, headset and controllers were at each point in the session, and to be able to step back and forth through the recording.

Right now, I’m working on the simulation portion of the replay, that will use the tracking logs to recreate all the poses.

2 thoughts on “OpenHMD update”

  1. Hello Jan,

    I just wanted to see, I tried following your guide on setting up the CV1 for OpenHMD-SteamVR, and I can get into SteamVR just fine and my HMD outputs video. But the issue comes when I try to move. My headset is constantly stuck in the ground and while I can rotate, I cannot move at all. This is the same with my controllers, they can rotate around a fixed position, but they cannot move at all. I am running both of my sensors off of a USB-C 3.2 port so speed should be fine I thought. Please do let me know if there is anything you think that could be causing this issue.

    System information:
    OS: Pop OS (Ubuntu 21.04)
    32GB GDDR4-3600mHz ram
    GPU: GTX 1060
    CPU: Ryzen 3900X

    1. The headset and the controllers can’t move until the camera tracking gets a lock on their position. If it’s not getting that, there’s something wrong with the camera inputs. Double-check the USB device permissions ( and try running the OpenHMD simple example (./build/subprojects/openhmd/openhmd_simple_example) – it should print something at the start about opening sensor devices and their calibration info.

Leave a Reply

Your email address will not be published. Required fields are marked *