diff --git a/docs/amplified_piezoelectric_stack.html b/docs/amplified_piezoelectric_stack.html index 347e894..eedd982 100644 --- a/docs/amplified_piezoelectric_stack.html +++ b/docs/amplified_piezoelectric_stack.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Amplified Piezoelectric Stack Actuator @@ -36,30 +36,64 @@ @@ -67,7 +101,7 @@

-The presented model is based on souleille18_concep_activ_mount_space_applic. +The presented model is based on (Souleille et al. 2018).

@@ -136,8 +170,8 @@ The parameters are shown in the table below.

1 Simplified Model

-
-

1.1 Parameters

+
+

1.1 Parameters

m = 1; % [kg]
@@ -167,8 +201,8 @@ IFF Controller:
 
-
-

1.2 Identification

+
+

1.2 Identification

Identification in open-loop. @@ -223,8 +257,8 @@ Giff.OutputName = {'Fs', 'x1'};

-
-

1.3 Root Locus

+
+

1.3 Root Locus

@@ -300,6 +334,17 @@ And two complex conjugate poles at: If maximal damping is to be attained with IFF, the distance between the zero and the pole is to be maximized. Thus, we wish to maximize \(p/z\), which is equivalent as to minimize \(k_1\) and have \(k_e \approx k_a\) (supposing \(k_e + k_a \approx \text{cst}\)).

+ +
+
m = 1;
+k1 = 1e6;
+ka = 1e6;
+ke = 1e6;
+
+Giff.InputName = {'f'};
+Giff.OutputName = {'Fs'};
+
+
@@ -307,9 +352,13 @@ Thus, we wish to maximize \(p/z\), which is equivalent as to minimize \(k_1\) an

2 Rotating X-Y platform

+

+This analysis gave rise to a paper (Dehaeze and Collette 2020). +

-
-

2.1 Parameters

+ +
+

2.1 Parameters

m = 1; % [kg]
@@ -336,8 +385,8 @@ h = 0.2; % [m]
 
-
-

2.2 Identification

+
+

2.2 Identification

Rotating speed in rad/s: @@ -386,8 +435,8 @@ end

-
-

2.3 Root Locus

+
+

2.3 Root Locus

@@ -485,9 +534,13 @@ We set the stiffness of the payload fixation:
-
-

3.2 Identification

+
+

3.2 APA-100 Amplified Actuator

+
+
+

3.2.1 Identification

+
K = tf(zeros(6));
 Kiff = tf(zeros(6));
@@ -512,9 +565,21 @@ The nano-hexapod has the following leg’s stiffness and damping.
 
-
-

3.3 Controller Design

-
+
+

3.2.2 Controller Design

+
+

+The loop gain for IFF is shown in Figure 8. +

+ +

+The corresponding root locus is shown in Figure 9. +

+ +

+Finally, the damping as function of the gain is display in Figure 10. +

+

amplified_piezo_iff_loop_gain.png @@ -530,9 +595,6 @@ The nano-hexapod has the following leg’s stiffness and damping.

Figure 9: Root Locus for the IFF control for three payload masses

-

-Damping as function of the gain -

amplified_piezo_iff_damping_gain.png @@ -541,7 +603,7 @@ Damping as function of the gain

-Finally, we use the following controller for the Decentralized Direct Velocity Feedback: +The following controller for the Decentralized Integral Force Feedback is used:

Kiff = -1e4/s*eye(6);
@@ -550,9 +612,9 @@ Finally, we use the following controller for the Decentralized Direct Velocity F
 
-
-

3.4 Effect of the Low Authority Control on the Primary Plant

-
+
+

3.2.3 Effect of the Low Authority Control on the Primary Plant

+

amplified_piezo_iff_plant_damped_X.png @@ -584,15 +646,19 @@ Finally, we use the following controller for the Decentralized Direct Velocity F

-
-

3.5 Effect of the Low Authority Control on the Sensibility to Disturbances

-
+
+

3.2.4 Effect of the Low Authority Control on the Sensibility to Disturbances

+

amplified_piezo_iff_disturbances.png

Figure 15: Norm of the transfer function from vertical disturbances to vertical position error with (dashed) and without (solid) Integral Force Feedback applied

+
+
+ +
@@ -601,16 +667,387 @@ Finally, we use the following controller for the Decentralized Direct Velocity F
-

3.6 Optimal Stiffnesses

+

3.3 Optimal Stiffnesses

+
+

+Based on the analytical analysis, we can determine the parameters of the amplified piezoelectric actuator in order to be able to add a lots of damping using IFF: +

+
    +
  • \(k_1\) should be minimized.
  • +
  • \(k_e \approx k_a \approx 10^5 - 10^6\,[N/m]\)
  • +
+ +

+However, this might not be realizable. +

+
+ +
+

3.3.1 Low Authority Controller

+
+
+
+
3.3.1.1 Identification
+
+

+The nano-hexapod is initialized with the following parameters: +

+
+
initializeNanoHexapod('actuator', 'amplified', ...
+                      'k1', 1e4, ...
+                      'ke', 1e6, ...
+                      'ka', 1e6);
+
+
+ +

+The obtain plan for the IFF control is shown in Figure 16. +The associated Root Locus is shown in Figure 17. +

+ +

+Based on that, the following IFF gain is chosen: +

+
+
Kiff = -1e3/s*eye(6);
+
+
+ + +
+

amplified_piezo_opt_stiff_iff_plant.png +

+

Figure 16: Plant dynamics for IFF with the amplified piezoelectric stack actuator

+
+ + +
+

amplified_piezo_opt_stiff_iff_root_locus.png +

+

Figure 17: Root Locus for IFF with the amplified piezoelectric stack actuator

+
+ + +
+

amplified_piezo_opt_stiff_gain_damping.png +

+

Figure 18: Damping of the modes as a function of the IFF gain

+
+
+
+ +
+
3.3.1.2 Effect of the Low Authority Control on the Primary Plant
+
+
+
3.3.1.3 Effect of the Low Authority Control on the Sensibility to Disturbances
+
+ +
+

amplified_piezo_opt_stiff_iff_dist.png +

+

Figure 19: Effect of disturbance with and without IFF

+
+
+

+ +

+ +
+
+
+
+ +
+

3.3.2 High Authority Controller

+
+
+
+
3.3.2.1 Controller Design
+
+
+
h = 2.5;
+Kl = 5e6 * eye(6) * ...
+     1/h*(s/(2*pi*40/h) + 1)/(s/(2*pi*40*h) + 1) * ...
+     1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
+     (s/2/pi/50 + 1)/(s/2/pi/50) * ...
+     (s/2/pi/10 + 1)/(s/2/pi/10) * ...
+     1/(1 + s/2/pi/200);
+
+
+ +
+
Kl = 3e10 * eye(6) * ...
+     1/s * ...
+     (s+0.8)/s * ...
+     (s+50)/(s+0.01) * ...
+     (s+120)/(s+1000) * ...
+     (s+150)/(s+1000);
+
+
+ +

+Finally, we include the Jacobian in the control and we ignore the measurement of the vertical rotation as for the real system. +

+
+
load('mat/stages.mat', 'nano_hexapod');
+K = Kl*nano_hexapod.kinematics.J*diag([1, 1, 1, 1, 1, 0]);
+
+
+
+
+ +
+
3.3.2.2 Sensibility to Disturbances and Noise Budget
+
+

+We identify the transfer function from disturbances to the position error of the sample when the HAC-LAC control is applied. +

+
+
+
+
3.3.2.3 Simulations of Tomography Experiment
+
+

+Let’s now simulate a tomography experiment. +To do so, we include all disturbances except vibrations of the translation stage. +

+
+
initializeDisturbances();
+initializeSimscapeConfiguration('gravity', false);
+initializeLoggingConfiguration('log', 'all');
+
+
+ +

+And we run the simulation for all three payload Masses. +

+
+
+
+
3.3.2.4 Results
+
+
-

3.7 Direct Velocity Feedback with Amplified Actuators

+

3.4 Direct Velocity Feedback with Amplified Actuators

+
+

+Lack of collocation. +

+ +
+
initializeController('type', 'hac-dvf');
+K = tf(zeros(6));
+Kdvf = tf(zeros(6));
+
+
+ +

+We identify the system for the following payload masses: +

+
+
Ms = [1, 10, 50];
+
+
+ +
+
initializeNanoHexapod('actuator', 'amplified', ...
+                      'k1', 1e4, ...
+                      'ke', 1e6, ...
+                      'ka', 1e6);
+
+
+
+
+
+ +
+

4 APA300ML

+
+
+
+

4.1 Initialization

+
+
+
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]
+
+
+
+
+ +
+

4.2 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('actuator', 'amplified', 'k1', 0.4e6, 'ka', 43e6, 'ke', 1.5e6);
+
+
+
+
+ +
+

4.3 Controller Design

+
+

+Damping as function of the gain +Finally, we use the following controller for the Decentralized Direct Velocity Feedback: +

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

4.4 Effect of the Low Authority Control on the Primary Plant

+
+
+

4.5 Control in the leg space

+
+

+We design a diagonal controller with all the same diagonal elements. +

+ +

+The requirements for the controller are: +

+
    +
  • Crossover frequency of around 100Hz
  • +
  • Stable for all the considered payload masses
  • +
  • Sufficient phase and gain margin
  • +
  • Integral action at low frequency
  • +
+ +

+The design controller is as follows: +

+
    +
  • Lead centered around the crossover
  • +
  • An integrator below 10Hz
  • +
  • A low pass filter at 250Hz
  • +
+ +
+
h = 2.0;
+Kl = 1e9 * eye(6) * ...
+     1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
+     1/h*(s/(2*pi*200/h) + 1)/(s/(2*pi*200*h) + 1) * ...
+     (s/2/pi/10 + 1)/(s/2/pi/10) * ...
+     1/(1 + s/2/pi/300);
+
+
+ +
+
load('mat/stages.mat', 'nano_hexapod');
+K = Kl*nano_hexapod.kinematics.J*diag([1, 1, 1, 1, 1, 0]);
+
+
+
+
+ +
+

4.6 Sensibility to Disturbances and Noise Budget

+
+

+We identify the transfer function from disturbances to the position error of the sample when the HAC-LAC control is applied. +

+ +
+

opt_stiff_primary_control_L_psd_dist.png +

+

Figure 20: Amplitude Spectral Density of the vertical position error of the sample when the HAC-DVF control is applied due to both the ground motion and spindle vibrations

+
+ + +
+

opt_stiff_primary_control_L_psd_tot.png +

+

Figure 21: Amplitude Spectral Density of the vertical position error of the sample in Open-Loop and when the HAC-DVF control is applied

+
+ + +
+

opt_stiff_primary_control_L_cas_tot.png +

+

Figure 22: Cumulative Amplitude Spectrum of the vertical position error of the sample in Open-Loop and when the HAC-DVF control is applied

+
+
+
+ +
+

4.7 Simulations of Tomography Experiment

+
+

+Let’s now simulate a tomography experiment. +To do so, we include all disturbances except vibrations of the translation stage. +

+
+
initializeDisturbances();
+initializeSimscapeConfiguration('gravity', false);
+initializeLoggingConfiguration('log', 'all');
+
+
+ +

+And we run the simulation for all three payload Masses. +

+
+
+
+

4.8 Results

+
+

Bibliography

+
+
Dehaeze, T., and C. Collette. 2020. “Active Damping of Rotating Platforms Using Integral Force Feedback.” In Proceedings of the International Conference on Modal Analysis Noise and Vibration Engineering (ISMA).
+
Souleille, Adrien, Thibault Lampert, V Lafarga, Sylvain Hellegouarch, Alan Rondineau, Gonçalo Rodrigues, and Christophe Collette. 2018. “A Concept of Active Mount for Space Applications.” CEAS Space Journal 10 (2). Springer:157–65.
+
+

Author: Dehaeze Thomas

-

Created: 2020-05-25 lun. 11:13

+

Created: 2020-09-01 mar. 13:48

diff --git a/docs/disturbances.html b/docs/disturbances.html index 24a13e2..944b364 100644 --- a/docs/disturbances.html +++ b/docs/disturbances.html @@ -1,10 +1,9 @@ - - + Identification of the disturbances @@ -112,8 +111,8 @@ Also, we measure the absolute displacement of the granite and of the top platfor We load the configuration and we set a small StopTime.

-
load('mat/conf_simulink.mat');
-set_param(conf_simulink, 'StopTime', '0.5');
+
load('mat/conf_simulink.mat');
+set_param(conf_simulink, 'StopTime', '0.5');
 
@@ -123,15 +122,15 @@ The obtained system corresponds to the status micro-station when the vibration m

initializeGround();
-initializeGranite('type', 'modal-analysis');
+initializeGranite('type', 'modal-analysis');
 initializeTy();
 initializeRy();
 initializeRz();
-initializeMicroHexapod('type', 'modal-analysis');
-initializeAxisc('type', 'none');
-initializeMirror('type', 'none');
-initializeNanoHexapod('type', 'none');
-initializeSample('type', 'none');
+initializeMicroHexapod('type', 'modal-analysis');
+initializeAxisc('type', 'none');
+initializeMirror('type', 'none');
+initializeNanoHexapod('type', 'none');
+initializeSample('type', 'none');
 
@@ -139,7 +138,7 @@ initializeSample('type', -
initializeController('type', 'open-loop');
+
initializeController('type', 'open-loop');
 
@@ -147,7 +146,7 @@ Open Loop Control. We don’t need gravity here.

-
initializeSimscapeConfiguration('gravity', false);
+
initializeSimscapeConfiguration('gravity', false);
 
@@ -155,7 +154,7 @@ We don’t need gravity here. We log the signals.

-
initializeLoggingConfiguration('log', 'all');
+
initializeLoggingConfiguration('log', 'all');
 
@@ -170,19 +169,19 @@ The transfer functions from the disturbance forces to the relative velocity of t

-
%% Name of the Simulink File
-mdl = 'nass_model';
+
%% Name of the Simulink File
+mdl = 'nass_model';
 
-%% Micro-Hexapod
+%% Micro-Hexapod
 clear io; io_i = 1;
-io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwz'); io_i = io_i + 1; % Vertical Ground Motion
-io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Fty_z'); io_i = io_i + 1; % Parasitic force Ty
-io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Frz_z'); io_i = io_i + 1; % Parasitic force Rz
+io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwz'); io_i = io_i + 1; % Vertical Ground Motion
+io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Fty_z'); io_i = io_i + 1; % Parasitic force Ty
+io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Frz_z'); io_i = io_i + 1; % Parasitic force Rz
 
-io(io_i) = linio([mdl, '/Micro-Station/Granite/Modal Analysis/accelerometer'], 1, 'openoutput'); io_i = io_i + 1; % Absolute motion - Granite
-io(io_i) = linio([mdl, '/Micro-Station/Micro Hexapod/Modal Analysis/accelerometer'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Motion - Hexapod
+io(io_i) = linio([mdl, '/Micro-Station/Granite/Modal Analysis/accelerometer'], 1, 'openoutput'); io_i = io_i + 1; % Absolute motion - Granite
+io(io_i) = linio([mdl, '/Micro-Station/Micro Hexapod/Modal Analysis/accelerometer'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Motion - Hexapod
 
-% Run the linearization
+% Run the linearization
 G = linearize(mdl, io, 0);
 
@@ -191,11 +190,11 @@ G = linearize(mdl, io, 0); We Take only the outputs corresponding to the vertical acceleration.

-
G = G([3,9], :);
+
G = G([3,9], :);
 
-% Input/Output names
-G.InputName  = {'Dw', 'Fty', 'Frz'};
-G.OutputName = {'Agm', 'Ahm'};
+% Input/Output names
+G.InputName  = {'Dw', 'Fty', 'Frz'};
+G.OutputName = {'Agm', 'Ahm'};
 
@@ -203,11 +202,11 @@ G.OutputName = {'Agm', We integrate 1 time the output to have the velocity and we substract the absolute velocities to have the relative velocity.

-
G = (1/s)*tf([-1, 1])*G;
+
G = (1/s)*tf([-1, 1])*G;
 
-% Input/Output names
-G.InputName  = {'Dw', 'Fty', 'Frz'};
-G.OutputName = {'Vm'};
+% Input/Output names
+G.InputName  = {'Dw', 'Fty', 'Frz'};
+G.OutputName = {'Vm'};
 
@@ -273,10 +272,10 @@ Also, the Ground Motion is measured.

-
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');
-tyx = load('./mat/pxe_ty_r.mat', 'f', 'pxe_ty_r');
+
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');
+tyx = load('./mat/pxe_ty_r.mat', 'f', 'pxe_ty_r');
 
@@ -285,10 +284,10 @@ Because some 50Hz and harmonics were present in the ground motion measurement, w

f0s = [50, 100, 150, 200, 250, 350, 450];
-for f0 = f0s
-    i = find(gm.f > f0-0.5 & gm.f < f0+0.5);
-    gm.psd_gm(i) = linspace(gm.psd_gm(i(1)), gm.psd_gm(i(end)), length(i));
-end
+for f0 = f0s
+    i = find(gm.f > f0-0.5 & gm.f < f0+0.5);
+    gm.psd_gm(i) = linspace(gm.psd_gm(i(1)), gm.psd_gm(i(end)), length(i));
+end
 
@@ -296,7 +295,7 @@ Because some 50Hz and harmonics were present in the ground motion measurement, w We now compute the relative velocity between the hexapod and the granite due to ground motion.

-
gm.psd_rv = gm.psd_gm.*abs(squeeze(freqresp(G('Vm', 'Dw'), gm.f, 'Hz'))).^2;
+
gm.psd_rv = gm.psd_gm.*abs(squeeze(freqresp(G('Vm', 'Dw'), gm.f, 'Hz'))).^2;
 
@@ -355,8 +354,8 @@ Using the extracted transfer functions from the disturbance force to the relativ This is done below.

-
rz.psd_f  = rz.pxsp_r./abs(squeeze(freqresp(G('Vm', 'Frz'), rz.f, 'Hz'))).^2;
-tyz.psd_f = tyz.pxz_ty_r./abs(squeeze(freqresp(G('Vm', 'Fty'), tyz.f, 'Hz'))).^2;
+
rz.psd_f  = rz.pxsp_r./abs(squeeze(freqresp(G('Vm', 'Frz'), rz.f, 'Hz'))).^2;
+tyz.psd_f = tyz.pxz_ty_r./abs(squeeze(freqresp(G('Vm', 'Fty'), tyz.f, 'Hz'))).^2;
 
@@ -394,9 +393,9 @@ The power spectral density of the relative motion is computed below and the resu We can see that this is exactly the same as the Figure 6.

-
psd_gm_d = gm.psd_gm.*abs(squeeze(freqresp(G('Vm', 'Dw')/s, gm.f, 'Hz'))).^2;
-psd_ty_d = tyz.psd_f.*abs(squeeze(freqresp(G('Vm', 'Fty')/s, tyz.f, 'Hz'))).^2;
-psd_rz_d = rz.psd_f.*abs(squeeze(freqresp(G('Vm', 'Frz')/s, rz.f, 'Hz'))).^2;
+
psd_gm_d = gm.psd_gm.*abs(squeeze(freqresp(G('Vm', 'Dw')/s, gm.f, 'Hz'))).^2;
+psd_ty_d = tyz.psd_f.*abs(squeeze(freqresp(G('Vm', 'Fty')/s, tyz.f, 'Hz'))).^2;
+psd_rz_d = rz.psd_f.*abs(squeeze(freqresp(G('Vm', 'Frz')/s, rz.f, 'Hz'))).^2;
 
@@ -419,13 +418,13 @@ The PSD of the disturbance force are now saved for further analysis.
dist_f = struct();
 
-dist_f.f = gm.f; % Frequency Vector [Hz]
+dist_f.f = gm.f; % Frequency Vector [Hz]
 
-dist_f.psd_gm = gm.psd_gm; % Power Spectral Density of the Ground Motion [m^2/Hz]
-dist_f.psd_ty = tyz.psd_f; % Power Spectral Density of the force induced by the Ty stage in the Z direction [N^2/Hz]
-dist_f.psd_rz = rz.psd_f; % Power Spectral Density of the force induced by the Rz stage in the Z direction [N^2/Hz]
+dist_f.psd_gm = gm.psd_gm; % Power Spectral Density of the Ground Motion [m^2/Hz]
+dist_f.psd_ty = tyz.psd_f; % Power Spectral Density of the force induced by the Ty stage in the Z direction [N^2/Hz]
+dist_f.psd_rz = rz.psd_f; % Power Spectral Density of the force induced by the Rz stage in the Z direction [N^2/Hz]
 
-save('./mat/dist_psd.mat', 'dist_f');
+save('./mat/dist_psd.mat', 'dist_f');
 
@@ -439,7 +438,7 @@ Let’s initialize the time domain disturbances and load them.

initializeDisturbances();
-dist = load('nass_disturbances.mat');
+dist = load('nass_disturbances.mat');
 
@@ -482,22 +481,22 @@ initializeMirror(); The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg.

-
initializeNanoHexapod('type', 'rigid');
-initializeSample('mass', 1);
+
initializeNanoHexapod('type', 'rigid');
+initializeSample('mass', 1);
 
initializeReferences();
-initializeController('type', 'open-loop');
-initializeSimscapeConfiguration('gravity', false);
-initializeLoggingConfiguration('log', 'all');
+initializeController('type', 'open-loop');
+initializeSimscapeConfiguration('gravity', false);
+initializeLoggingConfiguration('log', 'all');
 
-
load('mat/conf_simulink.mat');
-set_param(conf_simulink, 'StopTime', '2');
+
load('mat/conf_simulink.mat');
+set_param(conf_simulink, 'StopTime', '2');
 
@@ -510,8 +509,8 @@ initializeLoggingConfiguration('log',
-
initializeDisturbances('enable', false);
-sim('nass_model');
+
initializeDisturbances('enable', false);
+sim('nass_model');
 sim_no = simout;
 
@@ -520,8 +519,8 @@ sim_no = simout; Ground Motion:

-
initializeDisturbances('Fty_x', false, 'Fty_z', false, 'Frz_z', false);
-sim('nass_model');
+
initializeDisturbances('Fty_x', false, 'Fty_z', false, 'Frz_z', false);
+sim('nass_model');
 sim_gm = simout;
 
@@ -530,8 +529,8 @@ sim_gm = simout; Translation Stage Vibrations:

-
initializeDisturbances('Dwx', false, 'Dwy', false, 'Dwz', false, 'Frz_z', false);
-sim('nass_model');
+
initializeDisturbances('Dwx', false, 'Dwy', false, 'Dwz', false, 'Frz_z', false);
+sim('nass_model');
 sim_ty = simout;
 
@@ -540,8 +539,8 @@ sim_ty = simout; Rotation Stage Vibrations:

-
initializeDisturbances('Dwx', false, 'Dwy', false, 'Dwz', false, 'Fty_x', false, 'Fty_z', false);
-sim('nass_model');
+
initializeDisturbances('Dwx', false, 'Dwy', false, 'Dwz', false, 'Fty_x', false, 'Fty_z', false);
+sim('nass_model');
 sim_rz = simout;
 
@@ -567,7 +566,7 @@ Let’s now compare the effect of those perturbations on the position error

Author: Dehaeze Thomas

-

Created: 2020-04-17 ven. 09:35

+

Created: 2020-09-01 mar. 13:48

diff --git a/docs/identification.html b/docs/identification.html index 19eab99..992646f 100644 --- a/docs/identification.html +++ b/docs/identification.html @@ -1,10 +1,9 @@ - - + Identification @@ -109,7 +108,7 @@ Some of the springs and dampers values can be estimated from the joints/stages s We load the configuration.

-
load('mat/conf_simulink.mat');
+
load('mat/conf_simulink.mat');
 
@@ -117,7 +116,7 @@ We load the configuration. We set a small StopTime.

-
set_param(conf_simulink, 'StopTime', '0.5');
+
set_param(conf_simulink, 'StopTime', '0.5');
 
@@ -125,24 +124,24 @@ We set a small StopTime. We initialize all the stages.

-
initializeGround(      'type', 'rigid');
-initializeGranite(     'type', 'modal-analysis');
-initializeTy(          'type', 'modal-analysis');
-initializeRy(          'type', 'modal-analysis');
-initializeRz(          'type', 'modal-analysis');
-initializeMicroHexapod('type', 'modal-analysis');
-initializeAxisc(       'type', 'flexible');
+
initializeGround(      'type', 'rigid');
+initializeGranite(     'type', 'modal-analysis');
+initializeTy(          'type', 'modal-analysis');
+initializeRy(          'type', 'modal-analysis');
+initializeRz(          'type', 'modal-analysis');
+initializeMicroHexapod('type', 'modal-analysis');
+initializeAxisc(       'type', 'flexible');
 
-initializeMirror(      'type', 'none');
-initializeNanoHexapod( 'type', 'none');
-initializeSample(      'type', 'none');
+initializeMirror(      'type', 'none');
+initializeNanoHexapod( 'type', 'none');
+initializeSample(      'type', 'none');
 
-initializeController(  'type', 'open-loop');
+initializeController(  'type', 'open-loop');
 
-initializeLoggingConfiguration('log', 'none');
+initializeLoggingConfiguration('log', 'none');
 
 initializeReferences();
-initializeDisturbances('enable', false);
+initializeDisturbances('enable', false);
 
@@ -156,7 +155,7 @@ Thanks to the -
sim('nass_model')
+
sim('nass_model')
 
@@ -316,12 +315,12 @@ We do that in order to position an accelerometer on the Simscape model at this p

-
open('identification/matlab/sim_micro_station_com_estimation.slx')
+
open('identification/matlab/sim_micro_station_com_estimation.slx')
 
-
sim('sim_micro_station_com_estimation')
+
sim('sim_micro_station_com_estimation')
 
@@ -391,14 +390,14 @@ We do that in order to position an accelerometer on the Simscape model at this p We now same this for further use:

-
granite_bot_com = granite_bot_com.Data(end, :)';
-granite_top_com = granite_top_com.Data(end, :)';
-ty_com = ty_com.Data(end, :)';
-ry_com = ry_com.Data(end, :)';
-rz_com = rz_com.Data(end, :)';
-hexa_com = hexa_com.Data(end, :)';
+
granite_bot_com = granite_bot_com.Data(end, :)';
+granite_top_com = granite_top_com.Data(end, :)';
+ty_com = ty_com.Data(end, :)';
+ry_com = ry_com.Data(end, :)';
+rz_com = rz_com.Data(end, :)';
+hexa_com = hexa_com.Data(end, :)';
 
-save('./mat/solids_com.mat', 'granite_bot_com', 'granite_top_com', 'ty_com', 'ry_com', 'rz_com', 'hexa_com');
+save('./mat/solids_com.mat', 'granite_bot_com', 'granite_top_com', 'ty_com', 'ry_com', 'rz_com', 'hexa_com');
 
@@ -416,12 +415,12 @@ We now use a new Simscape Model where 6DoF inertial sensors are located at the C

-
% load('mat/solids_com.mat', 'granite_bot_com', 'granite_top_com', 'ty_com', 'ry_com', 'rz_com', 'hexa_com');
+
% load('mat/solids_com.mat', 'granite_bot_com', 'granite_top_com', 'ty_com', 'ry_com', 'rz_com', 'hexa_com');
 
-
open('nass_model.slx')
+
open('nass_model.slx')
 
@@ -429,35 +428,35 @@ We now use a new Simscape Model where 6DoF inertial sensors are located at the C We use the linearize function in order to estimate the dynamics from forces applied on the Translation stage at the same position used for the real modal analysis to the inertial sensors.

-
%% Options for Linearized
+
%% Options for Linearized
 options = linearizeOptions;
 options.SampleTime = 0;
 
-%% Name of the Simulink File
-mdl = 'nass_model';
+%% Name of the Simulink File
+mdl = 'nass_model';
 
-%% Input/Output definition
+%% Input/Output definition
 clear io; io_i = 1;
-io(io_i) = linio([mdl, '/Micro-Station/Translation Stage/Modal Analysis/F_hammer'],          1, 'openinput');  io_i = io_i + 1;
-io(io_i) = linio([mdl, '/Micro-Station/Granite/Modal Analysis/accelerometer'],               1, 'openoutput'); io_i = io_i + 1;
-io(io_i) = linio([mdl, '/Micro-Station/Translation Stage/Modal Analysis/accelerometer'],     1, 'openoutput'); io_i = io_i + 1;
-io(io_i) = linio([mdl, '/Micro-Station/Tilt Stage/Modal Analysis/accelerometer'],            1, 'openoutput'); io_i = io_i + 1;
-io(io_i) = linio([mdl, '/Micro-Station/Spindle/Modal Analysis/accelerometer'],               1, 'openoutput'); io_i = io_i + 1;
-io(io_i) = linio([mdl, '/Micro-Station/Micro Hexapod/Modal Analysis/accelerometer'],         1, 'openoutput'); io_i = io_i + 1;
+io(io_i) = linio([mdl, '/Micro-Station/Translation Stage/Modal Analysis/F_hammer'],          1, 'openinput');  io_i = io_i + 1;
+io(io_i) = linio([mdl, '/Micro-Station/Granite/Modal Analysis/accelerometer'],               1, 'openoutput'); io_i = io_i + 1;
+io(io_i) = linio([mdl, '/Micro-Station/Translation Stage/Modal Analysis/accelerometer'],     1, 'openoutput'); io_i = io_i + 1;
+io(io_i) = linio([mdl, '/Micro-Station/Tilt Stage/Modal Analysis/accelerometer'],            1, 'openoutput'); io_i = io_i + 1;
+io(io_i) = linio([mdl, '/Micro-Station/Spindle/Modal Analysis/accelerometer'],               1, 'openoutput'); io_i = io_i + 1;
+io(io_i) = linio([mdl, '/Micro-Station/Micro Hexapod/Modal Analysis/accelerometer'],         1, 'openoutput'); io_i = io_i + 1;
 
-
% Run the linearization
+
% Run the linearization
 G_ms = linearize(mdl, io, 0);
 
-%% Input/Output definition
-G_ms.InputName  = {'Fx', 'Fy', 'Fz'};
-G_ms.OutputName = {'gtop_x', 'gtop_y', 'gtop_z', 'gtop_rx', 'gtop_ry', 'gtop_rz', ...
-                   'ty_x', 'ty_y', 'ty_z', 'ty_rx', 'ty_ry', 'ty_rz', ...
-                   'ry_x', 'ry_y', 'ry_z', 'ry_rx', 'ry_ry', 'ry_rz', ...
-                   'rz_x', 'rz_y', 'rz_z', 'rz_rx', 'rz_ry', 'rz_rz', ...
-                   'hexa_x', 'hexa_y', 'hexa_z', 'hexa_rx', 'hexa_ry', 'hexa_rz'};
+%% Input/Output definition
+G_ms.InputName  = {'Fx', 'Fy', 'Fz'};
+G_ms.OutputName = {'gtop_x', 'gtop_y', 'gtop_z', 'gtop_rx', 'gtop_ry', 'gtop_rz', ...
+                   'ty_x', 'ty_y', 'ty_z', 'ty_rx', 'ty_ry', 'ty_rz', ...
+                   'ry_x', 'ry_y', 'ry_z', 'ry_rx', 'ry_ry', 'ry_rz', ...
+                   'rz_x', 'rz_y', 'rz_z', 'rz_rx', 'rz_ry', 'rz_rz', ...
+                   'hexa_x', 'hexa_y', 'hexa_z', 'hexa_rx', 'hexa_ry', 'hexa_rz'};
 
@@ -466,7 +465,7 @@ The output of G_ms is the acceleration of each solid body. In order to obtain a displacement, we divide the obtained transfer function by \(1/s^{2}\);

-
G_ms = G_ms/s^2;
+
G_ms = G_ms/s^2;
 
@@ -480,8 +479,8 @@ We now load the Frequency Response Functions measurements during the Modal Analy

-
load('../meas/modal-analysis/mat/frf_coh_matrices.mat', 'freqs');
-load('../meas/modal-analysis/mat/frf_com.mat', 'FRFs_CoM');
+
load('../meas/modal-analysis/mat/frf_coh_matrices.mat', 'freqs');
+load('../meas/modal-analysis/mat/frf_com.mat', 'FRFs_CoM');
 
@@ -532,7 +531,7 @@ initializeGranite(); initializeTy(); initializeRy(); initializeRz(); -initializeMicroHexapod('type', 'compliance'); +initializeMicroHexapod('type', 'compliance');
@@ -540,10 +539,10 @@ initializeMicroHexapod('type', -
initializeAxisc('type', 'none');
-initializeMirror('type', 'none');
-initializeNanoHexapod('type', 'none');
-initializeSample('type', 'none');
+
initializeAxisc('type', 'none');
+initializeMirror('type', 'none');
+initializeNanoHexapod('type', 'none');
+initializeSample('type', 'none');
 
@@ -564,18 +563,23 @@ And we identify the dynamics from forces/torques applied on the micro-hexapod to The obtained compliance is shown in Figure 4.

-
%% Name of the Simulink File
-mdl = 'nass_model';
+
%% Name of the Simulink File
+mdl = 'nass_model';
 
-%% Input/Output definition
+%% Input/Output definition
 clear io; io_i = 1;
-io(io_i) = linio([mdl, '/Micro-Station/Micro Hexapod/Compliance/Fm'], 1, 'openinput');       io_i = io_i + 1; % Direct Forces/Torques applied on the micro-hexapod top platform
-io(io_i) = linio([mdl, '/Micro-Station/Micro Hexapod/Compliance/Dm'], 1, 'output'); io_i = io_i + 1; % Absolute displacement of the top platform
+io(io_i) = linio([mdl, '/Micro-Station/Micro Hexapod/Compliance/Fm'], 1, 'openinput');       io_i = io_i + 1; % Direct Forces/Torques applied on the micro-hexapod top platform
+io(io_i) = linio([mdl, '/Micro-Station/Micro Hexapod/Compliance/Dm'], 1, 'output'); io_i = io_i + 1; % Absolute displacement of the top platform
 
-%% Run the linearization
+%% Run the linearization
 Gm = linearize(mdl, io, 0);
-Gm.InputName  = {'Fmx', 'Fmy', 'Fmz', 'Mmx', 'Mmy', 'Mmz'};
-Gm.OutputName = {'Dx', 'Dy', 'Dz', 'Drx', 'Dry', 'Drz'};
+Gm.InputName  = {'Fmx', 'Fmy', 'Fmz', 'Mmx', 'Mmy', 'Mmz'};
+Gm.OutputName = {'Dx', 'Dy', 'Dz', 'Drx', 'Dry', 'Drz'};
+
+
+ +
+
save('../meas/micro-station-compliance/mat/model.mat', 'Gm');
 
@@ -603,7 +607,7 @@ For such a complex system, we believe that the Simscape Model represents the dyn

Author: Dehaeze Thomas

-

Created: 2020-04-17 ven. 09:35

+

Created: 2020-09-01 mar. 13:47

diff --git a/docs/noise_budgeting.html b/docs/noise_budgeting.html index 880d828..082d58a 100644 --- a/docs/noise_budgeting.html +++ b/docs/noise_budgeting.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Noise Budgeting @@ -159,10 +159,6 @@ Required maximum induced ASD of the sample’s vibration due to the relative

Corresponding RMS value in [nm rms, nrad rms]

-
-
1e9*sqrt(trapz(freqs, (abs(squeeze(freqresp(Gamma_x, freqs, 'Hz')))').^2))
-
-
@@ -211,11 +207,11 @@ Corresponding RMS value in [nm rms, nrad rms]

1.4 Computation of the maximum relative motion sensor noise

-Let’s note \(G\) the transfer function from the 6 sensor noise \(n\) to the 6dof pose error \(x\). +Let’s note \(G\) the transfer function from the 6 sensor noise \(n\) to the 5dof pose error \(x\). We have: \[ x_i = \sum_{j=1}^6 G_{ij}(s) n_j, \quad i = 1 \dots 5 \] In terms of ASD: -\[ \Gamma_{x_i}(\omega) = \sum_{j=1}^6 |G_{ij}(j\omega)|^2 \Gamma_{n_j}(\omega), \quad i = 1 \dots 5 \] +\[ \Gamma_{x_i}(\omega) = \sqrt{\sum_{j=1}^6 |G_{ij}(j\omega)|^2 \cdot {\Gamma_{n_j}}^2(\omega)}, \quad i = 1 \dots 5 \]

@@ -225,7 +221,7 @@ Let’s suppose that the ASD of all the sensor noise are equal:

We then have an upper bound of the sensor noise for each of the considered motion errors: -\[ \Gamma_{n_i, \text{max}}(\omega) = \frac{\Gamma_{n_i}(\omega)}{\sum_{j=1}^6 |G_{ij}(j\omega)|^2}, \quad i = 1 \dots 5 \] +\[ \Gamma_{n_i, \text{max}}(\omega) = \frac{\Gamma_{x_i}(\omega)}{\sqrt{\sum_{j=1}^6 |G_{ij}(j\omega)|^2}}, \quad i = 1 \dots 5 \]

@@ -289,7 +285,7 @@ The corresponding RMS value of the sensor noise taken as an example is [nm RMS]:

Verify that by taking the sensor noise, we have to wanted displacement error From the sensor noise PSD \(\Gamma_n(\omega)\), we can estimate the obtained displacement PSD \(\Gamma_x(\omega)\): -\[ \Gamma_{x,i}(\omega) = \sqrt{ \sum_{j=1}^{6} |G_{ij}|^2(j\omega) \Gamma_{n,j}^2(\omega) }, \quad i = 1 \dots 5 \] +\[ \Gamma_{x,i}(\omega) = \sqrt{ \sum_{j=1}^{6} |G_{ij}|^2(j\omega) \cdot \Gamma_{n,j}^2(\omega) }, \quad i = 1 \dots 5 \]

@@ -356,7 +352,7 @@ end

Author: Dehaeze Thomas

-

Created: 2020-07-31 ven. 17:58

+

Created: 2020-09-01 mar. 13:47

diff --git a/docs/simscape_subsystems.html b/docs/simscape_subsystems.html index e4507f6..f9bb5f5 100644 --- a/docs/simscape_subsystems.html +++ b/docs/simscape_subsystems.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Subsystems used for the Simscape Models @@ -28,173 +28,173 @@
-
-

Function description

-
+
+

Function description

+
function [] = initializeSimscapeConfiguration(args)
 
@@ -264,9 +264,9 @@ These functions are defined below.
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.gravity logical {mustBeNumericOrLogical} = true
@@ -276,9 +276,9 @@ end
 
-
-

Structure initialization

-
+
+

Structure initialization

+
conf_simscape = struct();
 
@@ -286,9 +286,9 @@ end
-
-

Add Type

-
+
+

Add Type

+
if args.gravity
   conf_simscape.type = 1;
@@ -300,9 +300,9 @@ end
 
-
-

Save the Structure

-
+
+

Save the Structure

+
save('./mat/conf_simscape.mat', 'conf_simscape');
 
@@ -319,9 +319,9 @@ end

-
-

Function description

-
+
+

Function description

+
function [] = initializeLoggingConfiguration(args)
 
@@ -329,9 +329,9 @@ end
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.log      char   {mustBeMember(args.log,{'none', 'all', 'forces'})} = 'none'
@@ -342,9 +342,9 @@ end
 
-
-

Structure initialization

-
+
+

Structure initialization

+
conf_log = struct();
 
@@ -352,9 +352,9 @@ end
-
-

Add Type

-
+
+

Add Type

+
switch args.log
   case 'none'
@@ -379,9 +379,9 @@ end
 
-
-

Save the Structure

-
+
+

Save the Structure

+
save('./mat/conf_log.mat', 'conf_log');
 
@@ -398,9 +398,9 @@ end

-
-

Simscape Model

-
+
+

Simscape Model

+

The model of the Ground is composed of:

@@ -425,9 +425,9 @@ The model of the Ground is composed of:
-
-

Function description

-
+
+

Function description

+
function [ground] = initializeGround(args)
 
@@ -435,9 +435,9 @@ The model of the Ground is composed of:
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.type char {mustBeMember(args.type,{'none', 'rigid'})} = 'rigid'
@@ -448,9 +448,9 @@ end
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the granite structure.

@@ -461,9 +461,9 @@ First, we initialize the granite structure.
-
-

Add Type

-
+
+

Add Type

+
switch args.type
   case 'none'
@@ -500,9 +500,9 @@ ground.density = 2800;        % [kg/m3]
 
-
-

Save the Structure

-
+
+

Save the Structure

+

The ground structure is saved.

@@ -522,9 +522,9 @@ The ground structure is saved.

-
-

Simscape Model

-
+
+

Simscape Model

+

The Simscape model of the granite is composed of:

@@ -553,9 +553,9 @@ The output sample_pos corresponds to the impact point of the X-ray.
-
-

Function description

-
+
+

Function description

+
function [granite] = initializeGranite(args)
 
@@ -563,9 +563,9 @@ The output sample_pos corresponds to the impact point of the X-ray.
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.type          char    {mustBeMember(args.type,{'rigid', 'flexible', 'none', 'modal-analysis', 'init'})} = 'flexible'
@@ -582,9 +582,9 @@ end
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the granite structure.

@@ -616,9 +616,9 @@ end
-
-

Material and Geometry

-
+
+

Material and Geometry

+

Properties of the Material and link to the geometry of the granite.

@@ -638,9 +638,9 @@ Z-offset for the initial position of the sample with respect to the granite top
-
-

Stiffness and Damping properties

-
+
+

Stiffness and Damping properties

+
granite.K = args.K; % [N/m]
 granite.C = args.C; % [N/(m/s)]
@@ -649,9 +649,9 @@ granite.C = args.C; % [N/(m/s)]
 
-
-

Equilibrium position of the each joint.

-
+
+

Equilibrium position of the each joint.

+
if args.Foffset && ~strcmp(args.type, 'none') && ~strcmp(args.type, 'rigid') && ~strcmp(args.type, 'init')
   load('mat/Foffset.mat', 'Fgm');
@@ -664,9 +664,9 @@ end
 
-
-

Save the Structure

-
+
+

Save the Structure

+

The granite structure is saved.

@@ -678,17 +678,17 @@ The granite structure is saved.
-
-

5 Translation Stage

+
+

5 Translation Stage

-
-

Simscape Model

-
+
+

Simscape Model

+

The Simscape model of the Translation stage consist of:

@@ -718,9 +718,9 @@ It is used to impose the motion in the Y direction
-
-

Function description

-
+
+

Function description

+
function [ty] = initializeTy(args)
 
@@ -728,9 +728,9 @@ It is used to impose the motion in the Y direction
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.type      char   {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'modal-analysis', 'init'})} = 'flexible'
@@ -741,9 +741,9 @@ end
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the ty structure.

@@ -775,9 +775,9 @@ end
-
-

Material and Geometry

-
+
+

Material and Geometry

+

Define the density of the materials as well as the geometry (STEP files).

@@ -822,9 +822,9 @@ ty.rotor.STEP = './STEPS/ty/Ty_Motor_Rotor.STEP';
-
-

Stiffness and Damping properties

-
+
+

Stiffness and Damping properties

+
ty.K = [2e8; 1e8; 2e8; 6e7; 9e7; 6e7]; % [N/m, N*m/rad]
 ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 2e4]; % [N/(m/s), N*m/(rad/s)]
@@ -833,9 +833,9 @@ ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 2e4]; % [N/(m/s), N*m/(rad/s)]
 
-
-

Equilibrium position of the each joint.

-
+
+

Equilibrium position of the each joint.

+
if args.Foffset && ~strcmp(args.type, 'none') && ~strcmp(args.type, 'rigid') && ~strcmp(args.type, 'init')
   load('mat/Foffset.mat', 'Ftym');
@@ -848,9 +848,9 @@ end
 
-
-

Save the Structure

-
+
+

Save the Structure

+

The ty structure is saved.

@@ -862,17 +862,17 @@ The ty structure is saved.
-
-

6 Tilt Stage

+
+

6 Tilt Stage

-
-

Simscape Model

-
+
+

Simscape Model

+

The Simscape model of the Tilt stage is composed of:

@@ -902,9 +902,9 @@ The Ry motion is imposed by the input.
-
-

Function description

-
+
+

Function description

+
function [ry] = initializeRy(args)
 
@@ -912,9 +912,9 @@ The Ry motion is imposed by the input.
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.type          char    {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'modal-analysis', 'init'})} = 'flexible'
@@ -926,9 +926,9 @@ end
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the ry structure.

@@ -961,9 +961,9 @@ end
-
-

Material and Geometry

-
+
+

Material and Geometry

+

Properties of the Material and link to the geometry of the Tilt stage.

@@ -1001,9 +1001,9 @@ Z-Offset so that the center of rotation matches the sample center;
-
-

Stiffness and Damping properties

-
+
+

Stiffness and Damping properties

+
ry.K = [3.8e8; 4e8; 3.8e8; 1.2e8; 6e4; 1.2e8];
 ry.C = [1e5;   1e5; 1e5;   3e4;   1e3; 3e4];
@@ -1012,9 +1012,9 @@ ry.C = [1e5;   1e5; 1e5;   3e4;   1e3; 3e4];
 
-
-

Equilibrium position of the each joint.

-
+
+

Equilibrium position of the each joint.

+
if args.Foffset && ~strcmp(args.type, 'none') && ~strcmp(args.type, 'rigid') && ~strcmp(args.type, 'init')
   load('mat/Foffset.mat', 'Fym');
@@ -1027,9 +1027,9 @@ end
 
-
-

Save the Structure

-
+
+

Save the Structure

+

The ry structure is saved.

@@ -1041,17 +1041,17 @@ The ry structure is saved.
-
-

7 Spindle

+
+

7 Spindle

-
-

Simscape Model

-
+
+

Simscape Model

+

The Simscape model of the Spindle is composed of:

@@ -1077,9 +1077,9 @@ The Simscape model of the Spindle is composed of:
-
-

Function description

-
+
+

Function description

+
function [rz] = initializeRz(args)
 
@@ -1087,9 +1087,9 @@ The Simscape model of the Spindle is composed of:
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.type    char    {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'modal-analysis', 'init'})} = 'flexible'
@@ -1100,9 +1100,9 @@ end
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the rz structure.

@@ -1134,9 +1134,9 @@ end
-
-

Material and Geometry

-
+
+

Material and Geometry

+

Properties of the Material and link to the geometry of the spindle.

@@ -1157,9 +1157,9 @@ rz.stator.STEP = './STEPS/rz/Spindle_Stator.STEP';
-
-

Stiffness and Damping properties

-
+
+

Stiffness and Damping properties

+
rz.K = [7e8; 7e8; 2e9; 1e7; 1e7; 1e7];
 rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4];
@@ -1168,9 +1168,9 @@ rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4];
 
-
-

Equilibrium position of the each joint.

-
+
+

Equilibrium position of the each joint.

+
if args.Foffset && ~strcmp(args.type, 'none') && ~strcmp(args.type, 'rigid') && ~strcmp(args.type, 'init')
   load('mat/Foffset.mat', 'Fzm');
@@ -1183,9 +1183,9 @@ end
 
-
-

Save the Structure

-
+
+

Save the Structure

+

The rz structure is saved.

@@ -1197,17 +1197,17 @@ The rz structure is saved.
-
-

8 Micro Hexapod

+
+

8 Micro Hexapod

-
-

Simscape Model

-
+
+

Simscape Model

+

simscape_model_micro_hexapod.png @@ -1224,9 +1224,9 @@ The rz structure is saved.

-
-

Function description

-
+
+

Function description

+
function [micro_hexapod] = initializeMicroHexapod(args)
 
@@ -1234,9 +1234,9 @@ The rz structure is saved.
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     args.type      char   {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'modal-analysis', 'init', 'compliance'})} = 'flexible'
@@ -1278,9 +1278,9 @@ end
 
-
-

Function content

-
+
+

Function content

+
stewart = initializeStewartPlatform();
 
@@ -1356,9 +1356,9 @@ end
 
-
-

Add Type

-
+
+

Add Type

+
switch args.type
   case 'none'
@@ -1379,9 +1379,9 @@ end
 
-
-

Save the Structure

-
+
+

Save the Structure

+

The micro_hexapod structure is saved.

@@ -1402,9 +1402,9 @@ save('./mat/stages.mat', 'micro_hexapod', '-append');

-
-

Simscape Model

-
+
+

Simscape Model

+

The Simscape model of the Center of gravity compensator is composed of:

@@ -1429,9 +1429,9 @@ The Simscape model of the Center of gravity compensator is composed of:
-
-

Function description

-
+
+

Function description

+
function [axisc] = initializeAxisc(args)
 
@@ -1439,9 +1439,9 @@ The Simscape model of the Center of gravity compensator is composed of:
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible'
@@ -1451,9 +1451,9 @@ end
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the axisc structure.

@@ -1464,9 +1464,9 @@ First, we initialize the axisc structure.
-
-

Add Type

-
+
+

Add Type

+
switch args.type
   case 'none'
@@ -1481,9 +1481,9 @@ end
 
-
-

Material and Geometry

-
+
+

Material and Geometry

+

Properties of the Material and link to the geometry files.

@@ -1508,9 +1508,9 @@ axisc.gear.STEP = './STEPS/axisc/axisc_gear.STEP';
-
-

Save the Structure

-
+
+

Save the Structure

+

The axisc structure is saved.

@@ -1530,9 +1530,9 @@ The axisc structure is saved.

-
-

Simscape Model

-
+
+

Simscape Model

+

The Simscape Model of the mirror is just a solid body. The output mirror_center corresponds to the center of the Sphere and is the point of measurement for the metrology @@ -1554,9 +1554,9 @@ The output mirror_center corresponds to the center of the Sphere an

-
-

Function description

-
+
+

Function description

+
function [] = initializeMirror(args)
 
@@ -1564,9 +1564,9 @@ The output mirror_center corresponds to the center of the Sphere an
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     args.type        char   {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'rigid'
@@ -1580,9 +1580,9 @@ end
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the mirror structure.

@@ -1621,9 +1621,9 @@ mirror.freq = args.freq;
-
-

Stiffness and Damping properties

-
+
+

Stiffness and Damping properties

+
mirror.K = zeros(6,1);
 mirror.K(1:3) = mirror.mass * (2*pi*mirror.freq(1:3)).^2;
@@ -1635,9 +1635,9 @@ mirror.C(1:3) = 0.2 * sqrt(mirror.K(1:3).*mirror.mass);
 
-
-

Equilibrium position of the each joint.

-
+
+

Equilibrium position of the each joint.

+
mirror.Deq = zeros(6,1);
 
@@ -1721,9 +1721,9 @@ Finally, we close the shape.
-
-

Save the Structure

-
+
+

Save the Structure

+

The mirror structure is saved.

@@ -1735,17 +1735,17 @@ The mirror structure is saved.
-
-

11 Nano Hexapod

+
+

11 Nano Hexapod

-
-

Simscape Model

-
+
+

Simscape Model

+

simscape_model_nano_hexapod.png @@ -1762,9 +1762,9 @@ The mirror structure is saved.

-
-

Function description

-
+
+

Function description

+
function [nano_hexapod] = initializeNanoHexapod(args)
 
@@ -1772,9 +1772,9 @@ The mirror structure is saved.
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     args.type      char   {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible'
@@ -1840,9 +1840,9 @@ end
 
-
-

Function content

-
+
+

Function content

+
stewart = initializeStewartPlatform();
 
@@ -1928,9 +1928,9 @@ end
 
-
-

Add Type

-
+
+

Add Type

+
switch args.type
   case 'none'
@@ -1947,9 +1947,9 @@ end
 
-
-

Save the Structure

-
+
+

Save the Structure

+
nano_hexapod = stewart;
 save('./mat/stages.mat', 'nano_hexapod', '-append');
@@ -1967,9 +1967,9 @@ save('./mat/stages.mat', 'nano_hexapod', '-append');
 

-
-

Simscape Model

-
+
+

Simscape Model

+

The Simscape model of the sample environment is composed of:

@@ -1997,9 +1997,9 @@ This could be the case for cable forces for instance.
-
-

Function description

-
+
+

Function description

+
function [sample] = initializeSample(args)
 
@@ -2007,9 +2007,9 @@ This could be the case for cable forces for instance.
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.type         char    {mustBeMember(args.type,{'rigid', 'flexible', 'none', 'init'})} = 'flexible'
@@ -2025,9 +2025,9 @@ end
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the sample structure.

@@ -2057,9 +2057,9 @@ end
-
-

Material and Geometry

-
+
+

Material and Geometry

+

We define the geometrical parameters of the sample as well as its mass and position.

@@ -2085,9 +2085,9 @@ sample.offset = args.offset; % [m]
-
-

Stiffness and Damping properties

-
+
+

Stiffness and Damping properties

+
sample.K = zeros(6, 1);
 sample.C = zeros(6, 1);
@@ -2114,9 +2114,9 @@ sample.C(4:6) = 0.1 * sqrt(sample.K(4:6).*sample.inertia); % [N/(m/s)]
 
-
-

Equilibrium position of the each joint.

-
+
+

Equilibrium position of the each joint.

+
if args.Foffset && ~strcmp(args.type, 'none') && ~strcmp(args.type, 'rigid') && ~strcmp(args.type, 'init')
   load('mat/Foffset.mat', 'Fsm');
@@ -2129,9 +2129,9 @@ end
 
-
-

Save the Structure

-
+
+

Save the Structure

+

The sample structure is saved.

@@ -2151,9 +2151,9 @@ The sample structure is saved.

-
-

Function Declaration and Documentation

-
+
+

Function Declaration and Documentation

+
function [] = initializeController(args)
 
@@ -2161,9 +2161,9 @@ The sample structure is saved.
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.type char {mustBeMember(args.type,{'open-loop', 'iff', 'dvf', 'hac-dvf', 'ref-track-L', 'ref-track-iff-L', 'cascade-hac-lac', 'hac-iff', 'stabilizing'})} = 'open-loop'
@@ -2173,9 +2173,9 @@ end
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the controller structure.

@@ -2224,9 +2224,9 @@ end
-
-

Save the Structure

-
+
+

Save the Structure

+

The controller structure is saved.

@@ -2246,9 +2246,9 @@ The controller structure is saved.

-
-

Function Declaration and Documentation

-
+
+

Function Declaration and Documentation

+
function [ref] = initializeReferences(args)
 
@@ -2256,9 +2256,9 @@ The controller structure is saved.
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     % Sampling Frequency [s]
@@ -2320,9 +2320,9 @@ H_lpf = 1/(1 + 2*xi/w0*s + s^2/w0^2);
 
-
-

Translation Stage

-
+
+

Translation Stage

+
%% Translation stage - Dy
 t = 0:Ts:Tmax; % Time Vector [s]
@@ -2359,9 +2359,9 @@ Dy = struct('time', t, 'signals', struct('values', Dy), 'deriv', Dyd, 'dderiv',
 
-
-

Tilt Stage

-
+
+

Tilt Stage

+
%% Tilt Stage - Ry
 t = 0:Ts:Tmax; % Time Vector [s]
@@ -2399,9 +2399,9 @@ Ry = struct('time', t, 'signals', struct('values', Ry), 'deriv', Ryd, 'dderiv',
 
-
-

Spindle

-
+
+

Spindle

+
%% Spindle - Rz
 t = 0:Ts:Tmax; % Time Vector [s]
@@ -2445,9 +2445,9 @@ Rz = struct('time', t, 'signals', struct('values', Rz), 'deriv', Rzd, 'dderiv',
 
-
-

Micro Hexapod

-
+
+

Micro Hexapod

+
%% Micro-Hexapod
 t = [0, Ts];
@@ -2503,9 +2503,9 @@ Rm = struct('time', t, 'signals', struct('values', Rm));
 
-
-

Nano Hexapod

-
+
+

Nano Hexapod

+
%% Nano-Hexapod
 t = [0, Ts];
@@ -2546,9 +2546,9 @@ Dnl = struct('time', t, 'signals', struct('values', Dnl));
 
-
-

Save

-
+
+

Save

+
    %% Save
     save('./mat/nass_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'Rm', 'Dn', 'Dnl', 'args', 'Ts');
@@ -2567,9 +2567,9 @@ end
 

-
-

Function Declaration and Documentation

-
+
+

Function Declaration and Documentation

+
function [] = initializeDisturbances(args)
 % initializeDisturbances - Initialize the disturbances
@@ -2584,9 +2584,9 @@ end
 
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     % Global parameter to enable or disable the disturbances
@@ -2793,9 +2793,9 @@ Frz_z  = Frz_z - Frz_z(1);
 
-
-

Save

-
+
+

Save

+
save('./mat/nass_disturbances.mat', 'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_z', 'Fd', 'Ts', 't', 'args');
 
@@ -2812,9 +2812,9 @@ Frz_z = Frz_z - Frz_z(1);

-
-

Function Declaration and Documentation

-
+
+

Function Declaration and Documentation

+
function [] = initializePosError(args)
 % initializePosError - Initialize the position errors
@@ -2829,9 +2829,9 @@ Frz_z  = Frz_z - Frz_z(1);
 
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     args.error    logical {mustBeNumericOrLogical} = false
@@ -2844,9 +2844,9 @@ end
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the pos_error structure.

@@ -2883,9 +2883,9 @@ pos_error.Rz = args.Rz;
-
-

Save

-
+
+

Save

+
save('./mat/pos_error.mat', 'pos_error');
 
@@ -2961,7 +2961,7 @@ end

Author: Dehaeze Thomas

-

Created: 2020-05-20 mer. 16:41

+

Created: 2020-07-31 ven. 17:58

diff --git a/docs/stewart_platform.html b/docs/stewart_platform.html index 0769046..65a8a51 100644 --- a/docs/stewart_platform.html +++ b/docs/stewart_platform.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Stewart Platform - Simscape Model @@ -36,86 +36,87 @@
-
-

Documentation

-
+
+

Documentation

+
- -
-

Function description

-
+
+

Function description

+
-
-

Documentation

-
+
+

Documentation

+
- -
-

Function description

-
+
+

Function description

+
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     stewart
@@ -413,9 +414,9 @@ FO_A = MO_B + FO_M; % Position of {A} with respect to {F} [m]
 
-
-

Populate the stewart structure

-
+
+

Populate the stewart structure

+
stewart.geometry.H      = H;
 stewart.geometry.FO_M   = FO_M;
@@ -439,9 +440,9 @@ This Matlab function is accessible 
-

Documentation

-
+ -
-

Function description

-
+
+

Function description

+
function [stewart] = generateGeneralConfiguration(stewart, args)
 % generateGeneralConfiguration - Generate a Very General Configuration
@@ -483,9 +484,9 @@ The radius of the circles can be chosen as well as the angles where the joints a
 
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     stewart
@@ -501,9 +502,9 @@ end
 
-
-

Compute the pose

-
+
+

Compute the pose

+
Fa = zeros(3,6);
 Mb = zeros(3,6);
@@ -520,9 +521,9 @@ end
 
-
-

Populate the stewart structure

-
+
+

Populate the stewart structure

+
stewart.platform_F.Fa = Fa;
 stewart.platform_M.Mb = Mb;
@@ -544,9 +545,9 @@ This Matlab function is accessible here
 

-
-

Documentation

-
+
+

Documentation

+

stewart-struts.png @@ -556,9 +557,9 @@ This Matlab function is accessible here

-
-

Function description

-
+
+

Function description

+
-
-

Check the stewart structure elements

-
+
+

Check the stewart structure elements

+
assert(isfield(stewart.platform_F, 'Fa'),   'stewart.platform_F should have attribute Fa')
 Fa = stewart.platform_F.Fa;
@@ -664,9 +665,9 @@ end
 
-
-

Populate the stewart structure

-
+
+

Populate the stewart structure

+
-
-

Function description

-
+
+

Function description

+
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     stewart
@@ -749,9 +750,9 @@ end
 
-
-

Populate the stewart structure

-
+
+

Populate the stewart structure

+
stewart.actuators.Leq = dLi;
 
@@ -772,9 +773,9 @@ This Matlab function is accessible -

Function description

-
+
+

Function description

+
function [stewart] = initializeCylindricalPlatforms(stewart, args)
 % initializeCylindricalPlatforms - Initialize the geometry of the Fixed and Mobile Platforms
@@ -808,9 +809,9 @@ This Matlab function is accessible 
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     stewart
@@ -845,9 +846,9 @@ end
 
-
-

Populate the stewart structure

-
+
+

Populate the stewart structure

+
stewart.platform_F.type = 1;
 
@@ -883,9 +884,9 @@ This Matlab function is accessible 
-

Function description

-
+
+

Function description

+
function [stewart] = initializeCylindricalStruts(stewart, args)
 % initializeCylindricalStruts - Define the mass and moment of inertia of cylindrical struts
@@ -918,9 +919,9 @@ This Matlab function is accessible 
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     stewart
@@ -968,9 +969,9 @@ end
 
-
-

Populate the stewart structure

-
+
+

Populate the stewart structure

+
-
-

Documentation

-
+
+

Documentation

+

piezoelectric_stack.jpg @@ -1037,9 +1038,9 @@ A simplistic model of such amplified actuator is shown in Figure -

Function description

-
+
+

Function description

+
function [stewart] = initializeStrutDynamics(stewart, args)
 % initializeStrutDynamics - Add Stiffness and Damping properties of each strut
@@ -1061,9 +1062,9 @@ A simplistic model of such amplified actuator is shown in Figure 
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     stewart
@@ -1126,9 +1127,9 @@ This Matlab function is accessible 
-

Documentation

-
+
+

Documentation

+

An amplified piezoelectric actuator is shown in Figure 7.

@@ -1161,9 +1162,9 @@ A simplistic model of such amplified actuator is shown in Figure -

Function description

-
+
+

Function description

+
function [stewart] = initializeAmplifiedStrutDynamics(stewart, args)
 % initializeAmplifiedStrutDynamics - Add Stiffness and Damping properties of each strut
@@ -1191,9 +1192,9 @@ A simplistic model of such amplified actuator is shown in Figure 
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     stewart
@@ -1218,9 +1219,9 @@ C = args.Ca + args.Cr;
 
-
-

Populate the stewart structure

-
+
+

Populate the stewart structure

+
-
-

Function description

-
+
+

Function description

+
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     stewart
@@ -1327,9 +1328,9 @@ end
   case 'spherical'
     stewart.joints_F.type = 2;
   case 'universal_p'
-    stewart.joints_F.type = 3;
+    stewart.joints_F.type = 1;
   case 'spherical_p'
-    stewart.joints_F.type = 4;
+    stewart.joints_F.type = 2;
   case 'universal_3dof'
     stewart.joints_F.type = 5;
 end
@@ -1340,9 +1341,9 @@ switch args.type_M
   case 'spherical'
     stewart.joints_M.type = 2;
   case 'universal_p'
-    stewart.joints_M.type = 3;
+    stewart.joints_M.type = 1;
   case 'spherical_p'
-    stewart.joints_M.type = 4;
+    stewart.joints_M.type = 2;
   case 'spherical_3dof'
     stewart.joints_M.type = 6;
 end
@@ -1351,6 +1352,38 @@ end
 
+
+

10.1 Initialize Stiffness

+
+
+
stewart.joints_M.Kx = zeros(6,1);
+stewart.joints_M.Ky = zeros(6,1);
+stewart.joints_M.Kz = zeros(6,1);
+stewart.joints_F.Kx = zeros(6,1);
+stewart.joints_F.Ky = zeros(6,1);
+stewart.joints_F.Kz = zeros(6,1);
+
+stewart.joints_M.Kf = zeros(6,1);
+stewart.joints_M.Kt = zeros(6,1);
+stewart.joints_F.Kf = zeros(6,1);
+stewart.joints_F.Kt = zeros(6,1);
+
+stewart.joints_M.Cx = zeros(6,1);
+stewart.joints_M.Cy = zeros(6,1);
+stewart.joints_M.Cz = zeros(6,1);
+stewart.joints_F.Cx = zeros(6,1);
+stewart.joints_F.Cy = zeros(6,1);
+stewart.joints_F.Cz = zeros(6,1);
+
+stewart.joints_M.Cf = zeros(6,1);
+stewart.joints_M.Ct = zeros(6,1);
+stewart.joints_F.Cf = zeros(6,1);
+stewart.joints_F.Ct = zeros(6,1);
+
+
+
+
+

Add Stiffness and Damping in Translation of each strut

@@ -1358,27 +1391,15 @@ end Translation Stiffness

-
stewart.joints_M.Kx = zeros(6,1);
-stewart.joints_M.Ky = zeros(6,1);
-stewart.joints_M.Kz = args.Kz_M;
+
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p')
+    stewart.joints_M.Kz = args.Kz_M;
+    stewart.joints_M.Cz = args.Cz_M;
+end
 
-stewart.joints_F.Kx = zeros(6,1);
-stewart.joints_F.Ky = zeros(6,1);
-stewart.joints_F.Kz = args.Kz_F;
-
-
- -

-Translation Damping -

-
-
stewart.joints_M.Cx = zeros(6,1);
-stewart.joints_M.Cy = zeros(6,1);
-stewart.joints_M.Cz = args.Cz_M;
-
-stewart.joints_F.Cx = zeros(6,1);
-stewart.joints_F.Cy = zeros(6,1);
-stewart.joints_F.Cz = args.Cz_F;
+if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p')
+    stewart.joints_F.Kz = args.Kz_F;
+    stewart.joints_F.Cz = args.Cz_F;
+end
 
@@ -1391,24 +1412,21 @@ stewart.joints_F.Cz = args.Cz_F; Rotational Stiffness

-
stewart.joints_M.Kf = args.Kf_M;
-stewart.joints_M.Kt = args.Kf_M;
+
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p')
+    stewart.joints_M.Kf = args.Kf_M;
+    stewart.joints_M.Cf = args.Cf_M;
 
-stewart.joints_F.Kf = args.Kf_F;
-stewart.joints_F.Kt = args.Kf_F;
-
-
+ stewart.joints_M.Kt = args.Kt_M; + stewart.joints_M.Ct = args.Ct_M; +end +if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p') + stewart.joints_F.Kf = args.Kf_F; + stewart.joints_F.Cf = args.Cf_F; -

-Rotational Damping -

-
-
stewart.joints_M.Cf = args.Cf_M;
-stewart.joints_M.Ct = args.Cf_M;
-
-stewart.joints_F.Cf = args.Cf_F;
-stewart.joints_F.Ct = args.Cf_F;
+    stewart.joints_F.Kt = args.Kt_F;
+    stewart.joints_F.Ct = args.Ct_F;
+end
 
@@ -1501,9 +1519,9 @@ Note that there is trade-off between:
-
-

Function description

-
+
+

Function description

+
function [stewart] = initializeInertialSensor(stewart, args)
 % initializeInertialSensor - Initialize the inertial sensor in each strut
@@ -1529,9 +1547,9 @@ Note that there is trade-off between:
 
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     stewart
@@ -1572,9 +1590,9 @@ end
 
-
-

Populate the stewart structure

-
+
+

Populate the stewart structure

+
stewart.sensors.inertial = sensor;
 
@@ -1595,9 +1613,9 @@ This Matlab function is accessible here
-
-

Function description

-
+
+

Function description

+
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     stewart
@@ -1649,9 +1667,9 @@ end
 
-
-

Check the stewart structure elements

-
+
+

Check the stewart structure elements

+
-
-

Function description

-
+
+

Function description

+
-
-

Optional Parameters

-
+
+

Optional Parameters

+
-
-

Function description

-
+
+

Function description

+
-
-

Documentation

-
+
+

Documentation

+
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     stewart
@@ -2213,9 +2231,9 @@ end
 
-
-

Check the stewart structure elements

-
+
+

Check the stewart structure elements

+
assert(isfield(stewart.geometry, 'H'),   'stewart.geometry should have attribute H')
 H = stewart.geometry.H;
@@ -2250,9 +2268,9 @@ CCm = [Cc(:,2), Cc(:,2), Cc(:,4), Cc(:,4), Cc(:,6), Cc(:,6)]; % CCm(:,i) corresp
 
-
-

Compute the pose

-
+
+

Compute the pose

+

We can compute the vector of each leg \({}^{C}\hat{\bm{s}}_{i}\) (unit vector from \({}^{C}C_{f}\) to \({}^{C}C_{m}\)).

@@ -2272,9 +2290,9 @@ Mb = CCf + [0; 0; args.FOc-H] + ((H-args.MHb-(args.FOc-args.Hc/2))./CSi(3,:)).*C
-
-

Populate the stewart structure

-
+
+

Populate the stewart structure

+
stewart.platform_F.Fa = Fa;
 stewart.platform_M.Mb = Mb;
@@ -2296,9 +2314,9 @@ This Matlab function is accessible here.
 

-
-

Function description

-
+
+

Function description

+
-
-

Check the stewart structure elements

-
+
+

Check the stewart structure elements

+
assert(isfield(stewart.geometry, 'As'),   'stewart.geometry should have attribute As')
 As = stewart.geometry.As;
@@ -2369,9 +2387,9 @@ Ki = stewart.actuators.K;
 
-
-

Populate the stewart structure

-
+
+

Populate the stewart structure

+
stewart.kinematics.J = J;
 stewart.kinematics.K = K;
@@ -2431,9 +2449,9 @@ Otherwise, when the limbs’ lengths derived yield complex numbers, then the
 
-
-

Function description

-
+
+

Function description

+
function [Li, dLi] = inverseKinematics(stewart, args)
 % inverseKinematics - Compute the needed length of each strut to have the wanted position and orientation of {B} with respect to {A}
@@ -2457,9 +2475,9 @@ Otherwise, when the limbs’ lengths derived yield complex numbers, then the
 
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     stewart
@@ -2471,9 +2489,9 @@ end
 
-
-

Check the stewart structure elements

-
+
+

Check the stewart structure elements

+
assert(isfield(stewart.geometry, 'Aa'),   'stewart.geometry should have attribute Aa')
 Aa = stewart.geometry.Aa;
@@ -2517,9 +2535,9 @@ This Matlab function is accessible he
 

-
-

Function description

-
+
+

Function description

+
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     stewart
@@ -2554,9 +2572,9 @@ end
 
-
-

Check the stewart structure elements

-
+
+

Check the stewart structure elements

+
assert(isfield(stewart.kinematics, 'J'),   'stewart.kinematics should have attribute J')
 J = stewart.kinematics.J;
@@ -2611,7 +2629,7 @@ We then compute the corresponding rotation matrix.
 

Author: Dehaeze Thomas

-

Created: 2020-05-20 mer. 16:41

+

Created: 2020-09-01 mar. 13:48

diff --git a/mat/Gd_ol.mat b/mat/Gd_ol.mat new file mode 100644 index 0000000..cbd7ddf Binary files /dev/null and b/mat/Gd_ol.mat differ diff --git a/mat/conf_log.mat b/mat/conf_log.mat index c363b43..cd9f9c7 100644 Binary files a/mat/conf_log.mat and b/mat/conf_log.mat differ diff --git a/mat/conf_simscape.mat b/mat/conf_simscape.mat index 3b799ea..6d79f55 100644 Binary files a/mat/conf_simscape.mat and b/mat/conf_simscape.mat differ diff --git a/mat/controller.mat b/mat/controller.mat index f86a001..4f0d599 100644 Binary files a/mat/controller.mat and b/mat/controller.mat differ diff --git a/mat/nass_disturbances.mat b/mat/nass_disturbances.mat index 2839c59..465e5f2 100644 Binary files a/mat/nass_disturbances.mat and b/mat/nass_disturbances.mat differ diff --git a/mat/nass_references.mat b/mat/nass_references.mat index da1da93..0dc6799 100644 Binary files a/mat/nass_references.mat and b/mat/nass_references.mat differ diff --git a/mat/stages.mat b/mat/stages.mat index afb7af0..c4bb0de 100644 Binary files a/mat/stages.mat and b/mat/stages.mat differ diff --git a/mat/tomo_exp_hac_dvf_ampl.mat b/mat/tomo_exp_hac_dvf_ampl.mat new file mode 100644 index 0000000..7875d39 Binary files /dev/null and b/mat/tomo_exp_hac_dvf_ampl.mat differ diff --git a/mat/tomo_exp_hac_iff_opt_stiff.mat b/mat/tomo_exp_hac_iff_opt_stiff.mat new file mode 100644 index 0000000..1650a66 Binary files /dev/null and b/mat/tomo_exp_hac_iff_opt_stiff.mat differ