diff --git a/index.html b/index.html index ebea6ae..d7d43c6 100644 --- a/index.html +++ b/index.html @@ -3,21 +3,30 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Diagonal control using the SVD and the Jacobian Matrix - - + +
@@ -30,46 +39,49 @@

Table of Contents

+
+

This report is also available as a pdf.

+

In this document, the use of the Jacobian matrix and the Singular Value Decomposition to render a physical plant diagonal dominant is studied. @@ -80,58 +92,58 @@ Then, a diagonal controller is used. These two methods are tested on two plants:

-
-

1 Gravimeter - Simscape Model

+
+

1 Gravimeter - Simscape Model

- +

-
-

1.1 Introduction

+
+

1.1 Introduction

In this part, diagonal control using both the SVD and the Jacobian matrices are applied on a gravimeter model:

    -
  • Section 1.2: the model is described and its parameters are defined.
  • -
  • Section 1.3: the plant dynamics from the actuators to the sensors is computed from a Simscape model.
  • -
  • Section 1.4: the plant is decoupled using the Jacobian matrices.
  • -
  • Section 1.5: the Singular Value Decomposition is performed on a real approximation of the plant transfer matrix and further use to decouple the system.
  • -
  • Section 1.6: the effectiveness of the decoupling is computed using the Gershorin radii
  • -
  • Section 1.7: the effectiveness of the decoupling is computed using the Relative Gain Array
  • -
  • Section 1.8: the obtained decoupled plants are compared
  • -
  • Section 1.9: the diagonal controller is developed
  • -
  • Section 1.10: the obtained closed-loop performances for the two methods are compared
  • +
  • Section 1.2: the model is described and its parameters are defined.
  • +
  • Section 1.3: the plant dynamics from the actuators to the sensors is computed from a Simscape model.
  • +
  • Section 1.4: the plant is decoupled using the Jacobian matrices.
  • +
  • Section 1.5: the Singular Value Decomposition is performed on a real approximation of the plant transfer matrix and further use to decouple the system.
  • +
  • Section 1.6: the effectiveness of the decoupling is computed using the Gershorin radii
  • +
  • Section 1.7: the effectiveness of the decoupling is computed using the Relative Gain Array
  • +
  • Section 1.8: the obtained decoupled plants are compared
  • +
  • Section 1.9: the diagonal controller is developed
  • +
  • Section 1.10: the obtained closed-loop performances for the two methods are compared
-
-

1.2 Gravimeter Model - Parameters

+
+

1.2 Gravimeter Model - Parameters

- +

-The model of the gravimeter is schematically shown in Figure 1. +The model of the gravimeter is schematically shown in Figure 1.

- -
-

1.3 System Identification

+
+

1.3 System Identification

- +

-
%% 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.

@@ -206,7 +218,7 @@ And 4 outputs (the two 2-DoF accelerometers): \end{equation} -

+

gravimeter_plant_schematic.png

Figure 3: Schematic of the gravimeter plant

@@ -252,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)
 
@@ -262,11 +274,11 @@ State-space model with 4 outputs, 3 inputs, and 6 states.

-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.

-
+

open_loop_tf.png

Figure 4: Open Loop Transfer Function from 3 Actuators to 4 Accelerometers

@@ -274,15 +286,15 @@ The bode plot of all elements of the plant are shown in Figure -

1.4 Decoupling using the Jacobian

+
+

1.4 Decoupling using the Jacobian

- +

-Consider the control architecture shown in Figure 5. +Consider the control architecture shown in Figure 5.

@@ -300,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).

-
+

gravimeter_decouple_jacobian.png

Figure 5: Decoupled plant \(\bm{G}_x\) using the Jacobian matrix \(J\)

@@ -319,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];
 
@@ -334,9 +346,9 @@ Jt = [1 0 -ha And the plant \(\bm{G}_x\) is computed:

-
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'};
 
@@ -347,11 +359,11 @@ State-space model with 3 outputs, 3 inputs, and 6 states.

-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.

-
+

gravimeter_jacobian_plant.png

Figure 6: Diagonal and off-diagonal elements of \(G_x\)

@@ -359,11 +371,11 @@ The diagonal and off-diagonal elements of \(G_x\) are shown in Figure -

1.5 Decoupling using the SVD

+
+

1.5 Decoupling using the SVD

- +

@@ -374,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);
 
@@ -384,8 +396,8 @@ H1 = evalfr(G, j*
-
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))));
 
@@ -433,7 +445,7 @@ Now, the Singular Value Decomposition of \(H_1\) is performed:

-
[U,S,V] = svd(H1);
+
  [U,S,V] = svd(H1);
 
@@ -512,11 +524,11 @@ Now, the Singular Value Decomposition of \(H_1\) is performed:

-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.

-
+

gravimeter_decouple_svd.png

Figure 7: Decoupled plant \(\bm{G}_{SVD}\) using the Singular Value Decomposition

@@ -528,7 +540,7 @@ The decoupled plant is then:

-
Gsvd = inv(U)*G*inv(V');
+
  Gsvd = inv(U)*G*inv(V');
 
@@ -542,15 +554,15 @@ State-space model with 4 outputs, 3 inputs, and 6 states. The 4th output (corresponding to the null singular value) is discarded, and we only keep the \(3 \times 3\) plant:

-
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.

-
+

gravimeter_svd_plant.png

Figure 8: Diagonal and off-diagonal elements of \(G_{svd}\)

@@ -558,11 +570,11 @@ The diagonal and off-diagonal elements of the “SVD” plant are shown
-
-

1.6 Verification of the decoupling using the “Gershgorin Radii”

+
+

1.6 Verification of the decoupling using the “Gershgorin Radii”

- +

@@ -575,7 +587,7 @@ The “Gershgorin Radii” of a matrix \(S\) is defined by:

-
+

gravimeter_gershgorin_radii.png

Figure 9: Gershgorin Radii of the Coupled and Decoupled plants

@@ -583,11 +595,11 @@ The “Gershgorin Radii” of a matrix \(S\) is defined by:
-
-

1.7 Verification of the decoupling using the “Relative Gain Array”

+
+

1.7 Verification of the decoupling using the “Relative Gain Array”

- +

@@ -601,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.

-
+

gravimeter_rga.png

Figure 10: Obtained norm of RGA elements for the SVD decoupled plant and the Jacobian decoupled plant

@@ -619,7 +631,7 @@ The RGA-number is also a measure of diagonal dominance: \end{equation} -
+

gravimeter_rga_num.png

Figure 11: RGA-Number for the Gravimeter

@@ -627,30 +639,30 @@ The RGA-number is also a measure of diagonal dominance:
-
-

1.8 Obtained Decoupled Plants

+
+

1.8 Obtained Decoupled Plants

- +

-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.

-
+

gravimeter_decoupled_plant_svd.png

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.

-
+

gravimeter_decoupled_plant_jacobian.png

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)

@@ -658,12 +670,12 @@ Similarly, the bode plots of the diagonal elements and off-diagonal elements of
-
-

1.9 Diagonal Controller

+
+

1.9 Diagonal Controller

- -The control diagram for the centralized control is shown in Figure 14. + +The control diagram for the centralized control is shown in Figure 14.

@@ -672,19 +684,19 @@ The Jacobian is used to convert forces in the cartesian frame to forces applied

-
+

centralized_control_gravimeter.png

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\).

-
+

svd_control_gravimeter.png

Figure 15: Control Diagram for the SVD control

@@ -701,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.

-
+

gravimeter_comp_loop_gain_diagonal.png

Figure 16: Comparison of the diagonal elements of the loop gains for the SVD control architecture and the Jacobian one

@@ -734,18 +746,18 @@ The obtained diagonal elements of the loop gains are shown in Figure -

1.10 Closed-Loop system Performances

+
+

1.10 Closed-Loop system Performances

- +

Let’s first verify the stability of the closed-loop systems:

-
isstable(G_cen)
+
  isstable(G_cen)
 
@@ -757,7 +769,7 @@ ans =
-
isstable(G_svd)
+
  isstable(G_svd)
 
@@ -769,18 +781,18 @@ ans =

-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.

-
+

gravimeter_platform_simscape_cl_transmissibility.png

Figure 17: Obtained Transmissibility

-
+

gravimeter_cl_transmissibility_coupling.png

Figure 18: Obtain coupling terms of the transmissibility matrix

@@ -789,15 +801,15 @@ The obtained transmissibility in Open-loop, for the centralized control as well
-
-

1.11 Robustness to a change of actuator position

+
+

1.11 Robustness to a change of actuator position

Let 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]
 
@@ -810,7 +822,7 @@ The closed-loop system are still stable, and their

-
+

gravimeter_transmissibility_offset_act.png

Figure 19: Transmissibility for the initial CL system and when the position of actuators are changed

@@ -818,8 +830,8 @@ The closed-loop system are still stable, and their
-
-

1.12 Combined / comparison of K and M decoupling

+
+

1.12 Combined / comparison of K and M decoupling

If 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. @@ -840,39 +852,39 @@ To do so, the actuators (springs) should be positioned such that the stiffness m

-
-

1.12.1 Decoupling of the mass matrix

+
+

1.12.1 Decoupling of the mass matrix

-
+

gravimeter_model_M.png

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'};
 
@@ -880,26 +892,26 @@ G.OutputName = {'Ax1', Decoupling at the CoM (Mass decoupled)

-
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'};
 
-
+

jac_decoupling_M.png

Figure 21: Diagonal and off-diagonal elements of the decoupled plant

@@ -907,11 +919,11 @@ GM.OutputName = {'Dx',
-
-

1.12.2 Decoupling of the stiffness matrix

+
+

1.12.2 Decoupling of the stiffness matrix

-
+

gravimeter_model_K.png

Figure 22: Choice of {O} such that the Stiffness Matrix is Diagonal

@@ -921,14 +933,14 @@ GM.OutputName = {'Dx',
-
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];
 
@@ -936,14 +948,14 @@ JKt = [1 0 0 And the plant \(\bm{G}_x\) is computed:

-
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'};
 
-
+

jac_decoupling_K.png

Figure 23: Diagonal and off-diagonal elements of the decoupled plant

@@ -951,11 +963,11 @@ GK.OutputName = {'Dx',
-
-

1.12.3 Combined decoupling of the mass and stiffness matrices

+
+

1.12.3 Combined decoupling of the mass and stiffness matrices

-
+

gravimeter_model_KM.png

Figure 24: Ideal location of the actuators such that both the mass and stiffness matrices are diagonal

@@ -966,52 +978,52 @@ To do so, the actuator position should be modified

-
la = 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'};
 
-
+

jac_decoupling_KM.png

Figure 25: Diagonal and off-diagonal elements of the decoupled plant

@@ -1019,8 +1031,8 @@ GKM.OutputName = {'Dx', -

1.12.4 Conclusion

+
+

1.12.4 Conclusion

Ideally, the mechanical system should be designed in order to have a decoupled stiffness matrix at the CoM of the solid. @@ -1034,8 +1046,8 @@ Or it can be decoupled at high frequency if the Jacobians are evaluated at the C

-
-

1.13 SVD decoupling performances

+
+

1.13 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. @@ -1046,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)]
 
-
+

gravimeter_svd_low_damping.png

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)]
 
-
+

gravimeter_svd_high_damping.png

Figure 27: Diagonal and off-diagonal term when decoupling with SVD on the gravimeter with high damping

@@ -1078,14 +1090,14 @@ Now take a larger damping, the obtained diagonal and off-diagonal terms are show
-
-

2 Stewart Platform - Simscape Model

+
+

2 Stewart Platform - Simscape Model

- +

-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.

@@ -1098,7 +1110,7 @@ Some notes about the system: -

+

SP_assembly.png

Figure 28: Stewart Platform CAD View

@@ -1108,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:

    -
  • Section 2.1: The parameters of the Simscape model of the Stewart platform are defined
  • -
  • Section 2.2: The plant is identified from the Simscape model and the system coupling is shown
  • -
  • Section 2.3: The plant is first decoupled using the Jacobian
  • -
  • Section 2.4: The decoupling is performed thanks to the SVD. To do so a real approximation of the plant is computed.
  • -
  • Section 2.5: The effectiveness of the decoupling with the Jacobian and SVD are compared using the Gershorin Radii
  • -
  • Section 2.6:
  • -
  • Section 2.7: The dynamics of the decoupled plants are shown
  • -
  • Section 2.8: A diagonal controller is defined to control the decoupled plant
  • -
  • Section 2.9: Finally, the closed loop system properties are studied
  • +
  • Section 2.1: The parameters of the Simscape model of the Stewart platform are defined
  • +
  • Section 2.2: The plant is identified from the Simscape model and the system coupling is shown
  • +
  • Section 2.3: The plant is first decoupled using the Jacobian
  • +
  • Section 2.4: The decoupling is performed thanks to the SVD. To do so a real approximation of the plant is computed.
  • +
  • Section 2.5: The effectiveness of the decoupling with the Jacobian and SVD are compared using the Gershorin Radii
  • +
  • Section 2.6:
  • +
  • Section 2.7: The dynamics of the decoupled plants are shown
  • +
  • Section 2.8: A diagonal controller is defined to control the decoupled plant
  • +
  • Section 2.9: Finally, the closed loop system properties are studied
-
-

2.1 Simscape Model - Parameters

+
+

2.1 Simscape Model - Parameters

- +

-
open('drone_platform.slx');
+
  open('drone_platform.slx');
 
@@ -1135,13 +1147,13 @@ The analysis of the SVD/Jacobian control applied to the Stewart platform is perf Definition of spring parameters:

-
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;
 
@@ -1149,7 +1161,7 @@ cz = 0.025; We suppose the sensor is perfectly positioned.

-
sens_pos_error = zeros(3,1);
+
  sens_pos_error = zeros(3,1);
 
@@ -1157,7 +1169,7 @@ We suppose the sensor is perfectly positioned. Gravity:

-
g = 0;
+
  g = 0;
 
@@ -1165,7 +1177,7 @@ Gravity: We load the Jacobian (previously computed from the geometry):

-
load('jacobian.mat', 'Aa', 'Ab', 'As', 'l', 'J');
+
  load('jacobian.mat', 'Aa', 'Ab', 'As', 'l', 'J');
 
@@ -1173,21 +1185,21 @@ We load the Jacobian (previously computed from the geometry): We initialize other parameters:

-
U = eye(6);
-V = eye(6);
-Kc = tf(zeros(6));
+
  U = eye(6);
+  V = eye(6);
+  Kc = tf(zeros(6));
 
-
+

stewart_simscape.png

Figure 29: General view of the Simscape Model

-
+

stewart_platform_details.png

Figure 30: Simscape model of the Stewart platform

@@ -1195,15 +1207,15 @@ Kc = tf(zeros(6));
-
-

2.2 Identification of the plant

+
+

2.2 Identification of the plant

- +

-The plant shown in Figure 31 is identified from the Simscape model. +The plant shown in Figure 31 is identified from the Simscape model.

@@ -1219,31 +1231,31 @@ The outputs are the 6 accelerations measured by the inertial unit.

-
+

stewart_platform_plant.png

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'});
 
@@ -1251,7 +1263,7 @@ Gd = G(:, {'Dwx', There are 24 states (6dof for the bottom platform + 6dof for the top platform).

-
size(G)
+
  size(G)
 
@@ -1261,7 +1273,7 @@ State-space model with 6 outputs, 12 inputs, and 24 states.

-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.

@@ -1269,7 +1281,7 @@ One can easily see that the system is strongly coupled.

-
+

stewart_platform_coupled_plant.png

Figure 32: Magnitude of all 36 elements of the transfer function matrix \(G_u\)

@@ -1277,12 +1289,12 @@ One can easily see that the system is strongly coupled.
-
-

2.3 Decoupling using the Jacobian

+
+

2.3 Decoupling using the Jacobian

- -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.

@@ -1364,7 +1376,7 @@ The Jacobian matrix is computed from the geometry of the platform (position and -
+

plant_decouple_jacobian.png

Figure 33: Decoupled plant \(\bm{G}_x\) using the Jacobian matrix \(J\)

@@ -1380,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'};
 
-
-

2.4 Decoupling using the SVD

+
+

2.4 Decoupling using the SVD

- +

@@ -1402,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);
 
@@ -1412,8 +1424,8 @@ H1 = evalfr(Gu, j*
-
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))));
 
@@ -1576,7 +1588,7 @@ Now, the Singular Value Decomposition of \(H_1\) is performed:

-
[U,~,V] = svd(H1);
+
  [U,~,V] = svd(H1);
 
@@ -1727,11 +1739,11 @@ Now, the Singular Value Decomposition of \(H_1\) is performed:

-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.

-
+

plant_decouple_svd.png

Figure 34: Decoupled plant \(\bm{G}_{SVD}\) using the Singular Value Decomposition

@@ -1743,17 +1755,17 @@ The decoupled plant is then:

-
Gsvd = inv(U)*Gu*inv(V');
+
  Gsvd = inv(U)*Gu*inv(V');
 
-
-

2.5 Verification of the decoupling using the “Gershgorin Radii”

+
+

2.5 Verification of the decoupling using the “Gershgorin Radii”

- +

@@ -1769,7 +1781,7 @@ The “Gershgorin Radii” of a matrix \(S\) is defined by: This is computed over the following frequencies.

-
+

simscape_model_gershgorin_radii.png

Figure 35: Gershgorin Radii of the Coupled and Decoupled plants

@@ -1777,11 +1789,11 @@ This is computed over the following frequencies.
-
-

2.6 Verification of the decoupling using the “Relative Gain Array”

+
+

2.6 Verification of the decoupling using the “Relative Gain Array”

- +

@@ -1795,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.

-
+

simscape_model_rga.png

Figure 36: Obtained norm of RGA elements for the SVD decoupled plant and the Jacobian decoupled plant

@@ -1807,30 +1819,30 @@ The obtained RGA elements are shown in Figure 36.
-
-

2.7 Obtained Decoupled Plants

+
+

2.7 Obtained Decoupled Plants

- +

-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.

-
+

simscape_model_decoupled_plant_svd.png

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.

-
+

simscape_model_decoupled_plant_jacobian.png

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)

@@ -1838,12 +1850,12 @@ Similarly, the bode plots of the diagonal elements and off-diagonal elements of
-
-

2.8 Diagonal Controller

+
+

2.8 Diagonal Controller

- -The control diagram for the centralized control is shown in Figure 39. + +The control diagram for the centralized control is shown in Figure 39.

@@ -1852,19 +1864,19 @@ The Jacobian is used to convert forces in the cartesian frame to forces applied

-
+

centralized_control.png

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\).

-
+

svd_control.png

Figure 40: Control Diagram for the SVD control

@@ -1881,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.

-
+

stewart_comp_loop_gain_diagonal.png

Figure 41: Comparison of the diagonal elements of the loop gains for the SVD control architecture and the Jacobian one

@@ -1913,18 +1925,18 @@ The obtained diagonal elements of the loop gains are shown in Figure -

2.9 Closed-Loop system Performances

+
+

2.9 Closed-Loop system Performances

- +

Let’s first verify the stability of the closed-loop systems:

-
isstable(G_cen)
+
  isstable(G_cen)
 
@@ -1936,7 +1948,7 @@ ans =
-
isstable(G_svd)
+
  isstable(G_svd)
 
@@ -1948,11 +1960,11 @@ ans =

-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.

-
+

stewart_platform_simscape_cl_transmissibility.png

Figure 42: Obtained Transmissibility

@@ -1963,7 +1975,7 @@ The obtained transmissibility in Open-loop, for the centralized control as well

Author: Dehaeze Thomas

-

Created: 2020-12-10 jeu. 13:51

+

Created: 2021-01-08 ven. 13:57

diff --git a/index.org b/index.org index 2265fab..7754166 100644 --- a/index.org +++ b/index.org @@ -41,6 +41,12 @@ #+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png") :END: +#+begin_export html +
+

This report is also available as a pdf.

+
+#+end_export + * Introduction :ignore: In this document, the use of the Jacobian matrix and the Singular Value Decomposition to render a physical plant diagonal dominant is studied.