nass-simscape/org/optimal_stiffness.org

34 KiB

Determination of the optimal nano-hexapod's stiffness

Introduction   ignore

As shown before, many parameters other than the nano-hexapod itself do influence the plant dynamics:

  • The micro-station compliance (studied here)
  • The payload mass and dynamical properties (studied here and here)
  • The experimental conditions, mainly the spindle rotation speed (studied here)

As seen before, the stiffness of the nano-hexapod greatly influence the effect of such parameters.

We wish here to see if we can determine an optimal stiffness of the nano-hexapod such that:

The overall goal is to design a nano-hexapod that will allow the highest possible control bandwidth.

Spindle Rotation Speed

<<sec:spindle_rotation_speed>>

Introduction   ignore

Initialization

We initialize all the stages with the default parameters.

  initializeGround();
  initializeGranite();
  initializeTy();
  initializeRy();
  initializeRz();
  initializeMicroHexapod();
  initializeAxisc();
  initializeMirror();

The worst case scenario is a rotation speed of 60rpm with a payload mass of 1Kg.

  initializeSample('mass', 10);

We don't include gravity nor disturbances in this model as it adds complexity to the simulations and does not alter the obtained dynamics.

  initializeSimscapeConfiguration('gravity', false);
  initializeDisturbances('enable', false);

We set the controller type to Open-Loop, and we do not need to log any signal.

  initializeController('type', 'stabilizing');
  initializeLoggingConfiguration('log', 'none');

Identification when not rotating

We set the range of stiffness that we want to use.

  Ks = logspace(3,9,7)
  initializeReferences();
  Gk_iff = {zeros(length(Ks))};
  Gk_dvf = {zeros(length(Ks))};
  Gk_err = {zeros(length(Ks))};
  for i = 1:length(Ks)
    initializeNanoHexapod('k', Ks(i));

    %% Run the linearization
    G = linearize(mdl, io);
    G.InputName  = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
    G.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6', ...
                    'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6', ...
                    'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};

    Gk_iff(i) = {minreal(G({'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
    Gk_dvf(i) = {minreal(G({'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};

    Jinvt = tf(inv(nano_hexapod.J)');
    Jinvt.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    Jinvt.OutputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
    Gk_err(i) = {-minreal(G({'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'},                {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))*Jinvt};
  end

Identification when rotating at maximum speed

  Rz_rpm = 60;

  initializeReferences('Rz_type', 'rotating', ...
                       'Rz_period', 60/Rz_rpm, ... % Rotation period [s]
                       'Rz_amplitude', -0.2*(2*pi*Rz_rpm/60)); % Angle offset [rad]

  load('mat/nass_references.mat', 'Rz'); % We load the reference for the Spindle
  [~, i_end] = min(abs(Rz.signals.values)); % Obtain the indice where the spindle angle is zero
  t_sim = Rz.time(i_end); % Simulation time before identification [s]
  k_sta = -1e8;
  Gk_wz_iff = {zeros(length(Ks))};
  Gk_wz_dvf = {zeros(length(Ks))};
  Gk_wz_err = {zeros(length(Ks))};
  for i = 1:length(Ks)
    initializeNanoHexapod('k', Ks(i));

    %% Run the linearization
    G = linearize(mdl, io, t_sim);
    G.InputName  = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
    G.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6', ...
                    'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6', ...
                    'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};

    Gk_wz_iff(i) = {minreal(G({'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
    Gk_wz_dvf(i) = {minreal(G({'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};

    Jinvt = tf(inv(nano_hexapod.J)');
    Jinvt.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    Jinvt.OutputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
    Gk_wz_err(i) = {-minreal(G({'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'},                {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))*Jinvt};
  end
  save('mat/optimal_stiffness_Gk_wz.mat', 'Ks', ...
       'Gk_iff',    'Gk_dvf',    'Gk_err', ...
       'Gk_wz_iff', 'Gk_wz_dvf', 'Gk_wz_err');

Change of dynamics

Change of dynamics for decentralized IFF control.

Change of dynamics from $F_x$ to $D_x$.

Change of dynamics from $F_z$ to $D_z$.

Change of coupling

Change of coupling from $F_x$ to $D_y$ when not rotating and when rotating at 60rpm.

Comparison of the coupling from $F_x$ to $D_y$ when rotating at 60rpm to the direct term $F_x$ to $D_x$.

Conclusion   ignore

The leg stiffness should be at higher than $k_i = 10^4\ [N/m]$ such that the main resonance frequency does not shift too much when rotating. For the coupling, it is more difficult to conclude about the minimum required leg stiffness.

Note that we can use very soft nano-hexapod if we limit the spindle rotating speed.

Micro-Station Compliance Effect

<<sec:micro_station_compliance>>

Introduction   ignore

  • take the 6dof compliance of the micro-station
  • simple model + uncertainty

Conclusion   ignore

Payload "Impedance" Effect

<<sec:payload_impedance>>

Introduction   ignore

Initialization

We initialize all the stages with the default parameters.

  initializeGround();
  initializeGranite();
  initializeTy();
  initializeRy();
  initializeRz();
  initializeMicroHexapod();
  initializeAxisc();
  initializeMirror();

We don't include gravity nor disturbances in this model as it adds complexity to the simulations and does not alter the obtained dynamics.

  initializeSimscapeConfiguration('gravity', false);
  initializeDisturbances('enable', false);

We set the controller type to Open-Loop, and we do not need to log any signal.

  initializeController('type', 'stabilizing');
  initializeLoggingConfiguration('log', 'none');

Change of payload dynamics

  • Change of mass: from 1kg to 50kg
  • Change of resonance frequency: from 50Hz to 500Hz
  • The damping ratio of the payload is fixed to $\xi = 0.2$
  initializeReferences();
  Ks = logspace(3,9,7) % [N/m]
  Ms = [1, 20, 50]; % [Kg]
  Gm_iff = {zeros(length(Ks), length(Ms))};
  Gm_dvf = {zeros(length(Ks), length(Ms))};
  Gm_err = {zeros(length(Ks), length(Ms))};
  for i = 1:length(Ks)
    for j = 1:length(Ms)
      initializeNanoHexapod('k', Ks(i));
      initializeSample('mass', Ms(j), 'freq', 100*ones(6,1));

      G = linearize(mdl, io);
      G.InputName  = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
      G.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6', ...
                      'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6', ...
                      'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};

      Gm_iff(i,j) = {minreal(G({'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
      Gm_dvf(i,j) = {minreal(G({'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};

      Jinvt = tf(inv(nano_hexapod.J)');
      Jinvt.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
      Jinvt.OutputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
      Gm_err(i,j) = {-minreal(G({'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'},                {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))*Jinvt};
    end
  end
  Fs = [50, 200, 500]; % [Hz]
  Gf_iff = {zeros(length(Ks), length(Fs))};
  Gf_dvf = {zeros(length(Ks), length(Fs))};
  Gf_err = {zeros(length(Ks), length(Fs))};
  for i = 1:length(Ks)
    for j = 1:length(Fs)
      initializeNanoHexapod('k', Ks(i));
      initializeSample('mass', 20, 'freq', Fs(j)*ones(6,1));

      G = linearize(mdl, io);
      G.InputName  = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
      G.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6', ...
                      'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6', ...
                      'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};

      Gf_iff(i,j) = {minreal(G({'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
      Gf_dvf(i,j) = {minreal(G({'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};

      Jinvt = tf(inv(nano_hexapod.J)');
      Jinvt.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
      Jinvt.OutputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
      Gf_err(i,j) = {-minreal(G({'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'},                {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))*Jinvt};
    end
  end
  save('mat/optimal_stiffness_Gm_Gf.mat', 'Ks', 'Ms', 'Fs', ...
       'Gm_iff',    'Gm_dvf',    'Gm_err', ...
       'Gf_iff',    'Gf_dvf',    'Gf_err');

Plots

Change of optimal gain for decentralized control

For each payload, compute the optimal gain for the IFF control. The optimal value corresponds to critical damping to all the 6 modes of the nano-hexapod.

  load('mat/optimal_stiffness_Gm_Gf.mat');

Change of Mass

Change of payload resonance frequency

Change of dynamics for the primary controller

For each stiffness, plot the total spread of dynamics.

  load('mat/optimal_stiffness_Gm_Gf.mat');

Frequency variation

Same payload mass, but different stiffness resulting in different resonance frequency.

All curves

X direction

Z direction: We can see two mass lines for the soft nano-hexapod:

  • The first mass line corresponds to $\frac{1}{(m_n + m_p)s^2}$ where $m_p = 20\ [kg]$ is the mass of the payload and $m_n = 15\ [Kg]$ is the mass of the nano-hexapod top platform and attached mirror
  • The second mass line corresponds to $\frac{1}{m_n s^2}$

Mass variation

All mixed, X direction

All mixed, Z direction

Z direction

Total variation

Total change of dynamics due to change of the payload:

  • mass from 1kg to 50kg
  • main resonance from 50Hz to 500Hz

For a soft nano-hexapod

For a stiff nano-hexapod

Conclusion   ignore