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
1
A
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.
Aus welchem Grund verwenden Sie CoreLocation nicht? – jbehrens94
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. –