Comment j'ai fait un costume de capture de mouvement



Préface


Dans ma petite ville, je suis engagé dans la résolution de problèmes techniques non triviaux. Cette fois-ci, les organisateurs d'un spectacle, dans lequel la gymnaste était supposée jouer avec son programme, ont décidé d'ajouter un «point culminant» à sa performance. À savoir, pour afficher la silhouette d'une gymnaste sur les écrans, qui répéterait ses mouvements et interagirait en quelque sorte avec d'autres effets, afin que tout soit interactif. Il n'a pas été possible de résoudre le problème «front». Kinect n'a clairement pas pu faire face à sa tâche et n'a pas été en mesure de capturer les mouvements d'une personne qui se trouve à au moins 10 mètres de lui, également dans l'obscurité. Il a donc été décidé de faire quelque chose de «propre». Pour l'avenir, je dirai que la performance n'a pas eu lieu, mais je suis tellement excité par l'idée que j'ai continué mes expériences en tant que projet distinct, qui a ensuite été appeléimpulsion .

Pour commencer




J'ai commencé à prototyper le futur appareil dès que j'ai reçu les composants nécessaires. À savoir:

  • Arduino UNO est un concepteur de contrôleurs bien connu, qui vous permet de développer un prototype en peu de temps.
  • HC-06 - module bluetooth, servira de moyen de communication sans fil. Le module est très simple, possède une interface UART.
  • MPU-6050 - les seuls capteurs d'inertie à ma disposition à l'époque. J'en ai immédiatement acheté 2 pour vérifier comment ils fonctionnent par paires, car à l'avenir, il sera nécessaire d'utiliser jusqu'à 15 capteurs dans un seul système. Ce capteur combine un accéléromètre et un gyroscope, ainsi qu'un capteur de température pour régler la sortie.

Ayant tout reçu de cette liste, j'avais déjà hâte de voir mpu en action. Sur le forum officiel Arduino, il y avait plusieurs exemples d'utilisation de ces capteurs, et j'en ai utilisé un. Pour connecter les capteurs, 5 broches (contacts) sont utilisées:

  • VCC, GND - tout est clair, la puissance et la terre. Il convient de noter que la tension de fonctionnement du capteur est de 3,3 V, mais à 5 V, cela fait du bien. Consommation électrique inférieure à 0,05 Ah
  • SCL, SDA - en fait les broches à travers lesquelles il y a une "communication" avec le capteur. Ces broches sont responsables de l'interface i2c. Cette interface implémente la commutation entre les appareils sur le même bus, en d'autres termes, le bus est la rue et les maisons sont les appareils.
  • INT - broche pour les interruptions. Dès que les données du capteur sont prêtes, le contrôleur principal les interrompt.

Cependant, cet exemple n'affichait que les valeurs «brutes» de l'accéléromètre du terminal, et du code a été écrit pour se convertir en angles familiers, puis le filtre de Kalman a été implémenté, et tout cela ensemble occupait déjà environ 70% des ressources Arduino UNO. Néanmoins, des valeurs plutôt lisses des angles arrivaient déjà au terminal, l'appareil était assez rapide dans l'espace, bien que seulement quelques minutes, après quoi le tampon FIFO était plein. Mais ça a marché!



Stabilisez!


Peu à peu, la joie du capteur de travail a été éclipsée par la durée de l'ensemble du système. Autant je n'ai pas eu de mal avec le tampon FIFO, il a débordé. Il convient de noter qu'à cette époque, il y avait peu d'informations sur ces capteurs et les systèmes généralement similaires, et qu'elles devaient être collectées littéralement petit à petit. Ayant décidé que le problème réside dans la mise en œuvre de l'interface i2c, j'ai commencé à googler dans cette direction et j'ai trouvé la bibliothèque utilisateur I2Cdev, qui a été conçue pour remplacer la bibliothèque de câbles standard pour arduino. Une agréable surprise a été les exemples imbriqués d'utilisation de cette bibliothèque en conjonction avec mpu-6050. Après avoir reconstruit le projet sur cette bibliothèque, j'ai également reçu des données brutes et les ai converties en coins avec mon code, mais il n'y avait plus de débordements. Ce fut une petite victoire. Plus tard, en étudiant l'intérieur de la bibliothèque, j'ai trouvé beaucoup de choses utiles. Donc par exemplemaintenant en utilisant les données des deux capteurs - et l'accéléromètre et le gyroscope. Le fait est que l'accéléromètre vous permet de déterminer les angles d'inclinaison exacts de l'appareil uniquement au repos jusqu'à ce que des forces externes agissent sur lui, et le gyroscope est conçu pour compenser ces mêmes forces. L'utilisation des données des deux capteurs est devenue évidente, et ici un filtre complémentaire a trouvé une application. Cependant, il y avait un problème de dérive zéro, mais plus à ce sujet plus tard.

!


Et encore un récif. Cette fois, le problème qui m'a précédé a été d'utiliser le deuxième capteur mpu-6050. J'ai déjà donné une analogie avec l'interface i2c dans cet article, où le bus est la rue et les appareils sont à la maison. Imaginez qu'un paquet de données qui doit atteindre un appareil spécifique soit un facteur. Le facteur a besoin de 2 choses - le colis et l'adresse, et chaque maison a sa propre adresse unique, et les appareils doivent avoir leurs propres adresses. Le problème réside précisément dans l'adresse du capteur mpu-6050, il en est un pour tous ces capteurs - 0x68. Cette adresse est flashée dans le contrôleur du capteur en usine, mais il n'est pas possible de trouver le firmware et de changer l'adresse de chaque capteur. Les forums étrangers ont donné une solution: connecter les capteurs les uns après les autres, une jambe du premier capteur se connecte à la broche AD0 du second,et devient disponible à 0x69, mais cette méthode implique l'utilisation de pas plus de 2 mpu et je l'ai immédiatement abandonné.

La solution était les transistors. L'idée était de mettre une paire de transistors sur les broches i2c devant chaque capteur et de les ouvrir alternativement. L'algorithme est simple - il est nécessaire de lire les données du 5ème capteur, de fermer toutes les portes sauf la 5ème (ou de l'ouvrir si nécessaire) et de lire, puis de manière similaire nous obtenons les données du reste. Le résultat peut être vu sur la première photo de cet article, et il est tout à fait réalisable. De la même manière, j'ai réussi à connecter 4 capteurs, cela n'a pas affecté la stabilité de la meilleure façon, et quand j'ai manqué de transistors, j'ai décidé d'utiliser des microcircuits plus compacts et stables.

schéma de câblage
image

La seule photo survivante de cette étape (je m'excuse pour la qualité):



Contrôleur de porte


Un appareil qui combinera ces microcircuits et vous permettra de communiquer avec de nombreux capteurs mpu, j'ai appelé le contrôleur de porte. Il m'a été aidé par un bon ami qui avait déjà de l'expérience avec les planches de gravure, mais j'avais besoin d'une qualité que mes précédentes tentatives de gravure n'avaient pas. En raison des nombreuses pistes qui se croisent, une carte à deux couches était nécessaire, mais une carte à plusieurs niveaux pouvait également servir de prototype. Le résultat de ce travail a été un conseil si inhabituel:

dans la chaleur de la chaleur






Reste maintenant à vérifier l'appareil en action. Après avoir connecté 10 capteurs à la fois, les mêmes messages agréables sur l'initialisation réussie sont apparus sur le moniteur - l'appareil fonctionne!



Gimble Lock, Quaternions, visualisation


Serrure à cardan, en serrure à charnière russe ou cadres pliants - un phénomène désagréable dans le domaine des gyroscopes et, dans certains cas, de l'orientation dans l'espace. Sans une longue explication de ce phénomène (il y a de bonnes vidéos explicatives et visuelles sur ce sujet) je dirai juste que ce verrou à charnière ne permet pas au capteur de tourner à 360 degrés. Les axes XZ (déviations par rapport au plan horizontal) sont limités d'environ -45 à 45 degrés, et ne sont pas définis correctement au-delà de ces limites. Après avoir étudié ce sujet plus en détail, il s'est avéré que la solution est sous mon nez. Le MPU-6050 sont des capteurs à six axes, et ils ont dmp à bord. Dmp (DIgital Motion Processor) fait tout ce que j'ai écrit dans le code principal pour flasher le contrôleur principal pendant si longtemps, et filtre même les valeurs. De plus, dmp peut produire des données sous forme de quaternions,ce qui vous permet de contourner le verrou de la charnière, et également de réduire la taille des paquets transférés. À ce stade, ma connaissance des quaternions s'est poursuivie, plus tôt j'ai travaillé avec eux dans Unity3D et j'ai eu une idée. En termes simples, un quaternion est un système de nombres (4 nombres) qui décrit la rotation de quelque chose dans l'espace. Je me souviens juste d'Unity, j'ai essayé de représenter quelque chose comme ceci:



Contrôleur


Arduino et le contrôleur de porte se sont justifiés, mais leur utilisation dans la version finale n'était pas prévue. Il est temps de rendre le contrôleur spécifique et adapté à une tâche spécifique. À ce moment-là, j'ai à peu près modifié le firmware du futur contrôleur, configuré dmp de manière optimale, ce qui m'a permis de refuser d'utiliser les interruptions. Ainsi, chaque capteur était connecté par quatre broches, et non pas cinq, comme auparavant. De plus, deux des six puces du contrôleur de porte n'étaient pas nécessaires. Toutes ces améliorations ont conduit au fait que la carte du futur appareil a été conçue dans deux directions, et qu'il n'était plus nécessaire de faire un "over-the-top".



Logement


L'appareil a progressivement pris sa forme définitive, et l'étape suivante a été de rendre le cas logique. La solution évidente est de commander ou de se tourner vers des services d'impression 3D. Mais tout cela est simple et sans intérêt, nous avons donc acheté notre propre imprimante 3D pour plusieurs choses. En l'absence d'instructions, ils l'ont assemblé à un niveau intuitif, mais tout a fonctionné. En général, l'assemblage, la configuration et la préparation pour l'impression eux-mêmes méritent un article séparé, mais ce n'est pas tout. En utilisant tout le matériel de test, il ne restait plus qu'à attendre l'arrivée du plastique ABS.

Imprimante 3D




Pour la simulation, le programme 123D-Design a été sélectionné. Le programme est intuitif et toute personne ayant au moins un peu d'expérience dans les éditeurs graphiques 3D le maîtrisera rapidement.



Ensuite, j'ai imprimé tous les boîtiers, connecté les capteurs au contrôleur via de minces fils à 4 broches, fait des fixations pour les capteurs, tout assemblé et obtenu un costume prêt-à-porter, autonome et portable. Pour le premier prototype est tout à fait adapté.







Logiciels


En raison de certaines circonstances, j'ai reporté Unity3D «pour plus tard», les délais étaient épuisés et j'ai dû écrire rapidement un programme de visualisation. Je travaille avec le moteur graphique Xors3D depuis longtemps (peut-être que quelqu'un le sait) et cette fois il ne m'a pas déçu. Cependant, après avoir payé, je ne suis pas retourné à Unity, mais j'ai continué à développer l'environnement visuel du costume sur ce moteur particulier.



Liste des fonctionnalités actuelles:

  • Visualisation - le programme affiche le modèle d'une personne, qui répète en temps réel tous les mouvements d'une personne en costume
  • Calibration automatique - Vous permet de calibrer instantanément votre combinaison à tout moment
  • Positionnement - le modèle se déplace également dans l'espace comme une personne, peut s'accroupir, marcher, etc.
  • Enregistrement / lecture - Tous les mouvements peuvent être enregistrés et lus.
  • Mode de vue à la première personne - une sortie d'image pour oculus rift et d'autres casques de réalité virtuelle est fournie.
  • Interactivité - une personne portant un costume peut affecter le monde virtuel. Frapper des balles, ouvrir des portes, tordre un carrousel, etc. (moteur physique)

Conclusion


À l'heure actuelle, le projet comprend 1 prototype entièrement fonctionnel, autonome, portable et sans fil et tous les logiciels nécessaires. Il a fallu 8 mois pour développer ce costume (dont 2 je me suis reposé, 6 au total), mais pour moi c'est une époque entière. Pendant le projet, j'ai pompé mes compétences, essayé et fait beaucoup de ce que je n'avais que peu de connaissances auparavant, j'ai pu gagner un peu.

Quand j'ai commencé, il n'y avait qu'un intérêt pour "comment ça marche?" et l'existence de tels costumes que je ne connaissais pas encore. Cependant, au cours de la période de développement, au moins 3 de ces projets sont venus sur des sites de financement participatif, et je voulais en quelque sorte développer l'impulsion en tant que projet commercial, mais il est extrêmement difficile de m'exprimer lorsque je suis dans le territoire Trans-Baïkal. Maintenant, il n'y a pas assez de motivation pour s'asseoir pour un deuxième prototype, déjà sans fil et basé sur des capteurs à 9 axes, donc très probablement ce projet restera pour moi juste une expérience énorme et utile. Dans cet article, je voulais résumer tout le travail effectué, bien qu'il ne soit pas affiché ici et 20% de celui-ci. Tout le monde ne sera pas intéressé par des tonnes de code et des heures de soudure, l'impression 3D, beaucoup d'essais et d'erreurs, beaucoup de matériel utilisé, mais j'essaierai de répondre à ces questions dans les commentaires.

Source: https://habr.com/ru/post/fr392353/


All Articles