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 ?