• No results found

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

N/A
N/A
Protected

Academic year: 2022

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

Copied!
49
0
0

Laster.... (Se fulltekst nå)

Fulltekst

(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ó

Autor Tutor No No

X X

Paraules clau del treball:

Visió, Kinect, Unity, fisioteràpia, joc seriós, functional reach test

(2)
(3)

S UMARI

Sumari i

Índex de figures iii

Acrònims v

Resum vii

1 Introducció 1

1.1 Motivació . . . 1

1.2 Objectius . . . 2

1.3 Estructura del document . . . 2

2 Context 3 2.1 Requeriments . . . 3

2.2 Visió per computador . . . 4

2.2.1 Kinect . . . 6

2.3 Motor de videojocs . . . 8

2.3.1 Unity . . . 10

2.4 Fisioteràpia . . . 11

3 Procés de desenvolupament 13 3.1 Planificació . . . 13

3.2 Primers passos amb Unity i Kinect . . . 14

3.3 Interacció a partir de seguiments de parts del cos . . . 15

3.3.1 Experiment: Conducció d’un cotxe . . . 17

3.4 Interacció a partir de gestos . . . 19

3.4.1 Experiment: Comptador de temps en la postura de peu coix . . 19

3.5 Interacció amb objectes virtuals . . . 21

3.5.1 Experiment: Sac de boxe . . . 24

4 Functional Reach Test 27 4.1 Test . . . 27

4.2 Serious game . . . 29

4.2.1 Descripció . . . 29

4.2.2 Implementació . . . 29

5 Conclusions 35

(4)

ii SUMARI

Bibliografia 37

(5)

Í NDEX DE FIGURES

2.1 Components del sensor Kinect [1]. . . 6

2.2 Articulacions que detecta la Kinect [2]. . . 8

3.1 Imatge de profunditat de Kinect [3]. . . 15

3.2 Orientació inicial de les articulacions segons Kinect [2]. . . 17

3.3 Usuari jugant al joc. . . 18

3.4 Usuari realitzant el gest. . . 20

3.5 Disseny de l’habitació dins la realitat virtual. . . 22

3.6 Esquelet del jugador dins el món virtual. . . 23

3.7 Usuari interactuant amb un objecte virtual. . . 24

3.8 Usuari colpejant el sac de boxe. . . 25

4.1 Imatge resum de la realització de la prova [4]. . . 28

4.2 Diagrama del flux que segueix el joc. . . 30

4.3 Menú per introduir les dades de l’usuari. . . 30

4.4 Usuari col·locant-se per iniciar la prova. . . 31

4.5 Usuari realitzant la prova intentant arribar a la fita. . . 33

4.6 Informació sobre el resultat de la prova. . . 33

(6)
(7)

A CRÒNIMS

FRT Functional Reach Test

IDE Integrated Development Environment RGB Red Green Blue

SDK Software Development Kit

(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 con- junt 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.

(10)
(11)

C

APÍTO

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 convencio- nals 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 no- mé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.

(12)

1. INTRODUCCIÓ

A nivell personal, tenc l’oportunitat de treballar amb tecnologies de visió per com- putador 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 inde- pendent. 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 deContexts’expliquen els conceptes en els quals s’em- marca 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, titulatProcés de desenvolupament, s’expliquen els tipus d’inte- racció, el seu desenvolupament i un exemple de cada una d’elles.

A continuació, a l’apartatFunctional Reach Test, s’explica en què consisteix la prova fisioterapèutica que s’ha utilitzat en aquest projecte, l’implementació d’aques- ta utilitzant visió per computador i quins avantatges proporciona fer-ho d’aquesta manera.

Per acabar, a la secció deConclusionss’exposen les dades extretes dels diferents àmbits del projecte així com l’experiència i sensacions obtingudes durant la seva realit- zació.

(13)

C

APÍTO

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.

(14)

2. CONTEXT

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, existei- xen 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 com- putador es necessita un dispositiu específic per recollir les diferents dades d’entrada.

Actualment, podem trobar varies tecnologies relacionades amb la visió per computa- dor, cada una amb diferents utilitats i característiques. A continuació, en presentarem algunes de les més utilitzades:

• Lescàmeres RGBsó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

(15)

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 ésASUS Xtion.

Aquesta és una tecnologia desenvolupada per ASUS per ser utilitzada en ordi- nadors. 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. Uti- litzant 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.

• Lescàmeres de profunditatsó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 ésLeap 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 ésMicrosoft 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.

• Lescàmeres tèrmiquespermeten 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

(16)

2. CONTEXT

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 ésFLIR 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.

(17)

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 unarrayde 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 mo- ment 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 pro- porciona 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:

(18)

2. CONTEXT

Figura 2.2: Articulacions que detecta la Kinect [2].

• Kinect compleix amb els requeriments necessaris per al desenvolupament d’a- quest 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 interacci- ons. 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 engineen 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 Envi-

(19)

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 inde- pendents, 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 exem- ple 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 pu- blicada 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 ge- neral 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.

Unityva 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.

CryEngineva 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.

(20)

2. CONTEXT

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ó deassets. Els assetssón paquets de contingut (per exemple models, textures o scripts) que es cons- trueixen 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 Storede 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.

(21)

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.

(22)
(23)

C

APÍTO

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.

(24)

3. PROCÉS DE DESENVOLUPAMENT

Creació i reconeixement d’un gest:Aquesta tasca ens introdueix el funciona- ment 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 imat- ge 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 desenvolu- pament 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’es- tructuren 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 bibli- oteques 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.

(25)

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 G e t J o i n t P o s i t i o n (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

(26)

3. PROCÉ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:

IsJointTrackedEns indica si la informació del punt indicat està disponible o si pel contrari Kinect no pot detectar-lo en aquest moment.

GetRawSkeletonJointPosEns 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.

GetJointPosAquest 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.

GetJointLocalPositionEn 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 puntSPINE BASEde l’arbre d’articulacions (figura 2.2).

GetJointOrientationAquest 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.

GetJointLocalOrientationLa 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 al- gorisme 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.

(27)

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 (anomenadaCa 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 tyRi g hty

Le f txRi g htx

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

(28)

3. PROCÉ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 . G e t J o i n t P o s i t i o n ( userID , 7) ; 10 Vector3 rightHand = manager . G e t J o i n t P o s i t i o n ( 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).

(29)

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 laT-poseque 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 com- provar 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 inter- rompuda.

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’a- guantar el màxim temps possible a peu coix. Com es veu a la figura 3.4, es mostra per

(30)

3. PROCÉ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 n t s P o s [ rightElbow ] . y j o i n t s P o s [ rightShoulder ] . y ) <

0.05 f &&

Figura 3.4: Usuari realitzant el gest.

(31)

7

8 // L e f t arm alignment

9 jointsTracked [ leftElbow ] && jointsTracked [ l e f t S h o u l d e r ] &&

10 Mathf . Abs ( j o i n t s P o s [ leftElbow ] . y j o i n t s P o s [ l e f t S h o u l d e r ] . y ) < 0.05 f

&&

11

12 // Ankles height d i f f e r e n c e

13 jointsTracked [ l e f t A n k l e ] && jointsTracked [ rightAnkle ] &&

14 Mathf . Abs ( j o i n t s P o s [ l e f t A n k l e ] . y j o i n t s P o s [ rightAnkle ] . y ) > 0 . 1 f )

15 {

16 SetGestureJoint (r e f gestureData , timestamp , l e f t A n k l e , j o i n t s P o s [ l e f t A n k l e ] ) ;

17 }

18 break;

19 case 1 :

20 bool isInPose = jointsTracked [ rightElbow ] && jointsTracked [ rightShoulder ] &&

21 Mathf . Abs ( j o i n t s P o s [ rightElbow ] . y j o i n t s P o s [ rightShoulder ] . y )

<0.05 f &&

22

23 jointsTracked [ leftElbow ] && jointsTracked [ l e f t S h o u l d e r ] &&

24 Mathf . Abs ( j o i n t s P o s [ leftElbow ] . y j o i n t s P o s [ l e f t S h o u l d e r ] . y ) <

0.05 f &&

25

26 jointsTracked [ l e f t A n k l e ] && jointsTracked [ rightAnkle ] &&

27 Mathf . Abs ( j o i n t s P o s [ l e f t A n k l e ] . y j o i n t s P o s [ rightAnkle ] . y ) > 0 . 1 f ; 28

29 Vector3 jointPos = j o i n t s P o s [ gestureData . j o i n t ] ;

30 CheckPoseComplete (r e f gestureData , timestamp , jointPos , isInPose , KinectWrapper . Constants . PoseCompleteDuration ) ;

31 break;

32 }

33 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’anomenaswype. 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.

(32)

3. PROCÉ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 cons- truï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 aplicant- hi 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

(33)

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 soluci- onar 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 calcularPvr 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 anomenamOvr, 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 aPki nec ta 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’anomenamF. 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 queF=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.

Pvr =Ovr+F·Pki 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

(34)

3. PROCÉ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 iSpi nerespectivament) 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= Headcol orSpi necol or Headskel et onSpi neskel 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.

(35)

Figura 3.8: Usuari colpejant el sac de boxe.

(36)
(37)

C

APÍTO

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 gameen anglès) és aquell joc el qual el seu objectiu principal no és l’entrete- niment 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 Homes Dones

20-40 42.50 37.19

41-69 38.05 35.07

70-87 33.42 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

(38)

4. FUNCTIONALREACHTEST

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.

Referanser

RELATERTE DOKUMENTER

Una vegada constatada la dependència de la interacció glúcid-aromàtic tant amb la naturalesa química del glúcid com amb la del compost aromàtic, es varen adquirir

i el lisozim 16,62 , ens donaren la base metodològica per la síntesi del mateix complex amb altres proteïnes. En base a aquesta informació, a més d’estudiar interacció entre

Caldria esperar una interacció similar amb el lligand SCN - degut a les característiques d’aquests, però s’observa que interacciona amb el receptor a través de tres enllaços

A pesar dels resultats, però, sembla que seria interessant treballar sobre aquesta proteïna degut a la interacció amb ZP2 i ZP3, proteïnes de zona clau en la interacció

Es por ello que la salud es un fenómeno social que sólo puede ser explicado teniendo en cuenta que se trata de una estructura de alto grado de complejidad como son los hechos

Avaluació de les entrades (inputs) ... Metodologies i tècniques per dur a terme el projecte ... Recursos materials que es faran servir per dur a terme el projecte ...

Font: Creació del gràfic a partir de les dades extretes del estudi “Espanya es consolida com el país de la UE amb major abandó primerenc” per la població gitana de la Fundació

Aquest mapa, que classifica més de 307 emocions en diferents galàxies generals (alegria, amor, felicitat, por, ira i tristesa), serà present dins l’aula durant totes