nass-simscape/org/control_requirements.org
2020-03-17 11:23:47 +01:00

57 KiB

Control Requirements

Introduction   ignore

The goal here is to write clear specifications for the NASS.

This can then be used for the control synthesis and for the design of the nano-hexapod.

Ideal, specifications on the norm of closed loop transfer function should be written.

Simplify Model for the Nano-Hexapod

Model of the nano-hexapod

Let's consider the simple mechanical system in Figure fig:nass_simple_model.

  \begin{tikzpicture}
    % Parameters
    \def\massw{3}
    \def\massh{1}
    \def\spaceh{2}

    % Ground
    \draw[] (-0.5*\massw, 0) -- (0.5*\massw, 0);
    % Mass
    \draw[fill=white] (-0.5*\massw, \spaceh) rectangle (0.5*\massw, \spaceh+\massh) node[pos=0.5](m){$m$};

    % Spring, Damper, and Actuator
    \draw[spring]   (-0.3*\massw, 0) -- (-0.3*\massw, \spaceh) node[midway, left=0.1]{$k$};
    \draw[actuator] ( 0.3*\massw, 0) -- (	0.3*\massw, \spaceh) node[midway, right=0.1](F){$F$};

    % Force Sensor
    \node[forcesensor={\massw}{0.2}] (fsens) at (0, \spaceh){};
    \node[right] at (fsens.east) {$F_m$};

    % Displacements
    \draw[dashed] (0.5*\massw, 0) -- ++(0.2*\massw, 0);
    \draw[->] (0.6*\massw, 0) -- ++(0, 0.2*\spaceh) node[below right]{$x_\mu$};

    % Displacements
    \draw[dashed] (0.5*\massw, \spaceh+\massh) -- ++(0.2*\massw, 0);
    \draw[->] (0.6*\massw, \spaceh+\massh) -- ++(0, 0.2*\spaceh) node[below right]{$x$};

    \draw[<->] (-0.5*\massw+-1.5*\dispw, 0) -- node[midway, left]{$d$} ++(0, \spaceh);

    % Direct forces
    \draw[->] (0, \spaceh+\massh) node[branch]{} -- ++(0, 0.4*\spaceh) node[below right]{$F_d$};
  \end{tikzpicture}

/tdehaeze/nass-simscape/media/commit/cf7e075e4e03df3d9f84baee3295b15a7e5c91f7/org/figs/nass_simple_model.png

Simplified mechanical system for the nano-hexapod

The signals are described in table tab:general_plant_signals.

Symbol Meaning
Exogenous Inputs $x_\mu$ Motion of the $\nu$-hexapod's base
$F_d$ External Forces applied to the Payload
$r$ Reference signal for tracking
Exogenous Outputs $x$ Absolute Motion of the Payload
Sensed Outputs $F_m$ Force Sensors in each leg
$d$ Measured displacement of each leg
$x$ Absolute Motion of the Payload
Control Signals $F$ Actuator Inputs
Signals definition for the generalized plant

For the nano-hexapod alone, we have the following equations: \[ \begin{align*} x &= \frac{1}{ms^2 + k} F + \frac{1}{ms^2 + k} F_d + \frac{k}{ms^2 + k} x_\mu \\ F_m &= \frac{ms^2}{ms^2 + k} F - \frac{k}{ms^2 + k} F_d + \frac{k m s^2}{ms^2 + k} x_\mu \\ d &= \frac{1}{ms^2 + k} F + \frac{1}{ms^2 + k} F_d - \frac{ms^2}{ms^2 + k} x_\mu \end{align*} \]

We can write the equations function of $\omega_\nu = \sqrt{\frac{k}{m}}$: \[ \begin{align*} x &= \frac{1/k}{1 + \frac{s^2}{\omega_\nu^2}} F + \frac{1/k}{1 + \frac{s^2}{\omega_\nu^2}} F_d + \frac{1}{1 + \frac{s^2}{\omega_\nu^2}} x_\mu \\ F_m &= \frac{\frac{s^2}{\omega_\nu^2}}{1 + \frac{s^2}{\omega_\nu^2}} F - \frac{1}{1 + \frac{s^2}{\omega_\nu^2}} F_d + \frac{k \frac{s^2}{\omega_\nu^2}}{1 + \frac{s^2}{\omega_\nu^2}} x_\mu \\ d &= \frac{1/k}{1 + \frac{s^2}{\omega_\nu^2}} F + \frac{1/k}{1 + \frac{s^2}{\omega_\nu^2}} F_d - \frac{\frac{s^2}{\omega_\nu^2}}{1 + \frac{s^2}{\omega_\nu^2}} x_\mu \end{align*} \]

Assumptions:

  • the forces applied by the nano-hexapod have no influence on the micro-station, specifically on the displacement of the top platform of the micro-hexapod.

This means that the nano-hexapod can be considered separately from the micro-station and that the motion $x_\mu$ is imposed and considered as an external input.

The nano-hexapod can thus be represented as in Figure fig:nano_station_inputs_outputs.

  \begin{tikzpicture}
    \node[block={2.0cm}{2.0cm}] (P) {};
    \node[above] at (P.north) {$\nu$-hexapod};

    % Input and outputs coordinates
    \coordinate[] (inputFd) at ($(P.south west)!0.8!(P.north west)$);
    \coordinate[] (inputw)  at ($(P.south west)!0.5!(P.north west)$);
    \coordinate[] (inputF)  at ($(P.south west)!0.2!(P.north west)$);
    \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$);
    \coordinate[] (outputd) at ($(P.south east)!0.5!(P.north east)$);
    \coordinate[] (outputx) at ($(P.south east)!0.2!(P.north east)$);

    % Connections and labels
    \draw[<-] (inputFd) -- ++(-0.8, 0) node[above right]{$F_d$};
    \draw[<-] (inputw)  -- ++(-0.8, 0) node[above right]{$x_\mu$};
    \draw[<-] (inputF)  -- ++(-0.8, 0) node[above right]{$F$};

    \draw[->] (outputF) -- ++(0.8, 0) node[above left]{$F_m$};
    \draw[->] (outputd) -- ++(0.8, 0) node[above left]{$d$};
    \draw[->] (outputx) -- ++(0.8, 0) node[above left]{$x$};
  \end{tikzpicture}

/tdehaeze/nass-simscape/media/commit/cf7e075e4e03df3d9f84baee3295b15a7e5c91f7/org/figs/nano_station_inputs_outputs.png

Block representation of the nano-hexapod

How to include Ground Motion in the model?

What we measure is not the absolute motion $x$, but the relative motion $x - w$ where $w$ is the motion of the granite.

Also, $w$ induces some motion $x_\mu$ through the transmissibility of the micro-station.

  \begin{tikzpicture}
    \node[block={3.0cm}{3.0cm}] (P) {};
    \node[above] at (P.north) {$\nu$-hexapod};

    % Input and outputs coordinates
    \coordinate[] (inputFd) at ($(P.south west)!0.95!(P.north west)$);
    \coordinate[] (inputw)  at ($(P.south west)!0.65!(P.north west)$);
    \coordinate[] (inputxm) at ($(P.south west)!0.35!(P.north west)$);
    \coordinate[] (inputF)  at ($(P.south west)!0.05!(P.north west)$);
    \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$);
    \coordinate[] (outputd) at ($(P.south east)!0.5!(P.north east)$);
    \coordinate[] (outputx) at ($(P.south east)!0.2!(P.north east)$);

    % Connections and labels
    \draw[<-] (inputFd) -- ++(-1.4, 0) node[above right]{$F_d$};
    \draw[<-] (inputw)  -- ++(-1.4, 0) node[above right]{$w$};
    \draw[<-] (inputxm) -- ++(-1.4, 0) node[above right]{$x_\mu$};
    \draw[<-] (inputF)  -- ++(-1.4, 0) node[above right]{$F$};

    \draw[->] (outputF) -- ++(1.4, 0) node[above left]{$F_m$};
    \draw[->] (outputd) -- ++(1.4, 0) node[above left]{$d$};
    \draw[->] (outputx) -- ++(1.4, 0) node[above]{$y = x-w$};
  \end{tikzpicture}

Motion of the micro-station

As explained, we consider $x_\mu$ as an external input ($F$ has no influence on $x_\mu$).

$x_\mu$ is the motion of the micro-station's top platform due to the motion of each stage of the micro-station.

We consider that $x_\mu$ has the following form: \[ x_\mu = T_\mu r + d_\mu \] where:

  • $T_\mu r$ corresponds to the response of the stages due to the reference $r$
  • $d_\mu$ is the motion of the hexapod due to all the vibrations of the stages

$T_\mu$ can be considered to be a low pass filter with a bandwidth corresponding approximatively to the bandwidth of the micro-station's stages. To simplify, we can consider $T_\mu$ to be a first order low pass filter: \[ T_\mu = \frac{1}{1 + s/\omega_\mu} \] where $\omega_\mu$ corresponds to the tracking speed of the micro-station.

What is important to note is that while $x_\mu$ is viewed as a perturbation from the nano-hexapod point of view, $x_\mu$ does depend on the reference signal $r$.

Also, here, we suppose that the granite is not moving.

If we now include the motion of the granite $w$, we obtain the block diagram shown in Figure fig:nano_station_ground_motion.

  \begin{tikzpicture}
    \node[block={4.0cm}{4.0cm}] (P) {};
    \node[above] at (P.north) {$\nu$-hexapod};

    % Input and outputs coordinates
    \coordinate[] (inputFd) at ($(P.south west)!0.8!(P.north west)$);
    \coordinate[] (inputw)  at ($(P.south west)!0.5!(P.north west)$);
    \coordinate[] (inputF)  at ($(P.south west)!0.2!(P.north west)$);
    \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$);
    \coordinate[] (outputd) at ($(P.south east)!0.5!(P.north east)$);
    \coordinate[] (outputx) at ($(P.south east)!0.2!(P.north east)$);

    % Connections and labels
    \draw[<-] (inputFd) -- ++(-0.8, 0) node[above right]{$F_d$};
    \draw[<-] (inputF)  -- ++(-0.8, 0) node[above right]{$F$};

    \draw[->] (outputF) -- ++(0.8, 0) node[above left]{$F_m$};
    \draw[->] (outputd) -- ++(0.8, 0) node[above left]{$d$};

    \node[addb, left= of inputw] (add) {};
    \node[block, left= of add] (Tmu) {$T_\mu$};
    \node[addb, above= of add] (addw) {};
    \node[block, left= of addw] (Tw) {$T_w$};

    \node[addb={+}{}{-}{}{}, right= of outputx] (addx) {};
    \draw[->] (outputx) -- (addx.west) node[above left]{$x$};
    \draw[->] (addx.east) -- ++(0.8, 0) node[above left]{$y$};

    \draw[<-] (Tmu.west) -- ++(-0.8, 0)node[above right]{$r$};

    \draw[->] (Tmu.east) -- (add.west);
    \draw[->] (add.east) -- (inputw) node[above left]{$x_\mu$};
    \draw[->] ($(addw.north) + (0, 0.8)$) node[below right]{$d_\mu$} -- (addw.north);
    \draw[->] (addw.south) -- (add.north);

    \draw[->] ($(Tw.west) + (-1, 0)$) node[above right]{$w$} -- (Tw.west);
    \draw[->] ($(Tw.west) + (-0.4, 0)$) node[branch]{} -- ++(0, 1.4) -| (addx.north);
    \draw[->] (Tw.east) -- (addw.west);
  \end{tikzpicture}

/tdehaeze/nass-simscape/media/commit/cf7e075e4e03df3d9f84baee3295b15a7e5c91f7/org/figs/nano_station_ground_motion.png

Ground Motion $w$ included

$T_w$ is the mechanical transmissibility of the micro-station. We can approximate this transfer function by a second order low pass filter: \[ T_w = \frac{1}{1 + 2 \xi s/\omega_0 + s^2/\omega_0^2} \]

Control with the Stiff Nano-Hexapod

Definition of the values

Let's define the mass and stiffness of the nano-hexapod.

  m = 50; % [kg]
  k = 1e7; % [N/m]

Let's define the Plant as shown in Figure fig:nano_station_inputs_outputs:

  Gn = 1/(m*s^2 + k)*[-k, k*m*s^2, m*s^2; 1, -m*s^2, 1; 1, k, 1];
  Gn.InputName  = {'Fd', 'xmu', 'F'};
  Gn.OutputName = {'Fm', 'd', 'x'};

Now, define the transmissibility transfer function $T_\mu$ corresponding to the micro-station motion.

  wmu = 2*pi*50; % [rad/s]

  Tmu = 1/(1 + s/wmu);
  Tmu.InputName = {'r1'};
  Tmu.OutputName = {'ymu'};
  w0 = 2*pi*40;
  xi = 0.5;
  Tw = 1/(1 + 2*xi*s/w0 + s^2/w0^2);
  Tw.InputName = {'w1'};
  Tw.OutputName = {'dw'};

We add the fact that $x_\mu = d_\mu + T_\mu r + T_w w$:

  Wsplit = [tf(1); tf(1)];
  Wsplit.InputName = {'w'};
  Wsplit.OutputName = {'w1', 'w2'};

  S = sumblk('xmu = ymu + dmu + dw');

  Sw = sumblk('y = x - w2');

  Gpz = connect(Gn, S, Wsplit, Tw, Tmu, Sw, {'Fd', 'dmu', 'r1', 'F', 'w'}, {'Fm', 'd', 'y'});

Control using $d$

Control Architecture

Let's consider a feedback loop using $d$ as shown in Figure fig:nano_station_control_d.

  \begin{tikzpicture}
    \node[block={4.0cm}{4.0cm}] (P) {};
    \node[above] at (P.north) {$\nu$-hexapod};

    % Input and outputs coordinates
    \coordinate[] (inputFd) at ($(P.south west)!0.8!(P.north west)$);
    \coordinate[] (inputw)  at ($(P.south west)!0.5!(P.north west)$);
    \coordinate[] (inputF)  at ($(P.south west)!0.2!(P.north west)$);
    \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$);
    \coordinate[] (outputd) at ($(P.south east)!0.5!(P.north east)$);
    \coordinate[] (outputx) at ($(P.south east)!0.2!(P.north east)$);

    % Connections and labels
    \draw[<-] (inputFd) -- ++(-0.8, 0) node[above right]{$F_d$};
    \draw[<-] (inputw)  -- ++(-0.8, 0) node[above right]{$x_\mu$};

    \draw[->] (outputF) -- ++(0.8, 0) node[above left]{$F_m$};
    \draw[->] (outputd) -- ++(1.6, 0) node[above left]{$d$};
    \draw[->] (outputx) -- ++(0.8, 0) node[above left]{$x$};

    \node[block, below=0.3 of P] (K) {$K_d$};

    \node[addb={+}{}{}{}{-}, left= of inputF] (addF) {};

    \draw[->] ($(outputd) + (1.1, 0)$) node[branch]{} |- (K.east);
    \draw[->] (K.west) -| (addF.south);
    \draw[->] (addF.east) -- (inputF) node[above left]{$F$};
    \draw[<-] (addF.west) -- ++(-0.8, 0)node[above right]{$F^\prime$};
  \end{tikzpicture}

/tdehaeze/nass-simscape/media/commit/cf7e075e4e03df3d9f84baee3295b15a7e5c91f7/org/figs/nano_station_control_d.png

Feedback diagram using $d$

Analytical Analysis

Let's apply a direct velocity feedback by deriving $d$: \[ F = F^\prime - g s d \]

Thus: \[ d = \frac{1}{ms^2 + gs + k} F^\prime + \frac{1}{ms^2 + gs + k} F_d - \frac{ms^2}{ms^2 + gs + k} x_\mu \]

\[ F = \frac{ms^2 + k}{ms^2 + gs + k} F^\prime - \frac{gs}{ms^2 + gs + k} F_d + \frac{mgs^3}{ms^2 + gs + k} x_\mu \]

and \[ x = \frac{1}{ms^2 + k} (\frac{ms^2 + k}{ms^2 + gs + k} F^\prime - \frac{gs}{ms^2 + gs + k} F_d + \frac{mgs^3}{ms^2 + gs + k} x_\mu) + \frac{1}{ms^2 + k} F_d + \frac{k}{ms^2 + k} x_\mu \]

\[ x = \frac{ms^2 + k}{(ms^2 + k) (ms^2 + gs + k)} F^\prime + \frac{ms^2 + k}{(ms^2 + k) (ms^2 + gs + k)} F_d + \frac{mgs^3 + k(ms^2 + gs + k)}{(ms^2 + k) (ms^2 + gs + k)} x_\mu \]

And we finally obtain: \[ x = \frac{1}{ms^2 + gs + k} F^\prime + \frac{1}{ms^2 + gs + k} F_d + \frac{gs + k}{ms^2 + gs + k} x_\mu \]

  K_dvf = 2*sqrt(k*m)*s;
  K_dvf.InputName = {'d'};
  K_dvf.OutputName = {'F'};

  Gpz_dvf = feedback(Gpz, K_dvf, 'name');

Now let's consider that $x_\mu = d_\mu + T_\mu r$

\[ x = \frac{1}{ms^2 + gs + k} F^\prime + \frac{1}{ms^2 + gs + k} F_d + \frac{gs + k}{ms^2 + gs + k} d_\mu + T_\mu \frac{gs + k}{ms^2 + gs + k} r \]

And $\epsilon = r - x$: \[ \epsilon = \frac{1}{ms^2 + gs + k} F^\prime + \frac{1}{ms^2 + gs + k} F_d + \frac{gs + k}{ms^2 + gs + k} d_\mu + \frac{ms^2 + gs + k - T_\mu (gs + k)}{ms^2 + gs + k} r \]

\[ \epsilon = \frac{1}{ms^2 + gs + k} F^\prime + \frac{1}{ms^2 + gs + k} F_d + \frac{gs + k}{ms^2 + gs + k} d_\mu + \frac{ms^2 - S_\mu(gs + k)}{ms^2 + gs + k} r \]

Control using $F_m$

Control Architecture

Let's consider a feedback loop using $Fm$ as shown in Figure fig:nano_station_control_Fm.

  \begin{tikzpicture}
    \node[block={4.0cm}{4.0cm}] (P) {};
    \node[above] at (P.north) {$\nu$-hexapod};

    % Input and outputs coordinates
    \coordinate[] (inputFd) at ($(P.south west)!0.8!(P.north west)$);
    \coordinate[] (inputw)  at ($(P.south west)!0.5!(P.north west)$);
    \coordinate[] (inputF)  at ($(P.south west)!0.2!(P.north west)$);
    \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$);
    \coordinate[] (outputd) at ($(P.south east)!0.5!(P.north east)$);
    \coordinate[] (outputx) at ($(P.south east)!0.2!(P.north east)$);

    % Connections and labels
    \draw[<-] (inputFd) -- ++(-0.8, 0) node[above right]{$F_d$};
    \draw[<-] (inputw)  -- ++(-0.8, 0) node[above right]{$x_\mu$};

    \draw[->] (outputF) -- ++(1.6, 0) node[above left]{$F_m$};
    \draw[->] (outputd) -- ++(0.8, 0) node[above left]{$d$};
    \draw[->] (outputx) -- ++(0.8, 0) node[above left]{$x$};

    \node[block, below=0.3 of P] (K) {$K_{F_m}$};

    \node[addb={+}{}{}{}{-}, left= of inputF] (addF) {};

    \draw[->] ($(outputF) + (1.1, 0)$) node[branch]{} |- (K.east);
    \draw[->] (K.west) -| (addF.south);
    \draw[->] (addF.east) -- (inputF) node[above left]{$F$};
    \draw[<-] (addF.west) -- ++(-0.8, 0)node[above right]{$F^\prime$};
  \end{tikzpicture}

/tdehaeze/nass-simscape/media/commit/cf7e075e4e03df3d9f84baee3295b15a7e5c91f7/org/figs/nano_station_control_Fm.png

Feedback diagram using $F_m$

Pure Integrator

Let's apply integral force feedback by integration $F_m$: \[ F = F^\prime - \frac{g}{s} F_m \]

And we finally obtain: \[ x = \frac{1}{ms^2 + mgs + k} F^\prime + \frac{1 + \frac{g}{s}}{ms^2 + mgs + k} F_d + \frac{k}{ms^2 + mgs + k} x_\mu \]

  K_iff = 2*sqrt(k/m)/s;
  K_iff.InputName = {'Fm'};
  K_iff.OutputName = {'F'};

  Gpz_iff = feedback(Gpz, K_iff, 'name');

Now let's consider that $x_\mu = d_\mu + T_\mu r$

\[ x = \frac{1}{ms^2 + mgs + k} F^\prime + \frac{1 + \frac{g}{s}}{ms^2 + mgs + k} F_d + \frac{k}{ms^2 + mgs + k} d_\mu + \frac{T_\mu k}{ms^2 + mgs + k} r \]

And $\epsilon = r - x$: \[ \epsilon = \frac{1}{ms^2 + mgs + k} F^\prime + \frac{1 + \frac{g}{s}}{ms^2 + mgs + k} F_d + \frac{k}{ms^2 + mgs + k} d_\mu + \frac{ms^2 + mgs + k - T_\mu k}{ms^2 + mgs + k} r \]

\[ \epsilon = \frac{1}{ms^2 + mgs + k} F^\prime + \frac{1 + \frac{g}{s}}{ms^2 + mgs + k} F_d + \frac{k}{ms^2 + mgs + k} d_\mu + \frac{ms^2 + mgs + S_\mu k}{ms^2 + mgs + k} r \]

Low pass filter

Instead of a pure integrator, let's use a low pass filter with a cut-off frequency above the bandwidth of the micro-station $\omega_mu$

  % K_iff = (2*sqrt(k/m)/(2*wmu))*(1/(1 + s/(2*wmu)));
  % K_iff.InputName = {'Fm'};
  % K_iff.OutputName = {'F'};

  % Gpz_iff = feedback(Gpz, K_iff, 'name');

Comparison

<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/cf7e075e4e03df3d9f84baee3295b15a7e5c91f7/org/figs/comp_iff_dvf_simplified.png
Obtained transfer functions for DVF and IFF (png, pdf)
$d_\mu$ $F_d$ $w$
IFF Better filtering of the vibrations More sensitive to External forces
DVF inverse inverse Little bit better at low frequencies

Control using $x$

Analytical analysis

Let's first consider that only the output $x$ is used for feedback (Figure fig:nano_station_control_x)

  \begin{tikzpicture}
    \node[block={4.0cm}{4.0cm}] (P) {};
    \node[above] at (P.north) {$\nu$-hexapod};

    % Input and outputs coordinates
    \coordinate[] (inputFd) at ($(P.south west)!0.8!(P.north west)$);
    \coordinate[] (inputw)  at ($(P.south west)!0.5!(P.north west)$);
    \coordinate[] (inputF)  at ($(P.south west)!0.2!(P.north west)$);
    \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$);
    \coordinate[] (outputd) at ($(P.south east)!0.5!(P.north east)$);
    \coordinate[] (outputx) at ($(P.south east)!0.2!(P.north east)$);

    % Connections and labels
    \draw[<-] (inputFd) -- ++(-0.8, 0) node[above right]{$F_d$};

    \draw[->] (outputF) -- ++(0.8, 0) node[above left]{$F_m$};
    \draw[->] (outputd) -- ++(0.8, 0) node[above left]{$d$};
    \draw[->] (outputx) -- ++(0.8, 0) node[above left]{$x$};

    \node[block, left= of inputF] (K) {$K$};
    \node[addb={+}{}{}{}{-}, left= of K] (addfb) {};
    \node[addb, left= of inputw] (add) {};
    \node[block, left= of add] (Tmu) {$T_\mu$};

    \draw[->] ($(outputx) + (0.3, 0)$) node[branch]{} -- ++(0, -1) -| (addfb.south);
    \draw[->] (addfb.east) -- (K.west) node[above left]{$\epsilon$};
    \draw[->] (K.east) -- (inputF) node[above left]{$F$};

    \draw[->] ($(addfb.west) + (-1.6, 0)$)node[above right]{$r$} -- (addfb.west);

    \draw[->] ($(addfb.west) + (-0.8, 0)$)node[branch]{} |- (Tmu.west);
    \draw[->] (Tmu.east) -- (add.west);
    \draw[->] (add.east) -- (inputw) node[above left]{$x_\mu$};
    \draw[->] ($(add.north) + (0, 0.8)$) node[below right]{$d_\mu$} -- (add.north);
  \end{tikzpicture}

/tdehaeze/nass-simscape/media/commit/cf7e075e4e03df3d9f84baee3295b15a7e5c91f7/org/figs/nano_station_control_x.png

Feedback diagram using $x$

We then have: \[ \epsilon &= r - G_{\frac{x}{F}} K \epsilon - G_{\frac{x}{F_d}} F_d - G_{\frac{x}{x_\mu}} d_\mu - G_{\frac{x}{x_\mu}} T_\mu r \]

And then:

\[ \epsilon = \frac{-G_{\frac{x}{F_d}}}{1 + G_{\frac{x}{F}}K} F_d + \frac{-G_{\frac{x}{x_\mu}}}{1 + G_{\frac{x}{F}}K} d_\mu + \frac{1 - G_{\frac{x}{x_\mu}} T_\mu}{1 + G_{\frac{x}{F}}K} r \]

With $S = \frac{1}{1 + G_{\frac{x}{F}} K}$, we have: \[ \epsilon = - S G_{\frac{x}{F_d}} F_d - S G_{\frac{x}{x_\mu}} d_\mu + S (1 - G_{\frac{x}{x_\mu}} T_\mu) r \]

We have 3 terms that we would like to have small by design:

  • $G_{\frac{x}{F_d}} = \frac{1}{ms^2 + k}$: thus $k$ and $m$ should be high to lower the effect of direct forces $F_d$
  • $G_{\frac{x}{x_\mu}} = \frac{k}{ms^2 + k} = \frac{1}{1 + \frac{s^2}{\omega_\nu^2}}$: $\omega_\nu$ should be small enough such that it filters out the vibrations of the micro-station
  • $1 - G_{\frac{x}{x_\mu}} T_\mu$

\[ 1 - G_{\frac{x}{x_\mu}} T_\mu = 1 - \frac{1}{1 + \frac{s^2}{\omega_\nu^2}} T_\mu \]

We can approximate $T_\mu \approx \frac{1}{1 + \frac{s}{\omega_\mu}}$ to have:

\begin{align*} 1 - G_{\frac{x}{x_\mu}} T_\mu &= 1 - \frac{1}{1 + \frac{s^2}{\omega_\nu^2}} \frac{1}{1 + \frac{s}{\omega_\mu}} \\ &\approx \frac{\frac{s}{\omega_\mu}}{1 + \frac{s}{\omega_\mu}} = S_\mu \text{ if } \omega_\nu > \omega_\mu \\ &\approx \frac{\frac{s^2}{\omega_\nu^2}}{1 + \frac{s^2}{\omega_\nu^2}} = \text{ if } \omega_\nu < \omega_\mu \end{align*}

In our case, we have $\omega_\nu > \omega_\mu$ and thus we cannot lower this term.

Some implications on the design are summarized on table tab:design_decommentation.

Exogenous Outputs Design recommendation
$F_d$ high $k$, high $m$
$d_\mu$ low $k$, high $m$
$r$ no influence if $\omega_\nu > \omega_\mu$
Design recommendation

Control implementation

Controller for the damped plant using DVF.

  wb = 2*pi*50; % control bandwidth [rad/s]

  % Lead
  h = 2.0;
  wz = wb/h; % [rad/s]
  wp = wb*h; % [rad/s]

  H = 1/h*(1 + s/wz)/(1 + s/wp);

  % Integrator until 10Hz
  Hi = (1 + s/2/pi/10)/(s/2/pi/10);

  K = Hi*H*(1/s);

  Kpz_dvf = K/abs(freqresp(K*Gpz_dvf('y', 'F'), wb));
  Kpz_dvf.InputName = {'e'};
  Kpz_dvf.OutputName = {'Fi'};

Controller for the damped plant using IFF.

  wb = 2*pi*50; % control bandwidth [rad/s]

  % Lead
  h = 2.0;
  wz = wb/h; % [rad/s]
  wp = wb*h; % [rad/s]

  H = 1/h*(1 + s/wz)/(1 + s/wp);

  % Integrator until 10Hz
  Hi = (1 + s/2/pi/10)/(s/2/pi/10);

  K = Hi*H*(1/s);

  Kpz_iff = K/abs(freqresp(K*Gpz_iff('y', 'F'), wb));
  Kpz_iff.InputName = {'e'};
  Kpz_iff.OutputName = {'Fi'};

Loop gain

<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/cf7e075e4e03df3d9f84baee3295b15a7e5c91f7/org/figs/simple_loop_gain_pz.png
Loop Gain (png, pdf)

Let's connect all the systems as shown in Figure fig:nano_station_control_x.

  Sfb = sumblk('e = r2 - y');

  R = [tf(1); tf(1)];
  R.InputName = {'r'};
  R.OutputName = {'r1', 'r2'};

  F = [tf(1); tf(1)];
  F.InputName = {'Fi'};
  F.OutputName = {'F', 'Fu'};

  Gpz_fb_dvf = connect(Gpz_dvf, Kpz_dvf, R, Sfb, F, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd', 'Fu'});
  Gpz_fb_iff = connect(Gpz_iff, Kpz_iff, R, Sfb, F, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd', 'Fu'});

Results

<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/cf7e075e4e03df3d9f84baee3295b15a7e5c91f7/org/figs/simple_hac_lac_results.png
Obtained closed-loop transfer functions (png, pdf)
Reference Tracking Vibration Filtering Compliance
DVF Similar behavior Better for $\omega < \omega_\nu$
IFF Similar behavior Better for $\omega > \omega_\nu$

Comparison with the use of a Soft nano-hexapod

  m = 50; % [kg]
  k = 1e3; % [N/m]

  Gn = 1/(m*s^2 + k)*[-k, k*m*s^2, m*s^2; 1, -m*s^2, 1; 1, k, 1];
  Gn.InputName  = {'Fd', 'xmu', 'F'};
  Gn.OutputName = {'Fm', 'd', 'x'};
  wmu = 2*pi*50; % [rad/s]

  Tmu = 1/(1 + s/wmu);
  Tmu.InputName = {'r1'};
  Tmu.OutputName = {'ymu'};
  w0 = 2*pi*40;
  xi = 0.5;
  Tw = 1/(1 + 2*xi*s/w0 + s^2/w0^2);
  Tw.InputName = {'w1'};
  Tw.OutputName = {'dw'};
  Wsplit = [tf(1); tf(1)];
  Wsplit.InputName = {'w'};
  Wsplit.OutputName = {'w1', 'w2'};

  S = sumblk('xmu = ymu + dmu + dw');

  Sw = sumblk('y = x - w2');

  Gvc = connect(Gn, S, Wsplit, Tw, Tmu, Sw, {'Fd', 'dmu', 'r1', 'F', 'w'}, {'Fm', 'd', 'y'});
  Kvc_dvf = 2*sqrt(k*m)*s;
  Kvc_dvf.InputName = {'d'};
  Kvc_dvf.OutputName = {'F'};

  Gvc_dvf = feedback(Gvc, Kvc_dvf, 'name');

  Kvc_iff = 2*sqrt(k/m)/s;
  Kvc_iff.InputName = {'Fm'};
  Kvc_iff.OutputName = {'F'};

  Gvc_iff = feedback(Gvc, Kvc_iff, 'name');
  wb = 2*pi*100; % control bandwidth [rad/s]

  % Lead
  h = 2.0;
  wz = wb/h; % [rad/s]
  wp = wb*h; % [rad/s]

  H = 1/h*(1 + s/wz)/(1 + s/wp);

  Kvc_dvf = H/abs(freqresp(H*Gvc_dvf('y', 'F'), wb));
  Kvc_dvf.InputName = {'e'};
  Kvc_dvf.OutputName = {'Fi'};

  Kvc_iff = H/abs(freqresp(H*Gvc_iff('y', 'F'), wb));
  Kvc_iff.InputName = {'e'};
  Kvc_iff.OutputName = {'Fi'};
  Sfb = sumblk('e = r2 - y');

  R = [tf(1); tf(1)];
  R.InputName = {'r'};
  R.OutputName = {'r1', 'r2'};

  F = [tf(1); tf(1)];
  F.InputName = {'Fi'};
  F.OutputName = {'F', 'Fu'};


  Gvc_fb_dvf = connect(Gvc_dvf, Kvc_dvf, R, Sfb, F, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd', 'Fu'});
  Gvc_fb_iff = connect(Gvc_iff, Kvc_iff, R, Sfb, F, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd', 'Fu'});
<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/cf7e075e4e03df3d9f84baee3295b15a7e5c91f7/org/figs/simple_hac_lac_results_soft.png
Obtained closed-loop transfer functions (png, pdf)
Reference Tracking Vibration Filtering Compliance
DVF Similar behavior Better for $\omega < \omega_\nu$
IFF Similar behavior Better for $\omega > \omega_\nu$
<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/cf7e075e4e03df3d9f84baee3295b15a7e5c91f7/org/figs/simple_comp_vc_pz.png
Comparison of the closed-loop transfer functions for Soft and Stiff nano-hexapod (png, pdf)
Soft Stiff
Reference Tracking = =
Ground Motion = =
Vibration Isolation + -
Compliance - +

Estimate the level of vibration

  gm  = load('./mat/psd_gm.mat', 'f', 'psd_gm');
  rz  = load('./mat/pxsp_r.mat', 'f', 'pxsp_r');
  tyz = load('./mat/pxz_ty_r.mat', 'f', 'pxz_ty_r');

If we note the PSD $\Gamma$: \[ \Gamma_y = |G_{\frac{y}{w}}|^2 \Gamma_w + |G_{\frac{y}{x_\mu}}|^2 \Gamma_{x_\mu} \]

  x_pz = abs(squeeze(freqresp(Gpz_fb_iff('y', 'dmu'), f, 'Hz'))).^2.*(psd_rz + psd_ty) + abs(squeeze(freqresp(Gpz_fb_iff('y', 'w'), f, 'Hz'))).^2.*(psd_gm);
  x_vc = abs(squeeze(freqresp(Gvc_fb_iff('y', 'dmu'), f, 'Hz'))).^2.*(psd_rz + psd_ty) + abs(squeeze(freqresp(Gvc_fb_iff('y', 'w'), f, 'Hz'))).^2.*(psd_gm);
<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/cf7e075e4e03df3d9f84baee3295b15a7e5c91f7/org/figs/simple_asd_motion_error.png
ASD of the position error due to Ground Motion and Vibration (png, pdf)

Actuator usage

  F_pz = abs(squeeze(freqresp(Gpz_fb_iff('Fu', 'dmu'), f, 'Hz'))).^2.*(psd_rz + psd_ty) + abs(squeeze(freqresp(Gpz_fb_iff('Fu', 'w'), f, 'Hz'))).^2.*(psd_gm);
  F_vc = abs(squeeze(freqresp(Gvc_fb_iff('Fu', 'dmu'), f, 'Hz'))).^2.*(psd_rz + psd_ty) + abs(squeeze(freqresp(Gvc_fb_iff('Fu', 'w'), f, 'Hz'))).^2.*(psd_gm);
  sqrt(trapz(f, F_pz))
  sqrt(trapz(f, F_vc))
sqrt(trapz(f, F_pz))
ans =
          84.8961762069446
sqrt(trapz(f, F_vc))
ans =
        0.0387785981815527

Requirements on the norm of closed-loop transfer functions

Approximation of the ASD of perturbations

  G_rz = 1e-9*1/(1 + s/2/pi/0.5)^2*(s + 2*pi*1)*(s + 2*pi*10)*(1/((1 + s/2/pi/100)^2));
  G_gm = 1e-8*1/s^2*(s + 2*pi*1)^2*(1/((1 + s/2/pi/10)^3));

Wanted ASD of outputs

Wanted ASD of motion error

  y_wanted = 100e-9; % 10nm rms wanted
  y_bw = 2*pi*100; % bandwidth [rad/s]

  G_y = 2*y_wanted/sqrt(y_bw) * (1 + s/y_bw/10) / (1 + s/y_bw);
  sqrt(trapz(f, abs(squeeze(freqresp(G_y, f, 'Hz'))).^2))
sqrt(trapz(f, abs(squeeze(freqresp(G_y, f, 'Hz'))).^2))
ans =
      9.47118350214793e-08

Limiting the bandwidth

  wF = 2*pi*10;
  G_F = 100000*(wF + s)^2;

Generalized Weighted plant

Let's create a generalized weighted plant for controller synthesis.

Let's start simple:

Symbol Meaning
Exogenous Inputs $x_\mu$ Motion of the $\nu$-hexapod's base
Exogenous Outputs $y$ Motion error of the Payload
Sensed Outputs $y$ Motion error of the Payload
Control Signals $F$ Actuator Inputs

Add $F$ as output.

  F = [tf(1); tf(1)];
  F.InputName = {'Fi'};
  F.OutputName = {'F', 'Fu'};

  P_pz = connect(F, Gpz_dvf, {'dmu', 'Fi'}, {'y', 'Fu', 'y'})
  P_vc = connect(F, Gvc_dvf, {'dmu', 'Fi'}, {'y', 'Fu', 'y'})

Normalization.

We multiply the plant input by $G_{rz}$ and the plant output by $G_y^{-1}$:

  P_pz_norm = blkdiag(inv(G_y), inv(G_F), 1)*P_pz*blkdiag(G_rz, 1);
  P_pz_norm.OutputName = {'z', 'F', 'y'};
  P_pz_norm.InputName  = {'w', 'u'};

  P_vc_norm = blkdiag(inv(G_y), inv(G_F), 1)*P_vc*blkdiag(G_rz, 1);
  P_vc_norm.OutputName = {'z', 'F', 'y'};
  P_vc_norm.InputName  = {'w', 'u'};

Synthesis

  [Kpz_dvf,CL_vc,~] = hinfsyn(minreal(P_pz_norm), 1, 1, 'TOLGAM', 0.001, 'METHOD', 'LMI', 'DISPLAY', 'on');
  Kpz_dvf.InputName = {'e'};
  Kpz_dvf.OutputName = {'Fi'};

  [Kvc_dvf,CL_pz,~] = hinfsyn(minreal(P_vc_norm), 1, 1, 'TOLGAM', 0.001, 'METHOD', 'LMI', 'DISPLAY', 'on');
  Kvc_dvf.InputName = {'e'};
  Kvc_dvf.OutputName = {'Fi'};

Loop Gain

  Sfb = sumblk('e = r2 - y');

  R = [tf(1); tf(1)];
  R.InputName = {'r'};
  R.OutputName = {'r1', 'r2'};

  F = [tf(1); tf(1)];
  F.InputName = {'Fi'};
  F.OutputName = {'F', 'Fu'};

  Gpz_fb_dvf = connect(Gpz_dvf, -Kpz_dvf, R, Sfb, F, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd', 'Fu'});
  Gvc_fb_dvf = connect(Gvc_dvf, -Kvc_dvf, R, Sfb, F, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd', 'Fu'});

Results

Requirements

reference tracking $\epsilon/r$ -120dB at 1Hz
vibration isolation $x/x_\mu$ -60dB above 10Hz
compliance $x/F_d$