Skip to main content
Up and Coming
April 30, 2013

Will positional head tracking be activated in the dev kit?

Hi everyone. If anyone can answer this question it would be greatly appreciated. I know that prior to release I watched an interview with Nate where he stated that positional head tracking would not be ready for when the dev kits started shipping. I did however notice that with the latest release of the 0.2.1 SDK that there seems to have been some progress with correcting some of the issues (yaw drift) that was preventing them from completing development with positional head tracking. My quedtion is will positional head tracking ever be to a point where it is functional in the current dev kits? Anyone with insight into this please feel free to give your two cents. And if someone from Oculus wants to chime in that would be great!

    74 replies

    Inspiring
    March 13, 2014
    "Bakkar90" wrote:
    @jherico is this reply to me ? or is it to the forum in general.

    In case it is to me, i am aware of the math required to get the position from acceleration.

    Anyways, i have been reading the accelerometer and i am intergrating the data twice but the distance i get it quite small compared to what i have moved.

    For example i place the IMU on a chair and pushed it around for 2.5 meters but all i got is 20cm.


    So I wrote up a pretty primitive application to try to use the acceleration data to track position.

    The output, with my Rift sitting on a shelf, looks like this:

    Time 001000 Velocity: -0.014 0.066 -0.035 Position: -0.007 0.033 -0.017
    Time 002000 Velocity: -0.028 0.135 -0.075 Position: -0.028 0.132 -0.071
    Time 003000 Velocity: -0.041 0.205 -0.120 Position: -0.063 0.303 -0.170
    Time 004000 Velocity: -0.051 0.272 -0.154 Position: -0.109 0.541 -0.306
    Time 005000 Velocity: -0.059 0.341 -0.187 Position: -0.164 0.846 -0.476
    Time 006000 Velocity: -0.063 0.409 -0.209 Position: -0.224 1.221 -0.673
    Time 007000 Velocity: -0.071 0.478 -0.226 Position: -0.292 1.668 -0.894
    Time 008000 Velocity: -0.077 0.544 -0.239 Position: -0.366 2.180 -1.127
    Time 009000 Velocity: -0.081 0.613 -0.250 Position: -0.444 2.757 -1.370
    Time 010000 Velocity: -0.080 0.679 -0.255 Position: -0.524 3.397 -1.620


    In 10 seconds, with just the jitter in the acceleration data from a device at rest, drifted by several meters.
    Brad Davis - Developer for High Fidelity Co-author of Oculus Rift in Action
    Up and Coming
    March 13, 2014
    "jherico" wrote:
    "Bakkar90" wrote:
    @jherico is this reply to me ? or is it to the forum in general.

    In case it is to me, i am aware of the math required to get the position from acceleration.

    Anyways, i have been reading the accelerometer and i am intergrating the data twice but the distance i get it quite small compared to what i have moved.

    For example i place the IMU on a chair and pushed it around for 2.5 meters but all i got is 20cm.


    So I wrote up a pretty primitive application to try to use the acceleration data to track position.

    The output, with my Rift sitting on a shelf, looks like this:

    Time 001000 Velocity: -0.014 0.066 -0.035 Position: -0.007 0.033 -0.017
    Time 002000 Velocity: -0.028 0.135 -0.075 Position: -0.028 0.132 -0.071
    Time 003000 Velocity: -0.041 0.205 -0.120 Position: -0.063 0.303 -0.170
    Time 004000 Velocity: -0.051 0.272 -0.154 Position: -0.109 0.541 -0.306
    Time 005000 Velocity: -0.059 0.341 -0.187 Position: -0.164 0.846 -0.476
    Time 006000 Velocity: -0.063 0.409 -0.209 Position: -0.224 1.221 -0.673
    Time 007000 Velocity: -0.071 0.478 -0.226 Position: -0.292 1.668 -0.894
    Time 008000 Velocity: -0.077 0.544 -0.239 Position: -0.366 2.180 -1.127
    Time 009000 Velocity: -0.081 0.613 -0.250 Position: -0.444 2.757 -1.370
    Time 010000 Velocity: -0.080 0.679 -0.255 Position: -0.524 3.397 -1.620


    In 10 seconds, with just the jitter in the acceleration data from a device at rest, drifted by several meters.

    You need hysteresis (i.e. simulated friction) to prevent that drift by calibrating the IMU range and centering for each axis and by removing the LSB noise bits. Averaging out the noise bits increases latency, so better to just truncate it and/or force a minimum speed threshold before allowing change. Also, force velocity to zero (thereby freezing the position) when the measured velocity is too low (buried in noise). This is essentially what is done when foot-mounting an IMU. Head tracking requires a fixed posterior (i.e. seated) and relatively accurate skeletal modelling (back and neck), preferrably tuned to the actual wearer through a calibration procedure.

    Any drift measured while the Rift sits on a shelf is just noise, so should be truncated below the minimum velocity threshold, whether 10 seconds or 10 hours... And of course, consistent drift means it needs calibration (somewhat temperature sensitive)... Technically, it should recalibrate any time it is detected as stationary.

    Very slow actual motion is not allowed, but a user can be trained to use it in a useful manner...
    This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
    kojack
    Honored Contributor
    March 13, 2014
    Plus the program used a gravity of 9.78 instead of measuring the real gravity, which is why the vertical drift was larger.
    Author: Oculus Monitor , Auto Oculus Touch , Forum Dark Mode , Phantom Touch Remover , X-Plane Fixer Hardware: Threadripper 1950x, MSI Gaming Trio 2080TI, Asrock X399 Taich Headsets: Wrap 1200VR, DK1, DK2, CV1, Rift-S, GearVR, Go, Quest, Quest 2, Reverb G2, Quest 3
    Inspiring
    March 13, 2014
    "kojack" wrote:
    Plus the program used a gravity of 9.78 instead of measuring the real gravity, which is why the vertical drift was larger.


    You can measure the gravity all you like. Wikipedia says that surface gravity in Seattle should actually be 9.811, but in fact if I measure the length of the acceleration vector, again, while the Rift is at rest, you get this output:

    Time 001000           Gravity: 9.666           Velocity: -0.018 -0.084 0.025           Position: -0.009 -0.043 0.013 
    Time 002000 Gravity: 9.728 Velocity: -0.031 -0.165 0.040 Position: -0.034 -0.168 0.046
    Time 003000 Gravity: 9.812 Velocity: -0.042 -0.247 0.051 Position: -0.070 -0.375 0.092
    Time 004000 Gravity: 9.769 Velocity: -0.050 -0.330 0.061 Position: -0.115 -0.662 0.148
    Time 005000 Gravity: 9.765 Velocity: -0.053 -0.417 0.066 Position: -0.167 -1.036 0.211
    Time 006000 Gravity: 9.760 Velocity: -0.057 -0.503 0.070 Position: -0.222 -1.498 0.280
    Time 007000 Gravity: 9.676 Velocity: -0.056 -0.592 0.074 Position: -0.279 -2.048 0.353
    Time 008000 Gravity: 9.660 Velocity: -0.057 -0.679 0.077 Position: -0.335 -2.683 0.428
    Time 009016 Gravity: 9.699 Velocity: -0.054 -0.768 0.077 Position: -0.390 -3.407 0.506
    Time 010016 Gravity: 9.702 Velocity: -0.051 -0.852 0.076 Position: -0.442 -4.222 0.584


    The rotation sensor is far less subject to jitter.


    Rotation: 0.0006 -0.0017 -0.0017
    Accel: 0.0723 0.1820 9.7323


    The Rift is sitting with it's face down, hence the Z acceleration, but I can watch the X acceleration waver between positive and negative values, sometimes almost hitting over 7cm/sec^2. That's pretty dirty data. The rotation sensor's drift is an order of magnitude lower. This is probably why the acceleration data is used for exactly one purpose in the sensor fusion, determining the direction of gravity.
    Brad Davis - Developer for High Fidelity Co-author of Oculus Rift in Action