2012-02-13 100 views
2

我需要計算「面對」(如果它會根據真北或磁一個也沒關係)北計算。由於它可以在iOS設備中可以看出由CLLocationManager返回CLHeading對象使得我們有了真正的和相應的屬性磁航向。另外,我們可以很容易地看到,這些值與設備的頂部(設備座標系的正Y軸)有關,這對我的目的不利。 我真正需要的是計算所面臨的我不需要指南針,但公司應用的國王與設備(Z軸)的屏幕。問題在於,當您將設備旋轉到橫向時,您會從朝向的方向向左或向右獲取標題值,最終我需要這些。 據我所知,我可以得到磁力「原始」數據(給我在微特斯拉單元從128個值-128爲每個設備軸)與陀螺儀一起「原始」數據(至極有三種類型:歐拉天使,旋轉矩陣或四元數)。我需要的是知道的,我需要應用到那些以獲得「面向」的方向發展,而不是「標題」基於磁力計和陀螺儀

回答

4

我做了它一段時間了,因爲我看不到答案,我決定其計算把這裏我的解決方案爲那些誰就會尋找答案同樣的問題...

_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; 
    } 

這裏有一些額外的片段,可能有助於理解這個例子:

-(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) 

編碼愉快。 ..

+0

什麼是代碼中的SVSession?我找不到它 – 2013-01-30 11:14:33

+0

哦...你不會找到它。這是我的一些課程。我曾經在那裏存儲過最後的標題。 – Ariel 2013-01-30 12:08:55

+0

這非常有用。對於那些發現這種情況的人來說,它可能不會完全清楚這些代碼會做什麼,但是如果您希望找出設備面對的方式,而不考慮橫向或縱向方向,則可以這樣做。 – ratana 2015-05-05 00:37:44