MENU

La variante di valico

GDPR – The Big Internet is watching you!

giugno 12, 2018 Commenti (0) Ingegneria, Ingegneria Meccanica Tempo di Lettura:

Orientiamoci! Determinare l’orientamento di un oggetto (parte 1)

In questa serie di articoli spiegheremo come si realizzano dei semplici sistemi che permettano di determinare l’orientamento nello spazio di un oggetto, che è alla base dei moderni sistemi di motion capture utilizzati nell’industria videoludica e cinematografica d’animazione. Gli stessi principi vengono utilizzati in aeronautica per stabilire l’orientamento dei velivoli.

Nel primo articolo ci limiteremo a comprendere la matematica che sta dietro il calcolo dell’orientamento di un corpo, mentre nel secondo imposteremo un semplice codice C++ per applicare la matematica qui esposta tramite una scheda Arduino.

Angoli di Eulero. Servono a descrivere l’orientamento di un corpo nello spazio.

L’idea di base

Per sapere come un qualsiasi corpo sia orientato nello spazio è necessario stabilire un set di parametri opportuno e conoscerne il valore in ogni istante. Comunemente si utilizzano gli angoli di rollio, beccheggio e imbardata, definiti come in figura. Non sono necessarie altre informazioni come ad esempio posizione, velocità ecc. perché queste ultime e gli angoli sopracitati possono essere rilevate indipendentemente, anche se dovesse esistere una qualche relazione tra di loro.

Angoli di un corpo.

Rollio, beccheggio e imbardata sono i nomi che vengono comunemente dati ad una particolare terna di angoli, che vengono chiamati angoli di Eulero. Questi, come vedremo più avanti, si possono indicare in generale, anche come angoli di Cardano.

Un po’ di matematica

Nel seguito si farà riferimento agli angoli definiti nella figura sottostante.

Angoli di Cardano con relativi assi.

Gli angoli di Cardano descrivono l’ampiezza delle rotazioni attorno ai tre assi relativi al corpo di cui si vuole conoscere l’orientazione. Queste rotazioni formeranno degli angoli tra il sistema di riferimento del corpo e quello assoluto; il primo viene detto anche sistema mobile, il secondo fisso. I due sistemi di riferimento devono avere l’origine degli assi in comune.

Sono quindi definiti gli angoli:

  • \(\xi\) di rollio, per le rotazioni attorno all’asse \(x\) del corpo;
  • \(\eta\) di beccheggio, per le rotazioni attorno all’asse \(y\);
  • \(\zeta\) di imbardata, per le rotazioni attorno all’asse \(z\);

Le rotazioni che possono essere descritte da questa terna possono essere associate ad una matrice detta appunto matrice di rotazione. Considerando separatamente i tre angoli, quindi, si possono scrivere le seguenti:

\(
\mathbf{R_{\xi}}= \left[ \begin{array}{ccc}
1 & 0 & 0\\
0 & \cos{\xi} & \sin{\xi}\\
0 & -\sin{\xi} & \cos{\xi}
\end{array} \right]
\)

\(
\mathbf{R_{\eta}}= \left[ \begin{array}{ccc}
\cos{\eta} & 0 & -\sin{\eta}\\
0 & 1 & 0\\
\sin{\eta} & 0 & \cos{\eta}
\end{array} \right]
\)

\(
\mathbf{R_{\zeta}}= \left[\begin{array}{ccc}
\cos{\zeta} & \sin{\zeta} & 0\\
-\sin{\zeta} & \cos{\zeta} & 0\\
0 & 0 & 1
\end{array} \right]
\)

Per descrivere una rotazione completa si devono premoltiplicare le matrici tra loro: questo rende il risultato ovviamente non univoco. Esistono sei possibili combinazioni di queste matrici. Quella che verrà utilizzata è la seguente:

\(\mathbf{A_{0}^{i}} = \mathbf{R_{\zeta}R_{\eta}R_{\xi}} \)

Questa combinazione è quella che fornisce agli angoli il nome di angoli di Eulero. La matrice che ne risulta è:

\(
\mathbf{A_{0}^{i}}= \left[\begin{array}{ccc}
c_{\eta} c_{\zeta} & c_{\xi} s_{\zeta} + s_{\xi} s_{\eta} c_{\zeta} & s_{\xi} s_{\zeta} – c_{\xi} s_{\eta} c_{\zeta}\\
– c_{\eta} s_{\zeta} & c_{\xi} c_{\zeta} – s_{\xi} s_{\eta} s_{\zeta} & s_{\xi} c_{\zeta} + c_{\xi} s_{\eta} s_{\zeta}\\
s_{\eta} & – c_{\eta} s_{\xi} & c_{\xi} c_{\eta}
\end{array} \right]
\)

Sarà utile anche la sua inversa:

\(
\mathbf{A_{i}^{0}} = \left[\begin{array}{ccc}
c_{\eta} c_{\zeta} & – c_{\eta} s_{\zeta} & s_{\eta} \\
c_{\xi} s_{\zeta} + s_{\xi} s_{\eta} c_{\zeta} & c_{\xi} c_{\zeta} – s_{\xi} s_{\eta} s_{\zeta} & – c_{\eta} s_{\xi} \\
s_{\xi} s_{\zeta} – c_{\xi} s_{\eta} c_{\zeta} & s_{\xi} c_{\zeta} + c_{\xi} s_{\eta} s_{\zeta} & c_{\xi} c_{\eta}
\end{array} \right]
\)

dove ovviamente \(c=cos\), \(s=sin\).

Perché servono queste matrici?

E’ possibile notare che le matrici presentano un pedice e un apice, rispettivamente \(0\) e \(i\). Questo perché si relazionano le quantità che vengono calcolate e/o misurate nel sistema di riferimento fisso, con le analoghe nel sistema di riferimento mobile, e viceversa.

In particolare, la prima permette di passare dal sistema di riferimento fisso a quello mobile; la seconda da quello mobile a quello fisso.

Risvolto pratico

La possibilità di esprimere “informazioni” analoghe in due sistemi di riferimento risulta particolarmente utile nel problema della determinazione dell’orientamento.
Di un corpo od oggetto è possibile conoscere, grazie a dispositivi appositi, le accelerazioni e le velocità di rotazione. I sensori che le rilevano sono rispettivamente accelerometro e giroscopio.

E’ diffusa la convinzione che la velocità angolare sia la derivata dell’angolo di rotazione di un corpo. Essendo anche la quantità che viene misurata da un giroscopio, molti makers “prendono” il segnale proveniente dallo stesso e procedono all’integrazione, ritenendo così di ottenere l’orientamento di un oggetto.

Tuttavia, il fatto che la velocità angolare sia la derivata dell’angolo non è assolutamente vero in quanto questa, come dimostreremo a fine articolo, non è il differenziale di alcun vettore e quindi non può essere integrata. E’ invece vero che il modulo della velocità angolare si può esprimere nel seguente modo:

\( \omega = \frac{\Delta \theta}{\Delta t} \)

non è possibile conoscere altro tramite questa operazione che non è una derivazione, ma un tasso di variazione.

Gli angoli di Cardano sono stati introdotti anche perché, a differenza delle velocità angolari, sono derivabili e sono quindi le quantità che consentono di ottenere tramite integrazione l’orientamento di un corpo.

\(
\xi= \xi_{0} + \int_{0}^{t} \dot{\xi} dt \\
\eta= \eta_{0} + \int_{0}^{t} \dot{\eta} dt \\
\zeta= \zeta_{0} + \int_{0}^{t} \dot{\zeta} dt \\
\)

Algoritmo di calcolo

Nel sistema di riferimento mobile, cioè quello solidale con l’oggetto, si conoscono sempre le velocità angolari (tramite il giroscopio); in quello fisso le velocità angolari vanno a coincidere con le derivate degli angoli di Cardano. E’ quindi naturale pensare ad un algoritmo che sfrutti la conoscenza delle \(\omega\) e degli angoli per ricavare l’orientamento.

Si può procedere sfruttando le due matrici di rotazione introdotte precedentemente. L’algoritmo verrà impostato in questo modo:

  1. ottenimento dei dati di velocità angolare tramite giroscopio;
  2. trasformazione delle velocità angolari nelle derivate degli angoli di Cardano con la matrice inversa;
  3. integrazione per ottenere gli angoli di Eulero.

Come si potrà notare facilmente a breve, questo algoritmo risulta essere di tipo iterativo: si useranno i risultati del passaggio precedente per ottenere i dati richiesti nel passaggio corrente.

In termini matematici, detta \(i\) l’iterazione corrente e \(i-1\) l’iterazione precedente (\(i\) come apice delle \(\omega\) indica il riferimento mobile):

    1. ottenimento delle derivate degli angoli di Cardano:

      \(
      \left[ \begin{array}{c}
      \dot{\xi} \\ \dot{\eta} \\ \dot{\zeta}
      \end{array} \right] =
      \left[ \begin{array}{ccc}
      \frac{1}{\cos{\zeta}} & 0 & 0 \\
      \frac{\cos{\xi} \sin{\zeta}}{\cos{\zeta}} & 1 & 0 \\
      \frac{- \sin{\xi} \sin{\zeta}}{\cos{\zeta}} & 0 & 1
      \end{array} \right]
      \left[ \begin{array}{c}
      \omega_{x}^{i} \\ \omega_{y}^{i} \\ \omega_{z}^{i}
      \end{array} \right]
      \)

    2. integrazione degli angoli

      \(
      \xi_{i}= \xi_{i-1} + \dot{\xi}_{i} \Delta t \\
      \eta_{i}= \eta_{i-1} + \dot{\eta}_{i} \Delta t \\
      \zeta_{i}= \zeta_{i-1} + \dot{\zeta}_{i} \Delta t \\
      \)

    3. nuova iterazione con i risultati appena ottenuti.

Per l’iterazione \(i=1\) serviranno i valori degli angoli per \(i=0\) per poter procedere con l’integrazione. Come vedremo nel prossimo articolo, il valore degli angoli \(i=0\) può essere ricavato in maniera ottimale anziché arbitraria, la quale sarebbe la soluzione più semplice.

Bonus: non integrabilità della velocità angolare

Per una trattazione più completa si rimanda al riferimento 1.

Un esempio

Non è facile fornire una spiegazione semplice del perché la velocità angolare non sia integrabile., ma può essere intuibile con il seguente esempio: se una persona seduta su una sedia da ufficio si mette a girare su se stessa, può capire di quanto ha ruotato solo se tiene gli occhi aperti. Se questa tiene gli occhi sempre chiusi risulterà estremamente difficile determinare con precisione la rotazione compiuta.
Integrare il segnale del giroscopio, cioè la velocità angolare nel sistema mobile, “corrisponde a ruotare con gli occhi chiusi”: nel prossimo articolo sarà mostrato come questo approccio porti a dei risultati totalmente sbagliati.

Questo esempio non è comunque sufficiente a dimostrare l’asserto di questo paragrafo, per cui si procede con la dimostrazione matematica.

Dimostrazione

Come da riferimento 1, le velocità angolari si possono esprimere in funzione degli angoli di Cardano:

\(
\left[ \begin{array}{c}
\omega_{x}^{i} \\ \omega_{y}^{i} \\ \omega_{z}^{i}
\end{array} \right] =
\left[ \begin{array}{ccc}
\sin{\eta}\sin{\zeta} & \cos{\zeta} & 0 \\
\sin{\eta}\cos{\zeta} & -\sin{\zeta} & 0 \\
\cos{\eta} & 0 & 1
\end{array} \right]
\left[ \begin{array}{c}
\dot{\xi} \\ \dot{\eta} \\ \dot{\zeta}
\end{array} \right]
\)

Si può esprimere allora la componente \(\omega_{x}^{i}\), ad esempio, come:

\(\omega_{x}^{i} = \sin{\eta}\sin{\zeta}\dot{\xi} + \cos{\zeta}\dot{\eta}\)

Esprimendola come differenziale, si ottiene:

\(\omega_{x}^{i}dt = \sin{\eta}\sin{\zeta}d\xi + \cos{\zeta}d\eta\)

Come è noto, un differenziale

\(dz=Adx+Bdy\)

è integrabile se e solo se vale la condizione

\(\frac{\partial A}{\partial y} = \frac{\partial B}{\partial x}\)

Si ricava che la velocità angolare non è integrabile (ripetendo gli stessi passaggi anche per le altre componenti) visto che

\(\frac{\partial \sin{\eta}\sin{\zeta}}{\partial \eta} = \frac{\partial \cos{\zeta}}{\partial \xi}\).

Per quanto riguarda le derivate degli angoli di Cardano si è visto che vale la seguente:

\(
\left[ \begin{array}{c}
\dot{\xi} \\ \dot{\eta} \\ \dot{\zeta}
\end{array} \right] =
\left[ \begin{array}{ccc}
\frac{1}{\cos{\zeta}} & 0 & 0 \\
\frac{\cos{\xi} \sin{\zeta}}{\cos{\zeta}} & 1 & 0 \\
\frac{- \sin{\xi} \sin{\zeta}}{\cos{\zeta}} & 0 & 1
\end{array} \right]
\left[ \begin{array}{c}
\omega_{x}^{i} \\ \omega_{y}^{i} \\ \omega_{z}^{i}
\end{array} \right]
\)

per cui, esprimendo la componente \(\dot{\xi}\) come differenziale:

\( d\xi = \frac{1}{\cos{\zeta}} \omega_{x}^{i} dt + 0 \omega_{y}^{i} dt + 0 0 \omega_{z}^{i} dt\)

si vede che vale la condizione di differenziabilità, dato che

\( \frac{\partial}{\partial \omega_{y}^{i} dt}\left(\frac{1}{\cos{\zeta}} \right)= \frac{\tan{\zeta}}{\cos{\zeta}}\frac{\partial \dot{\zeta}}{\partial \omega_{y}^{i}} = 0\)

in quanto è facile vedere che \(\frac{\partial \dot{\zeta}}{\partial \omega_{y}^{i}} = 0\), che è uguale alle altre componenti del differenziale.
Ripetendo per le altre componenti questi passaggi, si dimostra l’asserto.

Riferimenti

  1. Cinematica e dinamica dei sistemi multibody, vol.2 (Ettore Pennestri’, Federico Cheli; 2009 Casa editrice Ambrosiana)
  2. Elementi di Fisica, meccanica e termodinamica (Mazzoldi, Nigro, Voci; 2007)

Tags: , , , , , , , , , , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

error: EEEH?! VOLEVI!