phd-nass-rotating-3dof-model/rotating_frame.org

59 KiB

Control in a rotating frame

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

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

Finally, in section ref:sec:control, the control strategies are implemented using Simulink and Simscape and compared.

System Description and Analysis

<<sec:system>>

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

The measurement is either the $x-y$ displacement of the object located on top of the translation stage or the $u-v$ displacement of the sample with respect to a fixed reference frame.

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/rotating_frame_2dof.png
Schematic of the mecanical system

In the following block diagram:

  • $G$ is the transfer function from the forces applied in the actuators to the measurement
  • $K$ is the controller to design
  • $J$ is a Jacobian matrix usually used to change the reference frame

Indices $x$ and $y$ corresponds to signals in the fixed reference frame (along $\vec{i}_x$ and $\vec{i}_y$):

  • $D_x$ is the measured position of the sample
  • $r_x$ is the reference signal which corresponds to the wanted $D_x$
  • $\epsilon_x$ is the position error

Indices $u$ and $v$ corresponds to signals in the rotating reference frame ($\vec{i}_u$ and $\vec{i}_v$):

  • $F_u$ and $F_v$ are forces applied by the actuators
  • $\epsilon_u$ and $\epsilon_v$ are position error of the sample along $\vec{i}_u$ and $\vec{i}_v$

Equations

<<sec:equations>> 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$:

\begin{align} T & = \frac{1}{2} m \left( \dot{x}^2 + \dot{y}^2 \right) \\ V & = \frac{1}{2} k \left( x^2 + y^2 \right) \end{align}

The Lagrangian is the kinetic energy minus the potential energy.

\begin{equation} L = T-V = \frac{1}{2} m \left( \dot{x}^2 + \dot{y}^2 \right) - \frac{1}{2} k \left( x^2 + y^2 \right) \end{equation}

The partial derivatives of the Lagrangian with respect to the variables $(x, y)$ are:

\begin{align*} \frac{\partial L}{\partial x} & = -kx \\ \frac{\partial L}{\partial y} & = -ky \\ \frac{d}{dt}\frac{\partial L}{\partial \dot{x}} & = m\ddot{x} \\ \frac{d}{dt}\frac{\partial L}{\partial \dot{y}} & = m\ddot{y} \end{align*}

The external forces applied to the mass are:

\begin{align*} F_{\text{ext}, x} &= F_u \cos{\theta} - F_v \sin{\theta}\\ F_{\text{ext}, y} &= F_u \sin{\theta} + F_v \cos{\theta} \end{align*}

By appling the Lagrangian equations, we obtain:

\begin{align} m\ddot{x} + kx = F_u \cos{\theta} - F_v \sin{\theta}\\ m\ddot{y} + ky = F_u \sin{\theta} + F_v \cos{\theta} \end{align}

We then change coordinates from $(x, y)$ to $(d_x, d_y, \theta)$.

\begin{align*} x & = d_u \cos{\theta} - d_v \sin{\theta}\\ y & = d_u \sin{\theta} + d_v \cos{\theta} \end{align*}

We obtain:

\begin{align*} \ddot{x} & = \ddot{d_u} \cos{\theta} - 2\dot{d_u}\dot{\theta}\sin{\theta} - d_u\ddot{\theta}\sin{\theta} - d_u\dot{\theta}^2 \cos{\theta} - \ddot{d_v} \sin{\theta} - 2\dot{d_v}\dot{\theta}\cos{\theta} - d_v\ddot{\theta}\cos{\theta} + d_v\dot{\theta}^2 \sin{\theta} \\ \ddot{y} & = \ddot{d_u} \sin{\theta} + 2\dot{d_u}\dot{\theta}\cos{\theta} + d_u\ddot{\theta}\cos{\theta} - d_u\dot{\theta}^2 \sin{\theta} + \ddot{d_v} \cos{\theta} - 2\dot{d_v}\dot{\theta}\sin{\theta} - d_v\ddot{\theta}\sin{\theta} - d_v\dot{\theta}^2 \cos{\theta} \\ \end{align*}

By injecting the previous result into the Lagrangian equation, we obtain:

\begin{align*} m \ddot{d_u} \cos{\theta} - 2m\dot{d_u}\dot{\theta}\sin{\theta} - m d_u\ddot{\theta}\sin{\theta} - m d_u\dot{\theta}^2 \cos{\theta} -m \ddot{d_v} \sin{\theta} - 2m\dot{d_v}\dot{\theta}\cos{\theta} - m d_v\ddot{\theta}\cos{\theta} + m d_v\dot{\theta}^2 \sin{\theta} + k d_u \cos{\theta} - k d_v \sin{\theta} = F_u \cos{\theta} - F_v \sin{\theta} \\ m \ddot{d_u} \sin{\theta} + 2m\dot{d_u}\dot{\theta}\cos{\theta} + m d_u\ddot{\theta}\cos{\theta} - m d_u\dot{\theta}^2 \sin{\theta} + m \ddot{d_v} \cos{\theta} - 2m\dot{d_v}\dot{\theta}\sin{\theta} - m d_v\ddot{\theta}\sin{\theta} - m d_v\dot{\theta}^2 \cos{\theta} + k d_u \sin{\theta} + k d_v \cos{\theta} = F_u \sin{\theta} + F_v \cos{\theta} \end{align*}

Which is equivalent to:

\begin{align*} m \ddot{d_u} - 2m\dot{d_u}\dot{\theta}\frac{\sin{\theta}}{\cos{\theta}} - m d_u\ddot{\theta}\frac{\sin{\theta}}{\cos{\theta}} - m d_u\dot{\theta}^2 -m \ddot{d_v} \frac{\sin{\theta}}{\cos{\theta}} - 2m\dot{d_v}\dot{\theta} - m d_v\ddot{\theta} + m d_v\dot{\theta}^2 \frac{\sin{\theta}}{\cos{\theta}} + k d_u - k d_v \frac{\sin{\theta}}{\cos{\theta}} = F_u - F_v \frac{\sin{\theta}}{\cos{\theta}} \\ m \ddot{d_u} + 2m\dot{d_u}\dot{\theta}\frac{\cos{\theta}}{\sin{\theta}} + m d_u\ddot{\theta}\frac{\cos{\theta}}{\sin{\theta}} - m d_u\dot{\theta}^2 + m \ddot{d_v} \frac{\cos{\theta}}{\sin{\theta}} - 2m\dot{d_v}\dot{\theta} - m d_v\ddot{\theta} - m d_v\dot{\theta}^2 \frac{\cos{\theta}}{\sin{\theta}} + k d_u + k d_v \frac{\cos{\theta}}{\sin{\theta}} = F_u + F_v \frac{\cos{\theta}}{\sin{\theta}} \end{align*}

We can then subtract and add the previous equations to obtain the following equations:

\begin{equation} m \ddot{d_u} + (k - m\dot{\theta}^2) d_u = F_u + 2 m\dot{d_v}\dot{\theta} + m d_v\ddot{\theta} \end{equation} \begin{equation} m \ddot{d_v} + (k - m\dot{\theta}^2) d_v = F_v - 2 m\dot{d_u}\dot{\theta} - m d_u\ddot{\theta} \end{equation}

We obtain two differential equations that are coupled through:

  • Euler forces: $m d_v \ddot{\theta}$
  • Coriolis forces: $2 m \dot{d_v} \dot{\theta}$

Without the coupling terms, each equation is the equation of a one degree of freedom mass-spring system with mass $m$ and stiffness $k- m\dot{\theta}^2$. Thus, the term $- m\dot{\theta}^2$ acts like a negative stiffness (due to centrifugal forces).

The forces induced by the rotating reference frame are independent of the stiffness of the actuator. The resulting effect of those forces should then be higher when using softer actuators.

Numerical Values for the NASS

Let's define the parameters for the NASS.

Light sample mass [kg] 3.5e+01
Heavy sample mass [kg] 8.5e+01
Max rot. speed - light [rpm] 6.0e+01
Max rot. speed - heavy [rpm] 1.0e+00
Voice Coil Stiffness [N/m] 1.0e+03
Piezo Stiffness [N/m] 1.0e+08
Max rot. acceleration [rad/s2] 1.0e+00
Max mass excentricity [m] 1.0e-02
Max Horizontal speed [m/s] 2.0e-01

Euler and Coriolis forces - Numerical Result

First we will determine the value for Euler and Coriolis forces during regular experiment.

  • Euler forces: $m d_v \ddot{\theta}$
  • Coriolis forces: $2 m \dot{d_v} \dot{\theta}$

The obtained values are displayed in table ref:tab:euler_coriolis.

Light Heavy
Coriolis 88.0N 3.6N
Euler 0.4N 0.8N
Euler and Coriolis forces for the NASS

Negative Spring Effect - Numerical Result

The negative stiffness due to the rotation is equal to $-m{\omega_0}^2$.

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.

Light Heavy
Neg. Spring 1381.7[N/m] 0.9[N/m]
Negative Spring effect

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:

\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: \[ d_v = \frac{1}{m s^2 + (k - m{\omega_0}^2)} F_v - \frac{2 m {\omega_0} s}{m s^2 + (k - m{\omega_0}^2)} d_u \]

And we re-inject $d_v$ into the first equation:

\begin{equation*} (m s^2 + (k - m{\omega_0}^2)) d_u = F_u + \frac{2 m {\omega_0} s}{m s^2 + (k - m{\omega_0}^2)} F_v - \frac{(2 m {\omega_0} s)^2}{m s^2 + (k - m{\omega_0}^2)} d_u \end{equation*} \begin{equation*} \frac{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2}{m s^2 + (k - m{\omega_0}^2)} d_u = F_u + \frac{2 m {\omega_0} s}{m s^2 + (k - m{\omega_0}^2)} F_v \end{equation*}

Finally we obtain $d_u$ function of $F_u$ and $F_v$. \[ d_u = \frac{m s^2 + (k - m{\omega_0}^2)}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2} F_u + \frac{2 m {\omega_0} s}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2} F_v \]

Similarly we can obtain $d_v$ function of $F_u$ and $F_v$: \[ d_v = \frac{m s^2 + (k - m{\omega_0}^2)}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2} F_v - \frac{2 m {\omega_0} s}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2} F_u \]

The two previous equations can be written in a matrix form:

\begin{equation} \begin{bmatrix} d_u \\ d_v \end{bmatrix} = \frac{1}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2} \begin{bmatrix} ms^2 + (k-m{\omega_0}^2) & 2 m \omega_0 s \\ -2 m \omega_0 s & ms^2 + (k-m{\omega_0}^2) \\ \end{bmatrix} \begin{bmatrix} F_u \\ F_v \end{bmatrix} \end{equation}

Then, coupling is negligible if $|-m \omega^2 + (k - m{\omega_0}^2)| \gg |2 m {\omega_0} \omega|$.

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).
  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/coupling_light.png

Relative Coupling for light mass and high rotation speed
  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/coupling_heavy.png

Relative Coupling for heavy mass and low rotation speed

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.

Voice Coil Piezo
Light 5[rpm] 1614[rpm]
Heavy 3[rpm] 1036[rpm]
Maximum rotation speed at which negative stiffness is negligible ($0.1\sqrt{\frac{k}{m}}$)

The negative spring effect is proportional to the rotational speed $\omega$. The system dynamics will be much more affected when using soft actuator.

Negative stiffness effect has very important effect when using soft actuators.

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 sec:tab:min_k)

Light Heavy
k min [N/m] 2199 89
Minimum possible stiffness

Effect of rotation speed on the plant

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.

Then we compare the result between voice coil and piezoelectric actuators.

Voice coil actuator

  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/G_ws_vc.png

Bode plot of the direct transfer function term (from $F_u$ to $D_u$) for multiple rotation speed - Voice coil
  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/Gc_ws_vc.png

caption

Piezoelectric actuator

  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/G_ws_pz.png

Bode plot of the direct transfer function term (from $F_u$ to $D_u$) for multiple rotation speed - Piezoelectric actuator
  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/Gc_ws_pz.png

Bode plot of the coupling transfer function term (from $F_u$ to $D_v$) for multiple rotation speed - Piezoelectric actuator

Analysis

When the rotation speed is null, the coupling terms are equal to zero and the diagonal terms corresponds to one degree of freedom mass spring system.

When the rotation speed in not null, the resonance frequency is duplicated into two pairs of complex conjugate poles.

As the rotation speed increases, one of the two resonant frequency goes to lower frequencies as the other one goes to higher frequencies.

The poles of the coupling terms are the same as the poles of the diagonal terms. The magnitude of the coupling terms are increasing with the rotation speed.

As shown in the previous figures, the system with voice coil is much more sensitive to rotation speed.

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.

  m = mlight;
  k = kvc;
  c = 0.1*sqrt(k*m);

  wsvc = linspace(0, 10, 100); % [rad/s]

  polesvc = zeros(2, length(wsvc));

  for i = 1:length(wsvc)
    polei = pole(1/((m*s^2 + c*s + (k - m*wsvc(i)^2))^2 + (2*m*wsvc(i)*s)^2));
    polesvc(:, i) = sort(polei(imag(polei) > 0));
  end
  m = mlight;
  k = kpz;
  c = 0.1*sqrt(k*m);

  wspz = linspace(0, 1000, 100); % [rad/s]

  polespz = zeros(2, length(wspz));

  for i = 1:length(wspz)
    polei = pole(1/((m*s^2 + c*s + (k - m*wspz(i)^2))^2 + (2*m*wspz(i)*s)^2));
    polespz(:, i) = sort(polei(imag(polei) > 0));
  end

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

  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/poles_w_vc.png

Real and Imaginary part of the poles of the system as a function of the rotation speed - Voice Coil and light sample
  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/poles_w_pz.png

Real and Imaginary part of the poles of the system as a function of the rotation speed - Piezoelectric actuator and light sample

Control Strategies

<<sec:control_strategies>>

Measurement in the fixed reference frame

First, let's consider a measurement in the fixed referenced frame.

The transfer function from actuator $[F_u, F_v]$ to sensor $[D_x, D_y]$ is then $G(\theta)$.

Then the measurement is subtracted to the reference signal $[r_x, r_y]$ to obtain the position error in the fixed reference frame $[\epsilon_x, \epsilon_y]$.

The position error $[\epsilon_x, \epsilon_y]$ is then express in the rotating frame corresponding to the actuators $[\epsilon_u, \epsilon_v]$.

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.

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/control_measure_fixed_2dof.png
Control with a measure from fixed frame

The loop gain is then $L = G(\theta) K J(\theta)$.

One question we wish to answer is: is $G(\theta) J(\theta) = G(\theta_0) J(\theta_0)$?

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

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/control_measure_rotating_2dof.png
Control with a measure from rotating frame

The loop gain is $L = G K$.

Multi Body Model - Simscape

<<sec:simscape>>

Initialization

First we define the parameters that must be defined in order to run the Simscape simulation.

  w = 2*pi; % Rotation speed [rad/s]

  theta_e = 0; % Static measurement error on the angle theta [rad]

  m = 5; % mass of the sample [kg]

  mTuv = 30;% Mass of the moving part of the Tuv stage [kg]
  kTuv = 1e8; % Stiffness of the Tuv stage [N/m]
  cTuv = 0; % Damping of the Tuv stage [N/(m/s)]

Then, we defined parameters that will be used in the following analysis.

  mlight = 5; % Mass for light sample [kg]
  mheavy = 55; % Mass for heavy sample [kg]

  wlight = 2*pi; % Max rot. speed for light sample [rad/s]
  wheavy = 2*pi/60; % Max rot. speed for heavy sample [rad/s]

  kvc = 1e3; % Voice Coil Stiffness [N/m]
  kpz = 1e8; % Piezo Stiffness [N/m]

  d = 0.01; % Maximum excentricity from rotational axis [m]

  freqs = logspace(-2, 3, 1000); % Frequency vector for analysis [Hz]

Identification in the rotating referenced frame

We initialize the inputs and outputs of the system to identify:

  • Inputs: $f_u$ and $f_v$
  • Outputs: $d_u$ and $d_v$
  %% 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, '/du'], 1, 'output');
  io(4) = linio([mdl, '/dv'], 1, 'output');

We start we identify the transfer functions at high speed with the light sample.

  w = wlight; % Rotation speed [rad/s]
  m = mlight; % mass of the sample [kg]

  kTuv = kpz;
  Gpz_light = linearize(mdl, io, 0.1);
  Gpz_light.InputName  = {'Fu', 'Fv'};
  Gpz_light.OutputName = {'Du', 'Dv'};

  kTuv = kvc;
  Gvc_light = linearize(mdl, io, 0.1);
  Gvc_light.InputName  = {'Fu', 'Fv'};
  Gvc_light.OutputName = {'Du', 'Dv'};

Then we identify the system with an heavy mass and low speed.

  w = wheavy; % Rotation speed [rad/s]
  m = mheavy; % mass of the sample [kg]

  kTuv = kpz;
  Gpz_heavy = linearize(mdl, io, 0.1);
  Gpz_heavy.InputName  = {'Fu', 'Fv'};
  Gpz_heavy.OutputName = {'Du', 'Dv'};

  kTuv = kvc;
  Gvc_heavy = linearize(mdl, io, 0.1);
  Gvc_heavy.InputName  = {'Fu', 'Fv'};
  Gvc_heavy.OutputName = {'Du', 'Dv'};

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

We obtain the same result than the analytical case (figures ref:fig:coupling_light and ref:fig:coupling_heavy).

  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/coupling_ratio_light_heavy.png

Coupling ratio obtained with the Simscape model

Plant Control - SISO approach

Plant identification

The goal is to study the control problems due to the coupling that appears because of the rotation.

First, we identify the system when the rotation speed is null and then when the rotation speed is equal to 60rpm.

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.

  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/Gvc_speed.png

Change of transfer functions due to rotating speed

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

As the rotation frequency increases:

  • one pole goes to lower frequencies while the other goes to higher frequencies
  • one zero appears between the two poles
  • the zero disappears when $\omega > \sqrt{\frac{k}{m}}$ and the low frequency pole becomes unstable (positive real part)

To stabilize the unstable pole, we need a control bandwidth of at least twice of frequency of the unstable pole.

  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/Guu_ws.png

Diagonal term as a function of the rotation frequency
  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/Guv_ws.png

Couplin term as a function of the rotation frequency

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.

  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/Guu_ws_pz.png

Diagonal term as a function of the rotation frequency

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.

  Kll = 2.0698e09*(s+40.45)*(s+1.181)/((s+0.01)*(s+198.4)*(s+2790));
  K = [Kll 0;
       0   Kll];

The loop gain is displayed figure ref:fig:Gvc_loop_gain.

  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/Gvc_loop_gain.png

Loop gain obtained for a lead-lag controller on the system with a voice coil

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.

  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/Gtvc_loop_gain.png

Loop gain with the rotating system

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.

The system is then unstable when controlling only one direction.

  pole(feedback(Gtvc, blkdiag(Kll, 0)))
-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.

  pole(feedback(Gtvc, blkdiag(Kll, Kll)))
-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.

  isstable(1/(1+K*Gtvc))
  isstable(Gtvc/(1+K*Gtvc))
  isstable(Gtvc/(1+K*Gtvc))
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).

  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);
  figure;
  bode(S, St, 2*pi*freqs, bode_opts)
  figure;
  bode(T, Tt, 2*pi*freqs, bode_opts)
  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');
  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/perfconp.png

Close loop performance for $\omega = 0$ and $\omega = 60 rpm$

Plant Control - MIMO approach

TODO Analysis - SVD

\[ G = U \Sigma V^H \]

With:

  • $\Sigma$ is an $2 \times 2$ matrix with 2 non-negative singular values $\sigma_i$, arranged in descending order along its main diagonal
  • $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).

  <<plt-matlab>>
/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/G_sigma.png
Evolution of the singular values with frequency
caption

We compute

  [U,S,V] = svd(freqresp(Gtvc, 2*pi*10));
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

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.

  freqresp(Gtvc, 2*pi*10)*V(:, 1)
-6.3747e-06-2.5534e-08i
2.5534e-08-6.3747e-06i
  S(1)*U(:, 1)
-6.3747e-06-2.5534e-08i
2.5534e-08-6.3747e-06i

Closed loop SVD

test

  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/coupling_simscape_light.png

caption

And then with the heavy sample.

  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'};
  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/coupling_simscape_heavy.png

caption

Plot the ratio between the main transfer function and the coupling term:

  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/coupling_ratio_simscape_light.png

caption
  <<plt-matlab>>

/tdehaeze/phd-nass-rotating-3dof-model/media/commit/489a1630061aa8747ded112c3d33482bb7442853/Figures/coupling_ratio_simscape_heavy.png

caption

Low rotation speed and High rotation speed

  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'};
  figure;
  bode(G_low, G_high);

Identification in the fixed frame

Let's define some options as well as the inputs and outputs for linearization.

  %% 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');

We then define the error estimation of the error and the rotational speed.

  %% Run the linearization
  angle_e = 0;
  rot_speed = 0;

Finally, we run the linearization.

  G = linearize(mdl, io, 0);

  %% Input/Output names
  G.InputName  = {'Fx', 'Fy'};
  G.OutputName = {'Dx', 'Dy'};
  %% 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'};
  %% 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'};
  figure;
  bode(G);
  % exportFig('G_x_y', 'wide-tall');

  figure;
  bode(Ge);
  % exportFig('G_x_y_e', 'normal-normal');

Identification from actuator forces to displacement in the fixed frame

  %% 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');
  rot_speed = 2*pi;
  angle_e = 0;
  G = linearize(mdl, io, 0.0);

  G.InputName  = {'Fu', 'Fv'};
  G.OutputName = {'Dx', 'Dy'};
  rot_speed = 2*pi;
  angle_e = 0;
  G1 = linearize(mdl, io, 0.4);

  G1.InputName  = {'Fu', 'Fv'};
  G1.OutputName = {'Dx', 'Dy'};
  rot_speed = 2*pi;
  angle_e = 0;
  G2 = linearize(mdl, io, 0.8);

  G2.InputName  = {'Fu', 'Fv'};
  G2.OutputName = {'Dx', 'Dy'};
  figure;
  bode(G, G1, G2);
  exportFig('G_u_v_to_x_y', 'wide-tall');

Effect of the X-Y stage stiffness

<<sec:effect_stiffness>>

TODO At full speed, check how the coupling changes with the stiffness of the actuators

Control Implementation

<<sec:control>>

Measurement in the fixed reference frame

Bibliography   ignore