2010-03-27 8 views
6

qualcuno ha già programmato una compensazione dell'inclinazione della direzione della bussola iphone?Compensazione inclinazione bussola iphone

ho alcuni approcci, ma qualche aiuto o una soluzione migliore sarebbe bello!

FIRST definisco un vettore Ev, calcolato dal prodotto incrociato di Gv e HV. Gv è un vettore gravitazionale che costruisco fuori dai valori dell'accelerometro e Hv è un vettore di prora che ha costruito i valori del magnetometro. Ev sta perpendicolare su Gv e Hv, quindi si sta dirigendo verso l'orizzonte orientale.

SECONDO definisco un vettore Rv, calcolato dal prodotto incrociato Bv e Gv. Bv è il mio vettore in cerca ed è definito come [0,0, -1]. Rv è perpendicolare a Gv e Bv e mostra sempre a destra.

TERZO l'angolo tra questi due vettori, Ev e Rv, dovrebbe essere la mia intestazione corretta. per calcolare l'angolo costruisco il prodotto punto e di conseguenza gli arcos.

phi = Arcos (Ev * Rv/| Ev | * | Rv |)

Teoricamente dovrebbe funzionare, ma forse devo normalizzare i vettori ?!

Qualcuno ha trovato una soluzione per questo?

Grazie, m01d

risposta

3

Yep. DEFINITIVAMENTE devi normalizzare. Questo è dal mio codice che uso per estrarre l'orientamento del dispositivo. La gravità è ottenuta come x, y, z dell'accelerometro e la bussola è ottenuta da x, y, z della funzione di direzione

gravity.normalize(); compass.normalize(); bussEst = gravity.cross (bussola);
compassEast.normalize();
bussolaNorth = compassEast.cross (gravità); compassNorth.normalize();

Fammi sapere se è necessario il codice completo. Inoltre, per coloro che non hanno ancora visto il giroscopio iphone 4s in azione: è incredibile! Ho scambiato l'ingresso sopra con la gravità e la bussola per gli equivalenti dal giroscopio e il risultato è stabile, fluido e fantastico :) Vai Apple.

+0

È possibile vedere il codice sorgente? Mi ha fatto incuriosire. Potresti inviare il codice sorgente a [email protected] per favore? – fyasar

+0

Mi interessa anche il codice. La mia email: ellen.sundh [at] gmail.com Grazie! –

0

Sì, ho fatto le cose come sopra descritto. ma il risultato non è molto preciso. Penso che con valori di accelerometro più fluidi dovrebbe funzionare in questo modo. per questo ho scelto di eseguire la compensazione dell'inclinazione aggiungendo/sottraendo i valori dell'acceleratore dell'asse corrispondente ai/dai valori della bussola.

Qui iss il mio codice per la soluzione di cui sopra, ma la sua non è una soluzione finale di lavoro:

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{ 
if (newHeading != nil) { 
float Ax = accelerationValueX; 
float Ay = accelerationValueY; 
float Az = accelerationValueZ; 
float filterFactor = 0.2; 
Mx = [newHeading x] * filterFactor + (Mx * (1.0 - filterFactor)); 
My = [newHeading y] * filterFactor + (My * (1.0 - filterFactor)); 
Mz = [newHeading z] * filterFactor + (Mz * (1.0 - filterFactor)); 

float counter = ( -pow(Ax, 2)*Mz + Ax*Az*Mx - pow(Ay, 2)*Mz + Ay*Az*My); 
float denominator = (sqrt(pow((My*Az-Mz*Ay), 2) + pow((Mz*Ax-Mx*Az), 2) + pow((Mx*Ay-My*Ax), 2)) * sqrt(pow(Ay, 2)+pow(-Ax, 2))); 
headingCorrected = (acos(counter/denominator)* (180.0/M_PI)) * filterFactor + (headingCorrected * (1.0 - filterFactor)); 
} 
... 
}