Comment calibrer L'accéléromètre Android et réduire le bruit, éliminer la gravité
donc, j'ai été aux prises avec ce problème depuis un certain temps, et n'ai pas eu de chance de puiser la sagesse des internets et des messages de SO connexes sur le sujet.
j'écris une application Android qui utilise L'accéléromètre omniprésent, mais il semble que je reçois une quantité incroyable de "bruit" même au repos, et ne semble pas pouvoir comprendre comment traiter avec elle, car mes lectures doivent être relativement précis. J'ai pensé que peut-être mon téléphone (HTC Incredible) était dysfonctionnel, mais le capteur semble bien fonctionner avec d'autres applications et les jeux que j'ai joué.
j'ai essayé d'utiliser divers "filtres"mais je n'arrive pas à y croire. Je comprends que la gravité doit être traitée d'une manière ou d'une autre, et c'est peut-être là que je me trompe. Actuellement, j'ai essayé cela, adapté à partir d'un alors répondez, qui renvoie à un exemple du SDK iPhone:
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 de "jouer avec" la valeur de kFilteringFactor (kFilteringFactor = 0.1 F in l'exemple) jusqu'à satisfaction. Malheureusement, j'ai encore l'air d'avoir beaucoup de bruit, et tout cela semble faire, c'est de faire les lectures sont que de minuscules décimales, ce qui ne m'aide pas beaucoup, et il semble juste de rendre le capteur moins sensible. Les centres de maths de mon cerveau sont aussi atrophiés après des années de négligence, donc je ne comprends pas complètement comment ce filtre fonctionne.
quelqu'un Peut m'expliquer en détail comment faire passer un utile lecture à partir de l'accéléromètre? Un bref tutoriel serait d'une aide incroyable, que je n'ai pas trouvé vraiment bonne (au moins visait à mon niveau de connaissance). Je suis frustré parce que je sens que tout cela devrait être plus évident pour moi. Toute aide ou direction serait grandement appréciée, et bien sûr je peux fournir plus d'échantillons de mon code si nécessaire.
j'espère que je ne demande pas à être trop nourri à la cuillère; Je ne demanderais pas à moins que j'ai essayé de comprendre cela depuis un certain temps. Il aussi semble qu'il y est un certain intérêt auprès d'autres membres.
3 réponses
Pour obtenir une lecture correcte de l'accéléromètre, vous devez utiliser l'équation de la vitesse = SQRT(x*x + y*y + z*z). En utilisant ceci, quand le téléphone est au repos la vitesse sera celle de la pesanteur - 9.8 m/s. Donc, si vous soustrayez cela (SensorManager.GRAVITY_EARTH) ensuite, lorsque le téléphone est au repos, vous aurez une lecture de 0 m/s. En ce qui concerne le bruit, le Blrfl a peut-être Raison sur les accéléromètres bon marché, même lorsque mon téléphone est au repos, il clignote continuellement de quelques fractions de mètre par seconde. Vous pourriez juste mettre un petit seuil e.g 0,4 m/s et si la vitesse n'est pas, alors il est au repos.
réponse Partielle:
Précision. si vous recherchez une haute précision, les accéléromètres bon marché que vous trouvez dans les combinés ne couperont pas la moutarde. À titre de comparaison, un capteur à trois axes convenant à un usage industriel ou scientifique coûte plus de 1 500 $pour le seul capteur; l'ajout de matériel pour l'alimenter et transformer ses lectures en quelque chose qu'un ordinateur peut utiliser double le prix. Le capteur d'un combiné fonctionne bien en dessous de 5 $ quantité.
Bruit. les capteurs bon marché sont inexacts, et l'inexactitude se traduit par du bruit. Un capteur inexact qui ne bouge pas ne montrera pas toujours des zéros, il montrera des valeurs de chaque côté dans une certaine plage. Le mieux que vous pouvez faire est de caractériser le capteur tout en restant immobile pour avoir une idée du bruit qu'il fait et de l'utiliser pour arrondir vos mesures à une échelle moins précise basée sur l'erreur attendue. (En d'autres termes, si elle est à ± x m/s^2 de zéro, on peut dire sans risque que le capteur ne bouge pas, mais on ne peut pas en être sûr avec précision car il pourrait se déplacer très lentement. Vous devrez le faire sur tous les appareils, car ils n'utilisent pas tous le même accéléromètre et se comportent tous différemment. Je suppose que c'est un avantage de l'iPhone: le matériel est assez homogène.
Gravité. Il y a des discussions dans le SensorEvent
documentation sur la prise en compte de la gravité hors de ce que l'accéléromètre dire. Vous remarquerez qu'il ressemble beaucoup au code que vous avez posté, sauf qu'il est plus clair sur ce qu'il fait. : -)
HTH.
Comment réagissez-vous avec le jitteriness? Tu lisses les données. Au lieu de considérer la séquence des valeurs du capteur comme vos valeurs, vous les établissez une moyenne sur une base continue, et la nouvelle séquence formée devient les valeurs que vous utilisez. Cela déplace chaque nerveux valeur proche de la moyenne mobile. La moyenne élimine nécessairement les variations rapides des valeurs adjacentes.. et c'est pourquoi les gens utilisent la terminologie bas (fréquence) Pass filtrage car les données qui à l'origine ont pu varier beaucoup par échantillon (ou temps unitaire) varie maintenant plus lentement.
eg, au lieu d'utiliser les valeurs 10 6 7 11 7 10, vous pouvez les évaluer de plusieurs façons. Par exemple, nous pouvons calculer la valeur suivante à partir d'un poids égal de la moyenne courante (c.-à-d. de votre dernier point de données traitées) avec le prochain point de données brutes. En utilisant un mélange 50-50 pour les nombres ci-dessus, nous obtenions 10, 8, 7.5, 9.25, 8.125, 9.0675. Cette nouvelle séquence, nos données traitées, serait utilisée à la place des données bruyantes. Et nous pourrions utiliser un mélange différent que 50-50 de cours.
par analogie, imaginez que vous signalez l'endroit où une certaine personne se trouve en utilisant seulement votre vue. Vous avez une bonne vue du paysage plus large, mais la personne est engloutie dans un brouillard. Vous verrez des morceaux du corps qui attirent votre attention .. une main gauche en mouvement, un pied droit, brillent des lunettes, etc, qui sont agitées, mais chaque valeur est assez proche du vrai centre de la masse. Si on fait une moyenne, on aura des valeurs proches du centre de masse. de cette cible alors qu'elle se déplace dans le brouillard et sont en fait plus précises que les valeurs que nous (le capteur) avons rapportées qui ont été rendues bruyantes par le brouillard.
il semble maintenant que nous perdons des données potentiellement intéressantes pour obtenir une courbe ennuyeuse. Il fait sens. Si nous essayons de recréer une image exacte de la personne dans le brouillard, la première tâche est d'obtenir une bonne approximation régulière du centre de masse. Nous pouvons ensuite y ajouter des données provenant d'un capteur/mesure complémentaire. processus. Par exemple, une autre personne pourrait être proche de cette cible. Cette personne pourrait fournir une description très précise des mouvements du corps, mais elle pourrait se trouver dans le brouillard et ne pas savoir dans l'ensemble où finit la cible. C'est la position complémentaire de ce que nous avons d'abord obtenu -- la deuxième donnée donne le détail avec précision sans une idée de l'emplacement approximatif. Les deux données seraient cousues ensemble. Nous réussirions le premier set (comme votre problème présenté ici) pour obtenir un emplacement vide de bruit. Nous passerions la deuxième série de données pour obtenir le détail sans contributions trompeuses indésirables à la position générale. Nous utilisons des données globales de haute qualité et des données locales de haute qualité, Chaque ensemble optimisé de manière complémentaire et gardé de corrompre l'autre ensemble (à travers les 2 filtrages).
plus précisément, nous mélangeons des données gyroscopiques -- des données qui sont précises dans les détails locaux des "arbres" mais qui se perdent dans la forêt (dérives) -- dans les données discutées ici (à partir de l'accéléromètre) qui voit bien la forêt mais pas les arbres.
pour résumer, nous transmettons peu de données provenant de capteurs qui sont nerveux mais qui restent près du "centre de masse". Nous combinons cette valeur de base smooth avec des données qui sont précises au niveau des détails mais dérivent, donc ce deuxième ensemble est filtré high-pass. Nous obtenons le meilleur des deux mondes que nous traitons chaque groupe de données pour la nettoyer de mauvais aspects. Pour l'accéléromètre, nous lisses / bas passer les données efficacement en exécutant des variations de moyenne sur ses valeurs mesurées. Si nous traitions les données du gyroscope, nous ferions des calculs qui gardent efficacement le détail (accepte les deltas) tout en rejetant l'erreur accumulée qui finirait par croître et corrompre la courbe lisse de l'accéléromètre. Comment? Essentiellement, nous utilisons les valeurs réelles du gyro (et non les moyennes), mais nous utilisons un petit nombre d'échantillons (de deltas) par pièce pour calculer nos valeurs finales totales de nettoyage. L'utilisation d'un petit nombre de deltas courbe moyenne le long des mêmes moyennes tracées par le passage bas (par les données moyennes de l'accéléromètre) qui forme la majeure partie de chaque point final de données.