Started the stiffness analysis / noise budgeting
This commit is contained in:
@@ -100,7 +100,7 @@ This effect is studied, and conclusions on what characteristics of the isolation
|
||||
In this document, the effect of all the experimental conditions (rotation speed, sample mass, ...) on the plant dynamics are studied.
|
||||
Conclusion are drawn about what experimental conditions are critical on the variability of the plant dynamics.
|
||||
|
||||
* Optimal Stiffness of the nano-hexapod ([[file:optimal_stiffness.org][link]])
|
||||
* Optimal Stiffness of the nano-hexapod to reduce plant uncertainty ([[file:uncertainty_optimal_stiffness.org][link]])
|
||||
|
||||
* Active Damping Techniques on the full Simscape Model ([[file:control_active_damping.org][link]])
|
||||
Active damping techniques are applied to the full Simscape model.
|
||||
|
696
org/optimal_stiffness_disturbances.org
Normal file
696
org/optimal_stiffness_disturbances.org
Normal file
@@ -0,0 +1,696 @@
|
||||
#+TITLE: Determination of the optimal nano-hexapod's stiffness for reducing the effect of disturbances
|
||||
:DRAWER:
|
||||
#+STARTUP: overview
|
||||
|
||||
#+LANGUAGE: en
|
||||
#+EMAIL: dehaeze.thomas@gmail.com
|
||||
#+AUTHOR: Dehaeze Thomas
|
||||
|
||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/zenburn.css"/>
|
||||
#+HTML_HEAD: <script type="text/javascript" src="./js/jquery.min.js"></script>
|
||||
#+HTML_HEAD: <script type="text/javascript" src="./js/bootstrap.min.js"></script>
|
||||
#+HTML_HEAD: <script type="text/javascript" src="./js/jquery.stickytableheaders.min.js"></script>
|
||||
#+HTML_HEAD: <script type="text/javascript" src="./js/readtheorg.js"></script>
|
||||
|
||||
#+HTML_MATHJAX: align: center tagside: right font: TeX
|
||||
|
||||
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||||
#+PROPERTY: header-args:matlab+ :comments org
|
||||
#+PROPERTY: header-args:matlab+ :results none
|
||||
#+PROPERTY: header-args:matlab+ :exports both
|
||||
#+PROPERTY: header-args:matlab+ :eval no-export
|
||||
#+PROPERTY: header-args:matlab+ :output-dir figs
|
||||
#+PROPERTY: header-args:matlab+ :tangle ../matlab/optimal_stiffness.m
|
||||
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
||||
|
||||
#+PROPERTY: header-args:shell :eval no-export
|
||||
|
||||
#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/thesis/latex/org/}{config.tex}")
|
||||
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes
|
||||
#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150
|
||||
#+PROPERTY: header-args:latex+ :imoutoptions -quality 100
|
||||
#+PROPERTY: header-args:latex+ :results file raw replace
|
||||
#+PROPERTY: header-args:latex+ :buffer no
|
||||
#+PROPERTY: header-args:latex+ :eval no-export
|
||||
#+PROPERTY: header-args:latex+ :exports results
|
||||
#+PROPERTY: header-args:latex+ :mkdirp yes
|
||||
#+PROPERTY: header-args:latex+ :output-dir figs
|
||||
#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png")
|
||||
:END:
|
||||
|
||||
* Introduction :ignore:
|
||||
In this document is studied how the stiffness of the nano-hexapod will impact the effect of disturbances on the position error of the sample.
|
||||
|
||||
It is divided in the following sections:
|
||||
- Section [[sec:psd_disturbances]]: the disturbances are listed and their Power Spectral Densities (PSD) are shown
|
||||
- Section [[sec:effect_disturbances]]: the transfer functions from disturbances to the position error of the sample are computed for a wide range of nano-hexapod stiffnesses
|
||||
- Section [[sec:granite_stiffness]]:
|
||||
- Section [[sec:open_loop_budget_error]]: from both the PSD of the disturbances and the transfer function from disturbances to sample's position errors, we compute the resulting PSD and Cumulative Amplitude Spectrum (CAS)
|
||||
- Section [[sec:closed_loop_budget_error]]: from a simplistic model is computed the required control bandwidth to reduce the position error to acceptable values
|
||||
|
||||
* Disturbances
|
||||
<<sec:psd_disturbances>>
|
||||
** Introduction :ignore:
|
||||
The main disturbances considered here are:
|
||||
- $D_w$: Ground displacement in the $x$, $y$ and $z$ directions
|
||||
- $F_{ty}$: Forces applied by the Translation stage in the $x$ and $z$ directions
|
||||
- $F_{rz}$: Forces applied by the Spindle in the $z$ direction
|
||||
- $F_d$: Direct forces applied at the center of mass of the Payload
|
||||
|
||||
The level of these disturbances has been identified form experiments which are detailed in [[file:disturbances.org][this]] document.
|
||||
|
||||
** 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
|
||||
|
||||
#+begin_src matlab :tangle no
|
||||
simulinkproject('../');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
load('mat/conf_simulink.mat');
|
||||
|
||||
open('nass_model.slx')
|
||||
#+end_src
|
||||
** Plots :ignore:
|
||||
The measured Amplitude Spectral Densities (ASD) of these forces are shown in Figures [[fig:opt_stiff_dist_gm]] and [[fig:opt_stiff_dist_fty_frz]].
|
||||
|
||||
In this study, the expected frequency content of the direct forces applied to the payload is not considered.
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
load('./mat/dist_psd.mat', 'dist_f');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
plot(dist_f.f, sqrt(dist_f.psd_gm));
|
||||
hold off;
|
||||
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('$\Gamma_{D_w}$ $\left[\frac{m}{\sqrt{Hz}}\right]$')
|
||||
xlim([1, 500]);
|
||||
#+end_src
|
||||
|
||||
#+header: :tangle no :exports results :results none :noweb yes
|
||||
#+begin_src matlab :var filepath="figs/opt_stiff_dist_gm.pdf" :var figsize="wide-normal" :post pdf2svg(file=*this*, ext="png")
|
||||
<<plt-matlab>>
|
||||
#+end_src
|
||||
|
||||
#+name: fig:opt_stiff_dist_gm
|
||||
#+caption: Amplitude Spectral Density of the Ground Displacement ([[./figs/opt_stiff_dist_gm.png][png]], [[./figs/opt_stiff_dist_gm.pdf][pdf]])
|
||||
[[file:figs/opt_stiff_dist_gm.png]]
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
figure;
|
||||
hold on;
|
||||
plot(dist_f.f, sqrt(dist_f.psd_ty), 'DisplayName', '$F_{T_y}$');
|
||||
plot(dist_f.f, sqrt(dist_f.psd_rz), 'DisplayName', '$F_{R_z}$');
|
||||
hold off;
|
||||
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('ASD $\left[\frac{F}{\sqrt{Hz}}\right]$')
|
||||
legend('Location', 'southwest');
|
||||
xlim([1, 500]);
|
||||
#+end_src
|
||||
|
||||
#+header: :tangle no :exports results :results none :noweb yes
|
||||
#+begin_src matlab :var filepath="figs/opt_stiff_dist_fty_frz.pdf" :var figsize="wide-normal" :post pdf2svg(file=*this*, ext="png")
|
||||
<<plt-matlab>>
|
||||
#+end_src
|
||||
|
||||
#+name: fig:opt_stiff_dist_fty_frz
|
||||
#+caption: Amplitude Spectral Density of the "parasitic" forces comming from the Translation stage and the spindle ([[./figs/opt_stiff_dist_fty_frz.png][png]], [[./figs/opt_stiff_dist_fty_frz.pdf][pdf]])
|
||||
[[file:figs/opt_stiff_dist_fty_frz.png]]
|
||||
|
||||
* Effect of disturbances on the position error
|
||||
<<sec:effect_disturbances>>
|
||||
** Introduction :ignore:
|
||||
** 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
|
||||
|
||||
#+begin_src matlab :tangle no
|
||||
simulinkproject('../');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
load('mat/conf_simulink.mat');
|
||||
|
||||
open('nass_model.slx')
|
||||
#+end_src
|
||||
** Initialization
|
||||
We initialize all the stages with the default parameters.
|
||||
#+begin_src matlab
|
||||
initializeGround();
|
||||
initializeGranite();
|
||||
initializeTy();
|
||||
initializeRy();
|
||||
initializeRz();
|
||||
initializeMicroHexapod();
|
||||
initializeAxisc();
|
||||
initializeMirror();
|
||||
#+end_src
|
||||
|
||||
We use a sample mass of 10kg.
|
||||
#+begin_src matlab
|
||||
initializeSample('mass', 10);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
initializeSimscapeConfiguration('gravity', true);
|
||||
initializeDisturbances('enable', false);
|
||||
initializeLoggingConfiguration('log', 'none');
|
||||
initializeController();
|
||||
#+end_src
|
||||
|
||||
|
||||
** Identification
|
||||
Inputs:
|
||||
- =Dwx=: Ground displacement in the $x$ direction
|
||||
- =Dwy=: Ground displacement in the $y$ direction
|
||||
- =Dwz=: Ground displacement in the $z$ direction
|
||||
- =Fty_x=: Forces applied by the Translation stage in the $x$ direction
|
||||
- =Fty_z=: Forces applied by the Translation stage in the $z$ direction
|
||||
- =Frz_z=: Forces applied by the Spindle in the $z$ direction
|
||||
- =Fd=: Direct forces applied at the center of mass of the Payload
|
||||
|
||||
#+begin_src matlab
|
||||
Ks = logspace(3,9,7); % [N/m]
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
Gd = {zeros(length(Ks), 1)};
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
%% Name of the Simulink File
|
||||
mdl = 'nass_model';
|
||||
|
||||
%% Micro-Hexapod
|
||||
clear io; io_i = 1;
|
||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwx'); io_i = io_i + 1; % X Ground motion
|
||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwy'); io_i = io_i + 1; % Y Ground motion
|
||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwz'); io_i = io_i + 1; % Z Ground motion
|
||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Fty_x'); io_i = io_i + 1; % Parasitic force Ty - X
|
||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Fty_z'); io_i = io_i + 1; % Parasitic force Ty - Z
|
||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Frz_z'); io_i = io_i + 1; % Parasitic force Rz - Z
|
||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Fd'); io_i = io_i + 1; % Direct forces
|
||||
|
||||
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'openoutput', [], 'En'); io_i = io_i + 1; % Position Error
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
for i = 1:length(Ks)
|
||||
initializeNanoHexapod('k', Ks(i));
|
||||
|
||||
% Run the linearization
|
||||
G = linearize(mdl, io);
|
||||
G.InputName = {'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_z', 'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
|
||||
G.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
|
||||
Gd(i) = {minreal(G)};
|
||||
end
|
||||
#+end_src
|
||||
|
||||
** Plots
|
||||
Effect of Stages vibration (Filtering).
|
||||
#+begin_src matlab :exports none
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ez', 'Frz_z'), freqs, 'Hz'))), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||
#+end_src
|
||||
|
||||
Effect of Ground motion (Transmissibility).
|
||||
#+begin_src matlab :exports none
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
figure;
|
||||
|
||||
ax1 = subplot(3, 1, 1);
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ex', 'Dwx'), freqs, 'Hz'))), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/m]');
|
||||
|
||||
ax1 = subplot(3, 1, 2);
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ey', 'Dwy'), freqs, 'Hz'))), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/m]');
|
||||
|
||||
ax1 = subplot(3, 1, 3);
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ez', 'Dwz'), freqs, 'Hz'))), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]');
|
||||
#+end_src
|
||||
|
||||
Direct Forces (Compliance).
|
||||
#+begin_src matlab :exports none
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ez', 'Fdz'), freqs, 'Hz'))), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||
#+end_src
|
||||
|
||||
** Save
|
||||
#+begin_src matlab
|
||||
save('./mat/opt_stiffness_disturbances.mat', 'Gd')
|
||||
#+end_src
|
||||
|
||||
* Effect of granite stiffness
|
||||
<<sec:granite_stiffness>>
|
||||
** Analytical Analysis
|
||||
#+begin_src latex :file 2dof_system_granite_stiffness.pdf
|
||||
\begin{tikzpicture}
|
||||
% ====================
|
||||
% Parameters
|
||||
% ====================
|
||||
\def\massw{2.2} % Width of the masses
|
||||
\def\massh{0.8} % Height of the masses
|
||||
\def\spaceh{1.2} % Height of the springs/dampers
|
||||
\def\dispw{0.3} % Width of the dashed line for the displacement
|
||||
\def\disph{0.5} % Height of the arrow for the displacements
|
||||
\def\bracs{0.05} % Brace spacing vertically
|
||||
\def\brach{-10pt} % Brace shift horizontaly
|
||||
% ====================
|
||||
|
||||
|
||||
% ====================
|
||||
% Ground
|
||||
% ====================
|
||||
\draw (-0.5*\massw, 0) -- (0.5*\massw, 0);
|
||||
\draw[dashed] (0.5*\massw, 0) -- ++(\dispw, 0) coordinate(dlow);
|
||||
\draw[->] (0.5*\massw+0.5*\dispw, 0) -- ++(0, \disph) node[right]{$x_{w}$};
|
||||
|
||||
% ====================
|
||||
% Micro Station
|
||||
% ====================
|
||||
\begin{scope}[shift={(0, 0)}]
|
||||
% Mass
|
||||
\draw[fill=white] (-0.5*\massw, \spaceh) rectangle (0.5*\massw, \spaceh+\massh) node[pos=0.5]{$m$};
|
||||
|
||||
% Spring, Damper, and Actuator
|
||||
\draw[spring] (-0.4*\massw, 0) -- (-0.4*\massw, \spaceh) node[midway, left=0.1]{$k$};
|
||||
\draw[damper] (0, 0) -- ( 0, \spaceh) node[midway, left=0.2]{$c$};
|
||||
|
||||
% Displacements
|
||||
\draw[dashed] (0.5*\massw, \spaceh) -- ++(\dispw, 0);
|
||||
\draw[->] (0.5*\massw+0.5*\dispw, \spaceh) -- ++(0, \disph) node[right]{$x$};
|
||||
|
||||
% Legend
|
||||
\draw[decorate, decoration={brace, amplitude=8pt}, xshift=\brach] %
|
||||
(-0.5*\massw, \bracs) -- (-0.5*\massw, \spaceh+\massh-\bracs) %
|
||||
node[midway,rotate=90,anchor=south,yshift=10pt,align=center]{Granite};
|
||||
\end{scope}
|
||||
|
||||
% ====================
|
||||
% Nano Station
|
||||
% ====================
|
||||
\begin{scope}[shift={(0, \spaceh+\massh)}]
|
||||
% Mass
|
||||
\draw[fill=white] (-0.5*\massw, \spaceh) rectangle (0.5*\massw, \spaceh+\massh) node[pos=0.5]{$m^\prime$};
|
||||
|
||||
% Spring, Damper, and Actuator
|
||||
\draw[spring] (-0.4*\massw, 0) -- (-0.4*\massw, \spaceh) node[midway, left=0.1]{$k^\prime$};
|
||||
\draw[damper] (0, 0) -- ( 0, \spaceh) node[midway, left=0.2]{$c^\prime$};
|
||||
|
||||
% Displacements
|
||||
\draw[dashed] (0.5*\massw, \spaceh) -- ++(\dispw, 0) coordinate(dhigh);
|
||||
\draw[->] (0.5*\massw+0.5*\dispw, \spaceh) -- ++(0, \disph) node[right]{$x^\prime$};
|
||||
|
||||
% Legend
|
||||
\draw[decorate, decoration={brace, amplitude=8pt}, xshift=\brach] %
|
||||
(-0.5*\massw, \bracs) -- (-0.5*\massw, \spaceh+\massh-\bracs) %
|
||||
node[midway,rotate=90,anchor=south,yshift=10pt,align=center]{Positioning\\Stages};
|
||||
\end{scope}
|
||||
\end{tikzpicture}
|
||||
#+end_src
|
||||
|
||||
#+name: fig:2dof_system_granite_stiffness
|
||||
#+caption: Figure caption
|
||||
#+RESULTS:
|
||||
[[file:figs/2dof_system_granite_stiffness.png]]
|
||||
|
||||
If we write the equation of motion of the system in Figure [[fig:2dof_system_granite_stiffness]], we obtain:
|
||||
\begin{align}
|
||||
m^\prime s^2 x^\prime &= (c^\prime s + k^\prime) (x - x^\prime) \\
|
||||
ms^2 x &= (c^\prime s + k^\prime) (x^\prime - x) + (cs + k) (x_w - x)
|
||||
\end{align}
|
||||
|
||||
If we note $d = x^\prime - x$, we obtain:
|
||||
#+name: eq:plant_ground_transmissibility
|
||||
\begin{equation}
|
||||
\frac{d}{x_w} = \frac{-m^\prime s^2 (cs + k)}{ (m^\prime s^2 + c^\prime s + k^\prime) (ms^2 + cs + k) + m^\prime s^2(c^\prime s + k^\prime)}
|
||||
\end{equation}
|
||||
|
||||
** Soft Granite
|
||||
Let's initialize a soft granite that will act as an isolation stage from ground motion.
|
||||
#+begin_src matlab
|
||||
initializeGranite('K', 5e5*ones(3,1), 'C', 5e3*ones(3,1));
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
Ks = logspace(3,9,7); % [N/m]
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
Gdr = {zeros(length(Ks), 1)};
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
for i = 1:length(Ks)
|
||||
initializeNanoHexapod('k', Ks(i));
|
||||
|
||||
G = linearize(mdl, io);
|
||||
G.InputName = {'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_z', 'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
|
||||
G.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
|
||||
Gdr(i) = {minreal(G)};
|
||||
end
|
||||
#+end_src
|
||||
|
||||
** Effect of the Granite transfer function
|
||||
#+begin_src matlab :exports none
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
set(gca,'ColorOrderIndex',i);
|
||||
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ez', 'Dwz'), freqs, 'Hz'))), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
|
||||
set(gca,'ColorOrderIndex',i);
|
||||
plot(freqs, abs(squeeze(freqresp(Gdr{i}('Ez', 'Dwz'), freqs, 'Hz'))), '--', ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]');
|
||||
legend('location', 'southeast');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
set(gca,'ColorOrderIndex',i);
|
||||
plot(freqs, abs(squeeze(freqresp(Gd{i}('Ez', 'Frz_z'), freqs, 'Hz'))), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
|
||||
set(gca,'ColorOrderIndex',i);
|
||||
plot(freqs, abs(squeeze(freqresp(Gdr{i}('Ez', 'Frz_z'), freqs, 'Hz'))), '--', ...
|
||||
'HandleVisibility', 'off');
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||
legend('location', 'southeast');
|
||||
#+end_src
|
||||
|
||||
|
||||
* Open Loop Budget Error
|
||||
<<sec:open_loop_budget_error>>
|
||||
** Introduction :ignore:
|
||||
** 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
|
||||
|
||||
#+begin_src matlab :tangle no
|
||||
simulinkproject('../');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
load('mat/conf_simulink.mat');
|
||||
|
||||
open('nass_model.slx')
|
||||
#+end_src
|
||||
|
||||
** Load of the identified disturbances and transfer functions
|
||||
#+begin_src matlab
|
||||
load('./mat/dist_psd.mat', 'dist_f');
|
||||
load('./mat/opt_stiffness_disturbances.mat', 'Gd')
|
||||
#+end_src
|
||||
|
||||
** Equations
|
||||
|
||||
** Results
|
||||
Effect of all disturbances
|
||||
|
||||
#+begin_src matlab
|
||||
freqs = dist_f.f;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
plot(freqs, sqrt(dist_f.psd_rz).*abs(squeeze(freqresp(Gd{i}('Ez', 'Frz_z'), freqs, 'Hz'))));
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('ASD $\left[\frac{m}{\sqrt{Hz}}\right]$')
|
||||
legend('Location', 'southwest');
|
||||
xlim([2, 500]);
|
||||
#+end_src
|
||||
|
||||
** Cumulative Amplitude Spectrum
|
||||
#+begin_src matlab
|
||||
freqs = dist_f.f;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(dist_f.psd_ty.*abs(squeeze(freqresp(Gd{i}('Ez', 'Fty_z'), freqs, 'Hz'))).^2)))), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
|
||||
end
|
||||
plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
|
||||
hold off;
|
||||
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('CAS $[m]$')
|
||||
legend('Location', 'southwest');
|
||||
xlim([2, 500]); ylim([1e-10 1e-6]);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
freqs = dist_f.f;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(dist_f.psd_rz.*abs(squeeze(freqresp(Gd{i}('Ez', 'Frz_z'), freqs, 'Hz'))).^2)))), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
|
||||
end
|
||||
plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
|
||||
hold off;
|
||||
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('CAS $[m]$')
|
||||
legend('Location', 'southwest');
|
||||
xlim([2, 500]); ylim([1e-10 1e-6]);
|
||||
#+end_src
|
||||
|
||||
Ground motion
|
||||
#+begin_src matlab
|
||||
freqs = dist_f.f;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(dist_f.psd_gm.*abs(squeeze(freqresp(Gd{i}('Ez', 'Dwz'), freqs, 'Hz'))).^2)))), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
|
||||
end
|
||||
plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
|
||||
hold off;
|
||||
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('CAS $E_y$ $[m]$')
|
||||
legend('Location', 'northeast');
|
||||
xlim([2, 500]); ylim([1e-10 1e-6]);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
freqs = dist_f.f;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(dist_f.psd_gm.*abs(squeeze(freqresp(Gd{i}('Ex', 'Dwx'), freqs, 'Hz'))).^2)))), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
|
||||
end
|
||||
plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
|
||||
hold off;
|
||||
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'lin');
|
||||
xlabel('Frequency [Hz]'); ylabel('CAS $E_y$ $[m]$')
|
||||
legend('Location', 'northeast');
|
||||
xlim([2, 500]);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
freqs = dist_f.f;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(dist_f.psd_gm.*abs(squeeze(freqresp(Gd{i}('Ey', 'Dwy'), freqs, 'Hz'))).^2)))), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
|
||||
end
|
||||
plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
|
||||
hold off;
|
||||
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'lin');
|
||||
xlabel('Frequency [Hz]'); ylabel('CAS $E_y$ $[m]$')
|
||||
legend('Location', 'northeast');
|
||||
xlim([2, 500]);
|
||||
#+end_src
|
||||
|
||||
Sum of all perturbations
|
||||
#+begin_src matlab
|
||||
psd_tot = zeros(length(freqs), length(Ks));
|
||||
|
||||
for i = 1:length(Ks)
|
||||
psd_tot(:,i) = dist_f.psd_gm.*abs(squeeze(freqresp(Gd{i}('Ez', 'Dwz' ), freqs, 'Hz'))).^2 + ...
|
||||
dist_f.psd_ty.*abs(squeeze(freqresp(Gd{i}('Ez', 'Fty_z'), freqs, 'Hz'))).^2 + ...
|
||||
dist_f.psd_rz.*abs(squeeze(freqresp(Gd{i}('Ez', 'Frz_z'), freqs, 'Hz'))).^2;
|
||||
end
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
freqs = dist_f.f;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(psd_tot(:,i))))), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
|
||||
end
|
||||
plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
|
||||
hold off;
|
||||
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('CAS $E_z$ $[m]$')
|
||||
legend('Location', 'northeast');
|
||||
xlim([1, 500]); ylim([1e-10 1e-6]);
|
||||
#+end_src
|
||||
|
||||
* Closed Loop Budget Error
|
||||
<<sec:closed_loop_budget_error>>
|
||||
** Introduction :ignore:
|
||||
** Reduction thanks to feedback - Required bandwidth
|
||||
#+begin_src matlab
|
||||
wc = 1*2*pi; % [rad/s]
|
||||
xic = 0.5;
|
||||
|
||||
S = (s/wc)/(1 + s/wc);
|
||||
|
||||
bodeFig({S}, logspace(-1,2,1000))
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
wc = [1, 5, 10, 20, 50, 100, 200];
|
||||
|
||||
S1 = {zeros(length(wc), 1)};
|
||||
S2 = {zeros(length(wc), 1)};
|
||||
|
||||
for j = 1:length(wc)
|
||||
L = (2*pi*wc(j))/s; % Simple integrator
|
||||
S1{j} = 1/(1 + L);
|
||||
L = ((2*pi*wc(j))/s)^2*(1 + s/(2*pi*wc(j)/2))/(1 + s/(2*pi*wc(j)*2));
|
||||
S2{j} = 1/(1 + L);
|
||||
end
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
freqs = dist_f.f;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
i = 6;
|
||||
for j = 1:length(wc)
|
||||
set(gca,'ColorOrderIndex',j);
|
||||
plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(abs(squeeze(freqresp(S1{j}, freqs, 'Hz'))).^2.*psd_tot(:,i))))), '-', ...
|
||||
'DisplayName', sprintf('$\\omega_c = %.0f$ [Hz]', wc(j)));
|
||||
end
|
||||
plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(psd_tot(:,i))))), 'k-', ...
|
||||
'DisplayName', 'Open-Loop');
|
||||
plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
|
||||
hold off;
|
||||
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('CAS $E_y$ $[m]$')
|
||||
legend('Location', 'northeast');
|
||||
xlim([0.5, 500]); ylim([1e-10 1e-6]);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
wc = logspace(0, 3, 100);
|
||||
|
||||
Dz1_rms = zeros(length(Ks), length(wc));
|
||||
Dz2_rms = zeros(length(Ks), length(wc));
|
||||
for i = 1:length(Ks)
|
||||
for j = 1:length(wc)
|
||||
L = (2*pi*wc(j))/s;
|
||||
Dz1_rms(i, j) = sqrt(trapz(freqs, abs(squeeze(freqresp(1/(1 + L), freqs, 'Hz'))).^2.*psd_tot(:,i)));
|
||||
|
||||
L = ((2*pi*wc(j))/s)^2*(1 + s/(2*pi*wc(j)/2))/(1 + s/(2*pi*wc(j)*2));
|
||||
Dz2_rms(i, j) = sqrt(trapz(freqs, abs(squeeze(freqresp(1/(1 + L), freqs, 'Hz'))).^2.*psd_tot(:,i)));
|
||||
end
|
||||
end
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
freqs = dist_f.f;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
for i = 1:length(Ks)
|
||||
set(gca,'ColorOrderIndex',i);
|
||||
plot(wc, Dz1_rms(i, :), '-', ...
|
||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)))
|
||||
|
||||
set(gca,'ColorOrderIndex',i);
|
||||
plot(wc, Dz2_rms(i, :), '--', ...
|
||||
'HandleVisibility', 'off')
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
||||
xlabel('Control Bandwidth [Hz]'); ylabel('$E_z\ [m, rms]$')
|
||||
legend('Location', 'southwest');
|
||||
xlim([1, 500]);
|
||||
#+end_src
|
||||
* Conclusion
|
@@ -313,13 +313,14 @@ The output =sample_pos= corresponds to the impact point of the X-ray.
|
||||
args.type char {mustBeMember(args.type,{'rigid', 'flexible', 'none', 'modal-analysis', 'init'})} = 'flexible'
|
||||
args.Foffset logical {mustBeNumericOrLogical} = false
|
||||
args.density (1,1) double {mustBeNumeric, mustBeNonnegative} = 2800 % Density [kg/m3]
|
||||
args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = [4e9; 3e8; 8e8] % [N/m]
|
||||
args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = [4.0e5; 1.1e5; 9.0e5] % [N/(m/s)]
|
||||
args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m]
|
||||
args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m]
|
||||
args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m]
|
||||
end
|
||||
#+end_src
|
||||
|
||||
|
||||
** Structure initialization
|
||||
:PROPERTIES:
|
||||
:UNNUMBERED: t
|
||||
@@ -370,8 +371,8 @@ Z-offset for the initial position of the sample with respect to the granite top
|
||||
:END:
|
||||
|
||||
#+begin_src matlab
|
||||
granite.K = [4e9; 3e8; 8e8]; % [N/m]
|
||||
granite.C = [4.0e5; 1.1e5; 9.0e5]; % [N/(m/s)]
|
||||
granite.K = args.K; % [N/m]
|
||||
granite.C = args.C; % [N/(m/s)]
|
||||
#+end_src
|
||||
|
||||
** Equilibrium position of the each joint.
|
||||
|
@@ -75,8 +75,8 @@ The rotation speed will have an effect due to the Coriolis effect.
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
% load('mat/conf_simulink.mat');
|
||||
% open('nass_model.slx')
|
||||
load('mat/conf_simulink.mat');
|
||||
open('nass_model.slx')
|
||||
#+end_src
|
||||
|
||||
** Initialization
|
Reference in New Issue
Block a user