Esercizi VI 1 ESERCIZI VI TARATURA DI SISTEMI INERZIALI Esercizio I.1. Introduzione Lo scopo della presente esercitazione è di implementare diverse tecniche di taratura per i sensori inerziali che equipaggiano le IMU. Esercizio I.2. Taratura statica di un accelerometro MEMS monoassiale. [file di riferimento: accel_mono.m] Nel file accel_data_monoaxial.mat sono salvati i segnali in uscita dall accelerometro monoassiale in corrispondenza di ingressi pari a g e g. Si elabori lo script accel_mono.m per ricavare i valori di S (V/g) e di O (V). edit accel_mono Per un accelerometro monoassiale si ha: V S( g) O (I.1) Per cui indicando con: V S( g) O 1 V S( g) O 2 (I.2) è possibile ricavare S ed O: O 2 2 V V V V S 1 2 1 2 (I.3) accel_mono.m load accel_data_monoaxial; %carica i dati salvati (V_g e V_menog; sono entrambi nfx1); V1=%ottengo il valore medio sui frame del segnale d'uscita in modo da minimizzare l'effetto del rumore V2= %ottengo il valore medio sui frame del segnale d'uscita in modo da minimizzare l'effetto del rumore S=%calcolare la sensibilità O=%calcolare l offset
0: Taratura di un accelerometro MEMS triassiale, in maniera non ridondante. 2 Esercizio I.3. Taratura di un accelerometro MEMS triassiale, in maniera non ridondante. [file di riferimento: ] Nel file accel_data_triaxial.mat sono salvati i segnali in uscita (variabile V [nfx3xnp]) dall accelerometro corrispondenti a sei diverse posizioni, secondo la tabella 1. Si implementi lo script accel.m per il calcolo della matrice S [V/g] di sensibilità ed il vettore O [V] di offset, utilizzando i dati relativi alle prime quattro posizioni. Si utilizzino poi le restanti due posizioni per la verifica. Ricavare inoltre i versori stimati I I I ns 1 n s2 n s3, e verificare l ortogonalità dei tre versori. Tabella 1 roll ( ) pitch ( ) 0 0 90 0 0 90-90 0 0-90 180 0 edit accel_tri Taratura Occorre pertanto ricavare i valori di 9 incognite scalari per la matrice S e tre per il vettore O, occorreranno pertanto 12 equazioni scalari, corrispondenti a 4 equazioni vettoriali. L espressione da implementare è: I I I I 1 gˆ ˆ ˆ ˆ 1 g2 g3 g 4 1 2 3 4 S O V V V V (I.4) 1 1 1 1 Dove:
0: Taratura di un accelerometro MEMS triassiale, in maniera non ridondante. 3 0 s g R g R cs (I.5) 1 cc I I 0 T ˆ 0 zyx 0 Infatti trattandosi di angoli intorno ad assi fissi la matrice di rotazione si esprime come: c c s s c c s c s c s s R zyx R z ( ) R y ( ) R x( ) c s s s s c c c s s s c s s c c c (I.6) La prima cosa da fare è costruire la matrice V dai segnali salvati nel file. Per ogni posizione è stata acquisita la tensione in uscita dai tre canali per qualche secondo, e memorizzata nella variabile V; è necessario pertanto mediare l uscita lungo i frame: clear all; load accel_data_triaxial; %carica i dati relativi alle sei posizioni (V [nfx3xnp]); V= %media sui frame per ridurre il rumore V=permute%V diventa una [3xnp] V_t=V(%utilizzo per la taratura solo le prime 4 posizioni V_c=V(%memorizzo gli ultimi 2 vettori di tensione per la verifica Dalla tabella si costruiscono i valori di e necessari a ricavare la matrice G mediante la formula: I I I I gˆ ˆ ˆ ˆ 1 g2 g3 g 4 G 1 1 1 1 (I.7) phi=[0 pi/2 0 -pi/2 0 pi]'; %costruisco il vettore phi secondo la tabella (pi è una costante già presente in MATLAB) theta=[0 0 pi/2 0 -pi/2 0]'; %costruisco il vettore theta G=cat(2,-sin(theta),; %si costruisce la trasposta della matrice delle posizioni A G=G'; %traspongo G( %si aggiunge la quarta riga di 1 G_t=G(:, %utilizzo per la taratura solo le prime 4 posizioni Si ricava S O dalla (V.4): B= %ricavo la matrice che contiene sensibilità e offset S= %estraggo la matrice S O=%estraggo il vattore di offset
0: Taratura di un accelerometro MEMS triassiale, in maniera ridondante. 4 L ortogonalità si verifica ricavando gli angoli formati dai versori. Ricordando che: I I I S Sx ns 1 S y ns2 S z n s3 (I.8) Pertanto calcolando modulo e versore di ogni colonna di S è possibile ricavare i versori e le sensibilità dei singoli assi: [S_x n_1]=%ricavo modulo e versore [S_y n_2]= %ricavo modulo e versore [S_z n_3]= %ricavo modulo e versore alfa=acos(dot( %calcolo l'angolo in gradi di disallineamento tra n_1 ed n_2 beta=acos(dot( %calcolo l'angolo in gradi di disallineamento tra n_2 ed n_3 gamma=acos(dot( %calcolo l'angolo in gradi di disallineamento tra n_3 ed n_1 Verifica Verifichiamo ora la calibrazione utilizzando le altre due posizioni. Occorre valutare l errore tra gli angoli di inclinazione stimati e quelli noti. Gli angoli stimati si ottengono dai versori ĝ mediante la VII.5. I versori ĝ,invece, si ottengono dalla: 0 ˆ g R 0 S V O (I.9) 1 I I 1 0 G_c=S^-1*( %valori di inclinazione stimati per le due posizioni restanti theta_stim=atan2(-%ricavo i due valori di theta (in radianti!) phi_stim=atan2(; %ricavo i due valori di phi (in radianti!) theta_stim= %esprimo theta in gradi phi_stim= %esprimo phi in gradi È possibile notare come il valore di stimato per l ultima posizione presenti un errore inaccettabile. Ciò è dovuto ai limite della rappresentazione minimale (gimbal lock), che si raggiunge nel caso in cui è prossimo a, come nel caso della quinta 2 posizione. A questo punto salvo le variabili V e G per il prossimo esercizio: save('dati_cal','v','g'); Esercizio I.4. Taratura di un accelerometro MEMS triassiale, in maniera ridondante. [file di riferimento: accel_tri_ls.m]
0: Calibrazione di un giroscopio MEMS monoassiale. 5 Si esegua, mediante implementazione dello script accel_tri_ls.m, la calibrazione del sensore utilizzando i segnali acquisiti in tutte e sei le posizioni. Si calcolino infine i residui: ˆ V ˆ S O G. V V, con edit accel_tri_ls clear all load dati_cal %carico le matrici V e A dell'esercizio precedente nel workspace accel_tri_ls.m In questo caso si utilizzano tutte le posizioni di misura e per questo la matrice G non è più quadrata. Per ricavare S e O occorre utilizzare la pseudo-inversa: B= %oppure più semplicemente B=V*pinv(A) S= %calcolare sensibilità O= %calcolare offset accel_tri_ls.m Si calcolano i residui: V_stim= %calcolare l output stimato res=v- %calcolare il residuo accel_tri_ls.m Esercizio I.5. Calibrazione di un giroscopio MEMS monoassiale. [file di riferimento: gyro_calibration.m, integral.m] Nei file gyro_data.mat sono salvati i segnali in uscita dal giroscopio nel caso statico (variabile V_fixed [nfx1]) e durante una rotazione di 90 (variabile V_rot [nfx1]), con t1 e t2 sono registrati gli istanti di inizio e fine della rotazione. Si utilizzino i file per ottenere il valore di sensibilità [Vs/ ] ed il valore di offset [V], implementando lo script gyro_calibration.m. Si riporti infine l andamento del segnale giroscopico [ /s] durante la prova di rotazione; e l andamento del segnale integrato [ ] nel tempo edit gyro_calibration Ricordando che per un giroscopio monoassiale si ha: V S O (I.10)
0: Calibrazione di un giroscopio MEMS monoassiale. 6 Essendo: t2 z zdt t1 (I.11) dalla (V.10) si ottiene: t2 V O z dt t 1 S (I.12) e quindi: t2 S ( V O) dt z t1 (I.13) gyro_calibration.m clear all load gyro_data %caricare il dato del giroscopio O=mean %calcolare offset f1= %ricavo il frame di inizio rotazione f2= %ricavo il frame di fine rotazione theta=pi/2; S=trapz( %la funzione trapz calcola l'integrale definito mediante integrazione trapezoidale S=S*; %esprimo S in Vs/ Per poter effettuare la verifica è necessario scrivere una funzione che permetta di ricavare il segnale integrato: edit integral function z=integral(b,fs); integral.m z=nan(length(b),1); %inizializzo z for i=1:length(b); if i==1 ; z(i)=0; %l'integrale parte da zero else z(i)=z(i-1)+trapz( %l iesimo valore di z è pari all area sottesa dal segnale b tra zero e b(i) end; end; A questo punto: V O S (I.14) e:
0: Calibrazione di un giroscopio MEMS monoassiale. 7 V O dt S (I.15) nf=size(v_rot,1); t=(%costruisco il vettore tempo omega=(v_rot %esprimo il segnale calibrato in gradi/s figure plot %grafico di omega nel tempo theta=integral( figure plot( %grafico di theta nel tempo Figura 1. Grafico della velocità angolare misurata[ /s] durante la prova.
0: Calibrazione di un giroscopio MEMS monoassiale. 8 Figura 2. Grafico dell angolo di rotazione [ ] durante la prova.