2016-08-06 28 views
1

Ich möchte die Kompassrichtung mit CoreMotion (nicht CoreLocation, wenn möglich) nach Norden berechnen. Ich habe einige Formeln gefunden, arbeite aber nur, wenn das Telefon flach auf dem Tisch steht. Kann mir jemand helfen, einen Weg zu finden, um die Kompassrichtung zu berechnen, die in jeder Geräteposition wie der Kompass-App funktioniert?CoreMotion-basierter Kompass

+0

Aus welchem ​​Grund verwenden Sie CoreLocation nicht? – jbehrens94

+0

Ich mache eine AR-App, die bereits CoreMotion verwendet, um Objekte anzuzeigen. Ich brauche diesen Kompass für die Radaransicht. Ich habe festgestellt, dass wenn ich CoreLocation trueHeading verwende, dann werden Punkte auf dem Radar manchmal etwas verschoben von dem was ich in der AR Ansicht sehe. Wahrscheinlich wird eine zusätzliche Filterung verwendet, um die Überschrift nach CoreLocation zu berechnen. Wenn es möglich wäre, von der Core-Motion-Einstellung wegzukommen, dann würde dieses Problem meines Erachtens nicht existieren. –

Antwort

0

Ich habe eine Antwort gefunden. Dies ist, wie ich Kompass in Radiant von CoreMotion Überschrift erhalten:

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 } 

Noch brauchen dies zu testen, aber jetzt scheint es zu funktionieren.