DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] 2. Dinamica del corpo rigido In questo capitolo viene presentata la dinamica del singolo corpo rigido partendo dai concetti di quantità di moto e momento angolare. Il carattere applicativo di questo libro impone una trattazione che dà per assodati alcuni concetti di base della meccanica. Indicando con p la quantità di moto e con hO il momento angolare rispetto del sistema considerato rispetto al polo O, v C la velocità del baricentro del corpo di massa m si ha: p = mv C (2.1 dp = f dt (2.2 dhO = τO dt (2.3 essendo f e τ O , rispettivamente, la risultante delle forze e delle coppie applicate al sistema, le coppie si intendono valutate rispetto al polo O. Se il sistema è a massa costante la (2.2) assume la seguente forma: d (mv C ) dt dv C =m = f dt (2.4 Per quanto riguarda la (2.3) risulta essere per definizione di quantità di moto e di momento angolare (Fig. 2.1): vi ω B ,A ZB B r O ZA XB XA vO YA Fig. 2.1 Schematizzazione di un corpo rigido roto-traslante. 1 YB DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] hi h = ∑ ri × mi ( v O + ω B , A × ri ) = ∑ ri × ( ω B , A × ri ) mi − v O × ∑ ri mi i i i (2.5 vi Qualora il punto O sia fisso v O = 0 o coincida con il baricentro ( ∑ ri mi = 0 ) la (2.5) diventa: i h = ∑ ri × ( ω B , A × ri ) mi (2.6 i o, per un sistema continuo: h = ∫ r × ( ω B , A × r ) dm (2.7 La (2.7) sviluppata assume la seguente forma: h = Iω (2.8 dove I è il tensore d'inerzia simmetrico: I xy I yz I xx 2 2 − ∫ xy dm − ∫ xz dm ∫ y + z dm I xy I yy I yz 2 2 I = − ∫ xy dm ∫ z + x dm − ∫ yz dm I yz I yz Izz 2 2 − ∫ yz dm + x y dm − ∫ xz dm ∫ ( ) ( ) ( (2.9 ) Per effettuare la derivazione (2.3) è conveniente ricordare la (1.24), per comodità a presso riportata: d Au A B A = B R u + ω B , A × BAR B u dt (1.2.4 bis che esprime la derivata di un generico vettore u quando esso è noto nel sdr mobile B. Ora, considerando il momento angolare rispetto al baricentro ( O ≡ C ), espresso nel sdr B solidale al corpo rigido dovrà essere: d Ah A B A = B R h + ω B , A × BAR Bh = A τ C dt (2.10 ma osservando che: A ω B , A × BAR Bh = BAR B ω B , A × Bh ; ( ) A τ C = BAR B τ C (2.11 2 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] si ottiene: A B R B h + BAR ( B ω B , A × B h = BAR B τ C ) (2.12 da cui, premoltiplicando per BA R −1 resta: B h + B ω B , A × Bh = B τ C (2.13 che costituisce la derivata del momento angolare espressa nel sdr solidale al corpo rigido. Dato che B B B h = I ω B , A si ottiene: B I BωC B , A + B ω B , A × BI Bω B , A = B τ C (2.14 nota come equazione di Eulero. Come si osserva dalla (2.14) si tratta di un'equazione con una struttura piuttosto semplice non contenendo matrici di rotazione. La soluzione porge l'andamento della velocità angolare, si deve pertanto associare a questa l'equazione cinematica; un approccio molto conveniente come visto nel primo capitolo è quello che sfrutta la formulazione con i parametri di Eulero (1.4.3), questo verrà ampiamente applicato nel punto 2.1. Per quanto concerne la derivata della quantità di moto (2.4), dato che l'equazione di Eulero è espressa nel sdr solidale al corpo rigido, è conveniente scriverla in tale sdr. Con lo stesso procedimento che ha permesso di ottenere la (2.13) si ottiene: B p> + B ω B , A × B p= Bf Dato che B (2.15 p =m B v C si ottiene: m B v>C +m B ω B , A × B vC = Bf (2.16 Evidentemente attraverso quest'ultima si determina la velocità espressa nel sdr solidale al corpo rigido, lo spazio nel sdr fisso A verrà determinato attraverso un'integrazione della velocità trovata attraverso la (2.16) premoltiplicata per BA R , come verrà mostrato nel punto (2.1). L'energia cinetica di un corpo rigido in moto di roto-traslazione risulta data dalla somma dei contributi dovuti alle singole particelle materiali costituenti il corpo. Indicando al solito con vC la velocità del centro di massa del sistema, facendo riferimento alla Fig. 2.1, la velocità di un punto generico risulta data dalla formula fondamentale dei moti rigidi: v = vC + ω B , A × r (2.17 L'energia cinetica diventa pertanto: T= 1 2∫ 1 2 1 1 v = ∫ v ⋅ vdm = ∫ v ⋅ vdm = ∫ 2 2 2 2 v C + ( ω B , A × r ) ⋅ ( ω B , A × r ) dm + v C ⋅ ω B , A × ∫ rdm [ ] 3 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] Dato che l'origine del sdr solidale al corpo rigido è localizzata nel centro di massa ∫ rdm = 0 , quindi l'energia cinetica è data dalla somma dell'energia cinetica di traslazione come se tutta la massa fosse concentrata nel centro di masse e l'energia cinetica di rotazione rispetto al centro di massa: T = TTrasl . + TRot . Trasl . Rotazione 1 2 1 = m v C + ∫ ( ω B , A × r ) ⋅ ( ω B , A × r ) dm 2 2 [ ] (2.17 Il secondo integrale sviluppato assume la seguente forma: TRot . = ω B , A ⋅ hC = ω B , A ⋅ Iω B , A = ω TB , A Iω B , A (2.18 Dal punto di vista pratico può essere necessario esprimere il tensore d'inerzia in sdr diversi. Si considera dapprima il caso con sdr solamente ruotati. Sia A il sdr fisso e B quello ruotato, noti B I , BAR determinare A I . Dato che lo scalare energia cinetica in diversi sdr non cambia dovrà essere dalla (2.18): 2TRot . = A ω TB , A AI A ω B , A = B ω TB , A BI B ω B , A (2.19 Esprimendo il secondo termine in funzione delle grandezze omologhe espresse nel sdr A si ottiene: B ω TB , A BI B ω B , A = ( B A R A ω B ,A ) T B I ( B A ) R A ω B , A = A ω TB , A [ B A R T BI ABR ] A ω B ,A (2.20 in quanto il trasposto del prodotto è uguale al prodotto dei trasposti in ordine inverso. Dalla (2.20) discende immediatamente che: A I = ABR T BI ABR = BAR BI BAR T (2.21 Esempio 2.1: dato un disco di acciaio ( ρ = 7850 kg m3 ) avente raggio R=0.2 m e spessore H=0.005 m, determinare il tensore d'inerzia per un sdr ottenuto da quello principale secondo una rotazione di 30° attorno ad uno dei due assi principali ortogonale all'asse del disco. Il calcolo del tensore per la terna principale d'inerzia viene effettuato con la funzione in_cil secondo [9]. function [m,A,B,C]=in_cil(d,h,dens) % Calcolo delle caratteristiche d'inerzia di un cilindro pieno % d : diametro del cilindro % h : altezza del cilindro % dens : densità % m : massa % A : momento d'inerzia principale rispetto all'asse x % B : momento d'inerzia principale rispetto all'asse y (B=A) % C : momento d'inerzia principale rispetto all'asse z (asse del cilindro) % % Gli assi x e y sono ortogonali all'asse del cilindro. m=pi*d^2/4*h*dens; 4 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] A=m/4*(d^2/4+h^2/3); B=A; C=m*d^2/8; Si ottiene: » [m,A,B,C]=in_cil(0.2,0.005,7850) m = 1.2331 A = 0.0031 B = 0.0031 C = 0.0062 Pertanto: » IB=[[A 0 0];[0 B 0];[0 0 C]] IB = 0.0031 0 0 La matrice A B 0 0.0031 0 0 0 0.0062 R si ottiene mediante la funzione rot_tr per una rotazione attorno all'asse y: » RBA=rot_tr(0,30,0) RBA = 0.8660 0 -0.5000 0 1.0000 0 0.5000 0 0.8660 La trasformazione secondo la (2.21) viene effettuata con la funzione inrot: function IA=inrot(RBA,IB) % Funzione per la determinazione del tensore d'inerzia espresso nel sdr A % IA quanto sia nota la matrice di rotazione B->A RBA e il tensore IB % espresso nel sdr B. IA=RBA*IB*RBA'; Si ottiene: » IA=inrot(RBA,IB) IA = 0.0039 0 0.0013 0 0.0031 0 0.0013 0 0.0054 Come si osserva la rotazione attorno all'asse y fa in modo che il tensore rimanga inalterato secondo tale asse.// 5 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] Nel caso in cui i sdr siano solamente traslati si utilizza il teorema degli assi traslati [10]. Con riferimento alla Fig. 2.2 ZA OA A XA YA YB rOB OB YB XB Fig. 2.2 Traslazione degli assi per il calcolo del tensore d'inerzia. * noti B I , ArOB risulta: A I = BI + [ A T A OB OB r r [1]− ArO B A T OB r ]m (2.22 essendo [1] la matrice indentità ed m la massa. Esempio 2.2: dato un disco di acciaio ( ρ = 7850 kg m3 ) avente raggio R=0.15 m e spessore H=0.007 m, determinare il tensore d'inerzia per un sdr ottenuto da quello principale secondo una traslazione di 0.3 m lungo l'asse z. Il cilindro giace inizialmente con il proprio asse secondo l'asse z del sdr A. Anche ora, come nell'Esempio 2,1 il calcolo del tensore per la terna principale d'inerzia viene effettuato con la funzione in_cil. Si ottiene: » [m,A,B,C]=in_cil(0.15,0.007,7850) m = 0.9710 A = 0.0014 B = 0.0014 C = 0.0027 Pertanto: » IB=[[A 0 0];[0 B 0];[0 0 C]] 6 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] IB = 0.0014 0 0 0 0.0014 0 0 0 0.0027 T Dai dati del problema: A rOB = (0 0 0.3) La trasformazione secondo la (2.22) viene effettuata con la funzione intrasl: function IA=intrasl(rOBA,M, IB) % Funzione per la determinazione del tensore d'inerzia espresso nel sdr A % IA quanto sia nota rOBA e la massa M e il tensore IB % espresso nel sdr B. IA=IB+(rOBA'*rOBA*eye(3)-rOBA*rOBA')*M; Si ottiene: » IA=intrasl([0 0 0.3]',m, IB) IA = 0.0888 0 0 0 0.0888 0 0 0 0.0027 Si osservi come il valore 0.0888 risulti dal calcolo: » A+m*0.3^2 ans = 0.0888 ossia al tensore originario si somma la massa per la distanza al quadrato, risultato questo ben noto per le configurazioni piane.// La diagonalizzazione del tensore d'inerzia può semplificare la scrittura delle equazioni di Eulero in quanto vengono a mancare i termini extra diagonali. Noto pertanto il tensore non diagonalizzato nel sdr B sarà necessario determinare la matrice di rotazione BA R tale che la trasformazione fra il sdr B e il sdr incognito A secondo la (2.21) dia origine al tensore A I diagonalizzato: Diagonale A I = BAR B A T ,I BR Non diagonale (2.23 Premoltiplicando la (2.23) per BAR T si ottiene: A B R T A I = BI BAR T (2.24 Ricordando che (1.1.1): 7 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] Bi AT B T A = R B j A B k AT (1.1.1 bis la (2.24) assume la seguente forma: [i B jA A B kA ] I = BI A [i B jA A B kA ] (2.25 Dato che AI è diagonale: A A 0 0 I = 0 B 0 0 0 C (2.26 la (2.25) può essere scritta nel seguente modo: [ A Bi A B jA C Bk A = I Bi A ] [[ ] B I jA [ ] B I Bk A [ ] ] B (2.27 Questa uguaglianza matriciale implica che le colonne devono essere uguali, ad esempio: - . Autoval I Bi A = A [ ] B i ,A Autovett . B (2.28 Si tratta di un tipico problema agli autovalori dove l'autovalore rappresenta il momento d'inerzia principale e il corrispondente autovettore il versore dell'asse relativo. Si tratta pertanto di risolvere il problema agli autovalori: [ I ]x = λ x B (2.29 L'm-file es1_11 fornisce un esempio di diagonalizzazione tratto da [10] pag. 185. Viene determinato il tensore principale, la matrice di rotazione BA R e la visualizzazione dei due sdr A e B. % Esempio1_11: tratto da [10] pag. 185. Viene diagonalizzato il tensore d'inerzia % determinando sia il tensore principale che la direzione degli % assi principali. A indica il sdr nel quale viene determinato il % tensore non diagonalizzato, B quello che riguarda il tensore % diagonalizzato. % tensore non diagonalizzato I=[[1.17 0.06 0.09];[0.06 0.9 0.180];[0.09 0.180 0.45]] % Calcolo degli autovaloti e autovettori del tensore non diagonalizzato [Avet,Aval]=eig(I); % Costruzione della matrice di rotazione B->A e del tensore principale RBA=Avet' Iprinc=Aval TBA=trasm(RBA,[0 0 0]'); 8 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] % Plottaggio del sdr A pltassi(eye(4),'g','A',1,1) % Plottaggio del sdr B pltassi(TBA,'b','B',1,1) view([1 1 1]) axis([-1 1 -1 1 -1 1]) Mediante il comando es1_11 si ottiene: I = 1.1700 0.0600 0.0900 0.0600 0.9000 0.1800 0.0900 0.1800 0.4500 RBA = 0.9395 -0.3322 0.0836 0.2908 0.9023 0.3181 0.1811 0.2746 -0.9444 Iprinc = 1.2059 0 0 0 0.9327 0 0 0 0.3814 In pieno accordo con [10] pag. 185. La Fig. mostra i sdr A e B: zA 1 0.5 0 xB -0.5 yB xA yA -1 -1 -1 zB -0.5 -0.5 0 0 0.5 0.5 1 1 Fig. 2.3 Uscita grafica di es1_11. 2.1 Scrittura e soluzione numerica delle equazioni del moto per un corpo rigido Moto rotazionale di un corpo rigido La scrittura delle equazioni del moto di un corpo rigido discende direttamente dalle (2.14) e (2.16) per quanto riguarda la velocità angolare e la velocità lineare, entrambe espresse nel sdr solidale al corpo rigido. Per ottenere lo spazio è necessario convertire la velocità lineare nel sdr fisso e quindi integrare. Nel caso di solo moto rotazionale si ha: B I Bω B , A + B ω B , A × BI Bω B , A = B τ C (2.1.1 9 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] q0 q 1 1 01,3 = B q 2 2 ω B , A q 3 q0 T ~ − ω B , A q1 ~ q −Bω B ,A 2 q3 B (2.1.2 Dal punto di vista dell'integrazione numerica le (2.1.1) e (2.1.2) è conveniente scriverle nella forma di sistema del primo ordine: B ω B , A = B I −1 B τ C − B ω B , A × B I B ω B , A q 0 q 0 B T − ω B , A q1 q1 1 01,3 ~ q q = 2 B ω −Bω 2 B ,A B ,A 2 q 3 q 3 ( ) (2.1.3 Si viene così ha creare un sistema di equazioni differenziali il cui vettore di stato è il seguente: 1 x = ω x 2 ωy 3 ωz 4 5 6 q0 q1 q2 7 q 3 T (2.1.4 i primi tre elementi rappresentano B ω B , A mentre i rimanenti i parametri di Eulero q . L'integratore di MATLAB ODE45 permette di integrare sistemi di equazioni differenziali del primo ordine attraverso la definizione della (2.13), cioè del secondo membro dell'equazione differenziale, mediante una funzione. Tutto questo viene riassunto attraverso l'implementazione dell'm-file dy_bq che permette l'integrazione numerica della (2.13) e la visualizzazione del moto del corpo rigido, ora rappresentato con un disco. Permette, inoltre, di plottare il vettore momento angolare, la velocità angolare e la velocità ed accelerazione lineare di due punti del corpo rigido. Dato che ODE45 è un integratore a passo variabile per il quale il passo minimo e quello massimo sono funzione dell'intervallo di integrazione fissato, se quest'ultimo è troppo elevato è possibile ottenere delle instabilità. Per questo motivo nella stesura dei programmi dedicati all'integrazione numerica si è proceduto suddividendo l'intervallo di integrazione in sotto-intervalli per i quali la condizione finale del precedente diventa iniziale per il successivo; scegliendo i sotto-intervalli in maniera opportuna è possibile integrare per un intervallo ampio a piacere. In base a questa suddivisione è possibile memorizzare i risultati alla fine dei sotto-intervalli o per tutti gli istanti compresi nel sotto-intervallo, così come essi vengono generati da ODE45 (vedi la variabile comememo). % dy_bq.m : integrazione di un'equazione differenziale con % la funzione ode45 dell'equazione del moto di un corpo rigido % nel caso in cui le equazioni cinematiche siano espresse con % i parametri di Eulero. % % Il tempo di integrazione viene diviso in sotto-intervalli, per % ognuno dei quali la condizione finale diventa iniziale % per quello successivo. % x0 : vettore delle condizioni iniziali % Contiene le velocità angolari e i parametri di Eulero % % x0=[Wx Wy Wz q0 q1 q2 q3]' 10 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] % % all'istante iniziale. % % toll : tolleranza di integrazione. Consigliata 1e-4 ma se si aumenta % la velcotà di spin del corpo rigido (Nturn) per valori elevati % (>10000 g/min) si consiglia di ridurla a 1e-8. Questo rallenta % l'esecuzione ma aumenta decisamente l'accuratezza % nell'integrazione numerica. % comememo : =1 si ottiene la memorizzazione in tutti gli istanti % di integrazione come generati da ode45. % =0 la memorizzazione nel vettore XS avviene per i soli % istanti finali dei sotto-intervalli. % sys_d : nome del file con la dinamica del sistema, % ossia del file che permette il calcolo del secondo membro % dell'equazione differenziale descrivente la dinamica del sistema. % La chiamata alla funzione ode45 viene fatta come segue: % % [t,xs]=ode45('sys_d',time(i),time(i+1),x0,tol,0); % % tempo : vettore degli istanti di integrazione. % XS : matrice contenente il risultato dell'integrazione numerica % per colonne. Le colonne corrispondolo agli istanti di integrazione % memorizzati nel vettore tempo.% % Dati per graficare il corpo rigido (mostrato come un disco) % H : altezza del disco % R : raggio del disco % N : numero di facce del disco % % Nturn : giri al minuto del rotore [g/min], la veloctà angolare % in [rad/s] risulta pi*Nturn/30 clear all H=0.025; R=0.1; N=25; Nturn=500; comememo=1; % Questa parte serve a definire le condizioni iniziali. Per la definizione % dei parametri di Eulero iniziale si ricorre dapprima alla definizione della % matrice di rotazione utilizzando gli angolo di Eulero, quindi da essa si % determinano i parametri di Eulero. % Rotazioni (alfa,z), (beta,y), (gamma,x) secondo gli assi solidali. % con la function rot_tr % ATTENZIONE ! il seguente tensore d'inerzia deve essere identico a quello % utilizzato nella funzione bodyq.m, necessaria per la definizione % dell'equazione differenziale del sistema, in quantom non viene % passato a tale funzione. % Caratteristiche inerziali di un disco in acciaio (dens 7850 kg/m^3) % diametro 0.2 m, spessore 0.005 m, calcolate con in_cil.m % Queste caratteristiche (Ix=0.0031 Iy=0.0031 Iz=0.0062) vengono modificate % per tenere conto di un'assimetria nella distribuzione di massa. Ix=0.0031; Iy=0.0031*3; Iz=0.0062; Ixy=Ix*0.1; Ixz=Ix*0.2; Iyz=Iz*0.1; Inerzia=[[Ix Ixy Ixz];[Ixy Iy Iyz];[Ixz Iyz Iz]]; 11 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] W0=[0*pi*Nturn/30 0*pi*Nturn/30 pi*Nturn/30]'; alfa=0; % rotazioni in gradi beta=0; gamma=0; RB00=rot_tr(alfa,beta,gamma); % Matrice di rotazione iniziale q0=quatr(RB00); % Calcolo dei quaternioni, o parametri di Eulero, iniziali x0=[W0;q0]; tol=1e-6; time=[0:0.001:0.3]'; % costruzione dei sotto-intervalli for i=1:max(size(time))-1; % inizio integrazione time(i) [t,xs]=ode45('bodyq',time(i),time(i+1),x0,tol,0); % nxs=size(xs); if i==1, % istante iniziale if comememo==0 XS=[xs(max(nxs),:)]; tempo=t(max(nxs)); else XS=[xs]; tempo=t; end end if i>1, if comememo==0 % istanti successivi XS=[XS;xs(max(nxs),:)]; tempo=[tempo;t(max(nxs))]; else XS=[XS;xs(2:max(nxs),:)]; tempo=[tempo;t(2:max(nxs))]; end end x0=xs(max(nxs),:)'; % La condizione iniziale per l'istante i+1 diventa quella % finale per l'istante i % A questo punto è possibile inserire un'eventuale funzione per graficare il moto % oppure plottare (o salvare) le colonne del vettore XS assieme al tempo contenuto % nel vettore tempo. % figure(1) fkinbq(x0(4:7),H,R,N) RBA=rquat(x0(4:7)); % Calcolo della matrice di rotazione B-->A mediante i % parametri di Eulero q. A è il sdr fisso, B quello solidale % al corpo rigido. % Costruzione della matrice di trasformazione TBA TBA=trasm(RBA,[0 0 0]'); % Calcolo del momento angolare del corpo rigido, espresso nel sdr B. Mang=Inerzia*[x0(1) x0(2) x0(3)]'; % Plottaggio del momento angolare (indicato dal nome 'h') plvect(TBA,Mang,[0 0 0]',--------,'r',4,'h') % Plottaggio della velocità angolare (indicato dal nome 'W') 12 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] WB=[x0(1) x0(2) x0(3)]'; plvect(TBA,WB,[0 0 0]',-------,'m',4,'W') % Plottaggio del vettore velocità del punto [0 R R/2]' e del punto % [0 -R R/2]', indicato dal nome 'V' VBO=[0 0 0]'; % Velocità dell'origine del sdr solidale al corpo rigido VrelB=[0 0 0]'; % Velocità relativa del sdr solidale al corpo rigido pvelocit(TBA,VBO,VrelB,WB,[0 R R/2]',0.1,'b',4,'V') pvelocit(TBA,VBO,VrelB,WB,[0 -R R/2]',0.1,'b',4,'V') % Plottaggio del vettore accelerazione del punto [0 R R/2]' e del punto % [0 -R R/2]', indicato dal nome 'V'. Il calcolo dell'accelerazione angolare % viene effettutato con la funzione bodyq.m. yprime=bodyq(0,x0); AWB=yprime(1:3); % I primi tre elementi di yprime sono l'acc. angolare. ABO=[0 0 0]'; % Acc. dell'origine del sdr solidale al corpo rigido ArelB=[0 0 0]'; % Acc. relativa del sdr solidale al corpo rigido paccel(TBA,ABO,ArelB,VrelB,WB,AWB,[0 R R/2]',0.001,'r',4,'A') paccel(TBA,ABO,ArelB,VrelB,WB,AWB,[0 -R R/2]',0.001,'r',4,'A') hold off pause(0.01) % pausa di 0.01 secondi, serve unicamente per mostrare l'immagine figure(2) subplot(221) plot(tempo,XS(:,4)) xlabel('t [s]') ylabel('q0 ') subplot(222) plot(tempo,XS(:,5)) xlabel('t [s]') ylabel('q1') subplot(223) plot(tempo,XS(:,6)) xlabel('t [s]') ylabel('q2') subplot(224) plot(tempo,XS(:,7)) xlabel('t [s]') ylabel('q3') % Con la seguente linea è possibile plottare la somma dei quaternioni, se % l'integrazione numerica è corretta deve essere pari ad 1. %plot(tempo,XS(:,4).^2+XS(:,5).^2+XS(:,6).^2+XS(:,7).^2) if i==1 pause;end % serve per allargare la finestra con il mouse end La (2.13) viene determinata attraverso bodyq: function yprime=bodyq(t,X) % % Viene valutato il primo membro dell'equazione differenziale dinamica e cinematica % del moto di un corpo rigido. Per la parte cinematica si sfruttano i parametri % di Eulero. % % X : vettore di stato. Contiene le velocità angolari e i parametri di Eulero: % % X=[Wx Wy Wz q0 q1 q2 q3]' % % t : tempo W(1,1)=X(1); 13 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] W(2,1)=X(2); W(3,1)=X(3); % La seguente definizione dei quaternioni serve a prevenire eventuali errori % di arrotondamento che possono portare a violare la condizione: % % q0^2+q1^2+q2^2+q3^2=1 % % Pag. 32 Wittenburg q(1,1)=X(4)/norm(X(4:7)); q(2,1)=X(5)/norm(X(4:7)); q(3,1)=X(6)/norm(X(4:7)); q(4,1)=X(7)/norm(X(4:7)); % Caratteristiche inerziali di un disco in acciaio (dens 7850 kg/m^3) % diametro 0.2 m, spessore 0.005 m, calcolate con in_cil.m % Queste caratteristiche (Ix=0.0031 Iy=0.0031 Iz=0.0062) vengono modificate % per tenere conto di un'assimetria nella distribuzione di massa. Ix=0.0031; Iy=0.0031*3; Iz=0.0062; Ixy=Ix*0.1; Ixz=Ix*0.2; Iyz=Iz*0.1; Inerzia=[[Ix Ixy Ixz];[Ixy Iy Iyz];[Ixz Iyz Iz]]; yprime(1:3,1)=-inv(Inerzia)*cross(W,Inerzia*W); yprime(4:7,1)=qdot(W,q); Come si può osservare in bodyq i parametri di eulero sono valutati come segue [6]: q∗ = q 3 ∑q 2 i i =0 per evitare che il vincolo (1.1.24) q02 + q12 + q22 + q32 = 1 venga violato per le approssimazioni dovute all'integrazione numerica La seconda delle (2.13) è ottenuta con la funzione qdot: function qd=qdot(W,q) % Calcolo della derivata dei parametri di Eulero noti la velocità % angolare W espressa nel sdr solidale al corpo rigido ed i parametri % di Eulero istantanei. qd=0.5*[[0 -W'];[W,-tilde(W)]]*q; Come si vede in questa funzione si trova a sua volta la funzione tilde la quale trasforma un vettore nella matrice "tilde" di tale vettore (vedi la (1.1.27)). Il moto del copo rigido, rappresentato come un disco, viene efettuato attraverso la funzione fkinbq: function a=fkinbq(q,H,R,N) % fkintop.m : Funzione per la visualizzazione 3D di un corpo rigido % mediante i parametri di Eulero. 14 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] % Dati per graficare il corpo rigido, mostrato come un cilindro % H : altezza del disco % R : raggio del disco % N : numero di facce del disco % % Questo programma permette di impostare gli angoli e vedere il risultato a video. RBA=rquat(q); % Calcolo della matrice di rotazione B-->A mediante i % parametri di Eulero q. A è il sdr fisso, B quello solidale % al corpo rigido. % Costruzione della matrice di trasformazione TBA TBA=trasm(RBA,[0 0 0]'); pltassi(eye(4),'g','0',0,0.3) hold on view([1 1 0.2]) axis([-1 1 -1 1 -1 1]*0.4) pltassi(TBA,'b','b',0,0.3) plroto(eye(4),TBA,'m',H,R,N) % La seguente permette di plottare un prisma avente lx=R % ly=r, lz=R/2 al posto del disco. % Per chiarimenti sia veda la funzione prismac. %prismac([R R],[R R],[R R]*0.5,4,4,TBA,[0 0 -R/2*0.5]') Per quanto riguarda la funzione plroto verrà ripresa nella sezione dedicata alla robotica. In alternativa al disco è possibile visualizzare un prisma mediante la funzione prismac. function dummy=prismac(a,b,c,nx,ny,T,G) % Plottaggio di un prisma a lati paralleli con coperchi % T : operatore di roto-traslazione % G : posizione dell'origine del sdr centrato nel centro della base % rispetto al baricentro, espressa nel sdr con origine nel baricentro % e traslato rispetto a quello alla base. % a : vettore contenente le lunghezze secondo x % b : vettore contenente le lunghezze secondo y % b : vettore contenente le lunghezze secondo z (rappresenta l'altezza) % nx : numero di segmenti lungo x % ny : numero di segmenti lungo y % % % Provare, ad esempio : prismac([2 2],[2 2],[3 3],4,4,eye(4),[0 0 -3/2]') % oppure : prismac([3 3 3],[3 3 3],[3 3 3],4,4,eye(4),[0 0 -3/2]') a=[[1e-4 1e-4],a,1e-4]; b=[[1e-4 1e-4],b,1e-4]; c=[[0 0 0],c]; nz=max(size(a)); for k=1:nz l1y=[-b(k)/2:b(k)/(ny-1):b(k)/2]; l1x=ones(size(l1y))*a(k)/2; l1z=ones(size(l1x))*c(k); l2x=[a(k)/2:-a(k)/(nx-1):-a(k)/2]; l2y=ones(size(l2x))*b(k)/2; l2z=ones(size(l2x))*c(k); l3y=[b(k)/2:-b(k)/(ny-1):-b(k)/2]; l3x=-ones(size(l3y))*a(k)/2; 15 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] l3z=ones(size(l3x))*c(k); l4x=[-a(k)/2:a(k)/(nx-1):a(k)/2]; l4y=-ones(size(l4x))*b(k)/2; l4z=ones(size(l4x))*c(k); X(k,:)=[[l1x l2x l3x l4x]]; Y(k,:)=[[l1y l2y l3y l4y]]; Z(k,:)=[[l1z l2z l3z l4z]]; end [X,Y,Z]=trasfg(X,Y,Z,T*trasm(eye(3),G)); % Plottaggio % [127/255 1 212/255] definisce il colore 'acqua marina' surface(X,Y,Z,'FaceColor',[127/255 1 212/255],'EdgeColor','k') Con il comando dy_bq si ottengono due figure nelle quali vi è la rappresentazione del moto del sistema in tre dimensioni e l'andamento dei parametri di Eulero. La Fig. 2.1.1 contiene quattro configurazioni assunte dal disco in altrettanti istanti. La Fig. 2.1.2 mostra l'andamento dei parametri di Eulero. W W 0.4 h 0.4 0.3 h 0.3 0.2 0.2 V A 0. V 0. 0 A V A 0 - - -0.2 -0.3 -0.4 -0.4 A -0.2 V -0.3 -0.2 0 0.2 0.4 0.4 0.2 -0.2 0 -0.4 -0.4 -0.4 -0.2 0 0.2 t=0.01 s W 0.4 0.4 0 -0.2 -0.4 0.2 0 -0.2 -0.4 0.2 W 0.4 h 0.3 h 0.3 0.2 0.2 0. V A V A 0. 0 V 0 - A - A -0.2 -0.2 V -0.3 -0.4 -0.4 0.4 -0.3 -0.2 0 0.2 0.4 0.4 0.2 0 -0.2 -0.4 -0.4 -0.4 -0.2 0 0.2 0.4 0.4 t=0.2 s t=0.3 s Fig. 2.1.1 Moto tridimensionale di un disco in quattro istanti ottenuto con dy_bq. Nella Fig. 2.1.1 si osservi la costanza del momento angolare h dovuta al fatto che sono assenti le coppie esterne. Si osservi, inoltre, come il moto si trasferisca sugli altri assi anche se inizialmente è imposto secondo l'asse del disco, questo perché il disco non è omogeneo (vedi il listato di dy_bp e bodyq). Usando la funzione prismac al posto di plroto in fkinbq si ottiene la visualizzazione del moto di un prisma, Fig. 2.1.2. 16 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] W W 0.4 h 0.4 0.3 0.2 0.2 V A 0. 0 A V -0.2 -0.3 -0.3 0 0.2 0.4 0.4 A 0 -0.2 -0.2 V 0. - -0.4 -0.4 h 0.3 0.2 -0.2 0 A -0.4 -0.4 -0.4 V -0.2 0 0.2 W -0.2 0 -0.2 -0.4 0.2 W 0.4 h 0.3 h 0.3 0.2 0.2 0. V A V A 0. V 0 0 A - A -0.2 -0.2 V -0.3 -0.3 -0.4 -0.4 0 -0.4 0.2 t=0.1 s t=0.01 s 0.4 0.4 0.4 -0.2 0 0.2 0.4 0.4 0.2 0 -0.2 -0.4 -0.4 -0.4 -0.2 0 0.2 0.4 0.4 t=0.3 s t=0.2 s Fig. 2.1.2 Moto tridimensionale di un prisma in quattro istanti ottenuto con dy_bq. 1 1 0.5 0.5 0 0 q1 q0 -0.5 -1 -0.5 0 -1 0.2 0 t [s] 0.2 t [s] 1 1 0.5 0.5 0 0 q2 q3 -0.5 -1 -0.5 0 -1 0.2 t [s] 0 0.2 t [s] Fig. 2.1.3 Andamento dei parametri di Eulero ottenuto con dy_bq. L'andamento temporale dei parametri di Eulero è riportato nella Fig. 2.1.3. Si può immediatamente verificare come il vincolo sui parametri di Eulero q02 + q12 + q22 + q32 = 1 sia soddisfatto. Infatti con il comando: 17 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] » plot(tempo,XS(:,4).^2+XS(:,5).^2+XS(:,6).^2+XS(:,7).^2) si ottiene la Fig. 2.1.4. 2 1 .5 1 0 .5 0 0 0 .0 5 0 .1 0 .1 5 0 .2 0 .2 5 0 .3 Fig. 2.1.4 Verifica che q + q + q + q = 1 . 2 0 2 1 2 2 2 3 Nella simulazione a video la velocità angolare è rappresentata in magenta, il momento angolare in rosso, il sdr fisso in verde, il sdr solidale al disco in blu, la velocità lineare dei due punti considerati (vedi il listato) in blu e l'accelerazione in rosso. Moto roto-traslazionale di un corpo rigido Nel caso in cui si consideri il moto roto-traslazionale di un corpo rigido è necessario aggiungere alle (2.1.3) l'equazione della dinamica traslazionale (2.16): m B vC + m B ω B , A × B vC = Bf (2.16 bis pertanto la (2.1.3) diventa: B ω B , A = BI −1 B τ C − B ω B , A × BI Bω B , A q0 q0 B T q1 1 01,3 − ω B , A q1 = B ~ q q2 2 ω B , A − B ω B ,A 2 q q3 3 B B f B − ω B , A × B vC vC = m ( ) (2.1.5 A questo sistema di equazioni differenziali si deve aggiungere l'equazione cinematica traslazionale in quanto la posizione va valutata nel sdr fisso A. In definitiva la (2.1.5) diventa: 18 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] B ω B , A = B I −1 B τ C − B ω B , A × B I B ω B , A ( Dinamica rotaz . sdr B ) q 0 q 0 B T q1 1 01,3 − ω B , A q1 ( Cinematica rotaz . sdr B ) = B B~ q 2 2 ω B , A − ω B , A q 2 q 3 q 3 B f B − ω B ,A × B vC ( Dinamica trasl . sdr B ) B v C = m A P = AR B v ( Cinematica trasl . sdr A ) C C B ( ) Il contributo dovuto alla forza peso nel computo della forza W = m AB R Ag = m BA R ( ) B T A g = m BA R ( ) {0 T 0 −9.81} B (2.1.6 f diventa: T (2.1.7 avendo orientato l'asse z del sdr fisso A secondo la verticale ascendente. Si viene così ha creare un sistema di equazioni differenziali il cui vettore di stato è il seguente: 1 x = ω x 2 ωy 3 ωz 4 5 q0 q1 q 2 6 7 8 9 10 11 12 q3 v Cx v Cy v Cz P Cx P Cy P Cz 13 T (2.1.8 Con la stessa filosofia utilizzata per sviluppare dy_bq è stato messo a punto dy_bqt attraverso il quale viene integrato numericamente con la funzione di MATLAB ODE45 il sistema (2.1.6); dy_bqt permette, inoltre, la visualizzazione del moto del corpo rigido, ora rappresentato con un disco, di plottare il vettore momento angolare, la velocità angolare e la velocità ed accelerazione del baricentro del corpo rigido, nonché la traiettoria del centro di massa. % dy_bq.m : integrazione di un'equazione differenziale con % la funzione ode45 dell'equazione del moto di un corpo rigido % nel caso in cui le equazioni cinematiche siano espresse con % i parametri di Eulero. Si tiene conto anche del moto traslazionale % del baricentro del corpo rigido. % % Il tempo di integrazione viene diviso in sotto-intervalli, per % ognuno dei quali la condizione finale diventa iniziale % per quello successivo. % x0 : vettore delle condizioni iniziali % Contiene le velocità angolari, i parametri di Eulero, la % velocità, la posizione. % % x0=[Wx Wy Wz q0 q1 q2 q3 Vx Vy Vz Px Py Pz]' % % all'istante iniziale. % La velocità angolare, la velocità lineare sono determinate % nel sdr solidale al corpo rigido, la posizione è calcolata % nel sdr fisso. % % toll : tolleranza di integrazione. Consigliata 1e-4 ma se si aumenta % la velcotà di spin del corpo rigido (Nturn) per valori elevati % (>10000 g/min) si consiglia di ridurla a 1e-8. Questo rallenta % l'esecuzione ma aumenta decisamente l'accuratezza % nell'integrazione numerica. % comememo : =1 si ottiene la memorizzazione in tutti gli istanti 19 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] % di integrazione come generati da ode45. % =0 la memorizzazione nel vettore XS avviene per i soli % istanti finali dei sotto-intervalli. % sys_d : nome del file con la dinamica del sistema, % ossia del file che permette il calcolo del secondo membro % dell'equazione differenziale descrivente la dinamica del sistema. % La chiamata alla funzione ode45 viene fatta come segue: % % [t,xs]=ode45('sys_d',time(i),time(i+1),x0,tol,0); % % tempo : vettore degli istanti di integrazione. % XS : matrice contenente il risultato dell'integrazione numerica % per colonne. Le colonne corrispondolo agli istanti di integrazione % memorizzati nel vettore tempo. % % Dati per graficare il corpo rigido (mstrato come un disco) % H : altezza del disco % R : raggio del disco % N : numero di facce del disco % % Nturn : giri al minuto del rotore [g/min], la veloctà angolare % in [rad/s] risulta pi*Nturn/30 clear all H=0.025; R=0.1; N=25; Nturn=500; comememo=1; % Questa parte serve a definire le condizioni iniziali. Per la definizione % dei parametri di Eulero iniziale si ricorre dapprima alla definizione della % matrice di rotazione utilizzando gli angolo di Eulero, quindi da essa si % determinano i parametri di Eulero. % Rotazioni (alfa,z), (beta,y), (gamma,x) secondo gli assi solidali. % con la function rot_tr % ATTENZIONE ! il seguente tensore d'inerzia deve essere identico a quello % utilizzato nella funzione bodyq.m, necessaria per la definizione % dell'equazione differenziale del sistema, in quanto non viene % passato a tale funzione. % Caratteristiche inerziali di un disco in acciaio (dens 7850 kg/m^3) % diametro 0.2 m, spessore 0.005 m, calcolate con in_cil.m Ix=0.0031; Iy=0.0031; Iz=0.0062; Ixy=Ix*0.0; Ixz=Ix*0.0; Iyz=Iz*0.0; Inerzia=[[Ix Ixy Ixz];[Ixy Iy Iyz];[Ixz Iyz Iz]]; alfa=0; % rotazioni in gradi beta=0; gamma=0; RB00=rot_tr(alfa,beta,gamma); % Matrice di rotazione iniziale (sdr B) W0=[0 0.4*pi*Nturn/30 pi*Nturn/30]'; % Velocità angolare iniziale q0=quatr(RB00); % Calcolo dei quaternioni, o parametri di Eulero, iniziali 20 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] V0=[0 2 3]'; % Velocità traslazionale iniziale (sdr B) P0=[0 0 0]'; % Posizione iniziale (sdr A) x0=[W0;q0;V0;P0]; tol=1e-6; time=[0:0.01:50]'; % costruzione dei sotto-intervalli for i=1:max(size(time))-1; % inizio integrazione time(i) [t,xs]=ode45('bodyqt',time(i),time(i+1),x0,tol,0); % nxs=size(xs); if i==1, % istante iniziale if comememo==0 XS=[xs(max(nxs),:)]; tempo=t(max(nxs)); else XS=[xs]; tempo=t; end end if i>1, if comememo==0 % istanti successivi XS=[XS;xs(max(nxs),:)]; tempo=[tempo;t(max(nxs))]; else XS=[XS;xs(2:max(nxs),:)]; tempo=[tempo;t(2:max(nxs))]; end end x0=xs(max(nxs),:)'; % La condizione iniziale per l'istante i+1 diventa quella % finale per l'istante i % A questo punto è possibile inserire un'eventuale funzione per graficare il moto % oppure plottare (o salvare) le colonne del vettore XS assieme al tempo contenuto % nel vettore tempo. % figure(1) fkinbqt(x0(4:7),x0(11:13),H,R,N) plot3(XS(:,11),XS(:,12),XS(:,13),'-.') % Plottaggio treiettoria centro di massa RBA=rquat(x0(4:7)); % Calcolo della matrice di rotazione B-->A mediante i % parametri di Eulero q. A è il sdr fisso, B quello solidale % al corpo rigido. % Costruzione della matrice di trasformazione TBA TBA=trasm(RBA,x0(11:13)); % Calcolo del momento angolare del corpo rigido, espresso nel sdr B. Mang=Inerzia*[x0(1) x0(2) x0(3)]'; plvect(TBA,Mang,[0 0 0]',1,'r',4,'h') % Plottaggio della velocità angolare (indicato dal nome 'W') WB=[x0(1) x0(2) x0(3)]'; plvect(TBA,WB,[0 0 0]',0.008,'m',4,'W') % Plottaggio del vettore velocità del baricentro del corpo rigido, indicato dal nome 'V' VBO=x0(8:10); % Velocità dell'origine del sdr solidale al corpo rigido 21 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] VrelB=[0 0 0]'; % Velocità relativa del sdr solidale al corpo rigido pvelocit(TBA,VBO,VrelB,WB,0*[0 0 0]',0.08,'k',4,'V') % Plottaggio del vettore accelerazione del baricentro del corpo rigido, indicato dal nome 'A' % Il calcolo dell'accelerazione angolare viene effettuato con la funzione bodyqt.m. yprime=bodyqt(0,x0); AWB=yprime(1:3); % I primi tre elementi di yprime sono l'acc. angolare. ABO=yprime(8:10)+cross(WB,x0(8:10)); % Acc. dell'origine del sdr solidale al corpo rigido ArelB=[0 0 0]'; % Acc. relativa del sdr solidale al corpo rigido paccel(TBA,ABO,ArelB,VrelB,WB,AWB,[0 0 0]',0.05,'r',4,'A') hold off pause(0.01) % pausa di 0.01 secondi, serve unicamente per mostrare l'immagine figure(2) subplot(221) plot(tempo,XS(:,4)) xlabel('t [s]') ylabel('q0 ') subplot(222) plot(tempo,XS(:,5)) xlabel('t [s]') ylabel('q1') subplot(223) plot(tempo,XS(:,6)) xlabel('t [s]') ylabel('q2') subplot(224) plot(tempo,XS(:,7)) xlabel('t [s]') ylabel('q3') % Con la seguente linea è possibile plottare la somma dei quaternioni, se % l'integrazione numerica è corretta deve essere pari ad 1. %plot(tempo,XS(:,4).^2+XS(:,5).^2+XS(:,6).^2+XS(:,7).^2) if i==1 pause;end % serve per allargare la finestra con il mouse end Il calcolo del secondo membro della (2.1.6) viene effettuato dalla funzione bodyqt. function yprime=bodyqt(t,X) % % Viene valutato il primo membro dell'equazione differenziale dinamica e cinematica % del moto di un corpo rigido. Per la parte cinematica si sfruttano i parametri % di Eulero. % % X : vettore di stato. Contiene le velocità angolari e i parametri di Eulero: % % x0=[Wx Wy Wz q0 q1 q2 q3 Vx Vy Vz Px Py Pz]' % % La velocità angolare, la velocità lineare sono determinate % nel sdr solidale al corpo rigido, la posizione è calcolata % nel sdr fisso. % % t : tempo % Velocità angolare (nel sdr B, solidale al corpo rigido) 22 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] W(1,1)=X(1); W(2,1)=X(2); W(3,1)=X(3); % La seguente definizione dei quaternioni serve a prevenire eventuali errori % di arrotondamento che possono portare a violare la condizione: % % q0^2+q1^2+q2^2+q3^2=1 % % Pag. 32 Wittenburg q(1,1)=X(4)/norm(X(4:7)); q(2,1)=X(5)/norm(X(4:7)); q(3,1)=X(6)/norm(X(4:7)); q(4,1)=X(7)/norm(X(4:7)); % Velocità lineare (nel sdr B, solidale al corpo rigido) V(1,1)=X(8); V(2,1)=X(9); V(3,1)=X(10); % Posizione (nel sdr A, fisso) P(1,1)=X(11); P(2,1)=X(12); P(3,1)=X(13); % Caratteristiche inerziali di un disco in acciaio (dens 7850 kg/m^3) % diametro 0.2 m, spessore 0.005 m, calcolate con in_cil.m Ix=0.0031; Iy=0.0031; Iz=0.0062; Ixy=Ix*0.0; Ixz=Ix*0.0; Iyz=Iz*0.0; Inerzia=[[Ix Ixy Ixz];[Ixy Iy Iyz];[Ixz Iyz Iz]]; Massa=1.2; RBA=rquat(q); PesoB=RBA'*[0 0 -9.81]'*Massa; yprime(1:3,1)=-inv(Inerzia)*cross(W,Inerzia*W); % Eq. dinamica rotazionale (sdr B) yprime(4:7,1)=qdot(W,q); % Eq. cinematica rotazionale (sdr B) yprime(8:10,1)=PesoB/Massa-cross(W,V); % Eq. dinamica traslazionale F=m a (sdr B) yprime(11:13,1)=rquat(q)*V; % Eq. cinematica traslazionale dP/dt=v (sdr A) La visualizzazione del moto del corpo rigido, rappresentato mediante un disco si ottiene attraverso la funzione fkinbqt. function a=fkinbqt(q,P,H,R,N) % fkintop.m : Funzione per la visualizzazione 3D di un copro rigido % mediante i parametri di Eulero tenendo conto anche del moto % traslazionale, definito dal vattore P. % Dati per graficare il corpo rigido, mostrato come un cilindro % H : altezza del disco % R : raggio del disco % N : numero di facce del disco % % Questo programma permette di impostare gli angoli e vedere il risultato a video. RBA=rquat(q); % Calcolo della matrice di rotazione B-->A mediante i 23 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] % parametri di Eulero q. A è il sdr fisso, B quello solidale % al corpo rigido. % Costruzione della matrice di trasformazione TBA TBA=trasm(RBA,P); pltassi(eye(4),'g','A',1,0.3) hold on view([1 1 0.2]) axis([-1 1 -1 1 -1 1]*1) pltassi(TBA,'b','B',0,0.3) plroto(eye(4),TBA,'m',H,R,N) % La seguente permette di plottare un prisma avente lx=R % ly=r, lz=R/2 al posto del disco. % Per chiarimenti sia veda la funzione prismac. %prismac([R R],[R R],[R R]*0.5,4,4,TBA,[0 0 -R/2*0.5]') Per quanto riguarda la funzione plroto verrà ripresa nella sezione dedicata alla robotica. Anche ora, in alternativa al disco, è possibile visualizzare un prisma mediante la funzione prismac. 1 1 W h W h z AV 0.5 0 xA 0.5 V zA 0 yA xA yA A -0.5 - -0.5 A -0.5 0 0.5 1 0.5 1 0 -0.5 - - -0.5 0 0.5 1 0.5 1 -0.5 0 - t=0.2 s t=0.01 s 1 1 0.8 W h 0.6 0.5 0.4 zA zA 0.2 0 xA V yA 0 xA yA W h -0.2 A -0.4 -0.5 -0.6 -0.8 - -0.5 0 0.5 1 1 0.5 0 -0.5 -1 -1 - V -0.5 0 0.5 1 1 0.5 0 A -0.5 -1 t=0.5 s t=0.7 s Fig. 2.1.5 Moto roto-traslazionale di un disco in quattro istanti ottenuto con dy_bqt. Le condizioni iniziali sono evidenti nel listato di dy_bqt. Nella Fig. 2.1.5 si osservi la costanza del momento angolare h dovuta al fatto che sono assenti le coppie esterne. La Fig. 2.1.6 mostra la vista da x A del moto, si noti la tangenza del vettore velocità con la traiettoria. 24 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] 1 W h 0.8 0.6 V 0.4 zA 0.2 0 xA yA A -0.2 -0.4 -0.6 -0.8 -1 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 Fig. 2.1.6 Tangenza della velocità alla traiettoria, ottenuto con dy_bqt. 1 0.2 0 .5 0.1 0 0 q1 q0 -0.5 -1 0 -0 .1 0 .2 0 .4 t [s] 0 .6 -0 .2 0 0 .8 0 .2 1 0 .1 0.5 0 0.2 0.4 t [s] 0 .6 0 .8 0.2 0.4 t [s] 0 .6 0 .8 0 q2 q3 -0.1 -0.2 0 -0 .5 0 .2 0 .4 t [s] 0 .6 -1 0 .8 0 Fig. 2.1.7 Andamento dei parametri di Eulero ottenuto con dy_bqt. L'andamento temporale dei parametri di Eulero è riportato nella Fig. 2.1.7. Anche ora si può immediatamente verificare come il vincolo sui parametri di Eulero q02 + q12 + q22 + q32 = 1 sia soddisfatto. Infatti con il comando: » plot(tempo,XS(:,4).^2+XS(:,5).^2+XS(:,6).^2+XS(:,7).^2) si ottiene la Fig. 2.1.8. 25 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] 2 1 .5 1 0 .5 0 0 0 .1 0 .2 0 .3 0 .4 0 .5 0 .6 0 .7 Fig. 2.1.8 Verifica che q + q + q + q = 1 . 2 0 2 1 2 2 2 3 Si osservi come il disco non si capovolga anche se inizialmente viene impressa una velocità angolare attorno all'asse x pari a 0.4 volte quella secondo all'asse di simmetria z. Questo rappresenta l'effetto stabilizzante tipico dei corpi rigidi dotati di struttura giroscopica (uguaglianza dei momenti d'inerzia trasversali) dotati si spin rispetto all'asse di simmetria. Questo effetto diventa particolarmente evidente all'aumentare dello spin. Nella Fig. 2.1.9 viene riportato l'andamento temporale dei parametri di Eulero quando sul disco viene applicata una coppia di 20 Nm fra 0.1 e 0.2 s, lo spin è di 500 g/min. q0 1 1 0.5 0.5 0 q1 -0.5 -1 0 0 -0.5 0.2 t [s] -1 0 0.4 1 2 0.5 1 q2 0 q3 0 -0.5 0 0.2 t [s] -1 0 0.4 0.2 t [s] 0.4 0.2 t [s] 0.4 Fig. 2.1.9 Andamento dei parametri di Eulero con coppia esterna applicata pari a 10 Nm fra 0.1 e 0.2 s e spin di 500 g/min. 26 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] Si osservi come lo spin non eccessivamente elevato fa in modo che il disco sia soggetto a ribaltamento, Fig. 2.1.10. W 1 h 0.8 0.6 V 0.4 zA 0.2 0 xA yA A -0.2 -0.4 -0.6 -0.8 -1 -1 -0.5 0 0.5 1 0.5 1 0 -1 -0.5 Fig. 2.1.10 Istante 0.3 s, ribaltamento del disco con coppia esterna applicata pari a 10 Nm fra 0.1 e 0.2 s e spin di 500 g/min. La Fig. 2.1.11 mostra invece il caso in cui lo spin sia di 5000 g/min. Risulta evidente la stabilità dell'assetto, in particolare dai parametri di Eulero q1 e q2 . 1 q0 0.02 0.01 0 q1 0 -1 -2 0 -0.01 0.2 t [s] -0.02 0 0.4 0.01 2 0.005 1 q2 q3 0 -0.005 -0.01 0 0.2 t [s] 0.4 0.2 t [s] 0.4 0 -1 0.2 t [s] -2 0 0.4 27 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] Fig. 2.1.11 Andamento dei parametri di Eulero con coppia esterna applicata pari a 10 Nm fra 0.1 e 0.2 s e spin di 5000 g/min. La Fig. 2.1.12 mostra con maggiore chiarezza la stabilità dovuta all'effetto giroscopico. Si confronti questa figura con la Fig. 2.1.10. W h 1 V 0.5 zA 0 xA yAA -0.5 -1 -1 -0.5 0 0.5 0.5 0 -0.5 -1 1 1 Fig. 2.1.12 Istante 0.3 s, stabilità del moto rotazionale del disco con coppia esterna applicata pari a 10 Nm fra 0.1 e 0.2 s e spin di 5000 g/min. Nell'integrazione l'introduzione di forzanti dipendenti dal tempo viene effettuata nella funzione che calcola il secondo membro dell'equazione differenziale, in questo caso bodyqt, come segue: function yprime=bodyqt(t,X) % % Viene valutato il primo membro dell'equazione differenziale dinamica e cinematica % del moto di un corpo rigido. Per la parte cinematica si sfruttano i parametri % di Eulero. % % X : vettore di stato. Contiene le velocità angolari e i parametri di Eulero: % % x0=[Wx Wy Wz q0 q1 q2 q3 Vx Vy Vz Px Py Pz]' % % La velocità angolare, la velocità lineare sono determinate % nel sdr solidale al corpo rigido, la posizione è calcolata % nel sdr fisso. % % t : tempo % Velocità angolare (nel sdr B, solidale al corpo rigido) W(1,1)=X(1); W(2,1)=X(2); W(3,1)=X(3); % La seguente definizione dei quaternioni serve a prevenire eventuali errori % di arrotondamento che possono portare a violare la condizione: % % q0^2+q1^2+q2^2+q3^2=1 28 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] % % Pag. 32 Wittenburg q(1,1)=X(4)/norm(X(4:7)); q(2,1)=X(5)/norm(X(4:7)); q(3,1)=X(6)/norm(X(4:7)); q(4,1)=X(7)/norm(X(4:7)); % Velocità lineare (nel sdr B, solidale al corpo rigido) V(1,1)=X(8); V(2,1)=X(9); V(3,1)=X(10); % Posizione (nel sdr A, fisso) P(1,1)=X(11); P(2,1)=X(12); P(3,1)=X(13); % Caratteristiche inerziali di un disco in acciaio (dens 7850 kg/m^3) % diametro 0.2 m, spessore 0.005 m, calcolate con in_cil.m Ix=0.0031; Iy=0.0031; Iz=0.0062; Ixy=Ix*0.0; Ixz=Ix*0.0; Iyz=Iz*0.0; Inerzia=[[Ix Ixy Ixz];[Ixy Iy Iyz];[Ixz Iyz Iz]]; Massa=1.2; RBA=rquat(q); PesoB=RBA'*[0 0 -9.81]'*Massa; % Forzante dipendente dal tempo if t>= 0.1 & t<0.2 TAUEB=[10 0 0]'; else TAUEB=[0 0 0]'; end yprime(1:3,1)=inv(Inerzia)*[TAUEB-cross(W,Inerzia*W)]; % Eq. dinamica rotazionale (sdr B) yprime(4:7,1)=qdot(W,q); % Eq. cinematica rotazionale (sdr B) yprime(8:10,1)=PesoB/Massa-cross(W,V); % Eq. dinamica traslazionale F=m a (sdr B) yprime(11:13,1)=rquat(q)*V; % Eq. cinematica traslazionale dP/dt=v (sdr A) rappresenta la coppia esterna espressa nel sdr B solidale al corpo rigido. Si confronti questo listato con quello di bodyqt senza la forzante, si vede come sia semplice introdurre la dipendenza dal tempo. TAUEB Moto roto-traslazionale di un corpo rigido con un punto fisso Nel caso in cui si consideri il moto roto-traslazionale di un corpo rigido con un punto fisso si procede come per il caso senza punto fisso (2.1.5) introducendo le reazioni vincolari. Con riferimento alla Fig. 2.1.13, B rappresenta un sdr con origine nel centro di massa C del corpo rigido e solidale a quest'ultimo, sia f V la reazione vincolare in corrispondenza del punto fisso, indicando con BW la forza peso agente nel centro di massa del corpo rigido, l'equazione traslazionale (2.16) diventa: m B vC + B ω B ,A × B vC = Bf V + BW ( ) (2.1.9 mentre l'equazione di Eulero (2.14) per il moto rotazionale assume la seguente forma: 29 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] I ω B , A + B ω B , A × BI Bω B , A B B B −r B = (CO)× BfV (2.1.10 B dato che la coppia applicata è dovuta alla forza vincolare B f V che agisce con braccio ( CO) =− Br . Trattandosi di un moto rigido la formula fondamentale dei moti rigidi (1.2.3) espressa nel sdr B solidale al corpo rigido diventa: B 0 B vC = vO + B ω B , A × B r = B ω B , A × B r (2.1.11 Punto fisso ω B ,A ZB B O r fV C ZA YB vC XB XA YA Fig. 2.1.13 Schematizzazione di un corpo rigido roto-traslante con un punto fisso. La derivata della velocità del centro di massa B vC presente nella (2.1.9) viene effettuata nel sdr B (vedi le considerazioni che precedono la (1.2.2)), pertanto derivando la (2.1.11) in tale sdr si ha: B 0 C B C B B B v C = ω B , A × r + ω B , A × rC = B ωC B , A × B r (2.1.12 L'equazione traslazionale (2.1.9) risolta in termini della reazione vincolare (2.1.11) e (2.1.12), diventa: B fV = m B ω B , A × B r + B ω B , A × [ ( B ω B , A × B r − BW )] B f V , in virtù delle (2.1.13 questa sostituita nell'equazione rotazionale (2.1.10) porge: 30 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] {[ } I Bω B , A + B ω B , A × BI Bω B , A =− B r × m B ω B , A × B r + B ω B , A × B ω B , A × B r − BW = − m B r × B ω B , A × B r − m B r × B ω B , A × B ω B , A × B r + B r × BW B ( [ ) )] ( )] ( (2.1.14 Portando a primo membro i termini comuni a B ω B , A ed esprimendo la forza peso secondo la (2.1.7) B W = ABR AW la precedente diventa: ( ) I B ω B , A + m B r × B ω B , A × B r = − B ω B , A × B I B ω B , A −m B r × B ω B , A × B [ ( B ω B , A × B r + B r × AB R AW (2.1.15 )] Il secondo termine del primo membro della (2.1.15) rappresenta un termine aggiuntivo all'inerzia rotazionale, può essere scritto come un opportuno tensore d'inerzia addizionale I m : mB r × ( B ) ω B , A × B r = I m B ω B , A (2.1.16 l'equazione rotazionale (2.1.15) diventa allora: [ B I + Im ] B ω B , A =− B ω B , A × B I B ω B , A −m B r × [ B ω B ,A × ( B ω B , A × B r + B r × AB R AW )] (2.1.17 Quindi il sistema (2.1.6), valido per un corpo rigido libero nello spazio, assume la seguente forma nel caso in cui vi sia un punto fisso: ( Dinamica rotaz . sdr B ) Bω B −1 B B B B B B B B B A = I − ω × I ω − m r × ω × ω × r + r × R W B ,A Tot . B ,A B ,A B ,A B ,A A ( Cinematica rotaz . sdr B ) q q 0 0 q B T − ω B , A q1 1 1 01,3 = B ~ q q 2 2 ω B , A − B ω B ,A 2 q 3 q 3 ( Cinematica trasl . sdr A ) A A PC = B R B ω B , A × B r [ [ ( Essendo B −1 I Tot . = ( B I + Im ) −1 ( )] ] (2.1.18 ) . I passaggi descritti dalla (2.1.9) alla (2.1.18) sono stati sviluppati mediante l'm-file dynarm ("arm" dall'inglese "braccio", per indicare il moto di un membro vincolato): % Determinazione dell'equazione del moto di un corpo rigido vincolato in un punto mediante % una cerniera sferica. Le equazioni sono ottenute mediante l'approccio di Newton-Eulero % non iterativo, nel senso che le forze trasmesse dal vincolo sul corpo vengono % determinate senza le iterazioni in avanti ed indietro clear all M=sym('m'); % Massa 31 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] % Accelerazione gravitazionale G=sym('[gx;gy;gz]'); G=symmul(M,G); % Posizione per il calcolo della velocità ed accelerazione (nel sdr B) R=sym('[r;0;0]'); % Posizione per il calcolo della coppia dovuta alle reazioni vincolari (nel sdr B) % (è semplicemente -R) Rf=sym('[-r;0;0]'); W=sym('[Wx;Wy;Wz]'); % Velocità angolare (sdr B) AW=sym('[AWx;AWy;AWz]'); % Accelerazione angolare (sdr B) I=sym('[Ix,Ixy,Ixz; Ixy,Iy,Iyz;Ixz,Iyz,Iz]'); % Tensore d'inerzia (sdr B) % Calcolo della velocità ed accelerazione del centro di massa (sdr B) V=esterno(W,R); dVdt=esterno(AW,R); % Calcolo delle forze vincolari applicate dai vincoli sul corpo (sdr B) F=symmul(M,symadd(dVdt,esterno(W,V))); F=symsub(F,G) % Calcolo della coppia applicata al corpo rigido, tiene conto della coppia % dovuta alle reazioni fincolari F e dell'inerzia rotazionale. TAU=expand(symsub(esterno(Rf,F),esterno(W,symmul(I,W)))); % Procedura per la determinazione della matrice di massa Im tau1=sym(TAU,1,1); tau2=sym(TAU,2,1); tau3=sym(TAU,3,1); ajoint1=sym(AW,1,1); ajoint2=sym(AW,2,1); ajoint3=sym(AW,3,1); Im=sym(3,3,'0'); % Calcolo degli elementi diagonali Im=sym(Im,1,1,diff(collect(tau1,ajoint1),ajoint1)); Im=sym(Im,2,2,diff(collect(tau2,ajoint2),ajoint2)); Im=sym(Im,3,3,diff(collect(tau3,ajoint3),ajoint3)); % Calcolo degli elementi extra diagonali Im=sym(Im,1,2,diff(collect(tau1,ajoint2),ajoint2)); Im=sym(Im,1,3,diff(collect(tau1,ajoint3),ajoint3)); Im=sym(Im,2,3,diff(collect(tau2,ajoint3),ajoint3)); Im=sym(Im,2,1,diff(collect(tau2,ajoint1),ajoint1)); Im=sym(Im,3,1,diff(collect(tau3,ajoint1),ajoint1)); Im=sym(Im,3,2,diff(collect(tau3,ajoint2),ajoint2)); Im=simple(Im); % Matrice di massa totale Itot=symsub(I,Im) % Calcolo del secondo membro dell'equazione del moto. E' il secondo membro 32 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] % della (2.1.17) TAU2=symsub(TAU,symmul(Im,AW)) Come si vede dalla definizione del vettore congiungente il punto fisso con il centro di massa, l'asse x del sdr solidale al corpo rigido è disposto secondo tale congiungente, cioè B i B // Br . Con il comando dynarm si ottiene, rispettivamente, per le reazioni vincolari f V , per il momento d'inerzia −1 totale B I Tot . e per il secondo membro della (2.1.17): F = [m*(-Wz^2*r-Wy^2*r)-m*gx] [ m*(AWz*r+Wx*Wy*r)-m*gy] [m*(-AWy*r+Wx*Wz*r)-m*gz] Itot = [ Ix, Ixy, Ixz] [Ixy, Iy+r^2*m, Iyz] [Ixz, Iyz, Iz+r^2*m] TAU2 = [Wz*Ixy*Wx+Wz*Iy*Wy+Iyz*Wz^2-Wy*Ixz*Wx-Iyz*Wy^2-Wy*Iz*Wz] [-Wz*Ixy*Wy+r^2*m*Wx*Wz-r*m*gz-Wz*Ix*Wx+Wx*Iz*Wz-Ixz*Wz^2+Ixz*Wx^2+Wx*Iyz*Wy] [Ixy*Wy^2-r^2*m*Wx*Wy+r*m*gy+Wy*Ix*Wx-Wx*Iyz*Wz+Wy*Ixz*Wz-Ixy*Wx^2-Wx*Iy*Wy] −1 Si osservi come il momento d'inerzia totale B I Tot . rappresenta il momento d'inerzia del corpo rigido ripetto al punto fisso. Il prodotto esterno simbolico viene effettuato mediante la funzione esterno. È l'equivalente simbolico delle funzione cross di MATLAB. function [vris]=esterno(u,v) % % Prodotto esterno simbolico vris=uxv % % Creazione della matrice utilde eval(['utilde=sym(''[0,',symmul(sym(u,3,1),-1),',',sym(u,2,1),';',sym(u,3,1),',0,',symmul(sym(u,1,1),1),';',symmul(sym(u,2,1),-1),',',sym(u,1,1),',0]'');']) % Calcolo del prodotto utilde v vris=symmul(utilde,v); Il sistema di equazioni differenziali (2.1.18) viene integrato numericamente mediante l'm-file dy_arm che provvede a graficare la velocità angolare, il momento angolare, le reazioni vincolari, il sdr solidale B, nonché il moto del corpo rigido. Per chiarezza di rappresentazione è stato scelto di rappresentare il corpo rigido come un disco vincolato in un punto della circonferenza. Il vettore di stato, in base al sistema (2.1.18), assume la seguente forma: 1 x = ω x 2 ωy 3 ωz 4 5 6 q0 q1 q 2 7 8 9 q3 PCx PCy P Cz 10 T % dy_arm.m : integrazione di un'equazione differenziale con % la funzione ode45 dell'equazione del moto di un corpo rigido % nel caso in cui le equazioni dinamiche siano determinate mediante % le equazioni di Newton_Eulero scritte però in termini di velocità % angolare e parametri di Eulero. 33 (2.1.19 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] % Il modello rappresenta il moto di un disco vincolato ad un punto % della circonferenza mediante un giunto sferico. % Rispetto all'approccio di Newton-Eulero iterativo risula molto % più agevole la scrittura delle equazioni del moto. % % Il tempo di integrazione viene diviso in sotto-intervalli, per % ognuno dei quali la condizione finale diventa iniziale % per quello successivo. % x0 : vettore delle condizioni iniziali % Contiene le velocità angolari, i parametri di Eulero, % la posizione del baricentro. % % x0=[Wx Wy Wz q0 q1 q2 q3 Px Py Pz]' % % all'istante iniziale. % La velocità angolare è determinate nel sdr solidale al corpo rigido, % la posizione è calcolata nel sdr fisso. % % toll : tolleranza di integrazione. Consigliata 1e-4 ma se si aumenta % la velcotà di spin del corpo rigido (Nturn) per valori elevati % (>10000 g/min) si consiglia di ridurla a 1e-8. Questo rallenta % l'esecuzione ma aumenta decisamente l'accuratezza % nell'integrazione numerica. % comememo : =1 si ottiene la memorizzazione in tutti gli istanti % di integrazione come generati da ode45. % =0 la memorizzazione nel vettore XS avviene per i soli % istanti finali dei sotto-intervalli. % sys_d : nome del file con la dinamica del sistema, % ossia del file che permette il calcolo del secondo membro % dell'equazione differenziale descrivente la dinamica del sistema. % La chiamata alla funzione ode45 viene fatta come segue: % % [t,xs]=ode45('sys_d',time(i),time(i+1),x0,tol,0); % % tempo : vettore degli istanti di integrazione. % XS : matrice contenente il risultato dell'integrazione numerica % per colonne. Le colonne corrispondono agli istanti di integrazione % memorizzati nel vettore tempo. % % Dati per graficare il disco % H : altezza del disco % R : raggio del disco % N : numero di facce del disco % % Nturn : giri al minuto del rotore [g/min], la veloctà angolare % in [rad/s] risulta pi*Nturn/30 clear all H=0.025/3; R=0.1; N=25; Nturn=0; comememo=1; % Questa parte serve a definire le condizioni iniziali. Per la definizione % dei parametri di Eulero iniziale si ricorre dapprima alla definizione della % matrice di rotazione utilizzando gli angolo di Eulero, quindi da essa si % determinano i parametri di Eulero. % Rotazioni (alfa,z), (beta,y), (gamma,x) secondo gli assi solidali. 34 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] % con la function rot_tr % ATTENZIONE ! il seguente tensore d'inerzia deve essere identico a quello % utilizzato nella funzione arm.m, necessaria per la definizione % dell'equazione differenziale del sistema, in quantom non viene % passato a tale funzione. % Caratteristiche inerziali di un disco in acciaio (dens 7850 kg/m^3) % diametro 0.2 m, spessore 0.005 m, calcolate con in_cil.m Ix=0.0031; Iy=0.0031; Iz=0.0062; Ixy=Ix*0.0; Ixz=Ix*0.0; Iyz=Iz*0.0; m=1.2; Inerzia=[[Ix Ixy Ixz];[Ixy Iy Iyz];[Ixz Iyz Iz]]; W0=[pi*Nturn/30 0 0]'; alfa=0; % rotazioni in gradi beta=90; gamma=0; RB00=rot_tr(alfa,beta,gamma); % Matrice di rotazione iniziale q0=quatr(RB00); % Calcolo dei quaternioni, o parametri di Eulero, iniziali P0=[0 0 0]'; % Posizione iniziale (sdr A) x0=[W0;q0;P0]; tol=1e-6; time=[0:0.01:50]'; % costruzione dei sotto-intervalli for i=1:max(size(time))-1; % inizio integrazione time(i) [t,xs]=ode45('arm',time(i),time(i+1),x0,tol,0); % nxs=size(xs); if i==1, % istante iniziale if comememo==0 XS=[xs(max(nxs),:)]; tempo=t(max(nxs)); else XS=[xs]; tempo=t; end end if i>1, if comememo==0 % istanti successivi XS=[XS;xs(max(nxs),:)]; tempo=[tempo;t(max(nxs))]; else XS=[XS;xs(2:max(nxs),:)]; tempo=[tempo;t(2:max(nxs))]; end end x0=xs(max(nxs),:)'; % La condizione iniziale per l'istante i+1 diventa quella % finale per l'istante i % A questo punto è possibile inserire un'eventuale funzione per graficare il moto 35 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] % oppure plottare (o salvare) le colonne del vettore XS assieme al tempo contenuto % nel vettore tempo. % figure(1) fkinarm(x0(4:7),x0(8:10),H,R,N) RBA=rquat(x0(4:7)); % Calcolo della matrice di rotazione B-->A mediante i % parametri di Eulero q. A è il sdr fisso, B quello solidale % al corpo rigido. % Costruzione della matrice di trasformazione TBA. Per mostrare il gettone con % l'esse z orizzontale RBA deve essere premoltiplicata per [[0 1 0];[0 0 1];[1 0 0]]; TA0=trasm([[0 1 0];[0 0 1];[1 0 0]],[0 0 0]'); TBA=trasm(RBA,x0(8:10)); % Calcolo del momento angolare del corpo rigido, espresso nel sdr B. Mang=Inerzia*[x0(1) x0(2) x0(3)]'; % Plottaggio del momento angolare (indicato dal nome 'h') plvect(TA0*TBA,Mang,[0 0 0]',5,'r',4,'h') % Plottaggio della velocità angolare (indicato dal nome 'W') WB=[x0(1) x0(2) x0(3)]'; plvect(TA0*TBA,WB,[0 0 0]',0.02,'m',4,'W') % Plottaggio del vettore velocità del baricentro del gettone, indicato dal nome 'V' VBO=cross(WB,[R 0 0]'); % Velocità dell'origine del sdr solidale al corpo rigido VrelB=[0 0 0]'; % Velocità relativa del sdr solidale al corpo rigido pvelocit(TA0*TBA,VBO,VrelB,WB,[0 0 0]',0.35,'k',4,'V') % Plottaggio del vettore accelerazione del punto [0 0 0]' indicato dal nome 'A'. % Il calcolo dell'accelerazione angolare viene effettuato con la funzione arm.m. yprime=arm(0,x0); AWB=yprime(1:3); % I primi tre elementi di yprime sono l'acc. angolare. ABO=cross(AWB,[R 0 0]')+cross(WB,cross(WB,[R 0 0]')); % Acc. dell'origine del sdr solidale al corpo rigido ArelB=[0 0 0]'; % Acc. relativa del sdr solidale al corpo rigido paccel(TA0*TBA,ABO,ArelB,VrelB,WB,AWB,[0 0 0]',0.01,'m',4,'A') % Plottaggio delle reazioni vincolari % L'acc. di gravità è calcolata come RBA'*[-9.81 0 0]', dove [-9.81 0 0]' % rappresenta l'acc. di gravità aspressa nel sdr A. Fvinc=forvinc(WB,AWB,RBA'*[-9.81 0 0]',m,R); plvect(TA0*TBA,Fvinc,[-0.1 0 0]',0.01,'r',4,'Fvinc') hold off pause(0.01) % pausa di 0.01 secondi, serve unicamente per mostrare l'immagine figure(2) subplot(221) plot(tempo,XS(:,4)) xlabel('t [s]') ylabel('q0 ') subplot(222) plot(tempo,XS(:,5)) xlabel('t [s]') ylabel('q1') subplot(223) plot(tempo,XS(:,6)) xlabel('t [s]') ylabel('q2') subplot(224) plot(tempo,XS(:,7)) xlabel('t [s]') ylabel('q3') 36 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] figure(3) subplot(221) plot(tempo,XS(:,8)) xlabel('t [s]') ylabel('x [m]') subplot(222) plot(tempo,XS(:,9)) xlabel('t [s]') ylabel('y [m]') subplot(223) plot(tempo,XS(:,10)) xlabel('t [s]') ylabel('z [m]') subplot(224) plot(XS(:,9),XS(:,10)) xlabel('y [m]') ylabel('z [m]') % Con la seguente linea è possibile plottare la somma dei quaternioni, se % l'integrazione numerica è corretta deve essere pari ad 1. %plot(tempo,XS(:,4).^2+XS(:,5).^2+XS(:,6).^2+XS(:,7).^2) if i==1 pause;end % serve per allargare la finestra con il mouse end Il secondo membro della (2.1.18) viene valutato con la funzione arm. function yprime=arm(t,X) % % Viene valutato il primo membro dell'equazione differenziale dinamica e cinematica % del moto di un corpo rigido con un punto fisso. Per la parte cinematica si sfruttano % i parametri di Eulero. Per la determinazione dell'equazione del moto si veda % il programma dynarm.m. % % X : vettore di stato. Contiene le velocità angolari e i parametri di Eulero: % % X=[Wx Wy Wz q0 q1 q2 q3 Px Py Pz]' % % t : tempo Wx=X(1); Wy=X(2); Wz=X(3); % La seguente definizione dei quaternioni serve a prevenire eventuali errori % di arrotondamento che possono portare a violare la condizione: % % q0^2+q1^2+q2^2+q3^2=1 % % Pag. 32 Wittenburg q(1,1)=X(4)/norm(X(4:7)); q(2,1)=X(5)/norm(X(4:7)); q(3,1)=X(6)/norm(X(4:7)); q(4,1)=X(7)/norm(X(4:7)); RBA=rquat(q); gA=[-9.81 0 0]'; gB=RBA'*gA; gy=gB(2); gz=gB(3); 37 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] % Caratteristiche inerziali di un disco in acciaio (dens 7850 kg/m^3) % diametro 0.2 m, spessore 0.005 m, calcolate con in_cil.m Ix=0.0031; Iy=0.0031; Iz=0.0062; Ixy=Ix*0.0; Ixz=Ix*0.0; Iyz=Iz*0.0; m=1; r=0.1; % Tensore d'inerzia totale Itot =... [[ Ix, Ixy, Ixz];... [Ixy, Iy+r^2*m, Iyz];... [Ixz, Iyz, Iz+r^2*m]]; % Secondo membro TAU2 =... [[Wz*Ixy*Wx+Wz*Iy*Wy+Iyz*Wz^2-Wy*Ixz*Wx-Iyz*Wy^2-Wy*Iz*Wz];... [-Wz*Ixy*Wy+r^2*m*Wx*Wz-r*m*gz-Wz*Ix*Wx+Wx*Iz*Wz-Ixz*Wz^2+Ixz*Wx^2+Wx*Iyz*Wy];... [ Ixy*Wy^2-r^2*m*Wx*Wy+r*m*gy+Wy*Ix*Wx-Wx*Iyz*Wz+Wy*Ixz*Wz-Ixy*Wx^2-Wx*Iy*Wy]]; if t>=0.05 & t<=0.06; TAUE=[0 0 0]'; else TAUE=[0 0 0]'; end Eventuali coppie esterna yprime(1:3,1)=inv(Itot)*[TAU2+TAUE]; % Eq. dinamica rotazionale (sdr B) yprime(4:7,1)=qdot([Wx Wy Wz]',q); % Eq. cinematica rotazionale (sdr B) yprime(8:10,1)=rquat(q)*cross([Wx Wy Wz]',[r 0 0]'); % Eq. cinematica traslazionale dP/dt=v (sdr A) Il plottaggio del moto del disco vincolato avviene mediante la funzione fkinarm. function a=fkinarm(q,P,H,R,N) % fkinarm.m : Funzione per la visualizzazione 3D di un copro rigido % mediante i parametri di Eulero tenendo conto anche del moto % traslazionale, definito dal vattore P. % Questa funzione è una modifica di fkinbqt.m per graficare % il moto di un disco vincolato. % Dati per graficare il corpo del disco % H : altezza del disco % R : raggio del disco % N : numero di facce del disco % % Questo programma permette di impostare gli angoli e vedere il risultato a video. RBA=rquat(q); % Calcolo della matrice di rotazione B-->A mediante i % parametri di Eulero q. A è il sdr fisso, B quello solidale % al corpo rigido. % Costruzione della matrice di trasformazione TBA. Per mostrare il disco con % l'esse z orizzontale RBA deve essere premoltiplicata per [[0 1 0];[0 0 1];[1 0 0]]; TBA=trasm(RBA,P); TA0=trasm([[0 1 0];[0 0 1];[1 0 0]],[0 0 0]'); TCB=trasm(eye(3),[-0.1 0 0]'); % sdr con origine nel punto di contatto C TCA=TBA*TCB; pltassi(TA0,'g','A',1,0.3) % sdr A (fisso) 38 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] hold on view([1 1 0.2]) %view([1 0 0]) axis([-1 1 -1 1 -1 1]*0.4) pltassi(TA0*TBA,'b','B',1,0.3) % sdr B con origine nel centro di massa pltassi(TA0*TCA,'c','C',1,0.15) % sdr con origine nel punto di contatto C plroto(eye(4),TA0*TBA,'m',H,R,N) % corpo del disco Il computo delle reazioni vincolari secondo la (2.1.13) viene effettuato dalla funzione forvinc. function F=forvinc(W,AW,g,m,r) % Funzione per il calcolo delle reazioni vincolari dovute al moto di % un copro rigido vincolato in un punto mediante un giunto sferico. % W : velocità angolare del corpo rigido espressa nel sdr B (solidale al corpo) % AW : accelerazione angolare del corpo rigido espressa nel sdr B (solidale al corpo) % g : vettore dell'acc. di gravità espresso nel sdr B % m : massa del corpo % r : lunghezza che definisce la posizione del baricentro del corpo rispetto al vincolo % F : Forze vincolari, espresse nel sdr B Wx=W(1); Wy=W(2); Wz=W(3); AWx=AW(1); AWy=AW(2); AWz=AW(3); gx=g(1); gy=g(2); gz=g(3); F =... [[m*(-Wz^2*r-Wy^2*r)-m*gx];... [ m*(AWz*r+Wx*Wy*r)-m*gy];... [m*(-AWy*r+Wx*Wz*r)-m*gz]]; Vengono presentati alcuni esempi di applicazione dei programmi realizzati. Esempio 2.1.1: Analizzare il moto di un pendolo composto schematizzato come un disco incernierato con un giunto sferico. Viene presentato il moto con il disco inizialmente con asse verticale. Le condizioni iniziali sull'assetto sono (vedi il dy_arm) (α ,β , γ ) = ( 0,90° ,0) . La Fig. E.2.1.1.1 mostra quattro configurazioni in altrettanti istanti. Si fa notare che tale figura è stata leggermente modificata rispetto a quella originale ottenuta con MATLAB per questioni di chiarezza. Si ricorda, inoltre, che le uscite a video sono a colori. 39 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] 0.4 xA zB 0.3 0.2 0.4 xA 0.3 0.2 zC Fvinc 0. xC W h Fvinc yC V A xB yA B 0 - 0 zA -0.2 -0.3 -0.3 -0.4 -0.4 -0.4 -0.4 -0.2 0 0.2 0 0.2 0.4 0.4 yA - -0.2 -0.2 -0.4 0.4 0. 0. A yC zC yA -0.2 yB zB -0.3 V -0.2 0 0.2 zA xC zB -0.2 0 0.2 0.3 0.2 - A h xB 0.4 0.4 0.2 0 -0.2 -0.4 t=0.27 s 0.2 0 yC 0.4 xA Fvinc 0.3 W yB zC t=0.01 s -0.4 -0.4 V 0. zB zC xB yA B 0 zA - hW xC xA xC Fvinc W h zA y CV A -0.2 -0.3 0.4 0.4 xB 0.2 0 -0.2 -0.4 -0.4 -0.2 -0.4 0 0.2 0.4 0.4 0.2 0 -0.2 -0.4 t=0.6 s t=0.86 s Fig. E.2.1.1.1 Moto tridimensionale di un disco con punto fisso in quattro istanti ottenuto con dy_arm. La Fig. E.2.1.1.2 mostra l'andamento temporale delle coordinate del centro di massa espresse nel sdr fisso e la traiettoria nel piano x,y (sdr fisso). 40 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] 0 0 x 10 -9 -1 x [m ] -0 .0 5 y [m ] -2 -3 -0 .1 0 0 .5 t [s] -4 1 0 .3 0 .3 0 .2 0 .2 0 .1 z [m ] 0 .1 z [m ] 0 0 0 .5 t [s] 0 0 .5 t [s] 0 -4 1 -2 y [m ] 1 0 x 10 -9 Fig. E.2.1.1.2 Coordinate del centro di massa di un disco con punto fisso (sdr A, fisso) e sua traiettoria nel piano z,y ottenuto con dy_arm. -8 q0 1 1 0.5 0.5 0 -1 0 0 q1 -0.5 x 10 -0.5 0.5 t [s] -1 0 1 -9 1 8 0.9 7 x 10 0.5 t [s] 1 0.5 t [s] 1 q3 q2 0.8 0.7 0 6 0.5 t [s] 5 0 1 Fig. E.2.1.1.3 Andamento dei parametri di Eulero ottenuto con dy_arm. La Fig. 2.1.1.3 contiene l'andamento temporale dei parametri di Eulero. La visualizzazione del moto in tempo reale ottenuta in MATLAB permette una maggiore esaustività rispetto a questo poche figure riportate. Per osservare il moto lasciare correre la simulazione. Per interromperla digitare ctrl C.// 41 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] Esempio 2.1.2: Analizzare il moto di un pendolo composto schematizzato come un disco incernierato con un giunto sferico quanto fra gli istanti 0.15 e 0.2 s viene applicata una coppia esterna pari a 2 Nm secondo l'asse x solidale. Partendo dalle stesse condizioni iniziali dell'esempio precedente (vedi il listato di dy_arm) (α ,β , γ ) = (0,90° ,0) nella funzione arm al posto di: if t>=0.05 & t<=0.06; TAUE=[0 0 0]'; else TAUE=[0 0 0]'; end inserire: if t>=0.15 & t<=0.2; TAUE=[2 0 0]'; else TAUE=[0 0 0]'; end 0.4 xA zB 0.3 0.2 0.4 xA 0.3 0.2 zC Fvinc zB zC 0. 0. xB yA B 0 - xC W h Fvinc yC V A 0 zA -0.2 -0.3 -0.3 -0.4 -0.4 -0.4 -0.4 -0.2 0 0.2 0 0.2 0.4 0.4 -0.2 -0.4 zA A hx C W yB -0.2 -0.2 yC yA - xB 0 0.2 V 0.2 0.4 0.4 t=0.15 s t=0.01 s 0.4 0.4 xA 0.3 0.2 0 yC 0. yC yB 0 zA A yB 0.2 yA - xA 0.3 V zB Fvinc zC 0. yA - xC -0.2 -0.2 Fvinc zC zA zB xC A V -0.3 -0.4 -0.4 -0.2 -0.4 0 h 0 0.2 0.4 0.4 0.2 xB W -0.3 xB W -0.2 h 0 -0.2 -0.4 -0.4 -0.2 -0.4 0 0.2 0.4 0.4 0.2 0 -0.2 -0.4 t=0.83 s t=0.3 s Fig. E.2.1.2.1 Moto tridimensionale di un disco con punto fisso in quattro istanti con coppia secondo x di 2 Nm applicata nell'intervallo 0.15-0.2 s, ottenuto con dy_arm. 42 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] 0 0 .1 0 .0 5 x [m ] -0 .0 5 0 y [m ] -0 .0 5 -0 .1 z [m ] 0 0 .5 -0 .1 1 0 .2 0 .2 0 .1 5 0 .1 5 0 .1 z [m ] 0 .1 0 .0 5 0 .0 5 0 0 0 .5 t [s ] 0 0 -0 .1 1 0 .5 t [s ] 1 0 y [m ] 0 .1 Fig. E.2.1.2.2 Coordinate del centro di massa di un disco con punto fisso (sdr A, fisso) e sua traiettoria nel piano z,y con coppia secondo x di 2 Nm applicata nell'intervallo 0.15-0.2 s, ottenuto con dy_arm. q0 1 1 0 .5 0 .5 -0 .5 q2 q1 0 0 0 .5 t [s ] 0 -0 .5 1 1 1 0 .5 0 .5 0 q3 -0 .5 -1 0 0 .5 t [s ] 1 0 0 .5 t [s ] 1 0 -0 .5 0 0 .5 t [s ] -1 1 Fig. E.2.1.2.3 Andamento dei parametri di Eulero con coppia secondo x di 2 Nm applicata nell'intervallo 0.15-0.2 s, ottenuto con dy_arm. Da queste figure è immediato come il moto sia molto più perturbato rispetto al caso trattato nell'esempio precedente.// Esempio 2.1.3: Analizzare il moto di una disco spinnato secondo l'asse di rotazione corrispondente al diametro. 43 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] Ora le condizioni iniziali saranno (vedi il dy_arm) (α ,β , γ ) = ( 0,1° ,0) . L'inclinazione di 1° rispetto alla verticale serve per evidenziare l'effetto stabilizzante dovuto all'effetto giroscopico. Si impone il moto di spin secondo l'asse x solidale mediante la variabile Nturn. La configurazione iniziale viene riportata nella Fig. E.2.1.3.1 per il caso con Nturn=0. xA xB 0.4 0.3 0.2 Fvinc xC 0.1 0 yA -0.1 V A W h zB zA yB zC yC -0.2 -0.3 -0.4 -0.4 -0.2 0 0.2 0.4 0.4 0.2 0 -0.2 -0.4 Fig. E.2.1.3.1 Configurazione iniziale, disco non spinnato ottenuto con dy_arm. Nelle Fig. E.2.1.3.2-E.2.1.3.6 sono mostrati l'andamento delle coordinate del centro di massa e la sua traiettoria, rispettivamente per i casi Nturn=0,100,500,700 e 1000 g/min. x [m ] 0 1 -0 .0 5 0 .5 - 0 .1 y [m ] 0 -0 .1 5 -0 .5 - 0 .2 0 1 t [s ] 2 -1 0 .2 0 .2 0 .1 0 .1 z [m ] 0 0 z [m ] - 0 .1 0 1 t [s ] 2 0 -0 .1 -1 1 t [s ] 2 0 y [m ] 1 Fig. E.2.1.3.2 Coordinate del centro di massa di un disco con punto fisso (sdr A, fisso) e sua traiettoria nel piano z,y con disco non spinnato, ottenuto con dy_arm. 44 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] 0 0 .0 5 -0 .0 5 x [m ] -0 .1 y [m ] 0 -0 .1 5 -0 .2 0 z [m ] 0 .5 1 t [s ] 1 .5 - 0 .0 5 0 2 0 .1 0 .1 0 .0 5 0 .0 5 z [m ] 0 -0 .0 5 0 .5 1 t [s ] 1 .5 2 0 - 0 .0 5 -0 .1 0 0 .5 1 t [s ] 1 .5 -0 .1 -0 .0 5 2 0 y [m ] 0 .0 5 Fig. E.2.1.3.3 Coordinate del centro di massa di un disco con punto fisso (sdr A, fisso) e sua traiettoria nel piano z,y Nturn=100 g/min, ottenuto con dy_arm. 0 0 .0 5 -0 .0 5 0 x [m ] -0 .1 y [m ] - 0 .0 5 -0 .1 5 0 0 .5 1 -0 .1 1 .5 0 t [s ] 0 .5 1 1 .5 t [s ] 0 .2 0 .2 0 .1 0 .1 0 z [m ] 0 z [m ] -0 .1 0 0 .5 1 1 .5 t [s ] -0 .1 -0 .1 0 y [m ] Fig. E.2.1.3.3 Coordinate del centro di massa di un disco con punto fisso (sdr A, fisso) e sua traiettoria nel piano z,y Nturn=500 g/min, ottenuto con dy_arm. 45 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] 0 0 .1 -0 .0 2 0 .0 5 -0 .0 4 x [m ] -0 .0 6 -0 .0 8 0 y [m ] -0 .0 5 0 1 t [s ] -0 .1 2 0 .1 0 .1 0 .0 5 0 .0 5 z [m ] 0 -0 .1 1 t [s ] 2 0 y [m ] 0 .1 0 z [m ] -0 .0 5 0 -0 .0 5 0 1 t [s ] -0 .1 -0 .1 2 Fig. E.2.1.3.5 Coordinate del centro di massa di un disco con punto fisso (sdr A, fisso) e sua traiettoria nel piano z,y Nturn=700 g/min, ottenuto con dy_arm. 2 x [m ] x 10 -5 4 0 2 -2 y [m ] 0 -4 -2 -6 6 0 x 10 -3 1 t [s ] -4 2 6 4 -3 0 x 10 -3 1 t [s ] 2 4 z [m ] z [m ] 2 0 -2 x 10 2 0 0 1 t [s ] -2 -5 2 0 y [m ] 5 x 10 -3 Fig. E.2.1.3.6 Coordinate del centro di massa di un disco con punto fisso (sdr A, fisso) e sua traiettoria nel piano z,y Nturn=1000 g/min, ottenuto con dy_arm. Si osservi da queste figure come lo spostamento secondo la coordinata x (che manifesta la caduta del disco) all'aumentare dello spin attorno all'asse x tenda ad annullarsi. Si osservi, inoltre, come la traiettoria del centro di massa si chiuda man mano che aumenta lo spin. Per completezza si riporta il moto del disco in quattro istanti diversi e per il caso con Nturn=1000 g/min nella Fig. E.2.1.3.7. 46 DINAMICA DEL CORPO RIGIDO, by Roberto Da Forno, [email protected] 0.4 0.4 xx B A 0.3 0.2 0. 0 - 0. zB 0 zA zC yC -0.2 -0.3 -0.3 -0.2 0 0.2 0.4 0 0.2 0.4 yB yA - -0.2 -0.4 -0.4 W h 0.2 xC VFvinc A yB yA xx B A 0.3 W h -0.2 -0.4 -0.4 -0.4 -0.2 0 xC Fvinc A V 0.2 0.4 0.4 0 0.2 -0.2 -0.4 -0.2 -0.4 t=0.03 s t=0.01 s 0.4 0.4 xx AB 0.3 0. zC - 0. yB zA 0 yC -0.2 -0.3 -0.3 0 0.2 0.4 0.4 0.2 yA - -0.2 -0.2 W h 0.2 xC Fvinc V A zB yA 0 xxBA 0.3 W h 0.2 -0.4 -0.4 zA zB yC zC 0 -0.2 -0.4 -0.4 -0.4 xC Fvinc A V yB yC -0.2 0 0.2 0.4 0.4 zB zA zC 0.2 0 t=0.15 s t=0.1 s Fig. E.2.1.3.7 Moto tridimensionale di un disco spinnato secondo x con punto fisso in quattro istanti con Nturn=1000 g/min, ottenuto con dy_arm. Il lettore apprezzerà ancor più l'effetto giroscopico simulando direttamente l'influenza dello spin secondo all'asse x. Si ricordi di modificare opportunamente i fattori di scala per il plottaggio della velocità angolare e del momento angolare quando viene variato lo spin.// I metodi finora presentati sono particolarmente utili per lo studio del moto di un singolo corpo rigido, sia esso ad esempio un aereo, un satellite o un razzo, si tratta di definire opportunamente le forze e coppie applicate dipendenti dal moto. Sono state ricavate le equazioni del moto attraverso un metodo non iterativo che in via generale mal si presta a sistemi di corpi rigidi interconnessi quali i robot per i quali un approccio di tipo iterativo sarebbe senza dubbio migliore. Nei capitoli che seguiranno verranno introdotti i concetti di cinematica e dinamica dei sistemi di corpi rigidi interconnessi fino allo sviluppo completo dell'approccio iterativo di Newton-Eulero attraverso il quale la scrittura delle equazioni del moto per sistemi di corpi rigidi interconnessi risulta agevole ed automatizzabile. 47