Add strut misalignement analysis

This commit is contained in:
Thomas Dehaeze 2024-03-27 17:03:23 +01:00
parent 9f89ad00f4
commit 06b8db47f9
9 changed files with 2793 additions and 645 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

View File

@ -73,16 +73,6 @@
(add-to-list 'org-export-filter-headline-functions
'my-latex-filter-removeOrgAutoLabels)
;; Remove all org comments in the output LaTeX file
(defun delete-org-comments (backend)
(loop for comment in (reverse (org-element-map (org-element-parse-buffer)
'comment 'identity))
do
(setf (buffer-substring (org-element-property :begin comment)
(org-element-property :end comment))
"")))
(add-hook 'org-export-before-processing-hook 'delete-org-comments)
;; Use no package by default
(setq org-latex-packages-alist nil)
(setq org-latex-default-packages-alist nil)
@ -214,6 +204,9 @@ This cylindrical tool is here to protect the flexible joints when tightening the
** Mounting Procedure
- [ ] Better explain the mounting procedure
- [ ] Speak about the "locating" pins that are used to aligned the APA with the two flexible joints
The mounting procedure is as follows:
1. Screw flexible joints inside the cylindrical interface element shown in Figure ref:fig:test_struts_cylindrical_mounting
2. Fix the two interface elements. One of the two should be clamped, the other one should have its axial rotation free.
@ -295,13 +288,13 @@ From a Finite Element Model of the struts, it have been found that three main re
#+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_3}X-bending mode (189Hz)}
#+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_3}Y-bending mode (285Hz)}
#+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
@ -441,13 +434,13 @@ exportFig('figs/test_struts_spur_res_frf_enc.pdf', 'width', 'half', 'height', 'n
#+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 \linewidth
#+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 \linewidth
#+attr_latex: :width 0.95\linewidth
[[file:figs/test_struts_spur_res_frf_enc.png]]
#+end_subfigure
#+end_figure
@ -653,7 +646,7 @@ exportFig('figs/test_struts_effect_encoder_iff.pdf', 'width', 'half', 'height',
#+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$ cref:fig:test_struts_effect_encoder_iff
#+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$}
@ -914,7 +907,7 @@ exportFig('figs/test_struts_comp_enc_plants.pdf', 'width', 'wide', 'height', 'ta
#+end_src
#+name: fig:test_struts_comp_enc_plants
#+caption: Estimated FRF for the DVF plant (transfer function from $u$ to the encoder $d_e$)
#+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]]
@ -1000,10 +993,11 @@ io(io_i) = linio([mdl, '/da'], 1, 'openoutput'); io_i = io_i + 1; % Interferomet
#+end_src
#+begin_src matlab
%% Frequency vector [Hz]
freqs = logspace(1, log10(2000), 1000);
#+end_src
** Comparison with the Model
** Model dynamics
<<ssec:test_struts_comp_model>>
#+begin_src matlab
%% Load measured FRF for comparison
@ -1074,7 +1068,7 @@ 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
leg.ItemTokenSize(1) = 15;
ax2a = nexttile;
hold on;
@ -1120,7 +1114,7 @@ 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
leg.ItemTokenSize(1) = 15;
ax2a = nexttile;
hold on;
@ -1166,7 +1160,7 @@ 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
leg.ItemTokenSize(1) = 15;
ax2a = nexttile;
hold on;
@ -1214,204 +1208,43 @@ exportFig('figs/test_struts_comp_frf_flexible_model_iff.pdf', 'width', 400, 'hei
#+end_subfigure
#+end_figure
** Effect of a misalignment of the APA and flexible joints on the transfer function from actuator to encoder
** Effect of strut misalignment
<<ssec:test_struts_effect_misalignment>>
*** Introduction :ignore:
As shown in Figure ref:fig:test_struts_comp_enc_plants, the dynamics from actuator to encoder for all the struts is very different.
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.
This could be explained by a large variability in the alignment of the flexible joints and the APA (at the time, the alignment pins were not used).
Depending on the alignment, the spurious resonances of the struts (Figure ref:fig:test_struts_mode_shapes) can be excited differently.
For instance, consider Figure ref:fig:test_struts_misalign_schematic where there is a misalignment in the $y$ direction.
In such case, the mode at 200Hz is foreseen to be more excited as the misalignment $d_y$ increases and therefore the dynamics from the actuator to the encoder should also change around 200Hz.
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]]
If the misalignment is in the $x$ direction, the mode at 285Hz should be more affected whereas a misalignment in the $z$ direction should not affect these resonances.
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)
Such statement is studied in this section.
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).
*** Measured misalignment of the APA and flexible joints
The misalignment between the two flexible joints and the APA has been measured for all the struts:
- the strut is fixed to the mounting bench
- using an indicator, the height difference from the flexible joints and the APA is measured both for the top and bottom joints and on both sides
- then it is possible to obtain the misalignment for both flexible joints
The raw measurements are shown in Table ref:tab:meas_misalignment_struts_raw.
As the flexible joint's "thickness" is 1mm larger than the APA "thickness", ideally (i.e. if it were perfectly centered) we would measure =-0.50mm= each time.
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
strut_nums = [1, 2, 3, 4, 5];
%% 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]
% 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
#+end_src
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
data2orgtable(strut_align, {'1', '2', '3', '4', '5'}, {'*Strut*', '*R Top*', '*B Top*', '*R Bot*', '*B Bot*'}, ' %.2f ');
#+end_src
#+name: tab:meas_misalignment_struts_raw
#+caption: Measured misalignments of the struts (=R= means "red" side, and =B= means "black side") in [mm]
#+attr_latex: :environment tabularx :width 0.4\linewidth :align cllll
#+attr_latex: :center t :booktabs t :float t
#+RESULTS:
| *Strut* | *R Top* | *B Top* | *R Bot* | *B Bot* |
|---------+---------+---------+---------+---------|
| 1 | -0.4 | -0.6 | -0.16 | -0.82 |
| 2 | -0.67 | -0.3 | -0.34 | -0.63 |
| 3 | -0.07 | -0.88 | -0.16 | -0.79 |
| 4 | -0.48 | -0.46 | 0.07 | -1.0 |
| 5 | -0.33 | -0.64 | -0.48 | -0.52 |
Also, the sum of the measured distances on each side should be 1mm (equal to the thickness difference between the flexible joint and the APA).
This is verified in Table ref:tab:meas_misalignment_struts_thickness.
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
data2orgtable([strut_align(:,1) + strut_align(:,2), strut_align(:,3) + strut_align(:,4)], {'1', '2', '3', '4', '5'}, {'*Strut*', '*Top*', '*Bot*'}, ' %.2f ');
#+end_src
#+name: tab:meas_misalignment_struts_thickness
#+caption: Measured thickness difference between the flexible joints and the APA in [mm]
#+attr_latex: :environment tabularx :width 0.2\linewidth :align cll
#+attr_latex: :center t :booktabs t :float t
#+RESULTS:
| *Strut* | *Top* | *Bot* |
|---------+-------+-------|
| 1 | -1.0 | -0.98 |
| 2 | -0.97 | -0.97 |
| 3 | -0.95 | -0.95 |
| 4 | -0.94 | -0.93 |
| 5 | -0.97 | -1.0 |
The differences of the measured distances on each side corresponds to the misalignment on that same side (Table ref:tab:meas_misalignment_struts_results).
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
data2orgtable([(strut_align(:,1) - strut_align(:,2))/2, (strut_align(:,3) - strut_align(:,4))/2], {'1', '2', '3', '4', '5'}, {'*Strut*', '*Top*', '*Bot*'}, ' %.3f ');
#+end_src
#+name: tab:meas_misalignment_struts_results
#+caption: Measured thickness difference between the flexible joints and the APA in [mm]
#+attr_latex: :environment tabularx :width 0.25\linewidth :align cll
#+attr_latex: :center t :booktabs t :float t
#+RESULTS:
| *Strut* | *Top* | *Bot* |
|---------+--------+-------|
| 1 | 0.1 | 0.33 |
| 2 | -0.185 | 0.145 |
| 3 | 0.405 | 0.315 |
| 4 | -0.01 | 0.535 |
| 5 | 0.155 | 0.02 |
#+begin_important
The misalignment of the APA and flexible joints is quite large and variable from one strut to the other.
#+end_important
*** Perfectly aligned APA
Let's first consider that the strut is perfectly mounted such that the two flexible joints and the APA are aligned.
#+begin_src matlab
%% Initialize Simscape data
n_hexapod.flex_bot = initializeBotFlexibleJoint('type', '4dof');
n_hexapod.flex_top = initializeTopFlexibleJoint('type', '4dof');
n_hexapod.actuator = initializeAPA('type', 'flexible');
#+end_src
And define the inputs and outputs of the models:
- Input: voltage generated by the DAC
- Output: measured displacement by the encoder
The transfer function is identified and shown in Figure ref:fig:comp_enc_frf_align_perfect.
#+begin_src matlab
%% Identification
Gs = exp(-s*1e-4)*linearize(mdl, io, 0.0, opts);
Gs.InputName = {'u'};
Gs.OutputName = {'Vs', 'de', 'da'};
#+end_src
From Figure ref:fig:comp_enc_frf_align_perfect, it is clear that:
1. The model with perfect alignment is not matching the measured FRF
2. The mode at 200Hz is not present in the identified dynamics of the Simscape model
3. The measured FRF have different shapes
#+begin_src matlab :exports none
%% Measured FRF from Vs to de and identified dynamics using the flexible APA
freqs = 2*logspace(0, 3, 1000);
figure;
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile([2,1]);
hold on;
plot(f, abs(enc_frf(:, i)), 'color', [0,0,0,0.2], ...
'DisplayName', 'Meas. FRF');
for i = 2:length(strut_nums)
plot(f, abs(enc_frf(:, i)), 'color', [0,0,0,0.2], ...
'HandleVisibility', 'off');
end
set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(Gs('de', 'u'), freqs, 'Hz'))), '-', ...
'DisplayName', '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]);
legend('location', 'northeast');
ax2 = nexttile;
hold on;
for i = 1:length(strut_nums)
plot(f, 180/pi*angle(enc_frf(:, i)), 'color', [0,0,0,0.2]);
end
set(gca,'ColorOrderIndex',1);
plot(freqs, 180/pi*angle(squeeze(freqresp(Gs('de', 'u'), freqs, 'Hz'))), '-')
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/comp_enc_frf_align_perfect.pdf', 'width', 'wide', 'height', 'tall');
#+end_src
#+name: fig:comp_enc_frf_align_perfect
#+caption: Comparison of the model with a perfectly aligned APA and flexible joints with the measured FRF from actuator to encoder
#+RESULTS:
[[file:figs/comp_enc_frf_align_perfect.png]]
#+begin_question
Why is the flexible mode of the strut at 200Hz is not seen in the model in Figure ref:fig:comp_enc_frf_align_perfect?
Probably because the presence of this mode is not due because of the "unbalanced" mass of the encoder, but rather because of the misalignment of the APA with respect to the two flexible joints.
This will be verified in the next sections.
#+end_question
*** Effect of a misalignment in y
Let's compute the transfer function from output DAC voltage $V_s$ to the measured displacement by the encoder $d_e$ for several misalignment in the $y$ direction:
#+begin_src matlab
%% Considered misalignments
dy_aligns = [-0.5, -0.1, 0, 0.1, 0.5]*1e-3; % [m]
#+end_src
#+begin_src matlab
%% Transfer functions from u to de for all the misalignment in y direction
Gs_align = {zeros(length(dy_aligns), 1)};
% 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]);
@ -1420,76 +1253,15 @@ for i = 1:length(dy_aligns)
G.InputName = {'u'};
G.OutputName = {'Vs', 'de', 'da'};
Gs_align(i) = {G};
Gs_dy_align(i) = {G};
end
#+end_src
The obtained dynamics are shown in Figure ref:fig:effect_misalignment_y.
%% 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]
#+begin_src matlab :exports none
%% Transfer function from Vs to de - effect of x-misalignment
freqs = 2*logspace(0, 3, 1000);
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_align{i}('de', 'u'), freqs, 'Hz'))), ...
'DisplayName', sprintf('$d_y = %.1f$ [mm]', 1e3*dy_aligns(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', 'northeast');
ax2 = nexttile;
hold on;
for i = 1:length(dy_aligns)
plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_align{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([10, 2e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/effect_misalignment_y.pdf', 'width', 'wide', 'height', 'tall');
#+end_src
#+name: fig:effect_misalignment_y
#+caption: Effect of a misalignement in the $y$ direction
#+RESULTS:
[[file:figs/effect_misalignment_y.png]]
#+begin_important
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
- 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)
#+end_important
*** Effect of a misalignment in x
Let's compute the transfer function from output DAC voltage to the measured displacement by the encoder for several misalignment in the $x$ direction:
#+begin_src matlab
%% Considered misalignments
dx_aligns = [-0.1, -0.05, 0, 0.05, 0.1]*1e-3; % [m]
#+end_src
#+begin_src matlab
%% Transfer functions from u to de for all the misalignment in x direction
Gs_align = {zeros(length(dx_aligns), 1)};
% 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]);
@ -1498,36 +1270,37 @@ for i = 1:length(dx_aligns)
G.InputName = {'u'};
G.OutputName = {'Vs', 'de', 'da'};
Gs_align(i) = {G};
Gs_dx_align(i) = {G};
end
#+end_src
The obtained dynamics are shown in Figure ref:fig:effect_misalignment_x.
#+begin_src matlab :exports none
%% Transfer function from Vs to de - effect of x-misalignment
freqs = 2*logspace(0, 3, 1000);
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_align{i}('de', 'u'), freqs, 'Hz'))), ...
'DisplayName', sprintf('$d_x = %.2f$ [mm]', 1e3*dx_aligns(i)));
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]);
legend('location', 'northeast');
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_align{i}('de', 'u'), freqs, 'Hz'))));
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]');
@ -1538,32 +1311,147 @@ linkaxes([ax1,ax2],'x');
xlim([10, 2e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/effect_misalignment_x.pdf', 'width', 'wide', 'height', 'tall');
#+begin_src matlab :tangle no :exports results :results file none
exportFig('figs/test_struts_effect_misalignment_y.pdf', 'width', 'half', 'height', 'tall');
#+end_src
#+name: fig:effect_misalignment_x
#+caption: Effect of a misalignement in the $x$ direction
#+RESULTS:
[[file:figs/effect_misalignment_x.png]]
#+begin_src matlab :exports none
%% Transfer function from Vs to de - effect of x-misalignment
figure;
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
#+begin_important
The misalignment in the $x$ direction mostly influences the presence of the flexible mode at 300Hz.
#+end_important
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
<<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.
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.
*** Comparison with identified 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]];
#+end_src
#+begin_src matlab
%% Idenfity the transfer function from actuator to encoder for all cases
Gs_align = {zeros(size(strut_align,1), 1)};
for i = 1:size(strut_align,1)
n_hexapod.actuator = initializeAPA('type', 'flexible', ...
@ -1574,79 +1462,18 @@ for i = 1:size(strut_align,1)
G.InputName = {'u'};
G.OutputName = {'Vs', 'de', 'da'};
Gs_align(i) = {G};
Gs_y_align(i) = {G};
end
#+end_src
#+begin_src matlab :exports none
%% Comparison of the plants (encoder output) when tuning the misalignment
freqs = 2*logspace(0, 3, 1000);
figure;
tiledlayout(2, 3, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile();
hold on;
plot(f, abs(enc_frf(:, 1)));
plot(freqs, abs(squeeze(freqresp(Gs_align{1}('de', 'u'), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
set(gca, 'XTickLabel',[]); ylabel('Amplitude [m/V]');
ax2 = nexttile();
hold on;
plot(f, abs(enc_frf(:, 2)));
plot(freqs, abs(squeeze(freqresp(Gs_align{2}('de', 'u'), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
set(gca, 'XTickLabel',[]); set(gca, 'YTickLabel',[]);
ax3 = nexttile(4);
hold on;
plot(f, abs(enc_frf(:, 3)), 'DisplayName', 'Meas.');
plot(freqs, abs(squeeze(freqresp(Gs_align{3}('de', 'u'), freqs, 'Hz'))), ...
'DisplayName', 'Model');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Amplitude [m/V]');
legend('location', 'southwest', 'FontSize', 8);
ax4 = nexttile(5);
hold on;
plot(f, abs(enc_frf(:, 4)));
plot(freqs, abs(squeeze(freqresp(Gs_align{4}('de', 'u'), freqs, 'Hz'))));
hold off;
xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]);
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ax5 = nexttile(6);
hold on;
plot(f, abs(enc_frf(:, 5)));
plot(freqs, abs(squeeze(freqresp(Gs_align{5}('de', 'u'), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]);
linkaxes([ax1,ax2,ax3,ax4,ax5],'xy');
xlim([20, 2e3]); ylim([1e-8, 1e-3]);
#+end_src
*** Find the misalignment of each strut
From the previous analysis on the effect of a $x$ and $y$ misalignment, it is possible to estimate the $x,y$ misalignment of the measured struts.
The misalignment that gives the best match for the FRF are defined below.
#+begin_src matlab
%% Tuned misalignment [m]
%% 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;
#+end_src
For each misalignment, the dynamics from the DAC voltage to the encoder measurement is identified.
#+begin_src matlab
%% Idenfity the transfer function from actuator to encoder for all cases
Gs_align = {zeros(size(d_aligns,2), 1)};
% 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));
@ -1655,155 +1482,78 @@ for i = 1:5
G.InputName = {'u'};
G.OutputName = {'Vs', 'de', 'da'};
Gs_align(i) = {G};
Gs_xy_align(i) = {G};
end
#+end_src
The results are shown in Figure ref:fig:comp_all_struts_corrected_misalign.
#+begin_src matlab :exports none
%% Comparison of the plants (encoder output) when tuning the misalignment
freqs = 2*logspace(0, 3, 1000);
figure;
tiledlayout(2, 3, 'TileSpacing', 'Compact', 'Padding', 'None');
tiledlayout(1, 3, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile();
hold on;
plot(f, abs(enc_frf(:, 1)));
plot(freqs, abs(squeeze(freqresp(Gs_align{1}('de', 'u'), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
set(gca, 'XTickLabel',[]); ylabel('Amplitude [m/V]');
ax2 = nexttile();
hold on;
plot(f, abs(enc_frf(:, 2)));
plot(freqs, abs(squeeze(freqresp(Gs_align{2}('de', 'u'), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
set(gca, 'XTickLabel',[]); set(gca, 'YTickLabel',[]);
ax3 = nexttile();
hold on;
plot(f, abs(enc_frf(:, 3)), 'DisplayName', 'Meas.');
plot(freqs, abs(squeeze(freqresp(Gs_align{3}('de', 'u'), freqs, 'Hz'))), ...
'DisplayName', 'Model');
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]');
legend('location', 'southwest', 'FontSize', 8);
leg = legend('location', 'southwest', 'FontSize', 8);
leg.ItemTokenSize(1) = 15;
title('Strut 1');
xticks([1e1, 1e2, 1e3]);
ax4 = nexttile(5);
ax2 = nexttile();
hold on;
plot(f, abs(enc_frf(:, 4)));
plot(freqs, abs(squeeze(freqresp(Gs_align{4}('de', 'u'), freqs, 'Hz'))));
hold off;
xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]);
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ax5 = nexttile(6);
hold on;
plot(f, abs(enc_frf(:, 5)));
plot(freqs, abs(squeeze(freqresp(Gs_align{5}('de', 'u'), freqs, 'Hz'))));
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);
leg.ItemTokenSize(1) = 15;
title('Strut 2');
xticks([1e1, 1e2, 1e3]);
linkaxes([ax1,ax2,ax3,ax4,ax5],'xy');
xlim([20, 2e3]); ylim([1e-8, 1e-3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/comp_all_struts_corrected_misalign.pdf', 'width', 'full', 'height', 'tall');
#+end_src
#+name: fig:comp_all_struts_corrected_misalign
#+caption: Comparison (model and measurements) of the FRF from DAC voltage u to measured displacement by the encoders for all the struts
#+RESULTS:
[[file:figs/comp_all_struts_corrected_misalign.png]]
#+begin_important
By tuning the misalignment of the APA with respect to the flexible joints, it is possible to obtain a good fit between the model and the measurements (Figure ref:fig:comp_all_struts_corrected_misalign).
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 future, a "pin" will be used to better align the APA with the flexible joints.
We can expect the amplitude of the spurious resonances to decrease.
#+end_important
*** Paper :noexport:
#+begin_src matlab :exports none
%% Comparison of the plants (encoder output) when tuning the misalignment
freqs = 2*logspace(0, 3, 1000);
colors = colororder;
figure;
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile([2,1]);
ax3 = nexttile();
hold on;
plot(f, abs(enc_frf(:,1)), 'color', [colors(1,:),0.2], ...
'DisplayName', 'FRF - $d_{e,i}/V_{a,i}$')
for i = 2:5
plot(f, abs(enc_frf(:,i)), 'color', [colors(1,:),0.2], ...
'HandleVisibility', 'off');
end
plot(f, abs(int_frf(:,1)), 'color', [colors(2,:),0.2], ...
'DisplayName', 'FRF - $d_{a,i}/V_{a,i}$')
for i = 2:5
plot(f, abs(int_frf(:,i)), 'color', [colors(2,:),0.2], ...
'HandleVisibility', 'off');
end
plot(freqs, abs(squeeze(freqresp(Gs_align{1}('de', 'u'), freqs, 'Hz'))), '--', 'color', colors(1,:), ...
'DisplayName', 'Model - $d_{e,i}/V_{a,i}$')
for i = 2:5
plot(freqs, abs(squeeze(freqresp(Gs_align{i}('de', 'u'), freqs, 'Hz'))), '--', 'color', colors(1,:), ...
'HandleVisibility', 'off');
end
plot(freqs, abs(squeeze(freqresp(Gs('da', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:), ...
'DisplayName', 'Model - $d_{a,i}/V_{a,i}$')
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');
set(gca, 'XTickLabel',[]); ylabel('Amplitude [m/V]');
ylim([1e-8, 1e-3]);
legend('location', 'southwest')
xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]);
leg = legend('location', 'southwest', 'FontSize', 8);
leg.ItemTokenSize(1) = 15;
title('Strut 3');
xticks([1e1, 1e2, 1e3]);
ax2 = nexttile;
hold on;
for i = 1:5
plot(f, 180/pi*angle(enc_frf(:,i)), 'color', [colors(1,:),0.2]);
plot(f, 180/pi*(angle(int_frf(:, i)) - angle(squeeze(freqresp(exp(-s*2*1e-4), f, 'Hz')))), 'color', [colors(2,:),0.2]);
plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_align{i}('de', 'u'), freqs, 'Hz'))), '--', 'color', colors(1,:));
end
plot(freqs, 180/pi*angle(squeeze(freqresp(Gs('da', 'u'), freqs, 'Hz'))), '--', 'color', colors(2,:));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
linkaxes([ax1,ax2],'x');
xlim([20, 2e3]);
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/frf_struts_enc_int.pdf', 'width', 'normal', 'height', 'full');
exportFig('figs/test_struts_comp_dy_tuned_model_frf_enc.pdf', 'width', 'full', 'height', 'normal');
#+end_src
#+name: fig:frf_struts_enc_int
#+caption:
#+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/frf_struts_enc_int.png]]
[[file:figs/test_struts_comp_dy_tuned_model_frf_enc.png]]
** TODO Comparison of all the (re-aligned) Struts
** Proper struts alignment
<<sec:test_struts_meas_all_aligned_struts>>
- [ ] Should this be included here?
*** Introduction :ignore:
The struts are re-aligned and measured using the same test bench.
*** Measured misalignment of the APA and flexible joints
The misalignment between the APA and the flexible joints are measured.
The results are defined below and summarized in Table ref:tab:meas_misalignment_struts_new_raw.
@ -1823,7 +1573,7 @@ strut_align = [[-0.54, -0.50, -0.50, -0.52] % strut 1
#+end_src
#+name: tab:meas_misalignment_struts_new_raw
#+caption: Measured misalignments of the struts (=R= means "red" side, and =B= means "black side") in [mm]
#+caption: Measured misalignment of the struts (=R= means "red" side, and =B= means "black side") in [mm]
#+attr_latex: :environment tabularx :width 0.45\linewidth :align cllll
#+attr_latex: :center t :booktabs t :float t
#+RESULTS:
@ -1881,7 +1631,6 @@ The differences of the measured distances on each side corresponds to the misali
After using the alignment pins, the misalignment of the APA and flexible joints are much smaller ($< 50\,\mu m$ for all the struts).
#+end_important
*** FRF Identification - Setup
The excitation signal is a low pass filtered white noise.
Both the encoder and the force sensor voltage are measured.
@ -1912,7 +1661,6 @@ We get the frequency vector that will be the same for all the frequency domain a
[~, f] = tfestimate(leg_noise{1}.u, leg_noise{1}.de, win, Noverlap, Nfft, 1/Ts);
#+end_src
*** FRF Identification - Encoder
In this section, the dynamics from $u$ to $d_e$ (encoder) is identified.
Then, the transfer function from the DAC output voltage $u$ to the measured displacement by the encoder $d_e$ is computed:
@ -1979,8 +1727,6 @@ exportFig('figs/struts_align_frf_dvf_plant_tf.pdf', 'width', 'wide', 'height', '
Even though the struts are much better aligned, we still observe high variability between the struts for the transfer function from $u$ to $d_e$.
#+end_important
*** Conclusion
#+begin_important
Having the struts well aligned does not change significantly the obtained dynamics.
#+end_important
@ -2041,8 +1787,6 @@ end
The obtained dynamics from DAC voltage to encoder measurements are compared in Figure ref:fig:effect_enc_bending_stiff.
#+begin_src matlab :exports none
%% Plot the obtained transfer functions for all the bending stiffnesses
freqs = 2*logspace(1, 3, 1000);
figure;
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
@ -2120,8 +1864,6 @@ end
The obtained dynamics from DAC voltage to encoder measurements are compared in Figure ref:fig:effect_enc_axial_stiff.
#+begin_src matlab :exports none
%% Plot the obtained transfer functions for all the axial stiffnesses
freqs = 2*logspace(1, 3, 1000);
figure;
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
@ -2207,8 +1949,6 @@ end
The results are shown in Figure ref:fig:effect_enc_bending_damp.
#+begin_src matlab :exports none
%% Plot the obtained transfer functions for all the bending stiffnesses
freqs = 2*logspace(1, 3, 1000);
figure;
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
@ -2651,5 +2391,5 @@ actuator.cs = args.cs; % Damping of one stack [N/m]
#+end_src
* Footnotes
[fn:1]Faro Arm Platinum 4ft, accuracy of $\pm 13\mu m$
[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$

Binary file not shown.

View File

@ -1,4 +1,4 @@
% Created 2024-03-27 Wed 14:27
% Created 2024-03-27 Wed 16:59
% Intended LaTeX compiler: pdflatex
\documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt}
@ -75,7 +75,7 @@ This is very important in order to not loose any stroke when the struts will be
A CAD view of the mounting bench is shown in Figure \ref{fig:test_struts_mounting_bench_first_concept}.
Faro arm\footnote{Faro Arm Platinum 4ft, accuracy of \(\pm 13\mu m\)}
Faro arm\footnote{Faro Arm Platinum 4ft, specified accuracy of \(\pm 13\mu m\)}
\begin{figure}[htbp]
\centering
@ -107,6 +107,11 @@ The flexible joints are rigidly fixed to cylindrical tools shown in Figures \ref
This cylindrical tool is here to protect the flexible joints when tightening the screws and therefore applying large torque.
\section{Mounting Procedure}
\begin{itemize}
\item[{$\square$}] Better explain the mounting procedure
\item[{$\square$}] Speak about the ``locating'' pins that are used to aligned the APA with the two flexible joints
\end{itemize}
The mounting procedure is as follows:
\begin{enumerate}
\item Screw flexible joints inside the cylindrical interface element shown in Figure \ref{fig:test_struts_cylindrical_mounting}
@ -183,13 +188,13 @@ From a Finite Element Model of the struts, it have been found that three main re
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/test_struts_mode_shapes_1.png}
\end{center}
\subcaption{\label{fig:test_struts_mode_shapes_3}X-bending mode (189Hz)}
\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}
\end{center}
\subcaption{\label{fig:test_struts_mode_shapes_3}Y-bending mode (285Hz)}
\subcaption{\label{fig:test_struts_mode_shapes_2}Y-bending mode (285Hz)}
\end{subfigure}
\begin{subfigure}{0.33\textwidth}
\begin{center}
@ -237,13 +242,13 @@ The obtained frequency response functions are shown in Figure \ref{fig:test_stru
\begin{figure}[htbp]
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,width=\linewidth]{figs/test_struts_spur_res_frf_no_enc.png}
\includegraphics[scale=1,width=0.95\linewidth]{figs/test_struts_spur_res_frf_no_enc.png}
\end{center}
\subcaption{\label{fig:test_struts_spur_res_frf_no_enc}without encoder}
\end{subfigure}
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,width=\linewidth]{figs/test_struts_spur_res_frf_enc.png}
\includegraphics[scale=1,width=0.95\linewidth]{figs/test_struts_spur_res_frf_enc.png}
\end{center}
\subcaption{\label{fig:test_struts_spur_res_frf_enc}with the encoder}
\end{subfigure}
@ -321,7 +326,7 @@ This means that the IFF control strategy should be as effective whether or not t
\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\) \cref{fig:test_struts_effect_encoder_iff}}
\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})}
\end{figure}
\section{Comparison of the encoder and interferometer}
\label{ssec:test_struts_comp_enc_int}
@ -378,7 +383,7 @@ All of this will be studied in Section \ref{sec:test_struts_simscape} using the
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/test_struts_comp_enc_plants.png}
\caption{\label{fig:test_struts_comp_enc_plants}Estimated FRF for the DVF plant (transfer function from \(u\) to the encoder \(d_e\))}
\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}
\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\).
@ -409,7 +414,7 @@ It is found that the misalignment has a large impact on the dynamics from \(u\)
\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{Comparison with the Model}
\section{Model dynamics}
\label{ssec:test_struts_comp_model}
Two models of the APA300ML are used here for comparison:
\begin{itemize}
@ -449,16 +454,14 @@ For the flexible model, it will be shown in the next section that by adding some
\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).}
\end{figure}
\section{Effect of a misalignment of the APA and flexible joints on the transfer function from actuator to encoder}
\section{Effect of strut misalignment}
\label{ssec:test_struts_effect_misalignment}
As shown in Figure \ref{fig:test_struts_comp_enc_plants}, the dynamics from actuator to encoder for all the struts is very different.
This could be explained by a large variability in the alignment of the flexible joints and the APA (at the time, the alignment pins were not used).
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.
Depending on the alignment, the spurious resonances of the struts (Figure \ref{fig:test_struts_mode_shapes}) can be excited differently.
For instance, consider Figure \ref{fig:test_struts_misalign_schematic} where there is a misalignment in the \(y\) direction.
In such case, the mode at 200Hz is foreseen to be more excited as the misalignment \(d_y\) increases and therefore the dynamics from the actuator to the encoder should also change around 200Hz.
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.
\begin{figure}[htbp]
\centering
@ -466,121 +469,12 @@ In such case, the mode at 200Hz is foreseen to be more excited as the misalignme
\caption{\label{fig:test_struts_misalign_schematic}Mis-alignement between the joints and the APA}
\end{figure}
If the misalignment is in the \(x\) direction, the mode at 285Hz should be more affected whereas a misalignment in the \(z\) direction should not affect these resonances.
Such statement is studied in this section.
\subsection{Measured misalignment of the APA and flexible joints}
The misalignment between the two flexible joints and the APA has been measured for all the struts:
\begin{itemize}
\item the strut is fixed to the mounting bench
\item using an indicator, the height difference from the flexible joints and the APA is measured both for the top and bottom joints and on both sides
\item then it is possible to obtain the misalignment for both flexible joints
\end{itemize}
The raw measurements are shown in Table \ref{tab:meas_misalignment_struts_raw}.
As the flexible joint's ``thickness'' is 1mm larger than the APA ``thickness'', ideally (i.e. if it were perfectly centered) we would measure \texttt{-0.50mm} each time.
\begin{table}[htbp]
\caption{\label{tab:meas_misalignment_struts_raw}Measured misalignments of the struts (\texttt{R} means ``red'' side, and \texttt{B} means ``black side'') in [mm]}
\centering
\begin{tabularx}{0.4\linewidth}{cllll}
\toprule
\textbf{Strut} & \textbf{R Top} & \textbf{B Top} & \textbf{R Bot} & \textbf{B Bot}\\
\midrule
1 & -0.4 & -0.6 & -0.16 & -0.82\\
2 & -0.67 & -0.3 & -0.34 & -0.63\\
3 & -0.07 & -0.88 & -0.16 & -0.79\\
4 & -0.48 & -0.46 & 0.07 & -1.0\\
5 & -0.33 & -0.64 & -0.48 & -0.52\\
\bottomrule
\end{tabularx}
\end{table}
Also, the sum of the measured distances on each side should be 1mm (equal to the thickness difference between the flexible joint and the APA).
This is verified in Table \ref{tab:meas_misalignment_struts_thickness}.
\begin{table}[htbp]
\caption{\label{tab:meas_misalignment_struts_thickness}Measured thickness difference between the flexible joints and the APA in [mm]}
\centering
\begin{tabularx}{0.2\linewidth}{cll}
\toprule
\textbf{Strut} & \textbf{Top} & \textbf{Bot}\\
\midrule
1 & -1.0 & -0.98\\
2 & -0.97 & -0.97\\
3 & -0.95 & -0.95\\
4 & -0.94 & -0.93\\
5 & -0.97 & -1.0\\
\bottomrule
\end{tabularx}
\end{table}
The differences of the measured distances on each side corresponds to the misalignment on that same side (Table \ref{tab:meas_misalignment_struts_results}).
\begin{table}[htbp]
\caption{\label{tab:meas_misalignment_struts_results}Measured thickness difference between the flexible joints and the APA in [mm]}
\centering
\begin{tabularx}{0.25\linewidth}{cll}
\toprule
\textbf{Strut} & \textbf{Top} & \textbf{Bot}\\
\midrule
1 & 0.1 & 0.33\\
2 & -0.185 & 0.145\\
3 & 0.405 & 0.315\\
4 & -0.01 & 0.535\\
5 & 0.155 & 0.02\\
\bottomrule
\end{tabularx}
\end{table}
\begin{important}
The misalignment of the APA and flexible joints is quite large and variable from one strut to the other.
\end{important}
\subsection{Perfectly aligned APA}
Let's first consider that the strut is perfectly mounted such that the two flexible joints and the APA are aligned.
And define the inputs and outputs of the models:
\begin{itemize}
\item Input: voltage generated by the DAC
\item Output: measured displacement by the encoder
\end{itemize}
The transfer function is identified and shown in Figure \ref{fig:comp_enc_frf_align_perfect}.
From Figure \ref{fig:comp_enc_frf_align_perfect}, it is clear that:
\begin{enumerate}
\item The model with perfect alignment is not matching the measured FRF
\item The mode at 200Hz is not present in the identified dynamics of the Simscape model
\item The measured FRF have different shapes
\end{enumerate}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/comp_enc_frf_align_perfect.png}
\caption{\label{fig:comp_enc_frf_align_perfect}Comparison of the model with a perfectly aligned APA and flexible joints with the measured FRF from actuator to encoder}
\end{figure}
\begin{question}
Why is the flexible mode of the strut at 200Hz is not seen in the model in Figure \ref{fig:comp_enc_frf_align_perfect}?
Probably because the presence of this mode is not due because of the ``unbalanced'' mass of the encoder, but rather because of the misalignment of the APA with respect to the two flexible joints.
This will be verified in the next sections.
\end{question}
\subsection{Effect of a misalignment in y}
Let's compute the transfer function from output DAC voltage \(V_s\) to the measured displacement by the encoder \(d_e\) for several misalignment in the \(y\) direction:
The obtained dynamics are shown in Figure \ref{fig:effect_misalignment_y}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/effect_misalignment_y.png}
\caption{\label{fig:effect_misalignment_y}Effect of a misalignement in the \(y\) direction}
\end{figure}
\begin{important}
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.
The misalignment in the \(y\) direction mostly influences:
\begin{itemize}
\item the presence of the flexible mode at 200Hz
\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
@ -588,40 +482,78 @@ The misalignment in the \(y\) direction mostly influences:
\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}
\end{important}
\subsection{Effect of a misalignment in x}
Let's compute the transfer function from output DAC voltage to the measured displacement by the encoder for several misalignment in the \(x\) direction:
The obtained dynamics are shown in Figure \ref{fig:effect_misalignment_x}.
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{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/effect_misalignment_x.png}
\caption{\label{fig:effect_misalignment_x}Effect of a misalignement in the \(x\) direction}
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/test_struts_effect_misalignment_y.png}
\end{center}
\subcaption{\label{fig:test_struts_effect_misalignment_y}Misalignment along $y$}
\end{subfigure}
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/test_struts_effect_misalignment_x.png}
\end{center}
\subcaption{\label{fig:test_struts_effect_misalignment_x}Misalignment along $x$}
\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}
\begin{important}
The misalignment in the \(x\) direction mostly influences the presence of the flexible mode at 300Hz.
\end{important}
\subsection{Comparison with identified misalignment}
\subsection{Find the misalignment of each strut}
From the previous analysis on the effect of a \(x\) and \(y\) misalignment, it is possible to estimate the \(x,y\) misalignment of the measured struts.
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.
The misalignment that gives the best match for the FRF are defined below.
For each misalignment, the dynamics from the DAC voltage to the encoder measurement is identified.
The results are shown in Figure \ref{fig:comp_all_struts_corrected_misalign}.
\begin{figure}[htbp]
In order 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
\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}.
\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\)}
\centering
\includegraphics[scale=1]{figs/comp_all_struts_corrected_misalign.png}
\caption{\label{fig:comp_all_struts_corrected_misalign}Comparison (model and measurements) of the FRF from DAC voltage u to measured displacement by the encoders for all the struts}
\end{figure}
\begin{tabularx}{0.25\linewidth}{ccc}
\toprule
\textbf{Strut} & \textbf{Bot} & \textbf{Top}\\
\midrule
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\\
\bottomrule
\end{tabularx}
\end{table}
\begin{important}
By tuning the misalignment of the APA with respect to the flexible joints, it is possible to obtain a good fit between the model and the measurements (Figure \ref{fig:comp_all_struts_corrected_misalign}).
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 future, a ``pin'' will be used to better align the APA with the flexible joints.
We can expect the amplitude of the spurious resonances to decrease.
\end{important}
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{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. The \(y\) misalignment between the APA and the flexible joints have been estimated}
\end{figure}
\section{Comparison of all the (re-aligned) Struts}
\label{sec:test_struts_meas_all_aligned_struts}
\begin{itemize}
@ -635,7 +567,7 @@ The misalignment between the APA and the flexible joints are measured.
The results are defined below and summarized in Table \ref{tab:meas_misalignment_struts_new_raw}.
\begin{table}[htbp]
\caption{\label{tab:meas_misalignment_struts_new_raw}Measured misalignments of the struts (\texttt{R} means ``red'' side, and \texttt{B} means ``black side'') in [mm]}
\caption{\label{tab:meas_misalignment_struts_new_raw}Measured misalignment of the struts (\texttt{R} means ``red'' side, and \texttt{B} means ``black side'') in [mm]}
\centering
\begin{tabularx}{0.45\linewidth}{cllll}
\toprule