2017-07-19 6 views
0

J'utilise actuellement l'attitude CMMotionManager pour obtenir le roulis, le tangage et le lacet. Cependant, après avoir couru pendant quelques minutes, le lacet dérive et devient inexact. J'ai lu qu'il y a un moyen de calculer le lacet en utilisant une combinaison d'accéléromètre et de magnétomètre qui gardera le lacet précis avec une compensation pour la dérive constante, mais je n'ai pas encore trouvé de formule de travail.Utiliser un magnétomètre et un accéléromètre pour calculer le lacet précis

Voici une petite partie de mon code que j'utilise pour obtenir des mises à jour de mouvement.

motionManager.deviceMotionUpdateInterval = 0.1 
motionManager.showsDeviceMovementDisplay = true 
motionManager.startDeviceMotionUpdates(using: .xMagneticNorthZVertical, to: OperationQueue.current!) 
    { deviceManager, error in 

    if let deviceManager = deviceManager { 
     let roll = deviceManager?.attitude.roll 
     let pitch deviceManager?.attitude.pitch 
     let yaw = deviceManager?.attitude.yaw // Get drifted over time 
... 

Une idée?

MISE À JOUR

je pouvais compenser la dérive de lacet en utilisant la formule suivante:

Créer le point initial de référence (référence de cadre mondial fixe) à l'aide magnétomètre:

m_w = (m_x,m_y,m_z) 

Prenez magnetomer courant point (également référentiel fixe) utilisant un magnétomètre:

n_w = (n_x,n_y,n_z) 

Convertir des angles de lecture projetée

a = atan2(m_z,m_x) 
b = atan2(n_z,n_x) 

dérive Yaw peut être calculée comme suit

y_d = (a-b) * 180/PI 

Maintenant déduisons le résultat de lacet de l'accéléromètre en cours.

WALLA!

Répondre

0

Vous ne voulez pas dire giro? Le MotionManager a un mode dans lequel il mélange 3 entrées, accéléromètre, gyroscope et le magnétomètre.

Pour cela tu dois le configurer pour « mouvement de l'appareil »

mouvement de l'appareil. Appelez la méthode startDeviceMotionUpdates (en utilisant :) ou startDeviceMotionUpdates() pour commencer les mises à jour et, périodiquement, accéder aux objets CMDeviceMotion en lisant la propriété deviceMotion . La méthode startDeviceMotionUpdates (using :) (nouveauté dans iOS 5.0) vous permet de spécifier un référentiel à utiliser pour les estimations d'attitude .

https://developer.apple.com/documentation/coremotion/cmmotionmanager

Cependant, vous devez savoir que cela augmente la consommation de la batterie un peu.

+0

C'est ce que je fais pour le moment comme je l'ai dit, j'utilise un CMMotionManager pour obtenir les mises à jour de roll, pitch et yaw. Cependant, le lacet se dérive après un certain temps, et je comprends que c'est un problème commun avec les gyroscopes. Je cherche une solution. –