diff --git a/figs/G_sigma.pdf b/figs/G_sigma.pdf index 5d0c9da..fdfe123 100644 Binary files a/figs/G_sigma.pdf and b/figs/G_sigma.pdf differ diff --git a/figs/G_sigma.png b/figs/G_sigma.png index 42ed8cb..6ea3f70 100644 Binary files a/figs/G_sigma.png and b/figs/G_sigma.png differ diff --git a/figs/G_ws_pz.pdf b/figs/G_ws_pz.pdf index 35c8a77..5163bd5 100644 Binary files a/figs/G_ws_pz.pdf and b/figs/G_ws_pz.pdf differ diff --git a/figs/G_ws_pz.png b/figs/G_ws_pz.png index 5dd19d9..9e46ce0 100644 Binary files a/figs/G_ws_pz.png and b/figs/G_ws_pz.png differ diff --git a/figs/G_ws_vc.pdf b/figs/G_ws_vc.pdf index 5ace53d..041e5ed 100644 Binary files a/figs/G_ws_vc.pdf and b/figs/G_ws_vc.pdf differ diff --git a/figs/G_ws_vc.png b/figs/G_ws_vc.png index 49facfc..5d112f3 100644 Binary files a/figs/G_ws_vc.png and b/figs/G_ws_vc.png differ diff --git a/figs/Gc_ws_pz.pdf b/figs/Gc_ws_pz.pdf index 0f71e28..6988954 100644 Binary files a/figs/Gc_ws_pz.pdf and b/figs/Gc_ws_pz.pdf differ diff --git a/figs/Gc_ws_pz.png b/figs/Gc_ws_pz.png index 9c4a330..fa879c6 100644 Binary files a/figs/Gc_ws_pz.png and b/figs/Gc_ws_pz.png differ diff --git a/figs/Gc_ws_vc.pdf b/figs/Gc_ws_vc.pdf index 3857d96..ca7b36a 100644 Binary files a/figs/Gc_ws_vc.pdf and b/figs/Gc_ws_vc.pdf differ diff --git a/figs/Gc_ws_vc.png b/figs/Gc_ws_vc.png index c318fd1..2730517 100644 Binary files a/figs/Gc_ws_vc.png and b/figs/Gc_ws_vc.png differ diff --git a/figs/Guu_uv_ws.pdf b/figs/Guu_uv_ws.pdf new file mode 100644 index 0000000..3fb346d Binary files /dev/null and b/figs/Guu_uv_ws.pdf differ diff --git a/figs/Guu_uv_ws.png b/figs/Guu_uv_ws.png new file mode 100644 index 0000000..adee772 Binary files /dev/null and b/figs/Guu_uv_ws.png differ diff --git a/figs/Guu_ws.pdf b/figs/Guu_ws.pdf index 35e0f4d..ce328d8 100644 Binary files a/figs/Guu_ws.pdf and b/figs/Guu_ws.pdf differ diff --git a/figs/Guu_ws_pz.pdf b/figs/Guu_ws_pz.pdf index f766bdc..017c657 100644 Binary files a/figs/Guu_ws_pz.pdf and b/figs/Guu_ws_pz.pdf differ diff --git a/figs/Guu_ws_pz.png b/figs/Guu_ws_pz.png index 771c39a..c090b62 100644 Binary files a/figs/Guu_ws_pz.png and b/figs/Guu_ws_pz.png differ diff --git a/figs/Guv_ws.pdf b/figs/Guv_ws.pdf index ee72a6d..356b34b 100644 Binary files a/figs/Guv_ws.pdf and b/figs/Guv_ws.pdf differ diff --git a/figs/Gvc_loop_gain.pdf b/figs/Gvc_loop_gain.pdf index 2cbb7c2..00aa0ac 100644 Binary files a/figs/Gvc_loop_gain.pdf and b/figs/Gvc_loop_gain.pdf differ diff --git a/figs/Gvc_loop_gain.png b/figs/Gvc_loop_gain.png index 8b767e5..7d52727 100644 Binary files a/figs/Gvc_loop_gain.png and b/figs/Gvc_loop_gain.png differ diff --git a/figs/Gvc_speed.pdf b/figs/Gvc_speed.pdf index 18a9a68..d2aa7e6 100644 Binary files a/figs/Gvc_speed.pdf and b/figs/Gvc_speed.pdf differ diff --git a/figs/Gvc_speed.png b/figs/Gvc_speed.png index 70dff12..df51c62 100644 Binary files a/figs/Gvc_speed.png and b/figs/Gvc_speed.png differ diff --git a/figs/coupling_heavy.pdf b/figs/coupling_heavy.pdf index 6e3ec02..4a14215 100644 Binary files a/figs/coupling_heavy.pdf and b/figs/coupling_heavy.pdf differ diff --git a/figs/coupling_heavy.png b/figs/coupling_heavy.png index d1f5476..1fd66e6 100644 Binary files a/figs/coupling_heavy.png and b/figs/coupling_heavy.png differ diff --git a/figs/coupling_light.pdf b/figs/coupling_light.pdf index 88bf074..2e68cca 100644 Binary files a/figs/coupling_light.pdf and b/figs/coupling_light.pdf differ diff --git a/figs/coupling_light.png b/figs/coupling_light.png index e826d16..446bd9e 100644 Binary files a/figs/coupling_light.png and b/figs/coupling_light.png differ diff --git a/figs/coupling_ratio_light_heavy.pdf b/figs/coupling_ratio_light_heavy.pdf index 5d269da..330d775 100644 Binary files a/figs/coupling_ratio_light_heavy.pdf and b/figs/coupling_ratio_light_heavy.pdf differ diff --git a/figs/coupling_ratio_light_heavy.png b/figs/coupling_ratio_light_heavy.png index 795a199..2f924bd 100644 Binary files a/figs/coupling_ratio_light_heavy.png and b/figs/coupling_ratio_light_heavy.png differ diff --git a/figs/evolution_poles_u.pdf b/figs/evolution_poles_u.pdf new file mode 100644 index 0000000..fef5948 Binary files /dev/null and b/figs/evolution_poles_u.pdf differ diff --git a/figs/evolution_poles_u.png b/figs/evolution_poles_u.png new file mode 100644 index 0000000..456f89d Binary files /dev/null and b/figs/evolution_poles_u.png differ diff --git a/figs/loop_gain_turning.pdf b/figs/loop_gain_turning.pdf new file mode 100644 index 0000000..52e7b6e Binary files /dev/null and b/figs/loop_gain_turning.pdf differ diff --git a/figs/loop_gain_turning.png b/figs/loop_gain_turning.png new file mode 100644 index 0000000..c229a44 Binary files /dev/null and b/figs/loop_gain_turning.png differ diff --git a/figs/perfcomp.pdf b/figs/perfcomp.pdf new file mode 100644 index 0000000..4d0fd64 Binary files /dev/null and b/figs/perfcomp.pdf differ diff --git a/figs/perfcomp.png b/figs/perfcomp.png new file mode 100644 index 0000000..1364fec Binary files /dev/null and b/figs/perfcomp.png differ diff --git a/figs/perfconp.pdf b/figs/perfconp.pdf index 15518cb..6028cd2 100644 Binary files a/figs/perfconp.pdf and b/figs/perfconp.pdf differ diff --git a/figs/perfconp.png b/figs/perfconp.png index f9cebf1..1364fec 100644 Binary files a/figs/perfconp.png and b/figs/perfconp.png differ diff --git a/figs/poles_cl_system.pdf b/figs/poles_cl_system.pdf new file mode 100644 index 0000000..69955bf Binary files /dev/null and b/figs/poles_cl_system.pdf differ diff --git a/figs/poles_cl_system.png b/figs/poles_cl_system.png new file mode 100644 index 0000000..ec94d2b Binary files /dev/null and b/figs/poles_cl_system.png differ diff --git a/figs/poles_w_pz.pdf b/figs/poles_w_pz.pdf index 91be03d..4a19e00 100644 Binary files a/figs/poles_w_pz.pdf and b/figs/poles_w_pz.pdf differ diff --git a/figs/poles_w_pz.png b/figs/poles_w_pz.png index d479e87..3027166 100644 Binary files a/figs/poles_w_pz.png and b/figs/poles_w_pz.png differ diff --git a/figs/poles_w_vc.pdf b/figs/poles_w_vc.pdf index 6eb4cdc..d2c387b 100644 Binary files a/figs/poles_w_vc.pdf and b/figs/poles_w_vc.pdf differ diff --git a/figs/poles_w_vc.png b/figs/poles_w_vc.png index 25f1f25..609fac0 100644 Binary files a/figs/poles_w_vc.png and b/figs/poles_w_vc.png differ diff --git a/index.html b/index.html index 304f8b8..1b16e63 100644 Binary files a/index.html and b/index.html differ diff --git a/index.org b/index.org index 49e4bd8..833fcce 100644 --- a/index.org +++ b/index.org @@ -2,50 +2,57 @@ :DRAWER: #+STARTUP: overview -#+HTML_HEAD: -#+HTML_HEAD: -#+HTML_HEAD: -#+HTML_HEAD: -#+HTML_HEAD: -#+HTML_HEAD: +#+LANGUAGE: en +#+EMAIL: dehaeze.thomas@gmail.com +#+AUTHOR: Dehaeze Thomas -#+LATEX_CLASS: cleanreport -#+LaTeX_CLASS_OPTIONS: [tocnp, secbreak, minted] -#+LaTeX_HEADER: \usepackage{svg} -#+LaTeX_HEADER: \newcommand{\authorFirstName}{Thomas} -#+LaTeX_HEADER: \newcommand{\authorLastName}{Dehaeze} -#+LaTeX_HEADER: \newcommand{\authorEmail}{dehaeze.thomas@gmail.com} +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: #+PROPERTY: header-args:matlab :session *MATLAB* #+PROPERTY: header-args:matlab+ :comments org +#+PROPERTY: header-args:matlab+ :results none #+PROPERTY: header-args:matlab+ :exports both #+PROPERTY: header-args:matlab+ :eval no-export #+PROPERTY: header-args:matlab+ :output-dir figs -#+PROPERTY: header-args:matlab+ :mkdirp yes + +#+PROPERTY: header-args:shell :eval no-export :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 ref:sec:system, a simple system composed of a spindle and a translation stage is defined and the equations of motion are written. +In section [[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 ref:sec:control_strategies, two different control approach are compared where: +Then, in section [[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 ref:sec:simscape, the analytical study will be validated using a multi body model of the studied system. +In section [[sec:simscape]], the analytical study will be validated using a multi body model of the studied system. -Finally, in section ref:sec:control, the control strategies are implemented using Simulink and Simscape and compared. +Finally, in section [[sec:control]], the control strategies are implemented using Simulink and Simscape and compared. * System Description and Analysis :PROPERTIES: :HEADER-ARGS:matlab+: :tangle matlab/system_numerical_analysis.m :END: <> +** Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :noweb yes :var current_dir=(file-name-directory buffer-file-name) + <> +#+end_src + +#+begin_src matlab :exports none :noweb yes + <> +#+end_src + ** System description -The system consists of one 2 degree of freedom translation stage on top of a spindle (figure ref:fig:rotating_frame_2dof). +The system consists of one 2 degree of freedom translation stage on top of a spindle (figure [[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$. @@ -72,7 +79,7 @@ Indices $u$ and $v$ corresponds to signals in the rotating reference frame ($\ve ** Equations <> -Based on the figure ref:fig:rotating_frame_2dof, we can write the equations of motion of the system. +Based on the figure [[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 @@ -166,12 +173,8 @@ The forces induced by the rotating reference frame are independent of the stiffn The resulting effect of those forces should then be higher when using softer actuators. ** Numerical Values for the NASS -#+begin_src matlab :exports none :results silent :noweb yes - <> -#+end_src - Let's define the parameters for the NASS. -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none mlight = 35; % Mass for light sample [kg] mheavy = 85; % Mass for heavy sample [kg] @@ -219,7 +222,7 @@ First we will determine the value for Euler and Coriolis forces during regular e - *Euler forces*: $m d_v \ddot{\theta}$ - *Coriolis forces*: $2 m \dot{d_v} \dot{\theta}$ -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none Felight = mlight*d*wdot; Feheavy = mheavy*d*wdot; @@ -227,7 +230,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 ref:tab:euler_coriolis. +The obtained values are displayed in table [[tab:euler_coriolis]]. #+begin_src matlab :results value table :exports results :post addhdr(*this*) data = [Fclight, Fcheavy ; @@ -246,12 +249,12 @@ The obtained values are displayed in table ref:tab:euler_coriolis. ** Negative Spring Effect - Numerical Result The negative stiffness due to the rotation is equal to $-m{\omega_0}^2$. -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none Klight = mlight*wlight^2; Kheavy = mheavy*wheavy^2; #+end_src -The values for the negative spring effect are displayed in table ref:tab:negative_spring. +The values for the negative spring effect are displayed in table [[tab:negative_spring]]. This is definitely negligible when using piezoelectric actuators. It may not be the case when using voice coil actuators. @@ -270,7 +273,7 @@ This is definitely negligible when using piezoelectric actuators. It may not be ** Limitations due to coupling To simplify, we consider a constant rotating speed $\dot{\theta} = \omega_0$ and thus $\ddot{\theta} = 0$. -From equations eqref:eq:du_coupled and eqref:eq:dv_coupled, we obtain: +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 \\ @@ -312,10 +315,10 @@ 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 ref:fig:coupling_light). -- with the heavy sample (figure ref:fig:coupling_heavy). +- with the light sample (figure [[fig:coupling_light]]). +- with the heavy sample (figure [[fig:coupling_heavy]]). -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none f = logspace(-1, 3, 1000); figure; @@ -330,17 +333,16 @@ We plot on the same graph $\frac{|-m \omega^2 + (k - m {\omega_0}^2)|}{|2 m \ome legend('Location', 'northeast'); #+end_src -#+NAME: fig:coupling_light -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/coupling_light.pdf" :var figsize="normal-normal" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/coupling_light.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+LABEL: fig:coupling_light #+CAPTION: Relative Coupling for light mass and high rotation speed -#+RESULTS: fig:coupling_light -[[file:figs/coupling_light.png]] -#+begin_src matlab :exports none :results silent +[[file:./figs/coupling_light.png]] + +#+begin_src matlab :exports none figure; hold on; plot(f, abs(-mheavy*(2*pi*f).^2 + kvc - mheavy * wheavy^2)./abs(2*mheavy*wheavy*2*pi*f), 'DisplayName', 'Voice Coil') @@ -353,15 +355,13 @@ We plot on the same graph $\frac{|-m \omega^2 + (k - m {\omega_0}^2)|}{|2 m \ome legend('Location', 'northeast'); #+end_src -#+NAME: fig:coupling_heavy -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/coupling_heavy.pdf" :var figsize="normal-normal" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/coupling_heavy.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+LABEL: fig:coupling_heavy #+CAPTION: Relative Coupling for heavy mass and low rotation speed -#+RESULTS: fig:coupling_heavy [[file:figs/coupling_heavy.png]] #+begin_important @@ -371,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 ref: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 [[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)]; @@ -410,14 +410,14 @@ 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 eqref:eq:coupledplant, the plant changes with the rotation speed $\omega_0$. +As shown in equation [[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. Then we compare the result between voice coil and piezoelectric actuators. *** Voice coil actuator -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none m = mlight; k = kvc; @@ -433,7 +433,7 @@ Then we compare the result between voice coil and piezoelectric actuators. end #+end_src -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none freqs = logspace(-2, 1, 1000); figure; @@ -463,19 +463,17 @@ Then we compare the result between voice coil and piezoelectric actuators. linkaxes([ax1,ax2],'x'); #+end_src -#+NAME: fig:G_ws_vc -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/G_ws_vc.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/G_ws_vc.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+LABEL: fig:G_ws_vc #+CAPTION: Bode plot of the direct transfer function term (from $F_u$ to $D_u$) for multiple rotation speed - Voice coil -#+RESULTS: fig:G_ws_vc [[file:figs/G_ws_vc.png]] -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none freqs = logspace(-2, 1, 1000); figure; @@ -505,19 +503,17 @@ Then we compare the result between voice coil and piezoelectric actuators. linkaxes([ax1,ax2],'x'); #+end_src -#+NAME: fig:Gc_ws_vc -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/Gc_ws_vc.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/Gc_ws_vc.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+LABEL: fig:Gc_ws_vc #+CAPTION: caption -#+RESULTS: fig:Gc_ws_vc [[file:figs/Gc_ws_vc.png]] *** Piezoelectric actuator -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none m = mlight; k = kpz; @@ -533,7 +529,7 @@ Then we compare the result between voice coil and piezoelectric actuators. end #+end_src -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none freqs = logspace(2, 3, 1000); figure; @@ -563,18 +559,16 @@ Then we compare the result between voice coil and piezoelectric actuators. linkaxes([ax1,ax2],'x'); #+end_src -#+NAME: fig:G_ws_pz -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/G_ws_pz.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/G_ws_pz.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+LABEL: fig:G_ws_pz #+CAPTION: Bode plot of the direct transfer function term (from $F_u$ to $D_u$) for multiple rotation speed - Piezoelectric actuator -#+RESULTS: fig:G_ws_pz [[file:figs/G_ws_pz.png]] -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none figure; ax1 = subaxis(2,1,1); hold on; @@ -602,15 +596,13 @@ Then we compare the result between voice coil and piezoelectric actuators. linkaxes([ax1,ax2],'x'); #+end_src -#+NAME: fig:Gc_ws_pz -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/Gc_ws_pz.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/Gc_ws_pz.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+LABEL: fig:Gc_ws_pz #+CAPTION: Bode plot of the coupling transfer function term (from $F_u$ to $D_v$) for multiple rotation speed - Piezoelectric actuator -#+RESULTS: fig:Gc_ws_pz [[file:figs/Gc_ws_pz.png]] *** Analysis @@ -629,7 +621,7 @@ As shown in the previous figures, the system with voice coil is much more sensit *** Campbell diagram The poles of the system are computed for multiple values of the rotation frequency. To simplify the computation of the poles, we add some damping to the system. -#+begin_src matlab :results silent :exports code +#+begin_src matlab :exports code m = mlight; k = kvc; c = 0.1*sqrt(k*m); @@ -644,7 +636,7 @@ The poles of the system are computed for multiple values of the rotation frequen end #+end_src -#+begin_src matlab :results silent :exports code +#+begin_src matlab :exports code m = mlight; k = kpz; c = 0.1*sqrt(k*m); @@ -659,13 +651,13 @@ 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 ref:fig:poles_w_vc and ref:fig:poles_w_pz). +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]]). When the real part of one pole becomes positive, the system goes unstable. -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). +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]]). -#+begin_src matlab :results silent :exports none +#+begin_src matlab :exports none figure; % Amplitude ax1 = subplot(1,2,1); @@ -691,19 +683,17 @@ For the voice coil (figure ref:fig:poles_w_vc), the system is unstable when the ylabel('Pole Imaginary Part'); #+end_src -#+NAME: fig:poles_w_vc -#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes -#+begin_src matlab :var filepath="figs/poles_w_vc.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes :mkdirp yes +#+begin_src matlab :var filepath="figs/poles_w_vc.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+LABEL: fig:poles_w_vc #+CAPTION: Real and Imaginary part of the poles of the system as a function of the rotation speed - Voice Coil and light sample -#+RESULTS: fig:poles_w_vc [[file:figs/poles_w_vc.png]] -#+begin_src matlab :results silent :exports none +#+begin_src matlab :exports none figure; % Amplitude ax1 = subplot(1,2,1); @@ -729,15 +719,13 @@ For the voice coil (figure ref:fig:poles_w_vc), the system is unstable when the ylabel('Pole Imaginary Part'); #+end_src -#+NAME: fig:poles_w_pz -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/poles_w_pz.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/poles_w_pz.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+LABEL: fig:poles_w_pz #+CAPTION: Real and Imaginary part of the poles of the system as a function of the rotation speed - Piezoelectric actuator and light sample -#+RESULTS: fig:poles_w_pz [[file:figs/poles_w_pz.png]] * Control Strategies @@ -753,7 +741,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 ref:fig:control_measure_fixed_2dof. +The block diagram is shown on figure [[fig:control_measure_fixed_2dof]]. #+name: fig:control_measure_fixed_2dof #+caption: Control with a measure from fixed frame @@ -766,7 +754,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 ref:fig:control_measure_rotating_2dof +The corresponding block diagram is shown figure [[fig:control_measure_rotating_2dof]]. #+name: fig:control_measure_rotating_2dof #+caption: Control with a measure from rotating frame @@ -780,12 +768,23 @@ The loop gain is $L = G K$. :END: <> -** Initialization -#+begin_src matlab :exports none :results silent :noweb yes +** Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :noweb yes :var current_dir=(file-name-directory buffer-file-name) + <> +#+end_src + +#+begin_src matlab :exports none :noweb yes <> +#+end_src +** Initialization +Let's load the previously defined parameters for the model. + +#+begin_src matlab :exports none :noweb yes load('./mat/parameters.mat'); +#+end_src +#+begin_src matlab :results none bode_opts = bodeoptions; bode_opts.FreqUnits = 'Hz'; bode_opts.MagUnits = 'abs'; @@ -798,12 +797,12 @@ The loop gain is $L = G K$. bode_opts.TickLabel.FontSize = 10; #+end_src -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none open rotating_frame.slx #+end_src First we define the parameters that must be defined in order to run the Simscape simulation. -#+begin_src matlab :exports code :results silent +#+begin_src matlab :exports code w = 2*pi; % Rotation speed [rad/s] theta_e = 0; % Static measurement error on the angle theta [rad] @@ -816,7 +815,7 @@ First we define the parameters that must be defined in order to run the Simscape #+end_src Then, we defined parameters that will be used in the following analysis. -#+begin_src matlab :exports code :results silent +#+begin_src matlab :exports code mlight = 5; % Mass for light sample [kg] mheavy = 55; % Mass for heavy sample [kg] @@ -836,7 +835,7 @@ We initialize the inputs and outputs of the system to identify: - Inputs: $f_u$ and $f_v$ - Outputs: $d_u$ and $d_v$ -#+begin_src matlab :exports code :results silent +#+begin_src matlab :exports code %% Options for Linearized options = linearizeOptions; options.SampleTime = 0; @@ -853,7 +852,7 @@ We initialize the inputs and outputs of the system to identify: #+end_src We start we identify the transfer functions at high speed with the light sample. -#+begin_src matlab :exports code :results silent +#+begin_src matlab :exports code w = wlight; % Rotation speed [rad/s] m = mlight; % mass of the sample [kg] @@ -869,7 +868,7 @@ We start we identify the transfer functions at high speed with the light sample. #+end_src Then we identify the system with an heavy mass and low speed. -#+begin_src matlab :exports code :results silent +#+begin_src matlab :exports code w = wheavy; % Rotation speed [rad/s] m = mheavy; % mass of the sample [kg] @@ -887,10 +886,10 @@ 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 ref:fig:coupling_ratio_light_heavy). +From the previous identification, we plot the coupling ratio in both case (figure [[fig:coupling_ratio_light_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 +We obtain the same result than the analytical case (figures [[fig:coupling_light]] and [[fig:coupling_heavy]]). +#+begin_src matlab :exports none figure; hold on; plot(freqs, abs(squeeze(freqresp(Gvc_light('Du', 'Fu'), freqs, 'Hz')))./abs(squeeze(freqresp(Gvc_light('Dv', 'Fu'), freqs, 'Hz')))); @@ -905,22 +904,20 @@ We obtain the same result than the analytical case (figures ref:fig:coupling_lig legend({'light - VC', 'light - PZ', 'heavy - VC', 'heavy - PZ'}, 'Location', 'northeast') #+end_src -#+NAME: fig:coupling_ratio_light_heavy -#+HEADER: :tangle no :exports results :results raw :noweb yes :mkdirp yes -#+begin_src matlab :var filepath="figs/coupling_ratio_light_heavy.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes :mkdirp yes +#+begin_src matlab :var filepath="figs/coupling_ratio_light_heavy.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+LABEL: fig:coupling_ratio_light_heavy #+CAPTION: Coupling ratio obtained with the Simscape model -#+RESULTS: fig:coupling_ratio_light_heavy [[file:figs/coupling_ratio_light_heavy.png]] ** Plant Control - SISO approach *** Plant identification The goal is to study the control problems due to the coupling that appears because of the rotation. -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none %% Options for Linearized options = linearizeOptions; options.SampleTime = 0; @@ -940,9 +937,9 @@ 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 ref:fig:Gvc_speed. +The bode plot of the system not rotating and rotating at 60rpm is shown figure [[fig:Gvc_speed]]. -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none w = 0; % Rotation speed [rad/s] m = mlight; % mass of the sample [kg] kTuv = kvc; @@ -953,7 +950,7 @@ The bode plot of the system not rotating and rotating at 60rpm is shown figure r Gvc.OutputName = {'Du', 'Dv'}; #+end_src -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none w = wlight; % Rotation speed [rad/s] m = mlight; % mass of the sample [kg] kTuv = kvc; @@ -964,27 +961,68 @@ The bode plot of the system not rotating and rotating at 60rpm is shown figure r Gtvc.OutputName = {'Du', 'Dv'}; #+end_src -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none figure; - bode(Gvc, Gtvc, bode_opts) - legend({'Gvc - $\omega = 0$', 'Gvc - $\omega = 60$rpm'}, 'Location', 'southwest'); - title(''); + ax1 = subaxis(2,2,1); + title('From $F_u$ to $D_u$'); + hold on; + plot(freqs, abs(squeeze(freqresp(Gvc(1, 1), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(Gtvc(1, 1), freqs, 'Hz')))); + hold off; + xlim([freqs(1), freqs(end)]); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + set(gca, 'XTickLabel',[]); + ylabel('Magnitude [m/N]'); + + ax2 = subaxis(2,2,3); + hold on; + plot(freqs, 180/pi*angle(squeeze(freqresp(Gvc(1, 1), freqs, 'Hz'))), 'DisplayName', 'Gvc - $\omega = 0$'); + plot(freqs, 180/pi*angle(squeeze(freqresp(Gtvc(1, 1), freqs, 'Hz'))), 'DisplayName', 'Gvc - $\omega = 60$rpm'); + hold off; + yticks(-180:90:180); + ylim([-180 180]); + xlim([freqs(1), freqs(end)]); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); + legend('Location', 'northeast'); + linkaxes([ax1,ax2],'x'); + + ax1 = subaxis(2,2,2); + title('From $F_u$ to $D_v$'); + hold on; + plot(freqs, abs(squeeze(freqresp(Gvc(1, 2), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(Gtvc(1, 2), freqs, 'Hz')))); + hold off; + xlim([freqs(1), freqs(end)]); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + set(gca, 'XTickLabel',[]); + + ax2 = subaxis(2,2,4); + hold on; + plot(freqs, 180/pi*angle(squeeze(freqresp(Gvc(1, 2), freqs, 'Hz'))), 'DisplayName', 'Gvc - $\omega = 0$'); + plot(freqs, 180/pi*angle(squeeze(freqresp(Gtvc(1, 2), freqs, 'Hz'))), 'DisplayName', 'Gvc - $\omega = 60$rpm'); + hold off; + yticks(-180:90:180); + ylim([-180 180]); + xlim([freqs(1), freqs(end)]); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + xlabel('Frequency [Hz]'); + legend('Location', 'northeast'); + linkaxes([ax1,ax2],'x'); #+end_src -#+NAME: fig:Gvc_speed -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/Gvc_speed.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/Gvc_speed.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+LABEL: fig:Gvc_speed #+CAPTION: Change of transfer functions due to rotating speed -#+RESULTS: fig:Gvc_speed [[file:figs/Gvc_speed.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 ref:fig:Guu_ws) and of the coupling element (figure ref:fig:Guv_ws). +Then we compute the bode plot of the system (figure [[fig:Guu_uv_ws]]). As the rotation frequency increases: - one pole goes to lower frequencies while the other goes to higher frequencies @@ -993,40 +1031,44 @@ As the rotation frequency increases: To stabilize the unstable pole, we need a control bandwidth of at least twice of frequency of the unstable pole. -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none ws = linspace(0, 2*pi, 5); % Rotation speed vector [rad/s] m = mlight; % mass of the sample [kg] kTuv = kvc; cTuv = 0.1*sqrt(kTuv*m); - Gs = {zeros(1, length(ws))}; + Gs_vc = {zeros(1, length(ws))}; for i = 1:length(ws) w = ws(i); - Gs{i} = linearize(mdl, io, 0.1); + Gs_vc{i} = linearize(mdl, io, 0.1); + Gs_vc{i}.InputName = {'Fu', 'Fv'}; + Gs_vc{i}.OutputName = {'Du', 'Dv'}; end #+end_src -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none freqs = logspace(-2, 2, 1000); figure; - ax1 = subaxis(2,1,1); + ax1 = subaxis(2,2,1); + title('$D_u/F_u$'); hold on; for i = 1:length(ws) - plot(freqs, abs(squeeze(freqresp(Gs{i}(1, 1), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(Gs_vc{i}(1, 1), freqs, 'Hz')))); end hold off; xlim([freqs(1), freqs(end)]); + ylim([1e-8, 1]); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XTickLabel',[]); ylabel('Magnitude [m/N]'); - ax2 = subaxis(2,1,2); + ax2 = subaxis(2,2,3); hold on; for i = 1:length(ws) - plot(freqs, 180/pi*angle(squeeze(freqresp(Gs{i}(1, 1), freqs, 'Hz'))), 'DisplayName', sprintf('w = %.0f [rpm]', ws(i)*60/2/pi)); + plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_vc{i}(1, 1), freqs, 'Hz')))); end hold off; yticks(-180:90:180); @@ -1034,88 +1076,73 @@ To stabilize the unstable pole, we need a control bandwidth of at least twice of xlim([freqs(1), freqs(end)]); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); + linkaxes([ax1,ax2],'x'); + + ax1 = subaxis(2,2,2); + title('$D_v/F_u$'); + hold on; + for i = 1:length(ws) + plot(freqs, abs(squeeze(freqresp(Gs_vc{i}(1, 2), freqs, 'Hz')))); + end + hold off; + xlim([freqs(1), freqs(end)]); + ylim([1e-8, 1]); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + set(gca, 'XTickLabel',[]); + set(gca, 'YTickLabel',[]); + + ax2 = subaxis(2,2,4); + hold on; + for i = 1:length(ws) + plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_vc{i}(1, 2), freqs, 'Hz'))), 'DisplayName', sprintf('w = %.0f [rpm]', ws(i)*60/2/pi)); + end + hold off; + yticks(-180:90:180); + ylim([-180 180]); + xlim([freqs(1), freqs(end)]); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + set(gca, 'YTickLabel',[]); + xlabel('Frequency [Hz]'); legend('Location', 'northeast'); linkaxes([ax1,ax2],'x'); #+end_src -#+NAME: fig:Guu_ws -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/Guu_ws.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/Guu_uv_ws.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src -#+LABEL: fig:Guu_ws +#+LABEL: fig:Guu_uv_ws #+CAPTION: Diagonal term as a function of the rotation frequency -#+RESULTS: fig:Guu_ws -[[file:figs/Guu_ws.png]] +[[file:figs/Guu_uv_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. -#+begin_src matlab :exports none :results silent - freqs = logspace(-2, 2, 1000); - - figure; - ax1 = subaxis(2,1,1); - hold on; - for i = 1:length(ws) - plot(freqs, abs(squeeze(freqresp(Gs{i}(1, 2), freqs, 'Hz')))); - end - hold off; - xlim([freqs(1), freqs(end)]); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - set(gca, 'XTickLabel',[]); - ylabel('Magnitude [m/N]'); - - ax2 = subaxis(2,1,2); - hold on; - for i = 1:length(ws) - plot(freqs, 180/pi*angle(squeeze(freqresp(Gs{i}(1, 2), freqs, 'Hz'))), 'DisplayName', sprintf('w = %.0f [rpm]', ws(i)*60/2/pi)); - end - hold off; - yticks(-180:90:180); - ylim([-180 180]); - xlim([freqs(1), freqs(end)]); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); - xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); - legend('Location', 'northeast'); - linkaxes([ax1,ax2],'x'); -#+end_src - -#+NAME: fig:Guv_ws -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/Guv_ws.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") - <> -#+end_src - -#+LABEL: fig:Guv_ws -#+CAPTION: Couplin term as a function of the rotation frequency -#+RESULTS: fig:Guv_ws -[[file:figs/Guv_ws.png]] - -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 +#+begin_src matlab :exports none ws = linspace(0, 2*pi, 5); % Rotation speed vector [rad/s] m = mlight; % mass of the sample [kg] kTuv = kpz; cTuv = 0.1*sqrt(kTuv*m); - Gs = {zeros(1, length(ws))}; + Gs_pz = {zeros(1, length(ws))}; for i = 1:length(ws) w = ws(i); - Gs{i} = linearize(mdl, io, 0.1); + Gs_pz{i} = linearize(mdl, io, 0.1); + Gs_pz{i}.InputName = {'Fu', 'Fv'}; + Gs_pz{i}.OutputName = {'Du', 'Dv'}; end #+end_src -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none freqs = logspace(2, 3, 1000); figure; ax1 = subaxis(2,1,1); hold on; for i = 1:length(ws) - plot(freqs, abs(squeeze(freqresp(Gs{i}(1, 1), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(Gs_pz{i}(1, 1), freqs, 'Hz')))); end hold off; xlim([freqs(1), freqs(end)]); @@ -1126,7 +1153,7 @@ Then, we can look at the same plots for the piezoelectric actuator (figure ref:f ax2 = subaxis(2,1,2); hold on; for i = 1:length(ws) - plot(freqs, 180/pi*angle(squeeze(freqresp(Gs{i}(1, 1), freqs, 'Hz'))), 'DisplayName', sprintf('w = %.0f [rpm]', ws(i)*60/2/pi)); + plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_pz{i}(1, 1), freqs, 'Hz'))), 'DisplayName', sprintf('w = %.0f [rpm]', ws(i)*60/2/pi)); end hold off; yticks(-180:90:180); @@ -1138,15 +1165,13 @@ Then, we can look at the same plots for the piezoelectric actuator (figure ref:f linkaxes([ax1,ax2],'x'); #+end_src -#+NAME: fig:Guu_ws_pz -#+HEADER: :tangle no :exports results :results raw :noweb yes +#+HEADER: :tangle no :exports results :results none :noweb yes #+begin_src matlab :var filepath="figs/Guu_ws_pz.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+LABEL: fig:Guu_ws_pz #+CAPTION: Diagonal term as a function of the rotation frequency -#+RESULTS: fig:Guu_ws_pz [[file:figs/Guu_ws_pz.png]] *** Controller design @@ -1157,11 +1182,14 @@ The obtained controller is a lead-lag controller with the following transfer fun Kll = 2.0698e09*(s+40.45)*(s+1.181)/((s+0.01)*(s+198.4)*(s+2790)); K = [Kll 0; 0 Kll]; + + K.InputName = {'Du', 'Dv'}; + K.OutputName = {'Fu', 'Fv'}; #+end_src -The loop gain is displayed figure ref:fig:Gvc_loop_gain. +The loop gain is displayed figure [[fig:Gvc_loop_gain]]. -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none freqs = logspace(-2, 2, 1000); figure; @@ -1185,168 +1213,172 @@ The loop gain is displayed figure ref:fig:Gvc_loop_gain. 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="figs/Gvc_loop_gain.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/Gvc_loop_gain.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+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:figs/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 here want to see if the system is robust with respect to the rotation speed. +We use the controller that was designed based on the dynamics of the non-rotating system. -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. +Let's first plot the SISO loop gain. -#+begin_src matlab :exports none :results silent +#+begin_src matlab :exports none 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'))), '-'); + plot(freqs, abs(squeeze(freqresp(Gs_vc{1}(1, 1)*Kll, freqs, 'Hz'))), '-'); + plot(freqs, abs(squeeze(freqresp(Gs_vc{2}(1, 1)*Kll, freqs, 'Hz'))), '-'); + plot(freqs, abs(squeeze(freqresp(Gs_vc{5}(1, 1)*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'))), '-'); + plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_vc{1}(1, 1)*Kll, freqs, 'Hz'))), 'DisplayName', sprintf('%.0f rpm', ws(1)./(2*pi).*60)); + plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_vc{2}(1, 1)*Kll, freqs, 'Hz'))), 'DisplayName', sprintf('%.0f rpm', ws(2)./(2*pi).*60)); + plot(freqs, 180/pi*angle(squeeze(freqresp(Gs_vc{5}(1, 1)*Kll, freqs, 'Hz'))), 'DisplayName', sprintf('%.0f rpm', ws(5)./(2*pi).*60)); set(gca,'xscale','log'); yticks(-180:180:180); ylim([-180 180]); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); hold off; + legend('Location', 'northeast'); 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="figs/Gtvc_loop_gain.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/loop_gain_turning.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src -#+LABEL: fig:Gtvc_loop_gain -#+CAPTION: Loop gain with the rotating system -#+RESULTS: fig:Gtvc_loop_gain -[[file:figs/Gtvc_loop_gain.png]] +#+NAME: fig:loop_gain_turning +#+CAPTION: Loop Gain $G_u * K$ +[[file:figs/loop_gain_turning.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))) +We can now compute the close-loop systems. +#+begin_src matlab + Gvc_cl = {zeros(1, length(ws))}; + for i = 1:length(ws) + Gvc_cl{i} = feedback(Gs_vc{i}, K, 'name'); + end #+end_src -#+RESULTS: -| -2798 | -| -58.916+94.248i | -| -58.916-94.248i | -| -71.644 | -| 3.1647 | -| -3.3034 | -| -1.1901 | +Let's now look on figure [[fig:evolution_poles_u]] at the evolution of the poles of the system when closing only one loop (controlling only one direction). We see that two complex conjugate poles are approaching the real axis and then they separate: one goes to positive real part and the other goes to negative real part. +The system then goes unstable at some point (here for $\omega=60rpm$). -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))) +#+begin_src matlab + figure; + hold on; + for i = 1:length(ws) + sys = feedback(Gs_vc{i}(1, 1), K(1, 1), 'name'); + plot(real(pole(sys)), imag(pole(sys)), 'o', 'DisplayName', sprintf('$\\omega = %.0f rpm$', ws(i)/(2*pi)*60)); + end + hold off; + xlim([-80, 10]); + xlabel('Real Axis'); ylabel('Imaginary Axis'); + legend('Location', 'northeast'); #+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)) +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/evolution_poles_u.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> #+end_src -#+RESULTS: -: 0 +#+NAME: fig:evolution_poles_u +#+CAPTION: Evolution of the poles of the closed-loop system when closing just one loop +[[file:figs/evolution_poles_u.png]] + +If we look at the poles of the closed loop-system for multiple rotating speed (figure [[fig:poles_cl_system]]) when closing the two loops (MIMO system), we see that they all have a negative real part (stable system), and their evolution on the complex plane is rather small compare to the open loop evolution. + +#+begin_src matlab + figure; + hold on; + for i = 1:length(ws) + plot(real(pole(Gvc_cl{i})), imag(pole(Gvc_cl{i})), 'o', 'DisplayName', sprintf('$\\omega = %.0f rpm$', ws(i)/(2*pi)*60)); + end + hold off; + xlim([-80, 0]); + xlabel('Real Axis'); ylabel('Imaginary Axis'); + legend('Location', 'northeast'); +#+end_src + +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/poles_cl_system.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") + <> +#+end_src + +#+NAME: fig:poles_cl_system +#+CAPTION: Evolution of the poles of the closed-loop system +[[file:figs/poles_cl_system.png]] *** 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). +First, we create the closed loop systems. Then, we plot the transfer function from the reference signals $[r_u, r_v]$ to the output $[d_u, d_v]$ (figure [[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); + freqs = logspace(-2, 3, 1000); figure; ax1 = subplot(1,2,1); + title('$G_{r_u \to d_u}$') hold on; - plot(freqs, abs(squeeze(freqresp(Tvc(1, 1), freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(Ttvc(1, 1), freqs, 'Hz')))); + for i = 1:length(ws) + sys = Gvc_cl{i}*K; + plot(freqs, abs(squeeze(freqresp(sys(1, 1), freqs, 'Hz')))); + end hold off; xlim([freqs(1), freqs(end)]); + ylim([1e-4, 10]); 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); + title('$G_{r_u \to d_v}$') hold on; - plot(freqs, abs(squeeze(freqresp(Tvc(1, 2), freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(Ttvc(1, 2), freqs, 'Hz')))); + for i = 1:length(ws) + sys = Gvc_cl{i}*K; + plot(freqs, abs(squeeze(freqresp(sys(1, 2), freqs, 'Hz'))), 'DisplayName', sprintf('$\\omega = %.0f rpm$', ws(i)/(2*pi)*60)); + end hold off; xlim([freqs(1), freqs(end)]); - ylim([1e-5, 1]); + ylim([1e-4, 10]); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); - title('$G_{r_u \to d_v}$') + legend('Location', 'northeast') linkaxes([ax1,ax2],'x'); #+end_src -#+NAME: fig:perfconp -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/perfconp.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") +#+HEADER: :tangle no :exports results :results none :noweb yes +#+begin_src matlab :var filepath="figs/perfcomp.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src -#+LABEL: fig:perfconp +#+LABEL: fig:perfcomp #+CAPTION: Close loop performance for $\omega = 0$ and $\omega = 60 rpm$ -#+RESULTS: fig:perfconp -[[file:figs/perfconp.png]] +[[file:figs/perfcomp.png]] -** Plant Control - MIMO approach -*** TODO Analysis - SVD +*** Conclusion +#+begin_important + Even though considering one input and output at a time would results in an unstable system (figure [[fig:evolution_poles_u]]), when using the diagonal MIMO controller, the system stays stable (figure [[fig:poles_cl_system]]). This could be understood by saying that when controlling both directions at the same time, the coupling effect should be much lower than when controlling only one direction. + + The close-loop performance does not vary a lot with the rotating speed (figure [[fig:perfcomp]]) even tough the open loop system is varying quite a lot (figure [[fig:Guu_uv_ws]]). +#+end_important + +** BKMK Plant Control - MIMO approach +*** Analysis - SVD +The singular value decomposition of a MIMO system $G$ is defined as follow: \[ G = U \Sigma V^H \] With: @@ -1354,41 +1386,15 @@ 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 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] +We first look at the evolution of the singular values as a function of frequency (figure [[fig:G_sigma]]). - kTuv = kvc; - cTuv = 0.1*sqrt(kTuv*m); - - Gs = {zeros(1, length(ws))}; - - for i = 1:length(ws) - w = ws(i); - Gs{i} = linearize(mdl, io, 0.1); - end -#+end_src - -#+begin_src matlab :results silent :exports none - freqs = logspace(-2, 2, 1000); - - figure; - hold on; - for i = 1:length(ws) - plot(freqs, abs(squeeze(freqresp(Gs{i}(1,1), freqs, 'Hz'))), '-'); - end - hold off; - set(gca,'xscale','log'); set(gca,'yscale','log'); -#+end_src - -#+begin_src matlab :results silent :exports none +#+begin_src matlab :exports none freqs = logspace(-2, 1, 1000); figure; hold on; for i = 1:length(ws) - sv = sigma(Gs{i}, 2*pi*freqs); + sv = sigma(Gs_vc{i}, 2*pi*freqs); set(gca,'ColorOrderIndex',i) plot(freqs, sv(1, :), 'DisplayName', sprintf('w = %.0f rpm', ws(i)*60/2/pi)); set(gca,'ColorOrderIndex',i) @@ -1399,359 +1405,17 @@ We first look at the evolution of the singular values as a function of frequency legend('location', 'southwest'); #+end_src -#+NAME: fig:G_sigma -#+HEADER: :tangle no :exports results :results raw :noweb yes +#+HEADER: :tangle no :exports results :results none :noweb yes #+begin_src matlab :var filepath="figs/G_sigma.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+LABEL: fig:G_sigma -#+CAPTION: caption -#+RESULTS: fig:G_sigma #+CAPTION: Evolution of the singular values with frequency [[file:figs/G_sigma.png]] -We compute -#+begin_src matlab :results silent :exports code - [U,S,V] = svd(freqresp(Gtvc, 2*pi*10)); -#+end_src - -#+begin_src matlab :results output :exports results - U, S, V -#+end_src - -#+RESULTS: -#+begin_example -U, S, V -U = - -0.707101109012986 - 0.00283224868340902i -0.707104254409621 - 0.00189034277692295i - 0.00283224868340845 - 0.707101109012987i -0.00189034277692242 + 0.70710425440962i -S = - 9.01532756059351e-06 0 - 0 6.01714794171208e-06 -V = - 0.707106781186547 + 0i 0.707106781186548 + 0i - -1.57009245868378e-16 + 0.707106781186548i 1.57009245868377e-16 - 0.707106781186547i -#+end_example - -The input and output directions are related through the singular values -\[ G v_i = \sigma_i u_i \] - -So, if we consider an input in the direction $v_i$, then the output is in the direction $u_i$. Furthermore, since $\normtwo{v_i}=1$ and $\normtwo{u_i}=1$, we see that *the singular value $\sigma_i$ directly gives the gain of the matrix $G$ in this direction*. - -#+begin_src matlab - freqresp(Gtvc, 2*pi*10)*V(:, 1) -#+end_src - -#+RESULTS: -| -6.3747e-06-2.5534e-08i | -| 2.5534e-08-6.3747e-06i | - -#+begin_src matlab - S(1)*U(:, 1) -#+end_src - -#+RESULTS: -| -6.3747e-06-2.5534e-08i | -| 2.5534e-08-6.3747e-06i | - -*** Closed loop SVD -#+begin_src matlab :results silent :exports none - figure; - sigma(Tvc, Ttvc) -#+end_src - -** test - -#+begin_src matlab :exports none :results silent - figure; - % Amplitude - ax1 = subaxis(2,1,1); - hold on; - plot(freqs, abs(squeeze(freqresp(Gvc_light('du', 'fu'), 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_light('du', 'fu'), freqs, 'Hz')))), '-'); - set(gca,'xscale','log'); - yticks(-180:180:180); - xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); - hold off; - linkaxes([ax1,ax2],'x'); -#+end_src - -#+begin_src matlab :exports none :results silent - figure; - % Amplitude - ax1 = subaxis(2,1,1); - hold on; - plot(freqs, abs(squeeze(freqresp(-Gvc_light('dv', 'fv'), 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_light('dv', 'fv'), freqs, 'Hz')))), '-'); - set(gca,'xscale','log'); - yticks(-180:180:180); - xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); - hold off; - linkaxes([ax1,ax2],'x'); -#+end_src - -#+begin_src matlab :exports none :results silent - figure; - bode(Gpz_light, Gvc_light); -#+end_src - -#+NAME: fig:coupling_simscape -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/coupling_simscape.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") - <> -#+end_src - -#+LABEL: fig:coupling_simscape -#+CAPTION: caption -#+RESULTS: fig:coupling_simscape -[[file:figs/coupling_simscape_light.png]] - -And then with the heavy sample. -#+begin_src matlab :exports code :results silent - rot_speed = wheavy; - angle_e = 0; - m = mheavy; - - k = kpz; - c = 1e3; - Gpz_heavy = linearize(mdl, io, 0.1); - - k = kvc; - c = 1e3; - Gvc_heavy = linearize(mdl, io, 0.1); - - Gpz_heavy.InputName = {'Fu', 'Fv'}; - Gpz_heavy.OutputName = {'Du', 'Dv'}; - Gvc_heavy.InputName = {'Fu', 'Fv'}; - Gvc_heavy.OutputName = {'Du', 'Dv'}; -#+end_src - -#+begin_src matlab :exports none :results silent - figure; - bode(Gpz_heavy, Gvc_heavy); -#+end_src - -#+NAME: fig:coupling_simscape_heavy -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/coupling_simscape_heavy.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") - <> -#+end_src - -#+LABEL: fig:coupling_simscape_heavy -#+CAPTION: caption -#+RESULTS: fig:coupling_simscape_heavy -[[file:figs/coupling_simscape_heavy.png]] - -Plot the ratio between the main transfer function and the coupling term: -#+begin_src matlab :results silent :exports none - freqs = logspace(-2, 3, 1000); - - figure; - hold on; - plot(freqs, abs(squeeze(freqresp(Gvc_light('Du', 'Fu'), freqs, 'Hz')))./abs(squeeze(freqresp(Gvc_light('Dv', 'Fu'), freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(Gpz_light('Du', 'Fu'), freqs, 'Hz')))./abs(squeeze(freqresp(Gpz_light('Dv', 'Fu'), freqs, 'Hz')))); - hold off; - xlim([freqs(1), freqs(end)]); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - xlabel('Frequency [Hz]'); ylabel('Coupling ratio'); - legend({'Voice Coil', 'Piezoelectric'}) -#+end_src - -#+NAME: fig:coupling_ratio_simscape_light -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/coupling_ratio_simscape_light.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") - <> -#+end_src - -#+LABEL: fig:coupling_ratio_simscape_light -#+CAPTION: caption -#+RESULTS: fig:coupling_ratio_simscape_light -[[file:figs/coupling_ratio_simscape_light.png]] - -#+begin_src matlab :results silent :exports none - freqs = logspace(-2, 3, 1000); - - figure; - hold on; - plot(freqs, abs(squeeze(freqresp(Gvc_heavy('Du', 'Fu'), freqs, 'Hz')))./abs(squeeze(freqresp(Gvc_heavy('Dv', 'Fu'), freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(Gpz_heavy('Du', 'Fu'), freqs, 'Hz')))./abs(squeeze(freqresp(Gpz_heavy('Dv', 'Fu'), freqs, 'Hz')))); - hold off; - xlim([freqs(1), freqs(end)]); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - xlabel('Frequency [Hz]'); ylabel('Coupling ratio'); - legend({'Voice Coil', 'Piezoelectric'}) -#+end_src - -#+NAME: fig:coupling_ratio_simscape_heavy -#+HEADER: :tangle no :exports results :results raw :noweb yes -#+begin_src matlab :var filepath="figs/coupling_ratio_simscape_heavy.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") - <> -#+end_src - -#+LABEL: fig:coupling_ratio_simscape_heavy -#+CAPTION: caption -#+RESULTS: fig:coupling_ratio_simscape_heavy -[[file:figs/coupling_ratio_simscape_heavy.png]] - -*** Low rotation speed and High rotation speed -#+begin_src matlab :exports code :results silent - rot_speed = 2*pi/60; angle_e = 0; - G_low = linearize(mdl, io, 0.1); - - rot_speed = 2*pi; angle_e = 0; - G_high = linearize(mdl, io, 0.1); - - G_low.InputName = {'Fu', 'Fv'}; - G_low.OutputName = {'Du', 'Dv'}; - G_high.InputName = {'Fu', 'Fv'}; - G_high.OutputName = {'Du', 'Dv'}; -#+end_src - -#+begin_src matlab :results silent - figure; - bode(G_low, G_high); -#+end_src - -** Identification in the fixed frame -Let's define some options as well as the inputs and outputs for linearization. -#+begin_src matlab :exports code :results silent - %% Options for Linearized - options = linearizeOptions; - options.SampleTime = 0; - - %% Name of the Simulink File - mdl = 'rotating_frame'; - - %% Input/Output definition - io(1) = linio([mdl, '/fx'], 1, 'input'); - io(2) = linio([mdl, '/fy'], 1, 'input'); - - io(3) = linio([mdl, '/dx'], 1, 'output'); - io(4) = linio([mdl, '/dy'], 1, 'output'); -#+end_src - -We then define the error estimation of the error and the rotational speed. -#+begin_src matlab :exports code :results silent - %% Run the linearization - angle_e = 0; - rot_speed = 0; -#+end_src - -Finally, we run the linearization. -#+begin_src matlab :exports code :results silent - G = linearize(mdl, io, 0); - - %% Input/Output names - G.InputName = {'Fx', 'Fy'}; - G.OutputName = {'Dx', 'Dy'}; -#+end_src - -#+begin_src matlab :exports code :results silent - %% Run the linearization - angle_e = 0; - rot_speed = 2*pi; - Gr = linearize(mdl, io, 0); - - %% Input/Output names - Gr.InputName = {'Fx', 'Fy'}; - Gr.OutputName = {'Dx', 'Dy'}; -#+end_src - -#+begin_src matlab :exports code :results silent - %% Run the linearization - angle_e = 1*2*pi/180; - rot_speed = 2*pi; - Ge = linearize(mdl, io, 0); - - %% Input/Output names - Ge.InputName = {'Fx', 'Fy'}; - Ge.OutputName = {'Dx', 'Dy'}; -#+end_src - -#+begin_src matlab :exports code :results silent - figure; - bode(G); - % exportFig('G_x_y', 'wide-tall'); - - figure; - bode(Ge); - % exportFig('G_x_y_e', 'normal-normal'); -#+end_src - -** Identification from actuator forces to displacement in the fixed frame -#+begin_src matlab :exports code :results silent - %% Options for Linearized - options = linearizeOptions; - options.SampleTime = 0; - - %% Name of the Simulink File - mdl = 'rotating_frame'; - - %% Input/Output definition - io(1) = linio([mdl, '/fu'], 1, 'input'); - io(2) = linio([mdl, '/fv'], 1, 'input'); - - io(3) = linio([mdl, '/dx'], 1, 'output'); - io(4) = linio([mdl, '/dy'], 1, 'output'); -#+end_src - -#+begin_src matlab :exports code :results silent - rot_speed = 2*pi; - angle_e = 0; - G = linearize(mdl, io, 0.0); - - G.InputName = {'Fu', 'Fv'}; - G.OutputName = {'Dx', 'Dy'}; -#+end_src - -#+begin_src matlab :exports code :results silent - rot_speed = 2*pi; - angle_e = 0; - G1 = linearize(mdl, io, 0.4); - - G1.InputName = {'Fu', 'Fv'}; - G1.OutputName = {'Dx', 'Dy'}; -#+end_src - -#+begin_src matlab :exports code :results silent - rot_speed = 2*pi; - angle_e = 0; - G2 = linearize(mdl, io, 0.8); - - G2.InputName = {'Fu', 'Fv'}; - G2.OutputName = {'Dx', 'Dy'}; -#+end_src - -#+begin_src matlab :exports code :results silent - figure; - bode(G, G1, G2); - exportFig('G_u_v_to_x_y', 'wide-tall'); -#+end_src - -** Effect of the X-Y stage stiffness - <> - -*** TODO At full speed, check how the coupling changes with the stiffness of the actuators - * Control Implementation <> -** Measurement in the fixed reference frame - * Bibliography :ignore: # #+BIBLIOGRAPHY: /home/tdehaeze/MEGA/These/Ressources/references.bib plain option:-a option:-noabstract option:-nokeywords option:-noheader option:-nofooter option:-nobibsource limit:t diff --git a/mat/parameters.mat b/mat/parameters.mat index 6dd25b7..21835c7 100644 Binary files a/mat/parameters.mat and b/mat/parameters.mat differ