diff --git a/inkscape/figs/campbell_diagram.svg b/inkscape/figs/campbell_diagram.svg new file mode 100644 index 0000000..75a74ae Binary files /dev/null and b/inkscape/figs/campbell_diagram.svg differ diff --git a/inkscape/figs/comp_compliance.svg b/inkscape/figs/comp_compliance.svg new file mode 100644 index 0000000..8b14753 Binary files /dev/null and b/inkscape/figs/comp_compliance.svg differ diff --git a/inkscape/figs/comp_root_locus.svg b/inkscape/figs/comp_root_locus.svg new file mode 100644 index 0000000..1866c61 Binary files /dev/null and b/inkscape/figs/comp_root_locus.svg differ diff --git a/inkscape/figs/comp_transmissibility.svg b/inkscape/figs/comp_transmissibility.svg new file mode 100644 index 0000000..2eb7868 Binary files /dev/null and b/inkscape/figs/comp_transmissibility.svg differ diff --git a/inkscape/figs/loop_gain_modified_iff.svg b/inkscape/figs/loop_gain_modified_iff.svg new file mode 100644 index 0000000..010d67d Binary files /dev/null and b/inkscape/figs/loop_gain_modified_iff.svg differ diff --git a/inkscape/figs/plant_compare_rotating_speed.svg b/inkscape/figs/plant_compare_rotating_speed.svg new file mode 100644 index 0000000..d140888 Binary files /dev/null and b/inkscape/figs/plant_compare_rotating_speed.svg differ diff --git a/inkscape/figs/plant_iff_compare_rotating_speed.svg b/inkscape/figs/plant_iff_compare_rotating_speed.svg new file mode 100644 index 0000000..c2dfdb3 Binary files /dev/null and b/inkscape/figs/plant_iff_compare_rotating_speed.svg differ diff --git a/inkscape/figs/plant_iff_kp.svg b/inkscape/figs/plant_iff_kp.svg new file mode 100644 index 0000000..538ecf3 Binary files /dev/null and b/inkscape/figs/plant_iff_kp.svg differ diff --git a/inkscape/figs/root_locus_dvf.svg b/inkscape/figs/root_locus_dvf.svg new file mode 100644 index 0000000..f32cfa5 Binary files /dev/null and b/inkscape/figs/root_locus_dvf.svg differ diff --git a/inkscape/figs/root_locus_iff_kp.svg b/inkscape/figs/root_locus_iff_kp.svg new file mode 100644 index 0000000..3778f8c Binary files /dev/null and b/inkscape/figs/root_locus_iff_kp.svg differ diff --git a/inkscape/figs/root_locus_iff_kp_bis.svg b/inkscape/figs/root_locus_iff_kp_bis.svg new file mode 100644 index 0000000..44e467b Binary files /dev/null and b/inkscape/figs/root_locus_iff_kp_bis.svg differ diff --git a/inkscape/figs/root_locus_iff_kps.svg b/inkscape/figs/root_locus_iff_kps.svg new file mode 100644 index 0000000..97ad1ec Binary files /dev/null and b/inkscape/figs/root_locus_iff_kps.svg differ diff --git a/inkscape/figs/root_locus_modified_iff.svg b/inkscape/figs/root_locus_modified_iff.svg new file mode 100644 index 0000000..017c06f Binary files /dev/null and b/inkscape/figs/root_locus_modified_iff.svg differ diff --git a/inkscape/figs/root_locus_opt_gain_iff_kp.svg b/inkscape/figs/root_locus_opt_gain_iff_kp.svg new file mode 100644 index 0000000..99b6271 Binary files /dev/null and b/inkscape/figs/root_locus_opt_gain_iff_kp.svg differ diff --git a/inkscape/figs/root_locus_pure_iff.svg b/inkscape/figs/root_locus_pure_iff.svg new file mode 100644 index 0000000..be00614 Binary files /dev/null and b/inkscape/figs/root_locus_pure_iff.svg differ diff --git a/inkscape/figs/root_locus_wi_modified_iff.svg b/inkscape/figs/root_locus_wi_modified_iff.svg new file mode 100644 index 0000000..2d1cb42 Binary files /dev/null and b/inkscape/figs/root_locus_wi_modified_iff.svg differ diff --git a/matlab/figs-inkscape b/matlab/figs-inkscape new file mode 120000 index 0000000..4ac36b0 --- /dev/null +++ b/matlab/figs-inkscape @@ -0,0 +1 @@ +../inkscape/figs \ No newline at end of file diff --git a/matlab/figs/campbell_diagram.pdf b/matlab/figs/campbell_diagram.pdf index c6f8d07..6f40a79 100644 Binary files a/matlab/figs/campbell_diagram.pdf and b/matlab/figs/campbell_diagram.pdf differ diff --git a/matlab/figs/campbell_diagram.png b/matlab/figs/campbell_diagram.png index da34964..63674ed 100644 Binary files a/matlab/figs/campbell_diagram.png and b/matlab/figs/campbell_diagram.png differ diff --git a/matlab/figs/comp_compliance.pdf b/matlab/figs/comp_compliance.pdf index 84a153b..0126839 100644 Binary files a/matlab/figs/comp_compliance.pdf and b/matlab/figs/comp_compliance.pdf differ diff --git a/matlab/figs/comp_compliance.png b/matlab/figs/comp_compliance.png index 1e0e147..2bc0c36 100644 Binary files a/matlab/figs/comp_compliance.png and b/matlab/figs/comp_compliance.png differ diff --git a/matlab/figs/comp_root_locus.pdf b/matlab/figs/comp_root_locus.pdf index 221b261..c3a7da8 100644 Binary files a/matlab/figs/comp_root_locus.pdf and b/matlab/figs/comp_root_locus.pdf differ diff --git a/matlab/figs/comp_root_locus.png b/matlab/figs/comp_root_locus.png index 8a94dba..6994aa1 100644 Binary files a/matlab/figs/comp_root_locus.png and b/matlab/figs/comp_root_locus.png differ diff --git a/matlab/figs/comp_transmissibility.pdf b/matlab/figs/comp_transmissibility.pdf index fa8abf7..456aefa 100644 Binary files a/matlab/figs/comp_transmissibility.pdf and b/matlab/figs/comp_transmissibility.pdf differ diff --git a/matlab/figs/comp_transmissibility.png b/matlab/figs/comp_transmissibility.png index 04af673..392574e 100644 Binary files a/matlab/figs/comp_transmissibility.png and b/matlab/figs/comp_transmissibility.png differ diff --git a/matlab/figs/loop_gain_modified_iff.pdf b/matlab/figs/loop_gain_modified_iff.pdf index 4f6eb6a..708132d 100644 Binary files a/matlab/figs/loop_gain_modified_iff.pdf and b/matlab/figs/loop_gain_modified_iff.pdf differ diff --git a/matlab/figs/loop_gain_modified_iff.png b/matlab/figs/loop_gain_modified_iff.png index 564d28b..b040bb5 100644 Binary files a/matlab/figs/loop_gain_modified_iff.png and b/matlab/figs/loop_gain_modified_iff.png differ diff --git a/matlab/figs/mod_iff_damping_wi.pdf b/matlab/figs/mod_iff_damping_wi.pdf index b9332ee..ad1abae 100644 Binary files a/matlab/figs/mod_iff_damping_wi.pdf and b/matlab/figs/mod_iff_damping_wi.pdf differ diff --git a/matlab/figs/mod_iff_damping_wi.png b/matlab/figs/mod_iff_damping_wi.png index 7766753..81c07b7 100644 Binary files a/matlab/figs/mod_iff_damping_wi.png and b/matlab/figs/mod_iff_damping_wi.png differ diff --git a/matlab/figs/plant_compare_rotating_speed.pdf b/matlab/figs/plant_compare_rotating_speed.pdf index fb7743d..35686d6 100644 Binary files a/matlab/figs/plant_compare_rotating_speed.pdf and b/matlab/figs/plant_compare_rotating_speed.pdf differ diff --git a/matlab/figs/plant_compare_rotating_speed.png b/matlab/figs/plant_compare_rotating_speed.png index 03bf227..05a2295 100644 Binary files a/matlab/figs/plant_compare_rotating_speed.png and b/matlab/figs/plant_compare_rotating_speed.png differ diff --git a/matlab/figs/plant_dvf_comp_simscape_analytical.pdf b/matlab/figs/plant_dvf_comp_simscape_analytical.pdf index 0951198..552a430 100644 Binary files a/matlab/figs/plant_dvf_comp_simscape_analytical.pdf and b/matlab/figs/plant_dvf_comp_simscape_analytical.pdf differ diff --git a/matlab/figs/plant_iff_comp_simscape_analytical.pdf b/matlab/figs/plant_iff_comp_simscape_analytical.pdf index 61dc107..db01b44 100644 Binary files a/matlab/figs/plant_iff_comp_simscape_analytical.pdf and b/matlab/figs/plant_iff_comp_simscape_analytical.pdf differ diff --git a/matlab/figs/plant_iff_comp_simscape_analytical.png b/matlab/figs/plant_iff_comp_simscape_analytical.png index 94d5dc9..a13e798 100644 Binary files a/matlab/figs/plant_iff_comp_simscape_analytical.png and b/matlab/figs/plant_iff_comp_simscape_analytical.png differ diff --git a/matlab/figs/plant_iff_compare_rotating_speed.pdf b/matlab/figs/plant_iff_compare_rotating_speed.pdf index 8392333..b4522f5 100644 Binary files a/matlab/figs/plant_iff_compare_rotating_speed.pdf and b/matlab/figs/plant_iff_compare_rotating_speed.pdf differ diff --git a/matlab/figs/plant_iff_compare_rotating_speed.png b/matlab/figs/plant_iff_compare_rotating_speed.png index d3a9016..36f4687 100644 Binary files a/matlab/figs/plant_iff_compare_rotating_speed.png and b/matlab/figs/plant_iff_compare_rotating_speed.png differ diff --git a/matlab/figs/plant_iff_kp.pdf b/matlab/figs/plant_iff_kp.pdf index aed1698..906402a 100644 Binary files a/matlab/figs/plant_iff_kp.pdf and b/matlab/figs/plant_iff_kp.pdf differ diff --git a/matlab/figs/plant_iff_kp.png b/matlab/figs/plant_iff_kp.png index 1fa4e32..9db8664 100644 Binary files a/matlab/figs/plant_iff_kp.png and b/matlab/figs/plant_iff_kp.png differ diff --git a/matlab/figs/plant_iff_kp_comp_simscape_analytical.pdf b/matlab/figs/plant_iff_kp_comp_simscape_analytical.pdf new file mode 100644 index 0000000..33da484 Binary files /dev/null and b/matlab/figs/plant_iff_kp_comp_simscape_analytical.pdf differ diff --git a/matlab/figs/plant_iff_kp_comp_simscape_analytical.png b/matlab/figs/plant_iff_kp_comp_simscape_analytical.png new file mode 100644 index 0000000..7a70be5 Binary files /dev/null and b/matlab/figs/plant_iff_kp_comp_simscape_analytical.png differ diff --git a/matlab/figs/plant_simscape_analytical.pdf b/matlab/figs/plant_simscape_analytical.pdf index 651c29b..e1e17ea 100644 Binary files a/matlab/figs/plant_simscape_analytical.pdf and b/matlab/figs/plant_simscape_analytical.pdf differ diff --git a/matlab/figs/root_locus_dvf.pdf b/matlab/figs/root_locus_dvf.pdf index 236747e..335132a 100644 Binary files a/matlab/figs/root_locus_dvf.pdf and b/matlab/figs/root_locus_dvf.pdf differ diff --git a/matlab/figs/root_locus_dvf.png b/matlab/figs/root_locus_dvf.png index 0e237d9..1d29114 100644 Binary files a/matlab/figs/root_locus_dvf.png and b/matlab/figs/root_locus_dvf.png differ diff --git a/matlab/figs/root_locus_iff_kp.pdf b/matlab/figs/root_locus_iff_kp.pdf index 99719e1..c4f2f49 100644 Binary files a/matlab/figs/root_locus_iff_kp.pdf and b/matlab/figs/root_locus_iff_kp.pdf differ diff --git a/matlab/figs/root_locus_iff_kp.png b/matlab/figs/root_locus_iff_kp.png index aebae3c..1e737c3 100644 Binary files a/matlab/figs/root_locus_iff_kp.png and b/matlab/figs/root_locus_iff_kp.png differ diff --git a/matlab/figs/root_locus_iff_kps.pdf b/matlab/figs/root_locus_iff_kps.pdf index 77219cd..03ea681 100644 Binary files a/matlab/figs/root_locus_iff_kps.pdf and b/matlab/figs/root_locus_iff_kps.pdf differ diff --git a/matlab/figs/root_locus_iff_kps.png b/matlab/figs/root_locus_iff_kps.png index 56ff623..a6a189c 100644 Binary files a/matlab/figs/root_locus_iff_kps.png and b/matlab/figs/root_locus_iff_kps.png differ diff --git a/matlab/figs/root_locus_modified_iff.pdf b/matlab/figs/root_locus_modified_iff.pdf index 92c36f3..ab4aa8a 100644 Binary files a/matlab/figs/root_locus_modified_iff.pdf and b/matlab/figs/root_locus_modified_iff.pdf differ diff --git a/matlab/figs/root_locus_modified_iff.png b/matlab/figs/root_locus_modified_iff.png index d64ef41..9093b51 100644 Binary files a/matlab/figs/root_locus_modified_iff.png and b/matlab/figs/root_locus_modified_iff.png differ diff --git a/matlab/figs/root_locus_opt_gain_iff_kp.pdf b/matlab/figs/root_locus_opt_gain_iff_kp.pdf index d8693c3..3ca60c6 100644 Binary files a/matlab/figs/root_locus_opt_gain_iff_kp.pdf and b/matlab/figs/root_locus_opt_gain_iff_kp.pdf differ diff --git a/matlab/figs/root_locus_opt_gain_iff_kp.png b/matlab/figs/root_locus_opt_gain_iff_kp.png index e21353e..41bba36 100644 Binary files a/matlab/figs/root_locus_opt_gain_iff_kp.png and b/matlab/figs/root_locus_opt_gain_iff_kp.png differ diff --git a/matlab/figs/root_locus_pure_iff.pdf b/matlab/figs/root_locus_pure_iff.pdf index 13dac96..cef0739 100644 Binary files a/matlab/figs/root_locus_pure_iff.pdf and b/matlab/figs/root_locus_pure_iff.pdf differ diff --git a/matlab/figs/root_locus_pure_iff.png b/matlab/figs/root_locus_pure_iff.png index c9daebd..8a5ac5f 100644 Binary files a/matlab/figs/root_locus_pure_iff.png and b/matlab/figs/root_locus_pure_iff.png differ diff --git a/matlab/figs/root_locus_wi_modified_iff.pdf b/matlab/figs/root_locus_wi_modified_iff.pdf index 1c4741e..9cc1dad 100644 Binary files a/matlab/figs/root_locus_wi_modified_iff.pdf and b/matlab/figs/root_locus_wi_modified_iff.pdf differ diff --git a/matlab/figs/root_locus_wi_modified_iff.png b/matlab/figs/root_locus_wi_modified_iff.png index 6d95f72..32899a2 100644 Binary files a/matlab/figs/root_locus_wi_modified_iff.png and b/matlab/figs/root_locus_wi_modified_iff.png differ diff --git a/matlab/index.html b/matlab/index.html index c6922ad..a40bdc3 100644 --- a/matlab/index.html +++ b/matlab/index.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- +-The system consists of one 2 degree of freedom translation stage on top of a spindle (figure 1). +The system consists of one 2 degree of freedom translation stage on top of a spindle (figure 1).
--
Figure 1: Figure caption
+Figure 1: Schematic of the studied system
@@ -141,33 +163,48 @@ The measurement is either the \(x-y\) displacement of the object located on top
-Based on the Figure 1, the equations of motions are: +Based on the Figure 1, the equations of motions are:
+With: +
+\begin{align} + G_{dp} &= \left( \frac{s^2}{{\omega_0}^2} + 2 \xi \frac{s}{\omega_0} + 1 - \frac{{\Omega}^2}{{\omega_0}^2} \right)^2 + \left( 2 \frac{\Omega}{\omega_0} \frac{s}{\omega_0} \right)^2 \\ + G_{dz} &= \frac{s^2}{{\omega_0}^2} + 2 \xi \frac{s}{\omega_0} + 1 - \frac{{\Omega}^2}{{\omega_0}^2} \\ + G_{dc} &= 2 \frac{\Omega}{\omega_0} \frac{s}{\omega_0} +\end{align}Explain Coriolis and Centrifugal Forces (negative Stiffness) +=> First write the equations in terms of \(k\), \(m\) and \(c\) and explain the terms.
Let’s define initial values for the model. @@ -187,19 +224,19 @@ w0 = sqrt(k/m); % [rad/s]
The Campbell Diagram displays the evolution of the real and imaginary parts of the system as a function of the rotating speed.
-It is shown in Figure 2, and one can see that the system becomes unstable for \(\Omega > \omega_0\) (the real part of one of the poles becomes positive). +It is shown in Figure 2, and one can see that the system becomes unstable for \(\Omega > \omega_0\) (the real part of one of the poles becomes positive).
-
Figure 2: Campbell Diagram
@@ -207,8 +244,8 @@ It is shown in Figure 2, and one can see that the systDefine the rotating speed for the Simscape Model. @@ -244,8 +281,8 @@ G.OutputName = {'du', 'dv'};
The same transfer function from \([F_u, F_v]\) to \([d_u, d_v]\) is written down from the analytical model. @@ -258,11 +295,11 @@ The same transfer function from \([F_u, F_v]\) to \([d_u, d_v]\) is written down
-Both transfer functions are compared in Figure 3 and are found to perfectly match. +Both transfer functions are compared in Figure 3 and are found to perfectly match.
-
Figure 3: Bode plot of the transfer function from \([F_u, F_v]\) to \([d_u, d_v]\) as identified from the Simscape model and from an analytical model
@@ -270,8 +307,8 @@ Both transfer functions are compared in Figure 3 and aThe transfer functions from \([F_u, F_v]\) to \([d_u, d_v]\) are identified for the following rotating speeds. @@ -295,11 +332,11 @@ end
-They are compared in Figure 4. +They are compared in Figure 4.
-
Figure 4: Comparison of the transfer functions from \([F_u, F_v]\) to \([d_u, d_v]\) for several rotating speed
@@ -308,11 +345,11 @@ They are compared in Figure 4.Let’s define initial values for the model. @@ -341,8 +378,8 @@ w0 = sqrt(k/m); % [rad/s]
The sensed forces are equal to: @@ -363,20 +400,32 @@ Which then gives:
The rotation speed is set to \(\Omega = 0.1 \omega_0\). @@ -411,8 +460,8 @@ Giff.OutputName = {'fu', 'fv'};
The same transfer function from \([F_u, F_v]\) to \([f_u, f_v]\) is written down from the analytical model. @@ -425,11 +474,11 @@ The same transfer function from \([F_u, F_v]\) to \([f_u, f_v]\) is written down
-The two are compared in Figure 5 and found to perfectly match. +The two are compared in Figure 5 and found to perfectly match.
-
Figure 5: Comparison of the transfer functions from \([F_u, F_v]\) to \([f_u, f_v]\) between the Simscape model and the analytical one
@@ -437,8 +486,8 @@ The two are compared in Figure 5 and found to perfectlThe transfer functions from \([F_u, F_v]\) to \([f_u, f_v]\) are identified for the following rotating speeds. @@ -462,10 +511,10 @@ end
-The obtained transfer functions are shown in Figure 6. +The obtained transfer functions are shown in Figure 6.
-
Figure 6: Comparison of the transfer functions from \([F_u, F_v]\) to \([f_u, f_v]\) for several rotating speed
@@ -473,8 +522,8 @@ The obtained transfer functions are shown in Figure 6.Let’s take \(\Omega = \frac{\omega_0}{10}\). @@ -488,7 +537,6 @@ Let’s take \(\Omega = \frac{\omega_0}{10}\).
Giff = 1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ... [(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ... (2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2]; -
-The Root Locus (evolution of the poles of the closed loop system in the complex plane as a function of \(g\)) is shown in Figure 7. +The Root Locus (evolution of the poles of the closed loop system in the complex plane as a function of \(g\)) is shown in Figure 7. It is shown that for non-null rotating speed, one pole is bound to the right-half plane, and thus the closed loop system is unstable.
-
Figure 7: Root Locus for the Decentralized Integral Force Feedback controller. Several rotating speed are shown.
W = 0.1; + +Giff = 1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ... + [(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ... + (2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2]; +g = 1; + +gains = logspace(-2, 4, 100); + +poles = zeros(length(pole(minreal(feedback(Giff, g/s*eye(2))))), length(gains)); +poles(:, 1) = pole(minreal(feedback(Giff, gains(1)/s*eye(2)))); +poles(:, 2) = pole(minreal(feedback(Giff, gains(2)/s*eye(2)))); +% poles(:, 2) = poles(:, 1); + +for g_i = 3:length(gains) + poles_est = poles(:, g_i-1) + (poles(:, g_i-1) - poles(:, g_i-2))*(gains(g_i) - gains(g_i-1))/(gains(g_i-1) - gains(g_i - 2)); + poles_est = poles(:, g_i-1); + + poles_gi = pole(minreal(feedback(Giff, gains(g_i)/s*eye(2)))); + + % Array of distances between all the poles + poles_dist = (poles_est-poles_gi.').*conj(poles_est-poles_gi.'); + [~, c] = sort(min(poles_dist)); + poles_dist = poles_dist(:, c); + + for p_i = 1:size(poles_dist, 1) + [~, a_i] = min(poles_dist(:, p_i)); + + poles(c(p_i), g_i) = poles_gi(a_i); + poles_dist(a_i, :) = []; + poles_gi(a_i, :) = []; + end +end +
+Working +
+W = 0.1; + +Giff = 1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ... + [(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ... + (2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2]; + +gains = logspace(-2, 4, 500); + +poles = zeros(length(pole(feedback(Giff, 1/s*eye(2)))), length(gains)); +poles(:, 1) = pole(feedback(Giff, gains(1)/s*eye(2))); +poles(:, 2) = pole(feedback(Giff, gains(2)/s*eye(2))); +% poles(:, 2) = poles(:, 1); + +for g_i = 3:length(gains) + % poles_est = poles(:, g_i-1) + (poles(:, g_i-1) - poles(:, g_i-2))*(gains(g_i) - gains(g_i-1))/(gains(g_i-1) - gains(g_i - 2)); + poles_est = poles(:, g_i-1); + poles_gi = pole(feedback(Giff, gains(g_i)/s*eye(2))); + + % Array of distances between all the poles + poles_dist = sqrt((poles_est-poles_gi.').*conj(poles_est-poles_gi.')); + + % Columns of distances are sorted from lowest to highest + [~, c] = sort(min(poles_dist)); + poles_dist = poles_dist(:, c); + + % for each column of poles_dist corresponding to the i'th pole + % with closest previous poles + for p_i = 1:size(poles_dist, 2) + % Get the indice a_i of the previous pole that is the closest + % to pole c(p_i) + [~, a_i] = min(poles_dist(:, p_i)); + + poles(a_i, g_i) = poles_gi(c(p_i)); + + % poles_dist(a_i, :) = []; + % poles_gi(a_i, :) = []; + end +end ++
W = 0.1; + +Giff = 1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ... + [(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ... + (2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2]; + +gains = logspace(-2, 4, 500); + +poles = zeros(length(pole(feedback(Giff, 1/s*eye(2)))), length(gains)); +poles(:, 1) = pole(feedback(Giff, gains(1)/s*eye(2))); +poles(:, 2) = pole(feedback(Giff, gains(2)/s*eye(2))); + +for g_i = 3:length(gains) + % Estimated value of the poles + poles_est = poles(:, g_i-1) + (poles(:, g_i-1) - poles(:, g_i-2))*(gains(g_i) - gains(g_i-1))/(gains(g_i-1) - gains(g_i - 2)); + + % New values for the poles + poles_gi = pole(feedback(Giff, gains(g_i)/s*eye(2))); + + % Array of distances between all the poles + poles_dist = sqrt((poles_est-poles_gi.').*conj(poles_est-poles_gi.')); + + % Get indices corresponding to distances from lowest to highest + [~, c] = sort(min(poles_dist)); + + as = 1:length(poles_gi); + + % for each column of poles_dist corresponding to the i'th pole + % with closest previous poles + for p_i = c + % Get the indice a_i of the previous pole that is the closest + % to pole c(p_i) + [~, a_i] = min(poles_dist(:, p_i)); + + poles(as(a_i), g_i) = poles_gi(p_i); + + % Remove old poles that are already matched + % poles_gi(as(a_i), :) = []; + poles_dist(a_i, :) = []; + as(a_i) = []; + end +end ++
+How to remove poles that are not moving? +
+poles_rl = poles(max(abs(poles(:, 2:end) - poles(:, 1:end-1))') > 1e-8, :); +poles_rl = poles_rl(1:end/2, :); ++
[ ]
create a functionGiff = 1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ... + [(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ... + (2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2]; +Kiff = 1/s*eye(2); +gains = logspace(-2, 4, 500); + +[poles] = rootLocusPolesSorted(Giff, Kiff, gains, 'd_max', 1e-4); ++
Let’s define initial values for the model. @@ -556,8 +762,8 @@ w0 = sqrt(k/m); % [rad/s]
Let’s modify the initial Integral Force Feedback Controller ; instead of using pure integrators, pseudo integrators (i.e. low pass filters) are used: @@ -592,10 +798,10 @@ And the following rotating speed.
-The obtained Loop Gain is shown in Figure 8. +The obtained Loop Gain is shown in Figure 8.
-
Figure 8: Loop Gain for the modified IFF controller
@@ -603,15 +809,15 @@ The obtained Loop Gain is shown in Figure 8.-As shown in the Root Locus plot (Figure 9), for some value of the gain, the system remains stable. +As shown in the Root Locus plot (Figure 9), for some value of the gain, the system remains stable.
-
Figure 9: Root Locus for the modified IFF controller
@@ -619,11 +825,11 @@ As shown in the Root Locus plot (Figure 9), for some v-In order to visualize the effect of \(\omega_i\) on the attainable damping, the Root Locus is displayed in Figure 10 for the following \(\omega_i\): +In order to visualize the effect of \(\omega_i\) on the attainable damping, the Root Locus is displayed in Figure 10 for the following \(\omega_i\):
wis = [0.01, 0.1, 0.5, 1]*w0; % [rad/s] @@ -631,7 +837,7 @@ In order to visualize the effect of \(\omega_i\) on the attainable damping, the
Figure 10: Root Locus for the modified IFF controller (zoomed plot on the left)
@@ -650,18 +856,17 @@ For the controller The gain at which the system becomes unstable is \begin{equation} -\label{org69ac90f} - g_\text{max} = \omega_i \left( \frac{{\omega_0}^2}{\Omega_2} - 1 \right) + g_\text{max} = \omega_i \left( \frac{{\omega_0}^2}{\Omega^2} - 1 \right) \label{eq:iff_gmax} \end{equation}-While it seems that small \(\omega_i\) do allow more damping to be added to the system (Figure 10), the control gains may be limited to small values due to \eqref{eq:iff_gmax} thus reducing the attainable damping. +While it seems that small \(\omega_i\) do allow more damping to be added to the system (Figure 10), the control gains may be limited to small values due to \eqref{eq:iff_gmax} thus reducing the attainable damping.
There must be an optimum for \(\omega_i\). -To find the optimum, the gain that maximize the simultaneous damping of the mode is identified for a wide range of \(\omega_i\) (Figure 11). +To find the optimum, the gain that maximize the simultaneous damping of the mode is identified for a wide range of \(\omega_i\) (Figure 11).
wis = logspace(-2, 1, 31)*w0; % [rad/s] @@ -688,7 +893,7 @@ end
Figure 11: Simultaneous attainable damping of the closed loop poles as a function of \(\omega_i\)
@@ -698,17 +903,80 @@ end+With: +
+\begin{align} + G_{kp} &= \left( \frac{s^2}{{\omega_0^\prime}^2} + 2\xi^\prime \frac{s}{{\omega_0^\prime}^2} + 1 - \frac{\Omega}{\omega_0^\prime} \right)^2 + \left( 2 \frac{\Omega}{\omega_0^\prime}\frac{s}{\omega_0^\prime} \right)^2 \\ + G_{kz} &= \left( \frac{s^2}{{\omega_0^\prime}^2} + \frac{k_p}{k + k_p} - \frac{\Omega^2}{{\omega_0^\prime}^2} \right) \left( \frac{s^2}{{\omega_0^\prime}^2} + 2\xi^\prime \frac{s}{{\omega_0^\prime}^2} + 1 - \frac{\Omega}{\omega_0^\prime} \right) + \left( 2 \frac{\Omega}{\omega_0^\prime}\frac{s}{\omega_0^\prime} \right)^2 \\ + G_{kc} &= \left( 2 \xi^\prime \frac{s}{\omega_0^\prime} + \frac{k}{k + k_p} \right) \left( 2 \frac{\Omega}{\omega_0^\prime}\frac{s}{\omega_0^\prime} \right) +\end{align} ++where: +
+Giff_th = 1/( (m*s^2 + c*s + k + kp - m*W^2)^2 + (2*m*s*W)^2 )*[... + (m*s^2 + c*s + k + kp - m*W^2)^2 + (2*m*s*W)^2 - (c*s + k)*(m*s^2 + c*s + k + kp - m*W^2), -(c*s + k)*(2*m*s*W); + (c*s + k)*(2*m*s*W), (m*s^2 + c*s + k + kp - m*W^2)^2 + (2*m*s*W)^2 - (c*s + k)*(m*s^2 + c*s + k + kp - m*W^2) + ]; ++
w0p = sqrt((k + kp)/m); +xip = c/(2*sqrt((k+kp)*m)); + +Giff_th = 1/( (s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2)^2 + (2*(s/w0p)*(W/w0p))^2 )*[... + (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2, -(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)); + (2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)), (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2 + ]; + +Giff_th_b = 1/( (m*s^2 + c*s + k + kp - m*W^2)^2 + (2*m*s*W)^2 )*[... + (m*s^2 + c*s + k + kp - m*W^2)^2 + (2*m*s*W)^2 - (c*s + k)*(m*s^2 + c*s + k + kp - m*W^2), -(c*s + k)*(2*m*s*W); + (c*s + k)*(2*m*s*W), (m*s^2 + c*s + k + kp - m*W^2)^2 + (2*m*s*W)^2 - (c*s + k)*(m*s^2 + c*s + k + kp - m*W^2) + ]; ++
Let’s define initial values for the model.
@@ -727,11 +995,11 @@ w0 = sqrt(k/m); % [rad/s]
Figure 12: Figure caption
@@ -739,9 +1007,9 @@ w0 = sqrt(k/m); % [rad/s]-The equations should be the same as before by taking into account the additional stiffness. -It then may be better to write it in terms of \(k\), \(c\), \(m\) instead of \(\omega_0\) and \(\xi\). -
- --I just have to determine the measured force by the sensor -
-The rotation speed is set to \(\Omega = 0.1 \omega_0\). @@ -801,7 +1055,7 @@ And the IFF plant (transfer function from \([F_u, F_v]\) to \([f_u, f_v]\)) is i
-The results are shown in Figure 13. +The results are shown in Figure 13.
@@ -822,7 +1076,7 @@ Giff.OutputName = {'fu', 'fv'};
kp = 0.5*m*W^2; -cp = 0.001; +cp = 0; Giff_s = linearize(mdl, io, 0); @@ -834,7 +1088,7 @@ Giff_s.OutputName = {'fu', 'fv'};-kp = 1.5*m*W^2; -cp = 0.001; +cp = 0; Giff_l = linearize(mdl, io, 0); @@ -845,18 +1099,19 @@ Giff_l.OutputName = {'fu', 'fv'};+
Figure 13: Transfer function from \([F_u, F_v]\) to \([f_u, f_v]\) for \(k_p = 0\), \(k_p < m \Omega^2\) and \(k_p > m \Omega^2\)
-In Figure 14 is displayed the Root Locus in the three considered cases with +In Figure 14 is displayed the Root Locus in the three considered cases with
\begin{equation} K_{\text{IFF}} = \frac{g}{s} \begin{bmatrix} @@ -877,7 +1132,7 @@ Thus, decentralized IFF controller with pure integrators can be used if: \end{equation} -
Figure 14: Root Locus
@@ -885,8 +1140,8 @@ Thus, decentralized IFF controller with pure integrators can be used if:However, having large values of \(k_p\) may: @@ -897,7 +1152,7 @@ However, having large values of \(k_p\) may:
-To study the second point, Root Locus plots for the following values of \(k_p\) are shown in Figure 15. +To study the second point, Root Locus plots for the following values of \(k_p\) are shown in Figure 15.
kps = [1, 5, 10, 50]*m*W^2; @@ -910,15 +1165,16 @@ It is shown that large values of \(k_p\) decreases the attainable damping. -++
Figure 15: Root Locus plot
Let’s take \(k_p = 5 m \Omega^2\) and find the optimal IFF control gain \(g\) such that maximum damping are added to the poles of the closed loop system. @@ -952,24 +1208,25 @@ end
+
Figure 16: Root Locus for \(k_p = 5 m \Omega^2\) and the poles corresponding to the identified optimal gain
The sensed relative velocity are equal to: @@ -977,20 +1234,34 @@ The sensed relative velocity are equal to:
+With: +
+\begin{align} + G_{vp} &= \left( \frac{s^2}{{\omega_0}^2} + 2 \xi \frac{s}{\omega_0} + 1 - \frac{{\Omega}^2}{{\omega_0}^2} \right)^2 + \left( 2 \frac{\Omega}{\omega_0} \frac{s}{\omega_0} \right)^2 \\ + G_{vz} &= \frac{s^2}{{\omega_0}^2} + 2 \xi \frac{s}{\omega_0} + 1 - \frac{{\Omega}^2}{{\omega_0}^2} \\ + G_{vc} &= 2 \frac{\Omega}{\omega_0} \frac{s}{\omega_0} +\end{align} +Let’s define initial values for the model. @@ -1010,8 +1281,8 @@ w0 = sqrt(k/m); % [rad/s]
The rotating speed is set to \(\Omega = 0.1 \omega_0\). @@ -1046,8 +1317,8 @@ Gdvf.OutputName = {'Vu', 'Vv'};
The same transfer function from \([F_u, F_v]\) to \([v_u, v_v]\) is written down from the analytical model. @@ -1063,11 +1334,11 @@ Gdvf_th.OutputName = {'vu', 'vv'};
-The two are compared in Figure 5 and found to perfectly match. +The two are compared in Figure 5 and found to perfectly match.
-
Figure 17: Comparison of the transfer functions from \([F_u, F_v]\) to \([v_u, v_v]\) between the Simscape model and the analytical one
@@ -1075,8 +1346,8 @@ The two are compared in Figure 5 and found to perfectlThe Decentralized Direct Velocity Feedback controller consist of a pure gain on the diagonal: @@ -1089,7 +1360,7 @@ The Decentralized Direct Velocity Feedback controller consist of a pure gain on \end{equation}
-The corresponding Root Locus plots for the following rotating speeds are shown in Figure 18. +The corresponding Root Locus plots for the following rotating speeds are shown in Figure 18.
Ws = [0, 0.1, 0.5, 0.8, 1.1]*w0; % Rotating Speeds [rad/s] @@ -1099,9 +1370,17 @@ The corresponding Root Locus plots for the following rotating speeds are shown iIt is shown that for rotating speed \(\Omega < \omega_0\), the closed loop system is unconditionally stable and arbitrary damping can be added to the poles.
+++gains = logspace(-2, 2, 100); ++
Figure 18: Root Locus for the Decentralized Direct Velocity Feedback controller. Several rotating speed are shown.
@@ -1109,17 +1388,18 @@ It is shown that for rotating speed \(\Omega < \omega_0\), the closed loop systeLet’s define initial values for the model. @@ -1147,8 +1427,8 @@ The rotating speed is set to \(\Omega = 0.1 \omega_0\).
wi = 0.1*w0; @@ -1219,15 +1499,16 @@ Gdvf.OutputName = {'Vu', 'Vv'};
+
Figure 19: Root Locus plot - Comparison of IFF with additional high pass filter, IFF with additional parallel stiffness and DVF
In order to compare to three considered Active Damping techniques, gains that yield maximum damping of all the modes are computed for each case. @@ -1277,11 +1558,11 @@ The obtained damping ratio and control are shown below.
%% Name of the Simulink File @@ -1381,18 +1662,19 @@ Tdvf.OutputName = {'Dx', 'Dy'};
+
Figure 20: Comparison of the transmissibility
%% Name of the Simulink File @@ -1459,7 +1741,7 @@ Cdvf.OutputName = {'Dx', 'Dy'};
Figure 21: Comparison of the obtained Compliance
@@ -1468,11 +1750,11 @@ Cdvf.OutputName = {'Dx', 'Dy'};+This Matlab function is accessible here. +
+function [poles] = rootLocusPolesSorted(G, K, gains, args) +% rootLocusPolesSorted - +% +% Syntax: [poles] = rootLocusPolesSorted(G, K, gains, args) +% +% Inputs: +% - G, K, gains, args - +% +% Outputs: +% - poles - ++
arguments + G + K + gains + args.minreal double {mustBeNumericOrLogical} = false + args.p_half double {mustBeNumericOrLogical} = false + args.d_max double {mustBeNumeric} = -1 +end ++
if args.minreal + p1 = pole(minreal(feedback(G, gains(1)*K))); + [~, i_uniq] = uniquetol([real(p1), imag(p1)], 1e-10, 'ByRows', true); + p1 = p1(i_uniq); + + poles = zeros(length(p1), length(gains)); + poles(:, 1) = p1; +else + p1 = pole(feedback(G, gains(1)*K)); + [~, i_uniq] = uniquetol([real(p1), imag(p1)], 1e-10, 'ByRows', true); + p1 = p1(i_uniq); + + poles = zeros(length(p1), length(gains)); + poles(:, 1) = p1; +end ++
if args.minreal + p2 = pole(minreal(feedback(G, gains(2)*K))); + [~, i_uniq] = uniquetol([real(p2), imag(p2)], 1e-10, 'ByRows', true); + p2 = p2(i_uniq); + poles(:, 2) = p2; +else + p2 = pole(feedback(G, gains(2)*K)); + [~, i_uniq] = uniquetol([real(p2), imag(p2)], 1e-10, 'ByRows', true); + p2 = p2(i_uniq); + poles(:, 2) = p2; +end ++
for g_i = 3:length(gains) + % Estimated value of the poles + poles_est = poles(:, g_i-1) + (poles(:, g_i-1) - poles(:, g_i-2))*(gains(g_i) - gains(g_i-1))/(gains(g_i-1) - gains(g_i - 2)); + + % New values for the poles + poles_gi = pole(feedback(G, gains(g_i)*K)); + [~, i_uniq] = uniquetol([real(poles_gi), imag(poles_gi)], 1e-10, 'ByRows', true); + poles_gi = poles_gi(i_uniq); + + % Array of distances between all the poles + poles_dist = sqrt((poles_est-poles_gi.').*conj(poles_est-poles_gi.')); + + % Get indices corresponding to distances from lowest to highest + [~, c] = sort(min(poles_dist)); + + as = 1:length(poles_gi); + + % for each column of poles_dist corresponding to the i'th pole + % with closest previous poles + for p_i = c + % Get the indice a_i of the previous pole that is the closest + % to pole c(p_i) + [~, a_i] = min(poles_dist(:, p_i)); + + poles(as(a_i), g_i) = poles_gi(p_i); + + % Remove old poles that are already matched + % poles_gi(as(a_i), :) = []; + poles_dist(a_i, :) = []; + as(a_i) = []; + end +end ++
if args.d_max > 0 + poles = poles(max(abs(poles(:, 2:end) - poles(:, 1:end-1))') > args.d_max, :); +end + +if args.p_half + poles = poles(1:round(end/2), :); +end ++
[~, s_p] = sort(imag(poles(:,1)), 'descend'); +poles = poles(s_p, :); ++
Created: 2020-06-12 ven. 19:29
+Created: 2020-06-18 jeu. 11:51