Gyroscope et reconnaissance de mouvement

Hello,

je dois coder (en C++) de la reconnaissance de mouvement d’un gyroscope, qui me donne rotation + acceleration.

Je dois être capable de détecter des mouvements relativements simples, comme un mouvement de haut en bas, de gauche a droite, des rotations simples (genre une rotation sur un seul axe); mais aussi des mouvements plus complexes, du type aller en haut puis en bas, un mouvement genre pagayer ou lancer une balle.

La reconnaissance n’a pas besoin d’être super précise. Une bonne estimation du mouvement est suffisante.

Je n’ai jamais fait de truc comme ça, mais de ce que je vois de mes recherches, c’est qu’il faudrait faire du traitement de signal, et j’ai notamment vu quelques techniques aux noms pas super évocateurs pour moi, comme Dynamic Time Warping, Hidden Markov Models, Wavelet Transform, Kalman Filtering ou bien Principal Component Analysis.

Est-ce que quelqu’un ici a déjà eu à faire ce genre de truc et pourrait me recommander une technique plutot qu’une autre?

Merci la zone!

Je ne suis de loin pas un expert, mais j’ai quelques pistes de recherche pour toi (c’est un domaine qui m’intéresse et j’aimerais bien construire un jour un petit bitoniau physique qui mesure l’angle de mes coupes avec un sabre ou une épée).

Donc tu as un gyro qui te donne les accélerations dans les 6 dimensions utiles (accélérations linéaires dans les axes XYZ, et angulaires autour des axes XYZ). Si tu veux rechercher en anglais, les mots clefs c’est 6DoF IMU (6 degree of freedom inertial measurement unit).

Des cours de physique de base on sait que accélération est la dérivée double de la position. Donc théoriquement si on intègre deux fois les mesures d’accélération au cours du temps, on peut avoir la position (si on sait qu’une voiture a accéléré pendant 3 secondes à 2m/s^2, on sait que sa vitesse à augmenté de 6 m/s, etc…).

Donc pour une première estimation, c’est tout ce que tu as besoin de faire: de l’accélération obtenir la vitesse, et de la vitesse obtenir la position. Répète ça tous les degrés de liberté que tu as, et tu peux modéliser la position de ton objet tranquilou.


Sauf que bien sûr c’est le monde idéal, en vrai il y a plein de problèmes.

  • Un des gros problèmes c’est le « gymbal lock ». J’ai toujours pas compris par quel jeu mathématique ça arrive, mais dans certains en intégrant tes données il se peu que tu perdre les mesures d’un accéléromètre (ou plutôt: tu ne vas plus être capable de distinguer quel mesure de quel accéléromètre correspond à quel angle). Il y a une solution mathématique à ça qui consiste à passer par une quatrième dimension en utilisant des quaternions.

  • Bruit: Tes gyro ne sont pas parfait et on du bruit dans leur mesure. Pour réduire ça, une des techniques avancée que tu as cité est le filtre de Kalman. C’est une technique qui modélise les mesures de tes gyro comme des gaussiennes corrélée, ce qui permet de réduire le bruit. Cet article est assez chouette et a des images qui aident beaucoup à la compréhension.

  • La précision de l’intégration n’est pas parfaite. C’est une variable qui va dépendre du temps et tu vas nécessairement accumuler des erreurs dans ton intégration (parce qu’on a pas une résolution temporelle infinie). En pratique tu vas donc avec de l’hystérèse / du drift: en répétant plusieurs fois un mouvement qui est censé retourner à un point de départ, celui-ci va se déplacer. Pour corriger ça il faut des références externes 1 + le pouvoir des maths™, et c’est probablement hors du scope de ton projet. Si tu veux aller dans cette direction le mot clef à chercher c’est « sensor fusion ».

1 pour l’anecdote: ça peut aller du plus simple comme par exemple juste pas faire beaucoup de mesure et calibrer souvent (la stratégie qu’utilise Nintendo dans Wii Sport Resort: on passe un temps fou à pointer l’écran pendant quelques secondes: c’est pour calibrer la Wiimote !), à un truc extrêmement compliqué comme les casques de VR actuels qui utilisent des caméras infra-rouge et beaucoup de computer vision pour se créer des points fixes dans l’environement. Et entre deux il y a la solution toute bête (mais moins précise) d’exploiter le fait qu’on repose tous sur un gros aimant appellé la Terre et d’ajouter un magnétomètre dans les senseurs qu’on utilise.


Mais ce que j’ai écrit jusqu’à la c’est purement pour avoir des mesures sur l’axe XYZ (linéaire et angulaire) qui sont potables / propres. Pour la reconnaissant de mouvement en tant que tel (est-ce, le mec est entrain de lancer une balle ? Pagayer? Saturday Night fever ? ) je pense que c’est les autres algo que tu as mentionnés.


Pas sur que tu ais besoin de PCA (Principal Component Analysis). C’est une technique qui consiste à prendre des mesures dans plein de dimensions différentes et de les combiner pour avoir plus qu’une poignée et utiliser cette réduction de dimension pouvoir identifier des groupes plus facilement.
Un exemple pratique serait de mesurer chez les geekzoniens la fréquence de leur CPU, la quantité de mémoire de leur ordinateur, la résolution de leur écran, le nombre de téléphone qu’ils ont, leur poids, le nombre de fois qu’ils font du sport par semaine, la longueur moyenne de leur cheveux. Et à partir de ça pouvoir faire des groupes de manière automatique (en suivant l’algo de la PCA), et de voir si à posteriori ça pourrait correspondre au groupe auquel on pourrait s’attendre (gamer, apple-fan, otaku, metalleux, …).
L’idée de l’algo est que chaque type de mesure peut contribuer à différente proportion à différent « composants » qui serait mathématiquement orthogonales.


Avec la popularisation de Arduino il y a tout plein de ressource qui sont dispo en ligne; jette-y un coup d’oeil ?

10 « J'aime »

J’ai rien compris mais super bravo sur le temps pris pour ta réponse.

1 « J'aime »

Il est pas expert mais fait une réponse de 2 pages sur le sujet qui semble parfaitement répondre au besoin ….
GG!!!

2 « J'aime »

La page Wikipedia En (la page fr est moins bien) a une anim qui explique bien le problème. Dans certaines configuration tu ne peux pas exprimer une rotation entre 2 orientation par un delta de pitch, yawn et roll (roulis, tangage, lacet) sans avoir une solution aberrante ( delta de ~ 180 sur deux angle alors que tu es proche ).
Les quaternions te permettent de résoudre ça, au dépends de ta santé mentale.

Mon superviseur m’a dit de regarder dans les quaternion pendant mon travail de Master (pour un truc de réhabilitation avec stimulation neurale). J’avais vraiment pas beaucoup de notions de robotique (je viens plutôt de la bio).

#PTSD


… Mais en vrai il y a (comme d’habitude) une super video de 3 Blue 1 Brown a ce sujet:

10 ans a multiplier des Quaternion pour Kerbal Space Program et je suis toujours aussi mauvais :slight_smile:
Merci pour la vidéo, avoir une visualisation peut être sympa.

J’essaye de répondre la semaine prochaine (j’aurai plus de temps) mais rapidement, pour t’aider :

ACP: pas nécessaire
Kalman : c’est un filtre de « observation / prédiction / correction. Pratique si ta mesure est trop variable, dérive trop ou « masquée » dans le temps
Model de markov : ca peut être intéressant si ce que tu veux détecter est caché dans des variables observables.

Ensuite, t’as la grosse artillerie :

  • LSTM pour prédire ton signal
  • Régression linéaire ou exp
  • CNN

Je pense que tu dois avoir tout ce qu’il faut dans tensorflow ou scikit-learn

1 « J'aime »

@PetitPrince

Je ne connais pas ce domaine et je trouve que tu l’as très bien expliqué de façon relativement synthétique : je pense avoir bien compris :slight_smile:, « super bravo sur le temps pris pour ta réponse ».

Merci beaucoup :slight_smile:

Je savais deja comment faire pour avoir la position depuis l’acceleration. Je n’avais pas dit mais tout ça est dans le contexte de developpement d’un jeu vidéo, c’est donc quelque chose qu’on est amené à faire assez souvent ^^

D’ailleurs sans rien devoiler du projet ou de la plateforme, il est deja decidé de passer par une étape de calibration aussi…

Je vais donc implémenter un filtre de Kalman pour filter le bruit, et je verrai les autres algos pour la detection de mouvement en temps que telle.

malheureusment pas possible d’utiliser la grosse artillerie dans notre cas ^^

1 « J'aime »

Il s’est clairement trompé de forum… :speak_no_evil: