2016-08-03 17 views
0

Ich habe an einer App gearbeitet, die eine Side-to-Side-Tilt-Motion-Geste verwendet. Ich habe es funktioniert mit den CMDeviceMotion Daten über die CMQuaternion Werte zu bekommen "roll" über Using quaternion instead of roll, pitch and yaw to track device motion, aber ich habe ein komisches Stück Verhalten, wo die Ausgabe manchmal perfekt funktioniert und andere nicht.CMDeviceMotion in Querformat

Die App ist auf Querformat (beide Richtungen) gesperrt, aber ich habe festgestellt, dass, wenn ich die App in Hochformat-Ausrichtung gestartet habe, funktioniert mein Rollcode perfekt mit einem Pi/2-Modifikator. Wenn ich die App mit dem Gerät im Querformat öffne, funktioniert es auf Tonhöhe ohne Modifikator.

Das Problem ist, dass ich keine Möglichkeit habe zu wissen, welche zu verwenden! Gibt es eine Möglichkeit, den Referenzrahmen zu erkennen oder zurückzusetzen?

UPDATE:

ich lügen, wenn ich im Querformat beginnen scheint es nur eine zufällige Achsen zu holen :(Ich nehme an, dies ist wieder ein Gimbal Lock-Sache, aber die ursprüngliche Frage gilt immer noch - wie ich tun erhalten diese konsequent zu sein, wenn ich das Gerät in einer Landschaft Orientierung beginnen

UPDATE 2:

Einige Token-Code (von NSNotification kommt) für Menschen, die nicht lesen können und das Bedürfnis verspüren, ohne downvote.

CMDeviceMotion *data = [[note userInfo] valueForKey:@"data"]; 
CMQuaternion quat = data.attitude.quaternion; 
CGFloat roll = atan2(2*(quat.y*quat.w - quat.x*quat.z), 1 - 2*quat.y*quat.y - 2*quat.z*quat.z); 

CGFloat pitch = atan2(2*(quat.x*quat.w + quat.y*quat.z), 1 - 2*quat.x*quat.x - 2*quat.z*quat.z); 
CGFloat yaw = 2*(quat.x*quat.y + quat.w*quat.z); 


NSLog(@" - - "); 
NSLog(@"raw roll: %f",roll); 
NSLog(@"raw pitch: %f",pitch); 
NSLog(@"raw yaw: %f",yaw); 

NSLog(@"q.x: %f",quat.x); 
NSLog(@"q.y: %f",quat.y); 
NSLog(@"q.z: %f",quat.z); 
NSLog(@"q.w: %f",quat.w); 

gestartet von startDeviceMotionUpdatesToQueue in AppDelegate.

Dies ist jedoch irrelevant, da die Quaternion-Daten stabil sind, wenn sich das Gerät beim Start im Hochformat befindet, aber nicht im Querformat. Was ich mit den Gerätedaten mache, ist ein völlig separates Problem.

Dies ist ein ähnliches Problem ohne eine befriedigende Antwort (oder jeder Code in der Frage: |) CMDeviceMotion yaw values unstable when iPhone is vertical

+0

Wenn Sie Code haben, der nicht wie erwartet funktioniert, zeigen Sie _show_ Ihren Code an. Deine Frage redet nur in den allerwenigsten Allgemeinheiten; Wer weiß, was du machst oder was das Problem ist? – matt

+0

Der Code ist nicht, wo das Problem liegt. Ich habe eine Berechnung mit CMQuaternions vorgenommen, wie ich bereits sagte, aber die Ausgabe des Geräts unterscheidet sich und ist basierend auf der Launch-Orientierung instabil - wie steht das mit meinem Code? – Martin

+0

"Wie ist das mit meinem Code verbunden?" Weil Sie nur wissen, was die "Geräteausgabe" ist, durch Ihren Code. – matt

Antwort

0

meine Rolle Code funktioniert perfekt

Ihre "roll-Code" nicht funktioniert perfekt. Sie sollten keinen "Roll-Code" haben. In einer Situation, in der Sie eine kardanische Verriegelung erhalten, sollten Sie keine Euler-Winkel verwenden. Sie können nicht auf Euler-Winkel wie roll "reduzieren". Verwenden Sie stattdessen Quaternionen oder (leichter) rotationMatrix und bleiben in dieser Welt. Sie kann nicht "berechnen" Sie Ihren Weg aus dem Problem, indem Sie mit der Quaternion und Umwandlung in einen Euler-Winkel. Und genau das versuchen Sie zu tun. Wenn Sie denken, dass dies möglich ist, haben Sie nicht verstanden, was kardanische Sperre ist (oder wie funktioniert atan vielleicht).

+0

Ich verwende Quaternionen zur Berechnung eine Rolle aus diesem Grund. Wenn ich alle Zahlen aufspüre, bekomme ich verschiedene Sätze, die auf das Neigen zur Seite reagieren, wenn ich im Querformat anfange, aber ein konsistentes Verhalten, wenn ich im Hochformat anfange. – Martin