web-dev-qa-db-fra.com

comment calculer la distance en marchant dans android?

Je développe une démo pour mon application, dans laquelle il y a deux boutons nommés "START" et "STOP". Lorsque l'utilisateur tape sur "START", il commence à marcher. Ce que je veux faire est de faire en sorte que lorsque les utilisateurs tapent sur "STOP", la démo calcule sa distance entre "START" et "STOP". Si l'utilisateur a appuyé sur "START" et appuyé sur "STOP" sans faire un seul pas, alors il doit afficher 0 km ou 0 m. Je n'ai aucune idée de la façon dont je devrais commencer ceci; veuillez faire une suggestion.

21
rahul

Une façon de procéder consiste à utiliser les données de l'accéléromètre. Votre application doit enregistrer en continu les données de l'accéléromètre après que l'utilisateur a appuyé sur le bouton Démarrer. Vous observerez un pic dans vos données chaque fois que l'utilisateur fait un pas. Appliquez un filtre sur ces données et vous pourrez détecter le nombre de pas effectués avec une précision raisonnable. Multipliez-le par la longueur du pas et vous devriez obtenir une approximation de la distance parcourue. Prenez la hauteur de l'utilisateur comme argument d'entrée. La longueur du pas est d'environ 0,45 * Hauteur d'une personne. Puisque cette approche est indépendante du GPS, elle fonctionnera également à l'intérieur. EDIT: Vous devrez utiliser les valeurs de l'accéléromètre pour les trois axes pour le rendre assez indépendant de l'orientation de l'appareil.Vous pouvez aller avec x ^ 2 + y ^ 2 + z ^ 2

13
Navjot Singh

Il y a d'autres façons de le faire:

  1. [~ # ~] gps [~ # ~] : Continuez à ajouter une distance GPS entre 2 points toutes les X secondes (disons 10 secondes). Vérifiez Android Location.distanceTo ou distanceBetween. Vérifiez My Tracks app, c'est open source. Le GPS n'est pas disponible à l'intérieur et aurait une erreur si l'utilisateur change de direction très fréquemment (lire toutes les 1-2 secondes)
  2. Accéléromètre : Recherchez le code/la bibliothèque pour la détection de pas en utilisant l'accéléromètre. La distance vient de la double intégration de l'accélération, les erreurs peuvent s'additionner très rapidement ici.
  3. Détecteur de pas : intégré Nexus 5 . Google doit avoir pris en charge les erreurs d'accéléromètre dans la mesure du possible. Il s'agit d'un calcul basé sur le matériel, consomme moins de batterie mais n'est pas disponible dans la plupart des combinés à ce jour.

Vous pouvez également vérifier Estimation des piétons morts

19
Sangharsh

Demandez des autorisations GPS dans votre application. Lorsque le début est tapoté, enregistrez les coordonnées GPS. Faites de même pour l'arrêt. Vous avez maintenant deux coordonnées. Vous pouvez ensuite appliquer la formule de distance pour obtenir la distance totale parcourue.

Modifier:

En ce qui concerne le cas clarifié dans les commentaires, je pense que vous devez vous pencher sur les capteurs de mouvement d'Android. Vous devrez peut-être faire beaucoup d'hypothèses ou demander à vos utilisateurs de calibrer votre application avant de l'utiliser réellement.

Supposons que vous connaissez le facteur de rythme de votre utilisateur. En utilisant le capteur de mouvement, chronométrez combien de temps l'utilisateur "marche" (évidemment, il n'y a pas de moyen facile de déterminer si votre utilisateur marche réellement ou secoue simplement le téléphone). Multipliez cela par le facteur de rythme de votre utilisateur et vous aurez une idée assez approximative de la quantité de marche que votre utilisateur a faite.

6
skytreader

Comment to "Il y a un problème avec cette solution. Si vous voyagez à vitesse constante, l'accélération est de 0, donc l'accéléromètre ne reprendra aucune mesure. - jnovacho il y a 16 secondes" (désolé, n'a pas assez de réputation pour commenter directement)

lorsque vous effectuez une accélération, enregistrez l'accélération et calculez la vitesse à laquelle vous marchez. Arrêtez le calcul de la vitesse chaque fois que l'accélération change et recommencez. Si vous vous arrêtez, vous devriez recevoir une accélération négative, vous devrez alors calculer si vous venez de ralentir ou de vous arrêter complètement. Mais c'est tout simplement mathématique :)

3
swiknaba

J'étais allé avec la méthode Gps. Avec les étapes suivantes: Au clic du bouton de démarrage, la latitude et la longitude du point de départ ont été récupérées et stockées dans mon dto avec un TripId approprié.

sur le clic du bouton d'arrêt:

TripDto dto = service.GetStartLatLong(TripIdA);
double lat = Double.valueOf(dto.getStartLati());
double lon = Double.valueOf(dto.getStartLongi());
Location locationa = new Location("point A");
locationa.setLatitude(lat);
locationa.setLongitude(lon);
double distance = location.distanceTo(locationa);

La distance renvoyée par la méthode location.distanceTo () est en mètres.

3
Nishit Joshi
public double getDistance(double lat1, double lon1, double lat2, double lon2) 
{ 
    double latA = Math.toRadians(lat1); 
    double lonA = Math.toRadians(lon1);
    double latB = Math.toRadians(lat2); 
    double lonB = Math.toRadians(lon2);
    double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) +
        (Math.sin(latA) * Math.sin(latB));
    double ang = Math.acos(cosAng);
    double dist = ang *6371;
    return dist;
}
2
Dinesh Bagvan

Essayez d'utiliser des capteurs pour cela, je pense que vous ne devriez pas utiliser le GPS car il peut ne pas être aussi précis. Reportez-vous au projet de podomètre open source suivant pour ce dont vous parlez.

Bibliothèque podomètre

Met à jour cette réponse avec un code plus spécifié si vous souhaitez utiliser le capteur.

1
Harshal Benake