Riconoscimento gestuale ad infrarossi

In questo articolo della Rubrica Firmware Relaod viene affrontato un tema di grande attualità, ovvero il percorso evolutivo che porterà, con ogni probabilità, al progressivo abbandono delle tecniche di controllo “a tocco” a favore di quelle di tipo puramente gestuale. Una sfida indubbiamente complessa, irta di ostacoli in parte ancora da superare, ma indubbiamente stimolante per tutti gli appassionati di “hi-tech” e di sperimentazione ad alto livello.

INTRODUZIONE

L’interazione tra uomo e macchina o dispositivi elettronici è quasi interamente fondata sul concetto di tocco. Da sempre, per comunicare con una macchina o un computer, gli uomini “toccano” qualcosa; negli anni l’innovazione ha portato via via alla nascita di dispositivi sempre più precisi ed intuitivi, dai semplici pulsanti alle tastiere, ai mouse, ai joystick fino all’inarrestabile ascesa dei dispositivi a schermo tattile. Ottime soluzioni, spesso premiate dalla velocità di diffusione, ma di sicuro non prive di problemi dovuti, ad esempio, alla meccanica stessa dei tasti o all’impossibilità in certi casi del loro utilizzo. Si pensi ad esempio all’impossibilità di utilizzare un touchscreen in un’officina o semplicemente quando si indossano dei guanti.

Per superare questi ed altri problemi dovuti al concetto di “touch”, nel corso degli ultimi anni la ricerca si è mossa nella direzione opposta, ovvero in quella del “touchless”: lo scopo è quello di creare interfacce intuitive almeno quanto quelle touch in assenza di quest’ultimo, ovvero, ci si propone di creare dispositivi capaci di riconoscere i movimenti delle dita o della mano nello spazio libero, una sorta di monitor virtuali utilizzati dall’utente allo stesso modo con cui utilizzerebbero dei dispositivi reali. L’elettronica necessaria allo sviluppo di un dispositivo simile può essere piuttosto complicata nonchè costosa, ma un buon compromesso in termini di semplicità di sviluppo e di costi si ottiene utilizzando dei semplici sensori ad infrarossi. In questo articolo vedremo il principio di funzionamento dei sensori ad infrarossi, nonchè un paio di tecniche per la realizzazione di un dispositivo touchless, per concludere, tramite l’utilizzo dei sensori GP2D12 e di Arduino, con una semplicissima implementazione di quanto detto.

PRINCIPIO DI FUNZIONAMENTO

I sensori ad infrarossi sono dispositivi ben noti alla comunità elettronica, si tratta di dispositivi quasi sempre formati da una coppia foto emettitore/foto ricevitore. Nonostante nascano come sensori di fondo corsa, un foto emettitore viene montato davanti al suo foto ricevitore il quale smette di ricevere nel momento in cui una struttura fisica si interpone tra i due.

Figura 1: Esempio di Dispositivo

Figura 1: Esempio di dispositivo

Figura 2: Principio di Funzionamento

Figura 2: Principio di funzionamento

Nel corso degli anni hanno visto crescere i loro campi d’utilizzo dagli switch elettronici o isolatori galvanici ai sensori di distanza, ed è proprio su questo campo d’utilizzo che svilupperemo il nostro dispositivo touchless. Il principio di funzionamento di un sensore di distanza è molto semplice, come detto si basa su una coppia foto emettitore/foto ricevitore posizionati sullo stesso piano e fissati rigidamente ad un supporto normalmente di plastica. In ottica le leggi di Snell insegnano che un'onda trasmessa lungo un corpo A, quando impatta un corpo B si sdoppia, generando un'onda rifratta che continua il suo cammino attraverso il corpo B con una nuova direzione diversa da quella che aveva al momento dell’impatto, e un'onda riflessa che in quanto tale ritorna sul corpo A con una direzione tale da generare rispetto al piano d’impatto un angolo uguale all’angolo d’incidenza. Ed è proprio grazie all’onda riflessa che questi dispositivi sono in grado di misurare le distanze; il foto emettitore, infatti, emette un'onda ad infrarossi la quale, incontrando un ostacolo, genera un'onda riflessa che viene recepita dal foto ricevitore.

In funzione dell’area, il dispositivo è in grado di calcolare l’angolo d’incidenza e quindi la distanza dell’oggetto su cui ha impattato l’onda. Ovviamente, affinchè il dispositivo funzioni correttamente, è necessario che il corpo abbia un buon fattore di riflessione e che l’onda riflessa cada all’interno dell’area del foto ricevitore, nella fattispecie nei fogli specifici dei dispositivi in commercio viene sempre indicato il campo di funzionamento. Nel nostro caso, il corpo che rifletterà l’onda sarà un dito o una mano e quindi si avrà un buon coefficiente di riflessione, mentre per quanto riguarda le distanze basterà semplicemente aver cura nella scelta dei sensori da utilizzare in funzione dell’applicazione da realizzare. Scelti i sensori con i relativi campi di funzionamento, bisognerà disporli sull’area da sensorizzare in maniera tale da coprirla interamente, evitando di lasciare su quest’ultima “dead spot” ossia punti morti. La Figura 3 mostra un esempio di posizionamento dei sensori tale da non creare per la mano o per il singolo dito dei punti morti.

Figura 3: Esempio di Posizionamento dei Sensori

Figura 3: Esempio di posizionamento dei sensori

Diminuendo la distanza sul piano tra l’emettitore e il ricevitore si aumenta la risoluzione del dispositivo migliorando di conseguenza le prestazioni. Il problema dei punti morti, nonostante venga quasi sempre risolto dall’aumento dei sensori utilizzati, è soprattutto funzione della configurazione e dell’utilizzo di questi ultimi. Nell’esempio mostrato in figura, i sensori stanno su un piano e la mano si muove parallelamente a tale piano: nonostante questa soluzione sia ottima per le prestazioni del dispositivo touchless, è impraticabile in sostituzione di un touchscreen in quanto, ovviamente, i sensori coprirebbero lo schermo. Nel caso in esempio si potrebbero montare i sensori in una configurazione perpendicolare allo schermo, quasi a fare una cornice di quest’ultimo, ovviando al problema dell’occlusione a costo di un numero maggiore di sensori. Per tali motivi il numero di questi ultimi e la configurazione in cui montarli varia da applicazione ad applicazione. Per motivi di semplicità, l’esempio che verrà presentato più avanti monterà tre sensori nella configurazione mostrata nella Figura 3.

IDENTIFICAZIONE MEDIANTE POSIZIONE

Questa tecnica ricostruisce i movimenti del dito/mano calcolando in istanti successivi la posizione di quest’ultimo, l’algoritmo è quindi composto da tre fasi successive:

1. Lettura delle Distanze tra i Sensori e il Target
In questa prima fase non si farà altro che raccogliere tutte le distanze misurate dai sensori. Assumendo che il target si muova su un’area totalmente coperta dai sensori, questi ultimi restituiranno una misura ragionevole nel caso in cui il target rifletta effettivamente le onde trasmesse dai foto emettitori, mentre non restituiranno alcunché nel caso in cui il target si trovi al di fuori del loro campo di funzionamento o della loro area attiva.

2. Calcolo della Posizione Attuale della Mano
In questa seconda fase, conoscendo la posizione dei sensori e considerando le letture effettive di questi ultimi, con un pò di geometria si calcola facilmente la posizione del target. Considerando, nella più semplice delle ipotesi, un piano, per il calcolo della posizione di un generico punto, è necessario conoscere la posizione di almeno tre punti di riferimento e le relative distanze tra il punto in questione e i punti di riferimento. Infatti, partendo dai tre punti di riferimento, tracciando tre circonferenze di raggio pari alle distanze misurate, queste si incontreranno esattamente nel punto desiderato. Questa nota tecnica prende il nome di “triangolazione” di un punto. Nel caso in cui si consideri un semipiano, come mostrato nella Figura 4, basteranno due punti con le due relative distanze.

Figura 4: Calcolo del Target

Figura 4: Calcolo del target

Seguendo la stessa logica, nel caso di triangolazione spaziale saranno necessari quattro punti e quattro distanze; il punto desiderato sarà dato dall’intersezione di quattro sfere, che diventeranno tre nel caso in cui si consideri un semispazio. Ritornando al caso della Figura 4, la posizione della mano si otterrà risolvendo il sistema formato dalle equazioni delle due circonferenze:

La soluzione di tale sistema in forma totalmente parametrica, nonostante sia abbastanza semplice e che su internet sia possibile trovare molti software in grado di ricavarla (Wolfram Alpha, ad esempio, che useremo più avanti) verrà trascurata in questa sede, in quanto non necessaria al calcolo della posizione del target. Difatti, in una applicazione pratica, l’utente dopo aver fissato un sistema di riferimento conosce perfettamente la posizione dei sensori, quindi gli unici parametri da inserire nel sistema saranno i due raggi misurati dai sensori stessi; in questo modo, l’espressione del punto d’intersezione sarà molto più facile da calcolare, ad esempio, nella Figura 4, considerando i centri delle due circonferenze sull’asse delle ascisse e l’asse passante per il target come l’asse delle ordinate, il sistema diventerà:

ottenendo per il target le seguenti coordinate:

Come detto in precedenza, nel piano due punti non bastano ad identificare il target, infatti, la soluzione trovata identifica due punti aventi la stessa ascissa. Tuttavia, nel semipiano si prenderà l’ordinata positiva. Avendo considerato inoltre, in questo caso particolare, il target sull’asse delle ordinate, la soluzione si semplificherà ulteriormente ottenendo infine:

3. Calcolo dei Movimenti del Target
Dopo aver calcolato la posizione corrente del target, si arriva all’ultima fase dell’algoritmo, ovvero il riconoscimento dei gesti: per farlo basta confrontare la posizione corrente del target con quella ottenuta dall’ultimo campionamento, la differenza delle due ci restituirà una ricostruzione dei movimenti del target. Se, ad esempio, consideriamo i sensori su un piano cartesiano e su quest’ultimo proiettiamo la misura della posizione del target, un valore corrente dell’ascissa maggiore rispetto al valore precedente ci dirà che nel tempo di campionamento del sensore il target si è spostato da sinistra verso destra, allo stesso modo un valore dell’ordinata corrente superiore a quello letto in precedenza ci indicherà un movimento dal basso verso l’alto, mentre un valore corrente uguale al valore passato, ci dirà che il target non si è mosso. Sarà cura dello sviluppatore fissare la risoluzione del dispositivo, ovvero il più piccolo movimento percepibile, che dipende dal montaggio dei sensori e dalla scelta del tempo di campionamento di questi ultimi in funzione dell’applicazione del dispositivo stesso, nonchè la scelta del significato da associare ad ogni gesto rilevato. Ritornando all’esempio precedente, i movimenti dall’alto verso il basso si potrebbero facilmente interpretare come movimenti di scroll, mentre un target fermo potrebbe dare un segnale di pausa all’applicazione.

IDENTIFICAZIONE MEDIANTE LA FASE

In questo caso, a differenza della strategia precedentemente vista, la posizione del target non viene mai calcolata, ovvero, il secondo passo della tecnica precedente non viene mai eseguito. Ciò rende questa tecnica estremamente semplice tanto da un punto di vista computazionale quanto nella scrittura dell’algoritmo. Il funzionamento è abbastanza semplice: basta leggere i sensori ad una certa frequenza che, applicando il teorema di Shannon, dovrà essere almeno il doppio della massima che si vuole rilevare, controllando di volta in volta se ci sono state variazioni nei valori d’uscita dei sensori. Considerando l’esempio mostrato nella Figura 5, supponendo che il movimento della mano sia parallelo al piano che contiene i sensori, quest’ultimo verrà facilmente rilevato dalla lettura dei medesimi; infatti, in un tempo iniziale T0 nessun ricevitore misura variazioni, al tempo T1 il ricevitore R3 misurerà una distanza, al tempo T2 anche il ricevitore R2 misurerà una distanza, al tempo T3 anche il ricevitore R1 misurerà una distanza, al tempo T4 il ricevitore R3 tornerà a non ricevere nulla, etc... Conoscendo i tempi T0, T1, etc.. nonchè le distanze tra i vari sensori nel piano, sarà abbastanza semplice rilevare tutti i movimenti della mano nonchè la dinamica di questi ultimi.

Figura 5: Esempio di Movimento della Mano

Figura 5: Esempio di movimento della mano

Nel caso in esame la mano si sta muovendo da destra verso sinistra del target con una velocità funzione dei tempi misurati e delle distanze planari, tra i sensori.

CONFRONTO TRA LE TECNICHE DI IDENTIFICAZIONE

Come si è visto, le due tecniche differiscono per il calcolo della posizione del target; il calcolo di quest’ultima permette, tuttavia, di creare applicazioni più fini permettendo così di utilizzare il dispositivo touchless per una tipologia di controllori più precisi, ad esempio mentre per uno scroll non c’è molta differenza tra le due tecniche, se invece si volesse premere un tasto con la tecnica dell’identificazione di fase, questa si dimostrerebbe inutile. D’altra parte, l’aspetto negativo, oltre alla maggiore complessità computazionale sta proprio nel calcolo della posizione. Quando si è calcolata quest’ultima, infatti, si è usata la tecnica della triangolazione planare (mediante cerchi) o spaziale (mediante sfere), l’errore sta proprio nell’utilizzo della triangolazione. Gli emettitori, infatti, per ragioni prettamente fisiche, hanno un profilo d’emissione più vicino a quello di un cono che ad una sfera, quindi in pratica al di fuori di un certo range, target troppo vicino o target troppo lontano, l’approssimazione radiale dell’emissione perde di significato e con essa l’utilizzo della triangolazione.

La tecnica mediante l’identificazione di fase, come già detto, è molto più semplice da implementare, ma non calcolando la posizione del target purtroppo riesce a distinguere soltanto un limitatissimo range di gesti, pertanto non si presta affatto ad applicazioni più complesse. In conclusione, la soluzione migliore per le applicazioni touchless consiste nello sviluppo di entrambi gli algoritmi, in questo modo si creerà un sistema in grado di rilevare, molto velocemente, i movimenti più semplici ed allo stesso tempo i movimenti più precisi, lo svantaggio di un approccio simile consiste nel fatto che le tecniche vanno eseguite contemporaneamente, richiedendo alla CPU uno sforzo maggiore rispetto al caso in cui si utilizzi una singola tecnica.

ESEMPIO D’APPLICAZIONE

Dopo aver visto il principio fisico dei sensori di prossimità e le tecniche per la gestione di questi ultimi, concludiamo l’articolo con un esempio pratico, vedremo un semplicissimo sketch per Arduino che si occupa di calcolare la posizione di un target dalla misure rilevate da tre sensori ad infrarossi, nello specifico utilizzeremo il sensore della Sharp GP2D12. Questo dispositivo viene commercializzato in un package contenente all’interno un foto emettitore, un foto resistore e la relativa circuiteria di contorno. Il dispositivo ha un range di funzionamento da 10 a 80 centimetri e restituisce sul proprio pin d’uscita una tensione che decresce al crescere della distanza rilevata, la curva è mostrata nella Figura 6.

Figura 6: Curva Caratteristica del Sensore

Figura 6: Curva caratteristica del sensore

Nella figura appaiono due curve quasi sempre sovrapposte, nello specifico, la curva continua rappresenta la misura eseguita su una superficie molto riflettente come ad esempio un foglio bianco, mentre la linea tratteggiata si riferisce ad una superficie poco riflettente come ad esempio un foglio grigio, le curve non sono lineari e dai 10 cm in poi hanno un andamento quasi parabolico. Useremo tre sensori disposti come mostrato nella Figura 7, sullo stesso piano.

Figura 7: Disposizione dei Sensori

Figura 7: Disposizione dei sensori

Una volta lette le tre misure provenienti dai tre sensori, procederemo al calcolo della posizione del target, come già detto la posizione del target sarà data dall’intersezione delle tre sfere aventi come centro la posizione dei sensori e come raggio le distanze lette, considerando quindi l’equazione della generica sfera:

(x-x0)2+(y-y0)2+(z-z0)2=r2

che è funzione della posizione del proprio centro e del raggio, la posizione del target verrà data dalla soluzione del sistema di equazioni:

Poichè le posizioni dei sensori sono fisse e note, la posizione del target sarà funzione soltanto delle distanze misurate, quindi in questo caso considerando tutte le distanze in centimetri ed i tre centri (1,1,0), (2,2,0) e (3,1,0) la posizione del target sarà, considerando soltanto il semispazio definito dai valori di z positivi, ovviamente tale soluzione vale soltanto per la disposizione dei sensori considerata, nel caso si dovessero cambiare le posizioni dei sensori bisognerebbe risolvere nuovamente il sistema delle tre equazioni, il che normalmente, considerando le tre distanze come variabili simboliche, porta ad una serie di calcoli lunghi e noiosi, per ovviare a questo inconveniente ci viene incontro Wolfram Alpha, una applicazione creata dalla software house Wolfram conosciuta soprattutto per Mathematica, un motore di calcolo matematico utilizzato soprattutto per i calcoli simbolici. Wolfram Alpha, più che un’applicazione è un motore computazionale di conoscenza, ovvero si tratta di un motore di ricerca che in modo “intelligente” interpreta le parole inserite dall’utente e propone una lista di risposte piuttosto che una lista di semplici collegamenti, così se al motore viene indicato un sistema di equazioni in forma simbolica, quest’ultimo ritornerà alla risposta, ovvero la soluzione.

L’accesso all’applicazione è totalmente gratuito, basta connettersi al sito http://www.wolframalpha.com/ ed inserire direttamente le equazioni delle tre sfere, con i relativi valori numerici dei tre centri e i valori simbolici dei tre raggi, separate da una virgola, e il motore provvederà al calcolo della coordinate del target in funzione delle variabili simboliche. A questo punto, prima di scrivere lo sketch resta un’ultima operazione, ovvero interpolare la curva caratteristica del sensore, in maniera tale da ottenere dai valori in tensione i valori delle distanze in centimetri, per farlo ancora una volta ci viene incontro Wolfram Alpha, tramite la funzione Fit, la quale partendo da due insiemi di punti calcola il polinomio di grado desiderato che lega i due insiemi di punti. Ad esempio, nel nostro caso interpoleremo la curva caratteristica come una curva del secondo grado andando a scrivere sulla finestra di ricerca di Alpha la seguente istruzione:

data = {{0.5,65},{0.65,50},{1.35,20},{1.5,15
}}, Fit[data,{1,x,x^2},x]

dove la variabile data contiene un insieme di punti letti dalla curva, la funzione nel nostro caso restituirà i tre coefficienti del polinomio che meglio interpola la curva ottenendo: 39.2157x2 – 126.082x + 117.063. Infine, riportiamo il piccolo sketch scritto per Arduino:

int l1,l2,l3;
float t1,t2,t3;
float d1,d2,d3;
float x,y,z;
void setup() {
}
void loop() {
// Lettura dei Sensori
l1 = analogRead(0);
l2 = analogRead(1);
l3 = analogRead(2);
// Calcolo delle Tensioni
t1 = (l1*5)/1024;
t2 = (l2*5)/1024;
t3 = (l3*5)/1024;
// Calcolo della Distanza in Cm
d1 = 39.2157*t1*t1 - 126.082*t1 + 117.063;
d2 = 39.2157*t2*t2 - 126.082*t2 + 117.063;
d3 = 39.2157*t3*t3 - 126.082*t3 + 117.063;
// Calcolo della Posizione del Target
x = 0.25*(d1-d3+8);
y = 0.25*(d1-2*d2+d3+4);
z = 0.3535*sqrt(-d1*d1+2*d2*d1+4*d1-2*d2*d2-d3*d3+2*d2*d3+4*d3-8);
}
Listato
Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend