Wie ich einen Motion Capture Anzug gemacht habe
Vorwort
In meiner kleinen Stadt beschäftige ich mich mit der Lösung nicht trivialer technischer Probleme. Diesmal beschlossen die Organisatoren einer Show, in der die Turnerin mit ihrem Programm auftreten sollte, ihrer Leistung ein „Highlight“ hinzuzufügen. Nämlich die Silhouette einer Turnerin auf den Bildschirmen anzuzeigen, die ihre Bewegungen wiederholen und irgendwie mit anderen Effekten interagieren würde, so dass alles interaktiv war. Das Problem „Stirn“ konnte nicht gelöst werden. Kinect konnte seine Aufgabe eindeutig nicht bewältigen und war nicht in der Lage, die Bewegungen einer Person zu erfassen, die mindestens 10 Meter von ihm entfernt ist, auch im Dunkeln. Also wurde beschlossen, etwas "Eigenes" zu tun. Mit Blick auf die Zukunft werde ich sagen, dass die Aufführung nicht stattgefunden hat, aber ich war so begeistert von der Idee, dass ich meine Experimente als separates Projekt fortsetzte, das später aufgerufen wurdeImpuls .Erste Schritte
Ich begann mit dem Prototyping des zukünftigen Geräts, sobald ich die erforderlichen Komponenten erhalten hatte. Nämlich:- Arduino UNO ist ein bekannter Controller-Designer, mit dem Sie in kurzer Zeit einen Prototyp entwickeln können.
- HC-06 - Bluetooth-Modul, dient als Mittel zur drahtlosen Kommunikation. Das Modul ist sehr einfach, hat eine UART-Schnittstelle.
- MPU-6050 - die einzigen Trägheitssensoren, die mir zu diesem Zeitpunkt zur Verfügung standen. Ich habe sofort 2 gekauft, um zu überprüfen, wie sie paarweise funktionieren, da in Zukunft bis zu 15 Sensoren in einem System verwendet werden müssen. Dieser Sensor kombiniert einen Beschleunigungsmesser und ein Gyroskop sowie einen Temperatursensor zur Einstellung der Leistung.
Nachdem ich alles von dieser Liste erhalten hatte, war ich schon gespannt darauf, mpu in Aktion zu sehen. Auf dem offiziellen Arduino-Forum gab es mehrere Beispiele für die Verwendung dieser Sensoren, und ich habe einen davon verwendet. Zum Anschließen der Sensoren werden 5 Pins (Kontakte) verwendet:- VCC, GND - alles ist klar, Kraft und Erde. Es ist erwähnenswert, dass die Arbeitsspannung des Sensors 3,3 V beträgt, aber bei 5 V fühlt es sich gut an. Stromverbrauch weniger als 0,05 Ah
- SCL, SDA - eigentlich die Pins, über die eine "Kommunikation" mit dem Sensor stattfindet. Diese Pins sind für die i2c-Schnittstelle verantwortlich. Diese Schnittstelle implementiert das Umschalten zwischen Geräten auf demselben Bus, mit anderen Worten, der Bus ist die Straße und die Häuser darauf sind die Geräte.
- INT - Pin für Interrupts. Sobald die Daten auf dem Sensor bereit sind, werden sie vom Hauptcontroller unterbrochen.
In diesem Beispiel wurden jedoch nur „Rohwerte“ vom Beschleunigungsmesser im Terminal angezeigt, und Code wurde geschrieben, um in vertraute Winkel konvertiert zu werden. Anschließend wurde der Kalman-Filter implementiert, und all dies zusammen belegte bereits etwa 70% der Arduino UNO-Ressourcen. Trotzdem kamen bereits ziemlich glatte Winkelwerte am Terminal an, das Gerät war im Weltraum ziemlich schnell, wenn auch nur ein paar Minuten, danach war der FIFO-Puffer voll. Aber es hat funktioniert!
Stabilisieren!
Allmählich wurde die Freude am Arbeitssensor von der Dauer des gesamten Systems überschattet. So sehr ich nicht mit dem FIFO-Puffer zu kämpfen hatte, er lief über. Es ist erwähnenswert, dass zu dieser Zeit nur wenige Informationen über diese Sensoren und allgemein ähnliche Systeme vorhanden waren und diese buchstäblich Stück für Stück gesammelt werden mussten. Nachdem ich festgestellt hatte, dass das Problem in der Implementierung der i2c-Schnittstelle liegt, begann ich in diese Richtung zu googeln und fand die I2Cdev-Benutzerbibliothek, die die Standard-Drahtbibliothek für Arduino ersetzen sollte. Eine angenehme Überraschung waren die verschachtelten Beispiele für die Verwendung dieser Bibliothek in Verbindung mit mpu-6050. Nachdem ich das Projekt in dieser Bibliothek neu erstellt hatte, erhielt ich auch Rohdaten und konvertierte sie mit meinem Code in Ecken, aber es gab keine Überläufe mehr. Dies war ein kleiner Sieg. Später, als ich das Innere der Bibliothek studierte, fand ich viele nützliche Dinge. So zum BeispielJetzt werden Daten von beiden Sensoren verwendet - und vom Beschleunigungsmesser und Gyroskop. Tatsache ist, dass Sie mit dem Beschleunigungsmesser die genauen Neigungswinkel des Geräts nur in Ruhe bestimmen können, bis externe Kräfte auf es einwirken, und das Gyroskop ist so ausgelegt, dass es dieselben Kräfte ausgleicht. Die Verwendung von Daten beider Sensoren wurde offensichtlich, und hier fand ein komplementärer Filter Anwendung. Es gab jedoch ein Problem der Null-Drift, aber dazu später mehr.!
Und wieder ein Riff. Dieses Mal bestand das Problem vor mir darin, den zweiten mpu-6050-Sensor zu verwenden. Ich habe bereits in diesem Artikel eine Analogie zur i2c-Schnittstelle gegeben, bei der der Bus die Straße ist und die Geräte zu Hause sind. Stellen Sie sich vor, ein Datenpaket, das ein bestimmtes Gerät erreichen muss, ist ein Postbote. Der Postbote benötigt zwei Dinge - das Paket und die Adresse, und jedes Haus hat seine eigene eindeutige Adresse, und die Geräte müssen ihre eigenen Adressen haben. Das Problem liegt genau in der Adresse des mpu-6050-Sensors, es ist einer für alle diese Sensoren - 0x68. Diese Adresse wird werkseitig in die Sensorsteuerung eingeblendet, es ist jedoch nicht möglich, die Firmware zu finden und die Adresse für jeden Sensor zu ändern. In fremden Foren gab es eine Lösung: Sensoren nacheinander verbinden, ein Bein des ersten Sensors mit Pin AD0 des zweiten verbinden,und wird bei 0x69 verfügbar, aber diese Methode beinhaltet die Verwendung von nicht mehr als 2 mpu und ich habe es sofort fallen lassen.Die Lösung waren Transistoren. Die Idee war, ein Paar Transistoren an den i2c-Pins vor jedem Sensor anzubringen und diese abwechselnd zu öffnen. Der Algorithmus ist einfach - es ist notwendig, die Daten vom 5. Sensor zu lesen, alle Tore außer dem 5. zu schließen (oder bei Bedarf zu öffnen) und zu lesen, dann erhalten wir auf ähnliche Weise Daten vom Rest. Das Ergebnis ist auf dem ersten Foto in diesem Artikel zu sehen und es ist durchaus praktikabel. In ähnlicher Weise gelang es mir, 4 Sensoren anzuschließen, was die Stabilität nicht optimal beeinträchtigte, und als mir die Transistoren ausgegangen waren, entschied ich mich für kompaktere und stabilere Mikroschaltungen.Das einzige erhaltene Foto aus dieser Phase (ich entschuldige mich für die Qualität):
Gate-Controller
Ein Gerät, das diese Mikroschaltungen kombiniert und es Ihnen ermöglicht, mit vielen MPU-Sensoren zu kommunizieren, habe ich als Gate-Controller bezeichnet. Es wurde mir von einem guten Freund geholfen, der bereits Erfahrung mit Ätzbrettern hatte, aber ich brauchte eine Qualität, die meine früheren Ätzversuche nicht hatten. Aufgrund der vielen sich kreuzenden Gleise war eine zweischichtige Platte erforderlich, eine mehrstufige jedoch auch als Prototyp. Das Ergebnis dieser Arbeit war ein so ungewöhnliches Board:Jetzt bleibt das Gerät in Aktion zu überprüfen. Nachdem 10 Sensoren gleichzeitig angeschlossen wurden, wurden auf dem Monitor genau die gleichen angenehmen Meldungen über die erfolgreiche Initialisierung angezeigt - das Gerät funktioniert!
Gimble Lock, Quaternions, Visualisierung
Gimble Lock, in russischem Scharnierschloss oder Klapprahmen - ein unangenehmes Phänomen auf dem Gebiet der Gyroskope und in einigen Fällen die Ausrichtung im Raum. Ohne eine lange Erklärung dieses Phänomens (es gibt gute erklärende und visuelle Videos zu diesem Thema) kann ich nur sagen, dass dieses Klappschloss dem Sensor nicht erlaubt, sich um 360 Grad zu drehen. Die XZ-Achsen (Abweichungen von der horizontalen Ebene) sind von etwa -45 bis 45 Grad begrenzt. und sind über diese Grenzen hinaus nicht korrekt definiert. Nachdem ich dieses Thema genauer untersucht hatte, stellte sich heraus, dass die Lösung unter meiner Nase liegt. Die MPU-6050 sind sechsachsige Sensoren und haben dmp an Bord. Dmp (DIgital Motion Processor) macht alles, was ich im Hauptcode geschrieben habe, um den Hauptcontroller so lange zu flashen, und filtert sogar die Werte. Darüber hinaus kann dmp Daten in Form von Quaternionen ausgeben.Dadurch können Sie die Scharniersperre umgehen und die Größe der weitergeleiteten Pakete reduzieren. Zu diesem Zeitpunkt setzte sich meine Bekanntschaft mit den Quaternionen fort, früher arbeitete ich mit ihnen in Unity3D und hatte eine Idee. In einfachen Worten ist eine Quaternion ein Zahlensystem (4 Zahlen), das die Rotation von etwas im Raum beschreibt. Ich erinnerte mich nur an Unity und versuchte so etwas darzustellen:
Controller
Arduino und der Gate-Controller haben sich gerechtfertigt, aber ihre Verwendung in der endgültigen Version war nicht beabsichtigt. Es ist Zeit, den Controller spezifisch und auf eine bestimmte Aufgabe zugeschnitten zu machen. Zu diesem Zeitpunkt habe ich die Firmware für den zukünftigen Controller ziemlich modifiziert und dmp optimal konfiguriert, sodass ich die Verwendung von Interrupts ablehnen konnte. Somit war jeder Sensor durch vier Stifte verbunden und nicht wie zuvor durch fünf. Außerdem waren zwei der sechs Chips in der Gate-Steuerung nicht erforderlich. All diese Verbesserungen führten dazu, dass die Platine für das zukünftige Gerät in zwei Richtungen entworfen wurde und kein „Over-the-Top“ mehr erforderlich war.
Gehäuse
Das Gerät nahm nach und nach seine endgültige Form an, und der nächste Schritt bestand darin, den Fall logisch zu gestalten. Die naheliegende Lösung besteht darin, 3D-Druckdienste zu bestellen oder sich an diese zu wenden. Aber das ist alles einfach und uninteressant, deshalb haben wir für ein paar Dinge unseren eigenen 3D-Drucker gekauft. In Ermangelung jeglicher Anweisungen haben sie es auf einer intuitiven Ebene zusammengestellt, aber alles hat geklappt. Im Allgemeinen verdienen die Montage, Konfiguration und Vorbereitung für den Druck selbst einen separaten Artikel, aber darum geht es nicht. Mit dem gesamten Testmaterial musste nur noch gewartet werden, bis der ABS-Kunststoff eintraf.Für die Simulation wurde das Programm 123D-Design ausgewählt. Das Programm ist intuitiv und jeder, der zumindest ein wenig Erfahrung mit 3D-Grafikeditoren hat, wird es schnell beherrschen.
Dann druckte er alle Gehäuse aus, verband die Sensoren über dünne 4-polige Drähte mit dem Controller, fertigte Halterungen für die Sensoren an, stellte alles zusammen und bekam einen fertigen, eigenständigen, tragbaren Anzug. Für den ersten Prototyp ist das durchaus geeignet.


Software
Aufgrund einiger Umstände habe ich Unity3D „für später“ verschoben, die Fristen liefen aus und ich musste schnell ein Programm zur Visualisierung schreiben. Ich habe lange mit der Xors3D-Grafik-Engine gearbeitet (vielleicht weiß das jemand) und diesmal hat es mich nicht enttäuscht. Nachdem er sich ausgezahlt hatte, kehrte ich jedoch nicht zu Unity zurück, sondern entwickelte die visuelle Umgebung für das Kostüm für diesen bestimmten Motor weiter.
Liste der aktuellen Funktionen:- Visualisierung - Das Programm zeigt das Modell einer Person an, das in Echtzeit alle Bewegungen einer Person in einem Anzug wiederholt
- Automatische Kalibrierung - Ermöglicht die sofortige Kalibrierung Ihres Anzugs
- Positionierung - Das Modell bewegt sich auch im Raum wie eine Person, kann sich ducken, gehen usw.
- Aufnahme / Wiedergabe - Alle Bewegungen können aufgezeichnet und wiedergegeben werden.
- First-Person-Ansichtsmodus - Die Bildausgabe für Oculus Rift und andere Virtual-Reality-Helme wird bereitgestellt.
- Interaktivität - Eine Person, die einen Anzug trägt, kann die virtuelle Welt beeinflussen. Bälle treten, Türen öffnen, Karussell drehen usw. (physischer Motor)
Fazit
Derzeit verfügt das Projekt über einen voll funktionsfähigen, autonomen, tragbaren und drahtlosen Prototyp sowie die erforderliche Software. Die Entwicklung dieses Kostüms dauerte 8 Monate (2 davon ruhte ich aus, insgesamt 6), aber für mich ist dies eine ganze Ära. Während des Projekts habe ich meine Fähigkeiten gepumpt, versucht und viel getan, was ich vorher wenig wusste, ich konnte ein wenig verdienen.Als ich anfing, gab es nur ein Interesse daran, wie es funktioniert. und die Existenz solcher Kostüme wusste ich noch nicht. Während der Entwicklungsphase kamen jedoch mindestens drei solcher Projekte zu Crowdfunding-Standorten, und ich wollte irgendwie Impulse als kommerzielles Projekt entwickeln, aber es ist äußerst schwierig, mich auszudrücken, wenn ich mich im Transbaikal-Territorium befinde. Jetzt gibt es nicht genug Motivation, sich für einen zweiten Prototyp zu setzen, der bereits drahtlos ist und auf 9-Achsen-Sensoren basiert. Daher wird dieses Projekt für mich höchstwahrscheinlich nur eine große und nützliche Erfahrung bleiben. In diesem Artikel wollte ich alle geleisteten Arbeiten zusammenfassen, obwohl sie hier nicht angezeigt werden und 20% davon. Nicht jeder wird sich für jede Menge Code und stundenlanges Löten, 3D-Drucken, viel Versuch und Irrtum, viel verbrauchtes Material interessieren, aber ich werde versuchen, solche Fragen in den Kommentaren zu beantworten.Source: https://habr.com/ru/post/de392353/
All Articles