2016-08-06 112 views
1

我想使用CoreMotion(如果可能,不是CoreLocation)計算指向真北的指南針。我發現了一些公式,但只有當電話在桌子上平放時才工作。有人可以幫助我找到一種方法來計算指南針的標題,這將適用於像羅盤應用程序的每個設備位置?基於CoreMotion的指南針

+0

你不使用CoreLocation的原因是什麼? – jbehrens94

+0

我正在製作一個AR應用程序,它已經使用CoreMotion來顯示對象。我需要這個雷達視圖的指南針。我注意到,當我使用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 } 

還需要對此進行測試,但現在它似乎工作。