TL;DR: I managed to get SteamVR tracking data in unity (position and rotation) from a VIVE tracker / SteamVR Controller without the need of the Head Mounted Display (HMD) being connected. It runs on my 2012 mbp and I’m pretty happy with the results.

Long version :

For the VR project I’m working on I only need the pose on tracked objects from SteamVR. I’m not using a Head Mounted Display (HMD) because 1. I don’t need it and 2. It wouldn’t run on my 2012 mbp.

I followed the tutorials proposed here and here (which are basically the same) but unfortunately I couldn’t manage to make them work with Unity, even though I managed to get to the state where SteamVR status icon said “NOT READY” (which according to them is fine for their tutorials), it wasn’t enough for unity to be able to initialize trackers and get data.

Turns out you need to tell SteamVR in the config files to not only set:

"requireHmd" : false 1 "requireHmd" : false

But you also need to force SteamVR to load a null driver (headless driver) and let SteamVR be able to load more than one driver.

In order to do this and be 100% sure where are your config files being loaded the best way to do it is to check for the log files, specifically “vrserver.txt”

Finding the log files for SteamVR.

In order to find where does SteamVR stores the config files, just start steam VR, and then click on Settings -> Developer and then click on “Set log directory“. With this you can now where SteamVR stores vrserver.txt log.

The vrserver.txt log is really important because it tells where and which .vrsettings files loads!. To my surprise; I thought I was only loading one custom file I made, but turns out that’s not the case, there where 5 files in different places being loaded!

Diving into vrserver.txt in SteamVR

Now that we know where is the vrserver.txt log file we can proceed to open it. Fear not!, it contains a lot of stuff but we are looking for a few lines specifically in my case looked like this:

[Settings] Load Default Json Settings from /Users/naruse/Library/Application Support/Steam/SteamApps/common/SteamVR/SteamVR.app/Contents/MacOS/runtime/resources/settings/default.vrsettings [Settings] Load Default Json Settings from /Users/naruse/Library/Application Support/Steam/SteamApps/common/SteamVR/SteamVR.app/Contents/MacOS/runtime/drivers/htc/resources/settings/default.vrsettings [Settings] Load Default Json Settings from /Users/naruse/Library/Application Support/Steam/SteamApps/common/SteamVR/SteamVR.app/Contents/MacOS/runtime/drivers/lighthouse/resources/settings/default.vrsettings [Settings] Load Default Json Settings from /Users/naruse/Library/Application Support/Steam/SteamApps/common/SteamVR/SteamVR.app/Contents/MacOS/runtime/drivers/null/resources/settings/default.vrsettings [Settings] Load Json Settings from /Users/naruse/Library/Application Support/Steam/config/steamvr.vrsettings 1 2 3 4 5 [ Settings ] Load Default Json Settings from / Users / naruse / Library / Application Support / Steam / SteamApps / common / SteamVR / SteamVR . app / Contents / MacOS / runtime / resources / settings / default . vrsettings [ Settings ] Load Default Json Settings from / Users / naruse / Library / Application Support / Steam / SteamApps / common / SteamVR / SteamVR . app / Contents / MacOS / runtime / drivers / htc / resources / settings / default . vrsettings [ Settings ] Load Default Json Settings from / Users / naruse / Library / Application Support / Steam / SteamApps / common / SteamVR / SteamVR . app / Contents / MacOS / runtime / drivers / lighthouse / resources / settings / default . vrsettings [ Settings ] Load Default Json Settings from / Users / naruse / Library / Application Support / Steam / SteamApps / common / SteamVR / SteamVR . app / Contents / MacOS / runtime / drivers / null / resources / settings / default . vrsettings [ Settings ] Load Json Settings from / Users / naruse / Library / Application Support / Steam / config / steamvr . vrsettings

Here basically says where does SteamVR loads the *.vrsettings files to set up SteamVR.

Now basically what we need to do is open each file and checkout where in all those files the “requireHmd“, “activateMultipleDrivers” and “forcedDriver” vars are set.

Wherever you find them, set their values to:

"requireHmd" : false "forcedDriver" : "null" "activateMultipleDrivers" : true 1 2 3 "requireHmd" : false "forcedDriver" : "null" "activateMultipleDrivers" : true

If you cannot find them in any place, just add them.

So what we are doing here is forcing SteamVR to load the null (headless) driver.

The null driver looks like this:

{ "driver_null" : { "enable" : true, "serialNumber" : "Null Serial Number", "modelNumber" : "Null Model Number", "windowX" : 0, "windowY" : 0, "windowWidth" : 2160, "windowHeight" : 1200, "renderWidth" : 1512, "renderHeight" : 1680, "secondsFromVsyncToPhotons" : 0.01111111, "displayFrequency" : 90.0 } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 { "driver_null" : { "enable" : true , "serialNumber" : "Null Serial Number" , "modelNumber" : "Null Model Number" , "windowX" : 0 , "windowY" : 0 , "windowWidth" : 2160 , "windowHeight" : 1200 , "renderWidth" : 1512 , "renderHeight" : 1680 , "secondsFromVsyncToPhotons" : 0.01111111 , "displayFrequency" : 90.0 } }

You also need to set the “enable” var in the null driver to true to make it work.

Here you can set a bunch of settings depending on how you want to behave. “driver_null” is a non-physical HMD, here you can add any features you want to it.

Now, close SteamVR and open it again, now, instead of having the “Not Ready” label when it starts, you should see this:

In any case you don’t see this, check again the vrsettings.txt log file and read it, it will tell you if you made a mistake in the JSON files (*.vrsettings) you just modified.

Getting tracking data in Unity!

After you have done this you should be golden to try it out in Unity3D, just create a simple project, drag and drop the SteamVR camera rig prefab and set the target eye to “None”

Notice how in the log the loaded driver is “connected to null: Null Serial Number”, that means we successfully connected to the headless driver.

It worked for me in OSX, but it should also work for you following the same workflow in Windows / Linux, if you have issues, just drop me a line I could take a look at your settings and maybe help out 😉