Seznámení se zařízením MS Kinect a vývojovým kitem Kinetis K60

Miroslav Málek, UREL, FEEC, VUT Brno
xmalek12feec.vutbr.cz

Obsah:

  1. Úvod
  2. MS Kinect
  3. KEIL uVision4
  4. Kinetis K60
  5. Závěr
  6. Literatura

Úvod

Tento projekt se zabývá základním popisem zařízení firmy Microsoft - Kinectem. Je zde nastíněna technika snímání, konfigurace jednotlivých částí a na závěr je zde uvedený demonstrační program pro počítač.

V další části si projekt klade za cíl přiblížit čtenáři práci s vývojovým kitem z rodiny Kinetis K60.

MS Kinect

6.1. 2009 byl firmou Microsoft představen s kódovým označením Natal. Zároveň byla technologie představena v akci při ovládání herní konzole Xbox 360. Jednalo se o speciální zařízení, které sledovalo pohyb celého lidského těla. Kinect byl oficiálně vydán do prodeje 11.4. 2010 v Severní Americe. Zároveň Microsoft vypsal odměnu pro prvního developera, který vytvoří první verzi open-source driveru pro Kinect. Již 11.15. 2010 slavil Microsoft milion prodaných Kinectů.

Hardware Kinectu

Kinect byl původně vytvořen jako pohybový senzor pro konzoli Xbox 360, aby umožňoval ovládat hry spuštěné na konzoli pohybem hráčova těla. Hlavními části Kinectu jsou RGB kamera, hloubkový senzor, mikrofony a motor pro náklon Kinectu. Spotřeba Kinectu je přibližně 12 W, z čehož 2,5 W je získáno z USB portu zařízení. Proto je zařízení doplněno externím napájecím zdrojem, který se připojuje mezi USB port a Kinect.

3D scanner technika
obr.1: Vnitřní konfigurace MS Kinectu[5].
3D scanner technika
obr.2: Rozebraný Kinect na kousky[1].

Kinect využívá technologii 3D scanneru konkrétně techniku strukturovaného světelného 3D scanování[3], která se hojně používá v průmyslovém odvětví[3]. Na začátku se nachází IR generátor s proužkovou projekcí. Tento generátor vytvoří na 3D objektu mnoho proužků, ktere se v závislosti na tvaru objektu různě zkřiví[2]. Tyto proužky následně snímá vhodně umístěná kamera, která z těchto deformací určí tvar 3D objektu.

3D scanner technika
obr.3: Strukturované 3D scanování [2].

OpenNI

OpenNI - Open Natural Interaction je vícejazyčný framework, který definuje API pro vývoj aplikací využívající pohybů lidského těla. OpenNI umožňuje přístup k různým částem zařízení prostřednictvím tvz. uzlů. Tyto uzly jsou ve frameworku definovány jako objekty různých zaříní, které zpracovávají rozdílná data.

OpenKinect

Tato knihovna byla vytvořena způsobem reverzního inženýrství. Vývojáři se snažili rozlousknout komunikaci mezi Kinectem a herní konzolí Xbox. Své poznatky podrobně zdokumentovali a využili při vývoji knihovny libfreenect. Pro komunikaci s Kinectem prostřednictvím USB využívá knihovna libfreenect knihovnu libusb, která dává aplikaci snadný přístup k USB zařízení na spoustě operačních systémech. Hlavní výhodou libfreenect je snadná implementace a možnost ovládat všechny části Kinectu (včetně motoru). Nevýhodou však je nemožnost použít knihovnu pro zpracování gest a pohybů uživatele.

Kinect SDK

Kinect SDK je softwarový vývojový kit, pro ovládání Kinectu, vyvinutý firmou Microsoft. SDK v sobě obsahuje veškeré ovladače, API a dokumentaci pro snadné osvojení Kinectu. Uživatel má možnost softwarově přistupovat ke všem částem Kinectu včetně mikrofonů a motoru náklonu.

Ukázka části programu

Následující ukázka je vytvořená v programovacím jazyku C# a používá knihovnu OpenNI. Představuje metodu, která má za úkol získat data z VGA kamery Kinectu. Při spouštění vlákna se předá delegát na funkci ThreadImage() tím dojde k vytvoření vlákna a následně je toto vlákno programem spuštěno. V metodě ThreadImage() se aktualizují data objektu generatorImage a získají se meta data imageMD. Pokud vše proběhlo vpořádku, dojde k uzamčení části kódu synchronizačním objektem, který znemožní použití proměnných jinými vlákny. Následně si program rezervuje místo v paměti pro bitmapový obrázek, kam si bude ukládat data z ukazatele pSrc. Tento ukazatel ukazuje na VGA data získaná z kamery Kinectu. Po načtení všech dat se bitmapový obrázek z paměti uvolní, vykreslí se v panelu formuláře a vlákno se uspí na 100 ms.

Poznámka

Pro čtení dat z DepthGenerator-u se postupuje obdobným způsobem jako u ImageGenerator-u viz. výše. Jen s tím rozdílem, že se aktualizuje DepthGenerator a vypočítává histogram, který se následně vykreslí.
    Metoda pro čtení dat z kamery Kinectu 
	  public unsafe void ThreadImage()
    {
      imageMD = new ImageMetaData();  
      while (this.shouldReadImage) //Podmínka pro běh vlákna 
        {
          try
          {
            this.context.WaitOneUpdateAll(generatorImage); //Aktualizace generátoru 
          }
          catch (Exception e)
          {
            throw e; //V případě chyby se vygeneruje výjimka 
          }
          this.generatorImage.GetMetaData(imageMD);
          lock (this)                                   Synchronizační objekt 
          {
            Rectangle imageRect = new Rectangle(0, 0, bitmapImage.Width, bitmapImage.Height);
            BitmapData imageData = bitmapImage.LockBits(imageRect, ImageLockMode.WriteOnly,
            System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            byte* pSrc = (byte*)generatorImage.ImageMapPtr.ToPointer();
            for (int y = 0; y < imageMD.YRes; ++y)
            { //Ukazatel na začátek Bitmapu.
              každou inkrementací ve smyčce for se přesouvá pozice ukazatele na další řádky.
                  
              byte* pDest2 = (byte*)imageData.Scan0.ToPointer() + y * imageData.Stride; 
              for (int x = 0; x < imageMD.XRes; ++x, pDest2 += 3, pSrc += 3)
              {
                pDest2[0] = pSrc[2];  //Modrá barva 
                pDest2[1] = pSrc[1];  //Zelená barva 
                pDest2[2] = pSrc[0];  //Červená barva 
              }
            }
          this.bitmapImage.UnlockBits(imageData); //Uvolnění paměti s Bitmapem 
        }
      this.panelImage.Invalidate(); //Překreslení Bitmapu na panel umístěný na formuláři 
      Thread.Sleep(100); //Uspí vlákno 
      }
  } 
    

KEIL uVision4

Pro vývoj aplikací s použitím vývojového kitu K60 je možné použít několik vývojových prostředí: IAR, Code Warrior, uVision... Při programování jsem využil uVision4, které je dodáváno společně s K60 na přiloženém DVD. Tato free verze uVision4 má omezení stanovené velikosti kódu - 32kB.

3D scanner technika
obr.6: Vývojové prostředí firmy KEIl- uVision4.
uVision4 připomíná svým vzhledem moderní vývojový software. V levé části jsou všechny části vytvářeného projektu. Přepínáním záložek je umožněno uživateli zobrazit funkce jednotlivých souborů, nápovědu a předepsané funkce. Ve spodní části se nachází informační konzole, ve které se vypisuje průběh překládání kódu, chybové hlášení a informaco o hledaných proměnných. Největší část programu tvoří textový editor ve kterém se píše kód aplikace. Klávesovou zkratkou CTRL+F5 se program přepne do debugovacího režimu, ve kterém je možné zpracovávat informace o průběhu programu, lze sledovat hodnoty nastavených registrů, hodnoty USB endpointů a mnoho dalších informací. Záleží jen a pouze na vývojáři, co se mu v ten daný okamžik hodí.

Kinetis K60

TWR-K60N512 je modul kompatibilní s Tower System firmy Freescale. Obsahuje mikrokontrolér MK60N512VMD100, což mikrokontrolér spadající do rodiny mikrokontrolérů Kinetis K60. Hlavní částí TWR-K60N512 je 32-bitový mikrokontrolér, založený na struktuře ARM Cortex-M4 s možností maximální taktovací frekvence 100MHz.
3D scanner technika
obr.4: Horní pohled na TWR-K60N512.
3D scanner technika
obr.5: Spodní pohled na TWR-K60N512.

Základní nastavení a startup kód

Protože KEIL uVision4 podporuje spousty vývojových kitů, je nutné si uVision4 nakonfigurovat pro ten správný kit. Při vytváření nového projektu v prostředí uVision4 se program uživatele zeptá, zda chce uživatel přidat do projektu tzv. startup kód. Pokud uživatel souhlasí, musí vybrat správný typ procesoru. V totmto případě je to startup kód s procesorem MK60N512MD100. Do projektu se následně vloží dva soubory: startup_MK60N512MD100.s a system_MK60N512MD100.c.

startup_MK60N512MD100.s
Tento soubor obsahuje kód s proměnnými a formulář tzv. Configuration Wizard. Pomocí tohoto formuláře lze snadno a rychle nastavit parametry procesoru jako jeho velikost programové paměti flash, zabezpečení, EEPROM a spoustu dalších nastavení.

system_MK60N512MD100.c
Zde se nachází konfigurace a globální proměnné použité procesorem. Jsou to například kmitočet procesoru, nastavení oscilátoru (PLL, který je součástí mikrokontroléru), makra pro USB, CAN sběrnice, výstupní porty GPIO a další.

Použití Debug (printf) viewer v režimu Debug

Pro ulehčení práce při debugování programu, nebo při zobrazení dat programu bez použití displeje, je možné si tyto data vypisovat příkazem printf(). Ovšem aby bylo možné tyto data zobrazovat je nutné si vhodně nakonfigurovat vývojový software a doplnit námi vytvořený kód několika málo řádky kódu. Ve vývojovém prostředí KEIL je nutné stiskout Options->Utilities->Settings->Trace a nastavit editační řádek Core clock na hodnotu kmitočtu použitou v programu, tedy taktovací kmitočet použitého kontroléru[4]. Tento kmitočet je nutné nastavit z důvodu synchronizace - bez správně nastaveného kmitočtu se při debugování v okně Debug (printf) viewer-u zobrazují nesmysly. Následně je nutné do programu připsat následující strukturu[4]:
	      
    struct __FILE 
    { 
	   int handle; /*Sem se může cokoliv přidat*/ };
	   FILE __stdout;
	   FILE __stdin;
	   int fputc(int ch, FILE *f) {
	   ITM_SendChar(ch);
	   return(ch);
    }
    

USB kontrolér

Vývojová deska TWR-SER obsahuje kromě sběrnice CAN a RS232/485 USB transciever, který je na obrázku níže. Transciever obsahuje 15k-ohmové rezistory, připojené k linkám D+ a D-, což umožňuje práci v režimu host. Device charge detector detekuje konfiguraci zařízení připojeného k USB a dle napětí na linkách rozhodne jakou rychlost bude USB využívat.
3D scanner technika
obr.2: Subsytém USB vývojového kitu.
Pro nastavení USB transcieveru je nutné vhodně nastavit jumpery J10 a J16 na desce TWR-SER:
	 J10: 1-2    Režim host, na USB sběrnici je přivedeno napětí 5V
	 J10: 2-3    Device režim, napětí je získáno ze sběrnice.
	 J16: 1-2    Host
	 J16: 3-4    Device
	 J16: 5-6    OTG
	  
Ukázka nastavení mikrokontroléru USB periferie Kinetis K60 do režimu host:
	  
    /* Inicializuje všechny časovače potřebné pro USB modul*/
    SIM->SCGC4   |=   SIM_SCGC4_USBOTG_MASK;/* Povolení časování USBOTG*/   
    SIM->CLKDIV2 &= ~(0x0F);/* USBDIV = 0, USBFRAC = 0*/     
    SIM->CLKDIV2 |=  (0x02);/* USBDIV = 1, USBFRAC = 0*/    
    /* MCGPLLCLK hodinový signál použitý pro přerušení*/  
    SIM->SOPT2   |=  (SIM_SOPT2_USBSRC_MASK)|
    (SIM_SOPT2_PLLFLLSEL_MASK); /* Nastavení MCGPLLCLK jako hodinového signálu*/
    /*-----------------------------------*/
    /* Inicializace USB kontroléru*/ 
    USB0->USBTRC0|=   USB_USBTRC0_USBRESET_MASK; 
    /* Resetování USB kontroléru */ 
    .
    .
    .
    USB0->CTL     =   USB_CTL_HOSTMODEEN_MASK;/*Nastavení USB do režimu HOST*/
    

Závěr

Vytvořený program pro PC vyžaduje nainstalovanou technologii .NET4 a ovladače Kinectu s OpenNI knihovnou. Poté lze program bezproblému spustit a zobrazit obraz před Kinectem v barevném a hloubkovém rozlišení. Pro využití USB u vývojového kitu K60 jsem dospěl k závěru nemožnosti navázání komunikace mezi Kinectem a K60-kou. Je to z toho důvodu, že Kinect disponuje high speed USB sběrnicí, zatímco K60 pouze full speed USB sběrnicí. Proto jsem ve vyvoji USB ovladače nepokračoval. Program pro PC, neúplný program pro K60 a datasheety jsou volně dostupné zde.

Literatura

[1] KOŠŤÁL, O.Chcete vidět, co je v Kinectu? Pojďte se podívat[online]. [24.4.2012]. Dostupný z http://pctuning.tyden.cz/component/content/article/1-aktualni-zpravy/19193-chcete-videt-co-je-v-kinectu-pojdte-se-podivat.
[2] Structured-light 3D scanner[online]. [19.5.2012]. Dostupný z http://en.wikipedia.org/wiki/Structured-light_3D_scanner.
[3] MELGAR E.R, DIEZ C.C, JAWORSKI P. Arduino and Kinect Projects - Design, Build, Blow Their Minds.New York: Technology in action, USA, 2012. 393 s. ISBN 978-1-4302-4167-6.
[4] KEIL Debug (printf) Viewer[online]. [19.5.2012]. Dostupný z http://www.keil.com/support/man/docs/ulinkpro/ulinkpro_trace_itm_viewer.htm.
[5] JAVŮREK, K.Microsoft Kinect: nová éra, tělo jako ovladač[online]. [8.4.2012]. Dostupný z http://www.zive.cz/clanky/microsoft-kinect-nova-era-telo-jako-ovladac/sc-3-a-154556/default.aspx.