2017-10-04 5 views
0

Voici mon code CM:Swift: dispositif de CoreMotion ne se déplace pas, mais l'enregistrement des accélérations

func checkMotion(_ myMotionManager:CMMotionManager) -> Bool { 

     //check to see if core motion is available 
     var isCoreMotionAvailable = myMotionManager.isAccelerometerAvailable 
     isCoreMotionAvailable = myMotionManager.isGyroAvailable 
     isCoreMotionAvailable = myMotionManager.isMagnetometerAvailable 
     isCoreMotionAvailable = myMotionManager.isDeviceMotionAvailable 

     if isCoreMotionAvailable { 
      myMotionManager.deviceMotionUpdateInterval = 0.25 
      myMotionManager.startDeviceMotionUpdates(to: OperationQueue.current!, withHandler: checkMotionUpdate) 

     } 

     return false 
    } 

et de vérifier les données:

func checkMotionUpdate(data: CMDeviceMotion?, error:Error?) { 

     if error != nil { 
      print(error!.localizedDescription) 
     } else { 

      if let motionData = data { 

       //check to see if we have a base point and if not store one 
       if !bHasBasePoint { 
        basePoint = motionData 
        bHasBasePoint = true 
        print("Basepoint:\(basePoint!)") 
       } 

       print("Acceleration X: \(motionData.userAcceleration.x)") 
       print("Acceleration Y: \(motionData.userAcceleration.y)") 
       print("Acceleration Z: \(motionData.userAcceleration.z)") 
       print() 

      } 
     } 
    } 

et des résultats:

Basepoint:

Basepoint:QuaternionX 0.011783 QuaternionY -0.461725 QuaternionZ 0.000044 QuaternionW 0.886945 UserAccelX 0.006458 UserAccelY 0.000324 UserAccelZ 0.002740 RotationRateX 0.000997 RotationRateY -0.001316 RotationRateZ -0.001370 MagneticFieldX 0.000000 MagneticFieldY 0.000000 MagneticFieldZ 0.000000 MagneticFieldAccuracy -1 Heading -1.000000 @ 73807.821537 

Certains accelera vérifie tion:

Acceleration X: 0.00645828247070312 
Acceleration Y: 0.0003238245844841 
Acceleration Z: 0.00274038314819336 

Acceleration X: 0.00522691011428833 
Acceleration Y: 0.000595645979046822 
Acceleration Z: 0.00370562076568604 

Acceleration X: 0.00506830215454102 
Acceleration Y: 0.000180358067154884 
Acceleration Z: 0.0017169713973999 

Acceleration X: 0.00555837154388428 
Acceleration Y: -0.00128581002354622 
Acceleration Z: 0.00320953130722046 

Acceleration X: 0.00509798526763916 
Acceleration Y: -4.2034313082695e-05 
Acceleration Z: 0.00197714567184448 

donc je suis très nouveau au codage CM (jour 2) et je suis un peu confus pourquoi je vois des changements d'accélération pour x, y et z lorsque l'iPhone est assis paysage dans un droit de berceau à présent? Ce comportement est-il attendu et existe-t-il une plage d'accélération que je devrais ignorer comme un faux positif?

Merci

Répondre

1

Alors, peut-être vous trouvé d'autres infos à ce sujet en ce moment. Mais comme il n'y a pas encore de réponse:

Généralement, il est normal d'avoir des enregistrements de mouvement lorsque le périphérique est immobile. Il y a deux raisons à cela: l'une est que le capteur produit lui-même un certain bruit d'erreur, l'autre est que le capteur aurait toujours une valeur de 1 dans un axe (ou plus vraisemblablement divisé entre les axes) vers la gravitation de la planète où nous vivons. Maintenant, cette partie gravitationnelle est divisée avec un filtre, mais cela introduit aussi quelques erreurs. Les erreurs du capteur lui-même devraient produire des erreurs négatives et positives de manière aléatoire et une moyenne mobile devrait éliminer l'impact de ceux-ci (votre axe Y ne semble pas être infecté par la division de la force gravitationnelle et l'accélération linéaire, et I suppose qu'il serait presque complètement annuler sur certaines valeurs). Donc, vous devriez déjà obtenir de meilleures valeurs en faisant la moyenne sur certaines valeurs passées. D'après les lectures, il y avait habituellement 2 axes avec des valeurs un peu plus élevées. Je suppose qu'ils apparaissent de la division de la gravitation, et votre téléphone était encore, mais peut-être un peu incliné parce que dans le gradle.

Maintenant, alors que 0,00quelque chose n'est pas faible, ce n'est pas non plus l'erreur la plus élevée. Vous pouvez avoir une idée de ce que les valeurs signifient en recherchant quelques références comme Wikipedia Magnitude ou peut-être ce côté pour les tremblements de terre où ils montrent quelle accélération est nécessaire pour le faire sentir par un humain;) Wikipedia Ground Acceleration. Je ne sais pas ce que Apple utilise pour diviser la force gravitationnelle, mais je me souviens qu'il y a au moins un moment n'était pas le meilleur filtre, mais assez rapide et utile pour les choses de l'interface utilisateur. Mais cela aurait pu changer avec ARKit. Donc, si vous avez besoin d'une division plus précise, la mise en œuvre d'un autre filtre basé sur la gravitation brute pourrait avoir du sens.

J'espère que cela a aidé un peu.