Automatic HMD / ART-Body Intercalibration

The automatic HMD target intercalibration only applies to system with ART optical tracking. For Optitrack systems refer to the manual procedure here.


Problem: Adjusting rigid bodies in ART DTrack to fit with HMD eye coordinate system is time-consuming and the result might not be sufficiently accurate.

Solution: Most HMDs are pre-calibrated for SteamVR Lighthouse tracking. We introduce a tool that allows the calibration of a DTrack rigid body against Lighthouse tracking data. In this way a body adjustment with equivalent quality as the built-in Lighthouse calibration can be achieved.

Calibration Procedure

Download the calibration tool from this link.

Arrange a tracking setup where the Lighthouse Base Stations and ART cameras can both see the HMD. ART tracking and Lighthouses need to be turned on simultaneously. Lighthouse tracking can fail or become unreliable if the ART cameras are too close. An example setup is shown schematically in the image below:

Save Body File

Create a rigid body for the HMD in DTrack. The default orientation is OK. Save the rigid body to a file (e.g. standard b15.txt). Use the Tracking→ Body calibration menu in DTrack as shown in the screenshots below.

The Body Calibration will pop up. Click the “Save file(s)” button near the bottom of the window.

Select the bodies you want to save, i.e. the headset body.

Choose a place to store the body file on disk. You will need to find the file in the steps below.

Deactivate LPVR-CAD driver

In case you have LPVR already installed on your system temporarily disable it.

SteamVR HMDs

If you have a SteamVR headset (Vive Pro, Valve Index):

First go to the SteamVR Settings menu.

Make sure that the Advanced Settings slider in the lower left is set to Show. Then go to Startup / Shutdown, and to Manage Add-ons.

Here change lpvr_cad to Off. A Restart SteamVR button should appear. Use it to restart SteamVR with the LPVR-CAD driver disabled.

Varjo HMDs

If your headset is a Varjo Headset and you have already installed the LPVR driver: go to the System tab in Varjo base, select SteamVR tracking from the dropdown menu near the top

Verify that SteamVR tracking is smooth. Otherwise reduce the camera flash intensity and reduce the frequency of DTrack, also try positioning the Lighthouse base stations at the right angles to the ART cameras to minimize interference from the camera flashes.

Run the Calibration, Apply Results

Run the calibration tool from the command line as e.g. below. You may have to change some of the parameters as outlined below.

lh_art_calib.exe --port 5000 --trackedDevice 1 --bodyId 1 --bodyFile "standard b01.txt"

The flags are as following:


The Port where ART data is available (5000 if omitted)


The SteamVR device number. You can find it in the SteamVR system report (see screenshot), the headset will always be number one which is also the default if you omit this flag.


The bodyId as in the DTrack GUI (defaults to one)


The input ART body file saved in the first step above. For each of the different calibration algorithms an output is generated. E.g. for the input file ‘standard b15.txt’ in the example, the following outputs are generated:

  • 'standard b15.txt_ANDREFF.txt'

  • 'standard b15.txt_DANIILIDIS.txt'

  • 'standard b15.txt_HORAUD.txt'

  • 'standard b15.txt_PARK.txt'

  • 'standard b15.txt_TSAI.txt'

Please use the HOURAD output file as your reference in DTrack.

Once you have started the calibration tool, slowly turn the HMD into different orientations. Stop briefly at various angles to allow the application some time to calculate. The output of the program should look similar to this:

Entering SteamVR thread SteamVR started Seen first Lighthouse Seen first DTrack Added new pose for a total of 1 Added new pose for a total of 2 Added new pose for a total of 3 Added new pose for a total of 4 Added new pose for a total of 5 Added new pose for a total of 6 Added new pose for a total of 7 Added new pose for a total of 8 Added new pose for a total of 9 Added new pose for a total of 10 Trafo ANDREFF (2.725 ms): q: { "w": 0.49103332221891893, "x": 0.7380062844026215, "y": 0.44517646778122855, "z": 0.1266921986024284 } t: { "x": 0.12520467297698248, "y": -0.09627498600148687, "z": -0.17244104033968682 } Trafo DANIILIDIS (1.394 ms): q: { "w": 0.21417663057806421, "x": 0.3764478195323916, "y": 0.6434715255267607, "z": 0.6311575127650773 } t: { "x": 1.3247440707639884, "y": -0.8383919119259011, "z": 0.4059862309437135 } Trafo HORAUD (1.396 ms): q: { "w": 0.4803956695611906, "x": 0.7425409895273323, "y": 0.45038504638513427, "z": 0.12249975318867472 } t: { "x": 0.12565131465807822, "y": -0.09203906087189956, "z": -0.1784956029328849 } Trafo PARK (1.694 ms): q: { "w": 0.4916130479133607, "x": 0.7377514760583256, "y": 0.4448744186543404, "z": 0.1269886700538725 } t: { "x": 0.12674354907942934, "y": -0.09184751263383542, "z": -0.1773999147224412 } Trafo TSAI (1.072 ms): q: { "w": 0.938447539615928, "x": 0.3445367188341199, "y": 0.019253565485262854, "z": 0.01549080307584292 } t: { "x": 0.15955689770021605, "y": -0.1220802287962029, "z": -0.10712930967985748 }

The application will acquire 10 poses until a result is calculated. In this example the algorithms aside from DANIILIDIS and TSAI agree to several digits, so we can be fairly confident in the result. DANIILIDIS and TSAI usually disagree with the others and can be disregarded.

Import the calibration output file xxx_HOURAD.txt into the body administration of DTrack. A correctly aligned rigid body will be the result. Please verify it in DTrack’s body administration window.

Don’t forget to reenable the LPVR driver


After loading the file, please do a re-calibration (using the recalibration functionality of DTrack’s body setup dialog). The body should now be accurately adjusted to provide a perfectly realistic VR impression to the user.

Load body calibration file and start re-calibration.

Move target in front of ART cameras to perform body calibration.

The resulting calibration will be very close to the original body file while accommodating for any slight shifts of the marker arrangement from the base configuration.

Hand Controller

The procedure described above also works for the hand controllers. Below screenshots show a marker arrangement on a hand controller together with the calibrated ART body from roughly the same perspective.