- Modify the joints for Ty, Ry, Rz to have only one bushing joint. - Compensation of gravity
151 KiB
Active Damping applied on the Simscape Model
- Introduction
- Undamped System
- Variability of the system dynamics for Active Damping
- Integral Force Feedback
- Direct Velocity Feedback
- Inertial Control
- Comparison
- Useful Functions
- Use only one joint for the tilt stage
Introduction ignore
The goal of this file is to study the use of active damping for the control of the NASS.
In general, three sensors can be used for Active Damping:
- A force sensor
- A relative motion sensor such as a capacitive sensor
- An inertial sensor such as an accelerometer of geophone
First, in section sec:undamped_system, we look at the undamped system and we identify the dynamics from the actuators to the three sensor types.
Then, in section sec:act_damp_variability_plant, we study the change of dynamics for the active damping plants with respect to various experimental conditions such as the sample mass and the spindle rotation speed.
Then, we will apply and compare the results of three active damping techniques:
- In section sec:iff: Integral Force Feedback is applied
- In section sec:dvf: Direct Velocity Feedback using a relative motion sensor is applied
- In section sec:ine: Inertial Control using a geophone is applied
For each of the active damping technique, we:
- Look at the obtain damped plant that will be used for High Authority control
- Simulate tomography experiments
- Compare the sensitivity from disturbances
Undamped System
<<sec:undamped_system>>
Introduction ignore
In this section, we identify the dynamic of the system from forces applied in the nano-hexapod legs to the various sensors included in the nano-hexapod that could be use for Active Damping, namely:
- A relative motion sensor, measuring the relative displacement of each of the leg
- A force sensor measuring the total force transmitted to the top part of the leg in the direction of the leg
- A absolute velocity sensor measuring the absolute velocity of the top part of the leg in the direction of the leg
After that, a tomography experiment is simulation without any active damping techniques.
Identification of the dynamics for Active Damping
Identification
We initialize all the stages with the default parameters.
prepareLinearizeIdentification();
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 = 'nass_model';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1; % Relative Motion Outputs
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1; % Force Sensors
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1; % Absolute Velocity Outputs
%% Run the linearization
G = linearize(mdl, io, 0.5, 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
load('./active_damping/mat/undamped_plants.mat', 'G_iff', 'G_dvf', 'G_ine');
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Identification of the dynamics for High Authority Control
Identification
We initialize all the stages with the default parameters.
prepareLinearizeIdentification();
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 = 'nass_model';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'openoutput', [], 'En'); io_i = io_i + 1; % Metrology Outputs
masses = [1, 10, 50]; % [kg]
And we save them for further analysis.
save('./active_damping/mat/cart_plants.mat', 'G_cart', 'masses');
Obtained Plants
load('./active_damping/mat/cart_plants.mat', 'G_cart', 'masses');
<<plt-matlab>>
<<plt-matlab>>
Tomography Experiment
Simulation
We initialize elements for the tomography experiment.
prepareTomographyExperiment();
We change the simulation stop time.
load('mat/conf_simulink.mat');
set_param(conf_simulink, 'StopTime', '4.5');
And we simulate the system.
sim('nass_model');
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');
Fs = 1e3; % Sampling Frequency of the Data
t = (1/Fs)*[0:length(En(:,1))-1];
<<plt-matlab>>
<<plt-matlab>>
Variability of the system dynamics for Active Damping
<<sec:act_damp_variability_plant>>
Introduction ignore
The goal of this section is to study how the dynamics of the Active Damping plants are changing with the experimental conditions. These experimental conditions are:
- The mass of the sample (section sec:variability_sample_mass)
- The spindle angle with a null rotating speed (section sec:variability_spindle_angle)
- The spindle rotation speed (section sec:variability_rotation_speed)
- The tilt angle (section sec:variability_tilt_angle)
- The scans of the translation stage (section sec:variability_ty_scans)
For the identification of the dynamics, the system is simulation for $\approx 0.5s$ before the linearization is performed. This is done in order for the transient phase to be over.
Variation of the Sample Mass
<<sec:variability_sample_mass>>
Introduction ignore
For all the identifications, the disturbances are disabled and no controller are used.
Identification ignore
We initialize all the stages with the default parameters.
prepareLinearizeIdentification();
We identify the dynamics for the following sample mass.
masses = [1, 10, 50]; % [kg]
Plots ignore
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Variation of the Spindle Angle
<<sec:variability_spindle_angle>>
Introduction ignore
Identification ignore
We initialize all the stages with the default parameters.
prepareLinearizeIdentification();
We identify the dynamics for the following Spindle angles.
Rz_amplitudes = [0, pi/4, pi/2, pi]; % [rad]
Plots ignore
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Variation of the Spindle Rotation Speed
<<sec:variability_rotation_speed>>
Introduction ignore
Identification ignore
We initialize all the stages with the default parameters.
prepareLinearizeIdentification();
We identify the dynamics for the following Spindle rotation periods.
Rz_periods = [60, 6, 2, 1]; % [s]
The identification of the dynamics is done at the same Spindle angle position.
Dynamics of the Active Damping plants
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Variation of the poles and zeros with the Spindle rotation frequency
<<plt-matlab>>
<<plt-matlab>>
Variation of the Tilt Angle
<<sec:variability_tilt_angle>>
Introduction ignore
Identification ignore
We initialize all the stages with the default parameters.
prepareLinearizeIdentification();
We identify the dynamics for the following Tilt stage angles.
Ry_amplitudes = [-3*pi/180, 3*pi/180]; % [rad]
Plots ignore
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Scans of the Translation Stage
<<sec:variability_ty_scans>>
Introduction ignore
We want here to verify if the dynamics used for Active damping is varying when using the translation stage for scans.
Identification ignore
We initialize all the stages with the default parameters.
prepareLinearizeIdentification();
We initialize the translation stage reference to be a sinus with an amplitude of 5mm and a period of 1s (Figure fig:ty_scanning_reference_sinus).
initializeReferences('Dy_type', 'sinusoidal', ...
'Dy_amplitude', 5e-3, ... % [m]
'Dy_period', 1); % [s]
<<plt-matlab>>
We identify the dynamics at different positions (times) when scanning with the Translation stage.
t_lin = [0.5, 0.75, 1, 1.25];
Plots ignore
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Conclusion
Change of Dynamics | |
---|---|
Sample Mass | Large |
Spindle Angle | Small |
Spindle Rotation Speed | First resonance is split in two resonances |
Tilt Angle | Negligible |
Translation Stage scans | Negligible |
Also, for the Inertial Sensor, a RHP zero may appear when the spindle is rotating fast.
When using either a force sensor or a relative motion sensor for active damping, the only "parameter" that induce a large change for the dynamics to be controlled is the sample mass. Thus, the developed damping techniques should be robust to variations of the sample mass.
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
Here, we study the use of Integral Force Feedback (IFF) to actively damp the resonances.
The IFF control is applied in a decentralized way: there is on controller for each leg.
The control architecture is represented in figure fig:iff_1dof where one of the 6 nano-hexapod legs is represented.
Control Design
Plant
Let's load the previously identified undamped plant:
load('./active_damping/mat/undamped_plants.mat', 'G_iff');
load('./active_damping/mat/plants_variable.mat', 'masses', 'Gm_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>>
Control Design
The controller for each pair of actuator/sensor is:
w0 = 2*pi*50;
K_iff = -5000/s * (s/w0)/(1 + s/w0);
The corresponding loop gains are shown in figure fig:iff_open_loop.
<<plt-matlab>>
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
Simulation with IFF Controller
We initialize elements for the tomography experiment.
prepareTomographyExperiment();
We set the IFF controller.
load('./active_damping/mat/K_iff.mat', 'K_iff');
initializeController('type', 'iff', 'K', K_iff);
We change the simulation stop time.
load('mat/conf_simulink.mat');
set_param(conf_simulink, 'StopTime', '4.5');
And we simulate the system.
sim('nass_model');
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
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Conclusion
Integral Force Feedback using a force sensor:
- 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');
load('./active_damping/mat/plants_variable.mat', 'masses', 'Gm_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>>
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*30000/(1 + s/2/pi/10000);
The obtained loop gains are shown in figure fig:dvf_open_loop.
<<plt-matlab>>
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');
initializeController('type', 'dvf', 'K', K_dvf);
We change the simulation stop time.
load('mat/conf_simulink.mat');
set_param(conf_simulink, 'StopTime', '4.5');
And we simulate the system.
sim('nass_model');
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
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Conclusion
Direct Velocity Feedback using a relative motion sensor:
- Robust (guaranteed stability)
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 motion (velocity or acceleration) 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');
load('./active_damping/mat/plants_variable.mat', 'masses', 'Gm_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>>
Control Design
The controller is defined below and the obtained loop gain is shown in figure fig:ine_open_loop_gain.
K_ine = 2.5e4;
<<plt-matlab>>
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');
Conclusion
Inertial Control should not be used.
TODO Comparison
<<sec:comparison>>
Introduction ignore
Load the plants
load('./active_damping/mat/plants.mat', 'G', 'G_iff', 'G_ine', 'G_dvf');
TODO Sensitivity to Disturbance
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
TODO Damped Plant
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Tomography Experiment - Frequency Domain analysis
load('./active_damping/mat/tomo_exp.mat', 'En', 'En_iff', 'En_dvf');
Fs = 1e3; % Sampling Frequency of the Data
t = (1/Fs)*[0:length(En(:,1))-1];
We remove the first 0.5 seconds where the transient behavior is fading out.
[~, i_start] = min(abs(t - 0.5)); % find the indice corresponding to 0.5s
t = t(i_start:end) - t(i_start);
En = En(i_start:end, :);
En_dvf = En_dvf(i_start:end, :);
En_iff = En_iff(i_start:end, :);
Window used for pwelch
function.
n_av = 4;
han_win = hanning(ceil(length(En(:, 1))/n_av));
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Useful Functions
prepareLinearizeIdentification
<<sec:prepareLinearizeIdentification>>
This Matlab function is accessible here.
Function Description
function [] = prepareLinearizeIdentification(args)
Optional Parameters
arguments
args.nass_actuator char {mustBeMember(args.nass_actuator,{'piezo', 'lorentz'})} = 'piezo'
args.sample_mass (1,1) double {mustBeNumeric, mustBePositive} = 50 % [kg]
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 and disturbances to zero.
initializeReferences();
initializeDisturbances('enable', false);
We set the controller type to Open-Loop.
initializeController('type', 'open-loop');
And we put some gravity.
initializeSimscapeConfiguration('gravity', true);
We do not need to log any signal.
initializeLoggingConfiguration('log', 'none');
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 % [kg]
args.Rz_period (1,1) double {mustBeNumeric, mustBePositive} = 1 % [s]
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 that corresponds to a tomography experiment.
initializeReferences('Rz_type', 'rotating', 'Rz_period', args.Rz_period);
initializeDisturbances();
Open Loop.
initializeController('type', 'open-loop');
And we put some gravity.
initializeSimscapeConfiguration('gravity', true);
We log the signals.
initializeLoggingConfiguration('log', 'all');
Use only one joint for the tilt stage
K = [2.8e4; 2.8e4; 2.8e4];
%K = [1e8; 1e8; 1e8];
ty = 7*(2*pi)/180;
Ry = [ cos(ty) 0 sin(ty);
0 1 0;
-sin(ty) 0 cos(ty)];
K11 = abs(Ry*K);
K12 = abs(Ry*K);
ty = -7*(2*pi)/180;
Ry = [ cos(ty) 0 sin(ty);
0 1 0;
-sin(ty) 0 cos(ty)];
K21 = abs(Ry*K);
K22 = abs(Ry*K);
Ktot = zeros(6,1);
Ktot(1) = K11(1) + K12(1) + K21(1) + K22(1);
Ktot(2) = K11(2) + K12(2) + K21(2) + K22(2);
Ktot(3) = K11(3) + K12(3) + K21(3) + K22(3);
%% Stiffness in rotation
% Position of the joint from the next wanted joint position (in the rotated frame)
P11 = [0; 0.334; 0];
P12 = [0; 0.334; 0];
P21 = [0; 0.334; 0];
P22 = [0; 0.334; 0];
Ktot(4:6) = abs(cross(P11, K11)) + abs(cross(P12, K12)) + abs(cross(P21, K21)) + abs(cross(P22, K22))
Ry_init = 0;
initializeSimscapeConfiguration('gravity', true);
initializeLoggingConfiguration('log', 'none');
initializeGround('type', 'none');
initializeGranite('type', 'none');
initializeTy('type', 'none');
initializeRy('type', 'init', 'Ry_init', Ry_init);
initializeRz('type', 'init');
initializeMicroHexapod('type', 'init');
initializeAxisc('type', 'none');
initializeMirror('type', 'none');
initializeNanoHexapod('type', 'none');
initializeSample('type', 'init');
sim('nass_model');
save('./mat/Foffset.mat', 'Fym');
initializeReferences('Ry_amplitude', 3*(2*pi)/180)
initializeRy('type', 'flexible', 'Ry_init', 3*(2*pi)/180);
sim('nass_model');