• No se han encontrado resultados

Estudi i creació d'una aplicació amb interacció basada en visió

N/A
N/A
Protected

Academic year: 2020

Share "Estudi i creació d'una aplicació amb interacció basada en visió"

Copied!
49
0
0

Texto completo

(1)Escola Politècnica Superior Memòria del Treball de Fi de Grau. Estudi i creació d’una aplicació amb interacció basada en visió Carlos Lucas Acosta Grau d’Enginyeria Informàtica Any acadèmic 2017-18. DNI de l’alumne: 43217580M Treball tutelat per Gabriel Moyà Alcover Departament de ciències matemàtiques i informàtica S'autoritza la Universitat a incloure aquest treball en el Repositori Institucional per a la seva consulta en accés obert i difusió en línia, amb finalitats exclusivament acadèmiques i d'investigació. Paraules clau del treball: Visió, Kinect, Unity, fisioteràpia, joc seriós, functional reach test. Autor. Sí X. No. Tutor. Sí X. No.

(2)

(3) S UMARI. Sumari. i. Índex de figures. iii. Acrònims. v. Resum. vii. 1. Introducció 1.1 Motivació . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Objectius . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Estructura del document . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 2. Context 2.1 Requeriments . . . . 2.2 Visió per computador 2.2.1 Kinect . . . . 2.3 Motor de videojocs . 2.3.1 Unity . . . . . 2.4 Fisioteràpia . . . . . .. 3. 4. 5. 1 1 2 2. . . . . . .. . . . . . .. . . . . . .. 3 3 4 6 8 10 11. Procés de desenvolupament 3.1 Planificació . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Primers passos amb Unity i Kinect . . . . . . . . . . . . . . . . . . . . 3.3 Interacció a partir de seguiments de parts del cos . . . . . . . . . . . 3.3.1 Experiment: Conducció d’un cotxe . . . . . . . . . . . . . . . 3.4 Interacció a partir de gestos . . . . . . . . . . . . . . . . . . . . . . . . 3.4.1 Experiment: Comptador de temps en la postura de peu coix 3.5 Interacció amb objectes virtuals . . . . . . . . . . . . . . . . . . . . . . 3.5.1 Experiment: Sac de boxe . . . . . . . . . . . . . . . . . . . . .. . . . . . . . .. . . . . . . . .. 13 13 14 15 17 19 19 21 24. . . . .. 27 27 29 29 29. . . . . . .. Functional Reach Test 4.1 Test . . . . . . . . . . . . 4.2 Serious game . . . . . . 4.2.1 Descripció . . . 4.2.2 Implementació. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. Conclusions. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . . . .. . . . .. . . . .. . . . .. 35 i.

(4) ii. Bibliografia. SUMARI. 37.

(5) Í NDEX DE FIGURES. 2.1 2.2. Components del sensor Kinect [1]. . . . . . . . . . . . . . . . . . . . . . . . . Articulacions que detecta la Kinect [2]. . . . . . . . . . . . . . . . . . . . . . .. 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8. Imatge de profunditat de Kinect [3]. . . . . . . . . . . . Orientació inicial de les articulacions segons Kinect [2]. Usuari jugant al joc. . . . . . . . . . . . . . . . . . . . . . Usuari realitzant el gest. . . . . . . . . . . . . . . . . . . . Disseny de l’habitació dins la realitat virtual. . . . . . . Esquelet del jugador dins el món virtual. . . . . . . . . . Usuari interactuant amb un objecte virtual. . . . . . . . Usuari colpejant el sac de boxe. . . . . . . . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. 15 17 18 20 22 23 24 25. 4.1 4.2 4.3 4.4 4.5 4.6. Imatge resum de la realització de la prova [4]. . . . . Diagrama del flux que segueix el joc. . . . . . . . . . Menú per introduir les dades de l’usuari. . . . . . . . Usuari col·locant-se per iniciar la prova. . . . . . . . Usuari realitzant la prova intentant arribar a la fita. Informació sobre el resultat de la prova. . . . . . . .. . . . . . .. . . . . . .. . . . . . .. . . . . . .. . . . . . .. . . . . . .. . . . . . .. . . . . . .. . . . . . .. . . . . . .. . . . . . .. . . . . . .. 28 30 30 31 33 33. iii. . . . . . .. . . . . . .. 6 8.

(6)

(7) A CRÒNIMS FRT Functional Reach Test IDE Integrated Development Environment RGB Red Green Blue SDK Software Development Kit. v.

(8)

(9) R ESUM En aquest projecte es mostren alguns tipus d’interaccions que existeixen entre un usuari i una aplicació mitjançant la visió per computador. Per a cada una, s’explica en què consisteix, com s’ha implementat i es presenta una aplicació que la utilitza per exemplificar un cas pràctic. Per acabar, s’ha desenvolupat un joc seriós per a la realització d’una prova fisioterapèutica per demostrar la possibilitat d’utilitzar el conjunt d’aquestes interaccions en un cas real. Per dur el projecte a terme, s’ha utilitzat Microsoft Kinect com a tecnologia de visió per computador i el motor de videojoc Unity per implementar les interaccions i construir les diferents aplicacions per a cada una d’elles.. vii.

(10)

(11) CAPÍTOL. 1. I NTRODUCCIÓ La visió per computador és una disciplina que obre moltes portes dins el camp de la interacció entre les persones i l’ordinador. Gràcies a aquesta, els dispositius convencionals d’entrada (com el ratolí o el teclat) poden ser substituïts per interfícies basades en visió en els casos en que així es millori la interacció per part de l’usuari. A més, no només poden substituir aquests dispositius, sinó que permeten nous tipus d’interaccions basades en la posició i moviment del propi cos o parts d’aquest. El fet de poder obtenir en temps real la posició de l’usuari i d’algunes de les parts del seu cos, permet detectar moviments i gestos d’aquest i utilitzar totes aquestes dades com a font d’informació per a noves aplicacions. Algunes d’aquestes aplicacions apareixen, per exemple, dins el camp de la medicina i consisteixen en la implementació d’ajudes o guies per a diferents proves de fisioteràpia. Si aquest darrer punt el complementam amb un motor de videojocs, sorgeix el que es coneix com un joc seriós, que són aquells jocs dissenyats amb un objectiu no només lúdic, sinó també amb una finalitat de millora o aprenentatge en qualque aspecte de l’usuari que el juga[5]. En aquest projecte hem fet un estudi i implementació de les diferents interaccions que es poden aconseguir amb la unió d’un sistema de visió per computador i un motor de videojocs i, finalment, hem implementat un joc seriós per a una prova de fisioteràpia utilitzant els diferents tipus d’interacció.. 1.1 Motivació Com es pot veure, aquest projecte es centra en la visió per computador i els tipus d’interaccions amb l’usuari que aquesta ens aporta. La motivació del projecte és l’estudi de les diferents interaccions que es poden aconseguir amb l’usuari i un motor de videojocs mitjançant la visió per computador per tal de saber a quins tipus d’aplicacions es poden utilitzar. A més, mitjançant aquestes interaccions, aconseguir implementar un joc seriós per a la execució guiada i supervisada d’una prova fisioterapèutica per a que el pacient la pugui realitzar amb un major grau d’independència. 1.

(12) 1. I NTRODUCCIÓ A nivell personal, tenc l’oportunitat de treballar amb tecnologies de visió per computador i aprendre com funcionen i també conèixer el funcionament d’un motor de videojocs i desenvolupar una aplicació amb ell. Ambdues tecnologies són totalment noves per a mi.. 1.2 Objectius L’objectiu principal del projecte és la implementació d’un joc seriós per a la realització d’una prova fisioterapèutica per tal que el pacient la pugui dur a terme de forma independent. Per aconseguir aquest objectiu, hem fet ús de Kinect i Unity. El primer és un dispositiu de visió per computador que ens permet obtenir informació sobre la posició de diferents parts del cos de l’usuari. El segon és un motor de videojocs que ens permet el desenvolupament d’aplicacions en tres dimensions, amb aquest hem construït els diferents jocs que es presenten al llarg del projecte. Per tant, els diferents objectius que s’han d’assolir per completar el projecte amb èxit són els següents: • Aprendre i entendre les bases de la visió per computador i, en concret, aprendre a treballar amb Kinect. • Desenvolupar una prova de concepte per a cada una de les interaccions necessàries per a l’aplicació final. • Desenvolupar una prova de fisioteràpia perquè el pacient la pugui realitzar amb un alt grau d’independència.. 1.3 Estructura del document A continuació, s’explica de quina manera està distribuït el contingut d’aquest document segons els seus apartats: Per començar, a l’apartat de Context s’expliquen els conceptes en els quals s’emmarca aquest projecte, que són: La visió per computador, els motors de videojoc i la rehabilitació. Després, s’expliquen les tecnologies seleccionades i per què s’han seleccionat. Al següent capítol, titulat Procés de desenvolupament, s’expliquen els tipus d’interacció, el seu desenvolupament i un exemple de cada una d’elles. A continuació, a l’apartat Functional Reach Test, s’explica en què consisteix la prova fisioterapèutica que s’ha utilitzat en aquest projecte, l’implementació d’aquesta utilitzant visió per computador i quins avantatges proporciona fer-ho d’aquesta manera. Per acabar, a la secció de Conclusions s’exposen les dades extretes dels diferents àmbits del projecte així com l’experiència i sensacions obtingudes durant la seva realització.. 2.

(13) CAPÍTOL. 2. C ONTEXT En aquest capítol es defineixen els requeriments que ha de complir l’aplicació final i s’expliquen els conceptes en els quals s’emmarca el projecte, que són: la visió per computador, els motors de videojocs i la fisioteràpia. A més, es presenten les tecnologies utilitzades per dur-lo a terme i es justifica aquesta elecció en base als requeriments a més d’altres motius específics de la pròpia eina.. 2.1 Requeriments Abans d’introduir els tipus de tecnologies que utilitza aquest projecte i quines en concret hem elegit, cal definir els requeriments de l’aplicació que volem crear per saber quines condicions han de complir. A l’hora de definir els requeriments, s’han tingut en compte tant els funcionals com els no funcionals. A continuació els llistam: • Funcionals: (RF01) L’usuari ha de poder interactuar amb l’aplicació utilitzant únicament la visió per computador. (RF02) L’usuari ha de poder interactuar amb els objectes d’un entorn virtual en tres dimensions i veure’s a si mateix dins aquest. (RF03) Les interaccions anteriorment mencionades s’han de dur a terme en temps real. • No funcionals: (RNF01) L’aplicació s’ha de poder instal·lar de forma independent exceptuant els controladors del dispositiu de visió utilitzat. (RNF02) L’aplicació s’ha de poder instal·lar als sistemes operatius més comuns: Windows, Linux i MacOS. 3.

(14) 2. C ONTEXT Una vegada definits els requeriments, podem entrar a debatre quina és l’eina més adequada per complir-los. A continuació s’exposen les tecnologies necessàries per al projecte i quina en concret s’ha seleccionat en cada cas i perquè.. 2.2 Visió per computador La visió per computador és un camp de la informàtica on es treballa amb l’anàlisi d’imatges amb l’objectiu d’obtenir-ne certa informació i transformar-la en dades que puguin ser utilitzades per altres processos. La informació que típicament s’extreu de dins una imatge és: • Informació sobre els colors que componen la imatge. • Reconeixement de formes dins la imatge. • Reconeixement d’objectes concrets i la posició d’aquests dins la imatge. • Seguiment d’aquests objectes en diferents imatges. Aplicant aquesta darrera tècnica a seqüències d’imatge (un vídeo) es pot fer el seguiment d’un objecte concret. El seguiment consisteix bàsicament en saber si aquest objecte apareix dins la imatge i en quina posició es troba en cada moment. D’aquesta manera, també es poden reconèixer gestos que no són més que la realització d’un moviment determinat dins un espai de temps concret. Les aplicacions de la visió per computador actualment són molt diverses. Un dels usos més estesos, i el que forma part d’aquest projecte, és el de la creació d’interfícies basades en visió per a la interacció entre les persones i l’ordinador. Per exemple, existeixen interfícies basades en visió les quals permeten l’ús del ratolí utilitzant el moviment de la mà[6] i d’altres que permeten interactuar amb objectes virtuals com si ho féssim de forma natural[7]. Això ha tingut molt d’impacte a la indústria dels videojocs la qual intenta innovar i explotar la forma en que els jugadors interactuen amb el joc. Seguint amb els videojocs, existeix el que es coneix com a jocs seriosos (serious games) que són jocs on el propòsit principal no és l’entreteniment de l’usuari sinó que té una utilitat més enllà de la diversió[8]. Utilitzant les interfícies basades en visió, es poden crear jocs d’aquest tipus pensats per a la rehabilitació dels pacients. En molts casos, per dur a terme una interacció basada en visió entre l’usuari i el computador es necessita un dispositiu específic per recollir les diferents dades d’entrada. Actualment, podem trobar varies tecnologies relacionades amb la visió per computador, cada una amb diferents utilitats i característiques. A continuació, en presentarem algunes de les més utilitzades: • Les càmeres RGB són aquelles que capten la llum i la transformen en una matriu de colors. Aquestes càmeres reben aquest nom perquè utilitzen el model Red Green Blue (RGB) que consisteix en representar qualsevol color com a una suma dels tres colors primaris additius (vermell, verd i blau). Per tant, amb aquests dispositius podem extreure la informació de color i, en base a aquesta, es poden cercar patrons de formes i figures per tal de reconèixer objectes específics dins la imatge. Aquesta tècnica pot fallar quan l’objecte que 4.

(15) 2.2. Visió per computador s’intenta reconèixer es troba superposat a un fons d’un color molt similar a ell. Per solucionar això, es sol combinar aquest tipus de càmera amb una càmera de profunditat[9]. Un exemple de tecnologia que utilitza dispositius d’aquest tipus és ASUS Xtion. Aquesta és una tecnologia desenvolupada per ASUS per ser utilitzada en ordinadors. Com hem comentat, fa ús d’un dispositiu físic que es compon per una càmera RGB per a la captura de la imatge i dos micròfons per a l’enregistrament d’àudio. Aquest dispositiu opera a un rang de distància d’ntre 0.8m i 3.5m. Utilitzant ASUS Xtion es poden reconèixer diferents parts del cos de l’usuari així com els gestos que està realitzant. A més, també permet el reconeixement de veu. Per altra banda, aquest és compatible amb OPENNI NITE[10], el que facilita el desenvolupament d’aplicacions per a Xtion. • Les càmeres de profunditat són aquelles capaces d’obtenir informació sobre la distància dels diferents punts de l’escena respecte de la càmera. Aquesta informació s’obté en forma de matriu de píxels, on el valor de cada píxel és la distància entre el dispositiu i el respectiu punt del pla projectat per aquest. Aquesta mesura s’obté mitjançant infrarojos. L’emissor llança un patró de rajos infrarojos que reboten contra les diferents superfícies de l’escena i són captats per un receptor. Després es compara la informació rebuda amb el patró emés i mitjançant aquesta diferència es calcula la matriu de profunditat[11]. Un exemple de tecnologia que utilitza sensors de profunditat és Leap Motion. Aquest es centra en el reconeixement de les mans de l’usuari i el seguiments dels diferents punts d’aquesta, com per exemple les articulacions dels dits o el palmell de la mà. Aquesta tecnologia consta d’un dispositiu format per dues càmeres RGB i tres sensors infrarojos per obtenir els diferents tipus de dades de l’escena.[12] Aquest és capaç de capturar les dades de les mans a un radi de 60cm aproximadament. Després, la part de programari d’aquesta tecnologia s’encarrega d’interpretar aquestes dades i reconèixer els punts o fins i tot el gest que s’està realitzant. Per altra banda, una altra tecnologia molt estesa que també fa ús d’una càmera de profunditat és Microsoft Kinect. Aquesta va ser desenvolupada per Microsoft i originalment estava orientada únicament a la videoconsola XBox. Aquesta tecnologia utilitza un dispositiu capaç d’obtenir informació de profunditat i de color en una distància de entre 0.8m i 4m. Kinect permet el reconeixement de 25 punts del cos humà en temps real. La informació que es proporciona és la matriu de color i la de profunditat de l’escena i a més és capaç de reconèixer els gestos realitzats per l’usuari. Per altra banda, el dispositiu també consta d’un conjunt de micròfons amb la informació dels quals es pot fer reconeixement de veu. • Les càmeres tèrmiques permeten obtenir la informació de calor de l’escena i construir una imatge a partir d’aquestes dades. Per fer això, utilitzen sensors infrarojos que emeten rajos d’una longitud d’ona aproximada de 8 µm perquè en aquesta longitud els rajos són més sensibles a variacions per calor[13]. Després, el receptor llegeix els rajos reflectits i a partir d’aquesta informació munta la imatge. Aquests tipus de dispositius són molt útils a l’hora de reconèixer una persona 5.

(16) 2. C ONTEXT. Figura 2.1: Components del sensor Kinect [1].. dins l’escena ja que és molt fàcil detectar la seva silueta dins la imatge a causa de l’espectre de calor que emet. Una tecnologia que fa ús d’aquest tipus de càmeres és FLIR FB-Series-ID. FLIR és una empresa que es dedica a la seguretat i ha dissenyat una càmera que utilitza sensors tèrmics per detectar persones i vehicles. Aquest dispositiu té una resolució de 320x240 píxels[1]. Per a aquesta tasca s’utilitza una càmera tèrmica ja que d’aquesta manera no és necessari que hi hagi llum per detectar si hi ha qualque persona.. 2.2.1 Kinect Kinect és una tecnologia desenvolupada per Microsoft per a la videoconsola XBox 360, però finalment va ser adaptada també per a ordinadors amb el sistema operatiu Windows. L’objectiu d’aquesta tecnologia és que el jugador pugui interactuar amb la videoconsola sense necessitat de que hi hagi contacte físic amb un comandament sinó que la interacció es dugui a terme a través de moviments, gestos i la veu del jugador. D’aquesta manera s’obre el ventall de possibles jugadors i a més s’aconsegueix un nou tipus de jugabilitat. La tecnologia Kinect està formada pel sensor (conegut com a càmera Kinect o simplement Kinect) que és la part de maquinari. Aquest s’encarrega de recollir la informació sobre la posició del propi jugador, de les seves parts del cos i de la veu. Per altra banda, la part de programari s’encarrega d’interpretar aquesta informació per obtenir dades com l’esquelet del jugador o la classificació dels seus gestos. Més concretament, Kinect SDK és la biblioteca que permet utilitzar la informació de la Kinect per al desenvolupament d’aplicacions. Sensor Kinect El sensor de Kinect és un dispositiu compost per diferents components que entre tots ells fan possible la detecció de les diferents dades del jugador i de l’entorn, com puguin ser la posició de les articulacions d’aquest respecte del sensor, la veu, o la imatge de profunditat o color de tota l’escena. 6.

(17) 2.2. Visió per computador Com es pot apreciar a la figura 2.1, aquest dispositiu està compost per una càmera RGB amb una resolució de 480x640 píxels i un refresc de 30FPS. Mitjançant aquesta càmera s’extreu la imatge o matriu de color. L’altra càmera és la de profunditat que comparteix les característiques de resolució i refresc amb la càmera de color. Aquesta està formada per dues parts, un emissor de rajos infrarojos i un receptor d’aquests que és qui extreu la informació de la distància dels objectes segons el rebot dels rajos i per tant ens permet construir la matriu de profunditat. El darrer component és el que s’encarrega del so. Aquest component és un array de quatre micròfons repartits dins la base del sensor Kinect. Aquesta estructura s’utilitza per poder separar de forma precisa so de la veu humana del renou ambient i per tant facilitar la funció de reconeixement de veu. També es pot obtenir l’angle i la distància entre l’origen del so i la posició del sensor Kinect. Kinect SDK Per altra banda, Kinect consta d’una part de software molt important, anomenada Kinect Software Development Kit (SDK). Aquesta és la que s’encarrega de processar les dades que rep des del sensor i interpretar-les. D’aquesta manera, obtenim els diferents tipus d’informació que s’utilitzen a l’hora de treballar amb la Kinect. La informació més rellevant que obtenim de la Kinect respecte a aquest projecte és la de l’esquelet humà. La Kinect ens torna un conjunt de articulacions (veure figura 2.2) amb les seves dades de posicionament. Per a cada articulació, obtenim la seva posició en coordenades cartesianes on cada eix representa la distància en metres respecte al sensor Kinect. També podem obtenir les coordenades respecte de la posició del cos del jugador. A més de la posició, Kinect també ens dóna l’angle de rotació de l’articulació en els diferents eixos de coordenades. Per obtenir aquesta informació, no només es basa en el que es veu en aquell moment amb el sensor, si no que també es capaç de fer una estimació de les dades de les parts del cos o articulacions que no están visibles en aquell instant[14]. D’aquesta manera, tot i que es superposi alguna part del cos de l’usuari amb una altra o es perdi la visió d’aquesta per qualque altre motiu, Kinect és capaç de seguir fent-li un seguiment aproximat de la seva posició. Una altra característica important que ens permet el fet de conèixer la posició de les articulacions i que a més ja està incorporat dins el mateix software de la Kinect és el del reconeixement de gestos. Es poden reconèixer tot tipus de gestos com per exemple saludar amb la mà o senyalar amb el dit i també se’n poden implementar de propis. Per a cada gest, obtenim la informació de quan comença, quan acaba, quin percentatge de progrés duu o si s’ha cancel·lat. Amb totes aquestes dades es pot construir una interacció molt intuïtiva amb l’usuari. Per acabar, tot i que en aquest projecte no n’haguem fet ús, Kinect també ens proporciona informació sobre el so o veu que recull de l’usuari o de l’entorn. La informació que ens retorna, a més de l’àudio en si, és l’angle entre el sensor i l’origen del so, un fotograma associat que representa la imatge de la càmera en el moment en que s’ha començat a sentir el so i la informació del punt del cos de l’usuari si ell és qui ha generat aquest so. Per a aquest projecte hem elegit Kinect com a tecnologia de visió per computadors principalment pels següents motius: 7.

(18) 2. C ONTEXT. Figura 2.2: Articulacions que detecta la Kinect [2].. • Kinect compleix amb els requeriments necessaris per al desenvolupament d’aquest projecte. Amb ella podem obtenir tant la posició relativa de les diferents parts del cos humà i per tant obtenir-ne informació per dur a terme les interaccions. A més, també permet obtenir la imatge a color de l’usuari, que juntament amb la característica anterior, ens permet ubicar-lo dins un món virtual. • Kinect va néixer com a perifèric de la videoconsola XBox. Aquest fet fa que sigui un dispositiu conegut i accessible per als usuaris.. 2.3 Motor de videojocs En aquest projecte s’utilitza un motor de videojocs com a eina per construir les diferents aplicacions que interactuaran amb l’usuari mitjançant visió per computador. S’ha elegit aquest tipus d’eina perquè a més de les interfícies gràfiques més comuns, també ens permet construir un món virtual i introduir-hi a l’usuari per tal d’interactuar amb objectes que es trobin dins aquest. Un motor de videojocs (game engine en anglès) és un conjunt de programari que forma una eina o entorn de treball per tal de facilitar i agilitzar el procés de creació d’un videojoc. Aquests proporcionen biblioteques per a les diferents funcionalitats que pugui necesitar un videojoc com pot ser el càlcul de físiques, la detecció de col·lisions entre objectes i la gestió dels efectes de sò o la música entre d’altres. Hi ha motors que proporcionen un entorn de desenvolupament integrat (Integrated Development Envi8.

(19) 2.3. Motor de videojocs ronment (IDE)) pròpi, com per exemple Unity o Unreal. En canvi d’altres, únicament faciliten les biblioteques per ser utilitzades. El creixement de la industria dels videojocs, i en conseqüència dels videojocs independents, han contribuït a l’aparició de nous motors de videojocs i en l’actualització dels que ja existien.[15] Actualment podem trobar motors de diferents tipus. Per una banda, n’hi ha que es centren en un gènere de videojoc molt concret, com per exemple RPGMaker[16] que es centra en la construcció de jocs de rol, o Adventure Game Studio[17] que està enfocat en el desenvolupament d’aventures gràfiques. Per altra banda, també en podem trobar que són de propòsit general com els ja comentats Unity o Unreal, els quals permeten la construcció de videojocs de qualsevol gènere. A continuació, s’expliquen alguns dels motors de videojos més populars:. • Godot és un motor de videojocs de propòsit general publicat per primera vegada a l’any 2014. Aquest és un motor lliure desenvolupat inicialment per OKAM Studios però actualment mantingut per la pròpia comunitat de desenvolupadors[18]. Godot suporta la creació de videojocs tant en 2D com en 3D. L’avantatge d’aquest motor és que és molt lleuger i consumeix poc recursos. Per altra banda, no consta d’una eina on els usuaris puguin compartir paquets de funcionalitat i això fa que aconseguir recursos per al projecte sigui més difícil. • Unreal Engine és un motor de videojocs que la seva primera versió va ser publicada al 1998 per la companyia Epic Games[19], conegut especialment per la creació del joc homònim Unreal Tournament[20]. Aquest motor de propòsit general incorpora el seu propi IDE i es centra en la qualitat gràfica del videojoc. A més, aquest permet la exportació per a diferents plataformes com són Android, iOS o Linux. Per altra banda, Unreal Engine consta d’una mercat de recursos on els propis usuaris poden aportar i descarregar recursos per als seus projectes. La utilització del motor és totalment gratuïta, tot i que s’ha d’abonar una quantitat quadrimestral per cada producte publicat que superi els 3000 euros de beneficis. • Unity va ser publicat a l’any 2005 per la companyia Unity Technologies. Com en el cas de Unreal Engine, aquest motor també és de propòsit general i consta del seu propi IDE integrat. El seu propòsit és facilitar al màxim el desenvolupament dels videojocs proporcionant una interfície senzilla i intuïtiva. A més, també permet la exportació del videojoc a diferents plataformes, coincidint amb la majoria d’elles amb Unreal Engine 4. Existeix una versió gratuïta d’aquest programari, tot i que també es pot pagar una subscripció per obtenir funcionalitats addicionals dins l’IDE i per eliminar les marques d’aigua de la companyia de dins el videojoc. • CryEngine va ser creat per Crytek i la seva primera versió es va publicar l’any 2001. Aquest és un motor de propòsit general que el seu punt fort és el seu detall gràfic i la facilitat en que es poden crear paisatges i decorats a per les escenes[21]. L’ús de l’entorn és gratuït, pero s’ha de pagar un 5% dels beneficis anuals en regalies per cada producte publicat. Aquest motor consta d’un portal per compartir contingut, tot i que la comunitat d’usuaris no és de les més grans. 9.

(20) 2. C ONTEXT. 2.3.1 Unity Unity és un motor de videojocs amb el seu propi IDE en el qual es poden desenvolupar videojocs de qualsevol tipus. Aquest està preparat tant per al disseny de jocs en 2D com en 3D. A més, amb Unity es poden desenvolupar jocs per tot tipus de plataformes com per exemple mòbil, web o consola. Com hem dit, Unity no és només el motor de videojocs, sinó que també té un IDE propi el qual facilita i simplifica la utilització del motor. El motor, o "Game Engine"és el nucli de la plataforma. Conté totes les biblioteques necessàries per al desenvolupament i funcionament de l’aplicació. Dins aquest conjunt, hi trobam les referents als aspectes gràfics, que ens permeten mostrar per pantalla l’escena del videojoc, o el motor de físiques, que és qui gestiona el comportament físic (moviment, col·lisions, forces...) dels objectes segons les propietats de cada un i de la pròpia escena. Per altra banda, l’IDE és l’entorn gràfic que ens permet interactuar amb el motor en si. Amb ell es poden instanciar objectes, definir-ne les propietats, assignar-lis textures i fins i tot crear animacions. A més, també serveix per definir les propietats del pròpi projecte, de l’entorn i per construir i exportar el projecte. Per altra banda, l’IDE no és una eina per al modelatge d’objectes tridimensionals. Aquest només inclou figures bàsiques com puguin ser la esfera o el cub, tot i que es pot importar qualsevol tipus de figura modelada amb altres eines.[22] Una característica important de Unity és que permet la importació de assets. Els assets són paquets de contingut (per exemple models, textures o scripts) que es construeixen per poder ser compartits i importats en altres projectes per altres usuaris. Aquesta característica dóna lloc a l’Asset Store, un repositori on qualsevol persona hi pot publicar el seu contingut de forma gratuïta i compartir-lo amb la comunitat de usuaris de Unity. Gràcies a aquesta característica, a aquest projecte hem pogut utilitzar l’Asset "Kinect with MS-SDK". Aquest Asset inclou totes les biblioteques necessàries per a la integració de la Kinect amb l’entorn de Unity. Gràcies a ell es poden extreure les dades de captura de la càmera mitjançant un script de Unity i així utilitzar-les dins el videojoc. Hem elegit Unity com a motor de videojocs per a aquest projecte pels següents motius: • Unity compleix amb els requeriments del projecte, ja que permet la exportació de videojocs en 3D per a una ampli conjunt de plataformes sense haver d’instal·lar cap tipus programari previ. • L’ús d’aquest motor és totalment gratuït dins l’àmbit d’aquest projecte. • Unity és un motor molt popular actualment, per tant compta amb una comunitat d’usuaris molt gran. Això fa que sigui molt fàcil trobar documentació, ajuda i altres tipus de material per a l’aprenentatge d’aquest. • Gràcies a l’Asset Store de Unity, ja comptam amb una biblioteca per connectar Unity i Kinect. Per tant, el projecte es pot centrar únicament en les interaccions i la funcionalitat de l’aplicació final enlloc de en la integració d’aquestes dues tecnologies. 10.

(21) 2.4. Fisioteràpia. 2.4 Fisioteràpia La fisioteràpia és una disciplina dins l’àmbit de la salut que s’utilitza per diagnosticar, prevenir o tractar malalties o dolors musculars[23]. Una de les tècniques per a això són exercicis o proves físiques que el pacient ha de realitzar, normalment amb la ajuda o supervisió d’un professional ja sigui perquè el pacient no pot realitzar els moviments sol o perquè simplement no té els coneixements de com s’ha de fer. Això implica que el pacient no pot realitzar la prova de forma independent. A més, sovint aquests exercissis solen ser repetitius i avorrits per a la persona que els està realitzant. Amb l’aparició d’interfícies basades en visió, s’ha pogut aplicar aquesta tecnologia dins el món de la fisioteràpia per tal de pal·liar aquests inconvenients i facilitar-ne el procés. De fet, Kinect ja s’està utilitzant dins aquest àmbit[24]. Gràcies a això, es poden desenvolupar aplicacions conegudes com a jocs seriosos[25] (serious games) per tal de facilitar l’exercici al pacient. Per una banda, es poden construir aplicacions que simplement facin més entretenguda l’experiència del pacient a l’hora de realitzar l’exercici mitjançant un joc on el propi joc motivi a l’usuari a realitzar els moviments pertinents. Per altra banda, el joc pot ser qui, a més, guii a l’usuari i el corregeixi quan està realitzant l’exercici. D’aquesta manera es pot reduir la necessitat de que una tercera persona intervengui en l’exercici. En resum, s’ha elegit Kinect com a tecnologia de visió per captar les dades de l’usuari i dur a terme la interacció; Unity com a motor de videojoc que ens servirà per desenvolupar l’aplicació o joc seriós amb la que utilitzarà l’usuari per dur a terme una prova de fisioteràpia amb l’objectiu de que aquesta es pugui realitzar de la forma més fàcil i independent possible.. 11.

(22)

(23) CAPÍTOL. 3. P ROCÉS DE DESENVOLUPAMENT La unió de Unity i Kinect dóna lloc a un nou tipus d’interacció entre usuari i aplicació. Aquesta és una interacció que no necessita d’un comandament físic sinó que utilitza les dades de posició i moviment del cos del propi jugador com a paràmetres d’entrada. Aquesta característica obre la porta a un nou paradigma d’aplicacions basades en aquest tipus d’interacció entre persona i computador. A continuació, es presenten els tipus d’interacció que s’han desenvolupat i una aplicació que serveix com a exemple d’aquesta. També es mostra la planificació dels passos que s’han seguit fins a poder arribar a desenvolupar l’aplicació final.. 3.1 Planificació Per arribar a poder construir l’aplicació final, s’han seguit una sèrie de passos. Es comença per entendre i implementar les parts més senzilles, i a mesura que s’avança es desenvolupen funcionalitats més complexes. Seguidament s’expliquen en ordre les diferents tasques realitzades dins el procés de desenvolupament per arribar a construir l’aplicació final. • Presa de contacte amb Kinect: El primer de tot ha estat entendre què ens permet fer Kinect. Saber quines dades en podem extreure i en quin format per tal de saber de quina informació disposam i com podem utilitzar-la. • Presa de contacte amb Unity: Després, s’ha hagut d’aprendre com s’estructura Unity, quins recursos utilitza i com es desenvolupa utilitzant aquest entorn per ser capaços de construir una aplicació amb la qual interactuar. • Seguiment d’una part del cos: Aquest ha estat el primer tipus d’interacció que s’ha desenvolupat ja que és el més simple. Aquesta és la primera tasca que uneix les dues tecnologies i per tant ens serveix per saber com funcionen juntes. Aquest desenvolupament s’explica en detall a l’apartat 3.3. 13.

(24) 3. P ROCÉS DE DESENVOLUPAMENT • Creació i reconeixement d’un gest: Aquesta tasca ens introdueix el funcionament dels gestos. Se n’ha creat un per saber com es defineixen i s’ha fet una aplicació que el reconegui per tal de saber com els gestiona la biblioteca de Kinect per Unity. La informació sobre aquesta tasca es pot trobar a la secció 3.4 • Interacció amb un entorn virtual en tres dimensions: Aquesta tasca consisteix en situar a l’usuari dins un entorn virtual i fer possible que interactuï amb els objectes d’aquest entorn. Hem dividit aquesta tasca en dues parts: una per a la interacció en si i l’altra per a que es vegi l’usuari dins l’entorn enlloc de l’esquelet. – Construcció de l’esquelet: Aquesta part de la tasca consisteix en la creació de l’esquelet de l’usauri en tres dimensions i posicionar-lo dins el món virtual. – Aplicar textura a l’esquelet: Aquesta altra part consisteix en obtenir la imatge de l’usuari i aplicar-la a l’esquelet per tal de donar la sensació de que el jugador es troba dins l’entorn virtual. El desenvolupament d’aquesta tasca s’explica a l’apartat 3.5. Una vegada s’han realitzat tots aquests passos, s’ha pogut seguir amb el desenvolupament del joc seriós utilitzant el coneixement obtingut en aquests.. 3.2 Primers passos amb Unity i Kinect La primera tasca a realitzar és una presa de contacte amb les dues eines principals d’aquest projecte, Unity i Kinect, per tal de saber com funciona cada una. El primer pas és saber com extreure la informació de Kinect i instal·lar els controladors necessaris per poder treballar amb ella. Una vegada fet això, s’ha realitzat un petit programa que mostra per pantalla la imatge de profunditat de l’escena en escala de grisos, per tant, es pot identificar el contorn dels objectes que la componen. A més, també s’ha desenvolupat una prova de concepte molt simple capaç de detectar la mà en temps real i mostrar-ne la posició per pantalla. Per altra banda, també hi ha un aprenentatge amb el motor Unity. En aquest cas s’han fet distintes proves creant escenes amb diferents objectes, assignant-lis diferents comportaments i propietats físiques. D’aquesta manera, vam poder veure com s’estructuren les aplicacions fetes amb Unity, com configurar les propietats físiques dels diferents elements i com es gestionen les col·lisions entre objectes. El desenvolupament del projecte va començar sobre una distribució del sistema operatiu Linux anomenada Ubuntu. Per treballar amb Kinect es van utilitzar les biblioteques de OpenNI NiTE [10] i Unity s’executava utilitzant la capa de compatibilitat Wine[26], ja que la versió per a Linux en aquell moment encara no s’havia publicat. A l’hora d’integrar les dues tecnologies va sorgir el problema de la compatibilitat entre elles. A causa d’un problema de les dependències de Wine, va ser impossible poder utilitzar les biblioteques de OpenNI dins l’entorn de Unity. A causa d’això, es va decidir canviar de sistema operatiu i treballar sobre Windows utilitzant les biblioteques de Microsoft per a Kinect. 14.

(25) 3.3. Interacció a partir de seguiments de parts del cos. Figura 3.1: Imatge de profunditat de Kinect [3].. Una vegada solucionat aquest problema i havent fet unes petites proves de concepte per a cada una de les tecnologies, passam a l’estudi i desenvolupament dels diferents tipus d’interacció.. 3.3 Interacció a partir de seguiments de parts del cos Aquesta és la interacció més senzilla que podem aconseguir. Consisteix simplement en detectar si una part del cos es troba dins la imatge i en cas afirmatiu obtenir-ne la posició, ja sigui amb coordenades relatives a la imatge (utilitzant la càmera de color) o relatives a la posició de la càmera (utilitzant la càmera de profunditat). Típicament, no es sol extreure aquesta informació una única vegada per a la interacció, sinó que es sol fer un seguiment de la posició en temps real. Un exemple molt comú d’aquest tipus d’interacció és fer que l’usuari pugui moure el cursor de l’ordinador únicament amb el moviment de la seva mà, fent una relació entre la posició d’aquesta i el cursor. 1 // returns true i f the given j o i n t of the s p e c i f i e d user i s being tracked 2 public bool IsJointTracked ( uint UserId , i n t j o i n t ) ; 3 4 // returns the j o i n t position of the s p e c i f i e d user , r e l a t i v e to the Kinect− sensor , in meters 5 public Vector3 GetJointPosition ( uint UserId , i n t j o i n t ) ; 6 7 // returns the raw unmodified j o i n t position , as returned by the Kinect sensor 8 public Vector3 GetRawSkeletonJointPos ( uint UserId , i n t j o i n t ) ; 9 10 // returns the l o c a l j o i n t position of the s p e c i f i e d user , r e l a t i v e to the parent j o i n t , in meters 11 public Vector3 GetJointLocalPosition ( uint UserId , i n t j o i n t ) ; 12 13 // returns the j o i n t r o t a t i o n of the s p e c i f i e d user , r e l a t i v e to the Kinect− sensor 14 public Quaternion GetJointOrientation ( uint UserId , i n t j o i n t , bool f l i p ) ; 15 16 // returns the j o i n t r o t a t i o n of the s p e c i f i e d user , r e l a t i v e to the parent j o i n t 17 public Quaternion GetJointLocalOrientation ( uint UserId , i n t j o i n t , bool f l i p ) ;. Listing 3.1: Mètodes del Kinect MS-SDK per obtenir informació dels joints 15.

(26) 3. P ROCÉS DE DESENVOLUPAMENT Com hem vist a l’apartat 2.2.1, Kinect permet la detecció, i per tant el seguiment, d’un conjunt de 25 punts del cos humà (veure figura 3.2). Per a cada un d’aquests punts, en podem extreure la informació sobre la seva posició i l’angle de rotació actual en cada un dels eixos. Aquestes dades posicionals es poden extreure respecte a diferents orígens de coordenades. Això es pot veure en la figura 3.1 on es mostren les funcions que ens ofereix la biblioteca de Kinect per a Unity (Kinect MS-SDK) per obtenir aquestes dades en funció dels distints punts de referència. Com es pot observar, a cada funció se li ha d’indicar sobre quin usuari es fa la consulta, ja que Kinect és capaç de detectar dos usuaris al mateix temps, i el punt concret del qual en volem extreure la informació. Les dades que ens retornen cada una d’aquestes funcions són les següents: • IsJointTracked Ens indica si la informació del punt indicat està disponible o si pel contrari Kinect no pot detectar-lo en aquest moment. • GetRawSkeletonJointPos Ens indica la posició dins l’escena del punt indicat. Aquesta informació es retorna en coordenades cartesianes dins un vector de tres dimensions on cada un dels elements representa la distància en metres entre la posició del punt dins aquest eix i el sensor Kinect, prenent la posició del sensor com a origen. • GetJointPos Aquest mètode, com en el cas anterior, ens serveix per conèixer les coordenades d’un punt. La diferència és que en aquest cas l’origen no és el sensor Kinect sinó que té en compte l’altura on està situat aquest (per defecte un metre) i la rotació d’aquest (segons el motor que duu incorporat a la base) per situar aquest punt dis l’escena. • GetJointLocalPosition En aquest cas, l’origen de coordenades és l’articulació anterior a la indicada dins la jerarquia de punts. L’arbre que forma aquesta jerarquia s’obté agafant com a arrel el punt SPINE BASE de l’arbre d’articulacions (figura 2.2). • GetJointOrientation Aquest mètode ens proporciona la informació de rotació de l’articulació en radians per a cada un dels eixos cartesians. Kinect considera que l’estat de rotació inicial és la posició de l’usuari quan està de peu, de front al sensor i amb els palmells de les mans mirant cap al maluc, com es mostra en la figura 3.2. • GetJointLocalOrientation La diferència entre aquesta funció i l’anterior és que la rotació és respecte de la rotació de la articulació pare en lloc de sobre l’estat inicial del propi punt. Un dels problemes que ens podem trobar durant aquesta interacció, és que es perdi el rastre del punt que s’està seguint durant un instant de temps i per tant s’interrompi la interacció. Kinect ens aporta una solució per a aquest problema, aquesta és capaç de calcular una aproximació dels punts que no ha pogut detectar mitjançant un algorisme d’interpolació entre les dades de les articulacions adjacents i altres càlculs estadístics[27]. Per provar aquesta interacció, s’ha fet un joc molt senzill on l’usuari pot conduir un cotxe utilitzant només les mans i la Kinect. 16.

(27) 3.3. Interacció a partir de seguiments de parts del cos. Figura 3.2: Orientació inicial de les articulacions segons Kinect [2].. 3.3.1 Experiment: Conducció d’un cotxe Per provar aquest tipus d’interacció, s’ha desenvolupat un joc que consisteix en conduir un cotxe únicament amb el moviment de les mans. L’usuari s’ha de col·locar de front a la càmera Kinect i ha de col·locar els braços en la mateixa posició que si estès agafant un volant de cotxe real. Després, rotant les mans respecte del punt mig entre elles (simulant el moviment de gir d’un volant) s’aconsegueix que el cotxe giri cap a un costat o cap a l’altra depenent del sentit de la rotació. Com més gran sigui aquesta rotació, més aviat girarà el cotxe. Per simplificar l’exemple, el cotxe té una velocitat constant cap endavant. Per aconseguir desenvolupar aquest exemple, es fa un seguiment de la posició d’ambdues mans. En aquest cas utilitzam les dades de posició respecte de l’escena, tot i que per aquest cas no necessitam utilitzar un univers de coordenades en concret ja que el que ens interessa és la relació entre els dos punts. Una vegada aconseguits aquests dos punts, es calcula el pendent de la recta que els uneix i s’utilitza aquest valor, multiplicat per una constant predefinida (anomenada C a la fórmula), com a velocitat angular de la rotació del cotxe respecte de l’eix d’ordenades (veure figura 3.2). El signe d’aquest valor ens indicarà si la rotació es realitza en sentit horari o antihorari. Aquesta valor s’actualitza en temps real amb les dades recollides pel seguiment de les mans. Va =. Le f t y − Ri g ht y Le f t x − Ri g ht x. C. (3.1). En aquest experiment, l’usuari és capaç de conduir el vehicle utilitzant només les seves mans simulant una conducció real. Això és un canvi en la manera tradicional 17.

(28) 3. P ROCÉS DE DESENVOLUPAMENT. 1 public void Update ( ) 2 { 3 KinectManager manager = KinectManager . Instance ; 4 i f ( manager && manager . IsUserDetected ( ) ) 5 { 6 uint userID = manager . GetPlayer1ID ( ) ; 7 i f ( manager . IsJointTracked ( userID , 7) && manager . IsJointTracked ( userID , 11) ) 8 { 9 Vector3 leftHand = manager . GetJointPosition ( userID , 7) ; 10 Vector3 rightHand = manager . GetJointPosition ( userID , 11) ; 11 12 rotationSpeed = t h i s . calculateRotationSpeed ( leftHand , rightHand ) ; 13 t h i s . transform . Rotate ( Vector3 . up , −rotationSpeed * Mathf . Rad2Deg) ; 14 } 15 } 16 } 17 18 p r i v a t e f l o a t calculateRotationSpeed ( Vector3 leftHand , Vector3 rightHand ) 19 { 20 f l o a t m = ( leftHand . y − rightHand . y ) / ( leftHand . x − rightHand . x ) ; 21 f l o a t r o t a t i o n = m * ANGULAR_SPEED; 22 23 return r o t a t i o n ; 24 }. Listing 3.2: Algorisme per a la rotació del vehicle. Figura 3.3: Usuari jugant al joc.. d’interactuar amb aquests tipus de jocs. A més, en aquest cas concret, que el moviment imiti al de la conducció real fa que aquesta interacció sigui més intuïtiva per a l’usuari. A la figura 3.3 es pot veure una imatge del joc durant la seva execució. A la part inferior dreta d’aquesta es veu el contorn del jugador i l’esquelet reconegut per Kinect en aquell moment (marcat en línies grogues dins el contorn). 18.

(29) 3.4. Interacció a partir de gestos. 3.4 Interacció a partir de gestos Un gest es defineix com a la posició relativa de certes parts del cos durant un instant de temps[28]. En el cas de la Kinect, els gestos també inclouen postures estàtiques que pugui adoptar l’usuari, com per exemple la T-pose que consisteix en que l’usuari estigui dret, amb les cames juntes i els braços estirats cap als costats. Aquest tipus d’interacció es basa en reconèixer aquests gestos i treballar sobre la informació obtinguda d’aquest, com per exemple en quin moment ha començat el gest o s’ha arribat a completar amb èxit. La biblioteca de Kinect MS-SDK ens aporta un sistema que s’encarrega de comprovar contínuament si l’usuari comença a realitzar qualque gest. Per a cada gest, en podem obtenir la informació de l’estat en que aquest es troba. Aquests estats son els següents: • In progress: Aquest estat indicia que l’usuari està realitzant el gest en aquest moment. En aquest estat va lligada la informació de en quin percentatge de progrés es troba el gest. Com explicarem més endavant, aquesta informació s’ha d’especificar a l’hora de definir el gest. • Completed: Aquest estat indica que tos els moviments que componen el gest s’han completat amb èxit. • Canceled: Aquest estat s’assigna quan l’usuari comença a realitzar un gest, però durant el seu progrés deixa de fer-ho, per tant la detecció del gest es veu interrompuda. Dins la pròpia biblioteca hi trobam un conjunt de gestos predefinits els quals podem utilitzar. Alguns d’aquests són dels més coneguts i utilitzats com per exemple el de fer zoom utilitzant el moviment dels braços o simplement saltar. Però no sempre ens basta amb aquest conjunt de gestos per dur a terme la interacció que nosaltres volem, per això, també es poden definir gestos propis. Per definir un gest dins la biblioteca de Kinect, hem de separar aquest en etapes ordenades (pot tenir-ne només una si el gest és simplement una postura). Per a cada etapa, s’ha de definir quina és la posició esperada de l’usuari en funció dels diferents punts de l’esquelet que es vulguin utilitzar. Així, sempre que es compleix que l’usuari es troba en la posició especificada, es canvia a la següent etapa. En aquesta transició és on s’ha d’especificar quin és el percentatge de progressió actual del gest, és a dir, quin percentatge del gest total representa aquesta etapa. Si es compleixen totes les etapes, el gest es marca com a completat. En canvi, si durant alguna d’elles es deixen de complir les condicions, aquest es marca com a cancel·lat. A continuació, s’explica l’aplicació que s’ha desenvolupat com a prova de concepte d’aquest tipus de interacció.. 3.4.1 Experiment: Comptador de temps en la postura de peu coix Aquesta prova de concepte consisteix en la realització d’un joc on el jugador ha d’aguantar el màxim temps possible a peu coix. Com es veu a la figura 3.4, es mostra per 19.

(30) 3. P ROCÉS DE DESENVOLUPAMENT pantalla la imatge del jugador amb un comptador de temps sobre el seu cap. Aquest marca els segons que l’usuari duu en aquesta postura. Per desenvolupar aquest joc, s’ha definit la postura de peu coix com a un gest. Aquesta definició la podem veure a la figura 3.3. Aquest gest consta de dues etapes, en realitat les dues són exactament iguals, però ha estat necessari fer-ho d’aquesta manera per poder detectar si el gest s’ha cancel·lat, ja que si només té una etapa aquest no es pot interrompre, simplement o es completa o no es comença. Les condicions definides per complir el gest són: • Braços estirats a l’altura de l’espatlla (amb un marge de 10cm de diferència). • Un dels peus (qualsevol dels dos) ha d’estar 10cm més amunt que l’altre. Una vegada definit el gest, l’afegim a la llista de gestos a reconèixer per poder detectar quan comença o quan acaba. A partir d’aquí, l’aplicació s’encarrega d’iniciar un comptador quan detecta que s’ha iniciat el gest i mostrar-lo per pantalla. Mentre aquest gest segueixi detectant-se, el comptador segueix sumant. Quan que el gest s’ha cancel·lat, i per tant l’usuari ha abandonat la posició de peu coix, s’atura el comptador i es guarda la puntuació final. Dins la mateixa partida, el jugador pot tornar a col·locar-se en posició per tal d’intentar aguantar més temps i superar la seva pròpia puntuació. 1 case Gestures . PataCoja : 2 switch ( gestureData . s t a t e ) { 3 case 0 : 4 i f ( // Right arm alignment 5 jointsTracked [ rightElbow ] && jointsTracked [ rightShoulder ] && 6 Mathf . Abs ( j o i ntsP os [ rightElbow ] . y − j o i ntsP os [ rightShoulder ] . y ) < 0.05 f &&. Figura 3.4: Usuari realitzant el gest.. 20.

(31) 3.5. Interacció amb objectes virtuals. 7 8 9 10. // L e f t arm alignment jointsTracked [ leftElbow ] && jointsTracked [ l e f t S h o u l d e r ] && Mathf . Abs ( j o i ntsP o s [ leftElbow ] . y − j o i ntsP os [ l e f t S h o u l d e r ] . y ) < 0.05 f &&. 11 12 13 14 15 16. // Ankles height d i f f e r e n c e jointsTracked [ l e f t A n k l e ] && jointsTracked [ rightAnkle ] && Mathf . Abs ( j o i ntsP o s [ l e f t A n k l e ] . y − j o i ntsP os [ rightAnkle ] . y ) > 0.1 f ) { SetGestureJoint ( r e f gestureData , timestamp , l e f t A n k l e , j oi nts Po s [ leftAnkle ] ) ;. 17 18 19 20. } break ; case 1 : bool isInPose = jointsTracked [ rightElbow ] && jointsTracked [ rightShoulder ] && Mathf . Abs ( j o i ntsP o s [ rightElbow ] . y − j o i ntsP os [ rightShoulder ] . y ) <0.05 f &&. 21 22 23 24. jointsTracked [ leftElbow ] && jointsTracked [ l e f t S h o u l d e r ] && Mathf . Abs ( j o i ntsP o s [ leftElbow ] . y − j o i ntsP os [ l e f t S h o u l d e r ] . y ) < 0.05 f &&. 25 26 27 28 29 30. jointsTracked [ l e f t A n k l e ] && jointsTracked [ rightAnkle ] && Mathf . Abs ( j o i ntsP o s [ l e f t A n k l e ] . y − j o i ntsP os [ rightAnkle ] . y ) > 0.1 f ;. 31 32 } 33 break ;. Vector3 jointPos = j o i ntsP os [ gestureData . j o i n t ] ; CheckPoseComplete ( r e f gestureData , timestamp , jointPos , isInPose , KinectWrapper . Constants . PoseCompleteDuration ) ; break ;. Listing 3.3: Definició del gest Peu coix La interacció mitjançant gestos es pot utilitzar tan per noves funcionalitats en jocs com per l’ús de interfícies d’usuari. Amb aquesta, es pot aconseguir que, per exemple, un usuari passi a la següent pàgina d’un document mitjançant un gest amb la mà, aquest gest s’anomena swype. Amb aquest tipus d’interacció es pot aconseguir un ús més intuïtiu per als usuaris cap a certes interfícies o simplement un ús més còmode.. 3.5 Interacció amb objectes virtuals Aquesta interacció consisteix en introduir a l’usuari dins un món virtual i possibilitar la interacció amb els diferents objectes que es troben dins aquest. A més, la figura que es mostri dins l’entorn no ha de ser un model arbitrari en tres dimensions, sinó que ha de ser la imatge a color de l’usuari. Per dur a terme aquest desenvolupament, s’han de realitzar les següents tasques: • Construir una escena amb Unity i definir-hi objectes amb propietats físiques i que responguin a les col·lisions • Construir un esquelet en tres dimensions que imiti els moviments del jugador. 21.

(32) 3. P ROCÉS DE DESENVOLUPAMENT. Figura 3.5: Disseny de l’habitació dins la realitat virtual.. • Posicionar l’esquelet dins el món virtual. • Superposar la imatge de l’usuari sobre l’esquelet. Per començar, dissenyam una escena dins Unity que simularà una habitació dins el món de realitat virtual (veure figura 3.5). Aquesta serà l’escena on introduirem a l’usuari. En aquesta hi afegim un objecte virtual perquè l’usuari pugui interactuar amb ell. En aquest cas és un llum de peu amb un detector de col·lisions per a que reaccioni al contacte amb l’usuari. El següent pas és construir l’esquelet en tres dimensions. Aquest esquelet el construïm creant cilindres entre les diferents articulacions de l’esquelet, simulant ossos. Això és cert excepte per al cap, les mans i el tronc. Per al cas de les mans i el cap, es construeix una esfera de radi arbitrari. Per al tronc, el càlcul és una mica més complex. Per aquest, s’utilitza un prisma quadrangular que es construeix en base a diferents punts de referència: • La pelvis (HIP_CENTER). • Les dues espatlles (SHOULDER_LEFT i SHOULDER_RIGT). • El punt central entre les dues espatlles. Aproximadament a l’altura de l’estèrnum (SHOULDER_CENTER). Utilitzam la distància entre la posició de les espatlles per calcular l’amplada del prisma. Per a l’altura, s’utilitza la distància entre la pelvis i el centre de l’espatlla. Una vegada tenim les dimensions de la figura, la posicionam a l’altura de la pelvis aplicanthi també el valor de rotació d’aquest punt, ja que l’usuari pot estar de costat. Aquest esquelet actualitza constantment la posició i rotació de tots els seus components segons les dades obtingudes. Cada component consta d’una massa predefinida i un detector de col·lisions per a que puguin interactuar amb els objectes de l’escena. A la figura 3.6 observam l’esquelet completament construït. Una vegada tenim l’esquelet construït, l’hem d’ubicar dins el món virtual. Per fer això, no podem utilitzar els valors de posició que ens retorna directament Kinect, ja que aquests corresponen a la distància en metres respecte de la càmera i, per tant, no 22.

(33) 3.5. Interacció amb objectes virtuals. Figura 3.6: Esquelet del jugador dins el món virtual.. encaixarà necessàriament en el sistema de referencia del nostre món virtual. Per solucionar aquest problema, hem de traslladar les coordenades d’un sistema de referència a l’altra. A la figura 3.2 es pot veure la fórmula utilitzada per dur a terme aquesta tasca. Aquesta ens ajuda a calcular P v r que és el punt dins el món virtual al que correspon un punt del món real. Per calcular-lo, s’ha definit un punt d’origen dins l’escena de Unity al que anomenam O v r , el qual ens servirà com a punt de referència per situar els altres punts. Després, s’ha d’escalar el punt que volem introduir al món virtual, representat com a P k i nect a la fórmula, per a que correspongui a la unitat de mesura utilitzada per Unity. Al factor de relació entre les dues unitats de mesura dels sistemes de coordenades l’anomenam F . Per facilitar el càlcul d’aquesta transformació hem construït l’escena virtual fent que un metre correspongui a una unitat de mesura dins l’aplicació, per tant ens queda que F = 1. D’aquesta manera, només cal sumar el punt del món real al punt definit com a referència dins l’escena per transportar qualsevol punt d’un sistema a l’altra. Fent això per a cada punt de l’esquelet s’aconsegueix ubicar-lo sencer dins l’escena. P vr = O vr + F · P ki nec t. (3.2). Per acabar de construir la immersió cap al món virtual, falta que, enlloc de veure un esquelet fet de polígons blancs, vegem l’aspecte real de l’usuari que està utilitzant l’aplicació. La biblioteca de Kinect ens retorna les imatges a color de la silueta de l’usuari que està detectant. Una vegada obtinguda aquesta imatge, s’ha de superposar a l’esquelet dins del món virtual. Aquest càlcul no és trivial ja que la imatge s’extreu d’una matriu de 640x480 píxels, per tant la posició dels punts dins aquesta matriu no concorda amb la posició dels punts de l’esquelet. Per aconseguir aquest efecte, s’ha hagut de trobar una relació entre la posició de la imatge de color i la de profunditat. Kinect ens permet trobar la posició d’una articulació dins la imatge de color, per tant, el que s’ha fet ha estat calcular la distancia entre dos punts dins la imatge de color i la distància entre aquests dos mateixos punts de 23.

(34) 3. P ROCÉS DE DESENVOLUPAMENT. Figura 3.7: Usuari interactuant amb un objecte virtual.. l’esquelet dins de l’escena virtual per treure’n la relació. A la fórmula 3.3 veim el càlcul per aconseguir aquest valor(R). En aquest cas hem utilitzat com a referència la posició del cap i de la pelvis (Head i Spi ne respectivament) tant dins la imatge de color com dins l’esquelet. S’han elegit aquestes dos elements perquè són punts que la Kinect sempre detecta i a més es troben sempre més o menys a la mateixa distància un de l’altre, per tant són molt fiables. Una vegada obtinguda la distància entre aquest dos punts en ambdós sistemes, es divideixen aquests valors per obtenir-ne el factor de relació. Després, s’utilitza aquest valor per escalar la imatge perquè coincideixi amb la mida de l’esquelet. Un cop escalada, es posiciona dins el món virtual al mateix punt on es troba la pelvis de l’esquelet. Per acabar, s’elimina la textura de les figures que componen l’esquelet per a que només es vegi la imatge de l’usuari. R=. Head col or − Spi ne col or Head skel et on − Spi ne skel et on. (3.3). A continuació s’explica el joc que s’ha desenvolupat com a prova de concepte d’aquesta interacció.. 3.5.1 Experiment: Sac de boxe En aquest joc, el jugador apareix dins un gimnàs on hi ha un sac de boxe penjat. L’usuari pot moure’s per dins aquest entorn, xocar i colpejar el sac. Quan el colpeja, es mostra amb quina força ho ha fet. Aquest és un càlcul fet internament per Unity utilitzant la massa definida al component que xoca amb el sac i la velocitat en que ho fà. El sac de boxe s’ha definit com un objecte de 25kg de massa que reacciona a les col·lisions. L’usuari pot donar-li cops de puny i el sac reaccionarà a aquests segons la força i la direcció en que els rebi gràcies al motor de físiques de Unity. A més, per cada cop rebut, es mostra la força en que aquest s’ha produït. A la figura 3.8 es pot veure a l’usuari jugant al joc. Amb aquesta interacció es poden fer tot tipus de jocs que impliquin una interacció amb objectes virtuals, ja sigui esquivar-los o intentar col·locar-los de qualque manera. El fet de fer-ho introduint a l’usuari dins una escena virtual fa que el joc sigui més immersiu i per tant que el jugador es senti part d’ell i obtingui una experiència més gratificant a l’hora de jugar-hi. A més, l’usuari juga utilitzant només el seu propi cos mitjançant moviments naturals, per tant també dóna una millor sensació de realisme.. 24.

(35) 3.5. Interacció amb objectes virtuals. Figura 3.8: Usuari colpejant el sac de boxe.. 25.

(36)

(37) CAPÍTOL. 4. F UNCTIONAL R EACH T EST En aquest capítol s’explica en que consisteix la prova de fisioteràpia anomenada prova d’abast funcional i per a què s’utilitza. També s’explica el desenvolupament d’un joc seriós per a la realització d’aquesta prova i els avantatges que això aporta. Un joc seriós (serious game en anglès) és aquell joc el qual el seu objectiu principal no és l’entreteniment o diversió del jugador sinó que és aportar un altre tipus de valor. Per exemple, dins el camp de l’educació, es poden trobar jocs seriosos per millorar l’experiència en l’aprenentatge dels alumnes [29]. En aquest projecte, la finalitat del joc seriós és la de millorar l’experiència de l’usuari i facilitar la realització d’una prova de fisioteràpia.. 4.1 Test La prova d’abast funcional, abreujat com a Functional Reach Test (FRT), és una prova que es realitza dins l’àmbit de la fisioteràpia. Aquesta va ser dissenyada per Pamela Duncan i els seus companys durant l’any 1990. El seu objectiu és el de mesurar el grau d’equilibri i estabilitat de la persona que l’està realitzant. D’aquesta s’obté un valor quantitatiu amb el qual es pot fer una estimació del risc de caiguda del pacient a causa d’un desequilibri [30]. Aquesta prova es realitza típicament a persones majors o a gent amb problemes per caminar. Rang d’edat 20-40 41-69 70-87. Homes 42.50 38.05 33.42. Dones 37.19 35.07 25.60. Taula 4.1: Taula de mitges d’abast en centímetres.[30] Les passes per realitzar aquesta prova són molt senzilles, però abans, cal preparar una eina de mesura. El que proposa la pròpia prova és simplement dibuixar a una paret, a l’altura de l’espatlla, un regle per mesurar distàncies ja que necessitarem mesurar la 27.

(38) 4. F UNCTIONAL R EACH T EST distància que el pacient és capaç de desplaçar el braç. Una vegada fet això, les passes per dur a terme la prova d’abast funcional són les següents: 1. El pacient es col·loca dret al costat de la paret (sense tocar-la) del costat on el braç dominant de l’usuari (depenent de si és dretà o esquerrà) estigui més a prop del sistema de mesura. 2. El pacient aixeca els braç amb una obertura de aproximadament 90 graus respecte de la vertical del cos i obre la mà i l’estira de forma que segueixi al braç. 3. Es pren nota de la posició en que es torba el cap del metacarpià del tercer dit. 4. El pacient intenta arribar tan enforma com pugui estirant el braç però sense moure els peus ni tocar la paret. 5. Es pren nota de la distància màxima aconseguida.. Figura 4.1: Imatge resum de la realització de la prova [4]. La dada a tenir en compte com a resultat de la prova és la distància entre el punt inicial de la mà i la posició més llunyana aconseguida (distància entre A i B de la figura 4.1). La conclusió que s’obtingui amb aquesta mesura dependrà també del sexe i de l’edat del pacient. A la taula 4.1 hi trobam els resultats esperats en cada cas. Si l’abast aconseguit és igual o superior a l’indicat a la taula significa que l’estabilitat i l’equilibri del pacient són bons. En cas contrari, existeix el risc de que el pacient pugui sofrir una caiguda en circumstàncies normals per causa d’un desequilibri. Com es pot veure, realitzar la prova d’aquesta manera té alguns inconvenients. Per una banda, es necessita conèixer bé quins són els passos per realitzar la prova i quins són els resultats esperats. Per tant, s’han d’adquirir aquests coneixements o comptar amb l’ajuda d’un especialista. Per altra banda, per realitzar la prova es necessita habilitar un lloc per fer-la, ja que necessitam poder mesurar el desplaçament de la mà, o bé s’ha d’acudir un lloc adaptat per fer-la. En qualsevol d’aquests dos casos es requereix l’ajuda d’una tercera persona per poder prendre les mesures pertinents. Per resoldre aquests inconvenients, es proposa la creació d’una aplicació que, mitjançant la visió per computador, permeti al pacient realitzar la prova de forma totalment independent. 28.

Referencias

Documento similar

La organización debe establecer las acciones necesarias para aprovisionarse de los recursos necesarios previstos de acuerdo al resultado de la evaluación de riesgos y el

Amb caràcter general, sens perjudici de les mesures de protecció i seguretat establertes en aquesta Resolució i en els plans sectorials a què fa referència l'apartat 1.2, les

Como norma general, todo el personal auxiliar que participe en el evento: azafatas, fotógrafos, intérpretes, etc, tendrán que poner en práctica las medidas de distanciamiento

També es poden aplicar i ampliar més tècniques de magatzem de dades, com la creació de funcions i disparadors per afegir dades d’estadística a les taules,

Disseny i implementació d’una base de dades per la creació d’una aplicació que permet la gestió de les pràctiques d’estudiants a les empreses.. Jorge

INTERACCIÓ AMB ELLA MATEIXA: Es culpabilitza de l’abús i del fet d’haver confiat en el seu agressor, es pressiona a si mateixa per superar-ho i per aquest motiu, tot i saber

Amb aquestes reflexions, que tenen com a colofó l’imprevist —o la impre- visió— terrorista de l’11 de setembre a Nova York, Virilio pensa com la nos- tra cultura ara

Per aquest motiu, vam dur a terme un estudi de les característiques bàsiques del menorquí que dóna compte dels trets entonatius més recurrents i dels més