Question

Alors, je l'ai été aux prises avec ce problème depuis un certain temps, et n'a pas eu de chance tapotant la sagesse des internets et des postes connexes de SO sur le sujet.

Je suis en train d'écrire une application Android qui utilise le Accéléromètre omniprésent, mais il me semble être d'obtenir une quantité incroyable de « bruit », même au repos, et ne peut pas à comprendre comment traiter comme mes lectures ont besoin être relativement précis. Je pensais que peut-être mon téléphone (HTC Incredible) était dysfonctionnelle, mais le capteur semble bien fonctionner avec d'autres jeux et applications que j'ai joué.

J'ai essayé d'utiliser différents « filtres », mais je ne peux pas sembler envelopper mon esprit autour d'eux. Je comprends que la gravité doit être traitée dans le cadre d'une certaine façon, et peut-être que ce où je me trompe. À l'heure actuelle, je l'ai essayé, adapté d'un SO réponse, qui fait référence à un exemple de l'iPhone SDK:

                accel[0] = event.values[0] * kFilteringFactor + accel[0] * (1.0f - kFilteringFactor);
                accel[1] = event.values[1] * kFilteringFactor + accel[1] * (1.0f - kFilteringFactor);


                double x = event.values[0] - accel[0];
                double y = event.values[1] - accel[1];

L'affiche dit « jouer avec » la valeur kFilteringFactor (kFilteringFactor = 0.1f dans l'exemple) jusqu'à satisfaction. Malheureusement, il me semble encore avoir beaucoup de bruit, et tout cela semble faire est de faire les lectures sont disponibles en tant que minuscules décimales, ce qui ne me permettent pas tant que ça, et il semble juste rendre moins sensible le capteur. Les centres de mathématiques de mon cerveau sont également atrophiés des années de négligence, donc je ne suis pas tout à fait comprendre comment ce filtre fonctionne.

Quelqu'un peut-il me expliquer en détail comment s'y prendre pour obtenir un utile lecture de l'accéléromètre? Un tutoriel succinct serait une aide incroyable, comme je l'ai pas trouvé un très bon (au moins visant à mon niveau de connaissances). Je suis frustré parce que je me sens comme tout cela devrait être plus évident pour moi. Toute aide ou direction seraient grandement appréciés, et bien sûr je peux fournir plus d'échantillons de mon code, si nécessaire.

J'espère que je ne demande pas d'être nourrie à la cuillère trop; Je ne poserais pas à moins que j'ai essayé de comprendre notre pendant un certain temps. Il ressemble également à un certain intérêt des autres membres du SO.

Était-ce utile?

La solution

Pour obtenir une lecture correcte de l'accéléromètre, vous devez utiliser la vitesse d'équation = SQRT (x * x + y + z * y * z). Avec cela, lorsque le téléphone est le repos à la vitesse sera celle de la pesanteur - 9.8m / s. Donc, si vous soustrayez que (SensorManager.GRAVITY_EARTH), puis lorsque le téléphone est au repos, vous aurez une lecture de 0 m / s. En ce qui concerne le bruit, Blrfl peut-être raison sur accéléromètres bon marché, même si mon téléphone est au repos, il scintille en permanence quelques fractions d'un mètre par seconde. Vous pouvez simplement mettre un petit seuil 0.4m par exemple / s et si la vitesse ne dépasse pas cela, alors il est au repos.

Autres conseils

réponse partielle:

Précision. Si vous cherchez une grande précision, les accéléromètres bon marché que vous trouverez dans les combinés ne seront pas couper la moutarde. À titre de comparaison, un capteur approprié à trois axes pour un usage industriel ou scientifique fonctionne au nord de 1 500 $ pour seulement le capteur; ajouter le matériel au pouvoir et transformer ses lectures en quelque chose d'un ordinateur peut utiliser double le prix. Le capteur dans un combiné fonctionne bien en dessous de 5 $ en quantité.

Bruit. Capteurs bon marché sont inexactes, et d'imprécision se traduit au bruit. Un capteur inexact qui ne bouge pas montrera pas toujours des zéros, il affichera des valeurs de chaque côté dans une certaine plage. A propos du mieux que vous pouvez faire est de caractériser le capteur tout immobile pour avoir une idée du bruit qu'il est et l'utiliser pour arrondir vos mesures à une échelle moins précise basée sur l'erreur attendue. (En d'autres termes, si elle est de ± x m / s ^ 2 de zéro, il est sûr de dire que le capteur ne bouge pas, mais vous ne pouvez pas être sûr, précisément parce qu'elle pourrait se déplacer très lentement. ) Vous devrez le faire sur tous les appareils, car ils n'utilisent pas tout de même accéléromètre et ils ont tous se comportent différemment. Je suppose que ce l'un des avantages de l'iPhone a. À peu près homogène du matériel

Gravity. Il y a une discussion dans le documentation SensorEvent sur sur la gravité d'affacturage de ce que dit l'accéléromètre. Vous remarquerez qu'il porte beaucoup de similitude avec le code affiché, sauf qu'il est plus clair sur ce qu'il fait. : -)

HTH.

Comment réagissez-vous à l'énervement? Vous lisser les données. Au lieu de regarder la séquence des valeurs du capteur comme vos valeurs, vous en moyenne sur une base continue, et la nouvelle séquence formée deviennent les valeurs que vous utilisez. Cela déplace chaque valeur plus proche de la nervosité moyenne mobile. Calcul de la moyenne nécessairement se débarrasse des variations rapides des valeurs adjacentes .. et est la raison pour laquelle les gens utilisent la terminologie basse (fréquence) de filtrage passe, car les données qui peuvent à l'origine ont beaucoup varié par échantillon (ou unité de temps) varie maintenant plus lentement.

par exemple, au lieu d'utiliser les valeurs 10 6 7 11 7 10, vous pouvez prendre la moyenne de plusieurs façons. Par exemple, on peut calculer la valeur suivante à partir d'un poids égal de la moyenne (c.-à-de votre dernier point de données traitées) en cours d'exécution avec le prochain point de données brutes. L'utilisation d'un mélange 50-50 pour les chiffres ci-dessus, nous obtiendrions 10, 8, 7,5, 9,25, 8,125, 9,0675. Cette nouvelle séquence, nos données traitées, serait utilisé à la place des données bruyantes. Et nous pourrions utiliser un mélange différent de 50-50 bien sûr.

Par analogie, imaginez que vous déclarez où une personne se trouve en utilisant seulement votre vue. Vous avez une bonne vue sur le paysage plus large, mais la personne est engloutie dans un brouillard. Vous verrez des morceaux du corps qui retiennent votre attention .. un mouvement main gauche, un pied droit, terni lunettes, etc, qui sont nerveux, mais chaque valeur est assez proche du vrai centre de masse. Si nous courons une sorte de moyenne en cours d'exécution, nous obtiendrions des valeurs qui se rapprochent du centre de masse de cette cible se déplace à travers le brouillard et sont en effet plus précis que les valeurs que nous (le capteur) qui a été rapporté par le fait bruyant brouillard.

Maintenant, il semble que nous perdons des données potentiellement intéressantes pour obtenir une courbe de sondage. Il est logique que. Si nous essayons de recréer une image précise de la personne dans le brouillard, la première tâche est d'obtenir une bonne approximation lisse du centre de masse. Pour cela, nous pouvons ajouter des données à partir d'un processus de détection / mesure complémentaire. Par exemple, une autre personne pourrait être près de cet objectif. Cette personne pourrait fournir description très précise des mouvements du corps, mais peut-être dans l'épaisseur du brouillard et ne pas savoir où l'ensemble de la cible se termine vers le haut. Telle est la position complémentaire à ce que nous sommes arrivés - les secondes données donne le détail avec précision sans un sens de l'emplacement approximatif. Les deux données seront cousues ensemble. Nous avions passe-bas la première série (comme votre problème présenté ici) pour obtenir un emplacement général vide de bruit. Nous avions passe-haut la deuxième série de données pour obtenir le détail sans les contributions non désirées trompeuses à la position générale. Nous utilisons les données globales de haute qualité et des données locales de haute qualité, chaque ensemble optimisé de manière complémentaire et empêché de corrompre l'autre ensemble (par les 2 filtrages).

Plus précisément, nous remixait des données gyroscopique - les données sont exactes dans les détails locaux des « arbres », mais se perd dans la forêt (congères) - dans les données présentées ici (de l'accéléromètre) qui voit la forêt bien mais pas les arbres.

Pour résumer, nous avons des données passe-bas des capteurs qui est nerveux, mais reste proche du « centre de masse ». Nous associons cette valeur lisse de base avec des données exactes au détail, mais congères, donc ce second jeu est passe-haut filtrée. Nous obtenons le meilleur des deux mondes que nous traitons chaque groupe de données pour le nettoyer des aspects incorrects. Pour l'accéléromètre, nous lissons / passe-bas efficacement les données en exécutant une certaine variation d'une moyenne sur ses valeurs mesurées en cours d'exécution. Si nous traitions les données gyroscopiques, nous ferions les mathématiques qui maintient efficacement le détail (accepte deltas) tout en rejetant l'erreur accumulée qui finira par se développer et corrompre l'accéléromètre courbe lisse. Comment? Essentiellement, nous utilisons les valeurs gyroscopiques réelles (pas des moyennes), mais l'utilisation d'un petit nombre d'échantillons (de deltas) un morceau lors du calcul de nos valeurs propres finales au total. L'utilisation d'un petit nombre dedeltas maintient la courbe moyenne globale essentiellement le long des mêmes moyennes suivies par l'étage passe-bas (par la moyenne des données accéléromètre) qui forme la majeure partie de chaque point de données final.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top