2012-02-13 2 views
2

"대향"(참 또는 북쪽을 기준으로할지 여부는 중요하지 않음)을 계산해야합니다. iOS 장치에서 볼 수 있듯이 CLLocationManager에 의해 반환 된 CLHeading 개체는 해당 속성에 따라 참 및 자기 머리글을 제공합니다. 또한 이러한 값은 장치 상단 (장치 좌표계의 양의 Y 축)과 관련된 것이므로 내 용도에 적합하지 않음을 쉽게 알 수 있습니다. 실제로 필요한 것은 장치의 화면과 관련된면 (Z 축)을 계산하는 것입니다.이 때 나침반은 필요하지 않지만 AG 응용 프로그램의 왕이 필요합니다. 문제는 장치를 가로 방향으로 돌릴 때 마주 보는 방향에서 왼쪽 또는 오른쪽 방향 값을 얻는 것입니다. 결국 내가 필요한 것입니다. 저는 자이로 스코프 "원시"데이터 (자이로 스코프 "오일"천사 (세 가지 유형이 있습니다)와 함께 자력계 "원시"데이터 (각 장치 축에 대해 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은 무엇입니까? 나는 그것을 찾을 수 없다 –

+0

오 ... 당신은 그것을 찾을 수 없을거야. 내 수업 중 일부 야. 나는 거기에 마지막으로 제목을 저장하는 데 사용했습니다. – Ariel

+0

이것은 매우 유용합니다. 이를 찾는 사람들은이 코드가하는 일을 100 % 명확하게 밝히지는 못하지만, 가로 또는 세로 방향에 관계없이 장치의 방향을 찾으려면이 작업을 수행하십시오. – ratana

관련 문제