diff --git a/figs/test_id31_block_schematic_plant.pdf b/figs/test_id31_block_schematic_plant.pdf index 634f90c..8276905 100644 Binary files a/figs/test_id31_block_schematic_plant.pdf and b/figs/test_id31_block_schematic_plant.pdf differ diff --git a/figs/test_id31_block_schematic_plant.png b/figs/test_id31_block_schematic_plant.png index 635c36e..7a4c4f1 100644 Binary files a/figs/test_id31_block_schematic_plant.png and b/figs/test_id31_block_schematic_plant.png differ diff --git a/figs/test_id31_block_schematic_plant.svg b/figs/test_id31_block_schematic_plant.svg index 4b9696f..cedb2b8 100644 --- a/figs/test_id31_block_schematic_plant.svg +++ b/figs/test_id31_block_schematic_plant.svg @@ -1,114 +1,114 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -129,23 +129,23 @@ - - - - + - + - + - + + + + @@ -153,397 +153,408 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + + - + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + - + - + - - + - + + + + + - + + + + + + + + + + + + + + + + + + + - - - - - - + - - - - - - - - - - - + - + - + + + + + + + + + + + - + + + + + + + + + - + - + + + + + + + + + + + + + + + + + - + + + + + - + - + + + + + + + + + + + + + + + + + - + + + + + + - + - + + + + + + + + + + + + + + + - + - + - + + + + + + + + + + + + + + + - - - - - - + - + - - + + - + - - - - - - + - + - - + + - + - - - - - - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - - + + - + - + + + + + + + + - + - - + + + + diff --git a/figs/test_id31_comp_ol_iff_plant_model.pdf b/figs/test_id31_comp_ol_iff_plant_model.pdf index c21214c..e414085 100644 Binary files a/figs/test_id31_comp_ol_iff_plant_model.pdf and b/figs/test_id31_comp_ol_iff_plant_model.pdf differ diff --git a/figs/test_id31_comp_ol_iff_plant_model.png b/figs/test_id31_comp_ol_iff_plant_model.png index 356bd2f..0ca778e 100644 Binary files a/figs/test_id31_comp_ol_iff_plant_model.png and b/figs/test_id31_comp_ol_iff_plant_model.png differ diff --git a/figs/test_id31_iff_schematic.pdf b/figs/test_id31_iff_schematic.pdf index 67b7e4d..0f45952 100644 Binary files a/figs/test_id31_iff_schematic.pdf and b/figs/test_id31_iff_schematic.pdf differ diff --git a/figs/test_id31_iff_schematic.png b/figs/test_id31_iff_schematic.png index 4330ff9..21b818d 100644 Binary files a/figs/test_id31_iff_schematic.png and b/figs/test_id31_iff_schematic.png differ diff --git a/figs/test_id31_iff_schematic.svg b/figs/test_id31_iff_schematic.svg index 880cf6a..0c89c76 100644 --- a/figs/test_id31_iff_schematic.svg +++ b/figs/test_id31_iff_schematic.svg @@ -33,16 +33,16 @@ - + - + - + - + @@ -57,10 +57,10 @@ - + - - + + @@ -137,10 +137,10 @@ - + - + @@ -148,6 +148,6 @@ - + diff --git a/test-bench-id31.org b/test-bench-id31.org index a1d6364..bdab9cc 100644 --- a/test-bench-id31.org +++ b/test-bench-id31.org @@ -982,7 +982,7 @@ Voltages generated by the force sensor piezoelectric stacks $\bm{V}_s = [V_{s1}, \draw[->] (outputRy) node[above right]{$r_{R_y}$} -- (outputRy-|ustation_kinematics.west); \draw[->] (outputRz) node[above right]{$r_{R_z}$} -- (outputRz-|ustation_kinematics.west); - \draw[->] (outputVs) -- ++(0.8, 0) node[above left]{$\bm{V}_s$}; + % \draw[->] (outputVs) -- ++(0.8, 0) node[above left]{$\bm{V}_s$}; \draw[->] (metrology.east) -- (metrology_kinematics.west) node[above left]{$\bm{d}$}; @@ -993,9 +993,16 @@ Voltages generated by the force sensor piezoelectric stacks $\bm{V}_s = [V_{s1}, \draw[->] (outputde) -- (Rz_kinematics.west) node[above left]{$\bm{d}_{e}$}; \draw[->] (ustation_kinematics.east) -- (compute_error.west) node[above left]{$\bm{r}_{\mathcal{X}}$}; \draw[->] (compute_error.east) -- (hexa_jacobian.west) node[above left]{$\bm{\epsilon\mathcal{X}}$}; - \draw[->] (hexa_jacobian.east) -- ++(0.8, 0) node[above left]{$\bm{\epsilon\mathcal{L}}$}; + \draw[->] (hexa_jacobian.east) -- ++(0.8, 0)coordinate(eL) node[above left]{$\bm{\epsilon\mathcal{L}}$}; \draw[->] (pd200.east) -- (inputVa) node[above left]{$\bm{V}_a$}; \draw[<-] (pd200.west) -- ++(-0.8, 0) node[above right]{$\bm{u}$}; + + \draw[->] (outputVs) -- (outputVs-|eL) node[above left]{$\bm{V}_s$}; + + \begin{scope}[on background layer] + \node[fit={(metrology.north-|pd200.west) (hexa_jacobian.east|-compute_error.south)}, fill=black!20!white, draw, dashed, inner sep=4pt] (plant) {}; + \node[anchor={north west}] at (plant.north west){$\text{Plant}$}; + \end{scope} \end{tikzpicture} #+end_src @@ -1939,7 +1946,9 @@ The spindle rotation has no visible effect on the measured dynamics, indicating <> ** Introduction :ignore: -Before implementing a position controller, an active damping controller was first implemented as shown in Figure ref:fig:test_id31_iff_block_diagram. +The HAC-LAC strategy that was previously developed and validated using the multi-body model is now experimentally implemented. + +In this section, the low authority control part is first validated. It consisted of a decentralized Integral Force Feedback controller $\bm{K}_{\text{IFF}}$, with all the diagonal terms being equal eqref:eq:test_id31_Kiff. \begin{equation}\label{eq:test_id31_iff_diagonal} @@ -1950,6 +1959,8 @@ K_{\text{IFF}} & & 0 \\ \end{bmatrix} \end{equation} +And it is implemented as shown in the block diagram of Figure ref:fig:test_id31_iff_block_diagram. + #+begin_src latex :file test_id31_iff_schematic.pdf \begin{tikzpicture} % Blocs @@ -1967,8 +1978,8 @@ K_{\text{IFF}} & & 0 \\ \draw[->] (Klac.west) -| (addF.north); \draw[->] (addF.east) -- (input) node[above left]{$\bm{u}$}; - \draw[->] (outputH) -- ++(1.6, 0) node[above left]{$\bm{\epsilon}_{\mathcal{L}}$}; - \draw[<-] (addF.west) -- ++(-1.0, 0) node[above right]{$\bm{u}^{\prime}$}; + \draw[->] (outputH) -- ++(1.6, 0) node[above left]{$\bm{\epsilon\mathcal{L}}$}; + \draw[<-] (addF.west) -- ++(-1.0, 0) node[above right]{$\bm{u^{\prime}}$}; \begin{scope}[on background layer] \node[fit={(Klac.north-|eastlac) (addF.west|-P.south)}, fill=black!20!white, draw, dashed, inner sep=10pt] (Pi) {}; @@ -2014,10 +2025,13 @@ K_{\text{IFF}} & & 0 \\ ** IFF Plant <> -As the multi-body model is going to be used to estimate the stability of the IFF controller and to optimize achievable damping, it is first checked is this model accurately represents the system dynamics. +As the multi-body model is going to be used to evaluate the stability of the IFF controller and to optimize the achievable damping, it is first checked whether this model accurately represents the system dynamics. -In Figure ref:fig:test_id31_comp_simscape_iff_diag_masses, it was shown that the model well captures the dynamics from each actuator to its collocated force sensor, as that for all considered payloads. -The model is also accurate for the dynamics from an actuator to the force sensors in the other struts (i.e. the off-diagonal dynamics) as shown in Figure ref:fig:test_id31_comp_simscape_Vs. +In the previous section (Figure ref:fig:test_id31_comp_simscape_iff_diag_masses), it was shown that the model well captures the dynamics from each actuator to its collocated force sensor, and that for all considered payloads. +Nevertheless, it is also important to well model the coupling in the system. +To very that, instead of comparing the 36 elements of the $6 \times 6$ frequency response matrix from $\bm{u}$ to $\bm{V_s}$, only 6 elements are compared in Figure ref:fig:test_id31_comp_simscape_Vs. +Similar results are obtained for all other 30 elements and for the different tested payload conditions. +This confirms that the multi-body model can be used to tune the IFF controller. #+begin_src matlab % Load identified FRF for IFF Plant and Multi-Body Model @@ -2108,17 +2122,17 @@ exportFig('figs/test_id31_comp_simscape_Vs.pdf', 'width', 'full', 'height', 700) ** IFF Controller <> -A decentralized IFF controller is there designed such that it adds damping to the suspension modes of the nano-hexapod for all considered payloads. +A decentralized IFF controller was designed such that it adds damping to the suspension modes of the nano-hexapod for all considered payloads. The frequency of the suspension modes are ranging from $\approx 30\,\text{Hz}$ to $\approx 250\,\text{Hz}$ (Figure ref:fig:test_id31_comp_simscape_iff_diag_masses), and therefore the IFF controller should provide integral action in this frequency range. -A second order high pass filter (cut-off frequency of $10\,\text{Hz}$) is added to limit the low frequency gain. - -The bode plot of the decentralized IFF controller is shown in Figure ref:fig:test_id31_Kiff_bode_plot and the "decentralized loop-gains" for all considered payload masses are shown in Figure ref:fig:test_id31_Kiff_loop_gain. -It can be seen that the loop-gain is larger than $1$ around suspension modes indicating that some damping should be added to the suspension modes. +A second order high pass filter (cut-off frequency of $10\,\text{Hz}$) was added to limit the low frequency gain eqref:eq:test_id31_Kiff. \begin{equation}\label{eq:test_id31_Kiff} K_{\text{IFF}} = g_0 \cdot \underbrace{\frac{1}{s}}_{\text{int}} \cdot \underbrace{\frac{s^2/\omega_z^2}{s^2/\omega_z^2 + 2\xi_z s /\omega_z + 1}}_{\text{2nd order LPF}},\quad \left(g_0 = -100,\ \omega_z = 2\pi10\,\text{rad/s},\ \xi_z = 0.7\right) \end{equation} +The bode plot of the decentralized IFF controller is shown in Figure ref:fig:test_id31_Kiff_bode_plot and the "decentralized loop-gains" for all considered payload masses are shown in Figure ref:fig:test_id31_Kiff_loop_gain. +It can be seen that the loop-gain is larger than $1$ around suspension modes indicating that some damping should be added to the suspension modes. + #+begin_src matlab %% IFF Controller Design % Second order high pass filter @@ -2243,8 +2257,8 @@ exportFig('figs/test_id31_Kiff_loop_gain.pdf', 'width', 'half', 'height', 600); To estimate the added damping, a root-locus plot is computed using the multi-body model (Figure ref:fig:test_id31_iff_root_locus_m0). It can be seen that for all considered payloads, the poles are bounded to the "left-half plane" indicating that the decentralized IFF is robust. The closed-loop poles for the chosen value of the gain are displayed by black crosses. -It can be seen that while damping can be added for all payloads (as compared to the open-loop case), the optimal value of the gain could be tuned separately for each payload. -For instance, for low payload masses, a higher value of the IFF controller gain could lead to better damping. +It can be seen that while damping can be added for all payloads (as compared to the open-loop case), the optimal value of the gain is different for each payload. +For low payload masses, a higher value of the IFF controller gain could lead to better damping. However, in this study, it was chosen to implement a fix (i.e. non-adaptive) decentralized IFF controller. #+begin_src matlab :exports none :results none @@ -2413,12 +2427,15 @@ exportFig('figs/test_id31_iff_root_locus_m3.pdf', 'width', 'third', 'height', 'n #+end_subfigure #+end_figure -** Estimated Damped Plant +** Damped Plant <> As the model is accurately modelling the system dynamics, it can be used to estimate the damped plant, i.e. the transfer functions from $\bm{u}^\prime$ to $\bm{\mathcal{L}}$. -The obtained damped plants are compared with the open-loop plants in Figure ref:fig:test_id31_comp_ol_iff_plant_model. -The peak amplitudes corresponding to the suspension modes are approximately reduced by a factor $10$ for all considered payloads, and with the same decentralized IFF controller. +The obtained damped plants are compared to the open-loop plants in Figure ref:fig:test_id31_comp_ol_iff_plant_model. +The peak amplitudes corresponding to the suspension modes are approximately reduced by a factor $10$ for all considered payloads, showing the effectiveness of the decentralized IFF control strategy. + +In order to experimentally validate the Decentralized IFF controller, it was implemented and the damped plants (i.e. the transfer function from $\bm{u}^\prime$ to $\bm{\epsilon\mathcal{L}}$) were identified for all payload conditions. +The obtained frequency response functions are compared with the model in Figure ref:fig:test_id31_hac_plant_effect_mass verifying the good correlation between the predicted damped plant using the multi-body model and the experimental results. #+begin_src matlab %% Estimate damped plant from Multi-Body model @@ -2495,19 +2512,183 @@ linkaxes([ax1,ax2],'x'); xlim([1, 1e3]); #+end_src -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/test_id31_comp_ol_iff_plant_model.pdf', 'width', 'wide', 'height', 600); +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_id31_comp_ol_iff_plant_model.pdf', 'width', 'half', 'height', 600); #+end_src -#+name: fig:test_id31_comp_ol_iff_plant_model -#+caption: Comparison of the open-loop plants and the estimated damped plant with Decentralized IFF. -#+RESULTS: +#+begin_src matlab +%% Identification of the damped Plant (transfer function from u' to dL) + +% Load identification data +data_m0 = load('2023-08-17_17-53_damp_plant_m0_Wz0.mat'); +data_m1 = load('2023-08-10_16-01_damp_plant_m1_Wz0.mat'); +data_m2 = load('2023-08-10_17-28_damp_plant_m2_Wz0.mat'); +data_m3 = load('2023-08-10_18-16_damp_plant_m3_Wz0.mat'); + +% Hannning Windows +Ts = 1e-4; % Sampling Time [s] +Nfft = floor(2.0/Ts); +win = hanning(Nfft); +Noverlap = floor(Nfft/2); + +% And we get the frequency vector +[~, f] = tfestimate(data_m0.uL1.id_plant, data_m0.uL1.e_L1, win, Noverlap, Nfft, 1/Ts); + +% Identification without any payload +G_hac_m0_Wz0 = zeros(length(f), 6, 6); +for i_strut = 1:6 + eL = [data_m0.(sprintf("uL%i", i_strut)).e_L1 ; data_m0.(sprintf("uL%i", i_strut)).e_L2 ; data_m0.(sprintf("uL%i", i_strut)).e_L3 ; data_m0.(sprintf("uL%i", i_strut)).e_L4 ; data_m0.(sprintf("uL%i", i_strut)).e_L5 ; data_m0.(sprintf("uL%i", i_strut)).e_L6]'; + + G_hac_m0_Wz0(:,:,i_strut) = tfestimate(data_m0.(sprintf("uL%i", i_strut)).id_plant, -detrend(eL, 0), win, Noverlap, Nfft, 1/Ts); +end + +% Identification with 1 "payload layer" +G_hac_m1_Wz0 = zeros(length(f), 6, 6); +for i_strut = 1:6 + eL = [data_m1.(sprintf("uL%i", i_strut)).e_L1 ; data_m1.(sprintf("uL%i", i_strut)).e_L2 ; data_m1.(sprintf("uL%i", i_strut)).e_L3 ; data_m1.(sprintf("uL%i", i_strut)).e_L4 ; data_m1.(sprintf("uL%i", i_strut)).e_L5 ; data_m1.(sprintf("uL%i", i_strut)).e_L6]'; + + G_hac_m1_Wz0(:,:,i_strut) = tfestimate(data_m1.(sprintf("uL%i", i_strut)).id_plant, -detrend(eL, 0), win, Noverlap, Nfft, 1/Ts); +end + +% Identification with 2 "payload layers" +G_hac_m2_Wz0 = zeros(length(f), 6, 6); +for i_strut = 1:6 + eL = [data_m2.(sprintf("uL%i", i_strut)).e_L1 ; data_m2.(sprintf("uL%i", i_strut)).e_L2 ; data_m2.(sprintf("uL%i", i_strut)).e_L3 ; data_m2.(sprintf("uL%i", i_strut)).e_L4 ; data_m2.(sprintf("uL%i", i_strut)).e_L5 ; data_m2.(sprintf("uL%i", i_strut)).e_L6]'; + + G_hac_m2_Wz0(:,:,i_strut) = tfestimate(data_m2.(sprintf("uL%i", i_strut)).id_plant, -detrend(eL, 0), win, Noverlap, Nfft, 1/Ts); +end + +% Identification with 3 "payload layers" +G_hac_m3_Wz0 = zeros(length(f), 6, 6); +for i_strut = 1:6 + eL = [data_m3.(sprintf("uL%i", i_strut)).e_L1 ; data_m3.(sprintf("uL%i", i_strut)).e_L2 ; data_m3.(sprintf("uL%i", i_strut)).e_L3 ; data_m3.(sprintf("uL%i", i_strut)).e_L4 ; data_m3.(sprintf("uL%i", i_strut)).e_L5 ; data_m3.(sprintf("uL%i", i_strut)).e_L6]'; + + G_hac_m3_Wz0(:,:,i_strut) = tfestimate(data_m3.(sprintf("uL%i", i_strut)).id_plant, -detrend(eL, 0), win, Noverlap, Nfft, 1/Ts); +end +#+end_src + +#+begin_src matlab :exports none :tangle no +% The identified dynamics are then saved for further use. +save('./matlab/mat/test_id31_identified_damped_plants.mat', 'G_hac_m0_Wz0', 'G_hac_m1_Wz0', 'G_hac_m2_Wz0', 'G_hac_m3_Wz0', 'f'); +#+end_src + +#+begin_src matlab :eval no +% The identified dynamics are then saved for further use. +save('./mat/test_id31_identified_damped_plants.mat', 'G_hac_m0_Wz0', 'G_hac_m1_Wz0', 'G_hac_m2_Wz0', 'G_hac_m3_Wz0', 'f'); +#+end_src + +#+begin_src matlab :exports none :results none +%% Comparison of the identified HAC plant and the HAC plant extracted from the simscape model +figure; +tiledlayout(3, 1, 'TileSpacing', 'compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +plot(f, abs(G_hac_m0_Wz0(:, 1, 1)), 'color', [colors(1,:), 0.2], ... + 'DisplayName', '$m = 0$ kg'); +for i = 2:6 + plot(f, abs(G_hac_m0_Wz0(:,i, i)), 'color', [colors(1,:), 0.2], ... + 'HandleVisibility', 'off') +end +plot(f, abs(G_hac_m1_Wz0(:, 1, 1)), 'color', [colors(2,:), 0.2], ... + 'DisplayName', '$m = 13$ kg'); +for i = 2:6 + plot(f, abs(G_hac_m1_Wz0(:,i, i)), 'color', [colors(2,:), 0.2], ... + 'HandleVisibility', 'off') +end +plot(f, abs(G_hac_m2_Wz0(:, 1, 1)), 'color', [colors(3,:), 0.2], ... + 'DisplayName', '$m = 26$ kg'); +for i = 2:6 + plot(f, abs(G_hac_m2_Wz0(:,i, i)), 'color', [colors(3,:), 0.2], ... + 'HandleVisibility', 'off') +end +plot(f, abs(G_hac_m3_Wz0(:, 1, 1)), 'color', [colors(4,:), 0.2], ... + 'DisplayName', '$m = 39$ kg'); +for i = 2:6 + plot(f, abs(G_hac_m3_Wz0(:,i, i)), 'color', [colors(4,:), 0.2], ... + 'HandleVisibility', 'off') +end +plot(freqs, abs(squeeze(freqresp(Gm_hac_m0_Wz0('eL1', 'u1'), freqs, 'Hz'))), '--', 'color', colors(1,:), ... + 'DisplayName', '$m = 0$ kg (model)'); +plot(freqs, abs(squeeze(freqresp(Gm_hac_m1_Wz0('eL1', 'u1'), freqs, 'Hz'))), '--', 'color', colors(2,:), ... + 'DisplayName', '$m = 13$ kg (model)'); +plot(freqs, abs(squeeze(freqresp(Gm_hac_m2_Wz0('eL1', 'u1'), freqs, 'Hz'))), '--', 'color', colors(3,:), ... + 'DisplayName', '$m = 26$ kg (model)'); +plot(freqs, abs(squeeze(freqresp(Gm_hac_m3_Wz0('eL1', 'u1'), freqs, 'Hz'))), '--', 'color', colors(4,:), ... + 'DisplayName', '$m = 39$ kg (model)'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude [m/V]'); set(gca, 'XTickLabel',[]); +ylim([2e-7, 3e-5]); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2); +leg.ItemTokenSize(1) = 15; + +ax2 = nexttile; +hold on; +plot(f, 180/pi*unwrapphase(angle(G_hac_m0_Wz0(:,1,1)), f), 'color', [colors(1,:), 0.2]); +for i = 2:6 + plot(f, 180/pi*unwrapphase(angle(G_hac_m0_Wz0(:,i, i)), f), 'color', [colors(1,:), 0.2]); +end +plot(f, 180/pi*unwrapphase(angle(G_hac_m1_Wz0(:,1,1)), f), 'color', [colors(2,:), 0.2]); +for i = 2:6 + plot(f, 180/pi*unwrapphase(angle(G_hac_m1_Wz0(:,i, i)), f), 'color', [colors(2,:), 0.2]); +end +plot(f, 180/pi*unwrapphase(angle(G_hac_m2_Wz0(:,1,1)), f), 'color', [colors(3,:), 0.2]); +for i = 2:6 + plot(f, 180/pi*unwrapphase(angle(G_hac_m2_Wz0(:,i, i)), f), 'color', [colors(3,:), 0.2]); +end +plot(f, 180/pi*unwrapphase(angle(G_hac_m3_Wz0(:,1,1)), f), 'color', [colors(4,:), 0.2]); +for i = 2:6 + plot(f, 180/pi*unwrapphase(angle(G_hac_m3_Wz0(:,i, i)), f), 'color', [colors(4,:), 0.2]); +end +plot(freqs, 180/pi*unwrapphase(angle(squeeze(freqresp(-exp(-3e-4*s)*Gm_hac_m0_Wz0('eL1', 'u1'), freqs, 'Hz'))), f), '--', 'color', colors(1,:)); +plot(freqs, 180/pi*unwrapphase(angle(squeeze(freqresp(-exp(-3e-4*s)*Gm_hac_m1_Wz0('eL1', 'u1'), freqs, 'Hz'))), f), '--', 'color', colors(2,:)); +plot(freqs, 180/pi*unwrapphase(angle(squeeze(freqresp(-exp(-3e-4*s)*Gm_hac_m2_Wz0('eL1', 'u1'), freqs, 'Hz'))), f), '--', 'color', colors(3,:)); +plot(freqs, 180/pi*unwrapphase(angle(squeeze(freqresp(-exp(-3e-4*s)*Gm_hac_m3_Wz0('eL1', 'u1'), freqs, 'Hz'))), f), '--', 'color', colors(4,:)); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); +ylim([-270, 20]) + +linkaxes([ax1,ax2],'x'); +xlim([1, 5e2]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file none +exportFig('figs/test_id31_hac_plant_effect_mass.pdf', 'width', 'half', 'height', 600); +#+end_src + +#+name: fig:test_id31_hac_plant_effect_mass_comp_model +#+caption: Comparison of the open-loop plants and the damped plant with Decentralized IFF, estimated from the multi-body model (\subref{fig:test_id31_comp_ol_iff_plant_model}). Comparison of the measured damped plants and modeled plants for all considered payloads (\subref{fig:test_id31_hac_plant_effect_mass}). Only "direct" terms ($\epsilon\mathcal{L}_i/u_i^\prime$) are displayed for simplificty +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:test_id31_comp_ol_iff_plant_model}Effect of IFF on the plant} +#+attr_latex: :options {0.49\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth [[file:figs/test_id31_comp_ol_iff_plant_model.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:test_id31_hac_plant_effect_mass}Comparison of model and experimental results} +#+attr_latex: :options {0.49\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/test_id31_hac_plant_effect_mass.png]] +#+end_subfigure +#+end_figure ** Conclusion :PROPERTIES: :UNNUMBERED: t :END: + +The implementation of a decentralized Integral Force Feedback controller has been successfully demonstrated. +Using the multi-body model, the controller was designed and optimized to ensure stability across all payload conditions while providing significant damping of suspension modes. +The experimental results validated the model predictions, showing a reduction of peak amplitudes by approximately a factor of 10 across the full payload range (0-39 kg). +While higher gains could potentially achieve better damping performance for lighter payloads, the chosen fixed-gain configuration represents a robust compromise that maintains stability and performance across all operating conditions. +The good correlation between the modeled and measured damped plants confirms the effectiveness of using the multi-body model for both controller design and performance prediction. + * High Authority Control in the frame of the struts :PROPERTIES: :header-args:matlab+: :tangle matlab/test_id31_4_hac.m @@ -2593,73 +2774,13 @@ K_{\text{HAC}} & & 0 \\ ** Damped Plant <> -The damped plants (i.e. the transfer function from $\bm{u}^\prime$ to $\bm{\epsilon\mathcal{L}}$) were identified for all payload conditions. To verify if the model accurately represents the damped plants, both direct terms and coupling terms corresponding to the first actuator are compared in Figure ref:fig:test_id31_comp_simscape_hac. -#+begin_src matlab -%% Identification of the damped Plant (transfer function from u' to dL) - -% Load identification data -data_m0 = load('2023-08-17_17-53_damp_plant_m0_Wz0.mat'); -data_m1 = load('2023-08-10_16-01_damp_plant_m1_Wz0.mat'); -data_m2 = load('2023-08-10_17-28_damp_plant_m2_Wz0.mat'); -data_m3 = load('2023-08-10_18-16_damp_plant_m3_Wz0.mat'); - -% Hannning Windows -Ts = 1e-4; % Sampling Time [s] -Nfft = floor(2.0/Ts); -win = hanning(Nfft); -Noverlap = floor(Nfft/2); - -% And we get the frequency vector -[~, f] = tfestimate(data_m0.uL1.id_plant, data_m0.uL1.e_L1, win, Noverlap, Nfft, 1/Ts); - -% Identification without any payload -G_hac_m0_Wz0 = zeros(length(f), 6, 6); -for i_strut = 1:6 - eL = [data_m0.(sprintf("uL%i", i_strut)).e_L1 ; data_m0.(sprintf("uL%i", i_strut)).e_L2 ; data_m0.(sprintf("uL%i", i_strut)).e_L3 ; data_m0.(sprintf("uL%i", i_strut)).e_L4 ; data_m0.(sprintf("uL%i", i_strut)).e_L5 ; data_m0.(sprintf("uL%i", i_strut)).e_L6]'; - - G_hac_m0_Wz0(:,:,i_strut) = tfestimate(data_m0.(sprintf("uL%i", i_strut)).id_plant, -detrend(eL, 0), win, Noverlap, Nfft, 1/Ts); -end - -% Identification with 1 "payload layer" -G_hac_m1_Wz0 = zeros(length(f), 6, 6); -for i_strut = 1:6 - eL = [data_m1.(sprintf("uL%i", i_strut)).e_L1 ; data_m1.(sprintf("uL%i", i_strut)).e_L2 ; data_m1.(sprintf("uL%i", i_strut)).e_L3 ; data_m1.(sprintf("uL%i", i_strut)).e_L4 ; data_m1.(sprintf("uL%i", i_strut)).e_L5 ; data_m1.(sprintf("uL%i", i_strut)).e_L6]'; - - G_hac_m1_Wz0(:,:,i_strut) = tfestimate(data_m1.(sprintf("uL%i", i_strut)).id_plant, -detrend(eL, 0), win, Noverlap, Nfft, 1/Ts); -end - -% Identification with 2 "payload layers" -G_hac_m2_Wz0 = zeros(length(f), 6, 6); -for i_strut = 1:6 - eL = [data_m2.(sprintf("uL%i", i_strut)).e_L1 ; data_m2.(sprintf("uL%i", i_strut)).e_L2 ; data_m2.(sprintf("uL%i", i_strut)).e_L3 ; data_m2.(sprintf("uL%i", i_strut)).e_L4 ; data_m2.(sprintf("uL%i", i_strut)).e_L5 ; data_m2.(sprintf("uL%i", i_strut)).e_L6]'; - - G_hac_m2_Wz0(:,:,i_strut) = tfestimate(data_m2.(sprintf("uL%i", i_strut)).id_plant, -detrend(eL, 0), win, Noverlap, Nfft, 1/Ts); -end - -% Identification with 3 "payload layers" -G_hac_m3_Wz0 = zeros(length(f), 6, 6); -for i_strut = 1:6 - eL = [data_m3.(sprintf("uL%i", i_strut)).e_L1 ; data_m3.(sprintf("uL%i", i_strut)).e_L2 ; data_m3.(sprintf("uL%i", i_strut)).e_L3 ; data_m3.(sprintf("uL%i", i_strut)).e_L4 ; data_m3.(sprintf("uL%i", i_strut)).e_L5 ; data_m3.(sprintf("uL%i", i_strut)).e_L6]'; - - G_hac_m3_Wz0(:,:,i_strut) = tfestimate(data_m3.(sprintf("uL%i", i_strut)).id_plant, -detrend(eL, 0), win, Noverlap, Nfft, 1/Ts); -end -#+end_src - -#+begin_src matlab :exports none :tangle no -% The identified dynamics are then saved for further use. -save('./matlab/mat/test_id31_identified_damped_plants.mat', 'G_hac_m0_Wz0', 'G_hac_m1_Wz0', 'G_hac_m2_Wz0', 'G_hac_m3_Wz0', 'f'); -#+end_src - -#+begin_src matlab :eval no -% The identified dynamics are then saved for further use. -save('./mat/test_id31_identified_damped_plants.mat', 'G_hac_m0_Wz0', 'G_hac_m1_Wz0', 'G_hac_m2_Wz0', 'G_hac_m3_Wz0', 'f'); -#+end_src - #+begin_src matlab % Load the estimated damped plant from the multi-body model load('test_id31_simscape_damped_plants.mat', 'Gm_hac_m0_Wz0', 'Gm_hac_m1_Wz0', 'Gm_hac_m2_Wz0', 'Gm_hac_m3_Wz0'); +% Load the measured damped plants +load('test_id31_identified_damped_plants.mat', 'G_hac_m0_Wz0', 'G_hac_m1_Wz0', 'G_hac_m2_Wz0', 'G_hac_m3_Wz0', 'f'); % Load the undamped plant for comparison load('test_id31_identified_open_loop_plants.mat', 'G_int_m0_Wz0', 'G_int_m1_Wz0', 'G_int_m2_Wz0', 'G_int_m3_Wz0', 'f'); #+end_src @@ -2747,94 +2868,11 @@ exportFig('figs/test_id31_comp_simscape_hac.pdf', 'width', 'full', 'height', 700 The six direct terms for all four payload conditions are compared with the model in Figure ref:fig:test_id31_hac_plant_effect_mass. It is shown that the model accurately represents the dynamics for all payloads. -In Section ref:sec:test_id31_iff, a High Authority Controller is tuned to be robust to the change of dynamics due to different payloads used. +In this section ref:sec:test_id31_iff, a High Authority Controller is tuned to be robust to the change of dynamics due to different payloads used. Without decentralized IFF being applied, the controller would have had to be robust to all the undamped dynamics shown in Figure ref:fig:test_id31_comp_all_undamped_damped_plants, which is a very complex control problem. With the applied decentralized IFF, the HAC instead had to be be robust to all the damped dynamics shown in Figure ref:fig:test_id31_comp_all_undamped_damped_plants, which is easier from a control perspective. This is one of the key benefit of using the HAC-LAC strategy. -#+begin_src matlab :exports none :results none -%% Comparison of the identified HAC plant and the HAC plant extracted from the simscape model -figure; -tiledlayout(3, 1, 'TileSpacing', 'compact', 'Padding', 'None'); - -ax1 = nexttile([2,1]); -hold on; -plot(f, abs(G_hac_m0_Wz0(:, 1, 1)), 'color', [colors(1,:), 0.2], ... - 'DisplayName', '$m = 0$ kg'); -for i = 2:6 - plot(f, abs(G_hac_m0_Wz0(:,i, i)), 'color', [colors(1,:), 0.2], ... - 'HandleVisibility', 'off') -end -plot(f, abs(G_hac_m1_Wz0(:, 1, 1)), 'color', [colors(2,:), 0.2], ... - 'DisplayName', '$m = 13$ kg'); -for i = 2:6 - plot(f, abs(G_hac_m1_Wz0(:,i, i)), 'color', [colors(2,:), 0.2], ... - 'HandleVisibility', 'off') -end -plot(f, abs(G_hac_m2_Wz0(:, 1, 1)), 'color', [colors(3,:), 0.2], ... - 'DisplayName', '$m = 26$ kg'); -for i = 2:6 - plot(f, abs(G_hac_m2_Wz0(:,i, i)), 'color', [colors(3,:), 0.2], ... - 'HandleVisibility', 'off') -end -plot(f, abs(G_hac_m3_Wz0(:, 1, 1)), 'color', [colors(4,:), 0.2], ... - 'DisplayName', '$m = 39$ kg'); -for i = 2:6 - plot(f, abs(G_hac_m3_Wz0(:,i, i)), 'color', [colors(4,:), 0.2], ... - 'HandleVisibility', 'off') -end -plot(freqs, abs(squeeze(freqresp(Gm_hac_m0_Wz0('eL1', 'u1'), freqs, 'Hz'))), '--', 'color', colors(1,:), ... - 'DisplayName', '$m = 0$ kg (model)'); -plot(freqs, abs(squeeze(freqresp(Gm_hac_m1_Wz0('eL1', 'u1'), freqs, 'Hz'))), '--', 'color', colors(2,:), ... - 'DisplayName', '$m = 13$ kg (model)'); -plot(freqs, abs(squeeze(freqresp(Gm_hac_m2_Wz0('eL1', 'u1'), freqs, 'Hz'))), '--', 'color', colors(3,:), ... - 'DisplayName', '$m = 26$ kg (model)'); -plot(freqs, abs(squeeze(freqresp(Gm_hac_m3_Wz0('eL1', 'u1'), freqs, 'Hz'))), '--', 'color', colors(4,:), ... - 'DisplayName', '$m = 39$ kg (model)'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude [m/V]'); set(gca, 'XTickLabel',[]); -ylim([2e-7, 3e-5]); -leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2); -leg.ItemTokenSize(1) = 15; - -ax2 = nexttile; -hold on; -plot(f, 180/pi*unwrapphase(angle(G_hac_m0_Wz0(:,1,1)), f), 'color', [colors(1,:), 0.2]); -for i = 2:6 - plot(f, 180/pi*unwrapphase(angle(G_hac_m0_Wz0(:,i, i)), f), 'color', [colors(1,:), 0.2]); -end -plot(f, 180/pi*unwrapphase(angle(G_hac_m1_Wz0(:,1,1)), f), 'color', [colors(2,:), 0.2]); -for i = 2:6 - plot(f, 180/pi*unwrapphase(angle(G_hac_m1_Wz0(:,i, i)), f), 'color', [colors(2,:), 0.2]); -end -plot(f, 180/pi*unwrapphase(angle(G_hac_m2_Wz0(:,1,1)), f), 'color', [colors(3,:), 0.2]); -for i = 2:6 - plot(f, 180/pi*unwrapphase(angle(G_hac_m2_Wz0(:,i, i)), f), 'color', [colors(3,:), 0.2]); -end -plot(f, 180/pi*unwrapphase(angle(G_hac_m3_Wz0(:,1,1)), f), 'color', [colors(4,:), 0.2]); -for i = 2:6 - plot(f, 180/pi*unwrapphase(angle(G_hac_m3_Wz0(:,i, i)), f), 'color', [colors(4,:), 0.2]); -end -plot(freqs, 180/pi*unwrapphase(angle(squeeze(freqresp(-exp(-3e-4*s)*Gm_hac_m0_Wz0('eL1', 'u1'), freqs, 'Hz'))), f), '--', 'color', colors(1,:)); -plot(freqs, 180/pi*unwrapphase(angle(squeeze(freqresp(-exp(-3e-4*s)*Gm_hac_m1_Wz0('eL1', 'u1'), freqs, 'Hz'))), f), '--', 'color', colors(2,:)); -plot(freqs, 180/pi*unwrapphase(angle(squeeze(freqresp(-exp(-3e-4*s)*Gm_hac_m2_Wz0('eL1', 'u1'), freqs, 'Hz'))), f), '--', 'color', colors(3,:)); -plot(freqs, 180/pi*unwrapphase(angle(squeeze(freqresp(-exp(-3e-4*s)*Gm_hac_m3_Wz0('eL1', 'u1'), freqs, 'Hz'))), f), '--', 'color', colors(4,:)); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks(-360:90:360); -ylim([-270, 20]) - -linkaxes([ax1,ax2],'x'); -xlim([1, 5e2]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file none -exportFig('figs/test_id31_hac_plant_effect_mass.pdf', 'width', 'half', 'height', 600); -#+end_src - #+begin_src matlab :exports none :results none %% Comparison of all the undamped FRF and all the damped FRF figure; @@ -2892,6 +2930,8 @@ xlim([1, 5e2]); exportFig('figs/test_id31_comp_all_undamped_damped_plants.pdf', 'width', 'half', 'height', 600); #+end_src +Comparison of all undamped $\epsilon\mathcal{L}_i/u_i$ and damped $\epsilon\mathcal{L}_i/u_i^\prime$ measured frequency response functions for all payloads is done in (\subref{fig:test_id31_comp_all_undamped_damped_plants}). + #+name: fig:test_id31_hac_plant_effect_mass_comp_model #+caption: Comparison of the measured damped plants and modeled plants for all considered payloads, only "direct" terms ($\epsilon\mathcal{L}_i/u_i^\prime$) are displayed (\subref{fig:test_id31_hac_plant_effect_mass}). Comparison of all undamped $\epsilon\mathcal{L}_i/u_i$ and damped $\epsilon\mathcal{L}_i/u_i^\prime$ measured frequency response functions for all payloads is done in (\subref{fig:test_id31_comp_all_undamped_damped_plants}). #+attr_latex: :options [htbp] diff --git a/test-bench-id31.pdf b/test-bench-id31.pdf index bfc82ae..e110d4a 100644 Binary files a/test-bench-id31.pdf and b/test-bench-id31.pdf differ diff --git a/test-bench-id31.tex b/test-bench-id31.tex index 434e6ae..5c3dc57 100644 --- a/test-bench-id31.tex +++ b/test-bench-id31.tex @@ -1,4 +1,4 @@ -% Created 2025-02-01 Sat 10:36 +% Created 2025-02-01 Sat 12:10 % Intended LaTeX compiler: pdflatex \documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt} @@ -446,7 +446,9 @@ The spindle rotation has no visible effect on the measured dynamics, indicating \chapter{Decentralized Integral Force Feedback} \label{sec:test_id31_iff} -Before implementing a position controller, an active damping controller was first implemented as shown in Figure \ref{fig:test_id31_iff_block_diagram}. +The HAC-LAC strategy that was previously developed and validated using the multi-body model is now experimentally implemented. + +In this section, the low authority control part is first validated. It consisted of a decentralized Integral Force Feedback controller \(\bm{K}_{\text{IFF}}\), with all the diagonal terms being equal \eqref{eq:test_id31_Kiff}. \begin{equation}\label{eq:test_id31_iff_diagonal} @@ -457,6 +459,8 @@ K_{\text{IFF}} & & 0 \\ \end{bmatrix} \end{equation} +And it is implemented as shown in the block diagram of Figure \ref{fig:test_id31_iff_block_diagram}. + \begin{figure}[htbp] \centering \includegraphics[scale=1]{figs/test_id31_iff_schematic.png} @@ -465,10 +469,13 @@ K_{\text{IFF}} & & 0 \\ \section{IFF Plant} \label{ssec:test_id31_iff_plant} -As the multi-body model is going to be used to estimate the stability of the IFF controller and to optimize achievable damping, it is first checked is this model accurately represents the system dynamics. +As the multi-body model is going to be used to evaluate the stability of the IFF controller and to optimize the achievable damping, it is first checked whether this model accurately represents the system dynamics. -In Figure \ref{fig:test_id31_comp_simscape_iff_diag_masses}, it was shown that the model well captures the dynamics from each actuator to its collocated force sensor, as that for all considered payloads. -The model is also accurate for the dynamics from an actuator to the force sensors in the other struts (i.e. the off-diagonal dynamics) as shown in Figure \ref{fig:test_id31_comp_simscape_Vs}. +In the previous section (Figure \ref{fig:test_id31_comp_simscape_iff_diag_masses}), it was shown that the model well captures the dynamics from each actuator to its collocated force sensor, and that for all considered payloads. +Nevertheless, it is also important to well model the coupling in the system. +To very that, instead of comparing the 36 elements of the \(6 \times 6\) frequency response matrix from \(\bm{u}\) to \(\bm{V_s}\), only 6 elements are compared in Figure \ref{fig:test_id31_comp_simscape_Vs}. +Similar results are obtained for all other 30 elements and for the different tested payload conditions. +This confirms that the multi-body model can be used to tune the IFF controller. \begin{figure}[htbp] \centering @@ -479,17 +486,17 @@ The model is also accurate for the dynamics from an actuator to the force sensor \section{IFF Controller} \label{ssec:test_id31_iff_controller} -A decentralized IFF controller is there designed such that it adds damping to the suspension modes of the nano-hexapod for all considered payloads. +A decentralized IFF controller was designed such that it adds damping to the suspension modes of the nano-hexapod for all considered payloads. The frequency of the suspension modes are ranging from \(\approx 30\,\text{Hz}\) to \(\approx 250\,\text{Hz}\) (Figure \ref{fig:test_id31_comp_simscape_iff_diag_masses}), and therefore the IFF controller should provide integral action in this frequency range. -A second order high pass filter (cut-off frequency of \(10\,\text{Hz}\)) is added to limit the low frequency gain. - -The bode plot of the decentralized IFF controller is shown in Figure \ref{fig:test_id31_Kiff_bode_plot} and the ``decentralized loop-gains'' for all considered payload masses are shown in Figure \ref{fig:test_id31_Kiff_loop_gain}. -It can be seen that the loop-gain is larger than \(1\) around suspension modes indicating that some damping should be added to the suspension modes. +A second order high pass filter (cut-off frequency of \(10\,\text{Hz}\)) was added to limit the low frequency gain \eqref{eq:test_id31_Kiff}. \begin{equation}\label{eq:test_id31_Kiff} K_{\text{IFF}} = g_0 \cdot \underbrace{\frac{1}{s}}_{\text{int}} \cdot \underbrace{\frac{s^2/\omega_z^2}{s^2/\omega_z^2 + 2\xi_z s /\omega_z + 1}}_{\text{2nd order LPF}},\quad \left(g_0 = -100,\ \omega_z = 2\pi10\,\text{rad/s},\ \xi_z = 0.7\right) \end{equation} +The bode plot of the decentralized IFF controller is shown in Figure \ref{fig:test_id31_Kiff_bode_plot} and the ``decentralized loop-gains'' for all considered payload masses are shown in Figure \ref{fig:test_id31_Kiff_loop_gain}. +It can be seen that the loop-gain is larger than \(1\) around suspension modes indicating that some damping should be added to the suspension modes. + \begin{figure}[htbp] \begin{subfigure}{0.49\textwidth} \begin{center} @@ -509,8 +516,8 @@ K_{\text{IFF}} = g_0 \cdot \underbrace{\frac{1}{s}}_{\text{int}} \cdot \underbra To estimate the added damping, a root-locus plot is computed using the multi-body model (Figure \ref{fig:test_id31_iff_root_locus_m0}). It can be seen that for all considered payloads, the poles are bounded to the ``left-half plane'' indicating that the decentralized IFF is robust. The closed-loop poles for the chosen value of the gain are displayed by black crosses. -It can be seen that while damping can be added for all payloads (as compared to the open-loop case), the optimal value of the gain could be tuned separately for each payload. -For instance, for low payload masses, a higher value of the IFF controller gain could lead to better damping. +It can be seen that while damping can be added for all payloads (as compared to the open-loop case), the optimal value of the gain is different for each payload. +For low payload masses, a higher value of the IFF controller gain could lead to better damping. However, in this study, it was chosen to implement a fix (i.e. non-adaptive) decentralized IFF controller. \begin{figure}[htbp] @@ -541,20 +548,39 @@ However, in this study, it was chosen to implement a fix (i.e. non-adaptive) dec \caption{\label{fig:test_id31_iff_root_locus_m0}Root Locus plots for the designed decentralized IFF controller and using the multy-body model. Black crosses indicate the closed-loop poles for the choosen value of the gain.} \end{figure} -\section{Estimated Damped Plant} +\section{Damped Plant} \label{ssec:test_id31_iff_perf} As the model is accurately modelling the system dynamics, it can be used to estimate the damped plant, i.e. the transfer functions from \(\bm{u}^\prime\) to \(\bm{\mathcal{L}}\). -The obtained damped plants are compared with the open-loop plants in Figure \ref{fig:test_id31_comp_ol_iff_plant_model}. -The peak amplitudes corresponding to the suspension modes are approximately reduced by a factor \(10\) for all considered payloads, and with the same decentralized IFF controller. +The obtained damped plants are compared to the open-loop plants in Figure \ref{fig:test_id31_comp_ol_iff_plant_model}. +The peak amplitudes corresponding to the suspension modes are approximately reduced by a factor \(10\) for all considered payloads, showing the effectiveness of the decentralized IFF control strategy. + +In order to experimentally validate the Decentralized IFF controller, it was implemented and the damped plants (i.e. the transfer function from \(\bm{u}^\prime\) to \(\bm{\epsilon\mathcal{L}}\)) were identified for all payload conditions. +The obtained frequency response functions are compared with the model in Figure \ref{fig:test_id31_hac_plant_effect_mass} verifying the good correlation between the predicted damped plant using the multi-body model and the experimental results. \begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/test_id31_comp_ol_iff_plant_model.png} -\caption{\label{fig:test_id31_comp_ol_iff_plant_model}Comparison of the open-loop plants and the estimated damped plant with Decentralized IFF.} +\begin{subfigure}{0.49\textwidth} +\begin{center} +\includegraphics[scale=1,width=0.95\linewidth]{figs/test_id31_comp_ol_iff_plant_model.png} +\end{center} +\subcaption{\label{fig:test_id31_comp_ol_iff_plant_model}Effect of IFF on the plant} +\end{subfigure} +\begin{subfigure}{0.49\textwidth} +\begin{center} +\includegraphics[scale=1,width=0.95\linewidth]{figs/test_id31_hac_plant_effect_mass.png} +\end{center} +\subcaption{\label{fig:test_id31_hac_plant_effect_mass}Comparison of model and experimental results} +\end{subfigure} +\caption{\label{fig:test_id31_hac_plant_effect_mass_comp_model}Comparison of the open-loop plants and the damped plant with Decentralized IFF, estimated from the multi-body model (\subref{fig:test_id31_comp_ol_iff_plant_model}). Comparison of the measured damped plants and modeled plants for all considered payloads (\subref{fig:test_id31_hac_plant_effect_mass}). Only ``direct'' terms (\(\epsilon\mathcal{L}_i/u_i^\prime\)) are displayed for simplificty} \end{figure} \section*{Conclusion} +The implementation of a decentralized Integral Force Feedback controller has been successfully demonstrated. +Using the multi-body model, the controller was designed and optimized to ensure stability across all payload conditions while providing significant damping of suspension modes. +The experimental results validated the model predictions, showing a reduction of peak amplitudes by approximately a factor of 10 across the full payload range (0-39 kg). +While higher gains could potentially achieve better damping performance for lighter payloads, the chosen fixed-gain configuration represents a robust compromise that maintains stability and performance across all operating conditions. +The good correlation between the modeled and measured damped plants confirms the effectiveness of using the multi-body model for both controller design and performance prediction. + \chapter{High Authority Control in the frame of the struts} \label{sec:test_id31_hac} The position of the sample is actively stabilized by implementing a High-Authority-Controller as shown in Figure \ref{fig:test_id31_iff_hac_schematic}. @@ -575,7 +601,6 @@ K_{\text{HAC}} & & 0 \\ \section{Damped Plant} \label{ssec:test_id31_iff_hac_plant} -The damped plants (i.e. the transfer function from \(\bm{u}^\prime\) to \(\bm{\epsilon\mathcal{L}}\)) were identified for all payload conditions. To verify if the model accurately represents the damped plants, both direct terms and coupling terms corresponding to the first actuator are compared in Figure \ref{fig:test_id31_comp_simscape_hac}. \begin{figure}[htbp] @@ -587,11 +612,13 @@ To verify if the model accurately represents the damped plants, both direct term The six direct terms for all four payload conditions are compared with the model in Figure \ref{fig:test_id31_hac_plant_effect_mass}. It is shown that the model accurately represents the dynamics for all payloads. -In Section \ref{sec:test_id31_iff}, a High Authority Controller is tuned to be robust to the change of dynamics due to different payloads used. +In this section \ref{sec:test_id31_iff}, a High Authority Controller is tuned to be robust to the change of dynamics due to different payloads used. Without decentralized IFF being applied, the controller would have had to be robust to all the undamped dynamics shown in Figure \ref{fig:test_id31_comp_all_undamped_damped_plants}, which is a very complex control problem. With the applied decentralized IFF, the HAC instead had to be be robust to all the damped dynamics shown in Figure \ref{fig:test_id31_comp_all_undamped_damped_plants}, which is easier from a control perspective. This is one of the key benefit of using the HAC-LAC strategy. +Comparison of all undamped \(\epsilon\mathcal{L}_i/u_i\) and damped \(\epsilon\mathcal{L}_i/u_i^\prime\) measured frequency response functions for all payloads is done in (\subref{fig:test_id31_comp_all_undamped_damped_plants}). + \begin{figure}[htbp] \begin{subfigure}{0.49\textwidth} \begin{center}