2010-11-10 15 views
9

Para un proyecto, mi equipo y yo hemos estado tratando de rastrear un wiimote en un espacio 3D usando el acelerómetro incorporado y el giroscopio WiiMotion Plus.¿Cómo puedo tener en cuenta la gravedad usando el acelerómetro de un wiimote?

Hemos podido rastrear la rotación y la posición con un ODE (se encuentra en http://www.alglib.net/), pero hemos tenido un problema al quitar el componente de gravedad del acelerómetro.

nos fijamos en Accelerometer gravity components que tenía la fórmula (implementado en C#/XNA)

private Vector3 RemoveGravityFactor(Vector3 accel) 
    { 
     float g = -1f; 
     float pitchAngle = (Rotation.Z); 
     float rollAngle = (Rotation.Y); 
     float yawAngle = (Rotation.X); 

     float x = (float)(g * Math.Sin(pitchAngle)); 
     float y = (float)(-g * Math.Cos(pitchAngle) * Math.Sin(rollAngle)); 
     float z = (float)(-g * Math.Cos(pitchAngle) * Math.Cos(rollAngle)); 

     Vector3 offset = new Vector3(x, y, z); 

     accel = accel - offset; 
     return accel; 
    } 

Pero no funciona en absoluto. Como referencia, la aceleración es directa desde el acelerómetro, y la rotación se mide en radianes después de que se ha trabajado a través del ODE.

Además, estamos teniendo problemas para entender cómo funciona esta fórmula. Debido al hecho de que nuestro seguimiento tiene en cuenta todas las dimensiones, ¿por qué no se tiene en cuenta a Yaw?

Gracias de antemano por cualquier consejo o ayuda que se ofrece.

EDIT:

Después de discutir con mis compañeros de equipo y jefe, que hemos llegado a encontrar que esta fórmula funcionaría realmente si estábamos usando correctamente X, Y, y Z. Sin embargo, hemos llegado a otro tocón.

El problema que estamos teniendo es que la biblioteca de Wiimote que estamos utilizando devuelve valores relativos de rotación basados ​​en el movimiento del giroscopio. En otras palabras, si los botones están hacia arriba, girar el wiimote hacia la izquierda y hacia la derecha es guiñada y si los botones apuntan hacia usted, el guiñada es el mismo cuando DEBERÍA ser la rotación de todo el wiimote.

Hemos encontrado que los ángulos de Euler pueden ser nuestra respuesta, pero no estamos seguros de cómo usarlos adecuadamente. Si hay alguna aportación sobre este nuevo desarrollo o cualquier otra sugerencia, por favor denles.

Respuesta

2

Apuesto a que su acelerómetro no fue calibrado en gravedad cero, por lo que eliminar el efecto de la gravedad será difícil, al menos.

+0

¿Eso significa que el control remoto falla cuando lo pones boca abajo? –

+0

no necesita ser calibrado en gravedad cero. la gravedad es 1g abajo y muy predicable. no es como si no pudieras compensarlo. –

+0

@dan_waterworth: sí, la gravedad es muy predecible; y sí, puedes compensarlo. Eso es diferente de "eliminar el efecto de gravedad del acelerómetro". La compensación no eliminará el efecto; lo compensará, pero hay un nivel de precisión diferente entre la eliminación y la compensación. –

1

Primero, sugiero no usar componentes individuales para almacenar la rotación (bloqueo cardánico), una matriz funcionaría mejor. calibre manteniéndolo quieto y midiendo (será 1g hacia abajo). luego para cada rotación, multiplique la matriz de rotación por ella. entonces puedes decir en qué dirección sube y resta una matriz de 1g hacia abajo desde el vector que representa la aceleración. Sé que no tiene mucho sentido, pero estoy un poco apurado, agregue comentarios si tiene alguna pregunta.

+0

No estoy seguro de a qué se refiere cuando dice "multiplique la matriz de rotación por 'eso'". Sin embargo, estamos utilizando un Quaternion (que puede transformarse en una matriz rotativa si es necesario), pero no estamos seguros de cómo capturar la gravedad correctamente. Podríamos hacer esto si no tomamos en cuenta los períodos cuando la gravedad está en dos ejes (el wiimote rueda 45 grados, la gravedad está en zyx) –

+0

Para capturar la gravedad, mantenga el control remoto inmóvil y mida la aceleración (asegurándose de que no hay rotación). Esto le dará un vector que es 1g en la dirección de la gravedad (es decir, hacia abajo). Normalice este vector y multiplíquelo por -1. Ahora tienes un vector que representa 'arriba' en relación con el wiimote. Ahora construye una matriz que rote un vector Z de la unidad al vector ascendente, (tendrás que elegir adelante). Si, para cada rotación, multiplique esta matriz por la transposición de la matriz de rotación. Luego, cuando giras un vector Z por la matriz, obtienes el vector. –

+0

Gracias por su contribución. Actualmente estamos tratando de agotar todos los recursos usando un cuaternión. En lo que respecta a su respuesta, no estamos seguros de cómo trabajar con ella. ¿A qué te refieres con: "Construir una matriz que rote un vector Z de la unidad hacia el vector ascendente?" –

Cuestiones relacionadas