Frage

hat jemand bereits eine iphone Kompasskurs Neigungskompensation programmiert?

Ich habe einige Ansätze bekam, aber etwas Hilfe oder eine bessere Lösung wäre cool!

FIRST i definieren einen Vektor Ev, des Kreuzprodukts von Gv und Hv berechnet werden. Gv ist ein Schwerkraftvektor i der Beschleunigungswerte bauen und Hv ist ein Fahrtrichtungsvektor des Magnetometers Werte ausgebaut. Ev steht senkrecht auf Gv und Hv, so dass es zu Horizonatl East zusteuert.

SECOND i definieren einen Vektor Rv, des Kreuzprodukts Bv und Gv berechnet werden. Bv ist mein suchen Vektor und es ist definiert als [0,0, -1]. Rv senkrecht zu Gv und Bv und zeigt immer nach rechts.

THIRD der Winkel zwischen diesen beiden Vektoren, Ev und Rv, soll meine korrigierten Position sein. um den Winkel zu berechnen i bauen das Skalarprodukt und davon die arcos.

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

Theoretisch sollte es funktionieren, aber vielleicht muss ich die Vektoren normalisieren ?!

Hat jemand eine Lösung dafür bekam?

Danke, m01d

War es hilfreich?

Lösung

Ja. Sie haben definitiv zu normalisieren. Das ist von meinem Code, dass ich die Ausrichtung des Geräts zu extrahieren. Schwerkraft wird als die x, y, z des Beschleunigungsmessers erhalten und Kompass wird von der x, y, z der Überschrift Funktion

erhalten

gravity.normalize (); compass.normalize (); compassEast = gravity.cross (Kompass);
compassEast.normalize ();
compassNorth = compassEast.cross (Schwerkraft); compassNorth.normalize ();

Lassen Sie mich wissen, wenn Sie den vollständigen Code benötigen. Auch für diejenigen, die noch havnt das iPhone 4S Gyroskop in Aktion gesehen: seine erstaunlich! Ich tauschte den oben Eingang der Schwerkraft und Kompass für die Mittel aus dem Kreisel und das Ergebnis ist stabil und glatt und genial :) Go von Apple.

Andere Tipps

Ich habe nicht den Quellcode erhalten, aber ich mein eigenes Beispiel oben. Sie können das Projekt und Code hier sehen: http : //www.sundh.com/blog/2011/09/stabalize-compass-of-iphone-with-gyroscope/

Ja, ich habe es, wie oben beschrieben. aber das Ergebnis ist nicht sehr genau. Ich denke, mit glatten Beschleunigungs-Werten soll es so. Aus diesem Grund habe ich gewählt durch Addieren / Subtrahieren der accelermoter Werte der entsprechenden Achse zu / von den Kompass Werte der Neigungskompensation zu tun.

Hier iss meinen Code für die Lösung oben, aber es ist nicht eine endgültige Arbeitslösung:

- (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));
}
...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top