diff --git a/active_damping/index.html b/active_damping/index.html index df571d9..f8d7a20 100644 --- a/active_damping/index.html +++ b/active_damping/index.html @@ -4,7 +4,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Active Damping applied on the Simscape Model @@ -269,115 +269,113 @@ for the JavaScript code in this tag.

Table of Contents

-First, in section 1, 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 general, three sensors can be used for Active Damping:

-For each of the active damping technique, we will: +First, in section 1, we look at the undamped system and we identify the dynamics from the actuators to the three sensor types. +

+ +

+Then, in section 2, 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:

+ +

+For each of the active damping technique, we: +

+ -

-The disturbances are: -

- - -
-

1 Undamped System

+
+

1 Undamped System

- +

In this section, we identify the dynamic of the system from forces applied in the nano-hexapod legs to the various sensors included in the nano-hexapod that could be use for Active Damping, namely: @@ -436,75 +443,23 @@ After that, a tomography experiment is simulation without any active damping tec

-
-

1.1 Identification of the dynamics for Active Damping

+
+

1.1 Identification of the dynamics for Active Damping

-
-

1.1.1 Initialize the Simulation

+
+

1.1.1 Identification

We initialize all the stages with the default parameters.

-
initializeGround();
-initializeGranite();
-initializeTy();
-initializeRy();
-initializeRz();
-initializeMicroHexapod();
-initializeAxisc();
-initializeMirror();
+
prepareLinearizeIdentification();
 

-The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg. -

-
-
initializeNanoHexapod('actuator', 'piezo');
-initializeSample('mass', 50);
-
-
- -

-We set the references to zero. -

-
-
initializeReferences();
-
-
- -

-No disturbance is included in the system. -

-
-
initializeDisturbances('enable', false);
-
-
- -

-And all the controllers are set to 0. -

-
-
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');
-
-
-
-
- -
-

1.1.2 Identification

-
-

-First, we identify the dynamics of the system using the linearize function. +We identify the dynamics of the system using the linearize function.

%% Options for Linearized
@@ -520,15 +475,13 @@ io(io_i) = linio([mdl, '/Fnl'],           1, '/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'};
 
@@ -542,48 +495,40 @@ G_ine = minreal(G({'Vnlm1', -
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'};
-
-
-

And we save them for further analysis.

save('./active_damping/mat/undamped_plants.mat', 'G_iff', 'G_dvf', 'G_ine');
-save('./active_damping/mat/cart_plants.mat', 'G_cart');
 
-
-

1.1.3 Obtained Plants for Active Damping

-
+
+

1.1.2 Obtained Plants for Active Damping

+
load('./active_damping/mat/undamped_plants.mat', 'G_iff', 'G_dvf', 'G_ine');
 
-
+

nass_active_damping_iff_plant.png

Figure 1: G_iff: Transfer functions from forces applied in the actuators to the force sensor in each actuator (png, pdf)

-
+

nass_active_damping_dvf_plant.png

Figure 2: G_dvf: Transfer functions from forces applied in the actuators to the relative motion sensor in each actuator (png, pdf)

-
+

nass_active_damping_inertial_plant.png

Figure 3: 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 (png, pdf)

@@ -592,14 +537,88 @@ save('./active_damping/mat/cart_plants.mat',
-
-

1.2 Tomography Experiment

+
+

1.2 Identification of the dynamics for High Authority Control

-
-

1.2.1 Simulation

+
+

1.2.1 Identification

+We initialize all the stages with the default parameters. +

+
+
prepareLinearizeIdentification();
+
+
+ +

+We identify the dynamics of the system using the linearize function. +

+
+
%% 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
+
+
+ +
+
masses = [1, 10, 50]; % [kg]
+
+
+ +

+And we save them for further analysis. +

+
+
save('./active_damping/mat/cart_plants.mat', 'G_cart', 'masses');
+
+
+
+
+ +
+

1.2.2 Obtained Plants

+
+
+
load('./active_damping/mat/cart_plants.mat', 'G_cart', 'masses');
+
+
+ + +
+

undamped_hac_plant_translations.png +

+

Figure 4: Undamped Plant - Translations (png, pdf)

+
+ + + +
+

undamped_hac_plant_rotations.png +

+

Figure 5: Undamped Plant - Rotations (png, pdf)

+
+
+
+
+ +
+

1.3 Tomography Experiment

+
+
+
+

1.3.1 Simulation

+
+

We initialize elements for the tomography experiment.

@@ -612,7 +631,7 @@ We change the simulation stop time.

load('mat/conf_simscape.mat');
-set_param(conf_simscape, 'StopTime', '3');
+set_param(conf_simscape, 'StopTime', '4.5');
 
@@ -634,52 +653,53 @@ Finally, we save the simulation results for further analysis
-
-

1.2.2 Results

-
+
+

1.3.2 Results

+

We load the results of tomography experiments.

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];
 
-
+

nass_act_damp_undamped_sim_tomo_trans.png

-

Figure 4: Position Error during tomography experiment - Translations (png, pdf)

+

Figure 6: Position Error during tomography experiment - Translations (png, pdf)

-
+

nass_act_damp_undamped_sim_tomo_rot.png

-

Figure 5: Position Error during tomography experiment - Rotations (png, pdf)

+

Figure 7: Position Error during tomography experiment - Rotations (png, pdf)

-
-

2 Variability of the system dynamics for Active Damping

+
+

2 Variability of the system dynamics for Active Damping

- +

The goal of this section is to study how the dynamics of the Active Damping plants are changing with the experimental conditions. These experimental conditions are:

    -
  • The mass of the sample (section 2.1)
  • -
  • The spindle angle with a null rotating speed (section 2.2)
  • -
  • The spindle rotation speed (section 2.3)
  • -
  • The tilt angle (section 2.4)
  • -
  • The scans of the translation stage (section 2.5)
  • +
  • The mass of the sample (section 2.1)
  • +
  • The spindle angle with a null rotating speed (section 2.2)
  • +
  • The spindle rotation speed (section 2.3)
  • +
  • The tilt angle (section 2.4)
  • +
  • The scans of the translation stage (section 2.5)

@@ -688,15 +708,23 @@ This is done in order for the transient phase to be over.

-
-

2.1 Variation of the Sample Mass

+
+

2.1 Variation of the Sample Mass

- +

For all the identifications, the disturbances are disabled and no controller are used.

+

+We initialize all the stages with the default parameters. +

+
+
prepareLinearizeIdentification();
+
+
+

We identify the dynamics for the following sample mass.

@@ -705,34 +733,42 @@ We identify the dynamics for the following sample mass.
-
+

act_damp_variability_iff_sample_mass.png

-

Figure 6: Variability of the IFF plant with the Sample Mass (png, pdf)

+

Figure 8: Variability of the dynamics from actuator force to force sensor with the Sample Mass (png, pdf)

-
+

act_damp_variability_dvf_sample_mass.png

-

Figure 7: Variability of the DVF plant with the Sample Mass (png, pdf)

+

Figure 9: Variability of the dynamics from actuator force to relative motion sensor with the Sample Mass (png, pdf)

-
+

act_damp_variability_ine_sample_mass.png

-

Figure 8: Variability of the Inertial plant with the Sample Mass (png, pdf)

+

Figure 10: Variability of the dynamics from actuator force to absolute velocity with the Sample Mass (png, pdf)

-
-

2.2 Variation of the Spindle Angle

+
+

2.2 Variation of the Spindle Angle

- +

+

+We initialize all the stages with the default parameters. +

+
+
prepareLinearizeIdentification();
+
+
+

We identify the dynamics for the following Spindle angles.

@@ -741,34 +777,42 @@ We identify the dynamics for the following Spindle angles.
-
+

act_damp_variability_iff_spindle_angle.png

-

Figure 9: Variability of the IFF plant with the Spindle Angle (png, pdf)

+

Figure 11: Variability of the dynamics from the actuator force to the force sensor with the Spindle Angle (png, pdf)

-
+

act_damp_variability_dvf_spindle_angle.png

-

Figure 10: Variability of the DVF plant with the Spindle Angle (png, pdf)

+

Figure 12: Variability of the dynamics from actuator force to relative motion sensor with the Spindle Angle (png, pdf)

-
+

act_damp_variability_ine_spindle_angle.png

-

Figure 11: Variability of the Inertial plant with the Spindle Angle (png, pdf)

+

Figure 13: Variability of the dynamics from actuator force to absolute velocity with the Spindle Angle (png, pdf)

-
-

2.3 Variation of the Spindle Rotation Speed

+
+

2.3 Variation of the Spindle Rotation Speed

- +

+

+We initialize all the stages with the default parameters. +

+
+
prepareLinearizeIdentification();
+
+
+

We identify the dynamics for the following Spindle rotation periods.

@@ -781,79 +825,87 @@ We identify the dynamics for the following Spindle rotation periods. The identification of the dynamics is done at the same Spindle angle position.

-
-

2.3.1 Dynamics of the Active Damping plants

+
+

2.3.1 Dynamics of the Active Damping plants

-
+

act_damp_variability_iff_spindle_speed.png

-

Figure 12: Variability of the IFF plant with the Spindle rotation speed (png, pdf)

+

Figure 14: Variability of the dynamics from the actuator force to the force sensor with the Spindle rotation speed (png, pdf)

-
+

act_damp_variability_iff_spindle_speed_zoom.png

-

Figure 13: Variability of the IFF plant with the Spindle rotation speed (png, pdf)

+

Figure 15: Variability of the dynamics from the actuator force to the force sensor with the Spindle rotation speed (png, pdf)

-
+

act_damp_variability_dvf_spindle_speed.png

-

Figure 14: Variability of the DVF plant with the Spindle rotation speed (png, pdf)

+

Figure 16: Variability of the dynamics from the actuator force to the relative motion sensor with the Spindle rotation speed (png, pdf)

-
+

act_damp_variability_dvf_spindle_speed_zoom.png

-

Figure 15: Variability of the DVF plant with the Spindle rotation speed (png, pdf)

+

Figure 17: Variability of the dynamics from the actuator force to the relative motion sensor with the Spindle rotation speed (png, pdf)

-
+

act_damp_variability_ine_spindle_speed.png

-

Figure 16: Variability of the Inertial plant with the Spindle rotation speed (png, pdf)

+

Figure 18: Variability of the dynamics from the actuator force to the absolute velocity sensor with the Spindle rotation speed (png, pdf)

-
+

act_damp_variability_ine_spindle_speed_zoom.png

-

Figure 17: Variability of the Inertial plant with the Spindle rotation speed (png, pdf)

+

Figure 19: Variability of the dynamics from the actuator force to the absolute velocity sensor with the Spindle rotation speed (png, pdf)

-
-

2.3.2 Variation of the poles and zeros with the Spindle rotation frequency

+
+

2.3.2 Variation of the poles and zeros with the Spindle rotation frequency

-
+

campbell_diagram_spindle_rotation.png

-

Figure 18: Evolution of the pole with respect to the spindle rotation speed (png, pdf)

+

Figure 20: Evolution of the pole with respect to the spindle rotation speed (png, pdf)

-
+

variation_zeros_active_damping_plants.png

-

Figure 19: Evolution of the zero with respect to the spindle rotation speed (png, pdf)

+

Figure 21: Evolution of the zero with respect to the spindle rotation speed (png, pdf)

-
-

2.4 Variation of the Tilt Angle

+
+

2.4 Variation of the Tilt Angle

- +

+

+We initialize all the stages with the default parameters. +

+
+
prepareLinearizeIdentification();
+
+
+

We identify the dynamics for the following Tilt stage angles.

@@ -862,39 +914,47 @@ We identify the dynamics for the following Tilt stage angles.
-
+

act_damp_variability_iff_tilt_angle.png

-

Figure 20: Variability of the IFF plant with the Tilt stage Angle (png, pdf)

+

Figure 22: Variability of the dynamics from the actuator force to the force sensor with the Tilt stage Angle (png, pdf)

-
+

act_damp_variability_dvf_tilt_angle.png

-

Figure 21: Variability of the DVF plant with the Tilt Angle (png, pdf)

+

Figure 23: Variability of the dynamics from the actuator force to the relative motion sensor with the Tilt Angle (png, pdf)

-
+

act_damp_variability_ine_tilt_angle.png

-

Figure 22: Variability of the Inertial plant with the Tilt Angle (png, pdf)

+

Figure 24: Variability of the dynamics from the actuator force to the absolute velocity sensor with the Tilt Angle (png, pdf)

-
-

2.5 Scans of the Translation Stage

+
+

2.5 Scans of the Translation Stage

- +

We want here to verify if the dynamics used for Active damping is varying when using the translation stage for scans.

-We initialize the translation stage reference to be a sinus with an amplitude of 5mm and a period of 1s (Figure 23). +We initialize all the stages with the default parameters. +

+
+
prepareLinearizeIdentification();
+
+
+ +

+We initialize the translation stage reference to be a sinus with an amplitude of 5mm and a period of 1s (Figure 25).

initializeReferences('Dy_type', 'sinusoidal', ...
@@ -904,10 +964,10 @@ We initialize the translation stage reference to be a sinus with an amplitude of
 
-
+

ty_scanning_reference_sinus.png

-

Figure 23: Reference path for the translation stage (png, pdf)

+

Figure 25: Reference path for the translation stage (png, pdf)

@@ -918,32 +978,32 @@ We identify the dynamics at different positions (times) when scanning with the T

-
+

act_damp_variability_iff_ty_scans.png

-

Figure 24: Variability of the IFF plant at different Ty scan positions (png, pdf)

+

Figure 26: Variability of the dynamics from the actuator force to the absolute velocity sensor plant at different Ty scan positions (png, pdf)

-
+

act_damp_variability_dvf_ty_scans.png

-

Figure 25: Variability of the DVF plant at different Ty scan positions (png, pdf)

+

Figure 27: Variability of the dynamics from actuator force to relative displacement sensor at different Ty scan positions (png, pdf)

-
+

act_damp_variability_ine_ty_scans.png

-

Figure 26: Variability of the Inertial plant at different Ty scan positions (png, pdf)

+

Figure 28: Variability of the Inertial plant at different Ty scan positions (png, pdf)

-
-

2.6 Conclusion

+
+

2.6 Conclusion

- +
@@ -1000,11 +1060,11 @@ Thus, the developed damping techniques should be robust to variations of the sam -
-

3 Integral Force Feedback

+
+

3 Integral Force Feedback

- +

@@ -1021,23 +1081,23 @@ The IFF control is applied in a decentralized way: there is on controller for ea

-The control architecture is represented in figure 27 where one of the 6 nano-hexapod legs is represented. +The control architecture is represented in figure 29 where one of the 6 nano-hexapod legs is represented.

-
+

iff_1dof.png

-

Figure 27: Integral Force Feedback applied to a 1dof system

+

Figure 29: Integral Force Feedback applied to a 1dof system

-
-

3.1 Control Design

+
+

3.1 Control Design

-
-

3.1.1 Plant

+
+

3.1.1 Plant

Let’s load the previously identified undamped plant: @@ -1049,20 +1109,20 @@ load('./active_damping/mat/plants_variable.mat',

-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 28). +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 30).

-
+

iff_plant.png

-

Figure 28: Transfer function from forces applied in the legs to force sensor (png, pdf)

+

Figure 30: Transfer function from forces applied in the legs to force sensor (png, pdf)

-
-

3.1.2 Control Design

+
+

3.1.2 Control Design

The controller for each pair of actuator/sensor is: @@ -1074,20 +1134,20 @@ K_iff = -5000/s

-The corresponding loop gains are shown in figure 29. +The corresponding loop gains are shown in figure 31.

-
+

iff_open_loop.png

-

Figure 29: Loop Gain for the Integral Force Feedback (png, pdf)

+

Figure 31: Loop Gain for the Integral Force Feedback (png, pdf)

-
-

3.1.3 Diagonal Controller

+
+

3.1.3 Diagonal Controller

We create the diagonal controller and we add a minus sign as we have a positive @@ -1109,12 +1169,12 @@ We save the controller for further analysis.

-
-

3.2 Tomography Experiment

+
+

3.2 Tomography Experiment

-
-

3.2.1 Simulation with IFF Controller

+
+

3.2.1 Simulation with IFF Controller

We initialize elements for the tomography experiment. @@ -1138,7 +1198,7 @@ We change the simulation stop time.

load('mat/conf_simscape.mat');
-set_param(conf_simscape, 'StopTime', '3');
+set_param(conf_simscape, 'StopTime', '4.5');
 
@@ -1162,97 +1222,39 @@ save('./active_damping/mat/tomo_exp.mat',
-
-

3.2.2 Simulation with IFF Controller with added High Pass Filter

+
+

3.2.2 Compare with Undamped system

-

-We initialize elements for the tomography experiment. -

-
-
prepareTomographyExperiment();
-
-
-

-We set the IFF controller with the High Pass Filter. -

-
-
load('./active_damping/mat/K_iff_hpf.mat', 'K_iff');
-save('./mat/controllers.mat', 'K_iff', '-append');
-
-
- -

-We change the simulation stop time. -

-
-
load('mat/conf_simscape.mat');
-set_param(conf_simscape, 'StopTime', '3');
-
-
- -

-And we simulate the system. -

-
-
sim('sim_nass_active_damping');
-
-
- -

-Finally, we save the simulation results for further analysis -

-
-
En_iff_hpf = En;
-Eg_iff_hpf = Eg;
-save('./active_damping/mat/tomo_exp.mat', 'En_iff_hpf', 'Eg_iff_hpf', '-append');
-
-
-
-
- -
-

3.2.3 Compare with Undamped system

-
-

-We load the results of tomography experiments. -

-
-
load('./active_damping/mat/tomo_exp.mat', 'En', 'En_iff', 'En_iff_hpf');
-t = linspace(0, 3, length(En(:,1)));
-
-
- - -
+

nass_act_damp_iff_sim_tomo_xy.png

-

Figure 30: Position Error during tomography experiment - XY Motion (png, pdf)

+

Figure 32: Position Error during tomography experiment - XY Motion (png, pdf)

-
+

nass_act_damp_iff_sim_tomo_trans.png

-

Figure 31: Position Error during tomography experiment - Translations (png, pdf)

+

Figure 33: Position Error during tomography experiment - Translations (png, pdf)

-
+

nass_act_damp_iff_sim_tomo_rot.png

-

Figure 32: Position Error during tomography experiment - Rotations (png, pdf)

+

Figure 34: Position Error during tomography experiment - Rotations (png, pdf)

-
-

3.3 Conclusion

+
+

3.3 Conclusion

-Integral Force Feedback: +Integral Force Feedback using a force sensor:

  • Robust (guaranteed stability)
  • @@ -1265,11 +1267,11 @@ Integral Force Feedback:
-
-

4 Direct Velocity Feedback

+
+

4 Direct Velocity Feedback

- +

@@ -1283,61 +1285,62 @@ The actuator displacement can be measured with a capacitive sensor for instance.

-
-

4.1 Control Design

+
+

4.1 Control Design

-
-

4.1.1 Plant

+
+

4.1.1 Plant

Let’s load the undamped plant:

load('./active_damping/mat/undamped_plants.mat', 'G_dvf');
+load('./active_damping/mat/plants_variable.mat', 'masses', 'Gm_dvf');
 

-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 33). +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 35).

-
+

dvf_plant.png

-

Figure 33: Transfer function from forces applied in the legs to leg displacement sensor (png, pdf)

+

Figure 35: Transfer function from forces applied in the legs to leg displacement sensor (png, pdf)

-
-

4.1.2 Control Design

+
+

4.1.2 Control Design

The Direct Velocity Feedback is defined below. A Low pass Filter is added to make the controller transfer function proper.

-
K_dvf = s*20000/(1 + s/2/pi/10000);
+
K_dvf = s*30000/(1 + s/2/pi/10000);
 

-The obtained loop gains are shown in figure 34. +The obtained loop gains are shown in figure 36.

-
+

dvf_open_loop.png

-

Figure 34: Loop Gain for the Integral Force Feedback (png, pdf)

+

Figure 36: Loop Gain for the Integral Force Feedback (png, pdf)

-
-

4.1.3 Diagonal Controller

+
+

4.1.3 Diagonal Controller

We create the diagonal controller and we add a minus sign as we have a positive feedback architecture. @@ -1358,12 +1361,12 @@ We save the controller for further analysis.

-
-

4.2 Tomography Experiment

+
+

4.2 Tomography Experiment

-
-

4.2.1 Initialize the Simulation

+
+

4.2.1 Initialize the Simulation

We initialize elements for the tomography experiment. @@ -1381,18 +1384,13 @@ We set the DVF controller. save('./mat/controllers.mat', 'K_dvf', '-append');

-
-
-
-

4.2.2 Simulation

-

We change the simulation stop time.

load('mat/conf_simscape.mat');
-set_param(conf_simscape, 'StopTime', '3');
+set_param(conf_simscape, 'StopTime', '4.5');
 
@@ -1416,51 +1414,42 @@ save('./active_damping/mat/tomo_exp.mat',
-
-

4.2.3 Compare with Undamped system

-
-

-We load the results of tomography experiments. -

-
-
load('./active_damping/mat/tomo_exp.mat', 'En', 'En_dvf');
-t = linspace(0, 3, length(En(:,1)));
-
-
+
+

4.2.2 Compare with Undamped system

+
- -
+

nass_act_damp_dvf_sim_tomo_xy.png

-

Figure 35: Position Error during tomography experiment - XY Motion (png, pdf)

+

Figure 37: Position Error during tomography experiment - XY Motion (png, pdf)

-
+

nass_act_damp_dvf_sim_tomo_trans.png

-

Figure 36: Position Error during tomography experiment - Translations (png, pdf)

+

Figure 38: Position Error during tomography experiment - Translations (png, pdf)

-
+

nass_act_damp_dvf_sim_tomo_rot.png

-

Figure 37: Position Error during tomography experiment - Rotations (png, pdf)

+

Figure 39: Position Error during tomography experiment - Rotations (png, pdf)

-
-

4.3 Conclusion

+
+

4.3 Conclusion

-Direct Velocity Feedback: +Direct Velocity Feedback using a relative motion sensor:

    -
  • +
  • Robust (guaranteed stability)
@@ -1468,11 +1457,11 @@ Direct Velocity Feedback:
-
-

5 Inertial Control

+
+

5 Inertial Control

- +

@@ -1485,57 +1474,58 @@ In Inertial Control, a feedback is applied between the measured absolute

-
-

5.1 Control Design

+
+

5.1 Control Design

-
-

5.1.1 Plant

+
+

5.1.1 Plant

Let’s load the undamped plant:

load('./active_damping/mat/undamped_plants.mat', 'G_ine');
+load('./active_damping/mat/plants_variable.mat', 'masses', 'Gm_ine');
 

-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 38). +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 40).

-
+

ine_plant.png

-

Figure 38: Transfer function from forces applied in the legs to leg velocity sensor (png, pdf)

+

Figure 40: Transfer function from forces applied in the legs to leg velocity sensor (png, pdf)

-
-

5.1.2 Control Design

+
+

5.1.2 Control Design

-The controller is defined below and the obtained loop gain is shown in figure 39. +The controller is defined below and the obtained loop gain is shown in figure 41.

-
K_ine = 1e4/(1+s/(2*pi*100));
+
K_ine = 2.5e4;
 
-
+

ine_open_loop_gain.png

-

Figure 39: Loop Gain for Inertial Control (png, pdf)

+

Figure 41: Loop Gain for Inertial Control (png, pdf)

-
-

5.1.3 Diagonal Controller

+
+

5.1.3 Diagonal Controller

We create the diagonal controller and we add a minus sign as we have a positive feedback architecture. @@ -1556,106 +1546,12 @@ We save the controller for further analysis.

-
-

5.2 Tomography Experiment

+
+

5.2 Conclusion

-
-
-

5.2.1 Initialize the Simulation

-
-

-We initialize elements for the tomography experiment. -

-
-
prepareTomographyExperiment();
-
-
- -

-We set the Inertial controller. -

-
-
load('./active_damping/mat/K_ine.mat', 'K_ine');
-save('./mat/controllers.mat', 'K_ine', '-append');
-
-
-
-
- -
-

5.2.2 Simulation

-
-

-We change the simulation stop time. -

-
-
load('mat/conf_simscape.mat');
-set_param(conf_simscape, 'StopTime', '3');
-
-
- -

-And we simulate the system. -

-
-
sim('sim_nass_active_damping');
-
-
- -

-Finally, we save the simulation results for further analysis -

-
-
En_ine = En;
-Eg_ine = Eg;
-save('./active_damping/mat/tomo_exp.mat', 'En_ine', 'Eg_ine', '-append');
-
-
-
-
- -
-

5.2.3 Compare with Undamped system

-
-

-We load the results of tomography experiments. -

-
-
load('./active_damping/mat/tomo_exp.mat', 'En', 'En_ine');
-t = linspace(0, 3, length(En_ine(:,1)));
-
-
- - -
-

nass_act_damp_ine_sim_tomo_xy.png -

-

Figure 40: Position Error during tomography experiment - XY Motion (png, pdf)

-
- - -
-

nass_act_damp_ine_sim_tomo_trans.png -

-

Figure 41: Position Error during tomography experiment - Translations (png, pdf)

-
- - -
-

nass_act_damp_ine_sim_tomo_rot.png -

-

Figure 42: Position Error during tomography experiment - Rotations (png, pdf)

-
-
-
-
- -
-

5.3 Conclusion

-

-Inertial Control: +Inertial Control should not be used.

@@ -1663,15 +1559,15 @@ Inertial Control:
-
-

6 Comparison

+
+

6 TODO Comparison

- +

-
-

6.1 Load the plants

+
+

6.1 Load the plants

load('./active_damping/mat/plants.mat', 'G', 'G_iff', 'G_ine', 'G_dvf');
@@ -1680,177 +1576,179 @@ Inertial Control:
 
-
-

6.2 Sensitivity to Disturbance

+
+

6.2 TODO Sensitivity to Disturbance

-
+

sensitivity_comp_ground_motion_z.png

-

Figure 43: Sensitivity to ground motion in the Z direction on the Z motion error (png, pdf)

+

Figure 42: Sensitivity to ground motion in the Z direction on the Z motion error (png, pdf)

-
+

sensitivity_comp_direct_forces_z.png

-

Figure 44: Compliance in the Z direction: Sensitivity of direct forces applied on the sample in the Z direction on the Z motion error (png, pdf)

+

Figure 43: Compliance in the Z direction: Sensitivity of direct forces applied on the sample in the Z direction on the Z motion error (png, pdf)

-
+

sensitivity_comp_spindle_z.png

-

Figure 45: Sensitivity to forces applied in the Z direction by the Spindle on the Z motion error (png, pdf)

+

Figure 44: Sensitivity to forces applied in the Z direction by the Spindle on the Z motion error (png, pdf)

-
+

sensitivity_comp_ty_z.png

-

Figure 46: Sensitivity to forces applied in the Z direction by the Y translation stage on the Z motion error (png, pdf)

+

Figure 45: Sensitivity to forces applied in the Z direction by the Y translation stage on the Z motion error (png, pdf)

-
+

sensitivity_comp_ty_x.png

-

Figure 47: Sensitivity to forces applied in the X direction by the Y translation stage on the X motion error (png, pdf)

+

Figure 46: Sensitivity to forces applied in the X direction by the Y translation stage on the X motion error (png, pdf)

-
-

6.3 Damped Plant

+
+

6.3 TODO Damped Plant

-
+

plant_comp_damping_z.png

-

Figure 48: Plant for the \(z\) direction for different active damping technique used (png, pdf)

+

Figure 47: Plant for the \(z\) direction for different active damping technique used (png, pdf)

-
+

plant_comp_damping_x.png

-

Figure 49: Plant for the \(x\) direction for different active damping technique used (png, pdf)

+

Figure 48: Plant for the \(x\) direction for different active damping technique used (png, pdf)

-
+

plant_comp_damping_coupling.png

-

Figure 50: Comparison of one off-diagonal plant for different damping technique applied (png, pdf)

+

Figure 49: Comparison of one off-diagonal plant for different damping technique applied (png, pdf)

-
-

6.4 Tomography Experiment

+
+

6.4 Tomography Experiment - Frequency Domain analysis

-
-
-

6.4.1 Load the Simulation Data

-
-
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];
 
-
+ +

+We remove the first 0.5 seconds where the transient behavior is fading out. +

+
+
[~, 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, :);
+
-
-

6.4.2 Frequency Domain Analysis

-

Window used for pwelch function.

-
n_av = 8;
+
n_av = 4;
 han_win = hanning(ceil(length(En(:, 1))/n_av));
 
-
+

act_damp_tomo_exp_comp_psd_trans.png

-

Figure 51: PSD of the translation errors in the X direction for applied Active Damping techniques (png, pdf)

+

Figure 50: PSD of the translation errors in the X direction for applied Active Damping techniques (png, pdf)

-
+

act_damp_tomo_exp_comp_psd_rot.png

-

Figure 52: PSD of the rotation errors in the X direction for applied Active Damping techniques (png, pdf)

+

Figure 51: PSD of the rotation errors in the X direction for applied Active Damping techniques (png, pdf)

-
+

act_damp_tomo_exp_comp_cps_trans.png

-

Figure 53: CPS of the translation errors in the X direction for applied Active Damping techniques (png, pdf)

+

Figure 52: CPS of the translation errors in the X direction for applied Active Damping techniques (png, pdf)

-
+

act_damp_tomo_exp_comp_cps_rot.png

-

Figure 54: CPS of the rotation errors in the X direction for applied Active Damping techniques (png, pdf)

-
+

Figure 53: CPS of the rotation errors in the X direction for applied Active Damping techniques (png, pdf)

-
-

7 Useful Functions

+
+

7 Useful Functions

-
-

7.1 prepareTomographyExperiment

+
+

7.1 prepareLinearizeIdentification

- +

-This Matlab function is accessible here. +This Matlab function is accessible here.

-
-

Function Description

-
+
+

Function Description

+
-
function [] = prepareTomographyExperiment(args)
+
function [] = prepareLinearizeIdentification(args)
 
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     args.nass_actuator       char   {mustBeMember(args.nass_actuator,{'piezo', 'lorentz'})} = 'piezo'
     args.sample_mass   (1,1) double {mustBeNumeric, mustBePositive} = 50 % [kg]
-    args.Rz_period     (1,1) double {mustBeNumeric, mustBePositive} = 1 % [s]
 end
 
-
-

Initialize the Simulation

-
+
+

Initialize the Simulation

+

We initialize all the stages with the default parameters.

@@ -1876,13 +1774,108 @@ initializeSample('mass', args.sample_mass);

-We set the references to zero. +We set the references and disturbances to zero. +

+
+
initializeReferences();
+initializeDisturbances('enable', false);
+
+
+ +

+And all the controllers are set to 0. +

+
+
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');
+
+
+
+
+
+ +
+

7.2 prepareTomographyExperiment

+
+

+ +

+ +

+This Matlab function is accessible here. +

+
+ +
+

Function Description

+
+
+
function [] = prepareTomographyExperiment(args)
+
+
+
+
+ +
+

Optional Parameters

+
+
+
arguments
+    args.nass_actuator       char   {mustBeMember(args.nass_actuator,{'piezo', 'lorentz'})} = 'piezo'
+    args.sample_mass   (1,1) double {mustBeNumeric, mustBePositive} = 50 % [kg]
+    args.Rz_period     (1,1) double {mustBeNumeric, mustBePositive} = 1 % [s]
+end
+
+
+
+
+ +
+

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
Table 1: Conclusion on the variability of the system dynamics for active damping