Masarykova univerzita Fakulta informatiky
Využití zařízení Kinect pro ovládání aplikací a implementaci logických her
Bakalářská práce Michal Hroš
Brno, jaro 2014
Prohlášení Prohlašuji, že tato bakalářská práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj. Michal Hroš
Vedoucí práce: RNDr. Barbora Kozlíková, Ph.D.
Poděkování Rád bych poděkoval vedoucí práce RNDr. Barboře Kozlíkové, Ph.D. za podporu a cenné rady během psaní této práce. Dále bych rád poděkoval členům laboratoře HCI a zejména Jánu Bellovi, s nímž jsem spolupracoval na tvorbě první aplikace pro projekt BRAIN. Mé poděkování patří také mé přítelkyni Kristině Stratilové za morální podporu a tvorbu dabingu pro všechny aplikace projektu BRAIN v českém, slovenském i anglickém jazyce. Nakonec děkuji své rodině za důvěru a podporu během tvorby této práce.
Shrnutí Cílem této bakalářské práce je seznámení se s aplikačním rozhraním zařízení Kinect, základní popis práce s daty získanými skrze toto zařízení a vytvoření několika aplikací v úzké spolupráci s Psychologickým ústavem Filosofické fakulty MU. První vyvíjená aplikace poskytne možnost simulovat práci s myší pomocí zařízení Kinect s detailními možnostmi nastavení, což umožní ovládat prakticky libovolnou aplikaci tímto zařízením. Další aplikace na podobném principu umožní ovládání jednoduchých plošinových her. Posledním bodem je tvorba logické hry, která bude součástí aplikace BRAIN vyvíjené v Laboratoři interakce člověka s počítačem na FI MU právě ve spolupráci s Psychologickým ústavem FFMU.
Klíčová slova Kinect, bezdotykové ovládání, projekt BRAIN, logické hry
Obsah 1 Úvod
1
2 Zařízení Kinect 2.1 Základní informace 2.2 Dostupné knihovny 2.3 Kinect 2
3 3 5 7
3 Projekt BRAIN 3.1 Počátky projektu 3.2 Celkový obraz aplikace BRAIN 3.3 Ovládání aplikace BRAIN 3.4 Spolupráce a podpora 3.5 Projekty s podobným zaměřením
9 9 9 10 10 10
4 Implementace 4.1 Základní principy napojení aplikace na Kinect 4.2 Datové toky (Data streams) 4.3 KinectRegion 4.4 Výběr aktivního hráče 4.5 Aplikace umožňující ovládání jiných programů prostřednictvím zařízení Kinect
13 13 13 18 18
5 Aplikace 5.1 Aplikace MouseToKinect 5.2 Aplikace KinectKeyboardDrive 5.3 Aplikace HitPics – Hledání výřezu obrázku
23 23 25 30
6 Závěr
35
7 Literatura
37
8 Přílohy 8.1 Instalace Kinect SDK a Kinect for Windows developer Toolkit 8.2 Algoritmy detekce uživatelů 8.3 Doporučené hry pro ovladače KinectKeyboardDrive
41 41 41 45
21
1 Úvod S rozvojem moderních technologií se v posledních letech stále častěji tvůrci pokoušejí přijít se způsobem, jak ovládat své programy prostřednictvím jiných než tradičních vstupních zařízení. Důvodem bývá snaha poskytnout uživateli pohodlnější interakci s aplikací, případně realističtější zážitek při hraní hry. Jedním z výsledků tohoto snažení je zařízení Kinect vytvořené firmou Microsoft. Díky tomuto zařízení může uživatel program ovládat pouze za použití pohybu, gest a hlasu, bez dálkových ovladačů a dalších periferií. Zařízení je určeno pro širokou veřejnost a díky jeho ceně by bylo možné jej využít v širším měřítku. Právě toho se snaží využít projekt BRAIN, vyvíjející aplikaci určenou pro pacienty s pervazivními poruchami, kterým by nové způsoby interakce mohly pomoci s trénováním kognitivních funkcí. Práce se skládá z úvodní části, kde se věnují představení samotného zařízení Kinect, a poté představení projektu BRAIN a implementační části, kde se věnují práci se zařízením Kinect a popisu aplikací, které jsou programovým výstupem této práce. Úvodní část se zabývá popisem zařízení Kinect a jeho součástí včetně technických parametrů a použitých technologií. Poté následuje stručný náhled na jeho nástupce – Kinect 2 – včetně oznámených vylepšení. Dále se věnuji popisu projektu BRAIN, zabývajícího se tvorbou aplikace pro děti trpící pervazivními poruchami. Projekt vznikl ve spolupráci s Psychologickým ústavem Filosofické fakulty MU a aplikace je momentálně vyvíjena studenty pracujícími v laboratoři HCI Fakulty informatiky. Následuje implementační část, kde se zabývám prací se zařízením Kinect. Nejdříve se věnuji základním principům mapování ovládání aplikací na zařízení Kinect, dále jednotlivým datům, které je možno prostřednictvím zařízení získat, několika algoritmům a nakonec se zabývám možností ovládat aplikace, které nejsou pro senzor Kinect určeny. Na závěr představuji jednotlivé aplikace. Aplikaci MouseToKinect, která umožňuje ovládat myš prostřednictvím zařízení Kinect, aplikaci KinectKeyboardDrive umožňující hrát jednoduché hry, které nebyly navrženy pro zařízení Kinect a aplikaci HitPics, což je jednoduchá logická hra vytvořená pro projekt BRAIN. Pravděpodobnost budoucího rozvoje podobného typu aplikací se zdá celkem vysoká i navzdory tomu, že možnosti zařízení Kinect jsou stále omezené. Brzy se však dočkáme dříve zmíněného zařízení Kinect 2, které by mělo tyto možnosti značně rozšířit a většinu nedostatků svého předchůdce zcela nebo alespoň z části odstranit.
-1-
-2-
2 Zařízení Kinect Zařízení Kinect je snímací zařízení primárně určené pro herní konzoli Xbox firmy Microsoft, jež má sloužit pro bezkontaktní ovládání virtuálních her. Zařízení umožňuje ovládání hlasem a gesty, snímání až šesti uživatelů (z toho u dvou umožňuje monitorovat 20 určených bodů na těle, jako jsou ramena, ruce, hlava a další), nahrávání videa, 3D modelování snímané scény a mnoho dalšího.
2.1 Základní informace Zařízení sestává z několika hlavních komponent (viz. obrázek 1): videokamera, hloubkový senzor, pole mikrofonů (Microphone array), trojosý akcelerometr1, který umožňuje zařízení rozpoznat svou orientaci v prostoru a motor umožňující naklápění zařízení.
Obrázek 1: Základní schéma zařízení Kinect. Převzato z [1].
2.1.1 Videokamera Zařízení Kinect je vybaveno RGB kamerou schopnou pořizovat video v rozlišení 640x480 pixelů rychlostí 30 snímků za vteřinu. Kamera je schopná pořizovat i obraz v rozlišení 1280x960 pixelů, avšak pouze s rychlostí 12 snímků za vteřinu. 2.1.2 Hloubkový senzor Infračervený hloubkový senzor zařízení Kinect, jenž byl vyvinut firmou PrimeSense, pracuje na technologii světelného kódování (Light coding) [2]. Senzor sestává z vysílače infračerveného záření (IR emitter) a infračervené kamery se stejným rozlišením, jaké má videokamera (včetně možnosti přepnutí na vyšší rozlišení za cenu ztráty pořizovací rychlosti).
1
Zařízení schopné měřit akceleraci.
-3-
Vysílač infračerveného záření vyzařuje do prostoru předem známý a pevně daný vzor infračervených paprsků, které jsou okem neviditelné. Infračervená kamera je však schopna tyto paprsky detekovat (obrázek 2). Kamera tedy nahrává videozáznam zachycující vysílané paprsky a obraz je dále zpracován a porovnán s původním vzorem. Míra deformace původního vzoru určuje, jak vzdálený objekt se na daném místě nachází.
Obrázek 2: Ukázka emitovaných infračervených paprsků. Převzato z [3].
Samotný vzor použitý v zařízení Kinect je sestaven z devíti stejných podvzorů (obrázek 3), uspořádaných v matici 3x3. Velikost podvzoru je 211x165 (bereme-li jednu světelnou skvrnu paprsku jako jeden pixel) s jedním, výraznějším paprskem ve středu [28]. Podvzor je středově souměrný, což teoreticky umožňuje zařízení Kinect korektní snímání hloubky i v případě, že je zavěšeno obráceně.
Obrázek 3: Podvzor použitý v zařízení Kinect. Převzato z [4].
Na základě této logiky je již možné vytvořit hloubkovou mapu scény (obrázek 4). Tuto mapu je pak možné číst a zpracovávat v programu, nebo si vyžádat přímo záznam infračervené kamery. Tato technologie je principielně podobná technologii strukturovaného světla (Structured light2).
2
3D snímače pracující na technologii strukturovaného světla pracují velmi podobně, avšak namísto zdánlivě neuspořádaných teček používají jako vzor pravidelné pruhy, případně mřížku.
-4-
Obrázek 4: Hloubková mapa vytvořená z videozáznamu infračervené kamery. Převzato z [5].
Data pořízená hloubkovým senzorem jsou také používána k nalezení uživatelů a jednotlivých bodů na jejich těle. 2.1.3 Pole mikrofonů Uvnitř zařízení Kinect se nacházejí čtyři různě umístěné mikrofony, které jsou schopny pořizovat audio záznam se snímkovací frekvencí3 16 kHz. Zařízení je také schopno potlačovat šum, detekovat polohu zdroje zvuku a také jeho směr, popřípadě se zaměřit pouze na zvuk přicházející z určitého směru [6].
2.2 Dostupné knihovny K dispozici je několik různých knihoven pro práci se zařízením Kinect. Každá poskytuje jiné možnosti a je podporována různými programovacími jazyky. 2.2.1 Libfreenect Knihovna vyvíjená otevřenou komunitou OpenKinect. Knihovna zahrnuje kód potřebný k aktivaci, inicializaci a datové komunikaci se zařízením Kinect. Zahrnuje také multiplatformní API4, které funguje pod operačními systémy Windows, Linux a OS X. API má obsahovat navázání5 na programovací jazyky C, C++, C#, Java a Python [7]. OpenKinect komunita plánovala také vytvoření knihovny OpenKinect Analysis Library, která má pracovat nad knihovnou Libfreenect, analyzovat data získaná ze senzoru Kinect a zpracovávat je do užitečnějších abstrakcí (knihovna má obsahovat například sledování rukou, sledování kostry, 3D rekonstrukci, pokročilé zpracování hloubky 3
Snímkování je převod spojitého signálu na diskrétní. Snímkovací frekvence udává, jak často je hodnota spojitého signálu zaznamenána. 4 Application programming interface je rozhraní pro programování aplikací. Jde o množinu funkcí dostupných programátorovi. 5 Navázání (binding) na programovací jazyk je množina obalovacích tříd (wrapper classes), které lze volat v daném navazovaném jazyce, jež dále spouští funkce vybrané knihovny, psané pouze v jednom jazyce (Umožňují tedy napsat jednu knihovnu, kterou je možné používat několika programovacími jazyky).
-5-
a GPU akceleraci pro všechny tyto úlohy). Zatím však není k dispozici žádná verze OpenKinect Analysis Library. 2.2.2 Java for Kinect (J4K) Java for Kinect je open source knihovna, která implementuje navázání na programovací jazyk Java pro knihovnu Microsoft Kinect SDK. Komunikuje s nativní knihovnou Windows, která zpracovává datové toky videa, hloubky a koster zařízení Kinect za použití knihovny Java Native Interface (JNI). Dále knihovna obsahuje několik tříd, které převádějí data ze zařízení Kinect do objektů jazyka Java. Je také možné použít knihovnu JOGL Java library k vizualizaci dat získaných ze zařízení Kinect v OpenGL [8]. 2.2.3 Kinect for Windows SDK Kinect for Windows Software Development Kit je oficiální základní knihovnou pro zařízení Kinect vydanou firmou Microsoft. Poskytuje podporu pro programovací jazyky C++, C# a Visual Basic. Knihovna obsahuje ovladače a technickou dokumentaci pro implementaci aplikací využívajících zařízení Kinect, API a dokumentaci pro programování, příklady, které ukazují vhodné postupy při použití senzoru Kinect a ukázkové kódy [9]. Kromě této knihovny existují i nadstavbové knihovny. První je Kinect for Windows Developer Toolkit. Tato knihovna obsahuje nové příklady a ukázkové kódy, Kinect Fusion, Kinect Interactions a Kinect Studio. Kinect Fusion umožňuje provádět snímání a 3D rekonstrukci scény za použití senzoru Kinect, a to v reálném čase na podporovaných GPU6, nebo pomaleji na CPU7. Kinect Interactions je komponenta umožňující identifikaci a sledování rukou, rozpoznávání gest (v současné době pouze stisku a úchopu) a poskytování informací o ovládacích prvcích, s nimiž uživatel právě pracuje. Jejím základním kamenem je datový tok interakce (Interaction stream), který zpracovává data z toku hloubky a koster (Depth stream a Skeleton stream). Kinect Studio je pomocný nástroj při psaní aplikací pro zařízení Kinect. Umožňuje nahrávat a ukládat datové toky senzoru Kinect a opětovně je přehrávat pro účely testování. Druhou knihovnou je Microsoft Face Tracking Software Development Kit for Kinect for Windows, nebo zkráceně Face Tracking SDK, která společně s Kinect for Windows SDK umožňuje sledovat lidskou tvář v reálném čase, včetně výrazu tváře. Face Tracking SDK získává vstup z kamery zařízení Kinect, analyzuje pozici hlavy a výraz tváře a tato data zpřístupňuje aplikaci v reálném čase [13]. 2.2.4 Výběr knihovny Pro implementaci podpory pro Kinect do her učených pro projekt BRAIN byla nakonec vybrána knihovna Kinect for Windows SDK, neboť obsahuje podrobnou dokumentaci včetně ukázek, má širokou podporu ze strany uživatelů a poskytuje rozsáhlé možnosti při manipulaci se zařízením Kinect.
6 7
Graphic processing unit – Jedná se o procesor grafické karty. Central processing unit – Jedná se o procesor počítače.
-6-
2.3 Kinect 2 Druhá generace zařízení Kinect (obrázek 5) byla uvedena na trh 22. listopadu 2013, avšak pouze pro několik zemí, převážně v Severní Americe a Evropě. Ač s velmi podobným designem a pracující na stejném principu, Kinect 2 obsahuje mnoho změn a vylepšení oproti první verzi senzoru, které jsou shrnuty v následující tabulce.
Obrázek 5: Zařízení Kinect 2. Převzato z [10].
Kamera Zorné pole kamery (Field of view) Aktivní infračervené čidlo (pro noční vidění kamery) Hloubkový senzor Audio snímání Sledování uživatelů Audio Výstup Naklápění senzoru
Kinect 640x480, 30 snímků za vteřinu (fps), 4:3 57° horizontální 43° vertikální Ne
Kinect 2 1920x1080, 30 snímků za vteřinu (fps), 16:9 70° horizontální 60° vertikální Ano
Infračervený Structured Infračervený Time-OfLight hloubkový senzor Flight hloubkový senzor 4 mikrofony pracující na 4 mikrofony pracující na frekvenci 16 kHz frekvenci 48 kHz Až 2 uživatelé současně, 20 Až 6 uživatelů současně, 25 bodů na těle bodů na těle Pole 4 mikrofonů se snímPole 4 mikrofonů se snímkovací frekvencí 48 kHz kovací frekvencí 16 kHz 2.0 USB 3.0 USB Automatické, poháněné Manuální vestavěným motorem
Srovnávací tabulka zařízení Kinect a Kinect 2. Údaje získány z [1] a [11].
Kamera – Kamera se standardním poměrem stran byla vystřídána širokoúhlou kamerou s vysokým rozlišením (1080p) s větším zorným polem. Bylo také přidáno aktivní infračervené čidlo, které umožňuje snímání kvalitního obrazu i za zhoršených světelných podmínek.
-7-
Hloubkový senzor – Namísto původního senzoru pracujícího na principu strukturovaného světla (Structured light) je použit senzor pracující na principu doby letu (Time-OfFlight). Time-Of-Flight kamera vysílá světelné signály a poté měří, jak dlouho jim trvá, než se dostanou zpět. Toto vyžaduje senzor schopný snímat s přesností na 1/1010 vteřiny [12]. Hlavním vylepšením v této oblasti je schopnost sledování 25 bodů na těle šesti hráčů současně, oproti 20ti bodům dvou uživatelů u původního zařízení [11]. Audio snímání – Stejně jako v prvním zařízení Kinect, i zde jsou použity čtyři mikrofony nepravidelně rozmístěné v těle přístroje. Kinect 2 však má být schopen nahrávat zvuk se snímkovací frekvencí 48 kHz. Navíc zvládne rozlišovat dvě osoby mluvící zároveň a samotná kvalita rozlišování mluveného slova by měla být vyšší [14].
-8-
3 Projekt BRAIN Projekt BRAIN má za cíl vytvořit aplikaci určenou pro osoby s pervazivními poruchami8, která by jim umožnila rozvíjet jejich kognitivní funkce.
3.1 Počátky projektu Počátky aplikace BRAIN sahají do podzimu roku 2013, kdy studenti z Psychologického ústavu Fakulty filozofie Masarykovy univerzity pod vedením PhDr. Pavla Humpolíčka, Ph.D. poprvé projevili zájem o spolupráci s Laboratoří interakce člověka s počítačem Fakulty informatiky. Na prvním setkání byly pouze nastíněny myšlenky o několika jednoduchých aplikacích, které by jednak sloužily Psychologickému ústavu jako jednoduché nástroje pro analýzu lidského vnímání a dále by ukázaly možnosti využití některých zařízení, které jsou k dispozici v Laboratoři interakce člověka s počítačem. Později byly zformovány již konkrétnější požadavky na vybrané aplikace, mezi něž patří například aplikace MouseToKinect nebo KinectKeyboardDrive a dále aplikace ve formě miniher, které by byly primárně určené pro děti s pervazivními poruchami. Po několika raných verzích těchto aplikací se zrodila myšlenka na vytvoření kolektivního projektu, který by všechny tyto minihry spojil do jednoho celku a umožnil tak ucelenější zážitek ze hry a zároveň poskytl Psychologickému ústavu možnost analyzovat, jak si děti při hraní her vedly a jak reagovaly na jednotlivé podněty.
3.2 Celkový obraz aplikace BRAIN Aplikace BRAIN má za cíl vytvořit komplexní počítačovou hru, která bude primárně zaměřená na trénování kognitivních funkcí osob s pervazivními poruchami. Hra poskytne trojrozměrné prostředí, které bude připomínat lidský mozek zevnitř (ve značně stylizované podobě – viz. obrázek 6). Uživatel se vydá na procházku tímto prostředím, při čemž na různých místech mu bude nabídnuta možnost pokusit se vyřešit nějaký hlavolam či vyhrát jednoduchou hru.
Obrázek 6: Ukázka prostředí aplikace BRAIN. 8
Pervazivní vývojové poruchy jsou vývojové poruchy charakterizované obtížemi úspěšně se adaptovat ve společnosti v důsledku kvalitativních abnormit osobnosti a psychosociální úrovně (abnormity motorické, emocionální, volní, kognitivní, řečové) [17]. Typickým příkladem je autismus.
-9-
Uživatel je celou dobu provázen malým pomocníčkem – Neuronem. Ten může v případě potřeby poskytnout pomoc, když si uživatel neví rady, případně bude vyjadřovat emoce na základně úspěchů hráče (radost při vítězství v minihře apod.). Jeho hlavní úlohou je tedy poskytovat zpětnou vazbu, která je například právě pro děti trpící autismem důležitá. Dalším důležitým prvkem bude systém odměn za dokončené minihry. Odměny se mohou lišit v závislosti na uživateli, pro kterého bude hra určena. Může se jednat o možnost zahrát si nějakou hru, která není součástí aplikace BRAIN, případně přístup k zajímavým informacím apod. Každá hra poskytuje několik různých obtížností a počínání uživatele během hraní monitoruje a výslednou statistiku zaznamenává do externího souboru pro pozdější zpracování. Kromě těchto statistik vytvářených čistě v rámci jednotlivých miniher bude samotné prostředí aplikace BRAIN sledovat uživatele a za použití technik pro rozpoznávání výrazu tváře odvozovat, jaké emoce uživatele v danou chvíli ovládají. Nakonec bude možné na základě analýzy všech dostupných statistik odhadnout, jak se uživatel cítil při spuštění dané hry, jestli se při hře bavil, jak si vedl a zda ho vítězství potěšilo, či byl naopak zklamaný neúspěšným výsledkem. Minihry jsou navíc navrženy tak, aby otestovaly jednotlivé aspekty uživatelova vnímání a schopností. Z dosažených výsledků je tak možné určit, která polovina mozku uživatele je aktivnější, zda má problémy s rozlišováním některých barev a tvarů a podobně.
3.3 Ovládání aplikace BRAIN Aplikace BRAIN bude podporovat ovládání pomocí zařízení Kinect a zařízení LEAP Motion9. Toto nejen zvýší atraktivitu hraní pro uživatele, ale například dětem trpícím ADHD (hyperkinetickou poruchou) umožní mimo jiné plně zapojit jejich hyperaktivitu. Naopak uživatelé s poruchami pohybového aparátu mohou aplikaci ovládat pouze rukou, případně dokonce prstem.
3.4 Spolupráce a podpora Na vývoji aplikace BRAIN se podílejí studenti a zaměstnanci pracující v Laboratoři interakce člověka s počítačem, kteří vyvíjejí samotný software a dále studenti z Psychologického ústavu Fakulty filozofie pod vedením PhDr. Pavla Humpolíčka, Ph.D., kteří dodávají podklady pro jednotlivé aplikace a statistiky, které mají být analyzovány. Projekt je podporován Programem pro podporu studentských výzkumných a vývojových projektů Masarykovy univerzity a částečně firmou Microsoft (v podobě poskytnutí několika zařízení Kinect, které jsou k dispozici přímo uživatelům účastnícím se testování aplikace).
3.5 Projekty s podobným zaměřením Aplikace BRAIN však není jediným projektem tohoto zaměření. Již delší dobu je dostupná aplikace Pictogram Room, vyvinutá Výzkumnou skupinou Institutu roboti9
Zařízení LEAP Motion je snímacím zařízením podobným Kinectu. Je však daleko menší (zhruba velikosti běžného MP3 přehrávače), obsahuje pouze hloubkový senzor a je určeno pouze pro snímání rukou.
- 10 -
ky na Univerzitě ve Valencii (Autism Group of Robotics Institute at the University of Valencia). Jedná se o program rozšířené reality10 (Augmented reality) určený pro osoby s poruchami autistického spektra. Aplikace obsahuje čtyři kolekce her – Tělo (Body), Pozice (Positions), Ukazování (Pointing out) a Imitace (Imitation). Každá z kolekcí se věnuje jiné problematice. Hry z kolekce Tělo slouží pro uvědomění si jednotlivých částí lidského těla a pochopení jejich významu. Kolekce Pozice navazuje na kolekci Tělo a snaží se vysvětlit význam některých lidských póz. Ukazování slouží pro hledání objektů, jejich nalezení a snaží se uživatele naučit vyčíst, na co ostatní ukazují. Imitace je soubor her, v nichž vždy jeden přebírá úlohu předváděče a druhý úlohu pozorovatele/imitátora. Každá hra je doplněna ukazatelem postupu, díky kterému má uživatel přehled, kolik úloh již splnil a kolik jej teprve čeká. Aplikace je ovládána zařízením Kinect a je dostupná zdarma na webových stránkách projektu11. Informace o projektu získány z [27]. Na rozdíl od projektu BRAIN, aplikace Pictogram Room klade důraz pouze na obsah samotných miniher a vizuální stránka je řešena pouze okrajově (viz. obrázek 7). Cílem projektu BRAIN je kromě obsahu také vytvořit kvalitní vizuální stránku, aby interakce byla pro pacienty zábavnější a vizuálně atraktivnější.
Obrázek 7: Aplikace Pictogram Room. Převzato z [29].
10
Pojmem rozšířená realita se rozumí program, který poskytuje náhled reálného světa doplněného o počítačem přidané prvky. Příkladem může být záznam zobrazující místnost s digitálně vytvořeným modelem letadla, které v místnosti létá. 11 http://www.pictogramas.org
- 11 -
- 12 -
4 Implementace aplikací Tato část práce se věnuje napojení aplikací na zařízení Kinect, získávání dat ze zařízení Kinect a jejich zpracování.
4.1 Základní principy napojení aplikace na zařízení Kinect Napojení jednoduché aplikace na senzor Kinect lze nejsnadněji provést pomocí tzv. událostí. Základem je vytvoření kódu, který bude přijímat data snímaná senzorem Kinect, vybere ta, která jsou podstatná pro danou situaci, a poté na základě těchto dat provede požadovanou akci (vyvolá událost). U přijímání dat je potřeba se rozhodnout, která data má senzor Kinect snímat. Můžeme požadovat údaje o kostrách, údaje o hloubce, obraze atd. Je nutné si uvědomit, že množství dat společně s rychlostí, kterou jsou snímána a tedy i posílána našemu kódu, může ovlivnit výkon naší aplikace. Není tedy vhodné požadovat po senzoru více dat, než je nezbytně nutné. Dále je třeba ze snímaných dat vybrat ty části, které jsou pro nás důležité. Může se jednat o výřez snímaného obrazu, objekty v určité vzdálenosti, nebo polohu vybraných kloubů snímaných osob. Třetím krokem je analýza těchto dat. Ve většině případů se jedná o nejnáročnější část, kterou je potřeba důkladně otestovat a optimalizovat. Opět je třeba vzít v úvahu množství dat, snažit se analýzu udělat výpočetně co nejjednodušší a minimalizovat potřebu uchovávání dříve získaných dat. Na základě výsledku analýzy získaných dat poté kód vytvoří požadovanou událost a pošle ji aplikaci ke zpracování. Pokud lze ovládání aplikace zpracovat pouze na základě vytváření těchto událostí, je samotné napojení našeho kódu triviální.
4.2 Datové toky (Data streams) Senzor Kinect je schopen snímat několik různých typů dat a ty dále analyzovat a skládat do abstraktnějších celků. Všechna tato data je možné zpřístupnit přes odpovídající datový tok. Rychlost a formát datového toku lze nastavit. Z každého toku lze odebírat data pouze v jedné podobě. Pokus o otevření datového toku podruhé s jinými parametry způsobí pouze změnu jeho parametrů. Datový tok barev (Color stream) – Jedná se o tok, který posílá data interpretovatelná jako video (přesněji sérii obrázků). Je možné vyžádat si data ve formátu RGB v rozlišení 640x480 s rychlostí 30 snímků za vteřinu, nebo v rozlišení 1280x960 s rychlostí 12 snímků za vteřinu. Dalším dostupným formátem je Bayerův. Jedná se o RGB data, na která byl aplikován Bayerův filtr12, a jsou dostupná ve stejných rozlišeních, jako RGB data. Posledním formátem je YUV. Jedná se o RGB data s gamma korekcí a jsou dostupná pouze v rozlišení 640x480 s rychlostí 15 snímků za vteřinu [15]. Tok infračervených dat (Infrared stream) – Datový tok zpřístupňuje přímo videozáznam z infračervené kamery. Přístup k těmto datům byl umožněn až v Kinect SDK verzi 12
Bayerův filtr je pole barevných filtrů, které do výsledného obrázku zahrnuje dvakrát více zelených hodnot pixelů, než modrých a červených, aby výsledek více odpovídal fyziologii lidského oka, které je citlivější na zelenou barvu.
- 13 -
1.6. Z hlediska datových toků se nejedná přímo o samostatný datový tok, nýbrž o speciální nastavení datového toku barev [15]. Není tedy možné pracovat s obrazem ze standardní kamery zařízení Kinect a zároveň s obrazem z infračervené kamery. Je ale možné pracovat s libovolným z těchto obrazů a zároveň s datovým proudem hloubky. Společně s možností libovolně vypínat a zapínat vysílač infračerveného záření může být tento datový tok použít k naprogramování pasivního nočního vidění, nebo přímo aktivního nočního vidění, kdy vysílač infračerveného záření slouží v podstatě jako přisvětlovač [16]. Konečně, je možné tento datový tok použít ke zkalibrování polohy dvou zařízení Kinect, kdy jedno zařízení bude mít vysílač infračerveného záření vypnutý a k detekci objektů bude používat paprsky emitované druhým zařízením. Datový tok hloubky (Depth stream) – Data získaná z tohoto datového toku sestávají ze dvou částí. Jednou jsou údaje o hloubce scény – každý pixel obrázku obsahuje hodnotu, která udává vzdálenost daného místa od roviny zařízení Kinect13 v milimetrech. Druhou částí je index uživatele, který je rovněž obsažen v každém pixelu obrázku – jedná se buď o nulu, nebo o identifikační číslo uživatele, jež se nachází na daném místě. Zařízení Kinect se pokouší získat data o hloubce buď v rozsahu od 800 mm do 4000 mm, což je základní nastavení (default), nebo v „blízkém“ režimu (near) v rozsahu od 400 mm do 3000 mm [18]. Získané hloubkové hodnoty mimo tento rozsah jsou brány jako nepřesné a jsou nahrazeny speciálními hodnotami, které určují, zda byly detekovány objekty příliš blízko senzoru (too near), nebo naopak příliš daleko (too far). Pokud se nepodaří zjistit hloubku v dané oblasti, je označena jako neznámá (unknown). Grafické znázornění viz. obrázek 8. Hloubková data lze přijímat v rozlišení 640x480, 320x240, nebo 80x60, vždy rychlostí 30 snímků za vteřinu [19].
Obrázek 8: Snímací rozsah hloubkového senzoru zařízení Kinect. Převzato z [20].
Nezávisle na rozlišení je možné data požadovat ve dvou podobách [19]: Zabalené hloubkové informace (packed depth information), kde je každý pixel reprezentován jednou 16tibitovou hodnotou, z čehož 13 bitů připadá na vzdálenost daného místa od plochy zařízení Kinect a 3 bity na index uživatele. Pokud je nasnímána hloubka mimo běžný rozsah, je nahrazena patřičnou speciální hodnotou (příliš blízko nebo příliš daleko) a oblasti s hloubkou, kterou se nepodařilo zjistit, jsou označeny jako neznámé.
13
Rovina zařízení Kinect – Jedná se o rovinu, jejíž normálový vektor je rovnoběžný se směrem pohledu zařízení Kinect a její vzdálenost od zařízení Kinect je nulová.
- 14 -
Úplné hloubkové informace (full depth information), kde je každý pixel reprezentován dvěma 16tibitovými hodnotami. Jednou je vzdálenost a druhou index hráče. V této podobě se zařízení Kinect pokouší poskytnout všechny údaje o hloubce, i když jsou mimo rozsah a mohou být nepřesné. Oblasti s hloubkou, kterou se nepodařilo zjistit, jsou označeny jako neznámé. Tato varianta byla přidána až v Kinect SDK verzi 1.6. Datový tok koster (Skeleton stream) – Datový tok koster obsahuje data získaná zpracováním datového toku hloubky. Základem tohoto toku je pole koster, které reprezentují jednotlivé uživatele zaznamenané senzorem Kinect (nula až šest). Každá kostra má přiřazené své unikátní identifikační číslo (shodné s identifikačním číslem v datovém toku hloubky) a další doplňující informace. U dvou vybraných koster je navíc možné sledovat polohu a orientaci 20ti různých bodů na těle (joints)(viz. obrázek 9). Kvůli složitému a výpočetně náročnému algoritmu identifikace jednotlivých bodů na těle není možné takto podrobně sledovat více než dva uživatele. Podle uživatelského identifikačního čísla je však možné zjistit, kteří uživatelé jsou sledováni (hodnota IsTracked dané kostry je nastavena na true).
Obrázek 9: Body na těle uživatele sledované zařízením Kinect. Převzato z [25].
Na základě pozic jednotlivých bodů na těle je také možné pracovat s orientací kostí (bones) uživatele. Kosti jsou virtuální spojnice mezi rodičovským bodem (parent joint) a potomkem (child joint). Tato hierarchie má kořen v bodě ve středu pánevní kosti (hip center), od kterého pokračuje směrem k jednotlivým končetinám(viz. obrázek 10). Každá kost obsahuje údaj o takzvané hierarchické rotaci (hierarchical rotation), která udává velikost rotace potomka v jednotlivých osách ve trojrozměrném prostoru vůči rodičovskému bodu [25].
- 15 -
Obrázek 10: Hierarchie kostí vytvořená na základě sledovaných bodů uživatele. Převzato z [25].
Datový tok audia (Audio stream) – Tento datový tok je schopen zprostředkovávat zvuk zaznamenaný zařízením Kinect společně s dalšími údaji, které je zařízení schopné zjistit [21]. Mezi tyto doplňující údaje patří identifikace směru, ze kterého daný zvuk přichází. Výpočet polohy zdroje zvuku je možný díky rozmístění čtyř mikrofonů v těle zařízení Kinect. Když uživatel promluví, zvuk dorazí do každého mikrofonu po jinak dlouhé době. Na základně tohoto rozdílu je zařízení schopno určit, z jakého směru zvuk přichází [22]. Zařízení Kinect je také schopné zvyšovat kvalitu snímaného audio záznamu pomocí několika komponent [23]. Odstranění akustické ozvěny (Acoustic echo cancellation) – Tato komponenta pomáhá zlepšit kvalitu zvuku odstraněním ozvěny, která přichází do mikrofonů, například z reproduktorů. Tato komponenta také umožňuje potlačení zvuků, které přicházejí z jiného směru, než který očekáváme. Potlačení šumu (Noise suppresion) – Stará se o odfiltrování zvuků, které jsou považovány zařízením Kinect za šum. Jako šum jsou detekovány typicky zvuky, kterým zařízení nerozumí. Automatický ovladač přírustku (Automatic gain control) – Umožňuje automaticky regulovat hlasitost detekované řeči a získávat tak konstantní hlasitost nezávisle na poloze mluvčího. Všechny tyto komponenty je možné libovolně zapínat a vypínat. Datový tok interakce (Interaction stream) – Nejnovější datový tok (přidán v Kinect for Windows Developer Toolkit verzi 1.7), který zároveň není součástí základní knihovny Kinect SDK. Pracuje nad daty získanými z datového toku hloubky a datového toku koster. Při jeho využití je nutné přímo v aplikaci zapnout datové toky hloubky a koster a zajistit jejich zpracování tímto datovým tokem. Tento datový tok je základním stavebním kamenem rozšíření Kinect Interaction, které je hlavní součástí Kinect for Windows Developer Toolkit [24]. Jeho hlavní složkou jsou údaje o pozici rukou uživatele, které poskytuje právě na základě dat získaných z datových toků hloubky a koster. Stejně jako z datového toku koster obdržíme pole koster, z datového toku interakce obdržíme pole uživatelských informací. Každý prvek tohoto pole odpovídá jednomu uživateli. Každý soubor uživatelských informací odpovídající danému uživateli obsahuje stejné identifikační číslo, které odpovídá tomuto uživateli v datovém toku koster a seznam rukou (Interaction hand pointers), které byly nalezeny a rozpoznány jako náležející tomuto uživateli. Každá nalezená ruka má seznam několika parametrů: - 16 -
Typ události ruky (Hand event type) – Tento parametr nabývá hodnoty odpovídající gestu úchopu (grip) a puštění (grip release), případně hodnoty žádná (none), pokud nebylo detekováno žádné z těchto dvou gest. Parametr hodnou gesta obsahuje pouze tehdy, došlo-li ke gestu právě v tomto snímku (frame). V případě, že si potřebujeme pamatovat, zda je daná ruka otevřená, či zavřená, je potřeba si v každém snímku ověřit, zda je hodnota různá od hodnoty none a pokud ano, tak si tuto hodnotu uložit do pomocné proměnné. Typ ruky (Hand type) – Určuje, zda se jedná o levou ruku (left), pravou ruku (right), nebo ani jedno (none). Poslední možnost existuje nejspíše pro případ, kdy zařízení Kinect ruku detekuje, ale není schopno rozhodnout, o kterou se jedná. Je aktivní (Is active) – Ruka není svěšená, ale nenachází se v interaktivní zóně (viz. následující bod). Je interaktivní (Is interactive) – Ruka je považována za interaktivní, nachází-li se v takzvané interaktivní zóně uživatele – Ruka je lehce zvednutá a nachází se před uživatelem, je připravená „interagovat s aplikací“. Stiskává (Is pressed) – Slouží k zjištění, zda uživatel provedl gesto stisknutí (press). Hodnota je nastavena na pravdu, je-li stupeň stisku (press extent) větší než jedna. Je primární pro uživatele (Is primary for user) – Parametr udává, zda se jedná o primární ruku uživatele. Za primární je považována ruka, která je interaktivní a naposledy byla použita pro interakci s aplikací. Je sledována (Is tracked) – Hodnota odpovídá tomu, zda senzor Kinect sleduje danou ruku. Jelikož v situaci, kdy by uživatel skryl ruku tak, že by ji senzor nezaznamenal, bychom žádné údaje o ruce nezískali, je pravděpodobné, že slouží k zjištění, zda je momentálně ruka tohoto uživatele monitorována v případě, že se před senzorem Kinect nachází více než dva uživatelé (Podobně jako hodnota IsTracked u datového toku koster). Stupeň stisku (Press extent) – Udává číselnou hodnotu určující, v jaké fázi gesta stisku se ruka nachází. Pokud ruka gesto neprovádí, je hodnota rovna nule. Pokud hodnota překročí jedna, je gesto považováno za provedené. Nezpracované X (Raw X) – Souřadnice X dané ruky. Osa X má směr vlevo od uživatele stojícího čelem k zařízení Kinect. Nezpracované Y (Raw Y) – Souřadnice Y dané ruky. Osa Y má směr vzhůru. Nezpracované Z (Raw Z) – Souřadnice Z dané ruky. Osa Z má směr k zařízení Kinect od uživatele. Počátek osy se nachází přibližně ve vzdálenosti trupu uživatele. X – Testy se zařízením Kinect ukázaly, že hodnota této složky odpovídá hodnotě Nezpracované X (Raw X). Y – Stejně jako v případě předchozí složky, hodnota Y odpovídá hodnotě Nezpracované Y (Raw Y).
- 17 -
4.3 KinectRegion Třída KinectRegion je součástí vývojářské sady nástrojů pro Kinect (Kinect for Windows Developer Toolkit), která umožňuje značně zjednodušit práci s daty získanými prostřednictvím senzoru Kinect. KinectRegion zpracovává data o pohybu rukou sledovaných uživatelů, analyzuje jejich pozici a gesta. Stará se také o vyvolávání událostí nad ovládacími prvky aplikace, jako je například stisk tlačítka apod. Využívá k tomu datového toku kostry (Skeleton stream), datového toku hloubky (Depth stream) a datového toku interakce (Interaction stream). Poskytuje také ukazatel (Kinect Cursor), který slouží namísto kurzoru myši k interakci s aplikací a jehož pozice je na kurzoru myši nezávislá. Nevýhodou třídy KinectRegion a její automatizace zpracovávání dat je nemožnost jakkoli ovlivnit či změnit většinu z těchto úloh. Jako ovládací prvky aplikace navíc musejí být použity právě ty, které jsou dodávány ve vývojářské sadě nástrojů pro Kinect, aby s nimi mohl KinectRegion pracovat, popřípadě je třeba nadefinovat vlastní ovládací prvky tak, aby s nimi třída KinectRegion mohla pracovat. Na jiných ovládacích prvcích nebude detekce gest fungovat, což může být v mnoha situacích velmi nevýhodné. Z výše uvedeného plyne, že třídu KinectRegion je vhodné použít v aplikacích ovládaných pomocí kurzoru, které jsou vyvíjeny převážně pro zařízení Kinect. Třída není příliš použitelná pro vývoj programů, kde není možné použít ovládací prvky z knihovny Kinect SDK, popřípadě jsou kladeny na ovládání specifické nároky, které neodpovídají rutině třídy KinectRegion. Ideálním místem pro použití třídy KinectRegion v kontextu rozsáhlejších aplikací jsou nabídky aplikace.
4.4 Výběr aktivního uživatele Jedním ze základních problémů při tvorbě aplikací pro zařízení Kinect je výběr a zpracování aktivních uživatelů. Kinect vždy detekuje až šest uživatelů nacházejících se před senzorem. Každému uživateli je ve chvíli, kdy vstoupí do zorného pole zařízení Kinect, náhodně přiděleno kladné identifikační číslo, odlišné od čísel přiřazených uživatelům, kteří se před zařízením již nacházejí. Pokud uživatel zorné pole zařízení opustí a po chvíli se opět vrátí, bude mu přiděleno nové identifikační číslo. Není tedy možné používat po celou dobu běhu aplikace stejné identifikační číslo [26]. Mechanismus detekce uživatele je třeba vytvářet dle požadavků konkrétní aplikace. 4.4.1 Nekontrolovaný výběr Data o uživatelích dostaneme z toku koster v podobě rámce koster (Skeleton frame). Prvním krokem je vždy překopírování dat z tohoto rámce do předem připraveného pole (Skeleton array), které bylo inicializováno tak, aby odpovídalo maximální velikosti jednoho rámce koster (lze provést například během inicializace zařízení Kinect). V případě, že nepožadujeme rozdílné zpracovávání údajů o uživatelích, není třeba uživatele rozlišovat a údaje můžeme přímo zpracovávat. Jedná se o nejjednodušší přístup a je vhodný například pro prostou detekci pohybu apod. Tento přístup je možné
- 18 -
použít i v jiných aplikacích, nicméně je potřeba zajistit, aby během práce s aplikací nevstoupil do zorného pole senzoru jiný uživatel. Kód algoritmu je možné nalézt v příloze (kapitola 8.2). 4.4.2 Jeden uživatel Nejčastějším případem je situace, kdy potřebujeme zpracovávat data pouze o jednom uživateli a přejeme si, aby se aplikace chovala korektně i v případě, že před senzorem budou procházet i jiní uživatelé. Při tomto přístupu je třeba si kromě pole (Skeleton array) připravit ještě jednu proměnnou pro jednu kostru uživatele (Player skeleton) a jednu celočíselnou proměnnou, která bude sloužit pro uchování identifikačního čísla uživatele (Skeleton ID), jež bude na počátku inicializována na zápornou hodnotu (například -1). Prvním krokem bude opět naplnění předem připraveného pole daty o detekovaných uživatelích. Dále bude potřeba ošetřit čtyři možné scénáře: 1. Uživatel se nenachází v zorném poli senzoru a aplikace jej nemá uloženého (Skeleton ID = -1). 2. Uživatel vstoupil do zorného pole senzoru a aplikace jej ještě nemá uloženého. 3. Uživatel se nachází v zorném poli senzoru a aplikace jej má uloženého. 4. Uživatel, jehož má aplikace uloženého, opustil zorné pole senzoru. Nejdříve je třeba z pole získat data sledovaného uživatele. Pokud aplikace ještě nemá uložené identifikační číslo žádného uživatele (Skeleton ID = -1), je třeba si vyžádat data o prvním sledovaném uživateli před senzorem nebo základní hodnotu (First or default), která odpovídá prázdným datům (odpovídá prvnímu a druhému scénáři). Pokud již aplikace má uložené identifikační číslo nějakého uživatele (Skeleton ID se nerovná -1), vyžádáme si kostru uživatele s daným identifikačním číslem (odpovídá třetímu a čtvrtému scénáři). Nyní je nutné provést test, zda kostra, kterou jsme získali, obsahuje data (Player skeleton není null). Pokud kostra data obsahuje, přepíšeme uložené identifikační číslo uživatele (Skeleton ID) na identifikační číslo získané kostry (tímto pokryjeme scénář číslo dvě) a zpracujeme dále data kostry. Pokud kostra data neobsahuje, zahazujeme kostru a identifikační číslo uživatele nastavujeme na -1 (pokrývá scénář číslo čtyři). Algoritmus se nyní bude chovat korektně ve všech scénářích (viz. obrázek 11): 1. Pomocí First or default získáme prázdná data, která následně zahodíme. 2. Pomocí First or default získáme data o novém uživateli, uložíme si jeho identifikační číslo a zpracujeme data. 3. Vyžádáme si data odpovídající uloženému identifikačnímu číslu a zpracujeme data. 4. Vyžádáme si data odpovídající uloženému identifikačnímu číslu a protože jsou prázdná, data zahodíme a uložené identifikační číslo přepíšeme na -1.
- 19 -
Obrázek 11: Diagram znázorňující algoritmus pro výběr jednoho uživatele.
Kód algoritmu je možné nalézt v příloze (kapitola 8.2). 4.4.3 Dva uživatelé Pokud je třeba sledovat dva různé uživatele, kteří pracují s aplikací, lze částečně využít algoritmus výběru jednoho uživatele s patřičnou modifikací. Kromě pole koster je třeba si připravit také dvě proměnné pro ukládání kostry prvního a druhého uživatele a dvě celočíselné proměnné pro identifikační čísla těchto uživatelů. Prvním krokem bude opět naplnění pole koster daty o detekovaných uživatelích. Dále bude postup podobný jako u algoritmu výběru jednoho uživatele, ale akce bude třeba provádět pro oba uživatele postupně. Nejdříve získáme kostry uživatelů. Pokud nemá aplikace uložené identifikační číslo prvního uživatele (Skeleton 1 ID), je třeba si vyžádat data o prvním sledovaném uživateli před senzorem, jehož identifikační číslo je různé od identifikačního čísla druhého uživatele (toto lze provést i v případě, že druhý uživatel dosud nebyl aplikací detekován, neboť v takovém případě má druhý uživatel identifikační číslo nastavené na hodnotu -1 a identifikační čísla všech detekovaných uživatelů mají kladnou hodnotu) nebo základní hodnotu (First or default). Poté provedeme ten samý výběr pro druhého uživatele na základě uložené hodnoty identifikačního čísla druhého uživatele (Skeleton 2 ID). Nyní je potřeba provést test dat koster obou uživatelů. Test probíhá stejně jako u
- 20 -
algoritmu pro výběr jednoho uživatele. Nejdříve otestujeme data prvního uživatele, a pokud projde, data dále zpracováváme. Poté otestujeme data druhého uživatele. Tento algoritmus je možné upravit za použití stejného principu pro libovolný počet uživatelů. Kód algoritmu je možné nalézt v příloze (kapitola 8.2).
4.5 Aplikace umožňující ovládání jiných programů prostřednictvím zařízení Kinect Častý problém, na který můžeme narazit, je situace, kdy je potřeba ovládat pomocí zařízení Kinect program, který sami nemůžeme upravit a nemáme přístup k jeho zdrojovému kódu. Není tedy možné ovládání programu přizpůsobit, ani využít navázání událostí programu na senzor Kinect. Taková situace může nastat také v případě, že se pokoušíme napojit aplikaci se složitým grafickým rozhraním a napojování ovládání na zařízení Kinect by bylo příliš komplikované. Možným řešením je vytvoření externí aplikace, která bude snímat a analyzovat data ze senzoru Kinect a na základě těchto dat bude simulovat tradiční ovládací zařízení, na které program reaguje (typicky klávesnice a myš). Zde je důležité uvědomit si rozsáhlost programu, který se takto budeme snažit ovládat, neboť s rostoucí složitostí ovládání programu se pravděpodobně bude zvyšovat počet gest a pohybů potřebných pro manipulaci s programem a bude tak klesat uživatelská přívětivost našeho ovládacího rozhraní. Velkou výhodou takové externí aplikace oproti napojování je její jednoduchost, díky níž je možné rychle vytvořit prvotní verzi a ihned ji testovat s programem, který chceme ovládat, a případně tak co nejdříve odhalit zprvu skryté problémy, popřípadě konstatovat, že program je pro ovládání zařízením Kinect nevhodný. Na žádost studentů z Psychologického ústavu Fakulty filozofie Masarykovy univerzity pod vedením PhDr. Pavla Humpolíčka, Ph.D. byly vytvořeny dvě externí aplikace – MouseToKinect pro simulaci myši a KinectKeyboardDrive pro simulaci klávesnice.
- 21 -
- 22 -
5 Aplikace V souladu s požadavky byly vytvořeny tři aplikace ovládané prostřednictvím zařízení Kinect. Aplikace MouseToKinect umožňující ovládání myši, aplikace KinectKeyboardDrive umožňující hrát jednoduché hry a aplikace HitPics, což je jednoduchá logická hra.
5.1 Aplikace MouseToKinect Aplikace MouseToKinect byla vytvořena pro ovládání myši prostřednictvím zařízení Kinect. Umožňuje uživateli kontrolu nad pozicí kurzoru a levým tlačítkem myši. 5.1.1 Popis aplikace Aplikace simuluje běžnou myš a umožňuje uživateli používat pohyb rukou k ovládání běžného kurzoru a gesta stisknutí (press) a úchopu (grip) k ovládání levého tlačítka myši. Umožňuje vyvolat klik, klik a tažení (drag’n‘drop) i dvojklik a je vysoce konfigurovatelná. MouseToKinect je navržena pro ovládání pouze jedním uživatelem v daném okamžiku. K simulaci myši je využita knihovna user32.dll, která implementuje komponentu USER, jež vytváří a manipuluje se standardními elementy uživatelského rozhraní Windows. Ta umožňuje aplikaci MouseToKinect získávat i nastavit pozici kurzoru a vyvolávat události myši (mouse events). Při snímání je využito datových toků kostry, hloubky a interakce. Datový tok kostry aplikaci zasílá údaje o pozici rukou a ramen a datový tok interakce zprostředkovává za použití datových toků kostry a hloubky uživatelova gesta. 5.1.2 Princip implementace Grafické rozhraní aplikace stejně jako veškerá výpočtová logika se nachází ve třídě MainWindow. Aplikace získává informace o kostrách a interakci z odpovídajících datových toků a na základě algoritmu pro výběr jednoho uživatele vybírá relevantní data. Na základně těchto dat aplikace prostřednictvím ovladače myši upravuje polohu kurzoru a vyvolává stisky a uvolnění tlačítek myši. 5.1.3 Nastavení a jeho význam Aplikace byla od začátku vyvíjena s myšlenkou vysoké nastavitelnosti, aby poskytla ve všech případech co nejpříjemnější ovládání širokému spektru uživatelů. Následuje popis nastavení aplikace vždy se zdůvodněním, proč bylo toto nastavení přidáno. Smoothing (vyhlazování pohybu) – Nastavení zapíná vyhlazování pohybu ukazatele myši. Vyhlazování vypočítává momentální pozici ukazatele z pozice uživatelovy ruky a z předchozí pozice myši a pohyb se tak stává mnohem plynulejší, což značně usnadňuje ovládání aplikace, zejména při výběru malých ovládacích elementů obrazovky. Na druhou stranu neumožňuje pohyb ukazatelem myši rychlostí, jakou dokáže uživatel pohnout rukou.
- 23 -
Hand pointer (Ukazatel) – Určuje, která ruka bude pohybem ovládat pozici ukazatele myši. Automaticky také určuje, že opačná ruka slouží k provádění gest stisku (press gestures). Gesta stisku jsou automaticky nastavena na opačnou ruku, neboť provádění těchto gest rukou, která zároveň ovládá kurzor je velmi nepohodlné, neboť při pokusu o stisk uživatel většinou pohne ukazatelem myši a často tak ukazatel opustí ovládací element, který chtěl uživatel původně pomocí gesta aktivovat. Press gesture settings (Nastavení gest stisku) – Umožňuje zapínat a vypínat gesta stisku (je tedy možné používat pouze gesta chycení – grip gestures). Umožňuje také definovat vzdálenost mezi ramenem a zápěstím ruky, která ovládá gesta stisku, po jejímž překročení aplikace vyvolá událost stisku levého tlačítka myši (Mouse left button down) a vzdálenost, pod kterou pokud klesne vzdálenost mezi ramenem a zápěstím ruky po vyvolání stisku levého tlačítka myši, bude vyvolána událost uvolnění levého tlačítka myši (Mouse left button up). Tyto vzdálenosti je třeba nastavit podle délky paže uživatele a toho, jak moc si uživatel přeje mít nataženou ruku při stisku. Je také vhodné, aby se vzdálenosti neshodovaly, ale aby druhá vzdálenost byla o něco menší než první (viz. obrázek 12). Důvodem je fakt, že většina lidí neudrží ruku napnutou v přesně stejné vzdálenosti a i při malém zachvění ruky by tak mohlo dojít k uvolnění. Rozdíl vzdáleností nemusí být příliš velký, protože pak by uživatel musel při každém uvolnění ruku stáhnout naopak příliš, což by zpomalovalo práci uživatele.
Obrázek 12: Grafické rozhraní aplikace MouseToKinect.
Grip gesture settings (Nastavení gest chycení) – Umožňuje zapínat a vypínat gesta chycení a nastavit ruku, která bude gesta provádět. Ruka není definována automaticky na základě nastavení ruky ovládající kurzor, neboť v případě, že používáme k ovládání oba typy gest, je pohodlnější mít obě nastavené na stejnou ruku (tedy opačnou než tu, kterou ovládáme ukazatel myši). Nicméně pokud chceme k ovládání používat pouze gesto chycení, je uživatelsky přívětivější nastavit si gesto na stejnou ruku, jako ovládání ukazatele myši.
- 24 -
Dále tato část umožňuje nastavit interval, v němž pokud budou provedena dvě gesta chycení, dojde k vyvolání dvojkliku. Interval je třeba nastavit tak, aby nebyl zbytečně dlouhý a uživatel tak nemusel zbytečně čekat, pokud dvojklik provést nechce, ale zároveň nesmí být příliš krátký, aby uživatel dvojklik stihl provést. Advanced (Pokročilá nastavení) – Umožňuje nastavit koeficient mapovacího násobení a koeficient mapovacího odpočtu. Koeficient mapovacího násobení určuje, jakou konstantou má být násobena hodnota souřadnic zařízení Kinect při mapování na souřadnice obrazovky a určuje tak jednak citlivost zařízení a také to, jak moc se musí uživatel při ovládání pohybovat. Koeficient mapovacího odpočtu určuje, jaká konstanta bude odečtena při přepočtu souřadnic a ovlivňuje tedy, zda má uživatel stát více vlevo či vpravo vůči zařízení Kinect. Všechna nastavení je možné si uložit, opět načíst, popřípadě se vrátit k původnímu nastavení. 5.1.4 Shrnutí a závěr Aplikace MouseToKinect je vhodná pro libovolný program, na jehož ovládání postačuje pohyb myši a levé tlačítko. Aplikace se chová plynule a neprojevuje žádné výrazné nároky na systém. Před jejím spuštěním je nutno nainstalovat Kinect SDK a připojit zařízení Kinect.
5.2 Aplikace KinectKeyboardDrive Aplikace KinectKeyboardDrive byla vytvořena pro ovládání jednoduchých her, které zařízení Kinect běžně nepodporují. 5.2.1 Popis aplikace Aplikace je navržena jako jednoduchý simulátor klávesnice, který při použití senzoru Kinect umožní uživateli hrát jednoduché hry pomocí gest. Vzhledem k velkému množství her bylo nutno implementovat několik různých herních ovládacích mechanismů (Game controllers), každý pro ovládání jiných her, mezi nimiž je možno libovolně přepínat. Stejně jako aplikace MouseToKinect, také aplikace KinectKeyboardDrive využívá knihovnu user32.dll, a to k vyvolávání stisků kláves klávesnice. Při snímání je využito pouze datového toku kostry, který nese údaje o pozici jednotlivých kloubů uživatele. V aplikaci nebylo nutné využít datových toků hloubky a interakce, neboť logika snímání a analýzy pohybu uživatele byla přímo implementována v kódu aplikace. 5.2.2 Princip implementace Aplikace zpracovává data o kostrách detekovaných uživatelů a za pomocí algoritmu pro detekci jednoho uživatele vybírá relevantní data, která posílá aktivnímu hernímu ovládacímu mechanismu. Ten data o uživateli vyhodnocuje a vyvolává stisky a uvolnění kláves přes ovladač klávesnice (viz. obrázek 13).
- 25 -
Obrázek 13: Nákres principu fungování aplikace KinectKeyboardDrive.
Aplikace spravuje a uchovává jednotlivé herní ovládací mechanismy uvnitř dynamického listu (viz. obrázek 14). To je možné díky jednotnému interface (IGameController), který herní ovladače implementují. Zároveň interface slouží jako šablona pro vytváření jednotných ovladačů a vynucuje vytvoření metod nezbytných pro korektní fungování aplikace. Všechny herní ovládací mechanismy mají také díky jednoduchosti interface přehledný kód.
Obrázek 14: Grafické rozhraní aplikace KinectKeyboardDrive.
5.2.3 Interface herních ovládacích mechanismů Všechny herní ovládací mechanismy musejí obsahovat následující metody: GameController – Jedná se o hlavní metodu všech herních ovládacích mechanismů. Jako argument metoda přijímá kostru (Skeleton) hráče. Tělo metody se pak stará o
- 26 -
všechny nezbytné výpočty založené na gestech a polohách jednotlivých bodů na těle uživatele. GetGui – Tato metoda slouží hlavní aplikaci k získávání a zobrazování grafického uživatelského rozhraní (GUI) jednotlivých ovladačů ve formě stránky WPF. Díky tomu je možné poskytnout uživateli různé ovládací prvky, které jsou specifické pro vybraný herní ovládací mechanismus (viz. obrázek 14). Reset – Poslední metoda je volána v případě stisknutí tlačítka reset uvnitř hlavní aplikace. Některé herní ovládací mechanismy vyžadují kalibraci před samotným používáním, která umožňuje provádět výpočty na základě polohy uživatele. V případě, je třeba provést tuto kalibraci znovu, je potřeba ovladač resetovat. 5.2.4 Herní ovládací mechanismy (Game controllers) Basic controller (Základní ovladač) Úvod: Základní herní ovladač byl vytvořen jako jednoduchá demonstrace využití zařízení Kinect k ovládání jednoduchých her. Ovládací mechanismus byl vyvinut pro použití s jednoduchými závodními hrami, ale je možné jej použít k ovládání libovolné hry, kterou lze ovládat pomocí šipek. Šipky vlevo a vpravo: Ke stisku šipek vlevo nebo vpravo dojde, pokud uživatel natáhne odpovídající ruku tak, že horizontální vzdálenost mezi zápěstím a středem hrudníku přesáhne daný práh (Sides sensitivity). Když uživatel ruku opět svěsí a horizontální vzdálenost mezi zápěstím a hrudníkem opět klesne pod daný práh, dojde k uvolnění dané klávesy. Šipky nahoru a dolů: Při spuštění aplikace je zaznamenána vzdálenost uživatele od senzoru Kinect a uložena jako výchozí (Initial player distance). Pokud se poté během hry uživatel přiblíží k senzoru a přesáhne daný toleranční práh vzdálenosti (Distance tolerance), ovládací mechanismus vyvolá stisk šipky nahoru. Pokud se uživatel vzdálí od senzoru Kinect ze své výchozí pozice, ovládací mechanismus provede stisk šipky dolů. Pokud se uživatel vrátí na výchozí pozici, hra stisknutou klávesu uvolní. Toleranční práh je nutno nastavit před samotným hraním podle potřeby uživatele. Simple Wheel (Jednoduchý volant) Úvod: Herní ovladač Simple Wheel umožňuje uživateli ovládat závodní hru tak, jako by skutečně ovládal volant auta. Při použití tohoto herního ovládacího mechanismu je vhodné před spuštěním hry uživateli dát libovolný předmět tvaru volantu (například svinutý kabel). Ovládání pomocí Simple Wheel je pak mnohem intuitivnější. Zatáčení: Ovládací mechanismus vždy počítá vzdálenost levé a pravé ruky ve vertikální ose. Pokud levá ruka bude výše než pravá ruka a jejich vzdálenost přesáhne toleranční konstantu (Wheel tolerance), ovládací mechanismus vyvolá
- 27 -
stisk šipky vpravo (viz. obrázek 15). Pokud nastane opačná situace, ovládací mechanismus vyvolá stisk šipky vlevo. Až se poté ruce dostanou do stejné výšky, aplikace zkontroluje, zda je některá ze šipek stisknuta a pokud ano, vyvolá uvolnění této klávesy. Před samotným hraním je třeba nastavit danou toleranční konstantu. Bez této konstanty by ovládací mechanismus reagoval vyvoláním stisku klávesy při sebemenším pohybu rukou uživatele. Velikost konstanty závisí převážně na velikosti pomyslného volantu a délce paží uživatele. Během testování se jako nejvhodnější ukázala hodnota mezi pěti a deseti centimetry.
Obrázek 15: Princip stisku šipek vlevo a vpravo.
Zrychlení a brždění: Pro ovládání zrychlení a brzdění je využito stejného systému, jako v Základním ovladači (Basic controller). Při spuštění aplikace je zaznamenána vzdálenost uživatele od senzoru Kinect a uložena jako výchozí (Initial player distance). Pokud se poté během hry uživatel přiblíží k senzoru a přesáhne daný toleranční práh vzdálenosti (Distance tolerance), ovládací mechanismus vyvolá stisk šipky nahoru, což v převážné většině závodních her odpovídá zrychlení. Pokud se uživatel vzdálí od senzoru Kinect ze své výchozí pozice, ovládací mechanismus provede stisk šipky dolů, tedy brždění. Pokud se uživatel vrátí na výchozí pozici, hra stisknutou klávesu uvolní, což ve většině her způsobí vyřazení (tzv. neutrál) a vozidlo začne pozvolna zastavovat (viz. obrázek 16).
- 28 -
Obrázek 16: Stisk a uvolnění šipek nahoru a dolů na základě vzdálenosti uživatele od senzoru Kinect.
Jumper (Skákací ovladač) Úvod: Herní ovladač Jumper slouží k ovládání převážně plošinových her s jednoduchým ovládáním. Ovladač vyžaduje od uživatele náročnější úkoly pro ovládání oproti předchozím dvěma ovladačům, konkrétně skákání. Šipky vlevo a vpravo: Ovládání šipek vlevo a vpravo probíhá stejně, jako u Základního herního ovladače. Ke stisku šipek vlevo nebo vpravo dojde, pokud uživatel natáhne odpovídající ruku tak, že horizontální vzdálenost mezi zápěstím a středem hrudníku přesáhne daný práh (Sides sensitivity). Když uživatel ruku opět svěsí a horizontální vzdálenost mezi zápěstím a hrudníkem opět klesne pod daný práh, dojde k uvolnění dané klávesy. Šipka nahoru: Šipka nahoru může v plošinových hrách sloužit k různým účelům, typicky se jedná buďto o skok, nebo o pohled vzhůru (který přesune kameru hry tak, že postava ovládaná uživatelem není ve středu, nýbrž více ve spodní části obrazovky a odhalí tak uživateli, co se nachází nad ním). Herní ovladač Jumper je určen pro hry, ve kterých šipka nahoru slouží pro druhou jmenovanou akci a k její aktivaci je použito téměř stejného principu, jako u šipek vlevo a vpravo. Pokud uživatel natáhne levou nebo pravou ruku tak, že vertikální vzdálenost mezi zápěstím a středem hrudníku přesáhne daný práh (Top sensitivity), dojde ke stisku klávesy. Když vzdálenost opět klesne pod tento práh, dojde k uvolnění klávesy. Šipka dolů a tlačítko control (Ctrl): Stisk kláves dolů a control probíhá na základě pozice hlavy uživatele. Během spuštění ovladače Jumper je zaznamenána vertikální pozice hlavy uživatele a uložena jako výchozí (Initial player top Y). V případě, vertikální poloha hlavy uživatele se sníží tak, že hodnota klesne pod daný práh (Crouch sensitivity), což je obvykle způsobeno tím, že si uživatel
- 29 -
dřepne, je proveden stisk klávesy dolů, což odpovídá buď přikrčení ovládané postavy, případně pohled dolů (obdobné jako pohled vzhůru, viz. popis šipka nahoru). Stisk klávesy control je proveden naopak v případě, že vertikální pozice hlavy se zvýší tak, aby přesáhla daný práh (Jump distance), což vyžaduje skok uživatele. K uvolnění klávesy dojde, když uživatel opět dopadne na zem a vertikální pozice hlavy opět klesne (viz. obrázek 17). Je vhodné nastavit práh pro skok menší, než práh pro přikrčení. S rostoucím prahem pro skok totiž klesá ovladatelnost vybrané hry, neboť trvá déle, že uživatel dopadne zpět na zem a získá tak další kontrolu nad ovládáním. Práh pro přikrčení je nutné nastavit větší, neboť při dopadu po skoku se uživatel často prohne v kolenou, což může způsobit nechtěný stisk šipky dolů.
Obrázek 17: Stisk a uvolnění kláves control a šipka dolů na základě vertikální polohy hlavy uživatele (pohled směrem od zařízení Kinect k uživateli).
5.2.5 Shrnutí a závěr Aplikace KinectKeyboardDrive je vhodná pro ovládání libovolné jednoduché hry, na kterou dostačují možnosti poskytnuté vybraným herním ovládacím mechanismem. Aplikace neposkytuje podporu pro ovládání myši. Aplikace se chová plynule a neprojevuje žádné výrazné nároky na systém. Před jejím spuštěním je nutno nainstalovat Kinect SDK. Doporučené hry pro jednotlivé herní ovládací mechanismy je možné nalézt v příloze (kapitola 8.3).
5.3 Aplikace HitPics – hledání výřezu obrázku Aplikace HitPics je jednoduchá logická hra vytvořená pro projekt BRAIN. Je určena pro trénink rozeznávacích schopností uživatele. 5.3.1 Popis aplikace Po zahájení hry je uživateli je zobrazen obrázek a pod ním pouze malý výřez tohoto obrázku (viz. obrázek 18). Cílem uživatele je co nejrychleji najít výřez na hlavním obrázku a kliknout na něj. - 30 -
Aplikace je lokalizována do českého, slovenského a anglického jazyka včetně mluveného slova. Při spuštění je možné si vybrat obrázkovou sadu, ze které se budou generovat obrázky. Poté si uživatel nastaví obtížnost, která ovlivňuje velikost výřezu, který musí nalézt (čím vyšší obtížnost, tím menší výřez). Je možné také nastavit, kdy se budou měnit obrázky a skóre, kterého je potřeba dosáhnout. Po dohrání hry si uživatel může zobrazit statistiky své hry, které kromě informací o nastavení obtížnosti obsahují také celkový čas, poměr úspěšnosti apod. Statistiky je možné uložit do souboru pro pozdější analýzu.
Obrázek 18: Herní okno aplikace HitPics.
5.3.2 Princip implementace Aplikace využívá třídu KinectRegion, která poskytuje systém pro rozeznávání gest nad ovládacímí prvky, zvětšený ukazatel a mechanizmus automaticky rozeznávající připojení zařízení Kinect. Kinect je tedy možné připojit kdykoliv za běhu programu. Bez zařízení Kinect je možné aplikaci ovládat pomocí myši. Při hraní hry je hlavní obrázek (Main image) překryt nejdříve tlačítkem minutí (Miss button), které velikostí a pozicí odpovídá tomuto obrázku, s průhledností nastavenou na 100 procent. Toto tlačítko při stisku přidá neúspěšné kliknutí. Běžně by bylo možné tuto akci provádět přímo nad obrázkem, nicméně třída KinectRegion umožňuje provádění gest pouze nad ovládacími prvky sady Kinect SDK a bez tohoto tlačítka by tedy nebylo možné na obrázek pomocí senzoru Kinect kliknout. Poté je toto tlačítko překryto ještě jedním, menším tlačítkem zásahu (Hit button), které velikostí odpovídá výřezu, rovněž se stoprocentní průhledností, jež při stisknutí indikuje správné nalezení výřezu. Výřez samotný je vlastně duplikát hlavního obrázku, pouze schovaný pod šablonou, která v sobě obsahuje průhledný výřez. Tento duplikát je vždy posunut tak, aby jeho část nacházející se pod průhledným výřezem odpovídala části hlavního obrázku překrytého tlačítkem zásahu. Při úspěšném nalezení výřezu je vždy vygenerována náhodně nová pozice tlačítka zásahu a pozice obrázku viditelného ve výřezu je patřičně upravena. - 31 -
Při každém kliknutí se také kontroluje, zda není třeba vyměnit hlavní obrázek podle nastavených pravidel hry. Hra je doprovázena hudbou na pozadí. Při zahájení hry je vždy náhodně vybrána jedna melodie, kterou je možné během hry kdykoliv přepnout či úplně vypnout pomocí tlačítek v levém dolním rohu obrazovky. 5.3.3 Přidávání a úprava obsahu aplikace Aplikace podporuje uživatelsky vytvářené obrázkové sady (tzv. resource packs). Stačí, aby uživatel vytvořil novou složku s názvem své obrázkové sady (například Zvířátka), vložil do ní několik obrázků (nejméně 8) v libovolném podporovaném formátu a celou složku vložil do složky pictures v kořenovém adresáři hry. Při spuštění hry je pak možné tuto obrázkovou sadu vybrat v seznamu obrázkových sad (viz. obrázek 19). Podporované formáty obrázků jsou JPG, JPEG, BMP, PNG, GIF a TIF. Doporučené jsou obrázky s poměrem stran 16:9. Aplikace je schopna zobrazit i obrázky s libovolným poměrem stran, nicméně obrázky budou roztažené do poměru 16:9.
Obrázek 19: Uživatelské obrázkové sady.
Je možné změnit hudbu na pozadí hry přidáním či odebráním souborů ve formátu MP3 ve složce sounds/background v kořenovém adresáři hry. 5.3.4 Komentáře Hra je plně namluvena v českém, slovenském a anglickém jazyce. Všechny mluvené komentáře je možné nalézt ve složce sounds/comments v kořenovém adresáři hry. Při spuštění aplikace a při změně jazyka jsou načteny všechny komentáře ve vybraném jazyce. V případě, že složka odpovídající vybranému jazyku není k dispozici, aplikace se pokusí načíst komentáře v českém jazyce. Pokud není možné ani načtení českých komentářů, hra poběží bez mluveného slova.
- 32 -
Komentáře, které jsou přehrány při zahájení hry (gameStart), správném výběru výřezu (onFlipCorrect), špatném výběru výřezu (onFlipBad) a dohraní hry (victory) jsou při spuštění hry načteny do dynamických listů. Nacházejí se v odpovídajících složkách a je možné je zde libovolně odebírat či přidávat nové. V případě, že dojde k dané události, hra náhodně vybere jeden komentář z dynamického listu a ten uživateli přehraje. Dosahuje se takto vyšší rozmanitosti při opakovaném hraní hry. 5.3.5 Statistiky Po dokončení hry je možné prohlédnout si záznam statistik (viz. obrázek 20). Záznam obsahuje informace o nastavení hry (obtížnost, cílové skóre, obrázková sada, režim střídání obrázků) a dále údaje o výkonu hráče (počet správných kliknutí, počet špatných kliknutí, poměr úspěšnosti, celkový čas, průměrnou dobu hledání výřezu). Tento záznam je možné společně s datem uložit do tabulky souboru CSV. Pokud již soubor existuje, aplikace bude při každém uložení dopisovat nejnovější záznam na konec souboru. Statistiky, včetně jejich exportu do tabulky, byly vytvořeny v souladu s požadavky projektu BRAIN, pro který byla tato aplikace vyvinuta.
Obrázek 20: Okno statistik s náhledem souboru Statistics.csv. Poznámka: Hodnoty v souboru Statistics.csv jsou pouze ilustrační.
- 33 -
- 34 -
6 Závěr Cílem této práce bylo seznámení s aplikačním rozhraním zařízení Kinect a poté vyvinout několik aplikací v souladu s požadavky Psychologického ústavu Filosofické fakulty MU, které budou ovladatelné prostřednictvím zařízení Kinect. První aplikací byl program umožňující ovládání myši prostřednictvím aplikace MouseToKinect. Tvorba aplikace byla úspěšná, program je schopen poskytnout plnou kontrolu nad kurzorem myši a levým tlačítkem. Pomocí gest stisku a úchopu může uživatel docílit jednoduchých klinutí, chycení a tažení (drag’n‘drop) i dvojkliku. Aplikaci je možno detailně nastavit dle potřeby uživatele. Druhá aplikace pracuje na velmi podobném principu jako MouseToKinect. Poskytuje uživateli možnost hrát jednoduché předem zvolené plošinové hry prostřednictvím zařízení Kinect simulujícího stisky klávesnice. Hry byly voleny opět ve spolupráci s Psychologickým ústavem Filosofické fakulty MU. Aplikace poskytuje sadu ovladačů, každý určený pro jinou hru, či množinu her. Všechny ovladače lze nastavovat dle potřeby uživatele. Poslední aplikací je logická hra HitPics. Hra uživateli ukáže obrázek a dále jeho malý výřez. Úkolem uživatele je najít tento výřez na hlavním obrázku a co nejrychleji na něj kliknout. Po dokončení hry je uživateli zobrazena statistika jeho hry, kterou je možné uložit do externího souboru. Aplikaci je možné před každým spuštěním nastavit a lze vytvářet vlastní sady obrázků. Aplikace je určena pro začlenění do projektu BRAIN. Všechny aplikace se podařilo úspěšně implementovat a neprokazují žádné zvýšené nároky na systém. Po seznámení se s principy ovládání každé aplikace je práce pohodlná, což potvrzují i osoby, které aplikace testovaly (z řad informatiků i psychologů). V budoucnu bude aplikace HitPics začleněna do aplikace BRAIN jako jedna z miniher pro trénování kognitivních funkcí. Aplikace KinectKeyboardDrive se rovněž stane součástí aplikace BRAIN, a to jako forma odměny za dokončené minihry, která uživateli umožní zahrát si některou z podporovaných online her. Aplikace MouseToKinect zůstane samostatná, avšak použité algoritmy budou pravděpodobně využity pro pohyb uživatele opět v aplikaci BRAIN.
- 35 -
- 36 -
7 Literatura [1] Microsoft. Kinect for Windows Sensor Components and Specifications. Microsoft
developer network[online]. Redmond, 2014. [cit. 2014-04-29] Dostupné z http://msdn.microsoft.com/en-us/library/jj131033.aspx [2] Sergey Ten. How Kinect sensor works – stereo triangulation?. Mirror Image web-
page[online]. 2010-11-30. [cit. 2014-04-29] Dostupné z http://mirror2image.wordpress.com/2010/11/30/how-kinect-works-stereo-triangulation/ [3] Trevor Taylor. Kinect for Robotics. Microsoft Robotics blog[online]. Redmond,
2011-11-29. [cit. 2014-04-29] Dostupné z http://blogs.msdn.com/b/msroboticsstudio/archive/2011/11/29/kinect-for-robotics.aspx [4] Andreas Reichinger. Kinect pattern uncovered. Azt.tm’s blog [online]. Vienna,
2011-04-03. [cit. 2014-04-29] Dostupné z http://azttm.wordpress.com/2011/04/03/kinect-pattern-uncovered/ [5] Dr. Andrew Davison. Kinect Chapter 2.1: Charting the depth map. Dr. Andrew Da-
vison’s home page at PSU [online]. Thailand, 2012-09-27. [cit. 2014-04-29] Dostupné z http://fivedots.coe.psu.ac.th/~ad/kinect/ch021/ [6] Microsoft. Audio Stream. Microsoft developer netwoek [online]. Redmond, 2014.
[cit. 2014-04-29] Dostupné z http://msdn.microsoft.com/en-us/library/jj131026.aspx [7] OpenKinect contributors. About OpenKinect. OpenKinect project [online]. New
York, 2012-03-07. [cit. 2014-04-27] Dostupné z http://openkinect.org/wiki/Main_Page [8] J4K Java Library contributors. J4K Java Library. University of Florida, Digital
Worlds Institute [online]. Gainesville, 2014-04-27. [cit. 2014-04-27] Dostupné z http://research.dwi.ufl.edu/ufdw/j4k/index.php [9] Microsoft. Kinect for Windows Programming Guide. Microsoft Developer Network
[online]. Redmond, 2014. [cit. 2014-04-27] Dostupné z http://msdn.microsoft.com/enus/library/hh855348.aspx [10] Pradeep. Microsoft opens up new Kinect for Windows developer kit program for
$399. Microsoft News [online]. Redmond, 2013-06-26. [cit. 2014-04-27] Dostupné z http://microsoft-news.com/microsoft-opens-up-new-kinect-for-windows-developer-kitprogram-for-399/ [11] 123Kinect contributor „dirtyvu“. Everything Kinect 2 in „one“ place. 123Kinect
network [online]. 2014-02-03. [cit. 2014-04-29] Dostupné z http://123kinect.com/everything-kinect-2-one-place/43136/ [12] Rob Knies. Collaboration, expertise produce enhanced sensing in Xbox One. The
official Microsoft blog [online]. Redmond, 2013-10-02. [cit. 2014-04-29] Dostupné z http://blogs.technet.com/b/microsoft_blog/archive/2013/10/02/collaboration-expertiseproduce-enhanced-sensing-in-xbox-one.aspx
- 37 -
[13] Microsoft. Face Tracking. Microsoft Developer Network [online]. Redmond, 2014.
[cit. 2014-04-30] Dostupné z http://msdn.microsoft.com/en-us/library/jj130970.aspx [14] IGN contributor „FinalVerdict“. Xbox One vs. Playstation 4. IGN Gaming Network
[online]. San Francisco, 2013-11-02. [cit. 2014-04-30] Dostupné z http://www.ign.com/blogs/finalverdict/2013/11/02/xbox-one-vs-playstation-4-kinect20-vs-playstation-4-camera [15] Microsoft. Color Stream. Microsoft Developer Network [online]. Redmond, 2014.
[cit. 2014-05-04] Dostupné z http://msdn.microsoft.com/en-us/library/jj131027.aspx [16] Abhijit Jana. Get the IR Stream and control the IR Emitter. Abhijit’s World of .NET
[online]. 2013-01-11. [cit. 2014-05-04] Dostupné z http://abhijitjana.net/2013/01/11/get-the-ir-stream-and-control-the-ir-emitter-kinect-forwindows-sdk/ [17] WikiSkripta contributors. Pervazivní vývojové poruchy. WikiSkripta, projekt sítě
lékařských fakult MEFANET[online]. Česká republika, 2013-10-22. [cit. 2014-05-01] Dostupné z http://www.wikiskripta.eu/index.php/Pervazivn%C3%AD_v%C3%BDvojov%C3%A9_ poruchy [18] Abhijit Jana. Kinect for Windows SDK Programming Guide. Packt publishing. Bir-
mingham, s.138-139, 2012-12. [cit. 2014-05-04] [19] Microsoft. Depth stream. Microsoft Developer Network [online]. Redmond, 2014.
[cit. 2014-05-04] Dostupné z http://msdn.microsoft.com/en-us/library/jj131028.aspx [20] Microsoft. Coordinate Spaces. Microsoft Developer Network [online]. Redmond,
2014. [cit. 2014-05-04] Dostupné z http://msdn.microsoft.com/enus/library/hh973078.aspx [21] Microsoft. Audio stream. Microsoft Developer Network [online]. Redmond, 2014.
[cit. 2014-05-05] Dostupné z http://msdn.microsoft.com/en-us/library/jj131026.aspx [22] Abhijit Jana. Kinect for Windows SDK Programming Guide. Packt publishing. Bir-
mingham, s.217-218, 2012-12. [cit. 2014-05-05] [23] Abhijit Jana. Kinect for Windows SDK Programming Guide. Packt publishing. Bir-
mingham, s.227-228, 2012-12. [cit. 2014-05-05] [24] Microsoft. KinectInteraction. Microsoft Developer Network [online]. Redmond,
2014. [cit. 2014-05-05] Dostupné z http://msdn.microsoft.com/enus/library/dn188671.aspx [25] Microsoft. Joint Orientation. Microsoft Developer Network [online]. Redmond,
2014. [cit. 2014-05-05] Dostupné z http://msdn.microsoft.com/enus/library/hh973073.aspx
- 38 -
[26] Abhijit Jana. Kinect for Windows SDK Programming Guide. Packt publishing. Bir-
mingham, s.184, 2012-12. [cit. 2014-05-10] [27] University of Valencia students. The University presents a project of magnified
reality for educational intervention in autism. University of Valencia network [online]. Spain, 2013-09-25. [cit. 2014-05-11] Dostupné z http://www.uv.es/uvweb/universidad/en/universidad-valencia/universitat-presentaproyecto-realidad-aumentada-intervencion-educativa-autismo1285845048380/Noticia.html?id=1285891550802 [28] Clemente Giorio., Massimo Fascinari. Kinect Kinect in Motion. Packt publishing.
Birmingham, s.10, 2013-04. [cit. 2014-05-12] [29] University of Valencia students. Pictogram Room. Pictogram Room homepage [on-
line]. Spain. [cit. 2014-05-13] Dostupné z http://www.pictogramas.org/proom/init.do?method=gameTab
- 39 -
- 40 -
8 Přílohy 8.1 Instalace Kinect SDK a Kinect for Windows developer Toolkit Pro správné fungování všech aplikací přiložených k této bakalářské práci je nutné nainstalovat knihovnu Kinect SDK a Kinect for Windows developer toolkit. Kinect SDK v. 1.8: http://www.microsoft.com/en-us/download/details.aspx?id=40278 Kinect for Windows developer toolkit v. 1.8: http://www.microsoft.com/en-us/download/details.aspx?id=40278
8.2 Algoritmy detekce uživatelů Ukázka algoritmů detekce uživatelů uvnitř metody, která zpracovává data ve formě rámců koster datového toku koster (Skeleton frame ready handler). Patřičná data uživatelů jsou dále předána metodě ProcessSkeleton. Kód je napsán v jazyce C#. V kódu je využito příkazů z knihovny LINQ. 8.2.1 Algoritmus detekce libovolného počtu uživatelů Globální proměnné: /// <summary>
/// Data uzivatelu /// <summary>
private Skeleton[] skeletons;
Počáteční nastavení pole koster během inicializace zařízení Kinect: skeletons = new Skeleton [sensor.SkeletonStream.FrameSkeletonArrayLength];
Algoritmus: /// <summary> /// Metoda zpracovavajici data ve forme ramcu koster datoveho toku /// posilanych pomoci udalosti. /// /// <param name="sender">objekt posilajici udalost /// <param name="e">argumenty udalosti private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) { using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) { if (skeletonFrame != null && skeletons != null) { try { //zkopiruj data z ramce koster do pole koster skeletonFrame.CopySkeletonDataTo(skeletons);
- 41 -
for(int i = 0; i < skeletons.Length; i++) { if(skeletons[i] != null) { //pokud data nejsou prazdna, zpracuj ProcessSkeleton(skeletons[i]); } } } catch (InvalidOperationException) { } } } }
8.2.2 Algoritmus detekce jednoho uživatele Globální proměnné: /// <summary>
/// Data uzivatelu /// <summary>
private Skeleton[] skeletons; /// <summary>
/// Data vybraneho uzivatele /// <summary>
private Skeleton playerSkeleton; /// <summary>
/// Identifikacni cislo uzivatele /// <summary>
int skeletonID = -1;
Počáteční nastavení pole koster během inicializace zařízení Kinect: skeletons = new Skeleton [sensor.SkeletonStream.FrameSkeletonArrayLength];
Algoritmus: /// <summary> /// Metoda zpracovavajici data ve forme ramcu koster datoveho toku /// posilanych pomoci udalosti. /// /// <param name="sender">objekt posilajici udalost /// <param name="e">argumenty udalosti private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) { using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) { if (skeletonFrame != null && skeletons != null) { try { //zkopiruj data z ramce koster do pole koster
- 42 -
skeletonFrame.CopySkeletonDataTo(skeletons); if (skeletonID == -1) { //zadny uzivatel neni ulozeny, vyber prvniho nalezeneho //pripadne zakladni hodnotu playerSkeleton = (from s in skeletons where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault(); } else { //identifikacni cislo uzivatele je ulozene, vyber //uzivatele s danym cislem playerSkeleton = (from s in skeletons where s.TrackingState == SkeletonTrackingState.Tracked && s.TrackingId == skeletonID select s).FirstOrDefault(); } } catch (InvalidOperationException) { } } } if (playerSkeleton != null) { //data nejsou prazdna, uloz identifikacni cislo uzivatele //a zpracuj data skeletonID = playerSkeleton.TrackingId; ProcessSkeleton(playerSkeleton); } else { //data jsou prazdna, vymaz identifikacni cislo uzivatele //a zahod data skeletonID = -1; } }
8.2.3 Algoritmus detekce dvou uživatelů Globální proměnné: /// <summary>
/// Data uzivatelu /// <summary>
private Skeleton[] skeletons; /// <summary>
/// Data prvniho uzivatele /// <summary>
private Skeleton player1Skeleton; /// <summary>
/// Data druheho uzivatele /// <summary>
private Skeleton player2Skeleton; /// <summary>
- 43 -
/// Identifikacni cislo prvniho uzivatele /// <summary>
int skeleton1ID = -1; /// <summary>
/// Identifikacni cislo druheho uzivatele /// <summary>
int skeleton2ID = -1;
Počáteční nastavení pole koster během inicializace zařízení Kinect: skeletons = new Skeleton [sensor.SkeletonStream.FrameSkeletonArrayLength];
Algoritmus: /// <summary> /// Metoda zpracovavajici data ve forme ramcu koster datoveho toku /// posilanych pomoci udalosti. /// /// <param name="sender">objekt posilajici udalost /// <param name="e">argumenty udalosti private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) { using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) { if (skeletonFrame != null && skeletons != null) { try { //zkopiruj data z ramce koster do pole koster skeletonFrame.CopySkeletonDataTo(skeletons); if (skeleton1ID == -1) { //zadny uzivatel cislo 1 neni ulozeny, vyber prvniho //nalezeneho ktery ma jine id nez uzivatel cislo 2 //pripadne zakladni hodnotu Player1Skeleton = (from s in skeletons where s.TrackingState == SkeletonTrackingState.Tracked && s.TrackingId != skeleton2ID select s).FirstOrDefault(); } else { //identifikacni cislo uzivatele 1 je ulozene, vyber //uzivatele s danym cislem Player1Skeleton = (from s in skeletons where s.TrackingState == SkeletonTrackingState.Tracked && s.TrackingId == skeleton1ID select s).FirstOrDefault(); } if (skeleton2ID == -1) { //zadny uzivatel cislo 2 neni ulozeny, vyber prvniho //nalezeneho ktery ma jine id nez uzivatel cislo 1 //pripadne zakladni hodnotu Player2Skeleton = (from s in skeletons where s.TrackingState == SkeletonTrackingState.Tracked && s.TrackingId != skeleton1ID select s).FirstOrDefault(); }
- 44 -
else { //identifikacni cislo uzivatele 2 je ulozene, vyber //uzivatele s danym cislem Player2Skeleton = (from s in skeletons where s.TrackingState == SkeletonTrackingState.Tracked && s.TrackingId == skeleton2ID select s).FirstOrDefault(); } } catch (InvalidOperationException) { } } } if (player1Skeleton != null) { //data uzivatele 1 nejsou prazdna, uloz identifikacni cislo //uzivatele a zpracuj data Skeleton1ID = player1Skeleton.TrackingId; ProcessSkeleton(player1Skeleton); } else { //data uzivatele 1 jsou prazdna, vymaz identifikacni cislo //uzivatele a zahod data Skeleton1ID = -1; } if (player2Skeleton != null) { //data uzivatele 2 nejsou prazdna, uloz identifikacni cislo //uzivatele a zpracuj data Skeleton2ID = player2Skeleton.TrackingId; ProcessSkeleton(player2Skeleton); } else { //data uzivatele 2 jsou prazdna, vymaz identifikacni cislo //uzivatele a zahod data Skeleton2ID = -1; } }
8.3 Doporučené hry pro ovladače KinectKeyboardDrive 8.3.1 Základní ovladač Coaster Racer 3 http://www.gamesfreak.net/games/Coaster-Racer-3_5275.html Gas and Sand http://www.gamesfreak.net/games/Gas-and-Sand_5313.html A small car 2 http://www.gamesfreak.net/games/A-Small-Car-2_5220.html
- 45 -
8.3.2 Jednoduchý volant Coaster Racer 3 http://www.gamesfreak.net/games/Coaster-Racer-3_5275.html Gas and Sand http://www.gamesfreak.net/games/Gas-and-Sand_5313.html A small car 2 http://www.gamesfreak.net/games/A-Small-Car-2_5220.html 8.3.3 Skákací ovladač Commander Keen online http://games.co.za/commander-keen.html Aagy bones http://www.gamesfreak.net/games/Aagy-Bones_5197.html Pro možnost použití skákání jako ovládacího příkazu: Keen 4 Keen 5 Keen 6 Ovladač však neobsahuje podporu pro ovládání poga a střelbu.
- 46 -