Scripting Gyroscope Drift

Hello,

I am developing an AR application.

In this application I use a “headtracking” that I use on the camera, it allows me to be in a 360 ° environment.

As I saw on other thread some of you also have a problem of “drift”. The problem of “drifting” is only present on certain apparatus.

In order to limit it, I tried several methods but without concrete results.

Here are the several cases:

public Quaternion quat;

public Quaternion quatAfter;


void Start() {

    Input.gyro.enabled = true;

    quat = new Quaternion(change(Input.gyro.attitude.x), change(Input.gyro.attitude.y), change(Input.gyro.attitude.z), change(Input.gyro.attitude.w));

    quatAfter = quat;

}


protected void OnGUI() {

    quat.x = change(Input.gyro.attitude.x);

    quat.y = change(Input.gyro.attitude.y);

    quat.z = change(Input.gyro.attitude.z);

    quat.w = change(Input.gyro.attitude.w);


    if (testIfbouge(quat, quatAfter))

    {

       this.gameObject.transform.rotation = Quaternion.AngleAxis(90.0f, Vector3.right) * quat * Quaternion.AngleAxis(180.0f, Vector3.forward);

    }


    quatAfter = quat;

}


public bool testIfbouge(Quaternion q, Quaternion qa) {


    double marge = 0.004;


    if ((q.x - qa.x) > marge || (qa.x - q.x) > marge) {

        return true;

    }

    else if ((q.y - qa.y) > marge || (qa.y - q.y) > marge) {

        return true;

    }

    else if ((q.z - qa.z) > marge || (qa.z - q.z) > marge) {

        return true;

    }

    else if ((q.w - qa.w) > marge || (qa.w - q.w) > marge) {

        return false;   // don't mouve w

    }

    else {

        return false;

    }


}


public float change(float numb) {

    return float.Parse(numb.ToString("0.000"));

}
public Quaternion quat;

public Quaternion quatAcceleration;

public Quaternion quatGravity;


public Quaternion quatAfter;

public Quaternion quatAccelerationAfter;

public Quaternion quatGravityAfter;



void Start () {

    Input.gyro.enabled = true;

    quat = new Quaternion(change(Input.gyro.attitude.x), change(Input.gyro.attitude.y), change(Input.gyro.attitude.z), change(Input.gyro.attitude.w));

    quatAfter = quat;

}


void Update () {

    quat.x = change(Input.gyro.attitude.x);

    quat.y = change(Input.gyro.attitude.y);

    quat.z = change(Input.gyro.attitude.z);

    quat.w = change(Input.gyro.attitude.w);


    quatAcceleration.x = change(Input.acceleration.x);

    quatAcceleration.y = change(Input.acceleration.y);

    quatAcceleration.z = change(Input.acceleration.z);


    quatGravity.x = change(Input.gyro.gravity.x);

    quatGravity.y = change(Input.gyro.gravity.y);

    quatGravity.z = change(Input.gyro.gravity.z);


    if (testIfbouge(quat, quatAfter, quatAcceleration, quatAccelerationAfter, quatGravity, quatGravityAfter))

    {

       this.gameObject.transform.rotation = Quaternion.AngleAxis(90.0f, Vector3.right) * quat * Quaternion.AngleAxis(180.0f, Vector3.forward);

    }


    quatAfter = quat;

    quatAccelerationAfter = quatAcceleration;

    quatGravityAfter = quatGravity;

}




public bool testIfbouge(Quaternion q, Quaternion qa, Quaternion qACC, Quaternion qACCa, Quaternion qGrav, Quaternion qGrava)

{

    double marge = 0.004;

    double margeACC = 0.002;

    double margeGrav = 0.01;


    if (((q.x - qa.x) > marge || (qa.x - q.x) > marge) && ((qACC.x - qACCa.x) > margeACC || (qACCa.x - qACC.x) > margeACC) && ((qGrav.x - qGrava.x) > margeGrav || (qGrava.x - qGrav.x) > margeGrav))

    {

        return true;

    }

    else if (((q.y - qa.y) > marge || (qa.y - q.y) > marge) && ((qACC.y - qACCa.y) > margeACC || (qACCa.y - qACC.y) > margeACC))

    {

        return true;

    }

    else if (((q.z - qa.z) > marge || (qa.z - q.z) > marge) && ((qACC.z - qACCa.z) > margeACC || (qACCa.z - qACC.z) > margeACC))

    {

        return true;   

    }

    else if ((q.w - qa.w) > marge || (qa.w - q.w) > marge)

    {

        return false;   // don’t mouve w

    }

    else

    {

        return false;

    }


}


public float change(float numb)

{

    return float.Parse(numb.ToString("0.000"));

}
public Quaternion quatOff;



public Quaternion quat;

public Quaternion quatAfter;


void Start () {

    Input.gyro.enabled = true;

    quatOff = new Quaternion(change(Input.gyro.attitude.x), change(Input.gyro.attitude.y), change(Input.gyro.attitude.z), change(Input.gyro.attitude.w));

    this.gameObject.transform.rotation = Quaternion.AngleAxis(90.0f, Vector3.right) * quatOff * Quaternion.AngleAxis(180.0f, Vector3.forward);

}


protected void OnGUI() {

    quatGravity.x = change(Input.gyro.gravity.x);

    quatGravity.y = change(Input.gyro.gravity.y);

    quatGravity.z = change(Input.gyro.gravity.z);


    quat.x = change(Input.gyro.attitude.x);

    quat.y = change(Input.gyro.attitude.y);

    quat.z = change(Input.gyro.attitude.z);

    quat.w = change(Input.gyro.attitude.w);


    testIfbouge(quat, quatAfter, quatGravity, quatGravityAfter);

   

    quatAfter = quat;

    quatGravityAfter = quatGravity;

}



public float change(float numb) {

    return float.Parse(numb.ToString("0.000"));

}



public void testIfbouge(Quaternion qGrav, Quaternion qGrava, Quaternion qGravOFF, Quaternion qGravOFFa) {

    double margeGrav = 0.004;

    double margeGravFat = 0.05;


    float xt = (qGrav.x - qGrava.x);

    if (xt < 0) xt = xt * -1;

    float xt2 = (qGravOFF.x - qGravOFFa.x);

    if (xt2 < 0) xt2 = xt2 * -1;


    if (xt > margeGrav)  {

        if (qGrav.x < qGrava.x) {

            text2.text = " les X gyro  de gauche a droite";

            if(quatOff.x < 1 && quatOff.x > -1) quatOff.x = quatOff.x + xt;


        } else {

            text2.text = " les X gyro  de droite a gauche";

            if (quatOff.x < 1 && quatOff.x > -1) quatOff.x = quatOff.x - xt;

        }

    }


    float yt = (qGrav.y - qGrava.y);

    if (yt < 0) yt = yt * -1;

    float yt2 = (qGravOFF.y - qGravOFFa.y);

    if (yt2 < 0) yt2 = yt2 * -1;

    if (yt > margeGrav) {

        if (qGrav.y < qGrava.y) {

            if (quatOff.y < 1 && quatOff.y > -1) quatOff.y = quatOff.y + yt;

        } else {

            if (quatOff.y < 1 && quatOff.y > -1) quatOff.y = quatOff.y - yt;

        }

    }


    float zt = (qGrav.z - qGrava.z);

    if (zt < 0) zt = zt * -1;

    float zt2 = (qGravOFF.z - qGravOFFa.z);

    if (zt2 < 0) zt2 = zt2 * -1;

    if (zt > margeGravFat)

    {

        if (qGrav.z < qGrava.z) {

            if (quatOff.z < 1 && quatOff.z > -1) quatOff.z = quatOff.z + zt;

        } else {

            if (quatOff.z < 1 && quatOff.z > -1) quatOff.z = quatOff.z - zt;

        }

    }


    float wt = (qGrav.w - qGrava.w);

    if (wt < 0) wt = wt * -1;

    if (wt > margeGravFat) {

        if (qGrav.w < qGrava.w) {

            if (quatOff.w < 1 && quatOff.w > -1) quatOff.w = -(quatOff.w + wt);

        } else {

            text2.text = " les W gyro 2";

            if (quatOff.w < 1 && quatOff.w > -1) quatOff.w = -(quatOff.w - wt);

        }

    }


    this.gameObject.transform.rotation = Quaternion.AngleAxis(90.0f, Vector3.right) * quatOff * Quaternion.AngleAxis(180.0f, Vector3.forward);


}
void Start()

{

    Input.gyro.enabled = true;

}


protected void OnGUI() {

    this.gameObject.transform.Rotate(new Vector3(-Input.gyro.rotationRateUnbiased.x, -Input.gyro.rotationRateUnbiased.y, Input.gyro.rotationRateUnbiased.z));

}

Thank’s

HAHA !