• Non ci sono risultati.

Queste sono le regole relative alla pianificazione, quelle che in particolare costituiscono il modello attentivo del robot. Sono ispirate alle social cues discusse nella sezione 4.5.1.

A discapito del loro nome, le look rules non gestiscono esclusivamente l’attenzione dell’androide, infatti non intervengono solo sul winner, ma anche su face. Infatti, a seconda dell’evento che cattura l’attenzione del robot, verrà impartita anche un’espressione facciale consona a quell’evento nel relativo slot ECS, che contiene l’espressione da spedire al servizio HEFES.

Tra queste è definita la regola che si occupa di controllare il robot quando si trova in condizione di solitudine, il suo codice è il seguente:

Codice 5.9: boring_loneliness



( d e f r u l e M A I N :: b o r i n g _ l o n e l i n e s s

" If the r o b o t doesn ’ t see a n y o n e is b o r e d and f o l l o w the v i r t u a l p o i n t " ? a l o n e <- ( l o n e l i n e s s ) ( t r a c k i n g _ i s OFF ) ? s u r r o u n d <- ( s u r r o u n d i n g s ( v i r t u a l s a l i e n c y _ x y ? x ? y )) ? win <- ( w i n n e r ( id ?) ( p o i n t ? ?) ( l o o k r u l e ?)) ? f a c e <- ( f a c e ( ecs ? ?)) = > ( b i n d ? nx (/ ? x 6 4 0 ) )

5.6. LOOK RULES 83 ( b i n d ? ny (- 1 (/ ? y 4 8 0 ) ) ) ( m o d i f y ? f a c e ( ecs 0 . 2 7 - 0 . 8 4 ) ) ( m o d i f y ? win ( id 1) ( p o i n t ? nx ? ny ) ( l o o k r u l e L O N E L I N E S S )) ( r e t r a c t ? a l o n e ? s u r r o u n d )) 

Analizziamo accuratamente questa regola, ci consentirà di comprendere a pieno le altre esposte in seguito:

• Prima di tutto si nota subito che questa regola verrà attivata solo nel caso in cui siano presenti i fatti (loneliness) e (tracking_is OFF) che denotano, appunto, la solitudine del robot. Questo è il meccanismo dei dummy facts di cui avevamo parlato.

• In questa regola è presente un meccanismo fondamentale che riguarderà tutte le regole del sistema: la sintassi del tipo ?alone <- (loneliness), usata an- che in ?surround <- (surroundings (virtualsaliency_xy ?x ?y)), serve a memorizzare il relativo fact-index, argomento richiesto dal retract che viene effettuato come ultima azione del RHS. Questo è un meccanismo che si è rivelato fondamentale e necessario alla corretta esecuzione delle regole.

Il paradigma è il seguente:

In ogni regola deve esserci almeno un fatto, la cui presenza vie- ne verificata nel LHS, e che rappresenta una condizione necessa- ria per l’attivazione della regola, che dovrà essere retratto, o le cui caratteristiche dovranno essere modificate, nel RHS della regola stessa.

Se questo semplice paradigma non viene rispettato, e tutti i fatti che fanno scattare la regola resteranno presenti così come sono nella fact-list, si creerà un loop infinito che bloccherà il programma, poiché la regola continuerà a verificare la presenza di quei fatti, riscontrerà la veridicità di questa verifica ed eseguirà la sequenza di azioni del RHS all’infinito. Il sistema non uscirà più da questa regola mal posta. Ovviamente questa non è una legge generale di CLIPS ma un modus operandi da rispettare all’interno di questo Sistemo Cognitivo, poiché si basa sulla struttura dell’architettura generale del sistema e sul fatto che ad ogni ciclo di lavoro tutta l’informazione viene nuovamente caricata nel

84 CAPITOLO 5. IMPLEMENTAZIONE DEL CODICE

brain. A conoscenza del fatto che questo avviene ogni 300 millisecondi, non

dovremmo affatto preoccuparci di perdere dati. Al contrario questo metodo costituisce una pulizia necessaria del sistema che altrimenti andrebbe incontro a saturazione.

• La sintassi utile a catturare il fact-index viene utilizzata anche per winner e face, e servirà alla funzione modify, usata nel RHS per inserire le informazioni negli slot di questi Templates.

• La funzione bind serve a creare una nuova variabile ed associargli un valore calcolato tra le parentesi tonde alla sua destra. In particolare i due bind del RHS servono ad eseguire un’operazione di conversione dalle coordinate in pixel del visual saliency point a quelle del mondo normalizzato tra 0 e 1 visto dal robot2.

La look rule boring_loneliness esegue quest’inferenza: se il robot è solo deve

scrutare l’ambiente e guardare il punto considerato di maggiore salienza visiva con un’espressione annoiata.

Nel Template face vengono quindi modificate le coordinate (v,a) inserendo quelle relative alla suddetta espressione. Nel Template winner vengono collocate: le coordinate del punto corrispondenti a quelle normalizzate del visual saliency point estratto da surroundings; un ID pari a 1 (che non viene mai assegnato ai soggetti); e la stringa “LONELINESS” nello slot che deve testimoniare quale look rule è stata attivata.

Questo è il metodo di funzionamento comune a tutte le look rules.

Codice 5.10: lookrule_raisehand



( d e f r u l e M A I N :: l o o k r u l e _ r a i s e h a n d " T h i s r u l e s e l e c t s the w i n n e r

as the p e r s o n who r a i s e s his h a n d " ( t r a c k i n g _ i s ON ) ? s u b j <- ( s u b j e c t ( id ? id ) ( g e s t u r e ? g e s t ) ( h e a d _ x y z ? ? ? z ) ( n o r m a l i z e d s p i n c e n t e r _ x y ? sx ? sy )) ? win <- ( w i n n e r ( id ?) ( p o i n t ? ?) ( l o o k r u l e ?)) ? f a c e <- ( f a c e ( ecs ? ?))

5.6. LOOK RULES 85 ( t e s t ( eq ? g e s t 1)) = > ( m o d i f y ? f a c e ( ecs 0 . 8 5 0 . 1 ) ) ( b i n d ? s h i f t e d _ s y (+ ? sy (/ 0 . 8 2 ? z ))) ( m o d i f y ? win ( id ? id ) ( p o i n t ? sx ? s h i f t e d _ s y ) ( l o o k r u l e r a i s e h a n d )) ( r e t r a c t ? s u b j )) 

Nel momento stesso in cui almeno un soggetto viene rilevato nella scena, le regole dell’Analyzing Rules Set si occupano di retrarre il fatto (loneliness) e modificare il fatto relativo al tracking in (tracking_is ON), presente in tutti i LHS delle look

rules responsabili dell’attenzione rivolta ai soggetti umani.

Da un subject vengono estratte esclusivamente le informazioni che interessano la regola in questione. Ad esempio, la regola lookrule_raisehand riportata nel codice 5.10 sarà interessata a verificare il valore relativo allo slot gesture per vedere se questo corrisponde a 1.

Anche qui, in caso di esecuzione della regola, dopo aver trasferito le informazioni dell’ID e del punto da guardare nel winner, nel RHS effettuiamo il retract del soggetto in questione, consapevoli del fatto che se il soggetto, nei prossimi 300 millisecondi, si troverà ancora all’interno della scena, tutte le sue informazioni saranno nuovamente asserite nella fact-list.

Nel RHS di questa regola si nota però una riga di codice particolare, che è la seguente:

Codice 5.11: Codice dello shift dello sguardo



( b i n d ? s h i f t e d _ s y (+ ? sy (/ 0 . 8 2 ? z )))



Questo codice esegue una semplice operazione matematica finalizzata a modificare l’ordinata del punto che sarà poi scritto nel point del winner. Serve ad applicare uno shift nelle ordinate che porterà ad alzare lo sguardo del robot.

L’operazione di shift viene eseguita perché il punto di riferimento che utilizziamo per ogni soggetto non è in realtà la coordinata spaziale della testa, ma quello dello spin_center. Lo si può notare dall’estrazione dei dati sulla posizione del soggetto, dove la profondità viene prelevata dalla coordinata z della head_xyz (e lasciata in metri), mentre per le coordinate x e y si usano quelle normalizzate del baricentro (sx e sy).

86 CAPITOLO 5. IMPLEMENTAZIONE DEL CODICE

Dato che questa seconda informazione (normalizedspincenter_xy) è comune a tutti i sei soggetti che il Kinect è in grado di rilevare, questo metodo permette di guardare dritto negli occhi anche soggetti di cui non si conosce le coordinate della testa. Ovviamente per farlo è necessario spostare verso l’alto lo sguardo del robot a partire da quel punto, e farlo in maniera inversamente proporzionale alla distanza a cui si trova il soggetto. La funzione matematica ideata per effettuare questa operazione, corrispondente alla sintassi del codice 5.11, è la seguente:

y0 = y + k

z

Dove y0 è la shifted_sy, y rappresenta la sy del normalizedspincenter_xy, z equivale alla z della head_xyz, e k non è altro che la costante che avevamo definito nel codice 5.6.

In particolare nella regola lookrule_raisehand non viene utilizzata la variabile globale k, questo perchè in certi casi si può decidere di utilizzare uno shift dello sguardo specifico all’interno di una regola, che non sia finalizzato a guardare il soggetto negli occhi. Ad esempio, in seguito al gesto di alzare la mano, che il soggetto sta compiendo, lo sguardo del robot viene rivolto verso un punto che si trova leggermente più in alto rispetto alla linea degli occhi del winner.

Questa look rule esegue quest’operazione: se un soggetto alza la mano, quest’ultimo

è il winner e FACE deve rivolgergli lo sguardo sorridendo. Il metodo con cui vengono

inseriti gli ordini relativi al punto da guardare e all’espressione da realizzare sono gli stessi per la regola boring_loneliness (cod. 5.9).

Un altra look rules è quella relativa alla probabilità che un soggetto stia parlando, definita come segue:

Codice 5.12: lookrule_speaking  ( d e f r u l e M A I N :: l o o k r u l e _ s p e a k i n g " T h i s r u l e s e l e c t s the w i n n e r as the p e r s o n who is p r e s u m a b l y t a l k i n g " ( t r a c k i n g _ i s ON ) ? s u b j <- ( s u b j e c t ( id ? id ) ( s p e a k _ p r o b ? s p e a k ) ( h e a d _ x y z ? ? ? z ) ( n o r m a l i z e d s p i n c e n t e r _ x y ? sx ? sy )) ? win <- ( w i n n e r ( id ?) ( p o i n t ? ?) ( l o o k r u l e ?)) ? f a c e <- ( f a c e ( ecs ? ?))

5.6. LOOK RULES 87 ( t e s t ( > ? s p e a k 0 . 8 2 ) ) = > ( m o d i f y ? f a c e ( ecs 0 . 1 1 0 . 3 0 ) ) ( b i n d ? s h i f t e d _ s y (+ ? sy (/ ?* k * ? z ))) ( m o d i f y ? win ( id ? id ) ( p o i n t ? sx ? s h i f t e d _ s y ) ( l o o k r u l e s p e a k i n g )) ( r e t r a c t ? s u b j )) 

La soglia di probabilità scelta per l’attivazione di questa regola è una speak_prob maggiore all’82%, decisa per via empirica tramite delle prove sul robot. Qui si può notare che viene utilizzata la variabile globale k per il calcolo dello shift, di conseguenza l’androide guarderà negli occhi il soggetto che sta parlando.

Questa regola corrisponde a: se un soggetto sta parlando, lui è il vincitore e il

robot deve guardarlo con un’espressione che dimostri interesse.

Infine ci sono le look rules in cui i patterns del LHS verificano la posizione che il soggetto occupa all’interno della scena; ovvero distance, longdistance, intrusive e

angle. Queste ultime regole non determinano un cambio di espressione del robot,

ad eccezione della regola intrusive in cui si è pensato di costruire una sfera sociale virtuale (che chiameremo sfera intima) con un raggio pari a un metro, che sancisce lo spazio privato (e non sociale) del robot. L’androide risulterà infastidito dalla presenza di un soggetto che si avvicini così tanto da entrare nella sua sfera intima, e comunicherà questa “sensazione” con un’espressione intermedia tra rabbia e disgusto.

In generale lo spazio intorno al robot è stato suddiviso in intervalli di profondità. Oltre alla sfera intima, è stato definito un intervallo compreso tra 1m e 2,2m, se un soggetto si trova a una distanza compresa in questo intervallo si attiva la regola

distance. Se invece un soggetto si trova in un range di profondità che va da 2,2m a

4m (sempre distanze stabilite rispetto al robot) allora si attiva la regola longdistance. Quest’ultima regola è stata in realtà congegnata per suscitare l’attenzione del robot verso quelle persone che avvicinandosi stanno entrando nella sua sfera sociale, o che allontanandosi la abbandonano, passando necessariamente da questa porzione di spazio. Infine abbiamo la regola denominata angle che punta a dichiarare winner colui o colei si ponga esattamente di fronte al robot.

Di seguito il codice della definizione di queste regole:

Codice 5.13: lookrule_distance, lookrule_longdistance, lookrule_intrusive e

lookrule_angle



88 CAPITOLO 5. IMPLEMENTAZIONE DEL CODICE " T h i s r u l e s e l e c t s the w i n n e r as the p e r s o n who is e n t e r i n g or l e a v i n g the r o o m " ( t r a c k i n g _ i s ON ) ? s u b j <- ( s u b j e c t ( id ? id ) ( h e a d _ x y z ? ? ? z ) ( n o r m a l i z e d s p i n c e n t e r _ x y ? sx ? sy )) ? win <- ( w i n n e r ( id ?) ( p o i n t ? ?) ( l o o k r u l e ?)) ? f a c e <- ( f a c e ( ecs ? ?)) ( t e s t ( and ( < ? z 2 . 2 ) ( >= ? z 1 ) ) ) = > ( m o d i f y ? f a c e ( ecs 0.0 0 . 0 ) ) ( b i n d ? s h i f t e d _ s y (+ ? sy (/ ?* k * ? z ))) ( m o d i f y ? win ( id ? id ) ( p o i n t ? sx ? s h i f t e d _ s y ) ( l o o k r u l e d i s t a n c e )) ( r e t r a c t ? s u b j )) ( d e f r u l e M A I N :: l o o k r u l e _ l o n g d i s t a n c e " T h i s r u l e s e l e c t s the w i n n e r as

the p e r s o n who is in the s o c i a l s p a c e " ( t r a c k i n g _ i s ON ) ? s u b j <- ( s u b j e c t ( id ? id ) ( h e a d _ x y z ? ? ? z ) ( n o r m a l i z e d s p i n c e n t e r _ x y ? sx ? sy )) ? win <- ( w i n n e r ( id ?) ( p o i n t ? ?) ( l o o k r u l e ?)) ? f a c e <- ( f a c e ( ecs ? ?)) ( t e s t ( and ( < ? z 4) ( >= ? z 2 . 6 ) ) ) = > ( m o d i f y ? f a c e ( ecs 0.0 0 . 0 ) ) ( b i n d ? s h i f t e d _ s y (+ ? sy (/ ?* k * ? z ))) ( m o d i f y ? win ( id ? id ) ( p o i n t ? sx ? s h i f t e d _ s y ) ( l o o k r u l e l o n g d i s t a n c e )) ( r e t r a c t ? s u b j )) ( d e f r u l e M A I N :: l o o k r u l e _ i n t r u s i v e " Ehi ! You are too c l o s e to me ...

5.7. ACTION RULES 89