Zestaw do MOCAPu

Autorzy: Rafał Łupiński (3gi rok Fizyki gier komputerowych i robotów)
Zaawansowanie: prototyp działa, zaprezentowany w finałach konkursu ZTGK w Łodzi, temat pracy licencjackiej.

MOCAP – czyli Motion Capture, to technika przechwytywania ruchu polegająca na nagrywaniu ruchów aktora i ich późniejszym odtworzeniu w postaci animacji postaci komputerowej. Animacje tego typu wykorzystuje się głównie w przemyśle gier wideo lub w kinematografii. Najpopularniejsze obecnie zestawy składają się z zestawu kamer ustawionych z kilku stron pomieszczenia. Aktor ubrany jest w specjalny ciemny kombinezon pokryty jasnymi odblaskowymi punktami. Specjalne, płatne oprogramowanie analizuje obraz z kamer odczytując ruch aktora i odtwarzając go w środowisku graficznym. Koszt takiego zestawu waha się w przedziale od 25k do 500k dolarów. Cena zależy od producenta i stopnia zaawansowania konkretnego zestawu. To trochę dużo… więc:

 

Projekt dotyczy sprawdzenia możliwości wykorzystania w technice Motion Capture  tanich żyroskopów i akcelerometrów. W tym celu wybrano niewielki układ scalony MPU6050, będący cyfrowym żyroskopem i akcelerometrem. W warstwie sprzętowej wykorzystano również platformę Arduino UNO. Oprogramowanie oparto o otwarto źródłowe środowisko Arduino IDE oraz Blender a także własne kody zbierające dane (programowanie w języku C++) i je wizualizujące(programowanie w języku python).

MPU6050

MPU6050 to niewielki układ scalony (o wymiarach 4x4x0.9mm) łączącym w sobie: trójosiowy żyroskop, trójosiowy akcelerometr a także wewnętrzny termometr. Do komunikacji wykorzystuje magistralę I2C.

Wykorzystujemy darmowy i otwartoźródłowy program BLENDER – posiada możiwość programowania w pythonie!

Arduino UNO + MPU6050 _ Blender.

Pierwsze próby działania MPU6050 z blenderem – do wizualizacji położenia.

Adres MPU6050 składa się z siedmiu bitów. Pierwsze sześć z nich jest niezmienne i ustalane przez producenta w trakcie produkcji. Ostatni bit ma domyślnie wartość 0 i jest połączony z jednym z wyprowadzeń układu. Poprzez podanie na to wyprowadzenie stanu wysokiego można zmienić wartość ostatniego bitu adresu na 1. W rezultacie urządzenie może przyjąć jedynie adres 0x68 w przypadku stanu niskiego i 0x69 w przypadku stanu wysokiego (podane wartości wyrażone są w systemie szesnastkowym). Aby podłączyć więcej niż dwa MPU6050 do Arduino Uno wyprowadzenia ostatniego bitu adresu podłączone zostały do osobnych pinów cyfrowych płytki Arduino Uno. Piny te ustawione zostały jako wyjścia sygnału poprzez pinMode( n, OUTPUT ), gdzie n oznacza numer pinu.

Kilka sztuk więcej MPU6050 podłączonych do Arduino.

Kilka sztuk więcej MPU6050 podłączonych do Arduino.

Domyślnie wartość wszystkich wyjść cyfrowych ustawiona była na wartość 0 nadając wszystkim układom adres 0x68. W Arduino IDE zadeklarowana została tablica obiektów dla wszystkich układów poprzez MPU6050 mpu[5](0x69) o adresie 0x69 każdy. Przed komunikacją z konkretnym układem Arduino UNO zmieni stan wyjścia cyfrowego podłączonego do tego układu na 1 korzystając z digitalWrite( n, HIGH ), gdzie n oznacza numer pinu cyfrowego, zmieniając tym samym adres urządzenia na 0x69. W rezultacie pozostałe urządzenia zignorują komunikację ze względu na inny adres. Po skończonej komunikacji z danym układem połączone z nim wyjście cyfrowe ustawiane jest na 0 przywracając mu adres 0x68. W ten sposób do jednej płytki Arduino UNO podłączyć można wiele układów MPU6050 a ich liczba ograniczona będzie teraz przez ilość dostępnych pinów cyfrowych.

AKTOR – czyli mega cierpliwy pomocnik w projekcie. Na plecach nosi Arduino UNO, ręce po 2 czujniki MPU6050, korpus to jeden MPU – w sumie 5 sztuk MPU.

Samo podłączenie czujników do Aktora nie wystarczy – trzeba rozwiązać kilka „drobnych” problemów:

  • poprawnie odczytywać orientację czujnika w przestrzeni
  • zaplanować wzajemne położenia czujników 
  • czujniki „szumią”, czyli produkują dane nie nadające się od razu do użycia – należy je filtrować, więc
  • zastosowano filtr Kalmana do „czyszczenia” danych, oraz
  • obliczania orientacji z żyroskopu, akcelerometru, a także z połączenia żyroskopu i akcelerometru. Wyniki (o dziwo!) były zadowalające, ale
  • układ MPU6050 posiada wbudowaną „czarną skrzynkę” – układ DMP (Digital Motion Processor). Stosując algorytmy MotionFusionTM łączy on ze sobą pomiary z żyroskopu i akcelerometru wykorzystując je do śledzenia orientacji układu – lepiej, niż wspomniane wyżej własne metody. Ostatecznie właśnie wykorzystano DMP.
  • transmija szeregowa z Arduino do PC i ostatecznie do BLENDERA wymagała stworzenia prostego protokołu przesył danych. Taki protokół był oczywiście binarny (w odróżnieniu od przesyłania liczb jako napisy), dzięki czemu transmisja okazała się wystarczająco szybka – zresztą sam porównaj z filmikiem na YT.

 

Projekt brał udział w konkursie Zespołowego Tworzenia Gier Komputerowych (ZTGK) na Politechnice Łódzkiej w czerwcu 2023 r. – zakwalifikował się do finałów. Nie udało się zdobyć wyróżnienia, za to mnóstwo pochwał, uznania i nowych pomysłów na rozbudowę tematu zdecydowanie rekompensują trudy włożone w udział w konkursie.

 

Praca licencjacka: „Zastosowanie żyroskopów i akcelerometrów w technice przechwytywania ruchu i komputerowej animacji szkieletowej” – link do YT.

(c) R.Ł., K.G. 2023