+
+
+
+
+
+This Matlab function is accessible here.
+
+
+
Initialize the Simulation
+
+
+We initialize all the stages with the default parameters.
+
+
+
initializeGround();
+initializeGranite();
+initializeTy();
+initializeRy();
+initializeRz();
+initializeMicroHexapod();
+initializeAxisc();
+initializeMirror();
+
+
+
+
+The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg.
+
+
+
initializeNanoHexapod('actuator', args.nass_actuator);
+initializeSample('mass', args.sample_mass);
+
+
+
+
+We set the references that corresponds to a tomography experiment.
initializeReferences('Rz_type', 'rotating', 'Rz_period', args.Rz_period);
+
+
initializeDisturbances();
+
+
+
And all the controllers are set to 0.
@@ -1904,7 +1897,7 @@ save(
'./mat/controllers.mat',
Author: Dehaeze Thomas
-Created: 2020-02-04 mar. 18:36
+Created: 2020-02-06 jeu. 17:06
diff --git a/active_damping/index.org b/active_damping/index.org
index d05595b..33064fe 100644
--- a/active_damping/index.org
+++ b/active_damping/index.org
@@ -42,22 +42,27 @@
:END:
* Introduction :ignore:
-First, in section [[sec:undamped_system]], we will looked at the undamped system.
+The goal of this file is to study the use of active damping for the control of the NASS.
-Then, we will compare three active damping techniques:
-- In section [[sec:iff]]: the integral force feedback is used
-- In section [[sec:dvf]]: the direct velocity feedback is used
-- In section [[sec:ine]]: inertial control is used
+In general, three sensors can be used for Active Damping:
+- A force sensor
+- A relative motion sensor such as a capacitive sensor
+- An inertial sensor such as an accelerometer of geophone
-For each of the active damping technique, we will:
-- Look at the damped plant
+First, in section [[sec:undamped_system]], we look at the undamped system and we identify the dynamics from the actuators to the three sensor types.
+
+Then, in section [[sec:act_damp_variability_plant]], we study the change of dynamics for the active damping plants with respect to various experimental conditions such as the sample mass and the spindle rotation speed.
+
+Then, we will apply and compare the results of three active damping techniques:
+- In section [[sec:iff]]: Integral Force Feedback is applied
+- In section [[sec:dvf]]: Direct Velocity Feedback using a relative motion sensor is applied
+- In section [[sec:ine]]: Inertial Control using a geophone is applied
+
+For each of the active damping technique, we:
+- Look at the obtain damped plant that will be used for High Authority control
- Simulate tomography experiments
- Compare the sensitivity from disturbances
-The disturbances are:
-- Ground motion
-- Motion errors of all the stages
-
* Undamped System
:PROPERTIES:
:header-args:matlab+: :tangle matlab/undamped_system.m
@@ -95,49 +100,13 @@ After that, a tomography experiment is simulation without any active damping tec
#+end_src
** Identification of the dynamics for Active Damping
-*** Initialize the Simulation
+*** Identification
We initialize all the stages with the default parameters.
#+begin_src matlab
- initializeGround();
- initializeGranite();
- initializeTy();
- initializeRy();
- initializeRz();
- initializeMicroHexapod();
- initializeAxisc();
- initializeMirror();
+ prepareLinearizeIdentification();
#+end_src
-The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg.
-#+begin_src matlab
- initializeNanoHexapod('actuator', 'piezo');
- initializeSample('mass', 50);
-#+end_src
-
-We set the references to zero.
-#+begin_src matlab
- initializeReferences();
-#+end_src
-
-No disturbance is included in the system.
-#+begin_src matlab
- initializeDisturbances('enable', false);
-#+end_src
-
-And all the controllers are set to 0.
-#+begin_src matlab
- K = tf(zeros(6));
- save('./mat/controllers.mat', 'K', '-append');
- K_ine = tf(zeros(6));
- save('./mat/controllers.mat', 'K_ine', '-append');
- K_iff = tf(zeros(6));
- save('./mat/controllers.mat', 'K_iff', '-append');
- K_dvf = tf(zeros(6));
- save('./mat/controllers.mat', 'K_dvf', '-append');
-#+end_src
-
-*** Identification
-First, we identify the dynamics of the system using the =linearize= function.
+We identify the dynamics of the system using the =linearize= function.
#+begin_src matlab
%% Options for Linearized
options = linearizeOptions;
@@ -152,15 +121,13 @@ First, we identify the dynamics of the system using the =linearize= function.
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1; % Relative Motion Outputs
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1; % Force Sensors
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1; % Absolute Velocity Outputs
- io(io_i) = linio([mdl, '/Compute Error in NASS base'], 2, 'openoutput'); io_i = io_i + 1; % Metrology Outputs
%% Run the linearization
G = linearize(mdl, io, 0.5, options);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6', ...
'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6', ...
- 'Vnlm1', 'Vnlm2', 'Vnlm3', 'Vnlm4', 'Vnlm5', 'Vnlm6', ...
- 'Dxn', 'Dyn', 'Dzn', 'Rxn', 'Ryn', 'Rzn'};
+ 'Vnlm1', 'Vnlm2', 'Vnlm3', 'Vnlm4', 'Vnlm5', 'Vnlm6'};
#+end_src
We then create transfer functions corresponding to the active damping plants.
@@ -170,16 +137,9 @@ We then create transfer functions corresponding to the active damping plants.
G_ine = minreal(G({'Vnlm1', 'Vnlm2', 'Vnlm3', 'Vnlm4', 'Vnlm5', 'Vnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}));
#+end_src
-#+begin_src matlab
- load('mat/stages.mat', 'nano_hexapod');
- G_cart = minreal(G({'Dxn', 'Dyn', 'Dzn', 'Rxn', 'Ryn', 'Rzn'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))*inv(nano_hexapod.J');
- G_cart.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
-#+end_src
-
And we save them for further analysis.
#+begin_src matlab
save('./active_damping/mat/undamped_plants.mat', 'G_iff', 'G_dvf', 'G_ine');
- save('./active_damping/mat/cart_plants.mat', 'G_cart');
#+end_src
*** Obtained Plants for Active Damping
@@ -220,8 +180,8 @@ And we save them for further analysis.
<
>
#+end_src
-#+NAME: fig:nass_active_damping_iff_plant
-#+CAPTION: =G_iff=: Transfer functions from forces applied in the actuators to the force sensor in each actuator ([[./figs/nass_active_damping_iff_plant.png][png]], [[./figs/nass_active_damping_iff_plant.pdf][pdf]])
+#+name: fig:nass_active_damping_iff_plant
+#+caption: =G_iff=: Transfer functions from forces applied in the actuators to the force sensor in each actuator ([[./figs/nass_active_damping_iff_plant.png][png]], [[./figs/nass_active_damping_iff_plant.pdf][pdf]])
[[file:figs/nass_active_damping_iff_plant.png]]
#+begin_src matlab :exports none
@@ -257,8 +217,8 @@ And we save them for further analysis.
<>
#+end_src
-#+NAME: fig:nass_active_damping_dvf_plant
-#+CAPTION: =G_dvf=: Transfer functions from forces applied in the actuators to the relative motion sensor in each actuator ([[./figs/nass_active_damping_dvf_plant.png][png]], [[./figs/nass_active_damping_dvf_plant.pdf][pdf]])
+#+name: fig:nass_active_damping_dvf_plant
+#+caption: =G_dvf=: Transfer functions from forces applied in the actuators to the relative motion sensor in each actuator ([[./figs/nass_active_damping_dvf_plant.png][png]], [[./figs/nass_active_damping_dvf_plant.pdf][pdf]])
[[file:figs/nass_active_damping_dvf_plant.png]]
#+begin_src matlab :exports none
@@ -294,10 +254,163 @@ And we save them for further analysis.
<>
#+end_src
-#+NAME: fig:nass_active_damping_inertial_plant
-#+CAPTION: =G_ine=: Transfer functions from forces applied in the actuators to the geophone located in each leg measuring the absolute velocity of the top part of the leg in the direction of the leg ([[./figs/nass_active_damping_inertial_plant.png][png]], [[./figs/nass_active_damping_inertial_plant.pdf][pdf]])
+#+name: fig:nass_active_damping_inertial_plant
+#+caption: =G_ine=: Transfer functions from forces applied in the actuators to the geophone located in each leg measuring the absolute velocity of the top part of the leg in the direction of the leg ([[./figs/nass_active_damping_inertial_plant.png][png]], [[./figs/nass_active_damping_inertial_plant.pdf][pdf]])
[[file:figs/nass_active_damping_inertial_plant.png]]
+** Identification of the dynamics for High Authority Control
+*** Identification
+We initialize all the stages with the default parameters.
+#+begin_src matlab
+ prepareLinearizeIdentification();
+#+end_src
+
+We identify the dynamics of the system using the =linearize= function.
+#+begin_src matlab
+ %% Options for Linearized
+ options = linearizeOptions;
+ options.SampleTime = 0;
+
+ %% Name of the Simulink File
+ mdl = 'sim_nass_active_damping';
+
+ %% Input/Output definition
+ clear io; io_i = 1;
+ io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
+ io(io_i) = linio([mdl, '/Compute Error in NASS base'], 2, 'openoutput'); io_i = io_i + 1; % Metrology Outputs
+#+end_src
+
+#+begin_src matlab
+ masses = [1, 10, 50]; % [kg]
+#+end_src
+
+#+begin_src matlab :exports none
+ G_cart = {zeros(length(masses))};
+
+ load('mat/stages.mat', 'nano_hexapod');
+
+ for i = 1:length(masses)
+ initializeSample('mass', masses(i));
+
+ %% Run the linearization
+ G = linearize(mdl, io, 0.3, options);
+ G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
+ G.OutputName = {'Dnx', 'Dny', 'Dnz', 'Rnx', 'Rny', 'Rnz'};
+
+ G_cart_i = G*inv(nano_hexapod.J');
+ G_cart_i.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
+
+ G_cart(i) = {G_cart_i};
+ end
+#+end_src
+
+And we save them for further analysis.
+#+begin_src matlab
+ save('./active_damping/mat/cart_plants.mat', 'G_cart', 'masses');
+#+end_src
+
+*** Obtained Plants
+#+begin_src matlab
+ load('./active_damping/mat/cart_plants.mat', 'G_cart', 'masses');
+#+end_src
+
+#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
+ figure;
+
+ ax1 = subplot(2, 1, 1);
+ hold on;
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ p1 = plot(freqs, abs(squeeze(freqresp(G_cart{i}('Dnx', 'Fnx'), freqs, 'Hz'))));
+ set(gca,'ColorOrderIndex',i);
+ p2 = plot(freqs, abs(squeeze(freqresp(G_cart{i}('Dny', 'Fny'), freqs, 'Hz'))), '--');
+ set(gca,'ColorOrderIndex',i);
+ p3 = plot(freqs, abs(squeeze(freqresp(G_cart{i}('Dnz', 'Fnz'), freqs, 'Hz'))), ':');
+ end
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
+ legend([p1,p2,p3], {'Fx/Dx', 'Fy/Dx', 'Fz/Dz'});
+
+ ax2 = subplot(2, 1, 2);
+ hold on;
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart{i}('Dnx', 'Fnx'), freqs, 'Hz')))), ...
+ 'DisplayName', sprintf('$M = %.0f$ [kg]', masses(i)));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart{i}('Dny', 'Fny'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart{i}('Dnz', 'Fnz'), freqs, 'Hz')))), ':', 'HandleVisibility', 'off');
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ yticks([-540:180:540]);
+ legend('location', 'northeast');
+
+ linkaxes([ax1,ax2],'x');
+#+end_src
+
+#+HEADER: :tangle no :exports results :results none :noweb yes
+#+begin_src matlab :var filepath="figs/undamped_hac_plant_translations.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
+<>
+#+end_src
+
+#+name: fig:undamped_hac_plant_translations
+#+caption: Undamped Plant - Translations ([[./figs/undamped_hac_plant_translations.png][png]], [[./figs/undamped_hac_plant_translations.pdf][pdf]])
+[[file:figs/undamped_hac_plant_translations.png]]
+
+
+#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
+ figure;
+
+ ax1 = subplot(2, 1, 1);
+ hold on;
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ p1 = plot(freqs, abs(squeeze(freqresp(G_cart{i}('Rnx', 'Mnx'), freqs, 'Hz'))));
+ set(gca,'ColorOrderIndex',i);
+ p2 = plot(freqs, abs(squeeze(freqresp(G_cart{i}('Rny', 'Mny'), freqs, 'Hz'))), '--');
+ set(gca,'ColorOrderIndex',i);
+ p3 = plot(freqs, abs(squeeze(freqresp(G_cart{i}('Rnz', 'Mnz'), freqs, 'Hz'))), ':');
+ end
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
+ legend([p1,p2,p3], {'Rx/Mx', 'Ry/Mx', 'Rz/Mz'});
+
+ ax2 = subplot(2, 1, 2);
+ hold on;
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart{i}('Rnx', 'Mnx'), freqs, 'Hz')))), ...
+ 'DisplayName', sprintf('$M = %.0f$ [kg]', masses(i)));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart{i}('Rny', 'Mny'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart{i}('Rnz', 'Mnz'), freqs, 'Hz')))), ':', 'HandleVisibility', 'off');
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ yticks([-540:180:540]);
+ legend('location', 'northeast');
+
+ linkaxes([ax1,ax2],'x');
+#+end_src
+
+#+HEADER: :tangle no :exports results :results none :noweb yes
+#+begin_src matlab :var filepath="figs/undamped_hac_plant_rotations.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
+<>
+#+end_src
+
+#+name: fig:undamped_hac_plant_rotations
+#+caption: Undamped Plant - Rotations ([[./figs/undamped_hac_plant_rotations.png][png]], [[./figs/undamped_hac_plant_rotations.pdf][pdf]])
+[[file:figs/undamped_hac_plant_rotations.png]]
+
** Tomography Experiment
*** Simulation
We initialize elements for the tomography experiment.
@@ -308,7 +421,7 @@ We initialize elements for the tomography experiment.
We change the simulation stop time.
#+begin_src matlab
load('mat/conf_simscape.mat');
- set_param(conf_simscape, 'StopTime', '3');
+ set_param(conf_simscape, 'StopTime', '4.5');
#+end_src
And we simulate the system.
@@ -325,48 +438,72 @@ Finally, we save the simulation results for further analysis
We load the results of tomography experiments.
#+begin_src matlab
load('./active_damping/mat/tomo_exp.mat', 'En');
- t = linspace(0, 3, length(En(:,1)));
+ Fs = 1e3; % Sampling Frequency of the Data
+ t = (1/Fs)*[0:length(En(:,1))-1];
#+end_src
#+begin_src matlab :exports none
figure;
+ ax1 = subplot(3, 1, 1);
hold on;
plot(t, En(:,1), 'DisplayName', '$\epsilon_{x}$')
+ legend('location', 'southwest');
+
+ ax2 = subplot(3, 1, 2);
+ hold on;
plot(t, En(:,2), 'DisplayName', '$\epsilon_{y}$')
+ legend('location', 'southwest');
+ ylabel('Position Error [m]');
+
+ ax3 = subplot(3, 1, 3);
+ hold on;
plot(t, En(:,3), 'DisplayName', '$\epsilon_{z}$')
- hold off;
- legend();
- xlabel('Time [s]'); ylabel('Position Error [m]');
+ legend('location', 'northwest');
+ xlabel('Time [s]');
+
+ linkaxes([ax1,ax2,ax3],'x');
+ xlim([0.5,inf]);
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/nass_act_damp_undamped_sim_tomo_trans.pdf" :var figsize="wide-normal" :post pdf2svg(file=*this*, ext="png")
+#+begin_src matlab :var filepath="figs/nass_act_damp_undamped_sim_tomo_trans.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<>
#+end_src
-#+NAME: fig:nass_act_damp_undamped_sim_tomo_trans
-#+CAPTION: Position Error during tomography experiment - Translations ([[./figs/nass_act_damp_undamped_sim_tomo_trans.png][png]], [[./figs/nass_act_damp_undamped_sim_tomo_trans.pdf][pdf]])
+#+name: fig:nass_act_damp_undamped_sim_tomo_trans
+#+caption: Position Error during tomography experiment - Translations ([[./figs/nass_act_damp_undamped_sim_tomo_trans.png][png]], [[./figs/nass_act_damp_undamped_sim_tomo_trans.pdf][pdf]])
[[file:figs/nass_act_damp_undamped_sim_tomo_trans.png]]
#+begin_src matlab :exports none
figure;
+ ax1 = subplot(3, 1, 1);
hold on;
plot(t, En(:,4), 'DisplayName', '$\epsilon_{\theta_x}$')
+ legend('location', 'northwest');
+
+ ax2 = subplot(3, 1, 2);
+ hold on;
plot(t, En(:,5), 'DisplayName', '$\epsilon_{\theta_y}$')
+ legend('location', 'southwest');
+ ylabel('Position Error [rad]');
+
+ ax3 = subplot(3, 1, 3);
+ hold on;
plot(t, En(:,6), 'DisplayName', '$\epsilon_{\theta_z}$')
- hold off;
- xlim([0.5,inf]);
legend();
- xlabel('Time [s]'); ylabel('Position Error [rad]');
+ xlabel('Time [s]');
+
+ linkaxes([ax1,ax2,ax3],'x');
+ xlim([0.5,inf]);
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/nass_act_damp_undamped_sim_tomo_rot.pdf" :var figsize="wide-normal" :post pdf2svg(file=*this*, ext="png")
+#+begin_src matlab :var filepath="figs/nass_act_damp_undamped_sim_tomo_rot.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<>
#+end_src
-#+NAME: fig:nass_act_damp_undamped_sim_tomo_rot
-#+CAPTION: Position Error during tomography experiment - Rotations ([[./figs/nass_act_damp_undamped_sim_tomo_rot.png][png]], [[./figs/nass_act_damp_undamped_sim_tomo_rot.pdf][pdf]])
+#+name: fig:nass_act_damp_undamped_sim_tomo_rot
+#+caption: Position Error during tomography experiment - Rotations ([[./figs/nass_act_damp_undamped_sim_tomo_rot.png][png]], [[./figs/nass_act_damp_undamped_sim_tomo_rot.pdf][pdf]])
[[file:figs/nass_act_damp_undamped_sim_tomo_rot.png]]
* Variability of the system dynamics for Active Damping
@@ -412,47 +549,12 @@ This is done in order for the transient phase to be over.
*** Introduction :ignore:
For all the identifications, the disturbances are disabled and no controller are used.
-*** Initialize the Simulation :noexport:
+*** Identification :ignore:
We initialize all the stages with the default parameters.
#+begin_src matlab
- initializeGround();
- initializeGranite();
- initializeTy();
- initializeRy();
- initializeRz();
- initializeMicroHexapod();
- initializeAxisc();
- initializeMirror();
+ prepareLinearizeIdentification();
#+end_src
-No disturbances.
-#+begin_src matlab
- initializeDisturbances('enable', false);
-#+end_src
-
-The nano-hexapod is a piezoelectric hexapod.
-#+begin_src matlab
- initializeNanoHexapod('actuator', 'piezo');
-#+end_src
-
-We set the references to zero.
-#+begin_src matlab
- initializeReferences();
-#+end_src
-
-And all the controllers are set to 0.
-#+begin_src matlab
- K = tf(zeros(6));
- save('./mat/controllers.mat', 'K', '-append');
- K_ine = tf(zeros(6));
- save('./mat/controllers.mat', 'K_ine', '-append');
- K_iff = tf(zeros(6));
- save('./mat/controllers.mat', 'K_iff', '-append');
- K_dvf = tf(zeros(6));
- save('./mat/controllers.mat', 'K_dvf', '-append');
-#+end_src
-
-*** Identification :ignore:
#+begin_src matlab :exports none
%% Options for Linearized
options = linearizeOptions;
@@ -541,8 +643,8 @@ We identify the dynamics for the following sample mass.
<>
#+end_src
-#+NAME: fig:act_damp_variability_iff_sample_mass
-#+CAPTION: Variability of the IFF plant with the Sample Mass ([[./figs/act_damp_variability_iff_sample_mass.png][png]], [[./figs/act_damp_variability_iff_sample_mass.pdf][pdf]])
+#+name: fig:act_damp_variability_iff_sample_mass
+#+caption: Variability of the dynamics from actuator force to force sensor with the Sample Mass ([[./figs/act_damp_variability_iff_sample_mass.png][png]], [[./figs/act_damp_variability_iff_sample_mass.pdf][pdf]])
[[file:figs/act_damp_variability_iff_sample_mass.png]]
#+begin_src matlab :exports none
@@ -581,8 +683,8 @@ We identify the dynamics for the following sample mass.
<>
#+end_src
-#+NAME: fig:act_damp_variability_dvf_sample_mass
-#+CAPTION: Variability of the DVF plant with the Sample Mass ([[./figs/act_damp_variability_dvf_sample_mass.png][png]], [[./figs/act_damp_variability_dvf_sample_mass.pdf][pdf]])
+#+name: fig:act_damp_variability_dvf_sample_mass
+#+caption: Variability of the dynamics from actuator force to relative motion sensor with the Sample Mass ([[./figs/act_damp_variability_dvf_sample_mass.png][png]], [[./figs/act_damp_variability_dvf_sample_mass.pdf][pdf]])
[[file:figs/act_damp_variability_dvf_sample_mass.png]]
#+begin_src matlab :exports none
@@ -620,50 +722,19 @@ We identify the dynamics for the following sample mass.
<>
#+end_src
-#+NAME: fig:act_damp_variability_ine_sample_mass
-#+CAPTION: Variability of the Inertial plant with the Sample Mass ([[./figs/act_damp_variability_ine_sample_mass.png][png]], [[./figs/act_damp_variability_ine_sample_mass.pdf][pdf]])
+#+name: fig:act_damp_variability_ine_sample_mass
+#+caption: Variability of the dynamics from actuator force to absolute velocity with the Sample Mass ([[./figs/act_damp_variability_ine_sample_mass.png][png]], [[./figs/act_damp_variability_ine_sample_mass.pdf][pdf]])
[[file:figs/act_damp_variability_ine_sample_mass.png]]
** Variation of the Spindle Angle
<>
*** Introduction :ignore:
-*** Initialize the Simulation :noexport:
+*** Identification :ignore:
We initialize all the stages with the default parameters.
#+begin_src matlab
- initializeGround();
- initializeGranite();
- initializeTy();
- initializeRy();
- initializeRz();
- initializeMicroHexapod();
- initializeAxisc();
- initializeMirror();
+ prepareLinearizeIdentification();
#+end_src
-No disturbances.
-#+begin_src matlab
- initializeDisturbances('enable', false);
-#+end_src
-
-The nano-hexapod is a piezoelectric hexapod.
-#+begin_src matlab
- initializeNanoHexapod('actuator', 'piezo');
- initializeSample('mass', 50);
-#+end_src
-
-And all the controllers are set to 0.
-#+begin_src matlab
- K = tf(zeros(6));
- save('./mat/controllers.mat', 'K', '-append');
- K_ine = tf(zeros(6));
- save('./mat/controllers.mat', 'K_ine', '-append');
- K_iff = tf(zeros(6));
- save('./mat/controllers.mat', 'K_iff', '-append');
- K_dvf = tf(zeros(6));
- save('./mat/controllers.mat', 'K_dvf', '-append');
-#+end_src
-
-*** Identification :ignore:
#+begin_src matlab :exports none
%% Options for Linearized
options = linearizeOptions;
@@ -751,8 +822,8 @@ We identify the dynamics for the following Spindle angles.
<>
#+end_src
-#+NAME: fig:act_damp_variability_iff_spindle_angle
-#+CAPTION: Variability of the IFF plant with the Spindle Angle ([[./figs/act_damp_variability_iff_spindle_angle.png][png]], [[./figs/act_damp_variability_iff_spindle_angle.pdf][pdf]])
+#+name: fig:act_damp_variability_iff_spindle_angle
+#+caption: Variability of the dynamics from the actuator force to the force sensor with the Spindle Angle ([[./figs/act_damp_variability_iff_spindle_angle.png][png]], [[./figs/act_damp_variability_iff_spindle_angle.pdf][pdf]])
[[file:figs/act_damp_variability_iff_spindle_angle.png]]
#+begin_src matlab :exports none
@@ -791,8 +862,8 @@ We identify the dynamics for the following Spindle angles.
<>
#+end_src
-#+NAME: fig:act_damp_variability_dvf_spindle_angle
-#+CAPTION: Variability of the DVF plant with the Spindle Angle ([[./figs/act_damp_variability_dvf_spindle_angle.png][png]], [[./figs/act_damp_variability_dvf_spindle_angle.pdf][pdf]])
+#+name: fig:act_damp_variability_dvf_spindle_angle
+#+caption: Variability of the dynamics from actuator force to relative motion sensor with the Spindle Angle ([[./figs/act_damp_variability_dvf_spindle_angle.png][png]], [[./figs/act_damp_variability_dvf_spindle_angle.pdf][pdf]])
[[file:figs/act_damp_variability_dvf_spindle_angle.png]]
#+begin_src matlab :exports none
@@ -830,50 +901,19 @@ We identify the dynamics for the following Spindle angles.
<>
#+end_src
-#+NAME: fig:act_damp_variability_ine_spindle_angle
-#+CAPTION: Variability of the Inertial plant with the Spindle Angle ([[./figs/act_damp_variability_ine_spindle_angle.png][png]], [[./figs/act_damp_variability_ine_spindle_angle.pdf][pdf]])
+#+name: fig:act_damp_variability_ine_spindle_angle
+#+caption: Variability of the dynamics from actuator force to absolute velocity with the Spindle Angle ([[./figs/act_damp_variability_ine_spindle_angle.png][png]], [[./figs/act_damp_variability_ine_spindle_angle.pdf][pdf]])
[[file:figs/act_damp_variability_ine_spindle_angle.png]]
** Variation of the Spindle Rotation Speed
<>
*** Introduction :ignore:
-*** Initialize the Simulation :noexport:
+*** Identification :ignore:
We initialize all the stages with the default parameters.
#+begin_src matlab
- initializeGround();
- initializeGranite();
- initializeTy();
- initializeRy();
- initializeRz();
- initializeMicroHexapod();
- initializeAxisc();
- initializeMirror();
+ prepareLinearizeIdentification();
#+end_src
-No disturbances.
-#+begin_src matlab
- initializeDisturbances('enable', false);
-#+end_src
-
-The nano-hexapod is a piezoelectric hexapod.
-#+begin_src matlab
- initializeNanoHexapod('actuator', 'piezo');
- initializeSample('mass', 50);
-#+end_src
-
-And all the controllers are set to 0.
-#+begin_src matlab
- K = tf(zeros(6));
- save('./mat/controllers.mat', 'K', '-append');
- K_ine = tf(zeros(6));
- save('./mat/controllers.mat', 'K_ine', '-append');
- K_iff = tf(zeros(6));
- save('./mat/controllers.mat', 'K_iff', '-append');
- K_dvf = tf(zeros(6));
- save('./mat/controllers.mat', 'K_dvf', '-append');
-#+end_src
-
-*** Identification :ignore:
#+begin_src matlab :exports none
%% Options for Linearized
options = linearizeOptions;
@@ -973,8 +1013,8 @@ The identification of the dynamics is done at the same Spindle angle position.
<>
#+end_src
-#+NAME: fig:act_damp_variability_iff_spindle_speed
-#+CAPTION: Variability of the IFF plant with the Spindle rotation speed ([[./figs/act_damp_variability_iff_spindle_speed.png][png]], [[./figs/act_damp_variability_iff_spindle_speed.pdf][pdf]])
+#+name: fig:act_damp_variability_iff_spindle_speed
+#+caption: Variability of the dynamics from the actuator force to the force sensor with the Spindle rotation speed ([[./figs/act_damp_variability_iff_spindle_speed.png][png]], [[./figs/act_damp_variability_iff_spindle_speed.pdf][pdf]])
[[file:figs/act_damp_variability_iff_spindle_speed.png]]
#+begin_src matlab :exports none
@@ -986,8 +1026,8 @@ The identification of the dynamics is done at the same Spindle angle position.
<>
#+end_src
-#+NAME: fig:act_damp_variability_iff_spindle_speed_zoom
-#+CAPTION: Variability of the IFF plant with the Spindle rotation speed ([[./figs/act_damp_variability_iff_spindle_speed_zoom.png][png]], [[./figs/act_damp_variability_iff_spindle_speed_zoom.pdf][pdf]])
+#+name: fig:act_damp_variability_iff_spindle_speed_zoom
+#+caption: Variability of the dynamics from the actuator force to the force sensor with the Spindle rotation speed ([[./figs/act_damp_variability_iff_spindle_speed_zoom.png][png]], [[./figs/act_damp_variability_iff_spindle_speed_zoom.pdf][pdf]])
[[file:figs/act_damp_variability_iff_spindle_speed_zoom.png]]
#+begin_src matlab :exports none
@@ -1028,8 +1068,8 @@ The identification of the dynamics is done at the same Spindle angle position.
<>
#+end_src
-#+NAME: fig:act_damp_variability_dvf_spindle_speed
-#+CAPTION: Variability of the DVF plant with the Spindle rotation speed ([[./figs/act_damp_variability_dvf_spindle_speed.png][png]], [[./figs/act_damp_variability_dvf_spindle_speed.pdf][pdf]])
+#+name: fig:act_damp_variability_dvf_spindle_speed
+#+caption: Variability of the dynamics from the actuator force to the relative motion sensor with the Spindle rotation speed ([[./figs/act_damp_variability_dvf_spindle_speed.png][png]], [[./figs/act_damp_variability_dvf_spindle_speed.pdf][pdf]])
[[file:figs/act_damp_variability_dvf_spindle_speed.png]]
#+begin_src matlab :exports none
@@ -1041,8 +1081,8 @@ The identification of the dynamics is done at the same Spindle angle position.
<>
#+end_src
-#+NAME: fig:act_damp_variability_dvf_spindle_speed_zoom
-#+CAPTION: Variability of the DVF plant with the Spindle rotation speed ([[./figs/act_damp_variability_dvf_spindle_speed_zoom.png][png]], [[./figs/act_damp_variability_dvf_spindle_speed_zoom.pdf][pdf]])
+#+name: fig:act_damp_variability_dvf_spindle_speed_zoom
+#+caption: Variability of the dynamics from the actuator force to the relative motion sensor with the Spindle rotation speed ([[./figs/act_damp_variability_dvf_spindle_speed_zoom.png][png]], [[./figs/act_damp_variability_dvf_spindle_speed_zoom.pdf][pdf]])
[[file:figs/act_damp_variability_dvf_spindle_speed_zoom.png]]
#+begin_src matlab :exports none
@@ -1082,8 +1122,8 @@ The identification of the dynamics is done at the same Spindle angle position.
<>
#+end_src
-#+NAME: fig:act_damp_variability_ine_spindle_speed
-#+CAPTION: Variability of the Inertial plant with the Spindle rotation speed ([[./figs/act_damp_variability_ine_spindle_speed.png][png]], [[./figs/act_damp_variability_ine_spindle_speed.pdf][pdf]])
+#+name: fig:act_damp_variability_ine_spindle_speed
+#+caption: Variability of the dynamics from the actuator force to the absolute velocity sensor with the Spindle rotation speed ([[./figs/act_damp_variability_ine_spindle_speed.png][png]], [[./figs/act_damp_variability_ine_spindle_speed.pdf][pdf]])
[[file:figs/act_damp_variability_ine_spindle_speed.png]]
#+begin_src matlab :exports none
@@ -1095,8 +1135,8 @@ The identification of the dynamics is done at the same Spindle angle position.
<>
#+end_src
-#+NAME: fig:act_damp_variability_ine_spindle_speed_zoom
-#+CAPTION: Variability of the Inertial plant with the Spindle rotation speed ([[./figs/act_damp_variability_ine_spindle_speed_zoom.png][png]], [[./figs/act_damp_variability_ine_spindle_speed_zoom.pdf][pdf]])
+#+name: fig:act_damp_variability_ine_spindle_speed_zoom
+#+caption: Variability of the dynamics from the actuator force to the absolute velocity sensor with the Spindle rotation speed ([[./figs/act_damp_variability_ine_spindle_speed_zoom.png][png]], [[./figs/act_damp_variability_ine_spindle_speed_zoom.pdf][pdf]])
[[file:figs/act_damp_variability_ine_spindle_speed_zoom.png]]
*** Variation of the poles and zeros with the Spindle rotation frequency
@@ -1141,8 +1181,8 @@ The identification of the dynamics is done at the same Spindle angle position.
<>
#+end_src
-#+NAME: fig:campbell_diagram_spindle_rotation
-#+CAPTION: Evolution of the pole with respect to the spindle rotation speed ([[./figs/campbell_diagram_spindle_rotation.png][png]], [[./figs/campbell_diagram_spindle_rotation.pdf][pdf]])
+#+name: fig:campbell_diagram_spindle_rotation
+#+caption: Evolution of the pole with respect to the spindle rotation speed ([[./figs/campbell_diagram_spindle_rotation.png][png]], [[./figs/campbell_diagram_spindle_rotation.pdf][pdf]])
[[file:figs/campbell_diagram_spindle_rotation.png]]
#+begin_src matlab :exports none
@@ -1193,50 +1233,19 @@ The identification of the dynamics is done at the same Spindle angle position.
<>
#+end_src
-#+NAME: fig:variation_zeros_active_damping_plants
-#+CAPTION: Evolution of the zero with respect to the spindle rotation speed ([[./figs/variation_zeros_active_damping_plants.png][png]], [[./figs/variation_zeros_active_damping_plants.pdf][pdf]])
+#+name: fig:variation_zeros_active_damping_plants
+#+caption: Evolution of the zero with respect to the spindle rotation speed ([[./figs/variation_zeros_active_damping_plants.png][png]], [[./figs/variation_zeros_active_damping_plants.pdf][pdf]])
[[file:figs/variation_zeros_active_damping_plants.png]]
** Variation of the Tilt Angle
<>
*** Introduction :ignore:
-*** Initialize the Simulation :noexport:
+*** Identification :ignore:
We initialize all the stages with the default parameters.
#+begin_src matlab
- initializeGround();
- initializeGranite();
- initializeTy();
- initializeRy();
- initializeRz();
- initializeMicroHexapod();
- initializeAxisc();
- initializeMirror();
+ prepareLinearizeIdentification();
#+end_src
-No disturbances.
-#+begin_src matlab
- initializeDisturbances('enable', false);
-#+end_src
-
-The nano-hexapod is a piezoelectric hexapod.
-#+begin_src matlab
- initializeNanoHexapod('actuator', 'piezo');
- initializeSample('mass', 50);
-#+end_src
-
-And all the controllers are set to 0.
-#+begin_src matlab
- K = tf(zeros(6));
- save('./mat/controllers.mat', 'K', '-append');
- K_ine = tf(zeros(6));
- save('./mat/controllers.mat', 'K_ine', '-append');
- K_iff = tf(zeros(6));
- save('./mat/controllers.mat', 'K_iff', '-append');
- K_dvf = tf(zeros(6));
- save('./mat/controllers.mat', 'K_dvf', '-append');
-#+end_src
-
-*** Identification :ignore:
#+begin_src matlab :exports none
%% Options for Linearized
options = linearizeOptions;
@@ -1327,8 +1336,8 @@ We identify the dynamics for the following Tilt stage angles.
<>
#+end_src
-#+NAME: fig:act_damp_variability_iff_tilt_angle
-#+CAPTION: Variability of the IFF plant with the Tilt stage Angle ([[./figs/act_damp_variability_iff_tilt_angle.png][png]], [[./figs/act_damp_variability_iff_tilt_angle.pdf][pdf]])
+#+name: fig:act_damp_variability_iff_tilt_angle
+#+caption: Variability of the dynamics from the actuator force to the force sensor with the Tilt stage Angle ([[./figs/act_damp_variability_iff_tilt_angle.png][png]], [[./figs/act_damp_variability_iff_tilt_angle.pdf][pdf]])
[[file:figs/act_damp_variability_iff_tilt_angle.png]]
#+begin_src matlab :exports none
@@ -1369,8 +1378,8 @@ We identify the dynamics for the following Tilt stage angles.
<>
#+end_src
-#+NAME: fig:act_damp_variability_dvf_tilt_angle
-#+CAPTION: Variability of the DVF plant with the Tilt Angle ([[./figs/act_damp_variability_dvf_tilt_angle.png][png]], [[./figs/act_damp_variability_dvf_tilt_angle.pdf][pdf]])
+#+name: fig:act_damp_variability_dvf_tilt_angle
+#+caption: Variability of the dynamics from the actuator force to the relative motion sensor with the Tilt Angle ([[./figs/act_damp_variability_dvf_tilt_angle.png][png]], [[./figs/act_damp_variability_dvf_tilt_angle.pdf][pdf]])
[[file:figs/act_damp_variability_dvf_tilt_angle.png]]
#+begin_src matlab :exports none
@@ -1410,8 +1419,8 @@ We identify the dynamics for the following Tilt stage angles.
<>
#+end_src
-#+NAME: fig:act_damp_variability_ine_tilt_angle
-#+CAPTION: Variability of the Inertial plant with the Tilt Angle ([[./figs/act_damp_variability_ine_tilt_angle.png][png]], [[./figs/act_damp_variability_ine_tilt_angle.pdf][pdf]])
+#+name: fig:act_damp_variability_ine_tilt_angle
+#+caption: Variability of the dynamics from the actuator force to the absolute velocity sensor with the Tilt Angle ([[./figs/act_damp_variability_ine_tilt_angle.png][png]], [[./figs/act_damp_variability_ine_tilt_angle.pdf][pdf]])
[[file:figs/act_damp_variability_ine_tilt_angle.png]]
** Scans of the Translation Stage
@@ -1419,43 +1428,12 @@ We identify the dynamics for the following Tilt stage angles.
*** Introduction :ignore:
We want here to verify if the dynamics used for Active damping is varying when using the translation stage for scans.
-*** Initialize the Simulation :noexport:
+*** Identification :ignore:
We initialize all the stages with the default parameters.
#+begin_src matlab
- initializeGround();
- initializeGranite();
- initializeTy();
- initializeRy();
- initializeRz();
- initializeMicroHexapod();
- initializeAxisc();
- initializeMirror();
+ prepareLinearizeIdentification();
#+end_src
-No disturbances.
-#+begin_src matlab
- initializeDisturbances('enable', false);
-#+end_src
-
-The nano-hexapod is a piezoelectric hexapod and the mass of the sample is set to 50kg.
-#+begin_src matlab
- initializeNanoHexapod('actuator', 'piezo');
- initializeSample('mass', 50);
-#+end_src
-
-And all the controllers are set to 0.
-#+begin_src matlab
- K = tf(zeros(6));
- save('./mat/controllers.mat', 'K', '-append');
- K_ine = tf(zeros(6));
- save('./mat/controllers.mat', 'K_ine', '-append');
- K_iff = tf(zeros(6));
- save('./mat/controllers.mat', 'K_iff', '-append');
- K_dvf = tf(zeros(6));
- save('./mat/controllers.mat', 'K_dvf', '-append');
-#+end_src
-
-*** Identification :ignore:
#+begin_src matlab :exports none
%% Options for Linearized
options = linearizeOptions;
@@ -1492,8 +1470,8 @@ We initialize the translation stage reference to be a sinus with an amplitude of
<>
#+end_src
-#+NAME: fig:ty_scanning_reference_sinus
-#+CAPTION: Reference path for the translation stage ([[./figs/ty_scanning_reference_sinus.png][png]], [[./figs/ty_scanning_reference_sinus.pdf][pdf]])
+#+name: fig:ty_scanning_reference_sinus
+#+caption: Reference path for the translation stage ([[./figs/ty_scanning_reference_sinus.png][png]], [[./figs/ty_scanning_reference_sinus.pdf][pdf]])
[[file:figs/ty_scanning_reference_sinus.png]]
We identify the dynamics at different positions (times) when scanning with the Translation stage.
@@ -1571,8 +1549,8 @@ We identify the dynamics at different positions (times) when scanning with the T
<>
#+end_src
-#+NAME: fig:act_damp_variability_iff_ty_scans
-#+CAPTION: Variability of the IFF plant at different Ty scan positions ([[./figs/act_damp_variability_iff_ty_scans.png][png]], [[./figs/act_damp_variability_iff_ty_scans.pdf][pdf]])
+#+name: fig:act_damp_variability_iff_ty_scans
+#+caption: Variability of the dynamics from the actuator force to the absolute velocity sensor plant at different Ty scan positions ([[./figs/act_damp_variability_iff_ty_scans.png][png]], [[./figs/act_damp_variability_iff_ty_scans.pdf][pdf]])
[[file:figs/act_damp_variability_iff_ty_scans.png]]
#+begin_src matlab :exports none
@@ -1614,8 +1592,8 @@ We identify the dynamics at different positions (times) when scanning with the T
<>
#+end_src
-#+NAME: fig:act_damp_variability_dvf_ty_scans
-#+CAPTION: Variability of the DVF plant at different Ty scan positions ([[./figs/act_damp_variability_dvf_ty_scans.png][png]], [[./figs/act_damp_variability_dvf_ty_scans.pdf][pdf]])
+#+name: fig:act_damp_variability_dvf_ty_scans
+#+caption: Variability of the dynamics from actuator force to relative displacement sensor at different Ty scan positions ([[./figs/act_damp_variability_dvf_ty_scans.png][png]], [[./figs/act_damp_variability_dvf_ty_scans.pdf][pdf]])
[[file:figs/act_damp_variability_dvf_ty_scans.png]]
#+begin_src matlab :exports none
@@ -1656,8 +1634,8 @@ We identify the dynamics at different positions (times) when scanning with the T
<>
#+end_src
-#+NAME: fig:act_damp_variability_ine_ty_scans
-#+CAPTION: Variability of the Inertial plant at different Ty scan positions ([[./figs/act_damp_variability_ine_ty_scans.png][png]], [[./figs/act_damp_variability_ine_ty_scans.pdf][pdf]])
+#+name: fig:act_damp_variability_ine_ty_scans
+#+caption: Variability of the Inertial plant at different Ty scan positions ([[./figs/act_damp_variability_ine_ty_scans.png][png]], [[./figs/act_damp_variability_ine_ty_scans.pdf][pdf]])
[[file:figs/act_damp_variability_ine_ty_scans.png]]
** Conclusion
@@ -1746,7 +1724,7 @@ Let's load the previously identified undamped plant:
Let's look at the transfer function from actuator forces in the nano-hexapod to the force sensor in the nano-hexapod legs for all 6 pairs of actuator/sensor (figure [[fig:iff_plant]]).
#+begin_src matlab :exports none
- freqs = logspace(0, 3, 1000);
+ freqs = logspace(-2, 3, 1000);
figure;
@@ -1780,8 +1758,8 @@ Let's look at the transfer function from actuator forces in the nano-hexapod to
<>
#+end_src
-#+NAME: fig:iff_plant
-#+CAPTION: Transfer function from forces applied in the legs to force sensor ([[./figs/iff_plant.png][png]], [[./figs/iff_plant.pdf][pdf]])
+#+name: fig:iff_plant
+#+caption: Transfer function from forces applied in the legs to force sensor ([[./figs/iff_plant.png][png]], [[./figs/iff_plant.pdf][pdf]])
[[file:figs/iff_plant.png]]
*** Control Design
@@ -1828,8 +1806,8 @@ The corresponding loop gains are shown in figure [[fig:iff_open_loop]].
<>
#+end_src
-#+NAME: fig:iff_open_loop
-#+CAPTION: Loop Gain for the Integral Force Feedback ([[./figs/iff_open_loop.png][png]], [[./figs/iff_open_loop.pdf][pdf]])
+#+name: fig:iff_open_loop
+#+caption: Loop Gain for the Integral Force Feedback ([[./figs/iff_open_loop.png][png]], [[./figs/iff_open_loop.pdf][pdf]])
[[file:figs/iff_open_loop.png]]
*** Diagonal Controller
@@ -1844,45 +1822,20 @@ We save the controller for further analysis.
save('./active_damping/mat/K_iff.mat', 'K_iff');
#+end_src
-** TODO Identification of the damped plant :noexport:
-*** Initialize the Simulation :noexport:
+** Identification of the damped plant :noexport:
+*** Identification
We initialize all the stages with the default parameters.
#+begin_src matlab
- initializeGround();
- initializeGranite();
- initializeTy();
- initializeRy();
- initializeRz();
- initializeMicroHexapod();
- initializeAxisc();
- initializeMirror();
+ prepareLinearizeIdentification();
#+end_src
-No disturbances.
+We set the IFF controller.
#+begin_src matlab
- initializeDisturbances('enable', false);
-#+end_src
-
-The nano-hexapod is a piezoelectric hexapod.
-#+begin_src matlab
- initializeNanoHexapod('actuator', 'piezo');
- initializeSample('mass', 50);
-#+end_src
-
-And all the controllers are set to 0.
-#+begin_src matlab
- K = tf(zeros(6));
- save('./mat/controllers.mat', 'K', '-append');
- K_ine = tf(zeros(6));
- save('./mat/controllers.mat', 'K_ine', '-append');
load('./active_damping/mat/K_iff.mat', 'K_iff');
save('./mat/controllers.mat', 'K_iff', '-append');
- K_dvf = tf(zeros(6));
- save('./mat/controllers.mat', 'K_dvf', '-append');
#+end_src
-*** Identification
-First, we identify the dynamics of the system using the =linearize= function.
+We identify the dynamics of the system using the =linearize= function.
#+begin_src matlab
%% Options for Linearized
options = linearizeOptions;
@@ -1893,19 +1846,33 @@ First, we identify the dynamics of the system using the =linearize= function.
%% Input/Output definition
clear io; io_i = 1;
- io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1;
+ io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/Compute Error in NASS base'], 2, 'openoutput'); io_i = io_i + 1;
-
- %% Run the linearization
- G = linearize(mdl, io, 0.5, options);
- G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
- G.OutputName = {'Dxn', 'Dyn', 'Dzn', 'Rxn', 'Ryn', 'Rzn'};
#+end_src
+We identify the dynamics for the following sample mass.
#+begin_src matlab
+ load('./active_damping/mat/cart_plants.mat', 'masses');
+#+end_src
+
+#+begin_src matlab :exports none
+ G_cart_iff = {zeros(length(masses))};
+
load('mat/stages.mat', 'nano_hexapod');
- G_cart_iff = G*inv(nano_hexapod.J');
- G_cart_iff.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
+
+ for i = 1:length(masses)
+ initializeSample('mass', masses(i));
+
+ %% Run the linearization
+ G = linearize(mdl, io, 0.3, options);
+ G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
+ G.OutputName = {'Dnx', 'Dny', 'Dnz', 'Rnx', 'Rny', 'Rnz'};
+
+ G_cart = G*inv(nano_hexapod.J');
+ G_cart.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
+
+ G_cart_iff(i) = {G_cart};
+ end
#+end_src
And we save them for further analysis.
@@ -1913,91 +1880,10 @@ And we save them for further analysis.
save('./active_damping/mat/cart_plants.mat', 'G_cart_iff', '-append');
#+end_src
-*** TODO Sensitivity to disturbances
-As shown on figure [[fig:sensitivity_dist_iff]]:
-- The top platform of the nano-hexapod how behaves as a "free-mass".
-- The transfer function from direct forces $F_s$ to the relative displacement $D$ is equivalent to the one of an isolated mass.
-- The transfer function from ground motion $D_g$ to the relative displacement $D$ tends to the transfer function from $D_g$ to the displacement of the granite (the sample is being isolated thanks to IFF).
- However, as the goal is to make the relative displacement $D$ as small as possible (e.g. to make the sample motion follows the granite motion), this is not a good thing.
-
-#+begin_src matlab :exports none
- freqs = logspace(0, 3, 1000);
-
- figure;
-
- subplot(2, 1, 1);
- title('$D_g$ to $D$');
- hold on;
- plot(freqs, abs(squeeze(freqresp(G.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / D_{g,x}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / D_{g,y}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / D_{g,z}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_iff.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_iff.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_iff.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]');
- legend('location', 'northeast');
-
- subplot(2, 1, 2);
- title('$F_s$ to $D$');
- hold on;
- plot(freqs, abs(squeeze(freqresp(G.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{s,x}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / F_{s,y}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{s,z}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_iff.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_iff.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_iff.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
- legend('location', 'northeast');
-#+end_src
-
-#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/sensitivity_dist_iff.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
- <>
-#+end_src
-
-#+NAME: fig:sensitivity_dist_iff
-#+CAPTION: Sensitivity to disturbance once the IFF controller is applied to the system ([[./figs/sensitivity_dist_iff.png][png]], [[./figs/sensitivity_dist_iff.pdf][pdf]])
-[[file:figs/sensitivity_dist_iff.png]]
-
-#+begin_warning
- The order of the models are very high and thus the plots may be wrong.
- For instance, the plots are not the same when using =minreal=.
-#+end_warning
-
-#+begin_src matlab :exports none
- freqs = logspace(0, 3, 1000);
-
- figure;
- hold on;
- plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Frzz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{rz, z}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Ftyz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{ty, z}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_dist('Dx', 'Ftyx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{ty, x}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(minreal(prescale(G_iff.G_dist('Dz', 'Frzz'), {2*pi, 2*pi*1e3})), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(minreal(G_iff.G_dist('Dz', 'Ftyz')), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(minreal(G_iff.G_dist('Dx', 'Ftyx')), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
- legend('location', 'northeast');
-#+end_src
-
-#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/sensitivity_dist_stages_iff.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
- <>
-#+end_src
-
-#+NAME: fig:sensitivity_dist_stages_iff
-#+CAPTION: Sensitivity to force disturbances in various stages when IFF is applied ([[./figs/sensitivity_dist_stages_iff.png][png]], [[./figs/sensitivity_dist_stages_iff.pdf][pdf]])
-[[file:figs/sensitivity_dist_stages_iff.png]]
-
*** Damped Plant
Now, look at the new damped plant to control.
#+begin_src matlab
- load('./active_damping/mat/cart_plants.mat', 'G_cart', 'G_cart_iff');
+ load('./active_damping/mat/cart_plants.mat', 'masses', 'G_cart', 'G_cart_iff');
#+end_src
It damps the plant (resonance of the nano hexapod as well as other resonances) as shown in figure [[fig:plant_iff_damped]].
@@ -2007,75 +1893,100 @@ It damps the plant (resonance of the nano hexapod as well as other resonances) a
figure;
- ax1 = subplot(2, 2, 1);
+ ax1 = subplot(2, 1, 1);
hold on;
- plot(freqs, abs(squeeze(freqresp(G_cart('Dxn', 'Fnx'), freqs, 'Hz'))));
- plot(freqs, abs(squeeze(freqresp(G_cart('Dyn', 'Fny'), freqs, 'Hz'))));
- plot(freqs, abs(squeeze(freqresp(G_cart('Dzn', 'Fnz'), freqs, 'Hz'))));
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_cart_iff('Dxn', 'Fnx'), freqs, 'Hz'))), '--');
- plot(freqs, abs(squeeze(freqresp(G_cart_iff('Dyn', 'Fny'), freqs, 'Hz'))), '--');
- plot(freqs, abs(squeeze(freqresp(G_cart_iff('Dzn', 'Fnz'), freqs, 'Hz'))), '--');
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ p1 = plot(freqs, abs(squeeze(freqresp(G_cart_iff{i}('Dnx', 'Fnx'), freqs, 'Hz'))));
+ set(gca,'ColorOrderIndex',i);
+ p2 = plot(freqs, abs(squeeze(freqresp(G_cart_iff{i}('Dny', 'Fny'), freqs, 'Hz'))), '--');
+ set(gca,'ColorOrderIndex',i);
+ p3 = plot(freqs, abs(squeeze(freqresp(G_cart_iff{i}('Dnz', 'Fnz'), freqs, 'Hz'))), ':');
+ end
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
+ legend([p1,p2,p3], {'Fx/Dx', 'Fy/Dx', 'Fz/Dz'});
- ax2 = subplot(2, 2, 2);
+ ax2 = subplot(2, 1, 2);
hold on;
- plot(freqs, abs(squeeze(freqresp(G_cart('Rxn', 'Mnx'), freqs, 'Hz'))));
- plot(freqs, abs(squeeze(freqresp(G_cart('Ryn', 'Mny'), freqs, 'Hz'))));
- plot(freqs, abs(squeeze(freqresp(G_cart('Rzn', 'Mnz'), freqs, 'Hz'))));
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_cart_iff('Rxn', 'Mnx'), freqs, 'Hz'))), '--');
- plot(freqs, abs(squeeze(freqresp(G_cart_iff('Ryn', 'Mny'), freqs, 'Hz'))), '--');
- plot(freqs, abs(squeeze(freqresp(G_cart_iff('Rzn', 'Mnz'), freqs, 'Hz'))), '--');
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [rad/(Nm)]'); xlabel('Frequency [Hz]');
-
- ax3 = subplot(2, 2, 3);
- hold on;
- plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart('Dxn', 'Fnx'), freqs, 'Hz')))), 'DisplayName', '$\left|D_x / F_{n,x}\right|$');
- plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart('Dyn', 'Fny'), freqs, 'Hz')))), 'DisplayName', '$\left|D_y / F_{n,y}\right|$');
- plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart('Dzn', 'Fnz'), freqs, 'Hz')))), 'DisplayName', '$\left|D_z / F_{n,z}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_iff('Dxn', 'Fnx'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
- plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_iff('Dyn', 'Fny'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
- plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_iff('Dzn', 'Fnz'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_iff{i}('Dnx', 'Fnx'), freqs, 'Hz')))), ...
+ 'DisplayName', sprintf('$M = %.0f$ [kg]', masses(i)));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_iff{i}('Dny', 'Fny'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_iff{i}('Dnz', 'Fnz'), freqs, 'Hz')))), ':', 'HandleVisibility', 'off');
+ end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
yticks([-540:180:540]);
- legend('location', 'southwest');
+ legend('location', 'northeast');
- ax4 = subplot(2, 2, 4);
- hold on;
- plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart('Rxn', 'Mnx'), freqs, 'Hz')))), 'DisplayName', '$\left|R_x / M_{n,x}\right|$');
- plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart('Ryn', 'Mny'), freqs, 'Hz')))), 'DisplayName', '$\left|R_y / M_{n,y}\right|$');
- plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart('Rzn', 'Mnz'), freqs, 'Hz')))), 'DisplayName', '$\left|R_z / M_{n,z}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_iff('Rxn', 'Mnx'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
- plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_iff('Ryn', 'Mny'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
- plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_iff('Rzn', 'Mnz'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
- hold off;
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
- ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
- yticks([-540:180:540]);
- legend('location', 'southwest');
-
- linkaxes([ax1,ax2,ax3,ax4],'x');
+ linkaxes([ax1,ax2],'x');
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/plant_iff_damped.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
+#+begin_src matlab :var filepath="figs/plant_iff_damped_translations.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<>
#+end_src
-#+NAME: fig:plant_iff_damped
-#+CAPTION: Damped Plant after IFF is applied ([[./figs/plant_iff_damped.png][png]], [[./figs/plant_iff_damped.pdf][pdf]])
-[[file:figs/plant_iff_damped.png]]
+#+name: fig:plant_iff_damped_translations
+#+caption: Damped Plant for the translations after IFF is applied ([[./figs/plant_iff_damped_translations.png][png]], [[./figs/plant_iff_damped_translations.pdf][pdf]])
+[[file:figs/plant_iff_damped_translations.png]]
+
+#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
+ figure;
+
+ ax1 = subplot(2, 1, 1);
+ hold on;
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ p1 = plot(freqs, abs(squeeze(freqresp(G_cart_iff{i}('Rnx', 'Mnx'), freqs, 'Hz'))));
+ set(gca,'ColorOrderIndex',i);
+ p2 = plot(freqs, abs(squeeze(freqresp(G_cart_iff{i}('Rny', 'Mny'), freqs, 'Hz'))), '--');
+ set(gca,'ColorOrderIndex',i);
+ p3 = plot(freqs, abs(squeeze(freqresp(G_cart_iff{i}('Rnz', 'Mnz'), freqs, 'Hz'))), ':');
+ end
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
+ legend([p1,p2,p3], {'Fx/Dx', 'Fy/Dx', 'Fz/Dz'});
+
+ ax2 = subplot(2, 1, 2);
+ hold on;
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_iff{i}('Rnx', 'Mnx'), freqs, 'Hz')))), ...
+ 'DisplayName', sprintf('$M = %.0f$ [kg]', masses(i)));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_iff{i}('Rny', 'Mny'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_iff{i}('Rnz', 'Mnz'), freqs, 'Hz')))), ':', 'HandleVisibility', 'off');
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ yticks([-540:180:540]);
+ legend('location', 'northeast');
+
+ linkaxes([ax1,ax2],'x');
+#+end_src
+
+#+HEADER: :tangle no :exports results :results none :noweb yes
+#+begin_src matlab :var filepath="figs/plant_iff_damped_rotations.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
+ <>
+#+end_src
+
+#+name: fig:plant_iff_damped_rotations
+#+caption: Damped Plant for the Rotations after IFF is applied ([[./figs/plant_iff_damped_rotations.png][png]], [[./figs/plant_iff_damped_rotations.pdf][pdf]])
+[[file:figs/plant_iff_damped_rotations.png]]
However, it increases coupling at low frequency (figure [[fig:plant_iff_coupling]]).
#+begin_src matlab :exports none
- freqs = logspace(0, 3, 1000);
+ freqs = logspace(1, 3, 1000);
figure;
@@ -2083,8 +1994,8 @@ However, it increases coupling at low frequency (figure [[fig:plant_iff_coupling
for iy = 1:6
subplot(6, 6, (ix-1)*6 + iy);
hold on;
- plot(freqs, abs(squeeze(freqresp(G_cart(ix, iy), freqs, 'Hz'))), 'k-');
- plot(freqs, abs(squeeze(freqresp(G_cart_iff(ix, iy), freqs, 'Hz'))), 'k--');
+ plot(freqs, abs(squeeze(freqresp(G_cart{1}(ix, iy), freqs, 'Hz'))), 'k-');
+ plot(freqs, abs(squeeze(freqresp(G_cart_iff{1}(ix, iy), freqs, 'Hz'))), 'k--');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylim([1e-13, 1e-4]);
xticks([])
@@ -2098,8 +2009,8 @@ However, it increases coupling at low frequency (figure [[fig:plant_iff_coupling
<>
#+end_src
-#+NAME: fig:plant_iff_coupling
-#+CAPTION: Coupling induced by IFF ([[./figs/plant_iff_coupling.png][png]], [[./figs/plant_iff_coupling.pdf][pdf]])
+#+name: fig:plant_iff_coupling
+#+caption: Coupling induced by IFF ([[./figs/plant_iff_coupling.png][png]], [[./figs/plant_iff_coupling.pdf][pdf]])
[[file:figs/plant_iff_coupling.png]]
** Tomography Experiment
@@ -2118,7 +2029,7 @@ We set the IFF controller.
We change the simulation stop time.
#+begin_src matlab
load('mat/conf_simscape.mat');
- set_param(conf_simscape, 'StopTime', '3');
+ set_param(conf_simscape, 'StopTime', '4.5');
#+end_src
And we simulate the system.
@@ -2133,41 +2044,11 @@ Finally, we save the simulation results for further analysis
save('./active_damping/mat/tomo_exp.mat', 'En_iff', 'Eg_iff', '-append');
#+end_src
-*** Simulation with IFF Controller with added High Pass Filter
-We initialize elements for the tomography experiment.
-#+begin_src matlab
- prepareTomographyExperiment();
-#+end_src
-
-We set the IFF controller with the High Pass Filter.
-#+begin_src matlab
- load('./active_damping/mat/K_iff_hpf.mat', 'K_iff');
- save('./mat/controllers.mat', 'K_iff', '-append');
-#+end_src
-
-We change the simulation stop time.
-#+begin_src matlab
- load('mat/conf_simscape.mat');
- set_param(conf_simscape, 'StopTime', '3');
-#+end_src
-
-And we simulate the system.
-#+begin_src matlab
- sim('sim_nass_active_damping');
-#+end_src
-
-Finally, we save the simulation results for further analysis
-#+begin_src matlab
- En_iff_hpf = En;
- Eg_iff_hpf = Eg;
- save('./active_damping/mat/tomo_exp.mat', 'En_iff_hpf', 'Eg_iff_hpf', '-append');
-#+end_src
-
*** Compare with Undamped system
-We load the results of tomography experiments.
-#+begin_src matlab
- load('./active_damping/mat/tomo_exp.mat', 'En', 'En_iff', 'En_iff_hpf');
- t = linspace(0, 3, length(En(:,1)));
+#+begin_src matlab :exports none
+ load('./active_damping/mat/tomo_exp.mat', 'En', 'En_iff');
+ Fs = 1e3; % Sampling Frequency of the Data
+ t = (1/Fs)*[0:length(En(:,1))-1];
#+end_src
#+begin_src matlab :exports none
@@ -2175,7 +2056,6 @@ We load the results of tomography experiments.
hold on;
plot(En(:,1), En(:,2), 'DisplayName', '$\epsilon_{x,y}$ - OL')
plot(En_iff(:,1), En_iff(:,2), 'DisplayName', '$\epsilon_{x,y}$ - IFF')
- plot(En_iff_hpf(:,1), En_iff_hpf(:,2), 'DisplayName', '$\epsilon_{x,y}$ - IFF + HPF')
xlabel('X Motion [m]'); ylabel('Y Motion [m]');
legend('location', 'northwest');
#+end_src
@@ -2185,8 +2065,8 @@ We load the results of tomography experiments.
<>
#+end_src
-#+NAME: fig:nass_act_damp_iff_sim_tomo_xy
-#+CAPTION: Position Error during tomography experiment - XY Motion ([[./figs/nass_act_damp_iff_sim_tomo_xy.png][png]], [[./figs/nass_act_damp_iff_sim_tomo_xy.pdf][pdf]])
+#+name: fig:nass_act_damp_iff_sim_tomo_xy
+#+caption: Position Error during tomography experiment - XY Motion ([[./figs/nass_act_damp_iff_sim_tomo_xy.png][png]], [[./figs/nass_act_damp_iff_sim_tomo_xy.pdf][pdf]])
[[file:figs/nass_act_damp_iff_sim_tomo_xy.png]]
#+begin_src matlab :exports none
@@ -2195,14 +2075,12 @@ We load the results of tomography experiments.
hold on;
plot(t, En(:,1), 'DisplayName', '$\epsilon_{x}$')
plot(t, En_iff(:,1), 'DisplayName', '$\epsilon_{x}$ - IFF')
- plot(t, En_iff_hpf(:,1), 'DisplayName', '$\epsilon_{x}$ - IFF + HPF')
legend('location', 'southwest');
ax2 = subplot(3, 1, 2);
hold on;
plot(t, En(:,2), 'DisplayName', '$\epsilon_{y}$')
plot(t, En_iff(:,2), 'DisplayName', '$\epsilon_{y}$ - IFF')
- plot(t, En_iff_hpf(:,2), 'DisplayName', '$\epsilon_{y}$ - IFF + HPF')
legend('location', 'southwest');
ylabel('Position Error [m]');
@@ -2210,9 +2088,11 @@ We load the results of tomography experiments.
hold on;
plot(t, En(:,3), 'DisplayName', '$\epsilon_{z}$')
plot(t, En_iff(:,3), 'DisplayName', '$\epsilon_{z}$ - IFF')
- plot(t, En_iff_hpf(:,3), 'DisplayName', '$\epsilon_{z}$ - IFF + HPF')
legend('location', 'northwest');
xlabel('Time [s]');
+
+ linkaxes([ax1,ax2,ax3],'x');
+ xlim([0.5,inf]);
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
@@ -2220,8 +2100,8 @@ We load the results of tomography experiments.
<>
#+end_src
-#+NAME: fig:nass_act_damp_iff_sim_tomo_trans
-#+CAPTION: Position Error during tomography experiment - Translations ([[./figs/nass_act_damp_iff_sim_tomo_trans.png][png]], [[./figs/nass_act_damp_iff_sim_tomo_trans.pdf][pdf]])
+#+name: fig:nass_act_damp_iff_sim_tomo_trans
+#+caption: Position Error during tomography experiment - Translations ([[./figs/nass_act_damp_iff_sim_tomo_trans.png][png]], [[./figs/nass_act_damp_iff_sim_tomo_trans.pdf][pdf]])
[[file:figs/nass_act_damp_iff_sim_tomo_trans.png]]
#+begin_src matlab :exports none
@@ -2230,14 +2110,12 @@ We load the results of tomography experiments.
hold on;
plot(t, En(:,4), 'DisplayName', '$\epsilon_{\theta_x}$')
plot(t, En_iff(:,4), 'DisplayName', '$\epsilon_{\theta_x}$ - IFF')
- plot(t, En_iff_hpf(:,4), 'DisplayName', '$\epsilon_{\theta_x}$ - IFF + HPF')
legend('location', 'northwest');
ax2 = subplot(3, 1, 2);
hold on;
plot(t, En(:,5), 'DisplayName', '$\epsilon_{\theta_y}$')
plot(t, En_iff(:,5), 'DisplayName', '$\epsilon_{\theta_y}$ - IFF')
- plot(t, En_iff_hpf(:,5), 'DisplayName', '$\epsilon_{\theta_y}$ - IFF + HPF')
legend('location', 'southwest');
ylabel('Position Error [rad]');
@@ -2245,11 +2123,11 @@ We load the results of tomography experiments.
hold on;
plot(t, En(:,6), 'DisplayName', '$\epsilon_{\theta_z}$')
plot(t, En_iff(:,6), 'DisplayName', '$\epsilon_{\theta_z}$ - IFF')
- plot(t, En_iff_hpf(:,6), 'DisplayName', '$\epsilon_{\theta_z}$ - IFF + HPF')
legend();
xlabel('Time [s]');
linkaxes([ax1,ax2,ax3],'x');
+ xlim([0.5,inf]);
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
@@ -2257,13 +2135,13 @@ We load the results of tomography experiments.
<>
#+end_src
-#+NAME: fig:nass_act_damp_iff_sim_tomo_rot
-#+CAPTION: Position Error during tomography experiment - Rotations ([[./figs/nass_act_damp_iff_sim_tomo_rot.png][png]], [[./figs/nass_act_damp_iff_sim_tomo_rot.pdf][pdf]])
+#+name: fig:nass_act_damp_iff_sim_tomo_rot
+#+caption: Position Error during tomography experiment - Rotations ([[./figs/nass_act_damp_iff_sim_tomo_rot.png][png]], [[./figs/nass_act_damp_iff_sim_tomo_rot.pdf][pdf]])
[[file:figs/nass_act_damp_iff_sim_tomo_rot.png]]
** Conclusion
#+begin_important
-Integral Force Feedback:
+Integral Force Feedback using a force sensor:
- Robust (guaranteed stability)
- Acceptable Damping
- Increase the sensitivity to disturbances at low frequencies
@@ -2321,6 +2199,7 @@ The actuator displacement can be measured with a capacitive sensor for instance.
Let's load the undamped plant:
#+begin_src matlab
load('./active_damping/mat/undamped_plants.mat', 'G_dvf');
+ load('./active_damping/mat/plants_variable.mat', 'masses', 'Gm_dvf');
#+end_src
Let's look at the transfer function from actuator forces in the nano-hexapod to the measured displacement of the actuator for all 6 pairs of actuator/sensor (figure [[fig:dvf_plant]]).
@@ -2332,8 +2211,8 @@ Let's look at the transfer function from actuator forces in the nano-hexapod to
ax1 = subplot(2, 1, 1);
hold on;
- for i=1:6
- plot(freqs, abs(squeeze(freqresp(G_dvf(['Dnlm', num2str(i)], ['Fnl', num2str(i)]), freqs, 'Hz'))));
+ for i=1:length(masses)
+ plot(freqs, abs(squeeze(freqresp(-Gm_dvf{i}('Dnlm1', 'Fnl1'), freqs, 'Hz'))));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
@@ -2341,14 +2220,16 @@ Let's look at the transfer function from actuator forces in the nano-hexapod to
ax2 = subplot(2, 1, 2);
hold on;
- for i=1:6
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf(['Dnlm', num2str(i)], ['Fnl', num2str(i)]), freqs, 'Hz'))));
+ for i=1:length(masses)
+ plot(freqs, 180/pi*angle(squeeze(freqresp(-Gm_dvf{i}('Dnlm1', 'Fnl1'), freqs, 'Hz'))), ...
+ 'DisplayName', sprintf('$M = %.0f$ [kg]', masses(i)));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
+ legend('location', 'southwest');
linkaxes([ax1,ax2],'x');
#+end_src
@@ -2358,15 +2239,15 @@ Let's look at the transfer function from actuator forces in the nano-hexapod to
<>
#+end_src
-#+NAME: fig:dvf_plant
-#+CAPTION: Transfer function from forces applied in the legs to leg displacement sensor ([[./figs/dvf_plant.png][png]], [[./figs/dvf_plant.pdf][pdf]])
+#+name: fig:dvf_plant
+#+caption: Transfer function from forces applied in the legs to leg displacement sensor ([[./figs/dvf_plant.png][png]], [[./figs/dvf_plant.pdf][pdf]])
[[file:figs/dvf_plant.png]]
*** Control Design
The Direct Velocity Feedback is defined below.
A Low pass Filter is added to make the controller transfer function proper.
#+begin_src matlab
- K_dvf = s*20000/(1 + s/2/pi/10000);
+ K_dvf = s*30000/(1 + s/2/pi/10000);
#+end_src
The obtained loop gains are shown in figure [[fig:dvf_open_loop]].
@@ -2378,23 +2259,25 @@ The obtained loop gains are shown in figure [[fig:dvf_open_loop]].
ax1 = subplot(2, 1, 1);
hold on;
- for i=1:6
- plot(freqs, abs(squeeze(freqresp(K_dvf*G_dvf(['Dnlm', num2str(i)], ['Fnl', num2str(i)]), freqs, 'Hz'))));
+ for i=1:length(masses)
+ plot(freqs, abs(squeeze(freqresp(K_dvf*Gm_dvf{i}('Dnlm1', 'Fnl1'), freqs, 'Hz'))));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
+ ylabel('Loop Gain'); set(gca, 'XTickLabel',[]);
ax2 = subplot(2, 1, 2);
hold on;
- for i=1:6
- plot(freqs, 180/pi*angle(squeeze(freqresp(K_dvf*G_dvf(['Dnlm', num2str(i)], ['Fnl', num2str(i)]), freqs, 'Hz'))));
+ for i=1:length(masses)
+ plot(freqs, 180/pi*angle(squeeze(freqresp(K_dvf*Gm_dvf{i}('Dnlm1', 'Fnl1'), freqs, 'Hz'))), ...
+ 'DisplayName', sprintf('$M = %.0f$ [kg]', masses(i)));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
+ legend('location', 'southwest');
linkaxes([ax1,ax2],'x');
#+end_src
@@ -2404,8 +2287,8 @@ The obtained loop gains are shown in figure [[fig:dvf_open_loop]].
<>
#+end_src
-#+NAME: fig:dvf_open_loop
-#+CAPTION: Loop Gain for the Integral Force Feedback ([[./figs/dvf_open_loop.png][png]], [[./figs/dvf_open_loop.pdf][pdf]])
+#+name: fig:dvf_open_loop
+#+caption: Loop Gain for the Integral Force Feedback ([[./figs/dvf_open_loop.png][png]], [[./figs/dvf_open_loop.pdf][pdf]])
[[file:figs/dvf_open_loop.png]]
*** Diagonal Controller
@@ -2419,37 +2302,20 @@ We save the controller for further analysis.
save('./active_damping/mat/K_dvf.mat', 'K_dvf');
#+end_src
-** TODO Identification of the damped plant :noexport:
-*** Initialize the Simulation
-Let's initialize the system prior to identification.
+** Identification of the damped plant :noexport:
+*** Identification
+We initialize all the stages with the default parameters.
#+begin_src matlab
- initializeReferences();
- initializeGround();
- initializeGranite();
- initializeTy();
- initializeRy();
- initializeRz();
- initializeMicroHexapod();
- initializeAxisc();
- initializeMirror();
- initializeNanoHexapod('actuator', 'piezo');
- initializeSample('mass', 50);
+ prepareLinearizeIdentification();
#+end_src
-And initialize the controllers.
+We set the DVF controller.
#+begin_src matlab
- K = tf(zeros(6));
- K_ine = tf(zeros(6));
- save('./mat/controllers.mat', 'K_ine', '-append');
- save('./mat/controllers.mat', 'K', '-append');
- K_iff = tf(zeros(6));
- save('./mat/controllers.mat', 'K_iff', '-append');
- K_dvf = K_dvf;
+ load('./active_damping/mat/K_dvf.mat', 'K_dvf');
save('./mat/controllers.mat', 'K_dvf', '-append');
#+end_src
-*** Identification
-We identify the system dynamics now that the DVF controller is ON.
+We identify the dynamics of the system using the =linearize= function.
#+begin_src matlab
%% Options for Linearized
options = linearizeOptions;
@@ -2460,167 +2326,172 @@ We identify the system dynamics now that the DVF controller is ON.
%% Input/Output definition
clear io; io_i = 1;
- io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1;
- io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1;
- io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1;
-
- %% Run the linearization
- G = linearize(mdl, io, options);
- G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
- G.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6', ...
- 'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'};
+ io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1;
+ io(io_i) = linio([mdl, '/Compute Error in NASS base'], 2, 'openoutput'); io_i = io_i + 1;
#+end_src
-And we save the damped plant for further analysis.
+We identify the dynamics for the following sample mass.
#+begin_src matlab
- save('./active_damping/mat/plants.mat', 'G_dvf', '-append');
+ load('./active_damping/mat/cart_plants.mat', 'masses');
#+end_src
-*** Sensitivity to disturbances
-As shown in figure [[fig:sensitivity_dist_dvf]], DVF control succeed in lowering the sensitivity to disturbances near resonance of the system.
-
#+begin_src matlab :exports none
- freqs = logspace(0, 3, 1000);
+ G_cart_dvf = {zeros(length(masses))};
- figure;
+ load('mat/stages.mat', 'nano_hexapod');
- subplot(2, 1, 1);
- title('$D_g$ to $D$');
- hold on;
- plot(freqs, abs(squeeze(freqresp(G.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / D_{g,x}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / D_{g,y}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / D_{g,z}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]');
- legend('location', 'southeast');
+ for i = 1:length(masses)
+ initializeSample('mass', masses(i));
- subplot(2, 1, 2);
- title('$F_s$ to $D$');
- hold on;
- plot(freqs, abs(squeeze(freqresp(G.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{s,x}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / F_{s,y}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{s,z}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
- legend('location', 'northeast');
+ %% Run the linearization
+ G = linearize(mdl, io, 0.3, options);
+ G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
+ G.OutputName = {'Dnx', 'Dny', 'Dnz', 'Rnx', 'Rny', 'Rnz'};
+
+ G_cart = G*inv(nano_hexapod.J');
+ G_cart.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
+
+ G_cart_dvf(i) = {G_cart};
+ end
#+end_src
-#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/sensitivity_dist_dvf.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
- <>
+And we save them for further analysis.
+#+begin_src matlab
+ save('./active_damping/mat/cart_plants.mat', 'G_cart_dvf', '-append');
#+end_src
-#+NAME: fig:sensitivity_dist_dvf
-#+CAPTION: Sensitivity to disturbance once the DVF controller is applied to the system ([[./figs/sensitivity_dist_dvf.png][png]], [[./figs/sensitivity_dist_dvf.pdf][pdf]])
-[[file:figs/sensitivity_dist_dvf.png]]
-
-#+begin_src matlab :exports none
- freqs = logspace(0, 3, 1000);
-
- figure;
- hold on;
- plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Frzz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{rz, z}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Ftyz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{ty, z}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_dist('Dx', 'Ftyx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{ty, x}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_dist('Dz', 'Frzz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_dist('Dz', 'Ftyz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_dist('Dx', 'Ftyx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
- legend('location', 'northeast');
-#+end_src
-
-#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/sensitivity_dist_stages_dvf.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
- <>
-#+end_src
-
-#+NAME: fig:sensitivity_dist_stages_dvf
-#+CAPTION: Sensitivity to force disturbances in various stages when DVF is applied ([[./figs/sensitivity_dist_stages_dvf.png][png]], [[./figs/sensitivity_dist_stages_dvf.pdf][pdf]])
-[[file:figs/sensitivity_dist_stages_dvf.png]]
-
*** Damped Plant
+Now, look at the new damped plant to control.
+#+begin_src matlab
+ load('./active_damping/mat/cart_plants.mat', 'masses', 'G_cart', 'G_cart_dvf');
+#+end_src
+
+It damps the plant (resonance of the nano hexapod as well as other resonances) as shown in figure [[fig:plant_dvf_damped]].
+
#+begin_src matlab :exports none
freqs = logspace(0, 3, 1000);
figure;
- ax1 = subplot(2, 2, 1);
+ ax1 = subplot(2, 1, 1);
hold on;
- plot(freqs, abs(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz'))));
- plot(freqs, abs(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz'))));
- plot(freqs, abs(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz'))));
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), '--');
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_cart('Dy', 'Fny'), freqs, 'Hz'))), '--');
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), '--');
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ p1 = plot(freqs, abs(squeeze(freqresp(G_cart_dvf{i}('Dnx', 'Fnx'), freqs, 'Hz'))));
+ set(gca,'ColorOrderIndex',i);
+ p2 = plot(freqs, abs(squeeze(freqresp(G_cart_dvf{i}('Dny', 'Fny'), freqs, 'Hz'))), '--');
+ set(gca,'ColorOrderIndex',i);
+ p3 = plot(freqs, abs(squeeze(freqresp(G_cart_dvf{i}('Dnz', 'Fnz'), freqs, 'Hz'))), ':');
+ end
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
+ legend([p1,p2,p3], {'Fx/Dx', 'Fy/Dx', 'Fz/Dz'});
- ax2 = subplot(2, 2, 2);
+ ax2 = subplot(2, 1, 2);
hold on;
- plot(freqs, abs(squeeze(freqresp(G.G_cart('Rx', 'Mnx'), freqs, 'Hz'))));
- plot(freqs, abs(squeeze(freqresp(G.G_cart('Ry', 'Mny'), freqs, 'Hz'))));
- plot(freqs, abs(squeeze(freqresp(G.G_cart('Rz', 'Mnz'), freqs, 'Hz'))));
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), '--');
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_cart('Ry', 'Mny'), freqs, 'Hz'))), '--');
- plot(freqs, abs(squeeze(freqresp(G_dvf.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), '--');
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [rad/(Nm)]'); xlabel('Frequency [Hz]');
-
- ax3 = subplot(2, 2, 3);
- hold on;
- plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{n,x}\right|$');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / F_{n,y}\right|$');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{n,z}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf.G_cart('Dy', 'Fny'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_dvf{i}('Dnx', 'Fnx'), freqs, 'Hz')))), ...
+ 'DisplayName', sprintf('$M = %.0f$ [kg]', masses(i)));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_dvf{i}('Dny', 'Fny'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_dvf{i}('Dnz', 'Fnz'), freqs, 'Hz')))), ':', 'HandleVisibility', 'off');
+ end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
- ylim([-180, 180]);
- yticks([-180, -90, 0, 90, 180]);
- legend('location', 'northwest');
+ yticks([-540:180:540]);
+ legend('location', 'northeast');
- ax4 = subplot(2, 2, 4);
- hold on;
- plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), 'DisplayName', '$\left|R_x / M_{n,x}\right|$');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Ry', 'Mny'), freqs, 'Hz'))), 'DisplayName', '$\left|R_y / M_{n,y}\right|$');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), 'DisplayName', '$\left|R_z / M_{n,z}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf.G_cart('Ry', 'Mny'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- hold off;
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
- ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
- ylim([-180, 180]);
- yticks([-180, -90, 0, 90, 180]);
- legend('location', 'northwest');
-
- linkaxes([ax1,ax2,ax3,ax4],'x');
+ linkaxes([ax1,ax2],'x');
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/plant_dvf_damped.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
+#+begin_src matlab :var filepath="figs/plant_dvf_damped_translations.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<>
#+end_src
-#+NAME: fig:plant_dvf_damped
-#+CAPTION: Damped Plant after DVF is applied ([[./figs/plant_dvf_damped.png][png]], [[./figs/plant_dvf_damped.pdf][pdf]])
-[[file:figs/plant_dvf_damped.png]]
+#+name: fig:plant_dvf_damped_translations
+#+caption: Damped Plant for the translations after DVF is applied ([[./figs/plant_dvf_damped_translations.png][png]], [[./figs/plant_dvf_damped_translations.pdf][pdf]])
+[[file:figs/plant_dvf_damped_translations.png]]
+
+#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
+ figure;
+
+ ax1 = subplot(2, 1, 1);
+ hold on;
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ p1 = plot(freqs, abs(squeeze(freqresp(G_cart_dvf{i}('Rnx', 'Mnx'), freqs, 'Hz'))));
+ set(gca,'ColorOrderIndex',i);
+ p2 = plot(freqs, abs(squeeze(freqresp(G_cart_dvf{i}('Rny', 'Mny'), freqs, 'Hz'))), '--');
+ set(gca,'ColorOrderIndex',i);
+ p3 = plot(freqs, abs(squeeze(freqresp(G_cart_dvf{i}('Rnz', 'Mnz'), freqs, 'Hz'))), ':');
+ end
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
+ legend([p1,p2,p3], {'Fx/Dx', 'Fy/Dx', 'Fz/Dz'});
+
+ ax2 = subplot(2, 1, 2);
+ hold on;
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_dvf{i}('Rnx', 'Mnx'), freqs, 'Hz')))), ...
+ 'DisplayName', sprintf('$M = %.0f$ [kg]', masses(i)));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_dvf{i}('Rny', 'Mny'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_dvf{i}('Rnz', 'Mnz'), freqs, 'Hz')))), ':', 'HandleVisibility', 'off');
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ yticks([-540:180:540]);
+ legend('location', 'northeast');
+
+ linkaxes([ax1,ax2],'x');
+#+end_src
+
+#+HEADER: :tangle no :exports results :results none :noweb yes
+#+begin_src matlab :var filepath="figs/plant_dvf_damped_rotations.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
+ <>
+#+end_src
+
+#+name: fig:plant_dvf_damped_rotations
+#+caption: Damped Plant for the Rotations after DVF is applied ([[./figs/plant_dvf_damped_rotations.png][png]], [[./figs/plant_dvf_damped_rotations.pdf][pdf]])
+[[file:figs/plant_dvf_damped_rotations.png]]
+
+However, it does not change the 6x6 plant away from the resonances (figure [[fig:plant_dvf_coupling]]).
+#+begin_src matlab :exports none
+ freqs = logspace(1, 3, 1000);
+
+ figure;
+
+ for ix = 1:6
+ for iy = 1:6
+ subplot(6, 6, (ix-1)*6 + iy);
+ hold on;
+ plot(freqs, abs(squeeze(freqresp(G_cart{1}(ix, iy), freqs, 'Hz'))), 'k-');
+ plot(freqs, abs(squeeze(freqresp(G_cart_dvf{1}(ix, iy), freqs, 'Hz'))), 'k--');
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylim([1e-13, 1e-4]);
+ xticks([])
+ yticks([])
+ end
+ end
+#+end_src
+
+#+HEADER: :tangle no :exports results :results none :noweb yes
+#+begin_src matlab :var filepath="figs/plant_dvf_coupling.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
+ <>
+#+end_src
+
+#+name: fig:plant_dvf_coupling
+#+caption: Coupling induced by DVF actuative damping technique ([[./figs/plant_dvf_coupling.png][png]], [[./figs/plant_dvf_coupling.pdf][pdf]])
+[[file:figs/plant_dvf_coupling.png]]
** Tomography Experiment
*** Initialize the Simulation
@@ -2635,11 +2506,10 @@ We set the DVF controller.
save('./mat/controllers.mat', 'K_dvf', '-append');
#+end_src
-*** Simulation
We change the simulation stop time.
#+begin_src matlab
load('mat/conf_simscape.mat');
- set_param(conf_simscape, 'StopTime', '3');
+ set_param(conf_simscape, 'StopTime', '4.5');
#+end_src
And we simulate the system.
@@ -2655,10 +2525,10 @@ Finally, we save the simulation results for further analysis
#+end_src
*** Compare with Undamped system
-We load the results of tomography experiments.
-#+begin_src matlab
+#+begin_src matlab :exports none
load('./active_damping/mat/tomo_exp.mat', 'En', 'En_dvf');
- t = linspace(0, 3, length(En(:,1)));
+ Fs = 1e3; % Sampling Frequency of the Data
+ t = (1/Fs)*[0:length(En(:,1))-1];
#+end_src
#+begin_src matlab :exports none
@@ -2675,8 +2545,8 @@ We load the results of tomography experiments.
<>
#+end_src
-#+NAME: fig:nass_act_damp_dvf_sim_tomo_xy
-#+CAPTION: Position Error during tomography experiment - XY Motion ([[./figs/nass_act_damp_dvf_sim_tomo_xy.png][png]], [[./figs/nass_act_damp_dvf_sim_tomo_xy.pdf][pdf]])
+#+name: fig:nass_act_damp_dvf_sim_tomo_xy
+#+caption: Position Error during tomography experiment - XY Motion ([[./figs/nass_act_damp_dvf_sim_tomo_xy.png][png]], [[./figs/nass_act_damp_dvf_sim_tomo_xy.pdf][pdf]])
[[file:figs/nass_act_damp_dvf_sim_tomo_xy.png]]
#+begin_src matlab :exports none
@@ -2700,6 +2570,9 @@ We load the results of tomography experiments.
plot(t, En_dvf(:,3), 'DisplayName', '$\epsilon_{z}$ - DVF')
legend();
xlabel('Time [s]');
+
+ linkaxes([ax1,ax2,ax3],'x');
+ xlim([0.5,inf]);
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
@@ -2707,8 +2580,8 @@ We load the results of tomography experiments.
<>
#+end_src
-#+NAME: fig:nass_act_damp_dvf_sim_tomo_trans
-#+CAPTION: Position Error during tomography experiment - Translations ([[./figs/nass_act_damp_dvf_sim_tomo_trans.png][png]], [[./figs/nass_act_damp_dvf_sim_tomo_trans.pdf][pdf]])
+#+name: fig:nass_act_damp_dvf_sim_tomo_trans
+#+caption: Position Error during tomography experiment - Translations ([[./figs/nass_act_damp_dvf_sim_tomo_trans.png][png]], [[./figs/nass_act_damp_dvf_sim_tomo_trans.pdf][pdf]])
[[file:figs/nass_act_damp_dvf_sim_tomo_trans.png]]
#+begin_src matlab :exports none
@@ -2734,6 +2607,7 @@ We load the results of tomography experiments.
xlabel('Time [s]');
linkaxes([ax1,ax2,ax3],'x');
+ xlim([0.5,inf]);
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
@@ -2741,14 +2615,14 @@ We load the results of tomography experiments.
<>
#+end_src
-#+NAME: fig:nass_act_damp_dvf_sim_tomo_rot
-#+CAPTION: Position Error during tomography experiment - Rotations ([[./figs/nass_act_damp_dvf_sim_tomo_rot.png][png]], [[./figs/nass_act_damp_dvf_sim_tomo_rot.pdf][pdf]])
+#+name: fig:nass_act_damp_dvf_sim_tomo_rot
+#+caption: Position Error during tomography experiment - Rotations ([[./figs/nass_act_damp_dvf_sim_tomo_rot.png][png]], [[./figs/nass_act_damp_dvf_sim_tomo_rot.pdf][pdf]])
[[file:figs/nass_act_damp_dvf_sim_tomo_rot.png]]
** Conclusion
#+begin_important
-Direct Velocity Feedback:
--
+Direct Velocity Feedback using a relative motion sensor:
+- Robust (guaranteed stability)
#+end_important
* Inertial Control
@@ -2802,6 +2676,7 @@ In Inertial Control, a feedback is applied between the measured *absolute* motio
Let's load the undamped plant:
#+begin_src matlab
load('./active_damping/mat/undamped_plants.mat', 'G_ine');
+ load('./active_damping/mat/plants_variable.mat', 'masses', 'Gm_ine');
#+end_src
Let's look at the transfer function from actuator forces in the nano-hexapod to the measured velocity of the nano-hexapod platform in the direction of the corresponding actuator for all 6 pairs of actuator/sensor (figure [[fig:ine_plant]]).
@@ -2813,23 +2688,25 @@ Let's look at the transfer function from actuator forces in the nano-hexapod to
ax1 = subplot(2, 1, 1);
hold on;
- for i=1:6
- plot(freqs, abs(squeeze(freqresp(G_ine(['Vnlm', num2str(i)], ['Fnl', num2str(i)]), freqs, 'Hz'))));
+ for i=1:length(masses)
+ plot(freqs, abs(squeeze(freqresp(Gm_ine{i}('Vnlm1', 'Fnl1'), freqs, 'Hz'))));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [$\frac{m/s^2}{N}$]'); set(gca, 'XTickLabel',[]);
+ ylabel('Amplitude [(m/s)/N]'); set(gca, 'XTickLabel',[]);
ax2 = subplot(2, 1, 2);
hold on;
- for i=1:6
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_ine(['Vnlm', num2str(i)], ['Fnl', num2str(i)]), freqs, 'Hz'))));
+ for i=1:length(masses)
+ plot(freqs, 180/pi*angle(squeeze(freqresp(Gm_ine{i}('Vnlm1', 'Fnl1'), freqs, 'Hz'))), ...
+ 'DisplayName', sprintf('$M = %.0f$ [kg]', masses(i)));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
+ legend('location', 'southwest');
linkaxes([ax1,ax2],'x');
#+end_src
@@ -2839,15 +2716,15 @@ Let's look at the transfer function from actuator forces in the nano-hexapod to
<>
#+end_src
-#+NAME: fig:ine_plant
-#+CAPTION: Transfer function from forces applied in the legs to leg velocity sensor ([[./figs/ine_plant.png][png]], [[./figs/ine_plant.pdf][pdf]])
+#+name: fig:ine_plant
+#+caption: Transfer function from forces applied in the legs to leg velocity sensor ([[./figs/ine_plant.png][png]], [[./figs/ine_plant.pdf][pdf]])
[[file:figs/ine_plant.png]]
*** Control Design
The controller is defined below and the obtained loop gain is shown in figure [[fig:ine_open_loop_gain]].
#+begin_src matlab
- K_ine = 1e4/(1+s/(2*pi*100));
+ K_ine = 2.5e4;
#+end_src
#+begin_src matlab :exports none
@@ -2857,23 +2734,25 @@ The controller is defined below and the obtained loop gain is shown in figure [[
ax1 = subplot(2, 1, 1);
hold on;
- for i=1:6
- plot(freqs, abs(squeeze(freqresp(K_ine*G_ine(['Vnlm', num2str(i)], ['Fnl', num2str(i)]), freqs, 'Hz'))));
+ for i=1:length(masses)
+ plot(freqs, abs(squeeze(freqresp(K_ine*Gm_ine{i}('Vnlm1', 'Fnl1'), freqs, 'Hz'))));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
+ ylabel('Loop Gain'); set(gca, 'XTickLabel',[]);
ax2 = subplot(2, 1, 2);
hold on;
- for i=1:6
- plot(freqs, 180/pi*angle(squeeze(freqresp(K_ine*G_ine(['Vnlm', num2str(i)], ['Fnl', num2str(i)]), freqs, 'Hz'))));
+ for i=1:length(masses)
+ plot(freqs, 180/pi*angle(squeeze(freqresp(K_ine*Gm_ine{i}('Vnlm1', 'Fnl1'), freqs, 'Hz'))), ...
+ 'DisplayName', sprintf('$M = %.0f$ [kg]', masses(i)));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
+ legend('location', 'southwest');
linkaxes([ax1,ax2],'x');
#+end_src
@@ -2883,8 +2762,8 @@ The controller is defined below and the obtained loop gain is shown in figure [[
<>
#+end_src
-#+NAME: fig:ine_open_loop_gain
-#+CAPTION: Loop Gain for Inertial Control ([[./figs/ine_open_loop_gain.png][png]], [[./figs/ine_open_loop_gain.pdf][pdf]])
+#+name: fig:ine_open_loop_gain
+#+caption: Loop Gain for Inertial Control ([[./figs/ine_open_loop_gain.png][png]], [[./figs/ine_open_loop_gain.pdf][pdf]])
[[file:figs/ine_open_loop_gain.png]]
*** Diagonal Controller
@@ -2898,197 +2777,11 @@ We save the controller for further analysis.
save('./active_damping/mat/K_ine.mat', 'K_ine');
#+end_src
-** TODO Identification of the damped plant :noexport:
-*** Initialize the Simulation
-Let's initialize the system prior to identification.
-#+begin_src matlab
- initializeReferences();
- initializeGround();
- initializeGranite();
- initializeTy();
- initializeRy();
- initializeRz();
- initializeMicroHexapod();
- initializeAxisc();
- initializeMirror();
- initializeNanoHexapod('actuator', 'piezo');
- initializeSample('mass', 50);
-#+end_src
-
-And initialize the controllers.
-#+begin_src matlab
- K = tf(zeros(6));
- save('./mat/controllers.mat', 'K', '-append');
- K_ine = -K_ine*eye(6);
- save('./mat/controllers.mat', 'K_ine', '-append');
- K_iff = tf(zeros(6));
- save('./mat/controllers.mat', 'K_iff', '-append');
- K_dvf = tf(zeros(6));
- save('./mat/controllers.mat', 'K_dvf', '-append');
-#+end_src
-
+** Identification of the damped plant :noexport:
*** Identification
-We identify the system dynamics now that the Inertial controller is ON.
+We initialize all the stages with the default parameters.
#+begin_src matlab
- G_ine = identifyPlant();
-#+end_src
-
-And we save the damped plant for further analysis.
-#+begin_src matlab
- save('./active_damping/mat/plants.mat', 'G_ine', '-append');
-#+end_src
-
-*** Sensitivity to disturbances
-
-#+begin_src matlab :exports none
- freqs = logspace(0, 3, 1000);
-
- figure;
-
- subplot(2, 1, 1);
- title('$D_g$ to $D$');
- hold on;
- plot(freqs, abs(squeeze(freqresp(G.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / D_{g,x}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / D_{g,y}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / D_{g,z}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_ine.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_ine.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_ine.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]');
- legend('location', 'northeast');
-
- subplot(2, 1, 2);
- title('$F_s$ to $D$');
- hold on;
- plot(freqs, abs(squeeze(freqresp(G.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{s,x}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / F_{s,y}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{s,z}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_ine.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_ine.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_ine.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
- legend('location', 'northeast');
-#+end_src
-
-#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/sensitivity_dist_ine.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
- <>
-#+end_src
-
-#+NAME: fig:sensitivity_dist_ine
-#+CAPTION: Sensitivity to disturbance once the INE controller is applied to the system ([[./figs/sensitivity_dist_ine.png][png]], [[./figs/sensitivity_dist_ine.pdf][pdf]])
-[[file:figs/sensitivity_dist_ine.png]]
-
-
-#+begin_src matlab :exports none
- freqs = logspace(0, 3, 1000);
-
- figure;
- hold on;
- plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Frzz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{rz, z}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Ftyz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{ty, z}\right|$');
- plot(freqs, abs(squeeze(freqresp(G.G_dist('Dx', 'Ftyx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{ty, x}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_ine.G_dist('Dz', 'Frzz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_ine.G_dist('Dz', 'Ftyz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, abs(squeeze(freqresp(G_ine.G_dist('Dx', 'Ftyx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
- legend('location', 'northeast');
-#+end_src
-
-#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/sensitivity_dist_stages_ine.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
- <>
-#+end_src
-
-#+NAME: fig:sensitivity_dist_stages_ine
-#+CAPTION: Sensitivity to force disturbances in various stages when INE is applied ([[./figs/sensitivity_dist_stages_ine.png][png]], [[./figs/sensitivity_dist_stages_ine.pdf][pdf]])
-[[file:figs/sensitivity_dist_stages_ine.png]]
-
-*** Damped Plant
-#+begin_src matlab :exports none
- freqs = logspace(0, 3, 1000);
-
- figure;
-
- ax1 = subplot(2, 2, 1);
- hold on;
- plot(freqs, abs(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz'))));
- plot(freqs, abs(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz'))));
- plot(freqs, abs(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz'))));
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_ine.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), '--');
- plot(freqs, abs(squeeze(freqresp(G_ine.G_cart('Dy', 'Fny'), freqs, 'Hz'))), '--');
- plot(freqs, abs(squeeze(freqresp(G_ine.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), '--');
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
-
- ax2 = subplot(2, 2, 2);
- hold on;
- plot(freqs, abs(squeeze(freqresp(G.G_cart('Rx', 'Mnx'), freqs, 'Hz'))));
- plot(freqs, abs(squeeze(freqresp(G.G_cart('Ry', 'Mny'), freqs, 'Hz'))));
- plot(freqs, abs(squeeze(freqresp(G.G_cart('Rz', 'Mnz'), freqs, 'Hz'))));
- set(gca,'ColorOrderIndex',1);
- plot(freqs, abs(squeeze(freqresp(G_ine.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), '--');
- plot(freqs, abs(squeeze(freqresp(G_ine.G_cart('Ry', 'Mny'), freqs, 'Hz'))), '--');
- plot(freqs, abs(squeeze(freqresp(G_ine.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), '--');
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
- ylabel('Amplitude [rad/(Nm)]'); xlabel('Frequency [Hz]');
-
- ax3 = subplot(2, 2, 3);
- hold on;
- plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{n,x}\right|$');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / F_{n,y}\right|$');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{n,z}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_ine.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_ine.G_cart('Dy', 'Fny'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_ine.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- hold off;
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
- ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
- ylim([-180, 180]);
- yticks([-180, -90, 0, 90, 180]);
- legend('location', 'northwest');
-
- ax4 = subplot(2, 2, 4);
- hold on;
- plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), 'DisplayName', '$\left|R_x / M_{n,x}\right|$');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Ry', 'Mny'), freqs, 'Hz'))), 'DisplayName', '$\left|R_y / M_{n,y}\right|$');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), 'DisplayName', '$\left|R_z / M_{n,z}\right|$');
- set(gca,'ColorOrderIndex',1);
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_ine.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_ine.G_cart('Ry', 'Mny'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- plot(freqs, 180/pi*angle(squeeze(freqresp(G_ine.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
- hold off;
- set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
- ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
- ylim([-180, 180]);
- yticks([-180, -90, 0, 90, 180]);
- legend('location', 'northwest');
-
- linkaxes([ax1,ax2,ax3,ax4],'x');
-#+end_src
-
-#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/plant_ine_damped.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
- <>
-#+end_src
-
-#+NAME: fig:plant_ine_damped
-#+CAPTION: Damped Plant after INE is applied ([[./figs/plant_ine_damped.png][png]], [[./figs/plant_ine_damped.pdf][pdf]])
-[[file:figs/plant_ine_damped.png]]
-
-** Tomography Experiment
-*** Initialize the Simulation
-We initialize elements for the tomography experiment.
-#+begin_src matlab
- prepareTomographyExperiment();
+ prepareLinearizeIdentification();
#+end_src
We set the Inertial controller.
@@ -3097,122 +2790,189 @@ We set the Inertial controller.
save('./mat/controllers.mat', 'K_ine', '-append');
#+end_src
-*** Simulation
-We change the simulation stop time.
+We identify the dynamics of the system using the =linearize= function.
#+begin_src matlab
- load('mat/conf_simscape.mat');
- set_param(conf_simscape, 'StopTime', '3');
+ %% Options for Linearized
+ options = linearizeOptions;
+ options.SampleTime = 0;
+
+ %% Name of the Simulink File
+ mdl = 'sim_nass_active_damping';
+
+ %% Input/Output definition
+ clear io; io_i = 1;
+ io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1;
+ io(io_i) = linio([mdl, '/Compute Error in NASS base'], 2, 'openoutput'); io_i = io_i + 1;
#+end_src
-And we simulate the system.
+We identify the dynamics for the following sample mass.
#+begin_src matlab
- sim('sim_nass_active_damping');
-#+end_src
-
-Finally, we save the simulation results for further analysis
-#+begin_src matlab
- En_ine = En;
- Eg_ine = Eg;
- save('./active_damping/mat/tomo_exp.mat', 'En_ine', 'Eg_ine', '-append');
-#+end_src
-
-*** Compare with Undamped system
-We load the results of tomography experiments.
-#+begin_src matlab
- load('./active_damping/mat/tomo_exp.mat', 'En', 'En_ine');
- t = linspace(0, 3, length(En_ine(:,1)));
+ load('./active_damping/mat/cart_plants.mat', 'masses');
#+end_src
#+begin_src matlab :exports none
- figure;
- hold on;
- plot(En(:,1), En(:,2), 'DisplayName', '$\epsilon_{x,y}$ - OL')
- plot(En_ine(:,1), En_ine(:,2), 'DisplayName', '$\epsilon_{x,y}$ - Inertial')
- xlabel('X Motion [m]'); ylabel('Y Motion [m]');
- legend();
+ G_cart_ine = {zeros(length(masses))};
+
+ load('mat/stages.mat', 'nano_hexapod');
+
+ for i = 1:length(masses)
+ initializeSample('mass', masses(i));
+
+ %% Run the linearization
+ G = linearize(mdl, io, 0.3, options);
+ G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
+ G.OutputName = {'Dnx', 'Dny', 'Dnz', 'Rnx', 'Rny', 'Rnz'};
+
+ G_cart = G*inv(nano_hexapod.J');
+ G_cart.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
+
+ G_cart_ine(i) = {G_cart};
+ end
#+end_src
-#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/nass_act_damp_ine_sim_tomo_xy.pdf" :var figsize="small-normal" :post pdf2svg(file=*this*, ext="png")
-<>
+And we save them for further analysis.
+#+begin_src matlab
+ save('./active_damping/mat/cart_plants.mat', 'G_cart_dvf', '-append');
#+end_src
-#+NAME: fig:nass_act_damp_ine_sim_tomo_xy
-#+CAPTION: Position Error during tomography experiment - XY Motion ([[./figs/nass_act_damp_ine_sim_tomo_xy.png][png]], [[./figs/nass_act_damp_ine_sim_tomo_xy.pdf][pdf]])
-[[file:figs/nass_act_damp_ine_sim_tomo_xy.png]]
+*** Damped Plant
+Now, look at the new damped plant to control.
+#+begin_src matlab
+ load('./active_damping/mat/cart_plants.mat', 'masses', 'G_cart', 'G_cart_ine');
+#+end_src
+
+It damps the plant (resonance of the nano hexapod as well as other resonances) as shown in figure [[fig:plant_ine_damped]].
#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
figure;
- ax1 = subplot(3, 1, 1);
- hold on;
- plot(t, En(:,1), 'DisplayName', '$\epsilon_{x}$')
- plot(t, En_ine(:,1), 'DisplayName', '$\epsilon_{x}$ - Inertial')
- legend();
- ax2 = subplot(3, 1, 2);
+ ax1 = subplot(2, 1, 1);
hold on;
- plot(t, En(:,2), 'DisplayName', '$\epsilon_{y}$')
- plot(t, En_ine(:,2), 'DisplayName', '$\epsilon_{y}$ - Inertial')
- legend();
- ylabel('Position Error [m]');
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ p1 = plot(freqs, abs(squeeze(freqresp(G_cart_ine{i}('Dnx', 'Fnx'), freqs, 'Hz'))));
+ set(gca,'ColorOrderIndex',i);
+ p2 = plot(freqs, abs(squeeze(freqresp(G_cart_ine{i}('Dny', 'Fny'), freqs, 'Hz'))), '--');
+ set(gca,'ColorOrderIndex',i);
+ p3 = plot(freqs, abs(squeeze(freqresp(G_cart_ine{i}('Dnz', 'Fnz'), freqs, 'Hz'))), ':');
+ end
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
+ legend([p1,p2,p3], {'Fx/Dx', 'Fy/Dx', 'Fz/Dz'});
- ax3 = subplot(3, 1, 3);
+ ax2 = subplot(2, 1, 2);
hold on;
- plot(t, En(:,3), 'DisplayName', '$\epsilon_{z}$')
- plot(t, En_ine(:,3), 'DisplayName', '$\epsilon_{z}$ - Inertial')
- legend();
- xlabel('Time [s]');
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_ine{i}('Dnx', 'Fnx'), freqs, 'Hz')))), ...
+ 'DisplayName', sprintf('$M = %.0f$ [kg]', masses(i)));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_ine{i}('Dny', 'Fny'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_ine{i}('Dnz', 'Fnz'), freqs, 'Hz')))), ':', 'HandleVisibility', 'off');
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ yticks([-540:180:540]);
+ legend('location', 'northeast');
+
+ linkaxes([ax1,ax2],'x');
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/nass_act_damp_ine_sim_tomo_trans.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
-<>
+#+begin_src matlab :var filepath="figs/plant_ine_damped_translations.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
+ <>
#+end_src
-#+NAME: fig:nass_act_damp_ine_sim_tomo_trans
-#+CAPTION: Position Error during tomography experiment - Translations ([[./figs/nass_act_damp_ine_sim_tomo_trans.png][png]], [[./figs/nass_act_damp_ine_sim_tomo_trans.pdf][pdf]])
-[[file:figs/nass_act_damp_ine_sim_tomo_trans.png]]
+#+name: fig:plant_ine_damped_translations
+#+caption: Damped Plant for the translations after INE is applied ([[./figs/plant_ine_damped_translations.png][png]], [[./figs/plant_ine_damped_translations.pdf][pdf]])
+[[file:figs/plant_ine_damped_translations.png]]
#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
figure;
- ax1 = subplot(3, 1, 1);
- hold on;
- plot(t, En(:,4), 'DisplayName', '$\epsilon_{\theta_x}$')
- plot(t, En_ine(:,4), 'DisplayName', '$\epsilon_{\theta_x}$ - Inertial')
- legend();
- ax2 = subplot(3, 1, 2);
+ ax1 = subplot(2, 1, 1);
hold on;
- plot(t, En(:,5), 'DisplayName', '$\epsilon_{\theta_y}$')
- plot(t, En_ine(:,5), 'DisplayName', '$\epsilon_{\theta_y}$ - Inertial')
- legend();
- ylabel('Position Error [rad]');
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ p1 = plot(freqs, abs(squeeze(freqresp(G_cart_ine{i}('Rnx', 'Mnx'), freqs, 'Hz'))));
+ set(gca,'ColorOrderIndex',i);
+ p2 = plot(freqs, abs(squeeze(freqresp(G_cart_ine{i}('Rny', 'Mny'), freqs, 'Hz'))), '--');
+ set(gca,'ColorOrderIndex',i);
+ p3 = plot(freqs, abs(squeeze(freqresp(G_cart_ine{i}('Rnz', 'Mnz'), freqs, 'Hz'))), ':');
+ end
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
+ legend([p1,p2,p3], {'Fx/Dx', 'Fy/Dx', 'Fz/Dz'});
- ax3 = subplot(3, 1, 3);
+ ax2 = subplot(2, 1, 2);
hold on;
- plot(t, En(:,6), 'DisplayName', '$\epsilon_{\theta_z}$')
- plot(t, En_ine(:,6), 'DisplayName', '$\epsilon_{\theta_z}$ - Inertial')
- legend();
- xlabel('Time [s]');
+ for i = 1:length(masses)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_ine{i}('Rnx', 'Mnx'), freqs, 'Hz')))), ...
+ 'DisplayName', sprintf('$M = %.0f$ [kg]', masses(i)));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_ine{i}('Rny', 'Mny'), freqs, 'Hz')))), '--', 'HandleVisibility', 'off');
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_cart_ine{i}('Rnz', 'Mnz'), freqs, 'Hz')))), ':', 'HandleVisibility', 'off');
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ yticks([-540:180:540]);
+ legend('location', 'northeast');
- linkaxes([ax1,ax2,ax3],'x');
+ linkaxes([ax1,ax2],'x');
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
-#+begin_src matlab :var filepath="figs/nass_act_damp_ine_sim_tomo_rot.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
-<>
+#+begin_src matlab :var filepath="figs/plant_ine_damped_rotations.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
+ <>
#+end_src
-#+NAME: fig:nass_act_damp_ine_sim_tomo_rot
-#+CAPTION: Position Error during tomography experiment - Rotations ([[./figs/nass_act_damp_ine_sim_tomo_rot.png][png]], [[./figs/nass_act_damp_ine_sim_tomo_rot.pdf][pdf]])
-[[file:figs/nass_act_damp_ine_sim_tomo_rot.png]]
+#+name: fig:plant_ine_damped_rotations
+#+caption: Damped Plant for the Rotations after INE is applied ([[./figs/plant_ine_damped_rotations.png][png]], [[./figs/plant_ine_damped_rotations.pdf][pdf]])
+[[file:figs/plant_ine_damped_rotations.png]]
+
+#+begin_src matlab :exports none
+ freqs = logspace(1, 3, 1000);
+
+ figure;
+
+ for ix = 1:6
+ for iy = 1:6
+ subplot(6, 6, (ix-1)*6 + iy);
+ hold on;
+ plot(freqs, abs(squeeze(freqresp(G_cart{1}(ix, iy), freqs, 'Hz'))), 'k-');
+ plot(freqs, abs(squeeze(freqresp(G_cart_ine{1}(ix, iy), freqs, 'Hz'))), 'k--');
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylim([1e-13, 1e-4]);
+ xticks([])
+ yticks([])
+ end
+ end
+#+end_src
+
+#+HEADER: :tangle no :exports results :results none :noweb yes
+#+begin_src matlab :var filepath="figs/plant_ine_coupling.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
+ <>
+#+end_src
+
+#+name: fig:plant_ine_coupling
+#+caption: Coupling induced by INE ([[./figs/plant_ine_coupling.png][png]], [[./figs/plant_ine_coupling.pdf][pdf]])
+[[file:figs/plant_ine_coupling.png]]
** Conclusion
#+begin_important
-Inertial Control:
+Inertial Control should not be used.
#+end_important
-* Comparison
+* TODO Comparison
<>
** Introduction :ignore:
** Matlab Init :noexport:ignore:
@@ -3233,7 +2993,7 @@ Inertial Control:
load('./active_damping/mat/plants.mat', 'G', 'G_iff', 'G_ine', 'G_dvf');
#+end_src
-** Sensitivity to Disturbance
+** TODO Sensitivity to Disturbance
#+begin_src matlab :exports none
freqs = logspace(0, 3, 1000);
@@ -3254,8 +3014,8 @@ Inertial Control:
<>
#+end_src
-#+NAME: fig:sensitivity_comp_ground_motion_z
-#+CAPTION: Sensitivity to ground motion in the Z direction on the Z motion error ([[./figs/sensitivity_comp_ground_motion_z.png][png]], [[./figs/sensitivity_comp_ground_motion_z.pdf][pdf]])
+#+name: fig:sensitivity_comp_ground_motion_z
+#+caption: Sensitivity to ground motion in the Z direction on the Z motion error ([[./figs/sensitivity_comp_ground_motion_z.png][png]], [[./figs/sensitivity_comp_ground_motion_z.pdf][pdf]])
[[file:figs/sensitivity_comp_ground_motion_z.png]]
@@ -3279,8 +3039,8 @@ Inertial Control:
<>
#+end_src
-#+NAME: fig:sensitivity_comp_direct_forces_z
-#+CAPTION: Compliance in the Z direction: Sensitivity of direct forces applied on the sample in the Z direction on the Z motion error ([[./figs/sensitivity_comp_direct_forces_z.png][png]], [[./figs/sensitivity_comp_direct_forces_z.pdf][pdf]])
+#+name: fig:sensitivity_comp_direct_forces_z
+#+caption: Compliance in the Z direction: Sensitivity of direct forces applied on the sample in the Z direction on the Z motion error ([[./figs/sensitivity_comp_direct_forces_z.png][png]], [[./figs/sensitivity_comp_direct_forces_z.pdf][pdf]])
[[file:figs/sensitivity_comp_direct_forces_z.png]]
#+begin_src matlab :exports none
@@ -3303,8 +3063,8 @@ Inertial Control:
<>
#+end_src
-#+NAME: fig:sensitivity_comp_spindle_z
-#+CAPTION: Sensitivity to forces applied in the Z direction by the Spindle on the Z motion error ([[./figs/sensitivity_comp_spindle_z.png][png]], [[./figs/sensitivity_comp_spindle_z.pdf][pdf]])
+#+name: fig:sensitivity_comp_spindle_z
+#+caption: Sensitivity to forces applied in the Z direction by the Spindle on the Z motion error ([[./figs/sensitivity_comp_spindle_z.png][png]], [[./figs/sensitivity_comp_spindle_z.pdf][pdf]])
[[file:figs/sensitivity_comp_spindle_z.png]]
#+begin_src matlab :exports none
@@ -3327,8 +3087,8 @@ Inertial Control:
<>
#+end_src
-#+NAME: fig:sensitivity_comp_ty_z
-#+CAPTION: Sensitivity to forces applied in the Z direction by the Y translation stage on the Z motion error ([[./figs/sensitivity_comp_ty_z.png][png]], [[./figs/sensitivity_comp_ty_z.pdf][pdf]])
+#+name: fig:sensitivity_comp_ty_z
+#+caption: Sensitivity to forces applied in the Z direction by the Y translation stage on the Z motion error ([[./figs/sensitivity_comp_ty_z.png][png]], [[./figs/sensitivity_comp_ty_z.pdf][pdf]])
[[file:figs/sensitivity_comp_ty_z.png]]
@@ -3352,11 +3112,11 @@ Inertial Control:
<>
#+end_src
-#+NAME: fig:sensitivity_comp_ty_x
-#+CAPTION: Sensitivity to forces applied in the X direction by the Y translation stage on the X motion error ([[./figs/sensitivity_comp_ty_x.png][png]], [[./figs/sensitivity_comp_ty_x.pdf][pdf]])
+#+name: fig:sensitivity_comp_ty_x
+#+caption: Sensitivity to forces applied in the X direction by the Y translation stage on the X motion error ([[./figs/sensitivity_comp_ty_x.png][png]], [[./figs/sensitivity_comp_ty_x.pdf][pdf]])
[[file:figs/sensitivity_comp_ty_x.png]]
-** Damped Plant
+** TODO Damped Plant
#+begin_src matlab :exports none
freqs = logspace(0, 3, 1000);
@@ -3393,8 +3153,8 @@ Inertial Control:
<>
#+end_src
-#+NAME: fig:plant_comp_damping_z
-#+CAPTION: Plant for the $z$ direction for different active damping technique used ([[./figs/plant_comp_damping_z.png][png]], [[./figs/plant_comp_damping_z.pdf][pdf]])
+#+name: fig:plant_comp_damping_z
+#+caption: Plant for the $z$ direction for different active damping technique used ([[./figs/plant_comp_damping_z.png][png]], [[./figs/plant_comp_damping_z.pdf][pdf]])
[[file:figs/plant_comp_damping_z.png]]
#+begin_src matlab :exports none
@@ -3433,8 +3193,8 @@ Inertial Control:
<>
#+end_src
-#+NAME: fig:plant_comp_damping_x
-#+CAPTION: Plant for the $x$ direction for different active damping technique used ([[./figs/plant_comp_damping_x.png][png]], [[./figs/plant_comp_damping_x.pdf][pdf]])
+#+name: fig:plant_comp_damping_x
+#+caption: Plant for the $x$ direction for different active damping technique used ([[./figs/plant_comp_damping_x.png][png]], [[./figs/plant_comp_damping_x.pdf][pdf]])
[[file:figs/plant_comp_damping_x.png]]
#+begin_src matlab :exports none
@@ -3473,22 +3233,30 @@ Inertial Control:
<>
#+end_src
-#+NAME: fig:plant_comp_damping_coupling
-#+CAPTION: Comparison of one off-diagonal plant for different damping technique applied ([[./figs/plant_comp_damping_coupling.png][png]], [[./figs/plant_comp_damping_coupling.pdf][pdf]])
+#+name: fig:plant_comp_damping_coupling
+#+caption: Comparison of one off-diagonal plant for different damping technique applied ([[./figs/plant_comp_damping_coupling.png][png]], [[./figs/plant_comp_damping_coupling.pdf][pdf]])
[[file:figs/plant_comp_damping_coupling.png]]
-** Tomography Experiment
-*** Load the Simulation Data
+** Tomography Experiment - Frequency Domain analysis
#+begin_src matlab
- load('./active_damping/mat/tomo_exp.mat', 'En', 'En_iff_hpf', 'En_dvf', 'En_ine');
- En_iff = En_iff_hpf;
- t = linspace(0, 3, length(En(:,1)));
+ load('./active_damping/mat/tomo_exp.mat', 'En', 'En_iff', 'En_dvf');
+ Fs = 1e3; % Sampling Frequency of the Data
+ t = (1/Fs)*[0:length(En(:,1))-1];
+#+end_src
+
+We remove the first 0.5 seconds where the transient behavior is fading out.
+#+begin_src matlab
+ [~, i_start] = min(abs(t - 0.5)); % find the indice corresponding to 0.5s
+
+ t = t(i_start:end) - t(i_start);
+ En = En(i_start:end, :);
+ En_dvf = En_dvf(i_start:end, :);
+ En_iff = En_iff(i_start:end, :);
#+end_src
-*** Frequency Domain Analysis
Window used for =pwelch= function.
#+begin_src matlab
- n_av = 8;
+ n_av = 4;
han_win = hanning(ceil(length(En(:, 1))/n_av));
#+end_src
@@ -3496,32 +3264,26 @@ Window used for =pwelch= function.
Ts = t(2)-t(1); % Sample Time for the Data [s]
[pxx, f] = pwelch(En(:, 1), han_win, [], [], 1/Ts);
- [pxx_ine, ~] = pwelch(En_ine(:, 1), han_win, [], [], 1/Ts);
[pxx_dvf, ~] = pwelch(En_dvf(:, 1), han_win, [], [], 1/Ts);
[pxx_iff, ~] = pwelch(En_iff(:, 1), han_win, [], [], 1/Ts);
[pyy, ~] = pwelch(En(:, 2), han_win, [], [], 1/Ts);
- [pyy_ine, ~] = pwelch(En_ine(:, 2), han_win, [], [], 1/Ts);
[pyy_dvf, ~] = pwelch(En_dvf(:, 2), han_win, [], [], 1/Ts);
[pyy_iff, ~] = pwelch(En_iff(:, 2), han_win, [], [], 1/Ts);
[pzz, ~] = pwelch(En(:, 3), han_win, [], [], 1/Ts);
- [pzz_ine, ~] = pwelch(En_ine(:, 3), han_win, [], [], 1/Ts);
[pzz_dvf, ~] = pwelch(En_dvf(:, 3), han_win, [], [], 1/Ts);
[pzz_iff, ~] = pwelch(En_iff(:, 3), han_win, [], [], 1/Ts);
[prx, ~] = pwelch(En(:, 4), han_win, [], [], 1/Ts);
- [prx_ine, ~] = pwelch(En_ine(:, 4), han_win, [], [], 1/Ts);
[prx_dvf, ~] = pwelch(En_dvf(:, 4), han_win, [], [], 1/Ts);
[prx_iff, ~] = pwelch(En_iff(:, 4), han_win, [], [], 1/Ts);
[pry, ~] = pwelch(En(:, 5), han_win, [], [], 1/Ts);
- [pry_ine, ~] = pwelch(En_ine(:, 5), han_win, [], [], 1/Ts);
[pry_dvf, ~] = pwelch(En_dvf(:, 5), han_win, [], [], 1/Ts);
[pry_iff, ~] = pwelch(En_iff(:, 5), han_win, [], [], 1/Ts);
[prz, ~] = pwelch(En(:, 6), han_win, [], [], 1/Ts);
- [prz_ine, ~] = pwelch(En_ine(:, 6), han_win, [], [], 1/Ts);
[prz_dvf, ~] = pwelch(En_dvf(:, 6), han_win, [], [], 1/Ts);
[prz_iff, ~] = pwelch(En_iff(:, 6), han_win, [], [], 1/Ts);
#+end_src
@@ -3529,7 +3291,6 @@ Window used for =pwelch= function.
#+begin_src matlab :exports none
figure;
hold on;
- plot(f, pxx_ine, 'DisplayName', 'Inertial')
plot(f, pxx_dvf, 'DisplayName', 'DVF')
plot(f, pxx_iff, 'DisplayName', 'IFF')
plot(f, pxx, 'k--', 'DisplayName', 'Undamped')
@@ -3538,7 +3299,7 @@ Window used for =pwelch= function.
ylabel('Power Spectral Density [$m^2/Hz$]');
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
legend('location', 'northeast');
- xlim([2, 500]);
+ xlim([1, 500]);
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
@@ -3546,14 +3307,13 @@ Window used for =pwelch= function.
<>
#+end_src
-#+NAME: fig:act_damp_tomo_exp_comp_psd_trans
-#+CAPTION: PSD of the translation errors in the X direction for applied Active Damping techniques ([[./figs/act_damp_tomo_exp_comp_psd_trans.png][png]], [[./figs/act_damp_tomo_exp_comp_psd_trans.pdf][pdf]])
+#+name: fig:act_damp_tomo_exp_comp_psd_trans
+#+caption: PSD of the translation errors in the X direction for applied Active Damping techniques ([[./figs/act_damp_tomo_exp_comp_psd_trans.png][png]], [[./figs/act_damp_tomo_exp_comp_psd_trans.pdf][pdf]])
[[file:figs/act_damp_tomo_exp_comp_psd_trans.png]]
#+begin_src matlab :exports none
figure;
hold on;
- plot(f, prx_ine, 'DisplayName', 'Inertial')
plot(f, prx_dvf, 'DisplayName', 'DVF')
plot(f, prx_iff, 'DisplayName', 'IFF')
plot(f, prx, 'k--', 'DisplayName', 'Undamped')
@@ -3562,7 +3322,7 @@ Window used for =pwelch= function.
ylabel('Power Spectral Density [$rad^2/Hz$]');
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
legend('location', 'northeast');
- xlim([2, 500]);
+ xlim([1, 500]);
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
@@ -3570,14 +3330,13 @@ Window used for =pwelch= function.
<>
#+end_src
-#+NAME: fig:act_damp_tomo_exp_comp_psd_rot
-#+CAPTION: PSD of the rotation errors in the X direction for applied Active Damping techniques ([[./figs/act_damp_tomo_exp_comp_psd_rot.png][png]], [[./figs/act_damp_tomo_exp_comp_psd_rot.pdf][pdf]])
+#+name: fig:act_damp_tomo_exp_comp_psd_rot
+#+caption: PSD of the rotation errors in the X direction for applied Active Damping techniques ([[./figs/act_damp_tomo_exp_comp_psd_rot.png][png]], [[./figs/act_damp_tomo_exp_comp_psd_rot.pdf][pdf]])
[[file:figs/act_damp_tomo_exp_comp_psd_rot.png]]
#+begin_src matlab :exports none
figure;
hold on;
- plot(f, flip(-cumtrapz(flip(f), flip(pxx_ine))), 'DisplayName', 'Inertial')
plot(f, flip(-cumtrapz(flip(f), flip(pxx_dvf))), 'DisplayName', 'DVF')
plot(f, flip(-cumtrapz(flip(f), flip(pxx_iff))), 'DisplayName', 'IFF')
plot(f, flip(-cumtrapz(flip(f), flip(pxx))), 'k--', 'DisplayName', 'Undamped')
@@ -3586,7 +3345,7 @@ Window used for =pwelch= function.
ylabel('Cumulative Power Spectrum [$m^2$]');
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
legend('location', 'northeast');
- xlim([2, 500]);
+ xlim([1, 500]);
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
@@ -3594,14 +3353,13 @@ Window used for =pwelch= function.
<>
#+end_src
-#+NAME: fig:act_damp_tomo_exp_comp_cps_trans
-#+CAPTION: CPS of the translation errors in the X direction for applied Active Damping techniques ([[./figs/act_damp_tomo_exp_comp_cps_trans.png][png]], [[./figs/act_damp_tomo_exp_comp_cps_trans.pdf][pdf]])
+#+name: fig:act_damp_tomo_exp_comp_cps_trans
+#+caption: CPS of the translation errors in the X direction for applied Active Damping techniques ([[./figs/act_damp_tomo_exp_comp_cps_trans.png][png]], [[./figs/act_damp_tomo_exp_comp_cps_trans.pdf][pdf]])
[[file:figs/act_damp_tomo_exp_comp_cps_trans.png]]
#+begin_src matlab :exports none
figure;
hold on;
- plot(f, flip(-cumtrapz(flip(f), flip(prx_ine))), 'DisplayName', 'Inertial')
plot(f, flip(-cumtrapz(flip(f), flip(prx_dvf))), 'DisplayName', 'DVF')
plot(f, flip(-cumtrapz(flip(f), flip(prx_iff))), 'DisplayName', 'IFF')
plot(f, flip(-cumtrapz(flip(f), flip(prx))), 'k--', 'DisplayName', 'Undamped')
@@ -3610,7 +3368,7 @@ Window used for =pwelch= function.
ylabel('Cumulative Power Spectrum [$rad^2$]');
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
legend('location', 'northeast');
- xlim([2, 500]);
+ xlim([1, 400]);
#+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes
@@ -3618,11 +3376,80 @@ Window used for =pwelch= function.
<>
#+end_src
-#+NAME: fig:act_damp_tomo_exp_comp_cps_rot
-#+CAPTION: CPS of the rotation errors in the X direction for applied Active Damping techniques ([[./figs/act_damp_tomo_exp_comp_cps_rot.png][png]], [[./figs/act_damp_tomo_exp_comp_cps_rot.pdf][pdf]])
+#+name: fig:act_damp_tomo_exp_comp_cps_rot
+#+caption: CPS of the rotation errors in the X direction for applied Active Damping techniques ([[./figs/act_damp_tomo_exp_comp_cps_rot.png][png]], [[./figs/act_damp_tomo_exp_comp_cps_rot.pdf][pdf]])
[[file:figs/act_damp_tomo_exp_comp_cps_rot.png]]
* Useful Functions
+** prepareLinearizeIdentification
+:PROPERTIES:
+:header-args:matlab+: :tangle src/prepareLinearizeIdentification.m
+:header-args:matlab+: :comments none :mkdirp yes :eval no
+:END:
+<>
+
+This Matlab function is accessible [[file:src/prepareLinearizeIdentification.m][here]].
+
+*** Function Description
+:PROPERTIES:
+:UNNUMBERED: t
+:END:
+
+#+begin_src matlab
+ function [] = prepareLinearizeIdentification(args)
+#+end_src
+
+*** Optional Parameters
+:PROPERTIES:
+:UNNUMBERED: t
+:END:
+#+begin_src matlab
+ arguments
+ args.nass_actuator char {mustBeMember(args.nass_actuator,{'piezo', 'lorentz'})} = 'piezo'
+ args.sample_mass (1,1) double {mustBeNumeric, mustBePositive} = 50 % [kg]
+ end
+#+end_src
+
+*** Initialize the Simulation
+:PROPERTIES:
+:UNNUMBERED: t
+:END:
+We initialize all the stages with the default parameters.
+#+begin_src matlab
+ initializeGround();
+ initializeGranite();
+ initializeTy();
+ initializeRy();
+ initializeRz();
+ initializeMicroHexapod();
+ initializeAxisc();
+ initializeMirror();
+#+end_src
+
+The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg.
+#+begin_src matlab
+ initializeNanoHexapod('actuator', args.nass_actuator);
+ initializeSample('mass', args.sample_mass);
+#+end_src
+
+We set the references and disturbances to zero.
+#+begin_src matlab
+ initializeReferences();
+ initializeDisturbances('enable', false);
+#+end_src
+
+And all the controllers are set to 0.
+#+begin_src matlab
+ K = tf(zeros(6));
+ save('./mat/controllers.mat', 'K', '-append');
+ K_ine = tf(zeros(6));
+ save('./mat/controllers.mat', 'K_ine', '-append');
+ K_iff = tf(zeros(6));
+ save('./mat/controllers.mat', 'K_iff', '-append');
+ K_dvf = tf(zeros(6));
+ save('./mat/controllers.mat', 'K_dvf', '-append');
+#+end_src
+
** prepareTomographyExperiment
:PROPERTIES:
:header-args:matlab+: :tangle src/prepareTomographyExperiment.m
@@ -3986,8 +3813,8 @@ The sensitivity to disturbances are shown on figure [[fig:sensitivity_dist_undam
<>
#+end_src
-#+NAME: fig:sensitivity_dist_undamped
-#+CAPTION: Undamped sensitivity to disturbances ([[./figs/sensitivity_dist_undamped.png][png]], [[./figs/sensitivity_dist_undamped.pdf][pdf]])
+#+name: fig:sensitivity_dist_undamped
+#+caption: Undamped sensitivity to disturbances ([[./figs/sensitivity_dist_undamped.png][png]], [[./figs/sensitivity_dist_undamped.pdf][pdf]])
[[file:figs/sensitivity_dist_undamped.png]]
#+begin_src matlab :exports none
@@ -4008,8 +3835,8 @@ The sensitivity to disturbances are shown on figure [[fig:sensitivity_dist_undam
<>
#+end_src
-#+NAME: fig:sensitivity_dist_stages
-#+CAPTION: Sensitivity to force disturbances in various stages ([[./figs/sensitivity_dist_stages.png][png]], [[./figs/sensitivity_dist_stages.pdf][pdf]])
+#+name: fig:sensitivity_dist_stages
+#+caption: Sensitivity to force disturbances in various stages ([[./figs/sensitivity_dist_stages.png][png]], [[./figs/sensitivity_dist_stages.pdf][pdf]])
[[file:figs/sensitivity_dist_stages.png]]
*** Undamped Plant
The "plant" (transfer function from forces applied by the nano-hexapod to the measured displacement of the sample with respect to the granite) bode plot is shown on figure [[fig:sensitivity_dist_undamped]].
@@ -4048,8 +3875,8 @@ The "plant" (transfer function from forces applied by the nano-hexapod to the me
<>
#+end_src
-#+NAME: fig:plant_undamped
-#+CAPTION: Transfer Function from cartesian forces to displacement for the undamped plant ([[./figs/plant_undamped.png][png]], [[./figs/plant_undamped.pdf][pdf]])
+#+name: fig:plant_undamped
+#+caption: Transfer Function from cartesian forces to displacement for the undamped plant ([[./figs/plant_undamped.png][png]], [[./figs/plant_undamped.pdf][pdf]])
[[file:figs/plant_undamped.png]]
@@ -4226,8 +4053,8 @@ And the closed loop system is computed below.
<>
#+end_src
-#+NAME: fig:rmc_1dof_sensitivitiy
-#+CAPTION: Sensitivity to disturbance when RMC is applied on the 1dof system ([[./figs/rmc_1dof_sensitivitiy.png][png]], [[./figs/rmc_1dof_sensitivitiy.pdf][pdf]])
+#+name: fig:rmc_1dof_sensitivitiy
+#+caption: Sensitivity to disturbance when RMC is applied on the 1dof system ([[./figs/rmc_1dof_sensitivitiy.png][png]], [[./figs/rmc_1dof_sensitivitiy.pdf][pdf]])
[[file:figs/rmc_1dof_sensitivitiy.png]]
** Inertial Control
*** One degree-of-freedom example
@@ -4417,6 +4244,6 @@ The obtained sensitivity to disturbances is shown in figure [[fig:ine_1dof_sensi
<>
#+end_src
-#+NAME: fig:ine_1dof_sensitivitiy
-#+CAPTION: Sensitivity to disturbance when INE is applied on the 1dof system ([[./figs/ine_1dof_sensitivitiy.png][png]], [[./figs/ine_1dof_sensitivitiy.pdf][pdf]])
+#+name: fig:ine_1dof_sensitivitiy
+#+caption: Sensitivity to disturbance when INE is applied on the 1dof system ([[./figs/ine_1dof_sensitivitiy.png][png]], [[./figs/ine_1dof_sensitivitiy.pdf][pdf]])
[[file:figs/ine_1dof_sensitivitiy.png]]
diff --git a/figs/act_damp_tomo_exp_comp_cps_rot.pdf b/figs/act_damp_tomo_exp_comp_cps_rot.pdf
index eed76c1..b06b028 100644
Binary files a/figs/act_damp_tomo_exp_comp_cps_rot.pdf and b/figs/act_damp_tomo_exp_comp_cps_rot.pdf differ
diff --git a/figs/act_damp_tomo_exp_comp_cps_rot.png b/figs/act_damp_tomo_exp_comp_cps_rot.png
index 1c01200..3996299 100644
Binary files a/figs/act_damp_tomo_exp_comp_cps_rot.png and b/figs/act_damp_tomo_exp_comp_cps_rot.png differ
diff --git a/figs/act_damp_tomo_exp_comp_cps_trans.pdf b/figs/act_damp_tomo_exp_comp_cps_trans.pdf
index 051bfac..ecfe4d8 100644
Binary files a/figs/act_damp_tomo_exp_comp_cps_trans.pdf and b/figs/act_damp_tomo_exp_comp_cps_trans.pdf differ
diff --git a/figs/act_damp_tomo_exp_comp_cps_trans.png b/figs/act_damp_tomo_exp_comp_cps_trans.png
index 27d98b9..351e8eb 100644
Binary files a/figs/act_damp_tomo_exp_comp_cps_trans.png and b/figs/act_damp_tomo_exp_comp_cps_trans.png differ
diff --git a/figs/act_damp_tomo_exp_comp_psd_rot.pdf b/figs/act_damp_tomo_exp_comp_psd_rot.pdf
index 69b5f19..be80ecf 100644
Binary files a/figs/act_damp_tomo_exp_comp_psd_rot.pdf and b/figs/act_damp_tomo_exp_comp_psd_rot.pdf differ
diff --git a/figs/act_damp_tomo_exp_comp_psd_rot.png b/figs/act_damp_tomo_exp_comp_psd_rot.png
index 6503890..655ce03 100644
Binary files a/figs/act_damp_tomo_exp_comp_psd_rot.png and b/figs/act_damp_tomo_exp_comp_psd_rot.png differ
diff --git a/figs/act_damp_tomo_exp_comp_psd_trans.pdf b/figs/act_damp_tomo_exp_comp_psd_trans.pdf
index 22b9d44..2849fe1 100644
Binary files a/figs/act_damp_tomo_exp_comp_psd_trans.pdf and b/figs/act_damp_tomo_exp_comp_psd_trans.pdf differ
diff --git a/figs/act_damp_tomo_exp_comp_psd_trans.png b/figs/act_damp_tomo_exp_comp_psd_trans.png
index 9936393..44d6edb 100644
Binary files a/figs/act_damp_tomo_exp_comp_psd_trans.png and b/figs/act_damp_tomo_exp_comp_psd_trans.png differ
diff --git a/figs/ine_open_loop_gain.pdf b/figs/ine_open_loop_gain.pdf
index d47b25c..c6e18da 100644
Binary files a/figs/ine_open_loop_gain.pdf and b/figs/ine_open_loop_gain.pdf differ
diff --git a/figs/ine_open_loop_gain.png b/figs/ine_open_loop_gain.png
index 33e4927..8f045cd 100644
Binary files a/figs/ine_open_loop_gain.png and b/figs/ine_open_loop_gain.png differ
diff --git a/figs/ine_plant.pdf b/figs/ine_plant.pdf
index f58b048..d0dd2ae 100644
Binary files a/figs/ine_plant.pdf and b/figs/ine_plant.pdf differ
diff --git a/figs/ine_plant.png b/figs/ine_plant.png
index 147fdde..53d46ee 100644
Binary files a/figs/ine_plant.png and b/figs/ine_plant.png differ
diff --git a/figs/nass_act_damp_dvf_sim_tomo_rot.pdf b/figs/nass_act_damp_dvf_sim_tomo_rot.pdf
index d141bfa..d0592fb 100644
Binary files a/figs/nass_act_damp_dvf_sim_tomo_rot.pdf and b/figs/nass_act_damp_dvf_sim_tomo_rot.pdf differ
diff --git a/figs/nass_act_damp_dvf_sim_tomo_rot.png b/figs/nass_act_damp_dvf_sim_tomo_rot.png
index f376be7..c710353 100644
Binary files a/figs/nass_act_damp_dvf_sim_tomo_rot.png and b/figs/nass_act_damp_dvf_sim_tomo_rot.png differ
diff --git a/figs/nass_act_damp_dvf_sim_tomo_trans.pdf b/figs/nass_act_damp_dvf_sim_tomo_trans.pdf
index d902276..9a0f2dc 100644
Binary files a/figs/nass_act_damp_dvf_sim_tomo_trans.pdf and b/figs/nass_act_damp_dvf_sim_tomo_trans.pdf differ
diff --git a/figs/nass_act_damp_dvf_sim_tomo_trans.png b/figs/nass_act_damp_dvf_sim_tomo_trans.png
index b4a11cb..77d19da 100644
Binary files a/figs/nass_act_damp_dvf_sim_tomo_trans.png and b/figs/nass_act_damp_dvf_sim_tomo_trans.png differ
diff --git a/figs/nass_act_damp_dvf_sim_tomo_xy.pdf b/figs/nass_act_damp_dvf_sim_tomo_xy.pdf
index 3da6a0a..cd7be62 100644
Binary files a/figs/nass_act_damp_dvf_sim_tomo_xy.pdf and b/figs/nass_act_damp_dvf_sim_tomo_xy.pdf differ
diff --git a/figs/nass_act_damp_dvf_sim_tomo_xy.png b/figs/nass_act_damp_dvf_sim_tomo_xy.png
index c2591d5..a8cb786 100644
Binary files a/figs/nass_act_damp_dvf_sim_tomo_xy.png and b/figs/nass_act_damp_dvf_sim_tomo_xy.png differ
diff --git a/figs/nass_act_damp_iff_sim_tomo_rot.pdf b/figs/nass_act_damp_iff_sim_tomo_rot.pdf
index 09e1802..6aabef0 100644
Binary files a/figs/nass_act_damp_iff_sim_tomo_rot.pdf and b/figs/nass_act_damp_iff_sim_tomo_rot.pdf differ
diff --git a/figs/nass_act_damp_iff_sim_tomo_rot.png b/figs/nass_act_damp_iff_sim_tomo_rot.png
index a4268b4..30d3a2c 100644
Binary files a/figs/nass_act_damp_iff_sim_tomo_rot.png and b/figs/nass_act_damp_iff_sim_tomo_rot.png differ
diff --git a/figs/nass_act_damp_iff_sim_tomo_trans.pdf b/figs/nass_act_damp_iff_sim_tomo_trans.pdf
index 326a6a8..22c4982 100644
Binary files a/figs/nass_act_damp_iff_sim_tomo_trans.pdf and b/figs/nass_act_damp_iff_sim_tomo_trans.pdf differ
diff --git a/figs/nass_act_damp_iff_sim_tomo_trans.png b/figs/nass_act_damp_iff_sim_tomo_trans.png
index 13c3569..1a399cd 100644
Binary files a/figs/nass_act_damp_iff_sim_tomo_trans.png and b/figs/nass_act_damp_iff_sim_tomo_trans.png differ
diff --git a/figs/nass_act_damp_iff_sim_tomo_xy.pdf b/figs/nass_act_damp_iff_sim_tomo_xy.pdf
index 6442919..dcd08af 100644
Binary files a/figs/nass_act_damp_iff_sim_tomo_xy.pdf and b/figs/nass_act_damp_iff_sim_tomo_xy.pdf differ
diff --git a/figs/nass_act_damp_iff_sim_tomo_xy.png b/figs/nass_act_damp_iff_sim_tomo_xy.png
index 1bcb5fe..b224208 100644
Binary files a/figs/nass_act_damp_iff_sim_tomo_xy.png and b/figs/nass_act_damp_iff_sim_tomo_xy.png differ
diff --git a/figs/nass_act_damp_ine_sim_tomo_rot.pdf b/figs/nass_act_damp_ine_sim_tomo_rot.pdf
deleted file mode 100644
index af7a0db..0000000
Binary files a/figs/nass_act_damp_ine_sim_tomo_rot.pdf and /dev/null differ
diff --git a/figs/nass_act_damp_ine_sim_tomo_rot.png b/figs/nass_act_damp_ine_sim_tomo_rot.png
deleted file mode 100644
index fde92f3..0000000
Binary files a/figs/nass_act_damp_ine_sim_tomo_rot.png and /dev/null differ
diff --git a/figs/nass_act_damp_ine_sim_tomo_trans.pdf b/figs/nass_act_damp_ine_sim_tomo_trans.pdf
deleted file mode 100644
index d9c1ea1..0000000
Binary files a/figs/nass_act_damp_ine_sim_tomo_trans.pdf and /dev/null differ
diff --git a/figs/nass_act_damp_ine_sim_tomo_trans.png b/figs/nass_act_damp_ine_sim_tomo_trans.png
deleted file mode 100644
index fb61553..0000000
Binary files a/figs/nass_act_damp_ine_sim_tomo_trans.png and /dev/null differ
diff --git a/figs/nass_act_damp_ine_sim_tomo_xy.pdf b/figs/nass_act_damp_ine_sim_tomo_xy.pdf
deleted file mode 100644
index 393a648..0000000
Binary files a/figs/nass_act_damp_ine_sim_tomo_xy.pdf and /dev/null differ
diff --git a/figs/nass_act_damp_ine_sim_tomo_xy.png b/figs/nass_act_damp_ine_sim_tomo_xy.png
deleted file mode 100644
index 1ba19b8..0000000
Binary files a/figs/nass_act_damp_ine_sim_tomo_xy.png and /dev/null differ
diff --git a/figs/nass_act_damp_undamped_sim_tomo_rot.pdf b/figs/nass_act_damp_undamped_sim_tomo_rot.pdf
index 388b255..8770f9e 100644
Binary files a/figs/nass_act_damp_undamped_sim_tomo_rot.pdf and b/figs/nass_act_damp_undamped_sim_tomo_rot.pdf differ
diff --git a/figs/nass_act_damp_undamped_sim_tomo_rot.png b/figs/nass_act_damp_undamped_sim_tomo_rot.png
index abf2582..54882df 100644
Binary files a/figs/nass_act_damp_undamped_sim_tomo_rot.png and b/figs/nass_act_damp_undamped_sim_tomo_rot.png differ
diff --git a/figs/nass_act_damp_undamped_sim_tomo_trans.pdf b/figs/nass_act_damp_undamped_sim_tomo_trans.pdf
index f8e92a8..f175bb4 100644
Binary files a/figs/nass_act_damp_undamped_sim_tomo_trans.pdf and b/figs/nass_act_damp_undamped_sim_tomo_trans.pdf differ
diff --git a/figs/nass_act_damp_undamped_sim_tomo_trans.png b/figs/nass_act_damp_undamped_sim_tomo_trans.png
index 4cda0fe..e85ab26 100644
Binary files a/figs/nass_act_damp_undamped_sim_tomo_trans.png and b/figs/nass_act_damp_undamped_sim_tomo_trans.png differ
diff --git a/figs/plant_dvf_coupling.pdf b/figs/plant_dvf_coupling.pdf
new file mode 100644
index 0000000..c146019
Binary files /dev/null and b/figs/plant_dvf_coupling.pdf differ
diff --git a/figs/plant_dvf_coupling.png b/figs/plant_dvf_coupling.png
new file mode 100644
index 0000000..62d2410
Binary files /dev/null and b/figs/plant_dvf_coupling.png differ
diff --git a/figs/plant_dvf_damped_rotations.pdf b/figs/plant_dvf_damped_rotations.pdf
new file mode 100644
index 0000000..07ff800
Binary files /dev/null and b/figs/plant_dvf_damped_rotations.pdf differ
diff --git a/figs/plant_dvf_damped_rotations.png b/figs/plant_dvf_damped_rotations.png
new file mode 100644
index 0000000..be68711
Binary files /dev/null and b/figs/plant_dvf_damped_rotations.png differ
diff --git a/figs/plant_dvf_damped_translations.pdf b/figs/plant_dvf_damped_translations.pdf
new file mode 100644
index 0000000..6440c59
Binary files /dev/null and b/figs/plant_dvf_damped_translations.pdf differ
diff --git a/figs/plant_dvf_damped_translations.png b/figs/plant_dvf_damped_translations.png
new file mode 100644
index 0000000..bc714fd
Binary files /dev/null and b/figs/plant_dvf_damped_translations.png differ
diff --git a/figs/plant_iff_coupling.pdf b/figs/plant_iff_coupling.pdf
index 6978566..478a43f 100644
Binary files a/figs/plant_iff_coupling.pdf and b/figs/plant_iff_coupling.pdf differ
diff --git a/figs/plant_iff_coupling.png b/figs/plant_iff_coupling.png
index 7e1fcf5..e1d54fd 100644
Binary files a/figs/plant_iff_coupling.png and b/figs/plant_iff_coupling.png differ
diff --git a/figs/plant_iff_damped_rotations.pdf b/figs/plant_iff_damped_rotations.pdf
new file mode 100644
index 0000000..0532cd5
Binary files /dev/null and b/figs/plant_iff_damped_rotations.pdf differ
diff --git a/figs/plant_iff_damped_rotations.png b/figs/plant_iff_damped_rotations.png
new file mode 100644
index 0000000..59726e8
Binary files /dev/null and b/figs/plant_iff_damped_rotations.png differ
diff --git a/figs/plant_iff_damped_translations.pdf b/figs/plant_iff_damped_translations.pdf
new file mode 100644
index 0000000..75d96d8
Binary files /dev/null and b/figs/plant_iff_damped_translations.pdf differ
diff --git a/figs/plant_iff_damped_translations.png b/figs/plant_iff_damped_translations.png
new file mode 100644
index 0000000..89ecb86
Binary files /dev/null and b/figs/plant_iff_damped_translations.png differ
diff --git a/figs/plant_ine_coupling.pdf b/figs/plant_ine_coupling.pdf
new file mode 100644
index 0000000..33d9aa8
Binary files /dev/null and b/figs/plant_ine_coupling.pdf differ
diff --git a/figs/plant_ine_coupling.png b/figs/plant_ine_coupling.png
new file mode 100644
index 0000000..391ec17
Binary files /dev/null and b/figs/plant_ine_coupling.png differ
diff --git a/figs/plant_ine_damped_rotations.pdf b/figs/plant_ine_damped_rotations.pdf
new file mode 100644
index 0000000..a3efba9
Binary files /dev/null and b/figs/plant_ine_damped_rotations.pdf differ
diff --git a/figs/plant_ine_damped_rotations.png b/figs/plant_ine_damped_rotations.png
new file mode 100644
index 0000000..161dd6c
Binary files /dev/null and b/figs/plant_ine_damped_rotations.png differ
diff --git a/figs/plant_ine_damped_translations.pdf b/figs/plant_ine_damped_translations.pdf
new file mode 100644
index 0000000..9a3590b
Binary files /dev/null and b/figs/plant_ine_damped_translations.pdf differ
diff --git a/figs/plant_ine_damped_translations.png b/figs/plant_ine_damped_translations.png
new file mode 100644
index 0000000..04a7aac
Binary files /dev/null and b/figs/plant_ine_damped_translations.png differ
diff --git a/figs/sensitivity_comp_direct_forces_z.pdf b/figs/sensitivity_comp_direct_forces_z.pdf
deleted file mode 100644
index d641b44..0000000
Binary files a/figs/sensitivity_comp_direct_forces_z.pdf and /dev/null differ
diff --git a/figs/sensitivity_comp_direct_forces_z.png b/figs/sensitivity_comp_direct_forces_z.png
deleted file mode 100644
index 1be45b1..0000000
Binary files a/figs/sensitivity_comp_direct_forces_z.png and /dev/null differ
diff --git a/figs/sensitivity_comp_ground_motion_z.pdf b/figs/sensitivity_comp_ground_motion_z.pdf
deleted file mode 100644
index d44cb84..0000000
Binary files a/figs/sensitivity_comp_ground_motion_z.pdf and /dev/null differ
diff --git a/figs/sensitivity_comp_ground_motion_z.png b/figs/sensitivity_comp_ground_motion_z.png
deleted file mode 100644
index 85d97a6..0000000
Binary files a/figs/sensitivity_comp_ground_motion_z.png and /dev/null differ
diff --git a/figs/sensitivity_comp_spindle_z.pdf b/figs/sensitivity_comp_spindle_z.pdf
deleted file mode 100644
index 1f4ff07..0000000
Binary files a/figs/sensitivity_comp_spindle_z.pdf and /dev/null differ
diff --git a/figs/sensitivity_comp_spindle_z.png b/figs/sensitivity_comp_spindle_z.png
deleted file mode 100644
index 1207672..0000000
Binary files a/figs/sensitivity_comp_spindle_z.png and /dev/null differ
diff --git a/figs/sensitivity_comp_ty_x.pdf b/figs/sensitivity_comp_ty_x.pdf
deleted file mode 100644
index a3bb8fd..0000000
Binary files a/figs/sensitivity_comp_ty_x.pdf and /dev/null differ
diff --git a/figs/sensitivity_comp_ty_x.png b/figs/sensitivity_comp_ty_x.png
deleted file mode 100644
index 4e3b866..0000000
Binary files a/figs/sensitivity_comp_ty_x.png and /dev/null differ
diff --git a/figs/sensitivity_comp_ty_z.pdf b/figs/sensitivity_comp_ty_z.pdf
deleted file mode 100644
index cc8eb6c..0000000
Binary files a/figs/sensitivity_comp_ty_z.pdf and /dev/null differ
diff --git a/figs/sensitivity_comp_ty_z.png b/figs/sensitivity_comp_ty_z.png
deleted file mode 100644
index 592a6ce..0000000
Binary files a/figs/sensitivity_comp_ty_z.png and /dev/null differ
diff --git a/figs/sensitivity_dist_dvf.pdf b/figs/sensitivity_dist_dvf.pdf
deleted file mode 100644
index 08457f2..0000000
Binary files a/figs/sensitivity_dist_dvf.pdf and /dev/null differ
diff --git a/figs/sensitivity_dist_dvf.png b/figs/sensitivity_dist_dvf.png
deleted file mode 100644
index 7f9c955..0000000
Binary files a/figs/sensitivity_dist_dvf.png and /dev/null differ
diff --git a/figs/sensitivity_dist_frz.pdf b/figs/sensitivity_dist_frz.pdf
deleted file mode 100644
index 789275d..0000000
Binary files a/figs/sensitivity_dist_frz.pdf and /dev/null differ
diff --git a/figs/sensitivity_dist_frz.png b/figs/sensitivity_dist_frz.png
deleted file mode 100644
index 48b0794..0000000
Binary files a/figs/sensitivity_dist_frz.png and /dev/null differ
diff --git a/figs/sensitivity_dist_fty.pdf b/figs/sensitivity_dist_fty.pdf
deleted file mode 100644
index 0b8a0bd..0000000
Binary files a/figs/sensitivity_dist_fty.pdf and /dev/null differ
diff --git a/figs/sensitivity_dist_fty.png b/figs/sensitivity_dist_fty.png
deleted file mode 100644
index 75332e0..0000000
Binary files a/figs/sensitivity_dist_fty.png and /dev/null differ
diff --git a/figs/sensitivity_dist_gm.pdf b/figs/sensitivity_dist_gm.pdf
deleted file mode 100644
index d38f042..0000000
Binary files a/figs/sensitivity_dist_gm.pdf and /dev/null differ
diff --git a/figs/sensitivity_dist_gm.png b/figs/sensitivity_dist_gm.png
deleted file mode 100644
index 89843c7..0000000
Binary files a/figs/sensitivity_dist_gm.png and /dev/null differ
diff --git a/figs/sensitivity_dist_iff.pdf b/figs/sensitivity_dist_iff.pdf
deleted file mode 100644
index 3952652..0000000
Binary files a/figs/sensitivity_dist_iff.pdf and /dev/null differ
diff --git a/figs/sensitivity_dist_iff.png b/figs/sensitivity_dist_iff.png
deleted file mode 100644
index 04eec02..0000000
Binary files a/figs/sensitivity_dist_iff.png and /dev/null differ
diff --git a/figs/sensitivity_dist_rmc.pdf b/figs/sensitivity_dist_rmc.pdf
deleted file mode 100644
index d8c254d..0000000
Binary files a/figs/sensitivity_dist_rmc.pdf and /dev/null differ
diff --git a/figs/sensitivity_dist_rmc.png b/figs/sensitivity_dist_rmc.png
deleted file mode 100644
index 33f130b..0000000
Binary files a/figs/sensitivity_dist_rmc.png and /dev/null differ
diff --git a/figs/sensitivity_dist_stages.pdf b/figs/sensitivity_dist_stages.pdf
deleted file mode 100644
index 03fc42f..0000000
Binary files a/figs/sensitivity_dist_stages.pdf and /dev/null differ
diff --git a/figs/sensitivity_dist_stages.png b/figs/sensitivity_dist_stages.png
deleted file mode 100644
index 22b34c0..0000000
Binary files a/figs/sensitivity_dist_stages.png and /dev/null differ
diff --git a/figs/sensitivity_dist_stages_dvf.pdf b/figs/sensitivity_dist_stages_dvf.pdf
deleted file mode 100644
index 83b24a2..0000000
Binary files a/figs/sensitivity_dist_stages_dvf.pdf and /dev/null differ
diff --git a/figs/sensitivity_dist_stages_dvf.png b/figs/sensitivity_dist_stages_dvf.png
deleted file mode 100644
index b3942fb..0000000
Binary files a/figs/sensitivity_dist_stages_dvf.png and /dev/null differ
diff --git a/figs/sensitivity_dist_stages_iff.pdf b/figs/sensitivity_dist_stages_iff.pdf
deleted file mode 100644
index 3d46dbf..0000000
Binary files a/figs/sensitivity_dist_stages_iff.pdf and /dev/null differ
diff --git a/figs/sensitivity_dist_stages_iff.png b/figs/sensitivity_dist_stages_iff.png
deleted file mode 100644
index 7b68b5d..0000000
Binary files a/figs/sensitivity_dist_stages_iff.png and /dev/null differ
diff --git a/figs/sensitivity_dist_stages_rmc.pdf b/figs/sensitivity_dist_stages_rmc.pdf
deleted file mode 100644
index 129ec85..0000000
Binary files a/figs/sensitivity_dist_stages_rmc.pdf and /dev/null differ
diff --git a/figs/sensitivity_dist_stages_rmc.png b/figs/sensitivity_dist_stages_rmc.png
deleted file mode 100644
index 91819b6..0000000
Binary files a/figs/sensitivity_dist_stages_rmc.png and /dev/null differ
diff --git a/figs/sensitivity_dist_undamped.pdf b/figs/sensitivity_dist_undamped.pdf
deleted file mode 100644
index 5dad988..0000000
Binary files a/figs/sensitivity_dist_undamped.pdf and /dev/null differ
diff --git a/figs/sensitivity_dist_undamped.png b/figs/sensitivity_dist_undamped.png
deleted file mode 100644
index f58522e..0000000
Binary files a/figs/sensitivity_dist_undamped.png and /dev/null differ
diff --git a/figs/undamped_hac_plant_rotations.pdf b/figs/undamped_hac_plant_rotations.pdf
new file mode 100644
index 0000000..0ffe1f4
Binary files /dev/null and b/figs/undamped_hac_plant_rotations.pdf differ
diff --git a/figs/undamped_hac_plant_rotations.png b/figs/undamped_hac_plant_rotations.png
new file mode 100644
index 0000000..cec5a9a
Binary files /dev/null and b/figs/undamped_hac_plant_rotations.png differ
diff --git a/figs/undamped_hac_plant_translations.pdf b/figs/undamped_hac_plant_translations.pdf
new file mode 100644
index 0000000..eb45213
Binary files /dev/null and b/figs/undamped_hac_plant_translations.pdf differ
diff --git a/figs/undamped_hac_plant_translations.png b/figs/undamped_hac_plant_translations.png
new file mode 100644
index 0000000..fad9e72
Binary files /dev/null and b/figs/undamped_hac_plant_translations.png differ