Filtrer des données d'accéléro :.

Bonjour à tous,

je cherche à filtrer des données provenant d'un accéléro Freescale MMA7260Q dans le but d'obtenir la vitesse et la position dans l'espace. Bon, ok, après deux semaines de recherches sur le net, je me rends bien compte que c'est pas évident, car le fait d'intégrer la vitesse et la position amplifie tellement les erreurs qu'à la fin on a n'importe quoi... :smiley:

L'idée serait de corriger dynamiquement les erreurs (notamment le jitter de l'accéléro) en implémentant un algo qui reconnait les invariants dans le signal qui sont du bruit et ceux qui sont du déplacement... J'ai trouvé des miliers de trucs sur les filtres de kalman (Extended Kalman Filter), mais j'ai pas l'impression que ça marche du tonnerre... des idées ?

un des papiers de recherche qui m'a donné le plus de bons résultats est dispo ici:
https://www.enactivenetwork.org/download.php?id=100

qu'en pensez vous les arduino masterz ??

à++,
j*b

Et pourquoi ne pas filtrer électroniquement le signal, c'est peut être moins pratique, mais il y'a plus de montage dispo sur internet.

ça ne me gène pas d'utiliser de l'électronique pour filtrer, le truc c'est que je ne vois pas exactement comment filtrer, quel genre de logique suivre pour approximer en temps réel la position à partir de l'accélération...

j'ai vu plein de circuits pour IMU sur le net mais je trouve peu de détails sur la façon dont l'électronique de filtrage est architecturée...

peut-être aurais-tu une ressource à me conseiller ?

j*b

En fait je ne suis pas sûr de comprendre. Avec l'accélerométre, tu veux la position et la vitesse, mais à partir de l'accéleration, tu peux connaître la vitesse par calcul, de même que la position (relative à la position de départ).

oui exactement, seulement lorsqu'on intègre la position à partir de l'acceleration, on obtient des trucs faux car les accéléros sont toujours bruités (jitter, décalages, drift)... Donc il faut un algo pour filtrer les données, et jusqu'ici j'en ai pas trouvé de super, mais je sais qu'il y en a qui marchent bien...

Tu utlises l'exemple qu'il y a dans les tutorials d'Arduino ?

oui, j'utilise ce code, seulement il permet d'avoir simplement l'accélération, pas la vitesse courante ni la position dans l'espace...

en fait mon problème réside dans le fait que je cherche à calculer la position dans l'espace de manière fiable pour utiliser mon accéléro comme un pointeur (comme une souris si tu veux). Pour l'instant quand je fais un geste dans un sens puis exactement le même geste dans l'autre sens, ma position calculée ne revient pas au même endroit...

je précise que je fais ceci sur un plan et en utilisant 2 axes pour ne pas ajouter en plus les problèmes dus à la gravité...

merci en tous cas pour ton intéret dans mon problème :slight_smile:

j*b

De rien :wink:
En fait, ton accélero. te renvoie des signaux avec plusieurs composantes, dont certaines perturbe le fonctionnement ? Quel est le type de sortie sur ton accélero. ? analogique ?

oui, c'est de l'analogique http://itp.nyu.edu/physcomp/sensors/Reports/MMA7260Q

mon problème ne vient pas du bruit inhérent au signal que me donne le freescale, mais plutôt de la nature du mouvement que je tente de caractériser. Le mouvement humain est non-linéaire, il est donc difficilement intégrable. La formule selon laquelle la position est la double intégrale de l'acceleration ( X = Xp + dt * vX + dt * dt * aX ) est correcte lorsque l'acceleration est constante, comme lorsqu'une voiture accélère par exemple. Quand on bouge sa main dans l'espace, on fait des micros accélerations et décélérations, cette formule ne s'applique donc plus comme expliqué ici : Kalman filter - Wikipedia

Donc, pour estimer la position en fonction de l'accéleration, il faut implémenter ce genre de filtre récursif dynamiques. On peut le faire avec de la programmation dans un microcontrolleur (ce que j'essaye de faire avec une arduino textile

et on peut le faire aussi avec des composants de traitement dédiés, mais là je n'en connais pas vraiment qui soient à ma portée, les seuls que j'ai trouvés s'installent dans des missiles :wink:

bref, c'est le bordel à implémenter, et malgré de nombreuses recherches et expérimentations, j'ai pas encore de résultats probants. Mon objectif étant au final de réaliser une application ou on pourrait enregistrer en 3D les dessins qu'on fait avec les mains quand on explique une idée à quelqu'un, puis de pouvoir naviguer dans ces représentations 3D à l'aide de l'accélero.

Pour l'instant, j'arrive à dessiner des objets en 3D avec l'accéleration pure, mais le problème est que ce n'est pas un geste intuitif (il faut accélerer pour dessiner). Ca marche pas mal, mais j'essaye d'améliorer le truc pour que ça soit utilisable par des enfants de maternelle (c'est mon sujet de thèse à l'INRIA). Par exemple voici ce que donne un mouvement fait par quelqu'un qui explique comment jouer à un jeu vidéo à quelqu'un d'autre:

L'idée est ensuite d'intégrer ces données 3D dans des images réelles pour faire du compositing et ainsi pouvoir visualiser en temps réel dans le flux vidéo les objets qu'on dessine avec les mains, un peu dans l'idée de ces deux anglais qui on foutus des accéleros sur leur chien:

et donc, pour pouvoir dessiner, il faudrait que je connaisse la position de manière plus ou moins robuste, en tout cas, avec le moins de drift possible...

voili, voilou,

j*b

Il faudrait peut être "moyenner" l'accéleration sur les 2 axes, pour que l'intégration soit meilleure.
Pour ça tu peux peut être diminuer la fréquence d'échantillonage, mais ce sera pas super précis. :frowning:

http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2005/mouse%20webpage%20KM249_AK288/index.htm

Ca peut t'aider :wink:
Voir aussi les liens des "References"

merci, apparement ils ont décidé d'abandonner l'idée de calculer la position à partir de l'accélération :wink:

In conclusion, position from accelerometers is just really, really hard. We would not say it is impossible. Given enough time and resources, we are confident we can solve the problem, but that would require a lot of time and resources that we just did not have for our project. Even Samsung failed in making a keyboard based on accelerometers. They have been trying for nearly 4 years, but have not made anything that can be commercialized yet. So we don't feel too bad that we couldn't get it to work in a month.

leur truc utilise la gravité pour fonctionner, en gros tu diriges le pointeur en tournant la souris sur ses axes...

'tain, c'est si dur que ça de calculer cette fichue position ??!!?

:wink:

j*b

Ps: j'ai trouvé des méthodes qui marchent bien, mais il faut en plus utiliser de la vision par ordinateur et corriger le drift des accéléros par la caméra, mais ce n'est pas très mobile... Dans ce cas là, les accéléros facilitent le travail de matching du programme de vision par ordi, un des meilleurs papiers ici qui détaille l'utilisation d'un IMU 9 DOF (gyroscopes, accéléros, magnétomètres) + un système de reconnaissance de marqueurs de type fiducial par des caméras stéréoscopiques :

http://www.isense.com/uploadedFiles/Products/White_Papers/VIS-Tracker_A%20Wearable%20Vision-Inertial%20Self-Tracker.pdf

Autant pour moi :slight_smile:
Pour la Wiimote, ils utilisent en plus un systéme infrarouge, car l'accélerométre n'est pas très précis. Ca permet de donner une autre approximation de la position, mais plus précisément. Pourtant on peut s'en servir sans, même sur un ordi (Utilisez la Wiimote de la Nintendo Wii sur PC / Mac).
Sinon, comme autre solution, y'a la triangulation avec un émetteur à la place de l'accélerométre.