diff --git a/docs/figs/2dof_system_granite_stiffness.pdf b/docs/figs/2dof_system_granite_stiffness.pdf new file mode 100644 index 0000000..39663b4 Binary files /dev/null and b/docs/figs/2dof_system_granite_stiffness.pdf differ diff --git a/docs/figs/2dof_system_granite_stiffness.png b/docs/figs/2dof_system_granite_stiffness.png new file mode 100644 index 0000000..9e6d416 Binary files /dev/null and b/docs/figs/2dof_system_granite_stiffness.png differ diff --git a/docs/figs/opt_stiff_dist_fty_frz.pdf b/docs/figs/opt_stiff_dist_fty_frz.pdf new file mode 100644 index 0000000..d010b69 Binary files /dev/null and b/docs/figs/opt_stiff_dist_fty_frz.pdf differ diff --git a/docs/figs/opt_stiff_dist_fty_frz.png b/docs/figs/opt_stiff_dist_fty_frz.png new file mode 100644 index 0000000..674c0a1 Binary files /dev/null and b/docs/figs/opt_stiff_dist_fty_frz.png differ diff --git a/docs/figs/opt_stiff_dist_gm.pdf b/docs/figs/opt_stiff_dist_gm.pdf new file mode 100644 index 0000000..b934ca7 Binary files /dev/null and b/docs/figs/opt_stiff_dist_gm.pdf differ diff --git a/docs/figs/opt_stiff_dist_gm.png b/docs/figs/opt_stiff_dist_gm.png new file mode 100644 index 0000000..407c726 Binary files /dev/null and b/docs/figs/opt_stiff_dist_gm.png differ diff --git a/docs/index.html b/docs/index.html index 3297bdd..8a1b53b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4,7 +4,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Simscape Model of the Nano-Active-Stabilization-System @@ -249,7 +249,7 @@
  • 10. Effect of support’s compliance on the plant dynamics (link)
  • 11. Effect of the payload’s “impedance” on the plant dynamics (link)
  • 12. Effect of Experimental conditions on the plant dynamics (link)
  • -
  • 13. Optimal Stiffness of the nano-hexapod (link)
  • +
  • 13. Optimal Stiffness of the nano-hexapod to reduce plant uncertainty (link)
  • 14. Active Damping Techniques on the full Simscape Model (link)
  • 15. Control of the Nano-Active-Stabilization-System (link)
  • 16. Useful Matlab Functions (link)
  • @@ -407,8 +407,8 @@ Conclusion are drawn about what experimental conditions are critical on the vari -
    -

    13 Optimal Stiffness of the nano-hexapod (link)

    +
    +

    13 Optimal Stiffness of the nano-hexapod to reduce plant uncertainty (link)

    @@ -444,7 +444,7 @@ These functions are all defined here.

    Author: Dehaeze Thomas

    -

    Created: 2020-04-01 mer. 17:19

    +

    Created: 2020-04-07 mar. 14:55

    diff --git a/docs/optimal_stiffness_disturbances.html b/docs/optimal_stiffness_disturbances.html new file mode 100644 index 0000000..2f758ba --- /dev/null +++ b/docs/optimal_stiffness_disturbances.html @@ -0,0 +1,804 @@ + + + + + + + + +Determination of the optimal nano-hexapod’s stiffness for reducing the effect of disturbances + + + + + + + + + + + + + + + +
    + UP + | + HOME +
    +

    Determination of the optimal nano-hexapod’s stiffness for reducing the effect of disturbances

    + + + + + + + +
    +

    1 Spectral Density of Disturbances

    +
    +

    + +

    +

    +The level of disturbances has been identified form experiments. +This is detailed in this document. +

    +
    +
    +

    1.1 Load of the identified disturbances

    +
    +
    +
    load('./mat/dist_psd.mat', 'dist_f');
    +
    +
    +
    +
    + +
    +

    1.2 Plots

    +
    +
    +
    +

    2 Effect of disturbances on the position error

    +
    +

    + +

    +
    +
    +

    2.1 Initialization

    +
    +

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

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

    +We use a sample mass of 10kg. +

    +
    +
    initializeSample('mass', 10);
    +
    +
    + +
    +
    initializeSimscapeConfiguration('gravity', true);
    +initializeDisturbances('enable', false);
    +initializeLoggingConfiguration('log', 'none');
    +initializeController();
    +
    +
    +
    +
    + + +
    +

    2.2 Identification

    +
    +

    +Inputs: +

    +
      +
    • Dwx: Ground displacement in the \(x\) direction
    • +
    • Dwy: Ground displacement in the \(y\) direction
    • +
    • Dwz: Ground displacement in the \(z\) direction
    • +
    • Fty_x: Forces applied by the Translation stage in the \(x\) direction
    • +
    • Fty_z: Forces applied by the Translation stage in the \(z\) direction
    • +
    • Frz_z: Forces applied by the Spindle in the \(z\) direction
    • +
    • Fd: Direct forces applied at the center of mass of the Payload
    • +
    + +
    +
    Ks = logspace(3,9,7); % [N/m]
    +
    +
    + +
    +
    %% Name of the Simulink File
    +mdl = 'nass_model';
    +
    +%% Micro-Hexapod
    +clear io; io_i = 1;
    +io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwx');   io_i = io_i + 1; % X Ground motion
    +io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwy');   io_i = io_i + 1; % Y Ground motion
    +io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwz');   io_i = io_i + 1; % Z Ground motion
    +io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Fty_x'); io_i = io_i + 1; % Parasitic force Ty - X
    +io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Fty_z'); io_i = io_i + 1; % Parasitic force Ty - Z
    +io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Frz_z'); io_i = io_i + 1; % Parasitic force Rz - Z
    +io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Fd');    io_i = io_i + 1; % Direct forces
    +
    +io(io_i) = linio([mdl, '/Tracking Error'], 1, 'openoutput', [], 'En');   io_i = io_i + 1; % Position Error
    +
    +
    + +
    +
    for i = 1:length(Ks)
    +    initializeNanoHexapod('k', Ks(i));
    +
    +    % Run the linearization
    +    G = linearize(mdl, io);
    +    G.InputName  = {'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_z', 'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
    +    G.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
    +    Gd(i) = {minreal(G)};
    +end
    +
    +
    +
    +
    + +
    +

    2.3 Plots

    +
    +

    +Effect of Stages vibration (Filtering). +Effect of Ground motion (Transmissibility). +Direct Forces (Compliance). +

    +
    +
    +
    +

    2.4 Save

    +
    +
    +
    save('./mat/opt_stiffness_disturbances.mat', 'Gd')
    +
    +
    +
    +
    +
    + +
    +

    3 Effect of granite stiffness

    +
    +

    + +

    +
    +
    +

    3.1 Analytical Analysis

    +
    + +
    +

    2dof_system_granite_stiffness.png +

    +

    Figure 1: Figure caption

    +
    + +

    +If we write the equation of motion of the system in Figure 1, we obtain: +

    +\begin{align} + m^\prime s^2 x^\prime &= (c^\prime s + k^\prime) (x - x^\prime) \\ + ms^2 x &= (c^\prime s + k^\prime) (x^\prime - x) + (cs + k) (x_w - x) +\end{align} + +

    +If we note \(d = x^\prime - x\), we obtain: +

    +\begin{equation} +\label{org4396920} + \frac{d}{x_w} = \frac{-m^\prime s^2 (cs + k)}{ (m^\prime s^2 + c^\prime s + k^\prime) (ms^2 + cs + k) + m^\prime s^2(c^\prime s + k^\prime)} +\end{equation} +
    +
    + +
    +

    3.2 Soft Granite

    +
    +

    +Let’s initialize a soft granite that will act as an isolation stage from ground motion. +

    +
    +
    initializeGranite('K', 5e5*ones(3,1), 'C', 5e3*ones(3,1));
    +
    +
    + +
    +
    Ks = logspace(3,9,7); % [N/m]
    +
    +
    + +
    +
    for i = 1:length(Ks)
    +    initializeNanoHexapod('k', Ks(i));
    +
    +    G = linearize(mdl, io);
    +    G.InputName  = {'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_z', 'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
    +    G.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
    +    Gdr(i) = {minreal(G)};
    +end
    +
    +
    +
    +
    + +
    +

    3.3 Effect of the Granite transfer function

    +
    +
    +
    +

    4 Open Loop Budget Error

    +
    +

    + +

    +
    +
    +

    4.1 Load of the identified disturbances and transfer functions

    +
    +
    +
    load('./mat/dist_psd.mat', 'dist_f');
    +load('./mat/opt_stiffness_disturbances.mat', 'Gd')
    +
    +
    +
    +
    + +
    +

    4.2 Equations

    +
    + +
    +

    4.3 Results

    +
    +

    +Effect of all disturbances +

    + +
    +
    freqs = dist_f.f;
    +
    +figure;
    +hold on;
    +for i = 1:length(Ks)
    +  plot(freqs, sqrt(dist_f.psd_rz).*abs(squeeze(freqresp(Gd{i}('Ez', 'Frz_z'), freqs, 'Hz'))));
    +end
    +hold off;
    +set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
    +xlabel('Frequency [Hz]'); ylabel('ASD $\left[\frac{m}{\sqrt{Hz}}\right]$')
    +legend('Location', 'southwest');
    +xlim([2, 500]);
    +
    +
    +
    +
    + +
    +

    4.4 Cumulative Amplitude Spectrum

    +
    +
    +
    freqs = dist_f.f;
    +
    +figure;
    +hold on;
    +for i = 1:length(Ks)
    +  plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(dist_f.psd_ty.*abs(squeeze(freqresp(Gd{i}('Ez', 'Fty_z'), freqs, 'Hz'))).^2)))), '-', ...
    +         'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
    +end
    +plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
    +hold off;
    +set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
    +xlabel('Frequency [Hz]'); ylabel('CAS $[m]$')
    +legend('Location', 'southwest');
    +xlim([2, 500]); ylim([1e-10 1e-6]);
    +
    +
    + +
    +
    freqs = dist_f.f;
    +
    +figure;
    +hold on;
    +for i = 1:length(Ks)
    +  plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(dist_f.psd_rz.*abs(squeeze(freqresp(Gd{i}('Ez', 'Frz_z'), freqs, 'Hz'))).^2)))), '-', ...
    +         'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
    +end
    +plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
    +hold off;
    +set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
    +xlabel('Frequency [Hz]'); ylabel('CAS $[m]$')
    +legend('Location', 'southwest');
    +xlim([2, 500]); ylim([1e-10 1e-6]);
    +
    +
    + +

    +Ground motion +

    +
    +
    freqs = dist_f.f;
    +
    +figure;
    +hold on;
    +for i = 1:length(Ks)
    +  plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(dist_f.psd_gm.*abs(squeeze(freqresp(Gd{i}('Ez', 'Dwz'), freqs, 'Hz'))).^2)))), '-', ...
    +         'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
    +end
    +plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
    +hold off;
    +set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
    +xlabel('Frequency [Hz]'); ylabel('CAS $E_y$ $[m]$')
    +legend('Location', 'northeast');
    +xlim([2, 500]); ylim([1e-10 1e-6]);
    +
    +
    + +
    +
    freqs = dist_f.f;
    +
    +figure;
    +hold on;
    +for i = 1:length(Ks)
    +  plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(dist_f.psd_gm.*abs(squeeze(freqresp(Gd{i}('Ex', 'Dwx'), freqs, 'Hz'))).^2)))), '-', ...
    +         'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
    +end
    +plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
    +hold off;
    +set(gca, 'xscale', 'log'); set(gca, 'yscale', 'lin');
    +xlabel('Frequency [Hz]'); ylabel('CAS $E_y$ $[m]$')
    +legend('Location', 'northeast');
    +xlim([2, 500]);
    +
    +
    + +
    +
    freqs = dist_f.f;
    +
    +figure;
    +hold on;
    +for i = 1:length(Ks)
    +  plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(dist_f.psd_gm.*abs(squeeze(freqresp(Gd{i}('Ey', 'Dwy'), freqs, 'Hz'))).^2)))), '-', ...
    +         'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
    +end
    +plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
    +hold off;
    +set(gca, 'xscale', 'log'); set(gca, 'yscale', 'lin');
    +xlabel('Frequency [Hz]'); ylabel('CAS $E_y$ $[m]$')
    +legend('Location', 'northeast');
    +xlim([2, 500]);
    +
    +
    + +

    +Sum of all perturbations +

    +
    +
    psd_tot = zeros(length(freqs), length(Ks));
    +
    +for i = 1:length(Ks)
    +    psd_tot(:,i) = dist_f.psd_gm.*abs(squeeze(freqresp(Gd{i}('Ez', 'Dwz'  ), freqs, 'Hz'))).^2 + ...
    +        dist_f.psd_ty.*abs(squeeze(freqresp(Gd{i}('Ez', 'Fty_z'), freqs, 'Hz'))).^2 + ...
    +        dist_f.psd_rz.*abs(squeeze(freqresp(Gd{i}('Ez', 'Frz_z'), freqs, 'Hz'))).^2;
    +end
    +
    +
    + +
    +
    freqs = dist_f.f;
    +
    +figure;
    +hold on;
    +for i = 1:length(Ks)
    +  plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(psd_tot(:,i))))), '-', ...
    +         'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)));
    +end
    +plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
    +hold off;
    +set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
    +xlabel('Frequency [Hz]'); ylabel('CAS $E_z$ $[m]$')
    +legend('Location', 'northeast');
    +xlim([1, 500]); ylim([1e-10 1e-6]);
    +
    +
    +
    +
    +
    + +
    +

    5 Closed Loop Budget Error

    +
    +

    + +

    +
    +
    +

    5.1 Reduction thanks to feedback - Required bandwidth

    +
    +
    +
    wc = 1*2*pi; % [rad/s]
    +xic = 0.5;
    +
    +S = (s/wc)/(1 + s/wc);
    +
    +bodeFig({S}, logspace(-1,2,1000))
    +
    +
    + +
    +
    wc = [1, 5, 10, 20, 50, 100, 200];
    +
    +S1 = {zeros(length(wc), 1)};
    +S2 = {zeros(length(wc), 1)};
    +
    +for j = 1:length(wc)
    +    L = (2*pi*wc(j))/s; % Simple integrator
    +    S1{j} = 1/(1 + L);
    +    L = ((2*pi*wc(j))/s)^2*(1 + s/(2*pi*wc(j)/2))/(1 + s/(2*pi*wc(j)*2));
    +    S2{j} = 1/(1 + L);
    +end
    +
    +
    + +
    +
    freqs = dist_f.f;
    +
    +figure;
    +hold on;
    +i = 6;
    +for j = 1:length(wc)
    +    set(gca,'ColorOrderIndex',j);
    +    plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(abs(squeeze(freqresp(S1{j}, freqs, 'Hz'))).^2.*psd_tot(:,i))))), '-', ...
    +         'DisplayName', sprintf('$\\omega_c = %.0f$ [Hz]', wc(j)));
    +end
    +plot(freqs, sqrt(flip(-cumtrapz(flip(freqs), flip(psd_tot(:,i))))), 'k-', ...
    +     'DisplayName', 'Open-Loop');
    +plot([freqs(1) freqs(end)], [10e-9 10e-9], 'k--', 'HandleVisibility', 'off');
    +hold off;
    +set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
    +xlabel('Frequency [Hz]'); ylabel('CAS $E_y$ $[m]$')
    +legend('Location', 'northeast');
    +xlim([0.5, 500]); ylim([1e-10 1e-6]);
    +
    +
    + +
    +
    wc = logspace(0, 3, 100);
    +
    +Dz1_rms = zeros(length(Ks), length(wc));
    +Dz2_rms = zeros(length(Ks), length(wc));
    +for i = 1:length(Ks)
    +    for j = 1:length(wc)
    +        L = (2*pi*wc(j))/s;
    +        Dz1_rms(i, j) = sqrt(trapz(freqs, abs(squeeze(freqresp(1/(1 + L), freqs, 'Hz'))).^2.*psd_tot(:,i)));
    +
    +        L = ((2*pi*wc(j))/s)^2*(1 + s/(2*pi*wc(j)/2))/(1 + s/(2*pi*wc(j)*2));
    +        Dz2_rms(i, j) = sqrt(trapz(freqs, abs(squeeze(freqresp(1/(1 + L), freqs, 'Hz'))).^2.*psd_tot(:,i)));
    +    end
    +end
    +
    +
    + +
    +
    freqs = dist_f.f;
    +
    +figure;
    +hold on;
    +for i = 1:length(Ks)
    +  set(gca,'ColorOrderIndex',i);
    +  plot(wc, Dz1_rms(i, :), '-', ...
    +         'DisplayName', sprintf('$k = %.0g$ [N/m]', Ks(i)))
    +
    +  set(gca,'ColorOrderIndex',i);
    +  plot(wc, Dz2_rms(i, :), '--', ...
    +         'HandleVisibility', 'off')
    +end
    +hold off;
    +set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
    +xlabel('Control Bandwidth [Hz]'); ylabel('$E_z\ [m, rms]$')
    +legend('Location', 'southwest');
    +xlim([1, 500]);
    +
    +
    +
    +
    +
    +
    +

    6 Conclusion

    +
    +
    +
    +

    Author: Dehaeze Thomas

    +

    Created: 2020-04-07 mar. 14:57

    +
    + + diff --git a/docs/simscape_subsystems.html b/docs/simscape_subsystems.html index 4e147c3..1c138a6 100644 --- a/docs/simscape_subsystems.html +++ b/docs/simscape_subsystems.html @@ -4,7 +4,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Subsystems used for the Simscape Models @@ -239,170 +239,170 @@
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [] = initializeSimscapeConfiguration(args)
     
    @@ -472,9 +472,9 @@ These functions are defined below.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
       args.gravity logical {mustBeNumericOrLogical} = true
    @@ -484,9 +484,9 @@ These functions are defined below.
     
    -
    -

    Structure initialization

    -
    +
    +

    Structure initialization

    +
    conf_simscape = struct();
     
    @@ -494,9 +494,9 @@ These functions are defined below.
    -
    -

    Add Type

    -
    +
    +

    Add Type

    +
    if args.gravity
       conf_simscape.type = 1;
    @@ -508,9 +508,9 @@ These functions are defined below.
     
    -
    -

    Save the Structure

    -
    +
    +

    Save the Structure

    +
    save('./mat/conf_simscape.mat', 'conf_simscape');
     
    @@ -527,9 +527,9 @@ These functions are defined below.

    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [] = initializeLoggingConfiguration(args)
     
    @@ -537,9 +537,9 @@ These functions are defined below.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
       args.log      char   {mustBeMember(args.log,{'none', 'all', 'forces'})} = 'none'
    @@ -550,9 +550,9 @@ These functions are defined below.
     
    -
    -

    Structure initialization

    -
    +
    +

    Structure initialization

    +
    conf_log = struct();
     
    @@ -560,9 +560,9 @@ These functions are defined below.
    -
    -

    Add Type

    -
    +
    +

    Add Type

    +
    switch args.log
       case 'none'
    @@ -587,9 +587,9 @@ These functions are defined below.
     
    -
    -

    Save the Structure

    -
    +
    +

    Save the Structure

    +
    save('./mat/conf_log.mat', 'conf_log');
     
    @@ -606,9 +606,9 @@ These functions are defined below.

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    The model of the Ground is composed of:

    @@ -633,9 +633,9 @@ The model of the Ground is composed of:
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [ground] = initializeGround(args)
     
    @@ -643,9 +643,9 @@ The model of the Ground is composed of:
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
       args.type char {mustBeMember(args.type,{'none', 'rigid'})} = 'rigid'
    @@ -656,9 +656,9 @@ The model of the Ground is composed of:
     
    -
    -

    Structure initialization

    -
    +
    +

    Structure initialization

    +

    First, we initialize the granite structure.

    @@ -669,9 +669,9 @@ First, we initialize the granite structure.
    -
    -

    Add Type

    -
    +
    +

    Add Type

    +
    switch args.type
       case 'none'
    @@ -708,9 +708,9 @@ ground.density = 2800;        % [kg/m3]
     
    -
    -

    Save the Structure

    -
    +
    +

    Save the Structure

    +

    The ground structure is saved.

    @@ -730,9 +730,9 @@ The ground structure is saved.

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    The Simscape model of the granite is composed of:

    @@ -761,9 +761,9 @@ The output sample_pos corresponds to the impact point of the X-ray.
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [granite] = initializeGranite(args)
     
    @@ -771,14 +771,16 @@ The output sample_pos corresponds to the impact point of the X-ray.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
       args.type          char    {mustBeMember(args.type,{'rigid', 'flexible', 'none', 'modal-analysis', 'init'})} = 'flexible'
       args.Foffset       logical {mustBeNumericOrLogical} = false
       args.density (1,1) double {mustBeNumeric, mustBeNonnegative} = 2800 % Density [kg/m3]
    +  args.K  (3,1) double {mustBeNumeric, mustBeNonnegative} = [4e9; 3e8; 8e8] % [N/m]
    +  args.C  (3,1) double {mustBeNumeric, mustBeNonnegative} = [4.0e5; 1.1e5; 9.0e5] % [N/(m/s)]
       args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m]
       args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m]
       args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m]
    @@ -788,10 +790,9 @@ The output sample_pos corresponds to the impact point of the X-ray.
     
    - -
    -

    Structure initialization

    -
    +
    +

    Structure initialization

    +

    First, we initialize the granite structure.

    @@ -823,9 +824,9 @@ First, we initialize the granite structure.
    -
    -

    Material and Geometry

    -
    +
    +

    Material and Geometry

    +

    Properties of the Material and link to the geometry of the granite.

    @@ -845,20 +846,20 @@ Z-offset for the initial position of the sample with respect to the granite top
    -
    -

    Stiffness and Damping properties

    -
    +
    +

    Stiffness and Damping properties

    +
    -
    granite.K = [4e9; 3e8; 8e8]; % [N/m]
    -granite.C = [4.0e5; 1.1e5; 9.0e5]; % [N/(m/s)]
    +
    granite.K = args.K; % [N/m]
    +granite.C = args.C; % [N/(m/s)]
     
    -
    -

    Equilibrium position of the each joint.

    -
    +
    +

    Equilibrium position of the each joint.

    +
    if args.Foffset && ~strcmp(args.type, 'none') && ~strcmp(args.type, 'rigid') && ~strcmp(args.type, 'init')
       load('mat/Foffset.mat', 'Fgm');
    @@ -871,9 +872,9 @@ granite.C = [4.0e5; 1.1e5; 9.0e5]; % [N/(m/s)]
     
    -
    -

    Save the Structure

    -
    +
    +

    Save the Structure

    +

    The granite structure is saved.

    @@ -885,17 +886,17 @@ The granite structure is saved.
    -
    -

    5 Translation Stage

    +
    +

    5 Translation Stage

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    The Simscape model of the Translation stage consist of:

    @@ -925,9 +926,9 @@ It is used to impose the motion in the Y direction
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [ty] = initializeTy(args)
     
    @@ -935,9 +936,9 @@ It is used to impose the motion in the Y direction
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
       args.type      char   {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'modal-analysis', 'init'})} = 'flexible'
    @@ -948,9 +949,9 @@ It is used to impose the motion in the Y direction
     
    -
    -

    Structure initialization

    -
    +
    +

    Structure initialization

    +

    First, we initialize the ty structure.

    @@ -982,9 +983,9 @@ First, we initialize the ty structure.
    -
    -

    Material and Geometry

    -
    +
    +

    Material and Geometry

    +

    Define the density of the materials as well as the geometry (STEP files).

    @@ -1029,9 +1030,9 @@ ty.rotor.STEP = './STEPS/ty/Ty_Motor_Rotor.S
    -
    -

    Stiffness and Damping properties

    -
    +
    +

    Stiffness and Damping properties

    +
    ty.K = [2e8; 1e8; 2e8; 6e7; 9e7; 6e7]; % [N/m, N*m/rad]
     ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 2e4]; % [N/(m/s), N*m/(rad/s)]
    @@ -1040,9 +1041,9 @@ ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 2e4]; % [N/(m/s), N*m
     
    -
    -

    Equilibrium position of the each joint.

    -
    +
    +

    Equilibrium position of the each joint.

    +
    if args.Foffset && ~strcmp(args.type, 'none') && ~strcmp(args.type, 'rigid') && ~strcmp(args.type, 'init')
       load('mat/Foffset.mat', 'Ftym');
    @@ -1055,9 +1056,9 @@ ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 2e4]; % [N/(m/s), N*m
     
    -
    -

    Save the Structure

    -
    +
    +

    Save the Structure

    +

    The ty structure is saved.

    @@ -1069,17 +1070,17 @@ The ty structure is saved.
    -
    -

    6 Tilt Stage

    +
    +

    6 Tilt Stage

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    The Simscape model of the Tilt stage is composed of:

    @@ -1109,9 +1110,9 @@ The Ry motion is imposed by the input.
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [ry] = initializeRy(args)
     
    @@ -1119,9 +1120,9 @@ The Ry motion is imposed by the input.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
       args.type          char    {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'modal-analysis', 'init'})} = 'flexible'
    @@ -1133,9 +1134,9 @@ The Ry motion is imposed by the input.
     
    -
    -

    Structure initialization

    -
    +
    +

    Structure initialization

    +

    First, we initialize the ry structure.

    @@ -1168,9 +1169,9 @@ First, we initialize the ry structure.
    -
    -

    Material and Geometry

    -
    +
    +

    Material and Geometry

    +

    Properties of the Material and link to the geometry of the Tilt stage.

    @@ -1208,9 +1209,9 @@ Z-Offset so that the center of rotation matches the sample center;
    -
    -

    Stiffness and Damping properties

    -
    +
    +

    Stiffness and Damping properties

    +
    ry.K = [3.8e8; 4e8; 3.8e8; 1.2e8; 6e4; 1.2e8];
     ry.C = [1e5;   1e5; 1e5;   3e4;   1e3; 3e4];
    @@ -1219,9 +1220,9 @@ ry.C = [1e5;   1e5; 1e5;   3e4;   1e3; 3e4];
     
    -
    -

    Equilibrium position of the each joint.

    -
    +
    +

    Equilibrium position of the each joint.

    +
    if args.Foffset && ~strcmp(args.type, 'none') && ~strcmp(args.type, 'rigid') && ~strcmp(args.type, 'init')
       load('mat/Foffset.mat', 'Fym');
    @@ -1234,9 +1235,9 @@ ry.C = [1e5;   1e5; 1e5;   3e4;   1e3; 3e4];
     
    -
    -

    Save the Structure

    -
    +
    +

    Save the Structure

    +

    The ry structure is saved.

    @@ -1248,17 +1249,17 @@ The ry structure is saved.
    -
    -

    7 Spindle

    +
    +

    7 Spindle

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    The Simscape model of the Spindle is composed of:

    @@ -1284,9 +1285,9 @@ The Simscape model of the Spindle is composed of:
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [rz] = initializeRz(args)
     
    @@ -1294,9 +1295,9 @@ The Simscape model of the Spindle is composed of:
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
       args.type    char    {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'modal-analysis', 'init'})} = 'flexible'
    @@ -1307,9 +1308,9 @@ The Simscape model of the Spindle is composed of:
     
    -
    -

    Structure initialization

    -
    +
    +

    Structure initialization

    +

    First, we initialize the rz structure.

    @@ -1341,9 +1342,9 @@ First, we initialize the rz structure.
    -
    -

    Material and Geometry

    -
    +
    +

    Material and Geometry

    +

    Properties of the Material and link to the geometry of the spindle.

    @@ -1364,9 +1365,9 @@ rz.stator.STEP = './STEPS/rz/Spindle_Stator.STEP'<
    -
    -

    Stiffness and Damping properties

    -
    +
    +

    Stiffness and Damping properties

    +
    rz.K = [7e8; 7e8; 2e9; 1e7; 1e7; 1e7];
     rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4];
    @@ -1375,9 +1376,9 @@ rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4];
     
    -
    -

    Equilibrium position of the each joint.

    -
    +
    +

    Equilibrium position of the each joint.

    +
    if args.Foffset && ~strcmp(args.type, 'none') && ~strcmp(args.type, 'rigid') && ~strcmp(args.type, 'init')
       load('mat/Foffset.mat', 'Fzm');
    @@ -1390,9 +1391,9 @@ rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4];
     
    -
    -

    Save the Structure

    -
    +
    +

    Save the Structure

    +

    The rz structure is saved.

    @@ -1404,17 +1405,17 @@ The rz structure is saved.
    -
    -

    8 Micro Hexapod

    +
    +

    8 Micro Hexapod

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    simscape_model_micro_hexapod.png @@ -1431,9 +1432,9 @@ The rz structure is saved.

    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [micro_hexapod] = initializeMicroHexapod(args)
     
    @@ -1441,9 +1442,9 @@ The rz structure is saved.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         args.type      char   {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'modal-analysis', 'init', 'compliance'})} = 'flexible'
    @@ -1485,9 +1486,9 @@ The rz structure is saved.
     
    -
    -

    Function content

    -
    +
    +

    Function content

    +
    micro_hexapod = initializeFramesPositions('H', args.H, 'MO_B', args.MO_B);
     micro_hexapod = generateGeneralConfiguration(micro_hexapod, 'FH', args.FH, 'FR', args.FR, 'FTh', args.FTh, 'MH', args.MH, 'MR', args.MR, 'MTh', args.MTh);
    @@ -1517,9 +1518,9 @@ Equilibrium position of the each joint.
     
    -
    -

    Add Type

    -
    +
    +

    Add Type

    +
    switch args.type
       case 'none'
    @@ -1540,9 +1541,9 @@ Equilibrium position of the each joint.
     
    -
    -

    Save the Structure

    -
    +
    +

    Save the Structure

    +

    The micro_hexapod structure is saved.

    @@ -1562,9 +1563,9 @@ The micro_hexapod structure is saved.

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    The Simscape model of the Center of gravity compensator is composed of:

    @@ -1589,9 +1590,9 @@ The Simscape model of the Center of gravity compensator is composed of:
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [axisc] = initializeAxisc(args)
     
    @@ -1599,9 +1600,9 @@ The Simscape model of the Center of gravity compensator is composed of:
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
       args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible'
    @@ -1611,9 +1612,9 @@ The Simscape model of the Center of gravity compensator is composed of:
     
    -
    -

    Structure initialization

    -
    +
    +

    Structure initialization

    +

    First, we initialize the axisc structure.

    @@ -1624,9 +1625,9 @@ First, we initialize the axisc structure.
    -
    -

    Add Type

    -
    +
    +

    Add Type

    +
    switch args.type
       case 'none'
    @@ -1641,9 +1642,9 @@ First, we initialize the axisc structure.
     
    -
    -

    Material and Geometry

    -
    +
    +

    Material and Geometry

    +

    Properties of the Material and link to the geometry files.

    @@ -1668,9 +1669,9 @@ axisc.gear.STEP = './STEPS/axisc/axisc_gear.STE
    -
    -

    Save the Structure

    -
    +
    +

    Save the Structure

    +

    The axisc structure is saved.

    @@ -1690,9 +1691,9 @@ The axisc structure is saved.

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    The Simscape Model of the mirror is just a solid body. The output mirror_center corresponds to the center of the Sphere and is the point of measurement for the metrology @@ -1714,9 +1715,9 @@ The output mirror_center corresponds to the center of the Sphere an

    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [] = initializeMirror(args)
     
    @@ -1724,9 +1725,9 @@ The output mirror_center corresponds to the center of the Sphere an
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
       args.type        char   {mustBeMember(args.type,{'none', 'rigid'})} = 'rigid'
    @@ -1738,9 +1739,9 @@ The output mirror_center corresponds to the center of the Sphere an
     
    -
    -

    Structure initialization

    -
    +
    +

    Structure initialization

    +

    First, we initialize the mirror structure.

    @@ -1766,9 +1767,9 @@ First, we initialize the mirror structure.
    -
    -

    Material and Geometry

    -
    +
    +

    Material and Geometry

    +

    We define the geometrical values.

    @@ -1845,9 +1846,9 @@ Finally, we close the shape.
    -
    -

    Save the Structure

    -
    +
    +

    Save the Structure

    +

    The mirror structure is saved.

    @@ -1859,17 +1860,17 @@ The mirror structure is saved.
    -
    -

    11 Nano Hexapod

    +
    +

    11 Nano Hexapod

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    simscape_model_nano_hexapod.png @@ -1886,9 +1887,9 @@ The mirror structure is saved.

    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [nano_hexapod] = initializeNanoHexapod(args)
     
    @@ -1896,9 +1897,9 @@ The mirror structure is saved.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         args.type      char   {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible'
    @@ -1943,9 +1944,9 @@ The mirror structure is saved.
     
    -
    -

    Function content

    -
    +
    +

    Function content

    +
    nano_hexapod = initializeFramesPositions('H', args.H, 'MO_B', args.MO_B);
     nano_hexapod = generateGeneralConfiguration(nano_hexapod, 'FH', args.FH, 'FR', args.FR, 'FTh', args.FTh, 'MH', args.MH, 'MR', args.MR, 'MTh', args.MTh);
    @@ -1994,9 +1995,9 @@ Equilibrium position of the each joint.
     
    -
    -

    Add Type

    -
    +
    +

    Add Type

    +
    switch args.type
       case 'none'
    @@ -2013,9 +2014,9 @@ Equilibrium position of the each joint.
     
    -
    -

    Save the Structure

    -
    +
    +

    Save the Structure

    +
    save('./mat/stages.mat', 'nano_hexapod', '-append');
     
    @@ -2032,9 +2033,9 @@ Equilibrium position of the each joint.

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    The Simscape model of the sample environment is composed of:

    @@ -2062,9 +2063,9 @@ This could be the case for cable forces for instance.
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [sample] = initializeSample(args)
     
    @@ -2072,9 +2073,9 @@ This could be the case for cable forces for instance.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
       args.type         char    {mustBeMember(args.type,{'rigid', 'flexible', 'none', 'init'})} = 'flexible'
    @@ -2090,9 +2091,9 @@ This could be the case for cable forces for instance.
     
    -
    -

    Structure initialization

    -
    +
    +

    Structure initialization

    +

    First, we initialize the sample structure.

    @@ -2122,9 +2123,9 @@ First, we initialize the sample structure.
    -
    -

    Material and Geometry

    -
    +
    +

    Material and Geometry

    +

    We define the geometrical parameters of the sample as well as its mass and position.

    @@ -2150,9 +2151,9 @@ sample.offset = args.offset; % [m]
    -
    -

    Stiffness and Damping properties

    -
    +
    +

    Stiffness and Damping properties

    +
    sample.K = zeros(6, 1);
     sample.C = zeros(6, 1);
    @@ -2179,9 +2180,9 @@ sample.C(4:6) = 0.1 *
     
    -
    -

    Equilibrium position of the each joint.

    -
    +
    +

    Equilibrium position of the each joint.

    +
    if args.Foffset && ~strcmp(args.type, 'none') && ~strcmp(args.type, 'rigid') && ~strcmp(args.type, 'init')
       load('mat/Foffset.mat', 'Fsm');
    @@ -2194,9 +2195,9 @@ sample.C(4:6) = 0.1 *
     
    -
    -

    Save the Structure

    -
    +
    +

    Save the Structure

    +

    The sample structure is saved.

    @@ -2216,9 +2217,9 @@ The sample structure is saved.

    -
    -

    Function Declaration and Documentation

    -
    +
    +

    Function Declaration and Documentation

    +
    function [] = initializeController(args)
     
    @@ -2226,9 +2227,9 @@ The sample structure is saved.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
       args.type char {mustBeMember(args.type,{'open-loop', 'iff', 'dvf', 'hac-dvf', 'ref-track-L', 'ref-track-iff-L', 'cascade-hac-lac', 'hac-iff', 'stabilizing'})} = 'open-loop'
    @@ -2238,9 +2239,9 @@ The sample structure is saved.
     
    -
    -

    Structure initialization

    -
    +
    +

    Structure initialization

    +

    First, we initialize the controller structure.

    @@ -2280,9 +2281,9 @@ First, we initialize the controller structure.
    -
    -

    Save the Structure

    -
    +
    +

    Save the Structure

    +

    The controller structure is saved.

    @@ -2302,9 +2303,9 @@ The controller structure is saved.

    -
    -

    Function Declaration and Documentation

    -
    +
    +

    Function Declaration and Documentation

    +
    function [ref] = initializeReferences(args)
     
    @@ -2312,9 +2313,9 @@ The controller structure is saved.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         % Sampling Frequency [s]
    @@ -2376,9 +2377,9 @@ H_lpf = 1/(1 + 2
     
    -
    -

    Translation Stage

    -
    +
    +

    Translation Stage

    +
    %% Translation stage - Dy
     t = 0:Ts:Tmax; % Time Vector [s]
    @@ -2415,9 +2416,9 @@ Dy = struct('time', t, 
     
    -
    -

    Tilt Stage

    -
    +
    +

    Tilt Stage

    +
    %% Tilt Stage - Ry
     t = 0:Ts:Tmax; % Time Vector [s]
    @@ -2455,9 +2456,9 @@ Ry = struct('time', t, 
     
    -
    -

    Spindle

    -
    +
    +

    Spindle

    +
    %% Spindle - Rz
     t = 0:Ts:Tmax; % Time Vector [s]
    @@ -2501,9 +2502,9 @@ Rz = struct('time', t, 
     
    -
    -

    Micro Hexapod

    -
    +
    +

    Micro Hexapod

    +
    %% Micro-Hexapod
     t = [0, Ts];
    @@ -2559,9 +2560,9 @@ Rm = struct('time', t, 
     
    -
    -

    Nano Hexapod

    -
    +
    +

    Nano Hexapod

    +
    %% Nano-Hexapod
     t = [0, Ts];
    @@ -2602,9 +2603,9 @@ Dnl = struct('time', t, 
     
    -
    -

    Save

    -
    +
    +

    Save

    +
        %% Save
         save('./mat/nass_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'Rm', 'Dn', 'Dnl', 'Ts');
    @@ -2623,9 +2624,9 @@ Dnl = struct('time', t, 
     
    -
    -

    Function Declaration and Documentation

    -
    +
    +

    Function Declaration and Documentation

    +
    function [] = initializeDisturbances(args)
     % initializeDisturbances - Initialize the disturbances
    @@ -2640,9 +2641,9 @@ Dnl = struct('time', t, 
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         % Global parameter to enable or disable the disturbances
    @@ -2849,9 +2850,9 @@ Frz_z  = Frz_z - Frz_z(1);
     
    -
    -

    Save

    -
    +
    +

    Save

    +
    save('./mat/nass_disturbances.mat', 'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_z', 'Fd', 'Ts', 't');
     
    @@ -2868,9 +2869,9 @@ Frz_z = Frz_z - Frz_z(1);

    -
    -

    Function Declaration and Documentation

    -
    +
    +

    Function Declaration and Documentation

    +
    function [] = initializePosError(args)
     % initializePosError - Initialize the position errors
    @@ -2885,9 +2886,9 @@ Frz_z  = Frz_z - Frz_z(1);
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         args.error    logical {mustBeNumericOrLogical} = false
    @@ -2900,9 +2901,9 @@ Frz_z  = Frz_z - Frz_z(1);
     
    -
    -

    Structure initialization

    -
    +
    +

    Structure initialization

    +

    First, we initialize the pos_error structure.

    @@ -2939,9 +2940,9 @@ pos_error.Rz = args.Rz;
    -
    -

    Save

    -
    +
    +

    Save

    +
    save('./mat/pos_error.mat', 'pos_error');
     
    @@ -3017,7 +3018,7 @@ pos_error.Rz = args.Rz;

    Author: Dehaeze Thomas

    -

    Created: 2020-04-03 ven. 17:56

    +

    Created: 2020-04-07 mar. 14:55

    diff --git a/docs/uncertainty_optimal_stiffness.html b/docs/uncertainty_optimal_stiffness.html new file mode 100644 index 0000000..a2c1bcc --- /dev/null +++ b/docs/uncertainty_optimal_stiffness.html @@ -0,0 +1,848 @@ + + + + + + + + + +Determination of the optimal nano-hexapod’s stiffness + + + + + + + + + + + + + + + +
    + UP + | + HOME +
    +

    Determination of the optimal nano-hexapod’s stiffness

    + + +

    +As shown before, many parameters other than the nano-hexapod itself do influence the plant dynamics: +

    +
      +
    • The micro-station compliance (studied here)
    • +
    • The payload mass and dynamical properties (studied here and here)
    • +
    • The experimental conditions, mainly the spindle rotation speed (studied here)
    • +
    + +

    +As seen before, the stiffness of the nano-hexapod greatly influence the effect of such parameters. +

    + +

    +We wish here to see if we can determine an optimal stiffness of the nano-hexapod such that: +

    +
      +
    • Section 1: the change of its dynamics due to the spindle rotation speed is acceptable
    • +
    • Section 2: the support compliance dynamics is not much present in the nano-hexapod dynamics
    • +
    • Section 3: the change of payload impedance has acceptable effect on the plant dynamics
    • +
    + +

    +The overall goal is to design a nano-hexapod that will allow the highest possible control bandwidth. +

    + +
    +

    1 Spindle Rotation Speed

    +
    +

    + +

    +

    +In this section, we look at the effect of the spindle rotation speed on the plant dynamics. +

    + +

    +The rotation speed will have an effect due to the Coriolis effect. +

    +
    + +
    +

    1.1 Initialization

    +
    +

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

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

    +We use a sample mass of 10kg. +

    +
    +
    initializeSample('mass', 10);
    +
    +
    + +

    +We don’t include disturbances in this model as it adds complexity to the simulations and does not alter the obtained dynamics. +We however include gravity. +

    +
    +
    initializeSimscapeConfiguration('gravity', true);
    +initializeDisturbances('enable', false);
    +initializeLoggingConfiguration('log', 'none');
    +initializeController();
    +
    +
    +
    +
    + +
    +

    1.2 Identification when rotating at maximum speed

    +
    +

    +We identify the dynamics for the following spindle rotation speeds Rz_rpm: +

    +
    +
    Rz_rpm = linspace(0, 60, 6);
    +
    +
    + +

    +And for the following nano-hexapod actuator stiffness Ks: +

    +
    +
    Ks = logspace(3,9,7); % [N/m]
    +
    +
    +
    +
    + +
    +

    1.3 Change of dynamics

    +
    +

    +We plot the change of dynamics due to the change of the spindle rotation speed (from 0rpm to 60rpm): +

    +
      +
    • Figure 2: from actuator force \(\tau\) to force sensor \(\tau_m\) (IFF plant)
    • +
    • Figure 3: from actuator force \(\tau\) to actuator relative displacement \(d\mathcal{L}\) (Decentralized positioning plant)
    • +
    • Figure 4: from force in the task space \(\mathcal{F}_x\) to sample displacement \(\mathcal{X}_x\) (Centralized positioning plant)
    • +
    • Figure 5: from force in the task space \(\mathcal{F}_x\) to sample displacement \(\mathcal{X}_y\) (coupling of the centralized positioning plant)
    • +
    + + +
    +

    opti_stiffness_iff_root_locus.png +

    +

    Figure 1: Root Locus plot for IFF control when not rotating (in red) and when rotating at 60rpm (in blue) for 4 different nano-hexapod stiffnesses (png, pdf)

    +
    + + +
    +

    opt_stiffness_wz_iff.png +

    +

    Figure 2: Change of dynamics from actuator \(\tau\) to actuator force sensor \(\tau_m\) for a spindle rotation speed from 0rpm to 60rpm (png, pdf)

    +
    + + +
    +

    opt_stiffness_wz_dvf.png +

    +

    Figure 3: Change of dynamics from actuator force \(\tau\) to actuator displacement \(d\mathcal{L}\) for a spindle rotation speed from 0rpm to 60rpm (png, pdf)

    +
    + + +
    +

    opt_stiffness_wz_fx_dx.png +

    +

    Figure 4: Change of dynamics from force \(\mathcal{F}_x\) to displacement \(\mathcal{X}_x\) for a spindle rotation speed from 0rpm to 60rpm (png, pdf)

    +
    + + +
    +

    opt_stiffness_wz_coupling.png +

    +

    Figure 5: Change of Coupling from force \(\mathcal{F}_x\) to displacement \(\mathcal{X}_y\) for a spindle rotation speed from 0rpm to 60rpm (png, pdf)

    +
    +
    +
    + +
    +
    +

    +The leg stiffness should be at higher than \(k_i = 10^4\ [N/m]\) such that the main resonance frequency does not shift too much when rotating. +For the coupling, it is more difficult to conclude about the minimum required leg stiffness. +

    + +
    + +
    +

    +Note that we can use very soft nano-hexapod if we limit the spindle rotating speed. +

    + +
    +
    +
    + +
    +

    2 Micro-Station Compliance Effect

    +
    +

    + +

    +
      +
    • take the 6dof compliance of the micro-station
    • +
    • simple model + uncertainty
    • +
    +
    + +
    +

    2.1 Identification of the micro-station compliance

    +
    +

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

    +
    +
    initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod('type', 'compliance');
    +
    +
    + +

    +We put nothing on top of the micro-hexapod. +

    +
    +
    initializeAxisc('type', 'none');
    +initializeMirror('type', 'none');
    +initializeNanoHexapod('type', 'none');
    +initializeSample('type', 'none');
    +
    +
    + +

    +And we identify the dynamics from forces/torques applied on the micro-hexapod top platform to the motion of the micro-hexapod top platform at the same point. +The diagonal element of the identified Micro-Station compliance matrix are shown in Figure 6. +

    + + +
    +

    opt_stiff_micro_station_compliance.png +

    +

    Figure 6: Identified Compliance of the Micro-Station (png, pdf)

    +
    +
    +
    + +
    +

    2.2 Identification of the dynamics with a rigid micro-station

    +
    +

    +We now identify the dynamics when the micro-station is rigid. +This is equivalent of identifying the dynamics of the nano-hexapod when fixed to a rigid ground. +We also choose the sample to be rigid and to have a mass of 10kg. +

    +
    +
    initializeSample('type', 'rigid', 'mass', 10);
    +
    +
    + +

    +As before, we identify the dynamics for the following actuator stiffnesses: +

    +
    +
    Ks = logspace(3,9,7); % [N/m]
    +
    +
    +
    +
    + +
    +

    2.3 Identification of the dynamics with a flexible micro-station

    +
    +

    +We now initialize all the micro-station stages to be flexible. +And we identify the dynamics of the nano-hexapod. +

    +
    +
    +
    +

    2.4 Obtained Dynamics

    +
    +

    +We plot the change of dynamics due to the compliance of the Micro-Station. +The solid curves are corresponding to the nano-hexapod without the micro-station, and the dashed curves with the micro-station: +

    +
      +
    • Figure 7: from actuator force \(\tau\) to force sensor \(\tau_m\) (IFF plant)
    • +
    • Figure 8: from actuator force \(\tau\) to actuator relative displacement \(d\mathcal{L}\) (Decentralized positioning plant)
    • +
    • Figure 9: from force in the task space \(\mathcal{F}_x\) to sample displacement \(\mathcal{X}_x\) (Centralized positioning plant)
    • +
    • Figure 10: from force in the task space \(\mathcal{F}_z\) to sample displacement \(\mathcal{X}_z\) (Centralized positioning plant)
    • +
    + + +
    +

    opt_stiffness_micro_station_iff.png +

    +

    Figure 7: Change of dynamics from actuator \(\tau\) to actuator force sensor \(\tau_m\) due to the micro-station compliance (png, pdf)

    +
    + + +
    +

    opt_stiffness_micro_station_dvf.png +

    +

    Figure 8: Change of dynamics from actuator force \(\tau\) to actuator displacement \(d\mathcal{L}\) due to the micro-station compliance (png, pdf)

    +
    + + +
    +

    opt_stiffness_micro_station_fx_dx.png +

    +

    Figure 9: Change of dynamics from force \(\mathcal{F}_x\) to displacement \(\mathcal{X}_x\) due to the micro-station compliance (png, pdf)

    +
    + + +
    +

    opt_stiffness_micro_station_fz_dz.png +

    +

    Figure 10: Change of dynamics from force \(\mathcal{F}_z\) to displacement \(\mathcal{X}_z\) due to the micro-station compliance (png, pdf)

    +
    +
    +
    + +
    +
    +

    +The dynamics of the nano-hexapod is not affected by the micro-station dynamics (compliance) when the stiffness of the legs is less than \(10^6\ [N/m]\). +When the nano-hexapod is stiff (\(k>10^7\ [N/m]\)), the compliance of the micro-station appears in the primary plant. +

    + +
    +
    +
    + +
    +

    3 Payload “Impedance” Effect

    +
    +

    + +

    +
    + +
    +

    3.1 Initialization

    +
    +

    +We initialize all the stages with the default parameters. +We don’t include disturbances in this model as it adds complexity to the simulations and does not alter the obtained dynamics. :exports none +

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

    +We set the controller type to Open-Loop, and we do not need to log any signal. +

    +
    +
    initializeSimscapeConfiguration('gravity', true);
    +initializeController();
    +initializeLoggingConfiguration('log', 'none');
    +initializeReferences();
    +
    +
    +
    +
    + +
    +

    3.2 Identification of the dynamics while change the payload dynamics

    +
    +

    +We make the following change of payload dynamics: +

    +
      +
    • Change of mass: from 1kg to 50kg
    • +
    • Change of resonance frequency: from 50Hz to 500Hz
    • +
    • The damping ratio of the payload is fixed to \(\xi = 0.2\)
    • +
    + +

    +We identify the dynamics for the following payload masses Ms and nano-hexapod leg’s stiffnesses Ks: +

    +
    +
    Ms = [1, 20, 50]; % [Kg]
    +Ks = logspace(3,9,7); % [N/m]
    +
    +
    + +

    +We then identify the dynamics for the following payload resonance frequencies Fs: +

    +
    +
    Fs = [50, 200, 500]; % [Hz]
    +
    +
    +
    +
    + +
    +

    3.3 Change of dynamics for the primary controller

    +
    +
    +
    +

    3.3.1 Frequency variation

    +
    +

    +We here compare the dynamics for the same payload mass, but different stiffness resulting in different resonance frequency of the payload: +

    +
      +
    • Figure 11: dynamics from a force \(\mathcal{F}_z\) applied in the task space in the vertical direction to the vertical displacement of the sample \(\mathcal{X}_z\) for both a very soft and a very stiff nano-hexapod.
    • +
    • Figure 12: same, but for all tested nano-hexapod stiffnesses
    • +
    + +

    +We can see two mass lines for the soft nano-hexapod (Figure 11): +

    +
      +
    • The first mass line corresponds to \(\frac{1}{(m_n + m_p)s^2}\) where \(m_p = 10\ [kg]\) is the mass of the payload and \(m_n = 15\ [Kg]\) is the mass of the nano-hexapod top platform and attached mirror
    • +
    • The second mass line corresponds to \(\frac{1}{m_n s^2}\)
    • +
    • The zero corresponds to the resonance of the payload alone (fixed nano-hexapod’s top platform)
    • +
    + + +
    +

    opt_stiffness_payload_freq_fz_dz.png +

    +

    Figure 11: Dynamics from \(\mathcal{F}_z\) to \(\mathcal{X}_z\) for varying payload resonance frequency, both for a soft nano-hexapod and a stiff nano-hexapod (png, pdf)

    +
    + + +
    +

    opt_stiffness_payload_freq_all.png +

    +

    Figure 12: Dynamics from \(\mathcal{F}_z\) to \(\mathcal{X}_z\) for varying payload resonance frequency (png, pdf)

    +
    +
    +
    + +
    +

    3.3.2 Mass variation

    +
    +

    +We here compare the dynamics for different payload mass with the same resonance frequency (100Hz): +

    +
      +
    • Figure 13: dynamics from a force \(\mathcal{F}_z\) applied in the task space in the vertical direction to the vertical displacement of the sample \(\mathcal{X}_z\) for both a very soft and a very stiff nano-hexapod.
    • +
    • Figure 14: same, but for all tested nano-hexapod stiffnesses
    • +
    + +

    +We can see here that for the soft nano-hexapod: +

    +
      +
    • the first resonance \(\omega_n\) is changing with the mass of the payload as \(\omega_n = \sqrt{\frac{k_n}{m_p + m_n}}\) with \(k_p\) the stiffness of the nano-hexapod, \(m_p\) the payload’s mass and \(m_n\) the mass of the nano-hexapod top platform
    • +
    • the first mass line corresponding to \(\frac{1}{(m_p + m_n)s^2}\) is changing with the payload mass
    • +
    • the zero at 100Hz is not changing as it corresponds to the resonance of the payload itself
    • +
    • the second mass line does not change
    • +
    + + +
    +

    opt_stiffness_payload_mass_fz_dz.png +

    +

    Figure 13: Dynamics from \(\mathcal{F}_z\) to \(\mathcal{X}_z\) for varying payload mass, both for a soft nano-hexapod and a stiff nano-hexapod (png, pdf)

    +
    + + +
    +

    opt_stiffness_payload_mass_all.png +

    +

    Figure 14: Dynamics from \(\mathcal{F}_z\) to \(\mathcal{X}_z\) for varying payload mass (png, pdf)

    +
    +
    +
    + +
    +

    3.3.3 Total variation

    +
    +

    +We now plot the total change of dynamics due to change of the payload (Figures 15 and 16): +

    +
      +
    • mass from 1kg to 50kg
    • +
    • main resonance from 50Hz to 500Hz
    • +
    + + +
    +

    opt_stiffness_payload_impedance_all_fz_dz.png +

    +

    Figure 15: Dynamics from \(\mathcal{F}_z\) to \(\mathcal{X}_z\) for varying payload dynamics, both for a soft nano-hexapod and a stiff nano-hexapod (png, pdf)

    +
    + + +
    +

    opt_stiffness_payload_impedance_fz_dz.png +

    +

    Figure 16: Dynamics from \(\mathcal{F}_z\) to \(\mathcal{X}_z\) for varying payload dynamics, both for a soft nano-hexapod and a stiff nano-hexapod (png, pdf)

    +
    +
    +
    +
    + +
    +
    +

    + +

    + +
    +
    +
    + +
    +

    4 Total Change of dynamics

    +
    +

    +We now consider the total change of nano-hexapod dynamics due to: +

    +
      +
    • Gk_wz_err - Change of spindle rotation speed
    • +
    • Gf_err and Gm_err - Change of payload resonance
    • +
    • Gmf_err and Gmr_err - Micro-Station compliance
    • +
    + +

    +The obtained dynamics are shown: +

    +
      +
    • Figure 17 for a stiffness \(k = 10^3\ [N/m]\)
    • +
    • Figure 18 for a stiffness \(k = 10^5\ [N/m]\)
    • +
    • Figure 19 for a stiffness \(k = 10^7\ [N/m]\)
    • +
    • Figure 20 for a stiffness \(k = 10^9\ [N/m]\)
    • +
    + +

    +And finally, in Figures 21 and 22 are shown an animation of the change of dynamics with the nano-hexapod’s stiffness. +

    + + +
    +

    opt_stiffness_plant_dynamics_fx_dx_k_1e3.png +

    +

    Figure 17: Total variation of the dynamics from \(\mathcal{F}_x\) to \(\mathcal{X}_x\). Nano-hexapod leg’s stiffness is equal to \(k = 10^3\ [N/m]\) (png, pdf)

    +
    + + +
    +

    opt_stiffness_plant_dynamics_fx_dx_k_1e5.png +

    +

    Figure 18: Total variation of the dynamics from \(\mathcal{F}_x\) to \(\mathcal{X}_x\). Nano-hexapod leg’s stiffness is equal to \(k = 10^5\ [N/m]\) (png, pdf)

    +
    + + +
    +

    opt_stiffness_plant_dynamics_fx_dx_k_1e7.png +

    +

    Figure 19: Total variation of the dynamics from \(\mathcal{F}_x\) to \(\mathcal{X}_x\). Nano-hexapod leg’s stiffness is equal to \(k = 10^7\ [N/m]\) (png, pdf)

    +
    + + +
    +

    opt_stiffness_plant_dynamics_fx_dx_k_1e9.png +

    +

    Figure 20: Total variation of the dynamics from \(\mathcal{F}_x\) to \(\mathcal{X}_x\). Nano-hexapod leg’s stiffness is equal to \(k = 10^9\ [N/m]\) (png, pdf)

    +
    + + +
    +

    opt_stiffness_plant_dynamics_task_space.gif +

    +

    Figure 21: Variability of the dynamics from \(\mathcal{F}_x\) to \(\mathcal{X}_x\) with varying nano-hexapod stiffness

    +
    + + +
    +

    opt_stiffness_plant_dynamics_task_space_colors.gif +

    +

    Figure 22: Variability of the dynamics from \(\mathcal{F}_x\) to \(\mathcal{X}_x\) with varying nano-hexapod stiffness

    +
    +
    +
    +
    +
    +

    Author: Dehaeze Thomas

    +

    Created: 2020-04-07 mar. 14:55

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