2017-08-25 8 views
2

J'ai des problèmes avec l'accéléromètre.Suppression des effets de la gravité sur l'accéléromètre IOS iphone

Si l'appareil est à plat, je reçois (0, 0, -1) ce qui n'est évidemment pas correct. Lorsque je fais pivoter le téléphone, ce -1 se déplace vers d'autres axes en fonction de la position du téléphone.

J'ai un code très simple à ce jour:

override func viewDidAppear(_ animated: Bool) { 

    motionManager.accelerometerUpdateInterval = 0.1 
    motionManager.startAccelerometerUpdates(to: OperationQueue.current!){(data,error) 
     in 
     if let myData = data { 
      print(Double(myData.acceleration.y) ) 
    } 
+2

Pourquoi n'est-ce pas? Il y a une constante -1g due à la gravité de la Terre. – Paulw11

Répondre

2

Vous accédez à l'accélération brute, qui comprendra la gravité. Cela signifie que (0, 0, -1) est en réalité évidemment correct.

Si vous souhaitez quelque chose d'un peu plus stable (et sans le vecteur de gravité), utilisez le mouvement de l'appareil. Il convient de noter que les données provenant de l'interface de mouvement de l'appareil sont filtrées et stabilisées à l'aide de méthodes de filtrage par fusion de capteurs, de sorte que les données d'accélération seront plus précises.

import UIKit 
import CoreMotion 

class ViewController: UIViewController { 

    let motionManager = CMMotionManager() 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     motionManager.deviceMotionUpdateInterval = 0.1 
     motionManager.startDeviceMotionUpdates(to: .main) { (motion, error) in 
      if let motion = motion { 
       var x = motion.userAcceleration.x 
       var y = motion.userAcceleration.y 
       var z = motion.userAcceleration.z 

       // Truncate to 2 significant digits 
       x = round(100 * x)/100 
       y = round(100 * y)/100 
       z = round(100 * z)/100 

       // Ditch the -0s because I don't like how they look being printed 
       if x.isZero && x.sign == .minus { 
        x = 0.0 
       } 

       if y.isZero && y.sign == .minus { 
        y = 0.0 
       } 

       if z.isZero && z.sign == .minus { 
        z = 0.0 
       } 

       print(String(format: "%.2f, %.2f, %.2f", x, y, z)) 
      } 
     } 
    } 
} 

D'ailleurs, cela est en the docs, premier alinéa.

Après la création d'une instance de CMMotionManager, une application peut utiliser pour recevoir quatre types de mouvement: données de l'accéléromètre brut, des données gyroscopiques premières données magnétométriques brutes et traitées des données dispositif de mouvement (qui comprend un accéléromètre, Rotation- taux, et mesures d'attitude). Les données de mouvement du dispositif traitées fournies par les algorithmes de fusion de capteurs de Core Motion donnent l'attitude du dispositif, le taux de rotation, les champs magnétiques calibrés, la direction de la gravité et l'accélération que l'utilisateur donne à l'appareil.

+0

Cher Allen, j'ai ajouté ce code à un nouveau fichier pour le définir ... il dit que motionManager est un identifiant non résolu? –

+0

Cette erreur signifie que vous n'avez pas créé 'motionManager'. Le code que j'ai fourni était destiné à remplacer le code que vous avez inclus dans votre question. Il est incomplet dans un contexte autonome. –

+0

@DamianTalaga J'ai mis à jour mon exemple pour être plus explicite. –