2010-11-10 8 views
9

Per un progetto, io e il mio team abbiamo cercato di tracciare un wiimote in uno spazio 3D utilizzando l'accelerometro integrato e il giroscopio WiiMotion Plus.Come si tiene conto della gravità utilizzando l'accelerometro del wiimote?

Siamo stati in grado di tracciare la rotazione e la posizione utilizzando un ODE (Trovato a http://www.alglib.net/,) ma abbiamo incontrato un problema con la rimozione del componente gravità dall'accelerometro.

abbiamo guardato Accelerometer gravity components che aveva la formula (implementato in 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; 
    } 

Ma non funziona affatto. Come riferimento, l'accelerazione è direttamente dall'accelerometro e la rotazione viene misurata in radianti dopo che è stata elaborata attraverso l'ODE.

Inoltre, abbiamo problemi con la comprensione di come funziona questa formula. A causa del fatto che il nostro monitoraggio tiene conto di tutte le dimensioni, perché Yaw non viene preso in considerazione?

Grazie in anticipo per qualsiasi consiglio o aiuto che viene offerto.

EDIT:

Dopo aver discusso con i miei compagni di squadra e capo, siamo arrivati ​​a scoprire che questa formula sarebbe effettivamente funzionare se stessimo usando correttamente X, Y e Z. Siamo arrivati ​​a un altro ceppo però.

Il problema che stiamo avendo è che la libreria Wiimote che stiamo usando restituisce valori di rotazione relativi basati sul movimento del giroscopio. In altre parole, se i pulsanti sono rivolti verso l'alto, ruotando il wiimote a sinistra e a destra è imbardata e se i pulsanti sono rivolti verso di te, l'imbardata è la stessa quando DOVREBBE essere la rotazione dell'intero wiimote.

Abbiamo trovato che gli angoli di Eulero possono essere la nostra risposta, ma non siamo sicuri di come usarli in modo appropriato. Se c'è qualche input su questo nuovo sviluppo o qualche altro suggerimento, per favore daglielo.

risposta

2

Scommetto che il tuo accelerometro non è calibrato a gravità zero, quindi rimuovere l'effetto della gravità sarà difficile, per lo meno.

+0

Significa che il telecomando non riesce quando lo si capovolge? –

+0

non ha bisogno di essere calibrato a gravità zero. la gravità è 1 g giù e molto prevedibile. non è che non puoi compensarlo. –

+0

@dan_waterworth: sì, la gravità è molto prevedibile; e sì, puoi compensarlo. È diverso da "rimuovere l'effetto gravità dall'accelerometro". Il risarcimento non rimuoverà l'effetto; lo compenserà, ma c'è un diverso livello di accuratezza tra rimozione e compensazione. –

1

Per prima cosa suggerirei di non utilizzare singoli componenti per memorizzare la rotazione (blocco cardanico), una matrice funzionerebbe meglio. calibrare tenendolo fermo e misurando (sarà 1 g verso il basso). quindi per ogni rotazione, più la matrice di rotazione da essa. quindi puoi dire quale strada è in alto e sottrarre una matrice di 1 g dal vettore che rappresenta l'accelerazione. So che non ha molto senso, ma ho un po 'di fretta, aggiungere commenti se avete domande.

+0

Non sono sicuro di ciò a cui ti riferisci quando dici "più matrici di rotazione di" it "." Tuttavia, stiamo usando un Quaternion (che può essere trasformato in una matrice rotazionale se necessario), ma non siamo sicuri di come catturare correttamente la gravità. Potremmo farlo se non tenessimo conto dei periodi in cui la gravità è su due assi (il wiimote rotola di 45 gradi, la gravità è su z e x) –

+0

Per catturare la gravità, mantenere il telecomando fermo e misurare l'accelerazione (assicurandosi che ci sia non è una rotazione). Questo ti darà un vettore che è 1g nella direzione della gravità (cioè in basso). Normalizza questo vettore e moltiplicalo per -1. Ora hai un vettore che rappresenta 'alto' in relazione al wiimote. Ora costruisci una matrice che fa ruotare un vettore di unità Z sul vettore su, (dovrai scegliere in avanti). Se, per ogni rotazione, si multipla questa matrice per la trasposizione della matrice di rotazione. Quindi quando si ruota un vettore Z per la matrice, si ottiene il vettore. –

+0

Grazie per l'input. Al momento stiamo cercando di esaurire tutte le risorse utilizzando un quaternion. Per quanto riguarda la tua risposta, non siamo sicuri su come lavorarci. Cosa intendi con: "Costruisci una matrice che fa ruotare un vettore di unità Z nel vettore in alto?" –

Problemi correlati