• Non ci sono risultati.

3 Sviluppo del modello di controllo

N/A
N/A
Protected

Academic year: 2021

Condividi "3 Sviluppo del modello di controllo"

Copied!
30
0
0

Testo completo

(1)

3 Sviluppo del modello di controllo

In questo capitolo cercheremo di trovare degli algoritmi validi nel caso tridimensionale, estendendo i concetti visti nel capitolo precedente. Quando parleremo di blocco integratore base, faremo pertanto riferimento allo schema discusso nel paragrafo 2.3.5 .

3.1 Calcolo degli angoli di vestizione

Il primo problema che ci apprestiamo a risolvere è quello concernente l’indosso degli occhiali. Come è già stato detto gli accelerometri sono stati montati prendendo come riferimento il piano di appoggio degli occhiali, ed appare improbabile che l’utente riesca ad indossarli in modo da mantenere tale piano parallelo al terreno, di conseguenza avremo che l’orientazione iniziale rimarrà incognita. Pertanto sugli assi x,y non avremo più un uscita nulla, a causa delle componenti dell’accelerazione gravitazionale. Si supponga ad esempio di un sistema di riferimento assoluto a due assi che chiameremo x-z, ed uno ruotato di un angolo α, che chiameremo x'-z’, come quello già visto in figura 2.1.6, la componente del vettore di gravità sull’asse x’, risulterà pertanto pari a

) sin(α ⋅ − = g gx

Potremo pertanto recuperare l’informazione sull’orientazione iniziale inserendo un tasto apposito da premere al momento dell’indosso; assumendo che durante la pressione del pulsante l’orientazione della testa sia orizzontale, o meglio che sia ritenuta tale dall’utente, il tasto azionerà un circuito sì fatto:

1 accel. angolo FILTRI FIR sin − S&H

(2)

I segnali provenienti dagli accelerometri sono posti in ingresso a dei filtri FIR, che implementano una finestra a media mobile di durata 1 secondo. Si suppone che l’utente stia fermo con la testa durante tale tempo. L’uscita dei filtri viene poi campionata, e si procede a calcolare gli angoli di inclinazione mediante la formula: ) / ( sin ) / ( sin 1 1 g a g a y x − = − = − − φ θ

tali tecnica funziona bene per inclinazioni non troppo grandi, infatti il seno ha derivata massima proprio nell’origine, mentre ha derivata nulla quando l’angolo è pari

2

π

.

Ciò vuole dire che, per angoli prossimi allo zero, per piccole variazioni di angolo si hanno grosse variazioni di tensione, e che pertanto nella nostra formula il rumore del dispositivo non darà una grossa variazione sull’angolo calcolato. Tale affermazione non sarà più vera per angoli di valore elevato, quando la derivata del seno tende ad annullarsi, ma è ragionevole pensare che l’utente non sia così maldestro da vestire gli occhiali in maniera così innaturale.

Una volta calcolati gli angoli d’inclinazione si può pertanto effettuare una rotazione moltiplicando il vettore delle accelerazioni per la seguente matrice [3]:

          − − + + − ψ ϑ ψ ϑ ϑ ψ φ ψ ϑ φ ψ φ ψ ϑ φ ϑ φ ψ φ ψ ϑ φ ψ φ ψ ϑ φ ϑ φ C C S C S S C C S S C C S S S C S S S C S C C S S S C C C

dove con C si intende il coseno dell’angolo, mentre con S si intende il seno dell’angolo, e ψ, ϑ , φ rappresentano rispettivamente le rotazioni pitch, roll e yaw.

L’angolo di rotazione yaw, non potrà essere calcolato per via software con tale sistema e verrà pertanto imposto pari a zero. Tale ipotesi non è del tutto errata visto che in una normale vestizione degli occhiali, tale angolo non potrà essere molto elevato: questi dovranno infatti essere appoggiati sul naso.

Il vettore risultato, ci consentirà di recuperare la corretta orientazione della terna di riferimento relativa, come se gli occhiali fossero stati indossati perfettamente rispetto al piano di appoggio.

(3)

3.2 Sviluppo del software d’integrazione spaziale

Abbiamo visto come risolvere il problema dell’integrazione planare, sviluppando un algoritmo d’integrazione ottimale su singolo asse, adesso andremo a trattare il problema esteso in tre dimensioni. Un problema che si riscontra in tale estensione consiste nella presenza del vettore d’accelerazione gravitazionale : tale accelerazione viene misurata insieme a quella dell’utente, e risulta pertanto necessaria la sottrazione di tale vettore, per avere una lettura corretta. Dovremo però tenere di conto che il nostro sistema di riferimento sarà senz’altro ruotato rispetto ad un sistema assoluto dove il vettore di gravità e posizionato solamente lungo l’asse z.

Fig. 3.2.1: vettore di gravità rispetto a sistema assoluta e relativa

In tal modo il vettore di accelerazione gravitazionale verrà scomposto su tre assi del sistema relativo :

z z y y x x i g g i g g i g g ˆ ˆ ˆ ⋅ = ⋅ = ⋅ = r r r

(4)

dove con i , , intendiamo i versori degli assi x, y, z . Dovremo pertanto conoscere gli angoli di rotazione della terna relativa, in modo da poter calcolare le componenti del vettore di gravità sui vari assi e poterle quindi compensare.

x

ˆ

y

z

3.2.1 Monitoraggio dei 6 gradi di libertà

Prenderemo in considerazione ora un corpo rigido la cui posizione nello spazio è definita dal sistema di riferimento Oxyz ad esso solidale. Rispetto a questo riferimento consideriamo la posizione e l’orientazione di tre accelerometri biassiali, i cui piani di sensitività saranno considerati paralleli ad xy, zy, zx. La generica posizione dell’accelerometro rispetto al sistema di riferimento sarà data dal vettore (con ij = xy, zy, zx).

j i a j i r

Supponiamo di aver posizionato gli accelerometri in maniera perfetta sui piani xy,

zx, zy, preso un punto p del corpo rigido generico la sua accelerazione sarà

calcolabile come: ) ( 0 p p p a r r a = +ω•∧ +ω∧ ω∧

dove a0 indica l’accelerazione dell’origine del sistema di riferimento, e ω , indicano rispettivamente la velocità ed accelerazione angolare.

• ω

Volendo calcolare quindi , del sistema di riferimento , scriveremo l’equazione sopra citata tre volte ottenendo:

0 a ω• ) ( ) ( ) ( 0 0 0 zx zx zx yz yz yz xy xy xy r r a a r r a a r r a a ∧ ∧ + ∧ + = ∧ ∧ + ∧ + = ∧ ∧ + ∧ + = • • • ω ω ω ω ω ω ω ω ω

Risolvendo tale sistema di equazione si ottengono i seguenti risultati [6]:

3 3 0 2 2 0 1 1 0 / / / D N a D N a D N a z y x = = = 6 6 5 5 4 4 / / / D N D N D N z y x = = = ω ω ω

(5)

ed esplicitando i valori di numeratore e denominatore: r r a r -r a * r r r1 r r r r -r r a r -r r a r r r r r r r r -r r r 2r -r r r1 2r r r r -r r r r r r r a r r r r r r r r r r r r a r r -r r r r r r r 2r -r r r 2r -r r r 2r r r r -r r r -r r r r r r 2r r r r 2r -r r r 2r a r r r a r r r -a r r r -r r r r -r * r r -r 2r r r r -r r r r r r r r r r a r r -a r r r r r r r a r r -r r r r -r r r r a r r r a r r r -a r r r -r r 2r -r r r -a r r r r r r -r r r -r r r r -r a r r -r a r r r r r -r r 2r r r r r -r r r r r r r r r r 2r -r r r r r r r r r r a r -r r r r r r r r -r r r r -r r r r r r r 2r r r r r r a r r r r 2r r r r 2r -r r 2r -r r r -r r r -r r r r r a -r r r r r r -r r r r 2 -r r a r r r r r r r r 2 -r r r r r r r r r r r -r r r r w 2 r r r r 2 -r r r r 3 2 a r r r r a r r r a -r r r r 2 a r r r r a r r r a -r r r a -r r r a -r r r a r r r a r r r a r r r a -r r r a r r r a r r r a r r r a -r r r a r r r -r r r r r r -r r r r 2 r r r 2 r r r r w 2 r r r 2 -r r r r -r r r r r r r r r r r r -r r r r r r r r 2 -r r r r -r r r r r r r r r r r 1 2y 3x 11 2z 3 32 1y 2z 2y 2r x 2 3 2z 3y 2 1y 2 3 2z 3y 1x 11 2z 2y 1x 11 2 3y 3x 1x 2 3 2z 2y 3x 1x 2 3 2z 3y 3 2 3z 1y 2z 2y 3 2 3z y 2z 3y 2 1y 2 1 2z 2y 2 1y 2 3 2z 2y 2 1y 1 2z 2y 12 1y 2z 2 3z 2 1 1y 2z 2 3y 2 3 1y 2z 2 3y 2 1 1y 2z 2y 32 1y 2z 3z 2 2 2y 1z 2z 2y 1x 1y 1 2 2z 3y 3x 1y 1 2 2z 2y 3x 1y 1 2 2z 3y 2 1x 2 2 2z 3y 1x 2 3 2z 2y 2 1x 2 2 2z 3y 1x 1y 1 2 2z 2y 3 2 1y 1z 2z 3y 3 2 1y 1z 2z 33 3z 1y 2z 23 3z 1y 2z 33 1y 1z 2z 3z 2 2 1y 1z 2z 1z 2 2y 1y 2 1 2 2y 3 2 2 1z 1z 2 2y 1y 2 3 1z 2 y 2 3y 2 3 1z 2y 3y 2 1 3z 2 1 2y 1z 2z 23 2 1z 2y 23 1y 1z 2z 2 3z 2 2 1y 2z 3y 12 1y 2z 2y 3x 1x 2 2 2z 3y 3x 1x 2 2 2z 11 2x 3z 2y 11 3x 3z 2y 11 2x 1z 2y 1z 2 2y 3 2 3z 1z 2 3y 2 3 2y 11 3x 1z 2y 1z 2 3y 2 1 2y 1z 2 3z 2 1 2y 1x 2 3 3x 3z 2y 1z 33 3z 2y 1z 23 3z 2y 1z 2 3z 2 2 2y 1 3 2x 2 1z 2y 1x 2 2 3x 3z 2y 1x 2 2 3x 1z 2y 1x 2 3 3x 1z 2y 1 3 3x 2 1z 2y 1x 2 2 2x 3z 2y 1x 2 3 2x 3z 2y 1z 3y 32 2y 1z 3y 1y 2 3 2y 2z 1y 2 3 2y 2z 3y 1y 2 1 2y 1z 3y 1y 2 1 2y 1z 1 3 3x 3z 2y 3z 2 2 2 1z 2y 1z 3y 12 2y 1z 3y 3 2 3z 2y 1z 1 3 2x 3z 2y 3y 3 2 2 1z 2y 2z 2 1 2 1z 2y 2z 2 2 2 1z 2y 3z 2 1 2 1z 2y 1z 2 2y 12 2 2z 2 2 1y z 1 1y 3z 2 2x 2 3 1z 2y 1x 2x 2 2 3y 3x 11 2z 2 2z 1y 2 1 1z 1y 3x 3z 2z 1 3 1y 1z 2 2x 2 3 2y 3x 1z 2x 2 3 1y 3x 1z 2x 2 3 1y 2x 3z 2z 1 3 1y 2x 1z 2z 1 3 1y 3x 1z 2z 1 33 2 1z 2y 1z 2 2y 32 1z 2y 1x 21 1y 3x 1z 2z 1 3 33 2 1z 2y 1z 2 2y 32 1z 2y 1x 21 1z 3y 3x 21 1y 2x 3z 21 1y 3x 3z 21 1y 2x 1z 21 2y 3x 1z 21 1y 3x 1z 21 1y 3x 3z 21 1y 2x 1z 21 2y 3x 1z 21 1y 3x 1z 21 1z 3y 1x 21 3z 2 2 1y 2 2z 1y 1z 2 2x 2 2 1y 3z 2 2x 2 2 1z 3y 1x 2y 1 2 1z 1x 2 2y 1 2 1z 3y 3x 2y 1 2 3x 1z 2 2y 1 2 1z 3y 3x 2x 2 2 1y 3x 3z 2x 2 2 2y 3x 1z 2x 2 2 1y 3x 1z 2x 2 2 1z 3y 1x 2x 2 2 1z 2y 1x 2x 2 3 1z 3y 3x 2x 2 3 1y 3x 3z 2x 2 3 1z 3y 1x 2x 2 3 3z 2 1 1y 2 2z y z 2 2 2 3y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + − + + + + + + + + + = ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω ω r N 1y 3x 3z 2y 2x 1z 1y 2x 1z 2y 3x 1z 1y 3x 1z 2z 3y 1x 1z 3y 1x 2z 2y 1x 1z 2y 1x 2z 3y 3x 1z 3y 3x z 2 2y 3x 2y 2x 3z 1y 2x 3z 2y 3x 3z r r r r r r -r r r r r 2r r r r -r r r -r r r r r r r r r -r r r r r r -r r r -r r r r r r -r r -r D1 + + + + + + + + =

per brevità vengono riportate solo e (si veda l’appendice per gli altri risultati) . Tali formule possono comunque essere semplificate nel caso in cui le accelerazioni angolari in gioco non siano di valore elevato, tipicamente trascurando il termine 1 N D1 ) ( ∧ri ∧ ω

ω . Tali semplificazioni non sono comunque state studiate a fondo durante lo sviluppo di questa tesi, visto che come vedremo, lo schema sfruttante questa soluzione non è funzionante.

A causa degli errori di montaggio, dovremo a monte correggere la misura data da ciascun accelerometro, moltiplicando per la matrice di rotazione semplicemente calcolabile grazie agli angoli citati e misurati nel paragrafo 2.1. Chiamando aL il

(6)

vettore contenente le accelerazioni di un singolo accelerometro, C la matrice di rotazione ed il vettore d’uscita, avremo:

R B a L R B C a a =

Supponiamo a questo punto di avere una terna di riferimento fissa, ed una relativa posta sulla testa dell’utente, come evidenziato in figura 3.2.1 . Chiameremo x, y, z la posizione rispetto al sistema fisso, ed ψ, θ, ϕ gli angoli di rotazione rispettivamente rispetto agli assi x, y, z, della terna relativa rispetto a quell’assoluta.

Fig. 3.2.2: possibili rotazioni di una terna.

Possiamo pertanto pensare di calcolare gli angoli di rotazione della terna relativa mediante integrazione, ed elaborare una procedura d’integrazione sì fatta:

(7)

0 a ω& 0 0 0 0,ϑ ,ϕ ψ ω& 0 start Calibrazione sensori Lettura Accelerom. Condizioni iniziali ω =0 Calcolo =0 e a . Calcolo di x,y,z ω e ψ,θ,ϕ . ψ,θ,ϕ,ω Lettura Accelerom. Calcolo ψ,θ,ϕ,ω e a . Calcolo di x,y,z ω e ψ,θ,ϕ . si riparte dalla lettura

Fig. 3.2.3: procedura d’integrazione in tre dimensioni

Il calcolo di ψ, θ, ϕ, ω sarà eseguito mediante l’algoritmo d’integrazione visto nel capitolo precedente. Nel calcolo di ω& e a , si dovrà anzitutto effettuare una

rotazione degli assi in base agli angoli precedentemente calcolati, dopodiché si potrà sottrarre all’asse z l’accelerazione gravitazionale, e poi applicare le formule citate, inserendo il valore di

0

ω calcolato nel passo precedente. Si evince pertanto che per funzionare si dovrà effettuare tale procedura ad una frequenza di

(8)

funzionamento di molto superiore ai requisiti di banda, in modo da garantire che in un passo non ci siano state significative variazioni di ω , ψ, θ, ϕ. Nei nostri esperimenti si scelto di far funzionare la procedura alla frequenza di 1 kHz.

Tale procedura seppur teoricamente corretta, porta a due problemi principali che ne impediscono l’utilizzo:

• Aumento del rumore di fondo per ciascuna componente. • Graduale cammino verso l’instabilità

L’aumento del rumore è dovuto al fatto che in ciascun numeratore compaiono le misure di ciascun canale degli accelerometri. Supponendo che tali rumore siano tra loro incorrelati (ipotesi vera per rumori provenienti da dispositivi diversi, non del tutto vera per i rumori provenienti dallo stesso dispositivo), la potenza del rumore totale sarà la somma delle potenze di ciascun canale, e quindi 6 volte maggiore. A livello sperimentale ci siamo accorti che tale numero è in realtà leggermente minore; in ogni caso nella procedura d’integrazione a singolo asse che abbiamo visto, si dovranno aumentare i valori delle dead-zone, con conseguente diminuzione della precisione nella misura.

Problema ancor più grave riguarda la conoscenza degli angoli di posizionamento pitch e roll: la conoscenza di tali angoli è, come visto, fondamentale per l’eliminazione del vettore di gravità; sebbene sia possibile accettare un errore su tale posizionamento, tal errore deve comunque essere limitato. Infatti, un piccolo errore genererà un offset sulla misura lineare di ciascun’asse, che sarà eliminato dalle non linearità, ed avremo inoltre un errore estremamente contenuto nella lettura delle 3 componenti di . Se tale errore però diventa troppo elevato, la dead-zone non riuscirà più a contenere l’offset introdotto da g, ed avremo una lettura completamente sbagliata delle accelerazioni lineari, con un conseguente moto uniformemente accelerato.

0

a

Purtroppo come abbiamo già citato in precedenza, non disponendo di un sistema di riferimento assoluto, sappiamo che dopo qualche rotazione della testa l’errore sull’angolo andrà a crescere, e l’offset su ciascun asse, andrà ad aumentare portando il sistema verso l’instabilità.

Se ne evince quindi che senza un sistema di riferimento fisso, non saremo in grado di calcolare gli angoli d’inclinazione della terna relativa, e pertanto l’orientazione di g.

(9)

A livello sperimentale è stata confermata l’instabilità di tale soluzione ed è pertanto stata scartata; una possibile soluzione può essere trovata cambiando la struttura hardware: l’inserzione di alcuni giroscopi di tipo MEMS, quali gli ADXRS prodotti dalla Analog Devices, potrebbe risolvere tale problema, perché permetterebbe di avere un riferimento fisso grazie al quale avere un errore limitato.

L’inserzione di tali dispositivi però porta ad un notevole innalzamento del costo totale dell’interfaccia, visto che un giroscopio a singolo asse ha un costo totale superiore ai 50$, in futuro però è ragionevole pensare che tale costo cali notevolmente.

3.2.2 Suddivisione in due modalità di funzionamento

Per risolvere i problemi sopra citati, possiamo semplificare il sistema: come è stato discusso nel primo capitolo, un’interfaccia che funzioni in due modalità, una in cui si resta fermi e si può soltanto inclinare la testa ed una in cui si può deambulare ma non ruotare la testa , può comunque adattarsi alle nostre esigenze. Infatti anche se non sarà possibile effettuare rotazioni di tipo yaw mentre si cammina, tale cosa potrà essere risolta in due tempi cambiando il tipo di modalità di navigazione.

L’utente potrà ad esempio muoversi mantenendo la testa ferma, ed una volta fermatosi ruotare lo sguardo inclinando la testa.

L’idea che guida tale semplificazione consta nel fatto che se l’utente è fermo, e ruota soltanto la testa, le accelerazioni in gioco saranno in modulo molto minore al vettore di gravità e potranno pertanto essere trascurate: parleremo pertanto di modalità statica. Se invece l’utente cammina non ruotando la testa, ci ricondurremo ad un caso molto simile al caso planare già discusso: chiameremo questo tipo di modalità dinamica.

In tal modo diminuiremo i gradi di libertà relativi, passando da sei a due (in entrambe le modalità), con una notevole semplificazione della complessità del sistema.

(10)

3.3 La modalità statica

3.3.1 Possibilità di navigazione

In tale modalità l’utente sta fermo, tipicamente seduto, davanti allo schermo sul quale è proiettato l’ambiente virtuale.

Le possibilità di navigazione di tale modalità sono principalmente due, e dipendono dal tipo di associazione che si vuol dare all’inclinazione della testa:

• InclinazioneÅÆSpostamento • InclinazioneÅÆRotazione di visuale

Se si sceglie la prima, l’utente si sposterà nell’ambiente inclinando la testa. Sarà possibile spostarsi lateralmente effettuando rotazioni di tipo roll, e frontalmente con rotazioni di tipo pitch.

Si potrebbe anche scegliere di non spostarsi, bensì di ruotare lo sguardo nell’ambiente: in tal modo l’utente potrà ruotare lo sguardo verso sinistra, inclinando la testa nella stessa direzione, oppure ruotare la visuale in alto o in basso, sempre inclinando la testa nella direzione opportuna.

Tale scelta andrà fatta in base al tipo di applicazione in cui intenderemo usare la nostra interfaccia.

3.3.2 Calcolo dell’angolo d’inclinazione

Si supponga che l’utente sia fermo, e si prenda un sistema di riferimento fisso a due assi come in figura.

(11)

Considerando trascurabile l’accelerazione dovuta alla rotazione della testa, rispetto al vettore di gravita`.L’angolo d’inclinazione rispetto a tali assi sarà così calcolabile:       = − z x a a 1 tan α

tale formula può andar bene se siamo in presenza di una rotazione rispetto ad un singolo asse, mentre non sarà completamente esatta se contemporaneamente vi è una rotazione anche rispetto all’asse y. L’errore non sarà comunque di valore molto elevato, se vi è una rotazione dominante, ed una di angolo trascurabile: tale situazione è quella che si verifica nella realtà visto e considerato, che è molto difficile effettuare con la testa due rotazioni rispetto ad assi differenti, entrambe di valore elevato, ed è in ogni caso priva di senso visto che si perderebbe la visuale dello schermo. Bisogna inoltre ricordare che per i nostri scopi, come più volte detto, non è necessario avere una misura accurata, bensì, soltanto una stima degli angoli.

Una volta calcolati gli angoli potremo pertanto associare a tali angoli, moltiplicati per un fattore opportuno, dipendente dall’applicazione, o una velocità oppure direttamente l’angolo di rotazione della visuale.

Se nella nostra applicazione si vuole ad esempio associare una traslazione all’inclinazione della testa, dovremo utilizzare il seguente schema:

(12)

Ancora una volta l’introduzione di una dead-zone è fondamentale, se si vuole che tutte le rotazioni involontarie della testa non siano percepite. Un valore ragionevole dell’ampiezza di tale dead-zone è 5 gradi, ma potrebbe essere scelto diversamente a seconda del tipo di applicazione. I valori X ed Y così ricavati possono essere associati sia alla posizione vera e propria, oppure all’angolo di visualizzazione dell’ambiente. In entrambi i casi si dovrà scegliere un opportuno valore del guadagno A, che determina la sensibilità del nostro dispositivo. Tale valore è dipendente sia dalle preferenze dell’utente, ma sopratutto dalla grandezza dell’ambiente virtuale: se ad esempio l’ambiente è molto grande, si vorranno complessivamente delle velocità abbastanza elevate, in modo da potersi spostare da una parte all’altra in tempi ragionevoli. Nel nostro ambiente di prova, è stato impostato il valore 1/5.

Un altro schema di controllo possibile, potrebbe essere quello già visto, privato però dei due integratori. In tal modo si andrebbe ad associare la posizione direttamente all’angolo d’inclinazione; questa soluzione porta però degli inconvenienti

• Elevata sensibilità se l’ambiente è grande • Difficoltà nel mantenere ferma la posizione

A differenza del caso precedente, la sensibilità è intesa ora in termini di posizione: un’elevata sensibilità ci porterà pertanto ad avere delle grosse variazioni di posizione, per piccole variazioni d’inclinazione, provocando nella pratica una visualizzazione a scatti particolarmente fastidiosa. Inoltre se si vuole mantenere ferma la posizione, l’utente dovrà restare con la testa inclinata, e quindi in una posizione piuttosto scomoda.

A fronte di tali problemi si è preferita la prima soluzione, a quest’ultima citata, ma non è escluso che possano esistere delle applicazioni in cui l’associazione inclinazione-posizione possa risultare più vantaggiosa.

3.4 La modalità dinamica

Andremo adesso ad occuparci della modalità dinamica: ciò che vogliamo è che l’utente cammini tenendo la testa ferma, per quanto possibile, e che la nostra interfaccia riesca a dare una stima dello spostamento effettuato. Il problema che

(13)

abbiamo di fronte è quello di avere un sistema di riferimento relativo non fisso, in quanto nonostante l’utente cerchi di mantenere la testa ferma, ci saranno comunque delle rotazioni anche se di valore non molto elevato, che comporteranno una variazione dei valori letti, particolarmente dannosa una volta integrati.

Andiamo ad esempio a riesaminare in figura i valori letti dall’asse di un accelerometro, durante una camminata, con testa ferma.

2 3 1 0 -1 -2 -3 Accel era zione ( m/s^2 )

Fig. 3.4.1: accelerazioni registrate durante un movimento

Come è stato evidenziato l’utente ha compiuto due passi in avanti (in direzione dello schermo), e poi due indietro; salta subito all’occhio però una variazione del valor medio, ovviamente dovuta ad un cambio d’inclinazione della testa, che ci porta pertanto a dover studiare un ulteriore schema di controllo: tale segnale infatti così come è non potrà essere direttamente mandato al blocco integratore.

3.4.1 Calcolo dell’angolo d’inclinazione dinamico

Prendiamo un sistema di assi di riferimento assoluto, ed uno relativo ruotato di un angolo α; si prenda inoltre un accelerazione diretta lungo un’asse del sistema assoluto, e l’accelerazione gravitazionale, diretta lungo l’asse z di tale sistema di riferimento.

(14)

Fig. 3.4.2 : accelerazioni rispetto alla terna ruotata

Nel sistema di riferimento assoluto avremo

) sin( ) cos( ) sin( ) cos( α α α α ⋅ − ⋅ = ⋅ + ⋅ = ∧ ∧ x z z x x a a a g a a

da cui è facilmente ricavabile

2 2 2 a g a ax = x + z − ∧

Pertanto siamo in grado di calcolare con facilità il modulo dell’accelerazione, indipendentemente dall’angolo di rotazione della terna relativa. Ci mancano però informazioni sul verso e sul segno di tale accelerazione; il problema del verso non è particolarmente grave, infatti si può imporre, in prima ipotesi, un ulteriore vincolo all’utente, costringendolo ad effettuare soltanto spostamenti lungo uno degli assi relativi (x o y): tale ipotesi sarà eventualmente rimossa in seguito. Grazie a tale semplificazione risulta banale capire la direzione dello spostamento, infatti un asse darà un segnale quasi nullo, mentre l’altro sarà l’asse di movimento.

Purtroppo però non è possibile conoscere il segno dello spostamento, se non si conosce l’angolo d’inclinazione della terna relativa.

Chiamiamo quindi x z a a tg ∧ = ) (β

(15)

ovvero avremo ) (β tg a az = x⋅ ∧ ∧ e potremo quindi scrivere

(

sin( β)cos(α)+cos( β)sin(α)

)

= − ⋅cos(β) ⋅

g ax

esplicitando quindi l’angolo α, avremo

( )

        − + − = − x a g β β α sin 1 cos

tale equazione ha però due soluzioni possibili, per chiarire meglio le cose andiamo ad osservare la figura, indicheremo i due angoli di rotazione con αi e con aˆxi,aˆyi le letture sulle due terne ruotate :

Fig. 3.4.3: le due soluzioni dell’equazione

come si vede si ottiene una situazione di identica lettura sugli assi relativi, ruotando la prima soluzione per un angolo pari a 

     − g ax 1 tan 2 ; si può pertanto pensare di usare una procedura di questo tipo:

(16)

start Lettura Acceler. Calcolo α12. Scelgo α più vicino al precedente

Fig. 3.4.4: procedura per il calcolo del giusto angolo

L’idea base sta nel fatto che l’angolo non potrà variare di molto tra un passo di procedura e il successivo, se la frequenza di campionamento è abbastanza alta (come sempre 1 kHz sarà sufficiente), e come angolo iniziale basterà scegliere l’angolo calcolato in maniera statica.

Una volta noto l’angolo della terna, sarà banale effettuare una rotazione di assi, e poter quindi ricavare la lettura corretta, avendo infatti sull’asse x ruotato, il valore corretto in modulo e segno. Tale tecnica è stata provata a livello sperimentale notando però dei notevoli errori di segno. La cosa è facilmente spiegabile: la distanza dei 2 angoli α1,α è proporzionale al modulo di a . Per accelerazioni molto piccole, avremo quindi che i 2 angoli saranno molto vicini (al limite se = 0, saranno sovrapposti visto che la rotazione sarà pari a 2π), e quindi facilmente confondibili. Un errore effettuato ad inizio procedura può poi propagarsi nel tempo: avendo scelto l’angolo sbagliato, sarà infatti molto probabile che al passo successivo si scelga ancora una volta l’angolo sbagliato, trovando così dei segni completamente casuali.

2 x

x

a

Si è dunque scelto di abbandonare questa strada, visto che qualunque artifizio matematico si adotti, rimane comunque il problema del segno, e si è tentato un’altro tipo di approccio.

(17)

3.4.2 Separazione frequenziale rotazione-movimento

ono da circa 0.5 Hz ed arrivano fino ai 20 Hz, eppure osservando la figura 3.4.5 ( l’utente ha compiuto due passi in avanti,due indietro ed ancora due in avanti, finendo con un singolo passo indietro ed uno in avanti) si possono facilmente notare delle Le frequenze del segnale d’interesse, come abbiamo già detto, part

componenti a bassa frequenza:

tempo (s)

(m/s^2

)

Fig. 3.4.5: accelerazione registrata su alcuni passi

Tali componen testa che un

utente inevitabilmente compie e possono essere considerate come dei disturbi. La frequenze di tali disturbi sono abbastanza basse, dato il limite che si è imposto all’utente (di non muovere la testa) ed è ragionevole pensare che agiscano mediamente sotto la frequenza di 1Hz .

Può pertanto nascere l’idea di usare dei filtri , in modo da separare il segnale dal disturbo. Filtrando con un passa alto con frequenza di taglio 0.5 Hz e facendo

Accel

era

zione

ti sono introdotte dalle rotazioni involontarie della

(18)

Fig. 3.4.6: accelerazione filtrata passa alto

Accel

. (

m/s^2

)

Come si capisce facilmente, tale segnale non può essere mandato direttamente al blocco integratore, visto che come sempre i transitori introdotti dai filtri causerebbero degli effetti visivi veramente sgradevoli, e che in ogni caso il segnale non presenta media nulla come si vorrebbe; ciò nonostante si nota che con tale filtraggio si riesce a capire bene, almeno a livello visivo, quale è stato lo spostamento dell’utente, e pertanto possiamo cercare di sfruttare in qualche modo questo risultato.

3.4.3 La ricostruzione del passo

Vogliamo a questo punto creare una rete che riceva in ingresso un segnale filtrato come quello in figura 3.4.5, e che riesca a dare una stima dello spostamento dell’utente.

Dobbiamo anzitutto riuscire a distinguere tra accelerazione sostenuta e piccole variazioni della testa mentre l’utente è fermo: anche se tali variazioni saranno compensate dal filtro passa alto incorrerà un certo lasso di tempo seppur a fin che rientrino all’interno della zona morta. Per eliminare tali disturbi è possibile sfruttare il seguente schema:

(19)

Fig. 3.4.7: schema per l’eliminazione dei disturbi

L’accelerazione viene separata in positiva e negativa, e ciascuna delle 2 parti è integrata singolarmente, in modo da considerare. Gli integratori vengono resettati da un’onda quadra di periodo 0.2 secondi, in tal modo, ponendo immediatamente a valle dell’uscita una dead-zone di valore 0.1 solo le accelerazione sostenute per un periodo di tempo abbastanza a lungo passano in uscita, mentre quasi tutti i disturbi sono azzerati.

dV (m/s)

Fig. 3.4.8: uscita della dead-zone

Come è facile notare dal segnale si può intuire piuttosto bene lo spostamento compiuto dall’utente, anche se il segnale non è ancora a media nulla e,ed inoltre

(20)

compaiono alcuni valori non desiderati (che nella figura sono cerchiati in rosso). Tali valori sono introdotti dal filtro passo alto: si deve infatti considerare che se è vero che in posizione ferma l’utente riesce a star fermo non compiendo grossi movimenti con la testa, durante il movimento tali movimenti saranno invece molto più marcati.

Si pensi ad esempio che se un utente guarda fisso verso un punto del monitor, avvicinandosi allo schermo dovrà inevitabilmente inclinare la testa, per mantenere lo sguardo fisso sul solito punto, causando quindi una variazione del valor medio consistente, che il filtro impiegherà molto tempo per azzerare. In tal modo si viene quindi a creare una fase di accelerazione (o decelerazione a seconda del tipo di passo), fittizia che si andrebbe a vedere alla fine di ogni passo. Tale problema è però risolvibile considerando che tale fase di accelerazione non è seguita dalla relativa fase di decelerazione, ed quindi possibile eliminarla usando una opportuna macchina a stati. Nel nostro caso abbiamo scelto un’implementazione con cinque blocchi in parallelo che hanno le seguenti funzioni:

• Calcolo della presenza o assenza di un passo + memorizzazione dell’integrale

• Imposizione sulla velocità della media nulla + calcolo della posizione • Anticipo dell’aggiornamento della posizione

• Blocco di correzione • Blocco di reset

(21)

;

Fig. 3.4.9: schema del blocco numero uno

Riportiamo nella tabella la descrizione dei vari stati del blocco:

STATO DESCRIZIONE FERMO si attende che l’accelerazione diventi non nulla, si azzerano tutte

le variabili in gioco; uscendo da tale stato viene memorizzato il segno dell’accelerazione.

PASSOACC si aggiorna il valore dell’integrale della fase d’accelerazione ed il relativo tempo; se l’accelerazione cambia di segno si passa allo stato PASSODEC , se l’accelerazione diventa nulla si passa allo stato ZERO.

(22)

ZERO viene incrementata una variabile contatore; se tale variabile supera il valore di soglia si ritorna nello stato FERMO,se vi è cambio di segno si passa allo stato PASSODEC, e se

l’accelerazione torna non nulla senza cambiare di segno si ritorna allo stato PASSOACC

PASSODEC viene settata la variabile startmov e viene aggiornato il valore dell’integrale della fase di decelerazione, ed il relativo tempo; se l’accelerazione diventa nulla si passa allo stato ZERO2, se cambia di segno si passa allo stato WAIT_3 settando la variabile finepas.

ZERO2 Viene incrementata una variabile contatore; se tale variabile supera il valore di soglia o se l’accelerazione cambia di segno si passa allo stato WAIT_3 settando la variabile finepas.

WAIT_3 Si aspettano tre cicli di clock, e si ritorna allo stato fermo.

Tale blocco provvede pertanto a riconoscere la presenza di un passo, che viene segnalato tramite il settaggio della variabile startmov, e ne viene segnalata la fine con il settaggio della variabile finepas. Vengono inoltre memorizzati i valori degli integrali di accelerazione e decelerazione e le rispettive durate (tali variabili sono sfruttate dagli altri blocchi).

Si noti come grazie alla memorizzazione del segno, il settaggio della variabile startmov avvenga solo dopo che ad una fase di accelerazione sia seguita una di decelerazione; tale settaggio fa partire il secondo blocco che è riportato di seguito

(23)

STATO DESCRIZIONE WAIT Vengono azzerate tutte le variabili locali del blocco, e si attende

che venga settata la variabile finepas per passare allo stato INIZIO.

INIZIO Vengono fatte le medie dei tempi delle fasi di accelerazione e decelerazione e delle rispettive velocità. Si passa quindi allo stato ACC.

ACC Si calcola l’integrale della velocità, moltiplicando per 10 quest’ultima e dividendo per 10 il tempo di campionamento. Si aggiorna l’uscita e si incrementa la variabile contatore; quando questa supera il tempo medio calcolato nella stato inizio si passa allo stato DEC .

(24)

DEC Si calcola l’integrale nel medesimo modo dello stato dello stato precedente ma invertendo i segni. Si aggiorna l’uscita e si incrementa la variabile contatore; quando questa supera il tempo medio calcolato nella stato inizio si ritorna allo stato WAIT .

Tale blocco impone che la velocità sia a media nulla, e calcola la posizione in maniera veloce decimando il tempo di campionamento e decuplicando il valore della velocità: tale tecnica è fondamentale se si vuole essere sicuri che il blocco sia in stato di WAIT quando il blocco principale setta la variabile finepas, visto che così facendo la posizione viene calcolata dieci volte più velocemente.

I due blocchi appena descritti sono gli unici fondamentali per il funzionamento corretto della rete, ma sono state aggiunte altri tre blocchi che implementano alcune utili funzionalità aggiuntive. In particolare viene implementata una funzionalità che ha lo scopo di ridurre un grave problema che affligge la rete, ovvero il ritardo di aggiornamento della posizione.

Tale macchina a stati infatti non può funzionare in tempo reale visto che l’aggiornamento della posizione viene effettuato solo dopo la fine di un passo (ovvero quando viene settata la variabile finepas). Si può ridurre tale ritardo iniziando ad aggiornare la posizione nel momento in cui si è riconosciuta la presenza di un passo, ovvero quando viene settata la variabile startmov, ed eventualmente andando a correggere tale posizione nel momento in cui inizia a calcolare la posizione il blocco numero due. Tale funzione è implementata in maniera molto semplice ed intuitiva dai blocchi tre e quattro, mentre il blocco 5 ha il compito di azzerare la posizione nel caso venga settato il segnale di reset.

(25)

Fig. 3.4.11: schema dei blocchi opzionali

Con tale rete siamo pertanto in grado di ricostruire i passi effettuati, anche se ovviamente abbiamo perso gran parte dell’informazione sul modulo, ottenendo quindi una scarsa precisione. Ciò nonostante siamo in grado di distinguere tra passi lunghi e passi brevi, visto che un passo breve avrà in totale un’area più piccola, di uno lungo il che è, come già detto, più che sufficiente ai nostri scopi. Di seguito viene riportato l’uscita della rete con ingresso il segnale di figura 3.4.8

Accel . ( m/s^2 ) / Po si zion e

(26)

L’ultimo problema da risolvere sta nel fatto che la nostra rete agisce in ritardo, entrando in azione dopo circa metà passo, perdendo quindi la possibilità di elaborazione in tempo reale.

3.4.4 Il recupero del tempo reale

Se si hanno a disposizione due reti di controllo, una non precisa ma che agisce in tempo reale, che chiameremo A ed una invece precisa che agisce in ritardo, che chiameremo B, si può pensare di sfruttarle entrambe in uno schema come il seguente RETE A posizione + RETE B

Fig. 3.4.13: schema di una rete per il recupero del tempo reale

Scegliendo accuratamente la frequenza di polo dei filtri si otterrà che la rete “precisa”, agirà subito, ma la sua uscita verrà resettata dal filtro passa alto, e nel medesimo tempo entrerà in gioco la rete precisa che tenderà a correggere tale posizione e portarla al valore giusto.

La rete non precisa dovrà pertanto soltanto trovare inizialmente il segno giusto dello spostamento,e poi potrà anche perdere completamente il segno. Possiamo pertanto sfruttare come rete non precisa l’integratore planare che riceve in ingresso il segnale filtrato passa alto

Tale rete non è in grado di calcolare la posizione esatta, per i problemi già citati in precedenza, ma riesce comunque a trovare, almeno inizialmente, il verso giusto dello spostamento. Pertanto si può usarla nella configurazione vista in figura 3.4.13 per recuperare il funzionamento in tempo reale.

(27)

Nel nostro caso si è scelto le frequenze dei poli pari a 6 Hz ;

di seguito riportiamo il risultato ottenuto ponendo in ingresso le accelerazioni registrate facendo i due passi avanti ed indietro (fig 3.4.1)

Fig. 3.4.14: uscita con recupero del tempo reale

Come si vede vi è un miglioramento nei tempi di entrata in funzione della rete, talvolta anticipata anche di un secondo; tale anticipo migliora notevolmente l’effetto visivo dando quasi una sensazione di spostamento in tempo reale (anche se è ancora possibile percepire un piccolo ritardo).

Dobbiamo comunque far notare che vi è un certo tempo di stabilizzazione alla fine del passo a causa dei transitori introdotti dai filtri.

(28)

Fig. 3.4.15: dettaglio di un fenomeno indesiderato

Tale effetto non è molto fastidioso a livello visivo dato che la variazione è piuttosto lenta e di breve durata, e può essere accettato come compromesso per il recupero dell’elaborazione in tempo reale.

(29)

3.5 Lo schema di controllo completo

Riportiamo di seguito lo schema di controllo completo implementato:

Fig. 3.5.1: schema di controllo completo

Il blocco Static Calib Glass ha il compito di trasformare i segnali provenienti in accelerometri nelle tre componenti di accelerazione lineare. A tal fine effettuerà la conversione VoltÆm/s tramite la seguente formula : 2

      − = i i i i sens off a acc 9.81*

dove con abbiamo indicato l’accelerazione espressa in m/s , con il segnale proveniente dall’i-esimo canale, e con e l’offset e la sensitività di tale canale (si veda il capitolo quattro per maggiori dettagli).

i acc 2 i a i off sensi

Una volta effettuata la conversione ogni coppia di canali provenienti dallo stesso dispositivo verrà moltiplicata per l’opportuna matrice di rotazione

      −sin( ) cos( ) ) sin( ) cos( i i i i α α α α

(30)

Nello schema di controllo finale la coppia di segnali a , a non è stata usata così come è rimasto inutilizzato il canale , tali segnali erano infatti utili solo nello schema usato per il monitoraggio di tutti e sei i gradi di libertà.

2 y z2 2

x

a

Il blocco Initial Rotation, implementa lo schema visto nella didascalia 3.1.1, e viene azionato dal tasto Initial Button; il blocco Matrix Rotation riceve in ingresso gli angoli calcolati da tale blocco, e ruota le accelerazioni che arrivano dal blocco di calibrazione.

Vengono poi implementate le funzioni statiche e dinamiche descritte nei paragrafi precedenti dai relativi blocchi, e viene scelta l’uscita giusta in base al tasto Mode. Si noti la presenza del tasto di reset che va in ingresso ai blocchi Static e

Figura

Fig. 3.1.1: schema del circuito per il calcolo dell’angolo iniziale
Fig. 3.2.1:  vettore di gravità rispetto a sistema assoluta e relativa
Fig. 3.2.2:  possibili rotazioni di una terna.
Fig. 3.2.3:  procedura d’integrazione in tre dimensioni
+7

Riferimenti

Documenti correlati

In figura 5.10 si può osservare come a circa 4 secondi, quando TL1>TL2, c’è un’oscillazione di velocità sui motori con entrambe le tecniche; con la tecnica 1 ci si discosta molto

Quando si presentano applicazioni in regime laminare con scambio di calore, gli static mixer possono favorire lo scambio rispetto al classico tubo vuoto o senza

i principali indicatori sono il valor medio <v.a.>, indicato anche come ,. centralita’ e

Vediamo come si dimostra questo teorema, sostanzialmente usando il Teorema di Weierstrass (il teorema di Lagrange si dimostra in modo simile, solo risulta un po’ pi`u complicata

[r]

Il gambero parte da 0 e fa quindici salti in avanti, poi ne fa cinque indietro... Il gambero parte da 0 e fa diciannove salti in avanti, poi ne fa

La derivata parziale della funzione rispetto a x, (indicata con il simbolo corsivo per non confonderla con la derivata totale), è definita come la. derivata della funzione

La critica storica si è molto occupata dell’analisi stilistica di queste sculture, indagandone la fattura, le reciproche influenze stilistiche e la cronologia 28. Solo in tempi più