From ff8df3a9d0abb7d0f573fb48f795bede426a4e01 Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Thu, 24 Oct 2019 17:45:30 +0200 Subject: [PATCH] Add uniaxial folder with analysis of active damping techniques --- index.html | 653 ++++++------- index.org | 1 + simscape/sim_nano_station_uniaxial.slx | Bin 0 -> 132281 bytes uniaxial/figs | 1 + uniaxial/index.html | 1039 +++++++++++++++++++++ uniaxial/index.org | 1191 ++++++++++++++++++++++++ uniaxial/mat/plants.mat | Bin 0 -> 16092 bytes 7 files changed, 2559 insertions(+), 326 deletions(-) create mode 100644 simscape/sim_nano_station_uniaxial.slx create mode 120000 uniaxial/figs create mode 100644 uniaxial/index.html create mode 100644 uniaxial/index.org create mode 100644 uniaxial/mat/plants.mat diff --git a/index.html b/index.html index e89eeb4..d39275b 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Simscape Model of the Nano-Active-Stabilization-System @@ -258,69 +258,69 @@ for the JavaScript code in this tag.

Table of Contents

@@ -329,6 +329,7 @@ for the JavaScript code in this tag. -
-

1 Simulink project

+
+

1 Simulink project

From the Simulink project mathworks page: @@ -374,8 +375,8 @@ The startup script is defined below and is exported to the project_startup

freqs = logspace(-1, 3, 1000);
-save_fig = false;
-save('./mat/config.mat', 'freqs', 'save_fig');
+save_fig = false;
+save('./mat/config.mat', 'freqs', 'save_fig');
 
 project = simulinkproject;
 projectRoot = project.RootFolder;
@@ -383,10 +384,10 @@ projectRoot = project.RootFolder;
 myCacheFolder = fullfile(projectRoot, '.SimulinkCache');
 myCodeFolder = fullfile(projectRoot, '.SimulinkCode');
 
-Simulink.fileGenControl('set',...
-    'CacheFolder', myCacheFolder,...
-    'CodeGenFolder', myCodeFolder,...
-    'createDir', true);
+Simulink.fileGenControl('set',...
+    'CacheFolder', myCacheFolder,...
+    'CodeGenFolder', myCodeFolder,...
+    'createDir', true);
 
@@ -404,8 +405,8 @@ The project also permits to automatically add defined folder to the path when th
-
-

2 Simscape Model

+
+

2 Simscape Model

A simscape model permits to model multi-physics systems. @@ -416,8 +417,8 @@ A simscape model per

-
-

2.1 Solid bodies

+
+

2.1 Solid bodies

Each solid body is represented by a solid block. @@ -426,8 +427,8 @@ The geometry of the solid body can be imported using a step file. T

-
-

2.2 Frames

+
+

2.2 Frames

Frames are very important in simscape multibody, they defined where the forces are applied, where the joints are located and where the measurements are made. @@ -439,8 +440,8 @@ They can be defined from the solid body geometry, or using the -

2.3 Joints

+
+

2.3 Joints

Solid Bodies are connected with joints (between frames of the two solid bodies). @@ -450,7 +451,7 @@ Solid Bodies are connected with joints (between frames of the two solid bodies). There are various types of joints that are all described here.

- +
@@ -583,7 +584,7 @@ Joint blocks are assortments of joint primitives:
  • Constant Velocity: Allows rotation at constant velocity between intersection through arbitrarily aligned shafts: CV
  • -
    Table 1: Degrees of freedom associated with each joint
    +
    @@ -875,8 +876,8 @@ Composite Force/Torque sensing: -
    -

    2.4 Measurements

    +
    +

    2.4 Measurements

    A transform sensor block measures the spatial relationship between two frames: the base B and the follower F. @@ -900,8 +901,8 @@ If we want to simulate an inertial sensor, we just have to choose B

    -
    -

    2.5 Excitation

    +
    +

    2.5 Excitation

    We can apply external forces to the model by using an external force and torque block. @@ -914,12 +915,12 @@ Internal force, acting reciprocally between base and following origins is implem

    -
    -

    3 Notes

    +
    +

    3 Notes

    -
    -

    3.1 Simscape files for identification

    +
    +

    3.1 Simscape files for identification

    Table 2: Joint primitives for each joint type
    @@ -988,12 +989,12 @@ Internal force, acting reciprocally between base and following origins is implem -
    -

    3.2 Inputs

    +
    +

    3.2 Inputs

    -
    -

    3.2.1 Perturbations

    +
    +

    3.2.1 Perturbations

    @@ -1041,8 +1042,8 @@ Internal force, acting reciprocally between base and following origins is implem -
    -

    3.2.2 Measurement Noise

    +
    +

    3.2.2 Measurement Noise

    @@ -1076,8 +1077,8 @@ Internal force, acting reciprocally between base and following origins is implem -
    -

    3.2.3 Control Inputs

    +
    +

    3.2.3 Control Inputs

    @@ -1201,8 +1202,8 @@ Internal force, acting reciprocally between base and following origins is implem -
    -

    3.3 Outputs

    +
    +

    3.3 Outputs

    @@ -1320,8 +1321,8 @@ Internal force, acting reciprocally between base and following origins is implem -
    -

    4 Simulink files

    +
    +

    4 Simulink files

    Few different Simulink files are used: @@ -1335,44 +1336,44 @@ Few different Simulink files are used:

    -
    -

    5 Simulink Library

    +
    +

    5 Simulink Library

    A simulink library is developed in order to share elements between the different simulink files.

    -
    -

    5.1 inputs

    +
    +

    5.1 inputs

    -
    -

    5.2 nasslibrary

    +
    +

    5.2 nasslibrary

    -
    -

    5.3 poserrorwrtnassbase

    +
    +

    5.3 poserrorwrtnassbase

    -
    -

    5.4 QuaternionToAngles

    +
    +

    5.4 QuaternionToAngles

    -
    -

    5.5 RotationMatrixToAngle

    +
    +

    5.5 RotationMatrixToAngle

    -
    -

    6 Scripts

    +
    +

    6 Scripts

    -
    -

    6.1 Simulation Initialization

    +
    +

    6.1 Simulation Initialization

    - +

    @@ -1396,15 +1397,15 @@ load( -

    7 Functions

    +
    +

    7 Functions

    -
    -

    7.1 computePsdDispl

    +
    +

    7.1 computePsdDispl

    - +

    @@ -1426,24 +1427,24 @@ This Matlab function is accessible here. [pry, ~] = pwelch(sys_data.Ry(i_init:end, :), han_win, [], [], Fs); [prz, ~] = pwelch(sys_data.Rz(i_init:end, :), han_win, [], [], Fs); - psd_object = struct(... - 'f', f, ... - 'dx', pdx, ... - 'dy', pdy, ... - 'dz', pdz, ... - 'rx', prx, ... - 'ry', pry, ... + psd_object = struct(... + 'f', f, ... + 'dx', pdx, ... + 'dy', pdy, ... + 'dz', pdz, ... + 'rx', prx, ... + 'ry', pry, ... 'rz', prz); end

    -
    -

    7.2 computeSetpoint

    +
    +

    7.2 computeSetpoint

    - +

    @@ -1514,11 +1515,11 @@ setpoint( -

    7.3 converErrorBasis

    +
    +

    7.3 converErrorBasis

    - +

    @@ -1546,11 +1547,11 @@ This Matlab function is accessible here. %% If line vector => column vector if size(pos, 2) == 6 - pos = pos'; + pos = pos'; end if size(setpoint, 2) == 6 - setpoint = setpoint'; + setpoint = setpoint'; end %% Position of the sample in the frame fixed to the Granite @@ -1655,11 +1656,11 @@ error_nass = [dx; dy; dz; th

    -
    -

    7.4 generateDiagPidControl

    + -
    -

    7.5 identifyPlant

    +
    +

    7.5 identifyPlant

    - +

    @@ -1706,7 +1707,7 @@ This Matlab function is accessible here. opts = struct(); %% Populate opts with input parameters - if exist('opts_param','var') + if exist('opts_param','var') for opt = fieldnames(opts_param)' opts.(opt{1}) = opts_param.(opt{1}); end @@ -1720,49 +1721,49 @@ This Matlab function is accessible here. mdl = 'sim_nano_station_id'; %% Input/Output definition - io(1) = linio([mdl, '/Fn'], 1, 'input'); % Cartesian forces applied by NASS - io(2) = linio([mdl, '/Dw'], 1, 'input'); % Ground Motion - io(3) = linio([mdl, '/Fs'], 1, 'input'); % External forces on the sample - io(4) = linio([mdl, '/Fnl'], 1, 'input'); % Forces applied on the NASS's legs - io(5) = linio([mdl, '/Dsm'], 1, 'output'); % Displacement of the sample - io(6) = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs - io(7) = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs - io(8) = linio([mdl, '/Es'], 1, 'output'); % Position Error w.r.t. NASS base + io(1) = linio([mdl, '/Fn'], 1, 'input'); % Cartesian forces applied by NASS + io(2) = linio([mdl, '/Dw'], 1, 'input'); % Ground Motion + io(3) = linio([mdl, '/Fs'], 1, 'input'); % External forces on the sample + io(4) = linio([mdl, '/Fnl'], 1, 'input'); % Forces applied on the NASS's legs + io(5) = linio([mdl, '/Dsm'], 1, 'output'); % Displacement of the sample + io(6) = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs + io(7) = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs + io(8) = linio([mdl, '/Es'], 1, 'output'); % Position Error w.r.t. NASS base %% Run the linearization G = linearize(mdl, io, 0); - G.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz', ... - 'Dgx', 'Dgy', 'Dgz', ... - 'Fsx', 'Fsy', 'Fsz', 'Msx', 'Msy', 'Msz', ... - 'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; - G.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz', ... - 'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6', ... - 'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6', ... - 'Edx', 'Rdy', 'Edz', 'Erx', 'Ery', 'Erz'}; + G.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz', ... + 'Dgx', 'Dgy', 'Dgz', ... + 'Fsx', 'Fsy', 'Fsz', 'Msx', 'Msy', 'Msz', ... + 'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; + G.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz', ... + 'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6', ... + 'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6', ... + 'Edx', 'Rdy', 'Edz', 'Erx', 'Ery', 'Erz'}; %% Create the sub transfer functions % From forces applied in the cartesian frame to displacement of the sample in the cartesian frame - sys.G_cart = minreal(G({'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'}, {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'})); + sys.G_cart = minreal(G({'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'}, {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'})); % From ground motion to Sample displacement - sys.G_gm = minreal(G({'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'}, {'Dgx', 'Dgy', 'Dgz'})); + sys.G_gm = minreal(G({'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'}, {'Dgx', 'Dgy', 'Dgz'})); % From direct forces applied on the sample to displacement of the sample - sys.G_fs = minreal(G({'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'}, {'Fsx', 'Fsy', 'Fsz', 'Msx', 'Msy', 'Msz'})); + sys.G_fs = minreal(G({'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'}, {'Fsx', 'Fsy', 'Fsz', 'Msx', 'Msy', 'Msz'})); % From forces applied on NASS's legs to force sensor in each leg - sys.G_iff = minreal(G({'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'})); + sys.G_iff = minreal(G({'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'})); % From forces applied on NASS's legs to displacement of each leg - sys.G_dleg = minreal(G({'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'})); + sys.G_dleg = minreal(G({'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'})); % From forces applied on NASS's legs to displacement of each leg - sys.G_plant = minreal(G({'Edx', 'Rdy', 'Edz', 'Erx', 'Ery', 'Erz'}, {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'})); + sys.G_plant = minreal(G({'Edx', 'Rdy', 'Edz', 'Erx', 'Ery', 'Erz'}, {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'})); end

    -
    -

    7.6 runSimulation

    +
    +

    7.6 runSimulation

    - +

    @@ -1772,17 +1773,17 @@ This Matlab function is accessible here.

    function [] = runSimulation(sys_name, sys_mass, ctrl_type, act_damp)
         %% Load the controller and save it for the simulation
    -    if strcmp(ctrl_type, 'cl') && strcmp(act_damp, 'none')
    +    if strcmp(ctrl_type, 'cl') && strcmp(act_damp, 'none')
           K_obj = load('./mat/K_fb.mat');
           K = K_obj.(sprintf('K_%s_%s', sys_mass, sys_name)); %#ok
    -      save('./mat/controllers.mat', 'K');
    -    elseif strcmp(ctrl_type, 'cl') && strcmp(act_damp, 'iff')
    +      save('./mat/controllers.mat', 'K');
    +    elseif strcmp(ctrl_type, 'cl') && strcmp(act_damp, 'iff')
           K_obj = load('./mat/K_fb_iff.mat');
           K = K_obj.(sprintf('K_%s_%s_iff', sys_mass, sys_name)); %#ok
    -      save('./mat/controllers.mat', 'K');
    +      save('./mat/controllers.mat', 'K');
         elseif strcmp(ctrl_type, 'ol')
           K = tf(zeros(6)); %#ok
    -      save('./mat/controllers.mat', 'K');
    +      save('./mat/controllers.mat', 'K');
         else
           error('ctrl_type should be cl or ol');
         end
    @@ -1791,17 +1792,17 @@ This Matlab function is accessible here.
         if strcmp(act_damp, 'iff')
           K_iff_crit = load('./mat/K_iff_crit.mat');
           K_iff = K_iff_crit.(sprintf('K_iff_%s_%s', sys_mass, sys_name)); %#ok
    -      save('./mat/controllers.mat', 'K_iff', '-append');
    +      save('./mat/controllers.mat', 'K_iff', '-append');
         elseif strcmp(act_damp, 'none')
           K_iff = tf(zeros(6)); %#ok
    -      save('./mat/controllers.mat', 'K_iff', '-append');
    +      save('./mat/controllers.mat', 'K_iff', '-append');
         end
     
         %%
         if strcmp(sys_name, 'pz')
    -      initializeNanoHexapod(struct('actuator', 'piezo'));
    +      initializeNanoHexapod(struct('actuator', 'piezo'));
         elseif strcmp(sys_name, 'vc')
    -      initializeNanoHexapod(struct('actuator', 'lorentz'));
    +      initializeNanoHexapod(struct('actuator', 'lorentz'));
         else
           error('sys_name should be pz or vc');
         end
    @@ -1823,23 +1824,23 @@ This Matlab function is accessible here.
     
         %% Save the result
         filename = sprintf('sim_%s_%s_%s_%s', sys_mass, sys_name, ctrl_type, act_damp);
    -    save(sprintf('./mat/%s.mat', filename), ...
    -        'time', 'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz', 'K');
    +    save(sprintf('./mat/%s.mat', filename), ...
    +        'time', 'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz', 'K');
     end
     
    -
    -

    8 Initialize Elements

    +
    +

    8 Initialize Elements

    -
    -

    8.1 Simulation Configuration

    +
    +

    8.1 Simulation Configuration

    - +

    @@ -1849,14 +1850,14 @@ This Matlab function is accessible here.

    function [] = initializeSimConf(opts_param)
         %% Default values for opts
    -    opts = struct('Ts',      1e-4,  ... % Sampling time [s]
    -                  'Tsim',    10,    ... % Simulation time [s]
    -                  'cl_time', 0,     ... % Close Loop time [s]
    -                  'gravity', false  ... % Gravity along the z axis
    +    opts = struct('Ts',      1e-4,  ... % Sampling time [s]
    +                  'Tsim',    10,    ... % Simulation time [s]
    +                  'cl_time', 0,     ... % Close Loop time [s]
    +                  'gravity', false  ... % Gravity along the z axis
         );
     
         %% Populate opts with input parameters
    -    if exist('opts_param','var')
    +    if exist('opts_param','var')
             for opt = fieldnames(opts_param)'
                 opts.(opt{1}) = opts_param.(opt{1});
             end
    @@ -1878,18 +1879,18 @@ This Matlab function is accessible here.
         end
     
         %% Save
    -    save('./mat/sim_conf.mat', 'sim_conf');
    +    save('./mat/sim_conf.mat', 'sim_conf');
     end
     
    -
    -

    8.2 Experiment

    +
    +

    8.2 Experiment

    - +

    @@ -1899,21 +1900,21 @@ This Matlab function is accessible here

    function [] = initializeExperiment(exp_name, sys_mass)
         if strcmp(exp_name, 'tomography')
    -        opts_sim = struct(...
    -            'Tsim',    5, ...
    -            'cl_time', 5  ...
    +        opts_sim = struct(...
    +            'Tsim',    5, ...
    +            'cl_time', 5  ...
             );
             initializeSimConf(opts_sim);
     
             if strcmp(sys_mass, 'light')
    -            opts_inputs = struct(...
    -                'Dw', true,  ...
    -                'Rz', 60     ... % rpm
    +            opts_inputs = struct(...
    +                'Dw', true,  ...
    +                'Rz', 60     ... % rpm
                 );
             elseif strcpm(sys_mass, 'heavy')
    -            opts_inputs = struct(...
    -                'Dw', true,  ...
    -                'Rz', 1     ... % rpm
    +            opts_inputs = struct(...
    +                'Dw', true,  ...
    +                'Rz', 1     ... % rpm
                 );
             else
                 error('sys_mass should be light or heavy');
    @@ -1929,11 +1930,11 @@ This Matlab function is accessible here
     
    -
    -

    8.3 Inputs

    +
    +

    8.3 Inputs

    - +

    @@ -1943,55 +1944,55 @@ This Matlab function is accessible here.

    function [inputs] = initializeInputs(opts_param)
         %% Default values for opts
    -    opts = struct(   ...
    -        'Dw', false, ...
    -        'Dy', false, ...
    -        'Ry', false, ...
    -        'Rz', false, ...
    -        'Dh', false, ...
    -        'Rm', false, ...
    -        'Dn', false  ...
    +    opts = struct(   ...
    +        'Dw', false, ...
    +        'Dy', false, ...
    +        'Ry', false, ...
    +        'Rz', false, ...
    +        'Dh', false, ...
    +        'Rm', false, ...
    +        'Dn', false  ...
         );
     
         %% Populate opts with input parameters
    -    if exist('opts_param','var')
    +    if exist('opts_param','var')
             for opt = fieldnames(opts_param)'
                 opts.(opt{1}) = opts_param.(opt{1});
             end
         end
     
         %% Load Sampling Time and Simulation Time
    -    load('./mat/sim_conf.mat', 'sim_conf');
    +    load('./mat/sim_conf.mat', 'sim_conf');
     
         %% Define the time vector
         t = 0:sim_conf.Ts:sim_conf.Tsim;
     
         %% Ground motion - Dw
    -    if islogical(opts.Dw) && opts.Dw == true
    -        load('./mat/perturbations.mat', 'Wxg');
    +    if islogical(opts.Dw) && opts.Dw == true
    +        load('./mat/perturbations.mat', 'Wxg');
             Dw = 1/sqrt(2)*100*random('norm', 0, 1, length(t), 3);
             Dw(:, 1) = lsim(Wxg, Dw(:, 1), t);
             Dw(:, 2) = lsim(Wxg, Dw(:, 2), t);
             Dw(:, 3) = lsim(Wxg, Dw(:, 3), t);
    -    elseif islogical(opts.Dw) && opts.Dw == false
    +    elseif islogical(opts.Dw) && opts.Dw == false
             Dw = zeros(length(t), 3);
         else
             Dw = opts.Dw;
         end
     
         %% Translation stage - Dy
    -    if islogical(opts.Dy) && opts.Dy == true
    +    if islogical(opts.Dy) && opts.Dy == true
             Dy = zeros(length(t), 1);
    -    elseif islogical(opts.Dy) && opts.Dy == false
    +    elseif islogical(opts.Dy) && opts.Dy == false
             Dy = zeros(length(t), 1);
         else
             Dy = opts.Dy;
         end
     
         %% Tilt Stage - Ry
    -    if islogical(opts.Ry) && opts.Ry == true
    +    if islogical(opts.Ry) && opts.Ry == true
             Ry = 3*(2*pi/360)*sin(2*pi*0.2*t);
    -    elseif islogical(opts.Ry) && opts.Ry == false
    +    elseif islogical(opts.Ry) && opts.Ry == false
             Ry = zeros(length(t), 1);
         elseif isnumeric(opts.Ry) && length(opts.Ry) == 1
             Ry = opts.Ry*(2*pi/360)*ones(length(t), 1);
    @@ -2000,9 +2001,9 @@ This Matlab function is accessible here.
         end
     
         %% Spindle - Rz
    -    if islogical(opts.Rz) && opts.Rz == true
    +    if islogical(opts.Rz) && opts.Rz == true
             Rz = 2*pi*0.5*t;
    -    elseif islogical(opts.Rz) && opts.Rz == false
    +    elseif islogical(opts.Rz) && opts.Rz == false
             Rz = zeros(length(t), 1);
         elseif isnumeric(opts.Rz) && length(opts.Rz) == 1
             Rz = opts.Rz*(2*pi/60)*t;
    @@ -2011,9 +2012,9 @@ This Matlab function is accessible here.
         end
     
         %% Micro Hexapod - Dh
    -    if islogical(opts.Dh) && opts.Dh == true
    +    if islogical(opts.Dh) && opts.Dh == true
             Dh = zeros(length(t), 6);
    -    elseif islogical(opts.Dh) && opts.Dh == false
    +    elseif islogical(opts.Dh) && opts.Dh == false
             Dh = zeros(length(t), 6);
         else
             Dh = opts.Dh;
    @@ -2028,9 +2029,9 @@ This Matlab function is accessible here.
         end
     
         %% Nano Hexapod - Dn
    -    if islogical(opts.Dn) && opts.Dn == true
    +    if islogical(opts.Dn) && opts.Dn == true
             Dn = zeros(length(t), 6);
    -    elseif islogical(opts.Dn) && opts.Dn == false
    +    elseif islogical(opts.Dn) && opts.Dn == false
             Dn = zeros(length(t), 6);
         else
             Dn = opts.Dn;
    @@ -2038,7 +2039,7 @@ This Matlab function is accessible here.
     
         %% Setpoint - Ds
         Ds = zeros(length(t), 6);
    -    for i = 1:length(t)
    +    for i = 1:length(t)
             Ds(i, :) = computeSetpoint(Dy(i), Ry(i), Rz(i));
         end
     
    @@ -2049,22 +2050,22 @@ This Matlab function is accessible here.
         Fs = zeros(length(t), 6);
     
         %% Create the input Structure that will contain all the inputs
    -    inputs = struct( ...
    -        'Ts', sim_conf.Ts,       ...
    -        'Dw', timeseries(Dw, t), ...
    -        'Dy', timeseries(Dy, t), ...
    -        'Ry', timeseries(Ry, t), ...
    -        'Rz', timeseries(Rz, t), ...
    -        'Dh', timeseries(Dh, t), ...
    -        'Rm', timeseries(Rm, t), ...
    -        'Dn', timeseries(Dn, t), ...
    -        'Ds', timeseries(Ds, t), ...
    -        'Fg', timeseries(Fg, t), ...
    -        'Fs', timeseries(Fs, t)  ...
    +    inputs = struct( ...
    +        'Ts', sim_conf.Ts,       ...
    +        'Dw', timeseries(Dw, t), ...
    +        'Dy', timeseries(Dy, t), ...
    +        'Ry', timeseries(Ry, t), ...
    +        'Rz', timeseries(Rz, t), ...
    +        'Dh', timeseries(Dh, t), ...
    +        'Rm', timeseries(Rm, t), ...
    +        'Dn', timeseries(Dn, t), ...
    +        'Ds', timeseries(Ds, t), ...
    +        'Fg', timeseries(Fg, t), ...
    +        'Fs', timeseries(Fs, t)  ...
         );
     
         %% Save
    -    save('./mat/inputs.mat', 'inputs');
    +    save('./mat/inputs.mat', 'inputs');
     
         %% Custom Functions
         function setpoint = computeSetpoint(ty, ry, rz)
    @@ -2121,11 +2122,11 @@ This Matlab function is accessible here.
     
    -
    -

    8.4 Ground

    +
    +

    8.4 Ground

    - +

    @@ -2142,18 +2143,18 @@ This Matlab function is accessible here. ground.color = [0.5, 0.5, 0.5]; %% Save - save('./mat/stages.mat', 'ground', '-append'); + save('./mat/stages.mat', 'ground', '-append'); end

    -
    -

    8.5 Granite

    +
    +

    8.5 Granite

    - +

    @@ -2186,18 +2187,18 @@ This Matlab function is accessible here. granite.sample_pos = 0.8; % Z-offset for the initial position of the sample [m] %% Save - save('./mat/stages.mat', 'granite', '-append'); + save('./mat/stages.mat', 'granite', '-append'); end

    -
    -

    8.6 Translation Stage

    +
    +

    8.6 Translation Stage

    - +

    @@ -2207,10 +2208,10 @@ This Matlab function is accessible here.

    function [ty] = initializeTy(opts_param)
         %% Default values for opts
    -    opts = struct('rigid', false);
    +    opts = struct('rigid', false);
     
         %% Populate opts with input parameters
    -    if exist('opts_param','var')
    +    if exist('opts_param','var')
             for opt = fieldnames(opts_param)'
                 opts.(opt{1}) = opts_param.(opt{1});
             end
    @@ -2271,18 +2272,18 @@ This Matlab function is accessible here.
         ty.c.rad = 100*(1/5)*sqrt(ty.k.rad/ty.m);
     
         %% Save
    -    save('./mat/stages.mat', 'ty', '-append');
    +    save('./mat/stages.mat', 'ty', '-append');
     end
     
    -
    -

    8.7 Tilt Stage

    +
    +

    8.7 Tilt Stage

    - +

    @@ -2292,10 +2293,10 @@ This Matlab function is accessible here.

    function [ry] = initializeRy(opts_param)
         %% Default values for opts
    -    opts = struct('rigid', false);
    +    opts = struct('rigid', false);
     
         %% Populate opts with input parameters
    -    if exist('opts_param','var')
    +    if exist('opts_param','var')
             for opt = fieldnames(opts_param)'
                 opts.(opt{1}) = opts_param.(opt{1});
             end
    @@ -2344,18 +2345,18 @@ This Matlab function is accessible here.
         ry.z_offset = 0.58178; % Z-Offset so that the center of rotation matches the sample center [m]
     
         %% Save
    -    save('./mat/stages.mat', 'ry', '-append');
    +    save('./mat/stages.mat', 'ry', '-append');
     end
     
    -
    -

    8.8 Spindle

    +
    +

    8.8 Spindle

    - +

    @@ -2365,10 +2366,10 @@ This Matlab function is accessible here.

    function [rz] = initializeRz(opts_param)
         %% Default values for opts
    -    opts = struct('rigid', false);
    +    opts = struct('rigid', false);
     
         %% Populate opts with input parameters
    -    if exist('opts_param','var')
    +    if exist('opts_param','var')
             for opt = fieldnames(opts_param)'
                 opts.(opt{1}) = opts_param.(opt{1});
             end
    @@ -2413,18 +2414,18 @@ This Matlab function is accessible here.
         rz.c.rot  = 100*sqrt(rz.k.rot/rz.m);
     
         %% Save
    -    save('./mat/stages.mat', 'rz', '-append');
    +    save('./mat/stages.mat', 'rz', '-append');
     end
     
    -
    -

    8.9 Micro Hexapod

    +
    +

    8.9 Micro Hexapod

    - +

    @@ -2437,7 +2438,7 @@ This Matlab function is accessible here(); %% Populate opts with input parameters - if exist('opts_param','var') + if exist('opts_param','var') for opt = fieldnames(opts_param)' opts.(opt{1}) = opts_param.(opt{1}); end @@ -2446,7 +2447,7 @@ This Matlab function is accessible here%% Stewart Object micro_hexapod = struct(); micro_hexapod.h = 350; % Total height of the platform [mm] -% micro_hexapod.jacobian = 269.26; % Distance from the top platform to the Jacobian point [mm] +% micro_hexapod.jacobian = 269.26; % Distance from the top platform to the Jacobian point [mm] micro_hexapod.jacobian = 270; % Distance from the top platform to the Jacobian point [mm] %% Bottom Plate - Mechanical Design @@ -2525,12 +2526,12 @@ This Matlab function is accessible here(micro_hexapod); %% Save - save('./mat/stages.mat', 'micro_hexapod', '-append'); + save('./mat/stages.mat', 'micro_hexapod', '-append'); %% function [element] = updateDamping(element) field = fieldnames(element.k); - for i = 1:length(field) + for i = 1:length(field) element.c.(field{i}) = 1/element.ksi.(field{i})*sqrt(element.k.(field{i})/element.m); end end @@ -2549,7 +2550,7 @@ This Matlab function is accessible here*0.001; % rayon emplacement support base radius_t = stewart.TP.leg.rad*0.001; % top radius in meters - for i = 1:3 + for i = 1:3 % base points angle_m_b = (2*pi/3)* (i-1) - alpha_b; angle_p_b = (2*pi/3)* (i-1) + alpha_b; @@ -2572,24 +2573,24 @@ This Matlab function is accessible here- stewart.pos_base; leg_length = zeros(6, 1); leg_vectors = zeros(6, 3); - for i = 1:6 + for i = 1:6 leg_length(i) = norm(legs(i,:)); leg_vectors(i,:) = legs(i,:) / leg_length(i); end stewart.Leg.lenght = 1000*leg_length(1)/1.5; - stewart.Leg.shape.bot = [0 0; ... - stewart.Leg.rad.bottom 0; ... - stewart.Leg.rad.bottom stewart.Leg.lenght; ... - stewart.Leg.rad.top stewart.Leg.lenght; ... - stewart.Leg.rad.top 0.2*stewart.Leg.lenght; ... + stewart.Leg.shape.bot = [0 0; ... + stewart.Leg.rad.bottom 0; ... + stewart.Leg.rad.bottom stewart.Leg.lenght; ... + stewart.Leg.rad.top stewart.Leg.lenght; ... + stewart.Leg.rad.top 0.2*stewart.Leg.lenght; ... 0 0.2*stewart.Leg.lenght]; %% Calculate revolute and cylindrical axes rev1 = zeros(6, 3); rev2 = zeros(6, 3); cyl1 = zeros(6, 3); - for i = 1:6 + for i = 1:6 rev1(i,:) = cross(leg_vectors(i,:), [0 0 1]); rev1(i,:) = rev1(i,:) / norm(rev1(i,:)); @@ -2604,9 +2605,9 @@ This Matlab function is accessible here('rotation', eye(3)); stewart.upper_leg = struct('rotation', eye(3)); - for i = 1:6 - stewart.lower_leg(i).rotation = [rev1(i,:)', rev2(i,:)', cyl1(i,:)']; - stewart.upper_leg(i).rotation = [rev1(i,:)', rev2(i,:)', cyl1(i,:)']; + for i = 1:6 + stewart.lower_leg(i).rotation = [rev1(i,:)', rev2(i,:)', cyl1(i,:)']; + stewart.upper_leg(i).rotation = [rev1(i,:)', rev2(i,:)', cyl1(i,:)']; end %% Position Matrix @@ -2614,15 +2615,15 @@ This Matlab function is accessible here%% Compute Jacobian Matrix aa = stewart.pos_top_tranform + (stewart.jacobian - stewart.TP.thickness - stewart.SP.height.top)*1e-3*[zeros(6, 2),ones(6, 1)]; - stewart.J = getJacobianMatrix(leg_vectors', aa'); + stewart.J = getJacobianMatrix(leg_vectors', aa'); end function J = getJacobianMatrix(RM,M_pos_base) % RM: [3x6] unit vector of each leg in the fixed frame % M_pos_base: [3x6] vector of the leg connection at the top platform location in the fixed frame J = zeros(6); - J(:, 1:3) = RM'; - J(:, 4:6) = cross(M_pos_base, RM)'; + J(:, 1:3) = RM'; + J(:, 4:6) = cross(M_pos_base, RM)'; end end @@ -2630,11 +2631,11 @@ This Matlab function is accessible here

    -
    -

    8.10 Center of gravity compensation

    +
    +

    8.10 Center of gravity compensation

    - +

    @@ -2671,17 +2672,17 @@ This Matlab function is accessible here. axisc.c.ax = (1/1)*sqrt(axisc.k.ax/axisc.m); %% Save - save('./mat/stages.mat', 'axisc', '-append'); + save('./mat/stages.mat', 'axisc', '-append'); end

    -
    -

    8.11 Mirror

    +
    +

    8.11 Mirror

    - +

    @@ -2691,13 +2692,13 @@ This Matlab function is accessible here.

    function [] = initializeMirror(opts_param)
         %% Default values for opts
    -    opts = struct(...
    -        'shape', 'spherical', ... % spherical or conical
    -        'angle', 45 ...
    +    opts = struct(...
    +        'shape', 'spherical', ... % spherical or conical
    +        'angle', 45 ...
         );
     
         %% Populate opts with input parameters
    -    if exist('opts_param','var')
    +    if exist('opts_param','var')
             for opt = fieldnames(opts_param)'
                 opts.(opt{1}) = opts_param.(opt{1});
             end
    @@ -2718,11 +2719,11 @@ This Matlab function is accessible here.
         mirror.cone_length = mirror.rad*tand(opts.angle)+mirror.h+mirror.jacobian; % Distance from Apex point of the cone to jacobian point
     
         %% Shape
    -    mirror.shape = [...
    +    mirror.shape = [...
             0 mirror.h-mirror.thickness
    -        mirror.hole_rad mirror.h-mirror.thickness; ...
    -        mirror.hole_rad 0; ...
    -        mirror.rad 0 ...
    +        mirror.hole_rad mirror.h-mirror.thickness; ...
    +        mirror.hole_rad 0; ...
    +        mirror.rad 0 ...
         ];
     
         if strcmp(opts.shape, 'spherical')
    @@ -2740,18 +2741,18 @@ This Matlab function is accessible here.
         mirror.shape = [mirror.shape; 0 mirror.h];
     
         %% Save
    -    save('./mat/stages.mat', 'mirror', '-append');
    +    save('./mat/stages.mat', 'mirror', '-append');
     end
     
    -
    -

    8.12 Nano Hexapod

    +
    +

    8.12 Nano Hexapod

    - +

    @@ -2761,10 +2762,10 @@ This Matlab function is accessible here

    function [nano_hexapod] = initializeNanoHexapod(opts_param)
         %% Default values for opts
    -    opts = struct('actuator', 'piezo');
    +    opts = struct('actuator', 'piezo');
     
         %% Populate opts with input parameters
    -    if exist('opts_param','var')
    +    if exist('opts_param','var')
             for opt = fieldnames(opts_param)'
                 opts.(opt{1}) = opts_param.(opt{1});
             end
    @@ -2774,7 +2775,7 @@ This Matlab function is accessible here();
         nano_hexapod.h        = 90;  % Total height of the platform [mm]
         nano_hexapod.jacobian = 175; % Point where the Jacobian is computed => Center of rotation [mm]
    -%     nano_hexapod.jacobian = 174.26; % Point where the Jacobian is computed => Center of rotation [mm]
    +%     nano_hexapod.jacobian = 174.26; % Point where the Jacobian is computed => Center of rotation [mm]
     
         %% Bottom Plate
         BP = struct();
    @@ -2859,12 +2860,12 @@ This Matlab function is accessible here(nano_hexapod);
     
         %% Save
    -    save('./mat/stages.mat', 'nano_hexapod', '-append');
    +    save('./mat/stages.mat', 'nano_hexapod', '-append');
     
         %%
         function [element] = updateDamping(element)
             field = fieldnames(element.k);
    -        for i = 1:length(field)
    +        for i = 1:length(field)
                 element.c.(field{i}) = 1/element.ksi.(field{i})*sqrt(element.k.(field{i})/element.m);
             end
         end
    @@ -2883,7 +2884,7 @@ This Matlab function is accessible here*0.001; % rayon emplacement support base
             radius_t = stewart.TP.leg.rad*0.001; % top radius in meters
     
    -        for i = 1:3
    +        for i = 1:3
               % base points
               angle_m_b = (2*pi/3)* (i-1) - alpha_b;
               angle_p_b = (2*pi/3)* (i-1) + alpha_b;
    @@ -2906,24 +2907,24 @@ This Matlab function is accessible here- stewart.pos_base;
             leg_length = zeros(6, 1);
             leg_vectors = zeros(6, 3);
    -        for i = 1:6
    +        for i = 1:6
               leg_length(i) = norm(legs(i,:));
               leg_vectors(i,:)  = legs(i,:) / leg_length(i);
             end
     
             stewart.Leg.lenght = 1000*leg_length(1)/1.5;
    -        stewart.Leg.shape.bot = [0 0; ...
    -                                stewart.Leg.rad.bottom 0; ...
    -                                stewart.Leg.rad.bottom stewart.Leg.lenght; ...
    -                                stewart.Leg.rad.top stewart.Leg.lenght; ...
    -                                stewart.Leg.rad.top 0.2*stewart.Leg.lenght; ...
    +        stewart.Leg.shape.bot = [0 0; ...
    +                                stewart.Leg.rad.bottom 0; ...
    +                                stewart.Leg.rad.bottom stewart.Leg.lenght; ...
    +                                stewart.Leg.rad.top stewart.Leg.lenght; ...
    +                                stewart.Leg.rad.top 0.2*stewart.Leg.lenght; ...
                                     0 0.2*stewart.Leg.lenght];
     
             %% Calculate revolute and cylindrical axes
             rev1 = zeros(6, 3);
             rev2 = zeros(6, 3);
             cyl1 = zeros(6, 3);
    -        for i = 1:6
    +        for i = 1:6
               rev1(i,:) = cross(leg_vectors(i,:), [0 0 1]);
               rev1(i,:) = rev1(i,:) / norm(rev1(i,:));
     
    @@ -2938,9 +2939,9 @@ This Matlab function is accessible here('rotation', eye(3));
             stewart.upper_leg = struct('rotation', eye(3));
     
    -        for i = 1:6
    -          stewart.lower_leg(i).rotation = [rev1(i,:)', rev2(i,:)', cyl1(i,:)'];
    -          stewart.upper_leg(i).rotation = [rev1(i,:)', rev2(i,:)', cyl1(i,:)'];
    +        for i = 1:6
    +          stewart.lower_leg(i).rotation = [rev1(i,:)', rev2(i,:)', cyl1(i,:)'];
    +          stewart.upper_leg(i).rotation = [rev1(i,:)', rev2(i,:)', cyl1(i,:)'];
             end
     
             %% Position Matrix
    @@ -2948,15 +2949,15 @@ This Matlab function is accessible here%% Compute Jacobian Matrix
             aa = stewart.pos_top_tranform + (stewart.jacobian - stewart.TP.thickness - stewart.SP.height.top)*1e-3*[zeros(6, 2),ones(6, 1)];
    -        stewart.J  = getJacobianMatrix(leg_vectors', aa');
    +        stewart.J  = getJacobianMatrix(leg_vectors', aa');
         end
     
         function J  = getJacobianMatrix(RM,M_pos_base)
             % RM: [3x6] unit vector of each leg in the fixed frame
             % M_pos_base: [3x6] vector of the leg connection at the top platform location in the fixed frame
             J = zeros(6);
    -        J(:, 1:3) = RM';
    -        J(:, 4:6) = cross(M_pos_base, RM)';
    +        J(:, 1:3) = RM';
    +        J(:, 4:6) = cross(M_pos_base, RM)';
         end
     end
     
    @@ -2964,11 +2965,11 @@ This Matlab function is accessible here
    -
    -

    8.13 Sample

    +
    +

    8.13 Sample

    - +

    @@ -2978,15 +2979,15 @@ This Matlab function is accessible here.

    function [sample] = initializeSample(opts_param)
         %% Default values for opts
    -    sample = struct('radius', 100, ...
    -                    'height', 300, ...
    -                    'mass',   50,  ...
    -                    'offset', 0,   ...
    -                    'color',  [0.45, 0.45, 0.45] ...
    +    sample = struct('radius', 100, ...
    +                    'height', 300, ...
    +                    'mass',   50,  ...
    +                    'offset', 0,   ...
    +                    'color',  [0.45, 0.45, 0.45] ...
         );
     
         %% Populate opts with input parameters
    -    if exist('opts_param','var')
    +    if exist('opts_param','var')
             for opt = fieldnames(opts_param)'
                 sample.(opt{1}) = opts_param.(opt{1});
             end
    @@ -3003,7 +3004,7 @@ This Matlab function is accessible here.
         sample.c.z = sqrt(sample.k.y*sample.mass)/10;
     
         %% Save
    -    save('./mat/stages.mat', 'sample', '-append');
    +    save('./mat/stages.mat', 'sample', '-append');
     end
     
    @@ -3013,7 +3014,7 @@ This Matlab function is accessible here.

    Author: Dehaeze Thomas

    -

    Created: 2019-10-08 mar. 11:19

    +

    Created: 2019-10-24 jeu. 17:45

    Validate

    diff --git a/index.org b/index.org index 2116bc0..3c4cedd 100644 --- a/index.org +++ b/index.org @@ -42,6 +42,7 @@ :END: - [[file:identification/index.org][Identification of the Micro-Station]] +- [[file:uniaxial/index.org][Uniaxial Model]] - [[file:kinematics/index.org][Kinematics of the station]] - [[file:control/index.org][Control]] - [[file:active_damping/index.org][Active Damping]] diff --git a/simscape/sim_nano_station_uniaxial.slx b/simscape/sim_nano_station_uniaxial.slx new file mode 100644 index 0000000000000000000000000000000000000000..46307f141255bb4c446e7b79810646217ef023b9 GIT binary patch literal 132281 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%0A+hMT>fMT$ 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 z

    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 + + + + + + +Simscape Uniaxial Model + + + + + + + + + + + + + +

    + UP + | + HOME +
    +

    Simscape Uniaxial Model

    + + +

    +The idea is to use the same model as the full Simscape Model but to restrict the motion only in the vertical direction. +

    + +

    +This is done in order to more easily study the system and evaluate control techniques. +

    + +
    +

    1 Undamped System

    +
    +
    +
    +

    1.1 Init

    +
    +

    +We initialize all the stages with the default parameters. +The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg. +

    + +
    +
    initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod(struct('actuator', 'piezo'));
    +initializeSample(struct('mass', 50));
    +
    +
    + +

    +All the controllers are set to 0. +

    +
    +
    K = tf(0);
    +save('./mat/controllers.mat', 'K', '-append');
    +K_iff = tf(0);
    +save('./mat/controllers.mat', 'K_iff', '-append');
    +K_rmc = tf(0);
    +save('./mat/controllers.mat', 'K_rmc', '-append');
    +K_dvf = tf(0);
    +save('./mat/controllers.mat', 'K_dvf', '-append');
    +
    +
    +
    +
    + +
    +

    1.2 Identification

    +
    +
    +
    %% Options for Linearized
    +options = linearizeOptions;
    +options.SampleTime = 0;
    +
    +%% Name of the Simulink File
    +mdl = 'sim_nano_station_uniaxial';
    +
    +
    + +
    +
    %% Input/Output definition
    +io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    +io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    +io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    +io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    +io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    +
    +io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    +io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    +io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    +io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    +io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    +
    +
    + +
    +
    %% Run the linearization
    +G = linearize(mdl, io, options);
    +G.InputName  = {'Dw',   ... % Ground Motion [m]
    +                'Fs',   ... % Force Applied on Sample [N]
    +                'Fn',   ... % Force applied by NASS [N]
    +                'Fty',  ... % Parasitic Force Ty [N]
    +                'Frz'};     % Parasitic Force Rz [N]
    +G.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    +                'Fnm',  ... % Force Sensor in NASS [N]
    +                'Dnm',  ... % Displacement Sensor in NASS [m]
    +                'Dgm',  ... % Asbolute displacement of Granite [m]
    +                'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    +
    +
    +
    +
    + +
    +

    1.3 Sensitivity to Disturbances

    +
    + +
    +

    uniaxial-sensitivity-disturbances.png +

    +

    Figure 1: Sensitivity to disturbances (png, pdf)

    +
    + + + +
    +

    uniaxial-sensitivity-force-dist.png +

    +

    Figure 2: Sensitivity to disturbances (png, pdf)

    +
    +
    +
    + +
    +

    1.4 Plant

    +
    + +
    +

    uniaxial-plant.png +

    +

    Figure 3: Bode plot of the Plant (png, pdf)

    +
    +
    +
    + +
    +

    1.5 Save

    +
    +
    +
    save('./uniaxial/mat/plants.mat', 'G');
    +
    +
    +
    +
    +
    + +
    +

    2 Integral Force Feedback

    +
    +

    + +

    +
    +
    +

    2.1 Control Design

    +
    +
    +
    load('./uniaxial/mat/plants.mat', 'G');
    +
    +
    + +

    +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. +

    + + +
    +

    uniaxial_iff_plant.png +

    +

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

    +
    + +

    +The controller for each pair of actuator/sensor is: +

    +
    +
    K_iff = -1000/s;
    +
    +
    + + +
    +

    uniaxial_iff_open_loop.png +

    +

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

    +
    +
    +
    + +
    +

    2.2 Identification

    +
    +

    +Let's initialize the system prior to identification. +

    +
    +
    initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod(struct('actuator', 'piezo'));
    +initializeSample(struct('mass', 50));
    +
    +
    + +

    +All the controllers are set to 0. +

    +
    +
    K = tf(0);
    +save('./mat/controllers.mat', 'K', '-append');
    +K_iff = -K_iff;
    +save('./mat/controllers.mat', 'K_iff', '-append');
    +K_rmc = tf(0);
    +save('./mat/controllers.mat', 'K_rmc', '-append');
    +K_dvf = tf(0);
    +save('./mat/controllers.mat', 'K_dvf', '-append');
    +
    +
    + +
    +
    %% Options for Linearized
    +options = linearizeOptions;
    +options.SampleTime = 0;
    +
    +%% Name of the Simulink File
    +mdl = 'sim_nano_station_uniaxial';
    +
    +
    + +
    +
    %% Input/Output definition
    +io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    +io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    +io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    +io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    +io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    +
    +io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    +io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    +io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    +io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    +io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    +
    +
    + +
    +
    %% Run the linearization
    +G_iff = linearize(mdl, io, options);
    +G_iff.InputName  = {'Dw',   ... % Ground Motion [m]
    +                    'Fs',   ... % Force Applied on Sample [N]
    +                    'Fn',   ... % Force applied by NASS [N]
    +                    'Fty',  ... % Parasitic Force Ty [N]
    +                    'Frz'};     % Parasitic Force Rz [N]
    +G_iff.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    +                    'Fnm',  ... % Force Sensor in NASS [N]
    +                    'Dnm',  ... % Displacement Sensor in NASS [m]
    +                    'Dgm',  ... % Asbolute displacement of Granite [m]
    +                    'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    +
    +
    +
    +
    + +
    +

    2.3 Sensitivity to Disturbance

    +
    + +
    +

    uniaxial_sensitivity_dist_iff.png +

    +

    Figure 6: Sensitivity to disturbance once the IFF controller is applied to the system (png, pdf)

    +
    + + +
    +

    uniaxial_sensitivity_dist_stages_iff.png +

    +

    Figure 7: Sensitivity to force disturbances in various stages when IFF is applied (png, pdf)

    +
    +
    +
    + +
    +

    2.4 Damped Plant

    +
    + +
    +

    uniaxial_plant_iff_damped.png +

    +

    Figure 8: Damped Plant after IFF is applied (png, pdf)

    +
    +
    +
    + +
    +

    2.5 Save

    +
    +
    +
    save('./uniaxial/mat/plants.mat', 'G_iff', '-append');
    +
    +
    +
    +
    + +
    +

    2.6 Conclusion

    +
    +
    +

    +Integral Force Feedback: +

    + +
    +
    +
    +
    + +
    +

    3 Relative Motion Control

    +
    +

    + +

    +

    +In the Relative Motion Control (RMC), a derivative feedback is applied between the measured actuator displacement to the actuator force input. +

    +
    +
    +

    3.1 Control Design

    +
    +
    +
    load('./uniaxial/mat/plants.mat', 'G');
    +
    +
    + +

    +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. +

    + + +
    +

    uniaxial_rmc_plant.png +

    +

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

    +
    + +

    +The Relative Motion Controller is defined below. +A Low pass Filter is added to make the controller transfer function proper. +

    +
    +
    K_rmc = s*50000/(1 + s/2/pi/10000);
    +
    +
    + + +
    +

    uniaxial_rmc_open_loop.png +

    +

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

    +
    +
    +
    + +
    +

    3.2 Identification

    +
    +

    +Let's initialize the system prior to identification. +

    +
    +
    initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod(struct('actuator', 'piezo'));
    +initializeSample(struct('mass', 50));
    +
    +
    + +

    +And initialize the controllers. +

    +
    +
    K = tf(0);
    +save('./mat/controllers.mat', 'K', '-append');
    +K_iff = tf(0);
    +save('./mat/controllers.mat', 'K_iff', '-append');
    +K_rmc = -K_rmc;
    +save('./mat/controllers.mat', 'K_rmc', '-append');
    +K_dvf = tf(0);
    +save('./mat/controllers.mat', 'K_dvf', '-append');
    +
    +
    + +
    +
    %% Options for Linearized
    +options = linearizeOptions;
    +options.SampleTime = 0;
    +
    +%% Name of the Simulink File
    +mdl = 'sim_nano_station_uniaxial';
    +
    +
    + +
    +
    %% Input/Output definition
    +io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    +io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    +io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    +io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    +io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    +
    +io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    +io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    +io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    +io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    +io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    +
    +
    + +
    +
    %% Run the linearization
    +G_rmc = linearize(mdl, io, options);
    +G_rmc.InputName  = {'Dw',   ... % Ground Motion [m]
    +                    'Fs',   ... % Force Applied on Sample [N]
    +                    'Fn',   ... % Force applied by NASS [N]
    +                    'Fty',  ... % Parasitic Force Ty [N]
    +                    'Frz'};     % Parasitic Force Rz [N]
    +G_rmc.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    +                    'Fnm',  ... % Force Sensor in NASS [N]
    +                    'Dnm',  ... % Displacement Sensor in NASS [m]
    +                    'Dgm',  ... % Asbolute displacement of Granite [m]
    +                    'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    +
    +
    +
    +
    + + +
    +

    3.3 Sensitivity to Disturbance

    +
    + +
    +

    uniaxial_sensitivity_dist_rmc.png +

    +

    Figure 11: Sensitivity to disturbance once the RMC controller is applied to the system (png, pdf)

    +
    + + +
    +

    uniaxial_sensitivity_dist_stages_rmc.png +

    +

    Figure 12: Sensitivity to force disturbances in various stages when RMC is applied (png, pdf)

    +
    +
    +
    + +
    +

    3.4 Damped Plant

    +
    + +
    +

    uniaxial_plant_rmc_damped.png +

    +

    Figure 13: Damped Plant after RMC is applied (png, pdf)

    +
    +
    +
    + +
    +

    3.5 Save

    +
    +
    +
    save('./uniaxial/mat/plants.mat', 'G_rmc', '-append');
    +
    +
    +
    +
    + +
    +

    3.6 Conclusion

    +
    +
    +

    +Relative Motion Control: +

    + +
    +
    +
    +
    + +
    +

    4 Direct Velocity Feedback

    +
    +

    + +

    +

    +In the Relative Motion Control (RMC), a feedback is applied between the measured velocity of the platform to the actuator force input. +

    +
    +
    +

    4.1 Control Design

    +
    +
    +
    load('./uniaxial/mat/plants.mat', 'G');
    +
    +
    + + +
    +

    uniaxial_dvf_plant.png +

    +

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

    +
    + +
    +
    K_dvf = tf(5e4);
    +
    +
    + + +
    +

    uniaxial_dvf_loop_gain.png +

    +

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

    +
    +
    +
    + +
    +

    4.2 Identification

    +
    +

    +Let's initialize the system prior to identification. +

    +
    +
    initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod(struct('actuator', 'piezo'));
    +initializeSample(struct('mass', 50));
    +
    +
    + +

    +And initialize the controllers. +

    +
    +
    K = tf(0);
    +save('./mat/controllers.mat', 'K', '-append');
    +K_iff = tf(0);
    +save('./mat/controllers.mat', 'K_iff', '-append');
    +K_rmc = tf(0);
    +save('./mat/controllers.mat', 'K_rmc', '-append');
    +K_dvf = -K_dvf;
    +save('./mat/controllers.mat', 'K_dvf', '-append');
    +
    +
    + +
    +
    %% Options for Linearized
    +options = linearizeOptions;
    +options.SampleTime = 0;
    +
    +%% Name of the Simulink File
    +mdl = 'sim_nano_station_uniaxial';
    +
    +
    + +
    +
    %% Input/Output definition
    +io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    +io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    +io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    +io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    +io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    +
    +io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    +io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    +io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    +io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    +io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    +
    +
    + +
    +
    %% Run the linearization
    +G_dvf = linearize(mdl, io, options);
    +G_dvf.InputName  = {'Dw',   ... % Ground Motion [m]
    +                    'Fs',   ... % Force Applied on Sample [N]
    +                    'Fn',   ... % Force applied by NASS [N]
    +                    'Fty',  ... % Parasitic Force Ty [N]
    +                    'Frz'};     % Parasitic Force Rz [N]
    +G_dvf.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    +                    'Fnm',  ... % Force Sensor in NASS [N]
    +                    'Dnm',  ... % Displacement Sensor in NASS [m]
    +                    'Dgm',  ... % Asbolute displacement of Granite [m]
    +                    'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    +
    +
    +
    +
    + +
    +

    4.3 Sensitivity to Disturbance

    +
    + +
    +

    uniaxial_sensitivity_dist_dvf.png +

    +

    Figure 16: Sensitivity to disturbance once the DVF controller is applied to the system (png, pdf)

    +
    + + +
    +

    uniaxial_sensitivity_dist_stages_dvf.png +

    +

    Figure 17: Sensitivity to force disturbances in various stages when DVF is applied (png, pdf)

    +
    +
    +
    + +
    +

    4.4 Damped Plant

    +
    + +
    +

    uniaxial_plant_dvf_damped.png +

    +

    Figure 18: Damped Plant after DVF is applied (png, pdf)

    +
    +
    +
    + +
    +

    4.5 Save

    +
    +
    +
    save('./uniaxial/mat/plants.mat', 'G_dvf', '-append');
    +
    +
    +
    +
    + +
    +

    4.6 Conclusion

    +
    +
    +

    +Direct Velocity Feedback: +

    + +
    +
    +
    +
    +
    +

    5 Comparison of Active Damping Techniques

    +
    +

    + +

    +
    +
    +

    5.1 Load the plants

    +
    +
    +
    load('./uniaxial/mat/plants.mat', 'G', 'G_iff', 'G_rmc', 'G_dvf');
    +
    +
    +
    +
    + +
    +

    5.2 Sensitivity to Disturbance

    +
    + +
    +

    uniaxial_sensitivity_dist_comp.png +

    +

    Figure 19: Sensitivity to disturbance - Comparison (png, pdf)

    +
    + + +
    +

    uniaxial_sensitivity_dist_stages_comp.png +

    +

    Figure 20: Sensitivity to force disturbances - Comparison (png, pdf)

    +
    +
    +
    + +
    +

    5.3 Damped Plant

    +
    + +
    +

    uniaxial_plant_damped_comp.png +

    +

    Figure 21: Damped Plant - Comparison (png, pdf)

    +
    +
    +
    +
    +

    5.4 Conclusion

    +
    +
    +
    +
    +

    Author: Dehaeze Thomas

    +

    Created: 2019-10-24 jeu. 17:44

    +

    Validate

    +
    + + diff --git a/uniaxial/index.org b/uniaxial/index.org new file mode 100644 index 0000000..874e239 --- /dev/null +++ b/uniaxial/index.org @@ -0,0 +1,1191 @@ +#+TITLE: Simscape Uniaxial Model +:DRAWER: +#+STARTUP: overview + +#+LANGUAGE: en +#+EMAIL: dehaeze.thomas@gmail.com +#+AUTHOR: Dehaeze Thomas + +#+HTML_LINK_HOME: ../index.html +#+HTML_LINK_UP: ../index.html + +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: + +#+HTML_MATHJAX: align: center tagside: right font: TeX + +#+PROPERTY: header-args:matlab :session *MATLAB* +#+PROPERTY: header-args:matlab+ :comments org +#+PROPERTY: header-args:matlab+ :results none +#+PROPERTY: header-args:matlab+ :exports both +#+PROPERTY: header-args:matlab+ :eval no-export +#+PROPERTY: header-args:matlab+ :output-dir figs +#+PROPERTY: header-args:matlab+ :tangle matlab/modal_frf_coh.m +#+PROPERTY: header-args:matlab+ :mkdirp yes + +#+PROPERTY: header-args:shell :eval no-export + +#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/thesis/latex/}{config.tex}") +#+PROPERTY: header-args:latex+ :imagemagick t :fit yes +#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150 +#+PROPERTY: header-args:latex+ :imoutoptions -quality 100 +#+PROPERTY: header-args:latex+ :results raw replace :buffer no +#+PROPERTY: header-args:latex+ :eval no-export +#+PROPERTY: header-args:latex+ :exports both +#+PROPERTY: header-args:latex+ :mkdirp yes +#+PROPERTY: header-args:latex+ :output-dir figs +:END: + +* Introduction :ignore: +The idea is to use the same model as the full Simscape Model but to restrict the motion only in the vertical direction. + +This is done in order to more easily study the system and evaluate control techniques. + +* Undamped System +** Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) + <> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes + <> +#+end_src + +#+begin_src matlab :tangle no + simulinkproject('../'); +#+end_src + +#+begin_src matlab + open 'simscape/sim_nano_station_uniaxial.slx' +#+end_src + +** Init +We initialize all the stages with the default parameters. +The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg. + +#+begin_src matlab + initializeGround(); + initializeGranite(); + initializeTy(); + initializeRy(); + initializeRz(); + initializeMicroHexapod(); + initializeAxisc(); + initializeMirror(); + initializeNanoHexapod(struct('actuator', 'piezo')); + initializeSample(struct('mass', 50)); +#+end_src + +All the controllers are set to 0. +#+begin_src matlab + K = tf(0); + save('./mat/controllers.mat', 'K', '-append'); + K_iff = tf(0); + save('./mat/controllers.mat', 'K_iff', '-append'); + K_rmc = tf(0); + save('./mat/controllers.mat', 'K_rmc', '-append'); + K_dvf = tf(0); + save('./mat/controllers.mat', 'K_dvf', '-append'); +#+end_src + +** Identification +#+begin_src matlab + %% Options for Linearized + options = linearizeOptions; + options.SampleTime = 0; + + %% Name of the Simulink File + mdl = 'sim_nano_station_uniaxial'; +#+end_src + +#+begin_src matlab + %% Input/Output definition + io(1) = linio([mdl, '/Dw'], 1, 'input'); % Ground Motion + io(2) = linio([mdl, '/Fs'], 1, 'input'); % Force applied on the sample + io(3) = linio([mdl, '/Fnl'], 1, 'input'); % Force applied by the NASS + io(4) = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty + io(5) = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz + + io(6) = linio([mdl, '/Dsm'], 1, 'output'); % Displacement of the sample + io(7) = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs + io(8) = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs + io(9) = linio([mdl, '/Dgm'], 1, 'output'); % Absolute displacement of the granite + io(10) = linio([mdl, '/Vlm'], 1, 'output'); % Measured absolute velocity of the top NASS platform +#+end_src + +#+begin_src matlab + %% Run the linearization + G = linearize(mdl, io, options); + G.InputName = {'Dw', ... % Ground Motion [m] + 'Fs', ... % Force Applied on Sample [N] + 'Fn', ... % Force applied by NASS [N] + 'Fty', ... % Parasitic Force Ty [N] + 'Frz'}; % Parasitic Force Rz [N] + G.OutputName = {'D', ... % Measured sample displacement x.r.t. granite [m] + 'Fnm', ... % Force Sensor in NASS [N] + 'Dnm', ... % Displacement Sensor in NASS [m] + 'Dgm', ... % Asbolute displacement of Granite [m] + 'Vlm'}; ... % Absolute Velocity of NASS [m/s] +#+end_src + +** Sensitivity to Disturbances +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + subplot(2, 1, 1); + title('$D_w$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Dw'), freqs, 'Hz'))), 'k-'); + % plot(freqs, abs(squeeze(freqresp(G('Dgm', 'Dw'), freqs, 'Hz'))), 'k--'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]'); + + subplot(2, 1, 2); + title('$F_s$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Fs'), freqs, 'Hz'))), 'k-'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial-sensitivity-disturbances.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial-sensitivity-disturbances +#+CAPTION: Sensitivity to disturbances ([[./figs/uniaxial-sensitivity-disturbances.png][png]], [[./figs/uniaxial-sensitivity-disturbances.pdf][pdf]]) +[[file:figs/uniaxial-sensitivity-disturbances.png]] + + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + subplot(2, 1, 1); + title('$F_{ty}$ to $D$'); + plot(freqs, abs(squeeze(freqresp(G('D', 'Fty'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); + + subplot(2, 1, 2); + title('$F_{rz}$ to $D$'); + plot(freqs, abs(squeeze(freqresp(G('D', 'Frz'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial-sensitivity-force-dist.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial-sensitivity-force-dist +#+CAPTION: Sensitivity to disturbances ([[./figs/uniaxial-sensitivity-force-dist.png][png]], [[./figs/uniaxial-sensitivity-force-dist.pdf][pdf]]) +[[file:figs/uniaxial-sensitivity-force-dist.png]] + +** Plant +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + plot(freqs, abs(squeeze(freqresp(G('D', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + + ax2 = subplot(2, 1, 2); + plot(freqs, 180/pi*angle(squeeze(freqresp(G('D', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-180, 180]); + yticks([-180, -90, 0, 90, 180]); + + linkaxes([ax1,ax2],'x'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial-plant.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial-plant +#+CAPTION: Bode plot of the Plant ([[./figs/uniaxial-plant.png][png]], [[./figs/uniaxial-plant.pdf][pdf]]) +[[file:figs/uniaxial-plant.png]] + +** Save +#+begin_src matlab + save('./uniaxial/mat/plants.mat', 'G'); +#+end_src + +* Integral Force Feedback +<> +** Introduction :ignore: +** Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) + <> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes + <> +#+end_src + +#+begin_src matlab :tangle no + simulinkproject('../'); +#+end_src + +#+begin_src matlab + open 'simscape/sim_nano_station_uniaxial.slx' +#+end_src + +** Control Design +#+begin_src matlab + load('./uniaxial/mat/plants.mat', 'G'); +#+end_src + +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. + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + plot(freqs, abs(squeeze(freqresp(G('Fnm', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]); + + ax2 = subplot(2, 1, 2); + plot(freqs, 180/pi*angle(squeeze(freqresp(G('Fnm', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-180, 180]); + yticks([-180, -90, 0, 90, 180]); + + linkaxes([ax1,ax2],'x'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_iff_plant.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_iff_plant +#+CAPTION: Transfer function from forces applied in the legs to force sensor ([[./figs/uniaxial_iff_plant.png][png]], [[./figs/uniaxial_iff_plant.pdf][pdf]]) +[[file:figs/uniaxial_iff_plant.png]] + +The controller for each pair of actuator/sensor is: +#+begin_src matlab + K_iff = -1000/s; +#+end_src + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + plot(freqs, abs(squeeze(freqresp(K_iff*G('Fnm', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]); + + ax2 = subplot(2, 1, 2); + plot(freqs, 180/pi*angle(squeeze(freqresp(K_iff*G('Fnm', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-180, 180]); + yticks([-180, -90, 0, 90, 180]); + + linkaxes([ax1,ax2],'x'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_iff_open_loop.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_iff_open_loop +#+CAPTION: Loop Gain for the Integral Force Feedback ([[./figs/uniaxial_iff_open_loop.png][png]], [[./figs/uniaxial_iff_open_loop.pdf][pdf]]) +[[file:figs/uniaxial_iff_open_loop.png]] + +** Identification +Let's initialize the system prior to identification. +#+begin_src matlab + initializeGround(); + initializeGranite(); + initializeTy(); + initializeRy(); + initializeRz(); + initializeMicroHexapod(); + initializeAxisc(); + initializeMirror(); + initializeNanoHexapod(struct('actuator', 'piezo')); + initializeSample(struct('mass', 50)); +#+end_src + +All the controllers are set to 0. +#+begin_src matlab + K = tf(0); + save('./mat/controllers.mat', 'K', '-append'); + K_iff = -K_iff; + save('./mat/controllers.mat', 'K_iff', '-append'); + K_rmc = tf(0); + save('./mat/controllers.mat', 'K_rmc', '-append'); + K_dvf = tf(0); + save('./mat/controllers.mat', 'K_dvf', '-append'); +#+end_src + +#+begin_src matlab + %% Options for Linearized + options = linearizeOptions; + options.SampleTime = 0; + + %% Name of the Simulink File + mdl = 'sim_nano_station_uniaxial'; +#+end_src + +#+begin_src matlab + %% Input/Output definition + io(1) = linio([mdl, '/Dw'], 1, 'input'); % Ground Motion + io(2) = linio([mdl, '/Fs'], 1, 'input'); % Force applied on the sample + io(3) = linio([mdl, '/Fnl'], 1, 'input'); % Force applied by the NASS + io(4) = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty + io(5) = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz + + io(6) = linio([mdl, '/Dsm'], 1, 'output'); % Displacement of the sample + io(7) = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs + io(8) = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs + io(9) = linio([mdl, '/Dgm'], 1, 'output'); % Absolute displacement of the granite + io(10) = linio([mdl, '/Vlm'], 1, 'output'); % Measured absolute velocity of the top NASS platform +#+end_src + +#+begin_src matlab + %% Run the linearization + G_iff = linearize(mdl, io, options); + G_iff.InputName = {'Dw', ... % Ground Motion [m] + 'Fs', ... % Force Applied on Sample [N] + 'Fn', ... % Force applied by NASS [N] + 'Fty', ... % Parasitic Force Ty [N] + 'Frz'}; % Parasitic Force Rz [N] + G_iff.OutputName = {'D', ... % Measured sample displacement x.r.t. granite [m] + 'Fnm', ... % Force Sensor in NASS [N] + 'Dnm', ... % Displacement Sensor in NASS [m] + 'Dgm', ... % Asbolute displacement of Granite [m] + 'Vlm'}; ... % Absolute Velocity of NASS [m/s] +#+end_src + +** Sensitivity to Disturbance +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + subplot(2, 1, 1); + title('$D_w$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Dw'), freqs, 'Hz'))), 'k-', 'DisplayName', 'OL'); + plot(freqs, abs(squeeze(freqresp(G_iff('D', 'Dw'), freqs, 'Hz'))), 'k--', 'DisplayName', 'IFF'); + hold 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('D', 'Fs'), freqs, 'Hz'))), 'k-'); + plot(freqs, abs(squeeze(freqresp(G_iff('D', 'Fs'), freqs, 'Hz'))), 'k--'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_sensitivity_dist_iff.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_sensitivity_dist_iff +#+CAPTION: Sensitivity to disturbance once the IFF controller is applied to the system ([[./figs/uniaxial_sensitivity_dist_iff.png][png]], [[./figs/uniaxial_sensitivity_dist_iff.pdf][pdf]]) +[[file:figs/uniaxial_sensitivity_dist_iff.png]] + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + subplot(2, 1, 1); + title('$F_{ty}$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Fty'), freqs, 'Hz'))), 'k-', 'DisplayName', 'OL'); + plot(freqs, abs(squeeze(freqresp(G_iff('D', 'Fty'), freqs, 'Hz'))), 'k--', 'DisplayName', 'IFF'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); + legend('location', 'northeast'); + + subplot(2, 1, 2); + title('$F_{rz}$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Frz'), freqs, 'Hz'))), 'k-'); + plot(freqs, abs(squeeze(freqresp(G_iff('D', 'Frz'), freqs, 'Hz'))), 'k--'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_sensitivity_dist_stages_iff.pdf" :var figsize="full-normal" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_sensitivity_dist_stages_iff +#+CAPTION: Sensitivity to force disturbances in various stages when IFF is applied ([[./figs/uniaxial_sensitivity_dist_stages_iff.png][png]], [[./figs/uniaxial_sensitivity_dist_stages_iff.pdf][pdf]]) +[[file:figs/uniaxial_sensitivity_dist_stages_iff.png]] + +** Damped Plant +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Fn'), freqs, 'Hz'))), 'k-', 'DisplayName', 'OL'); + plot(freqs, abs(squeeze(freqresp(G_iff('D', 'Fn'), freqs, 'Hz'))), 'k--', 'DisplayName', 'IFF'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + legend('location', 'northeast'); + + ax2 = subplot(2, 1, 2); + hold on; + plot(freqs, 180/pi*angle(squeeze(freqresp(G('D', 'Fn'), freqs, 'Hz'))), 'k-'); + plot(freqs, 180/pi*angle(squeeze(freqresp(G_iff('D', 'Fn'), freqs, 'Hz'))), 'k--'); + 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]); + + linkaxes([ax1,ax2],'x'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_plant_iff_damped.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_plant_iff_damped +#+CAPTION: Damped Plant after IFF is applied ([[./figs/uniaxial_plant_iff_damped.png][png]], [[./figs/uniaxial_plant_iff_damped.pdf][pdf]]) +[[file:figs/uniaxial_plant_iff_damped.png]] + +** Save +#+begin_src matlab + save('./uniaxial/mat/plants.mat', 'G_iff', '-append'); +#+end_src + +** Conclusion +#+begin_important +Integral Force Feedback: +#+end_important + +* Relative Motion Control +<> +** Introduction :ignore: +In the Relative Motion Control (RMC), a derivative feedback is applied between the measured actuator displacement to the actuator force input. + +** Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) + <> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes + <> +#+end_src + +#+begin_src matlab :tangle no + simulinkproject('../'); +#+end_src + +#+begin_src matlab + open 'simscape/sim_nano_station_uniaxial.slx' +#+end_src + +** Control Design +#+begin_src matlab + load('./uniaxial/mat/plants.mat', 'G'); +#+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. + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + plot(freqs, abs(squeeze(freqresp(G('Dnm', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + + ax2 = subplot(2, 1, 2); + plot(freqs, 180/pi*angle(squeeze(freqresp(G('Dnm', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-180, 180]); + yticks([-180, -90, 0, 90, 180]); + + linkaxes([ax1,ax2],'x'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_rmc_plant.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_rmc_plant +#+CAPTION: Transfer function from forces applied in the legs to leg displacement sensor ([[./figs/uniaxial_rmc_plant.png][png]], [[./figs/uniaxial_rmc_plant.pdf][pdf]]) +[[file:figs/uniaxial_rmc_plant.png]] + +The Relative Motion Controller is defined below. +A Low pass Filter is added to make the controller transfer function proper. +#+begin_src matlab + K_rmc = s*50000/(1 + s/2/pi/10000); +#+end_src + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + plot(freqs, abs(squeeze(freqresp(K_rmc*G('Dnm', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + + ax2 = subplot(2, 1, 2); + plot(freqs, 180/pi*angle(squeeze(freqresp(K_rmc*G('Dnm', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-180, 180]); + yticks([-180, -90, 0, 90, 180]); + + linkaxes([ax1,ax2],'x'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_rmc_open_loop.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_rmc_open_loop +#+CAPTION: Loop Gain for the Integral Force Feedback ([[./figs/uniaxial_rmc_open_loop.png][png]], [[./figs/uniaxial_rmc_open_loop.pdf][pdf]]) +[[file:figs/uniaxial_rmc_open_loop.png]] + +** Identification +Let's initialize the system prior to identification. +#+begin_src matlab + initializeGround(); + initializeGranite(); + initializeTy(); + initializeRy(); + initializeRz(); + initializeMicroHexapod(); + initializeAxisc(); + initializeMirror(); + initializeNanoHexapod(struct('actuator', 'piezo')); + initializeSample(struct('mass', 50)); +#+end_src + +And initialize the controllers. +#+begin_src matlab + K = tf(0); + save('./mat/controllers.mat', 'K', '-append'); + K_iff = tf(0); + save('./mat/controllers.mat', 'K_iff', '-append'); + K_rmc = -K_rmc; + save('./mat/controllers.mat', 'K_rmc', '-append'); + K_dvf = tf(0); + save('./mat/controllers.mat', 'K_dvf', '-append'); +#+end_src + +#+begin_src matlab + %% Options for Linearized + options = linearizeOptions; + options.SampleTime = 0; + + %% Name of the Simulink File + mdl = 'sim_nano_station_uniaxial'; +#+end_src + +#+begin_src matlab + %% Input/Output definition + io(1) = linio([mdl, '/Dw'], 1, 'input'); % Ground Motion + io(2) = linio([mdl, '/Fs'], 1, 'input'); % Force applied on the sample + io(3) = linio([mdl, '/Fnl'], 1, 'input'); % Force applied by the NASS + io(4) = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty + io(5) = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz + + io(6) = linio([mdl, '/Dsm'], 1, 'output'); % Displacement of the sample + io(7) = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs + io(8) = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs + io(9) = linio([mdl, '/Dgm'], 1, 'output'); % Absolute displacement of the granite + io(10) = linio([mdl, '/Vlm'], 1, 'output'); % Measured absolute velocity of the top NASS platform +#+end_src + +#+begin_src matlab + %% Run the linearization + G_rmc = linearize(mdl, io, options); + G_rmc.InputName = {'Dw', ... % Ground Motion [m] + 'Fs', ... % Force Applied on Sample [N] + 'Fn', ... % Force applied by NASS [N] + 'Fty', ... % Parasitic Force Ty [N] + 'Frz'}; % Parasitic Force Rz [N] + G_rmc.OutputName = {'D', ... % Measured sample displacement x.r.t. granite [m] + 'Fnm', ... % Force Sensor in NASS [N] + 'Dnm', ... % Displacement Sensor in NASS [m] + 'Dgm', ... % Asbolute displacement of Granite [m] + 'Vlm'}; ... % Absolute Velocity of NASS [m/s] +#+end_src + + +** Sensitivity to Disturbance +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + subplot(2, 1, 1); + title('$D_w$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Dw'), freqs, 'Hz'))), 'k-', 'DisplayName', 'OL'); + plot(freqs, abs(squeeze(freqresp(G_rmc('D', 'Dw'), freqs, 'Hz'))), 'k--', 'DisplayName', 'RMC'); + hold 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('D', 'Fs'), freqs, 'Hz'))), 'k-'); + plot(freqs, abs(squeeze(freqresp(G_rmc('D', 'Fs'), freqs, 'Hz'))), 'k--'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_sensitivity_dist_rmc.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_sensitivity_dist_rmc +#+CAPTION: Sensitivity to disturbance once the RMC controller is applied to the system ([[./figs/uniaxial_sensitivity_dist_rmc.png][png]], [[./figs/uniaxial_sensitivity_dist_rmc.pdf][pdf]]) +[[file:figs/uniaxial_sensitivity_dist_rmc.png]] + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + subplot(2, 1, 1); + title('$F_{ty}$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Fty'), freqs, 'Hz'))), 'k-', 'DisplayName', 'OL'); + plot(freqs, abs(squeeze(freqresp(G_rmc('D', 'Fty'), freqs, 'Hz'))), 'k--', 'DisplayName', 'RMC'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); + legend('location', 'northeast'); + + subplot(2, 1, 2); + title('$F_{rz}$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Frz'), freqs, 'Hz'))), 'k-'); + plot(freqs, abs(squeeze(freqresp(G_rmc('D', 'Frz'), freqs, 'Hz'))), 'k--'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_sensitivity_dist_stages_rmc.pdf" :var figsize="full-normal" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_sensitivity_dist_stages_rmc +#+CAPTION: Sensitivity to force disturbances in various stages when RMC is applied ([[./figs/uniaxial_sensitivity_dist_stages_rmc.png][png]], [[./figs/uniaxial_sensitivity_dist_stages_rmc.pdf][pdf]]) +[[file:figs/uniaxial_sensitivity_dist_stages_rmc.png]] + +** Damped Plant +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Fn'), freqs, 'Hz'))), 'k-', 'DisplayName', 'OL'); + plot(freqs, abs(squeeze(freqresp(G_rmc('D', 'Fn'), freqs, 'Hz'))), 'k--', 'DisplayName', 'RMC'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + legend('location', 'northeast'); + + ax2 = subplot(2, 1, 2); + hold on; + plot(freqs, 180/pi*angle(squeeze(freqresp(G('D', 'Fn'), freqs, 'Hz'))), 'k-'); + plot(freqs, 180/pi*angle(squeeze(freqresp(G_rmc('D', 'Fn'), freqs, 'Hz'))), 'k--'); + 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]); + + linkaxes([ax1,ax2],'x'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_plant_rmc_damped.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_plant_rmc_damped +#+CAPTION: Damped Plant after RMC is applied ([[./figs/uniaxial_plant_rmc_damped.png][png]], [[./figs/uniaxial_plant_rmc_damped.pdf][pdf]]) +[[file:figs/uniaxial_plant_rmc_damped.png]] + +** Save +#+begin_src matlab + save('./uniaxial/mat/plants.mat', 'G_rmc', '-append'); +#+end_src + +** Conclusion +#+begin_important +Relative Motion Control: +#+end_important + +* Direct Velocity Feedback +<> +** Introduction :ignore: +In the Relative Motion Control (RMC), a feedback is applied between the measured velocity of the platform to the actuator force input. + +** Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) + <> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes + <> +#+end_src + +#+begin_src matlab :tangle no + simulinkproject('../'); +#+end_src + +#+begin_src matlab + open 'simscape/sim_nano_station_uniaxial.slx' +#+end_src + +** Control Design +#+begin_src matlab + load('./uniaxial/mat/plants.mat', 'G'); +#+end_src + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + plot(freqs, abs(squeeze(freqresp(G('Vlm', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + + ax2 = subplot(2, 1, 2); + plot(freqs, 180/pi*angle(squeeze(freqresp(G('Vlm', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-180, 180]); + yticks([-180, -90, 0, 90, 180]); + + linkaxes([ax1,ax2],'x'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_dvf_plant.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_dvf_plant +#+CAPTION: Transfer function from forces applied in the legs to leg velocity sensor ([[./figs/uniaxial_dvf_plant.png][png]], [[./figs/uniaxial_dvf_plant.pdf][pdf]]) +[[file:figs/uniaxial_dvf_plant.png]] + +#+begin_src matlab + K_dvf = tf(5e4); +#+end_src + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + plot(freqs, abs(squeeze(freqresp(K_dvf*G('Vlm', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + + ax2 = subplot(2, 1, 2); + plot(freqs, 180/pi*angle(squeeze(freqresp(K_dvf*G('Vlm', 'Fn'), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-180, 180]); + yticks([-180, -90, 0, 90, 180]); + + linkaxes([ax1,ax2],'x'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_dvf_loop_gain.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_dvf_loop_gain +#+CAPTION: Transfer function from forces applied in the legs to leg velocity sensor ([[./figs/uniaxial_dvf_loop_gain.png][png]], [[./figs/uniaxial_dvf_loop_gain.pdf][pdf]]) +[[file:figs/uniaxial_dvf_loop_gain.png]] + +** Identification +Let's initialize the system prior to identification. +#+begin_src matlab + initializeGround(); + initializeGranite(); + initializeTy(); + initializeRy(); + initializeRz(); + initializeMicroHexapod(); + initializeAxisc(); + initializeMirror(); + initializeNanoHexapod(struct('actuator', 'piezo')); + initializeSample(struct('mass', 50)); +#+end_src + +And initialize the controllers. +#+begin_src matlab + K = tf(0); + save('./mat/controllers.mat', 'K', '-append'); + K_iff = tf(0); + save('./mat/controllers.mat', 'K_iff', '-append'); + K_rmc = tf(0); + save('./mat/controllers.mat', 'K_rmc', '-append'); + K_dvf = -K_dvf; + save('./mat/controllers.mat', 'K_dvf', '-append'); +#+end_src + +#+begin_src matlab + %% Options for Linearized + options = linearizeOptions; + options.SampleTime = 0; + + %% Name of the Simulink File + mdl = 'sim_nano_station_uniaxial'; +#+end_src + +#+begin_src matlab + %% Input/Output definition + io(1) = linio([mdl, '/Dw'], 1, 'input'); % Ground Motion + io(2) = linio([mdl, '/Fs'], 1, 'input'); % Force applied on the sample + io(3) = linio([mdl, '/Fnl'], 1, 'input'); % Force applied by the NASS + io(4) = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty + io(5) = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz + + io(6) = linio([mdl, '/Dsm'], 1, 'output'); % Displacement of the sample + io(7) = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs + io(8) = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs + io(9) = linio([mdl, '/Dgm'], 1, 'output'); % Absolute displacement of the granite + io(10) = linio([mdl, '/Vlm'], 1, 'output'); % Measured absolute velocity of the top NASS platform +#+end_src + +#+begin_src matlab + %% Run the linearization + G_dvf = linearize(mdl, io, options); + G_dvf.InputName = {'Dw', ... % Ground Motion [m] + 'Fs', ... % Force Applied on Sample [N] + 'Fn', ... % Force applied by NASS [N] + 'Fty', ... % Parasitic Force Ty [N] + 'Frz'}; % Parasitic Force Rz [N] + G_dvf.OutputName = {'D', ... % Measured sample displacement x.r.t. granite [m] + 'Fnm', ... % Force Sensor in NASS [N] + 'Dnm', ... % Displacement Sensor in NASS [m] + 'Dgm', ... % Asbolute displacement of Granite [m] + 'Vlm'}; ... % Absolute Velocity of NASS [m/s] +#+end_src + +** Sensitivity to Disturbance +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + subplot(2, 1, 1); + title('$D_w$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Dw'), freqs, 'Hz'))), 'k-', 'DisplayName', 'OL'); + plot(freqs, abs(squeeze(freqresp(G_dvf('D', 'Dw'), freqs, 'Hz'))), 'k--', 'DisplayName', 'DVF'); + hold 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('D', 'Fs'), freqs, 'Hz'))), 'k-'); + plot(freqs, abs(squeeze(freqresp(G_dvf('D', 'Fs'), freqs, 'Hz'))), 'k--'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_sensitivity_dist_dvf.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_sensitivity_dist_dvf +#+CAPTION: Sensitivity to disturbance once the DVF controller is applied to the system ([[./figs/uniaxial_sensitivity_dist_dvf.png][png]], [[./figs/uniaxial_sensitivity_dist_dvf.pdf][pdf]]) +[[file:figs/uniaxial_sensitivity_dist_dvf.png]] + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + subplot(2, 1, 1); + title('$F_{ty}$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Fty'), freqs, 'Hz'))), 'k-', 'DisplayName', 'OL'); + plot(freqs, abs(squeeze(freqresp(G_dvf('D', 'Fty'), freqs, 'Hz'))), 'k--', 'DisplayName', 'DVF'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); + legend('location', 'northeast'); + + subplot(2, 1, 2); + title('$F_{rz}$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Frz'), freqs, 'Hz'))), 'k-'); + plot(freqs, abs(squeeze(freqresp(G_dvf('D', 'Frz'), freqs, 'Hz'))), 'k--'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_sensitivity_dist_stages_dvf.pdf" :var figsize="full-normal" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_sensitivity_dist_stages_dvf +#+CAPTION: Sensitivity to force disturbances in various stages when DVF is applied ([[./figs/uniaxial_sensitivity_dist_stages_dvf.png][png]], [[./figs/uniaxial_sensitivity_dist_stages_dvf.pdf][pdf]]) +[[file:figs/uniaxial_sensitivity_dist_stages_dvf.png]] + +** Damped Plant +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Fn'), freqs, 'Hz'))), 'k-', 'DisplayName', 'OL'); + plot(freqs, abs(squeeze(freqresp(G_dvf('D', 'Fn'), freqs, 'Hz'))), 'k--', 'DisplayName', 'DVF'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + legend('location', 'northeast'); + + ax2 = subplot(2, 1, 2); + hold on; + plot(freqs, 180/pi*angle(squeeze(freqresp(G('D', 'Fn'), freqs, 'Hz'))), 'k-'); + plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf('D', 'Fn'), freqs, 'Hz'))), 'k--'); + 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]); + + linkaxes([ax1,ax2],'x'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_plant_dvf_damped.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_plant_dvf_damped +#+CAPTION: Damped Plant after DVF is applied ([[./figs/uniaxial_plant_dvf_damped.png][png]], [[./figs/uniaxial_plant_dvf_damped.pdf][pdf]]) +[[file:figs/uniaxial_plant_dvf_damped.png]] + +** Save +#+begin_src matlab + save('./uniaxial/mat/plants.mat', 'G_dvf', '-append'); +#+end_src + +** Conclusion +#+begin_important +Direct Velocity Feedback: +#+end_important +* Comparison of Active Damping Techniques +<> +** Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) + <> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes + <> +#+end_src + +#+begin_src matlab :tangle no + simulinkproject('../'); +#+end_src + +#+begin_src matlab + open 'simscape/sim_nano_station_uniaxial.slx' +#+end_src + +** Load the plants +#+begin_src matlab + load('./uniaxial/mat/plants.mat', 'G', 'G_iff', 'G_rmc', 'G_dvf'); +#+end_src + +** Sensitivity to Disturbance +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + subplot(2, 1, 1); + title('$D_w$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Dw'), freqs, 'Hz'))), 'k-', 'DisplayName', 'OL'); + plot(freqs, abs(squeeze(freqresp(G_iff('D', 'Dw'), freqs, 'Hz'))), 'k:', 'DisplayName', 'IFF'); + plot(freqs, abs(squeeze(freqresp(G_rmc('D', 'Dw'), freqs, 'Hz'))), 'k--', 'DisplayName', 'RMC'); + plot(freqs, abs(squeeze(freqresp(G_dvf('D', 'Dw'), freqs, 'Hz'))), 'k-.', 'DisplayName', 'DVF'); + hold 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('D', 'Fs'), freqs, 'Hz'))), 'k-'); + plot(freqs, abs(squeeze(freqresp(G_iff('D', 'Fs'), freqs, 'Hz'))), 'k:'); + plot(freqs, abs(squeeze(freqresp(G_rmc('D', 'Fs'), freqs, 'Hz'))), 'k--'); + plot(freqs, abs(squeeze(freqresp(G_dvf('D', 'Fs'), freqs, 'Hz'))), 'k-.'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_sensitivity_dist_comp.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_sensitivity_dist_comp +#+CAPTION: Sensitivity to disturbance - Comparison ([[./figs/uniaxial_sensitivity_dist_comp.png][png]], [[./figs/uniaxial_sensitivity_dist_comp.pdf][pdf]]) +[[file:figs/uniaxial_sensitivity_dist_comp.png]] + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + subplot(2, 1, 1); + title('$F_{ty}$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Fty'), freqs, 'Hz'))), 'k-', 'DisplayName', 'OL'); + plot(freqs, abs(squeeze(freqresp(G_iff('D', 'Fty'), freqs, 'Hz'))), 'k:', 'DisplayName', 'IFF'); + plot(freqs, abs(squeeze(freqresp(G_rmc('D', 'Fty'), freqs, 'Hz'))), 'k--', 'DisplayName', 'RMC'); + plot(freqs, abs(squeeze(freqresp(G_dvf('D', 'Fty'), freqs, 'Hz'))), 'k-.', 'DisplayName', 'DVF'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); + legend('location', 'northeast'); + + subplot(2, 1, 2); + title('$F_{rz}$ to $D$'); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Frz'), freqs, 'Hz'))), 'k-'); + plot(freqs, abs(squeeze(freqresp(G_iff('D', 'Frz'), freqs, 'Hz'))), 'k'); + plot(freqs, abs(squeeze(freqresp(G_rmc('D', 'Frz'), freqs, 'Hz'))), 'k--'); + plot(freqs, abs(squeeze(freqresp(G_dvf('D', 'Frz'), freqs, 'Hz'))), 'k-.'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_sensitivity_dist_stages_comp.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_sensitivity_dist_stages_comp +#+CAPTION: Sensitivity to force disturbances - Comparison ([[./figs/uniaxial_sensitivity_dist_stages_comp.png][png]], [[./figs/uniaxial_sensitivity_dist_stages_comp.pdf][pdf]]) +[[file:figs/uniaxial_sensitivity_dist_stages_comp.png]] + +** Damped Plant +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + hold on; + plot(freqs, abs(squeeze(freqresp(G('D', 'Fn'), freqs, 'Hz'))), 'k-', 'DisplayName', 'OL'); + plot(freqs, abs(squeeze(freqresp(G_iff('D', 'Fn'), freqs, 'Hz'))), 'k:', 'DisplayName', 'IFF'); + plot(freqs, abs(squeeze(freqresp(G_rmc('D', 'Fn'), freqs, 'Hz'))), 'k--', 'DisplayName', 'RMC'); + plot(freqs, abs(squeeze(freqresp(G_dvf('D', 'Fn'), freqs, 'Hz'))), 'k-.', 'DisplayName', 'DVF'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + legend('location', 'northeast'); + + ax2 = subplot(2, 1, 2); + hold on; + plot(freqs, 180/pi*angle(squeeze(freqresp(G('D', 'Fn'), freqs, 'Hz'))), 'k-'); + plot(freqs, 180/pi*angle(squeeze(freqresp(G_iff('D', 'Fn'), freqs, 'Hz'))), 'k:'); + plot(freqs, 180/pi*angle(squeeze(freqresp(G_rmc('D', 'Fn'), freqs, 'Hz'))), 'k--'); + plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf('D', 'Fn'), freqs, 'Hz'))), 'k-.'); + 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]); + + linkaxes([ax1,ax2],'x'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/uniaxial_plant_damped_comp.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:uniaxial_plant_damped_comp +#+CAPTION: Damped Plant - Comparison ([[./figs/uniaxial_plant_damped_comp.png][png]], [[./figs/uniaxial_plant_damped_comp.pdf][pdf]]) +[[file:figs/uniaxial_plant_damped_comp.png]] +** Conclusion diff --git a/uniaxial/mat/plants.mat b/uniaxial/mat/plants.mat new file mode 100644 index 0000000000000000000000000000000000000000..1e3496555c9c721c5629af606eb46268313a7049 GIT binary patch literal 16092 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 literal 0 HcmV?d00001