diff --git a/figs/IMG_20210608_152917.jpg b/figs/IMG_20210608_152917.jpg new file mode 100644 index 0000000..687fc68 Binary files /dev/null and b/figs/IMG_20210608_152917.jpg differ diff --git a/figs/IMG_20210608_154722.jpg b/figs/IMG_20210608_154722.jpg new file mode 100644 index 0000000..d4e5f38 Binary files /dev/null and b/figs/IMG_20210608_154722.jpg differ diff --git a/figs/enc_struts_dvf_coh.pdf b/figs/enc_struts_dvf_coh.pdf new file mode 100644 index 0000000..64f5ead Binary files /dev/null and b/figs/enc_struts_dvf_coh.pdf differ diff --git a/figs/enc_struts_dvf_coh.png b/figs/enc_struts_dvf_coh.png new file mode 100644 index 0000000..712ba3d Binary files /dev/null and b/figs/enc_struts_dvf_coh.png differ diff --git a/figs/enc_struts_dvf_frf.pdf b/figs/enc_struts_dvf_frf.pdf new file mode 100644 index 0000000..51f8771 Binary files /dev/null and b/figs/enc_struts_dvf_frf.pdf differ diff --git a/figs/enc_struts_dvf_frf.png b/figs/enc_struts_dvf_frf.png new file mode 100644 index 0000000..16bb149 Binary files /dev/null and b/figs/enc_struts_dvf_frf.png differ diff --git a/figs/enc_struts_iff_coh.pdf b/figs/enc_struts_iff_coh.pdf new file mode 100644 index 0000000..5ad7a75 Binary files /dev/null and b/figs/enc_struts_iff_coh.pdf differ diff --git a/figs/enc_struts_iff_coh.png b/figs/enc_struts_iff_coh.png new file mode 100644 index 0000000..5db3c8a Binary files /dev/null and b/figs/enc_struts_iff_coh.png differ diff --git a/figs/enc_struts_iff_frf.pdf b/figs/enc_struts_iff_frf.pdf new file mode 100644 index 0000000..6a009ff Binary files /dev/null and b/figs/enc_struts_iff_frf.pdf differ diff --git a/figs/enc_struts_iff_frf.png b/figs/enc_struts_iff_frf.png new file mode 100644 index 0000000..41faf02 Binary files /dev/null and b/figs/enc_struts_iff_frf.png differ diff --git a/matlab/mat/jacobian.mat b/matlab/mat/jacobian.mat new file mode 100644 index 0000000..3398648 Binary files /dev/null and b/matlab/mat/jacobian.mat differ diff --git a/ref.bib b/ref.bib new file mode 100644 index 0000000..0bd32bc --- /dev/null +++ b/ref.bib @@ -0,0 +1,24 @@ +@article{souleille18_concep_activ_mount_space_applic, + author = {Souleille, Adrien and Lampert, Thibault and Lafarga, V and + Hellegouarch, Sylvain and Rondineau, Alan and Rodrigues, + Gon{\c{c}}alo and Collette, Christophe}, + title = {A Concept of Active Mount for Space Applications}, + journal = {CEAS Space Journal}, + volume = 10, + number = 2, + pages = {157--165}, + year = 2018, + publisher = {Springer}, +} + +@phdthesis{poel10_explor_activ_hard_mount_vibrat, + author = {van der Poel, Gerrit Wijnand}, + doi = {10.3990/1.9789036530163}, + isbn = {978-90-365-3016-3}, + keywords = {parallel robot}, + school = {University of Twente}, + title = {An Exploration of Active Hard Mount Vibration Isolation for + Precision Equipment}, + url = {https://doi.org/10.3990/1.9789036530163}, + year = 2010, +} diff --git a/test-bench-nano-hexapod.html b/test-bench-nano-hexapod.html index 479ade8..d2baaa1 100644 --- a/test-bench-nano-hexapod.html +++ b/test-bench-nano-hexapod.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Nano-Hexapod - Test Bench @@ -22,7 +22,17 @@

Table of Contents

@@ -30,10 +40,10 @@

This report is also available as a pdf.


-
-

1 Test-Bench Description

+
+

1 Test-Bench Description

-
+

Here are the documentation of the equipment used for this test bench:

@@ -46,12 +56,202 @@ Here are the documentation of the equipment used for this test bench:
+ + +
+

IMG_20210608_152917.jpg +

+

Figure 1: Nano-Hexapod

+
+ + +
+

IMG_20210608_154722.jpg +

+

Figure 2: Nano-Hexapod and the control electronics

+
+
+
+ +
+

2 Encoders fixed to the Struts

+
+
+
+

2.1 Introduction

+
+ +
+

2.2 Load Data

+
+
+
meas_data_lf = {};
+
+for i = 1:6
+    meas_data_lf(i) = {load(sprintf('mat/frf_data_exc_strut_%i_noise_lf.mat', i), 't', 'Va', 'Vs', 'de')};
+    meas_data_hf(i) = {load(sprintf('mat/frf_data_exc_strut_%i_noise_hf.mat', i), 't', 'Va', 'Vs', 'de')};
+end
+
+
+
+
+ +
+

2.3 Spectral Analysis - Setup

+
+
+
% Sampling Time [s]
+Ts = (meas_data_lf{1}.t(end) - (meas_data_lf{1}.t(1)))/(length(meas_data_lf{1}.t)-1);
+
+% Sampling Frequency [Hz]
+Fs = 1/Ts;
+
+% Hannning Windows
+win = hanning(ceil(1*Fs));
+
+
+ +

+And we get the frequency vector. +

+
+
[~, f] = tfestimate(meas_data_lf{1}.Va, meas_data_lf{1}.de, win, [], [], 1/Ts);
+
+
+ +
+
i_lf = f < 250; % Points for low frequency excitation
+i_hf = f > 250; % Points for high frequency excitation
+
+
+
+
+ +
+

2.4 DVF Plant

+
+

+First, let’s compute the coherence from the excitation voltage and the displacement as measured by the encoders (Figure 3). +

+ +
+
%% Coherence
+coh_dvf_lf = zeros(length(f), 6, 6);
+coh_dvf_hf = zeros(length(f), 6, 6);
+
+for i = 1:6
+    coh_dvf_lf(:, :, i) = mscohere(meas_data_lf{i}.Va, meas_data_lf{i}.de, win, [], [], 1/Ts);
+    coh_dvf_hf(:, :, i) = mscohere(meas_data_hf{i}.Va, meas_data_hf{i}.de, win, [], [], 1/Ts);
+end
+
+
+
+ + +
+

enc_struts_dvf_coh.png +

+

Figure 3: Obtained coherence for the DVF plant

+
+ +

+Then the 6x6 transfer function matrix is estimated (Figure 4). +

+
+
%% DVF Plant
+G_dvf_lf = zeros(length(f), 6, 6);
+G_dvf_hf = zeros(length(f), 6, 6);
+
+for i = 1:6
+    G_dvf_lf(:, :, i) = tfestimate(meas_data_lf{i}.Va, meas_data_lf{i}.de, win, [], [], 1/Ts);
+    G_dvf_hf(:, :, i) = tfestimate(meas_data_hf{i}.Va, meas_data_hf{i}.de, win, [], [], 1/Ts);
+end
+
+
+ + +
+

enc_struts_dvf_frf.png +

+

Figure 4: Measured FRF for the DVF plant

+
+
+
+ + +
+

2.5 IFF Plant

+
+

+First, let’s compute the coherence from the excitation voltage and the displacement as measured by the encoders (Figure 5). +

+ +
+
%% Coherence
+coh_iff_lf = zeros(length(f), 6, 6);
+coh_iff_hf = zeros(length(f), 6, 6);
+
+for i = 1:6
+    coh_iff_lf(:, :, i) = mscohere(meas_data_lf{i}.Va, meas_data_lf{i}.Vs, win, [], [], 1/Ts);
+    coh_iff_hf(:, :, i) = mscohere(meas_data_hf{i}.Va, meas_data_hf{i}.Vs, win, [], [], 1/Ts);
+end
+
+
+
+ + +
+

enc_struts_iff_coh.png +

+

Figure 5: Obtained coherence for the IFF plant

+
+ +

+Then the 6x6 transfer function matrix is estimated (Figure 6). +

+
+
%% IFF Plant
+G_iff_lf = zeros(length(f), 6, 6);
+G_iff_hf = zeros(length(f), 6, 6);
+
+for i = 1:6
+    G_iff_lf(:, :, i) = tfestimate(meas_data_lf{i}.Va, meas_data_lf{i}.Vs, win, [], [], 1/Ts);
+    G_iff_hf(:, :, i) = tfestimate(meas_data_hf{i}.Va, meas_data_hf{i}.Vs, win, [], [], 1/Ts);
+end
+
+
+ + +
+

enc_struts_iff_frf.png +

+

Figure 6: Measured FRF for the IFF plant

+
+
+
+ +
+

2.6 Jacobian

+
+
+
load('jacobian.mat', 'J');
+
+
+ +
+
G_dvf_J_lf = G_dvf_lf(i_lf, i, j)
+
+
+ +

+#+end_src

+

Author: Dehaeze Thomas

-

Created: 2021-06-07 lun. 19:00

+

Created: 2021-06-08 mar. 21:51

diff --git a/test-bench-nano-hexapod.org b/test-bench-nano-hexapod.org index 6eed63a..79856a6 100644 --- a/test-bench-nano-hexapod.org +++ b/test-bench-nano-hexapod.org @@ -46,6 +46,7 @@
#+end_export +* Introduction :ignore: * Test-Bench Description #+begin_note @@ -56,3 +57,425 @@ Here are the documentation of the equipment used for this test bench: - Encoder: Renishaw [[file:doc/L-9517-9678-05-A_Data_sheet_VIONiC_series_en.pdf][Vionic]] and used [[file:doc/L-9517-9862-01-C_Data_sheet_RKLC_EN.pdf][Ruler]] - Interferometers: Attocube #+end_note + +#+name: fig:picture_bench_granite_nano_hexapod +#+caption: Nano-Hexapod +[[file:figs/IMG_20210608_152917.jpg]] + +#+name: fig:picture_bench_granite_overview +#+caption: Nano-Hexapod and the control electronics +[[file:figs/IMG_20210608_154722.jpg]] + +* Encoders fixed to the Struts +** Introduction + +** 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 +addpath('./matlab/mat/'); +addpath('./matlab/src/'); +addpath('./matlab/'); +#+end_src + +#+begin_src matlab :eval no +addpath('./mat/'); +addpath('./src/'); +#+end_src + +** Load Data +#+begin_src matlab +meas_data_lf = {}; + +for i = 1:6 + meas_data_lf(i) = {load(sprintf('mat/frf_data_exc_strut_%i_noise_lf.mat', i), 't', 'Va', 'Vs', 'de')}; + meas_data_hf(i) = {load(sprintf('mat/frf_data_exc_strut_%i_noise_hf.mat', i), 't', 'Va', 'Vs', 'de')}; +end +#+end_src + +** Spectral Analysis - Setup +#+begin_src matlab +% Sampling Time [s] +Ts = (meas_data_lf{1}.t(end) - (meas_data_lf{1}.t(1)))/(length(meas_data_lf{1}.t)-1); + +% Sampling Frequency [Hz] +Fs = 1/Ts; + +% Hannning Windows +win = hanning(ceil(1*Fs)); +#+end_src + +And we get the frequency vector. +#+begin_src matlab +[~, f] = tfestimate(meas_data_lf{1}.Va, meas_data_lf{1}.de, win, [], [], 1/Ts); +#+end_src + +#+begin_src matlab +i_lf = f < 250; % Points for low frequency excitation +i_hf = f > 250; % Points for high frequency excitation +#+end_src + +** DVF Plant +First, let's compute the coherence from the excitation voltage and the displacement as measured by the encoders (Figure [[fig:enc_struts_dvf_coh]]). + +#+begin_src matlab +%% Coherence +coh_dvf_lf = zeros(length(f), 6, 6); +coh_dvf_hf = zeros(length(f), 6, 6); + +for i = 1:6 + coh_dvf_lf(:, :, i) = mscohere(meas_data_lf{i}.Va, meas_data_lf{i}.de, win, [], [], 1/Ts); + coh_dvf_hf(:, :, i) = mscohere(meas_data_hf{i}.Va, meas_data_hf{i}.de, win, [], [], 1/Ts); +end + +#+end_src + +#+begin_src matlab :exports none +figure; +hold on; +for i = 1:5 + for j = i+1:6 + plot(f(i_lf), coh_dvf_lf(i_lf, i, j), 'color', [0, 0, 0, 0.2], ... + 'HandleVisibility', 'off'); + plot(f(i_hf), coh_dvf_hf(i_hf, i, j), 'color', [0, 0, 0, 0.2], ... + 'HandleVisibility', 'off'); + end +end +for i =1:6 + set(gca,'ColorOrderIndex',i) + plot(f(i_lf), coh_dvf_lf(i_lf,i, i), ... + 'DisplayName', sprintf('$G_{dvf}(%i,%i)$', i, i)); + set(gca,'ColorOrderIndex',i) + plot(f(i_hf), coh_dvf_hf(i_hf,i, i), ... + 'HandleVisibility', 'off'); +end +plot(f(i_lf), coh_dvf_lf(i_lf, 1, 2), 'color', [0, 0, 0, 0.2], ... + 'DisplayName', '$G_{dvf}(i,j)$'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Coherence [-]'); +xlim([20, 2e3]); ylim([0, 1]); +legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 3); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/enc_struts_dvf_coh.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:enc_struts_dvf_coh +#+caption: Obtained coherence for the DVF plant +#+RESULTS: +[[file:figs/enc_struts_dvf_coh.png]] + +Then the 6x6 transfer function matrix is estimated (Figure [[fig:enc_struts_dvf_frf]]). +#+begin_src matlab +%% DVF Plant +G_dvf_lf = zeros(length(f), 6, 6); +G_dvf_hf = zeros(length(f), 6, 6); + +for i = 1:6 + G_dvf_lf(:, :, i) = tfestimate(meas_data_lf{i}.Va, meas_data_lf{i}.de, win, [], [], 1/Ts); + G_dvf_hf(:, :, i) = tfestimate(meas_data_hf{i}.Va, meas_data_hf{i}.de, win, [], [], 1/Ts); +end +#+end_src + +#+begin_src matlab :exports none +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(f(i_lf), abs(G_dvf_lf(i_lf, i, j)), 'color', [0, 0, 0, 0.2], ... + 'HandleVisibility', 'off'); + plot(f(i_hf), abs(G_dvf_hf(i_hf, i, j)), 'color', [0, 0, 0, 0.2], ... + 'HandleVisibility', 'off'); + end +end +for i =1:6 + set(gca,'ColorOrderIndex',i) + plot(f(i_lf), abs(G_dvf_lf(i_lf,i, i)), ... + 'DisplayName', sprintf('$G_{dvf}(%i,%i)$', i, i)); + set(gca,'ColorOrderIndex',i) + plot(f(i_hf), abs(G_dvf_hf(i_hf,i, i)), ... + 'HandleVisibility', 'off'); +end +plot(f(i_lf), abs(G_dvf_lf(i_lf, 1, 2)), 'color', [0, 0, 0, 0.2], ... + 'DisplayName', '$G_{dvf}(i,j)$'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_e/V_a$ [m/V]'); set(gca, 'XTickLabel',[]); +ylim([1e-9, 1e-3]); +legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 3); + +ax2 = nexttile; +hold on; +for i =1:6 + set(gca,'ColorOrderIndex',i) + plot(f(i_lf), 180/pi*angle(G_dvf_lf(i_lf,i, i))); + set(gca,'ColorOrderIndex',i) + plot(f(i_hf), 180/pi*angle(G_dvf_hf(i_hf,i, i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); + +linkaxes([ax1,ax2],'x'); +xlim([20, 2e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/enc_struts_dvf_frf.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:enc_struts_dvf_frf +#+caption: Measured FRF for the DVF plant +#+RESULTS: +[[file:figs/enc_struts_dvf_frf.png]] + + +** IFF Plant +First, let's compute the coherence from the excitation voltage and the displacement as measured by the encoders (Figure [[fig:enc_struts_iff_coh]]). + +#+begin_src matlab +%% Coherence +coh_iff_lf = zeros(length(f), 6, 6); +coh_iff_hf = zeros(length(f), 6, 6); + +for i = 1:6 + coh_iff_lf(:, :, i) = mscohere(meas_data_lf{i}.Va, meas_data_lf{i}.Vs, win, [], [], 1/Ts); + coh_iff_hf(:, :, i) = mscohere(meas_data_hf{i}.Va, meas_data_hf{i}.Vs, win, [], [], 1/Ts); +end + +#+end_src + +#+begin_src matlab :exports none +figure; +hold on; +for i = 1:5 + for j = i+1:6 + plot(f(i_lf), coh_iff_lf(i_lf, i, j), 'color', [0, 0, 0, 0.2], ... + 'HandleVisibility', 'off'); + plot(f(i_hf), coh_iff_hf(i_hf, i, j), 'color', [0, 0, 0, 0.2], ... + 'HandleVisibility', 'off'); + end +end +for i =1:6 + set(gca,'ColorOrderIndex',i) + plot(f(i_lf), coh_iff_lf(i_lf,i, i), ... + 'DisplayName', sprintf('$G_{iff}(%i,%i)$', i, i)); + set(gca,'ColorOrderIndex',i) + plot(f(i_hf), coh_iff_hf(i_hf,i, i), ... + 'HandleVisibility', 'off'); +end +plot(f(i_lf), coh_iff_lf(i_lf, 1, 2), 'color', [0, 0, 0, 0.2], ... + 'DisplayName', '$G_{iff}(i,j)$'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Coherence [-]'); +xlim([20, 2e3]); ylim([0, 1]); +legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 3); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/enc_struts_iff_coh.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:enc_struts_iff_coh +#+caption: Obtained coherence for the IFF plant +#+RESULTS: +[[file:figs/enc_struts_iff_coh.png]] + +Then the 6x6 transfer function matrix is estimated (Figure [[fig:enc_struts_iff_frf]]). +#+begin_src matlab +%% IFF Plant +G_iff_lf = zeros(length(f), 6, 6); +G_iff_hf = zeros(length(f), 6, 6); + +for i = 1:6 + G_iff_lf(:, :, i) = tfestimate(meas_data_lf{i}.Va, meas_data_lf{i}.Vs, win, [], [], 1/Ts); + G_iff_hf(:, :, i) = tfestimate(meas_data_hf{i}.Va, meas_data_hf{i}.Vs, win, [], [], 1/Ts); +end +#+end_src + +#+begin_src matlab :exports none +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(f(i_lf), abs(G_iff_lf(i_lf, i, j)), 'color', [0, 0, 0, 0.2], ... + 'HandleVisibility', 'off'); + plot(f(i_hf), abs(G_iff_hf(i_hf, i, j)), 'color', [0, 0, 0, 0.2], ... + 'HandleVisibility', 'off'); + end +end +for i =1:6 + set(gca,'ColorOrderIndex',i) + plot(f(i_lf), abs(G_iff_lf(i_lf,i, i)), ... + 'DisplayName', sprintf('$G_{iff}(%i,%i)$', i, i)); + set(gca,'ColorOrderIndex',i) + plot(f(i_hf), abs(G_iff_hf(i_hf,i, i)), ... + 'HandleVisibility', 'off'); +end +plot(f(i_lf), abs(G_iff_lf(i_lf, 1, 2)), 'color', [0, 0, 0, 0.2], ... + 'DisplayName', '$G_{iff}(i,j)$'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $V_s/V_a$ [V/V]'); set(gca, 'XTickLabel',[]); +legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 3); +ylim([1e-3, 1e2]); + +ax2 = nexttile; +hold on; +for i =1:6 + set(gca,'ColorOrderIndex',i) + plot(f(i_lf), 180/pi*angle(G_iff_lf(i_lf,i, i))); + set(gca,'ColorOrderIndex',i) + plot(f(i_hf), 180/pi*angle(G_iff_hf(i_hf,i, i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); + +linkaxes([ax1,ax2],'x'); +xlim([20, 2e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/enc_struts_iff_frf.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:enc_struts_iff_frf +#+caption: Measured FRF for the IFF plant +#+RESULTS: +[[file:figs/enc_struts_iff_frf.png]] + +** Jacobian +#+begin_src matlab +load('jacobian.mat', 'J'); +#+end_src +*** DVF Plant +#+begin_src matlab +G_dvf_J_lf = permute(pagemtimes(inv(J), pagemtimes(permute(G_dvf_lf, [2 3 1]), inv(J'))), [3 1 2]); +G_dvf_J_hf = permute(pagemtimes(inv(J), pagemtimes(permute(G_dvf_hf, [2 3 1]), inv(J'))), [3 1 2]); +#+end_src + +#+begin_src matlab :exports none +labels = {'$D_x/F_{x}$', '$D_y/F_{y}$', '$D_z/F_{z}$', '$R_{x}/M_{x}$', '$R_{y}/M_{y}$', '$R_{R}/M_{z}$'}; + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(f(i_lf), abs(G_dvf_J_lf(i_lf, i, j)), 'color', [0, 0, 0, 0.2], ... + 'HandleVisibility', 'off'); + plot(f(i_hf), abs(G_dvf_J_hf(i_hf, i, j)), 'color', [0, 0, 0, 0.2], ... + 'HandleVisibility', 'off'); + end +end +for i =1:6 + set(gca,'ColorOrderIndex',i) + plot(f(i_lf), abs(G_dvf_J_lf(i_lf,i, i)), ... + 'DisplayName', labels{i}); + set(gca,'ColorOrderIndex',i) + plot(f(i_hf), abs(G_dvf_J_hf(i_hf,i, i)), ... + 'HandleVisibility', 'off'); +end +plot(f(i_lf), abs(G_dvf_J_lf(i_lf, 1, 2)), 'color', [0, 0, 0, 0.2], ... + 'DisplayName', '$D_i/F_j$'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_e/V_a$ [m/V]'); set(gca, 'XTickLabel',[]); +ylim([1e-7, 1e-1]); +legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 3); + +ax2 = nexttile; +hold on; +for i =1:6 + set(gca,'ColorOrderIndex',i) + plot(f(i_lf), 180/pi*angle(G_dvf_J_lf(i_lf,i, i))); + set(gca,'ColorOrderIndex',i) + plot(f(i_hf), 180/pi*angle(G_dvf_J_hf(i_hf,i, i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); + +linkaxes([ax1,ax2],'x'); +xlim([20, 2e3]); +#+end_src + +*** IFF Plant +#+begin_src matlab +G_iff_J_lf = permute(pagemtimes(inv(J), pagemtimes(permute(G_iff_lf, [2 3 1]), inv(J'))), [3 1 2]); +G_iff_J_hf = permute(pagemtimes(inv(J), pagemtimes(permute(G_iff_hf, [2 3 1]), inv(J'))), [3 1 2]); +#+end_src + +#+begin_src matlab :exports none +labels = {'$F_{m,x}/F_{x}$', '$F_{m,y}/F_{y}$', '$F_{m,z}/F_{z}$', '$M_{m,x}/M_{x}$', '$M_{m,y}/M_{y}$', '$M_{m,z}/M_{z}$'}; + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(f(i_lf), abs(G_iff_J_lf(i_lf, i, j)), 'color', [0, 0, 0, 0.2], ... + 'HandleVisibility', 'off'); + plot(f(i_hf), abs(G_iff_J_hf(i_hf, i, j)), 'color', [0, 0, 0, 0.2], ... + 'HandleVisibility', 'off'); + end +end +for i =1:6 + set(gca,'ColorOrderIndex',i) + plot(f(i_lf), abs(G_iff_J_lf(i_lf,i, i)), ... + 'DisplayName', labels{i}); + set(gca,'ColorOrderIndex',i) + plot(f(i_hf), abs(G_iff_J_hf(i_hf,i, i)), ... + 'HandleVisibility', 'off'); +end +plot(f(i_lf), abs(G_iff_J_lf(i_lf, 1, 2)), 'color', [0, 0, 0, 0.2], ... + 'DisplayName', '$D_i/F_j$'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_e/V_a$ [m/V]'); set(gca, 'XTickLabel',[]); +ylim([1e-7, 1e-1]); +legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 3); + +ax2 = nexttile; +hold on; +for i =1:6 + set(gca,'ColorOrderIndex',i) + plot(f(i_lf), 180/pi*angle(G_iff_J_lf(i_lf,i, i))); + set(gca,'ColorOrderIndex',i) + plot(f(i_hf), 180/pi*angle(G_iff_J_hf(i_hf,i, i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); + +linkaxes([ax1,ax2],'x'); +xlim([20, 2e3]); +#+end_src diff --git a/test-bench-nano-hexapod.pdf b/test-bench-nano-hexapod.pdf new file mode 100644 index 0000000..70e7c95 Binary files /dev/null and b/test-bench-nano-hexapod.pdf differ