università politecnica delle marche
Transcript
università politecnica delle marche
UNIVERSITÀ POLITECNICA DELLE MARCHE FACOLTÀ DI INGEGNERIA Corso di Laurea magistrale in Ingegneria Informatica Studio e sviluppo di uno scanner 3D con Kinect Tesi di laurea di: Relatore: Luca Pignati Prof. Aldo Franco Dragoni Correlatore: Ing. Gianluca Dolcini Anno Accademico 2011-2012 1 2 “Todos los dias sale el sol” Bongo Botrako 3 4 Indice generale INTRODUZIONE.......................................................................................9 LA SCANSIONE 3D.................................................................................11 IL PROCESSO DI SCANSIONE........................................................................................11 La scansione 2D............................................................................................... 11 LA SCANSIONE 3D.................................................................................................... 12 Funzionamento................................................................................................ 13 L'ATTUALE STATO DELL'ARTE.......................................................................................13 A tempo di volo................................................................................................ 16 A luce strutturata............................................................................................. 17 IL KINECT ............................................................................................. 19 INTRODUZIONE HARDWARE AL DISPOSITIVO....................................................................................19 KINECT............................................................................................. 20 DEL Descrizione Generale.......................................................................................20 Descrizione dei Componenti.............................................................................23 COME FUNZIONA ...................................................................................................... 25 Il monitoraggio dei movimenti.........................................................................25 Il riconoscimento vocale...................................................................................27 Il motore direzionale........................................................................................28 IL SENSORE DI PROFONDITÀ........................................................................................28 Depth from focus............................................................................................. 30 Depth from stereo............................................................................................ 31 SOFTWARE DEL KINECT..............................................................................................33 Le librerie ufficiali............................................................................................. 33 Le librerie non ufficiali......................................................................................34 LA NOSTRA SCELTA................................................................................................... 36 GLI STRUMENTI UTILIZZATI....................................................................39 L'AMBIENTE............................................................................................................. 39 Ubuntu............................................................................................................. 39 Le Librerie OpenNI e NITE................................................................................41 Le librerie Java3D............................................................................................. 42 5 Eclipse.............................................................................................................. 42 PROCEDURE DI INSTALLAZIONE....................................................................................43 Ubuntu............................................................................................................. 44 OpenNI............................................................................................................. 45 Driver Kinect.................................................................................................... 48 NITE................................................................................................................. 51 Java 3D............................................................................................................. 54 Eclipse.............................................................................................................. 54 IL PROGETTO........................................................................................55 OBIETTIVI DEL PROGETTO...........................................................................................55 Introduzione..................................................................................................... 55 Sintesi del progetto.......................................................................................... 57 L'attuale stato dell'arte....................................................................................58 La nostra proposta........................................................................................... 59 PRESTAZIONI DEL KINECT......................................................................61 DESCRIZIONE DELL'ESPERIMENTO.................................................................................61 I valori della mappa di profondità.....................................................................61 L'esperimento ................................................................................................. 63 PROVE DI DISTANZA..................................................................................................64 Glossario delle tabelle......................................................................................65 La prima prova................................................................................................. 66 La seconda misurazione...................................................................................69 1m:................................................................................................................... 70 1,5 m:............................................................................................................... 73 2m:................................................................................................................... 74 Considerazioni sui primi test............................................................................77 PROVE DI POSIZIONE................................................................................................. 78 Kinect inclinato................................................................................................. 78 Inquadratura ristretta.......................................................................................80 IMMAGINI DI ERRORE.................................................................................................82 ULTIME PROVE, BUSTO UMANO....................................................................................86 I primi risultati.................................................................................................. 86 Sperimentazione alternativa............................................................................88 Foto di differenza............................................................................................. 92 L'ultimo test..................................................................................................... 96 6 LO SCANNER 3D....................................................................................99 PREPARAZIONE DI ECLIPSE..........................................................................................99 INTRODUZIONE....................................................................................................... 103 Le azioni da eseguire.....................................................................................103 DESCRIZIONE DEL SOFTWARE....................................................................................105 Il primo prototipo........................................................................................... 105 Il secondo prototipo.......................................................................................113 LO SCANNER A 360 GRADI.......................................................................................116 Il principio di funzionamento..........................................................................117 Il programma................................................................................................. 117 Le prove di scansione.....................................................................................119 CONCLUSIONI.....................................................................................121 Considerazioni finali.......................................................................................121 Possibilità di sviluppo.....................................................................................122 BIBLIOGRAFIA.....................................................................................123 RINGRAZIAMENTI................................................................................125 7 8 Introduzione Questa tesi di laurea è stata sviluppata sopra la progettazione di uno scanner a tre dimensioni realizzato con il sensore chiamato Kinect della Microsoft. L'obiettivo di questo lavoro sarà l'analisi dettagliata di questo sensore per capire e conoscere le sue potenzialità ed eventualmente considerare la possibilità di integrarlo nello sviluppo di applicazioni software da utilizzare in ambito biomedico. L'idea è quella di poter far passare questo strumento da un ambiente puramente videoludico ad un ambiente medico creando un software di scansione a tre dimensioni del corpo umano in cui sia possibile misurare valori biometrici, e integrare questi valori così ottenuti con le restanti informazione per ottenere infine una mappatura del corpo del paziente. I settori di interesse di uno strumento di questo tipo riguarderebbero, oltre alla medicina generale, la medicina sportiva, la fisioterapia o anche la medicina nutrizionale. I primi capitoli serviranno a descrivere il Kinect a livello hardware e software e a mostrarne le varie possibilità di applicazione, in seguito verranno descritti gli strumenti utilizzati per sviluppare le varie applicazioni utilizzate nel corso delle sperimentazioni. 9 Di seguito verrà affrontata una fase di testing dello strumento. Tramite un software, sviluppato per questa tesi, in Java è stato possibile effettuare una serie di misurazioni che hanno permesso di comprendere le reali prestazioni del Kinect e quale sia l'errore dello strumento con oggetti immobili e con persone. In fine verrà descritto il software di scansione 3D degli oggetti, l'idea alla base del software e descrizione del funzionamento dei vari prototipi sviluppati durante la fase di progettazione permetteranno la comprensione dei principi informatici e matematici che sono alla base di questo dispositivo. In fase conclusiva verranno fatte delle considerazioni, a seguito dei test svolti, riguardanti l'effettivo possibile uso del Kinect in ambito Biomedico e il possibile sviluppo futuro del prototipo sviluppato in fase di progettazione. 10 La scansione 3D Il processo di scansione Il processo di scansione fondamentalmente è un processo di digitalizzazione di un oggetto o di un documento. L'obiettivo è quello di trasformare un oggetto fisico in un formato digitale leggibile da qualsiasi computer. La scansione 2D Quando si parla di scansione a due dimensioni fondamentalmente si discute a proposito della scansione di documenti cartacei. Questa pratica negli ultimi anni è risultata molto utile sopratutto a livello aziendale, potendo sostituire al posto di voluminosi archivi di documenti, file immagazzinati in server aziendali dislocati in luoghi differenti e facilmente accessibili da parte dei dipendenti. Il processo risulta essere molto facile da effettuare data la presenza sul mercato di diversi dispositivi chiamati Scanner che rendono questo lavoro molto semplice. 11 Sostanzialmente basta inserire il documento con la parte da scansionare a faccia in giù sul vetro dello Scanner e avviare il processo tramite il software in dotazione (questa pratica potrebbe variare a seconda del modello). Il documento all'interno dello scanner verrà illuminato con un un forte fascio di luce e verrà analizzato con un sensore ottico, il sensore permetterà il riconoscimento dei diversi colori presenti sul foglio e quindi la digitalizzazione dell'informazione. Normalmente per fare ciò si utilizza un braccio scorrevole su cui sono montati la sorgente di luce e il sensore che scorre ad una velocità nota. La scansione 3D Dalla scansione a due dimensioni vista precedentemente possiamo discutere adesso della scansione a tre dimensioni. La scansione a tre dimensioni è un tipo di scansione nato principalmente nell'ambito della computer grafica, negli ultimi anni molte aziende hanno utilizzato questi dispositivi al fine di 12 riprodurre digitalmente un oggetto fisico. Un esempio facile da comprendere è l'utilizzo di scanner 3D per riprodurre digitalmente modelli creati a artisti (sculture) per poi animarle al fine di creare cortometraggi, lungometraggi o anche videogiochi. Funzionamento Il principio di funzionamento di tale oggetto consiste nell'utilizzo di dispositivi che tramite differenti tecniche (variano da dispositivo a dispositivo) percepiscono la distanza di un oggetto dalla sorgente del sensore per poi andare a creare una nuvola di punti in un ambiente tridimensionale digitale. Questi punti verranno appositamente lavorati con l'utilizzo di software commerciali per la renderizzazione dei punti e la modifica di alcuni parametri. Gli scanner 3D più noti sono quelli che funzionano con il principio del laser. Il principio è semplice ed efficace, si invia un raggio laser orizzontale che viene passato su tutta la lunghezza dell'oggetto, la distanza viene calcolato a seconda del tempo che impiega il laser ad essere riflesso e tornare alla sorgente dove un sensore capterà il segnale di ritorno. L'attuale stato dell'arte Attualmente i dispositivi di scansione 3D si sono molto evoluti grazie al miglioramento delle tecnologie esistenti, all'inserzione di nuove tecnologie ed alla crescita smisurata della grafica a tre 13 dimensioni che sta rivoluzionando diversi ambienti come ad esempio quello cinematografico. Un altro fattore rilevante è la nascita di nuovi strumenti come per esempio la stampante 3D che potrebbe dislocare la tecnologia dell'utilizzo di scanner e stampanti a 3 dimensioni all'uso domestico e quindi ad una commercializzazione di massa e alla nascita di nuovi ambiti lavorativi. La tecnologia attuale di scansione 3D può essere suddivisa in maniera abbastanza grossolana negli scanner a contatto e a non contatto. Riguardo allo scanner a contatto perderemo poco tempo perché è una tecnologia abbastanza vecchia che viene utilizzata perlopiù in un ambiente industriale dove si ha bisogno di conoscere solo se alcuni punti di un prodotto sono stati posizionati nella maniera giusta. L'idea che sta alla base di questo oggetto consiste nel far muovere un braccio meccanico sopra l'oggetto da analizzare, il braccio scendendo toccherà 14 l'oggetto fermandosi, automaticamente registrerà il punto toccato a seconda delle coordinate del braccio. Il risultato è una scansione effettuata con una precisione che dipende dalla quantità di punti che si vogliono far scansionare dal braccio e ovviamente dalla capacità di movimento minima dei motori che muovono il braccio. Per quanto questa soluzione possa essere efficace non è per nulla efficiente, il dispositivo è molto costoso, occupa molto spazio e il tempo necessario per effettuare un scansione dipende dalla quantità di punti che si necessitano e comunque risulta molto lungo. Strumenti molto più performanti sono invece gli scanner a tre dimensioni senza contatto. Questo genere di dispositivi basano il proprio funzionamento su differenti 15 principi fisici. La suddivisione può essere fatta considerando due grandi famiglie: gli scanner a “tempo di volo” e gli scanner a “luce strutturata”. A tempo di volo Come accennato precedentemente, gli scanner a tempo di volo sono un tipo di scanner che sfruttano le proprietà della luce laser. Sono prodotti molto performanti che, a seconda dei componenti che vengono utilizzati, possono raggiungere la precisione del micron. Alla base di questo tipo di dispositivo vi è un sensore laser a tempo di volo. Il sensore laser calcola la distanza tra lo strumento e una superficie cronometrando con grandissima precisione il tempo di andata e ritorno di un impulso di luce (appunto il tempo di volo). Un diodo laser emette un impulso di luce e lo strumento rileva il tempo intercorrente tra l'emissione dell'impulso e il ritorno sul rilevatore all'interno dello strumento (fotodiodo). Poiché la velocità della luce “c” è una costante nota, il tempo di andata e ritorno determina la lunghezza della corsa della luce, che è due volte la distanza fra il dispositivo di scansione e la superficie di riflessione. Se “t” è il tempo di andata e ritorno, quindi la distanza è uguale a (t*c)/2. La precisione di un laser scanner 3D a tempo di volo dipende chiaramente dalla precisione con la quale possiamo misurare il tempo t. Questo tipo di dispositivi hanno prestazioni incredibili (portate anche di centinaia di metri) ma hanno anche prezzi elevati. 16 A luce strutturata Un sistema a luce strutturata utilizza per il suo funzionamento la proiezione di dell'oggetto. un pattern Proiezione di direttamente luce sulla strutturata: superficie basati sulla proiezione di una sequenza di pattern codificati. In questo caso la deformazione indotta dalla superficie dell’oggetto viene acquisita tramite una telecamera e sfruttata per il calcolo delle coordinate tridimensionali. Questi sistemi sono detti anche a “campo intero” perché per ogni punto sensibile del CCD del sistema di acquisizione si ricava una tripletta(x,y,z). Dipendentemente dalla risoluzione della telecamera un sistema di questo tipo consente la digitalizzazione non di un solo punto alla volta, bensì di parecchie centinaia di migliaia di punti. Proiettando una stretta banda di luce su un oggetto tridimensionale si produce una linea di illuminazione che appare distorta da punti di osservazione diversi dal proiettore e può essere usata per una ricostruzione geometrica esatta della forma della superficie illuminata (sezione luminosa). 17 Il procedimento con cui è possibile ricostruire la forma dell'oggetto colpito è detto triangolazione. Un metodo più veloce e versatile è la proiezione di schemi luminosi che consistono di molte linee in una volta sola o di frange luminose arbitrarie, questo permette l'acquisizione di molti campioni simultaneamente. Gli schemi più usati consistono in linee parallele. 18 Il Kinect Introduzione al dispositivo Il dispositivo denominato Kinect è un controllore di gioco sviluppato per la console della Microsoft Xbox 360. L'ingresso nell'attuale mercato video-ludico di questo apparecchio ha portato ad una rivoluzione nel modo di giocare dato che questo strumento permette di comandare azioni di gioco senza l'utilizzo di joypad o pulsanti ma semplicemente con l'utilizzo del proprio corpo e, a differenza del controller Wii della Nintendo o del Motion Controller Sony, questo sensore non ha bisogno di alcun elemento da collegare al corpo per decodificare i movimenti effettuati dal giocatore. 19 Il Kinect è stato sviluppato per la Microsoft dall'azienda israeliana Primesense il cui obiettivo fu appunto la creazione di un controllore del corpo umano privo di sensori da applicare al soggetto. Fin dal giorno della sua uscita sul mercato (4 novembre 2010) il Kinect è entrato a far parte della realtà di sviluppatori universitari o freelance i quali, con tecniche di reverse engineering hanno iniziato a studiare questo dispositivo. La Microsoft, la quale inizialmente aveva dichiarato di essere contraria all'utilizzo del Kinect all'infuori dell'ambiente di gioco, intuì che il prodotto aveva grandi potenzialità anche con differenti dispositivi e in data 10 novembre 2010 fece uscire i primi driver che permisero l'utilizzo della telecamera RGB e del sensore di profondità. Recentemente la Microsoft ha dichiarato che il Kinect sarà parte integrante del nuovo sistema operativo Windows 8. Attualmente sono nate numerose comunità on-line, finanziate da grandi imprese, che programmano e sviluppano software da utilizzare con il Kinect. Hardware del Kinect Descrizione Generale Il Kinect è un dispositivo progettato per essere posizionato sotto un monitor o un televisore, è costituito fondamentalmente da una barra di metallo su cui sono montati una serie di sensori e di 20 componenti ed è collegato ad una base tramite un perno motore. I componenti che rivestono il Kinect sono di plastica, il dispositivo non è molto resistente agli urti e anche alcuni componenti interni sono in plastica (gli ingranaggi del perno motore). Una volta aperto il Kinect è possibile vedere la barra metallica dove sono appoggiati i sensori e gli altri componenti. 21 Una volta aperto si possono notare due schede avvitate alla barra metallica tramite un distanziatore, queste due schede vengono utilizzate per l'elaborazione delle immagini difatti è lo stesso Kinect a elaborare le immagini per il riconoscimento del corpo e delle mani, ciò è stato fatto per non appesantire di lavoro la CPU dell'Xbox. Sempre sulla barra metallica si possono vedere montate una telecamera RGB di risoluzione 640X480, un emettitore di infrarossi, e una telecamera IR con una risoluzione di &40X480(inizialmente aveva una risoluzione di 320X240 poco dopo l'uscita sul mercato è stata aumentata). L'immagine illustra ottimamente lo schema di funzionamento generale del Kinect. Il dispositivo ha a disposizione anche un array di 2 microfoni panoramici e 4 fonti audio posizionati nella parte bassa dello stesso per rilevare comandi vocali, le fonti audio invece vengono utilizzate per sondare l'ambiente circostante e eliminare eventuali rumori di fondo. Il Kinect ha bisogno di 12 Watt per alimentarsi quindi oltre al collegamento usb con il computer è necessario attaccarlo alla 22 rete elettrica tramite un trasformatore dato che le porte usb emettono solo 2,5 Watt. Descrizione dei Componenti Passeremo ora ad analizzare nel dettaglio la scheda madre del Kinect ovvero il cervello stesso del dispositivo. La scheda madre (scheda A) ha 6 chip montati. Da sinistra a destra: • Stereo ADC con microfono preamplificato (Wolfson Microelectronics WM8737G) • N-Channel PowerTrench MOSFET (Fairchild Semiconductor FDS8984) 23 • Controller USB 2.0 hub (NEC uPD720114) • Pacchetto SAP 6 mm x 4,9 mm non identificato forse SPI flash (H1026567 XBOX1001 X851716-005 Gepp) • SoC per il controller dell’interfaccia della macchina fotografica (Marvell AP102) • SDRAM DDR2 512 megabit (Hynix H5PS5162FF) Nella scheda B: • Due CMOS Rail-to-Rail amplificatore d’uscita a basso costo (Analog Devices AD8694) • Un campionatore e convertitore A/D 8 bit ad 8 canali, con interfaccia 12C (TI ADS7830I) • Allegro Microsystems A3906 • Una memoria Flash 1Mb x 8 oppure 512Kb x 16 (ST Microelectronics M29W800DB) • Un processore d’immagini Soc Sensor (PrimeSense PS1080-A2) Infine le schede C e D mostrano una scheda che dispone di un controller audio USB frontale e centrale (TI TAS1020B) ed infine sul lato sinistro della scheda si può vedere un accelerometro (Kionix MEMS KXSD9) che probabilmente è utilizzato come stabilizzatore d’immagine. Un’ultima cosa importante è il cavo USB proprietario che la periferica Microsoft usa per collegarsi alle normali console. 24 Questo cavo potrebbe non essere riconosciuto dai sistemi operativi su PC, ma ci sono due alternative. La soluzione più semplice è utilizzare un adattatore che di norma viene venduto con il Kinect che Microsoft inserisce nella confezione per questioni di compatibilità con le prime versioni delle console XBOX 360. La seconda soluzione è costruire un adattatore ad hoc. Come funziona Il kinect può essere suddiviso fondamentalmente in tre macrogruppi di funzioni ben distinti: il monitoraggio dei movimenti (quindi la funzione di analisi video), il riconoscimento vocale e il motore direzionale. Questi tre gruppi verranno brevemente descritti ponendo però maggior enfasi sulle funzionalità dell'analisi video dato che è quella che verrà studiata e testata su questa tesi. Il monitoraggio dei movimenti La funzione di analisi video del Kinect è eseguita dalle due telecamere (descritte precedentemente), la VGA e la IR. La prima cosa che la periferica effettua in ambito di gioco è il riconoscimento del giocatore, ovvero il riconoscimento del corpo umano, ciò si svolge tramite l'utilizzo di una mappa di profondità, questa mappa crea un'immagine in tonalità di grigio che colora i pixel in maniera più chiara o più scura a seconda della vicinanza dell'oggetto, l'immagine sottostante rende l'idea di ciò che dovrebbe risultare. 25 Per ottenere quest'immagine il Kinect inonda l'ambiente con il proiettore infrarossi, questi infrarossi verranno riflessi e una telecamera IR raccoglie le informazioni, queste informazioni verranno poi lavorate con dei filtri per riconoscere i corpi umani e selezionarli evitando di coinvolgere oggetti inanimati, fondamentalmente questi filtri si basano sulle linee guida del fatto che un uomo avrà un'altezza media, due gambe, due braccia e una testa. Inoltre il sistema, dopo aver tracciato uno scheletro della figura ha in memoria più di 200 posizioni che potrebbero impedire il riconoscimento della persona in modo da non perdere il traking. L'immagine successiva è uno scatto effettuato con una fotocamera in una delle prime fasi di sperimentazione e rende bene l'idea del pattern di infrarossi. 26 Il riconoscimento vocale La seconda funzionalità importante è il riconoscimento vocale. Come già accennato in precedenza Il Kinect ha un array di microfoni e di riproduttori di suoni per permettere al giocatore di dare comandi vocali al dispositivo, il sistema è stato progettato per essere in grado di riconoscere voci a distanza di dieci metri, i riproduttori di suoni vengono utilizzati per effettuare una scansione audio dell'ambiente circostante e quindi effettuare calibrazioni per eliminare eventuali rumori di fondo. Una volta effettuata la calibrazione il sistema 27 lavora insieme alla telecamera per cercare di prendere solo i suoni creati dal giocatore e non da altre fonti intorno a lui. Il motore direzionale Il Kinect è dotato anche di un motore direzionale che permette al dispositivo di muoversi in verticale con una estensione angolare di circa trenta gradi. Questo dispositivo è stato installato per permettere al sensore di adattarsi ai diversi ambienti (le case europee sono differenti dalle case americane come da quelle orientali), in questa maniera il Kinect può individuare la posizione migliore per l'analisi del corpo. Il sensore di profondità Verranno spese alcune parole in più a riguardo del sensore di profondità dato che è proprio questa parte del dispositivo che verrà presa in analisi in questo progetto. Il principio di funzionamento del sensore di profondità del Kinect si basa sull'utilizzo della luce strutturata a pattern. La differenza fondamentale tra questo dispositivo ed uno scanner professionale però risiede nel fatto che il Kinect non utilizza un emettitore di luce ed un sensore ottico ma bensì un emettitore di infrarossi ed una fotocamera sensibile agli infrarossi, ovvero due dispositivi nettamente più economici rispetto ai precedenti. Come è stato accennato nei precedenti capitoli questo tipo di sensore sfrutta la distorsione provocata da superfici irregolari di un pattern di luce. Nonostante normalmente si utilizzino linee 28 parallele il pattern generato dal Kinect è un insieme di punti luminosi che lo fanno apparire come un celo stellato. Per questioni di visualizzazione l'immagine precedente presenta solo una porzione del pattern originale ma non è necessario presentare il completo dato che l'immagine completa è una ripetizione di un pattern più piccolo, l'immagine precedete ad esempio è un 2X2 il che vuol dire che contiene 4 immagini ripetute del pattern di base. Il Kinect, oltre ad utilizzare la distorsione del pattern di luce combina insieme anche altre de tecniche che vengono utilizzate nella computer vision: “depth from focus” e “depth from stereo”. L'insieme di queste tre tecniche porta alla stima della 29 distanza dal sensore che, secondo quanto affermato dalla casa produttrice ha un errore che non supera il centimetro anche se non sono mai state fatte delle misurazioni. Depth from focus Questa tecnica deriva da un concetto di ottica che misura al tolleranza di posizionamento del piano dell'immagine (piano della pellicola fotografica) rispetto alla lente. Fondamentalmente si basa sul fatto che un'immagine è piu sfocata quanto più è distante. La profondità può essere calcolata secondo questa formula: t=2Nc v F dove t è la profondità, N è il rapporto focale delle lenti, c è il cerchio di sfocatura (in pratica misura la distorsione di un'immagine puntiforme proveniente da una lente non nel fuoco), v è la distanza dell'oggetto e F è la lunghezza focale. Il Kinect sfrutta e migliora questo principio mettendolo in pratica in una maniera molto efficiente. Il Kinect utilizza una speciale lente astigmatica che ha una differente lunghezza focale lungo l'asse X e lungo l'asse Y. Il pattern proiettato dal Kinect è cosi particolare anche per sfruttare questo principio, i puntini (cerchietti) proiettati si deformano in piccole ellissi la quale orientazione dipende per l'appunto dalla profondità. L'immagine seguente potrebbe risultare semplicisticama rende bene l'idea di come il Kinect sfrutta questo fenomeno. 30 Depth from stereo Il principio utilizzato in questa tecnica deriva da un principio di parallasse. L'idea principale si basa sul fatto che se si osserva per esempio una stanza e si fa una foto dopodiché spostandosi si effettua un'altra foto, si ha l'impressione che gli oggetti più vicini si siano spostati molto di più rispetto agli oggetti più lontani. Questo principio è utilizzato dal cervello umano per percepire le distanze, ovvero sfruttando le due immagini degli occhi che osservano da due posizioni differenti. Da come è stato descritto è facile dedurre che questo fenomeno può avvenire o in caso di un movimento di un osservatore, oppure nel caso in cui l'osservatore ha a disposizione due o più punti di osservazione in contemporanea. 31 Il Kinect utilizza questo principio in maniera rivisitata, e, come è ovvio che sia, sfrutta il pattern di punti creato. Prima di passare alla spiegazione, per comprendere meglio, è importante notare la distanza tra l'emettitore di infrarossi e l'osservatore, ideologicamente sarebbe stato molto più logico posizionarli il più vicino possibile appunto per evitare errori dovuti alla distanza, invece tra i due sono disposti diversi componenti. Il Kinect sfrutta per l'appunto la distanza tra l'emettitore di infrarossi e la telecamere IR, che è nota, per calcolare la profondità tramite la parallasse. Abbiamo prima però specificato che la parallasse può avvenire solo nel caso in cui l'osservatore si sposta o si stia osservando usando una coppia di sensori riceventi; in questo caso il Kinect sfrutta il pattern di punti che è noto a priori combinato con la distanza generatore-osservatore. In poche parole più l'oggetto è lontano più il punto è osservato vicino a dove è proiettato, più 32 l'oggetto è vicino più il punto sarà distante da dove è stato proiettato, ciò avviene confrontando l'immagine tratta dal generatore di punti con l'immagine reale del pattern. Software del Kinect Le librerie ufficiali Come abbiamo accennato in precedenza i driver per il Kinect uscirono in via non ufficiale nel dicembre del 2010, da quella data la Microsoft ha notato che molti gruppi di programmatori e ricercatori si sono interessati allo sviluppo di applicazioni per il dispositivo. Avendo fiutato una buona opportunità di crescita la Microsoft ha deciso nel luglio del 2011 di rilasciare i driver e le SDK (Software Development Kit) ufficiali. Il Software Development Kit ufficiale fornisce una libreria in recuperare e gestire i flussi di dati provenienti dai grado di sensori del dispositivo e può essere utilizzata sia in C++ che in uno dei linguaggi Managed del Framework .NET. Le librerie ufficiali Microsoft sfruttano le librerie grafiche DirectX quindi sono librerie limitate al solo utilizzo in Windows, nonché sono limitate da una licenza d'uso che permette il libero sviluppo di applicazioni ma che ne blocca la commercializzazione e la distribuzione, ciò probabilmente è stato fatto per permettere alla Microsoft di selezionare possibili candidati per lavorare a future applicazioni Microsoft per Windows 8, difatti la Microsoft stessa 33 ha organizzato concorsi on-line che premiavano l'applicazione migliore. Ciò non deve assolutamente preoccupare dato che dalla comparsa dei Driver non ufficiali interi gruppi di programmatori hanno avviato progetti di sviluppo sul Kinect con relativo rilascio di Librerie che pereemttessero al dispositivo di funzionare con altri sistemi operativi e con altre licenze. Le librerie non ufficiali Attualmente ci sono tre progetti interessanti che si stanno sviluppando parallelamente e che consentono di accedere a tutte (o quasi) le funzionalità del dispositivo: LCNUI, OpenNI e OpenKinect. LCNUI è la prima libreira che è stata resa disponibile su windows e permette il controllo del motore, dei microfoni e naturalmente ricevere le immagini riprese dalle telecamere. Il vantaggio di questa libreria è che è molto semplice da usare, si usa c#, ma non contiene nessuna API per il riconoscimento di immagini e quindi è necessario utilizzare un framework specifico come OpenCV di intell o Aforgenet. Sono due ottime librerie e il popolo della rete afferma che è relativamente facile riconoscere i movimenti. La seconda soluzione, OpenNI, l’ultima resa pubblica in ordine di tempo, oltre a permettere di muovere il Kinect e catturare le immagini, offre una libreria molto avanzata chiamata NITE per il riconoscimento delle mani e del corpo della persona. Questa libreria è stata resa disponibile in beta gratuita da Primesense, 34 cioè la società che ha sviluppato Kinect. Da notare che nonostante sia l'ultima libreria uscita è una delle più sfruttate e ha a disposizione una gran quantità di piccoli programmi da usare come base di partenza per la creazione di software più evoluti. La terza soluzione, OpenKinect, è la prima in assoluto a essere stata sviluppata inizialmente su Linux, su cui funziona molto bene, e successivamente portata su windows tramite i driver Zephod. Purtroppo il porting su Windows è ancora molto incompleto e nonostante gli esempi disponibili sul sito funzionino, sono state riscontrate molte difficoltà a compilare le librerie e i progetti. Le tabelle che seguono fornisce una breve descrizione tecnica delle librerie descritte. LCNUI Licenza BSD Sistema Operativo Windows Linguaggi di programmazione C, C++, C# OpenNI Licenza GNU Lesser General Public License (LGPL) Sistema Operativo Windows, Linux (Ubuntu 10.10), OSX Linguaggi di programmazione Java, C, C++, C# 35 OpenKinect Licenza GNU General Public License (GPL2) o Apache 20 Sistema Operativo Windows, Linux (Ubuntu 10.10), OSX Linguaggi di programmazione Java, C, C++, C# , Python La nostra scelta Per sviluppare questa Tesi è stato deciso di lavorare con le librerie OpenNI. Vi sono diverse motivazioni per aver fatto questa scelta, innanzitutto questa libreria permette di lavorare e sviluppare software per il Kinect con diversi linguaggi di programmazione tra cui il Java (che verrà appunto utilizzato nello sviluppo di questa tesi), possiede una licenza di libero utilizzo del tipo GNU LGPL e sopratutto sono ben documentate ed in continua fase di sviluppo e sono supportate persino dall'azienda sviluppatrice del Kinect, La PrimeSense. 36 Un altro fattore importante che ha influenzato questa scelta è la possibilità di utilizzare queste stesse librerie con uno strumento simile al Kinect sviluppato però dall'Asus. In questa pagina web si può vedere la gamma di prodotti offerta dall'Asus http://www.asus.it/Multimedia/Motion_Sensor I due principali sono l'Xtion PRO e l'Xtion PRO Live, il primo è dotato solo del sensore di profondità mentre il secondo ha a disposizione anche la fotocamera RGB. Questi prodotti sono nati sull'onda dei prodotti per Kinect e vengono utilizzati per lo più da sviluppatori. Non si conosce ancora ne il prezzo ne le potenzialità ma per chiunque volesse utilizzare i suddetti strumenti con le librerie OpeNI, basterà seguire le procedure di installazione descritte nel prossimo capitolo sostituendo al posto dei driver Kinect i driver dell'Asus. 37 38 Gli strumenti utilizzati Al fine di sviluppare questa Tesi sono stati utilizzati svariati programmi e strumenti atti alla creazione dei software e delle misure effettuate. Verranno descritti brevemente il sistema operativo, le librerie e gli ambienti di sviluppo utilizzati. Sempre all'interno di questo capitolo verrà descritta la modalità di installazione di tutti questi componenti al fine di permettere al lettore di eseguire immediatamente l'installazione senza perdersi in ricerche sul web. Da notare il fatto che tutti gli strumenti utilizzati sono totalmente gratuiti e reperibili nel web, la spesa sostenuta corrisponde al solo prezzo del computer e del Kinect. L'ambiente Ubuntu Iniziamo la lista degli strumenti con il sistema operativo Utilizzato. Ubuntu è un sistema operativo GNU/Linux nato nel 2004, basato su Debian, che si focalizza sull'utente e 39 sulla facilità di utilizzo. Ubuntu è orientato all'utilizzo desktop e pone una grande attenzione al supporto hardware. È prevista una nuova versione ogni sei mesi. Finanziato dalla società Canonical Ltd (registrata nell'Isola di Man), questo sistema è pubblicato come software libero sotto licenza GNU GPL ed è quindi gratuito e liberamente modificabile. L'ideatore dell'iniziativa è Mark Shuttleworth, un giovane imprenditore sudafricano diventato sostenitore del software libero al cui servizio ha posto le sue risorse. Ubuntu, infatti, prende il nome da un'antica parola africana (zulu, ma anche xhosa) che significa "umanità verso gli altri", oppure "io sono ciò che sono per merito di ciò che siamo tutti". Il 1º luglio 2005 è nata la Fondazione Ubuntu con un fondo iniziale di 10 milioni di dollari USA, il cui scopo è lo sviluppo della distribuzione nel caso in cui Canonical Ltd dovesse cessare le attività. La fondazione è al momento dormiente. Ubuntu è una distribuzione Linux basata sull'ambiente desktop GNOME e l'interfaccia utente Unity. È progettata per fornire un'interfaccia semplice, intuitiva e allo stesso tempo completa e potente. I punti di forza di questa distribuzione sono l'estrema semplicità di utilizzo, l'ottimo riconoscimento e supporto dell'hardware, il vasto parco software costantemente aggiornato e una serie di strumenti di gestione grafici che la rendono improntata verso l'ambiente desktop. È corredata da un'ampia gamma di applicazioni amministrazione del libere. sistema, Esistono ed è vari possibile strumenti di gestirli sia separatamente che in maniera centralizzata con l'Ubuntu 40 Control Center, paragonabile al pannello di controllo Windows o al Mandriva Linux Control Center o a YaST di OpenSUSE. La versione desktop è stata realizzata per rispondere alle più frequenti necessità di un utente medio, quali navigazione in Internet, gestione dei documenti e delle immagini, svago e comunicazione. La versione installata è la versione più recente ovvero la 12.04 Le Librerie OpenNI e NITE L'organizzazione OpenNI (Open Natural Interaction) è un'organizzazione No profit che incentra il proprio lavoro sul la certificazione e lo sviluppo di interfacce utente naturali, quindi sullo studio e sviluppo di dispositivi atti a migliorare l'interoperabilità uomo macchina. L'organizzazione fu creata nel Novembre del 2010 con l'uscita del sito web al publico l'8 dicembre. Uno dei principali membri del progetto è la PrimeSense. Il sito Internet relativo al progetto contiene le API della libreria che permettono di muoversi con facilità tra le varie classi e metodi. Per il riconoscimento delle mani e del corpo OpenNI sfrutta una libreria chiamata NITE.Il sito internet relativo a questo progetto è il seguente: http://openni.org/ All'interno è presente tutta la documentazione e i file sorgente di queste librerie. 41 Le librerie Java3D Queste librerie sono state sviluppate per la gestione di ambienti tridimensionali in java, sono librerie gratuite e facilmente scaricabili e installabili dal sito della SUN: http://www.oracle.com/us/sun/index.htm Queste librerie permettono la manipolazione di spazi 3D con oggetti geometrici o semplici punti. Eclipse Eclipse è sviluppo un ambiente integrato di multi- linguaggio e multipiattaforma. Ideato da un consorzio di grandi società quali Ericsson, HP, IBM, Intel, MontaVista Software, QNX, SAP e Serena Software, chiamato Eclipse Foundation sullo stile dell'open source. Eclipse può essere utilizzato per la produzione di software di vario genere, si passa infatti da un completo IDE per il linguaggio Java (JDT, "Java Development Tools") a un ambiente di sviluppo per il linguaggio C++ (CDT, "C/C++ Development Tools") e a plug-in che permettono di gestire XML, Javascript, PHP e persino di progettare graficamente una GUI per un'applicazione JAVA (Eclipse VE, "Visual Editor"), rendendo di fatto Eclipse un ambiente RAD. 42 Il programma è scritto in linguaggio Java, ma anziché basare la sua GUI su Swing, il toolkit grafico di Sun Microsystems, si appoggia a SWT, librerie di nuova concezione che conferiscono ad Eclipse un'elevata reattività. La piattaforma di sviluppo è incentrata sull'uso di plug-in, delle componenti software ideate per uno specifico scopo, per esempio la generazione di diagrammi UML, ed in effetti tutta la piattaforma è un insieme di plug-in, versione base compresa, e chiunque può sviluppare e modificare i vari plug-in. Nella versione base è possibile programmare in Java, usufruendo di comode funzioni di aiuto quali: completamento automatico ("Code completion"), suggerimento dei tipi di parametri dei metodi, possibilità di accesso diretto a CVS e riscrittura automatica del codice (funzionalità questa detta di Refactoring) in caso di cambiamenti nelle classi. Essendo scritto in Java, Eclipse è disponibile per le piattaforme Linux, HP-UX, AIX, Mac OS X e Windows. Procedure di Installazione In questa sezione verrà descritta la procedura di installazione dei vari strumenti utilizzati, tutto ciò verrà spiegato accuratamente perché l'installazione della periferica Kinect e le relative librerie può risultare abbastanza macchinosa data l'assenza di guide ufficiali o di driver pre installati. Ovviamente la descrizione si incentrerà sopratutto nella parte relativa alla 43 periferica, riguardo agli altri elementi si spenderanno molte meno parole data la facilità e l'intuitività di installazione. Ubuntu L'installazione del sistema operativo è molto semplice e rapida dato che, con la nuova versione, la procedura è quasi totalmente automatizzata. Innanzitutto bisogna procurarsi il cd di installazione, per fare ciò basta recarsi nella pagina web www.ubuntu.it da dove si può o ordinare il CD (solitamente questo lo fanno gli estimatori di questo sistema operativo che amano avere la collezione di cd originali di tutte le distribuzioni) pagando le spese di spedizione ed una simbolica piccola cifra di contributo, oppure scaricandolo direttamente e gratuitamente dal sito internet specificando anticipatamente l'architettura del proprio computer e la versione di Ubuntu che si desidera. Dopo aver scaricato la versione desiderata basterà trascrivere l'immagine del disco su un CD, impostare il boot loader dando priorità al lettore dischi, inserire il disco, spegnere e riaccendere il computer. Automaticamente partirà la procedura di installazione che in pochi semplici passi permetterà l'installazione del sistema o l'utilizzo dello stesso dal supporto ottico. La procedura di installazione è molto semplice e basta impostare la lingua ed il fuso orario per procedere. Particolarità di Ubuntu è il fatto che permetta all'utente di decidere se partizionare il proprio disco in modo da avere il sistema operativo originale e quello nuovo conviventi nello 44 stesso computer oppure se si vuole formattare tutto e avere a disposizione il solo Ubuntu. OpenNI Nei prossimi tre paragrafi verrà illustrata nel dettaglio l'istallazione delle librerie OpenNi e NITE e i driver del dispositivo Kinect. Questa procedura sarà esplicata passo dopo passo dato che può risultare abbastanza macchinosa e laboriosa. Per prima cosa bisogna entrare nel Terminale del sistema operativo dove poi inseriremo tutti i comandi relativi all'installazione. Una volta entrati nel Terminale si procederà scaricando tutto il necessario e installando le dipendenze. Il primo comando da inserire è il seguente: sudo apt-get install git-core cmake libglut3-dev pkg-config gcc g++ build-essential libxmu-dev libxi-dev libusb-1.0-0-dev doxygen graphviz git Dopo questo comando il sistema potrebbe rispondere con il problema “libglut3-dev cannot be installed”ovvero che il sistema operativo ci dice che non possiamo installare libglut3, in tal caso si installa al suo posto “freeglut” con: sudo apt-get install git-core cmake freeglut3-dev pkg-config gcc g++ build-essential libxmu-dev libxi-dev libusb-1.0-0-dev doxygen graphviz git procediamo creando la directory di lavoro: mkdir ~/kinect 45 cd ~/kinect Scaricare dentro la cartella l'ultima versione di OpenNI: git clone https://github.com/OpenNI/OpenNI.git quella appena scaricata è la versione Stable, nel caso di questa Tesi è stata utilizzata la versione Unstable che si ottiene inserendo cd OpenNI git checkout unstable Se tutto va per il verso giusto dovrebbero apparire le seguenti righe di conferma Branch unstable set up to track remote branch unstable from origin. Switched to a new branch ‘unstable’ Nel caso non avesse funzionato si puo provare con cd OpenNI git branch unstable git checkout unstable git pull origin unstable Passiamo ora all'installazione vera e propria. Inserire: cd Platform/Linux/Build make && sudo make install 46 Potrebbe comparire un problema con il seguente comando, il sistema potrebbe rispondere dicendo che javac non è stato trovato javac -d x64-Release ../../../../../Wrappers/OpenNI.java/src/org/OpenNI/*.java /bin/sh: javac: not found make[1]: *** [../../../Bin/x64-Release/org.OpenNI.jar] Errore 127 make[1]: uscita dalla directory “/home/sparazza/kinect/OpenNI/Platform/Linux/Build/Wrappers/OpenNI.jav a” make: *** [Wrappers/OpenNI.java] Errore 2 In questo caso si risolve installando al seguente dipendenza sudo apt-get install openjdk-7-jdk Dopodiché ripetere il comando make && sudo make install Nel caso in cui il sistema continui a dare errori, questa volta negando il permesso di accedere al file RedistMaker. /bin/sh: ./RedistMaker: Permission denied /home/sparazza/kinect/OpenNI/Platform/Linux/Build cd ../Redist; ./install.sh; cd cd: 1: can’t cd to ../Redist /bin/sh: ./install.sh: not found 47 install.sh e a /home/sparazza/kinect/OpenNI/Platform/Linux/Build Si risolve con cd ../CreateRedist sudo chmod +x install.sh RedistMaker cd ../Build Dopodiché occorre nuovamente rilanciare make && sudo make install Nel caso in cui dovesse continuare ad avere problemi occorrerà spostare i file necessari sudo cp -r ../Redist/OpenNI-Bin-Dev-Linux-x64-v1.5.2.7/* ../Redist/ Sostituendo OpenNI-Bin-Dev-Linux-x64-v1.5.2.7 con la versione presente dentro la cartella Redist (prestare attenzione al nome del file dato che in questo esempio la versione è la 1.5.2.7 ma ovviamente la versione nuova sarà già cambiata). Rilanciare make && sudo make install Quando finalmente comparirà la scritta *** DONE *** l'installazione di OpenNI sarà completa Driver Kinect Per installare i Driver, sempre da Terminale, tornare nella cartella di lavoro e scaricare l'ultima versione 48 cd ~/kinect/ git clone https://github.com/avin2/SensorKinect cd SensorKinect git checkout kinect Procedere con l'installazione dei Driver cd Platform/Linux/Build/ make && sudo make install Il sistema potrebbe di nuovo ottenere problemi come per l'installazione precedente cd ../CreateRedist; ./RedistMaker; cd /bin/sh: ./RedistMaker: Permission denied /home/sparazza/kinect/SensorKinect/Platform/Linux/Build cd ../Redist; ./install.sh; cd cd: 1: can’t cd to ../Redist /bin/sh: ./install.sh: not found La soluzione ovviamente sarà simile alla precedente cd ../CreateRedist sudo chmod +x install.sh RedistMaker cd ../Build E rieseguire make && sudo make install 49 Nel caso in cui si incappasse nuovamente nel seguente problema cd ../Redist; ./install.sh; cd /bin/sh: ./install.sh: not found Si procederà con lo spostamento dei file necessari sudo cp -r Sostituendo ../Redist/Sensor-Bin-Linux-x64-v5.1.0.25/* Sensor-Bin-Linux-x64-v5.1.0.25 con ../Redist/ la versione installata (come nel caso precedente prestare attenzioni alle versioni dei file). Ripetere make && sudo make install Alla fine della procedura si otterrà *** DONE *** Dopo di ciò l'installazione dei Driver e delle librerie OpenNI sarà completa, a questo punto si potrà collegare il Kinect al computer, il led verde lampeggiante sarà il segnale della riuscita dell'operazione. Nel caso si volesse testare il Kinect la libreria OpenNI contiene dei piccoli programmini di prova che possono essere lanciati come ad esempio cd ~/kinect/OpenNI/Platform/Linux/Bin/x64-Release/ ./NiViewer Il risultato di questo comando è dato dalla seguente immagine 50 per eseguire gli altri programmi contenuti nella cartella x64release basterà inserire il comando ./ seguito dal nome del programma. NITE Come detto in precedenza per sfruttare il Kinect al massimo si avrà bisogno anche delle librerie NITE che contengono il riconoscimento della figura umana e delle mani. L'installazione si esegue procurandosi i file necessari dal sito http://www.openni.org/Downloads/OpenNIModules.aspx selezionare: 1. OpenNi Complian Middleware Binaries 2. Stable 3. Primesense NITE Stable Build for Ubuntu 10.10 51 Ovviamente controllare prima l'architettura del computer (32 o 64 bit) e scaricare la versione apposita. La figura seguente dovrebbe rendere l'idea di come fare Dopo aver scaricato tutto il necessario bisognerà creare una cartella con nome “Nite” all'interno della cartella “Kinect” Il path completo è il seguente ~/kinect/Nite Prima di procedere all'installazione vera e propria occorrerà inserire la giusta chiave di licenza in alcuni suoi file XML. Per fare ciò bisognerà eseguire i comandi di apertura dei suddetti file cd ~/kinect/Nite/Data 52 chmod 777 Sample-Scene.xml Sample-Tracking.xml Sample-User.xml gedit Sample-Scene.xml Sample-Tracking.xml Sample-User.xml Individuare nei file il punto in cui è scritto <License vendor=”PrimeSense” key=”insert key here”/> e sostituire dove è scritto “insert key here ” la seguente chiave: “0KOIk2JeIBYClPWVnMoRKn5cdY4=” Alla fine la stringa dovrebbe comparire cosi: <License vendor=”PrimeSense” key=”0KOIk2JeIBYClPWVnMoRKn5cdY4=”/> Questa operazione dovrà essere eseguita per tutti e tre i file aperti. Adesso si potrà procedere con l'istallazione eseguendo i seguenti comandi cd ~/kinect/Nite/ sudo ./install.sh Nel caso in cui venisse chiesta la chiave basterà copiare e incollare 0KOIk2JeIBYClPWVnMoRKn5cdY4= Come nel caso delle librerie OpenNI anche Nite ha una serie di esempi da poter lanciare, basterà entrare nella cartella Release con il seguente comando cd ~/kinect/Nite/Samples/Bin/Release e eseguire il file ponendo ./ seguito dal nome del file. 53 Java 3D Queste librerie sono nate per implementare funzioni di grafica 3D nel linguaggio JAVA. L'installazione è molto meno laboriosa delle precedenti librerie. Per prima cosa scaricare la versione più recente delle librerie dal seguente URL: http://www.oracle.com/technetwork/java/javase/tech/index-jsp138252.html Dopodiché bisognerà inserire il file scaricato dentro il seguente path usr/java/jdk1.6.0_01/jre Il path potrebbe essere differente a seconda della versione JDK posseduta. In conclusione basterà andare dal terminale e digitare cd /usr/java/jdk1.6.0_01/jre sudo sh /path-to-download-files/java3d-1_5_1-linux-i586.bin Le librerie verranno installate. Eclipse Per completezza verrà spesa qualche parola riguardante l'installazione di Eclipse che è terribilmente semplice e rapida. Basterà accedere all'Ubuntu Software Center, digitare il nome eclipse nell'apposito riquadro di ricerca e confermare l'installazione, il sistema richiederà l'inserimento della password e subito dopo installerà il software. 54 Il progetto In questo Capitolo si entrerà approfonditamente nella descrizione del progetto sviluppato per questa Tesi di laurea, si analizzeranno nella prima parte gli obiettivi che si vogliono raggiungere e le possibilità che si hanno, in seguito si illustreranno nel dettaglio i software che sono stati sviluppati per verificare la sensibilità ed il margine di errore del Kinect, e i software creati per verificare un possibile sviluppo di prodotto da utilizzare in ambito medico e non solo. Obiettivi del progetto Introduzione Dopo l'uscita del dispositivo Kinect sul mercato sono partiti diversi progetti basati sulle grandi potenzialità di questo prodotto, sono state fatte anche molte ipotesi sui possibili sviluppi futuri nei più differenti campi di utilizzo (dal campo medico a quello militare). La possibilità che offre il kinect di riconoscere figure umane e gesti può tornare utile nella creazione di sistemi di allarme intelligenti o nei programmi di assistenza. L'obiettivo di questo progetto si basa sulla verifica delle capacità di calcolo e di misurazione di questo strumento per verificare se 55 è possibile utilizzarlo in futuro per effettuare misurazioni mediche. L'idea alla base del progetto nasce dalla possibilità di utilizzare il Kinect in ausilio alle normali strumentazioni mediche per migliorare il lavoro e la permanenza di medici e pazienti, un esempio molto interessante è la possibilità di utilizzare la cattura di alcuni movimenti base, come per esempio il movimento della mano, per far eseguire ad alcuni dispositivi semplici operazioni. Tutto ciò può essere sfruttato come assistenza ad anziani o a pazienti di corsia ma anche come strumento per chi lavora in ambienti sterili che non può adoperare assolutamente strumenti non precedentemente sterilizzati e non sterilizzabili (come per esempio mouse e tastiera). Vi sono anche progetti in via di sviluppo, nati in differenti università del mondo, che comprendono l'utilizzo del Kinect nelle sale operatorie per permettere al medico di poter visualizzare immagini relative ai pazienti con il solo utilizzo delle mani. 56 Sintesi del progetto Il progetto si basa sulla possibilità di effettuare misurazioni di pazienti tramite il kinect per poter prendere le misure fisiche del soggetto con una determinata precisione. Fondamentalmente si vuole creare una scansione del busto di un paziente a tre dimensioni su cui poi si potrà ad andare ad effettuare le possibili misurazioni. Questo tipo di progetto chiede di essere un preambolo per un possibile sviluppo futuro in cui un medico, un fisioterapista o anche un nutrizionista possano conservare le diverse scansioni fatte ai pazienti nel corso del tempo per poi poter visualizzare, oltre alle misure del busto del paziente, anche le differenze e i cambiamenti fisici che hanno avuto i pazienti nel corso degli anni che possono essere crescite o decrescite muscolari o adipose. Una volta effettuata la scansione un futuro software potrà andare a calcolare le dimensioni del torace e delle varie zone di interesse, nonché anche un calcolo dei volumi che unito alla misurazione del peso potrà restituire la disposizione delle varie masse all'interno del corpo. Un software di questo tipo potrebbe tornare utile oltre che in campo medico anche in ambito sportivo andando a visualizzare i miglioramenti muscolari ottenuti da un'atleta, oppure nella produzione di vestiario andando a prendere le misure esatte di un modello o di un possibile cliente. Nel nostro caso questo progetto si sviluppa in due grosse sezioni, la prima in cui verrà sviluppato un algoritmo per 57 effettuare una scansione tridimensionale del corpo o di altri oggetti, la seconda in cui si effettueranno delle sperimentazioni per verificare l'effettiva capacità di misurazione del Kinect. L'attuale stato dell'arte Attualmente le misure effettuate da un medico o da un fisioterapista sono eseguite manualmente tramite un metro a nastro flessibile. Questo strumento è molto utile e versatile data la sua flessibilità, se andassimo a considerare le caratteristiche di ogni strumento di misura possiamo considerare che uno strumento di questo genere ha le seguenti caratteristiche: • Sensibilità: 1mm • Portata: 1500 o 2000 mm (a seconda del modello) • Incertezza: ±1mm L'incertezza, se non viene specificata dal produttore, normalmente è pari alla sensibilità dello strumento e non viene mai calcolata con misure al di sotto della sensibilità dello stesso (effettivamente non avrebbe senso). Preso dalle sue caratteristiche questo oggetto sembra avere delle ottime caratteristiche di misurazione ed effettivamente è cosi. Il problema nasce nel momento in cui si va ad effettuare misure sul corpo umano tramite lo stesso. Un medico solitamente effettua la misurazione avvolgendo il metro intorno 58 al torace o all'addome del paziente riportando una misura non al di sotto del centimetro, considerando solo questo possiamo dare un'incertezza a questa misura pari per l'appunto alla sensibilità della misura stessa, ovvero di un centimetro. Per avere dei dati certi sull'incertezza della misura bisognerebbe utilizzare un busto rigido artificiale e far effettuare la stessa misurazione da un campione di N medici differenti per poi poter effettuare i dovuti calcoli. Anche cosi le misurazioni non potrebbero essere considerate veritiere dato che, nel secondo caso, non si considera affatto la respirazione del paziente. L'unica cosa che possiamo dire con certezza è che una misurazione di questo tipo è affetta da un minimo di 1cm d'errore. La nostra proposta L'idea è quella di sostituire questo metodo di lavorazione del medico con un dispositivo economico e poco ingombrante che funzioni semplicemente ponendo il paziente all'interno dell'area di lavoro del Kinect e in pochi secondi restituisca la scansione del corpo. Automaticamente il sistema dovrebbe calcolare tutti i valori necessari al lavoro del medico (per esempio la larghezza del torace), e potrebbe oltretutto restituire altri valori come il volume del corpo misurato. Oltre ciò il medico potrà usufruire di un database di scansioni dei vari pazienti per effettuare scansioni future. 59 Ovviamente tutto ciò dovrà avere una precisione maggiore rispetto agli attuali metodi di misurazione, quindi si parlerà di misurazioni all'ordine del millimetro. Per verificare se questo prodotto potrà o meno sostituire gli attuali metodi verranno effettuate sperimentazioni e misure per verificare l'errore. 60 Prestazioni del Kinect In questo capitolo verranno illustrati gli esperimenti e le misurazioni effettuati per calcolare e comprendere quale sia il grado di errore del sensore Kinect. Si descriverà esperimenti e brevemente di seguito come sono verranno stati descritti effettuati i risultati gli e commentati a dovere per cercare di individuare il punto di misurazione ottimo e l'errore riscontrabile. Descrizione dell'esperimento I valori della mappa di profondità Tramite l'utilizzo di alcuni programmi d'esempio forniti con le librerie OpenNI si è potuto visualizzare il segnale restituito dal sensore di profondità. 61 Come si può vedere l'immagine non risulta perfettamente delineata ma appare con un contorno frastagliato, il programma preso in esempio restituisce in video tutto ciò che viene catturato dal sensore di profondità, quello che non si può vedere da questa foto è che nel video l'immagine appare tremolante, come se alcuni pixel cambiassero il loro valore con il prolungarsi dell'esposizione. La domanda che sorge visualizzando quest'immagine è di quanto ogni pixel cambia il proprio valore di profondità e a quanto ammonta questo errore? La Microsoft rimedia a questa cosa filtrando l'immagine del Kinect con delle figure umane impostate che comprendono varie forme fisiche (per esempio alto o basso, magro o grasso, muscoloso o mingherlino). 62 Per verificare la precisione del calcolo eseguita dal Kinect bisogna innanzitutto capire di che forma sono e come sono memorizzati i valori del campo di profondità. La libreria OpenNi offre una classe chiamata “ DepthGenerator” che effettua la cattura dei valori della mappa di profondità e che può essere manipolata attraverso i suoi metodi. In particolare andiamo a considerare il metodo “getMetaData()” che restituisce un oggetto del tipo MetaData, i valori appartenenti a questo oggetto possono essere manipolati o per creare immagini e video come l'esempio precedente, oppure profondità, nel per secondo restituire caso i valori utilizziamo effettivi il della metodo “getData().createShortBuffer()” che restituisce un array di short di lunghezza 640*480. Questi valori sono numeri che rappresentano la distanza dal Kinect in millimetri (per esempio per un oggetto posizionato ad un metro di distanza il valore corrispondente sarà 1000). L'esperimento L'esperimento che è stato effettuato per calcolare l'errore dato dal Kinect sfrutta esattamente i valori restituiti dalla mappa di profondità. Per avere risultati significativi il Kinect è stato posto di fronte ad una parete senza oggetti ad una distanza nota, tutto ciò è stato fatto per evitare l'interferenza di oggetti di fronte alla telecamera che potrebbero infastidire la misura (il contorno dell'immagine precedente potrebbe darmi seri errori di distanza dato che il contorno non è stabile, potrebbero comparire e scomparire pixel che poi andrebbero ad infastidire le distanze effettive). 63 Tramite Eclipse si prendono due array di valori presi ad una distanza di tempo significativa l'uno dall'altro, dopodiché si crea l'array delle differenze di questi valori, in valore assoluto, e sempre tramite Eclipse è possibile calcolare il numero di pixel che variano tra uno scatto e l'altro, di quanto variano e altri valori(in seguito ogni esperimento verrà descritto nel dettaglio). Una volta compresa l'effettiva capacità del Kinect si passerà ad effettuare altre sperimentazioni con variazioni della posizione del Kinect, per poi terminare con l'ultimo esperimento che si avvalerà di un soggetto fisico. Quest'ultimo esperimento sarà molto rilevante per questo progetto dato che ci permetterà di comprendere quanto possano modificare la precisione della misurazione i movimenti involontari del corpo umano (come ad esempio la respirazione) e quindi conoscere con precisione l'errore presente nella misura e qual è la soglia di differenza massima significativa tra una misura e l'altra. Per ogni misurazione verranno presi 50 campioni di misura su cui effettuare i calcoli, qui di seguito verranno approfonditamente descritti e commentati tutti i risultati. Prove di distanza Questa prima sperimentazione è servita sopratutto a capire quanto errore c'è nella misurazione effettuata dal Kinect ma sopratutto quanto la distanza dal sensore può influenzare la misura. 64 Per visualizzare i dati ottenuti utilizzeremo delle tabelle la cui lettura verrà esplicata ora. Glossario delle tabelle La seguente tabella spiega nel dettaglio come vengono classificati e calcolati i valori calcolati. Tutti i valori sono in mm. Media Con questo termine si indica il valore medio del vettore delle differenze assolute. Err. Max Il valore massimo del vettore delle differenze assolute Err. Min Il valore minimo del vettore delle differenze assolute Media 1 Il valore medio del primo vettore catturato Media 2 Il valore medio del secondo vettore catturato 0 mm Il numero di punti che non cambiano il proprio valore di profondità tra uno scatto e l'altro <2 mm Il numero di punti che differiscono tra uno scatto e l'altro di meno di 2 mm <5 mm Il numero di punti che differiscono tra uno scatto e l'altro di meno di 5 mm <10 mm Il numero di punti che differiscono tra uno scatto e l'altro di meno di 10 mm %0 La percentuale dei punti che non cambiano il proprio valore rispetto alla totalità dei punti. %2 La percentuale dei punti che variano di meno di 2 millimetri rispetto alla totalità dei punti 65 %5 La percentuale dei punti che variano di meno di 5 millimetri rispetto alla totalità dei punti % 10 La percentuale dei punti che variano di meno di 10 millimetri rispetto alla totalità dei punti La prima prova La prima prova che è stata effettuata è risultata terribilmente fallimentare con dei risultati assolutamente pessimi. Inizialmente si è pensato che il Kinect avesse un margine di errore altissimo ma la spiegazione è risultata molto più semplice e ci ha permesso di capire qualcosa in più. La tabella seguente non contiene tutti gli elementi spiegati nel glossario dato che è stata una prima sperimentazione. 66 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Media 0 4 946 671 4 56 948 0 0 712 24 0 0 0 552 0 2 0 0 46 330 7 4 4 1 68 4 0 1372 4 213 669 4 1 684 4 758 0 957 336 3 952 2 1774 100 607 2 4 786 845 Err. Max Err. Min. 16 0 26 0 5380 0 4230 0 26 0 1690 0 1091 0 16 0 18 0 4208 0 1091 0 14 0 13 0 14 0 4202 0 14 0 997 0 20 0 17 0 4211 0 1030 0 1349 0 32 0 26 0 22 0 1014 0 27 0 20 0 5050 0 26 0 4205 0 4188 0 25 0 18 0 4194 0 22 0 4208 0 21 0 5349 0 1030 0 24 0 1085 0 28 0 7152 0 4208 0 4202 0 20 0 30 0 4208 0 1095 0 Media 1 999 998 84 468 999 964 72 1020 1021 406 1018 1021 1021 1021 522 1021 1021 1021 1021 978 692 1021 1020 1020 1022 956 1021 1022 2368 1020 835 520 1020 1021 418 1021 433 1022 65 688 1021 70 1021 2688 925 457 1021 1021 378 179 Media 2 999 999 999 999 1000 1000 1020 1021 1021 1021 1021 1021 1021 1021 1021 1021 1021 1021 1021 1022 1021 1021 1021 1021 1021 1022 1022 1022 1022 1022 1022 1022 1021 1022 1022 1022 1022 1022 1022 1022 1022 1022 1022 1022 1022 1022 1022 1022 1022 1022 0mm 243830 66608 16574 6202 65018 60802 11171 234635 229821 18590 78362 237965 235468 238817 59201 239615 219892 232696 233527 105698 152793 225260 68401 67892 211082 66344 68484 234145 19002 71223 46883 16664 75812 210846 19187 79004 11057 233405 7258 54599 92377 8412 122683 11565 70105 10972 137955 81749 10481 13004 <2mm 249574 75860 16574 6630 73537 69250 11199 237412 232327 18627 82512 240394 237968 241377 59233 242088 222196 235229 236155 110602 152805 227789 71476 71062 214148 69513 71738 236707 20960 74434 46900 16755 79467 214207 19214 82830 11124 236014 7258 54660 96022 8412 126324 11641 72747 11010 141856 85437 10526 13012 <5mm 306204 183624 20618 12557 181231 172502 18969 305001 300574 30227 210952 305328 305223 305397 80125 305560 292168 304712 305033 232255 200761 295228 176547 176673 301817 169883 179483 304952 51034 182808 117768 34104 189362 301533 30008 194710 19324 304785 12276 130817 212345 14808 240981 21813 169961 20529 254150 196428 17888 19800 Come è possibile vedere i valori risultano molto affetti da errore, La misurazione presenta un valore medio della media degli errori pari a 289 mm e una media degli errori massimi pari 1624 mm. Misure di questo tipo fanno pensare che il dispositivo non è per nulla adatto al suo scopo il che è risultato strano dato che le 67 prove sperimentali effettuate con lo scanner hanno dato risultati migliori. L'effetto particolare che ha poi svelato il “mistero” è presente nei valori successivi all'errore. Questa prova è stata effettuata ad un metro di distanza dalla parete circa ma come è possibile notare, mentre la media del secondo vettore appare avere un andamento linearmente crescente (questo effetto verrà spiegato nelle misurazioni successive) ma sempre con valori intorno ai 1000 mm, la media del primo vettore risulta avere di valori completamente irrazionali. Il seguente grafico permette di visualizzare bene la differenza che è stata ottenuta tra i valori della media 1 e i valori della Media 1 Media 2 media 2 3000 2500 2000 1500 1000 500 0 2 1 4 3 6 5 7 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 Come si evince dal grafico sembra che il secondo vettore riporti ad ogni ripetizione della misurazione dei valori quasi sempre 68 costanti mentre il primo vettore sembra quasi impazzire ogni volta che la misurazione viene ripetuta. L'ipotesi più probabile, che verificheremo con le misurazioni successive, è che il primo vettore potrebbe risultare errato forse per una mancanza di totale sincronismo dei dispositivi ricevente ed emittente all'accensione. Tutti i test successivi quindi saranno effettuati scartando il primo scatto e utilizzando il secondo e il terzo. La seconda misurazione Questa misurazione è stata effettuata prendendo in considerazione tre distanze di riferimento, sempre di fronte ad un muro. Le distanze sono all'incirca di 1m, 1,5m e di 2m. L'obiettivo e capire quanto la distanza influenza gli errori di misurazione dello strumento. Illustreremo adesso tre tabelle differenti che seguono il glossario presentato precedentemente. 69 1m: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Media 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Err. Max Err. Min. 13 0 13 0 14 0 15 0 17 0 16 0 20 0 13 3 13 0 13 0 13 0 13 0 16 0 19 0 13 0 16 0 13 0 16 0 13 0 13 0 13 0 13 0 19 0 19 0 16 0 23 0 16 0 19 0 16 0 16 0 16 0 16 0 16 0 19 0 13 0 16 0 13 0 13 0 13 0 16 0 16 0 19 0 16 0 16 0 16 0 16 0 16 0 13 0 15 0 16 0 Media 1 1001 1002 1002 1003 1003 1004 1004 1004 1004 1004 1005 1005 1005 1005 1004 1005 1005 1005 1005 1005 1005 1005 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 Media 2 1001 1002 1002 1003 1003 1004 1004 1004 1004 1004 1005 1005 1005 1005 1004 1005 1005 1005 1005 1005 1005 1005 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 Err. 0 254604 254313 252479 255252 254020 255050 255955 256713 254579 256373 255956 258058 256238 256791 252504 257166 256731 254239 257449 254812 254266 255675 255876 253813 254411 255085 254868 254222 253908 253696 254372 253745 254071 253176 254325 253172 254928 252665 252307 253733 254357 253145 252776 252223 253605 252716 252481 252237 252613 252779 Err. 2 258795 258747 256971 259667 258334 259162 259885 260738 258923 260574 260059 262058 260186 260695 257259 260821 260839 258353 261454 259106 258821 259791 260022 258415 258854 259311 259315 258735 258449 258211 258769 258247 258587 258004 258924 257701 259679 257263 256952 258424 259082 257690 257567 257005 258595 257587 257282 257393 257457 257700 Err. 5 306631 306593 306532 306580 306446 306458 306312 306533 306360 306457 306620 306682 306558 306421 306504 306481 306544 306463 306538 306300 306148 306207 306268 306166 305978 305953 305915 305975 306032 306040 306019 305927 305840 305740 305883 305898 305987 305810 305738 305646 305665 305553 305768 305681 305750 305667 305850 305672 305834 305886 Err.10 307196 307186 307179 307179 307187 307193 307183 307195 307181 307177 307194 307197 307182 307181 307186 307173 307164 307192 307163 307181 307174 307185 307178 307160 307148 307137 307162 307141 307166 307141 307169 307177 307159 307163 307185 307166 307156 307180 307164 307171 307159 307118 307118 307103 307155 307170 307166 307181 307161 307161 %0 82,88 82,78 82,19 83,09 82,69 83,02 83,32 83,57 82,87 83,45 83,32 84 83,41 83,59 82,2 83,71 83,57 82,76 83,81 82,95 82,77 83,23 83,29 82,62 82,82 83,04 82,96 82,75 82,65 82,58 82,8 82,6 82,71 82,41 82,79 82,41 82,98 82,25 82,13 82,6 82,8 82,4 82,28 82,1 82,55 82,26 82,19 82,11 82,23 82,28 %2 84,24 84,23 83,65 84,53 84,09 84,36 84,6 84,88 84,28 84,82 84,65 85,31 84,7 84,86 83,74 84,9 84,91 84,1 85,11 84,34 84,25 84,57 84,64 84,12 84,26 84,41 84,41 84,22 84,13 84,05 84,23 84,06 84,18 83,99 84,29 83,89 84,53 83,74 83,64 84,12 84,34 83,88 83,84 83,66 84,18 83,85 83,75 83,79 83,81 83,89 %5 99,81 99,8 99,78 99,8 99,75 99,76 99,71 99,78 99,73 99,76 99,81 99,83 99,79 99,75 99,77 99,77 99,79 99,76 99,78 99,71 99,66 99,68 99,7 99,66 99,6 99,59 99,58 99,6 99,62 99,62 99,62 99,59 99,56 99,52 99,57 99,58 99,61 99,55 99,52 99,49 99,5 99,46 99,53 99,51 99,53 99,5 99,56 99,5 99,56 99,57 Questa tabella mostra degli ottimi risultati sperimentali, la media dell'errore misurato è 0, questo vuol dire che la maggior parte dei pixel non variano dalla loro posizione. Lo zero ovviamente non è uno zero assoluto, non sono stati visualizzati 70 %10 100 100 99,99 99,99 100 100 99,99 100 99,99 99,99 100 100 99,99 99,99 100 99,99 99,99 100 99,99 99,99 99,99 100 99,99 99,99 99,98 99,98 99,99 99,98 99,99 99,98 99,99 99,99 99,99 99,99 100 99,99 99,99 99,99 99,99 99,99 99,99 99,97 99,97 99,97 99,99 99,99 99,99 99,99 99,99 99,99 valori al di sotto della virgola perché lo strumento ha una sensibilità di 1 mm e non ha senso misurare l'errore oltre la sua sensibilità. Un altro risultato interessante da visualizzare è l'errore massimo ottenuto che mediamente è di 15 centimetri questo sta a indicare che dei pochi punti errati che abbiamo ottenuto mediamente hanno un errore massimo di 1,5 cm. Altri risultati molto interessanti sono le percentuali dei punti errati sotto determinate misure, in particolare abbiamo che mediamente: • l'82,82 % dei punti non variano posizione • l'84,26 % dei punti rimane sotto i 2mm di spostamento • il 99,65% sotto i 5mm • il 99,99% non supera i 10 mm Questo fa comprendere che gli errori massimi ottenuti sono solo una piccolissima parte (lo 0,01%) della totalità dei punti ottenuti. In questa tabella comprare anche uno strano fenomeno verificatosi passando il tempo mentre si effettuavano le misurazioni, i valori medi dei due vettori di riferimento presentavano una crescita costante dal valore 1001 al valore 1006. Questa crescita cosi lineare e difficilmente spiegabile con un errore di misurazione. La spiegazione razionale è data dal fatto che il Kinect durante le misurazioni era appoggiato su un supporto di poco spessore che lasciava cadere il cavo all'indietro, il peso del cavo ha spostato il Kinect di pochi 71 millimetri all'indietro ma sufficienti a dare una piccola crescita nelle misure. Per confutare questo fenomeno nelle successive misurazioni il cavo è stato trattenuto lungo il bordo e difatti il fenomeno non si è ripetuto, ciò ci permette di considerare il fatto che questo dispositivo è capace di notare anche piccole variazioni del suo stato fisico e darci un'idea delle grandi potenzialità che possiede. 72 1,5 m: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Media 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Err. Max Err. Min. 28 0 26 0 30 0 28 0 28 0 33 0 23 0 29 0 27 0 28 0 27 0 27 0 30 0 27 0 44 0 27 0 31 0 27 0 33 0 30 0 33 0 22 0 33 0 33 0 35 0 27 0 27 0 28 0 28 0 33 0 33 0 27 0 30 0 33 0 33 0 33 0 33 0 30 0 27 0 33 0 28 0 30 0 29 0 27 0 28 0 33 0 33 0 33 0 33 0 33 0 Media 1 1550 1550 1550 1550 1550 1550 1550 1551 1551 1551 1550 1551 1551 1551 1551 1551 1551 1550 1551 1551 1550 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1550 1550 1550 1550 1550 1550 1550 1550 1551 Media 2 1550 1550 1550 1550 1550 1551 1550 1551 1551 1551 1550 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1551 1550 1550 1550 1550 1550 1550 1550 1550 1551 Err. 0 253007 251819 252137 253044 251533 253142 252816 252539 252439 252169 252409 251879 253119 253635 252505 253004 253369 252562 252241 252601 252957 252237 253093 250446 251077 252213 253126 250712 252888 252480 252263 253105 252487 251968 251714 252709 252103 252728 252672 252478 250623 251987 251989 251442 252415 253053 252664 252172 252811 251733 Err. 2 253007 251819 252137 253044 251533 253142 252816 252539 252439 252169 252409 251879 253119 253635 252505 253004 253369 252562 252241 252601 252957 252237 253093 250446 251077 252213 253126 250712 252888 252480 252263 253105 252487 251968 251714 252709 252103 252728 252672 252478 250623 251987 251989 251442 252415 253053 252664 252172 252811 251733 Err. 5 253007 251819 252137 253044 251533 253142 252816 252539 252439 252169 252409 251879 253119 253635 252505 253004 253369 252562 252241 252601 252957 252237 253093 250446 251077 252213 253126 250712 252888 252480 252263 253105 252487 251968 251714 252709 252103 252728 252672 252478 250623 251987 251989 251442 252415 253053 252664 252172 252811 251733 Err.10 306333 306139 306040 306148 306060 306206 306262 306084 306216 306076 306133 306237 306202 306231 306165 306146 306118 306140 306073 306087 306017 306186 306002 306117 306047 306143 306288 306004 306117 305987 306153 306216 306082 306063 306131 305896 306044 306007 305902 306115 306040 306063 306090 305950 306107 306126 306172 305983 306074 306111 %0 82,36 81,97 82,08 82,37 81,88 82,4 82,3 82,21 82,17 82,09 82,16 81,99 82,4 82,56 82,2 82,36 82,48 82,21 82,11 82,23 82,34 82,11 82,39 81,53 81,73 82,1 82,4 81,61 82,32 82,19 82,12 82,39 82,19 82,02 81,94 82,26 82,06 82,27 82,25 82,19 81,58 82,03 82,03 81,85 82,17 82,37 82,25 82,09 82,3 81,94 %2 82,36 81,97 82,08 82,37 81,88 82,4 82,3 82,21 82,17 82,09 82,16 81,99 82,4 82,56 82,2 82,36 82,48 82,21 82,11 82,23 82,34 82,11 82,39 81,53 81,73 82,1 82,4 81,61 82,32 82,19 82,12 82,39 82,19 82,02 81,94 82,26 82,06 82,27 82,25 82,19 81,58 82,03 82,03 81,85 82,17 82,37 82,25 82,09 82,3 81,94 %5 82,36 81,97 82,08 82,37 81,88 82,4 82,3 82,21 82,17 82,09 82,16 81,99 82,4 82,56 82,2 82,36 82,48 82,21 82,11 82,23 82,34 82,11 82,39 81,53 81,73 82,1 82,4 81,61 82,32 82,19 82,12 82,39 82,19 82,02 81,94 82,26 82,06 82,27 82,25 82,19 81,58 82,03 82,03 81,85 82,17 82,37 82,25 82,09 82,3 81,94 Nella tabella delle misurazioni relative agli 1,5 metri abbiamo altri risultati interessanti, innanzitutto il valore dell'errore medio è pari ad 1mm, e ciò poteva essere da considerarsi normale dato l'aumento della distanza dell'oggetto. Un'altra cosa interessante è anche la crescita dell'errore massimo di ogni 73 %10 99,72 99,65 99,62 99,66 99,63 99,68 99,69 99,64 99,68 99,63 99,65 99,69 99,68 99,68 99,66 99,66 99,65 99,65 99,63 99,64 99,61 99,67 99,61 99,65 99,62 99,66 99,7 99,61 99,65 99,61 99,66 99,68 99,64 99,63 99,65 99,58 99,62 99,61 99,58 99,65 99,62 99,63 99,64 99,59 99,64 99,65 99,67 99,6 99,63 99,65 misurazione cresciuta sensibilmente che si aggira mediamente al valore di 30 mm. La cosa più interessata notata in questa misurazione però sono le percentuali di pixel errati. Mediamente in dettaglio: • l'82,15 % dei punti non variano posizione • l'82,15 % dei punti rimane sotto i 2mm di spostamento • il 82,15% sotto i 5mm • il 99,64% non supera i 10 mm Ciò ci dimostra che la percentuale di punti errati non aumenta con la distanza (sembra rimanere stabile al ±18% ) ma che aumenta l'errore dei punti che variano da uno scatto all'altro. Altra cosa da notare è che una volta posizionato bene il cavo le distanze medie dei due vettori di riferimento rimangono stabili intorno al valore 1550. 2m: Prima di mostrare i valori in tabella è preferibile effettuare delle considerazioni su ciò che ci si potrebbe aspettare. Queste considerazioni sono state fatte anche prima di effettuare la misurazione e si sono rivelate veritiere. Una volta visualizzate le prime due tabelle ciò che ci si aspetta è una crescita minima dell'errore medio (intorno ai 2 o 3 mm), un aumento dell'errore massimo raggiunto e, la cosa più importante, una costanza nell'individuazione dei punti esatti che si spera rimanga intorno all'80%. I risultanti hanno dato prova di ciò. 74 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Media 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 Err. Max Err. Min. 64 0 54 0 54 0 43 0 44 0 44 0 50 0 50 0 44 0 42 0 39 0 53 0 44 0 51 0 51 0 52 0 44 0 44 0 52 0 44 0 2127 0 44 0 2127 0 44 0 44 0 43 0 44 0 54 0 41 0 55 0 2127 0 53 0 52 0 54 0 55 0 45 0 44 0 55 0 50 0 50 0 44 0 55 0 44 0 44 0 50 0 44 0 52 0 44 0 44 0 44 0 Media 1 2014 2015 2014 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2014 2015 2015 2014 2015 2015 2015 Media 2 2014 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 2014 2015 2015 2015 2015 2015 2015 Err. 0 249859 248741 249272 249787 249241 250006 248653 250184 249352 250138 250187 248252 249422 248174 248599 249625 249520 248408 250238 249505 247930 249260 249387 249026 248605 248606 249113 248570 250151 250517 250162 248933 248825 249166 250111 248845 250801 250837 249371 249200 251394 251028 251177 251091 250176 250206 249601 250030 248616 250373 Err. 2 249859 248741 249272 249787 249241 250006 248653 250184 249352 250138 250187 248252 249422 248174 248599 249625 249520 248408 250238 249505 247930 249260 249387 249026 248605 248606 249113 248570 250151 250517 250162 248933 248825 249166 250111 248845 250801 250837 249371 249200 251394 251028 251177 251091 250176 250206 249601 250030 248616 250373 Err. 5 249859 248741 249272 249787 249241 250006 248653 250184 249352 250138 250187 248252 249422 248174 248599 249625 249520 248408 250238 249505 247930 249260 249387 249026 248605 248606 249113 248570 250151 250517 250162 248933 248825 249166 250111 248845 250801 250837 249371 249200 251394 251028 251177 251091 250176 250206 249601 250030 248616 250373 Err.10 250858 249638 250256 250935 250298 251049 249639 251175 250434 251192 251116 249431 250468 249278 249688 250775 250467 249442 251289 250391 248958 250261 250480 250119 249559 249609 250242 249672 251169 251453 251053 249977 249965 250276 251074 249840 251890 251799 250504 250165 252492 252052 252172 252137 251221 251220 250711 251116 249738 251421 %0 81,33 80,97 81,14 81,31 81,13 81,38 80,94 81,44 81,17 81,43 81,44 80,81 81,19 80,79 80,92 81,26 81,22 80,86 81,46 81,22 80,71 81,14 81,18 81,06 80,93 80,93 81,09 80,91 81,43 81,55 81,43 81,03 81 81,11 81,42 81 81,64 81,65 81,18 81,12 81,83 81,71 81,76 81,74 81,44 81,45 81,25 81,39 80,93 81,5 %2 81,33 80,97 81,14 81,31 81,13 81,38 80,94 81,44 81,17 81,43 81,44 80,81 81,19 80,79 80,92 81,26 81,22 80,86 81,46 81,22 80,71 81,14 81,18 81,06 80,93 80,93 81,09 80,91 81,43 81,55 81,43 81,03 81 81,11 81,42 81 81,64 81,65 81,18 81,12 81,83 81,71 81,76 81,74 81,44 81,45 81,25 81,39 80,93 81,5 %5 81,33 80,97 81,14 81,31 81,13 81,38 80,94 81,44 81,17 81,43 81,44 80,81 81,19 80,79 80,92 81,26 81,22 80,86 81,46 81,22 80,71 81,14 81,18 81,06 80,93 80,93 81,09 80,91 81,43 81,55 81,43 81,03 81 81,11 81,42 81 81,64 81,65 81,18 81,12 81,83 81,71 81,76 81,74 81,44 81,45 81,25 81,39 80,93 81,5 Come è possibile vedere la media rimane costantemente a 2 mm e l'errore massimo è aumentato. Riguardo all'errore massimo c'è da considerare la presenza di tre valori particolarmente grandi tutti e tre uguali a 2127 mm che sono comparsi in via del tutto eccezionale e che hanno sbalzato la media dell'errore massimo a 173 mm. Quest'ultimo valore può 75 %10 81,66 81,26 81,46 81,68 81,48 81,72 81,26 81,76 81,52 81,77 81,74 81,19 81,53 81,15 81,28 81,63 81,53 81,2 81,8 81,51 81,04 81,47 81,54 81,42 81,24 81,25 81,46 81,27 81,76 81,85 81,72 81,37 81,37 81,47 81,73 81,33 82 81,97 81,54 81,43 82,19 82,05 82,09 82,08 81,78 81,78 81,61 81,74 81,29 81,84 non essere preso in considerazione dato che nelle restanti misurazioni l'errore si aggira intorno ai 50 mm e anche nelle file dove questo errore enorme è presente gli altri risultati non vengono influenzati (come ad esempio quello dei valori medi dei vettori 1 e 2) quindi è facile pensare che sia un caso isolato a una manciata di punti se non addirittura al singolo. L'ipotesi più probabile è che un po' di sporco o addirittura qualche scheggiatura della lente o l'usura dello strumento a causa dei continui maneggiamenti possa aver modificato qualcosa che raramente riporta risultati assurdi dato il fatto che anche durante le sperimentazioni successive questi valori esagerati sono ricomparsi. Ciò ci può dare l'idea dell'estrema fragilità dello strumento e della continua cura di cui necessita. Un risultato atteso e rassicurante invece è quello relativo alle percentuali d'errore che sono rimaste sempre intorno all'80%, esattamente il valore medio dei punti esatti è di 81,24%, questo valore non cambia fino ai 10mm che risulta di 81,58%. Ciò ci indica con chiarezza che all'aumentare della distanza non aumentano i punti errati ma bensì solo l'errore relativo ai punti errati. Il seguente grafico permette di vedere come cresce l'errore massimo a visualizzazione seconda i valori normalizzati a 100). della distanza anomali a 2127 Err. Max 1m Err. Max 1,5m Err. Max 2m 76 (per migliorare mm sono la stati 120 100 80 60 40 20 0 2 1 4 3 6 5 8 7 9 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 Considerazioni sui primi test I primi test effettuati evidenziano una gran precisione di calcolo del Kinect riguardo alla profondità. Ovviamente non sono prestazioni elevate come quelle di un dispositivo al laser a tempo di volo ma rappresenta un'ottima alternativa economica a strumenti largamente più costosi. Ovviamente questi non sono test definitivi ma ci permettono di affermare molte cose. Innanzitutto possiamo dire che il dispositivo individua con precisione millimetrica circa l'80% dei punti individuati, ciò è di notevole considerazioni nel momento in cui si vuole sviluppare uno scanner 3D di oggetti. Un'altra considerazione molto importante che si può affermare è che il raggio d'azione ottimale del dispositivo è compreso tra i 77 50 cm (sotto di questo valore il Kinect non riconosce più la profondità e la setta automaticamente a zero) e 1,5 metri. Questo valore risulta ottimale ai fini di questo progetto dato che in questo raggio d'azione si può effettuare perfettamente e con precisione la scansione di un busto umano. Prove di posizione Dopo le prove di distanza sono state effettuate delle prove differenti per vedere come rispondeva il Kinect ad una posizione differente da quella piana e ad una vista parziale dell'immagine catturata. La prima prova che è stata effettuata durante questa sperimentazione è avvenuta tenendo il Kinect in posizione diagonale rispetto al piano di lavoro, la seconda invece è avvenuta alla stessa maniera della prima (ovvero puntandolo dritto contro un muro a 1m di distanza) però considerando solo la porzione centrale dell'inquadratura evitando il contorno. Kinect inclinato Questa sperimentazione è avvenuta con l'obiettivo di controllare se il Kinect modifica le sue prestazioni nel caso di una inclinazione dello stesso (quindi non poggiando perfettamente a terra), purtroppo per ottenere questa inclinazione il Kinect è stato posto in maniera piuttosto strana tale da modificare spesso il suo stato di equilibrio dato che posava solamente sullo spigolo posteriore della base e il filo era incurvato creando una specie di molla. 78 Nel caso di questo test c'è da considerare il fatto che, mentre la distanza della parte bassa dell'inquadratura è all'incirca di un metro, nella parte alta aumenta data l'inclinazione, da ciò possiamo aspettarci risultati tra l'1 metro e il metro e mezzo. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Media 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Err. Max Err. Min. 30 0 24 0 37 0 0 0 31 0 953 0 36 0 31 0 31 0 31 0 1603 0 29 0 1641 0 38 0 29 0 1611 0 37 0 30 0 23 0 30 0 69 0 36 0 43 0 1649 0 1665 0 31 0 29 0 31 0 31 0 36 0 30 0 46 0 1665 0 33 0 31 0 47 0 34 0 31 0 31 0 38 0 31 0 32 0 31 0 30 0 30 0 34 0 37 0 37 0 37 0 44 0 Media 1 1212 1215 1214 1217 1215 1216 1216 1217 1218 1218 1218 1219 1221 1220 1220 1221 1221 1222 1222 1223 1225 1223 1223 1224 1226 1227 1225 1225 1225 1226 1226 1226 1226 1227 1227 1227 1228 1228 1228 1228 1229 1231 1229 1230 1230 1230 1230 1231 1231 1231 Media 2 1212 1215 1214 1217 1215 1216 1217 1217 1218 1218 1219 1219 1222 1220 1220 1221 1221 1222 1222 1223 1225 1224 1224 1224 1226 1227 1225 1225 1225 1226 1226 1226 1227 1227 1227 1227 1228 1228 1228 1228 1229 1231 1229 1230 1230 1230 1230 1231 1231 1231 Err. 0 252024 251902 251512 307200 250426 250657 251482 249745 251439 251179 251853 253871 252302 253469 253793 251961 253235 253346 252841 247491 253198 254282 252850 252621 252761 252151 252780 252076 253387 251890 252743 252461 253990 252649 251269 251894 251560 250983 250526 252485 249745 250749 249882 250174 251112 249739 249722 250476 250158 249051 79 Err. 2 253856 253732 253520 307200 252306 252491 253437 251696 253449 253213 253884 255787 254064 255178 255471 253723 255068 255142 254637 249298 254835 255944 254536 254309 254404 253819 254416 253759 255098 253540 254337 254142 255645 254282 252937 253615 253230 252585 252124 253977 251401 252260 251557 251747 252847 251392 251484 252048 251774 250852 Err. 5 292208 291997 292233 307200 291312 291451 291716 290866 291366 291037 291256 291919 290959 291350 291698 291041 291031 291487 291176 289176 290666 290970 290806 290590 290214 290351 290350 290597 290118 290289 290486 290295 290571 290214 289653 290248 289755 289263 288751 290157 288370 288913 288806 288491 288800 288184 288712 288818 288361 288320 Err.10 307000 307013 307061 307200 307001 306969 306901 306945 306922 306914 306917 307028 306956 306998 306964 306899 306922 306912 306954 306835 306782 306811 306863 306839 306683 306764 306785 306663 306683 306701 306525 306737 306724 306642 306536 306558 306469 306397 306430 306677 306424 306433 306389 306266 306193 306200 306199 306502 306142 306194 %0 82,04 82 81,87 100 81,52 81,59 81,86 81,3 81,85 81,76 81,98 82,64 82,13 82,51 82,61 82,02 82,43 82,47 82,31 80,56 82,42 82,77 82,31 82,23 82,28 82,08 82,29 82,06 82,48 82 82,27 82,18 82,68 82,24 81,79 82 81,89 81,7 81,55 82,19 81,3 81,62 81,34 81,44 81,74 81,3 81,29 81,54 81,43 81,07 %2 82,64 82,6 82,53 100 82,13 82,19 82,5 81,93 82,5 82,43 82,64 83,26 82,7 83,07 83,16 82,59 83,03 83,05 82,89 81,15 82,95 83,32 82,86 82,78 82,81 82,62 82,82 82,6 83,04 82,53 82,79 82,73 83,22 82,77 82,34 82,56 82,43 82,22 82,07 82,67 81,84 82,12 81,89 81,95 82,31 81,83 81,86 82,05 81,96 81,66 %5 95,12 95,05 95,13 100 94,83 94,87 94,96 94,68 94,85 94,74 94,81 95,03 94,71 94,84 94,95 94,74 94,74 94,89 94,78 94,13 94,62 94,72 94,66 94,59 94,47 94,52 94,51 94,6 94,44 94,5 94,56 94,5 94,59 94,47 94,29 94,48 94,32 94,16 93,99 94,45 93,87 94,05 94,01 93,91 94,01 93,81 93,98 94,02 93,87 93,85 %10 99,93 99,94 99,95 100 99,94 99,92 99,9 99,92 99,91 99,91 99,91 99,94 99,92 99,93 99,92 99,9 99,91 99,91 99,92 99,88 99,86 99,87 99,89 99,88 99,83 99,86 99,86 99,83 99,83 99,84 99,78 99,85 99,85 99,82 99,78 99,79 99,76 99,74 99,75 99,83 99,75 99,75 99,74 99,7 99,67 99,67 99,67 99,77 99,66 99,67 Come è possibile notare, il comportamento pronosticato si è verificato. La distanza media dei due vettori va da un minimo di 1212 ad un massimo di 1231 mm, ciò è dovuto alla posizione “scomoda del sensore” che a causa del rilassamento della corda a di poco modificato il suo stato fisico. Altri valori interessanti si rivelano nella percentuale di pixel esatti che rimane sempre intorno all'80% ( per la precisione è uguale mediamente all'82,3 % ). Risultato non piacevole è dato dalla presenza ancora di valori terribilmente grandi nella colonna dell'errore massimo, l'ipotesi di possibili macchie o malfunzionamenti è sempre valida, ma il risultato ottenuto non modifica in maniera sensibile i valori delle medie o delle percentuali, escludendo i valori estremamente alti il valor medio della differenza massima risulta all'incirca di 37 mm, un valore molto più simile alla sperimentazione su 1,5m che non a quella di 1m. Un ottimo risultato è stato ottenuto invece nella media dell'errore che risulta essere sempre pari a 0( come nel caso della sperimentazione ad 1 m ). Dopo questa sperimentazione possiamo considerare che il Kinect mantiene le sue prestazioni anche se non perfettamente parallelo al suolo. Inquadratura ristretta Per effettuare questa sperimentazione si è utilizzato lo stesso software utilizzato in precedenza per effettuare i calcoli, l'unica differenza sta nell'aver escluso 80 dall'analisi i valori che compongono il contorno dell'immagine, per l'esattezza sono stati tolti 40 pixel per margine (destra, sinistra, sopra e sotto). La speranza è di ottenere risultati migliori rispetto all'immagine intera, ovvero si vuole verificare se la concentrazione dell'errore è disposta uniformemente su tutta l'immagine o si dispone per lo più sulle zone periferiche. La misurazione è stata effettuata ad un metro di distanza. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Media 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Err. Max Err. Min. 15 0 15 0 15 0 15 0 15 0 15 0 15 0 15 0 18 0 15 0 15 0 15 0 15 0 22 0 18 0 18 0 25 0 15 0 21 0 29 0 18 0 21 0 18 0 18 0 18 0 25 0 18 0 18 0 18 0 25 0 25 0 33 0 29 0 18 0 18 0 21 0 18 0 15 0 18 0 15 0 33 0 18 0 18 0 33 0 32 0 21 0 21 0 18 0 18 0 21 0 Media 1 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 Media 2 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 1080 Err. 0 186043 186341 185999 185481 185343 185544 185555 187119 185092 185873 185848 186628 185354 184453 185257 185759 183442 184780 184121 184136 185787 185922 185081 184104 185902 184273 185322 186101 185975 184235 183297 184510 183926 185710 185148 186451 185285 186678 187640 185560 185901 185894 185549 187052 185732 185605 185749 186435 186637 185990 81 Err. 2 186043 186341 185999 185481 185343 185544 185555 187119 185092 185873 185848 186628 185354 184453 185257 185759 183442 184780 184121 184136 185787 185922 185081 184104 185902 184273 185322 186101 185975 184235 183297 184510 183926 185710 185148 186451 185285 186678 187640 185560 185901 185894 185549 187052 185732 185605 185749 186435 186637 185990 Err. 5 225019 225157 225121 225036 224929 225096 225189 225279 225124 225029 224919 224822 224962 225023 224893 224889 224701 224772 224871 224673 224862 224593 224563 224669 224769 224842 225125 224763 225046 224877 224860 224976 224728 224889 224929 224870 225032 224917 225146 224994 225088 225043 225008 224981 224949 224807 224952 224889 224713 224868 Err.10 225533 225694 225774 225743 225709 225774 225778 225822 225738 225716 225684 225567 225654 225666 225693 225662 225575 225563 225690 225533 225603 225521 225451 225607 225613 225637 225733 225578 225688 225675 225573 225694 225592 225694 225688 225626 225737 225621 225632 225711 225703 225665 225653 225740 225680 225616 225587 225638 225597 225676 %0 82,35 82,48 82,33 82,1 82,04 82,13 82,13 82,82 81,93 82,27 82,26 82,61 82,04 81,64 82 82,22 81,2 81,79 81,5 81,5 82,23 82,29 81,92 81,49 82,29 81,56 82,03 82,37 82,32 81,55 81,13 81,67 81,41 82,2 81,95 82,53 82,01 82,63 83,05 82,13 82,28 82,28 82,13 82,79 82,21 82,15 82,22 82,52 82,61 82,32 %2 82,35 82,48 82,33 82,1 82,04 82,13 82,13 82,82 81,93 82,27 82,26 82,61 82,04 81,64 82 82,22 99,46 81,79 81,5 81,5 82,23 82,29 81,92 81,49 82,29 81,56 82,03 82,37 82,32 81,55 81,13 81,67 81,41 82,2 81,95 82,53 82,01 82,63 83,05 82,13 82,28 82,28 82,13 82,79 82,21 82,15 82,22 82,52 82,61 82,32 %5 99,6 99,66 99,64 99,61 99,56 99,63 99,67 99,71 99,65 99,6 99,56 99,51 99,57 99,6 99,54 99,54 99,85 99,49 99,53 99,45 99,53 99,41 99,4 99,44 99,49 99,52 99,65 99,49 99,61 99,54 99,53 99,58 99,47 99,54 99,56 99,53 99,61 99,55 99,66 99,59 99,63 99,61 99,59 99,58 99,57 99,51 99,57 99,54 99,46 99,53 %10 99,83 99,9 99,93 99,92 99,9 99,93 99,94 99,95 99,92 99,91 99,89 99,84 99,88 99,89 99,9 99,88 99,85 99,84 99,9 99,83 99,86 99,82 99,79 99,86 99,86 99,87 99,92 99,85 99,9 99,89 99,84 99,9 99,85 99,9 99,9 99,87 99,92 99,87 99,87 99,91 99,9 99,89 99,88 99,92 99,89 99,86 99,85 99,87 99,86 99,89 I risultati ottenuti non hanno corrisposto le speranze ma almeno permettono di affermare che l'errore è distribuito uniformemente su quasi tutta l'immagine dato che i valori medi continuano a restituire un 82 % circa di pixel errati. I valori analizzati (come c'era da aspettarsi) sono perfettamente comparabili con la misurazione effettuata ad un metro di distanza dalla parete e a schermo pieno. Immagini di errore I dati a nostra disposizione si sono rivelati molto chiari ma, dato che, in caso di errore molto alto la percentuale dei punti è molto piccola e non si può notare la differenza di disposizione (se al centro o ai bordi) a causa dell'alta percentuale di correttezza, si è deciso di inserire all'interno di questo capitolo delle immagini prese con lo scanner che mostrano bene la distribuzione dell'errore nell'area selezionata. Innanzitutto verrà mostrata un'immagine completa, in seguito verranno mostrate le immagini con i vari errori messi in evidenza. Questa prima immagine mostra la scansione effettuata sulla parete, come si può vedere la superficie non sembra essere perfettamente piana ma appare leggermente frastagliata, ciò è dovuto a quel 18% circa di pixel errati. 82 L'immagine seguente mostrerà lo stesso muro fotografato con lo scanner a cui però sono stati tolti i pixel che differiscono di qualche mm. 83 Come si può notare la distribuzione di pixel errati (i buchi neri per intenderci) è da considerarsi uniforme su quasi tutta l'immagine. Le prossime immagini saranno ricavate in maniera diversa, verranno visualizzati, invece dei pixel esatti, solo quelli sbagliati dato che la visualizzazione risulterebbe molto difficoltosa al contrario. La prossima immagine mette in evidenza solo i pixel che variano la loro posizione di 3mm. Una cosa particolare che si può notare visivamente ma non numericamente è che la concentrazione di errore elevato si dispone molto più sugli spigoli 84 che non nel centro. Numericamente era quasi impossibile da notare data la piccolissima quantità di errori. L'ultima immagine che mostreremo sarà quella relativa ai pixel che differiscono di oltre 5 mm. L'immagine è quasi totalmente nera e ciò era prevedibile dati i risultati numerici ottenuti, anche in questo caso l'errore si dispone sugli angoli ed anche in questo caso era impossibile da notare con l'analisi della percentuale. Queste immagini ci permettono di considerare che effettivamente i punti che superano i 5 mm di errore sono poco più di una manciata. 85 Ultime Prove, busto umano I risultati delle prove precedenti hanno dato un buon esito e hanno dimostrato che il Kinect può essere utilizzato per prendere misure con un margine di errore molto basso. Ciò che manca ora è la misurazione diretta su di un corpo umano per controllare se e quanto i movimenti involontari del corpo possono influenzare le misure. Queste sperimentazioni saranno utilizzate anche per conoscere l'intervallo di differenza minimo, tale intervallo può essere considerato un cambiamento notevole tra una scansione e l'altra e ignorare tutte le altre differenze. I primi risultati Si è provato ad utilizzare lo stesso software di calcolo impiegato per le sperimentazioni precedenti ma, come era stato sospettato in precedenza, tale software non risulta essere adatto a prendere tali informazioni. I valori dell'errore medio venivano modificati pesantemente dalla presenza di una persona tra il Kinect e lo sfondo ed in particolare i valori dell'errore massimo risultavano essere identici alla distanza in cui veniva posizionata la persona. Questi errori non sono dovuti a qualche malfunzionamento o alla scarsità di prestazione del Kinect, bensì tali errori hanno una soluzione semplice (ipotizzata anche in precedenza) che può essere spiegata osservando prima una foto. 86 Come è possibile notare dalla foto, sul bordo sinistro del corpo compare una specie di spessore nero, ciò è dovuto alla distanza tra l'emettitore di infrarossi e il ricevitore. Questo bordo nero può essere tranquillamente ignorato ai fini del nostro progetto perché non va a modificare le fattezze del corpo e quindi l'oggetto da scansionare ma va a influenzare di molto le misure, la barra nera è una barra di valori pari a zero, nel momento in cui si effettueranno i due scatti e verrà eseguita la differenza la minima modifica della posizione del corpo comporterà uno spostamento della barra nera ponendo nel vettore di differenza errori pari alla distanza del corpo o peggio dello sfondo. 87 Provando ad eliminare lo sfondo dal calcolo rimane sempre il valore di distanza del corpo. Sperimentazione alternativa Per poter effettuare i test sul corpo si è dovuti ricorrere ad un software di calcolo leggermente differente. Il principio è sempre lo stesso, prendere due foto e calcolare le differenza tra la prima e la seconda, il cambiamento sta nel come vengono prese le due foto. Per ovviare alla questione della barra nera si è deciso per prima cosa di impostare tutti i valori dello sfondo al valore zero, ciò lo si è potuto fare filtrando tutto ciò che si trova oltre una certa distanza massima e sostituirgli il valore, dopo aver fatto ciò il soggetto che si sottoporrà alla sperimentazione dovrà posizionarsi in maniera tale che il suo corpo si trovi all'incirca a quella distanza in modo tale che idealmente solo metà corpo possa essere posizionato, infine i valori di distanza dovranno essere sottratti alla distanza massima in modo da avere il valore effettivo di separazione del corpo. Questa immagine permette di comprendere meglio questo tipo di sperimentazione: la linea rossa rappresenta il la zona oltre la quale tutti i valori vengono imposti a zero, i valori che il software andrà a catturare saranno intesi come lo spazio in cui il corpo si “sporge” oltre la linea e sono calcolati sottraendo alla distanza del piano di distanza massimo dal 88 sensore, la distanza di ogni punto del corpo dal sensore. Ovviamente la situazione prevista dall'immagine è una situazione ottima per fare delle misurazioni dato che le zone del corpo che si trovano sul piano della distanza massima dovrebbero dare un valore pari a zero. Le aspettative però non sono cosi ottimistiche dato che le misurazioni sono durate all'incirca 30 minuti e il soggetto che ha subito tali misurazioni non ha potuto mantenere sempre la stessa posizione ottima. Per rendere rilevanti le misurazioni, le due foto sono state prese a distanza di 5 secondi l'una dall'altra, ovvero il tempo che intercorre tra un'inspirazione e un'espirazione completa. 89 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Media 1 5 0 0 0 0 1 0 0 4 0 0 2 1 2 0 0 0 3 1 0 3 1 3 1 3 4 2 0 0 5 11 0 0 0 0 0 1 2 0 0 0 4 1 0 1 1 4 0 4 Err. Max Err. Min. 113 0 135 0 82 0 0 0 0 0 0 0 120 0 0 0 135 0 172 0 118 0 0 0 115 0 130 0 174 0 0 0 0 0 0 0 189 0 95 0 0 0 132 0 128 0 492 0 154 0 170 0 115 0 135 0 156 0 0 0 170 0 187 0 0 0 0 0 0 0 0 0 0 0 110 0 125 0 0 0 0 0 0 0 128 0 180 0 0 0 210 0 163 0 195 0 0 0 185 0 Media 1 29 21 16 30 30 32 20 30 31 33 28 31 29 28 38 36 26 37 44 27 30 16 20 19 29 35 37 40 30 40 32 40 30 36 35 32 34 28 38 40 27 40 41 60 43 41 33 41 41 41 Media 2 28 26 16 30 30 32 22 30 32 37 28 31 31 30 39 36 26 37 47 27 30 14 21 22 30 38 41 42 31 40 37 50 30 36 35 32 34 29 36 40 27 40 45 59 43 42 33 45 41 45 Err. 0 238883 203015 247469 307200 307200 307200 227055 307200 228835 186387 240516 307200 204385 213307 204832 307200 307200 307200 184059 225439 307200 221142 225487 208211 225178 186635 183105 198675 241969 307200 186626 177715 307200 307200 307200 307200 307200 205424 192585 307200 307200 307200 180649 214295 307200 219793 227593 182988 307200 182231 Err. 2 254328 203080 255410 307200 307200 307200 232932 307200 249938 186531 255820 307200 211337 228440 226595 307200 307200 307200 194791 240108 307200 222046 237310 208557 240121 189613 183638 215169 254887 307200 186737 177732 307200 307200 307200 307200 307200 218619 203824 307200 307200 307200 181759 254335 307200 244901 245648 183899 307200 182872 Err. 5 292209 206266 298617 307200 307200 307200 267935 307200 298914 189130 295732 307200 258298 279741 276073 307200 307200 307200 231752 285573 307200 234443 282073 220372 285853 216679 192719 256274 295581 307200 189072 177953 307200 307200 307200 307200 307200 269327 253628 307200 307200 307200 195021 297484 307200 290287 290121 195498 307200 190553 Err.10 304654 223153 306452 307200 307200 307200 302499 307200 306117 219468 304686 307200 299922 304548 299809 307200 307200 307200 283437 304677 307200 259087 305158 273474 302428 279722 264796 292544 305966 307200 213988 179121 307200 307200 307200 307200 307200 304419 298761 307200 307200 307200 255531 303934 307200 304602 303036 270579 307200 255132 %0 77,76 66,09 80,56 100 100 100 73,91 100 74,49 60,67 78,29 100 66,53 69,44 66,68 100 100 100 59,92 73,39 100 71,99 73,4 67,78 73,3 60,75 59,6 64,67 78,77 100 60,75 57,85 100 100 100 100 100 66,87 62,69 100 100 100 58,81 69,76 100 71,55 74,09 59,57 100 59,32 %2 82,79 66,11 83,14 100 100 100 75,82 100 81,36 60,72 83,27 100 68,79 74,36 73,76 100 100 100 63,41 78,16 100 72,28 77,25 67,89 78,16 61,72 59,78 70,04 82,97 100 60,79 57,86 100 100 100 100 100 71,17 66,35 100 100 100 59,17 82,79 100 79,72 79,96 59,86 100 59,53 %5 95,12 67,14 97,21 100 100 100 87,22 100 97,3 61,57 96,27 100 84,08 91,06 89,87 100 100 100 75,44 92,96 100 76,32 91,82 71,74 93,05 70,53 62,73 83,42 96,22 100 61,55 57,93 100 100 100 100 100 87,67 82,56 100 100 100 63,48 96,84 100 94,49 94,44 63,64 100 62,03 %10 99,17 72,64 99,76 100 100 100 98,47 100 99,65 71,44 99,18 100 97,63 99,14 97,59 100 100 100 92,26 99,18 100 84,34 99,34 89,02 98,45 91,06 86,2 95,23 99,6 100 69,66 58,31 100 100 100 100 100 99,09 97,25 100 100 100 83,18 98,94 100 99,15 98,64 88,08 100 83,05 I valori ottenuti sembrano avere un carattere molto aleatorio, a differenza delle precedenti misurazioni in cui i valori rimanevano più o meno costanti in questo caso i valori variano da condizioni di assoluta perfezione a condizioni di grave errore. I valor medi in questo caso variano in continuazione ed hanno una media di 1,42, in questo caso però andiamo a considerare sopratutto la deviazione standard che, a differenza delle prime 90 misurazioni, ha un valore rilevante, nel caso della media dei valori il valore di deviazione è pari a 2,08. Altri valori interessanti presi in questo tipo di sperimentazione sono i valori delle percentuali di errore che, come nel caso della media, hanno valori di varianza elevati. Riguardo ai valori medi si ha: • %=0: 80,78 • %>2: 82,78 • %>5: 88,91 • %>10: 94,89 Questi valori sono prevedibilmente leggermente più bassi delle prime sperimentazioni dato il corpo della persona inserito nella misura, ma rimangono comunque valori comparabili a quelli ottenuti, il vero problema che si rivela in questo caso è la presenza di deviazioni standard non trascurabili. Per la precisione tali valori di deviazioni sono: • %=0: 16,72 • %>2: 15,75 • %>5: 14,01 • %>10: 9,46 quindi decisamente valori non trascurabili. 91 Foto di differenza I valori ottenuti precedentemente non danno la certezza di quanto possa essere accurata la misura sul corpo data la presenza di misure “strane”. Alcune misure risultano assolutamente perfette mentre altre paiono essere afflitte da un errore enorme, tutto ciò può far pensare ad un bug del software di misurazione che sballa i valori ottenuti. Per ottenere un valore rilevante nei valori di differenza si è optato per un metodo più “euristico” che si basa sull'osservazione visiva della foto ottenuta dal vettore di differenza filtrando i punti da disegnare a seconda del valore per l'appunto della differenza. Per scattare queste foto il soggetto è stato posto con la schiena appoggiata al muro e il Kinect di fronte. Sono state scattate una serie di foto la cui differenza veniva mostrata filtrando i punti con valori maggiori o minori di una certa soglia. La prima foto mostrerà tutti i punti aventi errore minore di 3 mm: 92 I punti neri sono tutti quei punti che hanno una differenza maggiore o uguale a 3 mm, come è possibile notare si concentrano sopratutto nella zona del torace (probabilmente dovuto alla respirazione), comunque è un ottimo risultato poter notare la maggior parte dei punti al di sotto dei 3 mm di errore. La prossima foto mostra i valori al di sotto dei 5 mm quindi i punti delle differenze compreso tra 0 e 4: 93 Questa foto ci mostra come già a 5 mm gli errori possono essere considerati trascurabili e da questa immagine in poi si passerà non più a visualizzare i punti oltre un certo valore di soglia e non più quelli minori. Oltre i 5 mm: 94 Oltre i 10mm: 95 Oltre i 20 mm: Le tre immagini mostrate dimostrano come una piccolissima parte dei punti analizzati è affetto da errore e come era stato ipotizzato, e come è visibile, l'errore si riferisce sopratutto hai punti relativi al contorno della figura. L'ultimo test Presa visione delle foto mostrate precedentemente è stato deciso di effettuare un ultimo test utilizzando lo stesso software usato per i test di fronte al muro. In questa serie di misurazioni però utilizzeremo solo le informazioni relative alla percentuale di punti errati dato che tutte gli altri dati risulteranno sbagliati a causa delle condizioni al contorno viste in precedenza. Le ipotesi che sono state fatte pre-test ipotizzano un aumento abbastanza alto dell'errore di 96 piccole dimensioni ma si auspicano comunque buone prestazioni entro i 10 mm. La possibilità che si possano avere valori poco stabili è alta visto il test effettuato precedentemente sempre sul corpo umano 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Err. 0 197815 233288 229517 233663 307200 237232 69890 235364 232962 81062 233274 73025 74950 232805 228248 232504 232907 233972 231666 229546 232697 232090 176667 237330 234357 232353 232033 234483 236451 230176 234718 235580 227930 232480 232271 233978 233631 210377 235496 232749 206807 232339 128504 171905 207549 207264 204070 210070 207420 209330 Err. 2 197815 233288 229517 233663 307200 237232 69975 235417 233013 81062 233274 73025 74950 232805 228362 233043 233478 234482 232101 230124 233112 232471 176956 237569 234568 232599 232290 234686 236649 230269 235163 235993 227930 232668 232398 234167 233774 210531 235621 232927 206807 232426 128677 172578 207902 207601 204505 210520 207733 209696 Err. 5 292915 302500 301283 301993 307200 303306 187548 302978 302715 205949 302651 189859 189489 301829 300266 302284 301967 302330 301857 301142 302417 301445 285757 303210 302590 302211 302061 302780 302727 301305 302220 302655 300458 301907 301703 301946 301628 299474 302377 302255 299036 301717 245891 277111 298998 299368 298660 299603 299279 299785 Err.10 301546 305343 305137 305205 307200 305737 261224 305483 305470 272217 305481 261542 261262 305104 304722 305472 304978 305187 304972 304889 305389 305089 303185 305602 305279 305400 305277 305490 305432 304793 305057 305431 305009 305119 304878 304996 304797 304665 305192 305185 304611 304931 282833 296678 304361 304745 304539 304434 304491 304651 97 %0 64,39 75,94 74,71 76,06 100 77,22 22,75 76,62 75,83 26,39 75,94 23,77 24,4 75,78 74,3 75,68 75,82 76,16 75,41 74,72 75,75 75,55 57,51 77,26 76,29 75,64 75,53 76,33 76,97 74,93 76,41 76,69 74,2 75,68 75,61 76,16 76,05 68,48 76,66 75,76 67,32 75,63 41,83 55,96 67,56 67,47 66,43 68,38 67,52 68,14 %2 64,39 75,94 74,71 76,06 100 77,22 22,78 76,63 75,85 26,39 75,94 23,77 24,4 75,78 74,34 75,86 76 76,33 75,55 74,91 75,88 75,67 57,6 77,33 76,36 75,72 75,62 76,4 77,03 74,96 76,55 76,82 74,2 75,74 75,65 76,23 76,1 68,53 76,7 75,82 67,32 75,66 41,89 56,18 67,68 67,58 66,57 68,53 67,62 68,26 %5 95,35 98,47 98,07 98,31 100 98,73 61,05 98,63 98,54 67,04 98,52 61,8 61,68 98,25 97,74 98,4 98,3 98,41 98,26 98,03 98,44 98,13 93,02 98,7 98,5 98,38 98,33 98,56 98,54 98,08 98,38 98,52 97,81 98,28 98,21 98,29 98,19 97,49 98,43 98,39 97,34 98,22 80,04 90,21 97,33 97,45 97,22 97,53 97,42 97,59 %10 98,16 99,4 99,33 99,35 100 99,52 85,03 99,44 99,44 88,61 99,44 85,14 85,05 99,32 99,19 99,44 99,28 99,34 99,27 99,25 99,41 99,31 98,69 99,48 99,37 99,41 99,37 99,44 99,42 99,22 99,3 99,42 99,29 99,32 99,24 99,28 99,22 99,17 99,35 99,34 99,16 99,26 92,07 96,57 99,08 99,2 99,13 99,1 99,12 99,17 Le ipotesi fatte sono risultate veritiere, come si può vedere c'è stato un forte aumento dell'errore di piccole dimensioni mentre la percentuale di errore sotto i 10mm appare quasi invariata, cosa interessante è anche la percentuale sotto i 5mm ha consegnato un risultato soddisfacente. Questi sono i valor medi: • %=0: 69,23 • %>2: 69,3 • %>5: 94,69 • %>10: 98,02 Questi valori tra l'altro risultano leggermente più bassi data la presenza di qualche risultato particolarmente basso probabilmente dovuto al movimento del soggetto in posa. Questi test effettuati sul corpo insieme ai precedenti e a tutte le immagini raccolte ci permettono di dire che i risultati ottenuti confermano e migliorano le affermazioni fatte da Microsoft che affermò una tolleranza di 1 cm dato che una quantità trascurabile di punti sfora il valore di 1 cm. Possiamo inoltre affermare che poco più del 5% supera i 5 mm di errore. Possiamo considerare 5mm il valore minimo di tolleranza. 98 Lo scanner 3D In questo capitolo verranno descritti tutti i processi di realizzazione dello scanner 3D che si è voluto realizzare per questo progetto, Ovviamente il software è stato realizzato a solo scopo dimostrativo e non a scopo commerciale quindi sarà privo di interfacce grafiche o altre cose utili per interfacciarsi con un utente medio. Verranno descritte solo le righe di codice fondamentali mentre verranno escluse le righe di scarso interesse (come ad esempio i vari import che vengono gestiti automaticamente da Eclipse). All'interno del disco relativo alla tesi sono disponibili tutti i software utilizzati in questa tesi (quindi anche quelli relativi alle sperimentazioni) e sono facilmente visualizzabili importando le relative cartelle su Eclipse. Preparazione di Eclipse Prima di entrare nei dettagli principali del programma è utile spendere due parole riguardanti la configurazione di Eclipse affinché le librerie funzionino con il programma che si vuole creare. Nel momento in cui si vuole creare un nuovo progetto in Eclipse è importante innanzitutto importare le librerie ma procediamo 99 per passi, per prima cosa bisogna andare su Eclipse e creare un nuovo Java Project, il percorso da seguire è semplice: File → New → Java Project; comparirà una schermata di questo tipo. Al posto di “Nome_Progetto” è possibile inserire il titolo che si vuole dare al proprio progetto. Dopo aver inserito il titolo è necessario cliccare su “Next” per poter andare avanti e importare le librerie di cui si ha bisogno. Nella schermata successiva selezionare la sotto-sezione “Libraries”. 100 Le librerie che sono state utilizzate sono esterne alle normali librerie Java quindi in questo caso dovremo cliccare si “Add External Jars”, ovviamente questa operazione andrà ripetuta due volte per importare tutte le dovute librerie. OpenNI dopo l'installazione crea le proprie librerie su Ubuntu in una specifica cartella, il path da seguire è il seguente: “/usr/share/java”. All'interno si troveranno parecchi file .jar, in questo caso selezionare “org.OpenNI.jar”. 101 Nel caso delle librerie Java3D insieme al file di installazione sono presenti anche i tre file .jar di cui si ha bisogno, quindi basterà ripetere l'operazione e selezionare la cartella contenente questi tre file da importare alla stessa maniera. Le operazioni di configurazione non sono concluse dato che le librerie OpeNI utilizzano un file .xml (posizionato all'interno della cartella utilizzata nell'installazione descritta in precedenza), questo file è necessario al funzionamento del Kinect dato che contiene i parametri di configurazione dello stesso, indi per cui per far funzionare il Kinect per prima cosa bisognerà aggiungere all'interno della cartella con il vostro progetto una ulteriore cartella “Data” contenente il file .xml, in seguito nella classe che utilizza i metodi OpenNI, in fase di dichiarazione delle variabili queste tre righe di codice: private static final long serialVersionUID = 1L; private OutArg<ScriptNode> scriptNode; private Context context; private final String SAMPLE_XML_FILE = "Data/SamplesConfig.xml"; Dopodiché bisognerà inizializzare lo “ScriptNode” e il “Context” in questa maniera: scriptNode = new OutArg<ScriptNode>(); context = Context.createFromXmlFile(SAMPLE_XML_FILE, scriptNode); Alla fine di questo processo il programma sarà pronto ad utilizzare il Kinect e le librerie 3D. 102 Introduzione Le azioni da eseguire Questo piccolo paragrafo non serve a mostrare codice ma a spiegare in poche parole l'idea alla base del software, in modo tale che di seguito sarà possibile comprendere meglio le classi e i metodi utilizzati conoscendo per l'appunto già i passaggi ideali da effettuare. L'idea alla base del Software è molto semplice ed efficace, principalmente si basa sull'utilizzo delle librerie OpenNI al fine di estrarre le informazioni che ci servono quindi il vettore con i valori numerici di profondità, tutte le altre funzioni relative al Kinect come ad esempio il riconoscimento del corpo o dei movimenti non verranno assolutamente utilizzate in questo progetto. Una volta ottenute tali informazioni si ha la necessità di utilizzarle a dovere per tracciare dei punti o delle superfici in uno spazio tridimensionale, in questo caso andiamo ad utilizzare le classi e i metodi messi a disposizione da Java3D che permettono di tracciare punti, linee e figure geometriche (e molto altro) all'interno di uno spazio 3D. Ovviamente utilizzare questo tipo di librerie è stata una scelta e non un obbligo, per effettuare ciò si potevano utilizzare molti altri metodi che possono consistere nell'esportazione diretta del vettore di punti in altri ambienti di programmazione o addirittura in altri linguaggi di programmazione. 103 All'interno di uno spazio tridimensionale la definizione di punti può essere effettuata attraverso l'utilizzo di differenti tipi di coordinate come ad esempio le coordinate sferiche in cui si indica un vettore e i due angoli di scostamento dalle assi oppure le coordinate cartesiane che molto più intuitivamente indicano sui tre assi le tre componenti che in seguito identificano il punto. Le librerie Java3D permettono di tracciare punti attraverso l'utilizzo di coordinate cartesiane quindi specificando le tre componenti degli assi. Per tracciare i punti all'interno dello spazio 3D sono stati sfruttati i valori della risoluzione della camera a infrarossi insieme ai valori di profondità. Per la precisione punto per punto viene specificato il valore di altezza e di larghezza corrispondente della fotocamera, che verranno memorizzati rispettivamente con il valore sull'asse y e sull'asse x, mentre per la componente z è stato utilizzato il valore di profondità al negativo, ciò si fa perché se si utilizzasse il valore normale l'immagine apparirebbe invertita dato che ad un valore più piccolo corrisponderebbe una maggior vicinanza al sensore e una maggior vicinanza al centro dello spazio 3D, ma siccome l'osservatore è posto al di fuori dello spazio 3D un punto più vicino apparirebbe più lontano. 104 Per rendere meglio l'idea della proiezione 3D si può prendere ad esempio l'ultimo punto dell'immagine che ipoteticamente si trova ad un metro di distanza, le coordinare proiettate saranno X=640, Y=480, Z=-1000, questo perché, come specificato in precedenza, la risoluzione della fotocamera sono 640X480. Quello che è stato illustrato adesso non è effettivamente il funzionamento effettivo del nostro progetto ma solo una spiegazione per rendere l'idea di ciò che si sta per realizzare, in fase di sviluppo in realtà sono state utilizzate ulteriori tecniche per tracciare l'immagine che verranno spiegate e giustificate nei prossimi paragrafi. Descrizione del software Il primo prototipo Per creare il primo prototipo dello Scanner 3D sono state seguite esattamente le linee guida descritte precedentemente. Il primo prototipo permette semplicemente di visualizzare un'immagine a tre dimensioni di un oggetto posto di fronte al Kinect tracciando solo i punti utili (quindi ignorando punti disposti ad una certa distanza ovvero lo sfondo). Per chi avesse a disposizione, oltre a questa tesi, anche il CD allegato, troverete all'interno dei programmi utilizzati la cartella relativa al primo Scanner che per l'appunto si chiama “Scanner3D”, questo software è composto da due classi: “DepthCreator” e “PointScan”. 105 DepthCreator è la classe che prende informazioni dal Kinect, molte righe di codice sono state antecedentemente descritte (le istruzioni relative alla configurazione), le principali righe di nostro interesse sono le seguenti: private DepthGenerator depthGen; private ShortBuffer dpt; private DepthMetaData depthMD; private int[] arrayDepth; Queste sono le variabili di principale interesse che verranno utilizzate per generare l'array di punti, brevemente possiamo dire che l'oggetto DepthGenerator si collega direttamente al Kinect, per la precisione si collega alla fotocamera ad infrarossi, DepthMetaData raccoglie le informazioni catturate da DepthGenerator, ShortBuffer contiene i valori di profondita in formato short mentre l'oggetto arrayDepth viene utilizzato per immagazzinare questi valori in un array di interi. depthGen = DepthGenerator.create(context); depthMD = depthGen.getMetaData(); width = depthMD.getFullXRes(); height = depthMD.getFullYRes(); dpt=depthMD.getData().createShortBuffer(); arrayDepth=new int[dpt.capacity()]; for(int i=0;i<dpt.capacity();i++){ arrayDepth[i]=dpt.get(i); } 106 Il seguente ciclo di istruzioni crea il generatore di profondità utilizzando l'oggetto “context”, quest'oggetto è stato descritto in precedenza e riguarda l'utilizzo del file .xml di configurazione. Una volta creato il DepthGenerator si ottiene da esso l'oggetto depthMD che contiene i dati ottenuti dal generatore, questi dati di seguito verranno utilizzati per fornirci i valori che necessitiamo per creare l'immagine quindi larghezza, altezza e profondità; rispettivamente width, height e dpt. Per concludere il ciclo di for memorizza gli short in un array di interi. Di seguito verranno descritti tre metodi. public int getWidth(){ return this .width; } public int getHeight(){ return this .height; } public int[] getDepth(){ return this .arrayDepth; } 107 Questi tre metodi sono dei semplici metodi che restituiscono i tre valori e che verranno utilizzati dalla seconda classe per il tracciamento dei punti. La classe PointScan è la classe addetta al tracciamento e contiene il main del programma. Molto del codice di questa classe è stato preso per comodità dal libro elettronico “Java 3d – Guida di base” di Francesco Milanese. La classe ha come compito quello di creare lo spazio 3D, riempirlo e permettere di navigarlo con i tasti di movimento. this .setTitle("Immagine 3D"); this .setSize(1000,1000); this .setLocation(30,30); this .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D = new Canvas3D(config); this .getContentPane().add(canvas3D,BorderLayout.CENTER); BranchGroup scene = creaLoSceneGraph(); SimpleUniverse simpleU = new SimpleUniverse(canvas3D); simpleU.getViewer().getView().setBackClipDistance(10000); simpleU.getViewer().getView().setFrontClipDistance(0); TransformGroup vpTG = simpleU.getViewingPlatform().getViewPlatformTransform(); Transform3D t3d = new Transform3D(); t3d.setTranslation(new Vector3f(0.0f,0.3f,2.0f)); vpTG.setTransform(t3d); KeyNavigatorBehavior keyNavBeh = new KeyNavigatorBehavior(vpTG); 108 keyNavBeh.setSchedulingBounds(new BoundingSphere(new Point3d(),1000.0)); scene.addChild(keyNavBeh); scene.compile(); simpleU.addBranchGraph(scene); Tutto questo codice rimane relativo alla formazione dello spazio 3D, le librerie Java 3D usano gli oggetti Simple Universe per creare lo spazio da riempire in seguito, molti dei comandi sono semplici comandi per migliorare la visualizzazione e decidere la posizione dell'osservatore. Le righe relative alla classe KeyNavigatorBehaviour impostano automaticamente i comandi per la navigazione all'interno dello spazio. Le ultime righe mostrano come tutto ciò che viene creato viene agganciato al Simple Universe. Di tutta questa parte di codice la riga più interessante è quella che richiama la creazione dello Scene Graph che creerà un oggetto chiamato scene che si andrà ad aggiungere all'universo. BranchGroup scene = creaLoSceneGraph(); Tale comando richiama il seguente metodo: private BranchGroup creaLoSceneGraph() { BranchGroup objRoot = new BranchGroup(); objRoot.addChild(this .disegnaPunti()); return objRoot; } 109 che a sua volta richiama il metodo di maggiore interesse, ovvero il creatore di punti “disegnaPunti”. private Shape3D disegnaPunti() { // Creo un nuovo oggetto PointArray, composto da tre elementi // Imposto le coordinate dei tre punti DepthCreator dp=new DepthCreator(); int w=dp.getWidth(); int h=dp.getHeight(); int[] depth=dp.getDepth(); int[] ver={w*h}; PointArray pa = new PointArray(w*h, GeometryArray.COORDINATES | GeometryArray.COLOR_3); int z=0; int x=0; int y=0; for (y=0 ;y<h ;y++){ if(x==w)x=0; for(x=0;x<w;x++){ if(depth[z]>500 && depth[z]<1000){ pa.setCoordinate(z, new Point3d(-x/1, -y/1,depth[z])); Color3f xc = new Color3f(0.1f, 0.9f, 0.1f); pa.setColor(z,xc); System.out.println(depth[z]); } 110 else ; z++; } } return new Shape3D(pa); } Questo metodo è il cuore pulsante del sistema ed è quello che s'incarica di filtrare e disegnare i punti di maggior interesse. All'inizio del metodo vengono dichiarate le variabili che sono state chiamate intuitivamente X,Y e Z dato che settano le coordinate. In seguito partono due cicli for annidiati, questa parte è molto importante dato che per creare l'immagine bisogna far sovrapporre pezzi dell'array di profondità lunghi quanto la larghezza dell'immagine per tutta l'altezza dell'immagine. In questo caso si fa scorrere il vettore X fino al valore di larghezza dell'immagine dopodiché lo si azzera una volta raggiunto il massimo e si fa aumentare il valore di Y per poi far ripartire X. Da notare alla fine di tutto l'istruzione “Z++;” che è stata posizionata in maniera tale da incrementare ad ogni ciclo di X il valore di Z, in poche parole Z è un contatore che scorre lungo il vettore di profondità. L'istruzione: if(depth[z]>500 && depth[z]<1000) ha l'utilità di considerare punti entro una certa distanza i quali verranno disegnati, altrimenti verranno ignorati. 111 L'oggetto che si incarica di disegnare i punti è l'oggetto pa della classe PointArray, in poche parole crea un array di punti che verrà riempito con oggetti point dove verranno settate le coordinate. All'interno dell'if è possibile notare i vari punti che vengono creati con il comando: depth[z])); pa.setCoordinate(z, new Point3d(-x, -y,- come è ovvio che sia viene inserita prima la coordinata X, poi Y e infine Z. Da notare il simbolo – presente per ogni coordinata, per quanto riguarda la profondità è stato spiegato precedentemente come fare, per le coordinate X e Z invece è stato messo il segno meno dato che, per come sono regolati i cicli for, l'immagine altrimenti risulterebbe capovolta e specchiata. Nello specifico i due cicli for farebbero scorrere i pixel dal punto più basso a sinistra scorrendo verso destra e risalendo verso l'alto (ovvero crescendo in positivo sia sull'asse X che sull'asse Y), per questo motivo, per ovviare a questo problema, è stato aggiunto il simbolo meno. Le versioni successive del software andranno proprio a modificare questa parte in modo tale che l'immagine sia centrata. Il restante codice setta il colore ai punti e restituisce l'oggetto Shape3D che verrà poi agganciato all'universo. La prima immagine d'esempio realizzata con questo programma è la seguente. 112 Il secondo prototipo Il secondo software che è stato creato per questo progetto è una specie di aggiornamento del primo, nel CD allegato a questa tesi ha il nome di “Scanner 3D 1.1”. Sostanzialmente le funzioni di questo secondo software sono esattamente identiche a quelle del primo precedentemente descritto, la differenza fondamentale sta nello spazio in cui vengono disegnati i punti. Il codice relativo allo “Scanner 3D 1.1” è identico al precedente tranne che per la parte seguente che è stata modificata. int z=0; int x=0; int y=0; 113 int distanza=1400; for (y=h/2 ;y>-h/2 ;--y){ if(x==-w/2)x=w/2; for(x=w/2;x>-w/2;--x){ if(depth[z]>500 && depth[z]<distanza){ pa.setCoordinate(z, new Point3d(x, y,distanzadepth[z])); Color3f xc = new Color3f(0.1f, 0.9f, 0.1f); pa.setColor(z,xc); System.out.println(depth[z]+" "+w); } else ; z++; } } return new Shape3D(pa); } Sostanzialmente le differenze principali si riferiscono ai due cicli di for annidiati. Come si può notare non si parte piu da un contatore posto a zero fino a crescere al valore dell'altezza o della larghezza (espresse tramite i valori di h e w) ma si parte da metà altezza/larghezza fino a decrescere a meno metà altezza/larghezza: for (y=h/2 ;y>-h/2 ;--y) for(x=w/2;x>-w/2;--x). Questo procedimento si fa principalmente per mantenere il centro della proiezione dei punti come se fosse il centro dell'inquadratura. In termini pratici questa operazione non comporta nessun cambiamento in particolare dato che nello 114 spazio 3D non si può visualizzare il centro del piano cartesiano quindi per un visualizzatore la differenza non sarà percepita. Il secondo cambiamento importante invece è stato fatto nella modifica della coordinata di profondità, i componenti importanti di questo cambiamento sono il filtro di profondità: && depth[z]<distanza), coordinate: if(depth[z]>500 e l'istruzione che crea i punti con le dovute pa.setCoordinate(z, new Point3d(x,y,distanza-depth[z]));. Questi passaggi sono funzione della variabile distanza, che in questo esempio è inizializzata a 1400 mm. Questa dipendenza è fondamentale per il passaggio successivo di questo programma. Il valore di “distanza” è il valore, per l'appunto, della distanza che intercorre tra il Kinect e il centro dell'oggetto che si vuole scansionare. distanza Il programma utilizzerà come informazioni rilevanti solo quelle comprese tra 50 cm e il valore di distanza, questo per quanto riguarda il filtro. Per quanto riguarda il tracciamento dei punti, l'istruzione distanza-depth[z] fa in modo che i punti vengano tracciati uscenti dal piano dell'origine con profondità zero, 115 cosicché il valore proiettato è il valore della distanza del punto dell'oggetto dal piano che lo taglia parallelamente al Kinect passante per il centro. Per fare un esempio ipotizziamo un oggetto avente il centro a 1 m e mezzo di distanza dal Kinect (1500 mm) e, sempre per ipotesi, un punto della superficie di questo oggetto si trova a 1300 mm d distanza dal Kinect. Dopo aver effettuato la scansione il Kinect restituirà i valori di profondità e, nel caso di quel punto specifico, il valore sarà di 1300; nel momento in cui il programma andrà a calcolare il punto da disegnare assegnerà il valore di 1500-1300 ovvero 200mm che è esattamente la distanza di quel punto dal piano passante per il centro. Visivamente il risultato sarà l'oggetto scansionato a metà come se fosse stato tagliato in due. Come già detto prima queste modifiche non comportano alcuna differenza di visualizzazione ma risulteranno importanti per il passaggio successivo, lo scanner rotante. Lo scanner a 360 gradi L'ultimo programma che verrà descritto è l'evoluzione del precedente ed anche in questo caso le modifiche apportate al codice saranno minime ma significative. Ovviamente tutto ciò è un prototipo funzionante di quello che vorrà essere in futuro un oggetto di tale portata. Questo prototipo è stato testato con oggetti piccoli e non direttamente sul corpo umano a causa della 116 mancanza di dispositivi e spazi adatti a fare le dovute misurazioni. Il principio di funzionamento Il passaggio dallo scanner precedente allo scanner a 360 gradi verte principalmente sul fatto di poter far girare o il sensore o l'oggetto preso in considerazione. La sperimentazione da noi svolta è avvenuta mantenendo fermo il sensore e facendo girare l'oggetto selezionato. Il programma effettuerà una serie di scatti che cambieranno a seconda dell'angolo di rotazione dell'oggetto (per esempio nel caso di una rotazione di 90° si effettueranno 4 scatti), ogni scatto verrà posto nello spazio tridimensionale traslato a seconda dell'angolo di spostamento, per l'esattezza le immagini ruoteranno intorno all'asse Y. Per questo motivo il precedente scanner è stato impostato in maniera tale da visualizzare l'oggetto uscente dal piano perpendicolare all'asse delle profondità Z e passante per il centro, in questa maniera la traslazione delle immagini catturate riguarderà solo la rotazione e non l'avvicinamento al centro. Il programma Come specificato in precedenza, il programma non varierà di molto la parte relativa al codice. Il nome che gli è stato dato è “Scanner 3D 2.0” e alle normali due classi descritte in precedenza è stata aggiunta una classe in cui è racchiuso il main e in cui è possibile specificare il numero di scatti da fare, automaticamente il programma memorizzerà il valore del numero di scatti in una variabile e calcolerà l'angolo di 117 spostamento: teta=360/n;. step=n; Il resto del programma fondamentalmente è uguale al precedente, il procedimento di scatto e di disegno dei punti utilizza lo stesso codice del precedente con qualche differenziazione. Innanzitutto un ciclo di for dipendente dal valore “step” ripeterà gli scatti a seconda del valore memorizzato: i=1;i<=step;i++). for(int In seguito si utilizzerà il valore di “teta” per variare l'angolo a seconda del numero di giro di for: int teta2=teta*(i-1); . Nella variabile “teta2” è memorizzato l'angolo di spostamento ad ogni step che verrà utilizzato per traslare l'immagine e proiettarla nella giusta posizione. Per effettuare questo spostamento verrà utilizzata la formula di traslazione seguente: x '=xcos (∂)− ysin(∂) y '=xsin(∂)+ ycos(∂) In questa formula possiamo vedere come il valore della coordinata principale cambia dipendentemente dall'angolo generando coordinate traslate contrassegnate dall'apice. La formula appena descritta è valida per una traslazione di funzioni sull'asse cartesiano in due dimensioni, ma può tranquillamente essere applicata per la rotazione di punti lungo un asse. Nel caso qui descritto la rotazione avviene intorno all'asse Y quindi per effettuarla con successo basterà semplicemente utilizzare la formula precedente scambiando il valore di Y con la profondità Z. In righe di codice la formula si traduce nella seguente maniera: pa.setCoordinate(z+((i-1)*(w*h)), depth[z])*sent), y,(x*sent)+ new Point3d((x*cost)-((distanza- ((distanza-depth[z])*cost)));. 118 Difatti il valore di Y rimarrà invariato mentre i restanti valori saranno influenzati dalla formula. Nel dettaglio avremo X'=(x*cost)-((distanza-depth[z])*sent) Z'=(x*sent)+ ((distanza-depth[z])*cost) Il calcolo del coseno e del seno è stato eseguito utilizzando le librerie matematiche fornite da Java: double cost=Math.cos(Math.toRadians(teta2)); double sent=Math.sin(Math.toRadians(teta2)); Le prove di scansione Il software cosi creato ideologicamente funziona ma per testarlo sono state effettuate alcune prove. Le prime prove effettuate sono state svolte con un piatto girevole in cui sono stati indicati gli angoli e veniva fatto girare manualmente ad ogni scatto. Qui di seguito viene mostrata una foto dello spazio in cui è stato effettuato l'esperimento. 119 Le primi immagini ottenute hanno messo in evidenze problemi relativi alla calibrazione dello strumento prima di iniziare la scansione, calibrazione difficile da effettuare senza l'utilizzo di strumenti adatti. Come si evince da questa immagine la scansione effettivamente ricopre un angolo di 360° ma i 4 scatti non combaciano perfettamente e si può notare un certo sfasamento tra le 4 immagini. Ciò è dovuto al non perfetto posizionamento al centro dell'inquadratura che crea uno sfasamento degli scatti o a destra o a sinistra, e ad un non preciso calcolo della distanza dal centro del piatto che può causare un allontanamento degli scatti o la mancata scansione di alcune parti. 120 Conclusioni Considerazioni finali Preso atto dei risultati ottenuti con le sperimentazioni e considerando il corretto funzionamento dei prototipi di scanner sviluppati si è potuti giungere a conclusione di questo progetto con le seguenti conclusioni e considerazioni finali. Il Kinect si è rivelato uno strumento utile per la sua versatilità, compattezza e rapidità di utilizzo. Il rapporto qualità prezzo lo rende al momento molto competitivo sul mercato sopratutto per lo sviluppo di nuove futuristiche applicazioni. I prototipi realizzati hanno dimostrato che lo scanner è funzionante e, con la dovuta calibrazione, può risultare un ottimo strumento per le misurazioni biometriche. La possibilità inoltre di individuare le zone del corpo in cui si ha avuto una crescita maggiore rispetto ad altre è possibile visti i risultati ottenuti. Abbiamo dimostrato che il Kinect, ignorando una piccola quantità non rilevante, può creare una mappa di profondità con un errore di un centimetro, ma possiamo anche affermare che il sensore, per circa il 95% dei punti rilevati ha un margine di errore di 5 mm, che per le misure biometriche è un valore di tolleranza accettabile in confronto agli strumenti presenti oggi. 121 Possibilità di sviluppo Rispetto alle prestazioni, la qualità degli altri scanner illustrati in questa tesi risulta molto maggiore rispetto a quella del Kinect, ma con i dovuti accorgimenti software le prestazioni dell'oggetto andranno sicuramente ad aumentare, l'utilizzo dei giusti filtri e l'interpolazione corretta dei punti permetterà l'eliminazione quasi totale delle quantità di errore individuate nei test fino a portare il margine di errore dall'un centimetro al millimetro. Con un margine di errore cosi basso si potranno senz'altro aumentare il numero di applicazioni a cui il Kinect potrà essere destinato, fino alle misurazioni di precisione. Ulteriori sviluppi si potrebbero ottenere inoltre accoppiando alla mappatura del corpo eseguita con il Kinect, l'uso delle funzioni di riconoscimento del movimento, uno strumento tale potrebbe essere utile in campo biomedico per la ginnastica di cura della postura o per la riabilitazione di pazienti in fisioterapia. Le possibilità si allargherebbero anche oltre la medicina, le ipotesi più probabili potrebbero essere l'uso del Kinect per migliorare le tecniche e le posizioni di uno sportivo (a seconda dello sport praticato) oppure come un economico strumento di motion capture per registi alle prime armi. 122 Bibliografia 1. Understanding Motion Capture for computer animation and videogames, Alberto Menache (2000); 2. Analisi del movimento, Jacquelin Perry, M. G. Benedetti, Elsevier (2005); 3. Integrazione di un sistema di Motion Capture in un sistema virtuale interattivo, Francesco Vottari; 4. How does the Kinect work; John MacCormick 5. La telemedicina, Giampiero Papi, Fabrizio L. Ricci; 6. Java3D guida di base, Freancesco Milanese; 7. Ready to run Java 3D, K.Brown, D.Petersen, John Wiley & Sons Inc.; 8. 3D Users Interfaces with Java, J. Barrileaux, Manning publications company; 9. PrimeSense: http://www.primesense.com/ 10. [Guida] Kinect su Ubuntu 11.10: http://discoverylinux.wordpress.com/2011/12/30/guida-kinect-suubuntu-oneirc-11-10-openni-e-sensorkinect/ 11. Kinect Pattern Uncovered: http://azttm.wordpress.com/2011/04/03/kinect-pattern-uncovered/ 12. OpenNI: http://openni.org/ 123 124 Ringraziamenti Finalmente ci siamo, anche io ho finito questa benedetta università. C'ho messo un po' più del dovuto ma è andata bene, ci siamo divertiti. Sarebbe bello dire di aver fatto tutto da solo ma non è cosi. Innanzitutto per la stesura di questa tesi bisogna ringraziare professore, assistenti e le mie due cavie che ho utilizzato per fare i test. Adesso passiamo al discorso riguardante gli anni in università, inizierei dall'appoggio dei familiari + Bruno (ormai è de famiglia) che, per quanto c'abbiano creduto poco, alla fine hanno sperato fino all'ultimo. A mia madre Elda e a mio padre Cesare (Augusto) un grazie sincero per l'appoggio e l'aiuto dato in questi anni (visto che alla fine ce l'ho fatta!!!), mio padre non sa il nome di un esame di quelli che ho fatto ma alla fine sa che li passavo quindi va bene ma devo dire che ha foraggiato. Mia sorella Francesca era quella che forse un pochino ci credeva ma non capiva come facevo, intanto la ringrazio anche come cavia. Poi c'è un certo Paco che dice di conoscermi ma io non lo conosco e mi parla sempre di Porto Rico, vuole aprire un bar. 125 Un grazie va a Piero e Donatella (miei zii per chi non lo sapesse) che oltre a supporto psicologico hanno offerto sopratutto quello culinario, e non saltiamo le mie cuginette che qui abbrevierò con SS (Silvia e Sara), che poi loro proprio non c'hanno mai creduto. Ultimi in famiglia, ma non ultimi, sono quelli che lo hanno creduto possibile fino alla fine pur non capendo bene quello che stavo facendo, mi riferisco a Nazzareno e Matilde. Ora passiamo al settore relativo agli amici, quel branco di maledetti (è una tesi non posso usare parolacce) che vuoi non vuoi in qualche maniera sono tornati utili. I Coniugi Cagnetti – Ripanucci, i Coniugi Ceccarelli – Alesiani e Mario ZeroUno (50 € per lo sponsor prego) che mi hanno stressato la vita per anni e quando sono fuggito mi sono pure venuti a cercare in Spagna. A tutto lo Staff Bar King per il supporto di Malto, Luppolo e Montenegri vari forniti in questi anni, con lo Staff intendo anche quel branco di alcolisti decerebrati che lo hanno frequentato per tutto questo tempo, per la lista dei nomi rimando alla mia rubrica del cellulare. Passiamo ora a quegli animali che hanno condiviso con me anni di università. Il primo pensiero va a tutti coloro con cui ho convissuto (tranne Middio), quindi in primis direi sempre Mario ZeroUno(altri 50) Mario Ce, el ruge, e mettiamoci pure Giuseppe, dopodichè consideriamo anche Giancarlo Daniele e Michele (insomma tutti tranne Middio), per concludere anche le 126 mie ultime coinquiline Angela e, seppur per pochi giorni, Yugi ma questa è un'altra storia. Dopodiché passerei a salutare le donnine della Casa Maiolati, sempre pronte ad una bevuta in caso di noia anconetana. Infine il gruppo di studi più figo del mondo composto da Trollo, Terni, Telespalla Bob, ZeroUno, u Sergio e, seppur arrivato più tardi un certo Dj Ellenico. L'ultimo pensiero vola a Barcellona per salutare e ringraziare tutti i terroristi e i frequentatori di Carrer Balmes 52, ovvero tutti i terroristi di Ancona, i compagni portoghesi, tutto l'ammasso di crucchi, il resto del mondo, e tutti i restanti italiani che non venivano da Ancona. Parte del mio fegato e del mio cervello è rimasto in quella casa con voi. 127