2012-02-13 7 views
2

「向いている」(真の北部または磁気的なものに基づいているかどうかは関係ありません)を計算する必要があります。 iOSデバイスで見ることができるように、CLLocationManagerによって返されたCLHeadingオブジェクトは、対応するプロパティによって真の見出しと磁気見出しの両方を返します。また、これらの値は私の目的には適していないデバイスの上部(デバイスの座標系の正のY軸)に関連していることが非常に簡単にわかります。 私が実際に必要とするのは、私がコンパスを必要としないので、デバイス(Z軸)のスクリーンに関連する面を計算することですが、AGアプリケーションの王です。問題は、デバイスを横向きに回転させて、あなたが向かう方向から見出し値を左または右に得るときです。最後に必要なものです。 私が知っているように、ジャイロスコープの「未加工」データ(オイラー天使の3種類があります)とともに、磁力計の「生」データ(各デバイス軸の128から-128までの値を持つマイクロテラ単位で与えられます) 、回転行列またはクォータニオン)。私が必要とするのは、「見出し」の代わりに「直面」の方向を得るためにどの計算を適用する必要があるのか​​を知ることです。磁力計とジャイロスコープによる北の計算

答えて

4

私は少し前にそれを作っています。

-(double)angleYAxisToVector:(CGPoint)vector{ 
    double dX = vector.x; 
    double dY = vector.y; 

    if(dY == 0){ 
     if(dX > 0){ 
      return 0.0; 
     }else{ 
      if(dX < 0){ 
       return 180.0; 
      }else{ 
       return -1; 
      } 
     } 
    } 

    double beta = radiansToDegrees(atan(dX/dY)); 
    double angle; 
    if(dX > 0){ 
     if (dY < 0){ 
      angle = 180 + beta; 
     }else{ 
      angle = beta; 
     } 
    }else{ 
     if (dY < 0){ 
      angle = 180 + beta; 
     }else{ 
      angle = 360 + beta; 
     } 
    } 
    // NSLog(@"angle = %f, normalized = %f",beta,angle); 
    return angle; 
} 

#define degreesToRadian(x)    (M_PI * (x)/180.0) 
#define radiansToDegrees(x)    ((x) * 180.0/M_PI) 
#define degreesToRadians(x)    degreesToRadian(x) 
#define radiansToDegree(x)    radiansToDegrees(x) 

ハッピーコーディング:同じ質問に対して答えを検索します人のためにここに私の解決策を入れて...

_motionManager = [[CMMotionManager alloc]init]; 

    if (_motionManager.gyroAvailable) { 
     _motionManager.deviceMotionUpdateInterval = 1.0/20.0; 
     [_motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] 
              withHandler:^(CMDeviceMotion *motion, NSError *error) 
     { 
      CMAcceleration gravity = motion.gravity; 
      CGPoint tiltVector = CGPointMake(-gravity.x, -gravity.y); 
      _tiltAngle = [self angleYAxisToVector:tiltVector]; 

      CLLocationDirection heaqding = [[SVSession sharedSession] heading].trueHeading; 
      double newHeading = fmod(heaqding + _tiltAngle, 360.0); 
      self.azimuth = degreesToRadian(newHeading); 

      [self updateLocations]; //this function updates my ui for the new heading 
     }]; 
    } else { 
     NSLog(@"No gyroscope on device."); 
     [_motionManager release],_motionManager = nil; 
    } 

そして、ここでは、この例を理解するのを助けることができるいくつかの追加のスニペットです。 ..

+0

コード内のSVSessionは何ですか?私はそれを見つけることができません –

+0

ああ...あなたはそれを見つけることはありません。それは私のクラスの一部です。私は最後の見出しをそこに保管していました。 – Ariel

+0

これは非常に便利です。これを見つける人にとっては、このコードが何をするのかは100%明確ではないかもしれませんが、デバイスが横向きまたは縦向きにかかわらず向き合っているかどうかを調べることを望んでいるなら、これがそうです。 – ratana

関連する問題