Précision de l'accéléromètre Android (navigation inertielle)

109

Je cherchais à mettre en œuvre un système de navigation inertielle pour un téléphone Android, ce qui, je me rends compte, est difficile étant donné la précision de l'accéléromètre et la fluctuation constante des lectures.

Pour commencer, j'ai placé le téléphone sur une surface plane et j'ai échantillonné 1000 lectures d'accéléromètre dans les directions X et Y (parallèles à la table, donc aucune gravité n'agissant dans ces directions). J'ai ensuite fait la moyenne de ces lectures et utilisé cette valeur pour calibrer le téléphone (en soustrayant cette valeur de chaque lecture ultérieure).

J'ai ensuite testé le système en le plaçant à nouveau sur la table et en échantillonnant 5000 lectures d'accéléromètre dans les directions X et Y. Je m'attendrais, compte tenu de l'étalonnage, à ce que ces accélérations totalisent 0 (environ) dans chaque direction. Cependant, ce n'est pas le cas, et l'accélération totale sur 5000 itérations est loin d'être proche de 0 (en moyenne autour de 10 sur chaque axe).

Je me rends compte que sans voir mon code, il peut être difficile de répondre mais dans un sens plus général ...

Est-ce simplement un exemple de l'inexactitude des lectures de l'accéléromètre sur un téléphone mobile (HTC Desire S), ou est-il plus probable que j'ai commis des erreurs dans mon codage?

woodstock365
la source
1
webvr-polyfill est une excellente source d'inspiration: github.com/borismus/webvr-polyfill/tree/master/src regardez comment ils polyfillent un capteur VR à l'aide des données d'accéléromètre: github.com/borismus/webvr-polyfill/blob/master / src /…
SC
Question qui considère également le gyroscope: stackoverflow.com/questions/8264518/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

128

Vous obtenez la position en intégrant l'accélération linéaire deux fois mais l'erreur est horrible. C'est inutile en pratique.

Voici une explication pourquoi (Google Tech Talk) sur 23:20 . Je recommande vivement cette vidéo.

Ce n'est pas le bruit de l'accéléromètre qui cause le problème mais le bruit blanc gyroscope , voir la sous-section 6.2.3 Propagation des erreurs. (Au fait, vous aurez également besoin des gyroscopes.)

En ce qui concerne le positionnement en intérieur, j'ai trouvé ceux-ci utiles:

Localisation et suivi en intérieur basés sur RSSI à l'aide de Sigma-Point Kalman Smoothers

Suivi des piétons avec capteurs inertiels montés sur chaussures

Amélioration des performances des podomètres à l'aide d'un seul accéléromètre

Je n'ai aucune idée de la façon dont ces méthodes fonctionneraient dans des applications réelles ou comment les transformer en une belle application Android.

Une question similaire est la suivante .

METTRE À JOUR:

Apparemment, il existe une version plus récente que celle d'Oliver J. Woodman ci-dessus, "Une introduction à la navigation inertielle", sa thèse de doctorat:

Localisation des piétons pour les environnements intérieurs

Ali
la source
2
Je me rends compte que c'est il y a longtemps, mais j'ai une question complémentaire. L'appareil photo d'Android JB dispose d'une fonction de `` panorama '', qui vous permet de prendre une photo panoramique en déplaçant le téléphone, en le faisant pivoter ou en le déplaçant linéairement le long d'un axe. Pour ce faire, il doit suivre la position du téléphone de manière relativement précise - au moins mieux que l'erreur de 20 cm / s mentionnée dans la vidéo de cette réponse. Comment ça marche? At-il un moyen d'améliorer la qualité du suivi inertiel? Ou utilise-t-il un traitement d'image intelligent pour le faire en utilisant uniquement l'appareil photo?
Tom le
1
@Tom Je crois que ce dernier, le téléphone concatène les images uniquement par des algorithmes de traitement d'image. Qu'est-ce qui vous fait penser que le téléphone doit suivre sa position pour produire une image panoramique? Il était possible de le faire avec des caméras ordinaires dans les années 90 et clairement, nous n'avions pas d'accéléromètres dans les caméras à l'époque :) Bien sûr, les images étaient concaténées sur un PC ordinaire. Mais vous n'avez pas besoin de la position pour cela, les algorithmes de traitement d'image suffisent. J'espère que cela t'aides.
Ali
C'est assez différent de l'ancien travail de prendre manuellement des photos puis de les assembler plus tard. Il suit sa position en temps réel d'une manière ou d'une autre. C'est un peu difficile à expliquer sans le démontrer. Vous n'êtes pas obligé de prendre des photos manuellement - le téléphone décide lorsque vous vous êtes suffisamment éloigné pour en prendre une autre. Pendant que vous prenez les photos, il vous montre une petite barre en bas avec un aperçu du panorama. Si vous pointez la caméra trop vers le bas (par exemple), elle commence à émettre un bip et à afficher une flèche vers le haut pour vous indiquer que vous devez la remonter.
Tom
2
En fait, il semble utiliser le traitement d'image - démarrer un panorama, puis agiter la main devant la caméra confondra assez mal son système de suivi de position!
Tom
@Tom OK. Je pense qu'il utilise principalement le traitement d'image (comme votre dernier commentaire le suggère également) mais il est susceptible d'être combiné avec le suivi de l' orientation (mais pas de la position).
Ali
19

Je réfléchis simplement à voix haute et je n'ai pas encore joué avec une API d'accéléromètre Android, alors soyez patient.

Tout d'abord, traditionnellement, pour obtenir la navigation à partir d'accéléromètres, vous auriez besoin d'un accéléromètre à 6 axes. Vous avez besoin d'accélérations en X, Y et Z, mais aussi de rotations Xr, Yr et Zr. Sans les données de rotation, vous ne disposez pas de suffisamment de données pour établir un vecteur à moins que vous ne supposiez que l'appareil ne change jamais d'attitude, ce qui serait assez limitant. Personne ne lit le TOS de toute façon.

Oh, et vous savez que l'INS dérive avec la rotation de la terre, non? Alors il y a ça aussi. Une heure plus tard, vous grimpez mystérieusement sur une pente de 15 ° dans l'espace. Cela suppose que vous disposiez d'un INS capable de maintenir l'emplacement aussi longtemps, ce qu'un téléphone ne peut pas encore faire.

Une meilleure façon d'utiliser des accéléromètres - même avec un accéléromètre à 3 axes - pour la navigation serait de se connecter au GPS pour étalonner l'INS chaque fois que possible. Là où le GPS n'est pas à la hauteur, l'INS complimente bien. Le GPS peut soudainement vous tirer à 3 pâtés de maisons parce que vous vous êtes trop près d'un arbre. INS n'est pas génial, mais au moins il sait que vous n'avez pas été touché par un météore.

Ce que vous pouvez faire, c'est enregistrer les données de l'accéléromètre du téléphone, et une grande partie. Comme des semaines. Comparez-les avec de bonnes données GPS (je veux dire vraiment bonnes) et utilisez l'exploration de données pour établir la corrélation des tendances entre les données de l'accéléromètre et les données GPS connues. (Conseil de pro: vous voudrez vérifier l'almanach GPS pendant des jours avec une bonne géométrie et beaucoup de satellites. Certains jours, vous pouvez n'avoir que 4 satellites et ce n'est pas suffisant) Ce que vous pourriez faire est de trouver que quand une personne marche avec son téléphone dans sa poche, les données de l'accéléromètre enregistrent un schéma très spécifique. Sur la base de l'exploration de données, vous établissez un profil pour cet appareil, avec cet utilisateur, et quel type de vitesse ce modèle représente lorsqu'il disposait de données GPS pour l'accompagner. Vous devriez être capable de détecter les virages, monter les escaliers, s'asseoir (calibrage à 0 temps de vitesse! ) et diverses autres tâches. La façon dont le téléphone est tenu devrait être traitée comme des entrées de données entièrement séparées. Je sens un réseau neuronal utilisé pour faire le data mining. Quelque chose de aveugle à ce que signifient les entrées, en d'autres termes. L'algorithme ne rechercherait que les tendances des modèles et ne prêterait pas vraiment attention aux mesures réelles de l'INS. Tout ce qu'il saurait, c'esthistorically, when this pattern occurs, the device is traveling and 2.72 m/s X, 0.17m/s Y, 0.01m/s Z, so the device must be doing that now.Et cela ferait avancer la pièce en conséquence. Il est important qu'il soit complètement aveugle, car le simple fait de mettre un téléphone dans votre poche peut être orienté dans l'une des 4 orientations différentes, et 8 si vous changez de poche. Et il existe également de nombreuses façons de tenir votre téléphone. Nous parlons ici de beaucoup de données.

Vous aurez évidemment encore beaucoup de dérive, mais je pense que vous aurez plus de chance de cette façon car l'appareil saura quand vous avez arrêté de marcher, et la dérive de position ne se perpétuera pas. Il sait que vous vous tenez immobile sur la base des données historiques. Les systèmes INS traditionnels n'ont pas cette fonctionnalité. La dérive se perpétue à toutes les mesures futures et se compose de manière exponentielle. Une précision impie, ou avoir une navigation secondaire à vérifier à intervalles réguliers, est absolument vitale avec les INS traditionnels.

Chaque appareil et chaque personne devrait avoir son propre profil. C'est beaucoup de données et beaucoup de calculs. Tout le monde marche à des vitesses différentes, avec des étapes différentes, et met son téléphone dans différentes poches, etc. Il est certain que la mise en œuvre de cela dans le monde réel nécessiterait une gestion des nombres côté serveur.

Si vous avez utilisé le GPS pour la ligne de base initiale, une partie du problème est que le GPS a tendance à avoir ses propres migrations au fil du temps, mais ce sont des erreurs qui ne se perpétuent pas. Installez un récepteur au même endroit et enregistrez les données. S'il n'y a pas de corrections WAAS, vous pouvez facilement obtenir des correctifs de localisation dérivant dans des directions aléatoires à 100 pieds autour de vous. Avec WAAS, peut-être jusqu'à 6 pieds. Vous pourriez en fait avoir plus de chance avec un système RTK sous-mètre sur un sac à dos pour au moins obtenir l'algorithme de l'ANN.

Vous aurez toujours une dérive angulaire avec l'INS en utilisant ma méthode. C'est un problème. Mais, si vous êtes allé aussi loin pour créer un ANN pour déverser pendant des semaines des données GPS et INS parmi n utilisateurs, et que vous l'avez fait fonctionner jusqu'à présent, cela ne vous dérange évidemment pas pour le moment. Continuez sur cette voie et utilisez plus de données pour aider à résoudre la dérive angulaire: les gens sont des créatures d'habitude. Nous faisons à peu près les mêmes choses, comme marcher sur les trottoirs, franchir les portes, monter les escaliers, et ne pas faire des choses folles comme traverser les autoroutes, traverser les murs ou sortir des balcons.

Supposons donc que vous preniez une page de Big Brother et que vous commenciez à stocker des données sur la destination des gens. Vous pouvez commencer à cartographier les endroits où les gens devraient marcher. Il y a fort à parier que si l'utilisateur commence à monter les escaliers, elle se trouve au même pied que la personne avant elle. Après 1000 itérations et quelques ajustements aux moindres carrés, votre base de données sait à peu près où se trouvent ces escaliers avec une grande précision. Vous pouvez maintenant corriger la dérive angulaire et l'emplacement lorsque la personne commence à marcher. Lorsqu'elle atteint ces escaliers, tourne dans ce couloir ou descend un trottoir, toute dérive peut être corrigée. Votre base de données contiendrait des secteurs pondérés par la probabilité qu'une personne s'y promène ou que cet utilisateur y ait marché dans le passé. Les bases de données spatiales sont optimisées pour cela en utilisantdivide and conquerde n'allouer que des secteurs significatifs. Ce serait un peu comme ces projets du MIT où le robot équipé d'un laser commence par une image noire et peint le labyrinthe en mémoire en prenant chaque tour, éclairant où se trouvent tous les murs.

Les zones à fort trafic auraient des poids plus élevés, et les zones où personne n'a jamais été à 0 poids. Les zones à trafic élevé ont une résolution plus élevée. Vous vous retrouveriez essentiellement avec une carte de partout où quelqu'un a été et vous l'utiliserez comme modèle de prédiction.

Je ne serais pas surpris si vous pouviez déterminer quel siège une personne a pris dans un théâtre en utilisant cette méthode. Avec suffisamment d'utilisateurs pour le cinéma et une résolution suffisante, vous auriez des données mappant chaque rangée du cinéma et la largeur de chaque rangée. Plus il y a de personnes qui visitent un lieu, plus la fidélité avec laquelle vous pouvez prédire que cette personne se trouve est élevée.

De plus, je vous recommande vivement de vous abonner (gratuitement) au magazine GPS World si vous êtes intéressé par les recherches actuelles sur ce genre de choses. Chaque mois, je me débrouille avec ça.

RyanJMcGowan
la source
"serait de se lier au GPS pour étalonner l'INS chaque fois que possible. Là où le GPS échoue, l'INS complimente bien." C'est à cela que sert le filtrage de Kalman, si je comprends bien. Il combine les forces de chaque méthode pour annuler les faiblesses de l'autre
endolith
8

Je ne sais pas à quel point votre décalage est important, car vous avez oublié d'inclure des unités. ("Environ 10 sur chaque axe" ne dit pas grand-chose.: P) Cela dit, c'est toujours probablement dû à une imprécision dans le matériel.

L'accéléromètre convient pour des choses comme la détermination de l'orientation du téléphone par rapport à la gravité, ou la détection de gestes (secouer ou cogner le téléphone, etc.)

Cependant, essayer de faire de l'estime à l'aide de l'accéléromètre vous exposera à de nombreuses erreurs composées. Dans le cas contraire, l'accéléromètre devrait être incroyablement précis, et ce n'est pas un cas d'utilisation courant, donc je doute que les fabricants de matériel optimisent pour cela.

Trevor Johns
la source
Merci d'avoir répondu. Les accéléromètres lisent environ -0,8 ms ^ -2 sur les axes X et Y lorsqu'ils sont stationnaires, je l'ai donc utilisé comme décalage. Par le bit "Environ 10", je voulais dire que sur 5000 itérations, l'addition de chacune des accélérations sur un seul axe du capteur ne totalisait pas environ 0 ms ^ -2 (comme si elle fluctuait uniformément au-dessus et au-dessous du décalage valeur), mais avait plutôt tendance à enregistrer une accélération plus dans une direction, ce qui, après une double intégration pour trouver la position, fonctionnait comme le téléphone se déplaçant d'environ 3 m en une minute.
woodstock365
+1 pour l'utilisation du terme de navigation aéronautique, «à l'estime». Bien que l'estime soit plus appropriée pour la navigation avec une caméra qu'un INS.
RyanJMcGowan
7

L'accéléromètre Android est numérique, il échantillonne l'accélération en utilisant le même nombre de "seaux", disons qu'il y a 256 seaux et l'accéléromètre est capable de détecter de -2g à + 2g. Cela signifie que votre sortie serait quantifiée en termes de ces "compartiments" et sauterait autour d'un ensemble de valeurs.

Pour calibrer un accéléromètre Android, vous devez échantillonner plus de 1000 points et trouver le "mode" autour duquel l'accéléromètre fluctue. Ensuite, trouvez le nombre de points numériques en fonction de la fluctuation de la sortie et utilisez-le pour votre filtrage.

Je recommande le filtrage de Kalman une fois que vous obtenez le mode et les fluctuations +/-.

Alex Stone
la source
1
Je cherchais des méthodes de calibrage. Il me semble que votre suggestion est ce dont j'ai besoin. J'ai juste besoin de confirmer. Une fois que j'ai trouvé le mode, disons qu'il est 0,5. Je n'ai pas eu le "Ensuite, trouvez le nombre de points numériques en fonction de la fluctuation de la sortie et utilisez-le pour votre filtrage." Pourriez-vous s'il vous plaît élaborer davantage.
Nazerke
1
Disons que votre accéléromètre a 256 points de sortie et fluctue de 0,015 m / s ^ 2 entre les lectures. Lorsque vous posez votre appareil sur la table, votre sortie peut fluctuer par multiples pairs de 0,015 m / s ^ 2. Disons que vous obtenez une lecture de 0 +/- (X * 0,015). Vous devez trouver X (qui serait un nombre pair). Par exemple, mon X peut être 3. Dans ce cas, j'ignorerais les changements de lecture de l'accéléromètre inférieurs à 0,045 m / s ^ 2
Alex Stone
donc les accéléromètres des téléphones Android ne sont pas encore si bons ... corrects?
Techsin
4

Je me rends compte que c'est assez ancien, mais le problème en question n'est abordé dans AUCUNE des réponses données.

Ce que vous voyez est l'accélération linéaire de l'appareil, y compris l'effet de la gravité. Si vous posez le téléphone sur une surface plane, le capteur signalera l'accélération due à la gravité qui est approximativement 9.80665 m/s2, donnant ainsi le 10 que vous voyez. Les capteurs sont inexacts, mais ils ne sont pas SI inexacts! Voir ici pour quelques liens utiles et des informations sur le capteur que vous recherchez.

Simon O'Hanlon
la source
17
Non - Je pense que vous avez mal interprété la question: "... lectures dans les directions X et Y (parallèles à la table, donc aucune gravité n'agissant dans ces directions)". Le 9.8 / s2 serait sur l'axe Z.
théière 7
0

Vous faites l'hypothèse que les lectures de l'accéléromètre dans les directions X et Y, qui dans ce cas sont entièrement du bruit matériel, formeraient une distribution normale autour de votre moyenne. Ce n'est apparemment pas le cas.

Une chose que vous pouvez essayer est de tracer ces valeurs sur un graphique et de voir si un modèle émerge. Sinon, le bruit est statistiquement aléatoire et ne peut pas être calibré, du moins pour le matériel de votre téléphone.

Salsepareille
la source