diff --git a/docs/control_requirements.html b/docs/control_requirements.html index 6b0f946..40f906b 100644 --- a/docs/control_requirements.html +++ b/docs/control_requirements.html @@ -1,11 +1,10 @@ - - + Control Requirements @@ -248,52 +247,57 @@

Table of Contents

-
-

1 Goal

-

The goal here is to write clear specifications for the NASS.

@@ -305,16 +309,14 @@ This can then be used for the control synthesis and for the design of the nano-h

Ideal, specifications on the norm of closed loop transfer function should be written.

-
-
-

2 Simplify Model for the Nano-Hexapod

-
+

1 Simplify Model for the Nano-Hexapod

+
-

2.1 Model of the nano-hexapod

-
+

1.1 Model of the nano-hexapod

+

Let’s consider the simple mechanical system in Figure 1.

@@ -445,8 +447,8 @@ The nano-hexapod can thus be represented as in Figure 2
-

2.2 How to include Ground Motion in the model?

-
+

1.2 How to include Ground Motion in the model?

+

What we measure is not the absolute motion \(x\), but the relative motion \(x - w\) where \(w\) is the motion of the granite.

@@ -454,19 +456,12 @@ What we measure is not the absolute motion \(x\), but the relative motion \(x -

Also, \(w\) induces some motion \(x_\mu\) through the transmissibility of the micro-station.

- - -
-

nano_station_inputs_outputs_ground_motion.png -

-
-
-
-

3 Motion of the micro-station

-
+
+

1.3 Motion of the micro-station

+

As explained, we consider \(x_\mu\) as an external input (\(F\) has no influence on \(x_\mu\)).

@@ -503,14 +498,14 @@ Also, here, we suppose that the granite is not moving.

-If we now include the motion of the granite \(w\), we obtain the block diagram shown in Figure 4. +If we now include the motion of the granite \(w\), we obtain the block diagram shown in Figure 3.

nano_station_ground_motion.png

-

Figure 4: Ground Motion \(w\) included

+

Figure 3: Ground Motion \(w\) included

@@ -520,14 +515,15 @@ We can approximate this transfer function by a second order low pass filter:

+
-
-

4 Values and Plant

-
+
+

2 Control with the Stiff Nano-Hexapod

+
-

4.1 Definition of the values

-
+

2.1 Definition of the values

+

Let’s define the mass and stiffness of the nano-hexapod.

@@ -585,31 +581,30 @@ Gpz = connect(Gn, S, Wsplit, Tw, Tmu, Sw, {'Fd',
-
-
-

5 Control using \(d\)

-
+
+

2.2 Control using \(d\)

+
-
-

5.1 Control Architecture

-
+
+

2.2.1 Control Architecture

+

-Let’s consider a feedback loop using \(d\) as shown in Figure 5. +Let’s consider a feedback loop using \(d\) as shown in Figure 4.

nano_station_control_d.png

-

Figure 5: Feedback diagram using \(d\)

+

Figure 4: Feedback diagram using \(d\)

-
-

5.2 Analytical Analysis

-
+
+

2.2.2 Analytical Analysis

+

Let’s apply a direct velocity feedback by deriving \(d\): \[ F = F^\prime - g s d \] @@ -671,29 +666,29 @@ And \(\epsilon = r - x\):

-
-

6 Control using \(F_m\)

-
+
+

2.3 Control using \(F_m\)

+
-
-

6.1 Control Architecture

-
+
+

2.3.1 Control Architecture

+

-Let’s consider a feedback loop using \(d\) as shown in Figure 5. +Let’s consider a feedback loop using \(Fm\) as shown in Figure 5.

nano_station_control_Fm.png

-

Figure 6: Feedback diagram using \(F_m\)

+

Figure 5: Feedback diagram using \(F_m\)

-
-

6.2 Pure Integrator

-
+
+

2.3.2 Pure Integrator

+

Let’s apply integral force feedback by integration \(F_m\): \[ F = F^\prime - \frac{g}{s} F_m \] @@ -735,9 +730,9 @@ And \(\epsilon = r - x\):

-
-

6.3 Low pass filter

-
+
+

2.3.3 Low pass filter

+

Instead of a pure integrator, let’s use a low pass filter with a cut-off frequency above the bandwidth of the micro-station \(\omega_mu\)

@@ -753,14 +748,14 @@ Instead of a pure integrator, let’s use a low pass filter with a cut-off f
-
-

7 Comparison

-
+
+

2.4 Comparison

+

comp_iff_dvf_simplified.png

-

Figure 7: Obtained transfer functions for DVF and IFF (png, pdf)

+

Figure 6: Obtained transfer functions for DVF and IFF (png, pdf)

@@ -802,22 +797,22 @@ Instead of a pure integrator, let’s use a low pass filter with a cut-off f -
-

8 Control using \(x\)

-
+
+

2.5 Control using \(x\)

+
-
-

8.1 Analytical analysis

-
+
+

2.5.1 Analytical analysis

+

-Let’s first consider that only the output \(x\) is used for feedback (Figure 8) +Let’s first consider that only the output \(x\) is used for feedback (Figure 7)

nano_station_control_x.png

-

Figure 8: Feedback diagram using \(x\)

+

Figure 7: Feedback diagram using \(x\)

@@ -904,9 +899,9 @@ Some implications on the design are summarized on table 2<

-
-

8.2 Control implementation

-
+
+

2.5.2 Control implementation

+

Controller for the damped plant using DVF.

@@ -927,8 +922,7 @@ K = Hi*H*(1/abs(freqresp(K*Gpz_dvf('y', 'F'), wb)); Kpz_dvf.InputName = {'e'}; -Kpz_dvf.OutputName = {'F'}; - +Kpz_dvf.OutputName = {'Fi'};
@@ -952,7 +946,7 @@ K = Hi*H*(1/abs(freqresp(K*Gpz_iff('y', 'F'), wb)); Kpz_iff.InputName = {'e'}; -Kpz_iff.OutputName = {'F'}; +Kpz_iff.OutputName = {'Fi'};
@@ -963,12 +957,12 @@ Loop gain

simple_loop_gain_pz.png

-

Figure 9: Loop Gain (png, pdf)

+

Figure 8: Loop Gain (png, pdf)

-Let’s connect all the systems as shown in Figure 8. +Let’s connect all the systems as shown in Figure 7.

Sfb = sumblk('e = r2 - y');
@@ -977,71 +971,71 @@ R = [tf(1); tf(1)];
 R.InputName = {'r'};
 R.OutputName = {'r1', 'r2'};
 
-Gpz_fb_dvf = connect(Gpz_dvf, Kpz_dvf, R, Sfb, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd'});
-Gpz_fb_iff = connect(Gpz_iff, Kpz_iff, R, Sfb, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd'});
+F = [tf(1); tf(1)];
+F.InputName = {'Fi'};
+F.OutputName = {'F', 'Fu'};
+
+Gpz_fb_dvf = connect(Gpz_dvf, Kpz_dvf, R, Sfb, F, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd', 'Fu'});
+Gpz_fb_iff = connect(Gpz_iff, Kpz_iff, R, Sfb, F, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd', 'Fu'});
 
-
-

8.3 Results

-
+
+

2.5.3 Results

+

simple_hac_lac_results.png

-

Figure 10: Obtained closed-loop transfer functions (png, pdf)

+

Figure 9: Obtained closed-loop transfer functions (png, pdf)

+
+ +
+ + +++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + +
 Reference TrackingVibration FilteringCompliance
DVFSimilar behavior Better for \(\omega < \omega_\nu\)
IFFSimilar behaviorBetter for \(\omega > \omega_\nu\) 
-
-

9 Two degree of freedom control

-
-

-Let’s try to implement the control architecture shown in Figure 11. -

- -

-The pre-filter \(K_r\) is added in order to improve the reference tracking performances. -

- - -
-

nano_station_control_2dof_x.png -

-

Figure 11: Two degrees of freedom feedback control

-
- -

-In order to design the pre-filter \(K_r\), the dynamics of the system should be known quite precisely (Dynamics of the nano-hexapod + \(T_\mu\)). -

-
-
Krpz = inv(Gpz_fb('y', 'r'));
-
-Krpz.InputName = {'r2'};
-Krpz.OutputName = {'r3'};
-
-
- -
-
Sfb = sumblk('e = r3 - y');
-
-R = [tf(1); tf(1)];
-R.InputName = {'r'};
-R.OutputName = {'r1', 'r2'};
-
-Gpz_2dof = connect(Gpz_dvf, Krpz, Kpz, R, Sfb, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd'});
-
-
-
-
- -
-

10 Soft nano-hexapod

-
+
+

3 Comparison with the use of a Soft nano-hexapod

+
m = 50; % [kg]
 k = 1e3; % [N/m]
@@ -1110,11 +1104,11 @@ H = 1/h*(1 /abs(freqresp(H*Gvc_dvf('y', 'F'), wb));
 Kvc_dvf.InputName = {'e'};
-Kvc_dvf.OutputName = {'F'};
+Kvc_dvf.OutputName = {'Fi'};
 
 Kvc_iff = H/abs(freqresp(H*Gvc_iff('y', 'F'), wb));
 Kvc_iff.InputName = {'e'};
-Kvc_iff.OutputName = {'F'};
+Kvc_iff.OutputName = {'Fi'};
 
@@ -1125,8 +1119,13 @@ R = [tf(1); tf(1)]; R.InputName = {'r'}; R.OutputName = {'r1', 'r2'}; -Gvc_fb_dvf = connect(Gvc_dvf, Kvc_dvf, R, Sfb, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd'}); -Gvc_fb_iff = connect(Gvc_iff, Kvc_iff, R, Sfb, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd'}); +F = [tf(1); tf(1)]; +F.InputName = {'Fi'}; +F.OutputName = {'F', 'Fu'}; + + +Gvc_fb_dvf = connect(Gvc_dvf, Kvc_dvf, R, Sfb, F, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd', 'Fu'}); +Gvc_fb_iff = connect(Gvc_iff, Kvc_iff, R, Sfb, F, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd', 'Fu'});
@@ -1134,19 +1133,51 @@ Gvc_fb_iff = connect(Gvc_iff, Kvc_iff, R, Sfb, {'r'

simple_hac_lac_results_soft.png

-

Figure 12: Obtained closed-loop transfer functions (png, pdf)

-
-
+

Figure 10: Obtained closed-loop transfer functions (png, pdf)

-
-

11 Compare Soft and Stiff nano-hexapods

-
+ + + +++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + +
 Reference TrackingVibration FilteringCompliance
DVFSimilar behavior Better for \(\omega < \omega_\nu\)
IFFSimilar behaviorBetter for \(\omega > \omega_\nu\) 
+

simple_comp_vc_pz.png

-

Figure 13: Comparison of the closed-loop transfer functions for Soft and Stiff nano-hexapod (png, pdf)

+

Figure 11: Comparison of the closed-loop transfer functions for Soft and Stiff nano-hexapod (png, pdf)

@@ -1173,6 +1204,12 @@ Gvc_fb_iff = connect(Gvc_iff, Kvc_iff, R, Sfb, {'r'= + + + + + + @@ -1190,8 +1227,8 @@ Gvc_fb_iff = connect(Gvc_iff, Kvc_iff, R, Sfb, {'r'
-

12 Estimate the level of vibration

-
+

4 Estimate the level of vibration

+
gm  = load('./mat/psd_gm.mat', 'f', 'psd_gm');
 rz  = load('./mat/pxsp_r.mat', 'f', 'pxsp_r');
@@ -1199,17 +1236,240 @@ tyz = load('./mat/pxz_ty_r.mat', 
-
x_pz = sqrt(abs(squeeze(freqresp(Gpz_fb_iff('y', 'dmu'), f, 'Hz'))).^2.*(psd_rz + psd_ty) + abs(squeeze(freqresp(Gpz_fb_iff('y', 'w'), f, 'Hz'))).^2.*(psd_gm));
-x_vc = sqrt(abs(squeeze(freqresp(Gvc_fb_iff('y', 'dmu'), f, 'Hz'))).^2.*(psd_rz + psd_ty) + abs(squeeze(freqresp(Gvc_fb_iff('y', 'w'), f, 'Hz'))).^2.*(psd_gm));
+
x_pz = abs(squeeze(freqresp(Gpz_fb_iff('y', 'dmu'), f, 'Hz'))).^2.*(psd_rz + psd_ty) + abs(squeeze(freqresp(Gpz_fb_iff('y', 'w'), f, 'Hz'))).^2.*(psd_gm);
+x_vc = abs(squeeze(freqresp(Gvc_fb_iff('y', 'dmu'), f, 'Hz'))).^2.*(psd_rz + psd_ty) + abs(squeeze(freqresp(Gvc_fb_iff('y', 'w'), f, 'Hz'))).^2.*(psd_gm);
+
+
+ + +
+

simple_asd_motion_error.png +

+

Figure 12: ASD of the position error due to Ground Motion and Vibration (png, pdf)

+
+ +

+Actuator usage +

+
+
F_pz = abs(squeeze(freqresp(Gpz_fb_iff('Fu', 'dmu'), f, 'Hz'))).^2.*(psd_rz + psd_ty) + abs(squeeze(freqresp(Gpz_fb_iff('Fu', 'w'), f, 'Hz'))).^2.*(psd_gm);
+F_vc = abs(squeeze(freqresp(Gvc_fb_iff('Fu', 'dmu'), f, 'Hz'))).^2.*(psd_rz + psd_ty) + abs(squeeze(freqresp(Gvc_fb_iff('Fu', 'w'), f, 'Hz'))).^2.*(psd_gm);
+
+
+ +
+
sqrt(trapz(f, F_pz))
+sqrt(trapz(f, F_vc))
+
+
+ +
+sqrt(trapz(f, F_pz))
+ans =
+          84.8961762069446
+sqrt(trapz(f, F_vc))
+ans =
+        0.0387785981815527
+
+
+
+ +
+

5 Requirements on the norm of closed-loop transfer functions

+
+
+
+

5.1 Approximation of the ASD of perturbations

+
+
+
G_rz = 1e-9*1/(1 + s/2/pi/0.5)^2*(s + 2*pi*1)*(s + 2*pi*10)*(1/((1 + s/2/pi/100)^2));
+
+
+ +
+
G_gm = 1e-8*1/s^2*(s + 2*pi*1)^2*(1/((1 + s/2/pi/10)^3));
 
-
-

13 Requirements on the norm of closed-loop transfer functions

-
+
+

5.2 Wanted ASD of outputs

+
+

+Wanted ASD of motion error +

+
+
y_wanted = 100e-9; % 10nm rms wanted
+y_bw = 2*pi*100; % bandwidth [rad/s]
+
+G_y = 2*y_wanted/sqrt(y_bw) * (1 + s/y_bw/10) / (1 + s/y_bw);
+
+
+ +
+
sqrt(trapz(f, abs(squeeze(freqresp(G_y, f, 'Hz'))).^2))
+
+
+ +
+sqrt(trapz(f, abs(squeeze(freqresp(G_y, f, 'Hz'))).^2))
+ans =
+      9.47118350214793e-08
+
+
+
+ +
+

5.3 Limiting the bandwidth

+
+
+
wF = 2*pi*10;
+G_F = 100000*(wF + s)^2;
+
+
+
+
+ +
+

5.4 Generalized Weighted plant

+
+

+Let’s create a generalized weighted plant for controller synthesis. +

+ +

+Let’s start simple: +

+
Ground Motion==
Vibration Isolation +
+ + +++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 SymbolMeaning
Exogenous Inputs\(x_\mu\)Motion of the $ν$-hexapod’s base
Exogenous Outputs\(y\)Motion error of the Payload
Sensed Outputs\(y\)Motion error of the Payload
Control Signals\(F\)Actuator Inputs
+ +

+Add \(F\) as output. +

+
+
F = [tf(1); tf(1)];
+F.InputName = {'Fi'};
+F.OutputName = {'F', 'Fu'};
+
+P_pz = connect(F, Gpz_dvf, {'dmu', 'Fi'}, {'y', 'Fu', 'y'})
+P_vc = connect(F, Gvc_dvf, {'dmu', 'Fi'}, {'y', 'Fu', 'y'})
+
+
+ +

+Normalization. +

+ +

+We multiply the plant input by \(G_{rz}\) and the plant output by \(G_y^{-1}\): +

+
+
P_pz_norm = blkdiag(inv(G_y), inv(G_F), 1)*P_pz*blkdiag(G_rz, 1);
+P_pz_norm.OutputName = {'z', 'F', 'y'};
+P_pz_norm.InputName  = {'w', 'u'};
+
+P_vc_norm = blkdiag(inv(G_y), inv(G_F), 1)*P_vc*blkdiag(G_rz, 1);
+P_vc_norm.OutputName = {'z', 'F', 'y'};
+P_vc_norm.InputName  = {'w', 'u'};
+
+
+
+
+ +
+

5.5 Synthesis

+
+
+
[Kpz_dvf,CL_vc,~] = hinfsyn(minreal(P_pz_norm), 1, 1, 'TOLGAM', 0.001, 'METHOD', 'LMI', 'DISPLAY', 'on');
+Kpz_dvf.InputName = {'e'};
+Kpz_dvf.OutputName = {'Fi'};
+
+[Kvc_dvf,CL_pz,~] = hinfsyn(minreal(P_vc_norm), 1, 1, 'TOLGAM', 0.001, 'METHOD', 'LMI', 'DISPLAY', 'on');
+Kvc_dvf.InputName = {'e'};
+Kvc_dvf.OutputName = {'Fi'};
+
+
+
+
+ +
+

5.6 Loop Gain

+
+
+
Sfb = sumblk('e = r2 - y');
+
+R = [tf(1); tf(1)];
+R.InputName = {'r'};
+R.OutputName = {'r1', 'r2'};
+
+F = [tf(1); tf(1)];
+F.InputName = {'Fi'};
+F.OutputName = {'F', 'Fu'};
+
+Gpz_fb_dvf = connect(Gpz_dvf, -Kpz_dvf, R, Sfb, F, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd', 'Fu'});
+Gvc_fb_dvf = connect(Gvc_dvf, -Kvc_dvf, R, Sfb, F, {'r', 'dmu', 'Fd', 'w'}, {'y', 'e', 'Fm', 'd', 'Fu'});
+
+
+
+
+ +
+

5.7 Results

+
+
+

5.8 Requirements

+
@@ -1243,9 +1503,10 @@ x_vc = sqrt(abs(squeeze(freqresp(Gvc_fb_iff('y', +

Author: Dehaeze Thomas

-

Created: 2020-03-06 ven. 15:10

+

Created: 2020-03-17 mar. 11:22

diff --git a/docs/hac_lac.html b/docs/hac_lac.html index 4b3c363..828f83d 100644 --- a/docs/hac_lac.html +++ b/docs/hac_lac.html @@ -4,7 +4,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - +HAC-LAC applied on the Simscape Model @@ -277,9 +277,10 @@ It is then compare to the wanted position of the Sample \(\bm{r}_\mathcal{X}\) i

-
+

hac_lac_control_schematic.png

+

Figure 1: HAC-LAC Control Architecture used for the Control of the NASS

@@ -519,6 +520,16 @@ And we simulate the system.

5 Results

+

+Let’s load the simulation when no control is applied. +

+
+
load('./mat/experiment_tomography.mat', 'tomo_align_dist');
+t = tomo_align_dist.t;
+MTr = tomo_align_dist.MTr;
+
+
+
load('./mat/tomo_exp_hac_lac.mat', 'simout');
 
@@ -528,7 +539,7 @@ And we simulate the system.

Author: Dehaeze Thomas

-

Created: 2020-03-13 ven. 17:39

+

Created: 2020-03-17 mar. 11:21

diff --git a/docs/simscape_subsystems.html b/docs/simscape_subsystems.html index b259b53..26bca0d 100644 --- a/docs/simscape_subsystems.html +++ b/docs/simscape_subsystems.html @@ -4,7 +4,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Subsystems used for the Simscape Models @@ -239,170 +239,170 @@
-
-

Function description

-
+
+

Function description

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

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.gravity logical {mustBeNumericOrLogical} = true
@@ -484,9 +484,9 @@ These functions are defined below.
 
-
-

Structure initialization

-
+
+

Structure initialization

+
conf_simscape = struct();
 
@@ -494,9 +494,9 @@ These functions are defined below.
-
-

Add Type

-
+
+

Add Type

+
if args.gravity
   conf_simscape.type = 1;
@@ -508,9 +508,9 @@ These functions are defined below.
 
-
-

Save the Structure

-
+
+

Save the Structure

+
save('./mat/conf_simscape.mat', 'conf_simscape');
 
@@ -527,9 +527,9 @@ These functions are defined below.

-
-

Function description

-
+
+

Function description

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

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.log      char   {mustBeMember(args.log,{'none', 'all', 'forces'})} = 'none'
@@ -550,9 +550,9 @@ These functions are defined below.
 
-
-

Structure initialization

-
+
+

Structure initialization

+
conf_log = struct();
 
@@ -560,9 +560,9 @@ These functions are defined below.
-
-

Add Type

-
+
+

Add Type

+
switch args.log
   case 'none'
@@ -587,9 +587,9 @@ These functions are defined below.
 
-
-

Save the Structure

-
+
+

Save the Structure

+
save('./mat/conf_log.mat', 'conf_log');
 
@@ -606,9 +606,9 @@ These functions are defined below.

-
-

Simscape Model

-
+
+

Simscape Model

+

The model of the Ground is composed of:

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

Function description

-
+
+

Function description

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

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.type char {mustBeMember(args.type,{'none', 'rigid'})} = 'rigid'
@@ -656,9 +656,9 @@ The model of the Ground is composed of:
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the granite structure.

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

Add Type

-
+
+

Add Type

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

Save the Structure

-
+
+

Save the Structure

+

The ground structure is saved.

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

-
-

Simscape Model

-
+
+

Simscape Model

+

The Simscape model of the granite is composed of:

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

Function description

-
+
+

Function description

+
function [granite] = initializeGranite(args)
 
@@ -771,13 +771,13 @@ 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'
-  args.Foffset       logical {mustBeNumericOrLogical} = true
+  args.Foffset       logical {mustBeNumericOrLogical} = false
   args.density (1,1) double {mustBeNumeric, mustBeNonnegative} = 2800 % Density [kg/m3]
   args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m]
   args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m]
@@ -789,9 +789,9 @@ The output sample_pos corresponds to the impact point of the X-ray.
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the granite structure.

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

Material and Geometry

-
+
+

Material and Geometry

+

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

@@ -845,9 +845,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 = [4e9; 3e8; 8e8]; % [N/m]
 granite.C = [4.0e5; 1.1e5; 9.0e5]; % [N/(m/s)]
@@ -856,9 +856,9 @@ granite.C = [4.0e5; 1.1e5; 9.0e5]; % [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');
@@ -871,9 +871,9 @@ granite.C = [4.0e5; 1.1e5; 9.0e5]; % [N/(m/s)]
 
-
-

Save the Structure

-
+
+

Save the Structure

+

The granite structure is saved.

@@ -885,17 +885,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:

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

Function description

-
+
+

Function description

+
function [ty] = initializeTy(args)
 
@@ -935,22 +935,22 @@ 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'
-  args.Foffset logical {mustBeNumericOrLogical} = true
+  args.Foffset logical {mustBeNumericOrLogical} = false
 end
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the ty structure.

@@ -982,9 +982,9 @@ First, we initialize the ty structure.
-
-

Material and Geometry

-
+
+

Material and Geometry

+

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

@@ -1029,9 +1029,9 @@ ty.rotor.STEP = './STEPS/ty/Ty_Motor_Rotor.S
-
-

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)]
@@ -1040,9 +1040,9 @@ ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 2e4]; % [N/(m/s), N*m
 
-
-

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');
@@ -1055,9 +1055,9 @@ ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 2e4]; % [N/(m/s), N*m
 
-
-

Save the Structure

-
+
+

Save the Structure

+

The ty structure is saved.

@@ -1069,17 +1069,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:

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

Function description

-
+
+

Function description

+
function [ry] = initializeRy(args)
 
@@ -1119,13 +1119,13 @@ 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'
-  args.Foffset       logical {mustBeNumericOrLogical} = true
+  args.Foffset       logical {mustBeNumericOrLogical} = false
   args.Ry_init (1,1) double  {mustBeNumeric} = 0
 end
 
@@ -1133,9 +1133,9 @@ The Ry motion is imposed by the input.
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the ry structure.

@@ -1168,9 +1168,9 @@ First, we initialize the ry structure.
-
-

Material and Geometry

-
+
+

Material and Geometry

+

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

@@ -1208,9 +1208,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];
@@ -1219,9 +1219,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');
@@ -1234,9 +1234,9 @@ ry.C = [1e5;   1e5; 1e5;   3e4;   1e3; 3e4];
 
-
-

Save the Structure

-
+
+

Save the Structure

+

The ry structure is saved.

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

7 Spindle

+
+

7 Spindle

-
-

Simscape Model

-
+
+

Simscape Model

+

The Simscape model of the Spindle is composed of:

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

Function description

-
+
+

Function description

+
function [rz] = initializeRz(args)
 
@@ -1294,22 +1294,22 @@ 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'
-  args.Foffset logical {mustBeNumericOrLogical} = true
+  args.Foffset logical {mustBeNumericOrLogical} = false
 end
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the rz structure.

@@ -1341,9 +1341,9 @@ First, we initialize the rz structure.
-
-

Material and Geometry

-
+
+

Material and Geometry

+

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

@@ -1364,9 +1364,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];
@@ -1375,9 +1375,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');
@@ -1390,9 +1390,9 @@ rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4];
 
-
-

Save the Structure

-
+
+

Save the Structure

+

The rz structure is saved.

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

8 Micro Hexapod

+
+

8 Micro Hexapod

-
-

Simscape Model

-
+
+

Simscape Model

+

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

-
-

Function description

-
+
+

Function description

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

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     args.type      char   {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'modal-analysis', 'init'})} = 'flexible'
@@ -1478,16 +1478,16 @@ The rz structure is saved.
     args.AP  (3,1) double {mustBeNumeric} = zeros(3,1)
     args.ARB (3,3) double {mustBeNumeric} = eye(3)
     % Force that stiffness of each joint should apply at t=0
-    args.Foffset      logical {mustBeNumericOrLogical} = true
+    args.Foffset      logical {mustBeNumericOrLogical} = false
 end
 
-
-

Function content

-
+
+

Function content

+
micro_hexapod = initializeFramesPositions('H', args.H, 'MO_B', args.MO_B);
 micro_hexapod = generateGeneralConfiguration(micro_hexapod, 'FH', args.FH, 'FR', args.FR, 'FTh', args.FTh, 'MH', args.MH, 'MR', args.MR, 'MTh', args.MTh);
@@ -1517,9 +1517,9 @@ Equilibrium position of the each joint.
 
-
-

Add Type

-
+
+

Add Type

+
switch args.type
   case 'none'
@@ -1538,9 +1538,9 @@ Equilibrium position of the each joint.
 
-
-

Save the Structure

-
+
+

Save the Structure

+

The micro_hexapod structure is saved.

@@ -1560,9 +1560,9 @@ The micro_hexapod structure is saved.

-
-

Simscape Model

-
+
+

Simscape Model

+

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

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

Function description

-
+
+

Function description

+
function [axisc] = initializeAxisc(args)
 
@@ -1597,9 +1597,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'
@@ -1609,9 +1609,9 @@ The Simscape model of the Center of gravity compensator is composed of:
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the axisc structure.

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

Add Type

-
+
+

Add Type

+
switch args.type
   case 'none'
@@ -1639,9 +1639,9 @@ First, we initialize the axisc structure.
 
-
-

Material and Geometry

-
+
+

Material and Geometry

+

Properties of the Material and link to the geometry files.

@@ -1666,9 +1666,9 @@ axisc.gear.STEP = './STEPS/axisc/axisc_gear.STE
-
-

Save the Structure

-
+
+

Save the Structure

+

The axisc structure is saved.

@@ -1688,9 +1688,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 @@ -1712,9 +1712,9 @@ The output mirror_center corresponds to the center of the Sphere an

-
-

Function description

-
+
+

Function description

+
function [] = initializeMirror(args)
 
@@ -1722,9 +1722,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'})} = 'rigid'
@@ -1736,9 +1736,9 @@ The output mirror_center corresponds to the center of the Sphere an
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the mirror structure.

@@ -1764,9 +1764,9 @@ First, we initialize the mirror structure.
-
-

Material and Geometry

-
+
+

Material and Geometry

+

We define the geometrical values.

@@ -1843,9 +1843,9 @@ Finally, we close the shape.
-
-

Save the Structure

-
+
+

Save the Structure

+

The mirror structure is saved.

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

11 Nano Hexapod

+
+

11 Nano Hexapod

-
-

Simscape Model

-
+
+

Simscape Model

+

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

-
-

Function description

-
+
+

Function description

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

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     args.type      char   {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible'
@@ -1937,9 +1937,9 @@ The mirror structure is saved.
 
-
-

Function content

-
+
+

Function content

+
nano_hexapod = initializeFramesPositions('H', args.H, 'MO_B', args.MO_B);
 nano_hexapod = generateGeneralConfiguration(nano_hexapod, 'FH', args.FH, 'FR', args.FR, 'FTh', args.FTh, 'MH', args.MH, 'MR', args.MR, 'MTh', args.MTh);
@@ -1967,9 +1967,9 @@ nano_hexapod.dLi = dLi;
 
-
-

Add Type

-
+
+

Add Type

+
switch args.type
   case 'none'
@@ -1984,9 +1984,9 @@ nano_hexapod.dLi = dLi;
 
-
-

Save the Structure

-
+
+

Save the Structure

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

-
-

Simscape Model

-
+
+

Simscape Model

+

The Simscape model of the sample environment is composed of:

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

Function description

-
+
+

Function description

+
function [sample] = initializeSample(args)
 
@@ -2043,9 +2043,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'
@@ -2054,16 +2054,16 @@ This could be the case for cable forces for instance.
   args.mass   (1,1) double  {mustBeNumeric, mustBePositive} = 50 % [kg]
   args.freq   (1,1) double  {mustBeNumeric, mustBePositive} = 100 % [Hz]
   args.offset (1,1) double  {mustBeNumeric} = 0 % [m]
-  args.Foffset      logical {mustBeNumericOrLogical} = true
+  args.Foffset      logical {mustBeNumericOrLogical} = false
 end
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the sample structure.

@@ -2093,9 +2093,9 @@ First, we initialize the sample structure.
-
-

Material and Geometry

-
+
+

Material and Geometry

+

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

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

Stiffness and Damping properties

-
+
+

Stiffness and Damping properties

+
sample.K = ones(3,1) * sample.mass * (2*pi * args.freq)^2; % [N/m]
 sample.C = 0.1 * sqrt(sample.K*sample.mass); % [N/(m/s)]
@@ -2120,9 +2120,9 @@ sample.C = 0.1 * sqrt(sample.K
-

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');
@@ -2135,9 +2135,9 @@ sample.C = 0.1 * sqrt(sample.K
-

Save the Structure

-
+
+

Save the Structure

+

The sample structure is saved.

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

-
-

Function Declaration and Documentation

-
+
+

Function Declaration and Documentation

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

Optional Parameters

-
+
+

Optional Parameters

+
arguments
   args.type char {mustBeMember(args.type,{'open-loop', 'iff', 'dvf', 'hac-dvf'})} = 'open-loop'
@@ -2180,9 +2180,9 @@ The sample structure is saved.
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the controller structure.

@@ -2222,9 +2222,9 @@ First, we initialize the controller structure.
-
-

Save the Structure

-
+
+

Save the Structure

+

The controller structure is saved.

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

-
-

Function Declaration and Documentation

-
+
+

Function Declaration and Documentation

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

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     % Sampling Frequency [s]
@@ -2318,9 +2318,9 @@ H_lpf = 1/(1 + 2
 
-
-

Translation Stage

-
+
+

Translation Stage

+
%% Translation stage - Dy
 t = 0:Ts:Tmax; % Time Vector [s]
@@ -2357,9 +2357,9 @@ Dy = struct('time', t, 
 
-
-

Tilt Stage

-
+
+

Tilt Stage

+
%% Tilt Stage - Ry
 t = 0:Ts:Tmax; % Time Vector [s]
@@ -2397,9 +2397,9 @@ Ry = struct('time', t, 
 
-
-

Spindle

-
+
+

Spindle

+
%% Spindle - Rz
 t = 0:Ts:Tmax; % Time Vector [s]
@@ -2432,9 +2432,9 @@ Rz = struct('time', t, 
 
-
-

Micro Hexapod

-
+
+

Micro Hexapod

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

Nano Hexapod

-
+
+

Nano Hexapod

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

Save

-
+
+

Save

+
    %% Save
     save('./mat/nass_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'Rm', 'Dn', 'Dnl', 'Ts');
@@ -2554,9 +2554,9 @@ Dnl = struct('time', t, 
 
-
-

Function Declaration and Documentation

-
+
+

Function Declaration and Documentation

+
function [] = initializeDisturbances(args)
 % initializeDisturbances - Initialize the disturbances
@@ -2571,9 +2571,9 @@ Dnl = struct('time', t, 
 
-
-

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     % Global parameter to enable or disable the disturbances
@@ -2780,9 +2780,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');
 
@@ -2799,9 +2799,9 @@ Frz_z = Frz_z - Frz_z(1);

-
-

Function Declaration and Documentation

-
+
+

Function Declaration and Documentation

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

Optional Parameters

-
+
+

Optional Parameters

+
arguments
     args.error    logical {mustBeNumericOrLogical} = false
@@ -2831,9 +2831,9 @@ Frz_z  = Frz_z - Frz_z(1);
 
-
-

Structure initialization

-
+
+

Structure initialization

+

First, we initialize the pos_error structure.

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

Save

-
+
+

Save

+
save('./mat/pos_error.mat', 'pos_error');
 
@@ -2948,7 +2948,7 @@ pos_error.Rz = args.Rz;

Author: Dehaeze Thomas

-

Created: 2020-03-13 ven. 17:39

+

Created: 2020-03-17 mar. 11:21

diff --git a/org/control_requirements.org b/org/control_requirements.org index 93d6188..8e45186 100644 --- a/org/control_requirements.org +++ b/org/control_requirements.org @@ -160,6 +160,8 @@ The nano-hexapod can thus be represented as in Figure [[fig:nano_station_inputs_ #+name: fig:nano_station_inputs_outputs #+caption: Block representation of the nano-hexapod +#+RESULTS: +[[file:figs/nano_station_inputs_outputs.png]] ** How to include Ground Motion in the model? What we measure is not the absolute motion $x$, but the relative motion $x - w$ where $w$ is the motion of the granite. diff --git a/org/hac_lac.org b/org/hac_lac.org index 4589a74..0b6c299 100644 --- a/org/hac_lac.org +++ b/org/hac_lac.org @@ -89,9 +89,28 @@ It is then compare to the wanted position of the Sample $\bm{r}_\mathcal{X}$ in \end{tikzpicture} #+end_src +#+name: fig:hac_lac_control_schematic +#+caption: HAC-LAC Control Architecture used for the Control of the NASS #+RESULTS: [[file:figs/hac_lac_control_schematic.png]] +* Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) +<> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes +<> +#+end_src + +#+begin_src matlab :tangle no + simulinkproject('../'); +#+end_src + +#+begin_src matlab + open('nass_model.slx') +#+end_src + * Initialization We initialize all the stages with the default parameters. #+begin_src matlab