nass-simscape/active_damping/index.org

102 KiB

Active Damping applied on the Simscape Model

Introduction   ignore

First, in section sec:undamped_system, we will looked at the undamped system.

Then, we will compare three active damping techniques:

  • In section sec:iff: the integral force feedback is used
  • In section sec:dvf: the direct velocity feedback is used
  • In section sec:ine: inertial control is used

For each of the active damping technique, we will:

  • Look at the damped plant
  • Simulate tomography experiments
  • Compare the sensitivity from disturbances

The disturbances are:

  • Ground motion
  • Motion errors of all the stages

Undamped System

<<sec:undamped_system>>

ZIP file containing the data and matlab files   ignore

All the files (data and Matlab scripts) are accessible here.

Introduction   ignore

We first look at the undamped system. The performance of this undamped system will be compared with the damped system using various techniques.

Identification of the dynamics for Active Damping

Initialize the Simulation

We initialize all the stages with the default parameters.

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

The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg.

  initializeNanoHexapod('actuator', 'piezo');
  initializeSample('mass', 50);

We set the references to zero.

  initializeReferences();

And all the controllers are set to 0.

  K = tf(zeros(6));
  save('./mat/controllers.mat', 'K', '-append');
  K_ine = tf(zeros(6));
  save('./mat/controllers.mat', 'K_ine', '-append');
  K_iff = tf(zeros(6));
  save('./mat/controllers.mat', 'K_iff', '-append');
  K_dvf = tf(zeros(6));
  save('./mat/controllers.mat', 'K_dvf', '-append');

Identification

First, we identify the dynamics of the system using the linearize function.

  %% Options for Linearized
  options = linearizeOptions;
  options.SampleTime = 0;

  %% Name of the Simulink File
  mdl = 'sim_nass_active_damping';

  %% Input/Output definition
  clear io; io_i = 1;
  io(io_i) = linio([mdl, '/Fnl'],           1, 'openinput');              io_i = io_i + 1;
  io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1;
  io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1;
  io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm');  io_i = io_i + 1;

  %% Run the linearization
  G = linearize(mdl, io, options);
  G.InputName  = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
  G.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6', ...
                  'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6', ...
                  'Vnlm1', 'Vnlm2', 'Vnlm3', 'Vnlm4', 'Vnlm5', 'Vnlm6'};

We then create transfer functions corresponding to the active damping plants.

  G_iff = minreal(G({'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}));
  G_dvf = minreal(G({'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}));
  G_ine = minreal(G({'Vnlm1', 'Vnlm2', 'Vnlm3', 'Vnlm4', 'Vnlm5', 'Vnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}));

And we save them for further analysis.

  save('./active_damping/mat/undamped_plants.mat', 'G_iff', 'G_dvf', 'G_ine');

Obtained Plants for Active Damping

<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/nass_active_damping_iff_plant.png
G_iff: IFF Plant (png, pdf)
<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/nass_active_damping_ine_plant.png
G_dvf: Plant for Direct Velocity Feedback (png, pdf)
<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/nass_active_damping_inertial_plant.png
Inertial Feedback Plant (png, pdf)

Tomography Experiment

Simulation

We initialize elements for the tomography experiment.

  prepareTomographyExperiment();

We change the simulation stop time.

  load('mat/conf_simscape.mat');
  set_param(conf_simscape, 'StopTime', '3');

And we simulate the system.

  sim('sim_nass_active_damping');

Finally, we save the simulation results for further analysis

  save('./active_damping/mat/tomo_exp.mat', 'En', 'Eg', '-append');

Results

We load the results of tomography experiments.

  load('./active_damping/mat/tomo_exp.mat', 'En');
  t = linspace(0, 3, length(En(:,1)));
<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/nass_act_damp_undamped_sim_tomo_trans.png
Position Error during tomography experiment - Translations (png, pdf)
<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/nass_act_damp_undamped_sim_tomo_rot.png
Position Error during tomography experiment - Rotations (png, pdf)

Integral Force Feedback

<<sec:iff>>

ZIP file containing the data and matlab files   ignore

All the files (data and Matlab scripts) are accessible here.

Introduction   ignore

Integral Force Feedback is applied on the simscape model.

Control Design

Plant

Let's load the previously indentified undamped plant:

  load('./active_damping/mat/undamped_plants.mat', 'G_iff');

Let's look at the transfer function from actuator forces in the nano-hexapod to the force sensor in the nano-hexapod legs for all 6 pairs of actuator/sensor (figure fig:iff_plant).

  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/iff_plant.png
Transfer function from forces applied in the legs to force sensor (png, pdf)

Control Design

The controller for each pair of actuator/sensor is:

  K_iff = 1000/s;

The corresponding loop gains are shown in figure fig:iff_open_loop.

  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/iff_open_loop.png
Loop Gain for the Integral Force Feedback (png, pdf)

Diagonal Controller

We create the diagonal controller and we add a minus sign as we have a positive feedback architecture.

  K_iff = -K_iff*eye(6);

We save the controller for further analysis.

  save('./active_damping/mat/K_iff.mat', 'K_iff');

Tomography Experiment

Initialize the Simulation

We initialize elements for the tomography experiment.

  prepareTomographyExperiment();

We set the IFF controller.

  load('./active_damping/mat/K_iff.mat', 'K_iff');
  save('./mat/controllers.mat', 'K_iff', '-append');

Simulation

We change the simulation stop time.

  load('mat/conf_simscape.mat');
  set_param(conf_simscape, 'StopTime', '3');

And we simulate the system.

  sim('sim_nass_active_damping');

Finally, we save the simulation results for further analysis

  En_iff = En;
  Eg_iff = Eg;
  save('./active_damping/mat/tomo_exp.mat', 'En_iff', 'Eg_iff', '-append');

Compare with Undamped system

We load the results of tomography experiments.

  load('./active_damping/mat/tomo_exp.mat', 'En', 'En_iff');
  t = linspace(0, 3, length(En(:,1)));
<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/nass_act_damp_iff_sim_tomo_trans.png
Position Error during tomography experiment - Translations (png, pdf)
<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/nass_act_damp_iff_sim_tomo_rot.png
Position Error during tomography experiment - Rotations (png, pdf)

Conclusion

Integral Force Feedback:

  • Robust (guaranteed stability)
  • Acceptable Damping
  • Increase the sensitivity to disturbances at low frequencies

Direct Velocity Feedback

<<sec:dvf>>

ZIP file containing the data and matlab files   ignore

All the files (data and Matlab scripts) are accessible here.

Introduction   ignore

In the Direct Velocity Feedback (DVF), a derivative feedback is applied between the measured actuator displacement to the actuator force input. The actuator displacement can be measured with a capacitive sensor for instance.

Control Design

Plant

Let's load the undamped plant:

  load('./active_damping/mat/undamped_plants.mat', 'G_dvf');

Let's look at the transfer function from actuator forces in the nano-hexapod to the measured displacement of the actuator for all 6 pairs of actuator/sensor (figure fig:dvf_plant).

  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/dvf_plant.png
Transfer function from forces applied in the legs to leg displacement sensor (png, pdf)

Control Design

The Direct Velocity Feedback is defined below. A Low pass Filter is added to make the controller transfer function proper.

  K_dvf = s*20000/(1 + s/2/pi/10000);

The obtained loop gains are shown in figure fig:dvf_open_loop.

  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/dvf_open_loop.png
Loop Gain for the Integral Force Feedback (png, pdf)

Diagonal Controller

We create the diagonal controller and we add a minus sign as we have a positive feedback architecture.

  K_dvf = -K_dvf*eye(6);

We save the controller for further analysis.

  save('./active_damping/mat/K_dvf.mat', 'K_dvf');

Tomography Experiment

Initialize the Simulation

We initialize elements for the tomography experiment.

  prepareTomographyExperiment();

We set the DVF controller.

  load('./active_damping/mat/K_dvf.mat', 'K_dvf');
  save('./mat/controllers.mat', 'K_dvf', '-append');

Simulation

We change the simulation stop time.

  load('mat/conf_simscape.mat');
  set_param(conf_simscape, 'StopTime', '3');

And we simulate the system.

  sim('sim_nass_active_damping');

Finally, we save the simulation results for further analysis

  En_dvf = En;
  Eg_dvf = Eg;
  save('./active_damping/mat/tomo_exp.mat', 'En_dvf', 'Eg_dvf', '-append');

Compare with Undamped system

We load the results of tomography experiments.

  load('./active_damping/mat/tomo_exp.mat', 'En', 'En_dvf');
  t = linspace(0, 3, length(En(:,1)));
<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/nass_act_damp_dvf_sim_tomo_trans.png
Position Error during tomography experiment - Translations (png, pdf)
<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/nass_act_damp_dvf_sim_tomo_rot.png
Position Error during tomography experiment - Rotations (png, pdf)

Conclusion

Direct Velocity Feedback:

Inertial Control

<<sec:ine>>

ZIP file containing the data and matlab files   ignore

All the files (data and Matlab scripts) are accessible here.

Introduction   ignore

In Inertial Control, a feedback is applied between the measured absolute velocity of the platform to the actuator force input.

Control Design

Plant

Let's load the undamped plant:

  load('./active_damping/mat/undamped_plants.mat', 'G_ine');

Let's look at the transfer function from actuator forces in the nano-hexapod to the measured velocity of the nano-hexapod platform in the direction of the corresponding actuator for all 6 pairs of actuator/sensor (figure fig:ine_plant).

  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/ine_plant.png
Transfer function from forces applied in the legs to leg velocity sensor (png, pdf)

Control Design

The controller is defined below and the obtained loop gain is shown in figure fig:ine_open_loop_gain.

  K_ine = 1e3/(1+s/(2*pi*100));
  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/ine_open_loop_gain.png
Loop Gain for Inertial Control (png, pdf)

Diagonal Controller

We create the diagonal controller and we add a minus sign as we have a positive feedback architecture.

  K_ine = -K_ine*eye(6);

We save the controller for further analysis.

  save('./active_damping/mat/K_ine.mat', 'K_ine');

Tomography Experiment

Initialize the Simulation

We initialize elements for the tomography experiment.

  prepareTomographyExperiment();

We set the Inertial controller.

  load('./active_damping/mat/K_ine.mat', 'K_ine');
  save('./mat/controllers.mat', 'K_ine', '-append');

Simulation

We change the simulation stop time.

  load('mat/conf_simscape.mat');
  set_param(conf_simscape, 'StopTime', '3');

And we simulate the system.

  sim('sim_nass_active_damping');

Finally, we save the simulation results for further analysis

  En_ine = En;
  Eg_ine = Eg;
  save('./active_damping/mat/tomo_exp.mat', 'En_ine', 'Eg_ine', '-append');

Compare with Undamped system

We load the results of tomography experiments.

  load('./active_damping/mat/tomo_exp.mat', 'En', 'En_ine');
  t = linspace(0, 3, length(En_ine(:,1)));
<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/nass_act_damp_ine_sim_tomo_trans.png
Position Error during tomography experiment - Translations (png, pdf)
<<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/nass_act_damp_ine_sim_tomo_rot.png
Position Error during tomography experiment - Rotations (png, pdf)

Conclusion

Inertial Control:

Comparison

<<sec:comparison>>

Introduction   ignore

Load the plants

  load('./active_damping/mat/plants.mat', 'G', 'G_iff', 'G_ine', 'G_dvf');

Sensitivity to Disturbance

  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/sensitivity_comp_ground_motion_z.png
caption (png, pdf)
  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/sensitivity_comp_direct_forces_z.png
caption (png, pdf)
  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/sensitivity_comp_spindle_z.png
caption (png, pdf)
  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/sensitivity_comp_ty_z.png
caption (png, pdf)
  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/sensitivity_comp_ty_x.png
caption (png, pdf)

Damped Plant

  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/plant_comp_damping_z.png
Plant for the $z$ direction for different active damping technique used (png, pdf)
  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/plant_comp_damping_x.png
Plant for the $x$ direction for different active damping technique used (png, pdf)
  <<plt-matlab>>
/tdehaeze/nass-simscape/media/commit/3367cabc704cfcfe6104377927e096f4ba156ac2/active_damping/figs/plant_comp_damping_coupling.png
Comparison of one off-diagonal plant for different damping technique applied (png, pdf)

Tomography Experiment

  load('./active_damping/mat/tomo_exp.mat', 'En', 'En_iff', 'En_dvf', 'En_ine');
  t = linspace(0, 3, length(En(:,1)));
  rms(sqrt(En(:, 1).^2     + En(:, 2).^2     + En(:, 3).^2))
  rms(sqrt(En_ine(:, 1).^2 + En_ine(:, 2).^2 + En_ine(:, 3).^2))
  rms(sqrt(En_dvf(:, 1).^2 + En_dvf(:, 2).^2 + En_dvf(:, 3).^2))
  rms(sqrt(En_iff(:, 1).^2 + En_iff(:, 2).^2 + En_iff(:, 3).^2))

Frequency Domain

  Ts = t(1); % Sample Time for the Data [s]

  n_av = 8;
  han_win = hanning(ceil(length(En(:, 1))/n_av));

  [pdx, f] = pwelch(Ern(:, 1), han_win, [], [], 1/Ts);

Useful Functions

prepareTomographyExperiment

<<sec:prepareTomographyExperiment>>

This Matlab function is accessible here.

Function Description

  function [] = prepareTomographyExperiment(args)

Optional Parameters

  arguments
      args.nass_actuator       char   {mustBeMember(args.nass_actuator,{'piezo', 'lorentz'})} = 'piezo'
      args.sample_mass   (1,1) double {mustBeNumeric, mustBePositive} = 50
      args.Ry_period     (1,1) double {mustBeNumeric, mustBePositive} = 1
  end

Initialize the Simulation

We initialize all the stages with the default parameters.

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

The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg.

  initializeNanoHexapod('actuator', args.nass_actuator);
  initializeSample('mass', args.sample_mass);

We set the references to zero.

  initializeReferences('Rz_type', 'rotating', 'Rz_period', args.Ry_period);

And all the controllers are set to 0.

  K = tf(zeros(6));
  save('./mat/controllers.mat', 'K', '-append');
  K_ine = tf(zeros(6));
  save('./mat/controllers.mat', 'K_ine', '-append');
  K_iff = tf(zeros(6));
  save('./mat/controllers.mat', 'K_iff', '-append');
  K_dvf = tf(zeros(6));
  save('./mat/controllers.mat', 'K_dvf', '-append');