diff --git a/figs/test_struts_comp_enc_frf_realign.pdf b/figs/test_struts_comp_enc_frf_realign.pdf index 5c28d52..a3181d8 100644 Binary files a/figs/test_struts_comp_enc_frf_realign.pdf and b/figs/test_struts_comp_enc_frf_realign.pdf differ diff --git a/figs/test_struts_comp_enc_frf_realign.png b/figs/test_struts_comp_enc_frf_realign.png index ad104c0..c58b4f3 100644 Binary files a/figs/test_struts_comp_enc_frf_realign.png and b/figs/test_struts_comp_enc_frf_realign.png differ diff --git a/figs/test_struts_comp_enc_int.pdf b/figs/test_struts_comp_enc_int.pdf index 4cc919c..347cd78 100644 Binary files a/figs/test_struts_comp_enc_int.pdf and b/figs/test_struts_comp_enc_int.pdf differ diff --git a/figs/test_struts_comp_enc_int.png b/figs/test_struts_comp_enc_int.png index 09af51e..5f73738 100644 Binary files a/figs/test_struts_comp_enc_int.png and b/figs/test_struts_comp_enc_int.png differ diff --git a/figs/test_struts_comp_enc_plants.pdf b/figs/test_struts_comp_enc_plants.pdf index 70886b7..c233d27 100644 Binary files a/figs/test_struts_comp_enc_plants.pdf and b/figs/test_struts_comp_enc_plants.pdf differ diff --git a/figs/test_struts_comp_enc_plants.png b/figs/test_struts_comp_enc_plants.png index 9bc854c..6419c18 100644 Binary files a/figs/test_struts_comp_enc_plants.png and b/figs/test_struts_comp_enc_plants.png differ diff --git a/figs/test_struts_comp_frf_flexible_model_enc.pdf b/figs/test_struts_comp_frf_flexible_model_enc.pdf index 5ceb86f..1d0152f 100644 Binary files a/figs/test_struts_comp_frf_flexible_model_enc.pdf and b/figs/test_struts_comp_frf_flexible_model_enc.pdf differ diff --git a/figs/test_struts_comp_frf_flexible_model_enc.png b/figs/test_struts_comp_frf_flexible_model_enc.png index 9502207..f8b383f 100644 Binary files a/figs/test_struts_comp_frf_flexible_model_enc.png and b/figs/test_struts_comp_frf_flexible_model_enc.png differ diff --git a/figs/test_struts_comp_frf_flexible_model_iff.pdf b/figs/test_struts_comp_frf_flexible_model_iff.pdf index 33d6a75..eed8f5e 100644 Binary files a/figs/test_struts_comp_frf_flexible_model_iff.pdf and b/figs/test_struts_comp_frf_flexible_model_iff.pdf differ diff --git a/figs/test_struts_comp_frf_flexible_model_iff.png b/figs/test_struts_comp_frf_flexible_model_iff.png index 3ca4f2b..3df8676 100644 Binary files a/figs/test_struts_comp_frf_flexible_model_iff.png and b/figs/test_struts_comp_frf_flexible_model_iff.png differ diff --git a/figs/test_struts_comp_frf_flexible_model_int.pdf b/figs/test_struts_comp_frf_flexible_model_int.pdf index 08938eb..28d6e7f 100644 Binary files a/figs/test_struts_comp_frf_flexible_model_int.pdf and b/figs/test_struts_comp_frf_flexible_model_int.pdf differ diff --git a/figs/test_struts_comp_frf_flexible_model_int.png b/figs/test_struts_comp_frf_flexible_model_int.png index 159c1c3..c4eae5b 100644 Binary files a/figs/test_struts_comp_frf_flexible_model_int.png and b/figs/test_struts_comp_frf_flexible_model_int.png differ diff --git a/figs/test_struts_comp_iff_plants.pdf b/figs/test_struts_comp_iff_plants.pdf index 9a30ca0..cfc895e 100644 Binary files a/figs/test_struts_comp_iff_plants.pdf and b/figs/test_struts_comp_iff_plants.pdf differ diff --git a/figs/test_struts_comp_iff_plants.png b/figs/test_struts_comp_iff_plants.png index b4fa249..4007bd7 100644 Binary files a/figs/test_struts_comp_iff_plants.png and b/figs/test_struts_comp_iff_plants.png differ diff --git a/figs/test_struts_comp_interf_plants.pdf b/figs/test_struts_comp_interf_plants.pdf index 5c8dbfc..a90d973 100644 Binary files a/figs/test_struts_comp_interf_plants.pdf and b/figs/test_struts_comp_interf_plants.pdf differ diff --git a/figs/test_struts_comp_interf_plants.png b/figs/test_struts_comp_interf_plants.png index 7ca1e5f..2dd0f9b 100644 Binary files a/figs/test_struts_comp_interf_plants.png and b/figs/test_struts_comp_interf_plants.png differ diff --git a/figs/test_struts_effect_encoder_iff.pdf b/figs/test_struts_effect_encoder_iff.pdf index 5914979..7ade7b7 100644 Binary files a/figs/test_struts_effect_encoder_iff.pdf and b/figs/test_struts_effect_encoder_iff.pdf differ diff --git a/figs/test_struts_effect_encoder_iff.png b/figs/test_struts_effect_encoder_iff.png index 845416f..ffb92c6 100644 Binary files a/figs/test_struts_effect_encoder_iff.png and b/figs/test_struts_effect_encoder_iff.png differ diff --git a/figs/test_struts_effect_encoder_int.pdf b/figs/test_struts_effect_encoder_int.pdf index 4a63340..9effd40 100644 Binary files a/figs/test_struts_effect_encoder_int.pdf and b/figs/test_struts_effect_encoder_int.pdf differ diff --git a/figs/test_struts_effect_encoder_int.png b/figs/test_struts_effect_encoder_int.png index 57b1669..3b23fa1 100644 Binary files a/figs/test_struts_effect_encoder_int.png and b/figs/test_struts_effect_encoder_int.png differ diff --git a/matlab/mat/meas_struts_frf.mat b/matlab/mat/meas_struts_frf.mat index 5494691..aeb7e51 100644 Binary files a/matlab/mat/meas_struts_frf.mat and b/matlab/mat/meas_struts_frf.mat differ diff --git a/matlab/test_struts_2_dynamical_meas.m b/matlab/test_struts_2_dynamical_meas.m index bbf6bdc..4c5c05c 100644 --- a/matlab/test_struts_2_dynamical_meas.m +++ b/matlab/test_struts_2_dynamical_meas.m @@ -63,9 +63,7 @@ enc_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)]; % Combine the FRF -% System identification is performed in two cases: -% - no encoder is fixed to the strut (Figure ref:fig:test_struts_bench_leg_front) -% - one encoder is fixed to the strut (Figure ref:fig:test_struts_bench_leg_coder) +% System identification is performed without the encoder fixed to the strut (Figure ref:fig:test_struts_bench_leg_front) and with one encoder fixed to the strut (Figure ref:fig:test_struts_bench_leg_coder). % #+name: fig:test_struts_bench_leg_with_without_enc % #+caption: Struts fixed to the test bench with clamped flexible joints. The coder can be fixed to the struts (\subref{fig:test_struts_bench_leg_coder}) or removed (\subref{fig:test_struts_bench_leg_front}) @@ -89,7 +87,7 @@ enc_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)]; % Combine the FRF % It is found that the encoder has very little effect on the transfer function from excitation voltage $u$ to the axial motion of the strut $d_a$ as measured by the interferometer (Figure ref:fig:test_struts_effect_encoder_int). % This means that the axial motion of the strut is unaffected by the presence of the encoder. % Similarly, it has very little effect on the transfer function from $u$ to the sensor stack voltage $V_s$ (Figure ref:fig:test_struts_effect_encoder_iff). -% This means that the integral force feedback control strategy should be as effective whether the encoders are fixed to the struts. +% This means that the integral force feedback control strategy should be as effective whether the encoders are fixed to the struts or not. %% Plot the FRF from u to da with and without the encoder @@ -105,7 +103,8 @@ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude $d_a/u$ [m/V]'); set(gca, 'XTickLabel',[]); hold off; ylim([1e-7, 1e-3]); -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; ax2 = nexttile; hold on; @@ -119,6 +118,7 @@ yticks(-360:90:360); ylim([-180, 180]); linkaxes([ax1,ax2],'x'); xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); %% Compare the IFF plant with and without the encoders figure; @@ -132,7 +132,8 @@ hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]); hold off; -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); +leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; ylim([1e-2, 1e2]); ax2 = nexttile; @@ -147,18 +148,18 @@ yticks(-360:90:360); ylim([-180, 180]); linkaxes([ax1,ax2],'x'); xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); % Comparison of the encoder and interferometer % <> -% The dynamics as measured by the encoder and by the interferometers are compared in Figure ref:fig:test_struts_comp_enc_int. - +% The dynamics as measured by the encoder (i.e. $d_e/u$) and by the interferometers (i.e. $d_a/u$) are compared in Figure ref:fig:test_struts_comp_enc_int. % The dynamics from the excitation voltage $u$ to the measured displacement by the encoder $d_e$ presents a behavior that is much more complex than the dynamics to the displacement as measured by the interferometer (comparison made in Figure ref:fig:test_struts_comp_enc_int). % Three additional resonance frequencies can be observed at 197Hz, 290Hz and 376Hz. -% These resonance frequencies correspond to flexible modes of the strut that were studied in Section ref:sec:test_struts_flexible_modes. +% These resonance frequencies are matching the frequencies of the flexible modes that were studied in Section ref:sec:test_struts_flexible_modes. -% The good news is that these resonances are not seen on the interferometer and are therefore not impacting the axial motion of the strut (which is what is important for the hexapod positioning). -% However, these resonances are making the use of encoder fixed to the strut difficult. +% The good news is that these resonances are not impacting the axial motion of the strut (which is what is important for the hexapod positioning). +% However, these resonances are making the use of encoder fixed to the strut difficult from a control perspective. figure; @@ -166,18 +167,19 @@ tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); ax1 = nexttile([2,1]); hold on; -plot(f, abs(enc_frf), 'DisplayName', 'Encoder'); -plot(f, abs(int_with_enc_frf), 'DisplayName', 'Interferometer'); -text(93, 4e-4, {'93Hz'}, 'VerticalAlignment','bottom','HorizontalAlignment','center') +plot(f, abs(enc_frf), 'DisplayName', '$d_e/u$'); +plot(f, abs(int_with_enc_frf), 'DisplayName', '$d_a/u$'); +text(85, 4e-4, {'93Hz'}, 'VerticalAlignment','middle','HorizontalAlignment','right') text(200, 1.3e-4,{'197Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') -text(300, 4e-6, {'290Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') -text(400, 1.4e-6,{'376Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') +text(300, 4e-6, {'290Hz'},'VerticalAlignment','bottom','HorizontalAlignment','left') +text(400, 4e-7,{'376Hz'},'VerticalAlignment','top','HorizontalAlignment','center') hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude $d/u$ [m/V]'); set(gca, 'XTickLabel',[]); hold off; -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); -ylim([1e-8, 1e-3]); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +ylim([1e-7, 1e-3]); ax2 = nexttile; hold on; @@ -191,6 +193,7 @@ yticks(-360:90:360); ylim([-180, 180]); linkaxes([ax1,ax2],'x'); xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); % Comparison of all the Struts % <> @@ -239,7 +242,7 @@ end -% Then, the dynamics of all the mounted struts (only 5 at the time of the experiment) are all measured using the same test bench. +% Then, the dynamics of all the mounted struts (only 5 at the time of the experiment) were all measured using the same test bench. % The obtained dynamics from $u$ to $d_a$ are compared in Figure ref:fig:test_struts_comp_interf_plants while is dynamics from $u$ to $V_s$ are compared in Figure ref:fig:test_struts_comp_iff_plants. % Very good match can be observed between all the struts. @@ -258,8 +261,9 @@ hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude $d_a/u$ [m/V]'); set(gca, 'XTickLabel',[]); hold off; -legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2); -ylim([1e-9, 1e-3]); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +ylim([1e-8, 1e-3]); ax2 = nexttile; hold on; @@ -274,6 +278,7 @@ yticks(-360:90:360); ylim([-180 180]); linkaxes([ax1,ax2],'x'); xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); %% Plot the FRF from u to Vs figure; @@ -290,7 +295,8 @@ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]); hold off; ylim([1e-2, 1e2]); -legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); +leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; ax2 = nexttile; hold on; @@ -305,34 +311,7 @@ yticks(-360:90:360); ylim([-180 180]); linkaxes([ax1,ax2],'x'); xlim([10, 2e3]); - - - -% #+name: fig:test_struts_comp_plants -% #+caption: Comparison of the measured plants -% #+attr_latex: :options [htbp] -% #+begin_figure -% #+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_interf_plants}$u$ to $d_a$} -% #+attr_latex: :options {0.49\textwidth} -% #+begin_subfigure -% #+attr_latex: :width \linewidth -% [[file:figs/test_struts_comp_interf_plants.png]] -% #+end_subfigure -% #+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_iff_plants}$u$ to $V_s$} -% #+attr_latex: :options {0.49\textwidth} -% #+begin_subfigure -% #+attr_latex: :width \linewidth -% [[file:figs/test_struts_comp_iff_plants.png]] -% #+end_subfigure -% #+end_figure - -% The same comparison is made for the transfer function from $u$ to $d_e$ (encoder output) in Figure ref:fig:test_struts_comp_enc_plants. -% This time, large dynamics differences are observed between the 5 struts. -% Even-though the same peaks are seen for all of the struts (95Hz, 200Hz, 300Hz, 400Hz), the amplitude of the peaks are not the same. -% Moreover, the location or even the presence of complex conjugate zeros is changing from one strut to the other. - -% It will be further investigated why such differences are observed (see Section ref:ssec:test_struts_effect_misalignment). - +xticks([1e1, 1e2, 1e3]); %% Bode plot of the FRF from u to de figure; @@ -348,7 +327,8 @@ hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); hold off; -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; ylim([1e-8, 1e-3]); ax2 = nexttile; @@ -364,6 +344,7 @@ yticks(-360:90:360); ylim([-180, 180]); linkaxes([ax1,ax2],'x'); xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); %% Save the estimated FRF for further analysis save('./mat/meas_struts_frf.mat', 'f', 'enc_frf', 'int_frf', 'iff_frf', 'strut_nums'); diff --git a/matlab/test_struts_3_simscape_model.m b/matlab/test_struts_3_simscape_model.m index 5a40758..0b02d3e 100644 --- a/matlab/test_struts_3_simscape_model.m +++ b/matlab/test_struts_3_simscape_model.m @@ -34,6 +34,7 @@ freqs = logspace(1, log10(2000), 1000); % Model dynamics % <> + %% Load measured FRF for comparison load('meas_struts_frf.mat', 'f', 'enc_frf', 'int_frf', 'iff_frf', 'strut_nums'); @@ -65,13 +66,9 @@ Gs_flex.OutputName = {'Vs', 'de', 'da'}; -% Two models of the APA300ML are used here for comparison: -% - a simple two degrees of freedom model -% - a model using a super element extracted from a finite element model - +% Two models of the APA300ML are used here: a simple two degrees of freedom model and a model using a super element extracted from a finite element model. % These two models of the APA300ML were tuned to best match measured frequency response functions of the APA alone. % The flexible joints are here modelled with the 4DoF model (axial stiffness, two bending stiffnesses and one torsion stiffness). - % These two models are compared with the measured frequency responses in Figure ref:fig:test_struts_comp_frf_flexible_model. % The model dynamics from DAC voltage $u$ to the axial motion of the strut $d_a$ (Figure ref:fig:test_struts_comp_frf_flexible_model_int) and from DAC voltage $u$ to the force sensor voltage $V_s$ (Figure ref:fig:test_struts_comp_frf_flexible_model_iff) are well matching the experimental identification. @@ -120,6 +117,7 @@ yticks(-360:90:360); ylim([-180, 180]); linkaxes([ax1a,ax2a],'x'); xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); %% Compare the FRF and identified dynamics from u to Vs and da figure; @@ -160,6 +158,7 @@ yticks(-360:90:360); ylim([-180, 180]); linkaxes([ax1a,ax2a],'x'); xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); %% Compare the FRF and identified dynamics from u to Vs and da figure; @@ -201,24 +200,24 @@ yticks(-360:90:360); ylim([-180, 180]); linkaxes([ax1a,ax2a],'x'); xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); % Effect of strut misalignment % <> % As was shown in Figure ref:fig:test_struts_comp_enc_plants, the identified dynamics from DAC voltage $u$ to encoder measured displacement $d_e$ are very different from one strut to the other. - % In this section, it is investigated whether poor alignment of the strut (flexible joints with respect to the APA) can explain such dynamics. % For instance, consider Figure ref:fig:test_struts_misalign_schematic where there is a misalignment in the $y$ direction between the two flexible joints (well aligned thanks to the mounting procedure in Section ref:sec:test_struts_mounting) and the APA300ML. -% In such case, the "x-bending" mode at 200Hz (see Figure ref:fig:test_struts_meas_x_bending) can be expected to be more excited, and thus the dynamics from the actuator to the encoder should be affected at frequencies around 200Hz. +% In such case, the "x-bending" mode at 200Hz (see Figure ref:fig:test_struts_meas_x_bending) can be expected to have more impact on the dynamics from the actuator to the encoder. % #+name: fig:test_struts_misalign_schematic % #+caption: Mis-alignement between the joints and the APA % #+attr_latex: :width 0.8\linewidth % [[file:figs/test_struts_misalign_schematic.png]] -% To verify this assumption, the dynamics from output DAC voltage $u$ to the measured displacement by the encoder $d_e$ is computed using the Simscape model with flexible APA for several misalignment in the $y$ direction. +% To verify this assumption, the dynamics from output DAC voltage $u$ to the measured displacement by the encoder $d_e$ is computed using the flexible APA Simscape model for several misalignment in the $y$ direction. % Obtained dynamics are shown in Figure ref:fig:test_struts_effect_misalignment_y. -% The alignment of the APA with the flexible joints as a *huge* influence on the dynamics from actuator voltage to measured displacement by the encoder. +% The alignment of the APA with the flexible joints as a large influence on the dynamics from actuator voltage to measured displacement by the encoder. % The misalignment in the $y$ direction mostly influences: % - the presence of the flexible mode at 200Hz (see mode shape in Figure ref:fig:test_struts_mode_shapes_1) % - the location of the complex conjugate zero between the first two resonances: @@ -227,7 +226,7 @@ xlim([10, 2e3]); % - the location of the high frequency complex conjugate zeros at 500Hz (secondary effect, as the axial stiffness of the joint also has large effect on the position of this zero) % The same can be done for a misalignment in the $x$ direction. -% The obtained dynamics are shown in Figure ref:fig:test_struts_effect_misalignment_x where it is shown that misalignment in the $x$ direction mostly influences the presence of the flexible mode at 300Hz (see mode shape in Figure ref:fig:test_struts_mode_shapes_2). +% The obtained dynamics (Figure ref:fig:test_struts_effect_misalignment_x) are showing that misalignment in the $x$ direction mostly influences the presence of the flexible mode at 300Hz (see mode shape in Figure ref:fig:test_struts_mode_shapes_2). % Comparing the experimental frequency response functions for all the APA in Figure ref:fig:test_struts_comp_enc_plants with the model dynamics for several $y$ misalignments in Figure ref:fig:test_struts_effect_misalignment_y indicates a clear similarity. % This similarity suggests that the identified differences in dynamics are caused by the misalignment. @@ -301,6 +300,7 @@ yticks(-360:90:360); ylim([-180, 180]); linkaxes([ax1,ax2],'x'); xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); %% Transfer function from Vs to de - effect of x-misalignment figure; @@ -336,17 +336,18 @@ yticks(-360:90:360); ylim([-180, 180]); linkaxes([ax1,ax2],'x'); xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); % Measured strut misalignment % <> -% During the first mounting of the struts presented in Section ref:sec:test_struts_mounting, the positioning pins used to position the APA with respect to the flexible joints in the $y$ directions were not used (not received at the time). -% Therefore, large $y$ misalignments may be expected. +% During the initial mounting of the struts as presented in Section ref:sec:test_struts_mounting, the positioning pins that are used to position the APA with respect to the flexible joints in the $y$ directions were not used (not received at the time). +% Therefore, large $y$ misalignments is expected. % In order to estimate the misalignments between the two flexible joints and the APA: -% - the struts are fixed horizontally to the mounting bench as shown in Figure ref:fig:test_struts_mounting_step_3 but without the encoder -% - using a length gauge[fn:2], the height difference from the flexible joints surface and the APA shell surface is measured both for the top and bottom joints and on both sides -% - as the thickness of the flexible joint is $21\,mm$ and the thickness of the APA shell is $20\,mm$, $0.5\,mm$ of height different should be measured is the two are perfectly aligned +% - the struts are fixed horizontally on the mounting bench as shown in Figure ref:fig:test_struts_mounting_step_3 but without the encoder +% - using a length gauge[fn:2], the height difference from the flexible joints surface and the APA shell surface is measured both for the top and bottom joints and for both sides +% - as the thickness of the flexible joint is $21\,mm$ and the thickness of the APA shell is $20\,mm$, $0.5\,mm$ of height different should be measured if the two are perfectly aligned % Large variations in the $y$ misalignment are found from one strut to the other (results are summarized in Table ref:tab:test_struts_meas_y_misalignment). @@ -390,13 +391,11 @@ dy_top = (strut_align(:,3) - strut_align(:,4))/2; % [mm] % | 4 | -0.01 | 0.54 | % | 5 | 0.15 | 0.02 | -% By using the measured $y$ misalignment in the Simscape model with the flexible APA model, the measured dynamics from $u$ to $d_e$ can be approached as shown in Figure ref:fig:test_struts_comp_dy_tuned_model_frf_enc. -% Even better match in the dynamics can be obtained by fine tuning both the $x$ and $y$ misalignments (yellow curves in Figure ref:fig:test_struts_comp_dy_tuned_model_frf_enc). - +% By using the measured $y$ misalignment in the Simscape model with the flexible APA model, the model dynamics from $u$ to $d_e$ is closer to the measured one as shown in Figure ref:fig:test_struts_comp_dy_tuned_model_frf_enc. +% Better match in the dynamics can be obtained by fine tuning both the $x$ and $y$ misalignments (yellow curves in Figure ref:fig:test_struts_comp_dy_tuned_model_frf_enc). % This confirms that the misalignment between the APA and the strut axis (determined by the two flexible joints) is critical and is inducing large variations in the dynamics from DAC voltage $u$ to encoder measured displacement $d_e$. -% If encoders are to be used when fixed on the struts, it is therefore very important to properly align the APA and the flexible joints when mounting the struts. - +% If encoders are fixed to the struts, it is important to precisely align the APA and the flexible joints when mounting the struts. % In the next section, the struts are re-assembled with a "positioning pin" to better align the APA with the flexible joints. % With a better alignment, the amplitude of the spurious resonances are expected to decrease as was shown in Figure ref:fig:test_struts_effect_misalignment_y. @@ -504,7 +503,7 @@ xlim([10, 2e3]); ylim([1e-8, 1e-3]); % This should make the APA better aligned with the two flexible joints. % This alignment is then estimated using a length gauge as in the previous sections. -% Measured $y$ alignments are summarized in Table ref:tab:test_struts_meas_y_misalignment_with_pin and are found to be bellow $55\mu m$ for all the struts which is much better than better (see Table ref:tab:test_struts_meas_y_misalignment). +% Measured $y$ alignments are summarized in Table ref:tab:test_struts_meas_y_misalignment_with_pin and are found to be bellow $55\mu m$ for all the struts which is much better than before (see Table ref:tab:test_struts_meas_y_misalignment). %% Measurement of the y misalignment between the APA and the flexible joints after strut better alignment @@ -548,11 +547,10 @@ dy_top = (strut_align(:,3) - strut_align(:,4))/2; % [mm] % The dynamics of the re-aligned struts are then measured using the same test bench (Figure ref:fig:test_struts_bench_leg). % The comparison of the initial strut dynamics and the dynamics of the re-aligned struts (i.e. with the positioning pin) is made in Figure ref:fig:test_struts_comp_enc_frf_realign. - % Even though the struts are now much better aligned, not much improvement can be observed. -% The dynamics of the six aligned struts are quite different from one another. +% Also, the dynamics of the six aligned struts are quite different from one another. -% Having the encoders fixed to the struts may prove to be difficult to use. +% Having the encoders fixed to the struts are making the control more challenging. % Therefore, the encoders may be fixed to the nano-hexapod plates instead. @@ -581,9 +579,6 @@ end %% Bode plot of the FRF from u to de figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1 = nexttile([2,1]); hold on; plot(f, abs(enc_frf(:, 1)), 'color', [colors(1,:), 0.5], ... 'DisplayName', 'Initial alignment'); @@ -599,145 +594,7 @@ for i = 1:length(strut_align_nums) end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); -hold off; -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); -ylim([1e-8, 1e-3]); - -ax2 = nexttile; -hold on; -for i = 1:length(strut_nums) - plot(f, 180/pi*angle(enc_frf(:, i)), 'color', [colors(1,:), 0.5]); -end -for i = 1:length(strut_align_nums) - plot(f, 180/pi*angle(enc_frf_aligned(:, i)), 'color', [colors(2,:), 0.5]); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180, 180]); - -linkaxes([ax1,ax2],'x'); +xlabel('Frequency [Hz]'); ylabel('Amplitude $d_e/u$ [m/V]'); +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); xlim([10, 2e3]); - -% Effect of the flexible joint -% <> - -% As the struts are composed of one APA and two flexible joints, it is expected that the flexible joint characteristics will change the dynamic behavior of the struts. - -% Using the Simscape model, the effect of the flexible joint's characteristics on the dynamics as measured on the test bench are studied. -% The studied dynamics is between $u$ and the encoder displacement $d_e$. - -% Let's initialize an APA which is a little bit misaligned. - -% APA Initialization -n_hexapod.actuator = initializeAPA('type', 'flexible', 'd_align_bot', [0.1e-3; 0.5e-3; 0], 'd_align_top', [0.1e-3; 0.5e-3; 0]); - -%% Study the effect of the bending stiffness of the Flexible joints -% Tested bending stiffnesses [Nm/rad] -kRs = [3, 4, 5, 6, 7]; - -% Idenfity the transfer function from actuator to encoder for all bending stiffnesses -Gs_kRs = {zeros(length(kRs), 1)}; - -for i = 1:length(kRs) - n_hexapod.flex_bot = initializeBotFlexibleJoint(... - 'type', '4dof', ... - 'kRx', kRs(i), ... - 'kRy', kRs(i)); - n_hexapod.flex_top = initializeTopFlexibleJoint(... - 'type', '4dof', ... - 'kRx', kRs(i), ... - 'kRy', kRs(i)); - - G = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); - G.InputName = {'u'}; - G.OutputName = {'Vs', 'de', 'da'}; - - Gs_kRs(i) = {G}; -end - -%% Study the effect of the axial stiffness of the Flexible joints -% Tested axial stiffnesses [N/m] -kzs = [5e7 7.5e7 1e8 2.5e8]; - -% Idenfity the transfer function from actuator to encoder for all bending stiffnesses -Gs_kzs = {zeros(length(kzs), 1)}; - -for i = 1:length(kzs) - n_hexapod.flex_bot = initializeBotFlexibleJoint(... - 'type', '4dof', ... - 'kz', kzs(i)); - n_hexapod.flex_top = initializeTopFlexibleJoint(... - 'type', '4dof', ... - 'kz', kzs(i)); - - G = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); - G.InputName = {'u'}; - G.OutputName = {'Vs', 'de', 'da'}; - - Gs_kzs(i) = {G}; -end - -%% Plot the obtained transfer functions for all the bending stiffnesses -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1 = nexttile([2,1]); -hold on; -for i = 1:length(kRs) - plot(freqs, abs(squeeze(freqresp(Gs_kRs{i}('de', 'u'), freqs, 'Hz'))), ... - 'DisplayName', sprintf('$k_R = %.0f$ [Nm/rad]', kRs(i))); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); -hold off; ylim([1e-8, 1e-3]); -legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); - -ax2 = nexttile; -hold on; -for i = 1:length(kRs) - plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_kRs{i}('de', 'u'), freqs, 'Hz')))); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180, 180]); - -linkaxes([ax1,ax2],'x'); -xlim([20, 2e3]); - -%% Plot the obtained transfer functions for all the axial stiffnesses -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1 = nexttile([2,1]); -hold on; -for i = 1:length(kzs) - plot(freqs, abs(squeeze(freqresp(Gs_kzs{i}('de', 'u'), freqs, 'Hz'))), ... - 'DisplayName', sprintf('$k_z = %.1e$ [N/m]', kzs(i))); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); -hold off; -ylim([1e-8, 1e-3]); -legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); - -ax2 = nexttile; -hold on; -for i = 1:length(kzs) - plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_kzs{i}('de', 'u'), freqs, 'Hz')))); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180, 180]); - -linkaxes([ax1,ax2],'x'); -xlim([20, 2e3]); diff --git a/preamble.tex b/preamble.tex index a694865..adafd1c 100644 --- a/preamble.tex +++ b/preamble.tex @@ -1,138 +1,16 @@ -\usepackage{float} -\floatplacement{figure}{h} +\usepackage[ % + acronym, % Separate acronyms and glossary + toc, % appear in ToC + automake, % auto-use the makeglossaries command (requires shell-escape) + nonumberlist, % don't back reference pages + nogroupskip, % don't group by letter + nopostdot % don't add a dot at the end of each element +]{glossaries} -\usepackage{caption,tabularx,booktabs} -\usepackage{bm} +\usepackage[stylemods=longextra]{glossaries-extra} -\usepackage{xpatch} % Recommanded for biblatex -\usepackage[ % use biblatex for bibliography - backend=biber, % use biber backend (bibtex replacement) or bibtex - style=ieee, % bib style - hyperref=true, % activate hyperref support - backref=true, % activate backrefs - isbn=false, % don't show isbn tags - url=false, % don't show url tags - doi=false, % don't show doi tags - urldate=long, % display type for dates - maxnames=3, % - minnames=1, % - maxbibnames=5, % - minbibnames=3, % - maxcitenames=2, % - mincitenames=1 % - ]{biblatex} +\setabbreviationstyle[acronym]{long-short} +\setglossarystyle{long-name-desc} -\setlength\bibitemsep{1.1\itemsep} - -% \renewcommand*{\bibfont}{\footnotesize} - -\usepackage{fontawesome} - -\usepackage{caption} -\usepackage{subcaption} - -\captionsetup[figure]{labelfont=bf} -\captionsetup[subfigure]{labelfont=bf} -\captionsetup[listing]{labelfont=bf} -\captionsetup[table]{labelfont=bf} - -\usepackage{xcolor} - -\definecolor{my-blue}{HTML}{6b7adb} -\definecolor{my-pale-blue}{HTML}{e6e9f9} -\definecolor{my-red}{HTML}{db6b6b} -\definecolor{my-pale-red}{HTML}{f9e6e6} -\definecolor{my-green}{HTML}{6bdbb6} -\definecolor{my-pale-green}{HTML}{e6f9f3} -\definecolor{my-yellow}{HTML}{dbd26b} -\definecolor{my-pale-yellow}{HTML}{f9f7e6} -\definecolor{my-orange}{HTML}{dba76b} -\definecolor{my-pale-orange}{HTML}{f9f0e6} -\definecolor{my-grey}{HTML}{a3a3a3} -\definecolor{my-pale-grey}{HTML}{f0f0f0} -\definecolor{my-turq}{HTML}{6bc7db} -\definecolor{my-pale-turq}{HTML}{e6f6f9} - -\usepackage{inconsolata} - -\usepackage[newfloat=true, chapter]{minted} -\usemintedstyle{autumn} - -\setminted{frame=lines,breaklines=true,tabsize=4,fontsize=\scriptsize,autogobble=true,labelposition=topline,bgcolor=my-pale-grey} -\setminted[matlab]{label=Matlab} -\setminted[latex]{label=LaTeX} -\setminted[bash]{label=Bash} -\setminted[python]{label=Python} -\setminted[text]{label=Results} -\setminted[md]{label=Org Mode} - -\setmintedinline{fontsize=\normalsize,bgcolor=my-pale-grey} - -\usepackage[most]{tcolorbox} - -\tcbuselibrary{minted} - -\newtcolorbox{seealso}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=See Also} -\newtcolorbox{hint}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=Hint} -\newtcolorbox{definition}{enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Definition} -\newtcolorbox{important}{ enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Important} -\newtcolorbox{exampl}[1][]{ enhanced,breakable,colback=my-pale-green,colframe=my-green,fonttitle=\bfseries,title=Example,#1} -\newtcolorbox{exercice}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Exercice} -\newtcolorbox{question}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Question} -\newtcolorbox{answer}{ enhanced,breakable,colback=my-pale-turq,colframe=my-turq,fonttitle=\bfseries,title=Answer} -\newtcolorbox{summary}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Summary} -\newtcolorbox{note}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Note} -\newtcolorbox{caution}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Caution} -\newtcolorbox{warning}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Warning} - -\newtcolorbox{my-quote}[1]{% - colback=my-pale-grey, - grow to right by=-10mm, - grow to left by=-10mm, - boxrule=0pt, - boxsep=0pt, - breakable, - enhanced jigsaw, - borderline west={4pt}{0pt}{my-grey}} - -\renewenvironment{quote}{\begin{my-quote}}{\end{my-quote}} - -\newtcolorbox{my-verse}[1]{% - colback=my-pale-grey, - grow to right by=-10mm, - grow to left by=-10mm, - boxrule=0pt, - boxsep=0pt, - breakable, - enhanced jigsaw, - borderline west={4pt}{0pt}{my-grey}} - -\renewenvironment{verse}{\begin{my-verse}}{\end{my-verse}} - -\usepackage{environ}% http://ctan.org/pkg/environ -\NewEnviron{aside}{% - \marginpar{\BODY} -} - -\renewenvironment{verbatim}{\VerbatimEnvironment\begin{minted}[]{text}}{\end{minted}} - -\usepackage{soul} -\sethlcolor{my-pale-grey} - -\let\OldTexttt\texttt -\renewcommand{\texttt}[1]{{\ttfamily\hl{\mbox{\,#1\,}}}} - -\makeatletter -\preto\Gin@extensions{png,} -\DeclareGraphicsRule{.png}{pdf}{.pdf}{\noexpand\Gin@base.pdf} -\preto\Gin@extensions{gif,} -\DeclareGraphicsRule{.gif}{png}{.png}{\noexpand\Gin@base.png} -\makeatother - -\usepackage{hyperref} -\hypersetup{ - colorlinks = true, - allcolors = my-blue -} - -\usepackage{hypcap} +\makeindex +\makeglossaries diff --git a/preamble_extra.tex b/preamble_extra.tex new file mode 100644 index 0000000..98cfc04 --- /dev/null +++ b/preamble_extra.tex @@ -0,0 +1,134 @@ +\usepackage{float} +\usepackage{enumitem} + +\usepackage{caption,tabularx,booktabs} +\usepackage{bm} + +\usepackage{xpatch} % Recommanded for biblatex +\usepackage[ % use biblatex for bibliography + backend=biber, % use biber backend (bibtex replacement) or bibtex + style=ieee, % bib style + hyperref=true, % activate hyperref support + backref=true, % activate backrefs + isbn=false, % don't show isbn tags + url=false, % don't show url tags + doi=false, % don't show doi tags + urldate=long, % display type for dates + maxnames=3, % + minnames=1, % + maxbibnames=5, % + minbibnames=3, % + maxcitenames=2, % + mincitenames=1 % + ]{biblatex} + +\setlength\bibitemsep{1.1\itemsep} + +\usepackage{caption} +\usepackage{subcaption} + +\captionsetup[figure]{labelfont=bf} +\captionsetup[subfigure]{labelfont=bf} +\captionsetup[listing]{labelfont=bf} +\captionsetup[table]{labelfont=bf} + +\usepackage{xcolor} + +\definecolor{my-blue}{HTML}{6b7adb} +\definecolor{my-pale-blue}{HTML}{e6e9f9} +\definecolor{my-red}{HTML}{db6b6b} +\definecolor{my-pale-red}{HTML}{f9e6e6} +\definecolor{my-green}{HTML}{6bdbb6} +\definecolor{my-pale-green}{HTML}{e6f9f3} +\definecolor{my-yellow}{HTML}{dbd26b} +\definecolor{my-pale-yellow}{HTML}{f9f7e6} +\definecolor{my-orange}{HTML}{dba76b} +\definecolor{my-pale-orange}{HTML}{f9f0e6} +\definecolor{my-grey}{HTML}{a3a3a3} +\definecolor{my-pale-grey}{HTML}{f0f0f0} +\definecolor{my-turq}{HTML}{6bc7db} +\definecolor{my-pale-turq}{HTML}{e6f6f9} + +\usepackage{inconsolata} + +\usepackage[newfloat=true, chapter]{minted} +\usemintedstyle{autumn} + +\setminted{frame=lines,breaklines=true,tabsize=4,fontsize=\scriptsize,autogobble=true,labelposition=topline,bgcolor=my-pale-grey} +\setminted[matlab]{label=Matlab} +\setminted[latex]{label=LaTeX} +\setminted[bash]{label=Bash} +\setminted[python]{label=Python} +\setminted[text]{label=Results} +\setminted[md]{label=Org Mode} + +\setmintedinline{fontsize=\normalsize,bgcolor=my-pale-grey} + +\usepackage[most]{tcolorbox} + +\tcbuselibrary{minted} + +\newtcolorbox{seealso}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=See Also} +\newtcolorbox{hint}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=Hint} +\newtcolorbox{definition}{enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Definition} +\newtcolorbox{important}{ enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Important} +\newtcolorbox{exampl}[1][]{ enhanced,breakable,colback=my-pale-green,colframe=my-green,fonttitle=\bfseries,title=Example,#1} +\newtcolorbox{exercice}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Exercice} +\newtcolorbox{question}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Question} +\newtcolorbox{answer}{ enhanced,breakable,colback=my-pale-turq,colframe=my-turq,fonttitle=\bfseries,title=Answer} +\newtcolorbox{summary}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Summary} +\newtcolorbox{note}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Note} +\newtcolorbox{caution}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Caution} +\newtcolorbox{warning}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Warning} + +\newtcolorbox{my-quote}[1]{% + colback=my-pale-grey, + grow to right by=-10mm, + grow to left by=-10mm, + boxrule=0pt, + boxsep=0pt, + breakable, + enhanced jigsaw, + borderline west={4pt}{0pt}{my-grey}} + +\renewenvironment{quote}{\begin{my-quote}}{\end{my-quote}} + +\newtcolorbox{my-verse}[1]{% + colback=my-pale-grey, + grow to right by=-10mm, + grow to left by=-10mm, + boxrule=0pt, + boxsep=0pt, + breakable, + enhanced jigsaw, + borderline west={4pt}{0pt}{my-grey}} + +\renewenvironment{verse}{\begin{my-verse}}{\end{my-verse}} + +\usepackage{environ}% http://ctan.org/pkg/environ +\NewEnviron{aside}{% + \marginpar{\BODY} +} + +\renewenvironment{verbatim}{\VerbatimEnvironment\begin{minted}[]{text}}{\end{minted}} + +\usepackage{soul} +\sethlcolor{my-pale-grey} + +\let\OldTexttt\texttt +\renewcommand{\texttt}[1]{{\ttfamily\hl{\mbox{\,#1\,}}}} + +\makeatletter +\preto\Gin@extensions{png,} +\DeclareGraphicsRule{.png}{pdf}{.pdf}{\noexpand\Gin@base.pdf} +\preto\Gin@extensions{gif,} +\DeclareGraphicsRule{.gif}{png}{.png}{\noexpand\Gin@base.png} +\makeatother + +\usepackage{hyperref} +\hypersetup{ + colorlinks = true, + allcolors = my-blue +} + +\usepackage{hypcap} diff --git a/test-bench-struts.org b/test-bench-struts.org index e892825..4cd585d 100644 --- a/test-bench-struts.org +++ b/test-bench-struts.org @@ -15,10 +15,11 @@ #+LaTeX_CLASS: scrreprt #+LaTeX_CLASS_OPTIONS: [a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc] -#+LaTeX_HEADER_EXTRA: \input{preamble.tex} -#+LATEX_HEADER_EXTRA: \bibliography{test-bench-struts.bib} +#+LATEX_HEADER: \input{preamble.tex} +#+LATEX_HEADER_EXTRA: \input{preamble_extra.tex} +# #+LATEX_HEADER_EXTRA: \bibliography{test-bench-struts.bib} -#+BIND: org-latex-bib-compiler "biber" +# #+BIND: org-latex-bib-compiler "biber" #+PROPERTY: header-args:matlab :session *MATLAB* #+PROPERTY: header-args:matlab+ :comments org @@ -100,6 +101,8 @@ To integrate: - [X] Check [[file:~/Cloud/work-projects/ID31-NASS/matlab/test-bench-apa300ml/test-bench-apa300ml.org::*New Measurements - IFF Root Locus][New Measurements - IFF Root Locus]] *no, it is only for the APA and not the strut* +** TODO [#B] Reduce figure sizes + ** DONE [#B] Rework mounting procedure section CLOSED: [2024-04-02 Tue 17:12] @@ -123,1624 +126,13 @@ CLOSED: [2024-03-25 Mon 16:35] ** DONE [#B] Make the simscape model work CLOSED: [2024-03-25 Mon 15:09] -* Introduction :ignore: - -The Nano-Hexapod struts (shown in Figure ref:fig:test_struts_picture_strut) are composed of: -- Two flexible joints that are fixed at the two ends of the strut -- One Amplified Piezoelectric Actuator[fn:5] -- One optical encoder[fn:6] - -#+name: fig:test_struts_picture_strut -#+caption: One strut including two flexible joints, an amplified piezoelectric actuator and an encoder -#+attr_latex: :width 0.8\linewidth -[[file:figs/test_struts_picture_strut.jpg]] - -After the strut elements have been individually characterized (see previous sections), the struts are assembled. -The mounting procedure of the struts is explained in Section ref:sec:test_struts_mounting. -A mounting bench is used to ensure the coaxiality between the two ends of the struts. -This way, no angular stroke is lost when mounted to the nano-hexapod. - -Then the flexible modes of the struts are experimentally measured and compared with a finite element model (Section ref:sec:test_struts_flexible_modes). - -Dynamical measurements on the strut are performed with the same test bench that was used to characterize the APA300ML dynamics (Section ref:sec:test_struts_dynamical_meas). -It is found that the dynamics from the DAC voltage to the displacement measured by the encoder is complex due to the flexible modes of the struts found in Section ref:sec:test_struts_flexible_modes. - -The models of the struts are then compared with the measured dynamics (Section ref:sec:test_struts_simscape). -The model dynamics from the DAC voltage to the axial motion of the strut (measured by an interferometer) and to the force sensor voltage are matching well the experiment. -However, this is not the case for the dynamics from DAC voltage to encoder displacement. -It is found that the complex dynamics is due to a misalignment between the flexible joints and the APA. - -# #+name: tab:test_struts_section_matlab_code -# #+caption: Report sections and corresponding Matlab files -# #+attr_latex: :environment tabularx :width 0.6\linewidth :align lX -# #+attr_latex: :center t :booktabs t -# | *Sections* | *Matlab File* | -# |--------------------------------------------+----------------------------------| -# | Section ref:sec:test_struts_flexible_modes | =test_struts_1_flexible_modes.m= | -# | Section ref:sec:test_struts_dynamical_meas | =test_struts_2_dynamical_meas.m= | -# | Section ref:sec:test_struts_simscape | =test_struts_3_simscape_model’m= | - -* Mounting Procedure -<> -** Introduction :ignore: - -A mounting bench has been developed to ensure: -- Good coaxial alignment between the interfaces (cylinders) of the flexible joints. - This is important to not loose to much angular stroke when they will be integrated into the nano-hexapod -- Uniform length across all struts -- Precise alignment of the APA with the two flexible joints -- Reproducible and consistent assembly between all the struts - -** Mounting Bench - -A CAD view of the mounting bench is shown in Figure ref:fig:test_struts_mounting_bench_first_concept. -It consists of a "main frame" (Figure ref:fig:test_struts_mounting_step_0) precisely machined to ensure both the correct strut length and strut coaxiality. -The coaxiality is ensured by having good flatness (specified at $20\,\mu m$) between surfaces A and B, and between surfaces C and D. -Such flatness has been checked using a Faro arm[fn:1] (see Figure ref:fig:test_struts_check_dimensions_bench) and was found to comply with the requirements. -The strut length (defined by the distance between the rotation points of the two flexible joints) is ensured by using precisely machines dowel holes. - - -#+name: fig:test_struts_mounting -#+caption: Strut mounting bench -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_bench_first_concept}CAD view of the mounting bench} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width \linewidth -[[file:figs/test_struts_mounting_bench_first_concept.png]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_overview}Exploded view} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width \linewidth -[[file:figs/test_struts_mounting_overview.jpg]] -#+end_subfigure -#+end_figure - -#+name: fig:test_struts_mounting_base_part -#+caption: Main element of the mounting bench for the struts that ensure good coaxility of the two flexible joints as well as the length of the struts. -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_step_0}Useful features of the main mounting element} -#+attr_latex: :options {0.56\textwidth} -#+begin_subfigure -#+attr_latex: :height 4.5cm -[[file:figs/test_struts_mounting_step_0.jpg]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_check_dimensions_bench}Dimensional check} -#+attr_latex: :options {0.43\textwidth} -#+begin_subfigure -#+attr_latex: :height 4.5cm -[[file:figs/test_struts_check_dimensions_bench.jpg]] -#+end_subfigure -#+end_figure - -The flexible joints are not directly fixed to the mounting bench but to a cylindrical "sleeve" shown in Figures ref:fig:test_struts_cylindrical_mounting_part_top and ref:fig:test_struts_cylindrical_mounting_part_bot. -The goal of these "sleeves" is to avoid any mechanical stress that could damage the flexible joints during the mounting procedure. -These "sleeves" have one dowel groove (that are fitted to the dowel holes shown in Figure ref:fig:test_struts_mounting_step_0) that will determine the length of the mounted strut. - -#+name: fig:test_struts_cylindrical_mounting -#+caption: Preparation of the flexible joints by fixing them in their cylindrical "sleeve" -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_cylindrical_mounting_part_top}Cylindral Interface (Top)} -#+attr_latex: :options {0.33\textwidth} -#+begin_subfigure -#+attr_latex: :height 4.5cm -[[file:figs/test_struts_cylindrical_mounting_part_top.jpg]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_cylindrical_mounting_part_bot}Cylindrlcal Interface (Bottom)} -#+attr_latex: :options {0.33\textwidth} -#+begin_subfigure -#+attr_latex: :height 4.5cm -[[file:figs/test_struts_cylindrical_mounting_part_bot.jpg]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_joints}Mounted flexible joints} -#+attr_latex: :options {0.33\textwidth} -#+begin_subfigure -#+attr_latex: :height 4.5cm -[[file:figs/test_struts_mounting_joints.jpg]] -#+end_subfigure -#+end_figure - -** Mounting Procedure - -The "sleeves" are mounted to the main element as shown in Figure ref:fig:test_struts_mounting_step_0. -The left sleeve has a thigh fit such that its orientation is fixed (it is roughly aligned horizontally) while the right sleeve has a loose fit such that it can rotate (it will get the same orientation as the fixed one when tightening the screws). - -Then the cylindrical washers and the APA300ML are stacked on top of the flexible joints as shown in Figure ref:fig:test_struts_mounting_step_2 and screwed together using a torque screwdriver. -A dowel pin is used to laterally align the APA300ML with the flexible joints (see the dowel slot on the flexible joints in Figure ref:fig:test_struts_mounting_joints). -The two cylindrical washers are used to allow proper mounting even if the two APA interfaces are not parallel. - -The encoder and ruler are then fixed to the strut and properly aligned as shown in Figure ref:fig:test_struts_mounting_step_3. - -Finally, the strut can be disassembled from the mounting bench (Figure ref:fig:test_struts_mounting_step_4). -Thanks to this mounting procedure, coaxiality and length between the two flexible joint's interfaces can be obtained within the wanted tolerances. - -#+name: fig:test_struts_mounting_steps -#+caption: Steps for mounting the struts. -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_step_1}Step 1} -#+attr_latex: :options {0.5\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/test_struts_mounting_step_1.jpg]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_step_2}Step 2} -#+attr_latex: :options {0.5\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/test_struts_mounting_step_2.jpg]] -#+end_subfigure - -\bigskip -#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_step_3}Step 3} -#+attr_latex: :options {0.5\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/test_struts_mounting_step_3.jpg]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_step_4}Step 4} -#+attr_latex: :options {0.5\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/test_struts_mounting_step_4.jpg]] -#+end_subfigure -#+end_figure - -* Measurement of flexible modes -:PROPERTIES: -:header-args:matlab+: :tangle matlab/test_struts_1_flexible_modes.m -:END: -<> -** Introduction - -A Finite Element Model[fn:3] of the struts is developed and is used to estimate the flexible modes. -Inertia of the encoder (estimated at $15\,g$) is taken into account. -The two cylindrical interfaces are fixed, and the first three flexible modes are computed. -The modes shapes are displayed in Figure ref:fig:test_struts_mode_shapes: an "X-bending" mode at 189Hz, a "Y-bending" mode at 285Hz and a "Z-torsion" mode at 400Hz. - -#+name: fig:test_struts_mode_shapes -#+caption: Spurious resonances of the struts estimated from a Finite Element Model -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_mode_shapes_1}X-bending mode (189Hz)} -#+attr_latex: :options {0.33\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.9\linewidth -[[file:figs/test_struts_mode_shapes_1.png]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_mode_shapes_2}Y-bending mode (285Hz)} -#+attr_latex: :options {0.33\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.9\linewidth -[[file:figs/test_struts_mode_shapes_2.png]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_mode_shapes_3}Z-torsion mode (400Hz)} -#+attr_latex: :options {0.33\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.9\linewidth -[[file:figs/test_struts_mode_shapes_3.png]] -#+end_subfigure -#+end_figure - -** 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 :noweb yes -<> -#+end_src - -#+begin_src matlab :eval no :noweb yes -<> -#+end_src - -#+begin_src matlab :noweb yes -<> -#+end_src - -** Measurement Setup - -In order to experimentally measure these mode shapes, a Laser vibrometer is used to measure the difference of motion between two beam path (red points in Figure ref:fig:test_struts_meas_modes). -The strut is then excited with an instrumented hammer and the transfer function from the hammer to the measured rotation is computed. - -The "X-bending" mode is measured as shown in Figure ref:fig:test_struts_meas_x_bending. -The "Y-bending" mode is measured as shown in Figure ref:fig:test_struts_meas_y_bending. -Finally, the "Z-torsion" is measured as shown in Figure ref:fig:test_struts_meas_z_torsion. - -This is done with and without the encoder fixed to the strut. - -#+name: fig:test_struts_meas_modes -#+caption: Measurement of strut flexible modes -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_meas_x_bending}X-bending mode} -#+attr_latex: :options {0.33\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.9\linewidth -[[file:figs/test_struts_meas_x_bending.jpg]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_meas_y_bending}Y-bending mode} -#+attr_latex: :options {0.33\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.9\linewidth -[[file:figs/test_struts_meas_y_bending.jpg]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_meas_z_torsion}Z-torsion mode} -#+attr_latex: :options {0.33\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.9\linewidth -[[file:figs/test_struts_meas_z_torsion.jpg]] -#+end_subfigure -#+end_figure - -** Measured results -The obtained frequency response functions for the three configurations (X-bending, Y-bending and Z-torsion) are shown in Figure ref:fig:test_struts_spur_res_frf_no_enc when the encoder is not fixed to the strut and in Figure ref:fig:test_struts_spur_res_frf_enc when the encoder is fixed to the strut. - -#+begin_src matlab :exports none -%% Load Data (without the encoder) -bending_X = load('strut_spur_res_x_bending.mat'); -bending_Y = load('strut_spur_res_y_bending.mat'); -torsion_Z = load('strut_spur_res_z_torsion.mat'); - -%% Load Data (with the encoder) -bending_X_enc = load('strut_spur_res_x_bending_enc.mat'); -bending_Y_enc = load('strut_spur_res_y_bending_enc.mat'); -torsion_Z_enc = load('strut_spur_res_z_torsion_enc.mat'); -#+end_src - -#+begin_src matlab :exports none -%% Plot the responses (without the encoder) -figure; -hold on; -plot(bending_X.FFT1_AvSpc_1_RMS_X_Val, bending_X.FFT1_AvSpc_1_RMS_Y_Val, ... - 'DisplayName', 'X-Bending') -plot(bending_Y.FFT1_AvSpc_1_RMS_X_Val, bending_Y.FFT1_AvSpc_1_RMS_Y_Val, ... - 'DisplayName', 'Y-Bending') -plot(torsion_Z.FFT1_AvSpc_1_RMS_X_Val, torsion_Z.FFT1_AvSpc_1_RMS_Y_Val, ... - 'DisplayName', 'Z-torsion'); -text(226, 1.5e-4,{'226Hz'}, 'VerticalAlignment', 'bottom','HorizontalAlignment','center') -text(310, 6e-5,{'337Hz'}, 'VerticalAlignment', 'bottom','HorizontalAlignment','center') -text(398, 1.5e-4,{'398Hz'}, 'VerticalAlignment', 'bottom','HorizontalAlignment','center') -hold off; -set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Amplitude'); -xlim([50, 8e2]); ylim([5e-7, 3e-4]) -xticks([50, 100, 500]); -legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file none -exportFig('figs/test_struts_spur_res_frf_no_enc.pdf', 'width', 'half', 'height', 'normal'); -#+end_src - -#+begin_src matlab :exports none -%% Plot the responses (with the encoder) -figure; -hold on; -plot(bending_X_enc.FFT1_AvSpc_1_RMS_X_Val, bending_X_enc.FFT1_AvSpc_1_RMS_Y_Val, ... - 'DisplayName', 'X-Bending') -plot(bending_Y_enc.FFT1_AvSpc_1_RMS_X_Val, bending_Y_enc.FFT1_AvSpc_1_RMS_Y_Val, ... - 'DisplayName', 'Y-Bending') -plot(torsion_Z_enc.FFT1_AvSpc_1_RMS_X_Val, torsion_Z_enc.FFT1_AvSpc_1_RMS_Y_Val, ... - 'DisplayName', 'Z-torsion'); -text(198, 4e-5,{'198Hz'}, 'VerticalAlignment', 'bottom','HorizontalAlignment','center') -text(293, 6e-5,{'293Hz'}, 'VerticalAlignment', 'bottom','HorizontalAlignment','center') -text(381, 1e-4,{'381Hz'}, 'VerticalAlignment', 'bottom','HorizontalAlignment','center') -hold off; -set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Amplitude'); -xlim([50, 8e2]); ylim([5e-7, 3e-4]) -xticks([50, 100, 500]); -legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file none -exportFig('figs/test_struts_spur_res_frf_enc.pdf', 'width', 'half', 'height', 'normal'); -#+end_src - -#+name: fig:test_struts_spur_res_frf -#+caption: Measured frequency response functions without the encoder ref:fig:test_struts_spur_res_frf and with the encoder ref:fig:test_struts_spur_res_frf_enc -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_spur_res_frf_no_enc}without encoder} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/test_struts_spur_res_frf_no_enc.png]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_spur_res_frf_enc}with the encoder} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/test_struts_spur_res_frf_enc.png]] -#+end_subfigure -#+end_figure - -** Conclusion -:PROPERTIES: -:UNNUMBERED: t -:END: - -Table ref:tab:test_struts_spur_mode_freqs summarizes the measured resonance frequencies as well as the computed ones using the Finite Element Model. -It is shown that: -- the resonance frequencies of the 3 modes are only slightly decreased when the encoder is fixed to the strut -- the computed resonance frequencies from the FEM are very close to the measured one when the encoder is fixed to the strut - -#+name: tab:test_struts_spur_mode_freqs -#+caption: Measured frequency of the flexible modes of the strut -#+attr_latex: :environment tabularx :width 0.9\linewidth :align Xccc -#+attr_latex: :center t :booktabs t :float t -| *Mode* | *FEM with Encoder* | *Exp. with Encoder* | *Exp. without Encoder* | -|-----------+--------------------+---------------------+------------------------| -| X-Bending | 189Hz | 198Hz | 226Hz | -| Y-Bending | 285Hz | 293Hz | 337Hz | -| Z-Torsion | 400Hz | 381Hz | 398Hz | - -* Dynamical measurements -:PROPERTIES: -:header-args:matlab+: :tangle matlab/test_struts_2_dynamical_meas.m -:END: -<> -** Introduction :ignore: - -In order to measure the dynamics of the strut, the same test bench used to measure the APA300ML dynamics is used. - -The strut mounted on the bench is shown in Figure ref:fig:test_struts_bench_leg_overview -A schematic of the bench and the associated signals are shown in Figure ref:fig:test_struts_bench_schematic. -A fiber interferometer[fn:4] is used to measure the motion of the granite (i.e. the axial motion of the strut). - -#+name: fig:test_struts_bench_leg -#+caption: Experimental setup used to measure the dynamics of the struts. -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_bench_leg_overview}Overview Picture} -#+attr_latex: :options {0.32\textwidth} -#+begin_subfigure -#+attr_latex: :height 214px -[[file:figs/test_struts_bench_leg_overview.jpg]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_bench_schematic}Schematic} -#+attr_latex: :options {0.68\textwidth} -#+begin_subfigure -#+attr_latex: :height 214px -[[file:figs/test_struts_bench_schematic.png]] -#+end_subfigure -#+end_figure - -First, the effect of the encoder on the measured dynamics is studied in Section ref:ssec:test_struts_effect_encoder. -Then, the dynamics seen by the encoder and by the interferometers are compared in Section ref:ssec:test_struts_comp_enc_int. -Finally, all the measured struts are compared in terms of dynamics in Section ref:ssec:test_struts_comp_all_struts. - -** 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 :noweb yes -<> -#+end_src - -#+begin_src matlab :eval no :noweb yes -<> -#+end_src - -#+begin_src matlab :noweb yes -<> -#+end_src - -** Effect of the Encoder on the measured dynamics -<> - -#+begin_src matlab -%% Parameters for Frequency Analysis -Ts = 1e-4; % Sampling Time [s] -Nfft = floor(1/Ts); % Number of points for the FFT computation -win = hanning(Nfft); % Hanning window -Noverlap = floor(Nfft/2); % Overlap between frequency analysis - -%% Measure FRF for Strut 1 - No encoder -% Load Data -leg_sweep = load('frf_data_leg_1_sweep.mat', 'u', 'Vs', 'de', 'da'); -leg_noise_hf = load('frf_data_leg_1_noise_hf.mat', 'u', 'Vs', 'de', 'da'); - -% We get the frequency vector that will be the same for all the frequency domain analysis. -[~, f] = tfestimate(leg_sweep.u, leg_sweep.de, win, Noverlap, Nfft, 1/Ts); -i_lf = f <= 350; % Indices used for the low frequency -i_hf = f > 350; % Indices used for the high frequency - -% Compute FRF function from u to da (interferometer) -[frf_sweep, ~] = tfestimate(leg_sweep.u, leg_sweep.da, win, Noverlap, Nfft, 1/Ts); -[frf_noise_hf, ~] = tfestimate(leg_noise_hf.u, leg_noise_hf.da, win, Noverlap, Nfft, 1/Ts); -int_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)]; % Combine the FRF - -% Compute FRF function from u to Vs (force sensor) -[frf_sweep, ~] = tfestimate(leg_sweep.u, leg_sweep.Vs, win, Noverlap, Nfft, 1/Ts); -[frf_noise_hf, ~] = tfestimate(leg_noise_hf.u, leg_noise_hf.Vs, win, Noverlap, Nfft, 1/Ts); -iff_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)]; % Combine the FRF - -%% Measure FRF for Strut 1 - With encoder -% Load Data -leg_enc_sweep = load('frf_data_leg_coder_1_noise.mat', 'u', 'Vs', 'de', 'da'); -leg_enc_noise_hf = load('frf_data_leg_coder_1_noise_hf.mat', 'u', 'Vs', 'de', 'da'); - -% Compute FRF function from u to da (interferometer) -[frf_sweep, ~] = tfestimate(leg_enc_sweep.u, leg_enc_sweep.da, win, Noverlap, Nfft, 1/Ts); -[frf_noise_hf, ~] = tfestimate(leg_enc_noise_hf.u, leg_enc_noise_hf.da, win, Noverlap, Nfft, 1/Ts); -int_with_enc_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)]; % Combine the FRF - -% Compute FRF function from u to Vs (force sensor) -[frf_sweep, ~] = tfestimate(leg_enc_sweep.u, leg_enc_sweep.Vs, win, Noverlap, Nfft, 1/Ts); -[frf_noise_hf, ~] = tfestimate(leg_enc_noise_hf.u, leg_enc_noise_hf.Vs, win, Noverlap, Nfft, 1/Ts); -iff_with_enc_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)]; % Combine the FRF - -% Compute FRF function from u to de (encoder) -[frf_sweep, ~] = tfestimate(leg_enc_sweep.u, leg_enc_sweep.de, win, Noverlap, Nfft, 1/Ts); -[frf_noise_hf, ~] = tfestimate(leg_enc_noise_hf.u, leg_enc_noise_hf.de, win, Noverlap, Nfft, 1/Ts); -enc_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)]; % Combine the FRF -#+end_src - -System identification is performed in two cases: -- no encoder is fixed to the strut (Figure ref:fig:test_struts_bench_leg_front) -- one encoder is fixed to the strut (Figure ref:fig:test_struts_bench_leg_coder) - -#+name: fig:test_struts_bench_leg_with_without_enc -#+caption: Struts fixed to the test bench with clamped flexible joints. The coder can be fixed to the struts (\subref{fig:test_struts_bench_leg_coder}) or removed (\subref{fig:test_struts_bench_leg_front}) -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_bench_leg_coder}Strut with encoder} -#+attr_latex: :options {0.5\textwidth} -#+begin_subfigure -#+attr_latex: :height 6cm -[[file:figs/test_struts_bench_leg_coder.jpg]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_bench_leg_front}Strut without encoder} -#+attr_latex: :options {0.5\textwidth} -#+begin_subfigure -#+attr_latex: :height 6cm -[[file:figs/test_struts_bench_leg_front.jpg]] -#+end_subfigure -#+end_figure - -The obtained frequency response functions are compared in Figure ref:fig:test_struts_effect_encoder. -It is found that the encoder has very little effect on the transfer function from excitation voltage $u$ to the axial motion of the strut $d_a$ as measured by the interferometer (Figure ref:fig:test_struts_effect_encoder_int). -This means that the axial motion of the strut is unaffected by the presence of the encoder. -Similarly, it has very little effect on the transfer function from $u$ to the sensor stack voltage $V_s$ (Figure ref:fig:test_struts_effect_encoder_iff). -This means that the integral force feedback control strategy should be as effective whether the encoders are fixed to the struts. - -#+begin_src matlab :exports none -%% Plot the FRF from u to da with and without the encoder -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1 = nexttile([2,1]); -hold on; -plot(f, abs(int_with_enc_frf), '-', 'DisplayName', 'With encoder'); -plot(f, abs(int_frf), '-', 'DisplayName', 'Without encoder'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $d_a/u$ [m/V]'); set(gca, 'XTickLabel',[]); -hold off; -ylim([1e-7, 1e-3]); -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); - -ax2 = nexttile; -hold on; -plot(f, 180/pi*angle(int_with_enc_frf), '-'); -plot(f, 180/pi*angle(int_frf), '-'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180, 180]); - -linkaxes([ax1,ax2],'x'); -xlim([10, 2e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file none -exportFig('figs/test_struts_effect_encoder_int.pdf', 'width', 'half', 'height', 'tall'); -#+end_src - -#+begin_src matlab :exports none -%% Compare the IFF plant with and without the encoders -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1 = nexttile([2,1]); -hold on; -plot(f, abs(iff_with_enc_frf), 'DisplayName', 'With Encoder'); -plot(f, abs(iff_frf), 'DisplayName', 'Without Encoder'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]); -hold off; -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); -ylim([1e-2, 1e2]); - -ax2 = nexttile; -hold on; -plot(f, 180/pi*angle(iff_with_enc_frf)); -plot(f, 180/pi*angle(iff_frf)); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180, 180]); - -linkaxes([ax1,ax2],'x'); -xlim([10, 2e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file none -exportFig('figs/test_struts_effect_encoder_iff.pdf', 'width', 'half', 'height', 'tall'); -#+end_src - -#+name: fig:test_struts_effect_encoder -#+caption: Effect of having the encoder fixed to the struts on the measured dynamics from $u$ to $d_a$ (\subref{fig:test_struts_effect_encoder_int}) and from $u$ to $V_s$ (\subref{fig:test_struts_effect_encoder_iff}) -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_effect_encoder_int}$u$ to $d_a$} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/test_struts_effect_encoder_int.png]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_effect_encoder_iff}$u$ to $V_s$} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/test_struts_effect_encoder_iff.png]] -#+end_subfigure -#+end_figure - -** Comparison of the encoder and interferometer -<> - -The dynamics as measured by the encoder and by the interferometers are compared in Figure ref:fig:test_struts_comp_enc_int. - -The dynamics from the excitation voltage $u$ to the measured displacement by the encoder $d_e$ presents a behavior that is much more complex than the dynamics to the displacement as measured by the interferometer (comparison made in Figure ref:fig:test_struts_comp_enc_int). -Three additional resonance frequencies can be observed at 197Hz, 290Hz and 376Hz. -These resonance frequencies correspond to flexible modes of the strut that were studied in Section ref:sec:test_struts_flexible_modes. - -The good news is that these resonances are not seen on the interferometer and are therefore not impacting the axial motion of the strut (which is what is important for the hexapod positioning). -However, these resonances are making the use of encoder fixed to the strut difficult. - -#+begin_src matlab :exports none -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1 = nexttile([2,1]); -hold on; -plot(f, abs(enc_frf), 'DisplayName', 'Encoder'); -plot(f, abs(int_with_enc_frf), 'DisplayName', 'Interferometer'); -text(93, 4e-4, {'93Hz'}, 'VerticalAlignment','bottom','HorizontalAlignment','center') -text(200, 1.3e-4,{'197Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') -text(300, 4e-6, {'290Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') -text(400, 1.4e-6,{'376Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $d/u$ [m/V]'); set(gca, 'XTickLabel',[]); -hold off; -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); -ylim([1e-8, 1e-3]); - -ax2 = nexttile; -hold on; -plot(f, 180/pi*angle(enc_frf)); -plot(f, 180/pi*angle(int_with_enc_frf)); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180, 180]); - -linkaxes([ax1,ax2],'x'); -xlim([10, 2e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/test_struts_comp_enc_int.pdf', 'width', 'wide', 'height', 'tall'); -#+end_src - -#+name: fig:test_struts_comp_enc_int -#+caption: Comparison of the transfer functions from excitation voltage $u$ to either the encoder $d_e$ or the interferometer $d_a$ -#+RESULTS: -[[file:figs/test_struts_comp_enc_int.png]] - -** Comparison of all the Struts -<> - -#+begin_src matlab -%% Numbers of the measured legs -strut_nums = [1 2 3 4 5]; - -%% Load the measurement data -% First identification (low frequency noise) -leg_noise = {}; -for i = 1:length(strut_nums) - leg_noise(i) = {load(sprintf('frf_data_leg_coder_%i_noise.mat', strut_nums(i)), 'u', 'Vs', 'de', 'da')}; -end - -% Second identification (high frequency noise) -leg_noise_hf = {}; -for i = 1:length(strut_nums) - leg_noise_hf(i) = {load(sprintf('frf_data_leg_coder_%i_noise_hf.mat', strut_nums(i)), 'u', 'Vs', 'de', 'da')}; -end - -%% Compute FRF - From u to de (encoder) -enc_frf = zeros(length(f), length(strut_nums)); - -for i = 1:length(strut_nums) - [frf_lf, ~] = tfestimate(leg_noise{i}.u, detrend(leg_noise{i}.de, 0), win, Noverlap, Nfft, 1/Ts); - [frf_hf, ~] = tfestimate(leg_noise_hf{i}.u, detrend(leg_noise_hf{i}.de, 0), win, Noverlap, Nfft, 1/Ts); - enc_frf(:, i) = [frf_lf(i_lf); frf_hf(i_hf)]; -end - -%% Compute FRF - From u to da (interferometer) -int_frf = zeros(length(f), length(strut_nums)); -for i = 1:length(strut_nums) - [frf_lf, ~] = tfestimate(leg_noise{i}.u, leg_noise{i}.da, win, Noverlap, Nfft, 1/Ts); - [frf_hf, ~] = tfestimate(leg_noise_hf{i}.u, leg_noise_hf{i}.da, win, Noverlap, Nfft, 1/Ts); - int_frf(:, i) = [frf_lf(i_lf); frf_hf(i_hf)]; -end - -%% Compute FRF - From u to Vs (force sensor) -iff_frf = zeros(length(f), length(strut_nums)); -for i = 1:length(strut_nums) - [frf_lf, ~] = tfestimate(leg_noise{i}.u, leg_noise{i}.Vs, win, Noverlap, Nfft, 1/Ts); - [frf_hf, ~] = tfestimate(leg_noise_hf{i}.u, leg_noise_hf{i}.Vs, win, Noverlap, Nfft, 1/Ts); - iff_frf(:, i) = [frf_lf(i_lf); frf_hf(i_hf)]; -end -#+end_src - -Then, the dynamics of all the mounted struts (only 5 at the time of the experiment) are all measured using the same test bench. -The obtained dynamics from $u$ to $d_a$ are compared in Figure ref:fig:test_struts_comp_interf_plants while is dynamics from $u$ to $V_s$ are compared in Figure ref:fig:test_struts_comp_iff_plants. -Very good match can be observed between all the struts. - -#+begin_src matlab :exports none -%% Plot the FRF from u to de (interferometer) -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1 = nexttile([2,1]); -hold on; -for i = 1:length(strut_nums) - plot(f, abs(int_frf(:, i)), ... - 'DisplayName', sprintf('Leg %i', strut_nums(i))); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $d_a/u$ [m/V]'); set(gca, 'XTickLabel',[]); -hold off; -legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2); -ylim([1e-9, 1e-3]); - -ax2 = nexttile; -hold on; -for i = 1:length(strut_nums) - plot(f, 180/pi*angle(int_frf(:, i))); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180 180]); - -linkaxes([ax1,ax2],'x'); -xlim([10, 2e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file none -exportFig('figs/test_struts_comp_interf_plants.pdf', 'width', 'half', 'height', 'tall'); -#+end_src - -#+begin_src matlab :exports none -%% Plot the FRF from u to Vs -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1 = nexttile([2,1]); -hold on; -for i = 1:length(strut_nums) - plot(f, abs(iff_frf(:, i)), ... - 'DisplayName', sprintf('Leg %i', strut_nums(i))); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]); -hold off; -ylim([1e-2, 1e2]); -legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); - -ax2 = nexttile; -hold on; -for i = 1:length(strut_nums) - plot(f, 180/pi*angle(iff_frf(:, i))); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180 180]); - -linkaxes([ax1,ax2],'x'); -xlim([10, 2e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file none -exportFig('figs/test_struts_comp_iff_plants.pdf', 'width', 'half', 'height', 'tall'); -#+end_src - -#+name: fig:test_struts_comp_plants -#+caption: Comparison of the measured plants -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_interf_plants}$u$ to $d_a$} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width \linewidth -[[file:figs/test_struts_comp_interf_plants.png]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_iff_plants}$u$ to $V_s$} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width \linewidth -[[file:figs/test_struts_comp_iff_plants.png]] -#+end_subfigure -#+end_figure - -The same comparison is made for the transfer function from $u$ to $d_e$ (encoder output) in Figure ref:fig:test_struts_comp_enc_plants. -This time, large dynamics differences are observed between the 5 struts. -Even-though the same peaks are seen for all of the struts (95Hz, 200Hz, 300Hz, 400Hz), the amplitude of the peaks are not the same. -Moreover, the location or even the presence of complex conjugate zeros is changing from one strut to the other. - -It will be further investigated why such differences are observed (see Section ref:ssec:test_struts_effect_misalignment). - -#+begin_src matlab :exports none -%% Bode plot of the FRF from u to de -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1 = nexttile([2,1]); -hold on; -for i = 1:length(strut_nums) - plot(f, abs(enc_frf(:, i)), ... - 'DisplayName', sprintf('Leg %i', strut_nums(i))); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); -hold off; -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2); -ylim([1e-8, 1e-3]); - -ax2 = nexttile; -hold on; -for i = 1:length(strut_nums) - plot(f, 180/pi*angle(enc_frf(:, i))); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180, 180]); - -linkaxes([ax1,ax2],'x'); -xlim([10, 2e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/test_struts_comp_enc_plants.pdf', 'width', 'wide', 'height', 'tall'); -#+end_src - -#+name: fig:test_struts_comp_enc_plants -#+caption: Estimated frequency response functions from $u$ to the encoder $d_e$ for all the mounted struts -#+RESULTS: -[[file:figs/test_struts_comp_enc_plants.png]] - -** Conclusion -:PROPERTIES: -:UNNUMBERED: t -:END: - -#+begin_important -All the struts are giving very consistent behavior from the excitation voltage $u$ to the force sensor generated voltage $V_s$ and to the interferometer measured displacement $d_a$. -However, the dynamics from $u$ to the encoder measurement $d_e$ is much more complex and variable from one strut to the other. -The reason behind this variability will be studied in the next section thanks to the model of the strut. -#+end_important - -#+begin_src matlab :tangle no :exports none -%% Save the estimated FRF for further analysis -save('./matlab/mat/meas_struts_frf.mat', 'f', 'enc_frf', 'int_frf', 'iff_frf', 'strut_nums'); -#+end_src - -#+begin_src matlab :eval no -%% Save the estimated FRF for further analysis -save('./mat/meas_struts_frf.mat', 'f', 'enc_frf', 'int_frf', 'iff_frf', 'strut_nums'); -#+end_src - -* Strut Model -:PROPERTIES: -:header-args:matlab+: :tangle matlab/test_struts_3_simscape_model.m -:END: -<> -** Introduction :ignore: - -However, now the full strut is put instead of only the APA (see Figure ref:fig:test_struts_simscape_model). - -#+name: fig:test_struts_simscape_model -#+caption: Screenshot of the Simscape model of the strut fixed to the bench -#+attr_latex: :width 0.5\linewidth -[[file:figs/test_struts_simscape_model.png]] - -This Simscape model is used to: -- compare the measured FRF with the modelled FRF -- help the correct understanding/interpretation of the results -- tune the model of the struts (APA, flexible joints, encoder) - -This study is structured as follow: -- Section ref:ssec:test_struts_comp_model: the measured FRF are compared with the Simscape model. -- Section ref:ssec:test_struts_effect_misalignment: the flexible APA model is used, and the effect of a misalignment of the APA and flexible joints is studied. - It is found that the misalignment has a large impact on the dynamics from $u$ to $d_e$. -- Section ref:ssec:test_struts_effect_joint_stiffness: the effect of the flexible joint's stiffness on the dynamics is studied. - It is found that the axial stiffness of the joints has a large impact on the location of the zeros on the transfer function from $V_s$ to $d_e$. - -** 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 :noweb yes -<> -#+end_src - -#+begin_src matlab :eval no :noweb yes -<> -#+end_src - -#+begin_src matlab :tangle no :noweb yes -<> -#+end_src - -#+begin_src matlab :eval no :noweb yes -<> -#+end_src - -#+begin_src matlab :noweb yes -<> -#+end_src - -#+begin_src matlab :exports none -%% Input/Output definition of the Model -clear io; io_i = 1; -io(io_i) = linio([mdl, '/u'], 1, 'openinput'); io_i = io_i + 1; % DAC Voltage -io(io_i) = linio([mdl, '/Vs'], 1, 'openoutput'); io_i = io_i + 1; % Sensor Voltage -io(io_i) = linio([mdl, '/de'], 1, 'openoutput'); io_i = io_i + 1; % Encoder -io(io_i) = linio([mdl, '/da'], 1, 'openoutput'); io_i = io_i + 1; % Interferometer -#+end_src - -#+begin_src matlab -%% Frequency vector [Hz] -freqs = logspace(1, log10(2000), 1000); -#+end_src - -** Model dynamics -<> -#+begin_src matlab -%% Load measured FRF for comparison -load('meas_struts_frf.mat', 'f', 'enc_frf', 'int_frf', 'iff_frf', 'strut_nums'); - -%% Initialize strut with 2DoF model for the APA300ML and identify the dynamics -n_hexapod = struct(); -n_hexapod.flex_bot = initializeBotFlexibleJoint('type', '4dof'); -n_hexapod.flex_top = initializeTopFlexibleJoint('type', '4dof'); -n_hexapod.actuator = initializeAPA('type', '2dof'); - -c_granite = 0; % Do not take into account damping added by the air bearing - -% Run the linearization -Gs_2dof = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); -Gs_2dof.InputName = {'u'}; -Gs_2dof.OutputName = {'Vs', 'de', 'da'}; - -%% Initialize strut with "flexible" model for the APA300ML and identify the dynamics -n_hexapod = struct(); -n_hexapod.flex_bot = initializeBotFlexibleJoint('type', '4dof'); -n_hexapod.flex_top = initializeTopFlexibleJoint('type', '4dof'); -n_hexapod.actuator = initializeAPA('type', 'flexible'); - -c_granite = 100; % Do not take into account damping added by the air bearing - -% Run the linearization -Gs_flex = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); -Gs_flex.InputName = {'u'}; -Gs_flex.OutputName = {'Vs', 'de', 'da'}; -#+end_src - -Two models of the APA300ML are used here for comparison: -- a simple two degrees of freedom model -- a model using a super element extracted from a finite element model - -These two models of the APA300ML were tuned to best match measured frequency response functions of the APA alone. -The flexible joints are here modelled with the 4DoF model (axial stiffness, two bending stiffnesses and one torsion stiffness). - -These two models are compared with the measured frequency responses in Figure ref:fig:test_struts_comp_frf_flexible_model. - -The model dynamics from DAC voltage $u$ to the axial motion of the strut $d_a$ (Figure ref:fig:test_struts_comp_frf_flexible_model_int) and from DAC voltage $u$ to the force sensor voltage $V_s$ (Figure ref:fig:test_struts_comp_frf_flexible_model_iff) are well matching the experimental identification. - -However, the transfer function from $u$ to encoder displacement $d_e$ are not well matching for both models. -For the 2DoF model, this is normal as the resonances affecting the dynamics are not modelled at all (the APA300ML is modelled as infinitely rigid in all directions except the translation along it's actuation axis). -For the flexible model, it will be shown in the next section that by adding some misalignment between the flexible joints and the APA300ML, this model can better represent the observed dynamics. - -#+begin_src matlab :exports none -%% Compare the FRF and identified dynamics from u to Vs and da -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1a = nexttile([2,1]); -hold on; -plot(f, abs(int_frf(:, 1)), 'color', [0,0,0,0.2], ... - 'DisplayName', 'FRF'); -for i = 2:length(strut_nums) - plot(f, abs(int_frf(:, i)), 'color', [0,0,0,0.2], ... - 'HandleVisibility', 'off'); -end -plot(freqs, abs(squeeze(freqresp(Gs_2dof('da', 'u'), freqs, 'Hz'))), '-', ... - 'color', colors(1,:), 'DisplayName', '2DoF Model') -plot(freqs, abs(squeeze(freqresp(Gs_flex('da', 'u'), freqs, 'Hz'))), '-', ... - 'color', colors(2,:), 'DisplayName', 'Flex. Model') -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $d_a/u$ [m/V]'); set(gca, 'XTickLabel',[]); -hold off; -ylim([1e-8, 1e-3]); -leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15; - -ax2a = nexttile; -hold on; -for i = 1:length(strut_nums) - plot(f, 180/pi*angle(int_frf(:, i)), 'color', [0,0,0,0.2]); -end -plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_2dof('da', 'u'), freqs, 'Hz'))), '-', 'color', colors(1,:)) -plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_flex('da', 'u'), freqs, 'Hz'))), '-', 'color', colors(2,:)) -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180, 180]); - -linkaxes([ax1a,ax2a],'x'); -xlim([10, 2e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file none -exportFig('figs/test_struts_comp_frf_flexible_model_int.pdf', 'width', 400, 'height', 'tall'); -#+end_src - -#+begin_src matlab :exports none -%% Compare the FRF and identified dynamics from u to Vs and da -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1a = nexttile([2,1]); -hold on; -plot(f, abs(enc_frf(:, 1)), 'color', [0,0,0,0.2], ... - 'DisplayName', 'FRF'); -for i = 2:length(strut_nums) - plot(f, abs(enc_frf(:, i)), 'color', [0,0,0,0.2], ... - 'HandleVisibility', 'off'); -end -plot(freqs, abs(squeeze(freqresp(Gs_2dof('de', 'u'), freqs, 'Hz'))), '-', ... - 'color', colors(1,:), 'DisplayName', '2DoF Model') -plot(freqs, abs(squeeze(freqresp(Gs_flex('de', 'u'), freqs, 'Hz'))), '-', ... - 'color', colors(2,:), 'DisplayName', 'Flex. Model') -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); -hold off; -ylim([1e-8, 1e-3]); -leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15; - -ax2a = nexttile; -hold on; -for i = 1:length(strut_nums) - plot(f, 180/pi*angle(enc_frf(:, i)), 'color', [0,0,0,0.2]); -end -plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_2dof('de', 'u'), freqs, 'Hz'))), '-', 'color', colors(1,:)) -plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_flex('de', 'u'), freqs, 'Hz'))), '-', 'color', colors(2,:)) -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180, 180]); - -linkaxes([ax1a,ax2a],'x'); -xlim([10, 2e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file none -exportFig('figs/test_struts_comp_frf_flexible_model_enc.pdf', 'width', 400, 'height', 'tall'); -#+end_src - -#+begin_src matlab :exports none -%% Compare the FRF and identified dynamics from u to Vs and da -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1a = nexttile([2,1]); -hold on; -plot(f, abs(iff_frf(:, i)), 'color', [0,0,0,0.2], ... - 'DisplayName', 'FRF'); -for i = 1:length(strut_nums) - plot(f, abs(iff_frf(:, i)), 'color', [0,0,0,0.2], ... - 'HandleVisibility', 'off'); -end -plot(freqs, abs(squeeze(freqresp(Gs_2dof('Vs', 'u'), freqs, 'Hz'))), '-', ... - 'color', colors(1,:), 'DisplayName', '2DoF Model') -plot(freqs, abs(squeeze(freqresp(Gs_flex('Vs', 'u'), freqs, 'Hz'))), '-', ... - 'color', colors(2,:), 'DisplayName', 'Flex. Model') -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]); -hold off; -ylim([1e-2, 1e2]); -leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15; - -ax2a = nexttile; -hold on; -for i = 1:length(strut_nums) - plot(f, 180/pi*angle(iff_frf(:, i)), 'color', [0,0,0,0.2]); -end -set(gca,'ColorOrderIndex',1); -plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_2dof('Vs', 'u'), freqs, 'Hz'))), '-', 'color', colors(1,:)) -plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_flex('Vs', 'u'), freqs, 'Hz'))), '-', 'color', colors(2,:)) -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180, 180]); - -linkaxes([ax1a,ax2a],'x'); -xlim([10, 2e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file none -exportFig('figs/test_struts_comp_frf_flexible_model_iff.pdf', 'width', 400, 'height', 'tall'); -#+end_src - -#+name: fig:test_struts_comp_frf_flexible_model -#+caption: Comparison of the measured dynamics and of the Simscape dynamics using the "flexible" APA300ML model (Super-Element extracted from a Finite Element Model). -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_frf_flexible_model_int}$u$ to $d_a$} -#+attr_latex: :options {0.33\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.9\linewidth -[[file:figs/test_struts_comp_frf_flexible_model_int.png]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_frf_flexible_model_enc}$u$ to $d_e$} -#+attr_latex: :options {0.33\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.9\linewidth -[[file:figs/test_struts_comp_frf_flexible_model_enc.png]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_frf_flexible_model_iff}$u$ to $V_s$} -#+attr_latex: :options {0.33\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.9\linewidth -[[file:figs/test_struts_comp_frf_flexible_model_iff.png]] -#+end_subfigure -#+end_figure - -** Effect of strut misalignment -<> - -As was shown in Figure ref:fig:test_struts_comp_enc_plants, the identified dynamics from DAC voltage $u$ to encoder measured displacement $d_e$ are very different from one strut to the other. - -In this section, it is investigated whether poor alignment of the strut (flexible joints with respect to the APA) can explain such dynamics. -For instance, consider Figure ref:fig:test_struts_misalign_schematic where there is a misalignment in the $y$ direction between the two flexible joints (well aligned thanks to the mounting procedure in Section ref:sec:test_struts_mounting) and the APA300ML. -In such case, the "x-bending" mode at 200Hz (see Figure ref:fig:test_struts_meas_x_bending) can be expected to be more excited, and thus the dynamics from the actuator to the encoder should be affected at frequencies around 200Hz. - -#+name: fig:test_struts_misalign_schematic -#+caption: Mis-alignement between the joints and the APA -#+attr_latex: :width 0.8\linewidth -[[file:figs/test_struts_misalign_schematic.png]] - -To verify this assumption, the dynamics from output DAC voltage $u$ to the measured displacement by the encoder $d_e$ is computed using the Simscape model with flexible APA for several misalignment in the $y$ direction. -Obtained dynamics are shown in Figure ref:fig:test_struts_effect_misalignment_y. -The alignment of the APA with the flexible joints as a *huge* influence on the dynamics from actuator voltage to measured displacement by the encoder. -The misalignment in the $y$ direction mostly influences: -- the presence of the flexible mode at 200Hz (see mode shape in Figure ref:fig:test_struts_mode_shapes_1) -- the location of the complex conjugate zero between the first two resonances: - - if $d_{y} < 0$: there is no zero between the two resonances and possibly not even between the second and third ones - - if $d_{y} > 0$: there is a complex conjugate zero between the first two resonances -- the location of the high frequency complex conjugate zeros at 500Hz (secondary effect, as the axial stiffness of the joint also has large effect on the position of this zero) - -The same can be done for a misalignment in the $x$ direction. -The obtained dynamics are shown in Figure ref:fig:test_struts_effect_misalignment_x where it is shown that misalignment in the $x$ direction mostly influences the presence of the flexible mode at 300Hz (see mode shape in Figure ref:fig:test_struts_mode_shapes_2). - -Comparing the experimental frequency response functions for all the APA in Figure ref:fig:test_struts_comp_enc_plants with the model dynamics for several $y$ misalignments in Figure ref:fig:test_struts_effect_misalignment_y indicates a clear similarity. -This similarity suggests that the identified differences in dynamics are caused by the misalignment. - -#+begin_src matlab -%% Effect of a misalignment in Y-Direction -% Considered misalignment in the Y direction -dy_aligns = [-0.5, -0.1, 0.1, 0.5]*1e-3; % [m] - -% Transfer functions from u to de for all the misalignment in y direction -Gs_dy_align = {zeros(length(dy_aligns), 1)}; - -for i = 1:length(dy_aligns) - n_hexapod.actuator = initializeAPA('type', 'flexible', 'd_align_bot', [0; dy_aligns(i); 0], 'd_align_top', [0; dy_aligns(i); 0]); - - G = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); - G.InputName = {'u'}; - G.OutputName = {'Vs', 'de', 'da'}; - - Gs_dy_align(i) = {G}; -end - -%% Effect of a misalignment in X-Direction -% Considered misalignment in the X direction -dx_aligns = [-0.1, -0.05, 0.05, 0.1]*1e-3; % [m] - -% Transfer functions from u to de for all the misalignment in x direction -Gs_dx_align = {zeros(length(dx_aligns), 1)}; - -for i = 1:length(dx_aligns) - n_hexapod.actuator = initializeAPA('type', 'flexible', 'd_align_bot', [dx_aligns(i); 0; 0], 'd_align_top', [dx_aligns(i); 0; 0]); - - G = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); - G.InputName = {'u'}; - G.OutputName = {'Vs', 'de', 'da'}; - - Gs_dx_align(i) = {G}; -end -#+end_src - -#+begin_src matlab :exports none -%% Transfer function from Vs to de - effect of x-misalignment -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1 = nexttile([2,1]); -hold on; -for i = 1:length(dy_aligns) - plot(freqs, abs(squeeze(freqresp(Gs_dy_align{i}('de', 'u'), freqs, 'Hz'))), ... - 'DisplayName', sprintf('$d_y = %.1f$ [mm]', 1e3*dy_aligns(i))); -end -plot(freqs, abs(squeeze(freqresp(Gs_flex('de', 'u'), freqs, 'Hz'))), 'k-', ... - 'DisplayName', 'aligned'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); -hold off; -ylim([1e-8, 1e-3]); -leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15; - -ax2 = nexttile; -hold on; -for i = 1:length(dy_aligns) - plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_dy_align{i}('de', 'u'), freqs, 'Hz')))); -end -plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_flex('de', 'u'), freqs, 'Hz'))), 'k-'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180, 180]); - -linkaxes([ax1,ax2],'x'); -xlim([10, 2e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file none -exportFig('figs/test_struts_effect_misalignment_y.pdf', 'width', 'half', 'height', 'tall'); -#+end_src - -#+begin_src matlab :exports none -%% Transfer function from Vs to de - effect of x-misalignment -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1 = nexttile([2,1]); -hold on; -for i = 1:length(dx_aligns) - plot(freqs, abs(squeeze(freqresp(Gs_dx_align{i}('de', 'u'), freqs, 'Hz'))), ... - 'DisplayName', sprintf('$d_x = %.1f$ [mm]', 1e3*dx_aligns(i))); -end -plot(freqs, abs(squeeze(freqresp(Gs_flex('de', 'u'), freqs, 'Hz'))), 'k-', ... - 'DisplayName', 'aligned'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); -hold off; -ylim([1e-8, 1e-3]); -leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15; - -ax2 = nexttile; -hold on; -for i = 1:length(dx_aligns) - plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_dx_align{i}('de', 'u'), freqs, 'Hz')))); -end -plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_flex('de', 'u'), freqs, 'Hz'))), 'k-'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180, 180]); - -linkaxes([ax1,ax2],'x'); -xlim([10, 2e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file none -exportFig('figs/test_struts_effect_misalignment_x.pdf', 'width', 'half', 'height', 'tall'); -#+end_src - -#+name: fig:test_struts_effect_misalignment -#+caption: Effect of a misalignment between the flexible joints and the APA300ML in the $y$ direction (\subref{fig:test_struts_effect_misalignment_y}) and in the $x$ direction (\subref{fig:test_struts_effect_misalignment_x}) -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_effect_misalignment_y}Misalignment along $y$} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/test_struts_effect_misalignment_y.png]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:test_struts_effect_misalignment_x}Misalignment along $x$} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/test_struts_effect_misalignment_x.png]] -#+end_subfigure -#+end_figure - -** Measured strut misalignment -<> - -During the first mounting of the struts presented in Section ref:sec:test_struts_mounting, the positioning pins used to position the APA with respect to the flexible joints in the $y$ directions were not used (not received at the time). -Therefore, large $y$ misalignments may be expected. - -In order to estimate the misalignments between the two flexible joints and the APA: -- the struts are fixed horizontally to the mounting bench as shown in Figure ref:fig:test_struts_mounting_step_3 but without the encoder -- using a length gauge[fn:2], the height difference from the flexible joints surface and the APA shell surface is measured both for the top and bottom joints and on both sides -- as the thickness of the flexible joint is $21\,mm$ and the thickness of the APA shell is $20\,mm$, $0.5\,mm$ of height different should be measured is the two are perfectly aligned - -Large variations in the $y$ misalignment are found from one strut to the other (results are summarized in Table ref:tab:test_struts_meas_y_misalignment). - -To check the validity of the measurement, it can be verified that sum of the measured thickness difference on each side is $1\,mm$ (equal to the thickness difference between the flexible joint and the APA). -This thickness differences for all the struts were found to be between $0.94\,mm$ and $1.00\,mm$ which indicate low errors as compared to the misalignments found in Table ref:tab:test_struts_meas_y_misalignment. - -#+begin_src matlab -%% Measurement of the y misalignment between the APA and the flexible joints -% Mesured struts -strut_nums = [1, 2, 3, 4, 5]; - -% Measured height differences in [mm] -% R ("red" side), B ("black" side) -% R Top B Top R Bot B Bot -strut_align = [[-0.40, -0.60, -0.16, -0.82] % Strut 1 - [-0.67, -0.30, -0.34, -0.63] % Strut 2 - [-0.07, -0.88, -0.16, -0.79] % Strut 3 - [-0.48, -0.46, 0.07, -1.00] % Strut 4 - [-0.33, -0.64, -0.48, -0.52]]; % Strut 5 - -% Verification that the thickness difference between the APA shell and the flexible joints is 1mm -thichness_diff_top = strut_align(:,1) + strut_align(:,2); % [mm] -thichness_diff_bot = strut_align(:,1) + strut_align(:,2); % [mm] - -% Estimation of the dy misalignment -dy_bot = (strut_align(:,1) - strut_align(:,2))/2; % [mm] -dy_top = (strut_align(:,3) - strut_align(:,4))/2; % [mm] -#+end_src - -#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) -data2orgtable([dy_bot, dy_top] , {'1', '2', '3', '4', '5'}, {'*Strut*', '*Bot*', '*Top*'}, ' %.2f '); -#+end_src - -#+name: tab:test_struts_meas_y_misalignment -#+caption: Measured $y$ misalignment at the top and bottom of the APA. Measurements are in $mm$ -#+attr_latex: :environment tabularx :width 0.25\linewidth :align ccc -#+attr_latex: :center t :booktabs t -#+RESULTS: -| *Strut* | *Bot* | *Top* | -|---------+-------+-------| -| 1 | 0.1 | 0.33 | -| 2 | -0.19 | 0.14 | -| 3 | 0.41 | 0.32 | -| 4 | -0.01 | 0.54 | -| 5 | 0.15 | 0.02 | - -By using the measured $y$ misalignment in the Simscape model with the flexible APA model, the measured dynamics from $u$ to $d_e$ can be approached as shown in Figure ref:fig:test_struts_comp_dy_tuned_model_frf_enc. -Even better match in the dynamics can be obtained by fine tuning both the $x$ and $y$ misalignments (yellow curves in Figure ref:fig:test_struts_comp_dy_tuned_model_frf_enc). - - -This confirms that the misalignment between the APA and the strut axis (determined by the two flexible joints) is critical and is inducing large variations in the dynamics from DAC voltage $u$ to encoder measured displacement $d_e$. -If encoders are to be used when fixed on the struts, it is therefore very important to properly align the APA and the flexible joints when mounting the struts. - - -In the next section, the struts are re-assembled with a "positioning pin" to better align the APA with the flexible joints. -With a better alignment, the amplitude of the spurious resonances are expected to decrease as was shown in Figure ref:fig:test_struts_effect_misalignment_y. - -#+begin_src matlab -%% Idenfity the dynamics from u to de - misalignement estimated from measurement -Gs_y_align = {zeros(size(strut_align,1), 1)}; - -% Measured dy alignment -strut_align = 1e-3*[[-0.60, -0.82, -0.40, -0.16] - [-0.30, -0.63, -0.67, -0.34] - [-0.88, -0.79, -0.07, -0.16] - [-0.48, 0.07, -0.46, -1.00] - [-0.33, -0.48, -0.64, -0.52] - [-0.34, -0.42, -0.63, -0.57]]; - -for i = 1:size(strut_align,1) - n_hexapod.actuator = initializeAPA('type', 'flexible', ... - 'd_align_bot', [0; strut_align(i, 2) - strut_align(i, 4); 0], ... - 'd_align_top', [0; strut_align(i, 1) - strut_align(i, 3); 0]); - - G = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); - G.InputName = {'u'}; - G.OutputName = {'Vs', 'de', 'da'}; - - Gs_y_align(i) = {G}; -end - -%% Idenfity the dynamics from u to de - misalignement tuned to have the best match -d_aligns = [[-0.05, -0.3, 0]; - [ 0, 0.5, 0]; - [-0.1, -0.3, 0]; - [ 0, 0.3, 0]; - [-0.05, 0.05, 0]]'*1e-3; - -% Idenfity the transfer function from actuator to encoder for all cases -Gs_xy_align = {zeros(size(d_aligns,2), 1)}; - -for i = 1:5 - n_hexapod.actuator = initializeAPA('type', 'flexible', 'd_align_top', d_aligns(:,i), 'd_align_bot', d_aligns(:,i)); - - G = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); - G.InputName = {'u'}; - G.OutputName = {'Vs', 'de', 'da'}; - - Gs_xy_align(i) = {G}; -end -#+end_src - -#+begin_src matlab :exports none -%% Comparison of the plants (encoder output) when tuning the misalignment -figure; -tiledlayout(1, 3, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1 = nexttile(); -hold on; -plot(f, abs(enc_frf(:, 1)), 'DisplayName', 'Measurement'); -plot(freqs, abs(squeeze(freqresp(Gs_y_align{1}('de', 'u'), freqs, 'Hz'))), ... - 'DisplayName', '$d_y$ from meas'); -plot(freqs, abs(squeeze(freqresp(Gs_xy_align{1}('de', 'u'), freqs, 'Hz'))), ... - 'DisplayName', 'Tuned $d_x$, $d_y$'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Amplitude [m/V]'); -leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15; -title('Strut 1'); -xticks([1e1, 1e2, 1e3]); - -ax2 = nexttile(); -hold on; -plot(f, abs(enc_frf(:, 2)), 'DisplayName', 'Measurement'); -plot(freqs, abs(squeeze(freqresp(Gs_y_align{2}('de', 'u'), freqs, 'Hz'))), ... - 'DisplayName', '$d_y$ from meas'); -plot(freqs, abs(squeeze(freqresp(Gs_xy_align{2}('de', 'u'), freqs, 'Hz'))), ... - 'DisplayName', 'Tuned $d_x$, $d_y$'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); -leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15; -title('Strut 2'); -xticks([1e1, 1e2, 1e3]); - -ax3 = nexttile(); -hold on; -plot(f, abs(enc_frf(:, 3)), 'DisplayName', 'Measuremnet'); -plot(freqs, abs(squeeze(freqresp(Gs_y_align{3}('de', 'u'), freqs, 'Hz'))), ... - 'DisplayName', '$d_y$ from meas'); -plot(freqs, abs(squeeze(freqresp(Gs_xy_align{3}('de', 'u'), freqs, 'Hz'))), ... - 'DisplayName', 'Tuned $d_x$, $d_y$'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); -leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); -leg.ItemTokenSize(1) = 15; -title('Strut 3'); -xticks([1e1, 1e2, 1e3]); - -linkaxes([ax1,ax2,ax3],'xy'); -xlim([10, 2e3]); ylim([1e-8, 1e-3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/test_struts_comp_dy_tuned_model_frf_enc.pdf', 'width', 'full', 'height', 'normal'); -#+end_src - -#+name: fig:test_struts_comp_dy_tuned_model_frf_enc -#+caption: Comparison of the frequency response functions from DAC voltage $u$ to measured displacement $d_e$ by the encoders for three struts. In blue the measured dynamics, in red the dynamics extracted from the model with the $y$ misalignment estimated from measurements, in yellow the dynamics extracted from the model when both the $x$ and $y$ misalignments are tuned -#+RESULTS: -[[file:figs/test_struts_comp_dy_tuned_model_frf_enc.png]] - -** Proper struts alignment -<> - -After the positioning pins had been received, the struts were mounted again with the positioning pins. -This should make the APA better aligned with the two flexible joints. - -This alignment is then estimated using a length gauge as in the previous sections. -Measured $y$ alignments are summarized in Table ref:tab:test_struts_meas_y_misalignment_with_pin and are found to be bellow $55\mu m$ for all the struts which is much better than better (see Table ref:tab:test_struts_meas_y_misalignment). - -#+begin_src matlab -%% Measurement of the y misalignment between the APA and the flexible joints after strut better alignment - -% Numbers of the measured legs -strut_align_nums = [1 2 3 4 5 6]; - -% Measured height differences in [mm] -% R ("red" side), B ("black" side) -% R Top B Top R Bot B Bot -strut_align = [[-0.54, -0.50, -0.50, -0.52] % strut 1 - [-0.44, -0.55, -0.49, -0.49] % strut 2 - [-0.48, -0.50, -0.50, -0.46] % strut 3 - [-0.45, -0.51, -0.51, -0.45] % strut 4 - [-0.50, -0.50, -0.50, -0.50] % strut 5 - [-0.50, -0.49, -0.43, -0.54]]; % strut 6 - -% Verification that the thickness difference between the APA shell and the flexible joints is 1mm -thichness_diff_top = strut_align(:,1) + strut_align(:,2); % [mm] -thichness_diff_bot = strut_align(:,1) + strut_align(:,2); % [mm] - -% Estimation of the dy misalignment -dy_bot = (strut_align(:,1) - strut_align(:,2))/2; % [mm] -dy_top = (strut_align(:,3) - strut_align(:,4))/2; % [mm] -#+end_src - -#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) -data2orgtable([dy_bot, dy_top] , {'1', '2', '3', '4', '5', '6'}, {'*Strut*', '*Bot*', '*Top*'}, ' %.3f '); -#+end_src - -#+name: tab:test_struts_meas_y_misalignment_with_pin -#+caption: Measured $y$ misalignment at the top and bottom of the APA after realigning the struts using a positioning pin. Measurements are in $mm$. -#+attr_latex: :environment tabularx :width 0.25\linewidth :align ccc -#+attr_latex: :center t :booktabs t -#+RESULTS: -| *Strut* | *Bot* | *Top* | -|---------+--------+-------| -| 1 | -0.02 | 0.01 | -| 2 | 0.055 | 0.0 | -| 3 | 0.01 | -0.02 | -| 4 | 0.03 | -0.03 | -| 5 | 0.0 | 0.0 | -| 6 | -0.005 | 0.055 | - -The dynamics of the re-aligned struts are then measured using the same test bench (Figure ref:fig:test_struts_bench_leg). -The comparison of the initial strut dynamics and the dynamics of the re-aligned struts (i.e. with the positioning pin) is made in Figure ref:fig:test_struts_comp_enc_frf_realign. - -Even though the struts are now much better aligned, not much improvement can be observed. -The dynamics of the six aligned struts are quite different from one another. - -Having the encoders fixed to the struts may prove to be difficult to use. -Therefore, the encoders may be fixed to the nano-hexapod plates instead. - -#+begin_src matlab -%% New dynamical identified with re-aligned struts -% Load the identification data -leg_noise = {}; -for i = 1:length(strut_align_nums) - leg_noise(i) = {load(sprintf('frf_struts_align_%i_noise.mat', strut_align_nums(i)), 'u', 'Vs', 'de')}; -end - -% Parameters for Frequency Analysis -Ts = 1e-4; % Sampling Time [s] -Nfft = floor(1/Ts); % Number of points for the FFT computation -win = hanning(Nfft); % Hanning window -Noverlap = floor(Nfft/2); % Overlap between frequency analysis - -% Only used to have the frequency vector "f" -[~, f] = tfestimate(leg_noise{1}.u, leg_noise{1}.de, win, Noverlap, Nfft, 1/Ts); - -% Transfer function from u to de (encoder) -enc_frf_aligned = zeros(length(f), length(strut_align_nums)); - -for i = 1:length(strut_align_nums) - enc_frf_aligned(:, i) = tfestimate(leg_noise{i}.u, leg_noise{i}.de, win, Noverlap, Nfft, 1/Ts); -end -#+end_src - -#+begin_src matlab :exports none -%% Bode plot of the FRF from u to de -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -ax1 = nexttile([2,1]); -hold on; -plot(f, abs(enc_frf(:, 1)), 'color', [colors(1,:), 0.5], ... - 'DisplayName', 'Initial alignment'); -for i = 1:length(strut_nums) - plot(f, abs(enc_frf(:, i)), 'color', [colors(1,:), 0.5], ... - 'HandleVisibility', 'off'); -end -plot(f, abs(enc_frf_aligned(:, 1)), 'color', [colors(2,:), 0.5], ... - 'DisplayName', 'With positioning pin'); -for i = 1:length(strut_align_nums) - plot(f, abs(enc_frf_aligned(:, i)), 'color', [colors(2,:), 0.5], ... - 'HandleVisibility', 'off'); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); -hold off; -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1); -ylim([1e-8, 1e-3]); - -ax2 = nexttile; -hold on; -for i = 1:length(strut_nums) - plot(f, 180/pi*angle(enc_frf(:, i)), 'color', [colors(1,:), 0.5]); -end -for i = 1:length(strut_align_nums) - plot(f, 180/pi*angle(enc_frf_aligned(:, i)), 'color', [colors(2,:), 0.5]); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); ylim([-180, 180]); - -linkaxes([ax1,ax2],'x'); -xlim([10, 2e3]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/test_struts_comp_enc_frf_realign.pdf', 'width', 'wide', 'height', 'tall'); -#+end_src - -#+name: fig:test_struts_comp_enc_frf_realign -#+caption: -#+RESULTS: -[[file:figs/test_struts_comp_enc_frf_realign.png]] - ** Effect of the flexible joint <> As the struts are composed of one APA and two flexible joints, it is expected that the flexible joint characteristics will change the dynamic behavior of the struts. - Using the Simscape model, the effect of the flexible joint's characteristics on the dynamics as measured on the test bench are studied. The studied dynamics is between $u$ and the encoder displacement $d_e$. -Let's initialize an APA which is a little bit misaligned. #+begin_src matlab % APA Initialization n_hexapod.actuator = initializeAPA('type', 'flexible', 'd_align_bot', [0.1e-3; 0.5e-3; 0], 'd_align_top', [0.1e-3; 0.5e-3; 0]); @@ -1893,16 +285,1613 @@ This method gives nice match between the measured FRF and the one extracted from Using this method, an axial stiffness of $70 N/\mu m$ is found to give good results (and is reasonable based on the finite element models). +* Glossary and Acronyms - Tables :ignore: + +#+name: acronyms +| key | abbreviation | full form | +|------+--------------+----------------------------------| +| nass | NASS | Nano Active Stabilization System | +| fem | FEM | Finite Element Model | +| apa | APA | Amplified Piezoelectric Actuator | +| dac | DAC | Digital to Analog Converter | + +* Introduction :ignore: + +The Nano-Hexapod struts (shown in Figure ref:fig:test_struts_picture_strut) are composed of two flexible joints that are fixed at the two ends of the strut, one acrfull:apa[fn:5] and one optical encoder[fn:6]. + +#+name: fig:test_struts_picture_strut +#+caption: One strut including two flexible joints, an amplified piezoelectric actuator and an encoder +#+attr_latex: :width 0.8\linewidth +[[file:figs/test_struts_picture_strut.jpg]] + +After the strut elements have been individually characterized (see previous sections), the struts are assembled. +The mounting procedure of the struts is explained in Section ref:sec:test_struts_mounting. +A mounting bench was used to ensure coaxiality between the two ends of the struts. +In this way, no angular stroke is lost when mounted to the nano-hexapod. + +The flexible modes of the struts were then experimentally measured and compared with a finite element model (Section ref:sec:test_struts_flexible_modes). + +Dynamic measurements of the strut are performed with the same test bench used to characterize the APA300ML dynamics (Section ref:sec:test_struts_dynamical_meas). +It was found that the dynamics from the acrshort:dac voltage to the displacement measured by the encoder is complex due to the flexible modes of the struts (Section ref:sec:test_struts_flexible_modes). + +The strut models were then compared with the measured dynamics (Section ref:sec:test_struts_simscape). +The model dynamics from the acrshort:dac voltage to the axial motion of the strut (measured by an interferometer) and to the force sensor voltage well match the experimental results. +However, this is not the case for the dynamics from acrshort:dac voltage to the encoder displacement. +It is found that the complex dynamics is due to a misalignment between the flexible joints and the acrshort:apa. + +# #+name: tab:test_struts_section_matlab_code +# #+caption: Report sections and corresponding Matlab files +# #+attr_latex: :environment tabularx :width 0.6\linewidth :align lX +# #+attr_latex: :center t :booktabs t +# | *Sections* | *Matlab File* | +# |--------------------------------------------+----------------------------------| +# | Section ref:sec:test_struts_flexible_modes | =test_struts_1_flexible_modes.m= | +# | Section ref:sec:test_struts_dynamical_meas | =test_struts_2_dynamical_meas.m= | +# | Section ref:sec:test_struts_simscape | =test_struts_3_simscape_model’m= | + +* Mounting Procedure +<> +** Introduction :ignore: + +A mounting bench was developed to ensure: +- Good coaxial alignment between the interfaces (cylinders) of the flexible joints. + This is important not to loose to much angular stroke during their mounting into the nano-hexapod +- Uniform length across all struts +- Precise alignment of the APA with the two flexible joints +- Reproducible and consistent assembly between all struts + +** Mounting Bench + +A CAD view of the mounting bench is shown in Figure ref:fig:test_struts_mounting_bench_first_concept. +It consists of a "main frame" (Figure ref:fig:test_struts_mounting_step_0) precisely machined to ensure both correct strut length and strut coaxiality. +The coaxiality is ensured by good flatness (specified at $20\,\mu m$) between surfaces A and B and between surfaces C and D. +Such flatness was checked using a Faro arm[fn:1] (see Figure ref:fig:test_struts_check_dimensions_bench) and was found to comply with the requirements. +The strut length (defined by the distance between the rotation points of the two flexible joints) was ensured by using precisely machines dowel holes. + + +#+name: fig:test_struts_mounting +#+caption: Strut mounting bench +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_bench_first_concept}CAD view of the mounting bench} +#+attr_latex: :options {0.49\textwidth} +#+begin_subfigure +#+attr_latex: :width \linewidth +[[file:figs/test_struts_mounting_bench_first_concept.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_overview}Exploded view} +#+attr_latex: :options {0.49\textwidth} +#+begin_subfigure +#+attr_latex: :width \linewidth +[[file:figs/test_struts_mounting_overview.jpg]] +#+end_subfigure +#+end_figure + +#+name: fig:test_struts_mounting_base_part +#+caption: Main element of the mounting bench for the struts that ensure good coaxiality of the two flexible joints and correct struts length. +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_step_0}Useful features of the main mounting element} +#+attr_latex: :options {0.56\textwidth} +#+begin_subfigure +#+attr_latex: :height 4.5cm +[[file:figs/test_struts_mounting_step_0.jpg]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_check_dimensions_bench}Dimensional check} +#+attr_latex: :options {0.43\textwidth} +#+begin_subfigure +#+attr_latex: :height 4.5cm +[[file:figs/test_struts_check_dimensions_bench.jpg]] +#+end_subfigure +#+end_figure + +The flexible joints were not directly fixed to the mounting bench but were fixed to a cylindrical "sleeve" shown in Figures ref:fig:test_struts_cylindrical_mounting_part_top and ref:fig:test_struts_cylindrical_mounting_part_bot. +The goal of these "sleeves" is to avoid mechanical stress that could damage the flexible joints during the mounting process. +These "sleeves" have one dowel groove (that are fitted to the dowel holes shown in Figure ref:fig:test_struts_mounting_step_0) that will determine the length of the mounted strut. + +#+name: fig:test_struts_cylindrical_mounting +#+caption: Preparation of the flexible joints by fixing them in their cylindrical "sleeve" +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_cylindrical_mounting_part_top}Cylindral Interface (Top)} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :height 4.5cm +[[file:figs/test_struts_cylindrical_mounting_part_top.jpg]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_cylindrical_mounting_part_bot}Cylindrlcal Interface (Bottom)} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :height 4.5cm +[[file:figs/test_struts_cylindrical_mounting_part_bot.jpg]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_joints}Mounted flexible joints} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :height 4.5cm +[[file:figs/test_struts_mounting_joints.jpg]] +#+end_subfigure +#+end_figure + +** Mounting Procedure + +The "sleeves" were mounted to the main element as shown in Figure ref:fig:test_struts_mounting_step_0. +The left sleeve has a thigh fit such that its orientation is fixed (it is roughly aligned horizontally), while the right sleeve has a loose fit such that it can rotate (it will get the same orientation as the fixed one when tightening the screws). + +The cylindrical washers and the APA300ML are stacked on top of the flexible joints, as shown in Figure ref:fig:test_struts_mounting_step_2 and screwed together using a torque screwdriver. +A dowel pin is used to laterally align the APA300ML with the flexible joints (see the dowel slot on the flexible joints in Figure ref:fig:test_struts_mounting_joints). +Two cylindrical washers are used to allow proper mounting even when the two APA interfaces are not parallel. + +The encoder and ruler are then fixed to the strut and properly aligned, as shown in Figure ref:fig:test_struts_mounting_step_3. + +Finally, the strut can be disassembled from the mounting bench (Figure ref:fig:test_struts_mounting_step_4). +Thanks to this mounting procedure, the coaxiality and length between the two flexible joint's interfaces can be obtained within the desired tolerances. + +#+name: fig:test_struts_mounting_steps +#+caption: Steps for mounting the struts. +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_step_1}Step 1} +#+attr_latex: :options {0.5\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/test_struts_mounting_step_1.jpg]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_step_2}Step 2} +#+attr_latex: :options {0.5\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/test_struts_mounting_step_2.jpg]] +#+end_subfigure + +\bigskip +#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_step_3}Step 3} +#+attr_latex: :options {0.5\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/test_struts_mounting_step_3.jpg]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_mounting_step_4}Step 4} +#+attr_latex: :options {0.5\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/test_struts_mounting_step_4.jpg]] +#+end_subfigure +#+end_figure + +* Measurement of flexible modes +:PROPERTIES: +:header-args:matlab+: :tangle matlab/test_struts_1_flexible_modes.m +:END: +<> +** Introduction + +A Finite Element Model[fn:3] of the struts is developed and is used to estimate the flexible modes. +The inertia of the encoder (estimated at $15\,g$) is considered. +The two cylindrical interfaces were fixed, and the first three flexible modes were computed. +The mode shapes are displayed in Figure ref:fig:test_struts_mode_shapes: an "X-bending" mode at 189Hz, a "Y-bending" mode at 285Hz and a "Z-torsion" mode at 400Hz. + +#+name: fig:test_struts_mode_shapes +#+caption: Spurious resonances of the struts estimated from a Finite Element Model +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_mode_shapes_1}X-bending mode (189Hz)} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.85\linewidth +[[file:figs/test_struts_mode_shapes_1.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_mode_shapes_2}Y-bending mode (285Hz)} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.85\linewidth +[[file:figs/test_struts_mode_shapes_2.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_mode_shapes_3}Z-torsion mode (400Hz)} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.85\linewidth +[[file:figs/test_struts_mode_shapes_3.png]] +#+end_subfigure +#+end_figure + +** 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 :noweb yes +<> +#+end_src + +#+begin_src matlab :eval no :noweb yes +<> +#+end_src + +#+begin_src matlab :noweb yes +<> +#+end_src + +** Measurement Setup + +To experimentally measure these mode shapes, a Laser vibrometer[fn:7] was used. +It measures the difference of motion between two beam path (red points in Figure ref:fig:test_struts_meas_modes). +The strut is then excited by an instrumented hammer, and the transfer function from the hammer to the measured rotation is computed. + +The setup used to measure the "X-bending" mode is shown in Figure ref:fig:test_struts_meas_x_bending. +The "Y-bending" mode is measured as shown in Figure ref:fig:test_struts_meas_y_bending and the "Z-torsion" measurement setup is shown in Figure ref:fig:test_struts_meas_z_torsion. +These tests were performed with and without the encoder being fixed to the strut. + +#+name: fig:test_struts_meas_modes +#+caption: Measurement of strut flexible modes +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_meas_x_bending}X-bending mode} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.85\linewidth +[[file:figs/test_struts_meas_x_bending.jpg]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_meas_y_bending}Y-bending mode} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.85\linewidth +[[file:figs/test_struts_meas_y_bending.jpg]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_meas_z_torsion}Z-torsion mode} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.85\linewidth +[[file:figs/test_struts_meas_z_torsion.jpg]] +#+end_subfigure +#+end_figure + +** Measured results +The obtained frequency response functions for the three configurations (X-bending, Y-bending and Z-torsion) are shown in Figure ref:fig:test_struts_spur_res_frf_no_enc when the encoder is not fixed to the strut and in Figure ref:fig:test_struts_spur_res_frf_enc when the encoder is fixed to the strut. + +#+begin_src matlab :exports none +%% Load Data (without the encoder) +bending_X = load('strut_spur_res_x_bending.mat'); +bending_Y = load('strut_spur_res_y_bending.mat'); +torsion_Z = load('strut_spur_res_z_torsion.mat'); + +%% Load Data (with the encoder) +bending_X_enc = load('strut_spur_res_x_bending_enc.mat'); +bending_Y_enc = load('strut_spur_res_y_bending_enc.mat'); +torsion_Z_enc = load('strut_spur_res_z_torsion_enc.mat'); +#+end_src + +#+begin_src matlab :exports none +%% Plot the responses (without the encoder) +figure; +hold on; +plot(bending_X.FFT1_AvSpc_1_RMS_X_Val, bending_X.FFT1_AvSpc_1_RMS_Y_Val, ... + 'DisplayName', 'X-Bending') +plot(bending_Y.FFT1_AvSpc_1_RMS_X_Val, bending_Y.FFT1_AvSpc_1_RMS_Y_Val, ... + 'DisplayName', 'Y-Bending') +plot(torsion_Z.FFT1_AvSpc_1_RMS_X_Val, torsion_Z.FFT1_AvSpc_1_RMS_Y_Val, ... + 'DisplayName', 'Z-torsion'); +text(226, 1.5e-4,{'226Hz'}, 'VerticalAlignment', 'bottom','HorizontalAlignment','center') +text(310, 6e-5,{'337Hz'}, 'VerticalAlignment', 'bottom','HorizontalAlignment','center') +text(398, 1.5e-4,{'398Hz'}, 'VerticalAlignment', 'bottom','HorizontalAlignment','center') +hold off; +set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Amplitude'); +xlim([50, 8e2]); ylim([5e-7, 3e-4]) +xticks([50, 100, 500]); +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_struts_spur_res_frf_no_enc.pdf', 'width', 'half', 'height', 'normal'); +#+end_src + +#+begin_src matlab :exports none +%% Plot the responses (with the encoder) +figure; +hold on; +plot(bending_X_enc.FFT1_AvSpc_1_RMS_X_Val, bending_X_enc.FFT1_AvSpc_1_RMS_Y_Val, ... + 'DisplayName', 'X-Bending') +plot(bending_Y_enc.FFT1_AvSpc_1_RMS_X_Val, bending_Y_enc.FFT1_AvSpc_1_RMS_Y_Val, ... + 'DisplayName', 'Y-Bending') +plot(torsion_Z_enc.FFT1_AvSpc_1_RMS_X_Val, torsion_Z_enc.FFT1_AvSpc_1_RMS_Y_Val, ... + 'DisplayName', 'Z-torsion'); +text(198, 4e-5,{'198Hz'}, 'VerticalAlignment', 'bottom','HorizontalAlignment','center') +text(293, 6e-5,{'293Hz'}, 'VerticalAlignment', 'bottom','HorizontalAlignment','center') +text(381, 1e-4,{'381Hz'}, 'VerticalAlignment', 'bottom','HorizontalAlignment','center') +hold off; +set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Amplitude'); +xlim([50, 8e2]); ylim([5e-7, 3e-4]) +xticks([50, 100, 500]); +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_struts_spur_res_frf_enc.pdf', 'width', 'half', 'height', 'normal'); +#+end_src + +#+name: fig:test_struts_spur_res_frf +#+caption: Measured frequency response functions without the encoder ref:fig:test_struts_spur_res_frf and with the encoder ref:fig:test_struts_spur_res_frf_enc +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_spur_res_frf_no_enc}without encoder} +#+attr_latex: :options {0.49\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/test_struts_spur_res_frf_no_enc.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_spur_res_frf_enc}with the encoder} +#+attr_latex: :options {0.49\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/test_struts_spur_res_frf_enc.png]] +#+end_subfigure +#+end_figure + +Table ref:tab:test_struts_spur_mode_freqs summarizes the measured resonance frequencies and the computed ones using the acrfull:fem. +The resonance frequencies of the 3 modes are only slightly decreased when the encoder is fixed to the strut. +In addition, the computed resonance frequencies from the acrshort:fem are very close to the measured frequencies when the encoder is fixed to the strut. +This validates the quality of the acrshort:fem. + +#+name: tab:test_struts_spur_mode_freqs +#+caption: Measured frequency of the flexible modes of the strut +#+attr_latex: :environment tabularx :width 0.9\linewidth :align Xccc +#+attr_latex: :center t :booktabs t :float t +| *Mode* | *FEM with Encoder* | *Exp. with Encoder* | *Exp. without Encoder* | +|-----------+--------------------+---------------------+------------------------| +| X-Bending | 189Hz | 198Hz | 226Hz | +| Y-Bending | 285Hz | 293Hz | 337Hz | +| Z-Torsion | 400Hz | 381Hz | 398Hz | + +* Dynamical measurements +:PROPERTIES: +:header-args:matlab+: :tangle matlab/test_struts_2_dynamical_meas.m +:END: +<> +** Introduction :ignore: + +In order to measure the dynamics of the strut, the test bench used to measure the APA300ML dynamics is being used again. + +The strut mounted on the bench is shown in Figure ref:fig:test_struts_bench_leg_overview +A schematic of the bench and the associated signals are shown in Figure ref:fig:test_struts_bench_schematic. +A fiber interferometer[fn:4] is used to measure the motion of the granite (i.e. the axial motion of the strut). + +#+name: fig:test_struts_bench_leg +#+caption: Experimental setup used to measure the dynamics of the struts. +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_bench_leg_overview}Overview Picture} +#+attr_latex: :options {0.32\textwidth} +#+begin_subfigure +#+attr_latex: :height 210px +[[file:figs/test_struts_bench_leg_overview.jpg]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_bench_schematic}Schematic} +#+attr_latex: :options {0.68\textwidth} +#+begin_subfigure +#+attr_latex: :height 210px +[[file:figs/test_struts_bench_schematic.png]] +#+end_subfigure +#+end_figure + +First, the effect of the encoder on the measured dynamics is investigated in Section ref:ssec:test_struts_effect_encoder. +The dynamics observed by the encoder and interferometers are compared in Section ref:ssec:test_struts_comp_enc_int. +Finally, all measured struts are compared in terms of dynamics in Section ref:ssec:test_struts_comp_all_struts. + +** 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 :noweb yes +<> +#+end_src + +#+begin_src matlab :eval no :noweb yes +<> +#+end_src + +#+begin_src matlab :noweb yes +<> +#+end_src + +** Effect of the Encoder on the measured dynamics +<> + +#+begin_src matlab +%% Parameters for Frequency Analysis +Ts = 1e-4; % Sampling Time [s] +Nfft = floor(1/Ts); % Number of points for the FFT computation +win = hanning(Nfft); % Hanning window +Noverlap = floor(Nfft/2); % Overlap between frequency analysis + +%% Measure FRF for Strut 1 - No encoder +% Load Data +leg_sweep = load('frf_data_leg_1_sweep.mat', 'u', 'Vs', 'de', 'da'); +leg_noise_hf = load('frf_data_leg_1_noise_hf.mat', 'u', 'Vs', 'de', 'da'); + +% We get the frequency vector that will be the same for all the frequency domain analysis. +[~, f] = tfestimate(leg_sweep.u, leg_sweep.de, win, Noverlap, Nfft, 1/Ts); +i_lf = f <= 350; % Indices used for the low frequency +i_hf = f > 350; % Indices used for the high frequency + +% Compute FRF function from u to da (interferometer) +[frf_sweep, ~] = tfestimate(leg_sweep.u, leg_sweep.da, win, Noverlap, Nfft, 1/Ts); +[frf_noise_hf, ~] = tfestimate(leg_noise_hf.u, leg_noise_hf.da, win, Noverlap, Nfft, 1/Ts); +int_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)]; % Combine the FRF + +% Compute FRF function from u to Vs (force sensor) +[frf_sweep, ~] = tfestimate(leg_sweep.u, leg_sweep.Vs, win, Noverlap, Nfft, 1/Ts); +[frf_noise_hf, ~] = tfestimate(leg_noise_hf.u, leg_noise_hf.Vs, win, Noverlap, Nfft, 1/Ts); +iff_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)]; % Combine the FRF + +%% Measure FRF for Strut 1 - With encoder +% Load Data +leg_enc_sweep = load('frf_data_leg_coder_1_noise.mat', 'u', 'Vs', 'de', 'da'); +leg_enc_noise_hf = load('frf_data_leg_coder_1_noise_hf.mat', 'u', 'Vs', 'de', 'da'); + +% Compute FRF function from u to da (interferometer) +[frf_sweep, ~] = tfestimate(leg_enc_sweep.u, leg_enc_sweep.da, win, Noverlap, Nfft, 1/Ts); +[frf_noise_hf, ~] = tfestimate(leg_enc_noise_hf.u, leg_enc_noise_hf.da, win, Noverlap, Nfft, 1/Ts); +int_with_enc_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)]; % Combine the FRF + +% Compute FRF function from u to Vs (force sensor) +[frf_sweep, ~] = tfestimate(leg_enc_sweep.u, leg_enc_sweep.Vs, win, Noverlap, Nfft, 1/Ts); +[frf_noise_hf, ~] = tfestimate(leg_enc_noise_hf.u, leg_enc_noise_hf.Vs, win, Noverlap, Nfft, 1/Ts); +iff_with_enc_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)]; % Combine the FRF + +% Compute FRF function from u to de (encoder) +[frf_sweep, ~] = tfestimate(leg_enc_sweep.u, leg_enc_sweep.de, win, Noverlap, Nfft, 1/Ts); +[frf_noise_hf, ~] = tfestimate(leg_enc_noise_hf.u, leg_enc_noise_hf.de, win, Noverlap, Nfft, 1/Ts); +enc_frf = [frf_sweep(i_lf); frf_noise_hf(i_hf)]; % Combine the FRF +#+end_src + +System identification was performed without the encoder being fixed to the strut (Figure ref:fig:test_struts_bench_leg_front) and with one encoder being fixed to the strut (Figure ref:fig:test_struts_bench_leg_coder). + +#+name: fig:test_struts_bench_leg_with_without_enc +#+caption: Struts fixed to the test bench with clamped flexible joints. The coder can be fixed to the struts (\subref{fig:test_struts_bench_leg_coder}) or removed (\subref{fig:test_struts_bench_leg_front}) +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_bench_leg_coder}Strut with encoder} +#+attr_latex: :options {0.5\textwidth} +#+begin_subfigure +#+attr_latex: :height 6cm +[[file:figs/test_struts_bench_leg_coder.jpg]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_bench_leg_front}Strut without encoder} +#+attr_latex: :options {0.5\textwidth} +#+begin_subfigure +#+attr_latex: :height 6cm +[[file:figs/test_struts_bench_leg_front.jpg]] +#+end_subfigure +#+end_figure + +The obtained frequency response functions are compared in Figure ref:fig:test_struts_effect_encoder. +It was found that the encoder had very little effect on the transfer function from excitation voltage $u$ to the axial motion of the strut $d_a$ as measured by the interferometer (Figure ref:fig:test_struts_effect_encoder_int). +This means that the axial motion of the strut is unaffected by the presence of the encoder. +Similarly, it has little effect on the transfer function from $u$ to the sensor stack voltage $V_s$ (Figure ref:fig:test_struts_effect_encoder_iff). +This means that the encoder should have little effect on the effectiveness of the integral force feedback control strategy. + +#+begin_src matlab :exports none +%% Plot the FRF from u to da with and without the encoder +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(f, abs(int_with_enc_frf), '-', 'DisplayName', 'With encoder'); +plot(f, abs(int_frf), '-', 'DisplayName', 'Without encoder'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_a/u$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +ylim([1e-7, 1e-3]); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; + +ax2 = nexttile; +hold on; +plot(f, 180/pi*angle(int_with_enc_frf), '-'); +plot(f, 180/pi*angle(int_frf), '-'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_struts_effect_encoder_int.pdf', 'width', 'third', 'height', 600); +#+end_src + +#+begin_src matlab :exports none +%% Compare the IFF plant with and without the encoders +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(f, abs(iff_with_enc_frf), 'DisplayName', 'With Encoder'); +plot(f, abs(iff_frf), 'DisplayName', 'Without Encoder'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]); +hold off; +leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +ylim([1e-2, 1e2]); + +ax2 = nexttile; +hold on; +plot(f, 180/pi*angle(iff_with_enc_frf)); +plot(f, 180/pi*angle(iff_frf)); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_struts_effect_encoder_iff.pdf', 'width', 'third', 'height', 600); +#+end_src + +#+name: fig:test_struts_effect_encoder +#+caption: Effect of having the encoder fixed to the struts on the measured dynamics from $u$ to $d_a$ (\subref{fig:test_struts_effect_encoder_int}) and from $u$ to $V_s$ (\subref{fig:test_struts_effect_encoder_iff}). Comparison of the observed dynamics by the encoder and interferometers (\subref{fig:test_struts_comp_enc_int}) +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_effect_encoder_int}$u$ to $d_a$} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/test_struts_effect_encoder_int.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_effect_encoder_iff}$u$ to $V_s$} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/test_struts_effect_encoder_iff.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_enc_int}$u$ to $d_e$, $d_a$} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/test_struts_comp_enc_int.png]] +#+end_subfigure +#+end_figure + +** Comparison of the encoder and interferometer +<> + +The dynamics measured by the encoder (i.e. $d_e/u$) and interferometers (i.e. $d_a/u$) are compared in Figure ref:fig:test_struts_comp_enc_int. +The dynamics from the excitation voltage $u$ to the displacement measured by the encoder $d_e$ presents a behavior that is much more complex than the dynamics of the displacement measured by the interferometer (comparison made in Figure ref:fig:test_struts_comp_enc_int). +Three additional resonance frequencies can be observed at 197Hz, 290Hz and 376Hz. +These resonance frequencies match the frequencies of the flexible modes studied in Section ref:sec:test_struts_flexible_modes. + +The good news is that these resonances are not impacting the axial motion of the strut (which is what is important for the hexapod positioning). +However, these resonances make the use of an encoder fixed to the strut difficult from a control perspective. + +#+begin_src matlab :exports none +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(f, abs(enc_frf), 'DisplayName', '$d_e/u$'); +plot(f, abs(int_with_enc_frf), 'DisplayName', '$d_a/u$'); +text(85, 4e-4, {'93Hz'}, 'VerticalAlignment','middle','HorizontalAlignment','right') +text(200, 1.3e-4,{'197Hz'},'VerticalAlignment','bottom','HorizontalAlignment','center') +text(300, 4e-6, {'290Hz'},'VerticalAlignment','bottom','HorizontalAlignment','left') +text(400, 4e-7,{'376Hz'},'VerticalAlignment','top','HorizontalAlignment','center') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d/u$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +ylim([1e-7, 1e-3]); + +ax2 = nexttile; +hold on; +plot(f, 180/pi*angle(enc_frf)); +plot(f, 180/pi*angle(int_with_enc_frf)); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_struts_comp_enc_int.pdf', 'width', 'third', 'height', 600); +#+end_src + +** Comparison of all the Struts +<> + +#+begin_src matlab +%% Numbers of the measured legs +strut_nums = [1 2 3 4 5]; + +%% Load the measurement data +% First identification (low frequency noise) +leg_noise = {}; +for i = 1:length(strut_nums) + leg_noise(i) = {load(sprintf('frf_data_leg_coder_%i_noise.mat', strut_nums(i)), 'u', 'Vs', 'de', 'da')}; +end + +% Second identification (high frequency noise) +leg_noise_hf = {}; +for i = 1:length(strut_nums) + leg_noise_hf(i) = {load(sprintf('frf_data_leg_coder_%i_noise_hf.mat', strut_nums(i)), 'u', 'Vs', 'de', 'da')}; +end + +%% Compute FRF - From u to de (encoder) +enc_frf = zeros(length(f), length(strut_nums)); + +for i = 1:length(strut_nums) + [frf_lf, ~] = tfestimate(leg_noise{i}.u, detrend(leg_noise{i}.de, 0), win, Noverlap, Nfft, 1/Ts); + [frf_hf, ~] = tfestimate(leg_noise_hf{i}.u, detrend(leg_noise_hf{i}.de, 0), win, Noverlap, Nfft, 1/Ts); + enc_frf(:, i) = [frf_lf(i_lf); frf_hf(i_hf)]; +end + +%% Compute FRF - From u to da (interferometer) +int_frf = zeros(length(f), length(strut_nums)); +for i = 1:length(strut_nums) + [frf_lf, ~] = tfestimate(leg_noise{i}.u, leg_noise{i}.da, win, Noverlap, Nfft, 1/Ts); + [frf_hf, ~] = tfestimate(leg_noise_hf{i}.u, leg_noise_hf{i}.da, win, Noverlap, Nfft, 1/Ts); + int_frf(:, i) = [frf_lf(i_lf); frf_hf(i_hf)]; +end + +%% Compute FRF - From u to Vs (force sensor) +iff_frf = zeros(length(f), length(strut_nums)); +for i = 1:length(strut_nums) + [frf_lf, ~] = tfestimate(leg_noise{i}.u, leg_noise{i}.Vs, win, Noverlap, Nfft, 1/Ts); + [frf_hf, ~] = tfestimate(leg_noise_hf{i}.u, leg_noise_hf{i}.Vs, win, Noverlap, Nfft, 1/Ts); + iff_frf(:, i) = [frf_lf(i_lf); frf_hf(i_hf)]; +end +#+end_src + +The dynamics of all the mounted struts (only 5 at the time of the experiment) were then measured on the same test bench. +The obtained dynamics from $u$ to $d_a$ are compared in Figure ref:fig:test_struts_comp_interf_plants while is dynamics from $u$ to $V_s$ are compared in Figure ref:fig:test_struts_comp_iff_plants. +A very good match can be observed between the struts. + +#+begin_src matlab :exports none +%% Plot the FRF from u to de (interferometer) +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:length(strut_nums) + plot(f, abs(int_frf(:, i)), ... + 'DisplayName', sprintf('Leg %i', strut_nums(i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_a/u$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +ylim([1e-8, 1e-3]); + +ax2 = nexttile; +hold on; +for i = 1:length(strut_nums) + plot(f, 180/pi*angle(int_frf(:, i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); ylim([-180 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_struts_comp_interf_plants.pdf', 'width', 'third', 'height', 600); +#+end_src + +#+begin_src matlab :exports none +%% Plot the FRF from u to Vs +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:length(strut_nums) + plot(f, abs(iff_frf(:, i)), ... + 'DisplayName', sprintf('Leg %i', strut_nums(i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]); +hold off; +ylim([1e-2, 1e2]); +leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; + +ax2 = nexttile; +hold on; +for i = 1:length(strut_nums) + plot(f, 180/pi*angle(iff_frf(:, i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); ylim([-180 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_struts_comp_iff_plants.pdf', 'width', 'third', 'height', 600); +#+end_src + +#+begin_src matlab :exports none +%% Bode plot of the FRF from u to de +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:length(strut_nums) + plot(f, abs(enc_frf(:, i)), ... + 'DisplayName', sprintf('Leg %i', strut_nums(i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +ylim([1e-8, 1e-3]); + +ax2 = nexttile; +hold on; +for i = 1:length(strut_nums) + plot(f, 180/pi*angle(enc_frf(:, i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_struts_comp_enc_plants.pdf', 'width', 'third', 'height', 600); +#+end_src + +#+name: fig:test_struts_comp_plants +#+caption: Comparison of the measured plants +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_interf_plants}$u$ to $d_a$} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width \linewidth +[[file:figs/test_struts_comp_interf_plants.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_iff_plants}$u$ to $V_s$} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width \linewidth +[[file:figs/test_struts_comp_iff_plants.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_enc_plants}$u$ to $d_e$} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width \linewidth +[[file:figs/test_struts_comp_enc_plants.png]] +#+end_subfigure +#+end_figure + +The same comparison is made for the transfer function from $u$ to $d_e$ (encoder output) in Figure ref:fig:test_struts_comp_enc_plants. +In this study, large dynamics differences were observed between the 5 struts. +Although the same resonance frequencies were seen for all of the struts (95Hz, 200Hz, 300Hz and 400Hz), the amplitude of the peaks were not the same. +In addition, the location or even presence of complex conjugate zeros changes from one strut to another. + +#+begin_src matlab :tangle no :exports none +%% Save the estimated FRF for further analysis +save('./matlab/mat/meas_struts_frf.mat', 'f', 'enc_frf', 'int_frf', 'iff_frf', 'strut_nums'); +#+end_src + +#+begin_src matlab :eval no +%% Save the estimated FRF for further analysis +save('./mat/meas_struts_frf.mat', 'f', 'enc_frf', 'int_frf', 'iff_frf', 'strut_nums'); +#+end_src + ** Conclusion :PROPERTIES: :UNNUMBERED: t :END: +All the struts exhibit very consistent behavior from the excitation voltage $u$ to the force sensor generated voltage $V_s$ and to the interferometer measured displacement $d_a$. +However, the dynamics from $u$ to the encoder measurement $d_e$ is much more complex and vary from one strut to the another. +The reason for this variability will be studied in the next section thanks to the strut model. + +* Strut Model +:PROPERTIES: +:header-args:matlab+: :tangle matlab/test_struts_3_simscape_model.m +:END: +<> +** Introduction :ignore: + +The Simscape model of the strut was included in the Simscape model of the test bench (see Figure ref:fig:test_struts_simscape_model). +The obtained model was first used to compare the measured FRF with the existing model (Section ref:ssec:test_struts_comp_model). + +Using a flexible APA model (extracted from a acrshort:fem), the effect of a misalignment of the APA with respect to flexible joints is studied (Section ref:ssec:test_struts_effect_misalignment). +It was found that misalignment has a large impact on the dynamics from $u$ to $d_e$. +This misalignment is estimated and measured in Section ref:ssec:test_struts_meas_misalignment. +The struts were then disassembled and reassemble a second time to optimize alignment (Section ref:sec:test_struts_meas_all_aligned_struts). + +#+name: fig:test_struts_simscape_model +#+caption: Screenshot of the Simscape model of the strut fixed to the bench +#+attr_latex: :width 0.65\linewidth +[[file:figs/test_struts_simscape_model.png]] + +** 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 :noweb yes +<> +#+end_src + +#+begin_src matlab :eval no :noweb yes +<> +#+end_src + +#+begin_src matlab :tangle no :noweb yes +<> +#+end_src + +#+begin_src matlab :eval no :noweb yes +<> +#+end_src + +#+begin_src matlab :noweb yes +<> +#+end_src + +#+begin_src matlab :exports none +%% Input/Output definition of the Model +clear io; io_i = 1; +io(io_i) = linio([mdl, '/u'], 1, 'openinput'); io_i = io_i + 1; % DAC Voltage +io(io_i) = linio([mdl, '/Vs'], 1, 'openoutput'); io_i = io_i + 1; % Sensor Voltage +io(io_i) = linio([mdl, '/de'], 1, 'openoutput'); io_i = io_i + 1; % Encoder +io(io_i) = linio([mdl, '/da'], 1, 'openoutput'); io_i = io_i + 1; % Interferometer +#+end_src + +#+begin_src matlab +%% Frequency vector [Hz] +freqs = logspace(1, log10(2000), 1000); +#+end_src + +** Model dynamics +<> + +#+begin_src matlab +%% Load measured FRF for comparison +load('meas_struts_frf.mat', 'f', 'enc_frf', 'int_frf', 'iff_frf', 'strut_nums'); + +%% Initialize strut with 2DoF model for the APA300ML and identify the dynamics +n_hexapod = struct(); +n_hexapod.flex_bot = initializeBotFlexibleJoint('type', '4dof'); +n_hexapod.flex_top = initializeTopFlexibleJoint('type', '4dof'); +n_hexapod.actuator = initializeAPA('type', '2dof'); + +c_granite = 0; % Do not take into account damping added by the air bearing + +% Run the linearization +Gs_2dof = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); +Gs_2dof.InputName = {'u'}; +Gs_2dof.OutputName = {'Vs', 'de', 'da'}; + +%% Initialize strut with "flexible" model for the APA300ML and identify the dynamics +n_hexapod = struct(); +n_hexapod.flex_bot = initializeBotFlexibleJoint('type', '4dof'); +n_hexapod.flex_top = initializeTopFlexibleJoint('type', '4dof'); +n_hexapod.actuator = initializeAPA('type', 'flexible'); + +c_granite = 100; % Do not take into account damping added by the air bearing + +% Run the linearization +Gs_flex = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); +Gs_flex.InputName = {'u'}; +Gs_flex.OutputName = {'Vs', 'de', 'da'}; +#+end_src + +Two models of the APA300ML are used here: a simple two-degrees-of-freedom model and a model using a super-element extracted from a acrlong:fem. +These two models of the APA300ML were tuned to best match the measured frequency response functions of the APA alone. +The flexible joints were modelled with the 4DoF model (axial stiffness, two bending stiffnesses and one torsion stiffness). +These two models are compared with the measured frequency responses in Figure ref:fig:test_struts_comp_frf_flexible_model. + +The model dynamics from DAC voltage $u$ to the axial motion of the strut $d_a$ (Figure ref:fig:test_struts_comp_frf_flexible_model_int) and from DAC voltage $u$ to the force sensor voltage $V_s$ (Figure ref:fig:test_struts_comp_frf_flexible_model_iff) are well matching the experimental identification. + +However, the transfer function from $u$ to encoder displacement $d_e$ are not well matching for both models. +For the 2DoF model, this is normal because the resonances affecting the dynamics are not modelled at all (the APA300ML is modeled as infinitely rigid in all directions except the translation along it's actuation axis). +For the flexible model, it will be shown in the next section that by adding some misalignment between the flexible joints and the APA300ML, this model can better represent the observed dynamics. + +#+begin_src matlab :exports none +%% Compare the FRF and identified dynamics from u to Vs and da +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1a = nexttile([2,1]); +hold on; +plot(f, abs(int_frf(:, 1)), 'color', [0,0,0,0.2], ... + 'DisplayName', 'FRF'); +for i = 2:length(strut_nums) + plot(f, abs(int_frf(:, i)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); +end +plot(freqs, abs(squeeze(freqresp(Gs_2dof('da', 'u'), freqs, 'Hz'))), '-', ... + 'color', colors(1,:), 'DisplayName', '2DoF Model') +plot(freqs, abs(squeeze(freqresp(Gs_flex('da', 'u'), freqs, 'Hz'))), '-', ... + 'color', colors(2,:), 'DisplayName', 'Flex. Model') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_a/u$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +ylim([1e-8, 1e-3]); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; + +ax2a = nexttile; +hold on; +for i = 1:length(strut_nums) + plot(f, 180/pi*angle(int_frf(:, i)), 'color', [0,0,0,0.2]); +end +plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_2dof('da', 'u'), freqs, 'Hz'))), '-', 'color', colors(1,:)) +plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_flex('da', 'u'), freqs, 'Hz'))), '-', 'color', colors(2,:)) +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); ylim([-180, 180]); + +linkaxes([ax1a,ax2a],'x'); +xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_struts_comp_frf_flexible_model_int.pdf', 'width', 400, 'height', 'tall'); +#+end_src + +#+begin_src matlab :exports none +%% Compare the FRF and identified dynamics from u to Vs and da +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1a = nexttile([2,1]); +hold on; +plot(f, abs(enc_frf(:, 1)), 'color', [0,0,0,0.2], ... + 'DisplayName', 'FRF'); +for i = 2:length(strut_nums) + plot(f, abs(enc_frf(:, i)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); +end +plot(freqs, abs(squeeze(freqresp(Gs_2dof('de', 'u'), freqs, 'Hz'))), '-', ... + 'color', colors(1,:), 'DisplayName', '2DoF Model') +plot(freqs, abs(squeeze(freqresp(Gs_flex('de', 'u'), freqs, 'Hz'))), '-', ... + 'color', colors(2,:), 'DisplayName', 'Flex. Model') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +ylim([1e-8, 1e-3]); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; + +ax2a = nexttile; +hold on; +for i = 1:length(strut_nums) + plot(f, 180/pi*angle(enc_frf(:, i)), 'color', [0,0,0,0.2]); +end +plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_2dof('de', 'u'), freqs, 'Hz'))), '-', 'color', colors(1,:)) +plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_flex('de', 'u'), freqs, 'Hz'))), '-', 'color', colors(2,:)) +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); ylim([-180, 180]); + +linkaxes([ax1a,ax2a],'x'); +xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_struts_comp_frf_flexible_model_enc.pdf', 'width', 400, 'height', 'tall'); +#+end_src + +#+begin_src matlab :exports none +%% Compare the FRF and identified dynamics from u to Vs and da +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1a = nexttile([2,1]); +hold on; +plot(f, abs(iff_frf(:, i)), 'color', [0,0,0,0.2], ... + 'DisplayName', 'FRF'); +for i = 1:length(strut_nums) + plot(f, abs(iff_frf(:, i)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); +end +plot(freqs, abs(squeeze(freqresp(Gs_2dof('Vs', 'u'), freqs, 'Hz'))), '-', ... + 'color', colors(1,:), 'DisplayName', '2DoF Model') +plot(freqs, abs(squeeze(freqresp(Gs_flex('Vs', 'u'), freqs, 'Hz'))), '-', ... + 'color', colors(2,:), 'DisplayName', 'Flex. Model') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $V_s/u$ [V/V]'); set(gca, 'XTickLabel',[]); +hold off; +ylim([1e-2, 1e2]); +leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; + +ax2a = nexttile; +hold on; +for i = 1:length(strut_nums) + plot(f, 180/pi*angle(iff_frf(:, i)), 'color', [0,0,0,0.2]); +end +set(gca,'ColorOrderIndex',1); +plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_2dof('Vs', 'u'), freqs, 'Hz'))), '-', 'color', colors(1,:)) +plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_flex('Vs', 'u'), freqs, 'Hz'))), '-', 'color', colors(2,:)) +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); ylim([-180, 180]); + +linkaxes([ax1a,ax2a],'x'); +xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_struts_comp_frf_flexible_model_iff.pdf', 'width', 400, 'height', 'tall'); +#+end_src + +#+name: fig:test_struts_comp_frf_flexible_model +#+caption: Comparison of the measured frequency response functions, the Simscape model using the 2 DoF APA model, and using the "flexible" APA300ML model (Super-Element extracted from a Finite Element Model). +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_frf_flexible_model_int}$u$ to $d_a$} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.9\linewidth +[[file:figs/test_struts_comp_frf_flexible_model_int.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_frf_flexible_model_enc}$u$ to $d_e$} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.9\linewidth +[[file:figs/test_struts_comp_frf_flexible_model_enc.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_comp_frf_flexible_model_iff}$u$ to $V_s$} +#+attr_latex: :options {0.33\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.9\linewidth +[[file:figs/test_struts_comp_frf_flexible_model_iff.png]] +#+end_subfigure +#+end_figure + +** Effect of strut misalignment +<> + +As shown in Figure ref:fig:test_struts_comp_enc_plants, the identified dynamics from DAC voltage $u$ to encoder measured displacement $d_e$ are very different from one strut to the other. +In this section, it is investigated whether poor alignment of the strut (flexible joints with respect to the APA) can explain such dynamics. +For instance, consider Figure ref:fig:test_struts_misalign_schematic where there is a misalignment in the $y$ direction between the two flexible joints (well aligned thanks to the mounting procedure in Section ref:sec:test_struts_mounting) and the APA300ML. +In this case, the "x-bending" mode at 200Hz (see Figure ref:fig:test_struts_meas_x_bending) can be expected to have greater impact on the dynamics from the actuator to the encoder. + +#+name: fig:test_struts_misalign_schematic +#+caption: Mis-alignement between the joints and the APA +#+attr_latex: :width 0.8\linewidth +[[file:figs/test_struts_misalign_schematic.png]] + +To verify this assumption, the dynamics from the output DAC voltage $u$ to the measured displacement by the encoder $d_e$ is computed using the flexible APA Simscape model for several misalignments in the $y$ direction. +The obtained dynamics are shown in Figure ref:fig:test_struts_effect_misalignment_y. +The alignment of the APA with the flexible joints has a large influence on the dynamics from actuator voltage to the measured displacement by the encoder. +The misalignment in the $y$ direction mostly influences: +- the presence of the flexible mode at 200Hz (see mode shape in Figure ref:fig:test_struts_mode_shapes_1) +- the location of the complex conjugate zero between the first two resonances: + - if $d_{y} < 0$: there is no zero between the two resonances and possibly not even between the second and third resonances + - if $d_{y} > 0$: there is a complex conjugate zero between the first two resonances +- the location of the high frequency complex conjugate zeros at 500Hz (secondary effect, as the axial stiffness of the joint also has large effect on the position of this zero) + +The same can be done for misalignments in the $x$ direction. +The obtained dynamics (Figure ref:fig:test_struts_effect_misalignment_x) are showing that misalignment in the $x$ direction mostly influences the presence of the flexible mode at 300Hz (see mode shape in Figure ref:fig:test_struts_mode_shapes_2). + +A comparison of the experimental frequency response functions in Figure ref:fig:test_struts_comp_enc_plants with the model dynamics for several $y$ misalignments in Figure ref:fig:test_struts_effect_misalignment_y indicates a clear similarity. +This similarity suggests that the identified differences in dynamics are caused by misalignment. + +#+begin_src matlab +%% Effect of a misalignment in Y-Direction +% Considered misalignment in the Y direction +dy_aligns = [-0.5, -0.1, 0.1, 0.5]*1e-3; % [m] + +% Transfer functions from u to de for all the misalignment in y direction +Gs_dy_align = {zeros(length(dy_aligns), 1)}; + +for i = 1:length(dy_aligns) + n_hexapod.actuator = initializeAPA('type', 'flexible', 'd_align_bot', [0; dy_aligns(i); 0], 'd_align_top', [0; dy_aligns(i); 0]); + + G = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); + G.InputName = {'u'}; + G.OutputName = {'Vs', 'de', 'da'}; + + Gs_dy_align(i) = {G}; +end + +%% Effect of a misalignment in X-Direction +% Considered misalignment in the X direction +dx_aligns = [-0.1, -0.05, 0.05, 0.1]*1e-3; % [m] + +% Transfer functions from u to de for all the misalignment in x direction +Gs_dx_align = {zeros(length(dx_aligns), 1)}; + +for i = 1:length(dx_aligns) + n_hexapod.actuator = initializeAPA('type', 'flexible', 'd_align_bot', [dx_aligns(i); 0; 0], 'd_align_top', [dx_aligns(i); 0; 0]); + + G = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); + G.InputName = {'u'}; + G.OutputName = {'Vs', 'de', 'da'}; + + Gs_dx_align(i) = {G}; +end +#+end_src + +#+begin_src matlab :exports none +%% Transfer function from Vs to de - effect of x-misalignment +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:length(dy_aligns) + plot(freqs, abs(squeeze(freqresp(Gs_dy_align{i}('de', 'u'), freqs, 'Hz'))), ... + 'DisplayName', sprintf('$d_y = %.1f$ [mm]', 1e3*dy_aligns(i))); +end +plot(freqs, abs(squeeze(freqresp(Gs_flex('de', 'u'), freqs, 'Hz'))), 'k-', ... + 'DisplayName', 'aligned'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +ylim([1e-8, 1e-3]); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; + +ax2 = nexttile; +hold on; +for i = 1:length(dy_aligns) + plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_dy_align{i}('de', 'u'), freqs, 'Hz')))); +end +plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_flex('de', 'u'), freqs, 'Hz'))), 'k-'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_struts_effect_misalignment_y.pdf', 'width', 'half', 'height', 'tall'); +#+end_src + +#+begin_src matlab :exports none +%% Transfer function from Vs to de - effect of x-misalignment +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:length(dx_aligns) + plot(freqs, abs(squeeze(freqresp(Gs_dx_align{i}('de', 'u'), freqs, 'Hz'))), ... + 'DisplayName', sprintf('$d_x = %.1f$ [mm]', 1e3*dx_aligns(i))); +end +plot(freqs, abs(squeeze(freqresp(Gs_flex('de', 'u'), freqs, 'Hz'))), 'k-', ... + 'DisplayName', 'aligned'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_e/u$ [m/V]'); set(gca, 'XTickLabel',[]); +hold off; +ylim([1e-8, 1e-3]); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; + +ax2 = nexttile; +hold on; +for i = 1:length(dx_aligns) + plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_dx_align{i}('de', 'u'), freqs, 'Hz')))); +end +plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_flex('de', 'u'), freqs, 'Hz'))), 'k-'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 2e3]); +xticks([1e1, 1e2, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_struts_effect_misalignment_x.pdf', 'width', 'half', 'height', 'tall'); +#+end_src + +#+name: fig:test_struts_effect_misalignment +#+caption: Effect of a misalignment between the flexible joints and the APA300ML in the $y$ direction (\subref{fig:test_struts_effect_misalignment_y}) and in the $x$ direction (\subref{fig:test_struts_effect_misalignment_x}) +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_effect_misalignment_y}Misalignment along $y$} +#+attr_latex: :options {0.49\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/test_struts_effect_misalignment_y.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_struts_effect_misalignment_x}Misalignment along $x$} +#+attr_latex: :options {0.49\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/test_struts_effect_misalignment_x.png]] +#+end_subfigure +#+end_figure + +** Measured strut misalignment +<> + +During the initial mounting of the struts, as presented in Section ref:sec:test_struts_mounting, the positioning pins that were used to position the APA with respect to the flexible joints in the $y$ directions were not used (not received at the time). +Therefore, large $y$ misalignments are expected. + +To estimate the misalignments between the two flexible joints and the APA: +- the struts were fixed horizontally on the mounting bench, as shown in Figure ref:fig:test_struts_mounting_step_3 but without the encoder +- using a length gauge[fn:2], the height difference between the flexible joints surface and the APA shell surface was measured for both the top and bottom joints and for both sides +- as the thickness of the flexible joint is $21\,mm$ and the thickness of the APA shell is $20\,mm$, $0.5\,mm$ of height difference should be measured if the two are perfectly aligned + +Large variations in the $y$ misalignment are found from one strut to the other (results are summarized in Table ref:tab:test_struts_meas_y_misalignment). + +To check the validity of the measurement, it can be verified that the sum of the measured thickness difference on each side is $1\,mm$ (equal to the thickness difference between the flexible joint and the APA). +Thickness differences for all the struts were found to be between $0.94\,mm$ and $1.00\,mm$ which indicate low errors compared to the misalignments found in Table ref:tab:test_struts_meas_y_misalignment. + +#+begin_src matlab +%% Measurement of the y misalignment between the APA and the flexible joints +% Mesured struts +strut_nums = [1, 2, 3, 4, 5]; + +% Measured height differences in [mm] +% R ("red" side), B ("black" side) +% R Top B Top R Bot B Bot +strut_align = [[-0.40, -0.60, -0.16, -0.82] % Strut 1 + [-0.67, -0.30, -0.34, -0.63] % Strut 2 + [-0.07, -0.88, -0.16, -0.79] % Strut 3 + [-0.48, -0.46, 0.07, -1.00] % Strut 4 + [-0.33, -0.64, -0.48, -0.52]]; % Strut 5 + +% Verification that the thickness difference between the APA shell and the flexible joints is 1mm +thichness_diff_top = strut_align(:,1) + strut_align(:,2); % [mm] +thichness_diff_bot = strut_align(:,1) + strut_align(:,2); % [mm] + +% Estimation of the dy misalignment +dy_bot = (strut_align(:,1) - strut_align(:,2))/2; % [mm] +dy_top = (strut_align(:,3) - strut_align(:,4))/2; % [mm] +#+end_src + +#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) +data2orgtable([dy_bot, dy_top] , {'1', '2', '3', '4', '5'}, {'*Strut*', '*Bot*', '*Top*'}, ' %.2f '); +#+end_src + +#+name: tab:test_struts_meas_y_misalignment +#+caption: Measured $y$ misalignment at the top and bottom of the APA. Measurements are in $mm$ +#+attr_latex: :environment tabularx :width 0.25\linewidth :align ccc +#+attr_latex: :center t :booktabs t +#+RESULTS: +| *Strut* | *Bot* | *Top* | +|---------+-------+-------| +| 1 | 0.1 | 0.33 | +| 2 | -0.19 | 0.14 | +| 3 | 0.41 | 0.32 | +| 4 | -0.01 | 0.54 | +| 5 | 0.15 | 0.02 | + +By using the measured $y$ misalignment in the Simscape model with the flexible APA model, the model dynamics from $u$ to $d_e$ is closer to the measured dynamics, as shown in Figure ref:fig:test_struts_comp_dy_tuned_model_frf_enc. +A better match in the dynamics can be obtained by fine-tuning both the $x$ and $y$ misalignments (yellow curves in Figure ref:fig:test_struts_comp_dy_tuned_model_frf_enc). + +This confirms that misalignment between the APA and the strut axis (determined by the two flexible joints) is critical and inducing large variations in the dynamics from DAC voltage $u$ to encoder measured displacement $d_e$. +If encoders are fixed to the struts, the APA and flexible joints must be precisely aligned when mounting the struts. + +In the next section, the struts are re-assembled with a "positioning pin" to better align the APA with the flexible joints. +With a better alignment, the amplitude of the spurious resonances is expected to decrease, as shown in Figure ref:fig:test_struts_effect_misalignment_y. + +#+begin_src matlab +%% Idenfity the dynamics from u to de - misalignement estimated from measurement +Gs_y_align = {zeros(size(strut_align,1), 1)}; + +% Measured dy alignment +strut_align = 1e-3*[[-0.60, -0.82, -0.40, -0.16] + [-0.30, -0.63, -0.67, -0.34] + [-0.88, -0.79, -0.07, -0.16] + [-0.48, 0.07, -0.46, -1.00] + [-0.33, -0.48, -0.64, -0.52] + [-0.34, -0.42, -0.63, -0.57]]; + +for i = 1:size(strut_align,1) + n_hexapod.actuator = initializeAPA('type', 'flexible', ... + 'd_align_bot', [0; strut_align(i, 2) - strut_align(i, 4); 0], ... + 'd_align_top', [0; strut_align(i, 1) - strut_align(i, 3); 0]); + + G = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); + G.InputName = {'u'}; + G.OutputName = {'Vs', 'de', 'da'}; + + Gs_y_align(i) = {G}; +end + +%% Idenfity the dynamics from u to de - misalignement tuned to have the best match +d_aligns = [[-0.05, -0.3, 0]; + [ 0, 0.5, 0]; + [-0.1, -0.3, 0]; + [ 0, 0.3, 0]; + [-0.05, 0.05, 0]]'*1e-3; + +% Idenfity the transfer function from actuator to encoder for all cases +Gs_xy_align = {zeros(size(d_aligns,2), 1)}; + +for i = 1:5 + n_hexapod.actuator = initializeAPA('type', 'flexible', 'd_align_top', d_aligns(:,i), 'd_align_bot', d_aligns(:,i)); + + G = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts); + G.InputName = {'u'}; + G.OutputName = {'Vs', 'de', 'da'}; + + Gs_xy_align(i) = {G}; +end +#+end_src + +#+begin_src matlab :exports none +%% Comparison of the plants (encoder output) when tuning the misalignment +figure; +tiledlayout(1, 3, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile(); +hold on; +plot(f, abs(enc_frf(:, 1)), 'DisplayName', 'Measurement'); +plot(freqs, abs(squeeze(freqresp(Gs_y_align{1}('de', 'u'), freqs, 'Hz'))), ... + 'DisplayName', '$d_y$ from meas'); +plot(freqs, abs(squeeze(freqresp(Gs_xy_align{1}('de', 'u'), freqs, 'Hz'))), ... + 'DisplayName', 'Tuned $d_x$, $d_y$'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Amplitude [m/V]'); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +title('Strut 1'); +xticks([1e1, 1e2, 1e3]); + +ax2 = nexttile(); +hold on; +plot(f, abs(enc_frf(:, 2)), 'DisplayName', 'Measurement'); +plot(freqs, abs(squeeze(freqresp(Gs_y_align{2}('de', 'u'), freqs, 'Hz'))), ... + 'DisplayName', '$d_y$ from meas'); +plot(freqs, abs(squeeze(freqresp(Gs_xy_align{2}('de', 'u'), freqs, 'Hz'))), ... + 'DisplayName', 'Tuned $d_x$, $d_y$'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +title('Strut 2'); +xticks([1e1, 1e2, 1e3]); + +ax3 = nexttile(); +hold on; +plot(f, abs(enc_frf(:, 3)), 'DisplayName', 'Measuremnet'); +plot(freqs, abs(squeeze(freqresp(Gs_y_align{3}('de', 'u'), freqs, 'Hz'))), ... + 'DisplayName', '$d_y$ from meas'); +plot(freqs, abs(squeeze(freqresp(Gs_xy_align{3}('de', 'u'), freqs, 'Hz'))), ... + 'DisplayName', 'Tuned $d_x$, $d_y$'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 15; +title('Strut 3'); +xticks([1e1, 1e2, 1e3]); + +linkaxes([ax1,ax2,ax3],'xy'); +xlim([10, 2e3]); ylim([1e-8, 1e-3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/test_struts_comp_dy_tuned_model_frf_enc.pdf', 'width', 'full', 'height', 'normal'); +#+end_src + +#+name: fig:test_struts_comp_dy_tuned_model_frf_enc +#+caption: Comparison of the frequency response functions from DAC voltage $u$ to measured displacement $d_e$ by the encoders for the three struts. In blue, the measured dynamics is represted, in red the dynamics extracted from the model with the $y$ misalignment estimated from measurements, and in yellow, the dynamics extracted from the model when both the $x$ and $y$ misalignments are tuned +#+RESULTS: +[[file:figs/test_struts_comp_dy_tuned_model_frf_enc.png]] + +** Proper struts alignment +<> + +After receiving the positioning pins, the struts were mounted again with the positioning pins. +This should improve the alignment of the APA with the two flexible joints. + +The alignment is then estimated using a length gauge, as described in the previous sections. +Measured $y$ alignments are summarized in Table ref:tab:test_struts_meas_y_misalignment_with_pin and are found to be bellow $55\mu m$ for all the struts, which is much better than before (see Table ref:tab:test_struts_meas_y_misalignment). + +#+begin_src matlab +%% Measurement of the y misalignment between the APA and the flexible joints after strut better alignment + +% Numbers of the measured legs +strut_align_nums = [1 2 3 4 5 6]; + +% Measured height differences in [mm] +% R ("red" side), B ("black" side) +% R Top B Top R Bot B Bot +strut_align = [[-0.54, -0.50, -0.50, -0.52] % strut 1 + [-0.44, -0.55, -0.49, -0.49] % strut 2 + [-0.48, -0.50, -0.50, -0.46] % strut 3 + [-0.45, -0.51, -0.51, -0.45] % strut 4 + [-0.50, -0.50, -0.50, -0.50] % strut 5 + [-0.50, -0.49, -0.43, -0.54]]; % strut 6 + +% Verification that the thickness difference between the APA shell and the flexible joints is 1mm +thichness_diff_top = strut_align(:,1) + strut_align(:,2); % [mm] +thichness_diff_bot = strut_align(:,1) + strut_align(:,2); % [mm] + +% Estimation of the dy misalignment +dy_bot = (strut_align(:,1) - strut_align(:,2))/2; % [mm] +dy_top = (strut_align(:,3) - strut_align(:,4))/2; % [mm] +#+end_src + +#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) +data2orgtable([dy_bot, dy_top] , {'1', '2', '3', '4', '5', '6'}, {'*Strut*', '*Bot*', '*Top*'}, ' %.3f '); +#+end_src + +#+name: tab:test_struts_meas_y_misalignment_with_pin +#+caption: Measured $y$ misalignment at the top and bottom of the APA after realigning the struts using a positioning pin. Measurements are in $mm$. +#+attr_latex: :environment tabularx :width 0.25\linewidth :align ccc +#+attr_latex: :center t :booktabs t +#+RESULTS: +| *Strut* | *Bot* | *Top* | +|---------+--------+-------| +| 1 | -0.02 | 0.01 | +| 2 | 0.055 | 0.0 | +| 3 | 0.01 | -0.02 | +| 4 | 0.03 | -0.03 | +| 5 | 0.0 | 0.0 | +| 6 | -0.005 | 0.055 | + +The dynamics of the re-aligned struts were then measured on the same test bench (Figure ref:fig:test_struts_bench_leg). +A comparison of the initial strut dynamics and the dynamics of the re-aligned struts (i.e. with the positioning pin) is presented in Figure ref:fig:test_struts_comp_enc_frf_realign. +Even though the struts are now much better aligned, not much improvement can be observed. +The dynamics of the six aligned struts were also quite different from one another. + +The fact that the encoders are fixed to the struts makes the control more challenging. +Therefore, fixing the encoders to the nano-hexapod plates instead may be an interesting option. + +#+begin_src matlab +%% New dynamical identified with re-aligned struts +% Load the identification data +leg_noise = {}; +for i = 1:length(strut_align_nums) + leg_noise(i) = {load(sprintf('frf_struts_align_%i_noise.mat', strut_align_nums(i)), 'u', 'Vs', 'de')}; +end + +% Parameters for Frequency Analysis +Ts = 1e-4; % Sampling Time [s] +Nfft = floor(1/Ts); % Number of points for the FFT computation +win = hanning(Nfft); % Hanning window +Noverlap = floor(Nfft/2); % Overlap between frequency analysis + +% Only used to have the frequency vector "f" +[~, f] = tfestimate(leg_noise{1}.u, leg_noise{1}.de, win, Noverlap, Nfft, 1/Ts); + +% Transfer function from u to de (encoder) +enc_frf_aligned = zeros(length(f), length(strut_align_nums)); + +for i = 1:length(strut_align_nums) + enc_frf_aligned(:, i) = tfestimate(leg_noise{i}.u, leg_noise{i}.de, win, Noverlap, Nfft, 1/Ts); +end +#+end_src + +#+begin_src matlab :exports none +%% Bode plot of the FRF from u to de +figure; +hold on; +plot(f, abs(enc_frf(:, 1)), 'color', [colors(1,:), 0.5], ... + 'DisplayName', 'Initial alignment'); +for i = 1:length(strut_nums) + plot(f, abs(enc_frf(:, i)), 'color', [colors(1,:), 0.5], ... + 'HandleVisibility', 'off'); +end +plot(f, abs(enc_frf_aligned(:, 1)), 'color', [colors(2,:), 0.5], ... + 'DisplayName', 'With positioning pin'); +for i = 1:length(strut_align_nums) + plot(f, abs(enc_frf_aligned(:, i)), 'color', [colors(2,:), 0.5], ... + 'HandleVisibility', 'off'); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Amplitude $d_e/u$ [m/V]'); +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1); +xlim([10, 2e3]); +ylim([1e-8, 1e-3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/test_struts_comp_enc_frf_realign.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_struts_comp_enc_frf_realign +#+caption: Comparison of the dynamics from $u$ to $d_e$ before and after proper alignment using the dowel pins +#+RESULTS: +[[file:figs/test_struts_comp_enc_frf_realign.png]] + * Conclusion <> -* Bibliography :ignore: -#+latex: \printbibliography[heading=bibintoc,title={Bibliography}] +The Hano-Hexapod struts are a key component of the developed acrfull:nass. +A mounting bench was used to obtain struts with good interface coaxiality, equal lengths, and ideally the same dynamics. +Using a test bench, it was found that while all the mounted struts had extremely similar dynamics when considering the axial motion and the integrated force sensor, the dynamics as seen by the encoder is much more complex and varied from one strut to the other. + +Thanks to a acrshort:fem and experimental measurements, the modes inducing this complex dynamics was identified. +The variability in the dynamics was attributed to the poor alignment of the acrshort:apa with respect to the flexible joints. +Even with better alignment using dowel pins, the observed dynamics by the encoder remained problematic. +Therefore, the encoders will be fixed directly to the nano-hexapod plates rather than being fixed to the struts. + +* Glossary :ignore: +[[printglossaries:]] + +# #+latex: \printglossary[type=\acronymtype] +# #+latex: \printglossary[type=\glossarytype] +# #+latex: \printglossary * Helping Functions :noexport: ** Initialize Path @@ -2299,9 +2288,10 @@ actuator.cs = args.cs; % Damping of one stack [N/m] * Footnotes +[fn:7] OFV-3001 controller and OFV512 sensor head from Polytec [fn:6] Vionic from Renishaw -[fn:5] The APA300ML from Cedrat Technologies +[fn:5] APA300ML from Cedrat Technologies [fn:4] Two fiber intereferometers were used: an IDS3010 from Attocube and a quDIS from QuTools -[fn:3] Using Ansys\textsuperscript{\textregistered}. Flexible Joints and APA Shell material is stainless steel =1.4542=. Encoder and ruler support material is aluminium. +[fn:3] Using Ansys\textsuperscript{\textregistered}. Flexible Joints and APA Shell are made of a stainless steel allow called /17-4 PH/. Encoder and ruler support material is aluminium. [fn:2] Heidenhain MT25, specified accuracy of $\pm 0.5\,\mu m$ [fn:1] Faro Arm Platinum 4ft, specified accuracy of $\pm 13\mu m$ diff --git a/test-bench-struts.pdf b/test-bench-struts.pdf index 2d75468..1ba3bba 100644 Binary files a/test-bench-struts.pdf and b/test-bench-struts.pdf differ diff --git a/test-bench-struts.tex b/test-bench-struts.tex index 133f1bb..81a2075 100644 --- a/test-bench-struts.tex +++ b/test-bench-struts.tex @@ -1,9 +1,13 @@ -% Created 2024-04-08 Mon 09:55 +% Created 2024-10-25 Fri 17:22 % Intended LaTeX compiler: pdflatex \documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt} \input{preamble.tex} -\bibliography{test-bench-struts.bib} +\newacronym{nass}{NASS}{Nano Active Stabilization System} +\newacronym{fem}{FEM}{Finite Element Model} +\newacronym{apa}{APA}{Amplified Piezoelectric Actuator} +\newacronym{dac}{DAC}{Digital to Analog Converter} +\input{preamble_extra.tex} \author{Dehaeze Thomas} \date{\today} \title{Test Bench - Nano-Hexapod Struts} @@ -12,7 +16,7 @@ pdftitle={Test Bench - Nano-Hexapod Struts}, pdfkeywords={}, pdfsubject={}, - pdfcreator={Emacs 29.3 (Org mode 9.7)}, + pdfcreator={Emacs 29.4 (Org mode 9.6)}, pdflang={English}} \usepackage{biblatex} @@ -22,12 +26,8 @@ \tableofcontents \clearpage -The Nano-Hexapod struts (shown in Figure \ref{fig:test_struts_picture_strut}) each consists of: -\begin{itemize} -\item Two flexible joints that are fixed at the two ends of the strut -\item One Amplified Piezoelectric Actuator (APA300ML) -\item One encoder (Renishaw Vionic) -\end{itemize} + +The Nano-Hexapod struts (shown in Figure \ref{fig:test_struts_picture_strut}) are composed of two flexible joints that are fixed at the two ends of the strut, one \acrfull{apa}\footnote{APA300ML from Cedrat Technologies} and one optical encoder\footnote{Vionic from Renishaw}. \begin{figure}[htbp] \centering @@ -35,50 +35,39 @@ The Nano-Hexapod struts (shown in Figure \ref{fig:test_struts_picture_strut}) ea \caption{\label{fig:test_struts_picture_strut}One strut including two flexible joints, an amplified piezoelectric actuator and an encoder} \end{figure} -Now that all the strut elements have been individually characterized (see previous sections), the struts can be assembled. +After the strut elements have been individually characterized (see previous sections), the struts are assembled. The mounting procedure of the struts is explained in Section \ref{sec:test_struts_mounting}. -A mounting bench is used to ensure the coaxiality between the two ends of the struts. -This way, no angular stroke is lost when mounted to the nano-hexapod. +A mounting bench was used to ensure coaxiality between the two ends of the struts. +In this way, no angular stroke is lost when mounted to the nano-hexapod. -Then the flexible modes of the struts are experimentally measured and compared with a finite element model (Section \ref{sec:test_struts_flexible_modes}). +The flexible modes of the struts were then experimentally measured and compared with a finite element model (Section \ref{sec:test_struts_flexible_modes}). -Dynamical measurements on the strut are performed with the same bench used to characterize the APA300ML dynamics in Section \ref{sec:test_struts_dynamical_meas}. -It is found that the dynamics from DAC voltage to the displacement measured by the encoder is complex due to the flexible modes of the struts found in Section \ref{sec:test_struts_flexible_modes}. +Dynamic measurements of the strut are performed with the same test bench used to characterize the APA300ML dynamics (Section \ref{sec:test_struts_dynamical_meas}). +It was found that the dynamics from the \acrshort{dac} voltage to the displacement measured by the encoder is complex due to the flexible modes of the struts (Section \ref{sec:test_struts_flexible_modes}). + +The strut models were then compared with the measured dynamics (Section \ref{sec:test_struts_simscape}). +The model dynamics from the \acrshort{dac} voltage to the axial motion of the strut (measured by an interferometer) and to the force sensor voltage well match the experimental results. +However, this is not the case for the dynamics from \acrshort{dac} voltage to the encoder displacement. +It is found that the complex dynamics is due to a misalignment between the flexible joints and the \acrshort{apa}. -The models of the struts are then compared with the measured dynamics (Section \ref{sec:test_struts_simscape}). -The model dynamics from the DAC voltage to the axial motion of the strut (measured by an interferometer) and to the force sensor voltage are matching well the experiment. -However, this is not the case for the dynamics from DAC voltage to encoder displacement. -It is found that the complex dynamics is due to a misalignment between the flexible joints and the APA. -\begin{table}[htbp] -\caption{\label{tab:test_struts_section_matlab_code}Report sections and corresponding Matlab files} -\centering -\begin{tabularx}{0.6\linewidth}{lX} -\toprule -\textbf{Sections} & \textbf{Matlab File}\\ -\midrule -Section \ref{sec:test_struts_flexible_modes} & \texttt{test\_struts\_1\_flexible\_modes.m}\\ -Section \ref{sec:test_struts_dynamical_meas} & \texttt{test\_struts\_2\_dynamical\_meas.m}\\ -Section \ref{sec:test_struts_simscape} & \texttt{test\_struts\_3\_simscape\_model.m}\\ -\bottomrule -\end{tabularx} -\end{table} \chapter{Mounting Procedure} \label{sec:test_struts_mounting} -A mounting bench has been develop to ensure: +A mounting bench was developed to ensure: \begin{itemize} -\item Good coaxial alignment between the interfaces (cylinders) of the flexible joints to minimize the angular stroke lost during their integration into the nano-hexapod +\item Good coaxial alignment between the interfaces (cylinders) of the flexible joints. +This is important not to loose to much angular stroke during their mounting into the nano-hexapod \item Uniform length across all struts \item Precise alignment of the APA with the two flexible joints -\item The assembly is reproducible and consistent from one strut to the other +\item Reproducible and consistent assembly between all struts \end{itemize} \section{Mounting Bench} A CAD view of the mounting bench is shown in Figure \ref{fig:test_struts_mounting_bench_first_concept}. -It consists of a ``main frame'' (Figure \ref{fig:test_struts_mounting_step_0}) precisely machined to ensure both the correct strut length and strut coaxiality. -The coaxiality is ensured by having good flatness (specified at \(20\,\mu m\)) between surfaces A and B, and between surfaces C and D. -Such flatness has been checked using a Faro arm\footnote{Faro Arm Platinum 4ft, specified accuracy of \(\pm 13\mu m\)} (see Figure \ref{fig:test_struts_check_dimensions_bench}) and was found to comply with the requirements. -The strut length (defined by the distance between the rotation points of the two flexible joints) is ensured by using precisely machines dowel holes. +It consists of a ``main frame'' (Figure \ref{fig:test_struts_mounting_step_0}) precisely machined to ensure both correct strut length and strut coaxiality. +The coaxiality is ensured by good flatness (specified at \(20\,\mu m\)) between surfaces A and B and between surfaces C and D. +Such flatness was checked using a Faro arm\footnote{Faro Arm Platinum 4ft, specified accuracy of \(\pm 13\mu m\)} (see Figure \ref{fig:test_struts_check_dimensions_bench}) and was found to comply with the requirements. +The strut length (defined by the distance between the rotation points of the two flexible joints) was ensured by using precisely machines dowel holes. \begin{figure}[htbp] @@ -90,7 +79,7 @@ The strut length (defined by the distance between the rotation points of the two \end{subfigure} \begin{subfigure}{0.49\textwidth} \begin{center} -\includegraphics[scale=1,width=\linewidth]{figs/test_struts_mounting_overview-crop.jpg} +\includegraphics[scale=1,width=\linewidth]{figs/test_struts_mounting_overview.jpg} \end{center} \subcaption{\label{fig:test_struts_mounting_overview}Exploded view} \end{subfigure} @@ -110,11 +99,11 @@ The strut length (defined by the distance between the rotation points of the two \end{center} \subcaption{\label{fig:test_struts_check_dimensions_bench}Dimensional check} \end{subfigure} -\caption{\label{fig:test_struts_mounting_base_part}Main element of the mounting bench for the struts that ensure good coaxility of the two flexible joints as well as the length of the struts.} +\caption{\label{fig:test_struts_mounting_base_part}Main element of the mounting bench for the struts that ensure good coaxiality of the two flexible joints and correct struts length.} \end{figure} -The flexible joints are not directly fixed to the mounting bench but to to a cylindrical ``sleeve'' shown in Figures \ref{fig:test_struts_cylindrical_mounting_part_top} and \ref{fig:test_struts_cylindrical_mounting_part_bot}. -The goal of these ``sleeves'' is to avoid any mechanical stress that could damage the flexible joints during the mounting procedure. +The flexible joints were not directly fixed to the mounting bench but were fixed to a cylindrical ``sleeve'' shown in Figures \ref{fig:test_struts_cylindrical_mounting_part_top} and \ref{fig:test_struts_cylindrical_mounting_part_bot}. +The goal of these ``sleeves'' is to avoid mechanical stress that could damage the flexible joints during the mounting process. These ``sleeves'' have one dowel groove (that are fitted to the dowel holes shown in Figure \ref{fig:test_struts_mounting_step_0}) that will determine the length of the mounted strut. \begin{figure}[htbp] @@ -138,19 +127,20 @@ These ``sleeves'' have one dowel groove (that are fitted to the dowel holes show \end{subfigure} \caption{\label{fig:test_struts_cylindrical_mounting}Preparation of the flexible joints by fixing them in their cylindrical ``sleeve''} \end{figure} + \section{Mounting Procedure} -The ``sleeves'' are mounted to the main element as shown in Figure \ref{fig:test_struts_mounting_step_0}. -The left sleeve has a thigh fit such that its orientation is fixed (it is roughly aligned horizontally) while the right sleeve has a loose fit such that it can rotate (it will get the same orientation as the fixed one when tightening the screws). +The ``sleeves'' were mounted to the main element as shown in Figure \ref{fig:test_struts_mounting_step_0}. +The left sleeve has a thigh fit such that its orientation is fixed (it is roughly aligned horizontally), while the right sleeve has a loose fit such that it can rotate (it will get the same orientation as the fixed one when tightening the screws). -Then the cylindrical washers and the APA300ML are stacked on top of the flexible joints as shown in Figure \ref{fig:test_struts_mounting_step_2} and screwed together using a torque screwdriver. +The cylindrical washers and the APA300ML are stacked on top of the flexible joints, as shown in Figure \ref{fig:test_struts_mounting_step_2} and screwed together using a torque screwdriver. A dowel pin is used to laterally align the APA300ML with the flexible joints (see the dowel slot on the flexible joints in Figure \ref{fig:test_struts_mounting_joints}). -The two cylindrical washers are used to allow proper mounting even if the two APA interfaces are not parallel. +Two cylindrical washers are used to allow proper mounting even when the two APA interfaces are not parallel. -The encoder and ruler are then fixed to the strut and properly aligned as shown in Figure \ref{fig:test_struts_mounting_step_3}. +The encoder and ruler are then fixed to the strut and properly aligned, as shown in Figure \ref{fig:test_struts_mounting_step_3}. Finally, the strut can be disassembled from the mounting bench (Figure \ref{fig:test_struts_mounting_step_4}). -Thanks to this mounting procedure, coaxiality and length between the two flexible joint's interfaces can be obtained within the wanted tolerances. +Thanks to this mounting procedure, the coaxiality and length between the two flexible joint's interfaces can be obtained within the desired tolerances. \begin{figure}[htbp] \begin{subfigure}{0.5\textwidth} @@ -181,68 +171,70 @@ Thanks to this mounting procedure, coaxiality and length between the two flexibl \end{subfigure} \caption{\label{fig:test_struts_mounting_steps}Steps for mounting the struts.} \end{figure} + \chapter{Measurement of flexible modes} \label{sec:test_struts_flexible_modes} \section{Introduction} -A Finite Element Model\footnote{Using Ansys\textsuperscript{\textregistered}. Flexible Joints and APA Shell material is stainless steel \texttt{1.4542}. Encoder and ruler support material is aluminium.} of the struts is developed and is used to estimate the flexible modes. -Inertia of the encoder (estimated at \(15\,g\)) is taken into account. -The two cylindrical interfaces are fixed, and the first three flexible modes are computed. -The modes shapes are displayed in Figure \ref{fig:test_struts_mode_shapes}: an ``X-bending'' mode at 189Hz, a ``Y-bending'' mode at 285Hz and a ``Z-torsion'' mode at 400Hz. +A Finite Element Model\footnote{Using Ansys\textsuperscript{\textregistered}. Flexible Joints and APA Shell are made of a stainless steel allow called \emph{17-4 PH}. Encoder and ruler support material is aluminium.} of the struts is developed and is used to estimate the flexible modes. +The inertia of the encoder (estimated at \(15\,g\)) is considered. +The two cylindrical interfaces were fixed, and the first three flexible modes were computed. +The mode shapes are displayed in Figure \ref{fig:test_struts_mode_shapes}: an ``X-bending'' mode at 189Hz, a ``Y-bending'' mode at 285Hz and a ``Z-torsion'' mode at 400Hz. \begin{figure}[htbp] \begin{subfigure}{0.33\textwidth} \begin{center} -\includegraphics[scale=1,width=0.9\linewidth]{figs/test_struts_mode_shapes_1.png} +\includegraphics[scale=1,width=0.85\linewidth]{figs/test_struts_mode_shapes_1.png} \end{center} \subcaption{\label{fig:test_struts_mode_shapes_1}X-bending mode (189Hz)} \end{subfigure} \begin{subfigure}{0.33\textwidth} \begin{center} -\includegraphics[scale=1,width=0.9\linewidth]{figs/test_struts_mode_shapes_2.png} +\includegraphics[scale=1,width=0.85\linewidth]{figs/test_struts_mode_shapes_2.png} \end{center} \subcaption{\label{fig:test_struts_mode_shapes_2}Y-bending mode (285Hz)} \end{subfigure} \begin{subfigure}{0.33\textwidth} \begin{center} -\includegraphics[scale=1,width=0.9\linewidth]{figs/test_struts_mode_shapes_3.png} +\includegraphics[scale=1,width=0.85\linewidth]{figs/test_struts_mode_shapes_3.png} \end{center} \subcaption{\label{fig:test_struts_mode_shapes_3}Z-torsion mode (400Hz)} \end{subfigure} \caption{\label{fig:test_struts_mode_shapes}Spurious resonances of the struts estimated from a Finite Element Model} \end{figure} + \section{Measurement Setup} -In order to experimentally measure these mode shapes, a Laser vibrometer is used to measure the difference of motion between two beam path (red points in Figure \ref{fig:test_struts_meas_modes}). -The strut is then excited with an instrumented hammer and the transfer function from the hammer to the measured rotation is computed. +To experimentally measure these mode shapes, a Laser vibrometer\footnote{OFV-3001 controller and OFV512 sensor head from Polytec} was used. +It measures the difference of motion between two beam path (red points in Figure \ref{fig:test_struts_meas_modes}). +The strut is then excited by an instrumented hammer, and the transfer function from the hammer to the measured rotation is computed. -The ``X-bending'' mode is measured as shown in Figure \ref{fig:test_struts_meas_x_bending}. -The ``Y-bending'' mode is measured as shown in Figure \ref{fig:test_struts_meas_y_bending}. -Finally, the ``Z-torsion'' is measured as shown in Figure \ref{fig:test_struts_meas_z_torsion}. - -This is done with and without the encoder fixed to the strut. +The setup used to measure the ``X-bending'' mode is shown in Figure \ref{fig:test_struts_meas_x_bending}. +The ``Y-bending'' mode is measured as shown in Figure \ref{fig:test_struts_meas_y_bending} and the ``Z-torsion'' measurement setup is shown in Figure \ref{fig:test_struts_meas_z_torsion}. +These tests were performed with and without the encoder being fixed to the strut. \begin{figure}[htbp] \begin{subfigure}{0.33\textwidth} \begin{center} -\includegraphics[scale=1,width=0.9\linewidth]{figs/test_struts_meas_x_bending.jpg} +\includegraphics[scale=1,width=0.85\linewidth]{figs/test_struts_meas_x_bending.jpg} \end{center} \subcaption{\label{fig:test_struts_meas_x_bending}X-bending mode} \end{subfigure} \begin{subfigure}{0.33\textwidth} \begin{center} -\includegraphics[scale=1,width=0.9\linewidth]{figs/test_struts_meas_y_bending.jpg} +\includegraphics[scale=1,width=0.85\linewidth]{figs/test_struts_meas_y_bending.jpg} \end{center} \subcaption{\label{fig:test_struts_meas_y_bending}Y-bending mode} \end{subfigure} \begin{subfigure}{0.33\textwidth} \begin{center} -\includegraphics[scale=1,width=0.9\linewidth]{figs/test_struts_meas_z_torsion.jpg} +\includegraphics[scale=1,width=0.85\linewidth]{figs/test_struts_meas_z_torsion.jpg} \end{center} \subcaption{\label{fig:test_struts_meas_z_torsion}Z-torsion mode} \end{subfigure} \caption{\label{fig:test_struts_meas_modes}Measurement of strut flexible modes} \end{figure} + \section{Measured results} The obtained frequency response functions for the three configurations (X-bending, Y-bending and Z-torsion) are shown in Figure \ref{fig:test_struts_spur_res_frf_no_enc} when the encoder is not fixed to the strut and in Figure \ref{fig:test_struts_spur_res_frf_enc} when the encoder is fixed to the strut. @@ -261,13 +253,11 @@ The obtained frequency response functions for the three configurations (X-bendin \end{subfigure} \caption{\label{fig:test_struts_spur_res_frf}Measured frequency response functions without the encoder \ref{fig:test_struts_spur_res_frf} and with the encoder \ref{fig:test_struts_spur_res_frf_enc}} \end{figure} -\section*{Conclusion} -Table \ref{tab:test_struts_spur_mode_freqs} summarizes the measured resonance frequencies as well as the computed ones using the Finite Element Model. -It is shown that: -\begin{itemize} -\item the resonance frequencies of the 3 modes are only slightly decreased when the encoder is fixed to the strut -\item the computed resonance frequencies from the FEM are very close to the measured one when the encoder is fixed to the strut -\end{itemize} + +Table \ref{tab:test_struts_spur_mode_freqs} summarizes the measured resonance frequencies and the computed ones using the \acrfull{fem}. +The resonance frequencies of the 3 modes are only slightly decreased when the encoder is fixed to the strut. +In addition, the computed resonance frequencies from the \acrshort{fem} are very close to the measured frequencies when the encoder is fixed to the strut. +This validates the quality of the \acrshort{fem}. \begin{table}[htbp] \caption{\label{tab:test_struts_spur_mode_freqs}Measured frequency of the flexible modes of the strut} @@ -282,9 +272,10 @@ Z-Torsion & 400Hz & 381Hz & 398Hz\\ \bottomrule \end{tabularx} \end{table} + \chapter{Dynamical measurements} \label{sec:test_struts_dynamical_meas} -In order to measure the dynamics of the strut, the same test bench used to measure the APA300ML dynamics is used. +In order to measure the dynamics of the strut, the test bench used to measure the APA300ML dynamics is being used again. The strut mounted on the bench is shown in Figure \ref{fig:test_struts_bench_leg_overview} A schematic of the bench and the associated signals are shown in Figure \ref{fig:test_struts_bench_schematic}. @@ -293,30 +284,26 @@ A fiber interferometer\footnote{Two fiber intereferometers were used: an IDS3010 \begin{figure}[htbp] \begin{subfigure}{0.32\textwidth} \begin{center} -\includegraphics[scale=1,height=214px]{figs/test_struts_bench_leg_overview.jpg} +\includegraphics[scale=1,height=210px]{figs/test_struts_bench_leg_overview.jpg} \end{center} \subcaption{\label{fig:test_struts_bench_leg_overview}Overview Picture} \end{subfigure} \begin{subfigure}{0.68\textwidth} \begin{center} -\includegraphics[scale=1,height=214px]{figs/test_struts_bench_schematic.png} +\includegraphics[scale=1,height=210px]{figs/test_struts_bench_schematic.png} \end{center} \subcaption{\label{fig:test_struts_bench_schematic}Schematic} \end{subfigure} -\caption{\label{fig:test_struts_bench_leg}Experimental setup used to measured the dynamics of the struts.} +\caption{\label{fig:test_struts_bench_leg}Experimental setup used to measure the dynamics of the struts.} \end{figure} -First, the effect of the encoder on the measured dynamics is studied in Section \ref{ssec:test_struts_effect_encoder}. -Then, the dynamics seen by the encoder and by the interferometers are compared in Section \ref{ssec:test_struts_comp_enc_int}. -Finally, all the measured struts are compared in terms of dynamics in Section \ref{ssec:test_struts_comp_all_struts}. +First, the effect of the encoder on the measured dynamics is investigated in Section \ref{ssec:test_struts_effect_encoder}. +The dynamics observed by the encoder and interferometers are compared in Section \ref{ssec:test_struts_comp_enc_int}. +Finally, all measured struts are compared in terms of dynamics in Section \ref{ssec:test_struts_comp_all_struts}. \section{Effect of the Encoder on the measured dynamics} \label{ssec:test_struts_effect_encoder} -System identification is performed in two cases: -\begin{itemize} -\item no encoder is fixed to the strut (Figure \ref{fig:test_struts_bench_leg_front}) -\item one encoder is fixed to the strut (Figure \ref{fig:test_struts_bench_leg_coder}) -\end{itemize} +System identification was performed without the encoder being fixed to the strut (Figure \ref{fig:test_struts_bench_leg_front}) and with one encoder being fixed to the strut (Figure \ref{fig:test_struts_bench_leg_coder}). \begin{figure}[htbp] \begin{subfigure}{0.5\textwidth} @@ -335,127 +322,111 @@ System identification is performed in two cases: \end{figure} The obtained frequency response functions are compared in Figure \ref{fig:test_struts_effect_encoder}. -It is found that the encoder as very little effect on the transfer function from excitation voltage \(u\) to the axial motion of the strut \(d_a\) as measured by the interferometer (Figure \ref{fig:test_struts_effect_encoder_int}). -This means that the axial motion of the strut is unaffected by the precense of the encoder. -Similarly, it has very little effect on the transfer function from \(u\) to the sensor stack voltage \(V_s\) (Figure \ref{fig:test_struts_effect_encoder_iff}). -This means that the integral force feedback control strategy should be as effective whether or not the encoders are fixed to the struts. +It was found that the encoder had very little effect on the transfer function from excitation voltage \(u\) to the axial motion of the strut \(d_a\) as measured by the interferometer (Figure \ref{fig:test_struts_effect_encoder_int}). +This means that the axial motion of the strut is unaffected by the presence of the encoder. +Similarly, it has little effect on the transfer function from \(u\) to the sensor stack voltage \(V_s\) (Figure \ref{fig:test_struts_effect_encoder_iff}). +This means that the encoder should have little effect on the effectiveness of the integral force feedback control strategy. \begin{figure}[htbp] -\begin{subfigure}{0.49\textwidth} +\begin{subfigure}{0.33\textwidth} \begin{center} \includegraphics[scale=1,width=0.95\linewidth]{figs/test_struts_effect_encoder_int.png} \end{center} \subcaption{\label{fig:test_struts_effect_encoder_int}$u$ to $d_a$} \end{subfigure} -\begin{subfigure}{0.49\textwidth} +\begin{subfigure}{0.33\textwidth} \begin{center} \includegraphics[scale=1,width=0.95\linewidth]{figs/test_struts_effect_encoder_iff.png} \end{center} \subcaption{\label{fig:test_struts_effect_encoder_iff}$u$ to $V_s$} \end{subfigure} -\caption{\label{fig:test_struts_effect_encoder}Effect of having the encoder fixed to the struts on the measured dynamics from \(u\) to \(d_a\) (\subref{fig:test_struts_effect_encoder_int}) and from \(u\) to \(V_s\) (\subref{fig:test_struts_effect_encoder_iff})} +\begin{subfigure}{0.33\textwidth} +\begin{center} +\includegraphics[scale=1,width=0.95\linewidth]{figs/test_struts_comp_enc_int.png} +\end{center} +\subcaption{\label{fig:test_struts_comp_enc_int}$u$ to $d_e$, $d_a$} +\end{subfigure} +\caption{\label{fig:test_struts_effect_encoder}Effect of having the encoder fixed to the struts on the measured dynamics from \(u\) to \(d_a\) (\subref{fig:test_struts_effect_encoder_int}) and from \(u\) to \(V_s\) (\subref{fig:test_struts_effect_encoder_iff}). Comparison of the observed dynamics by the encoder and interferometers (\subref{fig:test_struts_comp_enc_int})} \end{figure} + \section{Comparison of the encoder and interferometer} \label{ssec:test_struts_comp_enc_int} -The dynamics as measured by the encoder and by the interferometers are compared in Figure \ref{fig:test_struts_comp_enc_int}. - -The dynamics from the excitation voltage \(u\) to the measured displacement by the encoder \(d_e\) presents a behavior that is much more complex than the dynamics to the displacement as measured by the interferometer (comparison made in Figure \ref{fig:test_struts_comp_enc_int}). +The dynamics measured by the encoder (i.e. \(d_e/u\)) and interferometers (i.e. \(d_a/u\)) are compared in Figure \ref{fig:test_struts_comp_enc_int}. +The dynamics from the excitation voltage \(u\) to the displacement measured by the encoder \(d_e\) presents a behavior that is much more complex than the dynamics of the displacement measured by the interferometer (comparison made in Figure \ref{fig:test_struts_comp_enc_int}). Three additional resonance frequencies can be observed at 197Hz, 290Hz and 376Hz. -These resonance frequencies correspond to flexible modes of the strut that were studied in Section \ref{sec:test_struts_flexible_modes}. +These resonance frequencies match the frequencies of the flexible modes studied in Section \ref{sec:test_struts_flexible_modes}. -The good news is that these resonances are not seen on the interferometer and are therefore not impacting the axial motion of the strut (which is what is important for the hexapod positioning). -However, these resonances are making the use of encoder fixed to the strut difficult. +The good news is that these resonances are not impacting the axial motion of the strut (which is what is important for the hexapod positioning). +However, these resonances make the use of an encoder fixed to the strut difficult from a control perspective. -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/test_struts_comp_enc_int.png} -\caption{\label{fig:test_struts_comp_enc_int}Comparison of the transfer functions from excitation voltage \(u\) to either the encoder \(d_e\) or the interferometer \(d_a\)} -\end{figure} \section{Comparison of all the Struts} \label{ssec:test_struts_comp_all_struts} -Then, the dynamics of all the mounted struts (only 5 at the time of the experiment) are all measured using the same test bench. +The dynamics of all the mounted struts (only 5 at the time of the experiment) were then measured on the same test bench. The obtained dynamics from \(u\) to \(d_a\) are compared in Figure \ref{fig:test_struts_comp_interf_plants} while is dynamics from \(u\) to \(V_s\) are compared in Figure \ref{fig:test_struts_comp_iff_plants}. -Very good match can be observed between all the struts. +A very good match can be observed between the struts. \begin{figure}[htbp] -\begin{subfigure}{0.49\textwidth} +\begin{subfigure}{0.33\textwidth} \begin{center} \includegraphics[scale=1,width=\linewidth]{figs/test_struts_comp_interf_plants.png} \end{center} \subcaption{\label{fig:test_struts_comp_interf_plants}$u$ to $d_a$} \end{subfigure} -\begin{subfigure}{0.49\textwidth} +\begin{subfigure}{0.33\textwidth} \begin{center} \includegraphics[scale=1,width=\linewidth]{figs/test_struts_comp_iff_plants.png} \end{center} \subcaption{\label{fig:test_struts_comp_iff_plants}$u$ to $V_s$} \end{subfigure} +\begin{subfigure}{0.33\textwidth} +\begin{center} +\includegraphics[scale=1,width=\linewidth]{figs/test_struts_comp_enc_plants.png} +\end{center} +\subcaption{\label{fig:test_struts_comp_enc_plants}$u$ to $d_e$} +\end{subfigure} \caption{\label{fig:test_struts_comp_plants}Comparison of the measured plants} \end{figure} The same comparison is made for the transfer function from \(u\) to \(d_e\) (encoder output) in Figure \ref{fig:test_struts_comp_enc_plants}. -This time, large dynamics differences are observed between the 5 struts. -Even-though the same peaks are seen for all of the struts (95Hz, 200Hz, 300Hz, 400Hz), the amplitude of the peaks are not the same. -Moreover, the location or even the presence of complex conjugate zeros is changing from one strut to the other. +In this study, large dynamics differences were observed between the 5 struts. +Although the same resonance frequencies were seen for all of the struts (95Hz, 200Hz, 300Hz and 400Hz), the amplitude of the peaks were not the same. +In addition, the location or even presence of complex conjugate zeros changes from one strut to another. -It will be further investigated why such differences are observed (see Section \ref{ssec:test_struts_effect_misalignment}). - -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/test_struts_comp_enc_plants.png} -\caption{\label{fig:test_struts_comp_enc_plants}Estimated frequency response functions from \(u\) to the encoder \(d_e\) for all the mounted struts} -\end{figure} \section*{Conclusion} -\begin{important} -All the struts are giving very consistent behavior from the excitation voltage \(u\) to the force sensor generated voltage \(V_s\) and to the interferometer measured displacement \(d_a\). -However, the dynamics from \(u\) to the encoder measurement \(d_e\) is much more complex and variable from one strut to the other. -The reason behind this variability will be studied in the next section thanks to the model of the strut. -\end{important} +All the struts exhibit very consistent behavior from the excitation voltage \(u\) to the force sensor generated voltage \(V_s\) and to the interferometer measured displacement \(d_a\). +However, the dynamics from \(u\) to the encoder measurement \(d_e\) is much more complex and vary from one strut to the another. +The reason for this variability will be studied in the next section thanks to the strut model. + \chapter{Strut Model} \label{sec:test_struts_simscape} -However, now the full strut is put instead of only the APA (see Figure \ref{fig:test_struts_simscape_model}). +The Simscape model of the strut was included in the Simscape model of the test bench (see Figure \ref{fig:test_struts_simscape_model}). +The obtained model was first used to compare the measured FRF with the existing model (Section \ref{ssec:test_struts_comp_model}). + +Using a flexible APA model (extracted from a \acrshort{fem}), the effect of a misalignment of the APA with respect to flexible joints is studied (Section \ref{ssec:test_struts_effect_misalignment}). +It was found that misalignment has a large impact on the dynamics from \(u\) to \(d_e\). +This misalignment is estimated and measured in Section \ref{ssec:test_struts_meas_misalignment}. +The struts were then disassembled and reassemble a second time to optimize alignment (Section \ref{sec:test_struts_meas_all_aligned_struts}). \begin{figure}[htbp] \centering -\includegraphics[scale=1,width=0.5\linewidth]{figs/test_struts_simscape_model.png} +\includegraphics[scale=1,width=0.65\linewidth]{figs/test_struts_simscape_model.png} \caption{\label{fig:test_struts_simscape_model}Screenshot of the Simscape model of the strut fixed to the bench} \end{figure} - -This Simscape model is used to: -\begin{itemize} -\item compare the measured FRF with the modelled FRF -\item help the correct understanding/interpretation of the results -\item tune the model of the struts (APA, flexible joints, encoder) -\end{itemize} - -This study is structured as follow: -\begin{itemize} -\item Section \ref{ssec:test_struts_comp_model}: the measured FRF are compared with the Simscape model. -\item Section \ref{ssec:test_struts_effect_misalignment}: the flexible APA model is used, and the effect of a misalignment of the APA and flexible joints is studied. -It is found that the misalignment has a large impact on the dynamics from \(u\) to \(d_e\). -\item Section \ref{ssec:test_struts_effect_joint_stiffness}: the effect of the flexible joint's stiffness on the dynamics is studied. -It is found that the axial stiffness of the joints has a large impact on the location of the zeros on the transfer function from \(V_s\) to \(d_e\). -\end{itemize} \section{Model dynamics} \label{ssec:test_struts_comp_model} -Two models of the APA300ML are used here for comparison: -\begin{itemize} -\item a simple two degrees of freedom model -\item a model using a super element extracted from a finite element model -\end{itemize} - -These two models of the APA300ML were tuned to best match measured frequency response functions of the APA alone. -The flexible joints are here modelled with the 4DoF model (axial stiffness, two bending stiffnesses and one torsion stiffness). +Two models of the APA300ML are used here: a simple two-degrees-of-freedom model and a model using a super-element extracted from a \acrlong{fem}. +These two models of the APA300ML were tuned to best match the measured frequency response functions of the APA alone. +The flexible joints were modelled with the 4DoF model (axial stiffness, two bending stiffnesses and one torsion stiffness). These two models are compared with the measured frequency responses in Figure \ref{fig:test_struts_comp_frf_flexible_model}. The model dynamics from DAC voltage \(u\) to the axial motion of the strut \(d_a\) (Figure \ref{fig:test_struts_comp_frf_flexible_model_int}) and from DAC voltage \(u\) to the force sensor voltage \(V_s\) (Figure \ref{fig:test_struts_comp_frf_flexible_model_iff}) are well matching the experimental identification. However, the transfer function from \(u\) to encoder displacement \(d_e\) are not well matching for both models. -For the 2DoF model, this is normal as the resonances affecting the dynamics are not modelled at all (the APA300ML is modelled as infinitely rigid in all directions except the translation along it's actuation axis). -For the flexible model, it will be shown in the next section that by adding some misalignment betwen the flexible joints and the APA300ML, this model can better represent the observed dynamics. +For the 2DoF model, this is normal because the resonances affecting the dynamics are not modelled at all (the APA300ML is modeled as infinitely rigid in all directions except the translation along it's actuation axis). +For the flexible model, it will be shown in the next section that by adding some misalignment between the flexible joints and the APA300ML, this model can better represent the observed dynamics. \begin{figure}[htbp] \begin{subfigure}{0.33\textwidth} @@ -476,16 +447,16 @@ For the flexible model, it will be shown in the next section that by adding some \end{center} \subcaption{\label{fig:test_struts_comp_frf_flexible_model_iff}$u$ to $V_s$} \end{subfigure} -\caption{\label{fig:test_struts_comp_frf_flexible_model}Comparison of the measured dynamics and of the Simscape dynamics using the ``flexible'' APA300ML model (Super-Element extracted from a Finite Element Model).} +\caption{\label{fig:test_struts_comp_frf_flexible_model}Comparison of the measured frequency response functions, the Simscape model using the 2 DoF APA model, and using the ``flexible'' APA300ML model (Super-Element extracted from a Finite Element Model).} \end{figure} + \section{Effect of strut misalignment} \label{ssec:test_struts_effect_misalignment} -As was shown in Figure \ref{fig:test_struts_comp_enc_plants}, the identified dynamics from DAC voltage \(u\) to encoder measured displacement \(d_e\) are very different from one strut to the other. - +As shown in Figure \ref{fig:test_struts_comp_enc_plants}, the identified dynamics from DAC voltage \(u\) to encoder measured displacement \(d_e\) are very different from one strut to the other. In this section, it is investigated whether poor alignment of the strut (flexible joints with respect to the APA) can explain such dynamics. For instance, consider Figure \ref{fig:test_struts_misalign_schematic} where there is a misalignment in the \(y\) direction between the two flexible joints (well aligned thanks to the mounting procedure in Section \ref{sec:test_struts_mounting}) and the APA300ML. -In such case, the ``x-bending'' mode at 200Hz (see Figure \ref{fig:test_struts_meas_x_bending}) can be expected to be more excited, and thus the dynamics from the actuator to the encoder should be affected at frequencies around 200Hz. +In this case, the ``x-bending'' mode at 200Hz (see Figure \ref{fig:test_struts_meas_x_bending}) can be expected to have greater impact on the dynamics from the actuator to the encoder. \begin{figure}[htbp] \centering @@ -493,25 +464,25 @@ In such case, the ``x-bending'' mode at 200Hz (see Figure \ref{fig:test_struts_m \caption{\label{fig:test_struts_misalign_schematic}Mis-alignement between the joints and the APA} \end{figure} -To verify this assumption, the dynamics from output DAC voltage \(u\) to the measured displacement by the encoder \(d_e\) is computed using the Simscape model with flexible APA for several misalignment in the \(y\) direction. -Obtained dynamics are shown in Figure \ref{fig:test_struts_effect_misalignment_y}. -The alignment of the APA with the flexible joints as a \textbf{huge} influence on the dynamics from actuator voltage to measured displacement by the encoder. +To verify this assumption, the dynamics from the output DAC voltage \(u\) to the measured displacement by the encoder \(d_e\) is computed using the flexible APA Simscape model for several misalignments in the \(y\) direction. +The obtained dynamics are shown in Figure \ref{fig:test_struts_effect_misalignment_y}. +The alignment of the APA with the flexible joints has a large influence on the dynamics from actuator voltage to the measured displacement by the encoder. The misalignment in the \(y\) direction mostly influences: \begin{itemize} \item the presence of the flexible mode at 200Hz (see mode shape in Figure \ref{fig:test_struts_mode_shapes_1}) \item the location of the complex conjugate zero between the first two resonances: \begin{itemize} -\item if \(d_y < 0\): there is no zero between the two resonances and possibly not even between the second and third ones -\item if \(d_y > 0\): there is a complex conjugate zero between the first two resonances +\item if \(d_{y} < 0\): there is no zero between the two resonances and possibly not even between the second and third resonances +\item if \(d_{y} > 0\): there is a complex conjugate zero between the first two resonances \end{itemize} \item the location of the high frequency complex conjugate zeros at 500Hz (secondary effect, as the axial stiffness of the joint also has large effect on the position of this zero) \end{itemize} -The same can be done for a misalignment in the \(x\) direction. -The obtained dynamics are shown in Figure \ref{fig:test_struts_effect_misalignment_x} where it is shown that misalignment in the \(x\) direction mostly influences the presence of the flexible mode at 300Hz (see mode shape in Figure \ref{fig:test_struts_mode_shapes_2}). +The same can be done for misalignments in the \(x\) direction. +The obtained dynamics (Figure \ref{fig:test_struts_effect_misalignment_x}) are showing that misalignment in the \(x\) direction mostly influences the presence of the flexible mode at 300Hz (see mode shape in Figure \ref{fig:test_struts_mode_shapes_2}). -Comparing the experimental frequency response functions for all the APA in Figure \ref{fig:test_struts_comp_enc_plants} with the model dynamics for several \(y\) misalignments in Figure \ref{fig:test_struts_effect_misalignment_y} indicates a clear similarity. -This similarity suggests that the identified differences in dynamics are caused by the misalignment. +A comparison of the experimental frequency response functions in Figure \ref{fig:test_struts_comp_enc_plants} with the model dynamics for several \(y\) misalignments in Figure \ref{fig:test_struts_effect_misalignment_y} indicates a clear similarity. +This similarity suggests that the identified differences in dynamics are caused by misalignment. \begin{figure}[htbp] \begin{subfigure}{0.49\textwidth} @@ -528,23 +499,24 @@ This similarity suggests that the identified differences in dynamics are caused \end{subfigure} \caption{\label{fig:test_struts_effect_misalignment}Effect of a misalignment between the flexible joints and the APA300ML in the \(y\) direction (\subref{fig:test_struts_effect_misalignment_y}) and in the \(x\) direction (\subref{fig:test_struts_effect_misalignment_x})} \end{figure} + \section{Measured strut misalignment} \label{ssec:test_struts_meas_misalignment} -During the first mounting of the struts presented in Section \ref{sec:test_struts_mounting}, the positioning pins used to position the APA with respect to the flexible joints in the \(y\) directions were not used (not received at the time). -Therefore, large \(y\) misalignments may be expected. +During the initial mounting of the struts, as presented in Section \ref{sec:test_struts_mounting}, the positioning pins that were used to position the APA with respect to the flexible joints in the \(y\) directions were not used (not received at the time). +Therefore, large \(y\) misalignments are expected. -In order to estimate the misalignments between the two flexible joints and the APA: +To estimate the misalignments between the two flexible joints and the APA: \begin{itemize} -\item the struts are fixed horizontally to the mounting bench as shown in Figure \ref{fig:test_struts_mounting_step_3} but without the encoder -\item using a length gauge\footnote{Heidenhain MT25, specified accuracy of \(\pm 0.5\,\mu m\)}, the height difference from the flexible joints surface and the APA shell surface is measured both for the top and bottom joints and on both sides -\item as the thickness of the flexible joint is \(21\,mm\) and the thickness of the APA shell is \(20\,mm\), \(0.5\,mm\) of height different should be measured is the two are perfectly aligned +\item the struts were fixed horizontally on the mounting bench, as shown in Figure \ref{fig:test_struts_mounting_step_3} but without the encoder +\item using a length gauge\footnote{Heidenhain MT25, specified accuracy of \(\pm 0.5\,\mu m\)}, the height difference between the flexible joints surface and the APA shell surface was measured for both the top and bottom joints and for both sides +\item as the thickness of the flexible joint is \(21\,mm\) and the thickness of the APA shell is \(20\,mm\), \(0.5\,mm\) of height difference should be measured if the two are perfectly aligned \end{itemize} Large variations in the \(y\) misalignment are found from one strut to the other (results are summarized in Table \ref{tab:test_struts_meas_y_misalignment}). -To check the validity of the measurement, it can be verified that sum of the measured thickness difference on each side is \(1\,mm\) (equal to the thickness difference between the flexible joint and the APA). -This thickness differences for all the struts were found to be between \(0.94\,mm\) and \(1.00\,mm\) which indicate low errors as compared to the misalignments found in Table \ref{tab:test_struts_meas_y_misalignment}. +To check the validity of the measurement, it can be verified that the sum of the measured thickness difference on each side is \(1\,mm\) (equal to the thickness difference between the flexible joint and the APA). +Thickness differences for all the struts were found to be between \(0.94\,mm\) and \(1.00\,mm\) which indicate low errors compared to the misalignments found in Table \ref{tab:test_struts_meas_y_misalignment}. \begin{table}[htbp] \caption{\label{tab:test_struts_meas_y_misalignment}Measured \(y\) misalignment at the top and bottom of the APA. Measurements are in \(mm\)} @@ -562,30 +534,29 @@ This thickness differences for all the struts were found to be between \(0.94\,m \end{tabularx} \end{table} -By using the measured \(y\) misalignment in the Simscape model with the flexible APA model, the measured dynamics from \(u\) to \(d_e\) can be approached as shown in Figure \ref{fig:test_struts_comp_dy_tuned_model_frf_enc}. -Even better match in the dynamics can be obtained by fine tuning both the \(x\) and \(y\) misalignments (yellow curves in Figure \ref{fig:test_struts_comp_dy_tuned_model_frf_enc}). - - -This confirms that the misalignment between the APA and the strut axis (determined by the two flexible joints) is critical and is inducing large variations in the dynamics from DAC voltage \(u\) to encoder measured displacement \(d_e\). -If encoders are to be used when fixed on the struts, it is therefore very important to properly align the APA and the flexible joints when mounting the struts. +By using the measured \(y\) misalignment in the Simscape model with the flexible APA model, the model dynamics from \(u\) to \(d_e\) is closer to the measured dynamics, as shown in Figure \ref{fig:test_struts_comp_dy_tuned_model_frf_enc}. +A better match in the dynamics can be obtained by fine-tuning both the \(x\) and \(y\) misalignments (yellow curves in Figure \ref{fig:test_struts_comp_dy_tuned_model_frf_enc}). +This confirms that misalignment between the APA and the strut axis (determined by the two flexible joints) is critical and inducing large variations in the dynamics from DAC voltage \(u\) to encoder measured displacement \(d_e\). +If encoders are fixed to the struts, the APA and flexible joints must be precisely aligned when mounting the struts. In the next section, the struts are re-assembled with a ``positioning pin'' to better align the APA with the flexible joints. -With a better alignment, the amplitude of the spurious resonances are expected to decrease as was shown in Figure \ref{fig:test_struts_effect_misalignment_y}. +With a better alignment, the amplitude of the spurious resonances is expected to decrease, as shown in Figure \ref{fig:test_struts_effect_misalignment_y}. \begin{figure}[htbp] \centering \includegraphics[scale=1]{figs/test_struts_comp_dy_tuned_model_frf_enc.png} -\caption{\label{fig:test_struts_comp_dy_tuned_model_frf_enc}Comparison of the frequency response functions from DAC voltage \(u\) to measured displacement \(d_e\) by the encoders for three struts. In blue the measured dynamics, in red the dynamics extracted from the model with the \(y\) misalignment estimated from measurements, in yellow the dynamics extracted from the model when both the \(x\) and \(y\) misalignments are tuned} +\caption{\label{fig:test_struts_comp_dy_tuned_model_frf_enc}Comparison of the frequency response functions from DAC voltage \(u\) to measured displacement \(d_e\) by the encoders for the three struts. In blue, the measured dynamics is represted, in red the dynamics extracted from the model with the \(y\) misalignment estimated from measurements, and in yellow, the dynamics extracted from the model when both the \(x\) and \(y\) misalignments are tuned} \end{figure} + \section{Proper struts alignment} \label{sec:test_struts_meas_all_aligned_struts} -After the positioning pins had been received, the struts were mounted again with the positioning pins. -This should make the APA better aligned with the two flexible joints. +After receiving the positioning pins, the struts were mounted again with the positioning pins. +This should improve the alignment of the APA with the two flexible joints. -This alignment is then estimated using a length gauge as in the previous sections. -Measured \(y\) alignments are summarized in Table \ref{tab:test_struts_meas_y_misalignment_with_pin} and are found to be bellow \(55\mu m\) for all the struts which is much better than better (see Table \ref{tab:test_struts_meas_y_misalignment}). +The alignment is then estimated using a length gauge, as described in the previous sections. +Measured \(y\) alignments are summarized in Table \ref{tab:test_struts_meas_y_misalignment_with_pin} and are found to be bellow \(55\mu m\) for all the struts, which is much better than before (see Table \ref{tab:test_struts_meas_y_misalignment}). \begin{table}[htbp] \caption{\label{tab:test_struts_meas_y_misalignment_with_pin}Measured \(y\) misalignment at the top and bottom of the APA after realigning the struts using a positioning pin. Measurements are in \(mm\).} @@ -604,55 +575,31 @@ Measured \(y\) alignments are summarized in Table \ref{tab:test_struts_meas_y_mi \end{tabularx} \end{table} -The dynamics of the re-aligned struts are then measured using the same test bench (Figure \ref{fig:test_struts_bench_leg}). -The comparison of the initial strut dynamics and the dynamics of the re-aligned struts (i.e. with the positioning pin) is made in Figure \ref{fig:test_struts_comp_enc_frf_realign}. - +The dynamics of the re-aligned struts were then measured on the same test bench (Figure \ref{fig:test_struts_bench_leg}). +A comparison of the initial strut dynamics and the dynamics of the re-aligned struts (i.e. with the positioning pin) is presented in Figure \ref{fig:test_struts_comp_enc_frf_realign}. Even though the struts are now much better aligned, not much improvement can be observed. -The dynamics of the six aligned struts are quite different from one another. +The dynamics of the six aligned struts were also quite different from one another. -Having the encoders fixed to the struts may prove to be difficult to use. -Therefore, the encoders may be fixed to the nano-hexapod plates instead. +The fact that the encoders are fixed to the struts makes the control more challenging. +Therefore, fixing the encoders to the nano-hexapod plates instead may be an interesting option. \begin{figure}[htbp] \centering \includegraphics[scale=1]{figs/test_struts_comp_enc_frf_realign.png} -\label{fig:test_struts_comp_enc_frf_realign} -\end{figure} -\section{Effect of the flexible joint} -\label{ssec:test_struts_effect_joint_stiffness} - -As the struts are composed of one APA and two flexible joints, it is expected that the flexible joint characteristics will change the dynamic behavior of the struts. - -Using the Simscape model, the effect of the flexible joint's characteristics on the dynamics as measured on the test bench are studied. -The studied dynamics is between \(u\) and the encoder displacement \(d_e\). - -Let's initialize an APA which is a little bit misaligned. -\begin{figure}[htbp] -\begin{subfigure}{0.49\textwidth} -\begin{center} -\includegraphics[scale=1,width=0.95\linewidth]{figs/test_struts_effect_flex_bending_stiffness_enc.png} -\end{center} -\subcaption{\label{fig:test_struts_effect_flex_bending_stiffness_enc}Effect of bending stiffness} -\end{subfigure} -\begin{subfigure}{0.49\textwidth} -\begin{center} -\includegraphics[scale=1,width=0.95\linewidth]{figs/test_struts_effect_flex_axial_stiffness_enc.png} -\end{center} -\subcaption{\label{fig:test_struts_effect_flex_axial_stiffness_enc}Effect of axial stiffness} -\end{subfigure} -\caption{\label{fig:test_struts_effect_flex_stiffness_enc}Effect of the flexible joints' bending (\subref{fig:test_struts_effect_flex_bending_stiffness_enc}) and axial (\subref{fig:test_struts_effect_flex_axial_stiffness_enc}) stiffnesses on the strut dynamics from \(u\) to \(d_e\)} +\caption{\label{fig:test_struts_comp_enc_frf_realign}Comparison of the dynamics from \(u\) to \(d_e\) before and after proper alignment using the dowel pins} \end{figure} -The bending stiffness of the joints has little impact on the transfer function from \(u\) to \(d_e\). - -The axial stiffness of the flexible joint has a large impact on the frequency of the complex conjugate zero. -Using the measured FRF on the test-bench, if is therefore possible to estimate the axial stiffness of the flexible joints from the location of the zero. - -This method gives nice match between the measured FRF and the one extracted from the simscape model, however it could give not so accurate values of the joint's axial stiffness as other factors are also influencing the location of the zero. - -Using this method, an axial stiffness of \(70 N/\mu m\) is found to give good results (and is reasonable based on the finite element models). -\section*{Conclusion} \chapter{Conclusion} \label{sec:test_struts_conclusion} -\printbibliography[heading=bibintoc,title={Bibliography}] + +The Hano-Hexapod struts are a key component of the developed \acrfull{nass}. +A mounting bench was used to obtain struts with good interface coaxiality, equal lengths, and ideally the same dynamics. +Using a test bench, it was found that while all the mounted struts had extremely similar dynamics when considering the axial motion and the integrated force sensor, the dynamics as seen by the encoder is much more complex and varied from one strut to the other. + +Thanks to a \acrshort{fem} and experimental measurements, the modes inducing this complex dynamics was identified. +The variability in the dynamics was attributed to the poor alignment of the \acrshort{apa} with respect to the flexible joints. +Even with better alignment using dowel pins, the observed dynamics by the encoder remained problematic. +Therefore, the encoders will be fixed directly to the nano-hexapod plates rather than being fixed to the struts. + +\printglossaries \end{document}