Analisi e sintesi dei gesti comunicativi per gli - Maurizio Mancini
Analisi e sintesi dei gesti comunicativi per gli - Maurizio Mancini
Analisi e sintesi dei gesti comunicativi per gli - Maurizio Mancini
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Indice<br />
Indice________________________________________________________________________1<br />
Ringraziamenti ________________________________________________________________4<br />
Introduzione __________________________________________________________________5<br />
I Gesti <strong>comunicativi</strong> ___________________________________________________________14<br />
I.1 La conversazione Faccia-a-Faccia_________________________________________________14<br />
I.1.1 Proposizione e interazione____________________________________________________________ 15<br />
I.1.2 Multimodalità _____________________________________________________________________ 16<br />
I.1.3 Temporizzazione ___________________________________________________________________ 17<br />
I.2 I <strong>gesti</strong> nella conversazione _______________________________________________________17<br />
I.2.1 Gesticolazione e tipi di gesto__________________________________________________________ 20<br />
I.2.2 Fasi del gesto______________________________________________________________________ 21<br />
I.3 Contenuto rematico e tematico ___________________________________________________23<br />
I.4 Sintesi <strong>dei</strong> <strong>gesti</strong> <strong>comunicativi</strong> _____________________________________________________24<br />
I.4.1 Marcatori delle convinzioni___________________________________________________________ 25<br />
I.4.2 Marcatori de<strong>gli</strong> obbiettivi ____________________________________________________________ 26<br />
I.4.3 Marcatori delle emozioni_____________________________________________________________ 27<br />
II Stato dell’arte ______________________________________________________________28<br />
II.1 Definizione di agente conversazionale_____________________________________________28<br />
II.2 GesSyCa (Thierry Lebourque & Sylvie Gibet, 1999) ________________________________29<br />
II.3 MAX (Stefan Kopp, 2001) ______________________________________________________32<br />
II.4 REA (Justine Cassell & HaoYan, 2000) ___________________________________________34<br />
II.5 Cosmo (Lester et al., 1997) ______________________________________________________37<br />
II.5.1 Implementazione – Internet Advisor Learning Environment_________________________________ 38
Introduzione<br />
II.6 Confronti con Greta ___________________________________________________________39<br />
III L’agente Greta ____________________________________________________________41<br />
III.1 Introduzione_________________________________________________________________41<br />
III.2 Un esempio di interazione______________________________________________________42<br />
III.3 Descrizione del sistema ________________________________________________________44<br />
IV Il sistema <strong>dei</strong> <strong>gesti</strong> __________________________________________________________47<br />
IV.1 Motore gestuale ______________________________________________________________47<br />
IV.2 Motore gestuale di Greta_______________________________________________________49<br />
IV.3 Dal motore originario a quello finale _____________________________________________50<br />
IV.4 Il motore originario ___________________________________________________________52<br />
IV.4.1 Concretizzatore <strong>gesti</strong> ______________________________________________________________ 52<br />
IV.4.2 Pianificatore del movimento_________________________________________________________ 53<br />
IV.4.3 BAP Player ______________________________________________________________________ 56<br />
IV.5 Il motore finale_______________________________________________________________57<br />
IV.5.1 Il linguaggio APML e il parser APML_________________________________________________ 57<br />
IV.5.2 Festival _________________________________________________________________________ 59<br />
IV.5.3 Pianificatore <strong>dei</strong> <strong>gesti</strong> ______________________________________________________________ 59<br />
IV.6 Il linguaggio GestureScript_____________________________________________________60<br />
V Motore gestuale_____________________________________________________________66<br />
V.1 Pianificazione <strong>dei</strong> <strong>gesti</strong> <strong>comunicativi</strong> ______________________________________________66<br />
V.2 Un esempio___________________________________________________________________67<br />
V.3 Implementazione ______________________________________________________________71<br />
V.4 Selettore <strong>dei</strong> <strong>gesti</strong>______________________________________________________________73<br />
V.5 Gesti <strong>dei</strong>ttici <strong>per</strong> l’agente Greta__________________________________________________75<br />
V.6 Cinematica diretta e inversa_____________________________________________________75<br />
V.7 Cinematica inversa: IKAN ______________________________________________________79<br />
V.8 Dinamica <strong>dei</strong> <strong>gesti</strong> e posizioni di riposo multiple ____________________________________82<br />
VI Tools di supporto ___________________________________________________________85<br />
VI.1 La dipendenza da Maya _______________________________________________________85<br />
2
Introduzione<br />
VI.2 Editor delle pose______________________________________________________________87<br />
VI.3 Implementazione dell’editor delle pose ___________________________________________91<br />
VI.3.1 Lo scheletro _____________________________________________________________________ 91<br />
VI.3.2 Il modello _______________________________________________________________________ 94<br />
VI.4 BAP player __________________________________________________________________97<br />
VI.5 La codifica BAP ______________________________________________________________98<br />
VI.6 Implementazione del BAP player_______________________________________________100<br />
VI.7 Editor <strong>dei</strong> <strong>gesti</strong> ______________________________________________________________103<br />
VII Conclusioni e sviluppi futuri________________________________________________107<br />
VII.1 Conclusioni ________________________________________________________________107<br />
VII.2 Sviluppi futuri______________________________________________________________108<br />
Appendice A ________________________________________________________________110<br />
Il metodo Draw della classe Joint ___________________________________________________110<br />
Il metodo ModelDraw della classe Joint _____________________________________________111<br />
Appendice B ________________________________________________________________113<br />
Tabella <strong>dei</strong> gruppi BAP ___________________________________________________________113<br />
Elenco <strong>dei</strong> BAP in ogni gruppo _____________________________________________________114<br />
Appendice C ________________________________________________________________116<br />
Il modello H-Anim _______________________________________________________________116<br />
H-Anim: Gerarchia delle giunture __________________________________________________117<br />
H-Anim: posizione delle giunture ___________________________________________________118<br />
Bibliografia_________________________________________________________________121<br />
3
Introduzione<br />
Ringraziamenti<br />
Vorrei ringraziare tutte le <strong>per</strong>sone che mi hanno <strong>per</strong>messo di arrivare fin qui.<br />
Ringrazio in primo luogo la professoressa Catherine Pelachaud <strong>per</strong> avermi seguito<br />
durante il <strong>per</strong>iodo della tesi con pazienza e professionalità.<br />
Ringrazio molto la mia fami<strong>gli</strong>a <strong>per</strong> la lunga resistenza e il supporto morale e finan-<br />
ziario.<br />
Ringrazio tutte le <strong>per</strong>sone che conosco <strong>per</strong> i momenti piacevoli trascorsi insieme.<br />
Un ringraziamento particolare a molte delle <strong>per</strong>sone che ho conosciuto durante il<br />
mio servizio civile <strong>per</strong>ché è stato in quel <strong>per</strong>iodo che ho deciso che avrei portato a<br />
termine <strong>gli</strong> studi universitari.<br />
Ringrazio le <strong>per</strong>sone con cui suono da molto tempo <strong>per</strong> aver condiviso con me la<br />
passione <strong>per</strong> la musica.<br />
Ringrazio la mia Compagnia di tiro con l’arco <strong>per</strong>ché tirando sono riuscito a rilas-<br />
sarmi anche nei giorni in cui ero molto preso dallo studio.<br />
Infine saluto e ringrazio Elisabetta Bevacqua, Massimo Bilvi e Bjoern Hartmann che<br />
si occupano insieme a me di Greta.<br />
4
Introduzione<br />
Introduzione<br />
Gli esseri umani comunicano tra di loro non solo attraverso il linguaggio. Durante<br />
una conversazione le braccia e le mani delle <strong>per</strong>sone mimano forme e azioni mentre<br />
l’intonazione della voce sale nel raggiungere la parte importante della frase. Nel frat-<br />
tempo <strong>gli</strong> occhi si muovono, le palpebre si chiudono e riaprono varie volte più o<br />
meno rapidamente e tutto il corpo segue lo svolgersi della conversazione modifi-<br />
cando la sua postura.<br />
I comportamenti appena descritti vengono definiti con un unico termine: comunica-<br />
zione non-verbale. La loro funzione comunicativa si pone come complementare o ri-<br />
dondante rispetto a quella del linguaggio parlato.<br />
Prenderemo in esame l’aspetto gestuale della comunicazione non-verbale in quanto<br />
attinente a<strong>gli</strong> argomenti trattati in questa tesi.<br />
Si tratta di un vero e proprio “canale” di comunicazione che svolge un ruolo centra-<br />
le. Basti pensare che una <strong>per</strong>sona che si trova in un paese straniero di cui non cono-<br />
sce la lingua riesce a comunicare abbastanza agevolmente grazie ai soli <strong>gesti</strong>. Questi<br />
rivelano molto dello stato emotivo di una <strong>per</strong>sona (ad esempio spesso i <strong>gesti</strong> tradi-<br />
scono chi non sta dicendo la verità). Ricordiamo, ad esempio, che i <strong>per</strong>sonaggi poli-<br />
5
Introduzione<br />
tici in occasione di interventi pubblici studiano con molta attenzione anche il lato<br />
gestuale <strong>dei</strong> loro discorsi.<br />
Tutto quello che abbiamo detto finora riferendoci all’interazione tra le <strong>per</strong>sone (po-<br />
tremmo anche dire interazione uomo-uomo, cioè tra esseri umani) potrebbe in<br />
qualche modo essere trasferito all’interazione uomo-macchina e più precisamente<br />
alla progettazione di interfacce utente [48].<br />
L’interfaccia utente è quella parte del computer che <strong>per</strong>mette alle <strong>per</strong>sone di accede-<br />
re alle funzionalità del computer stesso [52].<br />
Dalla nascita <strong>dei</strong> primi sistemi a oggi sono stati progettati e realizzati molti tipi di in-<br />
terfaccia, dalle prime semplicissime a riga di comando fino ad arrivare a quelle in cui<br />
l’utente può dialogare direttamente col computer.<br />
Gli agenti conversazionali sono un tipo di interfaccia. Più esattamente sono delle inter-<br />
facce multimodali e antropomorfiche. Le loro caratteristiche principali sono quelle di ave-<br />
re un aspetto visivo simile a quello dell’uomo e di essere capaci di interagire con<br />
l’utente comunicando sia verbalmente che non-verbalmente [8].<br />
Il motivo principale del loro utilizzo nell’interazione uomo-macchina risiede nel fat-<br />
to che, come è stato varie volte dimostrato, le <strong>per</strong>sone tendono a interagire con i<br />
computer come se essi fossero a loro volta esseri umani e ritengono le informazioni<br />
fornite da <strong>per</strong>sonaggi animati molto più attraenti [13].<br />
Diamo allora una definizione più precisa di agente conversazionale [8]:<br />
un agente conversazionale è un’interfaccia che utilizza la rappresentazione visiva di un<br />
corpo umano o animale e che è capace di:<br />
♦ riconoscere e rispondere ad input verbali e non verbali<br />
♦ generare output verbali e non verbali<br />
♦ tener conto di eventi particolari della conversazione come il turn taking e il<br />
feedback (vedere I.2)<br />
6
Introduzione<br />
♦ fornire segnali che indicano lo stato della conversazione<br />
L’architettura di un agente conversazionale è la seguente:<br />
Possiamo notare prima di tutto che lo schema è diviso in 2 parti principali: la mente e<br />
il corpo.<br />
La mente è il sottosistema che si occupa di acquisire e analizzare l’input dell’utente<br />
(<strong>per</strong>cepire e poi capire quello che dice l’utente e quello che succede nell’ambiente) e<br />
successivamente decidere quale dovrà essere la risposta dell’agente a tale input. Il<br />
suo compito, potremmo dire, è quello di decidere “cosa l’agente deve fare o dire”.<br />
In base a queste indicazioni è poi il sottosistema corpo che realizza la <strong>sintesi</strong> vocale<br />
delle parole che la mente ha deciso di far pronunciare all’agente, attivando contem-<br />
poraneamente il movimento delle braccia, delle mani, della faccia e così via. Per ana-<br />
logia potremmo allora dire che il corpo decide “come l’agente si deve muovere”.<br />
Mente e corpo sono due moduli totalmente indipendenti e questo <strong>per</strong>mette di uti-<br />
lizzare la stessa mente su implementazioni del corpo totalmente differenti, ad esem-<br />
pio in grafica 2D o 3D, con sembianze femminili o maschili e così via.<br />
Vediamo quali sono e quali funzioni svolgono le singole componenti del sistema:<br />
• Input manager: è l’hardware necessario <strong>per</strong> tradurre in segnali elettronici e<br />
quindi in forma digitale l’input proveniente dall’utente. Può essere in grado di<br />
acquisire non solo il suono della voce ma anche la posizione del corpo<br />
dell’utente nello spazio, la direzione del suo sguardo, la posizione e la forma delle<br />
sue mani, ecc. Una volta letti questi dati li codifica in un formato opportuno.<br />
7
Introduzione<br />
• Comprensione e decisione: è l’elemento principale della mente dell’agente.<br />
Utilizzando tecniche ad esempio di intelligenza artificiale l’input dell’utente viene<br />
interpretato e viene decisa la risposta dell’agente che sarà in generale un testo da<br />
pronunciare più alcune meta-informazioni che riguardano il testo e le sue fun-<br />
zioni comunicative [39]. Questi dati vengono a questo punto passati in input al<br />
sottosistema corpo.<br />
• Generazione: la sua funzione è quella di sintetizzare in un file il suono delle pa-<br />
role che l’agente ha deciso di pronunciare fornendo loro la giusta intonazione e<br />
di produrre uno o più file contenenti i dati del movimento di tutte le parti del<br />
corpo dell’agente.<br />
Nelle attuali implementazioni de<strong>gli</strong> agenti conversazionali il modulo di genera-<br />
zione si occupa di calcolare:<br />
♦ l'intonazione con cui si pronunciano le parole<br />
♦ le espressioni della faccia e de<strong>gli</strong> occhi in particolare<br />
♦ la forma e il movimento <strong>dei</strong> <strong>gesti</strong> (braccia, mani)<br />
♦ la postura del corpo<br />
Tutti questi dati viaggiano su canali separati che nello schema abbiamo indicato<br />
come file audio (<strong>per</strong> il suono della voce) e file di animazione (<strong>per</strong> il movimento<br />
del corpo e della faccia).<br />
• Visualizzatore dell’animazione: è l’elemento che genera la rappresentazione<br />
grafica dell’agente rendendo visibili tutti i movimenti decisi dal modulo prece-<br />
dente. Si occupa inoltre di riprodurre in modo sincrono il file audio relativo<br />
all’animazione.<br />
Entriamo nel detta<strong>gli</strong>o di alcuni aspetti implementativi del modulo di Generazione<br />
<strong>dei</strong> movimenti di un agente conversazionale.<br />
8
Introduzione<br />
In generale un programma in grado di calcolare delle animazioni in tempo reale vie-<br />
ne chiamato motore grafico. Il motore grafico di un agente conversazionale può utiliz-<br />
zare tre diverse tecniche di animazione:<br />
♦ animazione statica - L’agente viene disegnato da un animatore. Tutti i frame di<br />
animazione vengono disegnati e trasformati in immagini statiche (bitmap) che<br />
il motore poi concatena in modo opportuno. E’ quindi la soluzione più re-<br />
strittiva <strong>per</strong>ché impone di conoscere in anticipo quali saranno tutti i possibili<br />
movimenti dell’agente. Eventuali nuovi tipi di movimento non posso essere<br />
realizzati a meno che non si disegnino i fotogrammi adatti. Con questa tecni-<br />
ca sono stati implementati <strong>per</strong> esempio <strong>gli</strong> “Assistenti di Office” della Mi-<br />
crosoft.<br />
♦ motion capture - Si immagazzinano tutti <strong>gli</strong> spostamenti del corpo comprese le<br />
espressioni facciali utilizzando un particolare hardware composto da alcuni<br />
sensori indossato da una <strong>per</strong>sona (di solito un attore o comunque una <strong>per</strong>-<br />
sona che riesce ad avere un certo controllo sul proprio corpo). Sequenzializ-<br />
zando questi movimenti si genera l’animazione finale. In questo modo il ri-<br />
sultato ottenuto può essere molto realistico ma come nel caso precedente ci<br />
sono delle limitazioni nell’utilizzo dell’agente. Il problema principale è che si<br />
possono riprodurre soltanto i movimenti preregistrati e non crearne dinami-<br />
camente altri nuovi. Questa tecnica viene spesso usata nei film di animazione<br />
<strong>per</strong> dare ai <strong>per</strong>sonaggi un movimento molto realistico (Final Fantasy, Mon-<br />
sters Inc., ecc.).<br />
♦ <strong>sintesi</strong> del movimento - Si scrivono <strong>dei</strong> tools grazie ai quali <strong>gli</strong> sviluppatori pos-<br />
sono manipolare tramite algoritmi i vari gradi di libertà di un modello sinteti-<br />
co in grafica 3d del corpo dell’agente. E’ necessaria la collaborazione tra<br />
animatori, psicologi e studiosi del comportamento umano e il sistema è mol-<br />
to più complicato da realizzare ma le possibilità di utilizzo dell’agente au-<br />
mentano notevolmente. Esso infatti riesce ad adattarsi almeno in parte (con<br />
de<strong>gli</strong> algoritmi appropriati) a qualsiasi situazione reale <strong>per</strong>ché il suo movi-<br />
9
Introduzione<br />
mento viene generato dinamicamente [7] .<br />
Per esempio supponiamo di avere a disposizione due algoritmi che generano<br />
rispettivamente la camminata normale e la corsa. A differenza delle sequenze<br />
preregistrate del motion capture, in questo caso alla base del movimento ci<br />
sono delle funzioni matematiche. E’ quindi possibile alternare la camminata<br />
e la corsa (<strong>per</strong> esempio tramite interpolazione) in modo che il risultato finale<br />
sia molto naturale e senza interruzioni del movimento. E’ questa la soluzione<br />
mi<strong>gli</strong>ore <strong>per</strong> realizzare un agente interattivo.<br />
In questa tesi ci siamo interessati alla creazione di un agente conversazionale interat-<br />
tivo che sia capace di mettere in atto una comunicazione non verbale sincronizzata<br />
con le parole che sta pronunciando. Il canale di comunicazione non verbale che ab-<br />
biamo studiato e riprodotto con una tecnica di <strong>sintesi</strong> del movimento è quello <strong>dei</strong><br />
<strong>gesti</strong>.<br />
Più esattamente ci siamo occupati del modulo di generazione <strong>dei</strong> <strong>gesti</strong> del sottosi-<br />
stema corpo dell’agente, secondo la definizione che abbiamo dato in precedenza.<br />
Figura 1. L’agente conversazionale Greta<br />
10
Introduzione<br />
Non ci occu<strong>per</strong>emo invece del sottosistema mente assumendo che le informazioni<br />
necessarie al funzionamento del corpo (cioè, come detto, un testo più alcune meta-<br />
informazioni) siano già state rese disponibili come risultato di una precedente elabo-<br />
razione da parte di un modulo di generazione di dialoghi multimodali oppure <strong>per</strong><br />
inserimento manuale.<br />
Questa tesi è stata svolta nell’ambito del progetto MagiCster, finalizzato alla proget-<br />
tazione e implementazione di un agente conversazionale chiamato Greta (figura 1).<br />
Gli obbiettivi di MagiCster sono:<br />
− progettare un agente conversazionale che faccia uso di intonazione vocale,<br />
sguardo, <strong>gesti</strong> e posizione del corpo in maniera sincronizzata<br />
− valutare l'utilizzo di un agente conversazionale al fine di determinare quali aspetti<br />
dell'agente risultano importanti <strong>per</strong> quali tipi di interazione uomo-macchina<br />
− sviluppare e documentare l'architettura dell'agente e <strong>dei</strong> suoi componenti al fine<br />
di <strong>per</strong>mettere ad altri gruppi di ricerca di sviluppare e valutare nuove versioni<br />
dell'agente in nuovi domini.<br />
Riassumiamo ora, dandone una breve descrizione, qual’è stato il lavoro svolto in<br />
questa tesi:<br />
♦ pianificazione <strong>dei</strong> <strong>gesti</strong>: dando come input al sistema un testo con <strong>dei</strong> tag ri-<br />
guardanti le sue funzioni comunicative, abbiamo sviluppato un algoritmo che<br />
pianifica e genera autonomamente una sequenza gestuale “realistica”;<br />
♦ implementazione di un visualizzatore dell’animazione: abbiamo implemen-<br />
tato il modulo incaricato, una volta pianificata una sequenza di <strong>gesti</strong>, di tradurre<br />
l’animazione calcolata dal corpo in un filmato visualizzabile sullo schermo del<br />
computer;<br />
♦ implementazione di alcuni tools di supporto: abbiamo sviluppato una serie<br />
di tools <strong>per</strong> <strong>per</strong>mettere la definizione interattiva <strong>dei</strong> <strong>gesti</strong> e la loro memorizza-<br />
zione in un formato ben definito;<br />
11
Introduzione<br />
♦ implementazione <strong>dei</strong> <strong>gesti</strong> <strong>dei</strong>ttici: sono i <strong>gesti</strong> che servono ad indicare un<br />
punto qualsiasi nello spazio;<br />
Nel primo capitolo descriveremo la teoria <strong>dei</strong> <strong>gesti</strong>, prendendo in esame quello che<br />
avviene durante la conversazione tra esseri umani, quali sono i <strong>gesti</strong> che vengono<br />
utilizzati e come possono essere classificati. Questa analisi preliminare è fondamen-<br />
tale <strong>per</strong>ché vo<strong>gli</strong>amo che l’agente Greta abbia un comportamento credibile, che si<br />
muova quindi in maniera adeguata a quello che dice e al contesto in cui lo dice.<br />
Nel secondo capitolo forniremo una panoramica su<strong>gli</strong> agenti conversazionali. Par-<br />
tendo dalla definizione formale di agente conversazionale e dalla sua architettura ba-<br />
se prenderemo in esame alcuni agenti conversazionali che rappresentano lo “stato<br />
dell’arte” in questo campo. In chiusura metteremo in risalto affinità e differenze con<br />
il nostro agente.<br />
Nel terzo capitolo presenteremo l’agente conversazionale Greta, al sua architettura e<br />
descriveremo il suo funzionamento generale.<br />
Nel quarto capitolo daremo una visione generale del sistema <strong>per</strong> la generazione <strong>dei</strong><br />
<strong>gesti</strong> dell’agente Greta e metteremo in evidenza i punti fondamentali del lavoro che<br />
è stato svolto in questa tesi.<br />
Nel quinto capitolo entreremo nei detta<strong>gli</strong> della realizzazione del motore gestuale<br />
dell’agente Greta. Spiegheremo quali sono le regole che abbiamo fissato <strong>per</strong> decide-<br />
re quali <strong>gesti</strong> fare effettuare all’agente e come siamo riusciti a mi<strong>gli</strong>orare la dinamica<br />
del movimento delle sue braccia.<br />
Nel sesto capitolo descriveremo alcuni tools di supporto che abbiamo sviluppato e<br />
che servono a facilitare, rendendolo estremamente intuitivo, il processo di defini-<br />
zione <strong>dei</strong> <strong>gesti</strong>. Inoltre vedremo come è stato realizzato il visualizzatore<br />
dell’animazione finale.<br />
Nel settimo capitolo infine riassumeremo tutto quello che è stato fatto in questa tesi<br />
e spiegheremo come si evolverà nel futuro il sistema dell’agente Greta.<br />
12
Capitolo I, Gesti <strong>comunicativi</strong><br />
13
Capitolo I, Gesti <strong>comunicativi</strong><br />
I<br />
Gesti <strong>comunicativi</strong><br />
I.1 La conversazione Faccia-a-Faccia<br />
Il termine Faccia-a-Faccia viene usato <strong>per</strong> indicare quando la conversazione tra es-<br />
seri umani avviene direttamente e non con l’interposizione di un qualsiasi mezzo di<br />
comunicazione, come ad esempio succede col telefono o la posta elettronica. Ve-<br />
diamo brevemente come funziona questo tipo di interazione, ponendo l’attenzione<br />
in particolare sul lato gestuale della comunicazione.<br />
La conversazione Faccia-a-Faccia è fondamentalmente uno scambio di informazio-<br />
ni, ma affinché si svolga in modo “sincronizzato” ed efficiente i partecipanti metto-<br />
no in atto spontaneamente (cioè in modo non cosciente, senza una decisione volon-<br />
taria) una complessa interazione.<br />
Pensiamo a un colloquio tra più <strong>per</strong>sone: in generale una delle <strong>per</strong>sone prenderà la<br />
parola mentre le altre la ascolteranno, finché a un certo punto sarà qualcun altro ad<br />
iniziare a parlare <strong>per</strong>ché la prima <strong>per</strong>sona ha finito oppure <strong>per</strong>ché è stata interrotta<br />
14
Capitolo I, Gesti <strong>comunicativi</strong><br />
<strong>per</strong> sollevare un’obiezione e così via. Quindi quando si dice che la conversazione è<br />
“sincronizzata” non si intende dire che le <strong>per</strong>sone necessariamente prendono la pa-<br />
rola una dopo l’altra, ma che lo svolgimento stesso della conversazione contiene una<br />
parte dell’informazione. Ad esempio, se durante un dibattito molto acceso e dai toni<br />
forti (<strong>per</strong> esempio in politica) più <strong>per</strong>sone parlano contemporaneamente e le loro<br />
parole si sovrappongono, questo contribuisce ad aumentare la sensazione di tensio-<br />
ne ed altera lo stato emotivo <strong>dei</strong> presenti.<br />
I.1.1 Proposizione e interazione<br />
Tutto quello che viene comunicato durante una conversazione può essere distinto<br />
tra ciò che effettivamente serve <strong>per</strong> esprimere il proprio pensiero (contenuto proposi-<br />
zionale) e ciò che serve a regolare l’andamento della conversazione (contenuto interat-<br />
tivo).<br />
Le informazioni proposizionali vengono fornite da chi parla <strong>per</strong> raggiungere<br />
l’obbiettivo della conversazione. In generale una <strong>per</strong>sona parla con un’altra <strong>per</strong>sona <strong>per</strong><br />
spiegare qualcosa che a lei è nota ma che è più o meno sconosciuta <strong>per</strong> chi ascolta.<br />
Quindi chi parla ha chiaro nella sua mente qual’è l’obbiettivo della conversazione e<br />
il suo scopo e’ quello di trasferire queste informazioni nella mente dell’ascoltatore<br />
utilizzando tutti i canali <strong>comunicativi</strong> a cui abbiamo già più volte accennato (parole,<br />
sguardo, <strong>gesti</strong>, ecc). I <strong>gesti</strong> prodotti <strong>per</strong> scopi proposizionali sono quindi quelli ad<br />
esempio che servono a spiegare forme (con le mani si descrive nello spazio la forma<br />
di un oggetto a cui si fa riferimento), che indicano qualcosa (anche in senso astratto,<br />
indicando verso il basso dicendo <strong>per</strong> esempio “…in questo contesto…”) e così via.<br />
Le informazioni interattive servono invece a modificare in continuazione<br />
l’andamento della conversazione. I piccoli movimenti della testa che si compiono<br />
mentre l’interlocutore sta parlando e che significano “ho capito, vai pure avanti”,<br />
oppure brevi esclamazioni come “uh?”, o il sollevamento del braccio con il palmo<br />
della mano rivolto in avanti che serve <strong>per</strong> interrom<strong>per</strong>e chi sta parlando.<br />
15
Capitolo I, Gesti <strong>comunicativi</strong><br />
D’altra parte la <strong>per</strong>sona che sta parlando si rivolge spesso con lo sguardo verso <strong>gli</strong><br />
ascoltatori e in particolare verso i loro occhi, ricevendo un’informazione continua<br />
ad esempio sul loro livello di attenzione e/o comprensione di quello che lui sta di-<br />
cendo.<br />
In quest’ultimo esempio abbiamo parlato di un tipo di informazione che potremmo<br />
definire “di ritorno” da parte dell’ascoltatore verso chi parla. Il contenuto interattivo<br />
della conversazione può essere di due tipi:<br />
− feedback: informazioni “di ritorno” dall’ascoltatore verso chi sta parlando (ad<br />
esempio annuire con la testa quando vo<strong>gli</strong>amo far capire di essere d’accordo,<br />
chiudere e riaprire <strong>gli</strong> occhi rapidamente più volte <strong>per</strong> indicare stupore o <strong>per</strong>ples-<br />
sità, inclinare leggermente la testa da un lato <strong>per</strong> dimostrare attenzione). Servono<br />
a chi parla <strong>per</strong> sa<strong>per</strong>e come l’ascoltatore sta seguendo la conversazione (è inte-<br />
ressato, sta capendo, si sta annoiando, ecc.).<br />
− turn-taking: comportamenti che stabiliscono il ritmo della conversazione, cioè<br />
l’ordine in cui i partecipanti vo<strong>gli</strong>ono prendere la parola (ad esempio portare la<br />
mano davanti a sé <strong>per</strong> mantenere la parola o scuotere ripetutamente la testa <strong>per</strong><br />
chiedere la parola)<br />
I.1.2 Multimodalità<br />
Durante la conversazione tra esseri umani sono molti i canali che vengono attivati<br />
(parlato, intonazione, occhi, faccia, braccia, mani, postura del corpo). In questo sen-<br />
so si parla di multimodalità della comunicazione Faccia-a-Faccia. La possibilità di<br />
sce<strong>gli</strong>ere se usare uno o più canali nello stesso momento <strong>per</strong>mette anche di paralle-<br />
lizzare più informazioni nello stesso tempo o dare enfasi a un’unica informazione<br />
che riteniamo molto importante convo<strong>gli</strong>andola su più canali contemporaneamente.<br />
In più la gestualità in molti casi serve anche alla <strong>per</strong>sona che sta parlando <strong>per</strong> piani-<br />
ficare me<strong>gli</strong>o come comunicare i propri pensieri, se non addirittura <strong>per</strong> chiarirli me-<br />
<strong>gli</strong>o a se stessa [34]. Pensiamo <strong>per</strong> esempio a quando parliamo al telefono e <strong>gesti</strong>co-<br />
16
Capitolo I, Gesti <strong>comunicativi</strong><br />
liamo pur non essendo osservati dal nostro interlocutore. Oppure quando una <strong>per</strong>-<br />
sona sta spiegando qualcosa che risulta complicata anche <strong>per</strong> lei e allora esprime<br />
pensieri molto corti e sottolinea l’inizio e la fine di ogni concetto producendo con le<br />
mani <strong>dei</strong> <strong>gesti</strong> come se stesse “affettando l’aria” davanti a sé.<br />
Prendendo infine in considerazione in particolare i canali del parlato e <strong>dei</strong> <strong>gesti</strong> bi-<br />
sognerà prestare molta attenzione alla relazione che c’è tra di loro, <strong>per</strong>ché le <strong>per</strong>sone<br />
ne fanno uso quasi sempre contemporaneamente e i <strong>gesti</strong> hanno <strong>per</strong> la maggior par-<br />
te del tempo la funzione di completare l’informazione contenuta nel parlato.<br />
I.1.3 Temporizzazione<br />
Scuotere più volte la testa mentre qualcuno sta parlando ha un particolare significa-<br />
to che ha l’effetto di modificare l’andamento della conversazione. Sia questa che al-<br />
tre azioni hanno una precisa temporizzazione che rende l’azione riconoscibile in<br />
modo univoco a chi osserva. Ad esempio fornire un feedback molto rallentato e ri-<br />
tardato indica distrazione, o svo<strong>gli</strong>atezza.<br />
E’ ovvio quindi che non rispettando la temporizzazione <strong>dei</strong> <strong>gesti</strong> si rischierebbe di<br />
rendere nullo il contenuto informativo che si vuole trasmettere se non addirittura<br />
modificarlo. Ad esempio se mentre vengono pronunciate le parole “prendi quel li-<br />
bro…” il gesto di indicare un certo libro non viene prodotto durante “quel libro”<br />
ma in un altro momento, allora l’ascoltatore non sarà in grado di capire a quale libro<br />
si sta facendo riferimento.<br />
I.2 I <strong>gesti</strong> nella conversazione<br />
Tutti i <strong>gesti</strong> che le <strong>per</strong>sone producono durante una conversazione possono innanzi-<br />
tutto essere suddivisi in due insiemi:<br />
17
Capitolo I, Gesti <strong>comunicativi</strong><br />
• <strong>gesti</strong> <strong>comunicativi</strong>: sono quelli a cui abbiamo fatto riferimento finora e <strong>dei</strong><br />
quali ci interesseremo in questa tesi. Hanno una funzione comunicativa<br />
pari a<strong>gli</strong> altri canali della comunicazione non-verbale (Introduzione).<br />
• <strong>gesti</strong> non <strong>comunicativi</strong>: sono casuali, non sono collegati allo svolgimento della<br />
conversazione né a<strong>gli</strong> argomenti trattati. Ad esempio, spostare un oggetto,<br />
aggiustarsi i capelli, ecc.<br />
Forniremo ora una descrizione più detta<strong>gli</strong>ata <strong>dei</strong> <strong>gesti</strong> <strong>comunicativi</strong> che ricordiamo<br />
(vedi l’Introduzione) rappresentano la quasi totalità <strong>dei</strong> <strong>gesti</strong> prodotti durante la<br />
conversazione.<br />
D’ora in poi, <strong>per</strong> convenzione, utilizzeremo sempre il termine gesto anche se in realtà<br />
ci stiamo riferendo ai soli <strong>gesti</strong> <strong>comunicativi</strong>.<br />
Secondo Kendon [18; 20], pioniere nella ricerca sui <strong>gesti</strong>, esiste una gerarchia, chia-<br />
mata Continuo di Kendon, nella quale si possono distribuire i <strong>gesti</strong> <strong>comunicativi</strong>:<br />
Gesticolazione → Gesti Language-like → Emblemi → Linguaggi <strong>dei</strong> segni<br />
Vediamo la descrizione delle singole classi da destra a sinistra:<br />
♦ Linguaggi <strong>dei</strong> segni: sono i <strong>gesti</strong> <strong>dei</strong> linguaggi utilizzati <strong>per</strong> la comunicazione tra<br />
<strong>per</strong>sone non udenti. In questo caso, mancando del tutto la comunicazione<br />
vocale i <strong>gesti</strong> e le espressioni facciali servono a trasmettere tutta<br />
l’informazione e sono utilizzati all’interno di un linguaggio che ha una fono-<br />
logia, una morfologia e una sintassi ben definite.<br />
♦ Emblemi: sono <strong>gesti</strong> specifici di una certa cultura, cioè possono essere inter-<br />
pretati in modo diverso da cultura a cultura. In Italia [19] si usano moltissimi<br />
<strong>gesti</strong> che hanno un significato ben preciso, ad esempio <strong>per</strong> indicare che si<br />
vuole fare una telefonata si può avvicinare la mano al lato della faccia con<br />
18
Capitolo I, Gesti <strong>comunicativi</strong><br />
pollice e mignolo a<strong>per</strong>ti e le altre dita chiuse. Oppure chiudere tutte le dita<br />
tranne il mignolo e mettere la mano in verticale <strong>per</strong> fare riferimento ad un<br />
oggetto sottile. Pur costituendo solo il 10% <strong>dei</strong> <strong>gesti</strong> che occorrono in una<br />
conversazione, all’inizio <strong>gli</strong> sviluppatori di interfacce conversazionali decisero<br />
di riprodurre principalmente <strong>gesti</strong> emblematici [8]. Questo probabilmente<br />
<strong>per</strong>ché sono <strong>gesti</strong> che vengono prodotti consciamente e quindi molto più fa-<br />
cilmente identificabili andando ad esaminare su<strong>per</strong>ficialmente la gestualità<br />
delle <strong>per</strong>sone.<br />
♦ Gesti Language-like: sono <strong>gesti</strong> integrati grammaticalmente all’interno delle<br />
frasi e si sostituiscono del tutto alle parole differenziandosi <strong>per</strong> questo dai ge-<br />
sti emblematici. Un esempio potrebbe essere la frase “... i genitori erano ok<br />
ma i fi<strong>gli</strong> erano [effettua un gesto invece di pronunciare la parola]” in cui il<br />
gesto prende il posto di un aggettivo.<br />
♦ Gesticolazione: in questo insieme sono raccolti tutti i <strong>gesti</strong> prodotti dalle <strong>per</strong>so-<br />
ne in modo spontaneo e involontario con le mani e le braccia. Caratteristica<br />
fondamentale della <strong>gesti</strong>colazione è che praticamente essa non avviene mai in<br />
assenza del parlato. Numericamente la quasi totalità <strong>dei</strong> <strong>gesti</strong> di una conver-<br />
sazione è <strong>gesti</strong>colazione. La <strong>gesti</strong>colazione comprende quindi tutti i <strong>gesti</strong> più<br />
comuni, quelli compiuti <strong>per</strong> porre enfasi su alcune parti del discorso, quelli<br />
<strong>per</strong> indicare, quelli che riproducono la forma di un oggetto o lo svolgimento<br />
di un’azione. Ritorneremo tra breve sulla <strong>gesti</strong>colazione <strong>per</strong> descrivere tutte le<br />
classi di <strong>gesti</strong> di cui si compone.<br />
Notiamo che man mano che ci spostiamo nella gerarchia da sinistra verso destra la<br />
presenza del parlato diminuisce mentre aumenta la funzione linguistica <strong>dei</strong> <strong>gesti</strong>. In-<br />
fatti nella <strong>gesti</strong>colazione i <strong>gesti</strong> avvengono sempre durante il parlato, i <strong>gesti</strong> langua-<br />
ge-like e emblematici invece possono prendere il posto delle parole e infine nei lin-<br />
guaggi <strong>dei</strong> segni il parlato scompare del tutto. Inoltre aumenta anche il collegamento<br />
tra <strong>gesti</strong> e ambiente, cioè l’interpretazione e l’uso <strong>dei</strong> <strong>gesti</strong> dipende sempre di più<br />
19
Capitolo I, Gesti <strong>comunicativi</strong><br />
dall’ambito culturale, sociale, o addirittura geografico (ad esempio <strong>per</strong> <strong>gli</strong> emblemi)<br />
in cui la conversazione sta avvenendo.<br />
I.2.1 Gesticolazione e tipi di gesto<br />
Abbiamo detto che i <strong>gesti</strong> compresi nella classe della <strong>gesti</strong>colazione rappresentano la<br />
quasi totalità <strong>dei</strong> <strong>gesti</strong> prodotti durante le normali conversazioni tra le <strong>per</strong>sone. Su<br />
questa classe si sono quindi concentrati <strong>gli</strong> studi compiuti nel campo della gestualità,<br />
producendo la seguente classificazione della <strong>gesti</strong>colazione [8; 34]:<br />
• Iconici: sono in stretta relazione con il contenuto semantico del parlato [50]. Un<br />
gesto iconico tende a visualizzare (con la sua forma) alcuni aspetti della scena a<br />
cui fa riferimento il parlato. Quando una <strong>per</strong>sona sta elencando qualcosa, ad<br />
esempio “…la prima cosa che devi fare..”, le mani riproducono i numeri, ad<br />
esempio il pollice alzato <strong>per</strong> il numero 1, indice e medio <strong>per</strong> il numero 2 e così<br />
via. Oppure pronunciando “…c’è solo un piccolo pro-<br />
blema…” <strong>per</strong> esprimere il fatto che il problema non è di<br />
grave importanza una delle mani assumerà la forma con i<br />
polpastrelli di indice e pollice che si toccano e le altre di-<br />
ta curvate e unite tra loro un po’ staccate dall’indice e la<br />
mano si sposterà davanti e leggermente di lato alla faccia<br />
(figura 1). In totale rappresentano circa il 40% <strong>dei</strong> <strong>gesti</strong><br />
normalmente prodotti durante una conversazione.<br />
• Metaforici: <strong>gesti</strong> che rappresentano concetti astratti. Per esempio durante una fra-<br />
se del tipo “…l’ho spinto in avanti…” chi parla fa un gesto con la mano a<strong>per</strong>ta<br />
davanti a sé e poi sposta il braccio in avanti mentre pronuncia “spinto” mante-<br />
nendo la mano nella posizione finale fino alla fine parola “avanti”. Rispetto al to-<br />
tale <strong>dei</strong> <strong>gesti</strong> sono circa il 10%.<br />
20<br />
Figura 1.
Capitolo I, Gesti <strong>comunicativi</strong><br />
• Deittici: indicano un punto nello spazio mentre ci si riferisce a <strong>per</strong>sone, posti o al-<br />
tre entità identificabili in senso spaziale. Fanno cioè parte di questa classe sia i<br />
<strong>gesti</strong> che indicano qualcosa che si trova fisicamente nell’ambiente in cui avviene<br />
la conversazione sia quelli che indicano una parte dell’ambiente<br />
che può in qualche modo essere identificata con un’entità astrat-<br />
ta. Un esempio di questo tipo è quando si indica verso il basso<br />
dicendo “..questo..” (figura 2) <strong>per</strong> indicare in realtà l’oggetto del-<br />
la conversazione. Come i metaforici anche questi <strong>gesti</strong> sono circa<br />
il 10% del totale.<br />
• Beat: vengono definiti come tutti quei movimenti che non presentano un signifi-<br />
cato particolare ma che servono a sottolineare il concetto che<br />
si sta esprimendo oppure hanno funzioni di turn-taking o<br />
feedback. Sono piccoli spostamenti delle mani o delle braccia,<br />
senza una forma particolare. Per esempio se una <strong>per</strong>sona vuo-<br />
le porre una forte enfasi su una certa parola allora, mentre il<br />
parlato rallenta arrivando a scandire le singole sillabe della pa-<br />
rola, le mani si muovono ritmicamente con brevi spostamenti<br />
dall’alto verso il basso, uno <strong>per</strong> ciascuna sillaba pronunciata (figura 3). Il rima-<br />
nente 40% <strong>dei</strong> <strong>gesti</strong> di una conversazione e’ composto di beat.<br />
I.2.2 Fasi del gesto<br />
I <strong>gesti</strong> si svolgono nel tempo e hanno un’evoluzione <strong>per</strong> fasi. Generalmente quelle<br />
che vengono distinte sono:<br />
♦ preparazione: le mani e le braccia iniziano a muoversi e si portano dalla posi-<br />
zione di riposo in un punto dello spazio molto vicino a dove dovrà avvenire<br />
lo stroke.<br />
21<br />
Figura 2<br />
Figura 3
Capitolo I, Gesti <strong>comunicativi</strong><br />
♦ stroke: la fase più energica del gesto, quella che porta con sé il contenuto se-<br />
mantico.<br />
♦ mantenimento: le mani e le braccia si mantengono <strong>per</strong> un certo <strong>per</strong>iodo di tem-<br />
po (che potrebbe essere anche molto lungo) nella posizione che avevano du-<br />
rante lo stroke. A questo punto si potrebbe verificare un nuovo stroke oppu-<br />
re il gesto potrebbe terminare con la successiva fase di rilascio.<br />
♦ rilascio: le braccia si portano di nuovo nella fase di riposo.<br />
Non sempre <strong>per</strong>ò avvengono tutte queste fasi (anche se c’è sempre come minimo la<br />
fase di stroke), ogni gesto ha una complessità diversa ed esistono <strong>gesti</strong> che includo-<br />
no <strong>per</strong> esempio solo la preparazione e lo stroke. Altri hanno una successione di<br />
stroke molto ravvicinati (<strong>gesti</strong> con ripetizioni) e altri un tempo di mantenimento di<br />
molti secondi.<br />
In generale i <strong>gesti</strong> che hanno una funzione visiva (iconici, metaforici) sono composti<br />
di tre fasi (preparazione-stroke-rilascio) mentre quelli non visivi (beat) sono a due<br />
fasi.<br />
Nella figura seguente [26] vediamo il grafico del movimento delle braccia di una<br />
<strong>per</strong>sona durante il gesto “TIRARE”. Esso viene effettuato con il palmo della mano<br />
verso l’alto, partendo col braccio proteso in avanti e il palmo a<strong>per</strong>to e poi portando<br />
la mano verso il corpo con un movimento rettilineo e chiudendo contemporanea-<br />
mente il palmo.<br />
Come possiamo vedere sono chiaramente riconoscibili le tre fasi di cui esso si com-<br />
pone:<br />
22
Capitolo I, Gesti <strong>comunicativi</strong><br />
E’ stato osservato che nella maggior parte <strong>dei</strong> <strong>gesti</strong> il momento culminante dello<br />
stroke (nell’esempio di figura si trova appena prima di 1.4 secondi) avviene mentre<br />
si sta pronunciando la parola su cui si pone l’enfasi del discorso e più esattamente al<br />
75% della pronuncia di quella parola [34].<br />
Quando due <strong>gesti</strong> sono molto ravvicinati nel tempo può succedere che la fase di ri-<br />
lascio del primo e quella di preparazione del secondo si annullino e vengano sosti-<br />
tuite da un parziale rilascio del primo gesto seguito da uno spostamento verso la fa-<br />
se di stroke del secondo. Questo tipo di movimento si chiama coarticolazione tra due<br />
o più <strong>gesti</strong>.<br />
I.3 Contenuto rematico e tematico<br />
Secondo Halliday e altri ricercatori [12] il contenuto informativo di quello che viene<br />
detto durante una conversazione può essere denotato in due modi: contenuto rema-<br />
tico (rheme) e contenuto tematico (theme).<br />
Il theme è l’argomento principale del discorso, noto a tutti i partecipanti, mentre il<br />
rheme corrisponde a ciò che viene introdotto a un certo punto del discorso come<br />
concetto nuovo, oppure riguarda il theme ma è di particolare interesse <strong>per</strong> qualche<br />
altro motivo.<br />
23
Capitolo I, Gesti <strong>comunicativi</strong><br />
Di solito quindi (e anche in questa tesi) tutto quello che viene detto durante una<br />
conversazione viene sempre classificato come rheme o theme.<br />
Cassell e Prevost [8] hanno dimostrato non solo che la quasi totalità <strong>dei</strong> <strong>gesti</strong> si veri-<br />
fica durante il rheme, ma che si verifica quasi sempre almeno un gesto <strong>per</strong> ogni fra-<br />
se con contenuto di tipo rematico. I ricercatori ipotizzano che questo avvenga <strong>per</strong>-<br />
ché il rheme è l’informazione che, essendo nuova, maggiormente contribuisce<br />
all’evoluzione del discorso e che quindi necessita di una descrizione più accurata e<br />
completa (con l’ausilio della gestualità) da parte di chi sta parlando.<br />
I.4 Sintesi <strong>dei</strong> <strong>gesti</strong> <strong>comunicativi</strong><br />
Abbiamo visto che secondo il tipo di classificazione più diffuso [8; 34] l’insieme <strong>dei</strong><br />
<strong>gesti</strong> <strong>comunicativi</strong> può essere suddiviso in classi in base alla funzione svolta dal ge-<br />
sto. Quindi i <strong>gesti</strong> iconici o metaforici sono quelli che in qualche modo assomi<strong>gli</strong>a-<br />
no a quello a cui si riferiscono, i <strong>gesti</strong> <strong>dei</strong>ttici servono ad indicare qualcosa nello<br />
spazio e quelli emblematici hanno una funzione linguistica.<br />
Nel lavoro svolto in questa tesi ci siamo basati su un’altra classificazione frutto de<strong>gli</strong><br />
studi svolti da Isabella Poggi della Terza Università di Roma [43;44;45].<br />
Secondo Poggi i <strong>gesti</strong> <strong>comunicativi</strong> possono essere classificati in base al significato<br />
di quello che le <strong>per</strong>sone vo<strong>gli</strong>ono comunicare.<br />
Da questo punto di vista una <strong>per</strong>sona mentre parla fa riferimento a concetti che ap-<br />
partengono sempre a una delle seguenti categorie:<br />
• l’ambiente che la circonda<br />
• la propria identità<br />
• il proprio stato mentale ed emotivo<br />
Le informazioni sull’ambiente riguardano le entità e <strong>gli</strong> eventi concreti o astratti che<br />
si trovano nel mondo in cui la <strong>per</strong>sona si trova (oggetti, altre <strong>per</strong>sone, organismi,<br />
eventi, posti).<br />
24
Capitolo I, Gesti <strong>comunicativi</strong><br />
Le informazioni sulla propria identità comprendono la propria età, sesso, <strong>per</strong>sonali-<br />
tà, radici culturali e così via.<br />
Infine le informazioni sulla mente della <strong>per</strong>sona servono <strong>per</strong> comunicare a<strong>gli</strong> altri il<br />
proprio stato mentale, i propri obbiettivi, le proprie convinzioni ed emozioni.<br />
Gli studi di Isabella Poggi [45] si sono concentrati su quest’ultimo tipo di informa-<br />
zione e sui <strong>gesti</strong> che ne <strong>per</strong>mettono la comunicazione durante una conversazione,<br />
che sono stati chiamati Marcatori Gestuali Mentali (originariamente in inglese Gestural<br />
Mind Markers). Un marcatore gestuale mentale è quindi un gesto usato <strong>per</strong> comuni-<br />
care il proprio stato mentale o emotivo.<br />
I Marcatori Gestuali Mentali possono a loro volta essere di tre tipi: Marcatori delle<br />
convinzioni (Belief Markers), Marcatori de<strong>gli</strong> obbiettivi (Goal Markers), Marcatori delle emo-<br />
zioni (Emotive Markers). Vediamo ora <strong>per</strong> ciascuna di queste categorie quali sono i<br />
<strong>gesti</strong> associati.<br />
I.4.1 Marcatori delle convinzioni<br />
Sono quei <strong>gesti</strong> che usiamo <strong>per</strong> comunicare all’esterno le nostre convinzioni, certez-<br />
ze o dubbi circa quello che stiamo dicendo in quel preciso istante.<br />
• Certezza o incertezza: aprire il palmo della mano verso l’alto inclinandola leg-<br />
germente verso l’interlocutore significa che siamo certi di quello che stiamo di-<br />
cendo nel senso che la cosa è ovvia, evidente. Il gesto stesso è come se volesse<br />
mostrare qualcosa alla <strong>per</strong>sona che ci ascolta.<br />
Quando invece vo<strong>gli</strong>amo dimostrare di conoscere con precisione l’argomento<br />
del discorso possiamo unire indice e pollice facendo un piccolo spostamento col<br />
braccio dall’alto verso il basso.<br />
Al contrario ci sono <strong>gesti</strong> che indicano incertezza, quello tipico consiste nel sol-<br />
levare le spalle, eventualmente aprendo anche entrambe le mani lateralmente. Per<br />
quanto riguarda la negazione il gesto tipico consiste nel sollevare l’indice facen-<br />
dolo oscillare da destra a sinistra e viceversa (il gesto “no”).<br />
25
Capitolo I, Gesti <strong>comunicativi</strong><br />
• Gesti meta-cognitivi: alcuni <strong>gesti</strong> vengono impiegati <strong>per</strong> dare informazioni relati-<br />
ve all’origine della certezza <strong>dei</strong> concetti che stiamo esprimendo. Ad esempio<br />
schioccare indice e pollice o portare la mano intorno al mento mentre cerchiamo<br />
di ricordare qualcosa che ci sfugge. In questo modo avvertiamo l’interlocutore<br />
che parleremo di un ricordo lontano e quindi che non saremo del tutto sicuri di<br />
quello che diremo. Oppure fare il gesto delle virgolette (con indice e medio di<br />
entrambe le mani) <strong>per</strong> far capire che stiamo riportando le parole di qualcun’altro.<br />
I.4.2 Marcatori de<strong>gli</strong> obbiettivi<br />
Sono i <strong>gesti</strong> che servono a dare informazioni sull’obbiettivo del discorso.<br />
• Argomento-commento: è stato rilevato che in generale durante una conversazio-<br />
ne le mani si sollevano mentre facciamo riferimento all’obbiettivo del discorso,<br />
che comunque è già noto alle <strong>per</strong>sone che partecipano alla conversazione (argo-<br />
mento), e si abbassano quando vengono aggiunte delle nuove informazioni rela-<br />
tive ad esso (commento). Questo accade indipendentemente dalla forma <strong>dei</strong> <strong>gesti</strong><br />
che vengono prodotti.<br />
• Gesti <strong>per</strong>formativi: sono quelli prodotti mentre si fa riferimento diretto<br />
all’obbiettivo del discorso <strong>per</strong> dare informazioni su esso. Ad esempio il gesto con<br />
il solo indice esteso, il palmo verso sinistra, ruotando la mano in alto e in basso<br />
significa “fai attenzione a quello che sto dicendo <strong>per</strong>ché è quello che penso circa<br />
questo argomento e sarà me<strong>gli</strong>o <strong>per</strong> te essere<br />
d’accordo!”.<br />
• Gesti meta-discorsivi: servono a spiegare il senso o la lo-<br />
gica di quello che stiamo dicendo. Per esempio contare<br />
con le dita delle mani mentre facciamo riferimento ad un<br />
elenco di concetti collegati tra loro (figura 2).<br />
Altri <strong>gesti</strong> meta-discorsivi servono <strong>per</strong> indicare relazioni<br />
26<br />
Figura 4
Capitolo I, Gesti <strong>comunicativi</strong><br />
di causa-effetto o contrasto tra diversi elementi del discorso. In Italia si usa mol-<br />
to ruotare la mano con indice e pollice curvati e distanziati <strong>per</strong> esprimere il lega-<br />
me di causa-effetto quando questo è praticamente ovvio.<br />
• Gesti meta-conversazionali: comunicano le nostre intenzioni circa l’andamento<br />
della conversazione. Alzare il dito indice <strong>per</strong> far capire che vorremmo prendere<br />
la parola oppure aprire il palmo della mano verso l’interlocutore (come se voles-<br />
simo porgere un oggetto immaginario) quando abbiamo finito di parlare e vo-<br />
<strong>gli</strong>amo cedere la parola.<br />
I.4.3 Marcatori delle emozioni<br />
In generale le emozioni vengono quasi sempre espresse attraverso canali diversi da<br />
quello gestuale, <strong>per</strong> esempio tramite le espressioni facciali.<br />
Comunque esistono <strong>gesti</strong> collegati alle emozioni. Sollevare le braccia coi pugni chiu-<br />
si nel momento in cui siamo felici di aver raggiunto un importante traguardo. La<br />
vergogna invece viene espressa ad esempio coprendo il viso con le mani.<br />
Quello che appare evidente inoltre è che l’emotività viene espressa non attraverso<br />
un tipo particolare di gesto ma nell’alterazione delle caratteristiche <strong>dei</strong> <strong>gesti</strong> stessi.<br />
Velocità e tensione <strong>dei</strong> movimenti comunicano ansia mentre lentezza e armonia so-<br />
no associati ad uno stato emotivo sereno.<br />
27
Capitolo II, Stato dell’arte<br />
II<br />
Stato dell’arte<br />
II.1 Definizione di agente conversazionale<br />
Riprendendo la definizione usata da Justine Cassell [8] diremo che un agente conversa-<br />
zionale è un’interfaccia che utilizza la rappresentazione visiva di un corpo umano o<br />
animale e che è capace di:<br />
♦ riconoscere e rispondere a input verbali e non verbali<br />
♦ generare output verbali e non verbali<br />
♦ tenere conto di eventi particolari della conversazione come il turn taking ed<br />
il feedback (vedere il paragrafo 2)<br />
♦ fornire segnali che indicano lo stato della conversazione<br />
28
Capitolo II, Stato dell’arte<br />
In questo capitolo prendiamo in esame alcuni sistemi tra i tanti che si trovano in let-<br />
teratura [8; 13; 24; 25; 26; 27; 29; 30; 31; 32; 55] che <strong>per</strong> le loro caratteristiche asso-<br />
mi<strong>gli</strong>ano al nostro.<br />
Nel paragrafo finale metteremo me<strong>gli</strong>o in evidenza queste affinità e specificheremo<br />
eventuali differenze.<br />
II.2 GesSyCa (Thierry Lebourque & Sylvie Gibet, 1999)<br />
L'agente virtuale di Lebourque e Gibet [29] è in grado di riprodurre in modo interat-<br />
tivo il linguaggio <strong>dei</strong> segni <strong>per</strong> <strong>per</strong>sone non udenti di lingua francese. Il sistema uti-<br />
lizza un linguaggio appositamente creato <strong>per</strong> la descrizione <strong>dei</strong> <strong>gesti</strong> e un motore<br />
grafico basato sulla cinematica inversa chiamato modello sensori-motor.<br />
Il linguaggio di definizione <strong>dei</strong> <strong>gesti</strong> è QualGest, che sta <strong>per</strong> Qualitative Gesture Spe-<br />
cification, ed è un linguaggio che descrive in modo qualitativo i <strong>gesti</strong>. Così ogni ge-<br />
sto è descritto <strong>per</strong> come viene <strong>per</strong>cepito visivamente (appunto in modo qualitativo)<br />
evitando di dover specificare complicate sequenze numeriche <strong>per</strong> definire i movi-<br />
menti delle singole articolazioni. Per descrivere un gesto con QualGest è sufficiente<br />
fornire: la posizione del braccio nello spazio intorno all'agente, la traiettoria che<br />
eventualmente il braccio deve compiere, la forma della mano (più precisamente del-<br />
le dita) e la direzione della mano, cioè l’orientamento del palmo della mano.<br />
Come detto tutti questi parametri sono espressi qualitativamente. Per indicare la po-<br />
sizione del braccio è stata effettuata una suddivisione dello spazio intorno all'agente<br />
(figura 1) e sono state fissate sei direzioni base (destra,sinistra, su, giù, davanti, die-<br />
tro) e tre distanze (vicino, a metà, lontano). In questo modo ogni punto dello spazio<br />
potrà essere approssimato dalla coppia (direzione, distanza) che più <strong>gli</strong> si avvicina (di-<br />
scretizzazione dello spazio). In più si possono ottenere direzioni intermedie come<br />
combinazione di quelle base. Per esempio nella figura seguente la freccia tratteggiata<br />
indica la direzione ottenuta combinando su con davanti:<br />
29
Capitolo II, Stato dell’arte<br />
Figura 1. discretizzazione dello spazio<br />
Per il movimento delle braccia sono disponibili cinque primitive (puntamento, mo-<br />
vimento lineare, movimento curvo, movimento circolare, movimento ondeggiante)<br />
che vanno istanziate dando i punti di riferimento spaziali del movimento (da speci-<br />
ficare come detto poco fa). Per esempio la primitiva del movimento curvilineo ha<br />
bisogno di un punto iniziale, un punto intermedio e un punto finale:<br />
Per la forma della mano si può sce<strong>gli</strong>ere tra cinque configurazioni base (figura a de-<br />
stra: angolata, a uncino, a<strong>per</strong>ta, pugno chiuso, dritta) ed eventualmente aggiungere<br />
un modificatore su ciascuna delle singole dita <strong>per</strong><br />
ottenere nuove forme.<br />
Infine <strong>per</strong> la direzione (orientamento) della mano<br />
è sufficiente dire dove puntano il palmo e il metacarpo usando le stesse direzioni<br />
della posizione spaziale del braccio.<br />
Dall'osservazione del linguaggio <strong>dei</strong> segni e utilizzando QualGest Lebourque e Gi-<br />
bet hanno memorizzato un vocabolario (più esattamente un gestuario) di ben 1359<br />
<strong>gesti</strong> che poi sono stati estesi <strong>per</strong> comprendere i <strong>gesti</strong> comunemente utilizzati du-<br />
rante la comunicazione verbale.<br />
30
Capitolo II, Stato dell’arte<br />
Come <strong>per</strong> tutti <strong>gli</strong> altri agenti conversazionali anche in GesSyCa è prevista una tem-<br />
porizzazione <strong>dei</strong> <strong>gesti</strong>. Al contrario di sistemi <strong>per</strong>ò questo aspetto non è stato tenuto<br />
particolarmente in considerazione. E' consentito poter vincolare una componente di<br />
un gesto in modo da farla avvenire dopo un certo intervallo di tempo dall'inizio del<br />
gesto o dopo che una certa <strong>per</strong>centuale del gesto è trascorsa. Inoltre si può ottenere<br />
una sincronizzazione tra le componenti del gesto e avvenimenti "esterni", come ad<br />
esempio il contatto tra le mani. Questo è sufficiente a riprodurre molto fedelmente<br />
il linguaggio <strong>dei</strong> segni della lingua francese ma non dà risultati particolarmente con-<br />
vincenti quando si utilizza GesSyCa nell'ambito di una conversazione "tradizionale".<br />
La parte implementativa del motore grafico si basa su un modello chiamato sensori-<br />
motor. Secondo il principio di funzionamento di questo modello in un certo istante<br />
di tempo lo stato q delle articolazioni dell'agente viene calcolato in base al gradiente<br />
dell'errore tra il vettore a che rappresenta lo stato all'istante precedente e il vettore<br />
obbiettivo t. Ovviamente se l'errore tra lo stato precedente e quello obbiettivo è<br />
molto grande (nel senso che alcune articolazioni devono compiere ampie rotazioni)<br />
nascono delle instabilità che possono generare <strong>dei</strong> loop del sistema. Per evitare que-<br />
sto è stata usata una funzione non lineare il cui guadagno cresce esponenzialmente<br />
con l'errore. Una caratteristica interessante di questo metodo è la capacità di antici-<br />
pare i movimenti in base al contesto generale del modello (stato precedente, stati<br />
successivi) e di concatenare piccoli movimenti consecutivi in un modo molto flui-<br />
do.<br />
31
Capitolo II, Stato dell’arte<br />
II.3 MAX (Stefan Kopp, 2001)<br />
Il lavoro di Kopp [24; 25; 26; 27; 55] è partito dall’osservazione e la misura <strong>dei</strong> <strong>gesti</strong><br />
compiuti dalle <strong>per</strong>sone mentre parlano. E’ stato studiato in laboratorio l'esatto svol-<br />
gimento spaziale <strong>dei</strong> <strong>gesti</strong> attraverso il tempo <strong>per</strong> mezzo di sensori elettromagnetici<br />
applicati sulle braccia e le mani di più <strong>per</strong>sone. Fatto questo è iniziata la fase di ana-<br />
lisi <strong>dei</strong> dati raccolti e la classificazione e traduzione <strong>dei</strong> <strong>gesti</strong> in una notazione simbo-<br />
lica.<br />
Il risultato di questa ricerca è che un gesto si compone di molte fasi, come la prepa-<br />
razione, lo stroke e il rilascio e che c'è una precisa dinamica secondo la quale queste<br />
fasi avvengono. Il modello finale dell'agente <strong>per</strong>mette quindi di parametrizzare non<br />
solo la forma del gesto ma anche la sua dinamica esatta.<br />
In Max ogni gesto viene descritto in termini delle sue caratteristiche posturali (vin-<br />
coli statici) e delle fasi del movimento prima, dopo e durante la fase di stroke del ge-<br />
sto (vincoli dinamici) mentre le fasi di preparazione e rilascio del gesto vengono in-<br />
serite automaticamente dal sistema. Questi vincoli vengono poi sistemati in una<br />
struttura ad albero composta di nodi di tipo PARALLEL e SEQUENCE. La de-<br />
scrizione <strong>dei</strong> vincoli statici e dinamici è fornita nello standard HamNoSys che è sta-<br />
to creato <strong>per</strong> trascrivere il linguaggio <strong>dei</strong> segni della lingua tedesca [47].<br />
32
Capitolo II, Stato dell’arte<br />
Fig. 2. Trascrizione in HamNoSys del segno che significa “ANDARE”<br />
Nel momento in cui un gesto viene istanziato avvengono 3 o<strong>per</strong>azioni:<br />
• viene scelto dal gestuario la definizione del gesto<br />
• il gesto viene adattato al contesto<br />
• vengono forniti i vincoli esterni di temporizzazione del gesto<br />
Per esempio il gesto “TIRARE” una volta istanziato temporalmente avrà la forma:<br />
TIRARE:<br />
(PARALLEL(Start 1.1)(End 1.41))<br />
(DYNAMIC (Start 1.1)(End 1.41)(HandLocation((LocShoulder Loc Stretched)(LocNear)))(Manner(Peak 1.39)))<br />
(DYNAMIC (Start 1.1)(End 1.41)(HandShape((BSflato)(BSfist)))(Manner(Peak 1.39)))<br />
(STATIC (Start 1.1)(End 1.41)(Palm Orientation(PalmU)))<br />
Il gesto parte con la mano a<strong>per</strong>ta di fronte alla spalla col braccio proteso in avanti e<br />
finisce con il pugno chiuso e il braccio chiuso in modo da portare la mano vicino al-<br />
la spalla mentre <strong>per</strong> tutta la durata del gesto il palmo è rivolto verso l’alto. La tem-<br />
porizzazione è impostata in modo che sia la chiusura delle dita che il movimento del<br />
braccio inizino al tempo 1.1 e finiscano al tempo 1.41 avendo come punto di stroke<br />
(che qui è chiamato peak) il tempo 1.39.<br />
33
Capitolo II, Stato dell’arte<br />
II.4 REA (Justine Cassell & HaoYan, 2000)<br />
L’obbiettivo di questo progetto [8; 13] era quello di realizzare un agente immobiliare<br />
in grado di interagire con l’utente fornendo le informazioni da lui richieste. REA<br />
viene proiettato su uno schermo di fronte al quale si trova l’utente che indossa un<br />
microfono che <strong>per</strong>mette il dialogo diretto con l’agente. Inoltre il sistema traccia <strong>per</strong><br />
mezzo di telecamere il movimento della testa e la posizione delle mani dell’utente.<br />
Infatti REA è forse l’unico agente che tiene in considerazione la comunicazione non<br />
verbale da parte dell’utente. Se <strong>per</strong> esempio mentre l’agente sta parlando l’utente sol-<br />
leva di scatto una mano l’agente è in grado di capire che l’utente vuole prendere la<br />
parola e allora smette di parlare e si mette in attesa (turn taking).<br />
Per la realizzazione di REA il lavoro è partito dall’osservazione di come alcune <strong>per</strong>-<br />
sone si comportavano durante la descrizione della struttura fisica di immobili e am-<br />
bienti chiusi. Durante questi es<strong>per</strong>imenti sono stati realizzati <strong>dei</strong> video che una volta<br />
analizzati hanno <strong>per</strong>messo di stabilire delle regole <strong>per</strong> la <strong>sintesi</strong> <strong>dei</strong> <strong>gesti</strong>. Infine è<br />
stata decisa la seguente gerarchia:<br />
Gesto referenziale complementare<br />
Gesto referenziale ridondante<br />
Gesto beat<br />
34
Capitolo II, Stato dell’arte<br />
Alla base di tutto ci sono i <strong>gesti</strong> di tipo beat (vedi capitolo I) che sono quindi i meno<br />
importanti nel senso che non esistono vincoli particolari <strong>per</strong> i quali devono essere<br />
generati. I <strong>gesti</strong> ridondanti riguardano l’obbiettivo principale (goal) della conversa-<br />
zione al quale di solito più di un gesto viene dedicato da chi parla. I <strong>gesti</strong> comple-<br />
mentari sono riferimenti a obbiettivi secondari, che sono obbiettivi di contorno a<br />
quello principale e che concorrono a specificarlo me<strong>gli</strong>o. Come si vede i <strong>gesti</strong> com-<br />
plementari hanno la priorità sui <strong>gesti</strong> ridondanti, e come ultima possibilità vengono<br />
lasciati i <strong>gesti</strong> beat.<br />
L’agente REA è in grado di capire e sintetizzare informazioni sia proposizionali che<br />
interattive, consente un input e un output multimodale, tiene in considerazione la<br />
temporizzazione. Vediamo com’è strutturato il modello su cui è basato:<br />
L’Input Manager racco<strong>gli</strong>e e codifica l’input proveniente dall’utente attraverso il parla-<br />
to, i <strong>gesti</strong>, lo sguardo. L’Hardwired Reaction comanda eventuali reazioni veloci che<br />
l’agente deve avere in conseguenza di stimolazioni come ad esempio lo spostamento<br />
dell’utente nell’ambiente in cui si svolge il dialogo. Il modulo Deliberative Discourse<br />
Processing interpreta i vari input dell’utente in modo appropriato. Nell’introduzione<br />
era questo l’oggetto che avevamo chiamato mente dell’agente.<br />
35
Capitolo II, Stato dell’arte<br />
Il Generation Module sintetizza poi la voce, i <strong>gesti</strong>, le espressioni facciali e la postura<br />
dell’agente, e nell’introduzione lo avevamo chiamato corpo dell’agente.<br />
L’implementazione vera e propria di Rea utilizza uno stesso modulo, lo SPUD, sia<br />
<strong>per</strong> generare il testo delle risposte che <strong>per</strong> calcolare <strong>gesti</strong>, intonazione e espressione<br />
facciale. Lo SPUD costruisce una struttura ad albero formalizzata con la grammatica<br />
LTAG (Stone & Doran, 1997) dalla quale vengono ottenuti <strong>gli</strong> alberi <strong>per</strong> i <strong>gesti</strong> e<br />
l'intonazione con un'o<strong>per</strong>azione di sostituzione. Ad esempio, se l'utente chiedesse<br />
all'agente di descrivere la sala da pranzo della casa, lo SPUD potrebbe fornire una<br />
risposta che dopo l'o<strong>per</strong>azione di sostituzione apparirebbe del tipo:<br />
SENTENCESTART<br />
there is astaircase in the<br />
middle ofit<br />
Invece di sce<strong>gli</strong>ere ogni gesto da un vocabolario di <strong>gesti</strong>, il sistema Rea cerca di sin-<br />
tetizzare il gesto dai suoi elementi base, come <strong>per</strong> esempio la forma delle mani, la<br />
posizione iniziale delle braccia, la loro traiettoria. Inoltre tiene in considerazione il<br />
contesto del discorso e <strong>gli</strong> obbiettivi della comunicazione. Quindi se l'agente sta de-<br />
scrivendo il giardino della casa allora compirà un lungo arco con le braccia nella di-<br />
rezione del giardino mentre pronuncia le parole "è ampio e molto verde".<br />
La temporizzazione <strong>dei</strong> <strong>gesti</strong> non è un elemento centrale come nel caso dell’agente<br />
di Kopp, e l’autore afferma che anche se è stata tenuta in considerazione il risultato<br />
finale non è stato particolarmente convincente.<br />
36
Capitolo II, Stato dell’arte<br />
II.5 Cosmo (Lester et al., 1997)<br />
Si tratta di un agente pedagogico sviluppato dall'Università della Carolina del Nord<br />
[30; 31; 32] nell’ambito dello studio di un agente animato da impiegare in progetti<br />
educativi. Cosmo in particolare è un agente es<strong>per</strong>to nella tecnologia di comunica-<br />
zione di rete su cui si basa Internet. Il suo compito è quello di seguire l'apprendi-<br />
mento di giovani studenti che anche attraverso il gioco imparano i meccanismi di<br />
trasmissione dell'informazione attraverso una rete con protocollo TCP/IP. Per rea-<br />
lizzare un agente dedicato all'apprendimento ci sono particolari aspetti della comu-<br />
nicazione umana da tenere in considerazione. Due di questi sono particolarmente<br />
importanti nel caso in cui, come accade con Cosmo, l'agente agisca all'interno di un<br />
mondo condiviso con l'utente:<br />
• Deictic believability<br />
Un agente pedagogico deve essere capace come <strong>gli</strong> esseri umani di far riferimen-<br />
to ad oggetti fisici situati nell'ambiente che lo circonda utilizzando una corretta<br />
combinazione di parlato, movimento, gestualità. E' quindi necessario progettare<br />
un planner <strong>per</strong> il comportamento dell'agente che tenga in considerazione le pro-<br />
prietà fisiche del mondo in cui l'agente abita e che <strong>gli</strong> <strong>per</strong>metta di esprimersi rife-<br />
rendosi a<strong>gli</strong> oggetti sia con i <strong>gesti</strong> (<strong>per</strong> esempio indicando con l’indice) che con le<br />
parole senza ambiguità. L’agente è in grado di rilevare il grado di ambiguità del<br />
37
Capitolo II, Stato dell’arte<br />
suo comportamento durante la fase di pianificazione e può agire di conseguenza.<br />
Ad esempio supponiamo che l’agente abbia appena fatto riferimento ad un og-<br />
getto A di classe C. Se dopo pochi secondi dovesse parlare di un altro oggetto B<br />
sempre di classe C allora l’agente rileverebbe un livello di ambiguità molto alto e<br />
deciderebbe di spostarsi nelle vicinanze dell’oggetto B prima di iniziare a descri-<br />
verlo.<br />
• Emotive believability<br />
L'agente deve essere emotivamente credibile. Già da molti anni <strong>gli</strong> animatori gra-<br />
fici si sono accorti che la qualità e la chiarezza della comunicazione può essere<br />
molto incrementata attraverso un comportamento emotivamente credibile. Il<br />
contenuto emotivo di quello che l’agente dice deve trasparire anche attraverso il<br />
movimento del corpo e di alcune sue parti in particolare. Un secondo planner si<br />
occupa quindi di orchestrare precisamente le espressioni della faccia, il movimen-<br />
to del corpo e delle braccia <strong>per</strong> sottolineare il contenuto affettivo delle parole, da-<br />
re incoraggiamento o aumentare la motivazione de<strong>gli</strong> studenti.<br />
II.5.1 Implementazione – Internet Advisor Learning Environment<br />
Cosmo è un agente pedagogico che “abita” un ambiente virtuale chiamato Internet<br />
Advisor Learning Environment. Gli studenti possono interagire con quest’ambiente<br />
attraverso un normale PC e possono imparare come funziona il metodo di instra-<br />
damento <strong>dei</strong> pacchetti di Internet.<br />
La voce di Cosmo è stata preregistrata da un attore e comprende 240 possibili frasi<br />
che durano da uno a venti secondi ciascuna. L’aspetto visivo di Cosmo è umano-<br />
stilizzato, cioè è più simile ad un cartone animato che ad un essere umano. Per ge-<br />
nerare la sua rappresentazione grafica è stato utilizzato un software 3D della<br />
Alias/Wavefront su una workstation SGI e tutti i possibili movimenti del corpo so-<br />
no stati precalcolati e poi trasferiti come immagini statiche su PC.<br />
38
Capitolo II, Stato dell’arte<br />
Notare che questo tipo di approccio nell’implementazione è completamente diver-<br />
so da quello de<strong>gli</strong> agenti <strong>dei</strong> paragrafi precedenti.<br />
Le immagini precalcolate sono di due tipi: full body o compositional. Le immagini full<br />
body vengono utilizzate ad esempio <strong>per</strong> azioni come battere le mani che in generale<br />
non hanno la funzione di indicare (nel senso di far riferimento a) qualcosa. Le im-<br />
magini compositional rappresentano invece varie parti del corpo separatamente (te-<br />
sta, braccia, corpo) e vengono assemblate quando l’agente deve indicare qualcosa<br />
con lo sguardo e/o con le mani.<br />
Una volta decisa una sequenza di azioni e quindi una o più sequenze di immagini<br />
precalcolate da visualizzare, <strong>per</strong> ottenere un movimento morbido del corpo vengo-<br />
no eventualmente aggiunti <strong>dei</strong> fotogrammi di transizione tra un’azione e la successi-<br />
va.<br />
II.6 Confronti con Greta<br />
Mettiamo ora in evidenza differenze e analogie tra l'agente Greta e i 4 sistemi pre-<br />
sentati nei paragrafi precedenti. Considereremo due piani diversi, prima quello delle<br />
caratteristiche generali dell'agente e poi quello implementativo.<br />
Per prima cosa va ricordato che l'agente Greta è in grado di comunicare il proprio<br />
stato emotivo mentre dialoga con l'utente e questo lo rende diverso da<strong>gli</strong> altri agenti<br />
che si concentrano di più sulla complessità <strong>dei</strong> <strong>gesti</strong> (Gessyca), sulla temporizzazio-<br />
ne (MAX) o sullo scopo pratico della conversazione (REA e Cosmo).<br />
Inoltre l'agente ha un aspetto visivo molto credibile al contrario ad esempio di Co-<br />
smo che è un cartone animato, o MAX che ha un corpo molto stilizzato come an-<br />
che REA e Gessyca.<br />
Inoltre molto spesso <strong>gli</strong> altri sistemi sono dedicati alla riproduzione <strong>dei</strong> <strong>gesti</strong> in con-<br />
testi molto ristretti (linguaggio <strong>dei</strong> segni, insegnamento) mentre la struttura di Greta<br />
è più generale e non legata a un utilizzo mirato dell'agente.<br />
39
Capitolo II, Stato dell’arte<br />
Alcuni sistemi <strong>per</strong>ò sono davvero avanzati sul piano della ricezione de<strong>gli</strong> input ver-<br />
bali e non verbali provenienti dall'utente. Per esempio REA riconosce il parlato e i<br />
movimenti del corpo in tempo reale. L'input di Greta è invece semplicemente un te-<br />
sto inserito in una finestra di dialogo.<br />
A livello implementativo Greta presenta forti somi<strong>gli</strong>anze con Gessyca nella defini-<br />
zione <strong>dei</strong> <strong>gesti</strong> tramite un linguaggio dedicato che <strong>per</strong>mette di comporre un gesto a<br />
partire da configurazione base. Questa tecnica è quella utilizzata anche in MAX<br />
mentre REA, come abbiamo visto, non ha un gestuario predefinito ma "crea" il ge-<br />
sto in base a quello che sta dicendo in un certo istante.<br />
In Greta <strong>per</strong>ò, al contrario di Gessyca e MAX, nel gestuario possono essere memo-<br />
rizzati anche <strong>dei</strong> <strong>gesti</strong> definiti a basso livello, cioè specificando esattamente le posi-<br />
zioni delle singole giunture del corpo dell'agente.<br />
La temporizzazione <strong>dei</strong> <strong>gesti</strong> di Greta è molto accurata e può essere paragonata a<br />
quella di MAX rispetto alla quale in più tiene in considerazione la suddivisione del<br />
gesto in un maggior numero di fasi elementari.<br />
L'animazione finale dell'agente viene calcolata matematicamente come fanno anche<br />
Gessyca, MAX e REA e non è preregistrata come nel caso di Cosmo.<br />
40
Capitolo III, L’agente Greta<br />
III.1 Introduzione<br />
III<br />
L’agente Greta<br />
Greta è un agente conversazionale capace di conversare in modo naturale con<br />
l’utente. Per fare questo è stato dotato di certe qualità tipiche de<strong>gli</strong> esseri umani:<br />
comunica attraverso i <strong>gesti</strong>, lo sguardo e l’intonazione della voce, trasmette il suo<br />
stato emotivo e tiene costantemente presente l’obbiettivo della conversazione<br />
Nel tipo di interazione che siamo <strong>per</strong> ora in grado di simulare, Greta ha il compito<br />
di fornire all’utente un’informazione appartenente a un certo dominio al quale<br />
l’agente riesce ad adattare il proprio comportamento. L’utente può fare richieste<br />
scrivendo in un’apposita finestra di dialogo e Greta pianifica di conseguenza quello<br />
che dovrà rispondere all’utente.<br />
Il comportamento (nel senso di gestualità, espressioni facciali, intonazione della vo-<br />
ce) dell’agente dovrà essere sincronizzato con la sua voce e con il significato di quel-<br />
lo che sta dicendo; e dovrà anche riflettere il suo stato mentale evitando contempo-<br />
41
Capitolo III, L’agente Greta<br />
raneamente un “sovraccarico delle espressioni” (<strong>per</strong> esempio una <strong>gesti</strong>colazione ec-<br />
cessiva).<br />
Vedremo ora un esempio di interazione e daremo poi una descrizione più detta<strong>gli</strong>a-<br />
ta dell’architettura di Greta.<br />
III.2 Un esempio di interazione<br />
Supponiamo che il compito di Greta sia quello di fornire all’utente delle informa-<br />
zioni di tipo medico. L’utente attraverso una finestra di dialogo informa Greta di<br />
voler conoscere il proprio stato di salute. In questo esempio Greta risponde<br />
all’utente che e<strong>gli</strong> soffre di una forma leggera di angina pectoris. L’utente allora<br />
chiede di avere maggiori informazioni su questa malattia e quale potrebbe essere la<br />
cura <strong>per</strong> guarire da essa.<br />
Figura 1. L'agente Greta<br />
Utente: attraverso un’interfaccia grafica l’utente effettua il login e chiede informa-<br />
zioni sul proprio stato di salute.<br />
Greta: “Mi dispiace doverla informare che le è stata diagnosticata una forma non<br />
grave di quella che viene chiamata angina pectoris.”<br />
42
Capitolo III, L’agente Greta<br />
Utente: “Di che tipo di malattia si tratta?”<br />
Greta: “E’ uno spasmo del torace ed è causato dal un sovraffaticamento del cuore.”<br />
Utente: “Come posso curarmi?”<br />
Greta: “Per risolvere il suo problema ci sono due medicine che lei deve prendere.<br />
La prima è l’Aspirina e la seconda è l’Atenolol.”<br />
Nell’esempio possiamo distinguere 3 turni di dialogo, ciascuno composto da una<br />
coppia domanda/risposta. L’agente ha una base di conoscenza che <strong>gli</strong> <strong>per</strong>mette di<br />
interpretare la domanda dell’utente e di costruire la risposta. Siccome l’utente è stato<br />
caratterizzato come paziente di un dottore, Greta spiegherà la malattia usando un<br />
linguaggio adatto a <strong>per</strong>sone che non hanno conoscenze mediche. In più in questo<br />
dialogo l’agente dovrà dimostrare un certo coinvolgimento emotivo con l’utente, di-<br />
verso da quello che avrebbe mostrato parlando con un altro dottore.<br />
Durante la prima frase Greta esprimerà la sua empatia all’utente sia verbalmente<br />
(“mi dispiace doverla informare”) che non (sollevando le sopracci<strong>gli</strong>a e inclinando<br />
leggermente la testa di lato, sollevando le mani come mostrato in figura). Poi <strong>per</strong>ò<br />
farà in modo di sottolineare le parole “non grave” <strong>per</strong> far capire all’utente che la<br />
malattia non è molto seria.<br />
43
Capitolo III, L’agente Greta<br />
III.3 Descrizione del sistema<br />
Figura 2. Architettura dell'agente Greta<br />
L’architettura del sistema è costituita da quattro parti principali, che descriviamo<br />
brevemente:<br />
• Mente: si occupa dello stato mentale ed emotivo dell’agente. Durante ogni turno<br />
della conversazione esso può rimanere invariato oppure essere modificato in ba-<br />
se a fattori come <strong>gli</strong> eventi esterni, l’input dell’utente, l’evoluzione di uno stato<br />
emotivo precedente, e così via.<br />
• Gestore del dialogo: è il modulo incaricato di portare avanti i turni di dialogo<br />
con l’utente.<br />
All’inizio del dialogo esso formula lo scopo della conversazione. Nell’esempio<br />
che abbiamo visto lo scopo era quello di fornire all’utente informazioni sul suo<br />
stato di salute. A questo punto viene generato il piano del discorso e la conversazio-<br />
ne inizia in base alla parte iniziale di questo piano. Nell’esempio la fase iniziale<br />
consisteva nell’informare l’utente che e<strong>gli</strong> era affetto da una lieve forma di angina<br />
pectoris.<br />
44
Capitolo III, L’agente Greta<br />
Man mano che l’utente richiede maggiori informazioni (<strong>per</strong> esempio su come cu-<br />
rarsi, ecc.) il piano del discorso serve come punto di riferimento <strong>per</strong> l’agente <strong>per</strong><br />
decidere come impostare le sue risposte in base alle risposte che già sono state<br />
fornite.<br />
Ogni volta che il gestore del dialogo genera un turno di conversazione esso viene<br />
mandato in input sia al modulo Mente che al MIDAS. Il primo potrà così ag-<br />
giornare lo stato emotivo dell’agente e, comunicando il suo nuovo stato al Dialog<br />
Manager, verrà influenzato il modo in cui l’agente presenterà le successive rispo-<br />
ste.<br />
• MIDAS: questo modulo effettua la traduzione dalla rappresentazione simbolica<br />
del dialogo ricevuta dal gestore del dialogo, in una rappresentazione che specifi-<br />
chi i segnali non verbali che l’agente deve mostrare durante il parlato. Il destina-<br />
tario dell’output del MIDAS è infatti il modulo di generazione <strong>dei</strong> movimenti fi-<br />
sici dell’agente. Il linguaggio di specifica è stato definito usando XML [54] ed è<br />
stato chiamato APML (Affective Presentation Markup Language, vedere anche il<br />
capitolo IV <strong>per</strong> un esempio).<br />
Una volta ricevuto il testo in linguaggio naturale e il piano del discorso dal gesto-<br />
re del dialogo, il modulo MIDAS arricchisce il testo con i marcatori del linguag-<br />
gio APML, tenendo in considerazione lo stato emotivo attuale dell’agente e <strong>gli</strong><br />
obbiettivi della conversazione.<br />
I tag del linguaggio APML si riferiscono alle funzioni comunicative descritte nel<br />
paragrafo I.4 e hanno la forma:<br />
<br />
• Corpo: ha la funzione (come già spiegato nell’introduzione) di generare il movi-<br />
mento fisico dell’agente, cioè la comunicazione non verbale, sintetizzare il suono<br />
delle frasi pronunciate dall’agente e sincronizzare tra loro movimenti (del corpo,<br />
delle labbra) e suono.<br />
Quando l’agente vorrà comunicare un particolare stato emotivo sarà compito del<br />
modulo Corpo decidere su quali canali convo<strong>gli</strong>are questa informazione. Ad<br />
45
Capitolo III, L’agente Greta<br />
esempio avevamo già detto che l’espressione “mi dispiace...” doveva essere mol-<br />
to rafforzata e quindi poteva essere espressa sia attraverso l’espressione facciale<br />
(sollevando le sopracci<strong>gli</strong>a) che con i <strong>gesti</strong> (sollevando le mani e coi palmi rivolti<br />
verso l’interlocutore).<br />
In altri casi i messaggi non verbali verranno smistati su singoli canali. Ad esem-<br />
pio nel capitolo I avevamo detto che i <strong>gesti</strong> di solito non sono molto adatti ad<br />
esprimere emozioni affettive che quindi verranno quasi sempre destinate alle<br />
espressioni facciali.<br />
In qualche caso infine sarà anche possibile una parallelizzazione della comunica-<br />
zione, cioè l’utilizzo contemporaneo di più canali <strong>per</strong> dare informazioni diverse.<br />
46
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
IV.1 Motore gestuale<br />
IV<br />
Il sistema <strong>dei</strong> <strong>gesti</strong><br />
Questa tesi si occupa principalmente della progettazione e dello sviluppo del modu-<br />
lo di <strong>sintesi</strong> <strong>dei</strong> <strong>gesti</strong> dell'agente conversazionale Greta. Questo elemento può essere<br />
anche chiamato motore gestuale. Prima di descrivere come il lavoro è stato impostato<br />
vediamo quali sono in generale i problemi a cui si va incontro durante la realizza-<br />
zione di un oggetto di questo tipo.<br />
Il motore gestuale di un agente conversazionale è un programma che, preso in input un'opportuna<br />
descrizione dell'informazione che l'agente intende comunicare, decide e calcola i movimenti delle arti-<br />
colazioni delle braccia e delle mani dell'agente.<br />
L’architettura tipica di un generico motore gestuale potrebbe essere la seguente:<br />
47
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
Figura 1. Architettura di un motore gestuale<br />
In input c'è un'opportuna descrizione dell'informazione che l'agente vuole comuni-<br />
care all'utente. Nel nostro caso, come abbiamo anticipato alla fine del capitolo III, si<br />
tratta di un testo arricchito con i tag del linguaggio APML:<br />
Esempio IV.1:<br />
<br />
Salve,<br />
<br />
il mio nome è<br />
<br />
Greta.<br />
<br />
Nell’esempio una coppia di tag (in questo caso un marcatore <strong>per</strong>formativo, vedere<br />
capitolo I) racchiude la parola "salve" indicando al motore che si tratta di un saluto,<br />
e successivamente un'altra coppia (marcatore enfasi, vedere capitolo I) è intorno alla<br />
parola "Greta" <strong>per</strong> specificare che essa rappresenta un concetto da enfatizzare mol-<br />
to.<br />
Questo testo arriva in input al selettore <strong>dei</strong> <strong>gesti</strong> che decide secondo alcuni criteri quali<br />
sono i <strong>gesti</strong> che vanno riprodotti. I criteri che usa <strong>per</strong> fare questo derivano da studi<br />
sulla gestualità delle <strong>per</strong>sone, come già spiegato in precedenza nell’ultimo paragrafo<br />
del capitolo I.<br />
48
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
Il sintetizzatore del movimento infine accede a una base dati in cui sono contenute le de-<br />
scrizioni "motorie" di molti tipi di gesto e da questa preleva i <strong>gesti</strong> che possono ef-<br />
fettivamente essere riprodotti, scartandone eventualmente altri. L'output finale è<br />
una descrizione del movimento, <strong>per</strong> esempio un file contenete una sequenza di coppie<br />
(giuntura, rotazione) del tipo:<br />
fotogramma 1: (giuntura 1, rotazione), (giuntura 2, rotazione),..............., (giuntura n, rotazione)<br />
fotogramma 2: (giuntura 1, rotazione), (giuntura 2, rotazione),..............., (giuntura n, rotazione)<br />
.....<br />
.....<br />
fotogramma k: (giuntura 1, rotazione), (giuntura 2, rotazione),..............., (giuntura n, rotazione)<br />
IV.2 Motore gestuale di Greta<br />
Il motore gestuale dell'agente Greta è basato sul lavoro inizialmente svolto da<br />
Bjoern Hartmann [15] dell'Università della Pennsylvania.<br />
Il sistema originario è stato ampliato aggiungendo alcune parti totalmente mancanti<br />
e modificato <strong>per</strong> rispondere ad alcuni requisiti indispensabili.<br />
Il motore è stato scritto totalmente in C++ utilizzando come supporto alcune libre-<br />
rie matematiche di pubblico dominio sviluppate quasi sempre da altre Università <strong>per</strong><br />
fini di ricerca.<br />
Il modello utilizzato <strong>per</strong> riprodurre il corpo dell'agente segue le specifiche dello<br />
standard H-Anim (Appendice C) [10] e l'output prodotto dal motore è in formato<br />
MPEG4/BAP (Appendice B) [5; 17; 35; 46], leggibile cioè da un qualsiasi Player <strong>per</strong><br />
questo standard.<br />
49
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
IV.3 Dal motore originario a quello finale<br />
Vediamo in detta<strong>gli</strong>o come è stato impostato il lavoro svolto in questa tesi.<br />
Il motore originario sviluppato da Hartmann era un’applicazione che, una volta ri-<br />
chiesta una certa sequenza di <strong>gesti</strong>, calcolava tutti i fotogrammi di animazione delle<br />
articolazioni di uno scheletro umanoide definito secondo lo standard H-Anim pro-<br />
ducendo infine un file d’animazione in formato MPEG4/BAP.<br />
In altre parole era possibile inviare una serie di richieste di tipo Request(nome gesto,<br />
temporizzazione) al motore <strong>per</strong> ottenere in output l’animazione finale.<br />
In pratica il motore era il modulo che nella figura 1 abbiamo indicato come Sintetiz-<br />
zatore del movimento.<br />
Il sistema stesso era quindi ancora molto lontano dall’essere quello che abbiamo in<br />
precedenza definito motore gestuale.<br />
Gli obbiettivi del lavoro svolto in questa tesi sono stati:<br />
1. trasformare il motore originario in un motore gestuale: era necessario intro-<br />
durre un nuovo modulo che si occupasse di decidere quali <strong>gesti</strong> eseguire seguen-<br />
do una certa strategia e con una corretta temporizzazione. Successivamente oc-<br />
correva creare un gestuario da cui questo modulo potesse ottenere le informa-<br />
zioni sui <strong>gesti</strong> da riprodurre.<br />
Inoltre è stato necessario integrare nel motore il parser APML realizzato da Mas-<br />
simo Bilvi <strong>per</strong> il suo motore di <strong>sintesi</strong> delle espressioni facciali dell’agente Greta.<br />
Nel prossimo capitolo vedremo me<strong>gli</strong>o come è stata svolta tutta questa parte del<br />
lavoro.<br />
2. implementare il BAP player e raffinare il modello 3D: si tratta del modulo<br />
che trasforma i dati dell’animazione in una rappresentazione grafica in movimen-<br />
to. L’output del BAP Player è un vero e proprio filmato in cui il corpo<br />
dell’agente Greta è visibile e animato in base ai dati calcolati dal motore memo-<br />
rizzati nel file BAP.<br />
50
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
Il BAP Player che abbiamo implementato è stato dotato di controlli <strong>per</strong> la ripro-<br />
duzione (avanti, stop, indietro, avanzamento di singoli fotogrammi) e <strong>per</strong> modi-<br />
ficare la posizione della telecamera.<br />
Nel capitolo VI, in cui il BAP Player viene descritto, vedremo che i filmati pro-<br />
dotti inizialmente avevano numerosi problemi di visualizzazione che hanno ri-<br />
chiesto un lavoro di raffinamento del modello 3D del corpo dell’agente.<br />
Il BAP Player viene presentato nel capitolo VI.<br />
3. ottenere un sistema del tutto autosufficiente: il progetto iniziale era forte-<br />
mente vincolato al programma commerciale Maya della Alias/Wavefront (vedere<br />
Appendice).<br />
Questo software veniva utilizzato <strong>per</strong> la modellazione del corpo dell’agente e poi<br />
<strong>per</strong> la definizione delle pose statiche sulle quali vengono poi costruiti i <strong>gesti</strong>. Tut-<br />
ti questi concetti verranno ripresi poi nel capitolo VI.<br />
E’ stato quindi necessario realizzare alcuni tools che <strong>per</strong>mettessero di fare del a<br />
meno di Maya, <strong>per</strong> mantenere il progetto indipendente nel suo insieme da qual-<br />
siasi altro software. Anche questi tools verranno spiegati nel capitolo VI.<br />
4. mi<strong>gli</strong>orare il motore gestuale: sono state apportate una serie di mi<strong>gli</strong>orie al<br />
motore, sia <strong>per</strong> correggere alcuni difetti che <strong>per</strong> aggiungere nuove funzionalità.<br />
Tutte queste modifiche sono spiegate in detta<strong>gli</strong>o nel prossimo capitolo:<br />
• <strong>gesti</strong> <strong>dei</strong>ttici: il motore inizialmente non era in grado di calcolarli. E’ stata ag-<br />
giunta la possibilità di chiedere all’agente di indicare un oggetto presente nello<br />
spazio. Vedremo che questo tipo di problema è un classico dell’animazione in<br />
grafica 3D e che non è in generale di ovvia soluzione.<br />
• temporizzazione: i <strong>gesti</strong> non erano eseguiti correttamente, erano sempre<br />
troppo lenti e morbidi. E’ stato <strong>per</strong>ciò modificato alcune componenti del mo-<br />
tore in modo da conferire al movimento una dinamica più realistica.<br />
• posizioni di riposo multiple: abbiamo detto che quando una <strong>per</strong>sona produce<br />
<strong>gesti</strong> va continuamente dalla posizione di riposo a quella del gesto, <strong>per</strong> poi<br />
tornare in una posizione di riposo che <strong>per</strong>ò non è necessariamente identica a<br />
51
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
quella iniziale ma è influenzata da vari fattori, come ad esempio il punto dello<br />
spazio in cui è avvenuto il gesto o il fatto che stiamo <strong>per</strong> effettuare un altro<br />
gesto molto ravvicinato nel tempo al primo.<br />
Tutto ciò non veniva tenuto in considerazione dal motore originario ed è sta-<br />
to implementato successivamente.<br />
IV.4 Il motore originario<br />
Diamo quindi una descrizione del motore realizzato da Bjoern Hartmann [15], par-<br />
tendo dalla sua architettura:<br />
IV.4.1 Concretizzatore <strong>gesti</strong><br />
Figura 2. Il motore di B. Hartmann<br />
Il concretizzatore <strong>gesti</strong> riceve un elenco di richieste di gesto. In questa versione iniziale<br />
del motore queste richieste erano inserite manualmente all’interno del codice sor-<br />
gente, mentre in quello finale saranno il risultato delle scelte effettuate precedente-<br />
mente dal modulo di pianificazione <strong>dei</strong> <strong>gesti</strong>.<br />
52
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
Una volta ricevuta in input una lista di richieste il concretizzatore esegue i seguenti<br />
passi:<br />
1. cercare il gesto nel gestuario: se non esiste passare alla richiesta successi-<br />
va, altrimenti andare avanti<br />
2. controllare se è possibile effettuare il gesto:<br />
2.1. se il gesto richiede l’uso di tutte e due le mani controllare che en-<br />
trambe siano libere, altrimenti passare alla richiesta successiva<br />
2.2. se il gesto richiede l’uso di una sola mano controllare se almeno<br />
una delle mani è disponibile altrimenti passare alla richiesta succes-<br />
siva<br />
3. creare un’istanza del gesto con i vincoli di temporizzazione richiesti<br />
A questo punto il concretizzatore esamina la lista <strong>dei</strong> <strong>gesti</strong> istanziati e inserisce tra di<br />
loro <strong>dei</strong> <strong>gesti</strong> particolari, detti <strong>gesti</strong> di riposo che vanno effettuati quando c’è molto<br />
spazio tra due <strong>gesti</strong> consecutivi. Anche su questo punto abbiamo detto che è stato<br />
svolto un lavoro di raffinamento me<strong>gli</strong>o descritto nel prossimo capitolo.<br />
Nel passo 1 dell’algoritmo che abbiamo appena visto si fa riferimento a un gestua-<br />
rio. Esso è una raccolta di <strong>gesti</strong> sotto forma di file di testo nei quali i <strong>gesti</strong> sono de-<br />
scritti nel linguaggio GestureScript appositamente definito, descritto nel paragrafo fi-<br />
nale di questo capitolo.<br />
IV.4.2 Pianificatore del movimento<br />
Il pianificatore del movimento è la componente che calcola effettivamente il movi-<br />
mento delle braccia e delle mani dell’agente.<br />
Il suo input è un vettore di <strong>gesti</strong>. La struttura dati che viene utilizzata <strong>per</strong> memoriz-<br />
zare le informazioni di ciascun gesto è una gerarchia in cui ogni gesto è composto di<br />
vari fotogrammi chiave e ogni fotogramma di varie componenti:<br />
53
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
Un gesto può essere composto da (almeno) uno o più fotogrammi. Un fotogramma<br />
è a sua volta un vettore di componenti, e ciascuna di esse può appartenere a una di<br />
queste classi:<br />
Nome Giunture interessate<br />
Mano tutte quelle delle dita della mano<br />
Braccio spalla e gomito<br />
Polso polso<br />
Rumore tutte, vedi sotto<br />
Statica tutte, vedi sotto<br />
Per ogni frame è ammessa una qualsiasi combinazione di componenti (ma non più<br />
di una <strong>per</strong> ogni classe).<br />
Le componenti Rumore e Statica servono <strong>per</strong> scopi particolari:<br />
• Rumore: viene applicata a tutte le giunture del modello e contiene piccolis-<br />
simi spostamenti generati casualmente. Cioè inserisce un fattore di impreci-<br />
sione “umano” nei movimenti dell’agente [41].<br />
54
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
• Statica: questo tipo di componente serve a descrivere <strong>gesti</strong> “statici”. In al-<br />
cuni casi infatti potrebbe non essere possibile riuscire a specificare tutti i ge-<br />
sti in senso qualitativo con il linguaggio GestureScript a cui abbiamo già ac-<br />
cennato e che vedremo me<strong>gli</strong>o nell’ultimo paragrafo di questo capitolo. In<br />
questi casi allora il gesto può essere specificato in senso quantitativo inseren-<br />
do in un file tutti i valori numerici de<strong>gli</strong> spostamenti delle articolazioni e in-<br />
dicando poi al motore il nome di questo file.<br />
Vediamo con un esempio come funziona il pianificatore del movimento.<br />
Esempio IV.3:<br />
Passo 1: <strong>per</strong> ogni gesto presente nel vettore <strong>dei</strong> <strong>gesti</strong> ricevuto in input considerare il<br />
vettore composto dai suoi fotogrammi chiave:<br />
Nel grafico sull’asse delle ascisse c’è il tempo espresso in secondi e sull’asse delle<br />
ordinate <strong>per</strong> ogni fotogramma c’è la coordinata spaziale di una delle giunture<br />
dell’agente.<br />
Passo 2: utilizzando un algoritmo di interpolazione (spiegata più avanti) tra i foto-<br />
grammi chiave generare l’intera sequenza di frame dell’animazione:<br />
55
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
Il problema dell’animazione <strong>per</strong> mezzo di interpolazione tra fotogrammi chiave è<br />
stato ed è tuttora molto studiato. In particolare nell’animazione de<strong>gli</strong> arti di un esse-<br />
re umano o di un animale insorgono anomalie nel movimento se si usa una semplice<br />
interpolazione lineare insieme a una rappresentazione euleriana delle rotazioni.<br />
La tecnica utilizzata in Greta consiste nel convertire <strong>gli</strong> angoli di rotazione dalla<br />
rappresentazione euleriana a quella con quaterne [9; 49] e poi effettuare<br />
un’interpolazione tramite TCB splines [23; 28; 37; 56; 57].<br />
Il risultato finale prodotto dal pianificatore del movimento è un file in formato<br />
MPEG4/BAP [5; 17; 35; 46].<br />
IV.4.3 BAP Player<br />
La rappresentazione grafica finale dell’agente Greta viene fornita dal BAP Player. Il<br />
motore come abbiamo visto si occupa solo del calcolo <strong>dei</strong> fotogrammi<br />
dell’animazione. E’ il Player che, leggendo i dati contenuti nel BAP File prodotto dal<br />
motore, dà all’agente un aspetto “fisico” animato.<br />
56
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
IV.5 Il motore finale<br />
Descriveremo ora la struttura finale del motore gestuale. Alcuni elementi dello<br />
schema sono già stati presi in esame nel paragrafo precedente <strong>per</strong>ché facevano parte<br />
del sistema originario.<br />
Figura 3. Il motore gestuale di Greta<br />
IV.5.1 Il linguaggio APML e il parser APML<br />
L’unico input di tutto il sistema è un file APML contenente del testo arricchito da<br />
alcuni tag che descrivono l’informazione che l’agente deve comunicare attraverso i<br />
canali non verbali. Lo stesso file APML viene inviato anche all’altro motore di ge-<br />
stione dell’agente attualmente sviluppato, cioè quello <strong>per</strong> le espressioni facciali.<br />
57
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
Il linguaggio APML è stato creato da Nadja de Carolis e Mark Steedman usando<br />
XML, un metalinguaggio markup <strong>per</strong> la definizione di altri linguaggi sempre di tipo<br />
markup [54].<br />
Abbiamo già detto nel capitolo III che i tag del linguaggio APML si riferiscono alle<br />
funzioni comunicative descritte nel paragrafo I.4 e hanno la forma:<br />
<br />
In più sono stati definiti i tag x-pitchaccent [42] che servono a regolare la variazione<br />
dell’altezza del tono della voce.<br />
Il parser XML realizzato da Massimo Bilvi provvede a validare il file in input, estrae<br />
il testo in esso contenuto che poi passa in input al programma di <strong>sintesi</strong> vocale Festi-<br />
val (vedi paragrafo successivo). Infine genera un nuovo file di testo contenente tutti<br />
tags che sono stati incontrati e <strong>per</strong> ciascuno di essi l’esatta temporizzazione del tag<br />
rispetto al file WAV restituito da Festival. Il file con le temporizzazioni viene resti-<br />
tuito al pianificatore del turno.<br />
Vediamo un esempio di input <strong>per</strong> il parser:<br />
Esempio IV.2:<br />
<br />
<br />
I'm sorry to tellyou<br />
<br />
that you have been<br />
diagnosed <br />
as suffering<br />
from a mild<br />
formof what we call<br />
<br />
angina<br />
pectoris.<br />
<br />
<br />
<br />
58
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
ed ecco il risultato dell’o<strong>per</strong>azione di parsing, i tempi (in secondi) sono nella forma<br />
tempo di inizio, durata :<br />
IV.5.2 Festival<br />
<strong>per</strong>formative=inform 1.5335 7.4918<br />
theme affect=sorry-for 1.5335 1.4738<br />
theme belief-relation=gen-spec 1.5335 1.4738<br />
theme emphasis=LplusHstar 2.5817 0.2546<br />
rheme emphasis=Hstar 3.7545 0.7687<br />
rheme emphasis=Hstar 4.9208 0.5276<br />
rheme emphasis=Hstar 5.7342 0.2939<br />
rheme adjectival=small 5.7342 0.2939<br />
rheme emphasis=Hstar 6.0281 0.5123<br />
topic-comment=comment 7.6744 1.3509<br />
emphasis=Hstar 7.6744 0.4726<br />
emphasis=Hstar 8.1470 0.8783<br />
Si tratta di un sistema di <strong>sintesi</strong> vocale sviluppato dal CSTR (Centre for Speech<br />
Technology Research) dell’Università di Edimburgo [4]. Esso svolge un ruolo im-<br />
portante nel motore <strong>per</strong>ché si occupa di calcolare esattamente il tempo di inizio e la<br />
durata del testo che viene pronunciato dall’agente. Grazie a questo calcolo il parser<br />
XML riesce a risalire alla temporizzazione <strong>dei</strong> singoli tag contenuti nel file XML di<br />
input, come abbiamo visto nel paragrafo precedente.<br />
Fetival è basato sul linguaggio funzionale Scheme (variante del LISP) ma fornisce<br />
un’interfaccia in C <strong>per</strong> poter invocare le funzioni Scheme.<br />
IV.5.3 Pianificatore <strong>dei</strong> <strong>gesti</strong><br />
Anche intorno a questo elemento del motore si è concentrato il lavoro svolto in<br />
questa tesi, e torneremo a parlarne molto in detta<strong>gli</strong>o nel capitolo V.<br />
Il compito del pianificatore <strong>dei</strong> <strong>gesti</strong> è quello di generare il piano secondo cui<br />
l’agente effettuerà i <strong>gesti</strong> durante il suo turno di conversazione.<br />
59
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
Questo significa che esso esaminerà il risultato del parser XML (il file delle tempo-<br />
rizzazioni) e deciderà quali saranno i <strong>gesti</strong> che il motore dovrà generare, stabilendo<br />
la loro temporizzazione e risolvendo eventuali conflitti.<br />
Tornando all’Esempio IV.2, a partire dal file generato dal parser, il pianificatore ef-<br />
fettuerà una sequenza di chiamate di questo tipo:<br />
Concretizzatore.Richiedi(“ADJECTIVAL=SMALL”,5.7342,5.954625,6.0281);<br />
Concretizzatore.Richiedi(“BEAT=BEATHBOTH”,8.147,8.805725,9.0253);<br />
...<br />
...<br />
IV.6 Il linguaggio GestureScript<br />
Il motore gestuale dell’agente Greta utilizza un sistema di descrizione qualitativa <strong>dei</strong><br />
<strong>gesti</strong> basato su un linguaggio appositamente definito chiamato GesturesScript.<br />
Riportiamo una breve descrizione della sintassi del linguaggio utilizzando la seguen-<br />
te notazione: le parole chiave sono in maiuscolo, le parentesi quadre indicano un<br />
campo opzionale e quelle angolari rimandano ad un tipo di dato.<br />
Ad ogni gesto del gestuario corrisponde il relativo file di descrizione GestureScript.<br />
Ogni file inizia con una sezione di intestazione (header):<br />
GESTURECLASS <br />
GESTUREINSTANCE <br />
DURATION <br />
SIDE <br />
Il primo campo indica a quale classe il gesto appartiene tra quelle definite nel capito-<br />
lo I. Il secondo campo è il tipo particolare di istanza del gesto. Un esempio potreb-<br />
be essere:<br />
GESTURECLASS <strong>per</strong>formative<br />
GESTUREINSTANCE greet<br />
Il terzo campo è la durata di default del gesto. Il motore in realtà adatta la durata del<br />
gesto al contesto in cui esso viene inserito. Il quarto campo specifica con quale ma-<br />
60
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
no dovrà essere effettuato il gesto. Se il campo non viene specificato il motore deci-<br />
derà probabilisticamente quale mano utilizzare, favorendo quella destra. Altrimenti<br />
sarà obbligato ad usare la mano specificata e in caso di conflitto con altri <strong>gesti</strong> vicini<br />
potrebbe decidere di non effettuare il gesto.<br />
Dopo l’header seguono uno o più blocchi <strong>per</strong> ogni fotogramma del gesto. Un foto-<br />
gramma è una posizione intermedia del corpo durante lo svolgimento del gesto. Se<br />
c’è un solo fotogramma allora esso descrive totalmente il gesto, altrimenti il gesto<br />
sarà ottenuto concatenando con un’opportuna interpolazione tutti i fotogrammi di<br />
cui è composto.<br />
La sintassi <strong>per</strong> la definizione di un fotogramma è:<br />
STARTFRAME <br />
[FRAMETYPE ]<br />
[ARM ]<br />
[WRIST ]<br />
[HAND [] []<br />
OR [ OR ]]<br />
[FINGER ]<br />
[ADDNOISE]<br />
ENDFRAME<br />
• STARTFRAME, ENDFRAME: marcano l’inizio e la fine del blocco di defi-<br />
nizione del fotogramma. STARTFRAME è seguito da un numero compreso<br />
tra 0 e 1 che indica la posizione relativa del fotogramma all’interno dello<br />
svolgimento dell’intero gesto. Un valore di 0.5 ad esempio significherà che il<br />
fotogramma si trova esattamente a metà del gesto.<br />
• FRAMETYPE: specifica quale fase del gesto è descritta dal fotogramma. I<br />
possibili valori sono:<br />
− preparation<br />
− pre_stroke_hold<br />
− stroke<br />
− stroke_start<br />
− stroke_end<br />
− post_stroke_hold<br />
− retraction<br />
<strong>per</strong> la descrizione delle fasi del gesto vedere il capitolo I.<br />
61
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
• ARM: definisce la configurazione di braccio e avambraccio. Per fare questo<br />
basta specificare la posizione nello spazio della mano dell’agente. Lo spazio<br />
intorno al corpo dell’agente è stato suddiviso in regioni:<br />
Le coordinate X e Y quindi possono essere specificate indicando la regione<br />
nella quale si trovano. La coordinata X potrà variare tra questi valori: estrema<br />
<strong>per</strong>iferia (EP), <strong>per</strong>iferia (P), centro (C), centro-centro (CC) e centro opposto<br />
(OppC). La Y invece: estrema <strong>per</strong>iferia su<strong>per</strong>iore (Up<strong>per</strong>EP), <strong>per</strong>iferia supe-<br />
riore (Up<strong>per</strong>P), centro su<strong>per</strong>iore (Up<strong>per</strong>C), centro-centro (CC), centro infe-<br />
riore (LowerC), <strong>per</strong>iferia inferiore (LowerP) e estrema <strong>per</strong>iferia inferiore<br />
(LowerEP).<br />
Anche la Z può trovarsi in una delle 3 regioni: vicino (Near), medio (Middle)<br />
e lontano (Far).<br />
• WRIST: rappresenta la rotazione del polso e di conseguenza l’orientamento<br />
della mano. Prevede due parametri, e cioè le direzioni <strong>dei</strong> vettori “palmo” e<br />
“dita” indicati nella figura seguente:<br />
62
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
Figura 4. Vettori palmo e dita<br />
Anche le possibili direzioni di questi due vettori sono state discretizzate e<br />
possono variare tra: su, giù, avanti, dietro, interno, esterno (up, down, away,<br />
towards, inwards, outwards).<br />
• HAND e FINGER: definisce la forma della mano, più esattamente delle dita<br />
della mano. E’ possibile sce<strong>gli</strong>ere tra alcune forme base oppure specificare<br />
ogni dito singolarmente (usando FINGER). Se si sce<strong>gli</strong>e una forma base si<br />
può comunque aggiungere un modificatore <strong>per</strong> il pollice. Nelle figure se-<br />
guenti possiamo vedere tutte le forme base:<br />
63
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
e i modificatori del pollice:<br />
• ADDNOISE: indica al motore di aggiungere una componente di rumore ca-<br />
suale al fotogramma, vedere anche IV.4.2.<br />
Per concludere, descriviamo un esempio reale di definizione di un gesto tramite Ge-<br />
stureScript:<br />
GESTURECLASS iconic<br />
GESTUREINSTANCE small<br />
DURATION 1.5<br />
STARTFRAME 0.0<br />
FRAMETYPE strokestart<br />
ARM XC YUp<strong>per</strong>P ZNear<br />
HAND symbol_1_open<br />
FINGER index bend_curved<br />
WRIST FBUp PalmInwards<br />
ENDFRAME<br />
STARTFRAME 0.4<br />
FRAMETYPE stroke<br />
ARM XC YUp<strong>per</strong>P ZMiddle<br />
WRIST FBUp PalmInwards<br />
ENDFRAME<br />
STARTFRAME 1.0<br />
FRAMETYPE hold<br />
ARM XC YUp<strong>per</strong>P ZMiddle<br />
HAND symbol_1_open<br />
FINGER index bend_curved<br />
WRIST FBUp PalmInwards<br />
ENDFRAME<br />
Il gesto dura 1.5 secondi e si compone di tre fotogrammi base. Il primo inizia al<br />
tempo 0 con la mano leggermente più in alto della spalla, vicina al corpo e con la<br />
64
Capitolo IV, Il sistema <strong>dei</strong> <strong>gesti</strong><br />
forma symbol_1_open. Il secondo fotogramma avviene al 40% del tempo totale<br />
del gesto, corrisponde alla fase di stroke e differisce dal primo <strong>per</strong> un piccolo mo-<br />
vimento della mano in avanti. Il terzo fotogramma serve solo a mantenere la stessa<br />
configurazione del secondo fino alla fine del gesto.<br />
65
Capitolo V, Motore gestuale<br />
V<br />
Motore gestuale<br />
V.1 Pianificazione <strong>dei</strong> <strong>gesti</strong> <strong>comunicativi</strong><br />
Una parte del lavoro svolto in questa tesi, come abbiamo anticipato nel capitolo IV,<br />
è consistita nel realizzare il modulo di pianificazione <strong>dei</strong> <strong>gesti</strong> <strong>comunicativi</strong> <strong>per</strong> il<br />
motore gestuale dell’agente Greta.<br />
Il pianificatore <strong>dei</strong> <strong>gesti</strong> è l’elemento del motore che si occupa di:<br />
1. decidere quali <strong>gesti</strong> l’agente deve effettuare<br />
2. fornire la loro temporizzazione<br />
Questi due compiti sono molto importanti <strong>per</strong>ché determinano il corretto svolgi-<br />
mento della comunicazione non verbale attraverso il canale della gestualità (capitolo<br />
I).<br />
Iniziamo a spiegare come è stato progettato il pianificatore considerando un esem-<br />
pio di file di input e andando a guardare com’è l’output prodotto dal sistema. Di se-<br />
66
Capitolo V, Motore gestuale<br />
guito spiegheremo l’architettura completa del pianificatore e l’insieme di regole che<br />
determinano la scelta <strong>dei</strong> <strong>gesti</strong> da compiere.<br />
V.2 Un esempio<br />
Ritorniamo nella situazione descritta nel capitolo III. L’agente Greta ha il compito<br />
di dare all’utente delle informazioni relative al suo stato di salute.<br />
In un certo istante di tempo supponiamo che il modulo mente dell’agente abbia ela-<br />
borato la seguente informazione codificata in APML (il testo di quello che verrà<br />
pronunciato è in grassetto):<br />
<br />
Buongiorno<br />
Signor Smith.<br />
<br />
<br />
<br />
<br />
Mi dispiace doverla informare<br />
che abbiamo diagnosticato<br />
<br />
che leisoffre<br />
di unaleggera<br />
forma<br />
di quella che è chiamata<br />
angina<br />
pectoris.<br />
<br />
<br />
<br />
Per risolvere<br />
questo problema,<br />
<br />
ci sarebbero due<br />
medicine che vorrei che lei prendesse.<br />
<br />
<br />
Laprima<br />
<br />
è l’Aspirina<br />
<br />
<br />
che<br />
serve ad alleviare<br />
ildolore.<br />
<br />
67
Capitolo V, Motore gestuale<br />
<br />
Sottoponiamo questo file al motore gestuale dell’agente Greta e prendiamo in esame<br />
l’animazione risultante:<br />
1) inizio del turno di conversazione<br />
2) gesto di saluto in corrispondenza dell’enfasi che si trova sulla parola giorno.<br />
3) gesto fatto con la mano destra con i polpastrelli di indice e pollice molto vicini e<br />
le altre dita leggermente a<strong>per</strong>te in corrispondenza<br />
dell’enfasi sulla parola leggera (figura 1). Il gesto inoltre si<br />
prolunga con una piccola oscillazione anche sull’enfasi<br />
della parola forma.<br />
4) gesto beat (capitolo I) sull’enfasi della parola angina. Vi-<br />
sto che la mano destra era stata appena utilizzata <strong>per</strong> il ge-<br />
sto precedente e che temporalmente i due <strong>gesti</strong> sono mol-<br />
to ravvicinati, anche questo gesto verrà effettuato dalla<br />
mano destra prima di ritornare nella posizione di riposo (coarticolazione, vedere<br />
sezione I.2.2).<br />
5) gesto che rappresenta il numero 2 in corrispondenza della parola due.<br />
6) gesto che rappresenta il numero 1 in corrispondenza della parola prima. Sicco-<br />
me sta iniziando un elenco di alcuni punti importanti <strong>per</strong> lo scopo della conver-<br />
sazione, questo gesto si prolungherà <strong>per</strong> tutta la spiegazione collegata<br />
all’elemento dell’elenco (in questo caso fino alla parola dolore).<br />
7) gesto fatto con la mano a<strong>per</strong>ta rivolta col palmo in basso, muovendo il braccio<br />
orizzontalmente partendo da davanti al corpo e arrivando lateralmente in corri-<br />
spondenza dell’enfasi sulla parola alleviare. Ricordiamo che il gesto precedente<br />
è ancora in corso e quindi il gesto attuale verrà effettuato con la mano ancora li-<br />
bera.<br />
8) fine del turno di conversazione<br />
68<br />
Figura 1
Capitolo V, Motore gestuale<br />
Innanzitutto notiamo che l’informazione del turno di conversazione è raggruppata<br />
gerarchicamente ed è schematizzabile con una struttura ad albero (da sinistra a de-<br />
stra):<br />
Al primo livello della gerarchia ci sono sempre <strong>dei</strong> blocchi di tipo <strong>per</strong>formativo che<br />
abbiamo indicato con le lettere dalla a alla d. Inoltre notiamo che ogni <strong>per</strong>formativo<br />
corrisponde esattamente a una frase intera della conversazione.<br />
69
Capitolo V, Motore gestuale<br />
Mettiamo in evidenza la relazione che c’è tra quello che è accaduto nell’esempio ap-<br />
pena visto e la struttura del file APML che avevamo mandato in input, prendendo<br />
in esame separatamente i vari blocchi <strong>per</strong>formativi:<br />
• a - <strong>per</strong>formativo greet: nell’esempio corrisponde al gesto di saluto e infatti la tipo-<br />
logia indicata nel tag APML è “greet” che in inglese significa appunto “salutare”.<br />
Il gesto avveniva sulla parola giorno che si trova nel sottoalbero associato al <strong>per</strong>-<br />
formativo a e è racchiusa da un tag di tipo “emphasis”.<br />
E’ quindi come se l’enfasi indicasse il punto del discorso in cui emerge mag-<br />
giormente lo scopo della frase, e il gesto ad esso associato dipende dalla natura<br />
del contenuto <strong>per</strong>formativo della frase (in questo caso il <strong>per</strong>fomativo era di tipo<br />
greet e infatti sull’enfasi è avvenuto un saluto).<br />
• b - <strong>per</strong>formativo inform: innanzitutto notiamo che nell’esempio non avveniva<br />
nessun gesto in corrispondenza della parola informare. Questo è corretto, infatti<br />
pur essendo in presenza di un’enfasi l’informazione è di tipo tematico e quindi in<br />
generale non va accompagnata da gestualità [8] come abbiamo osservato nel ca-<br />
pitolo I.<br />
Possiamo quindi concludere che al fine di riprodurre correttamente i <strong>gesti</strong> di una<br />
<strong>per</strong>sona, l’informazione tematica può essere in generale ignorata mentre va sem-<br />
pre considerata quella rematica.<br />
Come ulteriore conferma osserviamo che nell’esempio i <strong>gesti</strong> di questo <strong>per</strong>for-<br />
mativo sono sulle parole leggera forma e angina, tutte contenute nel sottoalbe-<br />
ro di un tag di tipo rheme.<br />
Questo tag contiene <strong>per</strong>ò altre enfasi (diagnosticato, soffre) che non hanno da-<br />
to luogo a nessun gesto. L’enfasi su leggera prevale sulle altre <strong>per</strong>ché è riferita<br />
ad un aggettivo (“adjectival=small”). In più la parola seguente è il nome (forma)<br />
a cui l’aggettivo si riferisce provocando una ripetizione del gesto.<br />
La parola angina invece viene sottolineata da un gesto <strong>per</strong>ché il tag enfasi in cui<br />
70
Capitolo V, Motore gestuale<br />
è racchiusa ha un parametro in più (level=”strong”) che ne aumenta la priorità<br />
rispetto alle altre.<br />
• c - <strong>per</strong>formativo suggest: l’unico gesto presente è il numero 2 fatto con una mano<br />
in corrispondenza della parola due. In accordo con quanto precedentemente<br />
stabilito, il gesto avviene all’interno di un tag che indica un contenuto informati-<br />
vo di tipo rematico. Nell’albero sotto questo tag inoltre è presente una sola enfa-<br />
si che è di tipo adjectival=two.<br />
• d - <strong>per</strong>formativo inform: la sequenza di <strong>gesti</strong> in questo caso è leggermente più<br />
complicata. Viene riprodotto con una mano il numero 1 e mentre questo gesto<br />
viene mantenuto <strong>per</strong> tutta la durata della frase (quindi durante tutto il <strong>per</strong>forma-<br />
tivo) l’altra mano fa un gesto <strong>per</strong> sottolineare la parola alleviare. Possiamo nota-<br />
re ancora una volta che la gestualità accompagna il contenuto rematico della fra-<br />
se. Il primo gesto, che avviene in corrispondenza della parola prima, è di tipo<br />
meta-discorsivo (belief-relation) e <strong>per</strong> questo viene mantenuto fino alla fine della<br />
frase (in accordo con l’analisi <strong>dei</strong> <strong>gesti</strong> spiegata alla fine del capitolo I). Sulla pa-<br />
rola alleviare è invece presente una normale enfasi.<br />
Ci accorgiamo infine della presenza di un’enfasi rematica (su l’Aspirina) che<br />
non ha dato luogo a nessun gesto <strong>per</strong>ché nella frase esistevano altre due enfasi<br />
che avevano una priorità maggiore e l’inserimento di un terzo gesto avrebbe<br />
provocato un “sovraccarico” della comunicazione.<br />
Presentiamo adesso le regole che abbiamo impiegato nell’implementazione del pia-<br />
nificatore <strong>dei</strong> <strong>gesti</strong>, e che in parte abbiamo anticipato descrivendo questo esempio.<br />
V.3 Implementazione<br />
Vediamo prima l’architettura del pianificatore (figura 2) <strong>dei</strong> <strong>gesti</strong> e descriviamo bre-<br />
vemente il suo funzionamento.<br />
• Per prima cosa il pianificatore riceve in input un file proveniente dal parser<br />
APML (capitolo IV) e contenente i tempi di inizio e durata <strong>dei</strong> tag incontrati du-<br />
71
Capitolo V, Motore gestuale<br />
rante la scansione del file AMPL. Il file delle temporizzazioni corrispondente<br />
all’esempio del paragrafo precedente è:<br />
<strong>per</strong>formative=greet;0;1.577;<br />
rheme;emphasis=Hstar;0.5265;0.4091;<br />
<strong>per</strong>formative=inform;1.577;7.7451;<br />
theme;affect=sorry-for;1.577;2.1289;<br />
theme;belief-relation=gen-spec;1.577;2.1289;<br />
theme;emphasis=LplusHstar;3.1317;0.5742;<br />
rheme;emphasis=Hstar;4.2583;0.8704;<br />
rheme;emphasis=Hstar;5.5049;0.4431;<br />
rheme;emphasis=Hstar;6.2823;0.4379;<br />
rheme;adjectival=small;6.2823;0.4379;<br />
rheme;emphasis=Hstar;6.7202;0.4237;<br />
rheme;emphasis=Hstar;8.3448;0.4052;<br />
rheme;level=strong;8.3448;0.4052;<br />
rheme;emphasis=Hstar;8.75;0.5721;<br />
rheme;level=strong;8.75;0.5721;<br />
<strong>per</strong>formative=suggest;9.3221;5.234;<br />
theme;belief-relation=solutionhood;9.3221;1.957;<br />
theme;emphasis=LplusHstar;9.8803;0.5284;<br />
rheme;belief-relation=sug<strong>gesti</strong>on;11.2791;3.277;<br />
rheme;emphasis=Hstar;12.2787;0.2533;<br />
rheme;adjectival=two;12.2787;0.2533;<br />
<strong>per</strong>formative=inform;14.5561;3.6882;<br />
rheme;belief-relation=first;14.5561;1.0617;<br />
rheme;emphasis=LplusHstar;15.0722;0.3336;<br />
rheme;emphasis=Hstar;15.684;0.5451;<br />
theme;affect=relief;16.2291;0.1546;<br />
theme;belief-relation=gen-spec;16.2291;0.1546;<br />
rheme;emphasis=Hstar;16.8849;0.4885;<br />
rheme;emphasis=Hstar;17.467;0.7773;<br />
• Successivamente entra in azione un piccolo parser che legge i<br />
dati contenuti nel file delle temporizzazioni e costruisce un al-<br />
bero in cui ogni nodo ha la seguente struttura:<br />
GestureTree:<br />
GestureTree* FirstSon; //punta al primo nodo fi<strong>gli</strong>o<br />
GestureTree* Parent; //punta al nodo padre<br />
GestureTree* NextBrother;//punta al successivo nodo fratello<br />
char Type[20]; //vale “theme” o “rheme”<br />
char Description[250]; //descrizione, ad esempio “ADJECTIVAL=SMALL”<br />
double StartTime,EndTime;//tempo esatto di inizio e fine pronuncia<br />
//delle parole contenute nel tag<br />
bool Requested; //flag che indica se è già stato assegnato un<br />
//gesto a questo tag; inizializzato sempre a<br />
//false<br />
Nell’albero quindi ogni nodo padre può avere un numero arbitrario di fi<strong>gli</strong> che<br />
sono <strong>gesti</strong>ti come lista. Un nodo fo<strong>gli</strong>a si può riconoscere dal fatto che il punta-<br />
tore FirstSon vale NULL.<br />
72<br />
Figura 2
Capitolo V, Motore gestuale<br />
• A questo punto, lavorando sulla struttura ad albero che abbiamo appena defini-<br />
to, il selettore <strong>dei</strong> <strong>gesti</strong> decide finalmente quali sono i <strong>gesti</strong> che vanno riprodotti e<br />
assegna loro la corretta temporizzazione. I criteri in base ai quali effettua queste<br />
scelte verranno esposti nel prossimo paragrafo.<br />
V.4 Selettore <strong>dei</strong> <strong>gesti</strong><br />
Ricapitoliamo tutto quello che è stato detto finora riguardo la gestualità in generale.<br />
Nel paragrafo finale del capitolo I abbiamo dato una classificazione <strong>dei</strong> <strong>gesti</strong> ottenu-<br />
ta dallo studio di situazioni reali svolto da Isabella Poggi.<br />
Ci siamo quindi proposti come obbiettivo quello di riprodurre quel tipo di <strong>gesti</strong> con<br />
il nostro agente conversazionale Greta.<br />
Presentiamo ora l’insieme finale di regole che abbiamo stabilito nella fase di imple-<br />
mentazione del modulo di pianificazione <strong>dei</strong> <strong>gesti</strong> dell’agente Greta.<br />
1. <strong>per</strong> ogni tag adjectival o <strong>dei</strong>ctic, se nel gestuario esiste il gesto corrispon-<br />
dente allora riproducilo sull’enfasi del tag ed eventualmente aggiungi delle ri-<br />
petizioni del gesto sulle enfasi successive se queste sono consecutive nel<br />
tempo;<br />
2. (da applicare solo se la regola 1 non ha dato luogo a nessun gesto) <strong>per</strong> ogni<br />
tag belief-relation, se nel gestuario esiste un gesto corrispondente allora ri-<br />
producilo facendolo iniziare sull’enfasi del tag e facendolo terminare alla fine<br />
del tag <strong>per</strong>formativo dal quale discende il belief-relation; <strong>per</strong> ogni tag affect<br />
se nel gestuario esiste il gesto corrispondente allora riproducilo sull’enfasi del<br />
tag;<br />
3. (da applicare solo se né la regola 1, né la regola 1 hanno dato luogo a nessun<br />
gesto) <strong>per</strong> ogni tag <strong>per</strong>formativo, se nel gestuario esiste il gesto corrispon-<br />
dente allora riproducilo sull’enfasi del tag, altrimenti riproduci un gesto beat<br />
sull’enfasi del tag;<br />
73
Capitolo V, Motore gestuale<br />
Ecco allora l’algoritmo in pseudo-codice che codifica queste regole. Ricordiamo che<br />
la struttura dati su cui l’algoritmo lavora è quella dell’albero di tag descritto nel para-<br />
grafo precedente (e in cui sono memorizzate anche le temporizzazioni di ogni tag):<br />
Input: puntatore alla radice dell’albero<br />
for(ogni nodo s fi<strong>gli</strong>o della radice):<br />
cercare nel sottoalbero che si dirama da s <strong>per</strong>:<br />
− nodi con enfasi ADJECTIVAL;<br />
− nodi con enfasi DEICTIC;<br />
if(trovato==true):<br />
effettuare il relativo gesto ottenendo le temporizzazioni<br />
dai dati del nodo enfasi;<br />
if(esistono <strong>dei</strong> nodi fratelli temporalmente consecutivi):<br />
effettuare una ripetizione del gesto su ciascuno di loro;<br />
if(è stato effettuato almeno un gesto)<br />
uscire e passare alla prossima iterazione;<br />
cercare nel sottoalbero che si dirama da s <strong>per</strong>:<br />
− nodi BELIEF-RELATION;<br />
− nodi AFFECT;<br />
if(trovato==true):<br />
if(BELIEF-RELATION):<br />
cercare il primo nodo enfasi contenuto nel sottoalbero che<br />
si dirama da questo BELIEF-RELATION e poi effettuare il<br />
relativo gesto ottenendo il tempo di inizio dal nodo<br />
enfasi e prolungando il gesto fino al tempo di fine<br />
del <strong>per</strong>formativo s;<br />
if(AFFECT):<br />
cercare il primo nodo enfasi contenuto nel sottoalbero che<br />
si dirama da questo AFFECT e poi effettuare il relativo gesto<br />
ottenendo le temporizzazioni dai dati del nodo enfasi;<br />
if(è stato effettuato almeno un gesto)<br />
uscire e passare alla prossima iterazione;<br />
cercare nel sottoalbero che si dirama da s <strong>per</strong>:<br />
if(trovato==true):<br />
− la prima enfasi;<br />
74
Capitolo V, Motore gestuale<br />
if(esiste un gesto associato al tipo di <strong>per</strong>formativo di s)<br />
else:<br />
effettuare il <strong>per</strong>formativo in base alle temporizzazioni<br />
del nodo enfasi;<br />
effettuare un gesto di tipo BEAT con le temporizzazioni<br />
del nodo enfasi;<br />
passare alla successiva iterazione;<br />
V.5 Gesti <strong>dei</strong>ttici <strong>per</strong> l’agente Greta<br />
I <strong>gesti</strong> <strong>dei</strong>ttici servono ad indicare un punto nello spazio mentre stiamo parlando.<br />
L’entità a cui fanno riferimento può essere fisicamente presente nell’ambiente in cui<br />
ci troviamo oppure può essere astratta. Un esempio di questo tipo consiste<br />
nell’indicare verso il basso mentre con la parola “..questo..” si sta facendo riferimen-<br />
to all’oggetto della conversazione.<br />
Nel motore originario l’agente Greta non era capace di effettuare questo tipo di ge-<br />
sto. Questa limitazione era dovuta al tipo di implementazione del movimento <strong>per</strong> la<br />
<strong>sintesi</strong> <strong>dei</strong> <strong>gesti</strong>.<br />
Nell’ultimo paragrafo del capitolo IV abbiamo visto che lo spazio intorno all’agente<br />
è stato discretizzato suddividendolo in varie regioni. Questa scelta non è stata casua-<br />
le. Infatti [34] è stato dimostrato statisticamente che i <strong>gesti</strong> avvengono sempre in<br />
prossimità di alcune punti ben precisi dello spazio e quindi <strong>per</strong>mettere di posiziona-<br />
re le braccia in modo del tutto libero non ha poi un’utilità pratica vera e propria.<br />
In più questa scelta ha reso più semplice (sotto alcuni punti di vista che ora vedre-<br />
mo) l’implementazione del motore limitandone <strong>per</strong>ò <strong>per</strong> altri aspetti l’utilizzo.<br />
V.6 Cinematica diretta e inversa<br />
Consideriamo il sistema fisico braccio-avambraccio di una <strong>per</strong>sona. Il punto dello<br />
spazio in cui si trova il polso è in ogni momento funzione delle lunghezze di braccio<br />
75
Capitolo V, Motore gestuale<br />
e avambraccio e dell’angolazione del braccio rispetto al corpo e dell’avambraccio ri-<br />
spetto al braccio. Vediamo un esempio in 2D:<br />
Le coordinate del punto finale sono naturalmente:<br />
x<br />
y<br />
f<br />
f<br />
= x<br />
0<br />
= y<br />
0<br />
+ a ⋅cosσ<br />
+ b ⋅cosθ<br />
+ a ⋅senσ<br />
+ b ⋅senθ<br />
Questo semplice ragionamento si può facilmente estendere a una catena molto più<br />
lunga <strong>dei</strong> due soli elementi del sistema braccio-avambraccio e considerando coordi-<br />
nate a tre dimensioni. Il problema di determinare la posizione finale dell’estremità<br />
dell’ultimo elemento della catena in funzione de<strong>gli</strong> angoli di rotazione di tutti <strong>gli</strong> altri<br />
elementi viene chiamato cinematica diretta.<br />
Nella cinematica inversa invece il problema è l’esatto contrario: data la posizione nello<br />
spazio dell’estremità dell’elemento finale della catena (target) determinare <strong>gli</strong> angoli di<br />
rotazione di tutti <strong>gli</strong> elementi della catena.<br />
Si può facilmente intuire che questo tipo di calcolo è abbastanza complicato e che<br />
inoltre se esiste una soluzione al problema non è detto che sia unica.<br />
Torniamo al sistema braccio-avambraccio in 2 dimensioni:<br />
(a)<br />
(b) (c) (d)<br />
76
Capitolo V, Motore gestuale<br />
(a) il problema non ammette soluzione<br />
(b) il problema ha un’unica soluzione (caso banale)<br />
(c) il problema ha esattamente due soluzioni<br />
(d) il problema ha infinite soluzioni<br />
Vediamo una delle tecniche che si possono impiegare <strong>per</strong> risolvere il problema.<br />
Consideriamo prima il caso di una sola giunzione:<br />
Costruiamo il vettore F che congiunge l’estremità della giunzione con il target. Sia R<br />
il vettore <strong>per</strong>pendicolare alla giunzione. La velocità di rotazione della giunzione è<br />
proporzionale al prodotto scalare tra F e R:<br />
rotazione=(F⋅R)*k<br />
Se le giunture sono 2 (<strong>per</strong> esempio braccio-avambraccio):<br />
In questo caso basterà iterare all’infinito il seguente algoritmo:<br />
<strong>per</strong> ogni componente i della catena:<br />
− calcolare il vettore F i tra l’estremità della componente e il punto tar-<br />
get;<br />
− calcolare il prodotto (F i⋅ R i)*k e applicare il risultato all’angolo di ro-<br />
tazione della componente<br />
Spostandoci al caso in 3 dimensioni il problema si può risolvere con un tipo di algo-<br />
ritmo analogo.<br />
77
Capitolo V, Motore gestuale<br />
Figura 3. Cinematica inversa <strong>per</strong> un sistema complesso costituito da più catene (Maya)<br />
Abbiamo detto che in generale possiamo aspettarci che il numero di configurazioni<br />
della catena che sono soluzione del problema sia infinito. Nel caso del sistema brac-<br />
cio-avambraccio, si possono impiegare strategie particolari <strong>per</strong> selezionare<br />
dall’insieme di tutte le soluzioni quelle che possono essere considerate effettivamen-<br />
te ammissibili.<br />
Dato il punto target infatti, essendo presenti due sole giunzioni, se esiste una solu-<br />
zione che non sia quella banale allora esistono infinite soluzioni che differiscono tra<br />
loro <strong>per</strong> il piano sul quale giace il sistema:<br />
78
Capitolo V, Motore gestuale<br />
In figura possiamo vedere il sistema braccio-avambraccio posizionato in modo da<br />
raggiungere un certo punto di target. E’ chiaro che questa è solo una delle infinite<br />
soluzioni ammissibili, che <strong>per</strong>ò differiscono tra loro semplicemente <strong>per</strong> il valore<br />
dell’angolo σ.<br />
Il problema generale della cinematica inversa nel caso di due giunzioni diventa<br />
quindi risolvibile in modo univoco vincolando il valore dell’angolo σ.<br />
Torniamo al motore dell’agente Greta. Nell’implementazione originaria le configu-<br />
razioni delle braccia durante i <strong>gesti</strong> venivano calcolate esclusivamente con tecniche<br />
di cinematica diretta. Questo <strong>per</strong>ché basandosi su una suddivisione discreta dello<br />
spazio era stato possibile memorizzare preventivamente le rotazioni da applicare a<br />
spalla e gomito <strong>per</strong> fare in modo che la mano raggiungesse ognuna delle regioni del-<br />
lo spazio.<br />
Per questo i <strong>gesti</strong> <strong>dei</strong>ttici erano di fatto irrealizzabili: non era possibile chiedere<br />
all’agente di indicare un punto nello spazio, o<strong>per</strong>azione che alla luce di quello che<br />
abbiamo spiegato in questo paragrafo è tipica della cinematica inversa.<br />
V.7 Cinematica inversa: IKAN<br />
Nel lavoro svolto in questa tesi abbiamo introdotto nel motore dell’agente Greta un<br />
nuovo oggetto capace di risolvere problemi di cinematica inversa.<br />
Per fare questo abbiamo implementato un tool del tutto indipendente dal motore<br />
che impiega una libreria matematica sviluppata dal Center of Human Modeling and<br />
Simulation dell’Università della Pennsylvania chiamata IKAN (Inverse Kinematics<br />
using ANalytical Methods).<br />
79
Capitolo V, Motore gestuale<br />
Figura 4. Jack, un agente sviluppato usando IKAN<br />
IKAN è specializzata nella risoluzione di problemi di cinematica inversa <strong>per</strong> <strong>gli</strong> arti<br />
umani (braccia, gambe).<br />
L’oggetto principale della libreria è l’SRS.<br />
Date le matrici G, S, T l’oggetto SRS risolve l’equazione:<br />
G=R 2 * S * R y * T * R 1<br />
dove:<br />
R 2 e R 1 sono le matrici di rotazione rispettivamente di polso e spalla<br />
R y è la matrice di rotazione del gomito<br />
S è la matrice di traslazione tra polso e gomito<br />
T è la matrice di traslazione tra gomito e spalla<br />
Il tool che abbiamo sviluppato <strong>per</strong>mette di spostare liberamente nello spazio una<br />
sfera e in tempo reale il braccio destro dell’agente viene rivolto nella direzione della<br />
sfera in modo corretto, evitando cioè configurazioni impossibili <strong>per</strong> il braccio di un<br />
essere umano.<br />
80
Capitolo V, Motore gestuale<br />
Figura 5. Il tool sviluppato <strong>per</strong> il calcolo della cinematica inversa<br />
A questo punto non è rimasto altro da fare che includere nel motore la parte di co-<br />
dice del tool che effettuava il calcolo della cinematica inversa:<br />
1. settare S e T con le dimensioni di braccio e avambraccio;<br />
2. istanziare un oggetto di classe SRS:<br />
SRS(&T, &S, a, p);<br />
dove a è un vettore parallelo all’avambraccio e p è parallelo al vetto-<br />
re intorno a cui ruota il gomito;<br />
3. settare la matrice G con le coordinate del punto che l’agente deve<br />
indicare (target);<br />
4. eseguire il metodo SRS::SetGoal(&G);<br />
5. eseguire il metodo SRS:SolveR1(&R1) che calcola la matrice di rota-<br />
zione della spalla;<br />
6. convertire la matrice di rotazione in una terna di singole rotazioni ri-<br />
spetto a<strong>gli</strong> assi coordinati (rappresentazione euleriana) che è quella<br />
utilizzata nel motore;<br />
81
Capitolo V, Motore gestuale<br />
V.8 Dinamica <strong>dei</strong> <strong>gesti</strong> e posizioni di riposo multiple<br />
Non appena il motore ha assunto la forma finale che abbiamo specificato nel para-<br />
grafo IV.5, abbiamo rivolto la nostra attenzione alla qualità della riproduzione <strong>dei</strong><br />
<strong>gesti</strong> da parte dell’agente Greta.<br />
Anche se il pianificatore <strong>dei</strong> <strong>gesti</strong> svolgeva molto bene il compito di fornire una<br />
temporizzazione gestuale basata sulle parole che venivano pronunciate, il risultato<br />
finale era una sequenza animata in cui i <strong>gesti</strong> avvenivano nei momenti giusti ma le<br />
braccia si muovevano in modo troppo lento e morbido da un gesto all’altro.<br />
Parte del lavoro svolto in questa tesi è consistito allora nell’apportare delle modifi-<br />
che al concretizzatore <strong>dei</strong> <strong>gesti</strong> (vedi IV.4.1) in modo da indurre una dinamica <strong>dei</strong><br />
<strong>gesti</strong> molto più realistica.<br />
Supponiamo che, ad esempio, dopo la fase di pianificazione siano stati decisi i se-<br />
guenti 3 <strong>gesti</strong>:<br />
A questo punto nella versione originaria il concretizzatore avrebbe effettuato una<br />
serie di confronti:<br />
• <strong>per</strong> ogni (i=2; iso<strong>gli</strong>a) allora inserire tra t i-1 e t i un gesto di<br />
riposo al tempo t’= t i-1+(t i- t i-1)/2;<br />
Supponendo che nell’esempio solo t 2 e t 3 distino un numero di secondi maggiore<br />
della so<strong>gli</strong>a fissata questo sarebbe stato il risultato:<br />
82
Capitolo V, Motore gestuale<br />
Innanzitutto il valore della so<strong>gli</strong>a era troppo grande. E comunque anche riducendola<br />
molto in modo da provocare l’inserimento di un gesto di riposo tra ogni coppia di<br />
<strong>gesti</strong> presenti il risultato era che i <strong>gesti</strong> di riposo avvenivano sempre a metà tra il ge-<br />
sto precedente e quello successivo e questo nel caso di <strong>gesti</strong> abbastanza distanti (dai<br />
3 secondi circa in su) dava luogo ai lunghi e lenti spostamenti delle braccia a cui ab-<br />
biamo accennato all’inizio del paragrafo.<br />
E’ stato sufficiente allora cambiare questa strategia <strong>per</strong> ottenere un primo mi<strong>gli</strong>ora-<br />
mento dell’animazione. Tornando all’esempio:<br />
• <strong>per</strong> ogni (i=2; iso<strong>gli</strong>a) allora inserire tra t i-1 e t i due <strong>gesti</strong> di<br />
riposo al tempo t’= t i-1+0.5 e al tempo t’’= t i-0.5;<br />
Supponendo che la so<strong>gli</strong>a sia stata diminuita di valore in modo da essere su<strong>per</strong>ata<br />
anche dalla distanza tra t 1 e t 2, l’elaborazione del concretizzatore dà luogo alla se-<br />
quenza di <strong>gesti</strong>:<br />
Dopo queste modifiche i movementi dell’agente erano molto più realistici <strong>per</strong>ché<br />
effettuava i vari <strong>gesti</strong> con una dinamica simile a quella de<strong>gli</strong> esseri umani.<br />
83
Capitolo V, Motore gestuale<br />
Il passo successivo nell’ottimizzazione del funzionamento del concretizzatore è sta-<br />
to quello di introdurre le posizioni di rest multiple.<br />
Una <strong>per</strong>sona mentre parla non torna sempre nella stessa posizione di partenza tra<br />
un gesto e l’altro. Soprattutto se tra due <strong>gesti</strong> non trascorre un tempo molto elevato<br />
le mani raggiungono una posizione di riposo in prossimità della zona dello spazio<br />
nella quale avverrà il gesto successivo.<br />
Partendo da quest’idea abbiamo ulteriormente modificato il concretizzatore intro-<br />
ducendo due valori so<strong>gli</strong>a1so<strong>gli</strong>a1) allora inserire tra t i-1 e t i due<br />
<strong>gesti</strong> di tipo riposo1 al tempo t’= t i-1+0.5 e al tem-<br />
po t’’= t i-0.5;<br />
84
Capitolo VI, Tools di supporto<br />
VI.1 La dipendenza da Maya<br />
VI<br />
Tools di supporto<br />
Nel capitolo IV, descrivendo il lavoro svolto in questa tesi, abbiamo detto che uno<br />
de<strong>gli</strong> obbiettivi raggiunti è stato quello di rendere il sistema del tutto indipendente<br />
dal software Maya della Alias/Wavefront.<br />
Maya è un programma molto completo <strong>per</strong> il rendering di scene 3D realistiche e viene<br />
impiegato in numerosi campi e in particolare in quello de<strong>gli</strong> ef-<br />
fetti speciali <strong>per</strong> il cinema.<br />
Una delle sue caratteristiche principali è quella di incorporare<br />
un linguaggio ad alto livello chiamato MEL <strong>per</strong> la realizzazione<br />
di script che <strong>per</strong>mettono quindi al sistema di interfacciarsi con<br />
applicazioni esterne.<br />
Grazie a questa funzionalità inizialmente Maya è stato utilizzato<br />
come player <strong>per</strong> le animazioni BAP, <strong>per</strong> verificare i risultati<br />
dell’elaborazione del motore (figura 1).<br />
85<br />
Figura 1. L'agente<br />
Greta sotto Maya
Capitolo VI, Tools di supporto<br />
Nei capitoli precedenti (paragrafo IV.6 in particolare) abbiamo spesso parlato del<br />
fatto che i <strong>gesti</strong> vengono definiti come una successione di fotogrammi chiave, cia-<br />
scuno <strong>dei</strong> quali viene descritto qualitativamente come una sovrapposizione delle<br />
configurazioni di braccio, polso, dita della mano. Ad esempio un fotogramma chia-<br />
ve potrebbe essere definito come:<br />
“braccio proteso in avanti”+”mano chiusa col solo indice a<strong>per</strong>to”+”palmo vero il basso e dita in avanti”<br />
Questa descrizione è qualitativa e <strong>per</strong>mette quindi di codificare abbastanza facil-<br />
mente molti tipi di gesto evitando di agire manualmente sulle rotazioni del modello<br />
(che sarebbe un processo molto lungo e complicato).<br />
Il motore riesce a generare i fotogrammi chiave di un gesto effettuando delle o<strong>per</strong>a-<br />
zioni di composizione tra le diverse pose base corrispondenti alla descrizione del fo-<br />
togramma.<br />
Una posa è in generale un qualsiasi elenco di elementi (giuntura, rotazione) dove una<br />
giuntura è il punto di congiungimento di due o più ossa dello scheletro dell’agente..<br />
Esistono quindi pose <strong>per</strong> le braccia, <strong>per</strong> le mani, <strong>per</strong> le dita, o addirittura <strong>per</strong> tutto il<br />
corpo. L’impiego di Maya era inizialmente fondamentale anche <strong>per</strong> la definizione di<br />
queste pose base <strong>dei</strong> <strong>gesti</strong> che venivano poi esportate sempre grazie a MEL.<br />
Per tutti i motivi fin qui esposti e soprattutto <strong>per</strong> non obbligare <strong>gli</strong> sviluppatori ad<br />
acquistare una copia di un programma commerciale che inoltre ha funzionalità mol-<br />
to più estese di quelle che poi effettivamente vengono utilizzate col motore, abbia-<br />
mo deciso di:<br />
1. implementare un BAP player<br />
2. implementare un tool <strong>per</strong> la definizione di pose<br />
Nell’ultimo paragrafo di questo capitolo prendiamo invece in esame un altro tool<br />
molto utile, l’editor <strong>dei</strong> <strong>gesti</strong> che abbiamo implementato <strong>per</strong> automatizzare la ste-<br />
86
Capitolo VI, Tools di supporto<br />
sura <strong>dei</strong> file di definizione <strong>dei</strong> <strong>gesti</strong> (vedere IV.6). L’idea di scrivere questo tool è na-<br />
ta da necessità puramente pratiche.<br />
Il gestuario del motore originario infatti andava “popolato” di <strong>gesti</strong> e durante il la-<br />
voro di scrittura <strong>dei</strong> relativi file di definizione ci siamo accorti del fatto che il lin-<br />
guaggio di specifica <strong>dei</strong> <strong>gesti</strong> non è molto mnemonico mentre sarebbe stato molto<br />
più intuitivo poter combinare graficamente le varie componenti del gesto. Inoltre<br />
era abbastanza probabile commettere errori di battitura o sulle temporizzazioni <strong>dei</strong><br />
fotogrammi chiave.<br />
VI.2 Editor delle pose<br />
Il motore gestuale dell’agente Greta ottiene i dati <strong>dei</strong> movimenti da effettuare <strong>per</strong><br />
riprodurre <strong>gesti</strong> da quelle che abbiamo definito nel paragrafo precedente con il ter-<br />
mine pose base.<br />
Una posa è una sequenza di coppie (g,r) ciascuna delle quali informa il motore sulla<br />
quantità di rotazione r da applicare alla giuntura g dello scheletro dell’agente.<br />
Schematicamente ecco quello che succede:<br />
Figura 2. I file delle pose<br />
87
Capitolo VI, Tools di supporto<br />
Il motore chiede al gestuario il file di definizione di un gesto. Scandendo il file, <strong>per</strong><br />
ogni fotogramma base del gesto vengono fatti de<strong>gli</strong> accessi a uno o più file di posa.<br />
Ad esempio, se in un fotogramma base di un certo gesto una delle mani fosse stata<br />
definita a forma di “pugno chiuso” allora il motore avrebbe effettuato un accesso al<br />
file form_fist.txt contenente le seguenti informazioni (la rotazione di ogni<br />
giuntura è espressa da tre singole rotazioni intorno a<strong>gli</strong> assi x, y e z):<br />
r_wrist 0.000000 0.000000 0.000000<br />
r_thumb1 12.000000 17.000000 27.000000<br />
r_thumb2 55.000000 0.000000 0.000000<br />
r_thumb3 27.000000 0.000000 0.000000<br />
r_index0 0.000000 0.000000 0.000000<br />
r_index1 5.000000 7.000000 84.000000<br />
r_index2 0.000000 0.000000 72.000000<br />
r_index3 0.000000 0.000000 62.000000<br />
r_middle0 0.000000 0.000000 0.000000<br />
r_middle1 2.000000 0.000000 80.000000<br />
r_middle2 0.000000 0.000000 69.000000<br />
r_middle3 0.000000 0.000000 50.000000<br />
r_ring0 0.000000 0.000000 0.000000<br />
r_ring1 0.000000 0.000000 75.000000<br />
r_ring2 0.000000 0.000000 62.000000<br />
r_ring3 0.000000 0.000000 52.000000<br />
r_pinky0 0.000000 0.000000 0.000000<br />
r_pinky1 0.000000 0.000000 68.000000<br />
r_pinky2 0.000000 0.000000 69.000000<br />
r_pinky3 0.000000 0.000000 27.000000<br />
Applicando queste rotazioni alle relative giunture (wrist=polso, thumb=pollice, in-<br />
dex=indice, middle=medio, ring=anulare, pinky=mignolo) ecco il risultato sul cor-<br />
po dell’agente:<br />
Figura 3. Posa "pugno chiuso"<br />
I <strong>gesti</strong> dell’agente risultano essere il risultato di una composizione di pose base stati-<br />
che precedentemente definite.<br />
L’editor delle pose serve a facilitare la fase di definizione delle pose <strong>per</strong>ché <strong>per</strong>mette<br />
di muovere liberamente <strong>gli</strong> arti su<strong>per</strong>iori dell’agente Greta avendo un continuo<br />
feedback visivo e una volta raggiunta la configurazione desiderata genera la corri-<br />
spondente sequenza di rotazioni e la memorizza in un file di testo.<br />
88
Capitolo VI, Tools di supporto<br />
Figura 4. Editor delle pose<br />
L’utente interagisce con l’editor <strong>per</strong> mezzo di un’interfaccia grafica intuitiva.<br />
Un’area molto grande dell’interfaccia è riservata alla finestra di feedback destinata<br />
alla visualizzazione del corpo dell’agente Greta. Essa riflette in tempo reale tutte le<br />
variazioni che vengono applicate alle sue giunture usando i controlli situati nella par-<br />
te destra:<br />
− Pose name: è il nome della posa su cui si sta lavorando<br />
− Joint: il campo Name contiene l’elenco di tutte le giunture dello sche-<br />
letro dell’agente Greta. Per modificare la posizione di una giuntura ba-<br />
sta selezionarla in questa listbox e poi agire sui tre sliders RotX, RotY,<br />
RotZ.<br />
− Zoom: imposta la quantità di zoom sul corpo dell’agente.<br />
− Show model, Show skeleton: servono ad attivare o disattivare la vi-<br />
sualizzazione del corpo dell’agente e del suo scheletro. In figura 4 è vi-<br />
89
Capitolo VI, Tools di supporto<br />
sibile tutto il corpo mentre in figura 5 osserviamo la stessa configura-<br />
zione ma attraverso il solo scheletro.<br />
− left2right, right2left: svolgono l’utile funzione di copiare tutte le rota-<br />
zioni de<strong>gli</strong> angoli del braccio sinistro in quelle corrispondenti del brac-<br />
cio destro, e viceversa.<br />
− Load: carica da un file di testo le rota-<br />
zioni associate ad una certa posa base:<br />
− Save: nel momento in cui viene pre-<br />
muto questo pulsante l’editor chiede<br />
quale sottoinsieme dell’insieme delle<br />
giunture vo<strong>gli</strong>amo che venga scritto nel<br />
file di testo che poi specificheremo.<br />
− Constraints: <strong>per</strong>mette di configurare,<br />
<strong>per</strong> mezzo di un’ulteriore finestra di dialogo, i vincoli sulle rotazioni<br />
delle giunture. Non è infatti detto che ogni giuntura possa ruotare<br />
liberamente intorno a tutti e tre <strong>gli</strong> assi. Pensiamo ad esempio al<br />
gomito di una <strong>per</strong>sona che può ruotare intorno a due soli assi, quello<br />
parallelo alla sua lunghezza e quello che esce “lateralmente”:<br />
Spalla e polso invece hanno <strong>per</strong> esempio tutti e tre i gradi di libertà.<br />
Il motore deve <strong>per</strong>ciò tenere conto di queste considerazioni<br />
anatomiche e di conseguenza altrettanto deve fare l’editor <strong>per</strong> fare in<br />
modo che quello che viene visualizzato nella finestra di feedback<br />
90<br />
Figura 1. Scheletro
Capitolo VI, Tools di supporto<br />
corrisponda poi precisamente a quello che il motore riprodurrà<br />
durante l’animazione.<br />
VI.3 Implementazione dell’editor delle pose<br />
L’editor delle pose è un’applicazione <strong>per</strong> sistemi o<strong>per</strong>ativi Win32 che fa uso della li-<br />
breria MFC <strong>per</strong> la creazione e la <strong>gesti</strong>one dell’interfaccia grafica e della libreria<br />
OpenGL [36] <strong>per</strong> la visualizzazione in grafica tridimensionale.<br />
L’editor è stato sviluppato in Visual C++ all’interno del Microsoft Develo<strong>per</strong> Stu-<br />
dio, semplificando in questo modo la fase di creazione della finestra di dialogo e di<br />
tutte le sue componenti.<br />
Quello che vo<strong>gli</strong>amo mettere in risalto in questo paragrafo riguarda il procedimento<br />
adottato <strong>per</strong> la visualizzazione tridimensionale del corpo dell’agente Greta. La stessa<br />
tecnica è stata poi trasferita facilmente (grazie al paradigma di programmazione a<br />
oggetti) nello sviluppo del BAP player che vedremo nel prossimo paragrafo.<br />
Nella prima versione dell’editor ci siamo preoccupati innanzitutto di arrivare a vi-<br />
sualizzare semplicemente uno scheletro con proporzioni umane (figura 5) mentre<br />
successivamente abbiamo “applicato” intorno allo scheletro un modello umanoide<br />
(figura 4).<br />
VI.3.1 Lo scheletro<br />
Il punto di partenza di tutto il lavoro è stato Maya. Come abbiamo detto nel primo<br />
paragrafo di questo capitolo tutta la fase di definizione delle pose avveniva inizial-<br />
mente in questo ambiente di sviluppo.<br />
Il corpo umano può essere considerato suddiviso in una serie di segmenti connessi<br />
tra di loro (braccio, avambraccio, mano, dita). Il punto in cui due o più segmenti si<br />
congiungono è detto giuntura. Per riprodurre un corpo umano è quindi prima di tut-<br />
to necessario considerare una sua rappresentazione come gerarchia di giunture. Per<br />
animarlo si può allora accedere alle giunture e modificarne <strong>gli</strong> angoli di rotazione.<br />
91
Capitolo VI, Tools di supporto<br />
Lo standard H-Anim (Appendice C) fornisce appunto un elenco di giunture di uno<br />
scheletro umanoide e le relative coordinate tridimensionali, del tipo:<br />
l_acromioclavicular 0.0962 1.4269 -0.0424<br />
l_shoulder 0.2029 1.4376 -0.0387<br />
l_elbow 0.2014 1.1357 -0.0682<br />
l_wrist 0.1984 0.8663 -0.0583<br />
l_thumb1 0.1924 0.8472 -0.0534<br />
l_thumb2 0.1951 0.8226 0.0246<br />
l_thumb3 0.1955 0.8159 0.0464<br />
l_index0 0.1983 0.8024 -0.0280<br />
l_index1 0.1983 0.7815 -0.0280<br />
l_index2 0.2017 0.7363 -0.0248<br />
l_index3 0.2028 0.7139 -0.0236<br />
. . . . . . . . .<br />
Inserendo questi dati in Maya è stato configurato uno scheletro che poteva essere a<br />
questo punto posizionato agendo sulla quantità di rotazione di ogni giuntura.<br />
Figura 6. Maya - l'ambiente di lavoro con lo scheletro dell'agente<br />
Dopo il posizionamento bastava mandare in esecuzione un apposito script in lin-<br />
guaggio MEL e la posa veniva scritta in un file di testo al quale avrebbe poi potuto<br />
accedere il motore durante l’elaborazione dell’animazione (figura 2).<br />
Il primo passo è stato allora quello di replicare lo scheletro all’interno dell’editor.<br />
L’oggetto principale dell’editor è la giuntura (in inglese Joint) e lo scheletro<br />
dell’agente è ovviamente un albero di giunture:<br />
92
Capitolo VI, Tools di supporto<br />
class Joint:<br />
Joint* sons;<br />
//puntatore alla giuntura padre<br />
Joint* parent;<br />
//nome della giuntura<br />
CString name;<br />
//posizione(offset) della giuntura rispetto al padre<br />
coord3d translation;<br />
//rotazione della giuntura<br />
coord3d rotation;<br />
//vincoli sui gradi di libertà della giuntura<br />
bool enableX,enableY,enableZ;<br />
In fase di inizializzazione l’editor scorre il contenuto di un file in cui abbiamo me-<br />
morizzato la descrizione dello scheletro H-Anim (Appendice C)[10].<br />
Per ogni giuntura incontrata vengono eseguite le o<strong>per</strong>azioni:<br />
1. istanziazione di un nuovo oggetto di classe Joint;<br />
2. memorizzazione del nome della giuntura;<br />
3. memorizzazione dell’offset della giuntura rispetto al padre;<br />
4. azzeramento della rotazione della giuntura;<br />
5. inserimento della giuntura nella corretta posizione all’interno<br />
dell’albero (scheletro) finora creato;<br />
Una volta immagazzinati i dati di tutte le giunture e costruito l’albero che corri-<br />
sponde allo scheletro dell’agente è molto semplice ottenere la visualizzazione dello<br />
scheletro.<br />
In pratica <strong>per</strong> ogni giuntura occorre tracciare le ossa che vanno verso quelle fi<strong>gli</strong>e e<br />
poi spostarsi in ciascuna di loro e ripetere il procedimento.<br />
Ecco il metodo (ricorsivo) che abbiamo implementato:<br />
metodo Draw:<br />
input: una giuntura dello scheletro<br />
disegnare una piccola sfera;<br />
effettuare la rotazione R associata alla giuntura;<br />
for(ogni giuntura s fi<strong>gli</strong>a di quella in input):<br />
disegnare il segmento che unisce la giuntura in input ad s;<br />
spostare con una traslazione T il sistema di riferimento in<br />
modo che l’origine si trovi nella posizione di s;<br />
s.Draw;<br />
93
Capitolo VI, Tools di supporto<br />
effettuare la traslazione –T;<br />
effettuare la rotazione –R;<br />
Se t è il puntatore alla radice dell’albero-scheletro basterà una semplice chiamata<br />
t→Draw(); <strong>per</strong> provocare il disegno tramite OpenGL dell’intero scheletro<br />
dell’agente completo di tutte le rotazioni corrispondenti alle varie giunture.<br />
Il codice completo commentato del metodo Draw della classe Joint è riportato<br />
nell’Appendice A.<br />
VI.3.2 Il modello<br />
Visualizzare un modello complesso invece di un semplice scheletro è leggermente<br />
più complicato.<br />
Un modello tridimensionale è una coppia (V,T) dove V è un insieme di punti dello<br />
spazio tridimensionale e T un insieme di triangoli i cui vertici sono punti apparte-<br />
nenti a V.<br />
Figura 7. Maya - modello 3D del corpo dell’agente Greta<br />
Grazie ad uno script MEL appositamente realizzato era abbastanza semplice ottene-<br />
re una versione in OpenGL del modello 3D del corpo dell’agente originariamente<br />
impiegato nel Player di Maya (figura 1). Lo script effettuava un’iterazione<br />
sull’insieme V di tutti i vertici del modello scrivendo in un file di intestazione C le<br />
94
Capitolo VI, Tools di supporto<br />
loro coordinate sotto forma di array, e successivamente in un secondo array memo-<br />
rizzava tutti i triangoli dell’insieme T come indici del primo array.<br />
Il problema principale è consistito <strong>per</strong>ò nel trovare un modo <strong>per</strong> arrivare a poter<br />
applicare un procedimento ricorsivo analogo al caso del solo scheletro (vedi sezione<br />
precedente) anche in presenza di un modello tridimensionale e che <strong>per</strong>mettesse di<br />
<strong>gesti</strong>re al me<strong>gli</strong>o le deformazioni a cui il modello sarebbe andato incontro come<br />
conseguenza delle rotazioni delle articolazioni dello scheletro.<br />
Ancora una volta la soluzione è stata ispirata dalla tecnica impiegata da Maya.<br />
Il software della Alias/Wavefront <strong>per</strong>mette di effettuare un’assegnazione detta<br />
skinning tra le ossa dello scheletro e sottoinsiemi dell’insieme V <strong>dei</strong> vertici del mo-<br />
dello. In questo modo i vertici sono vincolati a muoversi seguendo <strong>gli</strong> spostamenti<br />
dell’osso associato. Visivamente inoltre con questa tecnica il modello sembra de-<br />
formarsi in modo sufficientemente naturale vicino alle giunture:<br />
Figura 8. Maya - deformazione del braccio<br />
Abbiamo allora realizzato un ulteriore script MEL <strong>per</strong> esportare su file di testo i dati<br />
dello skinning. Il risultato dello script è un file di intestazione C che contiene <strong>per</strong><br />
ogni giuntura dello scheletro l’array de<strong>gli</strong> indici <strong>dei</strong> vertici dell’insieme V assegnati a<br />
quella giuntura.<br />
Definire un algoritmo <strong>per</strong> il tracciamento tridimensionale del modello corpo<br />
dell’agente Greta equivale a calcolare a partire da V un nuovo insieme V’ in cui i<br />
vertici dell’insieme di partenza siano stati spostati (<strong>per</strong> mezzo di rotazioni) in base<br />
alla configurazione delle giunture dello scheletro.<br />
95
Capitolo VI, Tools di supporto<br />
Illustriamo il procedimento con un esempio semplice, nel caso bidimensionale.<br />
Consideriamo 2 giunture:<br />
Supponiamo di applicare una rotazione θ nel punto P 0 e una rotazione σ nel punto<br />
P 1:<br />
Utilizziamo la notazione matriciale, trasferibile quindi direttamente al caso in 3 di-<br />
mensioni. Ricordiamo che dato un punto P e una matrice di rotazione K il punto<br />
che si ottiene applicando a P la rotazione descritta da K intorno è: P’=P⋅K.<br />
Definiamo allora due matrici di rotazione M,N che corrispondono rispettivamente<br />
alle rotazioni θ e σ.<br />
Per calcolare le coordinate finali del punto P 2 basterà effettuare due traslazioni e due<br />
rotazioni:<br />
1. traslare il sistema portando il punto P 1 nell’origine;<br />
2. calcolare P’ 2= P 2⋅N;<br />
3. traslare il sistema in modo da riportare P 0 nell’origine;<br />
4. calcolare P’’ 2= P’ 2⋅M;<br />
96
Capitolo VI, Tools di supporto<br />
Ed ecco l’algoritmo finale che calcola l’insieme V’ ripetendo questo procedimento<br />
su tutti i vertici del modello del corpo dell’agente:<br />
Metodo ModelDraw:<br />
input: una giuntura g dello scheletro<br />
ottenere l’insieme G ⊆ V <strong>dei</strong> vertici associati a g;<br />
inizializzare la matrice ROT come matrice identità;<br />
for(ogni giuntura s a partire da g e risalendo nello scheletro<br />
fino alla radice):<br />
sia R la matrice di rotazione associata alla rotazione di s;<br />
ROT=ROT*R;<br />
for(ogni v ∈ G):<br />
traslare la giuntura s nell’origine;<br />
v=ROT*v;<br />
traslare la giuntura s nella posizione iniziale;<br />
ripetere tutto il procedimento sulle giunture fi<strong>gli</strong>e di g;<br />
Il codice completo e commentato del metodo ModelDraw della classe Joint è ri-<br />
portato nell’Appendice A.<br />
VI.4 BAP player<br />
Abbiamo più volte citato questo importante elemento del sistema dell’agente con-<br />
versazionale Greta. Ricordiamo che pur non essendo una componente del motore<br />
gestuale esso ha il compito fondamentale di dotare l’agente di un aspetto fisico e<br />
una voce, potremmo quindi dire di “dare vita” all’agente.<br />
Nell’architettura di un agente conversazionale e dell’agente Greta in particolare (ve-<br />
dere il paragrafo IV.5) il BAP player entra in azione non appena il motore gestuale<br />
ha terminato il calcolo di tutti i fotogrammi di animazione del turno di conversazio-<br />
ne dell’agente e ha riversato questi dati in un file BAP, la cui codifica esatta verrà<br />
spiegata nel prossimo paragrafo.<br />
97
Capitolo VI, Tools di supporto<br />
Il player a questo punto accede al file BAP e al file WAV che era stato generato da<br />
Festival (IV.5.2) e avvia la riproduzione dell’animazione e dell’audio in modo sin-<br />
crono. Nella versione attuale del player è possibile modificare in tempo reale la po-<br />
sizione della telecamera che sta inquadrando l’agente e regolare la riproduzione<br />
dell’animazione agendo su <strong>dei</strong> pulsanti simili a quelli di un videoregistratore.<br />
VI.5 La codifica BAP<br />
BAP (Body Animation Parameters) è un insieme di parametri <strong>per</strong> la codifica<br />
dell’animazione del corpo di figure umanoidi sia 2D che 3D. E’ stato definito<br />
all’interno dello standard MPEG4 <strong>per</strong> l’integrazione di animazioni di figure uma-<br />
noidi all’interno di contenuti multimediali.<br />
La codifica prevede la possibilità di <strong>gesti</strong>re ben 175 gradi di libertà (che a loro volta<br />
vengono singolarmente chiamati ancora BAP, <strong>per</strong> un elenco completo vedere<br />
l’Appendice B) <strong>per</strong> lo scheletro del modello.<br />
Ciascuno di questi BAP rappresenta la quantità di rotazione intorno a uno <strong>dei</strong> tre<br />
assi coordinati di una giuntura dello scheletro.<br />
Ad esempio <strong>per</strong> entrambe le spalle esistono tre BAP <strong>per</strong> la rotazione intorno a<strong>gli</strong> as-<br />
si X, Y e Z. Per i gomiti invece sono riservati due BAP ciascuno <strong>per</strong> la rotazione in-<br />
torno a<strong>gli</strong> assi X e Z.<br />
Nella sezione VI.3.1 avevamo spiegato che lo scheletro dell’agente è stato definito<br />
usando un altro standard chiamato H-Anim che prevede una rappresentazione tra-<br />
mite uno scheletro composto da 89 giunture. Abbiamo quindi identificato i BAP<br />
che intervenivano nell’animazione gestuale (quindi quelli relativi a spalle, gomiti,<br />
polsi e dita delle mani) ed effettuato un’o<strong>per</strong>azione di matching tra BAP e giunture<br />
H-Anim.<br />
In pratica H-Anim serve come standard <strong>per</strong> la struttura dello scheletro mentre BAP<br />
è lo standard <strong>per</strong> animarlo.<br />
98
Capitolo VI, Tools di supporto<br />
Consideriamo un esempio. Per il dito mignolo della mano sinistra (che in inglese si<br />
chiama pinky) la codifica BAP prevede 6 parametri su 4 giunture:<br />
• giuntura l_pinky0: flexion (rotazione intorno all’asse X)<br />
• giuntura l_pinky1: pivot,twisting,flexion (rotazione intorno a<strong>gli</strong> assi<br />
X,Y e Z)<br />
• giuntura l_pinky2: flexion (rotazione intorno all’asse X)<br />
• giuntura l_pinky3: flexion (rotazione intorno all’asse X)<br />
Lo stesso dito <strong>per</strong> H-Anim è composto di 4 ossa: l_pinky_metacarpal,<br />
l_pinky_proximal, l_pinky_middle, l_pinky_distal.<br />
Il matching tra BAP e H-Anim è illustrato nella seguente figura:<br />
Significa quindi che l’osso del metacarpo ruoterà intorno alla giuntura PINKY0 che,<br />
come abbiamo detto all’inizio di questo esempio, ha un solo grado di libertà (quello<br />
rispetto all’asse X). L’osso della falange invece ruoterà intorno alla giuntura PIN-<br />
KY1 che aveva tutti e 3 i gradi di libertà. Falangina e falangetta, dovendo ruotare in-<br />
torno rispettivamente alle giunture PINKY2 e PINKY3 avranno un solo grado di<br />
libertà (asse X).<br />
Un file BAP è un file di testo in formato Ascii, contenente più righe che terminano<br />
con il carattere di ritorno a capo e ha una struttura fissa.<br />
La prima riga contiene sempre:<br />
99
Capitolo VI, Tools di supporto<br />
• il numero della versione BAP (ad esempio “2.1”) e in questo modo il player<br />
potrà decidere se e come procedere nella visualizzazione dell’animazione;<br />
• una stringa che rappresenta il nome del file BAP;<br />
• un intero che indica il numero di fotogrammi al secondo (FPS) che sono sta-<br />
ti generati durante il calcolo dell’animazione (nel caso dell’agente Greta sono<br />
sempre 25 FPS).<br />
• il numero totale di fotogrammi che compongono l’animazione.<br />
Dalla seconda in poi sono memorizzate le informazioni relative ai fotogrammi<br />
dell’animazione, in modo che ogni fotogramma sia contenuto in due righe.<br />
La prima è una maschera, cioè una sequenza di 175 valori “0” o “1”. Uno “0” nella<br />
posizione i indica al player che il BAP numero i non viene utilizzato nel fotogram-<br />
ma attuale, un “1” il contrario.<br />
La seconda inizia sempre con il numero di fotogramma attuale e successivamente ci<br />
sono, nell’ordine, i valori <strong>dei</strong> BAP (espressi in radianti*10 5 ) che nella maschera della<br />
riga precedente erano stati contrassegnati con il numero “1”.<br />
Ecco un esempio di file BAP:<br />
0.0 tmp\into1_1.bap 25 839<br />
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 1 1 1 1 1 1 1 1 1 1 1 1 1 1<br />
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<br />
1 1 1 1 1 1 1 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<br />
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<br />
0 -4645 -4796 27592 -26998 -38885 38796 -112452 -110961 -917 859 13757 -12173 -25731 -<br />
30218 82764 -84527 -68255 65700 -6907 -7117 0 0 -106708 99125 -97646 98381 -72864 71440 -<br />
6477 -6260 0 0 -98507 102741 -97987 90837 -68262 64587 6611 6758 0 0 -102057 93953 -85530<br />
97681 -51875 48845 17696 16831 0 0 -78502 80728 -91709 88674 -32323 -30713 -63022 69897<br />
49194 -47899 35007 40433 52715 53306<br />
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 1 1 1 1 1 1 1 1 1 1 1 1 1 1<br />
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<br />
1 1 1 1 1 1 1 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<br />
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<br />
1 -5672 -5827 27844 -27257 -38659 38553 -111703 -110277 -909 851 12592 -10819 -24203 -<br />
28623 88805 -90882 -61782 59479 -7024 -7321 0 0 -96606 89751 -88394 89054 -65965 64669 -<br />
6482 -6255 0 0 -89179 92995 -88703 82236 -61791 58474 5985 6117 0 0 -92377 85055 -77429<br />
88418 -46954 44220 17046 16250 0 0 -71060 73074 -83026 80286 -29242 -27784 -57075 63295<br />
44521 -43351 31708 36620 47744 48276<br />
VI.6 Implementazione del BAP player<br />
Il player che abbiamo realizzato è in realtà fortemente basato sul codice creato <strong>per</strong><br />
l’editor delle pose.<br />
100
Capitolo VI, Tools di supporto<br />
Come abbiamo visto, l’editor era capace di visualizzare il corpo dell’agente varian-<br />
done la posizione de<strong>gli</strong> arti in base all’input dell’utente oppure leggendo questi dati<br />
da un file.<br />
L’idea allora è stata quella di caricare il file BAP in un array e poi inserire, ad inter-<br />
valli tempo prestabiliti, i dati dell’array nello scheletro dell’agente provocando di<br />
conseguenza il movimento del corpo con il risultato che possiamo vedere nella se-<br />
guente figura:<br />
Figura 9. BAP player<br />
Il corpo dell’agente nella figura è completo anche della testa. Infatti nel player è sta-<br />
to integrato il codice del FAP player realizzato da Massimo Bilvi [2] <strong>per</strong> la visualiz-<br />
zazione delle espressioni facciali.<br />
Durante la riproduzione, in qualsiasi momento:<br />
• muovendo il mouse e tenendo premuto il tasto sinistro la telecamera che in-<br />
quadra l’agente ruota verso destra, sinistra, in alto o in basso.<br />
• muovendo il mouse e tenendo premuto il tasto destro la telecamera scorre<br />
lateralmente o dall’alto in basso (panning).<br />
101
Capitolo VI, Tools di supporto<br />
• muovendo il mouse e tenendo premuto il tasto centrale la quantità di zoom<br />
della telecamera aumenta o diminuisce.<br />
L’implementazione del player si basa sull’introduzione nella classe Joint presentata<br />
nel paragrafo 3 di un metodo LoadFrame(int n); che dato il numero di foto-<br />
gramma n accede all’n-esimo elemento dell’array <strong>dei</strong> fotogrammi e copia le rotazio-<br />
ni <strong>dei</strong> vari BAP nelle corrispondenti giunture dello scheletro.<br />
A questo punto non resta che invocare il metodo ModelDraw (spiegato nel para-<br />
grafo 3) <strong>per</strong> ottenere la visualizzazione del corpo dell’agente al fotogramma n.<br />
Una volta avviata l’animazione va avanti autonomamente. Questo significa che è<br />
stato necessario creare un thread secondario dedicato all’aggiornamento della visua-<br />
lizzazione del corpo dell’agente. Riportiamo il codice del thread e del metodo che<br />
effettua il refresh della visualizzazione della finestra di dialogo principale del player:<br />
DWORD WINAPI PlayThread( LPVOID pParam )<br />
{<br />
//effettuare il cast del parametro nella classe della<br />
//finestra di dialogo principale<br />
CDlgOglDlg* pObject = (CDlgOglDlg*)pParam;<br />
//ripetere all’infinito<br />
while(true)<br />
{<br />
//bloccare qui finché il dialogo non esce dalla fase di refresh<br />
while(pObject->refreshing==true)<br />
{<br />
Sleep(10);<br />
}<br />
//inviare al dialogo un messaggio che lo avverta che può iniziare<br />
//la fase di refresh<br />
pObject->refreshing=true;<br />
pObject->PostMessage(WM_PAINT,0,0);<br />
//rimanere inattivo <strong>per</strong> 10 millisecondi<br />
Sleep(10);<br />
}<br />
//questa istruzione non verrà mai raggiunta<br />
return 0;<br />
}<br />
void CDlgOglDlg::Refresh(){<br />
//se l’animazione è stata avviata<br />
if(playing)<br />
{<br />
//calcolare il numero di fotogramma corrente<br />
//(25FPS=>ogni fotogramma dura 40 ms)<br />
102
Capitolo VI, Tools di supporto<br />
currentframe=currentframe+(timeGetTime()-starttime)/40.0;<br />
//se non è stata su<strong>per</strong>ata la lunghezza totale dell’animazione<br />
if(currentframeDrawGLScene(m_root,type,xrot,yrot,xscroll,yscroll,zoom);<br />
refreshing=false;<br />
}<br />
La variabile refreshing funge da semaforo. Il thread la pone uguale a true quando dà<br />
il via alla fase di refresh e attende che venga posta di nuovo a false prima di prose-<br />
guire. In questo modo evitiamo che il thread richieda un nuovo refresh mentre è in<br />
corso quello precedente.<br />
VI.7 Editor <strong>dei</strong> <strong>gesti</strong><br />
Nel capitolo IV abbiamo presentato il linguaggio GestureScript <strong>per</strong> la definizione<br />
<strong>dei</strong> <strong>gesti</strong>. Il linguaggio è stato utilizzato <strong>per</strong> creare il gestuario del motore gestuale<br />
dell’agente Greta.<br />
Ricordiamo brevemente che <strong>per</strong> il motore ogni gesto è una sequenza di uno o più<br />
fotogrammi base ciascuno <strong>dei</strong> quali viene descritto qualitativamente dalla sovrappo-<br />
sizione delle configurazioni di braccio, polso, dita della mano.<br />
Durante lo sviluppo del motore abbiamo rilevato che sarebbe stato molto più sem-<br />
plice ed intuitivo poter costruire “visivamente” i <strong>gesti</strong> invece di scrivere manual-<br />
mente i file GestureScript rischiando oltretutto di commettere errori di battitura e di<br />
sintassi.<br />
L’editor delle pose è un’interfaccia grafica che <strong>per</strong>mette all’utente di definire <strong>gesti</strong><br />
<strong>per</strong> il motore gestuale secondo la specifica del linguaggio GestureScript occupandosi<br />
103
Capitolo VI, Tools di supporto<br />
poi della compilazione del file di testo corrispondente ed impedendo all’utente di<br />
commettere errori di definizione.<br />
In particolare vengono del tutto eliminati i seguenti tipi di errore:<br />
• errori di temporizzazione <strong>dei</strong> fotogrammi base: ogni fotogramma base ha un<br />
tempo associato compreso tra 0 e 1 che rappresenta il momento in cui il foto-<br />
gramma si verifica relativamente alla durata totale del gesto; l’editor è predispo-<br />
sto in modo da impedire di assegnare a ogni fotogramma un tempo inferiore a<br />
quello del fotogramma precedente oppure al di fuori dell’intervallo [0,1].<br />
• errori nell’accoppiamento tra forme della mano e del pollice: in GestureScript la<br />
configurazione della mano prevede alcune forme base (ad esempio form_fist,<br />
form_open, symbol_1_open, ecc.) più alcuni modificatori opzionali <strong>per</strong> il polli-<br />
ce; le forme sono suddivise in tre insiemi che sono associati a diversi tipi di mo-<br />
dificatore del pollice; l’editor, grazie ad alcuni pulsanti di tipo “radio” che si abili-<br />
tano automaticamente, consente di effettuare solo accoppiate sintatticamente<br />
corrette.<br />
• errori di assegnazione <strong>dei</strong> vettori palmo e dita: <strong>per</strong> ogni fotogramma base è<br />
possibile specificare la direzione del vettore parallelo alle dita e di quello uscente<br />
dal palmo (figura 4 del capitolo IV); se ad esempio il vettore dita è diretto in<br />
avanti allora le uniche possibili direzioni del vettore palmo sono ovviamente su,<br />
giù, interno e esterno, mentre specificando avanti o dietro il motore non saprebbe<br />
come interpretare il gesto; l’editor <strong>per</strong>mette di assegnare ai vettori solo direzioni<br />
compatibili tra loro.<br />
L’editor è un’interfaccia grafica <strong>per</strong> sistemi o<strong>per</strong>ativi Win32 che fa uso della libreria<br />
MFC <strong>per</strong> la creazione e la <strong>gesti</strong>one <strong>dei</strong> controlli dell’interfaccia. Di seguito possiamo<br />
vedere un’immagine dell’editor:<br />
104
Capitolo VI, Tools di supporto<br />
Figura 10. L'editor <strong>dei</strong> <strong>gesti</strong><br />
Nella finestra di dialogo i controlli sono suddivisi in gruppi che corrispondono alle<br />
parole chiave di GestureScript (ArmX, ArmY, ArmZ, Hand, Palm, FingerBase). Il<br />
fotogramma definito nella schermata della figura 10 dà poi luogo all’esecuzione del<br />
gesto iconico “piccolo” (figura 11).<br />
105
Capitolo VI, Tools di supporto<br />
Figura 11. L'agente Greta mentre esegue il gesto iconico "piccolo".<br />
106
Capitolo VII, Conclusioni e sviluppi futuri<br />
VII.1 Conclusioni<br />
VII<br />
Conclusioni e sviluppi futuri<br />
In questa tesi abbiamo realizzato il sistema gestule dell’agente conversazionale Greta.<br />
Questo ha richiesto prima di tutto lo studio di argomenti collegati alla comunicazio-<br />
ne sociale, alla psicologia e alle scienze cognitive <strong>per</strong> risalire ai meccanismi mediante<br />
i quali avviene la comunicazione non-verbale tra <strong>gli</strong> esseri umani.<br />
Partendo da un motore <strong>per</strong> il calcolo <strong>dei</strong> movimenti di singoli <strong>gesti</strong> abbiamo intro-<br />
dotto una serie di modifiche in modo da ottenere un motore gestuale completo:<br />
• è stato creato un modulo <strong>per</strong> effettuare la scelta <strong>dei</strong> <strong>gesti</strong> da riprodurre (come<br />
detto, secondo i principi che regolano la gestualità delle <strong>per</strong>sone) e fornire lo-<br />
ro la corretta temporizzazione;<br />
• è stato implementato il calcolo <strong>dei</strong> <strong>gesti</strong> <strong>dei</strong>ttici che inizialmente non erano<br />
stati previsti;<br />
• è stata modificata la dinamica <strong>dei</strong> <strong>gesti</strong> <strong>per</strong> renderla più realistica ed è stata<br />
aggiunta la capacità <strong>per</strong> l’agente di effettuare posizioni di riposo multiple;<br />
107
Capitolo VII, Conclusioni e sviluppi futuri<br />
• è stata implementata un’applicazione <strong>per</strong> definire le pose base <strong>dei</strong> <strong>gesti</strong> in<br />
modo da rendere il sistema indipendente da qualsiasi software commerciale;<br />
• è stato implementato un editor <strong>dei</strong> <strong>gesti</strong> <strong>per</strong> semplificare la procedura di de-<br />
finizione <strong>dei</strong> <strong>gesti</strong>;<br />
• è stato creato un gestuario;<br />
• è stato implementato un BAP player che fornisce un aspetto “fisico”<br />
all’animazione calcolata dal motore;<br />
VII.2 Sviluppi futuri<br />
Il sistema dell’agente è ancora in fase di sviluppo e presto verranno implementate<br />
nuove funzionalità:<br />
• mi<strong>gli</strong>oramento della riproduzione <strong>dei</strong> <strong>gesti</strong>:<br />
− dare più espressività ai <strong>gesti</strong>;<br />
− riprodurre anche <strong>gesti</strong> con movimento circolare;<br />
• creazione automatica <strong>dei</strong> <strong>gesti</strong> – <strong>per</strong> ora l’agente può riprodurre solo i <strong>gesti</strong> pre-<br />
senti nel gestuario. In alcune situazioni <strong>per</strong>ò potrebbe essere utilizzato un proce-<br />
dimento che, esaminando l’informazione che l’agente sta comunicando verbal-<br />
mente, riesca a comporre automaticamente un gesto coerente con la conversa-<br />
zione. Ciò renderebbe molto più flessibile il tipo di impiego dell’agente.<br />
• implementazione della riproduzione della postura – l’agente <strong>per</strong> ora mantiene<br />
sempre la stessa postura mentre in futuro sarà in grado di modificarla in base<br />
all’andamento del discorso; il motore gestuale è già predisposto <strong>per</strong> effettuare il<br />
calcolo su tutti i BAP del corpo, compresi quelli che interessano la postura. An-<br />
drà introdotto un sistema di definizione delle posture e un pianificatore che si<br />
occu<strong>per</strong>à di impostare <strong>dei</strong> fotogrammi chiave <strong>per</strong> la postura. Il motore effettuerà<br />
poi lo stesso tipo di interpolazione di braccia e mani.<br />
108
Capitolo VII, Conclusioni e sviluppi futuri<br />
• implementazione di un sistema multiagente – sarà possibile attivare nello stesso<br />
ambiente virtuale più istanze dell’agente che potranno comunicare tra di loro.<br />
Questo comporterà la definizione <strong>dei</strong> <strong>gesti</strong> relativi al turn-taking e al feedback<br />
che <strong>per</strong> adesso non sono stati considerati.<br />
• rendere l’agente libero di muoversi – nel sistema attuale Greta non può spostarsi<br />
nell’ambiente virtuale in cui si trova. Verranno implementati alcuni algoritmi che<br />
<strong>per</strong>metteranno all’agente di camminare mentre si sta svolgendo la conversazione.<br />
• calcolo delle deformazioni del corpo – il BAP player visualizza il corpo di Greta<br />
utilizzando una tecnica di deformazione base che potrebbe essere raffinata te-<br />
nendo in considerazione la struttura anatomica del corpo umano.<br />
• calcolo <strong>dei</strong> vestiti – i vestiti dell’agente sono stati inseriti nel BAP player come<br />
modelli poligonali statici. In futuro i vestiti si deformeranno seguendo i movi-<br />
menti del corpo.<br />
• valutazione della credibilità del comportamento dell’agente – verranno valutate le<br />
espressioni comunicative dell’agente <strong>per</strong> controllare che siano coerenti col con-<br />
tenuto informativo che vuole comunicare e che riproducano correttamente le<br />
espressioni utilizzate nella comunicazione tra esseri umani.<br />
• valutazione dell’usabilità: andrà verificato che effettivamente <strong>per</strong> l’utente la fami-<br />
liarizzazione con il sistema è più semplice e veloce grazie al fatto che sta inter-<br />
agendo con un agente conversazionale invece che con un’interfaccia tradizionale.<br />
109
Appendice A<br />
Appendice A<br />
VII.3 Il metodo Draw della classe Joint<br />
Nella sezione 1 del paragrafo VI.3 avevamo descritto l’algoritmo sul quale è basato<br />
il metodo Draw() della classe Joint. In questo paragrafo riportiamo il codice<br />
commentato della sua implementazione nel linguaggio C++:<br />
void Joint::Draw(){<br />
//disegnare una sfera nel punto attuale, cioè nel punto da cui parte la giuntura<br />
gluSphere(gluNewQuadric(),1.0f,4,4);<br />
//OPENGL:effettuare la rotazione associata alla giuntura<br />
glRotatef(rotation.z,0.0f,0.0f,1.0f);<br />
glRotatef(rotation.y,0.0f,1.0f,0.0f);<br />
glRotatef(rotation.x,1.0f,0.0f,0.0f);<br />
//se la giuntura ha delle giunture fi<strong>gli</strong>e allora <strong>per</strong> ciscuna di esse:<br />
for(int i=0; itranslation.x,sons[i]->translation.y,sons[i]->translation.z);<br />
glEnd();<br />
//OPENGL:spostarsi nella posizione di quella fi<strong>gli</strong>a<br />
glTranslatef(sons[i]->translation.x, sons[i]->translation.y, sons[i]->translation.z);<br />
//disegnare ricorsivamente quella fi<strong>gli</strong>a e tutti i suoi successori<br />
sons[i]->Draw(jointname);<br />
//OPENGL:tornare nella posizione della giuntura attuale<br />
glTranslatef(-sons[i]->translation.x, -sons[i]->translation.y, -sons[i]->translation.z);<br />
}<br />
OPENGL:dopo aver disegnato tutte le fi<strong>gli</strong>e effettuare una rotazione opposta a quella della<br />
giuntura attuale<br />
glRotatef(-rotation.x,1.0f,0.0f,0.0f);<br />
glRotatef(-rotation.y,0.0f,1.0f,0.0f);<br />
glRotatef(-rotation.z,0.0f,0.0f,1.0f);<br />
}<br />
110
Appendice A<br />
VII.4 Il metodo ModelDraw della classe Joint<br />
Nella sezione 2 del paragrafo VI.3 avevamo descritto l’algoritmo sul quale è basato<br />
il metodo ModelDraw() della classe Joint. In questo paragrafo riportiamo il co-<br />
dice commentato della sua implementazione nel linguaggio C++:<br />
void Joint::ModelDraw(CString jointname,coord3d totaltranslation,GLfloat* vertex_new,<br />
GLfloat* normal_new){<br />
//convertire il nome della giuntura in una stringa standard c++<br />
std::string namestring(name.GetBuffer(0));<br />
//ottere il nome dell’array <strong>dei</strong> vertici associati alla giuntura<br />
int*jointVertices= GetPolySet(namestring);<br />
//e il suo numero di elementi<br />
int size= GetPolySetSize(namestring);<br />
//variabili locali<br />
int whichVertex;<br />
int i;<br />
coord3d center;<br />
Joint* prevjoint;<br />
alg3::vec3 vertex_rot;<br />
alg3::vec3 normal_rot;<br />
alg3::mat3 rotmatx(alg3::vec3(0,0,0),alg3::vec3(0,0,0),alg3::vec3(0,0,0));<br />
alg3::mat3 rotmaty(alg3::vec3(0,0,0),alg3::vec3(0,0,0),alg3::vec3(0,0,0));<br />
alg3::mat3 rotmatz(alg3::vec3(0,0,0),alg3::vec3(0,0,0),alg3::vec3(0,0,0));<br />
alg3::mat3 tempmat(alg3::vec3(1,0,0),alg3::vec3(0,1,0),alg3::vec3(0,0,1));<br />
//aggiungere la traslazione di questa giuntura alla traslazione totale, data come parametro<br />
totaltranslation.x=totaltranslation.x+this->translation.x;<br />
totaltranslation.y=totaltranslation.y+this->translation.y;<br />
totaltranslation.z=totaltranslation.z+this->translation.z;<br />
//<strong>per</strong> ruotare questa parte del corpo occorre spostarsi nel centro di rotazione locale<br />
//ed effettuare la rotazione della giuntura associata<br />
//poi il tutto va ripetuto sulle giunture fi<strong>gli</strong>e<br />
prevjoint=this;<br />
center.x=totaltranslation.x;<br />
center.y=totaltranslation.y;<br />
center.z=totaltranslation.z;<br />
//la rotazione va applicata a ritroso a tutte le giunture precedenti fino alla radice<br />
while(prevjoint!=NULL)<br />
{<br />
//calcolare tre matrici di rotazione, una intorno ad ognuno de<strong>gli</strong> assi<br />
rotmatx[0][0]=1;<br />
rotmatx[0][1]=0;<br />
rotmatx[0][2]=0;<br />
rotmatx[1][0]=0;<br />
rotmatx[1][1]=Cosine((int)(prevjoint->rotation.x));<br />
rotmatx[1][2]=-Sine((int)(prevjoint->rotation.x));<br />
rotmatx[2][0]=0;<br />
rotmatx[2][1]=Sine((int)(prevjoint->rotation.x));<br />
rotmatx[2][2]=Cosine((int)(prevjoint->rotation.x));<br />
rotmaty[0][0]=Cosine((int)(prevjoint->rotation.y));<br />
rotmaty[0][1]=0;<br />
rotmaty[0][2]=Sine((int)(prevjoint->rotation.y));<br />
rotmaty[1][0]=0;<br />
rotmaty[1][1]=1;<br />
rotmaty[1][2]=0;<br />
rotmaty[2][0]=-Sine((int)(prevjoint->rotation.y));<br />
rotmaty[2][1]=0;<br />
rotmaty[2][2]=Cosine((int)(prevjoint->rotation.y));<br />
rotmatz[0][0]=Cosine((int)(prevjoint->rotation.z));<br />
rotmatz[0][1]=-Sine((int)(prevjoint->rotation.z));<br />
rotmatz[0][2]=0;<br />
rotmatz[1][0]=Sine((int)(prevjoint->rotation.z));<br />
rotmatz[1][1]=Cosine((int)(prevjoint->rotation.z));<br />
rotmatz[1][2]=0;<br />
rotmatz[2][0]=0;<br />
rotmatz[2][1]=0;<br />
rotmatz[2][2]=1;<br />
111
Appendice A<br />
//tempmat conterrà la matrice di rotazione finale<br />
tempmat[0][0]=1;<br />
tempmat[0][1]=0;<br />
tempmat[0][2]=0;<br />
tempmat[1][0]=0;<br />
tempmat[1][1]=1;<br />
tempmat[1][2]=0;<br />
tempmat[2][0]=0;<br />
tempmat[2][1]=0;<br />
tempmat[2][2]=1;<br />
tempmat=tempmat*rotmatz;<br />
tempmat=tempmat*rotmaty;<br />
tempmat=tempmat*rotmatx;<br />
//ora <strong>per</strong> ogni vertice della parte del corpo associata a questa giuntura effettuare<br />
//la rotazione<br />
for (i=0; itranslation.x;<br />
center.y=center.y-prevjoint->translation.y;<br />
center.z=center.z-prevjoint->translation.z;<br />
}<br />
//spostarsi nella precedente e ripeti<br />
prevjoint=prevjoint->parent;<br />
}<br />
//l’algoritmo su tutti i vertici di questa giuntura è terminato, passare ora alle giunture<br />
//fi<strong>gli</strong>e<br />
for(i=0; iModelDraw(jointname,totaltranslation,vertex_new,normal_new)<br />
}<br />
112
Appendice B<br />
VII.5 Tabella <strong>dei</strong> gruppi BAP<br />
Appendice B<br />
Nel paragrafo VI.5 abbiamo descritto lo standard MPEG4/BAP [5; 17; 35; 46]. Ri-<br />
portiamo la lista completa <strong>dei</strong> gruppi BAP. Nel paragrafo successivo forniremo<br />
l’elenco <strong>dei</strong> singoli BAP (Body Modification Parameters) che appartengono ad ogni<br />
gruppo.<br />
BAP Group n. Group Description Number of BAPs<br />
1. Pelvis 3<br />
2. Left leg1 4<br />
3. Right leg1 4<br />
4. Left leg2 6<br />
5. Right leg2 6<br />
6. Left arm1 5<br />
7. Right arm1 5<br />
8. Left arm2 7<br />
9. Right arm2 7<br />
10. Spine1 12<br />
11. Spine2 15<br />
12. Spine3 18<br />
13. Spine4 18<br />
14. Spine5 12<br />
113
Appendice B<br />
15. Left hand1 16<br />
16. Right hand1 16<br />
17. Left hand2 13<br />
18. Righ thand2 13<br />
19. Global positioning 6<br />
20. Extension BAPs1 22<br />
21. Extension BAPs2 22<br />
22. Extension BAPs3 22<br />
23. Extension BAPs4 22<br />
24. Extension BAPs5 22<br />
VII.6 Elenco <strong>dei</strong> BAP in ogni gruppo<br />
Pelvis:<br />
sacroiliac_tilt, sacroiliac_torsion, sacroiliac_roll<br />
Left leg1:<br />
l_hip_flexion,l_hip_abduct,l_knee_flexion,l_ankle_flex<br />
Right leg1:<br />
r_hip_flexion,r_hip_abduct,r_knee_flexion,r_ankle_flex<br />
Left leg2:<br />
l_hip_twisting, l_knee_twisting, l_ankle_twisting,<br />
l_subtalar_flexion,l_midtarsal_flexion,l_metatarsal_flex<br />
Right leg2:<br />
r_hip_twisting, r_knee_twisting, r_ankle_twisting,<br />
r_subtalar_flexion,r_midtarsal_flexion,r_metatarsal_flex<br />
Left arm1:<br />
l_shoulder_flexion,l_shoulder_abduct,l_shoulder_twist<br />
l_elbow_flexion, l_wrist_flexion<br />
Right arm1:<br />
r_shoulder_flexion,r_shoulder_abduct,r_shoulder_twist<br />
r_elbow_flexion, r_wrist_flexion<br />
Left arm2:<br />
l_sternoclavicular_abduct, l_sternoclavicular_rotate,<br />
l_acromioclavicular_abduct, l_acromioclavicular_rot,<br />
l_elbow_twisting, l_wrist_pivot, l_wrist_twisting<br />
Right arm2:<br />
r_sternoclavicular_abduct, r_sternoclavicular_rotate,<br />
r_acromioclavicular_abduct,r_acromioclavicular_rot,<br />
r_elbow_twisting, r_wrist_pivot, r_wrist_twisting<br />
Spine1:<br />
skullbase_roll, skullbase_torsion, skullbase_tilt,<br />
vc4roll, vc4torsion, vc4tilt,vt6roll, vt6torsion, vt6tilt,<br />
vl3roll, vl3torsion, vl3tilt,<br />
Spine2:<br />
vc2roll, vc2torsion, vc2tilt,vt1roll, vt1torsion, vt1tilt,<br />
vt10roll,vt10torsion,vt10tilt, vl1roll, vl1torsion, vl1tilt,<br />
vl5roll, vl5torsion, vl5tilt<br />
Spine3:<br />
vc3roll, vc3torsion, vc3tilt,vc6roll, vc6torsion, vc6tilt,<br />
vt4roll, vt4torsion, vt4tilt,vt8roll, vt8torsion, vt8tilt,<br />
vt12roll, vt12torsion, vt12tilt,vl4roll,vl4torsion, vl4tilt,<br />
114
Appendice B<br />
Spine4:<br />
vc5roll, vc5torsion, vc5tilt, vc7roll, vc7torsion, vc7tilt<br />
vt2roll, vt2torsion, vt2tilt, vt7roll, vt7torsion, vt7tilt,<br />
vt11roll, vt11torsion, vt11tilt,vl2roll,vl2torsion, vl2tilt,<br />
Spine5:<br />
vc1roll, vc1torsion, vc1tilt, vt3roll, vt3torsion, vt3tilt,<br />
vt5roll, vt5torsion, vt5tilt, vt9roll, vt9torsion, vt9tilt,<br />
Left hand1:<br />
l_pinky1_flexion,l_pinky2_flexion,l_pinky3_flexion,<br />
l_ring1_flexion, l_ring2_flexion, l_ring3_flexion,<br />
l_middle1_flexion,l_middle2_flexion,l_middle3_flex<br />
l_index1_flexion, l_index2_flexion,l_index3_flexion,<br />
l_thumb1_flexion, l_thumb1_pivot,<br />
l_thumb2_flexion, l_thumb3_flexion<br />
Right hand1:<br />
r_pinky1_flexion, r_pinky2_flexion,r_pinky3_flexion,<br />
r_ring1_flexion, r_ring2_flexion, r_ring3_flexion,<br />
r_middle1_flexion,r_middle2_flexion,r_middle3_flex<br />
r_index1_flexion, r_index2_flexion, r_index3_flexion,<br />
r_thumb1_flexion, r_thumb1_pivot,<br />
r_thumb2_flexion,r_thumb3_flexion<br />
Left hand2:<br />
l_pinky0_flexion,l_pinky1_pivot,l_pinky1_twisting,<br />
l_ring0_flexion,l_ring1_ pivot,l_ring1_twisting,<br />
l_middle0_flexion,l_middle1_pivot,l_middle1_twist<br />
l_index0_flexion,l_index1_ pivot,<br />
l_index1_twisting,l_thumb1_twisting<br />
Right hand2:<br />
r_pinky0_flexion, r_pinky1_pivot,r_pinky1_twisting,<br />
r_ring0_flexion,r_ring1_ pivot, r_ring1_twisting,<br />
r_middle0_flexion,r_middle1_pivot,r_middle1_twist<br />
r_index0_flexion, r_index1_pivot,<br />
r_index1_twisting, r_thumb1_twisting<br />
Global positioning:<br />
HumanoidRoot_tr_vertical,HumanoidRoot_tr_lateral,<br />
HumanoidRoot_tr_frontal,HumanoidRoot_rt_turn,<br />
HumanoidRoot_rt_roll,HumanoidRoot_rt_tilt<br />
115
Appendice C<br />
VII.7 Il modello H-Anim<br />
Appendice C<br />
H-Anim è una specifica <strong>per</strong> la sintetizzazione di <strong>per</strong>sonaggi umanoidi in ambienti<br />
virtuali. L’obbiettivo è quello di creare una libreria di questi <strong>per</strong>sonaggi e <strong>dei</strong> tools<br />
<strong>per</strong> animarli.<br />
Il corpo umano può essere considerato suddiviso in una serie di segmenti connessi<br />
tra di loro (braccio, avambraccio, mano, dita). Il punto in cui due o più segmenti si<br />
congiungono è detto giuntura. Per riprodurre un corpo umano è quindi prima di tut-<br />
to necessario considerare una sua rappresentazione come gerarchia di giunzioni.<br />
Nel prossimo paragrafo vedremo il diagramma delle giunture del modello H-Anim,<br />
che ci fornisce anche le loro coordinate spaziali, riportate nell’ultimo paragrafo.<br />
116
Appendice C<br />
VII.8 H-Anim: Gerarchia delle giunture<br />
117
Appendice C<br />
VII.9 H-Anim: posizione delle giunture<br />
Per ogni giuntura il modello fornisce la traslazione (offset) rispetto alla giuntura<br />
precedente nella gerarchia. Questi offset sono stati utilizzati nella creazione dello<br />
scheletro <strong>per</strong> il modello dell’agente Greta:<br />
Joint n. Joint name Offset (dx,dy,dz)<br />
1 l_forefoot_tip 0.1354 0.0016 0.1476<br />
2 l_metatarsal_pha5 0.1825 0.0070 0.0928<br />
3 l_digit2 0.1195 0.0079 0.1433<br />
4 l_metatarsal_pha1 0.0816 0.0232 0.0106<br />
5 l_lateral_malleolus 0.1308 0.0597 -0.1032<br />
6 l_medial_malleolus 0.0890 0.0716 -0.0881<br />
7 l_sphyrion 0.0890 0.0575 -0.0943<br />
8 l_calcaneous_post 0.0974 0.0259 -0.1171<br />
9 l_knee_crease 0.0993 0.4881 -0.0309<br />
10 l_femoral_lateral_epicn 0.1598 0.4967 0.0297<br />
11 l_femoral_medial_epicn 0.0398 0.4946 0.0303<br />
12 r_forefoot_tip -0.1043 -0.0227 0.1450<br />
13 r_metatarsal_pha5 -0.1523 0.0166 0.0895<br />
14 r_digit2 -0.0883 0.0134 0.1383<br />
15 r_metatarsal_pha1 -0.0521 0.0260 0.0127<br />
16 r_lateral_malleolus -0.1006 0.0658 -0.1075<br />
17 r_medial_malleolus -0.0591 0.0760 -0.0928<br />
18 r_sphyrion -0.0603 0.0610 -0.1002<br />
19 r_calcaneous_post -0.0692 0.0297 -0.1221<br />
20 r_knee_crease -0.0825 0.4932 -0.0326<br />
21 r_femoral_lateral_epicn -0.1421 0.4992 0.0310<br />
22 r_femoral_medial_epicn -0.0221 0.5014 0.0289<br />
23 r_iliocristale -0.1525 1.0628 0.0035<br />
24 r_trochanterion -0.1689 0.8419 0.0352<br />
25 l_iliocristale 0.1612 1.0537 0.0008<br />
26 l_trochanterion 0.1677 0.8336 0.0303<br />
27 r_asis -0.0887 1.0021 0.1112<br />
28 l_asis 0.0925 0.9983 0.1052<br />
29 r_psis -0.0716 1.0190 -0.1138<br />
30 l_psis 0.0774 1.0190 -0.1151<br />
118
Appendice C<br />
31 crotch 0.0034 0.8266 0.0257<br />
32 skull_tip 0.0050 1.7504 0.0055<br />
33 sellion 0.0058 1.6316 0.0852<br />
34 r_infraorbitale -0.0237 1.6171 0.0752<br />
35 l_infraorbitale 0.0341 1.6171 0.0752<br />
36 supramenton 0.0061 1.5410 0.0805<br />
37 r_tragion -0.0646 1.6347 0.0302<br />
38 r_gonion -0.0520 1.5529 0.0347<br />
39 l_tragion 0.0739 1.6348 0.0282<br />
40 l_gonion 0.0631 1.5530 0.0330<br />
41 nuchale 0.0039 1.5972 -0.0796<br />
42 r_neck_base -0.0419 1.5149 -0.0220<br />
43 l_neck_base 0.0646 1.5141 -0.0380<br />
44 l_thumb_distal_tip 0.1982 0.8061 0.0759<br />
45 l_index_distal_tip 0.2089 0.6858 -0.0245<br />
46 l_dactylion 0.2056 0.6743 -0.0482<br />
47 l_middle_distal_tip 0.2080 0.6731 -0.0491<br />
48 l_ring_distal_tip 0.2035 0.6750 -0.0756<br />
49 l_pinky_distal_tip 0.2014 0.7009 -0.1012<br />
50 l_metacarpal_pha2 0.2009 0.8139 -0.0237<br />
51 l_ulnar_styloid -0.2142 0.8529 -0.0648<br />
52 l_metacarpal_pha5 0.1929 0.7860 -0.1122<br />
53 l_radial_styloid 0.1901 0.8645 -0.0415<br />
54 l_olecranon -0.1962 1.1375 -0.1123<br />
55 l_humeral_medial_epicn 0.1735 1.1272 -0.1113<br />
56 l_radiale 0.2182 1.1212 -0.1167<br />
57 l_humeral_lateral_epicn 0.2280 1.1482 -0.1100<br />
58 l_clavicale 0.0271 1.4943 0.0394<br />
59 l_acromion 0.2032 1.4760 -0.0490<br />
60 l_axilla_ant 0.1777 1.4065 -0.0075<br />
61 l_axilla_post 0.1706 1.4072 -0.0875<br />
62 r_thumb_distal_tip -0.1869 0.8090 0.0820<br />
63 r_index_distal_tip -0.1980 0.6883 -0.0180<br />
64 r_dactylion -0.1941 0.6772 -0.0423<br />
65 r_middle_distal_tip -0.1969 0.6758 -0.0427<br />
66 r_ring_distal_tip -0.1934 0.6778 -0.0693<br />
67 r_pinky_distal_tip -0.1938 0.7035 -0.0949<br />
68 r_metacarpal_pha2 -0.1977 0.8169 -0.0177<br />
119
Appendice C<br />
69 r_ulnar_styloid -0.2117 0.8562 -0.0584<br />
70 r_metacarpal_pha5 -0.1929 0.7890 -0.1064<br />
71 r_radial_styloid -0.1884 0.8676 -0.0360<br />
72 r_olecranon -0.1907 1.1405 -0.1065<br />
73 r_humeral_medial_epicn -0.1680 1.1298 -0.1062<br />
74 r_radiale -0.2130 1.1305 -0.1091<br />
75 r_humeral_lateral_epicn -0.2224 1.1517 -0.1033<br />
76 r_clavicale -0.0115 1.4943 0.0400<br />
77 r_acromion -0.1905 1.4791 -0.0431<br />
78 r_axilla_ant -0.1626 1.4072 -0.0031<br />
79 r_axilla_post -0.1603 1.4098 -0.0826<br />
80 suprasternale 0.0084 1.4714 0.0551<br />
81 cervicale 0.0064 1.520 -0.0815<br />
82 r_thelion -0.0736 1.3385 0.1217<br />
83 l_thelion 0.0918 1.3382 0.1192<br />
84 substernale 0.0085 1.2995 0.1147<br />
85 r_rib10 -0.0711 1.1941 0.1016<br />
86 l_rib10 0.0871 1.1925 0.0992<br />
87 rib10_midspine 0.0049 1.1908 -0.1113<br />
88 waist_preferred_post 0.2900 1.0915 -0.1091<br />
89 navel 0.0069 1.0966 0.1017<br />
120
Bibliografia<br />
Bibliografia<br />
[1] N. Badler, R. Bindiganavale, J. Allbeck, W. Schuler, L. Zhao, M. Palmer. Param-<br />
eterized action representation for virtual human agents. In "Embodied conversational<br />
characters". Cambridge MA, MIT Press, 2000<br />
[2] M. Bilvi. Progetto e sviluppo di un agente conversazionale multimodale: animazione e sincro-<br />
nizzazione <strong>dei</strong> segnali verbali e non verbali. Tesi di laurea, Università de<strong>gli</strong> Studi di<br />
Roma “La Sapienza”, 2001<br />
[3] R. Bindiganavale, N. Badler. Motion abstraction and mapping with spatial constraints.<br />
In "International workshop on Modeling and motion capture techniques for<br />
virtual environments", Ginevra, novembre 1998, pp. 70-82<br />
[4] A. Black, P. Taylor, R. Caley, R. Clark. The festival speech sinthesis system.<br />
http://www.cstr.ed.ac.uk/projects/festival/<br />
[5] T. K. Capin, E. Petajan, J. Ostermann. Efficient modeling of virtual humans in<br />
MPEG-4, In "ICME 2000", 2000<br />
[6] J. Cassell. Embodied conversation: integrating face and gesture into automatic spoken dia-<br />
logue systems. In "Spoken dialogue systems". Cambridge Ma, MIT Press, 2001<br />
[7] J. Cassell, C. Pelachaud, N. Badler, M. Steedman, B. Achorn, T. Becket, B.<br />
Douville, S. Prevost, M. Stone. Animated conversation: rule-based generation of facial<br />
expression, gesture & spoken intonation for multiple conversational agents. In<br />
"SIGGRAPH ’94", 1994, pp. 413-420<br />
[8] J. Cassell, J. Sullivan, S. Prevost, E. Churchill. Embodied Conversational Agents.<br />
Cambridge MA, MIT Press, 2000<br />
121
Bibliografia<br />
[9] D. Eberly. Key frame interpolation via splines and quaternions. http://www.magic-<br />
software.com/<br />
[10] H-anim. http://www.h-anim.org/<br />
[11] E. Hajicova, P. Sgall. The ordering principle. In "Journal of pragmatics 11", 1987,<br />
pp. 435-454<br />
[12] M. Halliday. Intonation and grammar in British En<strong>gli</strong>sh. The Hague, Mouton, 1967<br />
[13] Hao Yan. Paired speech and gesture generation in embodied conversational agents. M.S.<br />
thesis in the Media Lab. Cambridge MA, MIT Press, 2000<br />
[14] P. A. Harling, A. D. N. Edwards. Hand tension as a gesture segmentation cue. In<br />
"Progress in Gestural Interaction: Proceedings of Gesture Workshop '96",<br />
London, Springer, 1997, pp. 75-87<br />
[15] B. Hartmann, M. <strong>Mancini</strong>, C. Pelachaud. Formational parameters and adaptive proto-<br />
type instantiation for MPEG-4 compliant gesture synthesis. In "Computer Animation".<br />
Geneva, giugno 2002, IEEE Computer Society, 2002, p. 111-119<br />
[16] T. Huang, V. Pavlovic. Hand gesture modeling, analysis, and synthesis, in "Proceed-<br />
ings of the International workshop on Automatic Face and Gesture Recogni-<br />
tion", giugno 1995, pp. 73-79<br />
[17] ISO/IEC JTC 1/SC 29/WG11 N2739 subpart 2, MPEG-4 Versione 2 - BIFS,<br />
marzo 1999<br />
[18] A. Kendon. Gesticulation and speech: two aspects of the process of utterance. In "The rela-<br />
tion between verbal and nonverbal communication". The Hague, Mouton,<br />
1980, pp. 207-227<br />
[19] A. Kendon. Gestures as illocutionary and discourse structure markers in southern Italian<br />
conversation. In "Journal of pragmatics", 23, 1995, pp. 247-279<br />
[20] A. Kendon. How gestures can become like words. In "Crosscultural <strong>per</strong>spectives in<br />
nonverbal communication", F. Poyatos ed., Toronto, Hogrefe, 1988. pp. 131-<br />
141<br />
[21] A. Kendon. Movement coordination in social interaction: some examples described. In<br />
"Nonverbal communication". Oxford University Press, 1974<br />
122
Bibliografia<br />
[22] J.R. Kennaway. Synthetic animation of deaf signing gestures. In "4th International<br />
Workshop on Gesture and Sign Language Based Human-Computer Interac-<br />
tion", London, aprile 2001<br />
[23] D. H. U. Kochanek, R. H. Bartels. Interpolating splines with local tension, continuity<br />
and bias control. In "Computer Graphics (SIGGRAPH ’84 Proceedings)", 18,<br />
1984, pp. 33-41<br />
[24] S. Kopp, I. Wachsmuth. A knowledge-based approach for lifelikegesture animation. In<br />
"Proceedings of the 14 th European conference on artificial intelligence". IOS<br />
Press, 2000<br />
[25] S. Kopp, I. Wachsmuth. Model-based Animation of Coverbal Gesture. In "Proceed-<br />
ings of Computer Animation", IEEE Press, 2002, pp. 252-257<br />
[26] S. Kopp, I. Wachsmuth. Planning and motion control in lifelike gesture: a refined ap-<br />
proach. In "Computer Animation", IEEE Computer Society, 2000, pp. 92-97<br />
[27] A. Kranstedt, S. Kopp, I. Wachsmuth. MURML: A Multimodal Utterance Repre-<br />
sentation Markup Language for Conversational Agents. In "Autonomous Agents and<br />
Multi-Agent Systems", 2002<br />
[28] J. Lasseter. Principles of traditional animation applied to 3D computer animation. In<br />
"Computer Graphics (SIGGRAPH ’85 Proceedings)", 21, 1987, pp. 35-44<br />
[29] T. Lebourque e S. Gibet. High level specification and control of communication gestures:<br />
the GESSYCA system. In "Computer Animation '99", IEEE Computer Society,<br />
1999, pp. 24-35<br />
[30] J. C. Lester, S. A. Converse, S. H. Kahler, S. T. Barlow, B. A. Stone, R. S. Bho-<br />
gal. The <strong>per</strong>sona effect: affective impact of animated pedagogical agents. In "CHI", pp.<br />
1997, 359-366<br />
[31] J. C. Lester, S. G. Towns, C. B. Callaway, J. L. Voerman, P. J. Fitzgerald. Deictic<br />
and emotive communication in animated pedagogical agents. In "Embodied Conversa-<br />
tional Agents". Cambridge MA, MIT Press, 2000<br />
123
Bibliografia<br />
[32] J. C. Lester, J. Voerman, S. Towns, C. Callaway. Cosmo: a like-like animated peda-<br />
gogical agent with <strong>dei</strong>ctic believability. In "Proceedings of the IJCAI97 workshop on<br />
animated interface agents: making them intelligent", 1997, pp. 61-69<br />
[33] MAYA 4 Online Library. Alias/Wavefront, 2001<br />
[34] D. McNeill. Hand and Mind: What Gestures Reveal about Thought. University of<br />
Chicago, 1992<br />
[35] MPEG4: http://www.m4if.org/<br />
[36] OpenGL: http://www.opengl.org/<br />
[37] R. Parent. Computer animation: algorithms and techniques. Morgan Kaufmann Pub-<br />
lishers, 2002<br />
[38] V.I. Pavlovic, R. Sharma, T.S. Huang. Visual interpretation of hand gestures for hu-<br />
mancomputer interaction: a review. In "IEEE Transaction on Pattern Analysis and<br />
Machine Intelligence", vol. 19, n. 7, 1997<br />
[39] C. Pelachaud, V. Carofi<strong>gli</strong>o, B. De Carolis, F. de Rosis, I. Poggi. Embodied Con-<br />
textual Agent in Information Delivering Application. In "First International Joint Con-<br />
ference on Autonomous Agents & Multi-Agent Systems", 2002<br />
[40] C. Pelachaud, I. Poggi, B. De Carolis, F. de Rosis. Behavior planning for a reflexive<br />
agent. IJCAI - 2001, Seattle, 2001<br />
[41] K. Perlin, K., Noise, Hy<strong>per</strong>texture, Antialiasing and Gesture, in "Texturing and<br />
Modeling, A Procedural Approach". D. Ebert, Ed. Cambridge, MA, AP Profes-<br />
sional, 1994<br />
[42] J. Pierrehumbert, J. Hirschberg. The meaning of intonational Contours in the Interpreta-<br />
tion of Discourse. In " Plans and Intentions in Communication and Discours".<br />
P.R. Cohen, J. Morgan, M.E. Pollack ed. Cambridge MA, MIT Press, 1990, pp<br />
271-311<br />
[43] I. Poggi. The Semantics and Pragmatics of Everyday Gestures. C.Mueller and R.Posner,<br />
2001<br />
[44] I. Poggi, E. M. Caldognetto. A score for the analysis of gestures in multimodal communi-<br />
cation. In "Proceedings of the workshop on the integration of gesture and lan-<br />
124
Bibliografia<br />
guage in speech, applied science and engineering laboratories", Newark and<br />
Wilmington, 1996, pp. 235-244<br />
[45] I. Poggi, C. Pelachaud, E. Magno Caldognetto. Gestural Mind Markers in ECAs.<br />
In "Second International Joint Conference on Autonomous Agents & Multi-<br />
Agent Systems", 2003.<br />
[46] M. Preda, T. Zaharia, F. Prêteux. 3D body animation and coding within a MPEG4<br />
compliant framework. In "International workshop SNHC", 1999<br />
[47] S. Prillwitz, R. Leven, H. Zienert, T. Hamke, J. Henning. HamNoSys Version 2.0:<br />
Hamburg Notation System for Sign Languages: An Introductory Guide. In "International<br />
Studies on Sign Language and Communication of the Deaf". Signum Press, vol.<br />
5, 1989<br />
[48] B. Reeves, C. Nass. The Media Equation: How People Treat Computers, Television, and<br />
New Media like Real People and Places. CSLI Publications, 1996<br />
[49] K. Shoemake. Animating rotation with quaternion curves. In "Computer Graphics<br />
(SIGGRAPH ’85 Proceedings)", 19, 1985, pp. 245-254<br />
[50] T. Sowa, I. Wachsmuth. Coverbal iconic gestures for object descriptions in virtual envi-<br />
ronments: An empirical study. In "Post-Proceedings of the Conference of Gestures:<br />
Meaning and Use", 2000<br />
[51] W. Stokoe. Sign language structure: an outline of the communicative systems of the Ameri-<br />
can deaf. Linstock Press, 1978<br />
[52] H. Thimbleby. User Interface Design, Addison-Wesley, 1990.<br />
[53] K. R. Thórisson. Layered, modular action control for communicative humanoids. In Com-<br />
puter Animation ’97, IEEE Computer Society, 1997, pp. 134-143<br />
[54] XML: http://xml.coverpages.org/xml.html<br />
[55] I. Wachsmuth, S. Kopp. Lifelike Gesture Synthesis and Timing for Conversational<br />
Agents. In "Gesture Workshop 2001", pp. 120-133<br />
[56] A. Watt. 3D computer graphics. Addison Wesley, 1993<br />
[57] A. Watt, M. Watt. Advanced animation and rendering techniques. Addison Wesley,<br />
1992<br />
125
Bibliografia<br />
126