2016-08-06 10 views
1

CoreMotion (가능한 경우 CoreLocation이 아님)을 사용하여 나침반 방향을 true로 계산하고 싶습니다. 몇 가지 수식을 발견했지만 전화가 테이블 위에있을 때만 작동합니다. 누군가 나침반 앱과 같은 모든 기기 위치에서 작동 할 나침반 표제를 계산하는 방법을 찾도록 도와 줄 수 있습니까?CoreMotion 기반 나침반

+0

CoreLocation을 사용하지 않는 이유는 무엇입니까? – jbehrens94

+0

이미 CoreMotion을 사용하여 객체를 표시하는 AR 응용 프로그램을 만들고 있습니다. 레이더보기에이 나침반이 필요해. 나는 CoreLocation trueHeading을 사용할 때 레이더상의 점들이 AR보기에서 보는 것과 약간 벗어난 것을 알았다. CoreLocation의 제목 계산에는 몇 가지 추가 필터링이 사용됩니다. 어쨌든 이것이 코어 동작 태도에서 벗어날 수 있다면, 나는이 문제가 존재하지 않을 것이라고 생각한다. –

답변

0

답변을 찾았습니다. 내가 CoreMotion에서 라디안으로 향하는 나침반 얻는 방법이다 :

guard let a = motionManager.deviceMotion?.attitude, g = motionManager.deviceMotion?.gravity else { return } 

let deviceAngle = {() -> Double in 
    switch interfaceOrientation { 
    case .LandscapeLeft: return -M_PI_2 + atan2(g.x, g.y) 
    case .LandscapeRight: return M_PI_2 + atan2(g.x, g.y) 
    default:    return M_PI + atan2(g.x, g.y) 
    } 
}() 

// Calculate Heading. 
let cA = cos(a.yaw), sA = sin(a.yaw), sB = sin(a.pitch), cG = cos(a.roll), sG = sin(a.roll) 
let rA = cA * sG + sA * sB * cG 
let rB = sA * sG - cA * sB * cG 
var compassHeading = -atan(rA/rB) + M_PI + deviceAngle 
if rB > 0 { compassHeading += M_PI } 

아직도이 테스트해야합니다,하지만 지금은 그것을 작동하는 것 같다.