diff --git a/gravimeter/script.m b/gravimeter/script.m index 73a6579..aa26245 100644 --- a/gravimeter/script.m +++ b/gravimeter/script.m @@ -171,7 +171,7 @@ plot(freqs, abs(squeeze(freqresp(Gx(i_out, i_in), freqs, 'Hz'))), 'color', [0,0, 'DisplayName', '$G_x(i,j)\ i \neq j$'); set(gca,'ColorOrderIndex',1) for i_in_out = 1:3 - plot(freqs, abs(squeeze(freqresp(Gx(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out)); + plot(freqs, abs(squeeze(freqresp(Gx(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out)); end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); @@ -256,7 +256,7 @@ plot(freqs, abs(squeeze(freqresp(Gsvd(i_out, i_in), freqs, 'Hz'))), 'color', [0, 'DisplayName', '$G_x(i,j)\ i \neq j$'); set(gca,'ColorOrderIndex',1) for i_in_out = 1:3 - plot(freqs, abs(squeeze(freqresp(Gsvd(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out)); + plot(freqs, abs(squeeze(freqresp(Gsvd(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out)); end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); @@ -329,14 +329,14 @@ ylim([1e-4, 1e2]); RGA_svd = zeros(length(freqs), size(Gsvd,1), size(Gsvd,2)); Gsvd_inv = inv(Gsvd); for f_i = 1:length(freqs) - RGA_svd(f_i, :, :) = abs(evalfr(Gsvd, j*2*pi*freqs(f_i)).*evalfr(Gsvd_inv, j*2*pi*freqs(f_i))'); + RGA_svd(f_i, :, :) = abs(evalfr(Gsvd, j*2*pi*freqs(f_i)).*evalfr(Gsvd_inv, j*2*pi*freqs(f_i))'); end % Relative Gain Array for the decoupled plant using the Jacobian: RGA_x = zeros(length(freqs), size(Gx,1), size(Gx,2)); Gx_inv = inv(Gx); for f_i = 1:length(freqs) - RGA_x(f_i, :, :) = abs(evalfr(Gx, j*2*pi*freqs(f_i)).*evalfr(Gx_inv, j*2*pi*freqs(f_i))'); + RGA_x(f_i, :, :) = abs(evalfr(Gx, j*2*pi*freqs(f_i)).*evalfr(Gx_inv, j*2*pi*freqs(f_i))'); end figure; @@ -356,8 +356,8 @@ plot(freqs, RGA_svd(:, 1, 2), '--', 'color', [0 0 0 0.2], ... plot(freqs, RGA_svd(:, 1, 1), 'k-', ... 'DisplayName', '$RGA_{SVD}(i,i)$'); for ch_i = 1:3 - plot(freqs, RGA_svd(:, ch_i, ch_i), 'k-', ... - 'HandleVisibility', 'off'); + plot(freqs, RGA_svd(:, ch_i, ch_i), 'k-', ... + 'HandleVisibility', 'off'); end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); @@ -378,8 +378,8 @@ plot(freqs, RGA_x(:, 1, 2), '--', 'color', [0 0 0 0.2], ... plot(freqs, RGA_x(:, 1, 1), 'k-', ... 'DisplayName', '$RGA_{X}(i,i)$'); for ch_i = 1:3 - plot(freqs, RGA_x(:, ch_i, ch_i), 'k-', ... - 'HandleVisibility', 'off'); + plot(freqs, RGA_x(:, ch_i, ch_i), 'k-', ... + 'HandleVisibility', 'off'); end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); @@ -406,14 +406,14 @@ ylim([1e-5, 1e1]); RGA_svd = zeros(size(Gsvd,1), size(Gsvd,2), length(freqs)); Gsvd_inv = inv(Gsvd); for f_i = 1:length(freqs) - RGA_svd(:, :, f_i) = abs(evalfr(Gsvd, j*2*pi*freqs(f_i)).*evalfr(Gsvd_inv, j*2*pi*freqs(f_i))'); + RGA_svd(:, :, f_i) = abs(evalfr(Gsvd, j*2*pi*freqs(f_i)).*evalfr(Gsvd_inv, j*2*pi*freqs(f_i))'); end % Relative Gain Array for the decoupled plant using the Jacobian: RGA_x = zeros(size(Gx,1), size(Gx,2), length(freqs)); Gx_inv = inv(Gx); for f_i = 1:length(freqs) - RGA_x(:, :, f_i) = abs(evalfr(Gx, j*2*pi*freqs(f_i)).*evalfr(Gx_inv, j*2*pi*freqs(f_i))'); + RGA_x(:, :, f_i) = abs(evalfr(Gx, j*2*pi*freqs(f_i)).*evalfr(Gx_inv, j*2*pi*freqs(f_i))'); end RGA_num_svd = squeeze(sum(sum(RGA_svd - eye(3)))); @@ -448,8 +448,8 @@ plot(freqs, abs(squeeze(freqresp(Gsvd(1, 2), freqs, 'Hz'))), 'color', [0,0,0,0.5 'DisplayName', '$G_{SVD}(i,j),\ i \neq j$'); set(gca,'ColorOrderIndex',1) for ch_i = 1:3 - plot(freqs, abs(squeeze(freqresp(Gsvd(ch_i, ch_i), freqs, 'Hz'))), ... - 'DisplayName', sprintf('$G_{SVD}(%i,%i)$', ch_i, ch_i)); + plot(freqs, abs(squeeze(freqresp(Gsvd(ch_i, ch_i), freqs, 'Hz'))), ... + 'DisplayName', sprintf('$G_{SVD}(%i,%i)$', ch_i, ch_i)); end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); @@ -461,7 +461,7 @@ ylim([1e-8, 1e0]) ax2 = nexttile; hold on; for ch_i = 1:3 - plot(freqs, 180/pi*angle(squeeze(freqresp(Gsvd(ch_i, ch_i), freqs, 'Hz')))); + plot(freqs, 180/pi*angle(squeeze(freqresp(Gsvd(ch_i, ch_i), freqs, 'Hz')))); end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); @@ -558,16 +558,16 @@ ax1 = nexttile([2, 1]); hold on; plot(freqs, abs(squeeze(freqresp(L_svd(1, 1), freqs, 'Hz'))), 'DisplayName', '$L_{SVD}(i,i)$'); for i_in_out = 2:3 - set(gca,'ColorOrderIndex',1) - plot(freqs, abs(squeeze(freqresp(L_svd(i_in_out, i_in_out), freqs, 'Hz'))), 'HandleVisibility', 'off'); + set(gca,'ColorOrderIndex',1) + plot(freqs, abs(squeeze(freqresp(L_svd(i_in_out, i_in_out), freqs, 'Hz'))), 'HandleVisibility', 'off'); end set(gca,'ColorOrderIndex',2) plot(freqs, abs(squeeze(freqresp(L_cen(1, 1), freqs, 'Hz'))), ... 'DisplayName', '$L_{J}(i,i)$'); for i_in_out = 2:3 - set(gca,'ColorOrderIndex',2) - plot(freqs, abs(squeeze(freqresp(L_cen(i_in_out, i_in_out), freqs, 'Hz'))), 'HandleVisibility', 'off'); + set(gca,'ColorOrderIndex',2) + plot(freqs, abs(squeeze(freqresp(L_cen(i_in_out, i_in_out), freqs, 'Hz'))), 'HandleVisibility', 'off'); end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); @@ -579,13 +579,13 @@ ylim([5e-2, 2e3]) ax2 = nexttile; hold on; for i_in_out = 1:3 - set(gca,'ColorOrderIndex',1) - plot(freqs, 180/pi*angle(squeeze(freqresp(L_svd(i_in_out, i_in_out), freqs, 'Hz')))); + set(gca,'ColorOrderIndex',1) + plot(freqs, 180/pi*angle(squeeze(freqresp(L_svd(i_in_out, i_in_out), freqs, 'Hz')))); end set(gca,'ColorOrderIndex',2) for i_in_out = 1:3 - set(gca,'ColorOrderIndex',2) - plot(freqs, 180/pi*angle(squeeze(freqresp(L_cen(i_in_out, i_in_out), freqs, 'Hz')))); + set(gca,'ColorOrderIndex',2) + plot(freqs, 180/pi*angle(squeeze(freqresp(L_cen(i_in_out, i_in_out), freqs, 'Hz')))); end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); @@ -819,7 +819,7 @@ plot(freqs, abs(squeeze(freqresp(GM(i_out, i_in), freqs, 'Hz'))), 'color', [0,0, 'DisplayName', '$G_x(i,j)\ i \neq j$'); set(gca,'ColorOrderIndex',1) for i_in_out = 1:3 - plot(freqs, abs(squeeze(freqresp(GM(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out)); + plot(freqs, abs(squeeze(freqresp(GM(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out)); end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); @@ -866,7 +866,7 @@ plot(freqs, abs(squeeze(freqresp(GK(i_out, i_in), freqs, 'Hz'))), 'color', [0,0, 'DisplayName', '$G_x(i,j)\ i \neq j$'); set(gca,'ColorOrderIndex',1) for i_in_out = 1:3 - plot(freqs, abs(squeeze(freqresp(GK(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out)); + plot(freqs, abs(squeeze(freqresp(GK(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out)); end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); @@ -930,7 +930,7 @@ plot(freqs, abs(squeeze(freqresp(GKM(i_out, i_in), freqs, 'Hz'))), 'color', [0,0 'DisplayName', '$G_x(i,j)\ i \neq j$'); set(gca,'ColorOrderIndex',1) for i_in_out = 1:3 - plot(freqs, abs(squeeze(freqresp(GKM(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out)); + plot(freqs, abs(squeeze(freqresp(GKM(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out)); end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); @@ -938,11 +938,12 @@ xlabel('Frequency [Hz]'); ylabel('Magnitude'); legend('location', 'southeast'); ylim([1e-8, 1e0]); -% SVD decoupling performances :noexport: +% SVD decoupling performances +% As the SVD is applied on a *real approximation* of the plant dynamics at a frequency $\omega_0$, it is foreseen that the effectiveness of the decoupling depends on the validity of the real approximation. +% Let's do the SVD decoupling on a plant that is mostly real (low damping) and one with a large imaginary part (larger damping). -la = l/2; % Position of Act. [m] -ha = 0; % Position of Act. [m] +% Start with small damping, the obtained diagonal and off-diagonal terms are shown in Figure [[fig:gravimeter_svd_low_damping]]. c = 2e1; % Actuator Damping [N/(m/s)] @@ -970,6 +971,37 @@ H1 = pinv(D*real(H1'*diag(exp(j*angle(diag(H1*D*H1.'))/2)))); [U,S,V] = svd(H1); Gsvd = inv(U)*G*inv(V'); +figure; + +% Magnitude +hold on; +for i_in = 1:3 + for i_out = [1:i_in-1, i_in+1:3] + plot(freqs, abs(squeeze(freqresp(Gsvd(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); + end +end +plot(freqs, abs(squeeze(freqresp(Gsvd(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... + 'DisplayName', '$G_{svd}(i,j)\ i \neq j$'); +set(gca,'ColorOrderIndex',1) +for i_in_out = 1:3 + plot(freqs, abs(squeeze(freqresp(Gsvd(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_{svd}(%d,%d)$', i_in_out, i_in_out)); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Magnitude'); +legend('location', 'northwest'); +ylim([1e-8, 1e0]); + + + +% #+name: fig:gravimeter_svd_low_damping +% #+caption: Diagonal and off-diagonal term when decoupling with SVD on the gravimeter with small damping +% #+RESULTS: +% [[file:figs/gravimeter_svd_low_damping.png]] + +% Now take a larger damping, the obtained diagonal and off-diagonal terms are shown in Figure [[fig:gravimeter_svd_high_damping]]. + c = 5e2; % Actuator Damping [N/(m/s)] %% Name of the Simulink File @@ -996,63 +1028,6 @@ H1 = pinv(D*real(H1'*diag(exp(j*angle(diag(H1*D*H1.'))/2)))); [U,S,V] = svd(H1); Gsvdd = inv(U)*G*inv(V'); -JMa = [1 0 -h/2 - 0 1 l/2 - 1 0 h/2 - 0 1 0]; - -JMt = [1 0 -ha - 0 1 la - 0 1 -la]; - -GM = pinv(JMa)*G*pinv(JMt'); -GM.InputName = {'Fx', 'Fy', 'Mz'}; -GM.OutputName = {'Dx', 'Dy', 'Rz'}; - -figure; - -% Magnitude -hold on; -for i_in = 1:3 - for i_out = [1:i_in-1, i_in+1:3] - plot(freqs, abs(squeeze(freqresp(GM(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... - 'HandleVisibility', 'off'); - end -end -plot(freqs, abs(squeeze(freqresp(GM(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... - 'DisplayName', '$G_x(i,j)\ i \neq j$'); -set(gca,'ColorOrderIndex',1) -for i_in_out = 1:3 - plot(freqs, abs(squeeze(freqresp(GM(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out)); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Magnitude'); -legend('location', 'southeast'); -ylim([1e-8, 1e0]); - -figure; - -% Magnitude -hold on; -for i_in = 1:3 - for i_out = [1:i_in-1, i_in+1:3] - plot(freqs, abs(squeeze(freqresp(Gsvd(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... - 'HandleVisibility', 'off'); - end -end -plot(freqs, abs(squeeze(freqresp(Gsvd(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... - 'DisplayName', '$G_x(i,j)\ i \neq j$'); -set(gca,'ColorOrderIndex',1) -for i_in_out = 1:3 - plot(freqs, abs(squeeze(freqresp(Gsvd(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out)); -end -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Magnitude'); -legend('location', 'southeast'); -ylim([1e-8, 1e0]); - figure; % Magnitude @@ -1064,13 +1039,13 @@ for i_in = 1:3 end end plot(freqs, abs(squeeze(freqresp(Gsvdd(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... - 'DisplayName', '$G_x(i,j)\ i \neq j$'); + 'DisplayName', '$G_{svd}(i,j)\ i \neq j$'); set(gca,'ColorOrderIndex',1) for i_in_out = 1:3 - plot(freqs, abs(squeeze(freqresp(Gsvdd(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_x(%d,%d)$', i_in_out, i_in_out)); + plot(freqs, abs(squeeze(freqresp(Gsvdd(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_{svd}(%d,%d)$', i_in_out, i_in_out)); end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); ylabel('Magnitude'); -legend('location', 'southeast'); +legend('location', 'northwest'); ylim([1e-8, 1e0]); diff --git a/index.html b/index.html index d7d43c6..6abd7f6 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- +In this part, diagonal control using both the SVD and the Jacobian matrices are applied on a gravimeter model:
-The model of the gravimeter is schematically shown in Figure 1. +The model of the gravimeter is schematically shown in Figure 1.
-
Figure 1: Model of the gravimeter
Figure 2: Model of the struts
@@ -153,55 +153,55 @@ The model of the gravimeter is schematically shown in Figure -l = 1.0; % Length of the mass [m] - h = 1.7; % Height of the mass [m] +l = 1.0; % Length of the mass [m] +h = 1.7; % Height of the mass [m] - la = l/2; % Position of Act. [m] - ha = h/2; % Position of Act. [m] +la = l/2; % Position of Act. [m] +ha = h/2; % Position of Act. [m] - m = 400; % Mass [kg] - I = 115; % Inertia [kg m^2] +m = 400; % Mass [kg] +I = 115; % Inertia [kg m^2] - k = 15e3; % Actuator Stiffness [N/m] - c = 2e1; % Actuator Damping [N/(m/s)] +k = 15e3; % Actuator Stiffness [N/m] +c = 2e1; % Actuator Damping [N/(m/s)] - deq = 0.2; % Length of the actuators [m] +deq = 0.2; % Length of the actuators [m] - g = 0; % Gravity [m/s2] +g = 0; % Gravity [m/s2]
%% Name of the Simulink File - mdl = 'gravimeter'; +%% Name of the Simulink File +mdl = 'gravimeter'; - %% Input/Output definition - clear io; io_i = 1; - io(io_i) = linio([mdl, '/F1'], 1, 'openinput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/F2'], 1, 'openinput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/F3'], 1, 'openinput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Acc_side'], 1, 'openoutput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Acc_side'], 2, 'openoutput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Acc_top'], 1, 'openoutput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Acc_top'], 2, 'openoutput'); io_i = io_i + 1; +%% Input/Output definition +clear io; io_i = 1; +io(io_i) = linio([mdl, '/F1'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/F2'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/F3'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Acc_side'], 1, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Acc_side'], 2, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Acc_top'], 1, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Acc_top'], 2, 'openoutput'); io_i = io_i + 1; - G = linearize(mdl, io); - G.InputName = {'F1', 'F2', 'F3'}; - G.OutputName = {'Ax1', 'Ay1', 'Ax2', 'Ay2'}; +G = linearize(mdl, io); +G.InputName = {'F1', 'F2', 'F3'}; +G.OutputName = {'Ax1', 'Ay1', 'Ax2', 'Ay2'};
-The inputs and outputs of the plant are shown in Figure 3. +The inputs and outputs of the plant are shown in Figure 3.
@@ -218,7 +218,7 @@ And 4 outputs (the two 2-DoF accelerometers): \end{equation} -
Figure 3: Schematic of the gravimeter plant
@@ -264,7 +264,7 @@ We can check the poles of the plant: As expected, the plant as 6 states (2 translations + 1 rotation)size(G) +size(G)
-The bode plot of all elements of the plant are shown in Figure 4. +The bode plot of all elements of the plant are shown in Figure 4.
-
Figure 4: Open Loop Transfer Function from 3 Actuators to 4 Accelerometers
@@ -286,15 +286,15 @@ The bode plot of all elements of the plant are shown in Figure --Consider the control architecture shown in Figure 5. +Consider the control architecture shown in Figure 5.
@@ -312,16 +312,16 @@ The Jacobian matrix \(J_{a}\) is used to compute the vertical acceleration, hori \end{equation}
-We thus define a new plant as defined in Figure 5. +We thus define a new plant as defined in Figure 5. \[ \bm{G}_x(s) = J_a^{-1} \bm{G}(s) J_{\tau}^{-T} \]
-\(\bm{G}_x(s)\) correspond to the $3 × 3$transfer function matrix from forces and torques applied to the gravimeter at its center of mass to the absolute acceleration of the gravimeter’s center of mass (Figure 5). +\(\bm{G}_x(s)\) correspond to the $3 × 3$transfer function matrix from forces and torques applied to the gravimeter at its center of mass to the absolute acceleration of the gravimeter’s center of mass (Figure 5).
-
Figure 5: Decoupled plant \(\bm{G}_x\) using the Jacobian matrix \(J\)
@@ -331,14 +331,14 @@ We thus define a new plant as defined in Figure 5. The Jacobian corresponding to the sensors and actuators are defined below:Ja = [1 0 -h/2 - 0 1 l/2 - 1 0 h/2 - 0 1 0]; +Ja = [1 0 -h/2 + 0 1 l/2 + 1 0 h/2 + 0 1 0]; - Jt = [1 0 -ha - 0 1 la - 0 1 -la]; +Jt = [1 0 -ha + 0 1 la + 0 1 -la];
Gx = pinv(Ja)*G*pinv(Jt'); - Gx.InputName = {'Fx', 'Fy', 'Mz'}; - Gx.OutputName = {'Dx', 'Dy', 'Rz'}; +Gx = pinv(Ja)*G*pinv(Jt'); +Gx.InputName = {'Fx', 'Fy', 'Mz'}; +Gx.OutputName = {'Dx', 'Dy', 'Rz'};
-The diagonal and off-diagonal elements of \(G_x\) are shown in Figure 6. +The diagonal and off-diagonal elements of \(G_x\) are shown in Figure 6.
-
Figure 6: Diagonal and off-diagonal elements of \(G_x\)
@@ -371,11 +371,11 @@ The diagonal and off-diagonal elements of \(G_x\) are shown in Figure -@@ -386,9 +386,9 @@ In order to decouple the plant using the SVD, first a real approximation of the Let’s compute a real approximation of the complex matrix \(H_1\) which corresponds to the the transfer function \(G(j\omega_c)\) from forces applied by the actuators to the measured acceleration of the top platform evaluated at the frequency \(\omega_c\).
wc = 2*pi*10; % Decoupling frequency [rad/s] +wc = 2*pi*10; % Decoupling frequency [rad/s] - H1 = evalfr(G, j*wc); +H1 = evalfr(G, j*wc);
D = pinv(real(H1'*H1)); - H1 = pinv(D*real(H1'*diag(exp(j*angle(diag(H1*D*H1.'))/2)))); +D = pinv(real(H1'*H1)); +H1 = pinv(D*real(H1'*diag(exp(j*angle(diag(H1*D*H1.'))/2))));
[U,S,V] = svd(H1); +[U,S,V] = svd(H1);
-The obtained matrices \(U\) and \(V\) are used to decouple the system as shown in Figure 7. +The obtained matrices \(U\) and \(V\) are used to decouple the system as shown in Figure 7.
-
Figure 7: Decoupled plant \(\bm{G}_{SVD}\) using the Singular Value Decomposition
@@ -540,7 +540,7 @@ The decoupled plant is then:Gsvd = inv(U)*G*inv(V'); +Gsvd = inv(U)*G*inv(V');
Gsvd = Gsvd(1:3, 1:3); +Gsvd = Gsvd(1:3, 1:3);
-The diagonal and off-diagonal elements of the “SVD” plant are shown in Figure 8. +The diagonal and off-diagonal elements of the “SVD” plant are shown in Figure 8.
-
Figure 8: Diagonal and off-diagonal elements of \(G_{svd}\)
@@ -570,11 +570,11 @@ The diagonal and off-diagonal elements of the “SVD” plant are shown@@ -587,7 +587,7 @@ The “Gershgorin Radii” of a matrix \(S\) is defined by:
-
Figure 9: Gershgorin Radii of the Coupled and Decoupled plants
@@ -595,11 +595,11 @@ The “Gershgorin Radii” of a matrix \(S\) is defined by:@@ -613,11 +613,11 @@ where \(\times\) denotes an element by element multiplication and \(G(s)\) is an
-The obtained RGA elements are shown in Figure 10. +The obtained RGA elements are shown in Figure 10.
-
Figure 10: Obtained norm of RGA elements for the SVD decoupled plant and the Jacobian decoupled plant
@@ -631,7 +631,7 @@ The RGA-number is also a measure of diagonal dominance: \end{equation} -
Figure 11: RGA-Number for the Gravimeter
@@ -639,30 +639,30 @@ The RGA-number is also a measure of diagonal dominance:-The bode plot of the diagonal and off-diagonal elements of \(G_{SVD}\) are shown in Figure 12. +The bode plot of the diagonal and off-diagonal elements of \(G_{SVD}\) are shown in Figure 12.
-
Figure 12: Decoupled Plant using SVD
-Similarly, the bode plots of the diagonal elements and off-diagonal elements of the decoupled plant \(G_x(s)\) using the Jacobian are shown in Figure 13. +Similarly, the bode plots of the diagonal elements and off-diagonal elements of the decoupled plant \(G_x(s)\) using the Jacobian are shown in Figure 13.
-
Figure 13: Gravimeter Platform Plant from forces (resp. torques) applied by the legs to the acceleration (resp. angular acceleration) of the platform as well as all the coupling terms between the two (non-diagonal terms of the transfer function matrix)
@@ -670,12 +670,12 @@ Similarly, the bode plots of the diagonal elements and off-diagonal elements of- -The control diagram for the centralized control is shown in Figure 14. + +The control diagram for the centralized control is shown in Figure 14.
@@ -684,19 +684,19 @@ The Jacobian is used to convert forces in the cartesian frame to forces applied
-
Figure 14: Control Diagram for the Centralized control
-The SVD control architecture is shown in Figure 15. +The SVD control architecture is shown in Figure 15. The matrices \(U\) and \(V\) are used to decoupled the plant \(G\).
-
Figure 15: Control Diagram for the SVD control
@@ -713,32 +713,32 @@ We choose the controller to be a low pass filter:wc = 2*pi*10; % Crossover Frequency [rad/s] - w0 = 2*pi*0.1; % Controller Pole [rad/s] +wc = 2*pi*10; % Crossover Frequency [rad/s] +w0 = 2*pi*0.1; % Controller Pole [rad/s]
K_cen = diag(1./diag(abs(evalfr(Gx, j*wc))))*(1/abs(evalfr(1/(1 + s/w0), j*wc)))/(1 + s/w0); - L_cen = K_cen*Gx; - G_cen = feedback(G, pinv(Jt')*K_cen*pinv(Ja)); +K_cen = diag(1./diag(abs(evalfr(Gx, j*wc))))*(1/abs(evalfr(1/(1 + s/w0), j*wc)))/(1 + s/w0); +L_cen = K_cen*Gx; +G_cen = feedback(G, pinv(Jt')*K_cen*pinv(Ja));
K_svd = diag(1./diag(abs(evalfr(Gsvd, j*wc))))*(1/abs(evalfr(1/(1 + s/w0), j*wc)))/(1 + s/w0); - L_svd = K_svd*Gsvd; - U_inv = inv(U); - G_svd = feedback(G, inv(V')*K_svd*U_inv(1:3, :)); +K_svd = diag(1./diag(abs(evalfr(Gsvd, j*wc))))*(1/abs(evalfr(1/(1 + s/w0), j*wc)))/(1 + s/w0); +L_svd = K_svd*Gsvd; +U_inv = inv(U); +G_svd = feedback(G, inv(V')*K_svd*U_inv(1:3, :));
-The obtained diagonal elements of the loop gains are shown in Figure 16. +The obtained diagonal elements of the loop gains are shown in Figure 16.
-
Figure 16: Comparison of the diagonal elements of the loop gains for the SVD control architecture and the Jacobian one
@@ -746,18 +746,18 @@ The obtained diagonal elements of the loop gains are shown in Figure -Let’s first verify the stability of the closed-loop systems:
isstable(G_cen) +isstable(G_cen)
isstable(G_svd) +isstable(G_svd)
-The obtained transmissibility in Open-loop, for the centralized control as well as for the SVD control are shown in Figure 17. +The obtained transmissibility in Open-loop, for the centralized control as well as for the SVD control are shown in Figure 17.
-
Figure 17: Obtained Transmissibility
Figure 18: Obtain coupling terms of the transmissibility matrix
@@ -801,15 +801,15 @@ The obtained transmissibility in Open-loop, for the centralized control as wellLet say we change the position of the actuators:
la = l/2*0.7; % Position of Act. [m] - ha = h/2*0.7; % Position of Act. [m] +la = l/2*0.7; % Position of Act. [m] +ha = h/2*0.7; % Position of Act. [m]
Figure 19: Transmissibility for the initial CL system and when the position of actuators are changed
@@ -830,8 +830,8 @@ The closed-loop system are still stable, and theirIf we want to decouple the system at low frequency (determined by the stiffness matrix), we have to compute the Jacobians at a point where the stiffness matrix is diagonal. @@ -852,39 +852,39 @@ To do so, the actuators (springs) should be positioned such that the stiffness m
Figure 20: Choice of {O} such that the Mass Matrix is Diagonal
la = l/2; % Position of Act. [m] - ha = h/2; % Position of Act. [m] +la = l/2; % Position of Act. [m] +ha = h/2; % Position of Act. [m]
%% Name of the Simulink File - mdl = 'gravimeter'; +%% Name of the Simulink File +mdl = 'gravimeter'; - %% Input/Output definition - clear io; io_i = 1; - io(io_i) = linio([mdl, '/F1'], 1, 'openinput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/F2'], 1, 'openinput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/F3'], 1, 'openinput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Acc_side'], 1, 'openoutput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Acc_side'], 2, 'openoutput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Acc_top'], 1, 'openoutput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Acc_top'], 2, 'openoutput'); io_i = io_i + 1; +%% Input/Output definition +clear io; io_i = 1; +io(io_i) = linio([mdl, '/F1'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/F2'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/F3'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Acc_side'], 1, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Acc_side'], 2, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Acc_top'], 1, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Acc_top'], 2, 'openoutput'); io_i = io_i + 1; - G = linearize(mdl, io); - G.InputName = {'F1', 'F2', 'F3'}; - G.OutputName = {'Ax1', 'Ay1', 'Ax2', 'Ay2'}; +G = linearize(mdl, io); +G.InputName = {'F1', 'F2', 'F3'}; +G.OutputName = {'Ax1', 'Ay1', 'Ax2', 'Ay2'};
JMa = [1 0 -h/2 - 0 1 l/2 - 1 0 h/2 - 0 1 0]; +JMa = [1 0 -h/2 + 0 1 l/2 + 1 0 h/2 + 0 1 0]; - JMt = [1 0 -ha - 0 1 la - 0 1 -la]; +JMt = [1 0 -ha + 0 1 la + 0 1 -la];
GM = pinv(JMa)*G*pinv(JMt'); - GM.InputName = {'Fx', 'Fy', 'Mz'}; - GM.OutputName = {'Dx', 'Dy', 'Rz'}; +GM = pinv(JMa)*G*pinv(JMt'); +GM.InputName = {'Fx', 'Fy', 'Mz'}; +GM.OutputName = {'Dx', 'Dy', 'Rz'};
Figure 21: Diagonal and off-diagonal elements of the decoupled plant
@@ -919,11 +919,11 @@ Decoupling at the CoM (Mass decoupled)
Figure 22: Choice of {O} such that the Stiffness Matrix is Diagonal
@@ -933,14 +933,14 @@ Decoupling at the CoM (Mass decoupled) Decoupling at the point where K is diagonal (x = 0, y = -h/2 from the schematic {O} frame):JKa = [1 0 0 - 0 1 -l/2 - 1 0 -h - 0 1 0]; +JKa = [1 0 0 + 0 1 -l/2 + 1 0 -h + 0 1 0]; - JKt = [1 0 0 - 0 1 -la - 0 1 la]; +JKt = [1 0 0 + 0 1 -la + 0 1 la];
GK = pinv(JKa)*G*pinv(JKt'); - GK.InputName = {'Fx', 'Fy', 'Mz'}; - GK.OutputName = {'Dx', 'Dy', 'Rz'}; +GK = pinv(JKa)*G*pinv(JKt'); +GK.InputName = {'Fx', 'Fy', 'Mz'}; +GK.OutputName = {'Dx', 'Dy', 'Rz'};
Figure 23: Diagonal and off-diagonal elements of the decoupled plant
@@ -963,11 +963,11 @@ And the plant \(\bm{G}_x\) is computed:
Figure 24: Ideal location of the actuators such that both the mass and stiffness matrices are diagonal
@@ -978,52 +978,52 @@ To do so, the actuator position should be modifiedla = l/2; % Position of Act. [m] - ha = 0; % Position of Act. [m] +la = l/2; % Position of Act. [m] +ha = 0; % Position of Act. [m]
%% Name of the Simulink File - mdl = 'gravimeter'; +%% Name of the Simulink File +mdl = 'gravimeter'; - %% Input/Output definition - clear io; io_i = 1; - io(io_i) = linio([mdl, '/F1'], 1, 'openinput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/F2'], 1, 'openinput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/F3'], 1, 'openinput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Acc_side'], 1, 'openoutput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Acc_side'], 2, 'openoutput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Acc_top'], 1, 'openoutput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Acc_top'], 2, 'openoutput'); io_i = io_i + 1; +%% Input/Output definition +clear io; io_i = 1; +io(io_i) = linio([mdl, '/F1'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/F2'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/F3'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Acc_side'], 1, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Acc_side'], 2, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Acc_top'], 1, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Acc_top'], 2, 'openoutput'); io_i = io_i + 1; - G = linearize(mdl, io); - G.InputName = {'F1', 'F2', 'F3'}; - G.OutputName = {'Ax1', 'Ay1', 'Ax2', 'Ay2'}; +G = linearize(mdl, io); +G.InputName = {'F1', 'F2', 'F3'}; +G.OutputName = {'Ax1', 'Ay1', 'Ax2', 'Ay2'};
JMa = [1 0 -h/2 - 0 1 l/2 - 1 0 h/2 - 0 1 0]; +JMa = [1 0 -h/2 + 0 1 l/2 + 1 0 h/2 + 0 1 0]; - JMt = [1 0 -ha - 0 1 la - 0 1 -la]; +JMt = [1 0 -ha + 0 1 la + 0 1 -la];
GKM = pinv(JMa)*G*pinv(JMt'); - GKM.InputName = {'Fx', 'Fy', 'Mz'}; - GKM.OutputName = {'Dx', 'Dy', 'Rz'}; +GKM = pinv(JMa)*G*pinv(JMt'); +GKM.InputName = {'Fx', 'Fy', 'Mz'}; +GKM.OutputName = {'Dx', 'Dy', 'Rz'};
Figure 25: Diagonal and off-diagonal elements of the decoupled plant
@@ -1031,8 +1031,8 @@ To do so, the actuator position should be modifiedIdeally, the mechanical system should be designed in order to have a decoupled stiffness matrix at the CoM of the solid. @@ -1046,8 +1046,8 @@ Or it can be decoupled at high frequency if the Jacobians are evaluated at the C
As the SVD is applied on a real approximation of the plant dynamics at a frequency \(\omega_0\), it is foreseen that the effectiveness of the decoupling depends on the validity of the real approximation. @@ -1058,30 +1058,30 @@ Let’s do the SVD decoupling on a plant that is mostly real (low damping) a
-Start with small damping, the obtained diagonal and off-diagonal terms are shown in Figure 26. +Start with small damping, the obtained diagonal and off-diagonal terms are shown in Figure 26.
c = 2e1; % Actuator Damping [N/(m/s)]
+c = 2e1; % Actuator Damping [N/(m/s)]
Figure 26: Diagonal and off-diagonal term when decoupling with SVD on the gravimeter with small damping
-Now take a larger damping, the obtained diagonal and off-diagonal terms are shown in Figure 27. +Now take a larger damping, the obtained diagonal and off-diagonal terms are shown in Figure 27.
c = 5e2; % Actuator Damping [N/(m/s)]
+c = 5e2; % Actuator Damping [N/(m/s)]
Figure 27: Diagonal and off-diagonal term when decoupling with SVD on the gravimeter with high damping
@@ -1090,14 +1090,14 @@ Now take a larger damping, the obtained diagonal and off-diagonal terms are show-In this analysis, we wish to applied SVD control to the Stewart Platform shown in Figure 28. +In this analysis, we wish to applied SVD control to the Stewart Platform shown in Figure 28.
@@ -1110,7 +1110,7 @@ Some notes about the system: -
Figure 28: Stewart Platform CAD View
@@ -1120,26 +1120,26 @@ Some notes about the system: The analysis of the SVD/Jacobian control applied to the Stewart platform is performed in the following sections: open('drone_platform.slx');
+open('drone_platform.slx');
kx = 0.5*1e3/3; % [N/m] - ky = 0.5*1e3/3; - kz = 1e3/3; +kx = 0.5*1e3/3; % [N/m] +ky = 0.5*1e3/3; +kz = 1e3/3; - cx = 0.025; % [Nm/rad] - cy = 0.025; - cz = 0.025; +cx = 0.025; % [Nm/rad] +cy = 0.025; +cz = 0.025;
sens_pos_error = zeros(3,1); +sens_pos_error = zeros(3,1);
g = 0; +g = 0;
load('jacobian.mat', 'Aa', 'Ab', 'As', 'l', 'J'); +load('jacobian.mat', 'Aa', 'Ab', 'As', 'l', 'J');
U = eye(6); - V = eye(6); - Kc = tf(zeros(6)); +U = eye(6); +V = eye(6); +Kc = tf(zeros(6));
Figure 29: General view of the Simscape Model
Figure 30: Simscape model of the Stewart platform
@@ -1207,15 +1207,15 @@ We initialize other parameters:-The plant shown in Figure 31 is identified from the Simscape model. +The plant shown in Figure 31 is identified from the Simscape model.
@@ -1231,31 +1231,31 @@ The outputs are the 6 accelerations measured by the inertial unit.
-
Figure 31: Considered plant \(\bm{G} = \begin{bmatrix}G_d\\G_u\end{bmatrix}\). \(D_w\) is the translation/rotation of the support, \(\tau\) the actuator forces, \(a\) the acceleration/angular acceleration of the top platform
%% Name of the Simulink File - mdl = 'drone_platform'; +%% Name of the Simulink File +mdl = 'drone_platform'; - %% Input/Output definition - clear io; io_i = 1; - io(io_i) = linio([mdl, '/Dw'], 1, 'openinput'); io_i = io_i + 1; % Ground Motion - io(io_i) = linio([mdl, '/V-T'], 1, 'openinput'); io_i = io_i + 1; % Actuator Forces - io(io_i) = linio([mdl, '/Inertial Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Top platform acceleration +%% Input/Output definition +clear io; io_i = 1; +io(io_i) = linio([mdl, '/Dw'], 1, 'openinput'); io_i = io_i + 1; % Ground Motion +io(io_i) = linio([mdl, '/V-T'], 1, 'openinput'); io_i = io_i + 1; % Actuator Forces +io(io_i) = linio([mdl, '/Inertial Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Top platform acceleration - G = linearize(mdl, io); - G.InputName = {'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz', ... - 'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; - G.OutputName = {'Ax', 'Ay', 'Az', 'Arx', 'Ary', 'Arz'}; +G = linearize(mdl, io); +G.InputName = {'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz', ... + 'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; +G.OutputName = {'Ax', 'Ay', 'Az', 'Arx', 'Ary', 'Arz'}; - % Plant - Gu = G(:, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}); - % Disturbance dynamics - Gd = G(:, {'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz'}); +% Plant +Gu = G(:, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}); +% Disturbance dynamics +Gd = G(:, {'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz'});
size(G) +size(G)
-The elements of the transfer matrix \(\bm{G}\) corresponding to the transfer function from actuator forces \(\tau\) to the measured acceleration \(a\) are shown in Figure 32. +The elements of the transfer matrix \(\bm{G}\) corresponding to the transfer function from actuator forces \(\tau\) to the measured acceleration \(a\) are shown in Figure 32.
@@ -1281,7 +1281,7 @@ One can easily see that the system is strongly coupled.
-
Figure 32: Magnitude of all 36 elements of the transfer function matrix \(G_u\)
@@ -1289,12 +1289,12 @@ One can easily see that the system is strongly coupled.- -Consider the control architecture shown in Figure 33. + +Consider the control architecture shown in Figure 33. The Jacobian matrix is used to transform forces/torques applied on the top platform to the equivalent forces applied by each actuator.
@@ -1376,7 +1376,7 @@ The Jacobian matrix is computed from the geometry of the platform (position and -
Figure 33: Decoupled plant \(\bm{G}_x\) using the Jacobian matrix \(J\)
@@ -1392,18 +1392,18 @@ We define a new plant:Gx = Gu*inv(J'); - Gx.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'}; +Gx = Gu*inv(J'); +Gx.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
@@ -1414,9 +1414,9 @@ In order to decouple the plant using the SVD, first a real approximation of the Let’s compute a real approximation of the complex matrix \(H_1\) which corresponds to the the transfer function \(G_u(j\omega_c)\) from forces applied by the actuators to the measured acceleration of the top platform evaluated at the frequency \(\omega_c\).
wc = 2*pi*30; % Decoupling frequency [rad/s] +wc = 2*pi*30; % Decoupling frequency [rad/s] - H1 = evalfr(Gu, j*wc); +H1 = evalfr(Gu, j*wc);
D = pinv(real(H1'*H1)); - H1 = inv(D*real(H1'*diag(exp(j*angle(diag(H1*D*H1.'))/2)))); +D = pinv(real(H1'*H1)); +H1 = inv(D*real(H1'*diag(exp(j*angle(diag(H1*D*H1.'))/2))));
[U,~,V] = svd(H1);
+[U,~,V] = svd(H1);
-The obtained matrices \(U\) and \(V\) are used to decouple the system as shown in Figure 34. +The obtained matrices \(U\) and \(V\) are used to decouple the system as shown in Figure 34.
-
Figure 34: Decoupled plant \(\bm{G}_{SVD}\) using the Singular Value Decomposition
@@ -1755,17 +1755,17 @@ The decoupled plant is then:Gsvd = inv(U)*Gu*inv(V'); +Gsvd = inv(U)*Gu*inv(V');
@@ -1781,7 +1781,7 @@ The “Gershgorin Radii” of a matrix \(S\) is defined by: This is computed over the following frequencies.
-
Figure 35: Gershgorin Radii of the Coupled and Decoupled plants
@@ -1789,11 +1789,11 @@ This is computed over the following frequencies.@@ -1807,11 +1807,11 @@ where \(\times\) denotes an element by element multiplication and \(G(s)\) is an
-The obtained RGA elements are shown in Figure 36. +The obtained RGA elements are shown in Figure 36.
-
Figure 36: Obtained norm of RGA elements for the SVD decoupled plant and the Jacobian decoupled plant
@@ -1819,30 +1819,30 @@ The obtained RGA elements are shown in Figure 36.-The bode plot of the diagonal and off-diagonal elements of \(G_{SVD}\) are shown in Figure 37. +The bode plot of the diagonal and off-diagonal elements of \(G_{SVD}\) are shown in Figure 37.
-
Figure 37: Decoupled Plant using SVD
-Similarly, the bode plots of the diagonal elements and off-diagonal elements of the decoupled plant \(G_x(s)\) using the Jacobian are shown in Figure 38. +Similarly, the bode plots of the diagonal elements and off-diagonal elements of the decoupled plant \(G_x(s)\) using the Jacobian are shown in Figure 38.
-
Figure 38: Stewart Platform Plant from forces (resp. torques) applied by the legs to the acceleration (resp. angular acceleration) of the platform as well as all the coupling terms between the two (non-diagonal terms of the transfer function matrix)
@@ -1850,12 +1850,12 @@ Similarly, the bode plots of the diagonal elements and off-diagonal elements of- -The control diagram for the centralized control is shown in Figure 39. + +The control diagram for the centralized control is shown in Figure 39.
@@ -1864,19 +1864,19 @@ The Jacobian is used to convert forces in the cartesian frame to forces applied
-
Figure 39: Control Diagram for the Centralized control
-The SVD control architecture is shown in Figure 40. +The SVD control architecture is shown in Figure 40. The matrices \(U\) and \(V\) are used to decoupled the plant \(G\).
-
Figure 40: Control Diagram for the SVD control
@@ -1893,31 +1893,31 @@ We choose the controller to be a low pass filter:wc = 2*pi*80; % Crossover Frequency [rad/s] - w0 = 2*pi*0.1; % Controller Pole [rad/s] +wc = 2*pi*80; % Crossover Frequency [rad/s] +w0 = 2*pi*0.1; % Controller Pole [rad/s]
K_cen = diag(1./diag(abs(evalfr(Gx, j*wc))))*(1/abs(evalfr(1/(1 + s/w0), j*wc)))/(1 + s/w0); - L_cen = K_cen*Gx; - G_cen = feedback(G, pinv(J')*K_cen, [7:12], [1:6]); +K_cen = diag(1./diag(abs(evalfr(Gx, j*wc))))*(1/abs(evalfr(1/(1 + s/w0), j*wc)))/(1 + s/w0); +L_cen = K_cen*Gx; +G_cen = feedback(G, pinv(J')*K_cen, [7:12], [1:6]);
K_svd = diag(1./diag(abs(evalfr(Gsvd, j*wc))))*(1/abs(evalfr(1/(1 + s/w0), j*wc)))/(1 + s/w0); - L_svd = K_svd*Gsvd; - G_svd = feedback(G, inv(V')*K_svd*inv(U), [7:12], [1:6]); +K_svd = diag(1./diag(abs(evalfr(Gsvd, j*wc))))*(1/abs(evalfr(1/(1 + s/w0), j*wc)))/(1 + s/w0); +L_svd = K_svd*Gsvd; +G_svd = feedback(G, inv(V')*K_svd*inv(U), [7:12], [1:6]);
-The obtained diagonal elements of the loop gains are shown in Figure 41. +The obtained diagonal elements of the loop gains are shown in Figure 41.
-
Figure 41: Comparison of the diagonal elements of the loop gains for the SVD control architecture and the Jacobian one
@@ -1925,18 +1925,18 @@ The obtained diagonal elements of the loop gains are shown in Figure -Let’s first verify the stability of the closed-loop systems:
isstable(G_cen) +isstable(G_cen)
isstable(G_svd) +isstable(G_svd)
-The obtained transmissibility in Open-loop, for the centralized control as well as for the SVD control are shown in Figure 42. +The obtained transmissibility in Open-loop, for the centralized control as well as for the SVD control are shown in Figure 42.
-
Figure 42: Obtained Transmissibility
@@ -1975,7 +1975,7 @@ The obtained transmissibility in Open-loop, for the centralized control as wellCreated: 2021-01-08 ven. 13:57
+Created: 2021-01-11 lun. 09:09