Correct transmissibility plots + reworked Sismcape
This commit is contained in:
454
index.org
454
index.org
@@ -92,7 +92,7 @@ addpath('gravimeter');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
freqs = logspace(-1, 2, 1000);
|
||||
freqs = logspace(-1, 3, 1000);
|
||||
#+end_src
|
||||
|
||||
** Gravimeter Model - Parameters
|
||||
@@ -863,14 +863,12 @@ w0 = 2*pi*0.1; % Controller Pole [rad/s]
|
||||
#+begin_src matlab
|
||||
K_cen = diag(1./diag(abs(evalfr(Gx, j*wc))))*(1/abs(evalfr(1/(1 + s/w0), j*wc)))/(1 + s/w0);
|
||||
L_cen = K_cen*Gx;
|
||||
G_cen = feedback(G, pinv(Jt')*K_cen*pinv(Ja));
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
K_svd = diag(1./diag(abs(evalfr(Gsvd, j*wc))))*(1/abs(evalfr(1/(1 + s/w0), j*wc)))/(1 + s/w0);
|
||||
L_svd = K_svd*Gsvd;
|
||||
U_inv = inv(U);
|
||||
G_svd = feedback(G, inv(V')*K_svd*U_inv(1:3, :));
|
||||
#+end_src
|
||||
|
||||
The obtained diagonal elements of the loop gains are shown in Figure [[fig:gravimeter_comp_loop_gain_diagonal]].
|
||||
@@ -934,6 +932,41 @@ exportFig('figs/gravimeter_comp_loop_gain_diagonal.pdf', 'width', 'wide', 'heigh
|
||||
** Closed-Loop system Performances
|
||||
<<sec:gravimeter_closed_loop_results>>
|
||||
|
||||
Now the system is identified again with additional inputs and outputs:
|
||||
- $x$, $y$ and $R_z$ ground motion
|
||||
- $x$, $y$ and $R_z$ acceleration of the payload.
|
||||
|
||||
#+begin_src matlab
|
||||
%% Name of the Simulink File
|
||||
mdl = 'gravimeter';
|
||||
|
||||
%% Input/Output definition
|
||||
clear io; io_i = 1;
|
||||
io(io_i) = linio([mdl, '/Dx'], 1, 'openinput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Dy'], 1, 'openinput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Rz'], 1, 'openinput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/F1'], 1, 'openinput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/F2'], 1, 'openinput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/F3'], 1, 'openinput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Abs_Motion'], 1, 'openoutput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Abs_Motion'], 2, 'openoutput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Abs_Motion'], 3, 'openoutput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Acc_side'], 1, 'openoutput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Acc_side'], 2, 'openoutput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Acc_top'], 1, 'openoutput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Acc_top'], 2, 'openoutput'); io_i = io_i + 1;
|
||||
|
||||
G = linearize(mdl, io);
|
||||
G.InputName = {'Dx', 'Dy', 'Rz', 'F1', 'F2', 'F3'};
|
||||
G.OutputName = {'Ax', 'Ay', 'Arz', 'Ax1', 'Ay1', 'Ax2', 'Ay2'};
|
||||
#+end_src
|
||||
|
||||
The loop is closed using the developed controllers.
|
||||
#+begin_src matlab
|
||||
G_cen = lft(G, -pinv(Jt')*K_cen*pinv(Ja));
|
||||
G_svd = lft(G, -inv(V')*K_svd*U_inv(1:3, :));
|
||||
#+end_src
|
||||
|
||||
Let's first verify the stability of the closed-loop systems:
|
||||
#+begin_src matlab :results output replace text
|
||||
isstable(G_cen)
|
||||
@@ -963,9 +996,9 @@ tiledlayout(1, 3, 'TileSpacing', 'None', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G( 1,1)/s^2, freqs, 'Hz'))), 'DisplayName', 'Open-Loop');
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen(1,1)/s^2, freqs, 'Hz'))), 'DisplayName', 'Centralized');
|
||||
plot(freqs, abs(squeeze(freqresp(G_svd(1,1)/s^2, freqs, 'Hz'))), '--', 'DisplayName', 'SVD');
|
||||
plot(freqs, abs(squeeze(freqresp(G( 'Ax','Dx')/s^2, freqs, 'Hz'))), 'DisplayName', 'Open-Loop');
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen('Ax','Dx')/s^2, freqs, 'Hz'))), 'DisplayName', 'Centralized');
|
||||
plot(freqs, abs(squeeze(freqresp(G_svd('Ax','Dx')/s^2, freqs, 'Hz'))), '--', 'DisplayName', 'SVD');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Transmissibility'); xlabel('Frequency [Hz]');
|
||||
@@ -974,9 +1007,9 @@ legend('location', 'southwest');
|
||||
|
||||
ax2 = nexttile;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G( 2,2)/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen(2,2)/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_svd(2,2)/s^2, freqs, 'Hz'))), '--');
|
||||
plot(freqs, abs(squeeze(freqresp(G( 'Ay','Dy')/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen('Ay','Dy')/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_svd('Ay','Dy')/s^2, freqs, 'Hz'))), '--');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
set(gca, 'YTickLabel',[]); xlabel('Frequency [Hz]');
|
||||
@@ -984,9 +1017,9 @@ title('$D_y/D_{w,y}$');
|
||||
|
||||
ax3 = nexttile;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G( 3,3)/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen(3,3)/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_svd(3,3)/s^2, freqs, 'Hz'))), '--');
|
||||
plot(freqs, abs(squeeze(freqresp(G( 'Arz','Rz')/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen('Arz','Rz')/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_svd('Arz','Rz')/s^2, freqs, 'Hz'))), '--');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
set(gca, 'YTickLabel',[]); xlabel('Frequency [Hz]');
|
||||
@@ -994,7 +1027,7 @@ title('$R_z/R_{w,z}$');
|
||||
|
||||
linkaxes([ax1,ax2,ax3],'xy');
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
xlim([1e-2, 5e1]); ylim([1e-7, 1e-2]);
|
||||
xlim([1e-2, 5e1]); ylim([1e-2, 1e1]);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
@@ -1023,6 +1056,7 @@ for out_i = 1:3
|
||||
end
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Transmissibility'); xlabel('Frequency [Hz]');
|
||||
ylim([1e-6, 1e3]);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
@@ -1044,28 +1078,35 @@ la = l/2*0.7; % Position of Act. [m]
|
||||
ha = h/2*0.7; % Position of Act. [m]
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
#+begin_src matlab
|
||||
%% Name of the Simulink File
|
||||
mdl = 'gravimeter';
|
||||
|
||||
%% Input/Output definition
|
||||
clear io; io_i = 1;
|
||||
io(io_i) = linio([mdl, '/Dx'], 1, 'openinput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Dy'], 1, 'openinput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Rz'], 1, 'openinput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/F1'], 1, 'openinput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/F2'], 1, 'openinput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/F3'], 1, 'openinput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Abs_Motion'], 1, 'openoutput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Abs_Motion'], 2, 'openoutput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Abs_Motion'], 3, 'openoutput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Acc_side'], 1, 'openoutput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Acc_side'], 2, 'openoutput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Acc_top'], 1, 'openoutput'); io_i = io_i + 1;
|
||||
io(io_i) = linio([mdl, '/Acc_top'], 2, 'openoutput'); io_i = io_i + 1;
|
||||
|
||||
G = linearize(mdl, io);
|
||||
G.InputName = {'F1', 'F2', 'F3'};
|
||||
G.OutputName = {'Ax1', 'Ay1', 'Ax2', 'Ay2'};
|
||||
G.InputName = {'Dx', 'Dy', 'Rz', 'F1', 'F2', 'F3'};
|
||||
G.OutputName = {'Ax', 'Ay', 'Arz', 'Ax1', 'Ay1', 'Ax2', 'Ay2'};
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
G_cen_b = feedback(G, pinv(Jt')*K_cen*pinv(Ja));
|
||||
G_svd_b = feedback(G, inv(V')*K_svd*U_inv(1:3, :));
|
||||
The loop is closed using the developed controllers.
|
||||
#+begin_src matlab
|
||||
G_cen_b = lft(G, -pinv(Jt')*K_cen*pinv(Ja));
|
||||
G_svd_b = lft(G, -inv(V')*K_svd*U_inv(1:3, :));
|
||||
#+end_src
|
||||
|
||||
The new plant is computed, and the centralized and SVD control architectures are applied using the previously computed Jacobian matrices and $U$ and $V$ matrices.
|
||||
@@ -1080,9 +1121,9 @@ tiledlayout(1, 3, 'TileSpacing', 'None', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen(1,1)/s^2, freqs, 'Hz'))), 'DisplayName', 'Initial');
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen_b(1,1)/s^2, freqs, 'Hz'))), 'DisplayName', 'Jacobian');
|
||||
plot(freqs, abs(squeeze(freqresp(G_svd_b(1,1)/s^2, freqs, 'Hz'))), '--', 'DisplayName', 'SVD');
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen( 'Ax','Dx')/s^2, freqs, 'Hz'))), 'DisplayName', 'Open-Loop');
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen_b('Ax','Dx')/s^2, freqs, 'Hz'))), 'DisplayName', 'Centralized');
|
||||
plot(freqs, abs(squeeze(freqresp(G_svd_b('Ax','Dx')/s^2, freqs, 'Hz'))), '--', 'DisplayName', 'SVD');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Transmissibility'); xlabel('Frequency [Hz]');
|
||||
@@ -1091,9 +1132,9 @@ legend('location', 'southwest');
|
||||
|
||||
ax2 = nexttile;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen(2,2)/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen_b(2,2)/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_svd_b(2,2)/s^2, freqs, 'Hz'))), '--');
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen( 'Ay','Dy')/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen_b('Ay','Dy')/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_svd_b('Ay','Dy')/s^2, freqs, 'Hz'))), '--');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
set(gca, 'YTickLabel',[]); xlabel('Frequency [Hz]');
|
||||
@@ -1101,9 +1142,9 @@ title('$D_y/D_{w,y}$');
|
||||
|
||||
ax3 = nexttile;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen(3,3)/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen_b(3,3)/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_svd_b(3,3)/s^2, freqs, 'Hz'))), '--');
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen( 'Arz','Rz')/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_cen_b('Arz','Rz')/s^2, freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(G_svd_b('Arz','Rz')/s^2, freqs, 'Hz'))), '--');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
set(gca, 'YTickLabel',[]); xlabel('Frequency [Hz]');
|
||||
@@ -1111,7 +1152,7 @@ title('$R_z/R_{w,z}$');
|
||||
|
||||
linkaxes([ax1,ax2,ax3],'xy');
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
xlim([1e-2, 5e1]); ylim([1e-7, 3e-4]);
|
||||
xlim([1e-2, 5e1]); ylim([1e-2, 1e1]);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
@@ -1501,6 +1542,361 @@ exportFig('figs/gravimeter_svd_high_damping.pdf', 'width', 'wide', 'height', 'no
|
||||
#+RESULTS:
|
||||
[[file:figs/gravimeter_svd_high_damping.png]]
|
||||
|
||||
* Analytical Model
|
||||
** Model
|
||||
|
||||
#+name: fig:gravimeter_model_analytical
|
||||
#+caption: Model of the gravimeter
|
||||
[[file:figs/gravimeter_model_analytical.png]]
|
||||
|
||||
- collocated actuators and sensors
|
||||
|
||||
** Stiffness and Mass matrices
|
||||
|
||||
*Stiffness matrix*:
|
||||
\begin{equation}
|
||||
\mathcal{F}_{\{O\}} = -K_{\{O\}} \mathcal{X}_{\{O\}}
|
||||
\end{equation}
|
||||
with:
|
||||
- $\mathcal{X}_{\{O\}}$ are displacements/rotations of the mass $x$, $y$, $R_z$ expressed in the frame $\{O\}$
|
||||
- $\mathcal{F}_{\{O\}}$ are forces/torques $\mathcal{F}_x$, $\mathcal{F}_y$, $\mathcal{M}_z$ applied at the origin of $\{O\}$
|
||||
|
||||
*Mass matrix*:
|
||||
\begin{equation}
|
||||
\mathcal{F}_{\{O\}} = M_{\{O\}} \ddot{\mathcal{X}}_{\{O\}}
|
||||
\end{equation}
|
||||
|
||||
|
||||
Consider the two following frames:
|
||||
- $\{M\}$: Center of mass => diagonal mass matrix
|
||||
\[ M_{\{M\}} = \begin{bmatrix}m & 0 & 0 \\ 0 & m & 0 \\ 0 & 0 & I\end{bmatrix} \]
|
||||
\[ K_{\{M\}} = \begin{bmatrix}k_1 & 0 & k_1 h_a \\ 0 & k_2 + k_3 & 0 \\ k_1 h_a & 0 & k_1 h_a + (k_2 + k_3)l_a\end{bmatrix} \]
|
||||
- $\{K\}$: Diagonal stiffness matrix
|
||||
\[ K_{\{K\}} = \begin{bmatrix}k_1 & 0 & 0 \\ 0 & k_2 + k_3 & 0 \\ 0 & 0 & (k_2 + k_3)l_a\end{bmatrix} \]
|
||||
- [ ] Compute the mass matrix $M_{\{K\}}$
|
||||
Needs two Jacobians => complicated matrix
|
||||
|
||||
** Equations
|
||||
|
||||
- [ ] Ideally write the equation from $\tau$ to $\mathcal{L}$
|
||||
|
||||
\begin{equation}
|
||||
\mathcal{L} = \begin{bmatrix} \mathcal{L}_1 \\ \mathcal{L}_2 \\ \mathcal{L}_3 \end{bmatrix}
|
||||
\end{equation}
|
||||
|
||||
\begin{equation}
|
||||
\tau = \begin{bmatrix} \tau_1 \\ \tau_2 \\ \tau_3 \end{bmatrix}
|
||||
\end{equation}
|
||||
|
||||
** Jacobians
|
||||
|
||||
Usefulness of Jacobians:
|
||||
- $J_{\{M\}}$ converts $\dot{\mathcal{L}}$ to $\dot{\mathcal{X}}_{\{M\}}$:
|
||||
\[ \dot{\mathcal{X}}_{\{M\}} = J_{\{M\}} \dot{\mathcal{L}} \]
|
||||
- $J_{\{M\}}^T$ converts $\tau$ to $\mathcal{F}_{\{M\}}$:
|
||||
\[ \mathcal{F}_{\{M\}} = J_{\{M\}}^T \tau \]
|
||||
- $J_{\{K\}}$ converts $\dot{\mathcal{K}}$to $\dot{\mathcal{X}}_{\{K\}}$:
|
||||
\[ \dot{\mathcal{X}}_{\{K\}} = J_{\{K\}} \dot{\mathcal{K}} \]
|
||||
- $J_{\{K\}}^T$ converts $\tau$ to $\mathcal{F}_{\{K\}}$:
|
||||
\[ \mathcal{F}_{\{K\}} = J_{\{K\}}^T \tau \]
|
||||
|
||||
|
||||
Let's compute the Jacobians:
|
||||
\begin{equation}
|
||||
J_{\{M\}} = \begin{bmatrix} 1 & 0 & h_a \\ 0 & 1 & -l_a \\ 0 & 1 & l_a \end{bmatrix}
|
||||
\end{equation}
|
||||
|
||||
\begin{equation}
|
||||
J_{\{K\}} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & -l_a \\ 0 & 1 & l_a \end{bmatrix}
|
||||
\end{equation}
|
||||
|
||||
** Matlab Init :noexport:ignore:
|
||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||
<<matlab-dir>>
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results silent :noweb yes
|
||||
<<matlab-init>>
|
||||
#+end_src
|
||||
|
||||
** Parameters
|
||||
#+begin_src matlab
|
||||
l = 1.0; % Length of the mass [m]
|
||||
h = 2*1.7; % Height of the mass [m]
|
||||
|
||||
la = l/2; % Position of Act. [m]
|
||||
ha = h/2; % Position of Act. [m]
|
||||
|
||||
m = 400; % Mass [kg]
|
||||
I = 115; % Inertia [kg m^2]
|
||||
|
||||
c1 = 2e1; % Actuator Damping [N/(m/s)]
|
||||
c2 = 2e1; % Actuator Damping [N/(m/s)]
|
||||
c3 = 2e1; % Actuator Damping [N/(m/s)]
|
||||
|
||||
k1 = 15e3; % Actuator Stiffness [N/m]
|
||||
k2 = 15e3; % Actuator Stiffness [N/m]
|
||||
k3 = 15e3; % Actuator Stiffness [N/m]
|
||||
#+end_src
|
||||
|
||||
** Transfer function from $\tau$ to $\delta \mathcal{L}$
|
||||
Mass, Damping and Stiffness matrices expressed in $\{M\}$:
|
||||
#+begin_src matlab
|
||||
Mm = [m 0 0 ;
|
||||
0 m 0 ;
|
||||
0 0 I];
|
||||
|
||||
Cm = [c1 0 c1*ha ;
|
||||
0 c2+c3 0 ;
|
||||
c1*ha 0 c1*ha + (c2+c3)*la];
|
||||
|
||||
Km = [k1 0 k1*ha ;
|
||||
0 k2+k3 0 ;
|
||||
k1*ha 0 k1*ha + (k2+k3)*la];
|
||||
#+end_src
|
||||
|
||||
Jacobian $J_{\{M\}}$:
|
||||
#+begin_src matlab
|
||||
Jm = [1 0 ha ;
|
||||
0 1 -la ;
|
||||
0 1 la];
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
Mt = inv(Jm')*Mm*inv(Jm);
|
||||
Ct = inv(Jm')*Cm*inv(Jm);
|
||||
Kt = inv(Jm')*Km*inv(Jm);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports results :results value table replace :tangle no
|
||||
data2orgtable(Mt, {}, {}, ' %.1f ');
|
||||
#+end_src
|
||||
|
||||
#+caption: $M_t$
|
||||
#+RESULTS:
|
||||
| 400.0 | 340.0 | -340.0 |
|
||||
| 340.0 | 504.0 | -304.0 |
|
||||
| -340.0 | -304.0 | 504.0 |
|
||||
|
||||
#+begin_src matlab :exports results :results value table replace :tangle no
|
||||
data2orgtable(Kt, {}, {}, ' %.1f ');
|
||||
#+end_src
|
||||
|
||||
#+caption: $K_t$
|
||||
#+RESULTS:
|
||||
| 15000.0 | 0.0 | 0.0 |
|
||||
| 0.0 | 24412.5 | -9412.5 |
|
||||
| 0.0 | -9412.5 | 24412.5 |
|
||||
|
||||
#+begin_src matlab
|
||||
Gt = s^2*inv(Mt*s^2 + Ct*s + Kt);
|
||||
% Gt = JM*s^2*inv(MM*s^2 + CM*s + KM)*JM';
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
freqs = logspace(-1, 2, 1000);
|
||||
figure;
|
||||
|
||||
% Magnitude
|
||||
hold on;
|
||||
for i_in = 1:3
|
||||
for i_out = [1:i_in-1, i_in+1:3]
|
||||
plot(freqs, abs(squeeze(freqresp(Gt(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
end
|
||||
plot(freqs, abs(squeeze(freqresp(Gt(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ...
|
||||
'DisplayName', '$G_x(i,j)\ i \neq j$');
|
||||
set(gca,'ColorOrderIndex',1)
|
||||
for i_in_out = 1:3
|
||||
plot(freqs, abs(squeeze(freqresp(Gt(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out));
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('Magnitude');
|
||||
legend('location', 'southeast');
|
||||
ylim([1e-8, 1e0]);
|
||||
#+end_src
|
||||
|
||||
** Transfer function from $\mathcal{F}_{\{M\}}$ to $\mathcal{X}_{\{M\}}$
|
||||
|
||||
#+begin_src matlab
|
||||
Gm = inv(Jm)*Gt*inv(Jm');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports results :results value table replace :tangle no
|
||||
data2orgtable(Mm, {}, {}, ' %.1f ');
|
||||
#+end_src
|
||||
|
||||
#+caption: $M_{\{M\}}$
|
||||
#+RESULTS:
|
||||
| 400.0 | 0.0 | 0.0 |
|
||||
| 0.0 | 400.0 | 0.0 |
|
||||
| 0.0 | 0.0 | 115.0 |
|
||||
|
||||
#+begin_src matlab :exports results :results value table replace :tangle no
|
||||
data2orgtable(Km, {}, {}, ' %.1f ');
|
||||
#+end_src
|
||||
|
||||
#+caption: $K_{\{M\}}$
|
||||
#+RESULTS:
|
||||
| 15000.0 | 0.0 | 12750.0 |
|
||||
| 0.0 | 30000.0 | 0.0 |
|
||||
| 12750.0 | 0.0 | 27750.0 |
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
freqs = logspace(-1, 2, 1000);
|
||||
figure;
|
||||
|
||||
% Magnitude
|
||||
hold on;
|
||||
for i_in = 1:3
|
||||
for i_out = [1:i_in-1, i_in+1:3]
|
||||
plot(freqs, abs(squeeze(freqresp(Gm(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
end
|
||||
plot(freqs, abs(squeeze(freqresp(Gm(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ...
|
||||
'DisplayName', '$G_x(i,j)\ i \neq j$');
|
||||
set(gca,'ColorOrderIndex',1)
|
||||
for i_in_out = 1:3
|
||||
plot(freqs, abs(squeeze(freqresp(Gm(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out));
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('Magnitude');
|
||||
legend('location', 'southeast');
|
||||
ylim([1e-8, 1e0]);
|
||||
#+end_src
|
||||
|
||||
** Transfer function from $\mathcal{F}_{\{K\}}$ to $\mathcal{X}_{\{K\}}$
|
||||
|
||||
Jacobian:
|
||||
#+begin_src matlab
|
||||
Jk = [1 0 0
|
||||
0 1 -la
|
||||
0 1 la];
|
||||
#+end_src
|
||||
|
||||
Mass, Damping and Stiffness matrices expressed in $\{K\}$:
|
||||
#+begin_src matlab
|
||||
Mk = Jk'*Mt*Jk;
|
||||
Ck = Jk'*Ct*Jk;
|
||||
Kk = Jk'*Kt*Jk;
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports results :results value table replace :tangle no
|
||||
data2orgtable(Mk, {}, {}, ' %.1f ');
|
||||
#+end_src
|
||||
|
||||
#+caption: $M_{\{K\}}$
|
||||
#+RESULTS:
|
||||
| 400.0 | 0.0 | -340.0 |
|
||||
| 0.0 | 400.0 | 0.0 |
|
||||
| -340.0 | 0.0 | 404.0 |
|
||||
|
||||
|
||||
#+begin_src matlab :exports results :results value table replace :tangle no
|
||||
data2orgtable(Kk, {}, {}, ' %.1f ');
|
||||
#+end_src
|
||||
|
||||
#+caption: $K_{\{K\}}$
|
||||
#+RESULTS:
|
||||
| 15000.0 | 0.0 | 0.0 |
|
||||
| 0.0 | 30000.0 | 0.0 |
|
||||
| 0.0 | 0.0 | 16912.5 |
|
||||
|
||||
#+begin_src matlab
|
||||
% Gk = s^2*inv(Mk*s^2 + Ck*s + Kk);
|
||||
Gk = inv(Jk)*Gt*inv(Jk');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
freqs = logspace(-1, 2, 1000);
|
||||
figure;
|
||||
|
||||
% Magnitude
|
||||
hold on;
|
||||
for i_in = 1:3
|
||||
for i_out = [1:i_in-1, i_in+1:3]
|
||||
plot(freqs, abs(squeeze(freqresp(Gk(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
end
|
||||
plot(freqs, abs(squeeze(freqresp(Gk(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ...
|
||||
'DisplayName', '$G_x(i,j)\ i \neq j$');
|
||||
set(gca,'ColorOrderIndex',1)
|
||||
for i_in_out = 1:3
|
||||
plot(freqs, abs(squeeze(freqresp(Gk(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out));
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('Magnitude');
|
||||
legend('location', 'southeast');
|
||||
ylim([1e-8, 1e0]);
|
||||
#+end_src
|
||||
|
||||
** Analytical
|
||||
*** Matlab Init :noexport:ignore:
|
||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||
<<matlab-dir>>
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results silent :noweb yes
|
||||
<<matlab-init>>
|
||||
#+end_src
|
||||
|
||||
*** Parameters
|
||||
#+begin_src matlab
|
||||
syms la ha m I c k positive
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
Mm = [m 0 0 ;
|
||||
0 m 0 ;
|
||||
0 0 I];
|
||||
|
||||
Cm = [c 0 c*ha ;
|
||||
0 2*c 0 ;
|
||||
c*ha 0 c*(ha+2*la)];
|
||||
|
||||
Km = [k 0 k*ha ;
|
||||
0 2*k 0 ;
|
||||
k*ha 0 k*(ha+2*la)];
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
Jm = [1 0 ha ;
|
||||
0 1 -la ;
|
||||
0 1 la];
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
Mt = inv(Jm')*Mm*inv(Jm);
|
||||
Ct = inv(Jm')*Cm*inv(Jm);
|
||||
Kt = inv(Jm')*Km*inv(Jm);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
Jk = [1 0 0
|
||||
0 1 -la
|
||||
0 1 la];
|
||||
#+end_src
|
||||
|
||||
Mass, Damping and Stiffness matrices expressed in $\{K\}$:
|
||||
#+begin_src matlab
|
||||
Mk = Jk'*Mt*Jk;
|
||||
Ck = Jk'*Ct*Jk;
|
||||
Kk = Jk'*Kt*Jk;
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :results replace value raw
|
||||
['\begin{equation} M_{\{K\}} = ', latex(simplify(Kk)), '\end{equation}']
|
||||
#+end_src
|
||||
|
||||
#+RESULTS:
|
||||
\begin{equation} M_{\{K\}} = \left(\begin{array}{ccc} k & 0 & 0\\ 0 & 2\,k & 0\\ 0 & 0 & k\,\left(-{\mathrm{ha}}^2+\mathrm{ha}+2\,\mathrm{la}\right) \end{array}\right)\end{equation}
|
||||
|
||||
* Stewart Platform - Simscape Model
|
||||
:PROPERTIES:
|
||||
:header-args:matlab+: :tangle stewart_platform/script.m
|
||||
|
Reference in New Issue
Block a user