基于CoreMotion的指南针

时间:2016-08-06 09:48:22

标签: ios core-motion compass-geolocation

我想使用CoreMotion计算指南针前往真北(如果可能的话,不是CoreLocation)。我找到了一些公式,但只有当手机在桌子上平放时才能工作。有人可以帮我找到一种计算罗盘方位的方法,它可以在罗盘应用程序的每个设备位置工作吗?

1 个答案:

答案 0 :(得分: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 }

仍然需要对此进行测试,但现在似乎有效。