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