From 39a5950de7aabecadd44ff7290d4cb2020170420 Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Fri, 28 Mar 2025 16:24:26 +0100 Subject: [PATCH] Add backup before deletion --- backup.org | 3866 ++++++++++++++++++++++ figs/test_nhexa_nano_hexapod_signals.pdf | Bin 82771 -> 82801 bytes figs/test_nhexa_nano_hexapod_signals.png | Bin 24709 -> 24758 bytes figs/test_nhexa_nano_hexapod_signals.svg | 26 +- test-bench-nano-hexapod.org | 4 +- test-bench-nano-hexapod.pdf | Bin 11284374 -> 11284412 bytes 6 files changed, 3881 insertions(+), 15 deletions(-) create mode 100644 backup.org diff --git a/backup.org b/backup.org new file mode 100644 index 0000000..0fd66c7 --- /dev/null +++ b/backup.org @@ -0,0 +1,3866 @@ + +** Analysis backup of HAC - Decoupling analysis +<> + +*** Introduction :ignore: + +In this section is studied the HAC-IFF architecture for the Nano-Hexapod. +More precisely: +- The LAC control is a decentralized integral force feedback as studied in Section ref:sec:test_nhexa_enc_plates_iff +- The HAC control is a decentralized controller working in the frame of the struts + +The corresponding control architecture is shown in Figure ref:fig:test_nhexa_control_architecture_hac_iff_struts with: +- $\bm{r}_{\mathcal{X}_n}$: the $6 \times 1$ reference signal in the cartesian frame +- $\bm{r}_{d\mathcal{L}}$: the $6 \times 1$ reference signal transformed in the frame of the struts thanks to the inverse kinematic +- $\bm{\epsilon}_{d\mathcal{L}}$: the $6 \times 1$ length error of the 6 struts +- $\bm{u}^\prime$: input of the damped plant +- $\bm{u}$: generated DAC voltages +- $\bm{\tau}_m$: measured force sensors +- $d\bm{\mathcal{L}}_m$: measured displacement of the struts by the encoders + +#+begin_src latex :file control_architecture_hac_iff_struts.pdf +\definecolor{instrumentation}{rgb}{0, 0.447, 0.741} +\definecolor{mechanics}{rgb}{0.8500, 0.325, 0.098} +\definecolor{control}{rgb}{0.4660, 0.6740, 0.1880} + +\begin{tikzpicture} + % Blocs + \node[block={3.0cm}{2.0cm}, fill=black!20!white] (P) {Plant}; + \coordinate[] (inputF) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputF) at ($(P.south east)!0.2!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.8!(P.north east)$); + + \node[block, below=0.4 of P, fill=control!20!white] (Kiff) {$\bm{K}_\text{IFF}$}; + \node[block, left=0.8 of inputF, fill=instrumentation!20!white] (pd200) {\tiny PD200}; + \node[addb, left=0.8 of pd200, fill=control!20!white] (addF) {}; + \node[block, left=0.8 of addF, fill=control!20!white] (K) {$\bm{K}_\mathcal{L}$}; + \node[addb={+}{}{-}{}{}, left=0.8 of K, fill=control!20!white] (subr) {}; + \node[block, align=center, left= of subr, fill=control!20!white] (J) {\tiny Inverse\\\tiny Kinematics}; + + % Connections and labels + \draw[->] (outputF) -- ++(1.0, 0) node[above left]{$\bm{\tau}_m$}; + \draw[->] ($(outputF) + (0.6, 0)$)node[branch]{} |- (Kiff.east); + \draw[->] (Kiff.west) -| (addF.south); + \draw[->] (addF.east) -- (pd200.west) node[above left]{$\bm{u}$}; + \draw[->] (pd200.east) -- (inputF) node[above left]{$\bm{u}_a$}; + + \draw[->] (outputL) -- ++(1.0, 0) node[below left]{$d\bm{\mathcal{L}_m}$}; + \draw[->] ($(outputL) + (0.6, 0)$)node[branch]{} -- ++(0, 1) -| (subr.north); + \draw[->] (subr.east) -- (K.west) node[above left]{$\bm{\epsilon}_{d\mathcal{L}}$}; + \draw[->] (K.east) -- (addF.west) node[above left]{$\bm{u}^\prime$}; + + \draw[->] (J.east) -- (subr.west) node[above left]{$\bm{r}_{d\mathcal{L}}$}; + \draw[<-] (J.west)node[above left]{$\bm{r}_{\mathcal{X}_n}$} -- ++(-1, 0); +\end{tikzpicture} +#+end_src + +#+name: fig:test_nhexa_control_architecture_hac_iff_struts +#+caption: HAC-LAC: IFF + Control in the frame of the legs +#+RESULTS: +[[file:figs/test_nhexa_control_architecture_hac_iff_struts.png]] + +This part is structured as follow: +- Section ref:sec:test_nhexa_hac_iff_struts_ref_track: some reference tracking tests are performed +- Section ref:sec:test_nhexa_hac_iff_struts_controller: the decentralized high authority controller is tuned using the Simscape model and is implemented and tested experimentally +- Section ref:sec:test_nhexa_interaction_analysis: an interaction analysis is performed, from which the best decoupling strategy can be determined +- Section ref:sec:test_nhexa_robust_hac_design: Robust High Authority Controller are designed + +*** Reference Tracking - Trajectories +:PROPERTIES: +:header-args:matlab+: :tangle matlab/scripts/reference_tracking_paths.m +:END: +<> +**** Introduction :ignore: +In this section, several trajectories representing the wanted pose (position and orientation) of the top platform with respect to the bottom platform are defined. + +These trajectories will be used to test the HAC-LAC architecture. + +In order to transform the wanted pose to the wanted displacement of the 6 struts, the inverse kinematic is required. +As a first approximation, the Jacobian matrix $\bm{J}$ can be used instead of using the full inverse kinematic equations. + +Therefore, the control architecture with the input trajectory $\bm{r}_{\mathcal{X}_n}$ is shown in Figure ref:fig:test_nhexa_control_architecture_hac_iff_L. + +#+begin_src latex :file control_architecture_hac_iff_struts_L.pdf +\definecolor{instrumentation}{rgb}{0, 0.447, 0.741} +\definecolor{mechanics}{rgb}{0.8500, 0.325, 0.098} +\definecolor{control}{rgb}{0.4660, 0.6740, 0.1880} + +\begin{tikzpicture} + % Blocs + \node[block={3.0cm}{2.0cm}, fill=black!20!white] (P) {Plant}; + \coordinate[] (inputF) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputF) at ($(P.south east)!0.2!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.8!(P.north east)$); + + \node[block, below=0.4 of P, fill=control!20!white] (Kiff) {$\bm{K}_\text{IFF}$}; + \node[block, left=0.8 of inputF, fill=instrumentation!20!white] (pd200) {\tiny PD200}; + \node[addb, left=0.8 of pd200, fill=control!20!white] (addF) {}; + \node[block, left=0.8 of addF, fill=control!20!white] (K) {$\bm{K}_\mathcal{L}$}; + \node[addb={+}{}{-}{}{}, left=0.8 of K, fill=control!20!white] (subr) {}; + \node[block, align=center, left= of subr, fill=control!20!white] (J) {$\bm{J}$}; + + % Connections and labels + \draw[->] (outputF) -- ++(1.0, 0) node[above left]{$\bm{\tau}_m$}; + \draw[->] ($(outputF) + (0.6, 0)$)node[branch]{} |- (Kiff.east); + \draw[->] (Kiff.west) -| (addF.south); + \draw[->] (addF.east) -- (pd200.west) node[above left]{$\bm{u}$}; + \draw[->] (pd200.east) -- (inputF) node[above left]{$\bm{u}_a$}; + + \draw[->] (outputL) -- ++(1.0, 0) node[below left]{$d\bm{\mathcal{L}_m}$}; + \draw[->] ($(outputL) + (0.6, 0)$)node[branch]{} -- ++(0, 1) -| (subr.north); + \draw[->] (subr.east) -- (K.west) node[above left]{$\bm{\epsilon}_{d\mathcal{L}}$}; + \draw[->] (K.east) -- (addF.west) node[above left]{$\bm{u}^\prime$}; + + \draw[->] (J.east) -- (subr.west) node[above left]{$\bm{r}_{d\mathcal{L}}$}; + \draw[<-] (J.west)node[above left]{$\bm{r}_{\mathcal{X}_n}$} -- ++(-1, 0); +\end{tikzpicture} +#+end_src + +#+name: fig:test_nhexa_control_architecture_hac_iff_L +#+caption: HAC-LAC: IFF + Control in the frame of the legs +#+RESULTS: +[[file:figs/test_nhexa_control_architecture_hac_iff_struts_L.png]] + +In the following sections, several reference trajectories are defined: +- Section ref:sec:test_nhexa_yz_scans: simple scans in the Y-Z plane +- Section ref:sec:test_nhexa_tilt_scans: scans in tilt are performed +- Section ref:sec:test_nhexa_nass_scans: scans with X-Y-Z translations in order to draw the word "NASS" + +**** Matlab Init :noexport:ignore: +#+begin_src matlab +%% reference_tracking_paths.m +% Computation of several reference paths +#+end_src + +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) +<> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes +<> +#+end_src + +#+begin_src matlab :tangle no :noweb yes +<> +#+end_src + +#+begin_src matlab :eval no :noweb yes +<> +#+end_src + +#+begin_src matlab :noweb yes +<> +#+end_src + +**** Y-Z Scans +<> +A function =generateYZScanTrajectory= has been developed in order to easily generate scans in the Y-Z plane. + +For instance, the following generated trajectory is represented in Figure ref:fig:test_nhexa_yz_scan_example_trajectory_yz_plane. +#+begin_src matlab +%% Generate the Y-Z trajectory scan +Rx_yz = generateYZScanTrajectory(... + 'y_tot', 4e-6, ... % Length of Y scans [m] + 'z_tot', 4e-6, ... % Total Z distance [m] + 'n', 5, ... % Number of Y scans + 'Ts', 1e-3, ... % Sampling Time [s] + 'ti', 1, ... % Time to go to initial position [s] + 'tw', 0, ... % Waiting time between each points [s] + 'ty', 0.6, ... % Time for a scan in Y [s] + 'tz', 0.2); % Time for a scan in Z [s] +#+end_src + +#+begin_src matlab :exports none +%% Plot the trajectory in the Y-Z plane +figure; +plot(Rx_yz(:,3), Rx_yz(:,4)); +xlabel('y [m]'); ylabel('z [m]'); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/yz_scan_example_trajectory_yz_plane.pdf', 'width', 'normal', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_yz_scan_example_trajectory_yz_plane +#+caption: Generated scan in the Y-Z plane +#+RESULTS: +[[file:figs/test_nhexa_yz_scan_example_trajectory_yz_plane.png]] + +The Y and Z positions as a function of time are shown in Figure ref:fig:test_nhexa_yz_scan_example_trajectory. + +#+begin_src matlab :exports none +%% Plot the Y-Z trajectory as a function of time +figure; +hold on; +plot(Rx_yz(:,1), Rx_yz(:,3), ... + 'DisplayName', 'Y motion') +plot(Rx_yz(:,1), Rx_yz(:,4), ... + 'DisplayName', 'Z motion') +hold off; +xlabel('Time [s]'); +ylabel('Displacement [m]'); +legend('location', 'northeast'); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/yz_scan_example_trajectory.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_yz_scan_example_trajectory +#+caption: Y and Z trajectories as a function of time +#+RESULTS: +[[file:figs/test_nhexa_yz_scan_example_trajectory.png]] + +Using the Jacobian matrix, it is possible to compute the wanted struts lengths as a function of time: +\begin{equation} + \bm{r}_{d\mathcal{L}} = \bm{J} \bm{r}_{\mathcal{X}_n} +\end{equation} + +#+begin_src matlab :exports none +load('jacobian.mat', 'J'); +#+end_src + +#+begin_src matlab +%% Compute the reference in the frame of the legs +dL_ref = [J*Rx_yz(:, 2:7)']'; +#+end_src + +The reference signal for the strut length is shown in Figure ref:fig:test_nhexa_yz_scan_example_trajectory_struts. +#+begin_src matlab :exports none +%% Plot the reference in the frame of the legs +figure; +hold on; +for i=1:6 + plot(Rx_yz(:,1), dL_ref(:, i), ... + 'DisplayName', sprintf('$r_{d\\mathcal{L}_%i}$', i)) +end +xlabel('Time [s]'); ylabel('Strut Motion [m]'); +legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2); +yticks(1e-6*[-5:5]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/yz_scan_example_trajectory_struts.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_yz_scan_example_trajectory_struts +#+caption: Trajectories for the 6 individual struts +#+RESULTS: +[[file:figs/test_nhexa_yz_scan_example_trajectory_struts.png]] + +**** Tilt Scans +<> + +A function =generalSpiralAngleTrajectory= has been developed in order to easily generate $R_x,R_y$ tilt scans. + +For instance, the following generated trajectory is represented in Figure ref:fig:test_nhexa_tilt_scan_example_trajectory. +#+begin_src matlab +%% Generate the "tilt-spiral" trajectory scan +R_tilt = generateSpiralAngleTrajectory(... + 'R_tot', 20e-6, ... % Total Tilt [ad] + 'n_turn', 5, ... % Number of scans + 'Ts', 1e-3, ... % Sampling Time [s] + 't_turn', 1, ... % Turn time [s] + 't_end', 1); % End time to go back to zero [s] +#+end_src + +#+begin_src matlab :exports none +%% Plot the trajectory +figure; +plot(1e6*R_tilt(:,5), 1e6*R_tilt(:,6)); +xlabel('$R_x$ [$\mu$rad]'); ylabel('$R_y$ [$\mu$rad]'); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/tilt_scan_example_trajectory.pdf', 'width', 'normal', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_tilt_scan_example_trajectory +#+caption: Generated "spiral" scan +#+RESULTS: +[[file:figs/test_nhexa_tilt_scan_example_trajectory.png]] + +#+begin_src matlab :exports none +%% Compute the reference in the frame of the legs +load('jacobian.mat', 'J'); +dL_ref = [J*R_tilt(:, 2:7)']'; +#+end_src + +The reference signal for the strut length is shown in Figure ref:fig:test_nhexa_tilt_scan_example_trajectory_struts. +#+begin_src matlab :exports none +%% Plot the reference in the frame of the legs +figure; +hold on; +for i=1:6 + plot(R_tilt(:,1), dL_ref(:, i), ... + 'DisplayName', sprintf('$r_{d\\mathcal{L}_%i}$', i)) +end +xlabel('Time [s]'); ylabel('Strut Motion [m]'); +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2); +yticks(1e-6*[-5:5]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/tilt_scan_example_trajectory_struts.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_tilt_scan_example_trajectory_struts +#+caption: Trajectories for the 6 individual struts - Tilt scan +#+RESULTS: +[[file:figs/test_nhexa_tilt_scan_example_trajectory_struts.png]] + +**** "NASS" reference path +<> +In this section, a reference path that "draws" the work "NASS" is developed. + +First, a series of points representing each letter are defined. +Between each letter, a negative Z motion is performed. +#+begin_src matlab +%% List of points that draws "NASS" +ref_path = [ ... + 0, 0,0; % Initial Position + 0,0,1; 0,4,1; 3,0,1; 3,4,1; % N + 3,4,0; 4,0,0; % Transition + 4,0,1; 4,3,1; 5,4,1; 6,4,1; 7,3,1; 7,2,1; 4,2,1; 4,3,1; 5,4,1; 6,4,1; 7,3,1; 7,0,1; % A + 7,0,0; 8,0,0; % Transition + 8,0,1; 11,0,1; 11,2,1; 8,2,1; 8,4,1; 11,4,1; % S + 11,4,0; 12,0,0; % Transition + 12,0,1; 15,0,1; 15,2,1; 12,2,1; 12,4,1; 15,4,1; % S + 15,4,0; + ]; + +%% Center the trajectory arround zero +ref_path = ref_path - (max(ref_path) - min(ref_path))/2; + +%% Define the X-Y-Z cuboid dimensions containing the trajectory +X_max = 10e-6; +Y_max = 4e-6; +Z_max = 2e-6; + +ref_path = ([X_max, Y_max, Z_max]./max(ref_path)).*ref_path; % [m] +#+end_src + +Then, using the =generateXYZTrajectory= function, the $6 \times 1$ trajectory signal is computed. +#+begin_src matlab +%% Generating the trajectory +Rx_nass = generateXYZTrajectory('points', ref_path); +#+end_src + +The trajectory in the X-Y plane is shown in Figure ref:fig:test_nhexa_ref_track_test_nass (the transitions between the letters are removed). +#+begin_src matlab :exports none +%% "NASS" trajectory in the X-Y plane +figure; +plot(1e6*Rx_nass(Rx_nass(:,4)>0, 2), 1e6*Rx_nass(Rx_nass(:,4)>0, 3), 'k.') +xlabel('X [$\mu m$]'); +ylabel('Y [$\mu m$]'); +axis equal; +xlim(1e6*[min(Rx_nass(:,2)), max(Rx_nass(:,2))]); +ylim(1e6*[min(Rx_nass(:,3)), max(Rx_nass(:,3))]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/ref_track_test_nass.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_ref_track_test_nass +#+caption: Reference path corresponding to the "NASS" acronym +#+RESULTS: +[[file:figs/test_nhexa_ref_track_test_nass.png]] + +It can also be better viewed in a 3D representation as in Figure ref:fig:test_nhexa_ref_track_test_nass_3d. + +#+begin_src matlab :exports none +figure; +plot3(1e6*Rx_nass(:,2), 1e6*Rx_nass(:,3), 1e6*Rx_nass(:,4), 'k-'); +xlabel('x [$\mu m$]'); ylabel('y [$\mu m$]'); zlabel('z [$\mu m$]'); +view(-13, 41) +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/ref_track_test_nass_3d.pdf', 'width', 'normal', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_ref_track_test_nass_3d +#+caption: Reference path that draws "NASS" - 3D view +#+RESULTS: +[[file:figs/test_nhexa_ref_track_test_nass_3d.png]] + +*** First Basic High Authority Controller +:PROPERTIES: +:header-args:matlab+: :tangle matlab/scripts/hac_lac_first_try.m +:END: +<> +**** Introduction :ignore: +In this section, a simple decentralized high authority controller $\bm{K}_{\mathcal{L}}$ is developed to work without any payload. + +The diagonal controller is tuned using classical Loop Shaping in Section ref:sec:test_nhexa_hac_iff_no_payload_tuning. +The stability is verified in Section ref:sec:test_nhexa_hac_iff_no_payload_stability using the Simscape model. + +**** Matlab Init :noexport:ignore: +#+begin_src matlab +%% hac_lac_first_try.m +% Development and analysis of a first basic High Authority Controller +#+end_src + +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) +<> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes +<> +#+end_src + +#+begin_src matlab :tangle no :noweb yes +<> +#+end_src + +#+begin_src matlab :eval no :noweb yes +<> +#+end_src + +#+begin_src matlab :noweb yes +<> +<> +#+end_src + +#+begin_src matlab +%% Load the identified FRF and Simscape model +frf_iff = load('frf_iff_vib_table_m.mat', 'f', 'Ts', 'G_de'); +sim_iff = load('sim_iff_vib_table_m.mat', 'G_de'); +#+end_src + +**** HAC Controller +<> + +Let's first try to design a first decentralized controller with: +- a bandwidth of 100Hz +- sufficient phase margin +- simple and understandable components + +After some very basic and manual loop shaping, A diagonal controller is developed. +Each diagonal terms are identical and are composed of: +- A lead around 100Hz +- A first order low pass filter starting at 200Hz to add some robustness to high frequency modes +- A notch at 700Hz to cancel the flexible modes of the top plate +- A pure integrator + +#+begin_src matlab +%% Lead to increase phase margin +a = 2; % Amount of phase lead / width of the phase lead / high frequency gain +wc = 2*pi*100; % Frequency with the maximum phase lead [rad/s] + +H_lead = (1 + s/(wc/sqrt(a)))/(1 + s/(wc*sqrt(a))); + +%% Low Pass filter to increase robustness +H_lpf = 1/(1 + s/2/pi/200); + +%% Notch at the top-plate resonance +gm = 0.02; +xi = 0.3; +wn = 2*pi*700; + +H_notch = (s^2 + 2*gm*xi*wn*s + wn^2)/(s^2 + 2*xi*wn*s + wn^2); + +%% Decentralized HAC +Khac_iff_struts = -(1/(2.87e-5)) * ... % Gain + H_lead * ... % Lead + H_notch * ... % Notch + (2*pi*100/s) * ... % Integrator + eye(6); % 6x6 Diagonal +#+end_src + +This controller is saved for further use. +#+begin_src matlab :exports none :tangle no +save('matlab/data_sim/Khac_iff_struts.mat', 'Khac_iff_struts') +#+end_src + +#+begin_src matlab :eval no +save('data_sim/Khac_iff_struts.mat', 'Khac_iff_struts') +#+end_src + +The experimental loop gain is computed and shown in Figure ref:fig:test_nhexa_loop_gain_hac_iff_struts. +#+begin_src matlab +L_hac_iff_struts = pagemtimes(permute(frf_iff.G_de{1}, [2 3 1]), squeeze(freqresp(Khac_iff_struts, frf_iff.f, 'Hz'))); +#+end_src + +#+begin_src matlab :exports none +%% Bode plot of the Loop Gain +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + + +ax1 = nexttile([2,1]); +hold on; +% Diagonal Elements Model +plot(frf_iff.f, abs(squeeze(L_hac_iff_struts(1,1,:))), 'color', colors(1,:), ... + 'DisplayName', 'Diagonal'); +for i = 2:6 + plot(frf_iff.f, abs(squeeze(L_hac_iff_struts(i,i,:))), 'color', colors(1,:), ... + 'HandleVisibility', 'off'); +end +plot(frf_iff.f, abs(squeeze(L_hac_iff_struts(1,2,:))), 'color', [colors(2,:), 0.2], ... + 'DisplayName', 'Off-Diag'); +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(squeeze(L_hac_iff_struts(i,j,:))), 'color', [colors(2,:), 0.2], ... + 'HandleVisibility', 'off'); + end +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Loop Gain [-]'); set(gca, 'XTickLabel',[]); +ylim([1e-3, 1e2]); +legend('location', 'northeast'); + +ax2 = nexttile; +hold on; +for i =1:6 + plot(frf_iff.f, 180/pi*angle(squeeze(L_hac_iff_struts(i,i,:))), 'color', colors(1,:)); +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([2, 2e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/loop_gain_hac_iff_struts.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_loop_gain_hac_iff_struts +#+caption: Diagonal and off-diagonal elements of the Loop gain for "HAC-IFF-Struts" +#+RESULTS: +[[file:figs/test_nhexa_loop_gain_hac_iff_struts.png]] + +**** Verification of the Stability using the Simscape model +<> + +The HAC-IFF control strategy is implemented using Simscape. +#+begin_src matlab +%% Initialize the Simscape model in closed loop +n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... + 'flex_top_type', '4dof', ... + 'motion_sensor_type', 'plates', ... + 'actuator_type', 'flexible', ... + 'controller_type', 'hac-iff-struts'); +#+end_src + +#+begin_src matlab :exports none +support.type = 1; % On top of vibration table +payload.type = 3; % Payload / 1 "mass layer" + +load('Kiff_opt.mat', 'Kiff'); +#+end_src + +#+begin_src matlab +%% Identify the (damped) transfer function from u to dLm +clear io; io_i = 1; +io(io_i) = linio([mdl, '/du'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs +io(io_i) = linio([mdl, '/dL'], 1, 'openoutput'); io_i = io_i + 1; % Plate Displacement (encoder) +#+end_src + +We identify the closed-loop system. +#+begin_src matlab +%% Identification +Gd_iff_hac_opt = linearize(mdl, io, 0.0, options); +#+end_src + +And verify that it is indeed stable. +#+begin_src matlab :results value replace :exports both +%% Verify the stability +isstable(Gd_iff_hac_opt) +#+end_src + +#+RESULTS: +: 1 + +**** Experimental Validation +Both the Integral Force Feedback controller (developed in Section ref:sec:test_nhexa_enc_plates_iff) and the high authority controller working in the frame of the struts (developed in Section ref:sec:test_nhexa_hac_iff_struts_controller) are implemented experimentally. + +Two reference tracking experiments are performed to evaluate the stability and performances of the implemented control. + +#+begin_src matlab +%% Load the experimental data +load('hac_iff_struts_yz_scans.mat', 't', 'de') +#+end_src + +#+begin_src matlab :exports none +%% Reset initial time +t = t - t(1); +#+end_src + +The position of the top-platform is estimated using the Jacobian matrix: +#+begin_src matlab +%% Pose of the top platform from the encoder values +load('jacobian.mat', 'J'); +Xe = [inv(J)*de']'; +#+end_src + +#+begin_src matlab +%% Generate the Y-Z trajectory scan +Rx_yz = generateYZScanTrajectory(... + 'y_tot', 4e-6, ... % Length of Y scans [m] + 'z_tot', 8e-6, ... % Total Z distance [m] + 'n', 5, ... % Number of Y scans + 'Ts', 1e-3, ... % Sampling Time [s] + 'ti', 1, ... % Time to go to initial position [s] + 'tw', 0, ... % Waiting time between each points [s] + 'ty', 0.6, ... % Time for a scan in Y [s] + 'tz', 0.2); % Time for a scan in Z [s] +#+end_src + +The reference path as well as the measured position are partially shown in the Y-Z plane in Figure ref:fig:test_nhexa_yz_scans_exp_results_first_K. +#+begin_src matlab :exports none +%% Position and reference signal in the Y-Z plane +figure; +tiledlayout(1, 3, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile; +hold on; +plot(1e6*Xe(t>2,2), 1e6*Xe(t>2,3)); +plot(1e6*Rx_yz(:,3), 1e6*Rx_yz(:,4), '--'); +hold off; +xlabel('Y [$\mu m$]'); ylabel('Z [$\mu m$]'); +xlim([-2.05, 2.05]); ylim([-4.1, 4.1]); +axis equal; + +ax2 = nexttile([1,2]); +hold on; +plot(1e6*Xe(:,2), 1e6*Xe(:,3), ... + 'DisplayName', '$\mathcal{X}_n$'); +plot(1e6*Rx_yz(:,3), 1e6*Rx_yz(:,4), '--', ... + 'DisplayName', '$r_{\mathcal{X}_n}$'); +hold off; +legend('location', 'northwest'); +xlabel('Y [$\mu m$]'); ylabel('Z [$\mu m$]'); +axis equal; +xlim([1.6, 2.1]); ylim([-4.1, -3.6]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/yz_scans_exp_results_first_K.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_yz_scans_exp_results_first_K +#+caption: Measured position $\bm{\mathcal{X}}_n$ and reference signal $\bm{r}_{\mathcal{X}_n}$ in the Y-Z plane - Zoom on a change of direction +#+RESULTS: +[[file:figs/test_nhexa_yz_scans_exp_results_first_K.png]] + +#+begin_important +It is clear from Figure ref:fig:test_nhexa_yz_scans_exp_results_first_K that the position of the nano-hexapod effectively tracks to reference signal. +However, oscillations with amplitudes as large as 50nm can be observe. + +It turns out that the frequency of these oscillations is 100Hz which is corresponding to the crossover frequency of the High Authority Control loop. +This clearly indicates poor stability margins. +In the next section, the controller is re-designed to improve the stability margins. +#+end_important + +**** Controller with increased stability margins +The High Authority Controller is re-designed in order to improve the stability margins. +#+begin_src matlab +%% Lead +a = 5; % Amount of phase lead / width of the phase lead / high frequency gain +wc = 2*pi*110; % Frequency with the maximum phase lead [rad/s] + +H_lead = (1 + s/(wc/sqrt(a)))/(1 + s/(wc*sqrt(a))); + +%% Low Pass Filter +H_lpf = 1/(1 + s/2/pi/300); + +%% Notch +gm = 0.02; +xi = 0.5; +wn = 2*pi*700; + +H_notch = (s^2 + 2*gm*xi*wn*s + wn^2)/(s^2 + 2*xi*wn*s + wn^2); + +%% HAC Controller +Khac_iff_struts = -2.2e4 * ... % Gain + H_lead * ... % Lead + H_lpf * ... % Lead + H_notch * ... % Notch + (2*pi*100/s) * ... % Integrator + eye(6); % 6x6 Diagonal +#+end_src + +#+begin_src matlab :exports none +%% Load the FRF of the transfer function from u to dL with IFF +frf_iff = load('frf_iff_vib_table_m.mat', 'f', 'Ts', 'G_de'); +#+end_src + +#+begin_src matlab :exports none +%% Compute the Loop Gain +L_frf = pagemtimes(permute(frf_iff.G_de{1}, [2 3 1]), squeeze(freqresp(Khac_iff_struts, frf_iff.f, 'Hz'))); +#+end_src + +The bode plot of the new loop gain is shown in Figure ref:fig:test_nhexa_hac_iff_plates_exp_loop_gain_redesigned_K. +#+begin_src matlab :exports none +%% Bode plot for the transfer function from u to dLm +freqs = 2*logspace(1, 3, 1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +% Diagonal Elements FRF +plot(frf_iff.f, abs(squeeze(L_frf(1,1,:))), 'color', colors(1,:), ... + 'DisplayName', 'Diagonal'); +for i = 2:6 + plot(frf_iff.f, abs(squeeze(L_frf(i,i,:))), 'color', colors(1,:), ... + 'HandleVisibility', 'off'); +end +plot(frf_iff.f, abs(squeeze(L_frf(1,2,:))), 'color', [colors(2,:), 0.2], ... + 'DisplayName', 'Off-Diag'); +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(squeeze(L_frf(i,j,:))), 'color', [colors(2,:), 0.2], ... + 'HandleVisibility', 'off'); + end +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Loop Gain [-]'); set(gca, 'XTickLabel',[]); +ylim([1e-3, 1e2]); +legend('location', 'northeast'); + +ax2 = nexttile; +hold on; +for i =1:6 + plot(frf_iff.f, 180/pi*angle(squeeze(L_frf(i,i,:))), 'color', colors(1,:)); +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([1, 2e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/hac_iff_plates_exp_loop_gain_redesigned_K.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_hac_iff_plates_exp_loop_gain_redesigned_K +#+caption: Loop Gain for the updated decentralized HAC controller +#+RESULTS: +[[file:figs/test_nhexa_hac_iff_plates_exp_loop_gain_redesigned_K.png]] + +This new controller is implemented experimentally and several tracking tests are performed. +#+begin_src matlab +%% Load Measurements +load('hac_iff_more_lead_nass_scan.mat', 't', 'de') +#+end_src + +#+begin_src matlab :exports none +%% Reset Time +t = t - t(1); +#+end_src + +The pose of the top platform is estimated from the encoder position using the Jacobian matrix. +#+begin_src matlab +%% Compute the pose of the top platform +load('jacobian.mat', 'J'); +Xe = [inv(J)*de']'; +#+end_src + +#+begin_src matlab :exports none +%% Load the reference path +load('reference_path.mat', 'Rx_nass') +#+end_src + +The measured motion as well as the trajectory are shown in Figure ref:fig:test_nhexa_nass_scans_first_test_exp. +#+begin_src matlab :exports none +%% Plot the X-Y-Z "NASS" trajectory +figure; +hold on; +plot3(Xe(1:100:end,1), Xe(1:100:end,2), Xe(1:100:end,3)) +plot3(Rx_nass(1:100:end,2), Rx_nass(1:100:end,3), Rx_nass(1:100:end,4)) +hold off; +xlabel('x [$\mu m$]'); ylabel('y [$\mu m$]'); zlabel('z [$\mu m$]'); +view(-13, 41) +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/nass_scans_first_test_exp.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_nass_scans_first_test_exp +#+caption: Measured position $\bm{\mathcal{X}}_n$ and reference signal $\bm{r}_{\mathcal{X}_n}$ for the "NASS" trajectory +#+RESULTS: +[[file:figs/test_nhexa_nass_scans_first_test_exp.png]] + +The trajectory and measured motion are also shown in the X-Y plane in Figure ref:fig:test_nhexa_ref_track_nass_exp_hac_iff_struts. +#+begin_src matlab :exports none +%% Estimate when the hexpod is on top position and drawing the letters +i_top = Xe(:,3) > 1.9e-6; +i_rx = Rx_nass(:,4) > 0; +#+end_src + +#+begin_src matlab :exports none +%% Plot the reference as well as the measurement in the X-Y plane +figure; +tiledlayout(1, 3, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([1,2]); +hold on; +scatter(1e6*Xe(i_top,1), 1e6*Xe(i_top,2),'.'); +plot(1e6*Rx_nass(i_rx,2), 1e6*Rx_nass(i_rx,3), '--'); +hold off; +xlabel('X [$\mu m$]'); ylabel('Y [$\mu m$]'); +axis equal; +xlim([-10.5, 10.5]); ylim([-4.5, 4.5]); + +ax2 = nexttile; +hold on; +scatter(1e6*Xe(i_top,1), 1e6*Xe(i_top,2),'.'); +plot(1e6*Rx_nass(i_rx,2), 1e6*Rx_nass(i_rx,3), '--'); +hold off; +xlabel('X [$\mu m$]'); ylabel('Y [$\mu m$]'); +axis equal; +xlim([4.5, 4.7]); ylim([-0.15, 0.05]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/ref_track_nass_exp_hac_iff_struts.pdf', 'width', 'full', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_ref_track_nass_exp_hac_iff_struts +#+caption: Reference path and measured motion in the X-Y plane +#+RESULTS: +[[file:figs/test_nhexa_ref_track_nass_exp_hac_iff_struts.png]] + +The orientation errors during all the scans are shown in Figure ref:fig:test_nhexa_nass_ref_rx_ry. +#+begin_src matlab :exports none +%% Orientation Errors +figure; +hold on; +plot(t(t>20&t<20.1), 1e6*Xe(t>20&t<20.1,4), '-', 'DisplayName', '$\epsilon_{\theta_x}$'); +plot(t(t>20&t<20.1), 1e6*Xe(t>20&t<20.1,5), '-', 'DisplayName', '$\epsilon_{\theta_y}$'); +plot(t(t>20&t<20.1), 1e6*Xe(t>20&t<20.1,6), '-', 'DisplayName', '$\epsilon_{\theta_z}$'); +hold off; +xlabel('Time [s]'); ylabel('Orientation Error [$\mu$ rad]'); +legend('location', 'northeast'); +#+end_src + +#+begin_src matlab :exports none +%% Orientation Errors +figure; +hold on; +plot(1e9*Xe(100000:100:end,4), 1e9*Xe(100000:100:end,5), '.'); +th = 0:pi/50:2*pi; +xunit = 90 * cos(th); +yunit = 90 * sin(th); +plot(xunit, yunit, '--'); +hold off; +xlabel('$R_x$ [nrad]'); ylabel('$R_y$ [nrad]'); +xlim([-100, 100]); +ylim([-100, 100]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/nass_ref_rx_ry.pdf', 'width', 500, 'height', 500); +#+end_src + +#+name: fig:test_nhexa_nass_ref_rx_ry +#+caption: Orientation errors during the scan +#+RESULTS: +[[file:figs/test_nhexa_nass_ref_rx_ry.png]] + +#+begin_important +Using the updated High Authority Controller, the nano-hexapod can follow trajectories with high accuracy (the position errors are in the order of 50nm peak to peak, and the orientation errors 300nrad peak to peak). +#+end_important + +*** Interaction Analysis and Decoupling +:PROPERTIES: +:header-args:matlab+: :tangle matlab/scripts/interaction_analysis_enc_plates.m +:END: +<> +**** Introduction :ignore: + +In this section, the interaction in the identified plant is estimated using the Relative Gain Array (RGA) [[cite:skogestad07_multiv_feedb_contr][Chap. 3.4]]. + +Then, several decoupling strategies are compared for the nano-hexapod. + +The RGA Matrix is defined as follow: +\begin{equation} + \text{RGA}(G(f)) = G(f) \times (G(f)^{-1})^T +\end{equation} + +Then, the RGA number is defined: +\begin{equation} +\text{RGA-num}(f) = \| \text{I - RGA(G(f))} \|_{\text{sum}} +\end{equation} + + +In this section, the plant with 2 added mass is studied. + +**** Matlab Init :noexport:ignore: +#+begin_src matlab +%% interaction_analysis_enc_plates.m +% Interaction analysis of several decoupling strategies +#+end_src + +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) +<> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes +<> +#+end_src + +#+begin_src matlab :tangle no :noweb yes +<> +#+end_src + +#+begin_src matlab :eval no :noweb yes +<> +#+end_src + +#+begin_src matlab :noweb yes +<> +#+end_src + +#+begin_src matlab +%% Load the identified FRF and Simscape model +frf_iff = load('frf_iff_vib_table_m.mat', 'f', 'Ts', 'G_de'); +sim_iff = load('sim_iff_vib_table_m.mat', 'G_de'); +#+end_src + +**** Parameters +#+begin_src matlab +wc = 100; % Wanted crossover frequency [Hz] +[~, i_wc] = min(abs(frf_iff.f - wc)); % Indice corresponding to wc +#+end_src + +#+begin_src matlab +%% Plant to be decoupled +frf_coupled = frf_iff.G_de{2}; +G_coupled = sim_iff.G_de{2}; +#+end_src + +**** No Decoupling (Decentralized) +<> + +#+begin_src latex :file decoupling_arch_decentralized.pdf +\begin{tikzpicture} + \node[block] (G) {$\bm{G}$}; + + % Connections and labels + \draw[<-] (G.west) -- ++(-1.8, 0) node[above right]{$\bm{\tau}$}; + \draw[->] (G.east) -- ++( 1.8, 0) node[above left]{$d\bm{\mathcal{L}}$}; + + \begin{scope}[on background layer] + \node[fit={(G.south west) (G.north east)}, fill=black!10!white, draw, dashed, inner sep=16pt] (Gdec) {}; + \node[below right] at (Gdec.north west) {$\bm{G}_{\text{dec}}$}; + \end{scope} +\end{tikzpicture} +#+end_src + +#+name: fig:test_nhexa_decoupling_arch_decentralized +#+caption: Block diagram representing the plant. +#+RESULTS: +[[file:figs/test_nhexa_decoupling_arch_decentralized.png]] + +#+begin_src matlab :exports none +%% Decentralized Plant +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(frf_coupled(:,i,j)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); + end +end +set(gca,'ColorOrderIndex',1) +for i = 1:6 + plot(frf_iff.f, abs(frf_coupled(:,i,i)), ... + 'DisplayName', sprintf('$y_%i/u_%i$', i, i)); +end +plot(frf_iff.f, abs(frf_coupled(:,1,2)), 'color', [0,0,0,0.2], ... + 'DisplayName', 'Coupling'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); set(gca, 'XTickLabel',[]); +ylim([1e-9, 1e-4]); +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 3); + +ax2 = nexttile; +hold on; +for i =1:6 + plot(frf_iff.f, 180/pi*angle(frf_coupled(:,i,i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); +ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_decentralized_plant.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_interaction_decentralized_plant +#+caption: Bode Plot of the decentralized plant (diagonal and off-diagonal terms) +#+RESULTS: +[[file:figs/test_nhexa_interaction_decentralized_plant.png]] + +#+begin_src matlab :exports none +%% Decentralized RGA +RGA_dec = zeros(size(frf_coupled)); +for i = 1:length(frf_iff.f) + RGA_dec(i,:,:) = squeeze(frf_coupled(i,:,:)).*inv(squeeze(frf_coupled(i,:,:))).'; +end + +RGA_dec_sum = zeros(length(frf_iff), 1); +for i = 1:length(frf_iff.f) + RGA_dec_sum(i) = sum(sum(abs(eye(6) - squeeze(RGA_dec(i,:,:))))); +end +#+end_src + +#+begin_src matlab :exports none +%% RGA for Decentralized plant +figure; +plot(frf_iff.f, RGA_dec_sum, 'k-'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('RGA Number'); +xlim([10, 1e3]); ylim([1e-2, 1e2]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_rga_decentralized.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_interaction_rga_decentralized +#+caption: RGA number for the decentralized plant +#+RESULTS: +[[file:figs/test_nhexa_interaction_rga_decentralized.png]] + +**** Static Decoupling +<> + +#+begin_src latex :file decoupling_arch_static.pdf +\begin{tikzpicture} + \node[block] (G) {$\bm{G}$}; + \node[block, left=0.8 of G] (Ginv) {$\bm{\hat{G}}(j0)^{-1}$}; + + % Connections and labels + \draw[<-] (Ginv.west) -- ++(-1.8, 0) node[above right]{$\bm{u}$}; + \draw[->] (Ginv.east) -- (G.west) node[above left]{$\bm{\tau}$}; + \draw[->] (G.east) -- ++( 1.8, 0) node[above left]{$d\bm{\mathcal{L}}$}; + + \begin{scope}[on background layer] + \node[fit={(Ginv.south west) (G.north east)}, fill=black!10!white, draw, dashed, inner sep=16pt] (Gx) {}; + \node[below right] at (Gx.north west) {$\bm{G}_{\text{static}}$}; + \end{scope} +\end{tikzpicture} +#+end_src + +#+name: fig:test_nhexa_decoupling_arch_static +#+caption: Decoupling using the inverse of the DC gain of the plant +#+RESULTS: +[[file:figs/test_nhexa_decoupling_arch_static.png]] + +The DC gain is evaluated from the model as be have bad low frequency identification. + +#+begin_src matlab :exports none +%% Compute the inverse of the DC gain +G_model = G_coupled; +G_model.outputdelay = 0; % necessary for further inversion +dc_inv = inv(dcgain(G_model)); + +%% Compute the inversed plant +G_de_sta = zeros(size(frf_coupled)); +for i = 1:length(frf_iff.f) + G_de_sta(i,:,:) = squeeze(frf_coupled(i,:,:))*dc_inv; +end +#+end_src + +#+begin_src matlab :exports results :results value table replace :tangle no +data2orgtable(dc_inv, {}, {}, ' %.1f '); +#+end_src + +#+RESULTS: +| -62011.5 | 3910.6 | 4299.3 | 660.7 | -4016.5 | -4373.6 | +| 3914.4 | -61991.2 | -4356.8 | -4019.2 | 640.2 | 4281.6 | +| -4020.0 | -4370.5 | -62004.5 | 3914.6 | 4295.8 | 653.8 | +| 660.9 | 4292.4 | 3903.3 | -62012.2 | -4366.5 | -4008.9 | +| 4302.8 | 655.6 | -4025.8 | -4377.8 | -62006.0 | 3919.7 | +| -4377.9 | -4013.2 | 668.6 | 4303.7 | 3906.8 | -62019.3 | + +#+begin_src matlab :exports none +%% Bode plot of the static decoupled plant +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(G_de_sta(:,i,j)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); + end +end +set(gca,'ColorOrderIndex',1) +for i = 1:6 + plot(frf_iff.f, abs(G_de_sta(:,i,i)), ... + 'DisplayName', sprintf('$y_%i/u_%i$', i, i)); +end +plot(frf_iff.f, abs(G_de_sta(:,1,2)), 'color', [0,0,0,0.2], ... + 'DisplayName', 'Coupling'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); set(gca, 'XTickLabel',[]); +ylim([1e-3, 1e1]); +legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2); + +ax2 = nexttile; +hold on; +for i =1:6 + plot(frf_iff.f, 180/pi*angle(G_de_sta(:,i,i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); +ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_static_dec_plant.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_interaction_static_dec_plant +#+caption: Bode Plot of the static decoupled plant +#+RESULTS: +[[file:figs/test_nhexa_interaction_static_dec_plant.png]] + +#+begin_src matlab :exports none +%% Compute RGA Matrix +RGA_sta = zeros(size(frf_coupled)); +for i = 1:length(frf_iff.f) + RGA_sta(i,:,:) = squeeze(G_de_sta(i,:,:)).*inv(squeeze(G_de_sta(i,:,:))).'; +end + +%% Compute RGA-number +RGA_sta_sum = zeros(length(frf_iff), 1); +for i = 1:size(RGA_sta, 1) + RGA_sta_sum(i) = sum(sum(abs(eye(6) - squeeze(RGA_sta(i,:,:))))); +end +#+end_src + +#+begin_src matlab :exports none +%% Plot the RGA-number for statically decoupled plant +figure; +plot(frf_iff.f, RGA_sta_sum, 'k-'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('RGA Number'); +xlim([10, 1e3]); ylim([1e-2, 1e2]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_rga_static_dec.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_interaction_rga_static_dec +#+caption: RGA number for the statically decoupled plant +#+RESULTS: +[[file:figs/test_nhexa_interaction_rga_static_dec.png]] + +**** Decoupling at the Crossover +<> + +#+begin_src latex :file decoupling_arch_crossover.pdf +\begin{tikzpicture} + \node[block] (G) {$\bm{G}$}; + \node[block, left=0.8 of G] (Ginv) {$\bm{\hat{G}}(j\omega_c)^{-1}$}; + + % Connections and labels + \draw[<-] (Ginv.west) -- ++(-1.8, 0) node[above right]{$\bm{u}$}; + \draw[->] (Ginv.east) -- (G.west) node[above left]{$\bm{\tau}$}; + \draw[->] (G.east) -- ++( 1.8, 0) node[above left]{$d\bm{\mathcal{L}}$}; + + \begin{scope}[on background layer] + \node[fit={(Ginv.south west) (G.north east)}, fill=black!10!white, draw, dashed, inner sep=16pt] (Gx) {}; + \node[below right] at (Gx.north west) {$\bm{G}_{\omega_c}$}; + \end{scope} +\end{tikzpicture} +#+end_src + +#+name: fig:test_nhexa_decoupling_arch_crossover +#+caption: Decoupling using the inverse of a dynamical model $\bm{\hat{G}}$ of the plant dynamics $\bm{G}$ +#+RESULTS: +[[file:figs/test_nhexa_decoupling_arch_crossover.png]] + +#+begin_src matlab :exports none +%% Take complex matrix corresponding to the plant at 100Hz +V = squeeze(frf_coupled(i_wc,:,:)); + +%% Real approximation of inv(G(100Hz)) +D = pinv(real(V'*V)); +H1 = D*real(V'*diag(exp(1j*angle(diag(V*D*V.'))/2))); + +%% Compute the decoupled plant +G_de_wc = zeros(size(frf_coupled)); +for i = 1:length(frf_iff.f) + G_de_wc(i,:,:) = squeeze(frf_coupled(i,:,:))*H1; +end +#+end_src + +#+begin_src matlab :exports results :results value table replace :tangle no +data2orgtable(H1, {}, {}, ' %.1f '); +#+end_src + +#+RESULTS: +| 67229.8 | 3769.3 | -13704.6 | -23084.8 | -6318.2 | 23378.7 | +| 3486.2 | 67708.9 | 23220.0 | -6314.5 | -22699.8 | -14060.6 | +| -5731.7 | 22471.7 | 66701.4 | 3070.2 | -13205.6 | -21944.6 | +| -23305.5 | -14542.6 | 2743.2 | 70097.6 | 24846.8 | -5295.0 | +| -14882.9 | -22957.8 | -5344.4 | 25786.2 | 70484.6 | 2979.9 | +| 24353.3 | -5195.2 | -22449.0 | -14459.2 | 2203.6 | 69484.2 | + +#+begin_src matlab :exports none +%% Bode plot of the plant decoupled at the crossover +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(G_de_wc(:,i,j)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); + end +end +for i = 1:6 + plot(frf_iff.f, abs(G_de_wc(:,i,i)), ... + 'DisplayName', sprintf('$y_%i/u_%i$', i, i)); +end +plot(frf_iff.f, abs(G_de_wc(:,1,2)), 'color', [0,0,0,0.2], ... + 'DisplayName', 'Coupling'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude $d_L/V_a$ [m/V]'); set(gca, 'XTickLabel',[]); +ylim([1e-3, 1e1]); +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2); + +ax2 = nexttile; +hold on; +for i =1:6 + plot(frf_iff.f, 180/pi*angle(G_de_wc(:,i,i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); +ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_wc_plant.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_interaction_wc_plant +#+caption: Bode Plot of the plant decoupled at the crossover +#+RESULTS: +[[file:figs/test_nhexa_interaction_wc_plant.png]] + +#+begin_src matlab +%% Compute RGA Matrix +RGA_wc = zeros(size(frf_coupled)); +for i = 1:length(frf_iff.f) + RGA_wc(i,:,:) = squeeze(G_de_wc(i,:,:)).*inv(squeeze(G_de_wc(i,:,:))).'; +end + +%% Compute RGA-number +RGA_wc_sum = zeros(size(RGA_wc, 1), 1); +for i = 1:size(RGA_wc, 1) + RGA_wc_sum(i) = sum(sum(abs(eye(6) - squeeze(RGA_wc(i,:,:))))); +end +#+end_src + +#+begin_src matlab :exports none +%% Plot the RGA-Number for the plant decoupled at crossover +figure; +plot(frf_iff.f, RGA_wc_sum, 'k-'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('RGA Number'); +xlim([10, 1e3]); ylim([1e-2, 1e2]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_rga_wc.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_interaction_rga_wc +#+caption: RGA number for the plant decoupled at the crossover +#+RESULTS: +[[file:figs/test_nhexa_interaction_rga_wc.png]] + +**** SVD Decoupling +<> + +#+begin_src latex :file decoupling_arch_svd.pdf +\begin{tikzpicture} + \node[block] (G) {$\bm{G}$}; + + \node[block, left=0.8 of G.west] (V) {$V^{-T}$}; + \node[block, right=0.8 of G.east] (U) {$U^{-1}$}; + + % Connections and labels + \draw[<-] (V.west) -- ++(-1.0, 0) node[above right]{$u$}; + \draw[->] (V.east) -- (G.west) node[above left]{$\bm{\tau}$}; + \draw[->] (G.east) -- (U.west) node[above left]{$d\bm{\mathcal{L}}$}; + \draw[->] (U.east) -- ++( 1.0, 0) node[above left]{$y$}; + + \begin{scope}[on background layer] + \node[fit={(V.south west) (G.north-|U.east)}, fill=black!10!white, draw, dashed, inner sep=14pt] (Gsvd) {}; + \node[below right] at (Gsvd.north west) {$\bm{G}_{SVD}$}; + \end{scope} +\end{tikzpicture} +#+end_src + +#+name: fig:test_nhexa_decoupling_arch_svd +#+caption: Decoupling using the Singular Value Decomposition +#+RESULTS: +[[file:figs/test_nhexa_decoupling_arch_svd.png]] + +#+begin_src matlab :exports none +%% Take complex matrix corresponding to the plant at 100Hz +V = squeeze(frf_coupled(i_wc,:,:)); + +%% Real approximation of G(100Hz) +D = pinv(real(V'*V)); +H1 = pinv(D*real(V'*diag(exp(1j*angle(diag(V*D*V.'))/2)))); + +%% Singular Value Decomposition +[U,S,V] = svd(H1); + +%% Compute the decoupled plant using SVD +G_de_svd = zeros(size(frf_coupled)); +for i = 1:length(frf_iff.f) + G_de_svd(i,:,:) = inv(U)*squeeze(frf_coupled(i,:,:))*inv(V'); +end +#+end_src + +#+begin_src matlab :exports none +%% Bode Plot of the SVD decoupled plant +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(G_de_svd(:,i,j)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); + end +end +set(gca,'ColorOrderIndex',1) +for i = 1:6 + plot(frf_iff.f, abs(G_de_svd(:,i,i)), ... + 'DisplayName', sprintf('$y_%i/u_%i$', i, i)); +end +plot(frf_iff.f, abs(G_de_svd(:,1,2)), 'color', [0,0,0,0.2], ... + 'DisplayName', 'Coupling'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); set(gca, 'XTickLabel',[]); +ylim([1e-9, 1e-4]); +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 3); + +ax2 = nexttile; +hold on; +for i =1:6 + plot(frf_iff.f, 180/pi*angle(G_de_svd(:,i,i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); +ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_svd_plant.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_interaction_svd_plant +#+caption: Bode Plot of the plant decoupled using the Singular Value Decomposition +#+RESULTS: +[[file:figs/test_nhexa_interaction_svd_plant.png]] + +#+begin_src matlab +%% Compute the RGA matrix for the SVD decoupled plant +RGA_svd = zeros(size(frf_coupled)); +for i = 1:length(frf_iff.f) + RGA_svd(i,:,:) = squeeze(G_de_svd(i,:,:)).*inv(squeeze(G_de_svd(i,:,:))).'; +end + +%% Compute the RGA-number +RGA_svd_sum = zeros(size(RGA_svd, 1), 1); +for i = 1:length(frf_iff.f) + RGA_svd_sum(i) = sum(sum(abs(eye(6) - squeeze(RGA_svd(i,:,:))))); +end +#+end_src + +#+begin_src matlab +%% RGA Number for the SVD decoupled plant +figure; +plot(frf_iff.f, RGA_svd_sum, 'k-'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('RGA Number'); +xlim([10, 1e3]); ylim([1e-2, 1e2]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_rga_svd.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_interaction_rga_svd +#+caption: RGA number for the plant decoupled using the SVD +#+RESULTS: +[[file:figs/test_nhexa_interaction_rga_svd.png]] + +**** Dynamic decoupling +<> + +#+begin_src latex :file decoupling_arch_dynamic.pdf +\begin{tikzpicture} + \node[block] (G) {$\bm{G}$}; + \node[block, left=0.8 of G] (Ginv) {$\bm{\hat{G}}^{-1}$}; + + % Connections and labels + \draw[<-] (Ginv.west) -- ++(-1.8, 0) node[above right]{$\bm{u}$}; + \draw[->] (Ginv.east) -- (G.west) node[above left]{$\bm{\tau}$}; + \draw[->] (G.east) -- ++( 1.8, 0) node[above left]{$d\bm{\mathcal{L}}$}; + + \begin{scope}[on background layer] + \node[fit={(Ginv.south west) (G.north east)}, fill=black!10!white, draw, dashed, inner sep=16pt] (Gx) {}; + \node[below right] at (Gx.north west) {$\bm{G}_{\text{inv}}$}; + \end{scope} +\end{tikzpicture} +#+end_src + +#+name: fig:test_nhexa_decoupling_arch_dynamic +#+caption: Decoupling using the inverse of a dynamical model $\bm{\hat{G}}$ of the plant dynamics $\bm{G}$ +#+RESULTS: +[[file:figs/test_nhexa_decoupling_arch_dynamic.png]] + +#+begin_src matlab :exports none +%% Compute the plant inverse from the model +G_model = G_coupled; +G_model.outputdelay = 0; % necessary for further inversion +G_inv = inv(G_model); + +%% Compute the decoupled plant +G_de_inv = zeros(size(frf_coupled)); +for i = 1:length(frf_iff.f) + G_de_inv(i,:,:) = squeeze(frf_coupled(i,:,:))*squeeze(evalfr(G_inv, 1j*2*pi*frf_iff.f(i))); +end +#+end_src + +#+begin_src matlab :exports none +%% Bode plot of the decoupled plant by full inversion +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(G_de_inv(:,i,j)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); + end +end +set(gca,'ColorOrderIndex',1) +for i = 1:6 + plot(frf_iff.f, abs(G_de_inv(:,i,i)), ... + 'DisplayName', sprintf('$y_%i/u_%i$', i, i)); +end +plot(frf_iff.f, abs(G_de_inv(:,1,2)), 'color', [0,0,0,0.2], ... + 'DisplayName', 'Coupling'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); set(gca, 'XTickLabel',[]); +ylim([1e-4, 1e1]); +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2); + +ax2 = nexttile; +hold on; +for i =1:6 + plot(frf_iff.f, 180/pi*angle(G_de_inv(:,i,i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); +ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_dynamic_dec_plant.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_interaction_dynamic_dec_plant +#+caption: Bode Plot of the dynamically decoupled plant +#+RESULTS: +[[file:figs/test_nhexa_interaction_dynamic_dec_plant.png]] + +#+begin_src matlab :exports none +%% Compute the RGA matrix for the inverse based decoupled plant +RGA_inv = zeros(size(frf_coupled)); +for i = 1:length(frf_iff.f) + RGA_inv(i,:,:) = squeeze(G_de_inv(i,:,:)).*inv(squeeze(G_de_inv(i,:,:))).'; +end + +%% Compute the RGA-number +RGA_inv_sum = zeros(size(RGA_inv, 1), 1); +for i = 1:size(RGA_inv, 1) + RGA_inv_sum(i) = sum(sum(abs(eye(6) - squeeze(RGA_inv(i,:,:))))); +end +#+end_src + +#+begin_src matlab :exports none +%% RGA Number for the decoupled plant using full inversion +figure; +plot(frf_iff.f, RGA_inv_sum, 'k-'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('RGA Number'); +xlim([10, 1e3]); ylim([1e-2, 1e2]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_rga_dynamic_dec.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_interaction_rga_dynamic_dec +#+caption: RGA number for the dynamically decoupled plant +#+RESULTS: +[[file:figs/test_nhexa_interaction_rga_dynamic_dec.png]] + +**** Jacobian Decoupling - Center of Stiffness +<> + +#+begin_src latex :file decoupling_arch_jacobian_cok.pdf +\begin{tikzpicture} + \node[block] (G) {$\bm{G}$}; + \node[block, left=0.8 of G] (Jt) {$J_{s,\{K\}}^{-T}$}; + \node[block, right=0.8 of G] (Ja) {$J_{a,\{K\}}^{-1}$}; + + % Connections and labels + \draw[<-] (Jt.west) -- ++(-1.8, 0) node[above right]{$\bm{\mathcal{F}}_{\{K\}}$}; + \draw[->] (Jt.east) -- (G.west) node[above left]{$\bm{\tau}$}; + \draw[->] (G.east) -- (Ja.west) node[above left]{$d\bm{\mathcal{L}}$}; + \draw[->] (Ja.east) -- ++( 1.8, 0) node[above left]{$\bm{\mathcal{X}}_{\{K\}}$}; + + \begin{scope}[on background layer] + \node[fit={(Jt.south west) (Ja.north east)}, fill=black!10!white, draw, dashed, inner sep=16pt] (Gx) {}; + \node[below right] at (Gx.north west) {$\bm{G}_{\{K\}}$}; + \end{scope} +\end{tikzpicture} +#+end_src + +#+name: fig:test_nhexa_decoupling_arch_jacobian_cok +#+caption: Decoupling using Jacobian matrices evaluated at the Center of Stiffness +#+RESULTS: +[[file:figs/test_nhexa_decoupling_arch_jacobian_cok.png]] + +#+begin_src matlab :exports none +%% Initialize the Nano-Hexapod +n_hexapod = initializeNanoHexapodFinal('MO_B', -42e-3, ... + 'motion_sensor_type', 'plates'); + +%% Get the Jacobians +J_cok = n_hexapod.geometry.J; +Js_cok = n_hexapod.geometry.Js; + +%% Decouple plant using Jacobian (CoM) +G_de_J_cok = zeros(size(frf_coupled)); +for i = 1:length(frf_iff.f) + G_de_J_cok(i,:,:) = inv(Js_cok)*squeeze(frf_coupled(i,:,:))*inv(J_cok'); +end +#+end_src + +The obtained plant is shown in Figure ref:fig:test_nhexa_interaction_J_cok_plant_not_normalized. +We can see that the stiffness in the $x$, $y$ and $z$ directions are equal, which is due to the cubic architecture of the Stewart platform. + +#+begin_src matlab :exports none +%% Bode Plot of the SVD decoupled plant +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(G_de_J_cok(:,i,j)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); + end +end +set(gca,'ColorOrderIndex',1) +plot(frf_iff.f, abs(G_de_J_cok(:,1,1)), ... + 'DisplayName', '$D_x/\tilde{\mathcal{F}}_x$'); +plot(frf_iff.f, abs(G_de_J_cok(:,2,2)), ... + 'DisplayName', '$D_y/\tilde{\mathcal{F}}_y$'); +plot(frf_iff.f, abs(G_de_J_cok(:,3,3)), ... + 'DisplayName', '$D_z/\tilde{\mathcal{F}}_z$'); +plot(frf_iff.f, abs(G_de_J_cok(:,4,4)), ... + 'DisplayName', '$R_x/\tilde{\mathcal{M}}_x$'); +plot(frf_iff.f, abs(G_de_J_cok(:,5,5)), ... + 'DisplayName', '$R_y/\tilde{\mathcal{M}}_y$'); +plot(frf_iff.f, abs(G_de_J_cok(:,6,6)), ... + 'DisplayName', '$R_z/\tilde{\mathcal{M}}_z$'); +plot(frf_iff.f, abs(G_de_J_cok(:,1,2)), 'color', [0,0,0,0.2], ... + 'DisplayName', 'Coupling'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); set(gca, 'XTickLabel',[]); +ylim([1e-8, 2e-2]); +legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 3); + +ax2 = nexttile; +hold on; +for i =1:6 + plot(frf_iff.f, 180/pi*angle(G_de_J_cok(:,i,i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); +ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_J_cok_plant_not_normalized.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_interaction_J_cok_plant_not_normalized +#+caption: Bode Plot of the plant decoupled using the Jacobian evaluated at the "center of stiffness" +#+RESULTS: +[[file:figs/test_nhexa_interaction_J_cok_plant_not_normalized.png]] + +Because the plant in translation and rotation has very different gains, we choose to normalize the plant inputs such that the gain of the diagonal term is equal to $1$ at 100Hz. + +The results is shown in Figure ref:fig:test_nhexa_interaction_J_cok_plant. +#+begin_src matlab :exports none +%% Normalize the plant input +[~, i_100] = min(abs(frf_iff.f - 100)); +input_normalize = diag(1./diag(abs(squeeze(G_de_J_cok(i_100,:,:))))); + +for i = 1:length(frf_iff.f) + G_de_J_cok(i,:,:) = squeeze(G_de_J_cok(i,:,:))*input_normalize; +end +#+end_src + +#+begin_src matlab :exports none +%% Bode Plot of the SVD decoupled plant +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(G_de_J_cok(:,i,j)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); + end +end +set(gca,'ColorOrderIndex',1) +plot(frf_iff.f, abs(G_de_J_cok(:,1,1)), ... + 'DisplayName', '$D_x/\tilde{\mathcal{F}}_x$'); +plot(frf_iff.f, abs(G_de_J_cok(:,2,2)), ... + 'DisplayName', '$D_y/\tilde{\mathcal{F}}_y$'); +plot(frf_iff.f, abs(G_de_J_cok(:,3,3)), ... + 'DisplayName', '$D_z/\tilde{\mathcal{F}}_z$'); +plot(frf_iff.f, abs(G_de_J_cok(:,4,4)), ... + 'DisplayName', '$R_x/\tilde{\mathcal{M}}_x$'); +plot(frf_iff.f, abs(G_de_J_cok(:,5,5)), ... + 'DisplayName', '$R_y/\tilde{\mathcal{M}}_y$'); +plot(frf_iff.f, abs(G_de_J_cok(:,6,6)), ... + 'DisplayName', '$R_z/\tilde{\mathcal{M}}_z$'); +plot(frf_iff.f, abs(G_de_J_cok(:,1,2)), 'color', [0,0,0,0.2], ... + 'DisplayName', 'Coupling'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); set(gca, 'XTickLabel',[]); +ylim([1e-4, 1e1]); +legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2); + +ax2 = nexttile; +hold on; +for i =1:6 + plot(frf_iff.f, 180/pi*angle(G_de_J_cok(:,i,i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); +ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_J_cok_plant.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_interaction_J_cok_plant +#+caption: Bode Plot of the plant decoupled using the Jacobian evaluated at the "center of stiffness" +#+RESULTS: +[[file:figs/test_nhexa_interaction_J_cok_plant.png]] + +#+begin_src matlab :exports none +%% Compute RGA Matrix +RGA_cok = zeros(size(frf_coupled)); +for i = 1:length(frf_iff.f) + RGA_cok(i,:,:) = squeeze(G_de_J_cok(i,:,:)).*inv(squeeze(G_de_J_cok(i,:,:))).'; +end + +%% Compute RGA-number +RGA_cok_sum = zeros(length(frf_iff.f), 1); +for i = 1:length(frf_iff.f) + RGA_cok_sum(i) = sum(sum(abs(eye(6) - squeeze(RGA_cok(i,:,:))))); +end +#+end_src + +#+begin_src matlab :exports none +%% Plot the RGA-Number for the Jacobian (CoK) decoupled plant +figure; +plot(frf_iff.f, RGA_cok_sum, 'k-'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('RGA Number'); +xlim([10, 1e3]); ylim([1e-2, 1e2]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_rga_J_cok.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_interaction_rga_J_cok +#+caption: RGA number for the plant decoupled using the Jacobian evaluted at the Center of Stiffness +#+RESULTS: +[[file:figs/test_nhexa_interaction_rga_J_cok.png]] + +**** Jacobian Decoupling - Center of Mass +<> + +#+begin_src latex :file decoupling_arch_jacobian_com.pdf +\begin{tikzpicture} + \node[block] (G) {$\bm{G}$}; + \node[block, left=0.8 of G] (Jt) {$J_{s,\{M\}}^{-T}$}; + \node[block, right=0.8 of G] (Ja) {$J_{a,\{M\}}^{-1}$}; + + % Connections and labels + \draw[<-] (Jt.west) -- ++(-1.8, 0) node[above right]{$\bm{\mathcal{F}}_{\{M\}}$}; + \draw[->] (Jt.east) -- (G.west) node[above left]{$\bm{\tau}$}; + \draw[->] (G.east) -- (Ja.west) node[above left]{$d\bm{\mathcal{L}}$}; + \draw[->] (Ja.east) -- ++( 1.8, 0) node[above left]{$\bm{\mathcal{X}}_{\{M\}}$}; + + \begin{scope}[on background layer] + \node[fit={(Jt.south west) (Ja.north east)}, fill=black!10!white, draw, dashed, inner sep=16pt] (Gx) {}; + \node[below right] at (Gx.north west) {$\bm{G}_{\{M\}}$}; + \end{scope} +\end{tikzpicture} +#+end_src + +#+name: fig:test_nhexa_decoupling_arch_jacobian_com +#+caption: Decoupling using Jacobian matrices evaluated at the Center of Mass +#+RESULTS: +[[file:figs/test_nhexa_decoupling_arch_jacobian_com.png]] + +#+begin_src matlab :exports none +%% Initialize the Nano-Hexapod +n_hexapod = initializeNanoHexapodFinal('MO_B', 25e-3, ... + 'motion_sensor_type', 'plates'); + +%% Get the Jacobians +J_com = n_hexapod.geometry.J; +Js_com = n_hexapod.geometry.Js; + +%% Decouple plant using Jacobian (CoM) +G_de_J_com = zeros(size(frf_coupled)); +for i = 1:length(frf_iff.f) + G_de_J_com(i,:,:) = inv(Js_com)*squeeze(frf_coupled(i,:,:))*inv(J_com'); +end + +%% Normalize the plant input +[~, i_100] = min(abs(frf_iff.f - 100)); +input_normalize = diag(1./diag(abs(squeeze(G_de_J_com(i_100,:,:))))); + +for i = 1:length(frf_iff.f) + G_de_J_com(i,:,:) = squeeze(G_de_J_com(i,:,:))*input_normalize; +end +#+end_src + +#+begin_src matlab :exports none +%% Bode Plot of the SVD decoupled plant +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(G_de_J_com(:,i,j)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); + end +end +set(gca,'ColorOrderIndex',1) +plot(frf_iff.f, abs(G_de_J_com(:,1,1)), ... + 'DisplayName', '$D_x/\tilde{\mathcal{F}}_x$'); +plot(frf_iff.f, abs(G_de_J_com(:,2,2)), ... + 'DisplayName', '$D_y/\tilde{\mathcal{F}}_y$'); +plot(frf_iff.f, abs(G_de_J_com(:,3,3)), ... + 'DisplayName', '$D_z/\tilde{\mathcal{F}}_z$'); +plot(frf_iff.f, abs(G_de_J_com(:,4,4)), ... + 'DisplayName', '$R_x/\tilde{\mathcal{M}}_x$'); +plot(frf_iff.f, abs(G_de_J_com(:,5,5)), ... + 'DisplayName', '$R_y/\tilde{\mathcal{M}}_y$'); +plot(frf_iff.f, abs(G_de_J_com(:,6,6)), ... + 'DisplayName', '$R_z/\tilde{\mathcal{M}}_z$'); +plot(frf_iff.f, abs(G_de_J_com(:,1,2)), 'color', [0,0,0,0.2], ... + 'DisplayName', 'Coupling'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); set(gca, 'XTickLabel',[]); +ylim([1e-3, 1e1]); +legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2); + +ax2 = nexttile; +hold on; +for i =1:6 + plot(frf_iff.f, 180/pi*angle(G_de_J_com(:,i,i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); +ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_J_com_plant.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_interaction_J_com_plant +#+caption: Bode Plot of the plant decoupled using the Jacobian evaluated at the Center of Mass +#+RESULTS: +[[file:figs/test_nhexa_interaction_J_com_plant.png]] + +#+begin_src matlab :exports none +%% Compute RGA Matrix +RGA_com = zeros(size(frf_coupled)); +for i = 1:length(frf_iff.f) + RGA_com(i,:,:) = squeeze(G_de_J_com(i,:,:)).*inv(squeeze(G_de_J_com(i,:,:))).'; +end + +%% Compute RGA-number +RGA_com_sum = zeros(size(RGA_com, 1), 1); +for i = 1:size(RGA_com, 1) + RGA_com_sum(i) = sum(sum(abs(eye(6) - squeeze(RGA_com(i,:,:))))); +end +#+end_src + +#+begin_src matlab :exports none +%% Plot the RGA-Number for the Jacobian (CoM) decoupled plant +figure; +plot(frf_iff.f, RGA_com_sum, 'k-'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('RGA Number'); +xlim([10, 1e3]); ylim([1e-2, 1e2]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_rga_J_com.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_interaction_rga_J_com +#+caption: RGA number for the plant decoupled using the Jacobian evaluted at the Center of Mass +#+RESULTS: +[[file:figs/test_nhexa_interaction_rga_J_com.png]] + +**** Decoupling Comparison +<> + +Let's now compare all of the decoupling methods (Figure ref:fig:test_nhexa_interaction_compare_rga_numbers). + +#+begin_important +From Figure ref:fig:test_nhexa_interaction_compare_rga_numbers, the following remarks are made: +- *Decentralized plant*: well decoupled below suspension modes +- *Static inversion*: similar to the decentralized plant as the decentralized plant has already a good decoupling at low frequency +- *Crossover inversion*: the decoupling is improved around the crossover frequency as compared to the decentralized plant. However, the decoupling is increased at lower frequency. +- *SVD decoupling*: Very good decoupling up to 235Hz. Especially between 100Hz and 200Hz. +- *Dynamic Inversion*: the plant is very well decoupled at frequencies where the model is accurate (below 235Hz where flexible modes are not modelled). +- *Jacobian - Stiffness*: good decoupling at low frequency. The decoupling increases at the frequency of the suspension modes, but is acceptable up to the strut flexible modes (235Hz). +- *Jacobian - Mass*: bad decoupling at low frequency. Better decoupling above the frequency of the suspension modes, and acceptable decoupling up to the strut flexible modes (235Hz). +#+end_important + +#+begin_src matlab :exports none +%% Comparison of the RGA-Numbers +figure; +hold on; +plot(frf_iff.f, RGA_dec_sum, 'DisplayName', 'Decentralized'); +plot(frf_iff.f, RGA_sta_sum, 'DisplayName', 'Static inv.'); +plot(frf_iff.f, RGA_wc_sum, 'DisplayName', 'Crossover inv.'); +plot(frf_iff.f, RGA_svd_sum, 'DisplayName', 'SVD'); +plot(frf_iff.f, RGA_inv_sum, 'DisplayName', 'Dynamic inv.'); +plot(frf_iff.f, RGA_cok_sum, 'DisplayName', 'Jacobian - CoK'); +plot(frf_iff.f, RGA_com_sum, 'DisplayName', 'Jacobian - CoM'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('RGA Number'); +xlim([10, 1e3]); ylim([1e-2, 1e2]); +legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 2); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_compare_rga_numbers.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_interaction_compare_rga_numbers +#+caption: Comparison of the obtained RGA-numbers for all the decoupling methods +#+RESULTS: +[[file:figs/test_nhexa_interaction_compare_rga_numbers.png]] + +**** Decoupling Robustness +<> + +Let's now see how the decoupling is changing when changing the payload's mass. +#+begin_src matlab +frf_new = frf_iff.G_de{3}; +#+end_src + +#+begin_src matlab :exports none +%% Decentralized RGA +RGA_dec_b = zeros(size(frf_new)); +for i = 1:length(frf_iff.f) + RGA_dec_b(i,:,:) = squeeze(frf_new(i,:,:)).*inv(squeeze(frf_new(i,:,:))).'; +end + +RGA_dec_sum_b = zeros(length(frf_iff), 1); +for i = 1:length(frf_iff.f) + RGA_dec_sum_b(i) = sum(sum(abs(eye(6) - squeeze(RGA_dec_b(i,:,:))))); +end +#+end_src + +#+begin_src matlab :exports none +%% Static Decoupling +G_de_sta_b = zeros(size(frf_new)); +for i = 1:length(frf_iff.f) + G_de_sta_b(i,:,:) = squeeze(frf_new(i,:,:))*dc_inv; +end + +RGA_sta_b = zeros(size(frf_new)); +for i = 1:length(frf_iff.f) + RGA_sta_b(i,:,:) = squeeze(G_de_sta_b(i,:,:)).*inv(squeeze(G_de_sta_b(i,:,:))).'; +end + +RGA_sta_sum_b = zeros(size(RGA_sta_b, 1), 1); +for i = 1:size(RGA_sta_b, 1) + RGA_sta_sum_b(i) = sum(sum(abs(eye(6) - squeeze(RGA_sta_b(i,:,:))))); +end +#+end_src + +#+begin_src matlab :exports none +%% Crossover Decoupling +V = squeeze(frf_coupled(i_wc,:,:)); +D = pinv(real(V'*V)); +H1 = D*real(V'*diag(exp(1j*angle(diag(V*D*V.'))/2))); + +G_de_wc_b = zeros(size(frf_new)); +for i = 1:length(frf_iff.f) + G_de_wc_b(i,:,:) = squeeze(frf_new(i,:,:))*H1; +end + +RGA_wc_b = zeros(size(frf_new)); +for i = 1:length(frf_iff.f) + RGA_wc_b(i,:,:) = squeeze(G_de_wc_b(i,:,:)).*inv(squeeze(G_de_wc_b(i,:,:))).'; +end + +RGA_wc_sum_b = zeros(size(RGA_wc_b, 1), 1); +for i = 1:size(RGA_wc_b, 1) + RGA_wc_sum_b(i) = sum(sum(abs(eye(6) - squeeze(RGA_wc_b(i,:,:))))); +end +#+end_src + +#+begin_src matlab :exports none +%% SVD +V = squeeze(frf_coupled(i_wc,:,:)); +D = pinv(real(V'*V)); +H1 = pinv(D*real(V'*diag(exp(1j*angle(diag(V*D*V.'))/2)))); +[U,S,V] = svd(H1); + +G_de_svd_b = zeros(size(frf_new)); +for i = 1:length(frf_iff.f) + G_de_svd_b(i,:,:) = inv(U)*squeeze(frf_new(i,:,:))*inv(V'); +end + +RGA_svd_b = zeros(size(frf_new)); +for i = 1:length(frf_iff.f) + RGA_svd_b(i,:,:) = squeeze(G_de_svd_b(i,:,:)).*inv(squeeze(G_de_svd_b(i,:,:))).'; +end + +RGA_svd_sum_b = zeros(size(RGA_svd_b, 1), 1); +for i = 1:size(RGA_svd, 1) + RGA_svd_sum_b(i) = sum(sum(abs(eye(6) - squeeze(RGA_svd_b(i,:,:))))); +end +#+end_src + +#+begin_src matlab :exports none +%% Dynamic Decoupling +G_model = G_coupled; +G_model.outputdelay = 0; % necessary for further inversion +G_inv = inv(G_model); + +G_de_inv_b = zeros(size(frf_new)); +for i = 1:length(frf_iff.f) + G_de_inv_b(i,:,:) = squeeze(frf_new(i,:,:))*squeeze(evalfr(G_inv, 1j*2*pi*frf_iff.f(i))); +end + +RGA_inv_b = zeros(size(frf_new)); +for i = 1:length(frf_iff.f) + RGA_inv_b(i,:,:) = squeeze(G_de_inv_b(i,:,:)).*inv(squeeze(G_de_inv_b(i,:,:))).'; +end + +RGA_inv_sum_b = zeros(size(RGA_inv_b, 1), 1); +for i = 1:size(RGA_inv_b, 1) + RGA_inv_sum_b(i) = sum(sum(abs(eye(6) - squeeze(RGA_inv_b(i,:,:))))); +end +#+end_src + +#+begin_src matlab :exports none +%% Jacobian (CoK) +G_de_J_cok_b = zeros(size(frf_new)); +for i = 1:length(frf_iff.f) + G_de_J_cok_b(i,:,:) = inv(Js_cok)*squeeze(frf_new(i,:,:))*inv(J_cok'); +end + +RGA_cok_b = zeros(size(frf_new)); +for i = 1:length(frf_iff.f) + RGA_cok_b(i,:,:) = squeeze(G_de_J_cok_b(i,:,:)).*inv(squeeze(G_de_J_cok_b(i,:,:))).'; +end + +RGA_cok_sum_b = zeros(size(RGA_cok_b, 1), 1); +for i = 1:size(RGA_cok_b, 1) + RGA_cok_sum_b(i) = sum(sum(abs(eye(6) - squeeze(RGA_cok_b(i,:,:))))); +end +#+end_src + +#+begin_src matlab :exports none +%% Jacobian (CoM) +G_de_J_com_b = zeros(size(frf_new)); +for i = 1:length(frf_iff.f) + G_de_J_com_b(i,:,:) = inv(Js_com)*squeeze(frf_new(i,:,:))*inv(J_com'); +end + +RGA_com_b = zeros(size(frf_new)); +for i = 1:length(frf_iff.f) + RGA_com_b(i,:,:) = squeeze(G_de_J_com_b(i,:,:)).*inv(squeeze(G_de_J_com_b(i,:,:))).'; +end + +RGA_com_sum_b = zeros(size(RGA_com_b, 1), 1); +for i = 1:size(RGA_com_b, 1) + RGA_com_sum_b(i) = sum(sum(abs(eye(6) - squeeze(RGA_com_b(i,:,:))))); +end +#+end_src + +The obtained RGA-numbers are shown in Figure ref:fig:test_nhexa_interaction_compare_rga_numbers_rob. + +#+begin_important +From Figure ref:fig:test_nhexa_interaction_compare_rga_numbers_rob: +- The decoupling using the Jacobian evaluated at the "center of stiffness" seems to give the most robust results. +#+end_important + +#+begin_src matlab :exports none +%% Robustness of the Decoupling method +figure; +hold on; +plot(frf_iff.f, RGA_dec_sum, '-', 'DisplayName', 'Decentralized'); +plot(frf_iff.f, RGA_sta_sum, '-', 'DisplayName', 'Static inv.'); +plot(frf_iff.f, RGA_wc_sum, '-', 'DisplayName', 'Crossover inv.'); +plot(frf_iff.f, RGA_svd_sum, '-', 'DisplayName', 'SVD'); +plot(frf_iff.f, RGA_inv_sum, '-', 'DisplayName', 'Dynamic inv.'); +plot(frf_iff.f, RGA_cok_sum, '-', 'DisplayName', 'Jacobian - CoK'); +plot(frf_iff.f, RGA_com_sum, '-', 'DisplayName', 'Jacobian - CoM'); +set(gca,'ColorOrderIndex',1) +plot(frf_iff.f, RGA_dec_sum_b, '--', 'HandleVisibility', 'off'); +plot(frf_iff.f, RGA_sta_sum_b, '--', 'HandleVisibility', 'off'); +plot(frf_iff.f, RGA_wc_sum_b, '--', 'HandleVisibility', 'off'); +plot(frf_iff.f, RGA_svd_sum_b, '--', 'HandleVisibility', 'off'); +plot(frf_iff.f, RGA_inv_sum_b, '--', 'HandleVisibility', 'off'); +plot(frf_iff.f, RGA_cok_sum_b, '--', 'HandleVisibility', 'off'); +plot(frf_iff.f, RGA_com_sum_b, '--', 'HandleVisibility', 'off'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('RGA Number'); +xlim([10, 1e3]); ylim([1e-2, 1e2]); +legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 2); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/interaction_compare_rga_numbers_rob.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_interaction_compare_rga_numbers_rob +#+caption: Change of the RGA-number with a change of the payload. Indication of the robustness of the inversion method. +#+RESULTS: +[[file:figs/test_nhexa_interaction_compare_rga_numbers_rob.png]] + +**** Conclusion + +#+begin_important +Several decoupling methods can be used: +- SVD +- Inverse +- Jacobian (CoK) +#+end_important + +#+name: tab:interaction_analysis_conclusion +#+caption: Summary of the interaction analysis and different decoupling strategies +#+attr_latex: :environment tabularx :width \linewidth :align lccc +#+attr_latex: :center t :booktabs t +| *Method* | *RGA* | *Diag Plant* | *Robustness* | +|----------------+-------+--------------+--------------| +| Decentralized | -- | Equal | ++ | +| Static dec. | -- | Equal | ++ | +| Crossover dec. | - | Equal | 0 | +| SVD | ++ | Diff | + | +| Dynamic dec. | ++ | Unity, equal | - | +| Jacobian - CoK | + | Diff | ++ | +| Jacobian - CoM | 0 | Diff | + | + +*** Robust High Authority Controller +:PROPERTIES: +:header-args:matlab+: :tangle matlab/scripts/hac_lac_enc_plates_suspended_table.m +:END: +<> +**** Introduction :ignore: +In this section we wish to develop a robust High Authority Controller (HAC) that is working for all payloads. + +cite:indri20_mechat_robot + +**** Matlab Init :noexport:ignore: +#+begin_src matlab +%% hac_lac_enc_plates_suspended_table.m +% Development and analysis of a robust High Authority Controller +#+end_src + +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) +<> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes +<> +#+end_src + +#+begin_src matlab :tangle no :noweb yes +<> +#+end_src + +#+begin_src matlab :eval no :noweb yes +<> +#+end_src + +#+begin_src matlab :noweb yes +<> +#+end_src + +#+begin_src matlab +%% Load the identified FRF and Simscape model +frf_iff = load('frf_iff_vib_table_m.mat', 'f', 'Ts', 'G_de'); +sim_iff = load('sim_iff_vib_table_m.mat', 'G_de'); +#+end_src + +**** Using Jacobian evaluated at the center of stiffness +***** Decoupled Plant +#+begin_src matlab +G_nom = frf_iff.G_de{2}; % Nominal Plant +#+end_src + +#+begin_src matlab :exports none +%% Initialize the Nano-Hexapod +n_hexapod = initializeNanoHexapodFinal('MO_B', -42e-3, ... + 'motion_sensor_type', 'plates'); + +%% Get the Jacobians +J_cok = n_hexapod.geometry.J; +Js_cok = n_hexapod.geometry.Js; + +%% Decouple plant using Jacobian (CoM) +G_de_J_cok = zeros(size(G_nom)); +for i = 1:length(frf_iff.f) + G_de_J_cok(i,:,:) = inv(Js_cok)*squeeze(G_nom(i,:,:))*inv(J_cok'); +end + +%% Normalize the plant input +[~, i_100] = min(abs(frf_iff.f - 10)); +input_normalize = diag(1./diag(abs(squeeze(G_de_J_cok(i_100,:,:))))); + +for i = 1:length(frf_iff.f) + G_de_J_cok(i,:,:) = squeeze(G_de_J_cok(i,:,:))*input_normalize; +end +#+end_src + +#+begin_src matlab :exports none +%% Bode Plot of the decoupled plant +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(G_de_J_cok(:,i,j)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); + end +end +set(gca,'ColorOrderIndex',1) +plot(frf_iff.f, abs(G_de_J_cok(:,1,1)), ... + 'DisplayName', '$D_x/\tilde{\mathcal{F}}_x$'); +plot(frf_iff.f, abs(G_de_J_cok(:,2,2)), ... + 'DisplayName', '$D_y/\tilde{\mathcal{F}}_y$'); +plot(frf_iff.f, abs(G_de_J_cok(:,3,3)), ... + 'DisplayName', '$D_z/\tilde{\mathcal{F}}_z$'); +plot(frf_iff.f, abs(G_de_J_cok(:,4,4)), ... + 'DisplayName', '$R_x/\tilde{\mathcal{M}}_x$'); +plot(frf_iff.f, abs(G_de_J_cok(:,5,5)), ... + 'DisplayName', '$R_y/\tilde{\mathcal{M}}_y$'); +plot(frf_iff.f, abs(G_de_J_cok(:,6,6)), ... + 'DisplayName', '$R_z/\tilde{\mathcal{M}}_z$'); +plot(frf_iff.f, abs(G_de_J_cok(:,1,2)), 'color', [0,0,0,0.2], ... + 'DisplayName', 'Coupling'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); set(gca, 'XTickLabel',[]); +ylim([1e-3, 1e1]); +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2); + +ax2 = nexttile; +hold on; +for i =1:6 + plot(frf_iff.f, 180/pi*angle(G_de_J_cok(:,i,i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); +ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/bode_plot_hac_iff_plant_jacobian_cok.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_bode_plot_hac_iff_plant_jacobian_cok +#+caption: Bode plot of the decoupled plant using the Jacobian evaluated at the Center of Stiffness +#+RESULTS: +[[file:figs/test_nhexa_bode_plot_hac_iff_plant_jacobian_cok.png]] + +***** SISO Controller Design +As the diagonal elements of the plant are not equal, several SISO controllers are designed and then combined to form a diagonal controller. +All the diagonal terms of the controller consists of: +- A double integrator to have high gain at low frequency +- A lead around the crossover frequency to increase stability margins +- Two second order low pass filters above the crossover frequency to increase the robustness to high frequency modes + +#+begin_src matlab :exports none +%% Controller Ry,Rz + +% Wanted crossover frequency +wc_Rxy = 2*pi*80; + +% Lead +a = 8.0; % Amount of phase lead / width of the phase lead / high frequency gain +wc = wc_Rxy; % Frequency with the maximum phase lead [rad/s] +Kd_lead = (1 + s/(wc/sqrt(a)))/(1 + s/(wc*sqrt(a)))/sqrt(a); + +% Integrator +w0_int = wc_Rxy/2; % [rad/s] +xi_int = 0.3; + +Kd_int = (1 + 2*xi_int/w0_int*s + s^2/w0_int^2)/(s^2/w0_int^2); + +% Low Pass Filter (High frequency robustness) +w0_lpf = wc_Rxy*2; % Cut-off frequency [rad/s] +xi_lpf = 0.6; % Damping Ratio + +Kd_lpf = 1/(1 + 2*xi_lpf/w0_lpf*s + s^2/w0_lpf^2); + +w0_lpf_b = wc_Rxy*4; % Cut-off frequency [rad/s] +xi_lpf_b = 0.7; % Damping Ratio + +Kd_lpf_b = 1/(1 + 2*xi_lpf_b/w0_lpf_b*s + s^2/w0_lpf_b^2); + +% Unity Gain frequency +[~, i_80] = min(abs(frf_iff.f - wc_Rxy/2/pi)); + +% Combination of all the elements +Kd_Rxy = ... + -1/abs(G_de_J_cok(i_80,4,4)) * ... + Kd_lead/abs(evalfr(Kd_lead, 1j*wc_Rxy)) * ... % Lead (gain of 1 at wc) + Kd_int /abs(evalfr(Kd_int, 1j*wc_Rxy)) * ... + Kd_lpf_b/abs(evalfr(Kd_lpf_b, 1j*wc_Rxy)) * ... + Kd_lpf /abs(evalfr(Kd_lpf, 1j*wc_Rxy)); % Low Pass Filter +#+end_src + +#+begin_src matlab :exports none +%% Controller Dx,Dy,Rz + +% Wanted crossover frequency +wc_Dxy = 2*pi*100; + +% Lead +a = 8.0; % Amount of phase lead / width of the phase lead / high frequency gain +wc = wc_Dxy; % Frequency with the maximum phase lead [rad/s] +Kd_lead = (1 + s/(wc/sqrt(a)))/(1 + s/(wc*sqrt(a)))/sqrt(a); + +% Integrator +w0_int = wc_Dxy/2; % [rad/s] +xi_int = 0.3; + +Kd_int = (1 + 2*xi_int/w0_int*s + s^2/w0_int^2)/(s^2/w0_int^2); + +% Low Pass Filter (High frequency robustness) +w0_lpf = wc_Dxy*2; % Cut-off frequency [rad/s] +xi_lpf = 0.6; % Damping Ratio + +Kd_lpf = 1/(1 + 2*xi_lpf/w0_lpf*s + s^2/w0_lpf^2); + +w0_lpf_b = wc_Dxy*4; % Cut-off frequency [rad/s] +xi_lpf_b = 0.7; % Damping Ratio + +Kd_lpf_b = 1/(1 + 2*xi_lpf_b/w0_lpf_b*s + s^2/w0_lpf_b^2); + +% Unity Gain frequency +[~, i_100] = min(abs(frf_iff.f - wc_Dxy/2/pi)); + +% Combination of all the elements +Kd_Dyx_Rz = ... + -1/abs(G_de_J_cok(i_100,1,1)) * ... + Kd_int /abs(evalfr(Kd_int, 1j*wc_Dxy)) * ... % Integrator + Kd_lead/abs(evalfr(Kd_lead, 1j*wc_Dxy)) * ... % Lead (gain of 1 at wc) + Kd_lpf_b/abs(evalfr(Kd_lpf_b, 1j*wc_Dxy)) * ... % Lead (gain of 1 at wc) + Kd_lpf /abs(evalfr(Kd_lpf, 1j*wc_Dxy)); % Low Pass Filter +#+end_src + +#+begin_src matlab :exports none +%% Controller Dz + +% Wanted crossover frequency +wc_Dz = 2*pi*100; + +% Lead +a = 8.0; % Amount of phase lead / width of the phase lead / high frequency gain +wc = wc_Dz; % Frequency with the maximum phase lead [rad/s] +Kd_lead = (1 + s/(wc/sqrt(a)))/(1 + s/(wc*sqrt(a)))/sqrt(a); + +% Integrator +w0_int = wc_Dz/2; % [rad/s] +xi_int = 0.3; + +Kd_int = (1 + 2*xi_int/w0_int*s + s^2/w0_int^2)/(s^2/w0_int^2); + +% Low Pass Filter (High frequency robustness) +w0_lpf = wc_Dz*2; % Cut-off frequency [rad/s] +xi_lpf = 0.6; % Damping Ratio + +Kd_lpf = 1/(1 + 2*xi_lpf/w0_lpf*s + s^2/w0_lpf^2); + +w0_lpf_b = wc_Dz*4; % Cut-off frequency [rad/s] +xi_lpf_b = 0.7; % Damping Ratio + +Kd_lpf_b = 1/(1 + 2*xi_lpf_b/w0_lpf_b*s + s^2/w0_lpf_b^2); + +% Unity Gain frequency +[~, i_100] = min(abs(frf_iff.f - wc_Dz/2/pi)); + +% Combination of all the elements +Kd_Dz = ... + -1/abs(G_de_J_cok(i_100,3,3)) * ... + Kd_int /abs(evalfr(Kd_int, 1j*wc_Dz)) * ... % Integrator + Kd_lead/abs(evalfr(Kd_lead, 1j*wc_Dz)) * ... % Lead (gain of 1 at wc) + Kd_lpf_b/abs(evalfr(Kd_lpf_b, 1j*wc_Dz)) * ... % Lead (gain of 1 at wc) + Kd_lpf /abs(evalfr(Kd_lpf, 1j*wc_Dz)); % Low Pass Filter +#+end_src + +#+begin_src matlab :exports none +%% Diagonal Controller +Kd_diag = blkdiag(Kd_Dyx_Rz, Kd_Dyx_Rz, Kd_Dz, Kd_Rxy, Kd_Rxy, Kd_Dyx_Rz); +#+end_src + +***** Obtained Loop Gain +#+begin_src matlab :exports none +%% Experimental Loop Gain +Lmimo = permute(pagemtimes(permute(G_de_J_cok, [2,3,1]), squeeze(freqresp(Kd_diag, frf_iff.f, 'Hz'))), [3,1,2]); +#+end_src + +#+begin_src matlab :exports none +%% Bode plot of the experimental Loop Gain +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:6 + plot(frf_iff.f, abs(Lmimo(:,i,i)), '-'); +end +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(squeeze(Lmimo(:,i,j))), 'color', [0,0,0,0.2]); + end +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Loop Gain'); set(gca, 'XTickLabel',[]); +ylim([1e-3, 1e+3]); + +ax2 = nexttile; +hold on; +for i = 1:6 + plot(frf_iff.f, 180/pi*angle(Lmimo(:,i,i)), '-'); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:45:360); +ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([1, 2e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/bode_plot_hac_iff_loop_gain_jacobian_cok.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_bode_plot_hac_iff_loop_gain_jacobian_cok +#+caption: Bode plot of the Loop Gain when using the Jacobian evaluated at the Center of Stiffness to decouple the system +#+RESULTS: +[[file:figs/test_nhexa_bode_plot_hac_iff_loop_gain_jacobian_cok.png]] + +#+begin_src matlab +%% Controller to be implemented +Kd = inv(J_cok')*input_normalize*ss(Kd_diag)*inv(Js_cok); +#+end_src + +***** Verification of the Stability +Now the stability of the feedback loop is verified using the generalized Nyquist criteria. + +#+begin_src matlab :exports none +%% Compute the Eigenvalues of the loop gain +Ldet = zeros(3, 6, length(frf_iff.f)); + +for i_mass = 1:3 + % Loop gain + Lmimo = pagemtimes(permute(frf_iff.G_de{i_mass}, [2,3,1]),squeeze(freqresp(Kd, frf_iff.f, 'Hz'))); + for i_f = 2:length(frf_iff.f) + Ldet(i,:, i_f) = eig(squeeze(Lmimo(:,:,i_f))); + end +end +#+end_src + +#+begin_src matlab :exports none +%% Plot of the eigenvalues of L in the complex plane +figure; +hold on; +for i_mass = 2:3 + plot(real(squeeze(Ldet(i_mass, 1,:))), imag(squeeze(Ldet(i_mass, 1,:))), ... + '.', 'color', colors(i_mass+1, :), ... + 'DisplayName', sprintf('%i masses', i_mass)); + plot(real(squeeze(Ldet(i_mass, 1,:))), -imag(squeeze(Ldet(i_mass, 1,:))), ... + '.', 'color', colors(i_mass+1, :), ... + 'HandleVisibility', 'off'); + for i = 1:6 + plot(real(squeeze(Ldet(i_mass, i,:))), imag(squeeze(Ldet(i_mass, i,:))), ... + '.', 'color', colors(i_mass+1, :), ... + 'HandleVisibility', 'off'); + plot(real(squeeze(Ldet(i_mass, i,:))), -imag(squeeze(Ldet(i_mass, i,:))), ... + '.', 'color', colors(i_mass+1, :), ... + 'HandleVisibility', 'off'); + end +end +plot(-1, 0, 'kx', 'HandleVisibility', 'off'); +hold off; +set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin'); +xlabel('Real'); ylabel('Imag'); +legend('location', 'southeast'); +xlim([-3, 1]); ylim([-2, 2]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/loci_hac_iff_loop_gain_jacobian_cok.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_loci_hac_iff_loop_gain_jacobian_cok +#+caption: Loci of $L(j\omega)$ in the complex plane. +#+RESULTS: +[[file:figs/test_nhexa_loci_hac_iff_loop_gain_jacobian_cok.png]] + +***** Save for further analysis +#+begin_src matlab :exports none :tangle no +save('matlab/data_sim/Khac_iff_struts_jacobian_cok.mat', 'Kd') +#+end_src + +#+begin_src matlab :eval no +save('data_sim/Khac_iff_struts_jacobian_cok.mat', 'Kd') +#+end_src + +***** Sensitivity transfer function from the model +#+begin_src matlab :exports none +%% Open Simulink Model +mdl = 'nano_hexapod_simscape'; + +options = linearizeOptions; +options.SampleTime = 0; + +open(mdl) + +Rx = zeros(1, 7); + +colors = colororder; +#+end_src + +#+begin_src matlab :exports none +%% Initialize the Simscape model in closed loop +n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... + 'flex_top_type', '4dof', ... + 'motion_sensor_type', 'plates', ... + 'actuator_type', '2dof', ... + 'controller_type', 'hac-iff-struts'); + +support.type = 1; % On top of vibration table +payload.type = 2; % Payload +#+end_src + +#+begin_src matlab :exports none +%% Load controllers +load('Kiff_opt.mat', 'Kiff'); +Kiff = c2d(Kiff, Ts, 'Tustin'); +load('Khac_iff_struts_jacobian_cok.mat', 'Kd') +Khac_iff_struts = c2d(Kd, Ts, 'Tustin'); +#+end_src + +#+begin_src matlab :exports none +%% Identify the (damped) transfer function from u to dLm +clear io; io_i = 1; +io(io_i) = linio([mdl, '/Rx'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs +io(io_i) = linio([mdl, '/dL'], 1, 'output'); io_i = io_i + 1; % Plate Displacement (encoder) +#+end_src + +#+begin_src matlab :exports none +%% Identification of the dynamics +Gcl = linearize(mdl, io, 0.0, options); +#+end_src + +#+begin_src matlab :exports none +%% Computation of the sensitivity transfer function +S = eye(6) - inv(n_hexapod.geometry.J)*Gcl; +#+end_src + +The results are shown in Figure ref:fig:test_nhexa_sensitivity_hac_jacobian_cok_3m_comp_model. + +#+begin_src matlab :exports none +%% Bode plot for the transfer function from u to dLm +freqs = logspace(0, 3, 1000); + +figure; +hold on; +for i =1:6 + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(S(i,i), freqs, 'Hz'))), '--', ... + 'DisplayName', sprintf('$S_{%s}$ - Model', labels{i})); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Sensitivity [-]'); +ylim([1e-4, 1e1]); +legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 3); +xlim([1, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/sensitivity_hac_jacobian_cok_3m_comp_model.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_sensitivity_hac_jacobian_cok_3m_comp_model +#+caption: Estimated sensitivity transfer functions for the HAC controller using the Jacobian estimated at the Center of Stiffness +#+RESULTS: +[[file:figs/test_nhexa_sensitivity_hac_jacobian_cok_3m_comp_model.png]] + +**** Using Singular Value Decomposition +***** Decoupled Plant +#+begin_src matlab +G_nom = frf_iff.G_de{2}; % Nominal Plant +#+end_src + +#+begin_src matlab :exports none +%% Take complex matrix corresponding to the plant at 100Hz +wc = 100; % Wanted crossover frequency [Hz] +[~, i_wc] = min(abs(frf_iff.f - wc)); % Indice corresponding to wc + +V = squeeze(G_nom(i_wc,:,:)); + +%% Real approximation of G(100Hz) +D = pinv(real(V'*V)); +H1 = pinv(D*real(V'*diag(exp(1j*angle(diag(V*D*V.'))/2)))); + +%% Singular Value Decomposition +[U,S,V] = svd(H1); + +%% Compute the decoupled plant using SVD +G_de_svd = zeros(size(G_nom)); +for i = 1:length(frf_iff.f) + G_de_svd(i,:,:) = inv(U)*squeeze(G_nom(i,:,:))*inv(V'); +end +#+end_src + +#+begin_src matlab :exports none +%% Bode plot of the decoupled plant using SVD +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(G_de_svd(:,i,j)), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); + end +end +set(gca,'ColorOrderIndex',1); +for i = 1:6 + plot(frf_iff.f, abs(G_de_svd(:,i,i)), ... + 'DisplayName', sprintf('$y_%i/u_%i$', i, i)); +end +plot(frf_iff.f, abs(G_de_svd(:,1,2)), 'color', [0,0,0,0.2], ... + 'DisplayName', 'Coupling'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); set(gca, 'XTickLabel',[]); +ylim([1e-9, 1e-4]); +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2); + +ax2 = nexttile; +hold on; +for i =1:6 + plot(frf_iff.f, 180/pi*angle(G_de_svd(:,i,i))); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:90:360); +ylim([-180, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([10, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/bode_plot_hac_iff_plant_svd.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_bode_plot_hac_iff_plant_svd +#+caption: Bode plot of the decoupled plant using the SVD +#+RESULTS: +[[file:figs/test_nhexa_bode_plot_hac_iff_plant_svd.png]] + +***** Controller Design +#+begin_src matlab :exports none +%% Lead +a = 6.0; % Amount of phase lead / width of the phase lead / high frequency gain +wc = 2*pi*100; % Frequency with the maximum phase lead [rad/s] +Kd_lead = (1 + s/(wc/sqrt(a)))/(1 + s/(wc*sqrt(a)))/sqrt(a); + +%% Integrator +Kd_int = ((2*pi*50 + s)/(2*pi*0.1 + s))^2; + +%% Low Pass Filter (High frequency robustness) +w0_lpf = 2*pi*200; % Cut-off frequency [rad/s] +xi_lpf = 0.3; % Damping Ratio + +Kd_lpf = 1/(1 + 2*xi_lpf/w0_lpf*s + s^2/w0_lpf^2); + +%% Normalize Gain +Kd_norm = diag(1./abs(diag(squeeze(G_de_svd(i_wc,:,:))))); + +%% Diagonal Control +Kd_diag = ... + Kd_norm * ... % Normalize gain at 100Hz + Kd_int /abs(evalfr(Kd_int, 1j*2*pi*100)) * ... % Integrator + Kd_lead/abs(evalfr(Kd_lead, 1j*2*pi*100)) * ... % Lead (gain of 1 at wc) + Kd_lpf /abs(evalfr(Kd_lpf, 1j*2*pi*100)); % Low Pass Filter +#+end_src + +#+begin_src matlab :exports none +%% MIMO Controller +Kd = -inv(V') * ... % Output decoupling + ss(Kd_diag) * ... + inv(U); % Input decoupling +#+end_src + +***** Loop Gain +#+begin_src matlab :exports none +%% Experimental Loop Gain +Lmimo = permute(pagemtimes(permute(G_nom, [2,3,1]),squeeze(freqresp(Kd, frf_iff.f, 'Hz'))), [3,1,2]); +#+end_src + +#+begin_src matlab :exports none +%% Loop gain when using SVD +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:6 + plot(frf_iff.f, abs(Lmimo(:,i,i)), '-'); +end +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(squeeze(Lmimo(:,i,j))), 'color', [0,0,0,0.2]); + end +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Loop Gain'); set(gca, 'XTickLabel',[]); +ylim([1e-3, 1e+3]); + +ax2 = nexttile; +hold on; +for i = 1:6 + plot(frf_iff.f, 180/pi*angle(Lmimo(:,i,i)), '-'); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:30:360); +ylim([-180, 0]); + +linkaxes([ax1,ax2],'x'); +xlim([1, 2e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/bode_plot_hac_iff_loop_gain_svd.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_bode_plot_hac_iff_loop_gain_svd +#+caption: Bode plot of Loop Gain when using the SVD +#+RESULTS: +[[file:figs/test_nhexa_bode_plot_hac_iff_loop_gain_svd.png]] + +***** Stability Verification +#+begin_src matlab +%% Compute the Eigenvalues of the loop gain +Ldet = zeros(3, 6, length(frf_iff.f)); + +for i = 1:3 + Lmimo = pagemtimes(permute(frf_iff.G_de{i}, [2,3,1]),squeeze(freqresp(Kd, frf_iff.f, 'Hz'))); + for i_f = 2:length(frf_iff.f) + Ldet(i,:, i_f) = eig(squeeze(Lmimo(:,:,i_f))); + end +end +#+end_src + +#+begin_src matlab :exports none +%% Plot of the eigenvalues of L in the complex plane +figure; +hold on; +for i_mass = 2:3 + plot(real(squeeze(Ldet(i_mass, 1,:))), imag(squeeze(Ldet(i_mass, 1,:))), ... + '.', 'color', colors(i_mass+1, :), ... + 'DisplayName', sprintf('%i masses', i_mass)); + plot(real(squeeze(Ldet(i_mass, 1,:))), -imag(squeeze(Ldet(i_mass, 1,:))), ... + '.', 'color', colors(i_mass+1, :), ... + 'HandleVisibility', 'off'); + for i = 1:6 + plot(real(squeeze(Ldet(i_mass, i,:))), imag(squeeze(Ldet(i_mass, i,:))), ... + '.', 'color', colors(i_mass+1, :), ... + 'HandleVisibility', 'off'); + plot(real(squeeze(Ldet(i_mass, i,:))), -imag(squeeze(Ldet(i_mass, i,:))), ... + '.', 'color', colors(i_mass+1, :), ... + 'HandleVisibility', 'off'); + end +end +plot(-1, 0, 'kx', 'HandleVisibility', 'off'); +hold off; +set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin'); +xlabel('Real'); ylabel('Imag'); +legend('location', 'southeast'); +xlim([-3, 1]); ylim([-2, 2]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/loci_hac_iff_loop_gain_svd.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_loci_hac_iff_loop_gain_svd +#+caption: Locis of $L(j\omega)$ in the complex plane. +#+RESULTS: +[[file:figs/test_nhexa_loci_hac_iff_loop_gain_svd.png]] + +***** Save for further analysis +#+begin_src matlab :exports none :tangle no +save('matlab/data_sim/Khac_iff_struts_svd.mat', 'Kd') +#+end_src + +#+begin_src matlab :eval no +save('data_sim/Khac_iff_struts_svd.mat', 'Kd') +#+end_src + +***** Measured Sensitivity Transfer Function +The sensitivity transfer function is estimated by adding a reference signal $R_x$ consisting of a low pass filtered white noise, and measuring the position error $E_x$ at the same time. + +The transfer function from $R_x$ to $E_x$ is the sensitivity transfer function. + +In order to identify the sensitivity transfer function for all directions, six reference signals are used, one for each direction. + +#+begin_src matlab :exports none +%% Tested directions +labels = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'}; +#+end_src + +#+begin_src matlab :exports none +%% Load Identification Data +meas_hac_svd_3m = {}; + +for i = 1:6 + meas_hac_svd_3m(i) = {load(sprintf('T_S_meas_%s_3m_hac_svd_iff.mat', labels{i}), 't', 'Va', 'Vs', 'de', 'Rx')}; +end +#+end_src + +#+begin_src matlab :exports none +%% Setup useful variables +% Sampling Time [s] +Ts = (meas_hac_svd_3m{1}.t(end) - (meas_hac_svd_3m{1}.t(1)))/(length(meas_hac_svd_3m{1}.t)-1); + +% Sampling Frequency [Hz] +Fs = 1/Ts; + +% Hannning Windows +win = hanning(ceil(5*Fs)); + +% And we get the frequency vector +[~, f] = tfestimate(meas_hac_svd_3m{1}.Va, meas_hac_svd_3m{1}.de, win, Noverlap, Nfft, 1/Ts); +#+end_src + +#+begin_src matlab :exports none +%% Load Jacobian matrix +load('jacobian.mat', 'J'); + +%% Compute position error +for i = 1:6 + meas_hac_svd_3m{i}.Xm = [inv(J)*meas_hac_svd_3m{i}.de']'; + meas_hac_svd_3m{i}.Ex = meas_hac_svd_3m{i}.Rx - meas_hac_svd_3m{i}.Xm; +end +#+end_src + +An example is shown in Figure ref:fig:test_nhexa_ref_track_hac_svd_3m where both the reference signal and the measured position are shown for translations in the $x$ direction. + +#+begin_src matlab :exports none +figure; +hold on; +plot(meas_hac_svd_3m{1}.t, meas_hac_svd_3m{1}.Xm(:,1), 'DisplayName', 'Pos.') +plot(meas_hac_svd_3m{1}.t, meas_hac_svd_3m{1}.Rx(:,1), 'DisplayName', 'Ref.') +hold off; +xlabel('Time [s]'); ylabel('Dx motion [m]'); +xlim([20, 22]); +legend('location', 'northeast'); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/ref_track_hac_svd_3m.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_ref_track_hac_svd_3m +#+caption: Reference position and measured position +#+RESULTS: +[[file:figs/test_nhexa_ref_track_hac_svd_3m.png]] + +#+begin_src matlab :exports none +%% Transfer function estimate of S +S_hac_svd_3m = zeros(length(f), 6, 6); + +for i = 1:6 + S_hac_svd_3m(:,:,i) = tfestimate(meas_hac_svd_3m{i}.Rx, meas_hac_svd_3m{i}.Ex, win, Noverlap, Nfft, 1/Ts); +end +#+end_src + +The sensitivity transfer functions estimated for all directions are shown in Figure ref:fig:test_nhexa_sensitivity_hac_svd_3m. + +#+begin_src matlab :exports none +%% Bode plot for the transfer function from u to dLm +figure; +hold on; +for i =1:6 + plot(f, abs(S_hac_svd_3m(:,i,i)), ... + 'DisplayName', sprintf('$S_{%s}$', labels{i})); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Sensitivity [-]'); +ylim([1e-4, 1e1]); +legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 3); +xlim([0.5, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/sensitivity_hac_svd_3m.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_sensitivity_hac_svd_3m +#+caption: Measured diagonal elements of the sensitivity transfer function matrix. +#+RESULTS: +[[file:figs/test_nhexa_sensitivity_hac_svd_3m.png]] + +#+begin_important +From Figure ref:fig:test_nhexa_sensitivity_hac_svd_3m: +- The sensitivity transfer functions are similar for all directions +- The disturbance attenuation at 1Hz is almost a factor 1000 as wanted +- The sensitivity transfer functions for $R_x$ and $R_y$ have high peak values which indicate poor stability margins. +#+end_important + +***** Sensitivity transfer function from the model +The sensitivity transfer function is now estimated using the model and compared with the one measured. + +#+begin_src matlab :exports none +%% Open Simulink Model +mdl = 'nano_hexapod_simscape'; + +options = linearizeOptions; +options.SampleTime = 0; + +open(mdl) + +Rx = zeros(1, 7); + +colors = colororder; +#+end_src + +#+begin_src matlab :exports none +%% Initialize the Simscape model in closed loop +n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... + 'flex_top_type', '4dof', ... + 'motion_sensor_type', 'plates', ... + 'actuator_type', '2dof', ... + 'controller_type', 'hac-iff-struts'); + +support.type = 1; % On top of vibration table +payload.type = 2; % Payload +#+end_src + +#+begin_src matlab :exports none +%% Load controllers +load('Kiff_opt.mat', 'Kiff'); +Kiff = c2d(Kiff, Ts, 'Tustin'); +load('Khac_iff_struts_svd.mat', 'Kd') +Khac_iff_struts = c2d(Kd, Ts, 'Tustin'); +#+end_src + +#+begin_src matlab :exports none +%% Identify the (damped) transfer function from u to dLm +clear io; io_i = 1; +io(io_i) = linio([mdl, '/Rx'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs +io(io_i) = linio([mdl, '/dL'], 1, 'output'); io_i = io_i + 1; % Plate Displacement (encoder) +#+end_src + +#+begin_src matlab :exports none +%% Identification of the dynamics +Gcl = linearize(mdl, io, 0.0, options); +#+end_src + +#+begin_src matlab :exports none +%% Computation of the sensitivity transfer function +S = eye(6) - inv(n_hexapod.geometry.J)*Gcl; +#+end_src + +The results are shown in Figure ref:fig:test_nhexa_sensitivity_hac_svd_3m_comp_model. +The model is quite effective in estimating the sensitivity transfer functions except around 60Hz were there is a peak for the measurement. + +#+begin_src matlab :exports none +%% Bode plot for the transfer function from u to dLm +freqs = logspace(0,3,1000); + +figure; +hold on; +for i =1:6 + set(gca,'ColorOrderIndex',i); + plot(f, abs(S_hac_svd_3m(:,i,i)), ... + 'DisplayName', sprintf('$S_{%s}$', labels{i})); + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(S(i,i), freqs, 'Hz'))), '--', ... + 'DisplayName', sprintf('$S_{%s}$ - Model', labels{i})); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Sensitivity [-]'); +ylim([1e-4, 1e1]); +legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 3); +xlim([0.5, 1e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/sensitivity_hac_svd_3m_comp_model.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_sensitivity_hac_svd_3m_comp_model +#+caption: Comparison of the measured sensitivity transfer functions with the model +#+RESULTS: +[[file:figs/test_nhexa_sensitivity_hac_svd_3m_comp_model.png]] + +**** Using (diagonal) Dynamical Inverse :noexport: +***** Decoupled Plant +#+begin_src matlab +G_nom = frf_iff.G_de{2}; % Nominal Plant +G_model = sim_iff.G_de{2}; % Model of the Plant +#+end_src + +#+begin_src matlab :exports none +%% Simplified model of the diagonal term +balred_opts = balredOptions('FreqIntervals', 2*pi*[0, 1000], 'StateElimMethod', 'Truncate'); + +G_red = balred(G_model(1,1), 8, balred_opts); +G_red.outputdelay = 0; % necessary for further inversion +#+end_src + +#+begin_src matlab +%% Inverse +G_inv = inv(G_red); +[G_z, G_p, G_g] = zpkdata(G_inv); +p_uns = real(G_p{1}) > 0; +G_p{1}(p_uns) = -G_p{1}(p_uns); +G_inv_stable = zpk(G_z, G_p, G_g); +#+end_src + +#+begin_src matlab :exports none +%% "Uncertainty" of inversed plant +freqs = logspace(0,3,1000); + +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i_mass = i_masses + for i = 1 + plot(freqs, abs(squeeze(freqresp(G_inv_stable*sim_iff.G_de{i_mass+1}(i,i), freqs, 'Hz'))), '-', 'color', colors(i_mass+1, :), ... + 'DisplayName', sprintf('$d\\mathcal{L}_i/u^\\prime_i$ - %i', i_mass)); + end +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); set(gca, 'XTickLabel',[]); +ylim([1e-1, 1e1]); +legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 4); + +ax2 = nexttile; +hold on; +for i_mass = i_masses + for i = 1 + plot(freqs, 180/pi*angle(squeeze(freqresp(G_inv_stable*sim_iff.G_de{i_mass+1}(1,1), freqs, 'Hz'))), '-', 'color', colors(i_mass+1, :)); + end +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:15:360); +ylim([-45, 45]); + +linkaxes([ax1,ax2],'x'); +xlim([freqs(1), freqs(end)]); +#+end_src + +***** Controller Design +#+begin_src matlab :exports none +% Wanted crossover frequency +wc = 2*pi*80; +[~, i_wc] = min(abs(frf_iff.f - wc/2/pi)); + +%% Lead +a = 20.0; % Amount of phase lead / width of the phase lead / high frequency gain +Kd_lead = (1 + s/(wc/sqrt(a)))/(1 + s/(wc*sqrt(a)))/sqrt(a); + +%% Integrator +Kd_int = ((wc)/(2*pi*0.2 + s))^2; + +%% Low Pass Filter (High frequency robustness) +w0_lpf = 2*wc; % Cut-off frequency [rad/s] +xi_lpf = 0.3; % Damping Ratio + +Kd_lpf = 1/(1 + 2*xi_lpf/w0_lpf*s + s^2/w0_lpf^2); + +w0_lpf_b = wc*4; % Cut-off frequency [rad/s] +xi_lpf_b = 0.7; % Damping Ratio + +Kd_lpf_b = 1/(1 + 2*xi_lpf_b/w0_lpf_b*s + s^2/w0_lpf_b^2); + +%% Normalize Gain +Kd_norm = diag(1./abs(diag(squeeze(G_de_svd(i_wc,:,:))))); + +%% Diagonal Control +Kd_diag = ... + G_inv_stable * ... % Normalize gain at 100Hz + Kd_int /abs(evalfr(Kd_int, 1j*wc)) * ... % Integrator + Kd_lead/abs(evalfr(Kd_lead, 1j*wc)) * ... % Lead (gain of 1 at wc) + Kd_lpf /abs(evalfr(Kd_lpf, 1j*wc)); % Low Pass Filter +#+end_src + +#+begin_src matlab :exports none +Kd = ss(Kd_diag)*eye(6); +#+end_src + +***** Loop Gain +#+begin_src matlab :exports none +%% Experimental Loop Gain +Lmimo = permute(pagemtimes(permute(G_nom, [2,3,1]),squeeze(freqresp(Kd, frf_iff.f, 'Hz'))), [3,1,2]); +#+end_src + +#+begin_src matlab :exports none +%% Loop gain when using SVD +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:6 + plot(frf_iff.f, abs(Lmimo(:,i,i)), '-'); +end +for i = 1:5 + for j = i+1:6 + plot(frf_iff.f, abs(squeeze(Lmimo(:,i,j))), 'color', [0,0,0,0.2]); + end +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Loop Gain'); set(gca, 'XTickLabel',[]); +ylim([1e-3, 1e+3]); + +ax2 = nexttile; +hold on; +for i = 1:6 + plot(frf_iff.f, 180/pi*angle(Lmimo(:,i,i)), '-'); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; +yticks(-360:30:360); +ylim([-180, 0]); + +linkaxes([ax1,ax2],'x'); +xlim([1, 2e3]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/bode_plot_hac_iff_loop_gain_diag_inverse.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_bode_plot_hac_iff_loop_gain_diag_inverse +#+caption: Bode plot of Loop Gain when using the Diagonal inversion +#+RESULTS: +[[file:figs/test_nhexa_bode_plot_hac_iff_loop_gain_diag_inverse.png]] + +***** Stability Verification +MIMO Nyquist with eigenvalues +#+begin_src matlab +%% Compute the Eigenvalues of the loop gain +Ldet = zeros(3, 6, length(frf_iff.f)); + +for i = 1:3 + Lmimo = pagemtimes(permute(frf_iff.G_de{i}, [2,3,1]),squeeze(freqresp(Kd, frf_iff.f, 'Hz'))); + for i_f = 2:length(frf_iff.f) + Ldet(i,:, i_f) = eig(squeeze(Lmimo(:,:,i_f))); + end +end +#+end_src + +#+begin_src matlab :exports none +%% Plot of the eigenvalues of L in the complex plane +figure; +hold on; +for i_mass = 2:3 + plot(real(squeeze(Ldet(i_mass, 1,:))), imag(squeeze(Ldet(i_mass, 1,:))), ... + '.', 'color', colors(i_mass+1, :), ... + 'DisplayName', sprintf('%i masses', i_mass)); + plot(real(squeeze(Ldet(i_mass, 1,:))), -imag(squeeze(Ldet(i_mass, 1,:))), ... + '.', 'color', colors(i_mass+1, :), ... + 'HandleVisibility', 'off'); + for i = 1:6 + plot(real(squeeze(Ldet(i_mass, i,:))), imag(squeeze(Ldet(i_mass, i,:))), ... + '.', 'color', colors(i_mass+1, :), ... + 'HandleVisibility', 'off'); + plot(real(squeeze(Ldet(i_mass, i,:))), -imag(squeeze(Ldet(i_mass, i,:))), ... + '.', 'color', colors(i_mass+1, :), ... + 'HandleVisibility', 'off'); + end +end +plot(-1, 0, 'kx', 'HandleVisibility', 'off'); +hold off; +set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin'); +xlabel('Real'); ylabel('Imag'); +legend('location', 'southeast'); +xlim([-3, 1]); ylim([-2, 2]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/loci_hac_iff_loop_gain_diag_inverse.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:test_nhexa_loci_hac_iff_loop_gain_diag_inverse +#+caption: Locis of $L(j\omega)$ in the complex plane. +#+RESULTS: +[[file:figs/test_nhexa_loci_hac_iff_loop_gain_diag_inverse.png]] + +#+begin_important +Even though the loop gain seems to be fine, the closed-loop system is unstable. +This might be due to the fact that there is large interaction in the plant. +We could look at the RGA-number to verify that. +#+end_important + +***** Save for further use +#+begin_src matlab :exports none :tangle no +save('matlab/data_sim/Khac_iff_struts_diag_inverse.mat', 'Kd') +#+end_src + +#+begin_src matlab :eval no +save('data_sim/Khac_iff_struts_diag_inverse.mat', 'Kd') +#+end_src + +**** Closed Loop Stability (Model) :noexport: +Verify stability using Simscape model +#+begin_src matlab +%% Initialize the Simscape model in closed loop +n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '2dof', ... + 'flex_top_type', '3dof', ... + 'motion_sensor_type', 'plates', ... + 'actuator_type', '2dof', ... + 'controller_type', 'hac-iff-struts'); +#+end_src + +#+begin_src matlab +%% IFF Controller +Kiff = -g_opt*Kiff_g1*eye(6); +Khac_iff_struts = Kd*eye(6); +#+end_src + +#+begin_src matlab +%% Identify the (damped) transfer function from u to dLm for different values of the IFF gain +clear io; io_i = 1; +io(io_i) = linio([mdl, '/du'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs +io(io_i) = linio([mdl, '/dL'], 1, 'openoutput'); io_i = io_i + 1; % Plate Displacement (encoder) +#+end_src + +#+begin_src matlab +GG_cl = {}; + +for i = i_masses + payload.type = i; + GG_cl(i+1) = {exp(-s*Ts)*linearize(mdl, io, 0.0, options)}; +end +#+end_src + +#+begin_src matlab +for i = i_masses + isstable(GG_cl{i+1}) +end +#+end_src + +MIMO Nyquist +#+begin_src matlab +Kdm = Kd*eye(6); + +Ldet = zeros(3, length(fb(i_lim))); + +for i = 1:3 + Lmimo = pagemtimes(permute(G_damp_m{i}(i_lim,:,:), [2,3,1]),squeeze(freqresp(Kdm, fb(i_lim), 'Hz'))); + Ldet(i,:) = arrayfun(@(t) det(eye(6) + squeeze(Lmimo(:,:,t))), 1:size(Lmimo,3)); +end +#+end_src + +#+begin_src matlab :exports none +%% Bode plot for the transfer function from u to dLm +figure; +hold on; +for i_mass = 3 + for i = 1 + plot(real(Ldet(i_mass,:)), imag(Ldet(i_mass,:)), ... + '-', 'color', colors(i_mass+1, :)); + end +end +hold off; +set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin'); +xlabel('Real'); ylabel('Imag'); +xlim([-10, 1]); ylim([-4, 4]); +#+end_src + +MIMO Nyquist with eigenvalues +#+begin_src matlab +Kdm = Kd*eye(6); + +Ldet = zeros(3, 6, length(fb(i_lim))); + +for i = 1:3 + Lmimo = pagemtimes(permute(G_damp_m{i}(i_lim,:,:), [2,3,1]),squeeze(freqresp(Kdm, fb(i_lim), 'Hz'))); + for i_f = 1:length(fb(i_lim)) + Ldet(i,:, i_f) = eig(squeeze(Lmimo(:,:,i_f))); + end +end +#+end_src + +#+begin_src matlab :exports none +%% Bode plot for the transfer function from u to dLm +figure; +hold on; +for i_mass = 1 + for i = 1:6 + plot(real(squeeze(Ldet(i_mass, i,:))), imag(squeeze(Ldet(i_mass, i,:))), ... + '-', 'color', colors(i_mass+1, :)); + end +end +hold off; +set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin'); +xlabel('Real'); ylabel('Imag'); +xlim([-10, 1]); ylim([-4, 2]); +#+end_src +** Other Backups +*** Nano-Hexapod Compliance - Effect of IFF +<> + +In this section, we wish to estimate the effectiveness of the IFF strategy regarding the compliance. + +The top plate is excited vertically using the instrumented hammer two times: +1. no control loop is used +2. decentralized IFF is used + +The data are loaded. +#+begin_src matlab +frf_ol = load('Measurement_Z_axis.mat'); % Open-Loop +frf_iff = load('Measurement_Z_axis_damped.mat'); % IFF +#+end_src + +The mean vertical motion of the top platform is computed by averaging all 5 vertical accelerometers. +#+begin_src matlab +%% Multiply by 10 (gain in m/s^2/V) and divide by 5 (number of accelerometers) +d_frf_ol = 10/5*(frf_ol.FFT1_H1_4_1_RMS_Y_Mod + frf_ol.FFT1_H1_7_1_RMS_Y_Mod + frf_ol.FFT1_H1_10_1_RMS_Y_Mod + frf_ol.FFT1_H1_13_1_RMS_Y_Mod + frf_ol.FFT1_H1_16_1_RMS_Y_Mod)./(2*pi*frf_ol.FFT1_H1_16_1_RMS_X_Val).^2; +d_frf_iff = 10/5*(frf_iff.FFT1_H1_4_1_RMS_Y_Mod + frf_iff.FFT1_H1_7_1_RMS_Y_Mod + frf_iff.FFT1_H1_10_1_RMS_Y_Mod + frf_iff.FFT1_H1_13_1_RMS_Y_Mod + frf_iff.FFT1_H1_16_1_RMS_Y_Mod)./(2*pi*frf_iff.FFT1_H1_16_1_RMS_X_Val).^2; +#+end_src + +The vertical compliance (magnitude of the transfer function from a vertical force applied on the top plate to the vertical motion of the top plate) is shown in Figure ref:fig:test_nhexa_compliance_vertical_comp_iff. +#+begin_src matlab :exports none +%% Comparison of the vertical compliances (OL and IFF) +figure; +hold on; +plot(frf_ol.FFT1_H1_16_1_RMS_X_Val, d_frf_ol, 'DisplayName', 'OL'); +plot(frf_iff.FFT1_H1_16_1_RMS_X_Val, d_frf_iff, 'DisplayName', 'IFF'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Vertical Compliance [$m/N$]'); +xlim([20, 2e3]); ylim([2e-9, 2e-5]); +legend('location', 'northeast'); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/compliance_vertical_comp_iff.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_compliance_vertical_comp_iff +#+caption: Measured vertical compliance with and without IFF +#+RESULTS: +[[file:figs/test_nhexa_compliance_vertical_comp_iff.png]] + +#+begin_important +From Figure ref:fig:test_nhexa_compliance_vertical_comp_iff, it is clear that the IFF control strategy is very effective in damping the suspensions modes of the nano-hexapod. +It also has the effect of (slightly) degrading the vertical compliance at low frequency. + +It also seems some damping can be added to the modes at around 205Hz which are flexible modes of the struts. +#+end_important + +*** Comparison with the Simscape Model +<> + +Let's initialize the Simscape model such that it corresponds to the experiment. +#+begin_src matlab +%% Nano-Hexapod is fixed on a rigid granite +support.type = 0; + +%% No Payload on top of the Nano-Hexapod +payload.type = 0; + +%% Initialize Nano-Hexapod in Open Loop +n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... + 'flex_top_type', '4dof', ... + 'motion_sensor_type', 'struts', ... + 'actuator_type', '2dof'); + +#+end_src + +And let's compare the measured vertical compliance with the vertical compliance as estimated from the Simscape model. + +The transfer function from a vertical external force to the absolute motion of the top platform is identified (with and without IFF) using the Simscape model. +#+begin_src matlab :exports none +%% Identify the IFF Plant (transfer function from u to taum) +clear io; io_i = 1; +io(io_i) = linio([mdl, '/Fz_ext'], 1, 'openinput'); io_i = io_i + 1; % External - Vertical force +io(io_i) = linio([mdl, '/Z_top_plat'], 1, 'openoutput'); io_i = io_i + 1; % Absolute vertical motion of top platform +#+end_src + +#+begin_src matlab :exports none +%% Perform the identifications +G_compl_z_ol = linearize(mdl, io, 0.0, options); +#+end_src + +#+begin_src matlab :exports none +%% Initialize Nano-Hexapod with IFF +Kiff = 400*(1/(s + 2*pi*40))*... % Low pass filter (provides integral action above 40Hz) + (s/(s + 2*pi*30))*... % High pass filter to limit low frequency gain + (1/(1 + s/2/pi/500))*... % Low pass filter to be more robust to high frequency resonances + eye(6); % Diagonal 6x6 controller + +%% Initialize the Nano-Hexapod with IFF +n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... + 'flex_top_type', '4dof', ... + 'motion_sensor_type', 'struts', ... + 'actuator_type', '2dof', ... + 'controller_type', 'iff'); + +%% Perform the identification +G_compl_z_iff = linearize(mdl, io, 0.0, options); +#+end_src + +The comparison is done in Figure ref:fig:test_nhexa_compliance_vertical_comp_model_iff. +Again, the model is quite accurate in predicting the (closed-loop) behavior of the system. + +#+begin_src matlab :exports none +%% Comparison of the measured compliance and the one obtained from the model +freqs = 2*logspace(1,3,1000); + +figure; +hold on; +plot(frf_ol.FFT1_H1_16_1_RMS_X_Val, d_frf_ol, '-', 'DisplayName', 'OL - Meas.'); +plot(frf_iff.FFT1_H1_16_1_RMS_X_Val, d_frf_iff, '-', 'DisplayName', 'IFF - Meas.'); +set(gca,'ColorOrderIndex',1) +plot(freqs, abs(squeeze(freqresp(G_compl_z_ol, freqs, 'Hz'))), '--', 'DisplayName', 'OL - Model') +plot(freqs, abs(squeeze(freqresp(G_compl_z_iff, freqs, 'Hz'))), '--', 'DisplayName', 'IFF - Model') +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Vertical Compliance [$m/N$]'); +xlim([20, 2e3]); ylim([2e-9, 2e-5]); +legend('location', 'northeast', 'FontSize', 8); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/compliance_vertical_comp_model_iff.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_compliance_vertical_comp_model_iff +#+caption: Measured vertical compliance with and without IFF +#+RESULTS: +[[file:figs/test_nhexa_compliance_vertical_comp_model_iff.png]] + +*** Computation of the transmissibility from accelerometer data +**** Introduction :ignore: + +The goal is to compute the $6 \times 6$ transfer function matrix corresponding to the transmissibility of the Nano-Hexapod. + +To do so, several accelerometers are located both on the vibration table and on the top of the nano-hexapod. + +The vibration table is then excited using a Shaker and all the accelerometers signals are recorded. + +Using transformation (jacobian) matrices, it is then possible to compute both the motion of the top and bottom platform of the nano-hexapod. + +Finally, it is possible to compute the $6 \times 6$ transmissibility matrix. + +Such procedure is explained in cite:marneffe04_stewar_platf_activ_vibrat_isolat. + +**** Jacobian matrices + +How to compute the Jacobian matrices is explained in Section ref:sec:meas_transformation. + +#+begin_src matlab +%% Bottom Accelerometers +Opb = [-0.1875, -0.1875, -0.245; + -0.1875, -0.1875, -0.245; + 0.1875, -0.1875, -0.245; + 0.1875, -0.1875, -0.245; + 0.1875, 0.1875, -0.245; + 0.1875, 0.1875, -0.245]'; + +Osb = [0, 1, 0; + 0, 0, 1; + 1, 0, 0; + 0, 0, 1; + 1, 0, 0; + 0, 0, 1;]'; + +Jb = zeros(length(Opb), 6); + +for i = 1:length(Opb) + Ri = [0, Opb(3,i), -Opb(2,i); + -Opb(3,i), 0, Opb(1,i); + Opb(2,i), -Opb(1,i), 0]; + Jb(i, 1:3) = Osb(:,i)'; + Jb(i, 4:6) = Osb(:,i)'*Ri; +end + +Jbinv = inv(Jb); +#+end_src + +#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) +data2orgtable(Jbinv, {'$\dot{x}_x$', '$\dot{x}_y$', '$\dot{x}_z$', '$\dot{\omega}_x$', '$\dot{\omega}_y$', '$\dot{\omega}_z$'}, {'$a_1$', '$a_2$', '$a_3$', '$a_4$', '$a_5$', '$a_6$'}, ' %.1f '); +#+end_src + +#+RESULTS: +| | $a_1$ | $a_2$ | $a_3$ | $a_4$ | $a_5$ | $a_6$ | +|------------------+-------+-------+-------+-------+-------+-------| +| $\dot{x}_x$ | 0.0 | 0.7 | 0.5 | -0.7 | 0.5 | 0.0 | +| $\dot{x}_y$ | 1.0 | 0.0 | 0.5 | 0.7 | -0.5 | -0.7 | +| $\dot{x}_z$ | 0.0 | 0.5 | 0.0 | 0.0 | 0.0 | 0.5 | +| $\dot{\omega}_x$ | 0.0 | 0.0 | 0.0 | -2.7 | 0.0 | 2.7 | +| $\dot{\omega}_y$ | 0.0 | 2.7 | 0.0 | -2.7 | 0.0 | 0.0 | +| $\dot{\omega}_z$ | 0.0 | 0.0 | 2.7 | 0.0 | -2.7 | 0.0 | + +#+begin_src matlab +%% Top Accelerometers +Opt = [-0.1, 0, -0.150; + -0.1, 0, -0.150; + 0.05, 0.075, -0.150; + 0.05, 0.075, -0.150; + 0.05, -0.075, -0.150; + 0.05, -0.075, -0.150]'; + +Ost = [0, 1, 0; + 0, 0, 1; + 1, 0, 0; + 0, 0, 1; + 1, 0, 0; + 0, 0, 1;]'; + +Jt = zeros(length(Opt), 6); + +for i = 1:length(Opt) + Ri = [0, Opt(3,i), -Opt(2,i); + -Opt(3,i), 0, Opt(1,i); + Opt(2,i), -Opt(1,i), 0]; + Jt(i, 1:3) = Ost(:,i)'; + Jt(i, 4:6) = Ost(:,i)'*Ri; +end + +Jtinv = inv(Jt); +#+end_src + +#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) +data2orgtable(Jtinv, {'$\dot{x}_x$', '$\dot{x}_y$', '$\dot{x}_z$', '$\dot{\omega}_x$', '$\dot{\omega}_y$', '$\dot{\omega}_z$'}, {'$b_1$', '$b_2$', '$b_3$', '$b_4$', '$b_5$', '$b_6$'}, ' %.1f '); +#+end_src + +#+RESULTS: +| | $b_1$ | $b_2$ | $b_3$ | $b_4$ | $b_5$ | $b_6$ | +|------------------+-------+-------+-------+-------+-------+-------| +| $\dot{x}_x$ | 0.0 | 1.0 | 0.5 | -0.5 | 0.5 | -0.5 | +| $\dot{x}_y$ | 1.0 | 0.0 | -0.7 | -1.0 | 0.7 | 1.0 | +| $\dot{x}_z$ | 0.0 | 0.3 | 0.0 | 0.3 | 0.0 | 0.3 | +| $\dot{\omega}_x$ | 0.0 | 0.0 | 0.0 | 6.7 | 0.0 | -6.7 | +| $\dot{\omega}_y$ | 0.0 | 6.7 | 0.0 | -3.3 | 0.0 | -3.3 | +| $\dot{\omega}_z$ | 0.0 | 0.0 | -6.7 | 0.0 | 6.7 | 0.0 | + +**** Using =linearize= function + +#+begin_src matlab +acc_3d.type = 2; % 1: inertial mass, 2: perfect + +%% Name of the Simulink File +mdl = 'vibration_table'; + +%% Input/Output definition +clear io; io_i = 1; +io(io_i) = linio([mdl, '/F_shaker'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/acc'], 1, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/acc_top'], 1, 'openoutput'); io_i = io_i + 1; + +%% Run the linearization +G = linearize(mdl, io); +G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; +G.OutputName = {'a1', 'a2', 'a3', 'a4', 'a5', 'a6', ... + 'b1', 'b2', 'b3', 'b4', 'b5', 'b6'}; +#+end_src + +#+begin_src matlab +Gb = Jbinv*G({'a1', 'a2', 'a3', 'a4', 'a5', 'a6'}, :); +Gt = Jtinv*G({'b1', 'b2', 'b3', 'b4', 'b5', 'b6'}, :); +#+end_src + +#+begin_src matlab +T = inv(Gb)*Gt; +T = minreal(T); +T = prescale(T, {2*pi*0.1, 2*pi*1e3}); +#+end_src + +#+begin_src matlab :exports none +freqs = logspace(0, 3, 1000); + +figure; +hold on; +for i = 1:6 + plot(freqs, abs(squeeze(freqresp(T(i, i), freqs, 'Hz')))); +end +for i = 1:5 + for j = i+1:6 + plot(freqs, abs(squeeze(freqresp(T(i, j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2]); + end +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Transmissibility'); +ylim([1e-4, 1e2]); +xlim([freqs(1), freqs(end)]); +#+end_src + +*** Comparison with "true" transmissibility + +#+begin_src matlab +%% Name of the Simulink File +mdl = 'test_transmissibility'; + +%% Input/Output definition +clear io; io_i = 1; +io(io_i) = linio([mdl, '/d'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/acc'], 1, 'openoutput'); io_i = io_i + 1; + +%% Run the linearization +G = linearize(mdl, io); +G.InputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'}; +G.OutputName = {'Ax', 'Ay', 'Az', 'Bx', 'By', 'Bz'}; +#+end_src + +#+begin_src matlab +Tp = G/s^2; +#+end_src + +#+begin_src matlab :exports none +freqs = logspace(0, 3, 1000); + +figure; +hold on; +for i = 1:6 + plot(freqs, abs(squeeze(freqresp(Tp(i, i), freqs, 'Hz')))); +end +for i = 1:5 + for j = i+1:6 + plot(freqs, abs(squeeze(freqresp(Tp(i, j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2]); + end +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Transmissibility'); +ylim([1e-4, 1e2]); +xlim([freqs(1), freqs(end)]); +#+end_src + +*** Rigidification of the added payloads +- [ ] figure + +#+begin_src matlab +%% Load Identification Data +meas_added_mass = {}; + +for i_strut = 1:6 + meas_added_mass(i_strut) = {load(sprintf('frf_data_exc_strut_%i_spindle_1m_solid.mat', i_strut), 't', 'Va', 'Vs', 'de')}; +end +#+end_src + +Finally the $6 \times 6$ transfer function matrices from $\bm{u}$ to $d\bm{\mathcal{L}}_m$ and from $\bm{u}$ to $\bm{\tau}_m$ are identified: +#+begin_src matlab +%% DVF Plant (transfer function from u to dLm) + +G_de = zeros(length(f), 6, 6); +for i_strut = 1:6 + G_de(:,:,i_strut) = tfestimate(meas_added_mass{i_strut}.Va, meas_added_mass{i_strut}.de, win, Noverlap, Nfft, 1/Ts); +end + +%% IFF Plant (transfer function from u to taum) +G_Vs = zeros(length(f), 6, 6); +for i_strut = 1:6 + G_Vs(:,:,i_strut) = tfestimate(meas_added_mass{i_strut}.Va, meas_added_mass{i_strut}.Vs, win, Noverlap, Nfft, 1/Ts); +end +#+end_src + +#+begin_src matlab :exports none +%% Bode plot for the transfer function from u to dLm - Several payloads +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +% Diagonal terms +for i = 1:6 + plot(frf_ol.f, abs(frf_ol.G_de{1}(:,i, i)), 'color', colors(1,:)); + plot(f, abs(G_de(:,i, i)), 'color', colors(2,:)); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Amplitude [m/V]'); +ylim([1e-8, 1e-3]); +xlim([20, 2e3]); +#+end_src + +#+begin_src matlab :exports none +%% Bode plot for the transfer function from u to dLm +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:6 + plot(frf_ol.f, abs(frf_ol.G_de(:,i, i)), 'color', colors(1,:)); + plot(f, abs(G_de(:,i, i)), 'color', colors(2,:)); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Amplitude [m/V]'); +ylim([1e-8, 1e-3]); +xlim([10, 1e3]); +#+end_src + + +*** Table with signals + +#+name: tab:list_signals +#+caption: List of signals +#+attr_latex: :environment tabularx :width \linewidth :align Xllll +#+attr_latex: :center t :booktabs t +| | *Unit* | *Matlab* | *Vector* | *Elements* | +|------------------------------------+-----------+-----------+-----------------------+----------------------| +| Control Input (wanted DAC voltage) | =[V]= | =u= | $\bm{u}$ | $u_i$ | +| DAC Output Voltage | =[V]= | =u= | $\tilde{\bm{u}}$ | $\tilde{u}_i$ | +| PD200 Output Voltage | =[V]= | =ua= | $\bm{u}_a$ | $u_{a,i}$ | +| Actuator applied force | =[N]= | =tau= | $\bm{\tau}$ | $\tau_i$ | +|------------------------------------+-----------+-----------+-----------------------+----------------------| +| Strut motion | =[m]= | =dL= | $d\bm{\mathcal{L}}$ | $d\mathcal{L}_i$ | +| Encoder measured displacement | =[m]= | =dLm= | $d\bm{\mathcal{L}}_m$ | $d\mathcal{L}_{m,i}$ | +|------------------------------------+-----------+-----------+-----------------------+----------------------| +| Force Sensor strain | =[m]= | =epsilon= | $\bm{\epsilon}$ | $\epsilon_i$ | +| Force Sensor Generated Voltage | =[V]= | =taum= | $\tilde{\bm{\tau}}_m$ | $\tilde{\tau}_{m,i}$ | +| Measured Generated Voltage | =[V]= | =taum= | $\bm{\tau}_m$ | $\tau_{m,i}$ | +|------------------------------------+-----------+-----------+-----------------------+----------------------| +| Motion of the top platform | =[m,rad]= | =dX= | $d\bm{\mathcal{X}}$ | $d\mathcal{X}_i$ | +| Metrology measured displacement | =[m,rad]= | =dXm= | $d\bm{\mathcal{X}}_m$ | $d\mathcal{X}_{m,i}$ | + +*** RGA + + +The RGA-number, which is a measure of the interaction in the system, is computed for the transfer function matrix from $\mathbf{u}$ to $d\mathbf{\mathcal{L}}_m$ for all the payloads. +The obtained numbers are compared in Figure ref:fig:test_nhexa_rga_num_ol_masses. + +#+begin_src matlab :exports none +%% Decentralized RGA - Undamped Plant +RGA_num = zeros(length(frf_ol.f), 4); +for i_mass = [0:3] + for i = 1:length(frf_ol.f) + RGA_num(i, i_mass+1) = sum(sum(abs(eye(6) - squeeze(frf_ol.G_de{i_mass+1}(i,:,:)).*inv(squeeze(frf_ol.G_de{i_mass+1}(i,:,:))).'))); + end +end +#+end_src + +#+begin_src matlab :exports none +%% RGA for Decentralized plant +figure; +hold on; +for i_mass = [0:3] + plot(frf_ol.f, RGA_num(:,i_mass+1), '-', 'color', colors(i_mass+1,:), ... + 'DisplayName', sprintf('RGA-num - %i mass', i_mass)); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('RGA Number'); +xlim([10, 1e3]); ylim([1e-2, 1e2]); +legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); +#+end_src + +#+begin_src matlab :exports none +%% Decentralized RGA - Undamped Plant +RGA = zeros(length(frf_ol.f), 6, 6); +for i = 1:length(frf_ol.f) +RGA(i, :, :) = squeeze(frf_ol.G_Vs{1}(i,:,:)).*inv(squeeze(frf_ol.G_Vs{1}(i,:,:))).'; +end +#+end_src + +#+begin_src matlab :exports none +%% RGA +figure; +hold on; +for i = 1:6 + plot(frf_ol.f, abs(RGA(:,i,i)), 'k-') +end +for i = 1:5 + for j = i+1:6 + plot(frf_ol.f, abs(RGA(:,i,j)), 'r-') + end +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('RGA Number'); +xlim([10, 1e3]); ylim([1e-2, 1e2]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/rga_num_ol_masses.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + +#+name: fig:test_nhexa_rga_num_ol_masses +#+caption: RGA-number for the open-loop transfer function from $\mathbf{u}$ to $d\mathbf{\mathcal{L}}_m$ +#+RESULTS: +[[file:figs/test_nhexa_rga_num_ol_masses.png]] + +#+begin_important +From Figure ref:fig:test_nhexa_rga_num_ol_masses, it is clear that the coupling is quite large starting from the first suspension mode of the nano-hexapod. +Therefore, is the payload's mass is increase, the coupling in the system start to become unacceptably large at lower frequencies. +#+end_important diff --git a/figs/test_nhexa_nano_hexapod_signals.pdf b/figs/test_nhexa_nano_hexapod_signals.pdf index cc42f73ba410f29665279ea722c56ce0301a25a3..9d7056e951c02e9ad1d2c48648699b6218dc5962 100644 GIT binary patch delta 27073 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 WuyjUAa1sPAHhu(ZYH1Z2g#QEZqX1w4 delta 27042 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 y9rMWHtQKSR!}vIHhgo}v1u$t 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 + + + @@ -132,15 +135,12 @@ - - - - + - + @@ -336,13 +336,13 @@ - + - + @@ -350,13 +350,13 @@ - + - + @@ -407,7 +407,7 @@ - + @@ -416,7 +416,7 @@ - + @@ -430,7 +430,7 @@ - + @@ -439,7 +439,7 @@ - + diff --git a/test-bench-nano-hexapod.org b/test-bench-nano-hexapod.org index d9effe6..6425a15 100644 --- a/test-bench-nano-hexapod.org +++ b/test-bench-nano-hexapod.org @@ -553,7 +553,7 @@ The effect of the payload mass on the dynamics is discussed in Section ref:ssec: \draw[->] ($(F_DAC.west)+(-0.8,0)$) node[above right]{$\mathbf{u}$} node[below right]{$[V]$} -- node[sloped]{$/$} (F_DAC.west); \draw[->] (F_DAC.east) -- node[midway, above]{$\tilde{\mathbf{u}}$}node[midway, below]{$[V]$} (PD200.west); \draw[->] (PD200.east) -- node[midway, above]{$\mathbf{V}_a$}node[midway, below]{$[V]$} (F_stack.west); - \draw[->] (F_stack.east) -- (inputF) node[above left]{$\mathbf{\tau}$}node[below left]{$[N]$}; + \draw[->] (F_stack.east) -- (inputF) node[above left]{$\mathbf{f}$}node[below left]{$[N]$}; \draw[->] (outputF) -- (Fm_stack.west) node[above left]{$\mathbf{\epsilon}$} node[below left]{$[m]$}; \draw[->] (Fm_stack.east) -- node[midway, above]{$\tilde{\mathbf{V}}_s$}node[midway, below]{$[V]$} (Fm_ADC.west); @@ -1011,7 +1011,7 @@ xlim([10, 2e3]); exportFig('figs/test_nhexa_identified_frf_Vs_masses.pdf', 'width', 'half', 'height', 600); #+end_src -#+name: fig:test_struts_mounting +#+name: fig:test_nhexa_identified_frf_masses #+caption: Measured Frequency Response Functions from $u_i$ to $d_{ei}$ (\subref{fig:test_nhexa_identified_frf_de_masses}) and from $u_i$ to $V_{si}$ (\subref{fig:test_nhexa_identified_frf_Vs_masses}) for all 4 payload conditions. Only diagonal terms are shown. #+attr_latex: :options [htbp] #+begin_figure diff --git a/test-bench-nano-hexapod.pdf b/test-bench-nano-hexapod.pdf index 52e33e5c58acfc5a633f36e7c3d4503ca907704d..6c40ce6a6b242d22626dfca996283bb4243b2769 100644 GIT binary patch delta 49953 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 delta 49850 zcmYJ)V{oOh8UWzh_SUv-Z|$wNwr!upI8TTN z=T}yK`Pe}xu4(UdrCjYia}tUTH7+{(U{)otlm#`Ll;R)o;BiNvgW2UQI-oR!Fga`( zr&c|z=7u%Hj8)@zRbQwo;f!Rn>H|t^WQPiHyV?T^*~bE%C;3YU;Wb~yHiF#@pxH4k zlHRyK%Lv6{8%UHdTg(E@ez7oB?0xpk(~kdjOmf4(a$+&dWI0+bf^VV=lgTR2mg1~{mgZ#H2A_x))G6)I?DhL_~ItT^`CI}V? zHV6&~E(jjTHxPUf0uVwFA`oH_5)e`lG7xeQ3J^*VDiCTA8W36#IuLpg1`tLNCJ<&2 z77$htHV}3Y4iHWdE)Z@I9uQs-J`jEo0T4kDArRpzf!&{l5@XSnJPW-t=k9hD+xDodJ&pjTb>Klnnh8~swJCev~*_%5n_nE zy!0dn5dtiUDu^iMx3#)nnkEWVsR~6I7$3v*eg+XNs;>3JQYxOS_QT_jAk`?E>It2Eb@M&57n3${pbYvb>68UVlj@*xYW}&iHm*1_M8yjq&p$h z61)0mG~kDh(fJ)?r7ZSBm6NE!iQ21W>;>2SB1B6nae%%JryK8$P3CK{zY2l**&1t2cv32G5|0XCupi^t^^5g6Ts>I^dvpK$=ZCBKooRIfL79Aw zF-AHp*6H!zW+Q~+(29o?+4A5xm;!QJmNUH!a;`)Hf>c2|ZUbTKPCAM*DB=aK1-g-D9;$5&hw6UbVnv!ENxVsATw6=w0{X z0Gf;}3P_UR6F;$T!WU@Qy#7Am&Cfh`Q}ji5p}U^H?AlxiA6D&Zs*@oQB89(V1~bQE z{NCtQQ|ehKH0SUY`q(raJN@(lR@9&{O`|SR%&&2MUo%*lW#NdXV_uqBK~Lp|X;%x1 zNUgmNKqxng-#@deihBE5f?W%f*=x-kT{Q}))N?6Z+nNE{jvwDnTd9<(O?loqxm=r` zWnY4FT}&KRGV2m@EGhp2IB(;$@;$NTMU}VWBAI~xK{`RA#SwG?*0>BP_YtyZ3Kxje zjj2`yC8)AhabM%*hMF{qg_)iwmpTnr)NQ-R!f7{M#kxzIE-pj2s~@h!RfpQc;nGtD zo3^pYuTcRA5+X28=)Z@o(=%pVezG1@L63go#We>$Dh2CJPe{ZYIywL*M@ zz#_8enyCI+gq=Jox>`#qo%H7xo{L=xmXh!lu4hzy7Yig4h(DGO+HfJ+@~N8K^(&sjsZT?~rH-~NcPV2$P@FpYRg zS)CfO!PI$7D;RW%>L$;t&)J#M(O6W`t?+H4n34$`o>yCZu5IgtH7ex%``Pmok*PPP zVXZInq$81il(7rqmWa$@ow&rDL?MwnxVeYo%9boHix4w9-~3!e$;_}wC2eJ<0OeMB zVXA1RsS@CyaTFu@i8+BPNJd#;c3u*2w;@PG4PGOXt}`=iftS8ExZ?l!tO8n1;=l~XfIix z)l^T;i)u7)a6|WmR89s##Dsw%74al-+>Fd`F0EVeV>UHiQk{^#Uv1bPj9n+bKR%ZN z3XidUivzqffwc$z@B4v;dq5)-`EP)!MCY8eE_(5Ec07KrKEs04d*hP{kGm^1et~$eUKl+Kegy{qATN7_?_gSUgyXd=ytV zJ7@UV`|dzc$5BxrZGZF~j|=~P>08cTm2PH=HHPWNKPfS9f!oflmu_aQahjC-iHDa) z5v#BoeS?R8_a6K>rJ8xYc>sXm^_*@2VgXG8_1_M!2bpmSNkB-n zUP=|P)t@}ghWFKJ-G$q6lh}eUx9#t1>|{ws?nga@y+w$?ee*I1&|fL?|fn` z<+MI04Skv6RY5piS;@TujRMQ*tkD`TWZ?zI;oQZBl~lZWVULd%pC9M$ePTkg|H)9q zmm_nUO?`71R(;h#^aSfSSXs2(Kvc#6vLHdl_ur$wt^kHaZ{VZ%W`@)?dN?9-GIcNu zd44ELr}KCcS&3AM8$&ctQJdC}!TKszJc{*Ns7j`wXt#AJcX`2@+m(E&8y@udo?p1R zyV|6WQe1S~6l*Y&^f)AW6zqZ9vvz(qcv#a+Y;W(GLX^6cHD*`l;TZL!6yJFiVm33e z+0oM2%>d8g@`ub>L;O$-rI+1RKN&WF4lCkkE8dyq?YKJX^?Zw({t7M<(C_5GugBdI z)A^m|Sn4fKQ`5K{itZZ22O2k|l{o3QrlYpf{SB0+ee(EJC@!6$@H zywi@EGZNe3Yx`Q?-M8!dW-xQ(VN>?4K5%@9d%Ty#c^9&6ST?8DPyE=A1AffDYpt0~ zt$PDJ!jWq~;D4*XGH|;zCNxE-sgzFM1*4Ez<_QMJY{Lnlj;z;4vgNvX5bSz;KkeUD z69N9_lL5DtXa*VhfTqFs5Z%0zuTZ(Taem>@QeQH7a=j<@R#uBTLzS366>P3$OLt$ZyP~XcaE)goj1L z*M;9+A8@v{p}vSxv{ZX_e*~rc;7hp=Ljd$bH7Yl5%=Rb2glmO((D(Kd_VQU93J<5r za8V12ZYghm`32)7;w~?k`HfRPJnpxx4e{mPlg(AV#4Q@qJz~EEWFuXh@?}1;uxyeg zs{#GOk?s!;Pp6LI;BValg4Ag#O$!Qp!01z!gH;dyp?L^t!UzdO53r{K>p_U>7eE}| z2x`%;t^-q!Uh{h> zf5P_a)oJ|N0q-90+26`Mw%gwV2zh%fG=FLJuPZuTq0EFK&%7c#-C}a$u1=q6^@k}s z-J&>oL+W+H*E;yYU#V-`5-=deJHqp+Uw&x${&C!T;U~164u}sv_1+sQSXTi;s4cwR$!$wxu{g`rd>#Cn^hnSevH}`5GXpJv>Tw zsa>8dS0W(H@U6bIG#-_@g%v%WlppI5Rg^d1>A7m5{C1WaX&WCRU+E|^KOx^XvqT)-Zmg6)ZOU|;qFV^a0fE`2 zF3HDV>>K5+p{MO5*|sGCrs&p)ek99s>z*aG@e*eBBfQXdTH)l)^~3-Mvs2Xy{XTJI zdXLA-vD)3_^h*>P!t$~7y1!d;1kS&|pV)bw0y7*vc2U0H7M)M`XY$7W7O?Fkd|`sA z-@yrkl9Q9fFiJjXC*qlgC>g3wLZCvqW_wHNXzF?F}BOt`Y9!WKqb!Avu$Cs@uO(M+@@5D za7*3v+J>%dcH;IkKU{oYqOq7;{-g{e;(OD2hZ4oSjbdw5XKkAPr-ALrFUfOciOEc) zj#->2DQrbtfV||H$;E|L46f0SjoV*ZQ1OKFD2S1;^>-c^;RSerJpCx$z^8`8t8wd4 z$#nYDxGHJ0=D=C(AZwH+$-t@uK6CKfWeH@+DEtVollktAF=!U76HF`^2{U0)V{yMW zI594^P5ZVikG%A%G~W7|23BU0a7HI579(_o@u{|hi~<^uLtmI+a~*R$NO;6^lvs?c zVsI$pjA;-5jL!i8>kYc_xHe?^-x#XxoaaKE^B~mc6Vn7yPQgTJjF|D!7yN>}*Ku<% z-;(PA=lhM{EHwhVfYa{#mS_ArvBR5{6)|_en2pKqc8b+?PTuE$sHz?NXPfiqhOD}J zAMevM6-3_-H)Q9(^vo}FJ<(OJN4CzN%iDFE*XDLMHjd+ zAo&pZ0|jn^c%^&v3BD|%;f$ZL8b*DUqqUEYeh>pcgNFvQ>^dX(Os|t(=D6$GU+OUt zLaL+U-qMu;G*!4SwvKWPQ83uW$>rCR{KT-Q-RXiU+;ty+{~5e`I^I(6v~TqF#s~(6 z&*?Zn+{YX(=k1ql5B<$UF(4Fqe?8O<$|O{R(Za?1`)&=qv*XOj9O|m0OIbmnDLEoK z^!FsPIZ_iB7TN>s>U}H#|LvJnE>Av&`Uyh?FMJH?4p~<55OaIV9oS0?5I>E%Mjt%b zGpBh!!lMyG4%&)l_^&~S{5WGq(tZ}f9!gO{#x2@r&FErV(`9A+3!5g0h9DsGYblQr z(0Gvm9h1#&7<>fW1OtK#Ju{z1>`3Z?=z|!57=jpq7=xIAn1Yyrn1fh=Sb|uAScBMr z*n-%B*n>ELID$BVID@!=xPrKWxPy3rc!GF=c!T(W_=5O>_=5z106+pkflkyNDo4<#D-#J<>X5j zYb~P%G()QsY+x`WVbNU~kYYXWU0o>!;mDGSCQ?FqGNF8r7Dzp~x>7?Zu}V4^(VI&o-?X-Zlu;-m6b$w|t{5>m0H#BD4NJ5ZRZtNREC2WyZtn>81|jMe zAqG4MOqf*VK|~Ty94Q~nB|;mLvjg0Qm39p}MwS@nSzOfaQjaA5b3lm)gdtjkq5~b zz%Vije-qfg0shd>Y!oW6hJVv#9EdXx|6yslrL6!4DG)i82g)sRRj_d2FoJl5WSU0h zQxc&BfAC|$1PM{*wU)uGh6d(ECh!3myx@QtnEt7mchAngLI6#$C=d?j=g)!cJ<@Vq zC>zB3Al_i`4LSU++T7Y~Ftk5!Jm`mj6A0f(*p3j=`22L#P!W1q@KiH*@calEpv~L} z0(ekYr&E_GA)syiUSMV@6}w>Nj+KUn_0KZ&xu-t@8r0gE@r8jPV5b@q>lpm;6>&{8 ze}%j6cfCi*J)St(tb>t8SRXAabv3}Q)krIl6b%jw2OBIf2i!=RK_GYc6uBF)w=Za7foUWXiTtt;J2eJQ=R!I=c|`q8ct2uGUDf!JeDu=vx6j|j zg;hBa6}Jy8Fh)5Mmz16y0u2WM1@ZAE5Q74Dr-j`Q5Z5T+W(_>a8xdAG6@l&ox&x~L zmoNl-eXiC6#FB_G^UDY%Ya=P4yzi{HRvNi15B@5bPxDK%sn-^zklT9t#U}hd^2?L@thQ` z!jSQJjr-Y@~!pmw7)d*6;=(AUq z3>_?C&~b@G<^|mP6A&i}1ttgspil*MJt2AM_j~2R@G=r+>{=2D*nzFN3j~Ivw%mU3 zb@Va$fe{mA5F8kyqsm@?gd2YT#bK-^>j(7$}(GXOB$SC8A`8*xV@m#Xw7n-$-V!N9qah~%Wj)ZpU?@gv!%)BiR+Zp0B)U;;hMfi&;{)VxipR zTXGZooz5$Pdwm4c^jT}KX_L9;bt|fmk-ijCz$PUf2V+-yP3<)11i4>KMer^ERpmD- zKmV;bh1aFdj6np|mrfnYEh1a(fzzhR-lf}Gz>-9hICDOfXJ$<=p>TZKUjmaQ!b`8X zq0%B&M!xT}8k5sr1sl3-CbUg~Y=hA(8 zaEkOBs_%;u`ikNF$_1+>pqS4ES;z9}j;x&qlJ}T={DZlwj_>Su5?_ej6H5Zq`G`R(X;4`x99Z5w_?x`@K)@; zlrg~$tpcL}Yq6$wz2l@ z%kPQHl0=1lIaHbroRID;6!YC>#Vmk5bCV>%pII)AY`h0n_82beR88W(dKCSfY3qyK z+3KLIjl)==o9fK)(|XQ*Zs8^i@aK2$bSxDi*{6KgcDTdiB2U1RNpg$mtwM)qxh_l% zQ3Tpq;^}n{qOf)>KI5O>#52Qn^{J?e^cnN1*9=YKFF!EMo}OUJkWtn~!#kXrbJjHR zn{2GFTzk-|4QztM5{BJsnqZ{5UWz->fN+c6W5+v}$lJ z4tiLev*ERsF|rz`(8PV?0TXTY8!vP`xoNX*GutU++V>0?Rn zZu*lrd(|s9eb8hN71=On{j*~0!CI$1&BlAH~cZWFI|m$UFx{Kn67~syYU_lx4f9?Bz-}*-?4QS_)vh& zH1&^ZXlLU0mUeZ0VCx&9X0}w#Y@N`!`9vsHuz%kci0!u6rA3{gl}yHtI;ljVJ6|P) zhfVT`wYfcH-#5n21r!fj1gZCY$ByolU78WYAtd*pQ2Q+exMD)=B!-5{L3Lv zZB6f|kDkSWY964Q)h}?1Vs}pdkj4^U#5(O=AYTIzG0V!g?r}E@@`v6~W|>C~W74KZaMm7_j1a9FvHK=6a?%aYH7> zE4zK+RmocH%Ygbt{JajD1P8?TTkc45fwU>jDi%#>@+Ej|bYUe~Hu*EEz43N~Dt86m zCNy#(bJ>EAuP9(l31kM&5=p}pIklxxNMxPU3LR)EMca+ zR;8Zi6w%DcIw@>Q$eMYR@f{uMwZ%?@@8qS*jm2(VLx4=(iXY)ZRjs`VEj|)UH=PuN zgopArcG-E(Oq9FfaD38(tZPeqgj=|+Pw}PRa5@57XR9P7uOlzfdbshp-5C|X7EgsJ znX^w(Zc%JDezkLz-TKkWt&VV*1l<=4vxl+#c1u|-oV$d$X{r0v|GVsPO zm%d3`<>%_y5q%2_2*H zZ4o=#@W8Zb96J5>NThZ=B3XFVv2<&2@duBwQVCGYw4`COqJtDsF%ag+Sz6I1=9BCF z`B3LjeJb!+pR{WRBWcFjNb;`$)*XPoJxj4#hp%2w?U8X^Cg(Sy?P~8PNT_LXl|{a1 zNdu>(t-25`id3#%iQ{a;V+z+$jjdX%jK+`iXDQ6wBy1cMNU@YLNdiwhKe$3(d!{`*7E`CppauI6voDwMMiXw{=zCxVV{15?HLvqqp~jKfjtY31zQXv1n#GGHJs>XF@+wo7}K zig9Iwy)a)?^Iqqlxs?JQ?t{Jfi$M#6O(Ec$gsJLbViD8*yS0<74b_*!q`a8zfvku9 zcZC73EgcESF55|S>1T%p4;w`8!>VtSY*Ouh7Nhf?_z>}ID>yT})9dlya}1>xqBd?m z7L2tRyr){%yOE77wnX)fenlFEMKPX}P8pa$)#<=+6QF2t-Tt~z!XgGiXEBSor+nDNOP%x4xmIBpSrw3x=NFzPGW;87f@h=Bg+4q$=LO4G z)H3ADVSuCZlLjS6%x=?NVg$uUy%3Md`A7OMan<>bbekzij^y%OmdoF5qPRYyYt-gy zpxb$96eL>>;>DhuugCEB+v2ZH_f^2C9eY*@G3XjcbnGFJt8ljLWE7vqIfcVo?sz!X zw3n`cLoNV*x9gEm?j)oW_Rl6y^_iwfy!YUQAVG7xw4&C1uuVDp*VL*qbT_^W*Ab>9 zl8xbcB0++W()C+{uGQY*q3EJB82qC2Uo9KSQ24XKQhWquv9JkC?#;?>DrG>i<%RzH z&z+da+xpS+W7>cJm`(C2;qK=InTrf=U{Ys$RL5z391Gk{0=FsspcQ_+xj_%#M1W1iTZRFrYIJWn|21{& z#pHLMmrz~!Zg#9+i-IW6nXE9tLQ`FG0y){CkvzZucNgVAlA#=t5-v{d-$p_MBgvZD zKW>I2FH-k$(`{eaO;e)N(%JN6rf=Z7Fy)VuFZYzFgLMUBDl01IVeRT`NU>Lz4I@>b zJgmaqicv>T>+LH59yd`r>!4}G z{8~CZvAzo#oE0^9AWa&3jn&PW$8yf|Slp}=7j)-zk)hL*Y3t$xqKw02ifn~`%6UnR z#Nd*?yJ6etv3g8zMs6|RAY`ExD=k$q&3!MW((PoXlXGC8^}d#n0b0jq3iSbs|b$xreZhumstdiE6P!BhX}zV zM#BvIQ7HMK!B2bo!v&yyb9#9v6{?w$I=Erh@l6fDx#v(Lp*Z6!rhlM{@!ewYZV5V& z%Kh_Tsi`g2uG=kpAKYO8PyYBvkk{VzM9Tj6@`xqkNX;jW*uXjz;Nn;=K-~>#k(d9^ zrZZEJ-U&~{7oED&=hu_8V z`)z6r^U?7$!eQM8F}S~VJkVzzFA~2y!0>~UIwf^s1?P%X`14c*l@U<>thhqrrtHet z)1fLD;d)c(Yi*wU0m_e?0j-!1;R=oolZx#F-#q(17k4Jm85rq9MAE;e&`W5^*&YNm z7@=Gf`WNj*Lwl7HlPY%*S`H`YSwE$G)wgyXE1>$qZWeXuIc-AEZfSS4C$X7x>~(Qr z@EeQvk*9l3xareF>c1+OQ`!!}Oryv!8h=Z2RAeRQx}1$z0fy2WoIJ~Z)jb|6{L}ip z?0Eb^X@Q;0e-}`|W61c@i!{f(m79Xb0U!|{*ujKdrAGuPNiwJ@cEp}SoozhaHB;#s zNqrU;=?P6wgD;&szTAya(fMN}Fl>%R0L|__WoGeo=gpGhm<<+Fk^zgY zmDX3D_Ba+b0J488gJ((H?Bhro8k(kKBH5>l3D9rJ7n8my1D!FXI&48_>^kh$Y`e0H z0UPS5e)_!#`??k0o3NP@hlt9BVQfNlq))L~gt)XA@xo}Y^L}Xf+62OCq$hhK3?8eQ zHGALy9cBlB9z~3ge$?xNn&I{L6nJ_Arsvd%75vv4fS-NvP#Ugt2Qd0K!Vqy4+)ikk zlTbeq;Ft8TY@AI^KOXpUYl$O{ychYXJQxl-ZpmEF82kTPCON^ zOKr_PV45(KVi>xlLQ?u)!cB==Q?oF`Z*f*}dQE@@)mmxz0G0n>DbtPgVh{)YU$try z{H3pO@-PS@Ojer||JzuHNbmj@Acreev!5 ziu=gi^j;B=@abPVXw}q~_w)(u?*ef<0$50qfH^Jfa2Rj_yA`c*??0^}UqssE`g*R; zd3`-+gfvMVW{;b5#qCjB)EwjDJpC&QGYHES)yS=ap>vXlx;|qsTMcFw-@OhbiIZK- zC{6rH(_hH;-}qG38B7a2?Uq$F!l)hBsk#jB=AmN^Ia=AmUY%YxlDlZacWX~$RKbmX5>-QFV7du~{TsFHeuy>*7?r>w<&`dB4_ zgN_UR3*-CvqqOs3h}7JqjOj^Sm_`4$QNU%HAb0?Cy20P|Z?M(!0fpU3usQv?b5yy@KdBx8JQV zB=MLHleEfJ71WEVR}lpJNCoHq-1pJDb>d>6MpX^Ft*#qUXx8?wZ!H!W4c0ZWnF4%j zF7dH$I^Atk1{X>tR=`au@?_3F^{%QOrTF`(GvQ*Qjyq?3n-`ZXDW?Uf?5vQqNJL;) z%!a2w55{RM{Yd88kQ-!JeoZ}jNDDRlnNauf*jbD;5a4lsTf*5093^J=S=MeTkwvz< zgnQ2fg7%H$MErJ<4yT+~e=26+ssO1?<9ps?bUyoogtQNd=4j|`Yc2C1s>u`yzH`fk z&e17UH~M)fn+K<52ZT`Xoco>qO%-lx#o zr1F<+hW}<{&N-Vuemy39_^KzAzHj2K_T6T`DOsQC^SJ&TRjJeXn;MO1ZwoMZM>&4l ze9MFS;skI1B~<4wXdLFwxK%U&fY-H< zgmp-3+P2txxFiX#b>Q&5F+>E=s~2{{^vyTAdGe~1Ui>jC+3+OkxagmE3B6L?Us&@e zA-QYBg4VotHngJ>-aoSRQtAL6rtHjbFDMF~;7dKLxzlxc&-37lCv^Em;|n{Gen-VWV=wVfZX??Q4MPep$Eh1i8lc4lE4 znT}^82P-^dhbbD{z3UR4Lgx6yS!J z+v634J6}O+2hZf}C1F%YiY5+UY!WFouSfVPztW$xFqGLJ<|}0kydebUT5bR0jL+Y# zu6=!Elgr=|yA2D3qb3xOys{p+5Ldr>G;b(WRh8?pJ2Q8h6WaVPi*C5BSuVLh`L68a zxgcSt2&T&J14*aJB0?Eqh1V4-n2u@4j@_raQhjz(lDR{ZeCh1cTb~-IWEpe!S&rPQ zsVaG5rppd^%T90K@3$@6vX2{z-c%^L#v}osvDUdPr?+*6Q+Li* zVcGyd=YD)KWoU(0?#o9afe7$#b48kFJp|W`#V$$?5wx{J0SnPW(p!A$o;qh6Y1P{s z*J(2rtdurfglN}lwF3Mpf{w=)O~*RPoZ^WN|4z24=DgF-9kfwO>0Vi0V&!}m`r|t$ zp;eAWNjPI24h+D?*can-ImC~nR*g~OdUj`B7sKqm&L>LapK62&P?Coi2AtjDcMj{| zHw8N>@S=E$f5fM zVf_I@W?0>K4&6SoH~ZtutCHcAfyXy6B%le@@|BQnWv#DLiT+~zh)%7S2gUZYI_V8P zGZNK4IHh~vugR;a_MGU^;_1GUc4?WNT>QNt7RE3|x)Z{UV)G88xO6Y-mE^F#PIna{ zs5zD}GYUZUjk56sS#F!iRh#OcyFS}Pp6$<7R_CW89)Fl?N!}RB4ei|5RQQ&hze|$C zyRAsXX8h3C4eUu=uqNpjo-p%wsblzZ-L~G7H&JV9RxFc<^V5{|{86;4^#;VM%0Af& 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 SR7MKV%85WhA)zRV@P7g1Kp(9D