nass-simscape/org/optimal_stiffness_control.org

30 KiB

Control of the NASS with optimal stiffness

Introduction   ignore

Low Authority Control - Decentralized Direct Velocity Feedback

Introduction   ignore

Initialization

We initialize all the stages with the default parameters.

  initializeGround();
  initializeGranite();
  initializeTy();
  initializeRy();
  initializeRz();
  initializeMicroHexapod();
  initializeAxisc();
  initializeMirror();
  initializeSimscapeConfiguration();
  initializeDisturbances('enable', false);
  initializeLoggingConfiguration('log', 'none');
  initializeController('type', 'hac-dvf');

We set the stiffness of the payload fixation:

  Kp = 1e8; % [N/m]

Identification

  K = tf(zeros(6));
  Kdvf = tf(zeros(6));

We identify the system for the following payload masses:

  Ms = [1, 10, 50];

The nano-hexapod has the following leg's stiffness and damping.

  initializeNanoHexapod('k', 1e5, 'c', 2e2);

Controller Design

Root Locus

/tdehaeze/nass-simscape/media/commit/4973abb7423b419864f6d7ed45d7e5c8af280daa/org/figs/opt_stdvf_dvf_root_locus.png

Root Locus for the

Damping as function of the gain

  Kdvf = 5e3*s/(1+s/2/pi/1e3)*eye(6);

Identification of the dynamics for the Primary controller

Introduction   ignore

Let's identify the dynamics from actuator forces $\bm{\tau}$ to displacement as measured by the metrology $\bm{\mathcal{X}}$: \[ \bm{G}(s) = \frac{\bm{\mathcal{X}}}{\bm{\tau}} \]

Then, we compute both the transfer function from forces applied by the actuators $\bm{\mathcal{F}}$ to the measured position error in the frame of the nano-hexapod $\bm{\epsilon}_{\mathcal{X}_n}$: \[ \bm{G}_\mathcal{X}(s) = \frac{\bm{\epsilon}_{\mathcal{X}_n}}{\bm{\mathcal{F}}} = \bm{G}(s) \bm{J}^{-T} \]

and from actuator forces $\bm{\tau}$ to position error of each leg $\bm{\epsilon}_\mathcal{L}$: \[ \bm{G}_\mathcal{L} = \frac{\bm{\epsilon}_\mathcal{L}}{\bm{\tau}} = \bm{J} \bm{G}(s) \]

We identify these dynamics with and without using the DVF controller.

Identification of the undamped plant   ignore

Identification of the damped plant   ignore

Obtained dynamics for the Undamped plant   ignore

Primary Control in the task space

Introduction   ignore

Plant in the task space

Let's look $\bm{G}_\mathcal{X}(s)$.

Control in the task space

  Kx = tf(zeros(6));

  h = 2.5;
  Kx(1,1) = 3e7 * ...
            1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
            (s/2/pi/1 + 1)/(s/2/pi/1);

  Kx(2,2) = Kx(1,1);

  h = 2.5;
  Kx(3,3) = 3e7 * ...
            1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
            (s/2/pi/1 + 1)/(s/2/pi/1);
  h = 1.5;
  Kx(4,4) = 5e5 * ...
            1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
            (s/2/pi/1 + 1)/(s/2/pi/1);

  Kx(5,5) = Kx(4,4);

  h = 1.5;
  Kx(6,6) = 5e4 * ...
            1/h*(s/(2*pi*30/h) + 1)/(s/(2*pi*30*h) + 1) * ...
            (s/2/pi/1 + 1)/(s/2/pi/1);

Stability

  for i = 1:length(Ms)
      isstable(feedback(Gm_x{i}*Kx, eye(6), -1))
  end

Simulation

Primary Control in the leg space

Plant in the task space

Control in the leg space

  h = 1.5;
  Kl = 2e7 * eye(6) * ...
       1/h*(s/(2*pi*200/h) + 1)/(s/(2*pi*200*h) + 1) * ...
       1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
       (s/2/pi/10 + 1)/(s/2/pi/10) * ...
       1/(1 + s/2/pi/500);
  for i = 1:length(Ms)
      isstable(feedback(Gm_l{i}(1,1)*Kl(1,1), 1, -1))
  end

Simulations

  load('mat/stages.mat', 'nano_hexapod');
  K = Kl*nano_hexapod.J;
  initializeDisturbances('Fty_x', false, 'Fty_z', false);
  initializeSimscapeConfiguration('gravity', false);
  initializeLoggingConfiguration('log', 'all');
  load('mat/conf_simulink.mat');
  set_param(conf_simulink, 'StopTime', '2');
  hac_dvf_L = {zeros(length(Ms)), 1};

  for i = 1:length(Ms)
      initializeSample('mass', Ms(i), 'freq', sqrt(Kp/Ms(i))/2/pi*ones(6,1));
      initializeReferences('Rz_type', 'rotating', 'Rz_period', Ms(i));

      sim('nass_model');
      hac_dvf_L(i) = {simout};
  end
  save('./mat/tomo_exp_hac_dvf.mat', 'hac_dvf_L');

Results

  load('./mat/experiment_tomography.mat', 'tomo_align_dist');
  n_av = 4;
  han_win = hanning(ceil(length(simout.Em.En.Data(:,1))/n_av));
  t = simout.Em.En.Time;
  Ts = t(2)-t(1);

  [pxx_ol, f] = pwelch(tomo_align_dist.Em.En.Data, han_win, [], [], 1/Ts);

  pxx_dvf_L = zeros(length(f), 6, length(Ms));
  for i = 1:length(Ms)
      [pxx, ~] = pwelch(hac_dvf_L{i}.Em.En.Data(ceil(0.2/Ts):end,:), han_win, [], [], 1/Ts);
      pxx_dvf_L(:, :, i) = pxx;
  end