2012-05-21 15 views
10

iOSプロトタイプでは、CMDeviceMotion.deviceMotion.yawとCLHeading.trueHeadingの組み合わせを使用して、安定したコンパスの見出しを正確かつ正確に作成します。これは、iPhoneがフラットな状態に保たれているときにうまく動作します。ここで、安定したコンパスの見出しを指すグラフィックの矢印が表示されます。iPhoneが垂直のときにCMDeviceMotionのヨー値が不安定になる

iPhoneがポートレートモードで垂直に保持されているときに問題が発生します。 UIDeviceOrientationは常にUIDeviceOrientationFaceDownからUIDeviceOrientationFaceUpに変わります。これにより、微少なピッチの変化に基づいてヨー値が前後に+/- 180度スキップされます。安定したヨーの値を与える一方向にデバイスをロックしたり、グリッチのない変化を予測したり、他の方法でジャイロヨー(またはこの方向にロール)を計算することは可能ですか?

この貧しい人は同じ問題を抱えていますが、答えはありません。ダブルポイント可能! :) https://stackoverflow.com/questions/10470938/euler-angle-yaw-not-working-when-iphone-orientation-changes

答えて

13

私はこの問題の答えを探していました。あなたがこれを1年以上前に投稿したことを確認するために私の心を少し壊しましたが、あなたや他の誰かが解決策から恩恵を受ける可能性があると思いました。

問題はジンバルロックです。ピッチが約90度になると、ヨーとロールが一致し、ジャイロは自由度を失います。クォータニオンはジンバルロックを回避する方法の1つですが、私は正にその周りに心を抱くような気がしませんでした。代わりに、私はヨーとロールが実際にマッチしていることに気づき、問題を解決するために単純に合計することができます(ヨーのみを気にしていると仮定します)。

SOLUTION:

float yawDegrees = currentAttitude.yaw * (180.0/M_PI); 
    float pitchDegrees = currentAttitude.pitch * (180.0/M_PI); 
    float rollDegrees = currentAttitude.roll * (180.0/M_PI); 

    double rotationDegrees; 
    if(rollDegrees < 0 && yawDegrees < 0) // This is the condition where simply 
              // summing yawDegrees with rollDegrees 
              // wouldn't work. 
              // Suppose yaw = -177 and pitch = -165. 
              // rotationDegrees would then be -342, 
              // making your rotation angle jump all 
              // the way around the circle. 
    { 
     rotationDegrees = 360 - (-1 * (yawDegrees + rollDegrees)); 
    } 
    else 
    { 
     rotationDegrees = yawDegrees + rollDegrees; 
    } 

    // Use rotationDegrees with range 0 - 360 to do whatever you want. 

私は、これは他の誰かに役立ちます願っています!

+0

ちょうど、ありがとう!!!! –

+0

@ blkph19あなたは私の答えを見てください私はコメントセクションにコード全体に合うことができなかったことができます。 – Deveram

1

誰かがiOSのスウィフトに実装に関心がある場合、コードは以下の通りである:

let queue = NSOperationQueue() 
    motionManager.startDeviceMotionUpdatesToQueue(queue) { 
     [weak self] (data: CMDeviceMotion!, error: NSError!) in 
    var yawDegrees: Double = self!.motionManager.deviceMotion.attitude.yaw * (180.0/M_PI) 
     var pitchDegrees: Double = self!.motionManager.deviceMotion.attitude.pitch * (180.0/M_PI) 
     var rollDegrees: Double = self!.motionManager.deviceMotion.attitude.roll * (180.0/M_PI) 


     if(rollDegrees < 0 && yawDegrees < 0){ 
      self!.rotationDegrees = 360 - (-1 * (yawDegrees + rollDegrees)) 
     } 
     else { 
      self!.rotationDegrees = yawDegrees + rollDegrees 
     } 
    } 

特定の時点での角度が行くので、私はいくつかの問題を抱えていると私はblkhp19 @願うことはこれで私を助けることができるしかし、負の値に変換され、計算全体が崩れ、問題の原因がわかりません。

関連する問題