2017-10-04 4 views
0

L'objectif est de détecter la distance de déplacement de l'utilisateur par rapport au téléphone. Imaginez dans le scénario le plus simple, le téléphone est à plat sur une table avec le bouton d'accueil face au plafond.iOS: détecter le déplacement du téléphone de l'utilisateur vers la gauche/droite (pas de rotation, mais en mouvement)

Si l'utilisateur glisse le téléphone à gauche/droite le long de la table, comment pouvez-vous détecter le montant qui a été déplacé?

Le code ci-dessous ne semble pas enregistrer les bonnes valeurs:

let motionManager = CMMotionManager() 

override func update(_ currentTime: TimeInterval) { 
    processUserMotion(forUpdate: currentTime) 
}  

func processUserMotion(forUpdate currentTime: CFTimeInterval) { 
     // 2 
    if let data = motionManager.accelerometerData { 
     // 3 
     if fabs(data.acceleration.x) > 0.2 { 
      // 4 How do you move the ship? 
      print("X Acceleration: \(data.acceleration.x)") 
     } 

     if fabs(data.acceleration.y) > 0.2 { 
      // 4 How do you move the ship? 
      print("Y Acceleration: \(data.acceleration.y)") 
     } 

     if fabs(data.acceleration.z) > 0.2 { 
      // 4 How do you move the ship? 
      print("Z Acceleration: \(data.acceleration.y)") 
     } 
    } 
} 

Répondre

2

accéléromètres ne mesurent que les accélérations. Au mieux, vous pourriez voir une certaine accélération lorsque le téléphone commence à se déplacer vers la gauche/droite, et la décélération quand ils arrêtent de se déplacer vers la gauche/droite. En théorie, vous pouvez intégrer les accélérations plusieurs fois pour essayer de calculer une position (en physique de base/calcul, vous pouvez intégrer l'accélération pour obtenir la vitesse, et intégrer la vitesse pour obtenir la position). En pratique, les données de l'accéléromètre sont tout simplement trop inexactes et bruyantes pour que cela fonctionne avec un degré de précision raisonnable car à chaque étape d'intégration, les erreurs sont amplifiées. Je vous suggère de changer votre conception pour ne pas dépendre de positions absolues. Alternativement vous pouvez regarder dans ARKit qui utilise des caméras et le traitement d'image pour établir la position du téléphone dans l'espace mondial (bien que cela ne fonctionnerait pas dans votre exemple du téléphone allongé sur une table parce que la caméra ne verrait rien). Dans le cas où vous vous poseriez la question, la raison pour laquelle les rotations sont beaucoup plus simples à utiliser est que les accéléromètres mesurent la gravité comme une accélération, il est donc toujours facile de déterminer quelle est la vitesse de descente. Alors les gyroscopes (qui mesurent la rotation) sont assez précis pour établir le cap/azimut plutôt bien, et peuvent se combiner avec un compas magnétique pour corriger la dérive qui vient des erreurs accumulées.

Remplacer la rotation des périphériques par la traduction de l'appareil comme méthode de contrôle est une de ces choses qui semble simple, mais qui est en fait assez difficile/impraticable.

+0

Merci! En fait, l'exemple de la table était artificiel, simplifié pour simplifier le problème. Un cas d'utilisation réel sera de tenir le téléphone dans une main avec le pouce sur l'écran, un peu comme la position standard pour jouer à un jeu avec une main. Voulez-vous dire à partir de cette position, ARKit vous permet maintenant de mesurer facilement combien l'utilisateur déplace l'appareil gauche/droite alors que ce n'était pas vraiment pratique avant ARKit? – Crashalot

+0

Oui, je suis assez sûr qu'ARKit peut le faire, et il n'y avait vraiment rien de disponible avant. Je n'ai pas utilisé ARKit moi-même, donc je ne peux pas parler de la facilité d'intégration dans votre code ou de sa précision, ou s'il y a d'autres complications (par exemple c'est laggy, ou fonctionne uniquement avec de bons niveaux de lumière, devient confus si vous l'utilisez sur une scène de rue animée, etc, je ne sais pas) – Columbo

+0

Assez juste, j'espère que vous avez raison ARKit être capable de faire cela! – Crashalot