Update figure export settings

This commit is contained in:
Thomas Dehaeze 2019-03-06 08:24:21 +01:00
parent 89de9d5b5e
commit 489a163006
44 changed files with 276 additions and 278 deletions

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 296 KiB

After

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 319 KiB

After

Width:  |  Height:  |  Size: 328 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 272 KiB

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 KiB

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 395 KiB

After

Width:  |  Height:  |  Size: 422 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 388 KiB

After

Width:  |  Height:  |  Size: 411 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 323 KiB

After

Width:  |  Height:  |  Size: 386 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 KiB

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

After

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 263 KiB

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 KiB

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

View File

@ -21,22 +21,23 @@
#+PROPERTY: header-args:matlab+ :exports both
#+PROPERTY: header-args:matlab+ :eval no-export
#+PROPERTY: header-args:matlab+ :output-dir Figures
#+PROPERTY: header-args:matlab+ :mkdirp yes
:END:
* Introduction
The objective of this note it to highlight some control problems that arises when controlling the position of an object using actuators that are rotating with respect to a fixed reference frame.
In section [[sec:system]], a simple system composed of a spindle and a translation stage is defined and the equations of motion are written.
In section ref:sec:system, a simple system composed of a spindle and a translation stage is defined and the equations of motion are written.
The rotation induces some coupling between the actuators and their displacement, and modifies the dynamics of the system.
This is studied using the equations, and some numerical computations are used to compare the use of voice coil and piezoelectric actuators.
Then, in section [[sec:control_strategies]], two different control approach are compared where:
Then, in section ref:sec:control_strategies, two different control approach are compared where:
- the measurement is made in the fixed frame
- the measurement is made in the rotating frame
In section [[sec:simscape]], the analytical study will be validated using a multi body model of the studied system.
In section ref:sec:simscape, the analytical study will be validated using a multi body model of the studied system.
Finally, in section [[sec:control]], the control strategies are implemented using Simulink and Simscape and compared.
Finally, in section ref:sec:control, the control strategies are implemented using Simulink and Simscape and compared.
* System Description and Analysis
:PROPERTIES:
@ -44,7 +45,7 @@ Finally, in section [[sec:control]], the control strategies are implemented usin
:END:
<<sec:system>>
** System description
The system consists of one 2 degree of freedom translation stage on top of a spindle (figure [[fig:rotating_frame_2dof]]).
The system consists of one 2 degree of freedom translation stage on top of a spindle (figure ref:fig:rotating_frame_2dof).
The control inputs are the forces applied by the actuators of the translation stage ($F_u$ and $F_v$).
As the translation stage is rotating around the Z axis due to the spindle, the forces are applied along $u$ and $v$.
@ -71,7 +72,7 @@ Indices $u$ and $v$ corresponds to signals in the rotating reference frame ($\ve
** Equations
<<sec:equations>>
Based on the figure [[fig:rotating_frame_2dof]], we can write the equations of motion of the system.
Based on the figure ref:fig:rotating_frame_2dof, we can write the equations of motion of the system.
Let's express the kinetic energy $T$ and the potential energy $V$ of the mass $m$:
#+name: eq:energy_inertial_frame
@ -226,7 +227,7 @@ First we will determine the value for Euler and Coriolis forces during regular e
Fcheavy = 2*mheavy*ddot*wheavy;
#+end_src
The obtained values are displayed in table [[tab:euler_coriolis]].
The obtained values are displayed in table ref:tab:euler_coriolis.
#+begin_src matlab :results value table :exports results :post addhdr(*this*)
data = [Fclight, Fcheavy ;
@ -250,7 +251,7 @@ The negative stiffness due to the rotation is equal to $-m{\omega_0}^2$.
Kheavy = mheavy*wheavy^2;
#+end_src
The values for the negative spring effect are displayed in table [[tab:negative_spring]].
The values for the negative spring effect are displayed in table ref:tab:negative_spring.
This is definitely negligible when using piezoelectric actuators. It may not be the case when using voice coil actuators.
@ -267,12 +268,12 @@ This is definitely negligible when using piezoelectric actuators. It may not be
| Neg. Spring | 1381.7[N/m] | 0.9[N/m] |
** Limitations due to coupling
To simplify, we consider a constant rotating speed $\dot{\theta} = {\omega_0}$ and thus $\ddot{\theta} = 0$.
To simplify, we consider a constant rotating speed $\dot{\theta} = \omega_0$ and thus $\ddot{\theta} = 0$.
From equations [[eq:du_coupled]] and [[eq:dv_coupled]], we obtain:
\begin{align*}
(m s^2 + (k - m{\omega_0}^2)) d_u &= F_u + 2 m {\omega_0} s d_v \\
(m s^2 + (k - m{\omega_0}^2)) d_v &= F_v - 2 m {\omega_0} s d_u \\
From equations eqref:eq:du_coupled and eqref:eq:dv_coupled, we obtain:
\begin{align*}
(m s^2 + (k - m{\omega_0}^2)) d_u &= F_u + 2 m {\omega_0} s d_v \\
(m s^2 + (k - m{\omega_0}^2)) d_v &= F_v - 2 m {\omega_0} s d_u \\
\end{align*}
From second equation:
@ -311,8 +312,8 @@ Then, coupling is negligible if $|-m \omega^2 + (k - m{\omega_0}^2)| \gg |2 m {\
*** Numerical Analysis
We plot on the same graph $\frac{|-m \omega^2 + (k - m {\omega_0}^2)|}{|2 m \omega_0 \omega|}$ for the voice coil and the piezo:
- with the light sample (figure [[fig:coupling_light]]).
- with the heavy sample (figure [[fig:coupling_heavy]]).
- with the light sample (figure ref:fig:coupling_light).
- with the heavy sample (figure ref:fig:coupling_heavy).
#+begin_src matlab :exports none :results silent
f = logspace(-1, 3, 1000);
@ -330,9 +331,8 @@ We plot on the same graph $\frac{|-m \omega^2 + (k - m {\omega_0}^2)|}{|2 m \ome
#+end_src
#+NAME: fig:coupling_light
#+HEADER: :var filepath="Figures/coupling_light.pdf" :var figsize="normal-normal"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file coupling_light.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/coupling_light.pdf" :var figsize="normal-normal" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -354,9 +354,8 @@ We plot on the same graph $\frac{|-m \omega^2 + (k - m {\omega_0}^2)|}{|2 m \ome
#+end_src
#+NAME: fig:coupling_heavy
#+HEADER: :var filepath="Figures/coupling_heavy.pdf" :var figsize="normal-normal"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file coupling_heavy.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/coupling_heavy.pdf" :var figsize="normal-normal" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -372,7 +371,7 @@ Coupling is higher for actuators with small stiffness.
** Limitations due to negative stiffness effect
If $\max{\dot{\theta}} \ll \sqrt{\frac{k}{m}}$, then the negative spring effect is negligible and $k - m\dot{\theta}^2 \approx k$.
Let's estimate what is the maximum rotation speed for which the negative stiffness effect is still negligible ($\omega_\text{max} = 0.1 \sqrt{\frac{k}{m}}$). Results are shown table [[tab:negative_stiffness]].
Let's estimate what is the maximum rotation speed for which the negative stiffness effect is still negligible ($\omega_\text{max} = 0.1 \sqrt{\frac{k}{m}}$). Results are shown table ref:tab:negative_stiffness.
#+begin_src matlab :results table :exports results :post addhdr(*this*)
data = 0.1*60*(1/2/pi)*[sqrt(kvc/mlight), sqrt(kpz/mlight);
sqrt(kvc/mheavy), sqrt(kpz/mheavy)];
@ -396,7 +395,7 @@ The system dynamics will be much more affected when using soft actuator.
The system can even goes unstable when $m \omega^2 > k$, that is when the centrifugal forces are higher than the forces due to stiffness.
From this analysis, we can determine the lowest practical stiffness that is possible to use: $k_\text{min} = 10 m \omega^2$ (table [[tab:min_k]])
From this analysis, we can determine the lowest practical stiffness that is possible to use: $k_\text{min} = 10 m \omega^2$ (table sec:tab:min_k)
#+begin_src matlab :results table :exports results :post addhdr(*this*)
data = 10*[mlight*2*pi, mheavy*2*pi/60]
@ -411,7 +410,7 @@ From this analysis, we can determine the lowest practical stiffness that is poss
| k min [N/m] | 2199 | 89 |
** Effect of rotation speed on the plant
As shown in equation [[eq:coupledplant]], the plant changes with the rotation speed $\omega_0$.
As shown in equation eqref:eq:coupledplant, the plant changes with the rotation speed $\omega_0$.
Then, we compute the bode plot of the direct term and coupling term for multiple rotating speed.
@ -465,9 +464,8 @@ Then we compare the result between voice coil and piezoelectric actuators.
#+end_src
#+NAME: fig:G_ws_vc
#+HEADER: :var filepath="Figures/G_ws_vc.pdf" :var figsize="wide-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file G_ws_vc.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/G_ws_vc.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -508,9 +506,8 @@ Then we compare the result between voice coil and piezoelectric actuators.
#+end_src
#+NAME: fig:Gc_ws_vc
#+HEADER: :var filepath="Figures/Gc_ws_vc.pdf" :var figsize="wide-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file Gc_ws_vc.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/Gc_ws_vc.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -567,9 +564,8 @@ Then we compare the result between voice coil and piezoelectric actuators.
#+end_src
#+NAME: fig:G_ws_pz
#+HEADER: :var filepath="Figures/G_ws_pz.pdf" :var figsize="wide-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file G_ws_pz.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/G_ws_pz.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -607,9 +603,8 @@ Then we compare the result between voice coil and piezoelectric actuators.
#+end_src
#+NAME: fig:Gc_ws_pz
#+HEADER: :var filepath="Figures/Gc_ws_pz.pdf" :var figsize="wide-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file Gc_ws_pz.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/Gc_ws_pz.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -664,11 +659,11 @@ The poles of the system are computed for multiple values of the rotation frequen
end
#+end_src
We then plot the real and imaginary part of the poles as a function of the rotation frequency (figures [[fig:poles_w_vc]] and [[fig:poles_w_pz]]).
We then plot the real and imaginary part of the poles as a function of the rotation frequency (figures ref:fig:poles_w_vc and ref:fig:poles_w_pz).
When the real part of one pole becomes positive, the system goes unstable.
For the voice coil (figure [[fig:poles_w_vc]]), the system is unstable when the rotation speed is above 5 rad/s. The real and imaginary part of the poles of the system with piezoelectric actuators are changing much less (figure [[fig:poles_w_pz]]).
For the voice coil (figure ref:fig:poles_w_vc), the system is unstable when the rotation speed is above 5 rad/s. The real and imaginary part of the poles of the system with piezoelectric actuators are changing much less (figure ref:fig:poles_w_pz).
#+begin_src matlab :results silent :exports none
figure;
@ -697,9 +692,8 @@ For the voice coil (figure [[fig:poles_w_vc]]), the system is unstable when the
#+end_src
#+NAME: fig:poles_w_vc
#+HEADER: :var filepath="Figures/poles_w_vc.pdf" :var figsize="wide-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file poles_w_vc.pdf :post pdf2svg(file=*this*, ext="png")
#+begin_src matlab :var filepath="Figures/poles_w_vc.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -736,9 +730,8 @@ For the voice coil (figure [[fig:poles_w_vc]]), the system is unstable when the
#+end_src
#+NAME: fig:poles_w_pz
#+HEADER: :var filepath="Figures/poles_w_pz.pdf" :var figsize="wide-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file poles_w_pz.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/poles_w_pz.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -760,7 +753,7 @@ The position error $[\epsilon_x, \epsilon_y]$ is then express in the rotating fr
Finally, the control low $K$ links the position errors $[\epsilon_u, \epsilon_v]$ to the actuator forces $[F_u, F_v]$.
The block diagram is shown on figure [[fig:control_measure_fixed_2dof]].
The block diagram is shown on figure ref:fig:control_measure_fixed_2dof.
#+name: fig:control_measure_fixed_2dof
#+caption: Control with a measure from fixed frame
@ -773,7 +766,7 @@ One question we wish to answer is: is $G(\theta) J(\theta) = G(\theta_0) J(\thet
** Measurement in the rotating frame
Let's consider that the measurement is made in the rotating reference frame.
The corresponding block diagram is shown figure [[fig:control_measure_rotating_2dof]]
The corresponding block diagram is shown figure ref:fig:control_measure_rotating_2dof
#+name: fig:control_measure_rotating_2dof
#+caption: Control with a measure from rotating frame
@ -790,7 +783,19 @@ The loop gain is $L = G K$.
** Initialization
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
load('./mat/parameters.mat');
bode_opts = bodeoptions;
bode_opts.FreqUnits = 'Hz';
bode_opts.MagUnits = 'abs';
bode_opts.MagScale = 'log';
bode_opts.Grid = 'on';
bode_opts.PhaseVisible = 'off';
bode_opts.Title.FontSize = 10;
bode_opts.XLabel.FontSize = 10;
bode_opts.YLabel.FontSize = 10;
bode_opts.TickLabel.FontSize = 10;
#+end_src
#+begin_src matlab :exports none :results silent
@ -882,9 +887,9 @@ Then we identify the system with an heavy mass and low speed.
** Coupling ratio between $f_{uv}$ and $d_{uv}$
In order to validate the equations written, we can compute the coupling ratio using the simscape model and compare with the equations.
From the previous identification, we plot the coupling ratio in both case (figure [[fig:coupling_ratio_light_heavy]]).
From the previous identification, we plot the coupling ratio in both case (figure ref:fig:coupling_ratio_light_heavy).
We obtain the same result than the analytical case (figures [[fig:coupling_light]] and [[fig:coupling_heavy]]).
We obtain the same result than the analytical case (figures ref:fig:coupling_light and ref:fig:coupling_heavy).
#+begin_src matlab :results silent :exports none
figure;
hold on;
@ -897,18 +902,17 @@ We obtain the same result than the analytical case (figures [[fig:coupling_light
xlim([freqs(1), freqs(end)]);
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Coupling ratio');
legend({'light - VC', 'light - PZ', 'heavy - VC', 'heavy - PZ'})
legend({'light - VC', 'light - PZ', 'heavy - VC', 'heavy - PZ'}, 'Location', 'northeast')
#+end_src
#+NAME: fig:coupling_ratio_light_heavy
#+HEADER: :var filepath="Figures/coupling_ratio_light_heavy.pdf" :var figsize="wide-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file coupling_ratio_light_heavy.pdf :post pdf2svg(file=*this*, ext="png")
#+begin_src matlab :var filepath="Figures/coupling_ratio_light_heavy.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+LABEL: fig:coupling_ratio_light_heavy
#+CAPTION: caption
#+CAPTION: Coupling ratio obtained with the Simscape model
#+RESULTS: fig:coupling_ratio_light_heavy
[[file:Figures/coupling_ratio_light_heavy.png]]
@ -936,7 +940,7 @@ First, we identify the system when the rotation speed is null and then when the
The actuators are voice coil with some damping added.
The bode plot of the system not rotating and rotating at 60rpm is shown figure [[fig:Gvc_speed]].
The bode plot of the system not rotating and rotating at 60rpm is shown figure ref:fig:Gvc_speed.
#+begin_src matlab :exports none :results silent
w = 0; % Rotation speed [rad/s]
@ -962,208 +966,25 @@ The bode plot of the system not rotating and rotating at 60rpm is shown figure [
#+begin_src matlab :exports none :results silent
figure;
bode(Gvc, Gtvc)
bode(Gvc, Gtvc, bode_opts)
legend({'Gvc - $\omega = 0$', 'Gvc - $\omega = 60$rpm'}, 'Location', 'southwest');
title('');
#+end_src
#+NAME: fig:Gvc_speed
#+HEADER: :var filepath="Figures/Gvc_speed.pdf" :var figsize="full-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file Gvc_speed.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/Gvc_speed.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+LABEL: fig:Gvc_speed
#+CAPTION: Bode plot of the system not rotating and rotating at 60rmp - Voice coil and light sample
#+CAPTION: Change of transfer functions due to rotating speed
#+RESULTS: fig:Gvc_speed
[[file:Figures/Gvc_speed.png]]
*** Controller design
We design a controller based on the identification when the system is not rotating.
#+begin_src matlab :results none :exports code
sisotool(Gvc('Du', 'fu'))
#+end_src
The controller is a lead-lag controller with the following transfer function.
#+begin_src matlab :results none :exports code
Kll = 2.0698e09*(s+40.45)*(s+1.181)/(s*(s+198.4)*(s+2790));
K = [Kll 0;
0 Kll];
#+end_src
The loop gain is displayed figure [[fig:Gvc_loop_gain]].
#+begin_src matlab :exports none :results silent
freqs = logspace(-2, 2, 1000);
figure;
% Amplitude
ax1 = subaxis(2,1,1);
hold on;
plot(freqs, abs(squeeze(freqresp(Gvc('Du', 'fu')*Kll, freqs, 'Hz'))), '-');
set(gca,'xscale','log'); set(gca,'yscale','log');
ylabel('Amplitude [m/N]');
set(gca, 'XTickLabel',[]);
hold off;
% Phase
ax2 = subaxis(2,1,2);
hold on;
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gvc('Du', 'fu')*Kll, freqs, 'Hz')))), '-');
set(gca,'xscale','log');
yticks(-180:180:180);
ylim([-180 180]);
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
linkaxes([ax1,ax2],'x');
#+end_src
#+NAME: fig:Gvc_loop_gain
#+HEADER: :var filepath="Figures/Gvc_loop_gain.pdf" :var figsize="full-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file Gvc_loop_gain.pdf :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+LABEL: fig:Gvc_loop_gain
#+CAPTION: Loop gain obtained for a lead-lag controller on the system with a voice coil
#+RESULTS: fig:Gvc_loop_gain
[[file:Figures/Gvc_loop_gain.png]]
*** Controlling the rotating system
We here want to see if the system is robust with respect to the rotation speed. We then use the controller based on the non-rotating system, and see if the system is stable and its dynamics.
We can then plot the same loop gain with the rotating system using the same controller (figure [[fig:Gtvc_loop_gain]]). The result obtained is unstable.
#+begin_src matlab :exports none :results silent
freqs = logspace(-2, 2, 1000);
figure;
% Amplitude
ax1 = subaxis(2,1,1);
hold on;
plot(freqs, abs(squeeze(freqresp(Gtvc('Du', 'fu')*Kll, freqs, 'Hz'))), '-');
set(gca,'xscale','log'); set(gca,'yscale','log');
ylabel('Amplitude [m/N]');
set(gca, 'XTickLabel',[]);
hold off;
% Phase
ax2 = subaxis(2,1,2);
hold on;
plot(freqs, 180/pi*angle(squeeze(freqresp(Gtvc('Du', 'fu')*Kll, freqs, 'Hz'))), '-');
set(gca,'xscale','log');
yticks(-180:180:180);
ylim([-180 180]);
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
linkaxes([ax1,ax2],'x');
#+end_src
#+NAME: fig:Gtvc_loop_gain
#+HEADER: :var filepath="Figures/Gtvc_loop_gain.pdf" :var figsize="full-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file Gtvc_loop_gain.pdf :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+LABEL: fig:Gtvc_loop_gain
#+CAPTION: Loop gain with the rotating system
#+RESULTS: fig:Gtvc_loop_gain
[[file:Figures/Gtvc_loop_gain.png]]
We can look at the poles of the system where we control only one direction ($u$ for instance). We obtain a pole with a positive real part.
#+begin_src matlab :results table :exports both
pole(feedback(Gtvc, blkdiag(Kll, 0)))
#+end_src
#+RESULTS:
| -2798 |
| -58.906+94.246i |
| -58.906-94.246i |
| -71.654 |
| 3.1648 |
| -3.3031 |
| -1.1902 |
However, when we look at the poles of the closed loop with a diagonal controller, all the poles have negative real part and the system is stable.
#+begin_src matlab :results table :exports both
pole(feedback(Gtvc, blkdiag(Kll, Kll)))
#+end_src
#+RESULTS:
| -2798+0.035765i |
| -2798-0.035765i |
| -56.406+105.34i |
| -56.406-105.34i |
| -64.482+79.308i |
| -64.482-79.308i |
| -68.521+13.503i |
| -68.521-13.503i |
| -1.1837+0.0041777i |
| -1.1837-0.0041777i |
*** Close loop performance
First, we create the closed loop systems. Then, we plot the transfer function from the reference signals $[\epsilon_u, \epsilon_v]$ to the output $[d_u, d_v]$ (figure [[fig:perfcomp]]).
#+begin_src matlab :results none :exports code
K.InputName = 'e';
K.OutputName = 'u';
Gtvc.InputName = 'u';
Gtvc.OutputName = 'y';
Gvc.InputName = 'u';
Gvc.OutputName = 'y';
Sum = sumblk('e = r-y', 2);
Tvc = connect(Gvc, K, Sum, 'r', 'y');
Ttvc = connect(Gtvc, K, Sum, 'r', 'y');
#+end_src
#+begin_src matlab :results none :exports code
freqs = logspace(-2, 2, 1000);
figure;
ax1 = subplot(1,2,1);
hold on;
plot(freqs, abs(squeeze(freqresp(Tvc(1, 1), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Ttvc(1, 1), freqs, 'Hz'))));
hold off;
xlim([freqs(1), freqs(end)]);
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Magnitude [m/N]');
legend({'w = 0 [rpm]', 'w = 60 [rpm]'}, 'Location', 'southwest')
title('$G_{r_u \to d_u}$')
ax2 = subplot(1,2,2);
hold on;
plot(freqs, abs(squeeze(freqresp(Tvc(1, 2), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Ttvc(1, 2), freqs, 'Hz'))));
hold off;
xlim([freqs(1), freqs(end)]);
ylim([1e-5, 1]);
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]');
title('$G_{r_u \to d_v}$')
linkaxes([ax1,ax2],'x');
#+end_src
#+NAME: fig:perfconp
#+HEADER: :var filepath="Figures/perfconp.pdf" :var figsize="full-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file perfconp.pdf :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+LABEL: fig:perfconp
#+CAPTION: Close loop performance for $\omega = 0$ and $\omega = 60 rpm$
#+RESULTS: fig:perfconp
[[file:Figures/perfconp.png]]
*** Effect of rotation speed
We first identify the system (voice coil and light mass) for multiple rotation speed.
Then we compute the bode plot of the diagonal element (figure [[fig:Guu_ws]]) and of the coupling element (figure [[fig:Guv_ws]]).
Then we compute the bode plot of the diagonal element (figure ref:fig:Guu_ws) and of the coupling element (figure ref:fig:Guv_ws).
As the rotation frequency increases:
- one pole goes to lower frequencies while the other goes to higher frequencies
@ -1218,9 +1039,8 @@ To stabilize the unstable pole, we need a control bandwidth of at least twice of
#+end_src
#+NAME: fig:Guu_ws
#+HEADER: :var filepath="Figures/Guu_ws.pdf" :var figsize="full-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file Guu_ws.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/Guu_ws.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -1261,9 +1081,8 @@ To stabilize the unstable pole, we need a control bandwidth of at least twice of
#+end_src
#+NAME: fig:Guv_ws
#+HEADER: :var filepath="Figures/Guv_ws.pdf" :var figsize="full-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file Guv_ws.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/Guv_ws.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -1272,7 +1091,7 @@ To stabilize the unstable pole, we need a control bandwidth of at least twice of
#+RESULTS: fig:Guv_ws
[[file:Figures/Guv_ws.png]]
Then, we can look at the same plots for the piezoelectric actuator (figure [[fig:Guu_ws_pz]]). The effect of the rotation frequency has very little effect on the dynamics of the system to control.
Then, we can look at the same plots for the piezoelectric actuator (figure ref:fig:Guu_ws_pz). The effect of the rotation frequency has very little effect on the dynamics of the system to control.
#+begin_src matlab :exports none :results silent
ws = linspace(0, 2*pi, 5); % Rotation speed vector [rad/s]
@ -1320,9 +1139,8 @@ Then, we can look at the same plots for the piezoelectric actuator (figure [[fig
#+end_src
#+NAME: fig:Guu_ws_pz
#+HEADER: :var filepath="Figures/Guu_ws_pz.pdf" :var figsize="full-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file Guu_ws_pz.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/Guu_ws_pz.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -1331,6 +1149,202 @@ Then, we can look at the same plots for the piezoelectric actuator (figure [[fig
#+RESULTS: fig:Guu_ws_pz
[[file:Figures/Guu_ws_pz.png]]
*** Controller design
We design a controller based on the identification when the system is not rotating.
The obtained controller is a lead-lag controller with the following transfer function.
#+begin_src matlab :results none :exports code
Kll = 2.0698e09*(s+40.45)*(s+1.181)/((s+0.01)*(s+198.4)*(s+2790));
K = [Kll 0;
0 Kll];
#+end_src
The loop gain is displayed figure ref:fig:Gvc_loop_gain.
#+begin_src matlab :exports none :results silent
freqs = logspace(-2, 2, 1000);
figure;
% Amplitude
ax1 = subaxis(2,1,1);
hold on;
plot(freqs, abs(squeeze(freqresp(Gvc('Du', 'fu')*Kll, freqs, 'Hz'))), '-');
set(gca,'xscale','log'); set(gca,'yscale','log');
ylabel('Amplitude [m/N]');
set(gca, 'XTickLabel',[]);
hold off;
% Phase
ax2 = subaxis(2,1,2);
hold on;
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gvc('Du', 'fu')*Kll, freqs, 'Hz')))), '-');
set(gca,'xscale','log');
yticks(-180:180:180);
ylim([-180 180]);
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
linkaxes([ax1,ax2],'x');
#+end_src
#+NAME: fig:Gvc_loop_gain
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/Gvc_loop_gain.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+LABEL: fig:Gvc_loop_gain
#+CAPTION: Loop gain obtained for a lead-lag controller on the system with a voice coil
#+RESULTS: fig:Gvc_loop_gain
[[file:Figures/Gvc_loop_gain.png]]
*** Controlling the rotating system
We here want to see if the system is robust with respect to the rotation speed. We then use the controller based on the non-rotating system, and see if the system is stable and its dynamics.
We can then plot the same loop gain with the rotating system using the same controller (figure ref:fig:Gtvc_loop_gain). The result obtained is unstable.
#+begin_src matlab :exports none :results silent
freqs = logspace(-2, 2, 1000);
figure;
% Amplitude
ax1 = subaxis(2,1,1);
hold on;
plot(freqs, abs(squeeze(freqresp(Gtvc('Du', 'fu')*Kll, freqs, 'Hz'))), '-');
set(gca,'xscale','log'); set(gca,'yscale','log');
ylabel('Amplitude [m/N]');
set(gca, 'XTickLabel',[]);
hold off;
% Phase
ax2 = subaxis(2,1,2);
hold on;
plot(freqs, 180/pi*angle(squeeze(freqresp(Gtvc('Du', 'fu')*Kll, freqs, 'Hz'))), '-');
set(gca,'xscale','log');
yticks(-180:180:180);
ylim([-180 180]);
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
linkaxes([ax1,ax2],'x');
#+end_src
#+NAME: fig:Gtvc_loop_gain
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/Gtvc_loop_gain.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+LABEL: fig:Gtvc_loop_gain
#+CAPTION: Loop gain with the rotating system
#+RESULTS: fig:Gtvc_loop_gain
[[file:Figures/Gtvc_loop_gain.png]]
We can look at the poles of the system where we control only one direction ($u$ for instance). We obtain a pole with a positive real part.
#+begin_important
The system is then unstable when controlling only one direction.
#+end_important
#+begin_src matlab :results table :exports both
pole(feedback(Gtvc, blkdiag(Kll, 0)))
#+end_src
#+RESULTS:
| -2798 |
| -58.916+94.248i |
| -58.916-94.248i |
| -71.644 |
| 3.1647 |
| -3.3034 |
| -1.1901 |
However, when we look at the poles of the closed loop with a diagonal controller, all the poles have negative real part and the system is stable.
#+begin_src matlab :results table :exports both
pole(feedback(Gtvc, blkdiag(Kll, Kll)))
#+end_src
#+RESULTS:
| -2798+0.035765i |
| -2798-0.035765i |
| -56.414+105.34i |
| -56.414-105.34i |
| -64.495+79.314i |
| -64.495-79.314i |
| -68.509+13.499i |
| -68.509-13.499i |
| -1.1837+0.0041422i |
| -1.1837-0.0041422i |
Check stability of MIMO system.
#+begin_src matlab :result silent
isstable(1/(1+K*Gtvc))
isstable(Gtvc/(1+K*Gtvc))
isstable(Gtvc/(1+K*Gtvc))
#+end_src
#+RESULTS:
: 0
*** Close loop performance
First, we create the closed loop systems. Then, we plot the transfer function from the reference signals $[\epsilon_u, \epsilon_v]$ to the output $[d_u, d_v]$ (figure ref:fig:perfcomp).
#+begin_src matlab :results none :exports code
S = eye(2)/(eye(2) + Gvc*K);
T = Gvc*K /(eye(2) + Gvc*K);
St = eye(2)/(eye(2) + Gtvc*K);
Tt = Gtvc*K/(eye(2) + Gtvc*K);
freqs = logspace(-3, 3, 1000);
#+end_src
#+begin_src matlab :results none :exports code
figure;
bode(S, St, 2*pi*freqs, bode_opts)
#+end_src
#+begin_src matlab :results none :exports code
figure;
bode(T, Tt, 2*pi*freqs, bode_opts)
#+end_src
#+begin_src matlab :results none :exports code
freqs = logspace(-2, 2, 1000);
figure;
ax1 = subplot(1,2,1);
hold on;
plot(freqs, abs(squeeze(freqresp(Tvc(1, 1), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Ttvc(1, 1), freqs, 'Hz'))));
hold off;
xlim([freqs(1), freqs(end)]);
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Magnitude [m/N]');
legend({'w = 0 [rpm]', 'w = 60 [rpm]'}, 'Location', 'southwest')
title('$G_{r_u \to d_u}$')
ax2 = subplot(1,2,2);
hold on;
plot(freqs, abs(squeeze(freqresp(Tvc(1, 2), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Ttvc(1, 2), freqs, 'Hz'))));
hold off;
xlim([freqs(1), freqs(end)]);
ylim([1e-5, 1]);
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]');
title('$G_{r_u \to d_v}$')
linkaxes([ax1,ax2],'x');
#+end_src
#+NAME: fig:perfconp
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/perfconp.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+LABEL: fig:perfconp
#+CAPTION: Close loop performance for $\omega = 0$ and $\omega = 60 rpm$
#+RESULTS: fig:perfconp
[[file:Figures/perfconp.png]]
** Plant Control - MIMO approach
*** TODO Analysis - SVD
\[ G = U \Sigma V^H \]
@ -1340,7 +1354,7 @@ With:
- $U$ is an $2 \times 2$ unitary matrix. The columns vectors of $U$, denoted $u_i$, represent the *output directions* of the plant. They are orthonomal
- $V$ is an $2 \times 2$ unitary matrix. The columns vectors of $V$, denoted $v_i$, represent the *input directions* of the plant. They are orthonomal
We first look at the evolution of the singular values as a function of frequency (figure [[fig:G_sigma]]).
We first look at the evolution of the singular values as a function of frequency (figure ref:fig:G_sigma).
#+begin_src matlab :exports none :results silent
ws = linspace(0, 2*pi, 5); % Rotation speed vector [rad/s]
m = mlight; % mass of the sample [kg]
@ -1386,9 +1400,8 @@ We first look at the evolution of the singular values as a function of frequency
#+end_src
#+NAME: fig:G_sigma
#+HEADER: :var filepath="Figures/G_sigma.pdf" :var figsize="full-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file G_sigma.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/G_sigma.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -1498,9 +1511,8 @@ So, if we consider an input in the direction $v_i$, then the output is in the di
#+end_src
#+NAME: fig:coupling_simscape
#+HEADER: :var filepath="Figures/coupling_simscape.pdf" :var figsize="full-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file coupling_simscape.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/coupling_simscape.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -1535,9 +1547,8 @@ And then with the heavy sample.
#+end_src
#+NAME: fig:coupling_simscape_heavy
#+HEADER: :var filepath="Figures/coupling_simscape_heavy.pdf" :var figsize="full-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file coupling_simscape_heavy.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/coupling_simscape_heavy.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -1562,9 +1573,8 @@ Plot the ratio between the main transfer function and the coupling term:
#+end_src
#+NAME: fig:coupling_ratio_simscape_light
#+HEADER: :var filepath="Figures/coupling_ratio_simscape_light.pdf" :var figsize="wide-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file coupling_ratio_simscape_light.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/coupling_ratio_simscape_light.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -1588,9 +1598,8 @@ Plot the ratio between the main transfer function and the coupling term:
#+end_src
#+NAME: fig:coupling_ratio_simscape_heavy
#+HEADER: :var filepath="Figures/coupling_ratio_simscape_heavy.pdf" :var figsize="wide-tall"
#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes
#+begin_src matlab :output-dir Figures :file coupling_ratio_simscape_heavy.pdf :post pdf2svg(file=*this*, ext="png")
#+HEADER: :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="Figures/coupling_ratio_simscape_heavy.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
@ -1734,17 +1743,6 @@ Finally, we run the linearization.
exportFig('G_u_v_to_x_y', 'wide-tall');
#+end_src
** Effect of the rotating Speed
<<sec:effect_rot_speed>>
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
*** TODO Use realistic parameters for the mass of the sample and stiffness of the X-Y stage
*** TODO Check if the plant is changing a lot when we are not turning to when we are turning at the maximum speed (60rpm)
** Effect of the X-Y stage stiffness
<<sec:effect_stiffness>>