2010-03-27 3 views
6

Est-ce que quelqu'un a déjà programmé une compensation de l'inclinaison de la boussole de l'iphone?compensation de l'inclinaison de la boussole iphone

J'ai quelques approches, mais un peu d'aide ou une meilleure solution serait cool! Je définis un vecteur Ev, calculé à partir du produit croisé de Gv et de Hv. Gv est un vecteur de gravité i construit à partir des valeurs de l'accéléromètre et Hv est un vecteur de cap construit les valeurs du magnétomètre. Ev est perpendiculaire sur Gv et Hv, donc il se dirige vers l'est de l'horizon. Je définis un vecteur Rv, calculé à partir du produit croisé Bv et Gv. Bv est mon vecteur de recherche et il est défini comme [0,0, -1]. Rv est perpendiculaire à Gv et Bv et se montre toujours à droite. L'angle entre ces deux vecteurs, Ev et Rv, devrait être mon cap corrigé. pour calculer l'angle je construis le produit scalaire et de l'arcos.

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

Théoriquement, il devrait fonctionner, mais peut-être je dois normaliser les vecteurs ?!

Quelqu'un at-il une solution pour cela?

Merci, m01d

Répondre

3

Yep. Vous devez absolument normaliser. Ceci est à partir de mon code que j'utilise pour extraire l'orientation de l'appareil. La gravité est obtenue en tant que x, y, z de l'accéléromètre et la boussole est obtenue à partir des x, y, z de la fonction d'en-tête

gravity.normalize(); compass.normalize(); compassEast = gravity.cross (boussole);
compassEast.normalize();
boussoleNorth = compassEast.cross (gravity); compassNorth.normalize(); Faites-moi savoir si vous avez besoin du code complet.

Aussi, pour ceux qui n'ont pas encore vu le gyroscope de l'iphone 4s en action: c'est incroyable! J'ai échangé l'entrée ci-dessus à la gravité et la boussole pour les équivalents du gyro et le résultat est stable et lisse et génial :) Allez Apple.

+0

Est-il possible de voir le code source? Cela m'a fait curieux. Pourriez-vous envoyer le code source à [email protected] s'il vous plaît? – fyasar

+0

Je suis également intéressé par le code. Mon email: ellen.sundh [at] gmail.com Merci! –

0

oui, je l'ai décrit ci-dessus, il aime. mais le résultat n'est pas très précis. Je pense qu'avec des valeurs d'accéléromètre plus lisses, cela devrait fonctionner de cette façon. Pour cette raison, j'ai choisi de faire la compensation d'inclinaison en ajoutant/soustrayant les valeurs d'accélération de l'axe correspondant aux valeurs de la boussole.

Ici iss mon code pour la solution ci-dessus, mais ce ne est pas une solution de travail finale:

- (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)); 
} 
... 
} 
Questions connexes