Découvrez ce que c'est et ce que nous avons réussi à faire pendant le travail sur le projet dans cet article.
Nous, Denis Tarasov et Denis Filippov, sommes déjà étudiants de deuxième année de premier cycle en mathématiques appliquées et en informatique au HSE de Saint-Pétersbourg. Nous avons travaillé sur le projet avec Yan Freidkin et Ivan Chunarev. Nous avons étudié avec eux dans la même école: Saint-Pétersbourg GFML n ° 30.
En 11e année, Yan et Ivan avaient un projet de robotique ー "Smart T-shirt" (c'est sur la première photo). L'idée est la suivante: un T-shirt est pris, divers capteurs y sont attachés (accéléromètre, gyroscope, et autres). Certains indicateurs peuvent être déterminés à partir des données lues, par exemple, la posture correcte. Les gars ont réussi à participer à plusieurs conférences et allaient continuer à travailler sur le projet après l'obtention de leur diplôme, mais ont réalisé qu'ils avaient besoin de programmeurs.
Le T-shirt de Jan et Ivan pouvait lire l'ECG et suivre la bonne posture. Pour cela, l'Arduino UNO a été utilisé, une plate-forme de développement avec des microcontrôleurs AVR obsolètes. Bientôt, ils ont manqué de mémoire de code. Lors d'une nouvelle étape de travail sur le projet, nous nous sommes rendu compte qu'il était nécessaire d'imposer des exigences plus strictes au microcontrôleur:
- pour connecter plus de capteurs, un processeur avec une fréquence plus élevée, plus de périphériques et des périphériques plus rapides était nécessaire;
- plus de mémoire flash, RAM;
- moindre coût;
- stabilité du microcontrôleur.
Nous avons décidé que nous devions changer le microcontrôleur. Nous avions deux options: utiliser un microcontrôleur de la série AVR plus puissant (dans notre cas Arduino) ou passer à une autre série de microcontrôleurs, à savoir ARM (dans notre cas STM32). Malgré la grande communauté Arduino et la facilité d'utilisation de ce microcontrôleur, nous avons décidé de passer à STM32 car il offre de meilleures performances et plus de mémoire. Nous utilisons actuellement un microcontrôleur STM32f4 *.
Au cours du dernier semestre, nous nous sommes fixé comme objectif de réaliser la réception d'informations sur la posture d'une personne et son traitement. Le schéma du projet est le suivant: nous avons un T-shirt, des accéléromètres et des gyroscopes y sont attachés, à l'aide desquels nous obtenons les angles de torsion. Les données reçues des capteurs sont envoyées au microcontrôleur. Là, ils sont traités et, si nécessaire, une tension est appliquée au moteur de vibration, ce qui stimule la personne à se redresser. À l'aide de l'application Android, le traitement de la posture est activé et désactivé et le t-shirt est lié à l'utilisateur. Mais en général, un T-shirt peut fonctionner sans accès à un smartphone: vous pouvez activer le traitement de la posture dans l'application, laisser votre téléphone à la maison et aller vous promener dans un T-shirt. Dans ce cas, les données seront traitées sur le microcontrôleur et le moteur de vibration se mettra en marche si la position est incorrecte.
Les premiers pas. LED allumée
Nous n'avions aucune expérience dans la programmation de microcontrôleurs, et nous avons lu que l'initialisation et la déclaration des capteurs et des broches sur un STM est longue et difficile. Par conséquent, nous avons utilisé un haut niveau d'abstraction en utilisant la bibliothèque HAL et STM32CubeMX . STM32CubeMX est un outil qui configure les ports du microcontrôleur à l'aide d'une interface graphique et génère le code approprié à l'aide de la bibliothèque HAL. Tout d'abord, nous avons décidé de faire la chose la plus basique dans la programmation du microcontrôleur (au niveau "Hello world") allumer la LED.
Interface STM32CubeMX
Après une longue recherche d'un IDE multi-plateforme, gratuit et facile à développer, nous nous sommes installés sur STM32CubeIDE .
La tâche d'allumer la LED ne s'est pas avérée la plus simple, car il y a pas mal d'informations sur la programmation STM32 sur Internet (surtout par rapport à Arduino). À l'avenir, ce facteur a également compliqué le travail sur le projet.
Micrologiciel du microcontrôleur
Après avoir appris à allumer la LED et compris comment programmer le microcontrôleur en général, nous avons commencé à écrire la base du micrologiciel du microcontrôleur, sur la base de laquelle diverses fonctionnalités pourraient être ajoutées à l'avenir. Pour commencer, il fallait apprendre à initialiser les capteurs et à en recevoir les informations. Des capteurs, nous avons réussi à obtenir uniquement les capteurs IMU: le gyroscope et l'accéléromètre. Nous avions des capteurs MPU-6050.
La communication avec le microcontrôleur s'effectue via le bus I2C. Grâce à la bibliothèque HAL, le transfert de données est facile: il faut appeler une fonction pour lire / écrire. Un exemple de lecture des données d'un accéléromètre à partir du code:
HAL_I2C_Mem_Read(i2c_handle, addres, ACCEL_XOUT_H_REG, 1, buffer, 6, 1000)
La fonction reçoit le gestionnaire du bus souhaité, l'adresse du capteur sur celui-ci, le registre à partir duquel il faut lire (les registres sont écrits dans la documentation du capteur), la taille du registre, le tampon d'écriture, la taille du tampon et le timeout (le temps passé à attendre une réponse) en millisecondes. La fonction d'enregistrement a une signature similaire. Exemple de réglage de la plage de mesure d'un gyroscope:
HAL_I2C_Mem_Write(i2c_handle, addres, GYRO_CONFIG_RE G, 1, &Data, 1, 1000)
Nous avions également un module Bluetooth (HC-05 et HC-06), mais il ne nécessitait aucune manipulation particulière pour fonctionner. Après l'avoir connecté, vous pouvez simplement envoyer des données via un émetteur-récepteur asynchrone universel (UART) - un appareil spécial à l'intérieur du microcontrôleur qui vous permet de communiquer avec d'autres appareils. Pour cela, le HAL fournit des fonctions similaires à celles de I2C. Nous venons d'écrire un petit wrapper sur eux pour faciliter l'affichage des messages lors du débogage.
HC-06
Ensuite, nous avons créé une classe Controller qui initialise les capteurs, démarre la boucle principale du programme et traite les requêtes provenant de l'application. Les demandes sont stockées dans une file d'attente, reçues via Bluetooth et reçues à l'aide d'un mécanisme d'interruption. Une interruption est un signal du logiciel ou du matériel qui informe le processeur de l'occurrence d'un événement nécessitant une attention immédiate. Le mécanisme d'interruption est nécessaire, entre autres, pour la réponse rapide du système aux événements importants.
Le contrôleur gère également une liste de fonctions T-shirt à l'aide de la classe de base BaseFunc. Pour le moment, nous n'avons que le traitement de posture, mais à l'avenir, lors de l'ajout de nouvelles fonctionnalités, il suffira de créer une classe descendante et de l'ajouter à la liste des fonctions. Le contrôleur ressemble à quelque chose comme ceci:
class Controller {
std::vector<std::unique_ptr<IMU>> IMUSensors; //
std::queue<Request> reqQueue; //
std::vector<std::pair<std::unique_ptr<BaseFunc>, bool>> mithrilFuncs; //
//< , >
Controller();
void Run(); //
};
De plus, pour obtenir les angles de torsion des capteurs IMU, nous avons dû ajouter un filtre spécial, qui, selon les données de l'accéléromètre et du gyroscope, donne les angles de déflexion corrects. Nous avons décidé d'utiliser un filtre complémentaire car il est suffisamment efficace et facile à mettre en œuvre. Lors de l'implémentation de ce filtre, nous avons écrit les calculs pour les quaternions. Il était possible de se débrouiller avec des vecteurs, mais des quaternions étaient nécessaires dans un autre filtre que nous avons testé, donc maintenant nous utilisons des quaternions.
Qu'y a-t-il sur le prototype
Après avoir compris la programmation du microcontrôleur et écrit les bases de son firmware, nous avions besoin d'un prototype de T-shirt, avec lequel nous pourrions commencer à traiter la posture. Et puis le coronavirus est intervenu ...
En raison de la pandémie, nous ne pouvions plus nous rencontrer et travailler sur un T-shirt avec nous quatre, et nous n'avons en fait pas eu l'occasion d'aller chez Jan et Ivan pour qu'en cas de problèmes avec les prototypes, nous puissions les résoudre rapidement. Jan et Ivan ont développé un prototype de T-shirt sur lequel les capteurs pouvaient être placés en tirant sur les fils afin qu'ils n'affectent pas les lectures avec leur poids et leur tension. Les gars ont envoyé à Denis et moi une copie d'un T-shirt, ainsi que du ruban électrique, des fils, etc., afin que nous puissions éliminer nous-mêmes les pannes possibles.
Application Android
Nous nous sommes fixé comme objectif de créer une application Android avec la possibilité de communiquer via Bluetooth avec un microcontrôleur. Comme dans le cas de la programmation de microcontrôleurs, nous n'avions pas d'expérience dans l'écriture d'applications pour Android, mais trouver des informations sur Android s'est avéré beaucoup plus facile que sur STM32. Nous avons appris les bases en utilisant le cours sur Stepik.org (le cours est vraiment bon), où vous analysez d'abord les bases du langage Kotlin, puis parlez de la programmation pour Android.
La première version de l'application permettait de se connecter au microcontrôleur via Bluetooth et de lui envoyer des messages. La dernière version ne diffère pas beaucoup de la première (l'écriture d'une application n'était pas une priorité pour nous): elle dispose désormais de widgets pour démarrer le calibrage et activer / désactiver la fonction de suivi de la bonne posture.
Il a fallu environ 6 heures pour écrire la première version fonctionnelle de l'application - nous avons passé plus de temps à étudier la théorie. Le code d'une application aussi simple prenait environ 400 lignes, ce qui était une agréable surprise. De plus, il peut être écrit de manière plus compacte.
Menu de navigation
Onglet pour la connexion Bluetooth
Onglet pour l'échange de données
Traitement de la posture
Nous avons proposé deux manières différentes de gérer la posture: avec et sans méthodes d'analyse des données.
Traitement de la posture à l'aide de techniques d'analyse de données
Dans la version précédente, il n'y avait qu'un seul capteur sur le T-shirt, selon les données à partir desquelles une décision était prise concernant la posture correcte d'une personne: cela dépendait de l'angle de rotation du capteur. De toute évidence, cette approche ne peut pas fournir une grande précision, car nous n'avons pas de données sur la position de la majeure partie du dos. Notre version dispose de 4 capteurs. Il était assez difficile de comprendre comment interpréter leurs lectures, nous avons donc décidé de recourir à des méthodes d'analyse des données. En raison de problèmes avec les prototypes, beaucoup n'a pas été fait à la date limite.
Tout d'abord, nous avons pris les données de nous-mêmes: les angles de torsion et les lectures de l'accéléromètre de chacun des capteurs. Nous avons obtenu environ 2000 mesures: environ 1000 positives et 1000 négatives. La configuration du capteur était la suivante (deux capteurs sont situés sur les omoplates et deux sur la colonne vertébrale):
Malheureusement, sur les deux prototypes, il y avait des problèmes avec l'un des quatre capteurs, donc le capteur numéro 3 n'a pas été utilisé. Nous les avons placés intuitivement: nous voulions suivre la position des omoplates et de la colonne vertébrale près du cou.
Projection de données dans un espace bidimensionnel.
Ici, les zones de posture correcte sont surlignées en vert, en rouge - incorrectes. Dans une projection sur un espace tridimensionnel, on voit que les positions correctes et les incorrectes sont faciles à séparer les unes des autres.
Ensuite, il était nécessaire de sélectionner des modèles de prédiction. Nous avons décidé d'essayer la régression linéaire, ou plutôt sa modification Ridge, support vector machine (SVM) avec un noyau linéaire et un arbre de décision. Le choix est dû à la simplicité de transfert des modèles vers le microcontrôleur: les deux premiers sont décrits par un certain nombre de coefficients, et le dernier est un ensemble de conditions if-else. Les modèles ont été extraits de la bibliothèque scikit-learn. Exemple de report de régression linéaire:
bool isPostureCorrect =
(a11 * deviceAngles1[0] + a12 * deviceAngles1[1] + a13 * deviceAngles1[2] +
g11 * deviceGravity1[0] + g12 * deviceGravity1[1] + g13 * deviceGravity1[2] +
a21 * deviceAngles2[0] + a22 * deviceAngles2[1] + a23 * deviceAngles2[2] +
g21 * deviceGravity2[0] + g22 * deviceGravity2[1] + g23 * deviceGravity2[2] +
a41 * deviceAngles3[0] + a42 * deviceAngles3[1] + a43 * deviceAngles3[2] +
g41 * deviceGravity3[0] + g42 * deviceGravity3[1] + g43 * deviceGravity3[2]) > bias;
les valeurs a ??, g ??, biais sont tirées du modèle entraîné.
La précision des modèles avec différentes configurations sur l'échantillon de test peut être vue dans le tableau:
La taille de l'échantillon de test était de 33% de toutes les données. Ces taux élevés sont probablement dus à la petite quantité de données, car les prévisions sont trop bonnes.
Dans la vraie vie, les modèles que nous avons testés (arbres de décision et certaines configurations de régression linéaire) ne fonctionnaient pas très bien, ils ont donc dû être légèrement ajustés pour qu'ils se comportent de manière plus appropriée. Le meilleur Ridge est celui formé aux angles de torsion.
Un exemple d'arbre de décision.
Lors d'une pandémie et avec seulement deux prototypes, nous n'avons pas pu collecter une grande quantité de données auprès de différentes personnes, ce qui est mauvais pour les modèles. De plus, la solution actuelle n'utilise qu'une seule mesure pour déterminer la posture correcte, ce qui, bien sûr, ne suffit pas. Une personne peut simplement se pencher sur l'objet et le t-shirt commencera à vibrer. Pour résoudre de tels problèmes, vous devez essayer des modèles qui font des prédictions à partir d'une séquence de données d'entrée, mais ces modèles seront plus difficiles à transférer vers le microcontrôleur de la manière qui était dans la solution actuelle.
Posture inversée sans méthodes d'analyse des données
Afin de gérer la posture sans ML, de nombreux articles médicaux sur la posture devaient d'abord être étudiés. Je voulais vraiment trouver des informations sur les caractéristiques quantitatives qui pourraient être mesurées et comparées à la norme: c'est-à-dire connaître la plage de valeurs «normale».
Nous avons étudié de nombreux articles, mais la plupart d'entre eux manquaient de caractéristiques quantitatives ou ne pouvaient être mesurées avec les moyens dont nous disposions. Un seul article s'est avéré utile pour nous (d'ailleurs, de nombreuses autres études liées à la posture humaine y font référence). Il décrit différents angles dont les valeurs peuvent être utilisées pour déterminer la bonne posture.
Mesures de posture chez les personnes atteintes de trouble dépressif majeur avant (A) et après (B) traitement de J. Canales et al (2010) La
seule chose à faire est de mesurer ces angles. Pour mesurer, vous pouvez représenter approximativement la position normale de la colonne vertébrale à l'aide d'une fonction, puis prendre les points nécessaires sur le graphique et rechercher les valeurs de divers angles à partir d'eux.
Configuration du capteur
Les capteurs sont situés le long de la colonne vertébrale. Aux points où elles se trouvent, vous pouvez obtenir les angles d'inclinaison des tangentes, et donc trouver la valeur de la dérivée (qui est égale à la tangente de l'angle d'inclinaison des tangentes). Lorsque la colonne vertébrale se plie, les coordonnées des points changent tout le temps. Pour cette raison, il est impossible d'appliquer, par exemple, l'interpolation Hermite. Dans ce cas, les distances entre les points le long de la courbe sont connues: elles peuvent être physiquement mesurées. Au départ, en utilisant ces données, nous voulions essayer de trouver une fonction lisse, par exemple, un polynôme. Mais, d'une part, cela nécessite plus de points auxquels les dérivées sont connues, et d'autre part, le problème n'est pas tout à fait simple du point de vue mathématique et informatique. Par conséquent, à ce stade de développement, il a été décidé d'approcher la colonne vertébrale en utilisant une fonction linéaire par morceaux.
En conséquence, des deux angles que nous avons essayé de mesurer (angles 3 et 4 dans l'image de l'article), l'un a été mesuré correctement, et l'autre non. Les valeurs de l'angle 3 coïncidaient avec les valeurs normales indiquées dans l'article. L'angle 4 a été mal mesuré en raison des caractéristiques de conception. Très probablement, le problème réside dans le fait que le t-shirt ne s'adapte pas parfaitement au corps à certains endroits, c'est pourquoi l'angle d'inclinaison des tangentes est mal calculé.
Vidéo de démonstration
Voici une vidéo de démonstration du t-shirt et de l'application fonctionnant:
Le traitement de la posture commence d'abord, puis l'étalonnage commence, puis les messages concernant la posture correcte commencent à arriver.
Conclusion
En conséquence, nous avons réussi à traiter la posture de deux manières, à gérer la programmation pour Android, à écrire une application pour Android et en même temps à comprendre un peu la programmation du microcontrôleur STM32.
Bien sûr, notre chemise ne peut pas être considérée comme terminée - mais jusqu'à présent, nous y travaillons depuis un semestre de la première année. Il reste encore beaucoup à faire et l'année prochaine nous prévoyons de continuer!
Maintenant, un peu sur nos projets pour l'avenir. Nous voulons:
- Affinez les approximations de la colonne vertébrale avec une fonction pour mesurer plus précisément les angles associés à la colonne vertébrale.
- Collectez plus de données pour le traitement de la posture. Pour le moment, les données ne proviennent que de nous deux et nos prototypes sont légèrement différents.
- Développez la fonctionnalité. Par exemple, ajoutez un enregistrement d'électrocardiogramme afin qu'il puisse être utilisé pour identifier diverses maladies, anomalies, etc.
- Améliorez l'application: développez ses fonctionnalités. Par exemple, calculez des statistiques, analysez-les, dessinez des graphiques.
- Créez un prototype de T-shirt qui aura une apparence plus commercialisable. Au stade actuel, les prototypes sont uniquement destinés à tester les fonctionnalités. Je veux créer un T-shirt, prêt à être pleinement utilisé.
Liens vers le github du projet:
github.com/DT6A/Mithril micrologiciel du microcontrôleur,
github.com/DT6A/MithrilAppー application Android,
github.com/DT6A/MithrilDataー fonctionnent avec des données.