web-dev-qa-db-fra.com

Détecter si un utilisateur se déplace dans une voiture

NOTICE: cette question avait été postée avant qu'Apple n'introduise le matériel de détection de mouvement et les API associées dans le SDK iOS. Les réponses à cette question restent toutefois pertinentes.


Je crée une application iPhone iOS qui consiste à suivre la course et/ou la marche d'un utilisateur. Il est très important que les résultats enregistrés des courses des utilisateurs et des marches restent honnêtes. J'ai besoin d'un moyen d'attraper un utilisateur qui triche peut-être (ou a accidentellement laissé le tracker allumé) lors de l'utilisation d'une voiture.

Pour vérifier si l'utilisateur conduit ou conduit dans une voiture, j'ai d'abord pensé à ces deux vérifications; cependant, ni {vraiment} _ ne peut déterminer si l'utilisateur est dans une voiture ou non (jusqu'à un point).

  1. Vérifiez la vitesse actuelle de l'utilisateur à l'aide de la méthode suivante. Si l'utilisateur voyage plus rapidement que 20 km/h, je peux supposer que l'utilisateur se trouve dans une voiture: 

    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
          CLLocation *recentLocation = [locations lastObject];
          recentLocation.speed; //If speed is over 20 MPH, assume the user is not on their feet.
    

    Cependant, je ne suis pas sûr que ce soit vraiment un bon chèque, car les gens ont été enregistrés pour aller plus vite que cela auparavant . Est-ce un bon chèque ou devrais-je utiliser autre chose?

  2. Déterminez la vitesse à laquelle l'utilisateur accélère à l'aide des API Accéléromètre et Motion fournies avec Core Motion Framework . Si l'utilisateur accélère au-dessus d'un certain taux, je pourrais supposer que l'utilisateur se déplace dans un véhicule.

Ces hypothèses sont-elles correctes? Je suppose que ma vraie question est la suivante: Existe-t-il un meilleur moyen de détecter si l’utilisateur se déplace dans un véhicule - si oui comment? Et si non, alors ces vérifications sont-elles adaptées à ce cas ou cela serait-il simplement gênant pour certains utilisateurs qui sont réellement ça rapides? CoreMotion est-il la bonne API pour faire cela?


EDIT: Le nouveau coprocesseur iPhone 5S M7 offre une détection de mouvement plus précise. Quelqu'un pourrait-il expliquer comment utiliser les nouvelles API M7?

32
Samuel Spencer

Tous les conseils relatifs à la sagesse (ou à l'absence de compréhension) concernant la prédiction des états de mouvement à partir des données de localisation s'appliquent toujours. Mais concernant votre mise à jour sur Core Motion et M7 ...

Oui, vous pouvez utiliser Core Motion sur des périphériques équipés d'un coprocesseur de mouvement M7, M8, M9, etc. (*) pour obtenir une indication sur le fait que l'utilisateur puisse conduire ou non.

  1. Créez un objet CMMotionActivityManager (après avoir utilisé sa méthode de classe isActivityAvailable pour déterminer si vous disposez des fonctionnalités M7 (+)), puis démarrez les mises à jour d'activités ou interrogez-le pour connaître les activités récentes.
  2. Vérifiez la propriété retournée CMMotionActivity objects 'automotive pour voir si iOS pense que l'utilisateur est/était dans une voiture.
  3. Il n'y a pas de troisième étape.

Comme les inférences GPS, cependant, vous devriez toujours prendre cette information avec un grain de sel. Les API CoreMotion vous donnent la meilleure estimation par iOS de l'activité de l'utilisateur, mais rien ne garantit qu'elle est précise à 100%. (Par exemple, je ne sais pas si monter dans un train peut compter comme automotive. Notez également que les différents types d'activité ne s'excluent pas mutuellement.) Il est préférable que votre application vérifie les types d'activité qui vous intéressent plutôt que d'essayer. exclure ceux que vous ne voulez pas.


(*) Les appareils M7 sont ceux dotés du SoC A7: iPhone 5s, iPad Air, iPad mini 2. M8 est A8, M9 est A9, etc. En résumé, chaque appareil iOS introduit depuis l'automne 2013, à l'exception de l'iPhone 5c. 

29
rickster

Vous pouvez utiliser cette simple bibliothèque pour détecter si l'utilisateur marche, court, sur son véhicule ou ne bouge pas. 

Fonctionne sur tous les appareils iOS et pas besoin de puce M7.

https://github.com/SocialObjects-Software/SOMotionDetector

Dans le repo, vous pouvez trouver un projet de démonstration

13
arturdev

Le contrôle basé sur CLLocation est la seule information fiable que vous puissiez obtenir. Comme spécifié par ALi dans Besoin de trouver la distance en utilisant Gyro + Accelerometer il est inutile de trouver la vitesse et la position pendant une période plus longue. Les valeurs d'accélération intégrées commencent à dériver après 0,5 à 2 secondes et il n'y a aucune chance de les réétalonner.

En fonction de votre cas d'utilisation, je vois plus de problèmes que ceux d'Usain Bolt: 44,72 km/h:

  1. Les régions sans signal GPS comme les tunnels, les parkings souterrains, ...
  2. Erreurs dans le GPS. Je me souviens d'une tournée de 6 heures dans les Alpes allemandes et voici ce que l'application en a pensé :-)
    Walking on water with 920 km/h
  3. Comme vous l'avez déjà mentionné, vous ne savez jamais si l'utilisateur se trouve dans une voiture, un train, un métro, un bus, etc.
3
Kay

Xcode 7.3, iOS 9.3

Merci à tous les contributeurs originaux. 

Je viens de passer quelques heures à essayer de comprendre pourquoi ce cours assez simple ne fonctionnait pas pour moi. J'ai utilisé toutes les suggestions ci-dessus et d'autres publications pour voir quelle activité, selon iOS, l'utilisateur était en train d'utiliser à l'aide de la structure Core Motion et de la classe CMMotionActivityManager.

Il s'avère que, pour une raison quelconque, mon "Suivi de la condition physique" dans "Paramètres" -> "Confidentialité" -> "Mouvement et Fitness" est désactivé. Et pour une raison quelconque, après avoir ajouté le cadre et appelé une classe CM, l'application. n'a pas demandé d'activer cela. Je dois l'avoir éteint manuellement.

Finalement, je suis tombé sur ce post ...

iOS: l'activité de mouvement est-elle activée dans Paramètres> Confidentialité> Activité de mouvement

Ce qui m'a amené à vérifier le réglage et à résoudre le problème. Après avoir basculé "Suivi de la condition physique" sur et lancé l'application. encore une fois, tout a fonctionné comme un charme.

Espérons que cela sauve du temps à quelqu'un! À votre santé.

1
serge-k