Kleidung ist schlau, aber wir sind schlauer: Wie wir ein T-Shirt mit Haltungskontrolle hergestellt haben

Hallo! Im zweiten Semester machen alle Erstsemester des Studiengangs Angewandte Mathematik und Informatik an der HSE in St. Petersburg Teamprojekte in C ++ . Wir haben ein schickes T-Shirt entwickelt.



Lesen Sie in diesem Artikel, was es ist und was wir während der Arbeit am Projekt geschafft haben.





Wir, Denis Tarasov und Denis Filippov, sind bereits Studenten im zweiten Studienjahr in Angewandter Mathematik und Informatik an der HSE in St. Petersburg. Wir haben zusammen mit Yan Freidkin und Ivan Chunarev an dem Projekt gearbeitet. Wir haben mit ihnen an derselben Schule gelernt: St. Petersburg GFML Nr. 30.



In der 11. Klasse hatten Yan und Ivan ein Robotikprojekt - "Smart T-Shirt" ( siehe erstes Foto). Die Idee ist folgende: Es wird ein T-Shirt genommen, an dem verschiedene Sensoren angebracht sind (Beschleunigungsmesser, Gyroskop und andere). Einige Indikatoren können aus den gelesenen Daten ermittelt werden, beispielsweise die richtige Haltung. Die Jungs konnten an mehreren Konferenzen teilnehmen und wollten nach dem Abschluss weiter an dem Projekt arbeiten, stellten jedoch fest, dass sie Programmierer brauchten. Eigentlich sind wir hier.



Das T-Shirt von Jan und Ivan konnte das EKG lesen und die richtige Haltung verfolgen. Hierfür wurde das Arduino UNO verwendet, eine Entwicklungsplattform mit veralteten AVR-Mikrocontrollern. Schon bald ging ihnen der Codespeicher aus. In einer neuen Phase der Arbeit an dem Projekt haben wir erkannt, dass es notwendig ist, strengere Anforderungen an den Mikrocontroller zu stellen: 



  • Um mehr Sensoren anzuschließen, wurde ein Prozessor mit einer höheren Frequenz, mehr Peripheriegeräten und schnelleren Peripheriegeräten benötigt.
  • mehr Flash-Speicher, RAM;
  • Niedrigere Kosten;
  • Stabilität des Mikrocontrollers.


Wir beschlossen, den Mikrocontroller zu wechseln. Wir hatten zwei Möglichkeiten: Verwenden Sie einen leistungsstärkeren Mikrocontroller der AVR-Serie (in unserem Fall Arduino) oder wechseln Sie zu einer anderen Serie von Mikrocontrollern, nämlich ARM (in unserem Fall STM32). Trotz der großen Arduino-Community und der Benutzerfreundlichkeit dieses Mikrocontrollers haben wir uns für ein Upgrade auf STM32 entschieden, da es eine bessere Leistung und mehr Speicher bietet. Wir verwenden derzeit einen STM32f4 * -Mikrocontroller.





Im vergangenen Semester haben wir uns zum Ziel gesetzt, den Erhalt von Informationen über die Haltung und Verarbeitung einer Person zu realisieren. Das Schema des Projekts ist wie folgt: Wir haben ein T-Shirt, Beschleunigungsmesser und Gyroskope sind daran befestigt, mit deren Hilfe wir die Verdrehwinkel erhalten. Die von den Sensoren empfangenen Daten werden an den Mikrocontroller gesendet. Dort werden sie verarbeitet und bei Bedarf an den Vibrationsmotor angelegt, wodurch die Person zum Aufrichten angeregt wird. Mit der Android-Anwendung wird die Haltungsverarbeitung ein- und ausgeschaltet und das T-Shirt mit dem Benutzer verknüpft. Im Allgemeinen kann ein T-Shirt jedoch ohne Zugriff auf ein Smartphone funktionieren: Sie können die Haltungsverarbeitung in der Anwendung aktivieren, Ihr Telefon zu Hause lassen und in einem T-Shirt spazieren gehen. In diesem Fall werden die Daten auf dem Mikrocontroller verarbeitet und der Vibrationsmotor wird eingeschaltet, wenn die Position falsch ist.





Die ersten Schritte. LED leuchtet



Wir hatten keine Erfahrung mit der Programmierung von Mikrocontrollern und haben gelesen, dass das Initialisieren und Deklarieren von Sensoren und Pins auf einem STM lang und schwierig ist. Daher haben wir mit der HAL-Bibliothek und STM32CubeMX einen hohen Abstraktionsgrad verwendet . STM32CubeMX ist ein Tool, das Mikrocontroller-Ports über eine grafische Oberfläche konfiguriert und mithilfe der HAL-Bibliothek entsprechenden Code generiert. Zuerst haben wir uns entschlossen, das Grundlegendste in der Mikrocontroller-Programmierung zu tun (auf der Ebene „Hallo Welt“) - die LED anzuzünden.





STM32CubeMX-Schnittstelle



Nach einer langen Suche nach einer IDE, die plattformübergreifend, kostenlos und einfach zu entwickeln ist, haben wir uns für STM32CubeIDE entschieden







Das Einschalten der LED erwies sich als nicht die einfachste, da es im Internet eine ganze Reihe von Informationen zur STM32-Programmierung gibt (insbesondere im Vergleich zu Arduino). Später erschwerte dieser Faktor auch die Arbeit am Projekt.



Mikrocontroller-Firmware



Nachdem wir gelernt hatten, die LED zu beleuchten und den Mikrocontroller im Allgemeinen zu programmieren, begannen wir, die Basis der Mikrocontroller-Firmware zu schreiben, auf deren Grundlage in Zukunft verschiedene Funktionen hinzugefügt werden könnten. Zunächst musste gelernt werden, wie die Sensoren initialisiert und Informationen von ihnen empfangen werden. Von den Sensoren gelang es uns, nur zu den IMU-Sensoren zu gelangen: dem Gyroskop und dem Beschleunigungsmesser. Wir hatten MPU-6050-Sensoren. 





Die Kommunikation mit dem Mikrocontroller erfolgt über den I2C-Bus. Dank der HAL-Bibliothek ist die Datenübertragung einfach: Sie müssen eine Funktion zum Lesen / Schreiben aufrufen. Ein Beispiel für das Lesen von Daten von einem Beschleunigungsmesser aus Code:



HAL_I2C_Mem_Read(i2c_handle, addres, ACCEL_XOUT_H_REG, 1, buffer, 6, 1000)


Die Funktion empfängt den Handler des gewünschten Busses, die Adresse des darauf befindlichen Sensors, das Register, aus dem gelesen werden muss (die Register sind in der Dokumentation zum Sensor beschrieben), die Größe des Registers, den Puffer zum Schreiben, die Größe des Puffers und das Timeout (die Wartezeit auf eine Antwort) in Millisekunden. Die Aufnahmefunktion hat eine ähnliche Signatur. Beispiel für die Einstellung des Messbereichs eines Gyroskops:



HAL_I2C_Mem_Write(i2c_handle, addres, GYRO_CONFIG_RE	G, 1, &Data, 1, 1000)


Wir hatten auch ein Bluetooth-Modul (HC-05 und HC-06), aber es waren keine speziellen Manipulationen erforderlich, um zu funktionieren. Nach dem Anschließen können Sie Daten einfach über einen universellen asynchronen Transceiver (UART) senden - ein spezielles Gerät im Mikrocontroller, mit dem Sie mit anderen Geräten kommunizieren können. Dafür bietet die HAL ähnliche Funktionen wie I2C. Wir haben nur einen kleinen Wrapper darüber geschrieben, um das Anzeigen von Nachrichten beim Debuggen zu vereinfachen.





HC-06



Als Nächstes haben wir eine Controller-Klasse erstellt, die die Sensoren initialisiert, die Hauptprogrammschleife startet und Anforderungen aus der Anwendung verarbeitet. Anforderungen werden in einer Warteschlange gespeichert, über Bluetooth empfangen und über einen Interrupt-Mechanismus empfangen. Ein Interrupt ist ein Signal von Software oder Hardware, das den Prozessor über das Auftreten eines Ereignisses informiert, das sofortige Aufmerksamkeit erfordert. Der Interrupt-Mechanismus wird unter anderem für die schnelle Reaktion des Systems auf wichtige Ereignisse benötigt. 



Der Controller verwaltet auch eine Liste von T-Shirt-Funktionen, die die Basisklasse BaseFunc verwenden. Im Moment haben wir nur eine Haltungsverarbeitung, aber in Zukunft wird es beim Hinzufügen neuer Funktionen ausreichen, nur eine Nachkommenklasse zu erstellen und sie der Liste der Funktionen hinzuzufügen. Der Controller sieht ungefähr so ​​aus:



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(); //   
};


Um die Verdrehungswinkel von IMU-Sensoren zu erhalten, mussten wir einen speziellen Filter hinzufügen, der gemäß den Daten des Beschleunigungsmessers und des Gyroskops die richtigen Ablenkwinkel liefert. Wir haben uns für einen komplementären Filter entschieden, da dieser effizient genug und einfach zu implementieren ist. Bei der Implementierung dieses Filters haben wir die Mathematik für Quaternionen geschrieben. Es war möglich, mit Vektoren auszukommen, aber in einem anderen Filter, den wir getestet haben, wurden Quaternionen benötigt, sodass wir jetzt Quaternionen verwenden.



Was ist auf dem Prototyp



Nachdem wir die Programmierung des Mikrocontrollers herausgefunden und die Grundlagen seiner Firmware geschrieben hatten, brauchten wir einen Prototyp eines T-Shirts, mit dem wir mit der Haltungsverarbeitung beginnen konnten. Und dann intervenierte das Coronavirus ... 



Aufgrund der Pandemie konnten wir uns nicht mehr mit uns vier treffen und an einem T-Shirt arbeiten, und wir hatten tatsächlich keine Gelegenheit, zu Jan und Ivan zu gehen, damit wir sie bei Problemen mit Prototypen schnell lösen konnten. Ian und Ivan entwickelten einen Prototyp eines T-Shirts, auf dem die Sensoren durch Ziehen an den Drähten platziert werden konnten, damit sie die Messwerte nicht durch ihr Gewicht und ihre Spannung beeinflussen. Die Jungs schickten Denis und mir eine Kopie eines T-Shirts sowie Klebeband, Drähte usw., damit wir selbst mögliche Ausfälle beseitigen konnten. 



Android App



Wir haben uns zum Ziel gesetzt, eine Android-Anwendung zu erstellen, die über Bluetooth mit einem Mikrocontroller kommunizieren kann. Wie bei der Programmierung von Mikrocontrollern hatten wir keine Erfahrung mit dem Schreiben von Anwendungen für Android, aber das Auffinden von Informationen über Android erwies sich als viel einfacher als über STM32. Wir haben die Grundlagen mithilfe des  Kurses auf Stepik.org gelernt (der Kurs ist wirklich gut), in dem Sie zuerst die Grundlagen der Kotlin-Sprache analysieren und dann über das Programmieren für Android sprechen. 



Die erste Version der Anwendung ermöglichte das Herstellen einer Verbindung zum Mikrocontroller über Bluetooth und das Senden von Nachrichten an diesen. Die neueste Version unterscheidet sich nicht wesentlich von der ersten (das Schreiben einer Anwendung hatte für uns keine Priorität): Sie verfügt jetzt über Widgets zum Starten der Kalibrierung und zum Ein- und Ausschalten der Funktion zum Verfolgen der richtigen Haltung. 



Das Schreiben der ersten Arbeitsversion der Anwendung dauerte ungefähr 6 Stunden - wir haben mehr Zeit damit verbracht, die Theorie zu studieren. Der Code für eine so einfache Anwendung umfasste ungefähr 400 Zeilen, was eine angenehme Überraschung war. Darüber hinaus können Sie es wahrscheinlich kompakter schreiben. 





Navigationsmenü





 Registerkarte für Bluetooth-Verbindung





Registerkarte für Datenaustausch



Haltungsbehandlung



Wir haben zwei verschiedene Möglichkeiten für den Umgang mit der Körperhaltung entwickelt: mit und ohne Datenanalysemethoden.



Haltungsbehandlung mit Datenanalysetechniken



In der vorherigen Version hatte das T-Shirt nur einen Sensor, gemäß den Daten, aus denen eine Entscheidung über die richtige Haltung einer Person getroffen wurde: Dies hing vom Drehwinkel des Sensors ab. Offensichtlich kann dieser Ansatz keine hohe Genauigkeit liefern, da wir keine Daten über die Position des größten Teils des Rückens haben. Unsere Version verfügt über 4 Sensoren. Es war ziemlich schwierig herauszufinden, wie ihre Messwerte zu interpretieren sind, daher haben wir uns entschlossen, auf Datenanalysemethoden zurückzugreifen. Aufgrund von Problemen mit Prototypen wurde bis zum Stichtag nicht viel getan. 



Zuerst haben wir die Daten von uns selbst genommen: Drehwinkel und Beschleunigungsmesserwerte von jedem der Sensoren. Wir haben ungefähr 2000 Messungen erhalten: ungefähr 1000 positive und 1000 negative. Die Sensorkonfiguration war wie folgt (zwei Sensoren befinden sich an den Schulterblättern und zwei an der Wirbelsäule):





 

Leider gab es bei beiden Prototypen Probleme mit einem der vier Sensoren, sodass Sensor Nummer 3 nicht verwendet wurde. Wir haben sie intuitiv platziert: Wir wollten die Position der Schulterblätter und der Wirbelsäule in der Nähe des Halses verfolgen.







Datenprojektion in den zweidimensionalen Raum.



Hier werden die Bereiche mit der richtigen Haltung grün hervorgehoben, die Bereiche mit der falschen Haltung rot. Bei einer Projektion auf den dreidimensionalen Raum zeigt sich, dass die richtigen und die falschen Positionen leicht voneinander zu trennen sind. 





Als nächstes mussten Modelle für die Vorhersage ausgewählt werden. Wir haben uns entschlossen, die lineare Regression bzw. die Ridge-Modifikation zu versuchen, die Vektor-Maschine (SVM) mit einem linearen Kernel und einem Entscheidungsbaum zu unterstützen. Die Wahl beruht auf der Einfachheit der Übertragung der Modelle auf den Mikrocontroller: Die ersten beiden werden durch eine bestimmte Anzahl von Koeffizienten beschrieben, und letzterer ist eine Reihe von Wenn-Sonst-Bedingungen. Die Modelle wurden aus der Scikit-Learn-Bibliothek entnommen. Beispiel für eine lineare Regressionsübertragung:



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;


Die Werte a ??, g ??, Bias werden dem trainierten Modell entnommen.



Die Genauigkeit von Modellen mit unterschiedlichen Konfigurationen auf dem Testmuster ist in der Tabelle ersichtlich:





Die Testprobengröße betrug 33% aller Daten. Solche hohen Raten sind höchstwahrscheinlich auf die geringe Datenmenge zurückzuführen, da die Vorhersagen zu gut sind.



Im wirklichen Leben funktionierten die von uns getesteten Modelle (Entscheidungsbäume und einige lineare Regressionskonfigurationen) nicht so gut, sodass sie leicht angepasst werden mussten, damit sie sich angemessener verhalten. Der beste Ridge ist derjenige, der in Drehwinkeln trainiert ist.





Ein Beispiel für einen Entscheidungsbaum.



In einer Pandemie und mit nur zwei Prototypen konnten wir keine große Datenmenge von verschiedenen Personen sammeln, was für die Modelle schlecht ist. Außerdem verwendet die aktuelle Lösung nur eine Messung, um die richtige Haltung zu bestimmen, was natürlich nicht ausreicht. Eine Person kann sich einfach über das Objekt beugen und das T-Shirt beginnt zu vibrieren. Um solche Probleme zu lösen, sollten Sie Modelle ausprobieren, die Vorhersagen aus einer Folge von Eingabedaten treffen. Es ist jedoch schwieriger, solche Modelle wie in der aktuellen Lösung auf den Mikrocontroller zu übertragen.



Umgekehrte Haltung ohne Datenanalysemethoden



Um mit einer Haltung ohne ML umgehen zu können, mussten zuerst viele medizinische Artikel über die Haltung untersucht werden. Ich wollte unbedingt Informationen über quantitative Merkmale finden, die gemessen und mit der Norm verglichen werden können: das heißt, den "normalen" Wertebereich kennen.



Wir haben viele Artikel untersucht, aber den meisten fehlten entweder quantitative Merkmale oder die Merkmale konnten mit den uns zur Verfügung stehenden Mitteln nicht gemessen werden. Nur ein Artikel hat sich für uns als nützlich erwiesen (übrigens beziehen sich viele andere Studien zur menschlichen Haltung darauf). Es wurden verschiedene Winkel beschrieben, anhand deren Werte Sie die Richtigkeit der Haltung bestimmen können.





Haltungswerte bei Menschen mit Major Depression vor (A) und nach (B) Behandlung von J. Canales et al. (2010)



Es bleibt nur noch die Messung dieser Winkel. Zum Messen können Sie mithilfe einer Funktion die normale Position der Wirbelsäule ungefähr abbilden und dann die erforderlichen Punkte in der Grafik nehmen und nach den Werten verschiedener Winkel suchen. 







Sensorkonfiguration



Die Sensoren befinden sich entlang der Wirbelsäule. An den Punkten, an denen sie sich befinden, können Sie die Neigungswinkel der Tangenten ermitteln und daher den Wert der Ableitung ermitteln (der gleich der Tangente des Neigungswinkels der Tangenten ist). Wenn sich die Wirbelsäule biegt, ändern sich die Koordinaten der Punkte ständig. Aus diesem Grund ist es unmöglich, beispielsweise die Hermite-Interpolation anzuwenden. In diesem Fall sind die Abstände zwischen Punkten entlang der Kurve bekannt: Sie können physikalisch gemessen werden. Mit diesen Daten wollten wir zunächst versuchen, eine glatte Funktion zu finden, beispielsweise ein Polynom. Dies erfordert jedoch erstens mehr Punkte, an denen die Ableitungen bekannt sind, und zweitens ist das Problem aus mathematischer und rechnerischer Sicht nicht ganz einfach. In diesem Entwicklungsstadium wurde daher beschlossen, die Wirbelsäule mit einer stückweise linearen Funktion zu approximieren.





Infolgedessen wurde von den beiden Winkeln, die wir zu messen versuchten (Winkel 3 und 4 im Bild aus dem Artikel), einer korrekt gemessen und der andere nicht. Winkel 3-Werte stimmten mit den im Artikel angegebenen Normalwerten überein. Winkel 4 wurde aufgrund von Konstruktionsmerkmalen schlecht gemessen. Das Problem liegt höchstwahrscheinlich darin, dass das T-Shirt an einigen Stellen nicht gut am Körper anliegt, weshalb der Neigungswinkel der Tangenten falsch berechnet wird.



Demo-Video



Hier ist ein Demo-Video des T-Shirts und der funktionierenden App:





Die Haltungsverarbeitung beginnt zuerst, dann beginnt die Kalibrierung und dann kommen Meldungen über die richtige Haltung an.



Fazit



Infolgedessen haben wir es geschafft, die Haltung auf zwei Arten zu verarbeiten, uns mit der Programmierung für Android zu befassen, eine Anwendung für Android zu schreiben und gleichzeitig ein wenig über die Programmierung des STM32-Mikrocontrollers zu verstehen.



Natürlich kann unser T-Shirt nicht als fertig angesehen werden - aber bisher haben wir ein Semester des ersten Jahres daran gearbeitet. Es gibt noch viel zu tun und nächstes Jahr wollen wir weitermachen!



Nun ein wenig über unsere Pläne für die Zukunft. Wir möchten:



  • Verfeinern Sie die Approximationen der Wirbelsäule mit einer Funktion, um die mit der Wirbelsäule verbundenen Winkel genauer zu messen.
  • Sammeln Sie weitere Daten für die Haltungsverarbeitung. Im Moment wurden die Daten nur von uns beiden übernommen und unsere Prototypen unterscheiden sich geringfügig. 
  • Erweitern Sie die Funktionalität. Fügen Sie beispielsweise eine Elektrokardiogramm-Aufzeichnung hinzu, damit verschiedene Krankheiten, Anomalien usw. identifiziert werden können.
  • Verbessern Sie die Anwendung: Erweitern Sie ihre Funktionalität. Berechnen Sie beispielsweise Statistiken, analysieren Sie sie, zeichnen Sie Diagramme.
  • Erstellen Sie einen Prototyp eines T-Shirts, das marktfähiger aussieht. Derzeit sind Prototypen ausschließlich zum Testen der Funktionalität vorgesehen. Ich möchte ein T-Shirt zusammenstellen, das für den vollen Gebrauch bereit ist.


Links zum Github des Projekts:



github.com/DT6A/Mithril Mikrocontroller-Firmware,

github.com/DT6A/MithrilApp® Android-Anwendung,

github.com/DT6A/MithrilData® arbeiten mit Daten.



All Articles