Cambiare il sistema di coordinate cartesiane in 3D
Ciao a tutti!
Sono 3 giorni che sto cercando di scervellarmi per risolvere questo problema. Provo a spiegarmi.
Ho montato un sensore che misura l'accelerazione su tre assi che chiamerò x,y,z. Ipotizzando di montare il sensore in modo che ogni asse sia diverso dal sistema di riferimento xrif, yrif, zrif, ho applicato le formule per calcolare gli angoli tra ognuno dei tre assi sui quali leggo le accelerazioni e gli assi del sistema di riferimento; le formule sono visibili nell'immagine riportata.

A questo punto io leggerò tre valori di accelerazione sugli assi x,y,z che però non sono gli assi di riferimento del sistema iniziale. Io voglio, invece, dati gli angoli che ho già ricavato dalla calibrazione del sensore, riportare i valori che leggo rispetto al sistema di riferimento. Come è possibile fare ciò?
Grazie per l'attenzione. Gabriele.
Sono 3 giorni che sto cercando di scervellarmi per risolvere questo problema. Provo a spiegarmi.
Ho montato un sensore che misura l'accelerazione su tre assi che chiamerò x,y,z. Ipotizzando di montare il sensore in modo che ogni asse sia diverso dal sistema di riferimento xrif, yrif, zrif, ho applicato le formule per calcolare gli angoli tra ognuno dei tre assi sui quali leggo le accelerazioni e gli assi del sistema di riferimento; le formule sono visibili nell'immagine riportata.

A questo punto io leggerò tre valori di accelerazione sugli assi x,y,z che però non sono gli assi di riferimento del sistema iniziale. Io voglio, invece, dati gli angoli che ho già ricavato dalla calibrazione del sensore, riportare i valori che leggo rispetto al sistema di riferimento. Come è possibile fare ciò?
Grazie per l'attenzione. Gabriele.
Risposte
In poche parole, e forse così mi spiego meglio, voglio ricavare le componenti dell'accelerazione lungo gli assi del sistema di riferimento iniziale (quello tratteggiato nelle figure riportate nell'immagine allegata precedentemente).
Si tratta solo di rotazioni senza deformazioni del sensore giusto? E senza traslazioni dal disegno..
Sia $A$ la matrice di rotazione che porta, ordinatamente, ogni asse di partenza sull'asse di posizionamento, la sua inversa non è altro che $A^T$. Quindi tu applichi l'inversa ai risultati e ti trovi i risultati nel riferimento di partenza
Sia $A$ la matrice di rotazione che porta, ordinatamente, ogni asse di partenza sull'asse di posizionamento, la sua inversa non è altro che $A^T$. Quindi tu applichi l'inversa ai risultati e ti trovi i risultati nel riferimento di partenza

Si, non ci sono deformazioni del sensore. Il problema è che non so come descrivere la matrice A che dici tu!
Pensavo servisse applicare dei sen o dei cos agli angoli che ho ricavato per riuscire a trovare le componenti che mi servono lungo il sistema di riferimento iniziale. In pratica ho solo una rotazione del sensore rispetto al punto di partenza ed io voglio le componenti come se il sensore non fosse stato ruotato, partendo dai valori letti con il sensore ruotato.
Pensavo servisse applicare dei sen o dei cos agli angoli che ho ricavato per riuscire a trovare le componenti che mi servono lungo il sistema di riferimento iniziale. In pratica ho solo una rotazione del sensore rispetto al punto di partenza ed io voglio le componenti come se il sensore non fosse stato ruotato, partendo dai valori letti con il sensore ruotato.
Ti faccio ragionare così:
Prendi le coordinate sferiche e l'asse x, sappiamo che il nostro asse x si muoverà di un angolo $theta$ detto longitudine e un angolo $phi$ detto latitudine, in particolare andrà nel punto:
$((cos(theta)sin(phi)),(sin(theta)sin(phi)),(cos(phi)))$
E di conseguenza:
-L'asse y va in
$((cos(theta)cos(phi)),(sin(theta)cos(phi)),(-sin(phi)))$
-L'asse z va in
$((-sin(theta),cos(theta),0))$
Da cui la matrice:
$((cos(theta)sin(phi),cos(theta)cos(phi),-sin(theta)),(sin(theta)sin(phi),sin(theta)cos(phi),cos(theta)),(cos(phi),-sin(phi),0))$
La cui inversa non è altro che:
$((cos(theta)sin(phi),cos(theta)cos(phi),-sin(theta)),(sin(theta)sin(phi),sin(theta)cos(phi),cos(theta)),(cos(phi),-sin(phi),0))^T=((cos(theta)sin(phi),sin(theta)sin(phi),cos(phi)),(cos(theta)cos(phi),sin(theta)cos(phi),-sin(phi)),(-sin(theta),cos(theta),0))$
Ora però possiamo far ruotare i nostri assi y e z allora usiamo un'altra matrice di rotazione:
$((1,0,0),(0,cos(alpha),-sin(alpha)),(0,sin(alpha),cos(alpha)))$
La cui inversa è ovviamente:
$((1,0,0),(0,cos(alpha),sin(alpha)),(0,-sin(alpha),cos(alpha)))$
Ora in pratica come procedi:
1)Guardi dove è andato l'asse x e lo descrivi in coordinate sferiche unitarie e da questo ti ricavi $theta$ e $phi$.
2)Guardi dove dovrebbero essere gli assi y e z, se sono al loro posto sei apposto, altrimenti ti trovi un angolo alpha di quanto si sono mossi da dove dovrebbero essere.
3)Ora hai tutti e tre gli angoli e puoi applicare ai tuoi dati la doppia inversa così li riporti agli assi iniziali.
Prendi le coordinate sferiche e l'asse x, sappiamo che il nostro asse x si muoverà di un angolo $theta$ detto longitudine e un angolo $phi$ detto latitudine, in particolare andrà nel punto:
$((cos(theta)sin(phi)),(sin(theta)sin(phi)),(cos(phi)))$
E di conseguenza:
-L'asse y va in
$((cos(theta)cos(phi)),(sin(theta)cos(phi)),(-sin(phi)))$
-L'asse z va in
$((-sin(theta),cos(theta),0))$
Da cui la matrice:
$((cos(theta)sin(phi),cos(theta)cos(phi),-sin(theta)),(sin(theta)sin(phi),sin(theta)cos(phi),cos(theta)),(cos(phi),-sin(phi),0))$
La cui inversa non è altro che:
$((cos(theta)sin(phi),cos(theta)cos(phi),-sin(theta)),(sin(theta)sin(phi),sin(theta)cos(phi),cos(theta)),(cos(phi),-sin(phi),0))^T=((cos(theta)sin(phi),sin(theta)sin(phi),cos(phi)),(cos(theta)cos(phi),sin(theta)cos(phi),-sin(phi)),(-sin(theta),cos(theta),0))$
Ora però possiamo far ruotare i nostri assi y e z allora usiamo un'altra matrice di rotazione:
$((1,0,0),(0,cos(alpha),-sin(alpha)),(0,sin(alpha),cos(alpha)))$
La cui inversa è ovviamente:
$((1,0,0),(0,cos(alpha),sin(alpha)),(0,-sin(alpha),cos(alpha)))$
Ora in pratica come procedi:
1)Guardi dove è andato l'asse x e lo descrivi in coordinate sferiche unitarie e da questo ti ricavi $theta$ e $phi$.
2)Guardi dove dovrebbero essere gli assi y e z, se sono al loro posto sei apposto, altrimenti ti trovi un angolo alpha di quanto si sono mossi da dove dovrebbero essere.
3)Ora hai tutti e tre gli angoli e puoi applicare ai tuoi dati la doppia inversa così li riporti agli assi iniziali.
Grazie Maci, ho seguito il tuo ragionamento anche se faccio fatica un pò a capire che cosa devo fare nella pratica.
Allora dei tre angoli che ho calcolato con le formule riportate nel datasheet non me ne faccio niente?
dunque, ipotizziamo che nel sistema di partenza io debba leggere Zrif=1, Yrif=0, Xrif=0 (che sarebbe corretto se mettessi il sensore appoggiato orizzontalmente, in quanto la forza di gravità di 1g sarebbe applicata solamente lungo l'asse Zrif perpendicolare al piano di appoggio). A questo punto ipotizzo di ruotare il sensore e di leggere con il mio sistema Z=0.8, Y=0.4, X=0.1. Vuol dire che il sensore è ruotato in tutte e tre le direzioni rispetto alla partenza.
A questo punto, sul nuovo sistema dovrei calcolare il modulo del vettore ottenuto da X,Y,Z come:
$ M=sqrt(X^2+Y^2+Z^2)$
e poi calcolerei $theta=arccos(Z/M)$
e $phi=arctan(Y/X)$
Una volta ottenuti gli angoli $theta$ e $phi$ che devo fare? L'angolo $alpha$ che mi hai detto come lo ricavo e a cosa mi serve??
Io dovrei a questo punto ricavare le componenti lungo gli assi del sistema iniziale e, poi, applicando una vibrazione al sensore posto "storto", andare a leggere rispetto al sistema iniziale i valori lungo Xrif, Yrif e Zrif.
Allora dei tre angoli che ho calcolato con le formule riportate nel datasheet non me ne faccio niente?
dunque, ipotizziamo che nel sistema di partenza io debba leggere Zrif=1, Yrif=0, Xrif=0 (che sarebbe corretto se mettessi il sensore appoggiato orizzontalmente, in quanto la forza di gravità di 1g sarebbe applicata solamente lungo l'asse Zrif perpendicolare al piano di appoggio). A questo punto ipotizzo di ruotare il sensore e di leggere con il mio sistema Z=0.8, Y=0.4, X=0.1. Vuol dire che il sensore è ruotato in tutte e tre le direzioni rispetto alla partenza.
A questo punto, sul nuovo sistema dovrei calcolare il modulo del vettore ottenuto da X,Y,Z come:
$ M=sqrt(X^2+Y^2+Z^2)$
e poi calcolerei $theta=arccos(Z/M)$
e $phi=arctan(Y/X)$
Una volta ottenuti gli angoli $theta$ e $phi$ che devo fare? L'angolo $alpha$ che mi hai detto come lo ricavo e a cosa mi serve??
Io dovrei a questo punto ricavare le componenti lungo gli assi del sistema iniziale e, poi, applicando una vibrazione al sensore posto "storto", andare a leggere rispetto al sistema iniziale i valori lungo Xrif, Yrif e Zrif.
Allora, cambiamo riferimento e usiamo come asse principale lo z:
1) Facciamo ruotare il piano che contiene gli assi x-z, quindi y=0, da x verso z di un angolo alpha:
$((cos(alpha),0,-sin(alpha)),(0,1,0),(sin(alpha),0,cos(alpha)))$
I versori sottoposti a questa rotazione andranno:
$((1),(0),(0))->((cos(alpha)),(0),(sin(alpha)))$
$((0),(1),(0))->((0),(1),(0))$
$((0),(0),(1))->((-sin(alpha)),(0),(cos(alpha)))$
2) Facciamo ruotare il piano che contiene gli assi y-z, quindi x=0, da y verso z di un angolo beta:
$((1,0,0),(0,cos(beta),-sin(beta)),(0,sin(beta),cos(beta)))$
I versori andranno:
$((1),(0),(0))->((cos(alpha)),(0),(sin(alpha)))->((cos(alpha)),(-sin(alpha)sin(beta)),(sin(alpha)cos(beta)))$
$((0),(1),(0))->((0),(1),(0))->((0),(cos(beta)),(sin(beta)))$
$((0),(0),(1))->((-sin(alpha)),(0),(cos(alpha)))->((-sin(alpha)),(-cos(alpha)sin(beta)),(cos(alpha)cos(beta)))$
3) Ruotiamo infine gli assi x-y:
$((cos(gamma),-sin(gamma),0),(sin(gamma),cos(gamma),0),(0,0,1))$
I versori andranno:
$((1),(0),(0))->((cos(alpha)),(0),(sin(alpha)))->((cos(alpha)),(-sin(alpha)sin(beta)),(sin(alpha)cos(beta)))->((cos(alpha)cos(gamma)+sin(alpha)sin(beta)sin(gamma)),(cos(alpha)sin(gamma)-sin(alpha)sin(beta)cos(gamma)),(sin(alpha)cos(beta)))$
$((0),(1),(0))->((0),(1),(0))->((0),(cos(beta)),(sin(beta)))->((-cos(beta)sin(gamma)),(cos(beta)cos(gamma)),(sin(beta)))$
$((0),(0),(1))->((-sin(alpha)),(0),(cos(alpha)))->((-sin(alpha)cos(gamma)+cos(alpha)sin(beta)sin(gamma)),(-sin(alpha)sin(gamma)-cos(alpha)sin(beta)cos(gamma)),(cos(alpha)cos(beta)))$
Ci sei fino a qui?
1) Facciamo ruotare il piano che contiene gli assi x-z, quindi y=0, da x verso z di un angolo alpha:
$((cos(alpha),0,-sin(alpha)),(0,1,0),(sin(alpha),0,cos(alpha)))$
I versori sottoposti a questa rotazione andranno:
$((1),(0),(0))->((cos(alpha)),(0),(sin(alpha)))$
$((0),(1),(0))->((0),(1),(0))$
$((0),(0),(1))->((-sin(alpha)),(0),(cos(alpha)))$
2) Facciamo ruotare il piano che contiene gli assi y-z, quindi x=0, da y verso z di un angolo beta:
$((1,0,0),(0,cos(beta),-sin(beta)),(0,sin(beta),cos(beta)))$
I versori andranno:
$((1),(0),(0))->((cos(alpha)),(0),(sin(alpha)))->((cos(alpha)),(-sin(alpha)sin(beta)),(sin(alpha)cos(beta)))$
$((0),(1),(0))->((0),(1),(0))->((0),(cos(beta)),(sin(beta)))$
$((0),(0),(1))->((-sin(alpha)),(0),(cos(alpha)))->((-sin(alpha)),(-cos(alpha)sin(beta)),(cos(alpha)cos(beta)))$
3) Ruotiamo infine gli assi x-y:
$((cos(gamma),-sin(gamma),0),(sin(gamma),cos(gamma),0),(0,0,1))$
I versori andranno:
$((1),(0),(0))->((cos(alpha)),(0),(sin(alpha)))->((cos(alpha)),(-sin(alpha)sin(beta)),(sin(alpha)cos(beta)))->((cos(alpha)cos(gamma)+sin(alpha)sin(beta)sin(gamma)),(cos(alpha)sin(gamma)-sin(alpha)sin(beta)cos(gamma)),(sin(alpha)cos(beta)))$
$((0),(1),(0))->((0),(1),(0))->((0),(cos(beta)),(sin(beta)))->((-cos(beta)sin(gamma)),(cos(beta)cos(gamma)),(sin(beta)))$
$((0),(0),(1))->((-sin(alpha)),(0),(cos(alpha)))->((-sin(alpha)cos(gamma)+cos(alpha)sin(beta)sin(gamma)),(-sin(alpha)sin(gamma)-cos(alpha)sin(beta)cos(gamma)),(cos(alpha)cos(beta)))$
Ci sei fino a qui?
Sisi, fin qui ci sono!
Poi?
Poi?
Maci, hai novità? Non siamo più riusciti a risolvere al 100% la questione.