@@ -1021,7 +1021,7 @@ From Figure 23 and Table 1,
- For a soft nano-hexapod (\(k < 10^4\ [N/m]\)), the required bandwidth is \(\omega_c \approx 50-100\ Hz\)
-- For a nano-hexapods with \(10^5 < k < 10^6\ [N/m]\)), the required bandwidth is \(\omega_c \approx 150-300\ Hz\)
+- For a nano-hexapods with \(10^5 < k < 10^6\ [N/m]\), the required bandwidth is \(\omega_c \approx 150-300\ Hz\)
- For a stiff nano-hexapods (\(k > 10^7\ [N/m]\)), the required bandwidth is \(\omega_c \approx 250-500\ Hz\)
@@ -1031,7 +1031,7 @@ From Figure
23 and Table
1,
Author: Dehaeze Thomas
-
Created: 2020-04-08 mer. 12:17
+
Created: 2020-04-08 mer. 17:20
diff --git a/mat/conf_log.mat b/mat/conf_log.mat
index 55d5306..50c7022 100644
Binary files a/mat/conf_log.mat and b/mat/conf_log.mat differ
diff --git a/mat/conf_simscape.mat b/mat/conf_simscape.mat
index 89e5ee7..59a9638 100644
Binary files a/mat/conf_simscape.mat and b/mat/conf_simscape.mat differ
diff --git a/mat/controller.mat b/mat/controller.mat
index d4d745e..78b3c78 100644
Binary files a/mat/controller.mat and b/mat/controller.mat differ
diff --git a/mat/nass_disturbances.mat b/mat/nass_disturbances.mat
index cb32942..229dbce 100644
Binary files a/mat/nass_disturbances.mat and b/mat/nass_disturbances.mat differ
diff --git a/mat/nass_references.mat b/mat/nass_references.mat
index aef6423..7c783fc 100644
Binary files a/mat/nass_references.mat and b/mat/nass_references.mat differ
diff --git a/mat/stages.mat b/mat/stages.mat
index 6fc3d68..0a3a8cc 100644
Binary files a/mat/stages.mat and b/mat/stages.mat differ
diff --git a/org/optimal_stiffness_control.org b/org/optimal_stiffness_control.org
new file mode 100644
index 0000000..6c18e43
--- /dev/null
+++ b/org/optimal_stiffness_control.org
@@ -0,0 +1,779 @@
+#+TITLE: Control of the NASS with optimal stiffness
+: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 no
+#+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:
+
+* Low Authority Control - Decentralized 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
+ 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 set the references that corresponds to a tomography experiment.
+#+begin_src matlab
+ initializeReferences('Rz_type', 'rotating-not-filtered', 'Rz_period', 1);
+ initializeSimscapeConfiguration();
+ initializeDisturbances('enable', false);
+ initializeLoggingConfiguration('log', 'none');
+#+end_src
+
+#+begin_src matlab
+ initializeController('type', 'hac-iff');
+#+end_src
+
+** Identification
+#+begin_src matlab
+ Kx = tf(zeros(6));
+ Kiff = tf(zeros(6));
+#+end_src
+
+#+begin_src matlab
+ Ms = [1, 10, 50];
+
+ Gm_iff = {zeros(length(Ms), 1)};
+#+end_src
+
+#+begin_src matlab
+ initializeNanoHexapod('k', 1e5, 'c', 2e2);
+#+end_src
+
+#+begin_src matlab :exports none
+ %% Name of the Simulink File
+ mdl = 'nass_model';
+
+ %% Input/Output definition
+ clear io; io_i = 1;
+ io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
+ io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1; % Force Sensors
+#+end_src
+
+#+begin_src matlab :exports none
+ for i = 1:length(Ms)
+ initializeSample('mass', Ms(i), 'freq', 200*ones(6,1));
+
+ %% Run the linearization
+ G_iff = linearize(mdl, io);
+ G_iff.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
+ G_iff.OutputName = {'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'};
+ Gm_iff(i) = {G_iff};
+ end
+#+end_src
+
+** Controller Design
+#+begin_src matlab :exports none
+ freqs = logspace(-1, 3, 1000);
+
+ figure;
+
+ ax1 = subplot(2, 1, 1);
+ hold on;
+ for i = 1:length(Ms)
+ plot(freqs, abs(squeeze(freqresp(Gm_iff{i}(1, 1), freqs, 'Hz'))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]);
+ title('Diagonal elements of the Plant');
+
+ ax2 = subplot(2, 1, 2);
+ hold on;
+ for i = 1:length(Ms)
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_iff{i}(1, 1), freqs, 'Hz')))), ...
+ 'DisplayName', sprintf('$m_p = %.0f$ [kg]', Ms(i)));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ ylim([-270, 90]);
+ yticks([-360:90:360]);
+ legend('location', 'northeast');
+
+ linkaxes([ax1,ax2],'x');
+#+end_src
+
+Root Locus
+#+begin_src matlab :exports none :post
+ figure;
+
+ gains = logspace(0, 3, 300);
+
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(real(pole(Gm_iff{i})), imag(pole(Gm_iff{i})), 'x', ...
+ 'DisplayName', sprintf('$m_p = %.0f$ [kg]', Ms(i)));
+ set(gca,'ColorOrderIndex',i);
+ plot(real(tzero(Gm_iff{i})), imag(tzero(Gm_iff{i})), 'o', ...
+ 'HandleVisibility', 'off');
+ for k = 1:length(gains)
+ set(gca,'ColorOrderIndex',i);
+ cl_poles = pole(feedback(Gm_iff{i}, -(gains(k)/s)*eye(6)));
+ plot(real(cl_poles), imag(cl_poles), '.', ...
+ 'HandleVisibility', 'off');
+ end
+ end
+ hold off;
+ axis square;
+ xlim([-140, 10]); ylim([0, 150]);
+
+ xlabel('Real Part'); ylabel('Imaginary Part');
+ legend('location', 'northwest');
+#+end_src
+
+#+begin_src matlab :tangle no :exports results :results file replace
+ exportFig('figs/opt_stiff_iff_root_locus.pdf', 'width', 'wide', 'height', 'tall');
+#+end_src
+
+#+name: fig:opt_stiff_iff_root_locus
+#+caption: Root Locus for the
+#+RESULTS:
+[[file:figs/opt_stiff_iff_root_locus.png]]
+
+Damping as function of the gain
+#+begin_src matlab :exports none
+ c1 = [ 0 0.4470 0.7410]; % Blue
+ c2 = [0.8500 0.3250 0.0980]; % Orange
+ c3 = [0.9290 0.6940 0.1250]; % Yellow
+ c4 = [0.4940 0.1840 0.5560]; % Purple
+ c5 = [0.4660 0.6740 0.1880]; % Green
+ c6 = [0.3010 0.7450 0.9330]; % Light Blue
+ c7 = [0.6350 0.0780 0.1840]; % Red
+ colors = [c1; c2; c3; c4; c5; c6; c7];
+
+ figure;
+
+ gains = logspace(0, 3, 100);
+
+ hold on;
+ for i = 1:length(Ms)
+ for k = 1:length(gains)
+ cl_poles = pole(feedback(Gm_iff{i}, -(gains(k)/s)*eye(6)));
+ set(gca,'ColorOrderIndex',i);
+ plot(gains(k), sin(-pi/2 + angle(cl_poles)), '.', 'color', colors(i, :));
+ end
+ end
+ hold off;
+ xlabel('IFF Gain'); ylabel('Modal Damping');
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylim([0, 1]);
+#+end_src
+
+#+begin_src matlab
+ Kiff = -200/s*eye(6);
+#+end_src
+
+* Primary Control
+** 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
+
+** Identification
+#+begin_src matlab
+ Gm_x = {zeros(length(Ms), 1)};
+ Gm_l = {zeros(length(Ms), 1)};
+#+end_src
+
+#+begin_src matlab
+ load('mat/stages.mat', 'nano_hexapod');
+#+end_src
+
+#+begin_src matlab :exports none
+ %% Name of the Simulink File
+ mdl = 'nass_model';
+
+ %% Input/Output definition
+ clear io; io_i = 1;
+ io(io_i) = linio([mdl, '/Controller'], 1, 'input'); io_i = io_i + 1; % Actuator Inputs
+ io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1; % Position Errror
+#+end_src
+
+#+begin_src matlab :exports none
+ for i = 1:length(Ms)
+ initializeSample('mass', Ms(i), 'freq', 200*ones(6,1));
+
+ %% Run the linearization
+ G = linearize(mdl, io);
+ G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
+ G.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
+
+ Gx = -G*inv(nano_hexapod.J');
+ Gx.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
+ Gm_x(i) = {Gx};
+
+ Gl = -nano_hexapod.J*G;
+ Gl.OutputName = {'E1', 'E2', 'E3', 'E4', 'E5', 'E6'};
+ Gm_l(i) = {Gl};
+ end
+#+end_src
+
+** Controller in the task space
+#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
+ labels = {'$D_x/\mathcal{F}_x$', '$D_y/\mathcal{F}_y$', '$D_z/\mathcal{F}_z$', '$R_x/\mathcal{M}_x$', '$R_y/\mathcal{M}_y$', '$R_z/\mathcal{M}_z$'};
+
+ figure;
+
+ ax1 = subplot(2, 2, 1);
+ hold on;
+ for i = 1:6
+ plot(freqs, abs(squeeze(freqresp(Gx(i, i), freqs, 'Hz'))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
+ title('Diagonal elements of the Plant');
+
+ ax2 = subplot(2, 2, 3);
+ hold on;
+ for i = 1:6
+ plot(freqs, 180/pi*angle(squeeze(freqresp(Gx(i, i), freqs, 'Hz'))), 'DisplayName', labels{i});
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ ylim([-180, 180]);
+ yticks([-180, -90, 0, 90, 180]);
+ legend();
+
+ ax3 = subplot(2, 2, 2);
+ hold on;
+ for i = 1:5
+ for j = i+1:6
+ plot(freqs, abs(squeeze(freqresp(Gx(i, j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2]);
+ end
+ end
+ set(gca,'ColorOrderIndex',1);
+ plot(freqs, abs(squeeze(freqresp(Gx(1, 1), freqs, 'Hz'))));
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
+ title('Off-Diagonal elements of the Plant');
+
+ ax4 = subplot(2, 2, 4);
+ hold on;
+ for i = 1:5
+ for j = i+1:6
+ plot(freqs, 180/pi*angle(squeeze(freqresp(Gx(i, j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2]);
+ end
+ end
+ set(gca,'ColorOrderIndex',1);
+ plot(freqs, 180/pi*angle(squeeze(freqresp(Gx(1, 1), freqs, 'Hz'))));
+ 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,ax3,ax4],'x');
+#+end_src
+
+*** Translation
+#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
+ figure;
+
+ ax1 = subplot(2, 2, 1);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_x{i}(1, 1), freqs, 'Hz'))));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_x{i}(2, 2), freqs, 'Hz'))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
+ title('$\mathcal{X}_x/\mathcal{F}_x$, $\mathcal{X}_y/\mathcal{F}_y$')
+
+ ax2 = subplot(2, 2, 2);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_x{i}(3, 3), freqs, 'Hz'))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
+ title('$\mathcal{X}_z/\mathcal{F}_z$')
+
+ ax3 = subplot(2, 2, 3);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(1, 1), freqs, 'Hz')))));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(2, 2), freqs, 'Hz')))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ ylim([-270, 90]);
+ yticks([-360:90:360]);
+
+ ax4 = subplot(2, 2, 4);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(3, 3), freqs, 'Hz')))), ...
+ 'DisplayName', sprintf('$m_p = %.0f [kg]$', Ms(i)));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ ylim([-270, 90]);
+ yticks([-360:90:360]);
+ legend('location', 'southwest');
+
+ linkaxes([ax1,ax2,ax3,ax4],'x');
+#+end_src
+
+#+begin_src matlab
+ Kx = tf(zeros(6));
+
+ h = 1.5;
+ Kx(1,1) = 2e6 * ...
+ 1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
+ (s/2/pi/1 + 1)/(s/2/pi/1) * ...
+ (s/2/pi/10 + 1)/(s/2/pi/10);
+
+ Kx(2,2) = Kx(1,1);
+
+ h = 1.5;
+ Kx(3,3) = 1e7 * ...
+ 1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
+ (s/2/pi/1 + 1)/(s/2/pi/1) * ...
+ (s/2/pi/10 + 1)/(s/2/pi/10);
+#+end_src
+
+#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
+ figure;
+
+ ax1 = subplot(2, 2, 1);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_x{i}(1, 1)*Kx(1,1), freqs, 'Hz'))));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_x{i}(2, 2)*Kx(2,2), freqs, 'Hz'))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
+ title('$\mathcal{X}_x/\mathcal{F}_x$, $\mathcal{X}_y/\mathcal{F}_y$')
+
+ ax2 = subplot(2, 2, 2);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_x{i}(3, 3)*Kx(3,3), freqs, 'Hz'))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
+ title('$\mathcal{X}_z/\mathcal{F}_z$')
+
+ ax3 = subplot(2, 2, 3);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(1, 1)*Kx(1,1), freqs, 'Hz')))));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(2, 2)*Kx(2,2), freqs, 'Hz')))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ ylim([-270, 90]);
+ yticks([-360:90:360]);
+
+ ax4 = subplot(2, 2, 4);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(3, 3)*Kx(3,3), freqs, 'Hz')))), ...
+ 'DisplayName', sprintf('$m_p = %.0f [kg]$', Ms(i)));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ ylim([-270, 90]);
+ yticks([-360:90:360]);
+ legend('location', 'southwest');
+
+ linkaxes([ax1,ax2,ax3,ax4],'x');
+#+end_src
+
+*** Rotations
+#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
+ figure;
+
+ ax1 = subplot(2, 2, 1);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_x{i}(4, 4), freqs, 'Hz'))));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_x{i}(5, 5), freqs, 'Hz'))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [rad/(N m)]'); set(gca, 'XTickLabel',[]);
+ title('$\mathcal{X}_{R_x}/\mathcal{M}_x$, $\mathcal{X}_{R_y}/\mathcal{M}_y$')
+
+ ax2 = subplot(2, 2, 2);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_x{i}(6, 6), freqs, 'Hz'))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [rad/(N m)]'); set(gca, 'XTickLabel',[]);
+ title('$\mathcal{X}_{R_z}/\mathcal{M}_z$')
+
+ ax3 = subplot(2, 2, 3);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(4, 4), freqs, 'Hz')))));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(5, 5), freqs, 'Hz')))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ ylim([-270, 90]);
+ yticks([-360:90:360]);
+
+ ax4 = subplot(2, 2, 4);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(6, 6), freqs, 'Hz')))), ...
+ 'DisplayName', sprintf('$m_p = %.0f [kg]$', Ms(i)));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ ylim([-270, 90]);
+ yticks([-360:90:360]);
+ legend('location', 'southwest');
+
+ linkaxes([ax1,ax2,ax3,ax4],'x');
+#+end_src
+
+#+begin_src matlab
+ h = 1.5;
+ Kx(4,4) = 1e5 * ...
+ 1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
+ (s/2/pi/1 + 1)/(s/2/pi/1) * ...
+ (s/2/pi/10 + 1)/(s/2/pi/10);
+
+ Kx(5,5) = Kx(4,4);
+
+ h = 1.5;
+ Kx(6,6) = 2e5 * ...
+ 1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
+ (s/2/pi/1 + 1)/(s/2/pi/1) * ...
+ (s/2/pi/10 + 1)/(s/2/pi/10);
+#+end_src
+
+#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
+ figure;
+
+ ax1 = subplot(2, 2, 1);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_x{i}(4, 4)*Kx(4,4), freqs, 'Hz'))));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_x{i}(5, 5)*Kx(5,5), freqs, 'Hz'))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [rad/(N m)]'); set(gca, 'XTickLabel',[]);
+ title('$\mathcal{X}_{R_x}/\mathcal{M}_x$, $\mathcal{X}_{R_y}/\mathcal{M}_y$')
+
+ ax2 = subplot(2, 2, 2);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_x{i}(6, 6)*Kx(6,6), freqs, 'Hz'))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [rad/(N m)]'); set(gca, 'XTickLabel',[]);
+ title('$\mathcal{X}_{R_z}/\mathcal{M}_z$')
+
+ ax3 = subplot(2, 2, 3);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(4, 4)*Kx(4,4), freqs, 'Hz')))));
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(5, 5)*Kx(5,5), freqs, 'Hz')))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ ylim([-270, 90]);
+ yticks([-360:90:360]);
+
+ ax4 = subplot(2, 2, 4);
+ hold on;
+ for i = 1:length(Ms)
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(6, 6)*Kx(6,6), freqs, 'Hz')))), ...
+ 'DisplayName', sprintf('$m_p = %.0f [kg]$', Ms(i)));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ ylim([-270, 90]);
+ yticks([-360:90:360]);
+ legend('location', 'southwest');
+
+ linkaxes([ax1,ax2,ax3,ax4],'x');
+#+end_src
+
+*** Stability
+#+begin_src matlab
+ for i = 1:length(Ms)
+ isstable(feedback(Gm_x{i}*Kx, eye(6), -1))
+ end
+#+end_src
+
+** Simulation
+
+** Control in the leg space
+#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
+ figure;
+
+ ax1 = subplot(2, 2, 1);
+ hold on;
+ for i = 1:6
+ plot(freqs, abs(squeeze(freqresp(Gl(i, i), freqs, 'Hz'))));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
+ title('Diagonal elements of the Plant');
+
+ ax2 = subplot(2, 2, 3);
+ hold on;
+ for i = 1:6
+ plot(freqs, 180/pi*angle(squeeze(freqresp(Gl(i, i), freqs, 'Hz'))), ...
+ 'DisplayName', sprintf('$d\\mathcal{L}_%i / \\tau_%i$', i, i));
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ ylim([-180, 180]);
+ yticks([-180, -90, 0, 90, 180]);
+ legend();
+
+ ax3 = subplot(2, 2, 2);
+ hold on;
+ for i = 1:5
+ for j = i+1:6
+ plot(freqs, abs(squeeze(freqresp(Gl(i, j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2]);
+ end
+ end
+ set(gca,'ColorOrderIndex',1);
+ plot(freqs, abs(squeeze(freqresp(Gl(1, 1), freqs, 'Hz'))));
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
+ title('Off-Diagonal elements of the Plant');
+
+ ax4 = subplot(2, 2, 4);
+ hold on;
+ for i = 1:5
+ for j = i+1:6
+ plot(freqs, 180/pi*angle(squeeze(freqresp(Gl(i, j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2]);
+ end
+ end
+ set(gca,'ColorOrderIndex',1);
+ plot(freqs, 180/pi*angle(squeeze(freqresp(Gl(1, 1), freqs, 'Hz'))));
+ 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,ax3,ax4],'x');
+#+end_src
+
+#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
+ figure;
+
+ ax1 = subplot(2, 1, 1);
+ hold on;
+ for i = 1:length(Ms)
+ for j = 1:6
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_l{i}(j, j), freqs, 'Hz'))));
+ end
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
+ title('Diagonal elements of the Plant');
+
+ ax2 = subplot(2, 1, 2);
+ hold on;
+ for i = 1:length(Ms)
+ for j = 1:6
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*angle(squeeze(freqresp(Gm_l{i}(j, j), freqs, 'Hz'))));
+ end
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ ylim([-180, 180]);
+ yticks([-180, -90, 0, 90, 180]);
+
+ linkaxes([ax1,ax2],'x');
+#+end_src
+
+#+begin_src matlab
+ h = 1.5;
+ Kl = 5e6 * eye(6) * ...
+ 1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
+ (s/2/pi/1 + 1)/(s/2/pi/1) * ...
+ (s/2/pi/10 + 1)/(s/2/pi/10);
+#+end_src
+
+#+begin_src matlab
+ for i = 1:length(Ms)
+ isstable(feedback(Gm_l{i}(1,1)*Kl(1,1), 1, -1))
+ end
+#+end_src
+
+#+begin_src matlab :exports none
+ freqs = logspace(0, 3, 1000);
+
+ figure;
+
+ ax1 = subplot(2, 1, 1);
+ hold on;
+ for i = 1:length(Ms)
+ for j = 1:6
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, abs(squeeze(freqresp(Gm_l{i}(j, j)*Kl(j,j), freqs, 'Hz'))));
+ end
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
+ ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
+
+ ax2 = subplot(2, 1, 2);
+ hold on;
+ for i = 1:length(Ms)
+ for j = 1:6
+ set(gca,'ColorOrderIndex',i);
+ plot(freqs, 180/pi*angle(squeeze(freqresp(Gm_l{i}(j, j)*Kl(j,j), freqs, 'Hz'))));
+ end
+ end
+ hold off;
+ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
+ ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
+ ylim([-180, 180]);
+ yticks([-180, -90, 0, 90, 180]);
+
+ linkaxes([ax1,ax2],'x');
+#+end_src
+
+
+* Simulations
diff --git a/org/optimal_stiffness_disturbances.org b/org/optimal_stiffness_disturbances.org
index 2b6e0a5..bc848f1 100644
--- a/org/optimal_stiffness_disturbances.org
+++ b/org/optimal_stiffness_disturbances.org
@@ -1240,6 +1240,6 @@ data2orgtable([wb1'; wb2'], {'Required wc with L1 [Hz]', 'Required wc with L2 [H
#+begin_important
From Figure [[fig:opt_stiff_req_bandwidth_K1_K2]] and Table [[tab:approx_required_wc_10nm]], we can clearly see three different results depending on the nano-hexapod stiffness:
- For a soft nano-hexapod ($k < 10^4\ [N/m]$), the required bandwidth is $\omega_c \approx 50-100\ Hz$
-- For a nano-hexapods with $10^5 < k < 10^6\ [N/m]$), the required bandwidth is $\omega_c \approx 150-300\ Hz$
+- For a nano-hexapods with $10^5 < k < 10^6\ [N/m]$, the required bandwidth is $\omega_c \approx 150-300\ Hz$
- For a stiff nano-hexapods ($k > 10^7\ [N/m]$), the required bandwidth is $\omega_c \approx 250-500\ Hz$
#+end_important