diff --git a/active_damping/figs b/active_damping/figs deleted file mode 120000 index d440220..0000000 --- a/active_damping/figs +++ /dev/null @@ -1 +0,0 @@ -../figs/ \ No newline at end of file diff --git a/active_damping/mat/K_iff.mat b/active_damping/mat/K_iff.mat deleted file mode 100644 index 0c65868..0000000 Binary files a/active_damping/mat/K_iff.mat and /dev/null differ diff --git a/active_damping_uniaxial/figs b/active_damping_uniaxial/figs deleted file mode 120000 index d440220..0000000 --- a/active_damping_uniaxial/figs +++ /dev/null @@ -1 +0,0 @@ -../figs/ \ No newline at end of file diff --git a/active_damping_uniaxial/index.html b/active_damping_uniaxial/index.html deleted file mode 100644 index 32bd328..0000000 --- a/active_damping_uniaxial/index.html +++ /dev/null @@ -1,1548 +0,0 @@ - - - - - - - -Active Damping - - - - - - - - - - - - - - - -
- UP - | - HOME -
-

Active Damping

-
-

Table of Contents

- -
- -

-First, in section 1, we will looked at the undamped system. -

- -

-Then, we will compare three active damping techniques: -

- - -

-For each of the active damping technique, we will: -

- - -

-The disturbances are: -

- - -
-

1 Undamped System

-
-

- -

-
-

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

- -
-

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

-
- -
-

1.1 Init

-
-

-We initialize all the stages with the default parameters. -The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg. -

- -
-
initializeReferences();
-initializeGround();
-initializeGranite();
-initializeTy();
-initializeRy();
-initializeRz();
-initializeMicroHexapod();
-initializeAxisc();
-initializeMirror();
-initializeNanoHexapod(struct('actuator', 'piezo'));
-initializeSample(struct('mass', 50));
-
-
- -

-All the controllers are set to 0. -

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

1.2 Identification

-
-

-We identify the various transfer functions of the system -

-
-
G = identifyPlant();
-
-
- -

-And we save it for further analysis. -

-
-
save('./active_damping/mat/plants.mat', 'G', '-append');
-
-
-
-
- -
-

1.3 Sensitivity to disturbances

-
-

-The sensitivity to disturbances are shown on figure 1. -

- - -
-

sensitivity_dist_undamped.png -

-

Figure 1: Undamped sensitivity to disturbances (png, pdf)

-
- - -
-

sensitivity_dist_stages.png -

-

Figure 2: Sensitivity to force disturbances in various stages (png, pdf)

-
-
-
- -
-

1.4 Undamped Plant

-
-

-The "plant" (transfer function from forces applied by the nano-hexapod to the measured displacement of the sample with respect to the granite) bode plot is shown on figure 1. -

- - -
-

plant_undamped.png -

-

Figure 3: Transfer Function from cartesian forces to displacement for the undamped plant (png, pdf)

-
-
-
-
- -
-

2 Integral Force Feedback

-
-

- -

-
-

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

- -
-

-Integral Force Feedback is applied. -In section 2.1, IFF is applied on a uni-axial system to understand its behavior. -Then, it is applied on the simscape model. -

-
- -
-

2.1 One degree-of-freedom example

-
-

- -

-
-
-

2.1.1 Equations

-
- -
-

iff_1dof.png -

-

Figure 4: Integral Force Feedback applied to a 1dof system

-
- -

-The dynamic of the system is described by the following equation: -

-\begin{equation} - ms^2x = F_d - kx - csx + kw + csw + F -\end{equation} -

-The measured force \(F_m\) is: -

-\begin{align} - F_m &= F - kx - csx + kw + csw \\ - &= ms^2 x - F_d -\end{align} -

-The Integral Force Feedback controller is \(K = -\frac{g}{s}\), and thus the applied force by this controller is: -

-\begin{equation} - F_{\text{IFF}} = -\frac{g}{s} F_m = -\frac{g}{s} (ms^2 x - F_d) -\end{equation} -

-Once the IFF is applied, the new dynamics of the system is: -

-\begin{equation} - ms^2x = F_d + F - kx - csx + kw + csw - \frac{g}{s} (ms^2x - F_d) -\end{equation} - -

-And finally: -

-\begin{equation} - x = F_d \frac{1 + \frac{g}{s}}{ms^2 + (mg + c)s + k} + F \frac{1}{ms^2 + (mg + c)s + k} + w \frac{k + cs}{ms^2 + (mg + c)s + k} -\end{equation} - -

-We can see that this: -

-
    -
  • adds damping to the system by a value \(mg\)
  • -
  • lower the compliance as low frequency by a factor: \(1 + g/s\)
  • -
- -

-If we want critical damping: -

-\begin{equation} - \xi = \frac{1}{2} \frac{c + gm}{\sqrt{km}} = \frac{1}{2} -\end{equation} - -

-This is attainable if we have: -

-\begin{equation} - g = \frac{\sqrt{km} - c}{m} -\end{equation} -
-
- -
-

2.1.2 Matlab Example

-
-

-Let define the system parameters. -

-
-
m = 50; % [kg]
-k = 1e6; % [N/m]
-c = 1e3; % [N/(m/s)]
-
-
- -

-The state space model of the system is defined below. -

-
-
A = [-c/m -k/m;
-     1     0];
-
-B = [1/m 1/m -1;
-     0   0    0];
-
-C = [ 0  1;
-     -c -k];
-
-D = [0 0 0;
-     1 0 0];
-
-sys = ss(A, B, C, D);
-sys.InputName = {'F', 'Fd', 'wddot'};
-sys.OutputName = {'d', 'Fm'};
-sys.StateName = {'ddot', 'd'};
-
-
- -

-The controller \(K_\text{IFF}\) is: -

-
-
Kiff = -((sqrt(k*m)-c)/m)/s;
-Kiff.InputName = {'Fm'};
-Kiff.OutputName = {'F'};
-
-
- -

-And the closed loop system is computed below. -

-
-
sys_iff = feedback(sys, Kiff, 'name', +1);
-
-
- - -
-

iff_1dof_sensitivitiy.png -

-

Figure 5: Sensitivity to disturbance when IFF is applied on the 1dof system (png, pdf)

-
-
-
-
- -
-

2.2 Control Design

-
-

-Let's load the undamped plant: -

-
-
load('./active_damping/mat/plants.mat', 'G');
-
-
- -

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

- - -
-

iff_plant.png -

-

Figure 6: Transfer function from forces applied in the legs to force sensor (png, pdf)

-
- -

-The controller for each pair of actuator/sensor is: -

-
-
K_iff = -1000/s;
-
-
- -

-The corresponding loop gains are shown in figure 7. -

- - -
-

iff_open_loop.png -

-

Figure 7: Loop Gain for the Integral Force Feedback (png, pdf)

-
-
-
- -
-

2.3 Identification of the damped plant

-
-

-Let's initialize the system prior to identification. -

-
-
initializeReferences();
-initializeGround();
-initializeGranite();
-initializeTy();
-initializeRy();
-initializeRz();
-initializeMicroHexapod();
-initializeAxisc();
-initializeMirror();
-initializeNanoHexapod(struct('actuator', 'piezo'));
-initializeSample(struct('mass', 50));
-
-
- -

-All the controllers are set to 0. -

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

-We identify the system dynamics now that the IFF controller is ON. -

-
-
G_iff = identifyPlant();
-
-
- -

-And we save the damped plant for further analysis -

-
-
save('./active_damping/mat/plants.mat', 'G_iff', '-append');
-
-
-
-
- -
-

2.4 Sensitivity to disturbances

-
-

-As shown on figure 8: -

-
    -
  • The top platform of the nano-hexapod how behaves as a "free-mass".
  • -
  • The transfer function from direct forces \(F_s\) to the relative displacement \(D\) is equivalent to the one of an isolated mass.
  • -
  • The transfer function from ground motion \(D_g\) to the relative displacement \(D\) tends to the transfer function from \(D_g\) to the displacement of the granite (the sample is being isolated thanks to IFF). -However, as the goal is to make the relative displacement \(D\) as small as possible (e.g. to make the sample motion follows the granite motion), this is not a good thing.
  • -
- - -
-

sensitivity_dist_iff.png -

-

Figure 8: Sensitivity to disturbance once the IFF controller is applied to the system (png, pdf)

-
- -
-

-The order of the models are very high and thus the plots may be wrong. -For instance, the plots are not the same when using minreal. -

- -
- - -
-

sensitivity_dist_stages_iff.png -

-

Figure 9: Sensitivity to force disturbances in various stages when IFF is applied (png, pdf)

-
-
-
- -
-

2.5 Damped Plant

-
-

-Now, look at the new damped plant to control. -

- -

-It damps the plant (resonance of the nano hexapod as well as other resonances) as shown in figure 10. -

- - -
-

plant_iff_damped.png -

-

Figure 10: Damped Plant after IFF is applied (png, pdf)

-
- -

-However, it increases coupling at low frequency (figure 11). -

- -
-

plant_iff_coupling.png -

-

Figure 11: Coupling induced by IFF (png, pdf)

-
-
-
- -
-

2.6 Conclusion

-
-
-

-Integral Force Feedback: -

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

3 Relative Motion Control

-
-

- -

-
-

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

- -
-

-In the Relative Motion Control (RMC), a derivative feedback is applied between the measured actuator displacement to the actuator force input. -

-
- -
-

3.1 One degree-of-freedom example

-
-

- -

-
-
-

3.1.1 Equations

-
- -
-

rmc_1dof.png -

-

Figure 12: Relative Motion Control applied to a 1dof system

-
- -

-The dynamic of the system is: -

-\begin{equation} - ms^2x = F_d - kx - csx + kw + csw + F -\end{equation} -

-In terms of the stage deformation \(d = x - w\): -

-\begin{equation} - (ms^2 + cs + k) d = -ms^2 w + F_d + F -\end{equation} -

-The relative motion control law is: -

-\begin{equation} - K = -g s -\end{equation} -

-Thus, the applied force is: -

-\begin{equation} - F = -g s d -\end{equation} -

-And the new dynamics will be: -

-\begin{equation} - d = w \frac{-ms^2}{ms^2 + (c + g)s + k} + F_d \frac{1}{ms^2 + (c + g)s + k} + F \frac{1}{ms^2 + (c + g)s + k} -\end{equation} - -

-And thus damping is added. -

- -

-If critical damping is wanted: -

-\begin{equation} - \xi = \frac{1}{2}\frac{c + g}{\sqrt{km}} = \frac{1}{2} -\end{equation} -

-This corresponds to a gain: -

-\begin{equation} - g = \sqrt{km} - c -\end{equation} -
-
- -
-

3.1.2 Matlab Example

-
-

-Let define the system parameters. -

-
-
m = 50; % [kg]
-k = 1e6; % [N/m]
-c = 1e3; % [N/(m/s)]
-
-
- -

-The state space model of the system is defined below. -

-
-
A = [-c/m -k/m;
-     1     0];
-
-B = [1/m 1/m -1;
-     0   0    0];
-
-C = [ 0  1;
-     -c -k];
-
-D = [0 0 0;
-     1 0 0];
-
-sys = ss(A, B, C, D);
-sys.InputName = {'F', 'Fd', 'wddot'};
-sys.OutputName = {'d', 'Fm'};
-sys.StateName = {'ddot', 'd'};
-
-
- -

-The controller \(K_\text{RMC}\) is: -

-
-
Krmc = -(sqrt(k*m)-c)*s;
-Krmc.InputName = {'d'};
-Krmc.OutputName = {'F'};
-
-
- -

-And the closed loop system is computed below. -

-
-
sys_rmc = feedback(sys, Krmc, 'name', +1);
-
-
- - -
-

rmc_1dof_sensitivitiy.png -

-

Figure 13: Sensitivity to disturbance when RMC is applied on the 1dof system (png, pdf)

-
-
-
-
- -
-

3.2 Control Design

-
-

-Let's load the undamped plant: -

-
-
load('./active_damping/mat/plants.mat', 'G');
-
-
- -

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

- - -
-

rmc_plant.png -

-

Figure 14: Transfer function from forces applied in the legs to leg displacement sensor (png, pdf)

-
- -

-The Relative Motion Controller is defined below. -A Low pass Filter is added to make the controller transfer function proper. -

-
-
K_rmc = s*50000/(1 + s/2/pi/10000);
-
-
- -

-The obtained loop gains are shown in figure 15. -

- - -
-

rmc_open_loop.png -

-

Figure 15: Loop Gain for the Integral Force Feedback (png, pdf)

-
-
-
- -
-

3.3 Identification of the damped plant

-
-

-Let's initialize the system prior to identification. -

-
-
initializeReferences();
-initializeGround();
-initializeGranite();
-initializeTy();
-initializeRy();
-initializeRz();
-initializeMicroHexapod();
-initializeAxisc();
-initializeMirror();
-initializeNanoHexapod(struct('actuator', 'piezo'));
-initializeSample(struct('mass', 50));
-
-
- -

-And initialize the controllers. -

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

-We identify the system dynamics now that the RMC controller is ON. -

-
-
G_rmc = identifyPlant();
-
-
- -

-And we save the damped plant for further analysis. -

-
-
save('./active_damping/mat/plants.mat', 'G_rmc', '-append');
-
-
-
-
- -
-

3.4 Sensitivity to disturbances

-
-

-As shown in figure 16, RMC control succeed in lowering the sensitivity to disturbances near resonance of the system. -

- - -
-

sensitivity_dist_rmc.png -

-

Figure 16: Sensitivity to disturbance once the RMC controller is applied to the system (png, pdf)

-
- - -
-

sensitivity_dist_stages_rmc.png -

-

Figure 17: Sensitivity to force disturbances in various stages when RMC is applied (png, pdf)

-
-
-
- -
-

3.5 Damped Plant

-
- -
-

plant_rmc_damped.png -

-

Figure 18: Damped Plant after RMC is applied (png, pdf)

-
-
-
- -
-

3.6 Conclusion

-
-
-

-Relative Motion Control: -

-
    -
  • -
- -
-
-
-
- -
-

4 Direct Velocity Feedback

-
-

- -

-
-

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

- -
-

-In the Relative Motion Control (RMC), a feedback is applied between the measured velocity of the platform to the actuator force input. -

-
- -
-

4.1 One degree-of-freedom example

-
-

- -

-
-
-

4.1.1 Equations

-
- -
-

dvf_1dof.png -

-

Figure 19: Direct Velocity Feedback applied to a 1dof system

-
- -

-The dynamic of the system is: -

-\begin{equation} - ms^2x = F_d - kx - csx + kw + csw + F -\end{equation} -

-In terms of the stage deformation \(d = x - w\): -

-\begin{equation} - (ms^2 + cs + k) d = -ms^2 w + F_d + F -\end{equation} -

-The direct velocity feedback law shown in figure 19 is: -

-\begin{equation} - K = -g -\end{equation} -

-Thus, the applied force is: -

-\begin{equation} - F = -g \dot{x} -\end{equation} -

-And the new dynamics will be: -

-\begin{equation} - d = w \frac{-ms^2 - gs}{ms^2 + (c + g)s + k} + F_d \frac{1}{ms^2 + (c + g)s + k} + F \frac{1}{ms^2 + (c + g)s + k} -\end{equation} - -

-And thus damping is added. -

- -

-If critical damping is wanted: -

-\begin{equation} - \xi = \frac{1}{2}\frac{c + g}{\sqrt{km}} = \frac{1}{2} -\end{equation} -

-This corresponds to a gain: -

-\begin{equation} - g = \sqrt{km} - c -\end{equation} -
-
- -
-

4.1.2 Matlab Example

-
-

-Let define the system parameters. -

-
-
m = 50; % [kg]
-k = 1e6; % [N/m]
-c = 1e3; % [N/(m/s)]
-
-
- -

-The state space model of the system is defined below. -

-
-
A = [-c/m -k/m;
-     1     0];
-
-B = [1/m 1/m -1;
-     0   0    0];
-
-C = [1 0;
-     0 1;
-     0 0];
-
-D = [0 0 0;
-     0 0 0;
-     0 0 1];
-
-sys = ss(A, B, C, D);
-sys.InputName = {'F', 'Fd', 'wddot'};
-sys.OutputName = {'ddot', 'd', 'wddot'};
-sys.StateName = {'ddot', 'd'};
-
-
- -

-Because we need \(\dot{x}\) for feedback, we compute it from the outputs -

-
-
G_xdot = [1, 0, 1/s;
-          0, 1, 0];
-G_xdot.InputName = {'ddot', 'd', 'wddot'};
-G_xdot.OutputName = {'xdot', 'd'};
-
-
- -

-Finally, the system is described by sys as defined below. -

-
-
sys = series(sys, G_xdot, [1 2 3], [1 2 3]);
-
-
- -

-The controller \(K_\text{DVF}\) is: -

-
-
Kdvf = tf(-(sqrt(k*m)-c));
-Kdvf.InputName = {'xdot'};
-Kdvf.OutputName = {'F'};
-
-
- -

-And the closed loop system is computed below. -

-
-
sys_dvf = feedback(sys, Kdvf, 'name', +1);
-
-
- -

-The obtained sensitivity to disturbances is shown in figure 20. -

- -
-

dvf_1dof_sensitivitiy.png -

-

Figure 20: Sensitivity to disturbance when DVF is applied on the 1dof system (png, pdf)

-
-
-
-
- -
-

4.2 Control Design

-
-

-Let's load the undamped plant: -

-
-
load('./active_damping/mat/plants.mat', 'G');
-
-
- -

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

- - -
-

dvf_plant.png -

-

Figure 21: Transfer function from forces applied in the legs to leg velocity sensor (png, pdf)

-
- -

-The controller is defined below and the obtained loop gain is shown in figure 22. -

- -
-
K_dvf = tf(3e4);
-
-
- - -
-

dvf_open_loop_gain.png -

-

Figure 22: Loop Gain for DVF (png, pdf)

-
-
-
- -
-

4.3 Identification of the damped plant

-
-

-Let's initialize the system prior to identification. -

-
-
initializeReferences();
-initializeGround();
-initializeGranite();
-initializeTy();
-initializeRy();
-initializeRz();
-initializeMicroHexapod();
-initializeAxisc();
-initializeMirror();
-initializeNanoHexapod(struct('actuator', 'piezo'));
-initializeSample(struct('mass', 50));
-
-
- -

-And initialize the controllers. -

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

-We identify the system dynamics now that the RMC controller is ON. -

-
-
G_dvf = identifyPlant();
-
-
- -

-And we save the damped plant for further analysis. -

-
-
save('./active_damping/mat/plants.mat', 'G_dvf', '-append');
-
-
-
-
- -
-

4.4 Sensitivity to disturbances

-
- -
-

sensitivity_dist_dvf.png -

-

Figure 23: Sensitivity to disturbance once the DVF controller is applied to the system (png, pdf)

-
- - - -
-

sensitivity_dist_stages_dvf.png -

-

Figure 24: Sensitivity to force disturbances in various stages when DVF is applied (png, pdf)

-
-
-
- -
-

4.5 Damped Plant

-
- -
-

plant_dvf_damped.png -

-

Figure 25: Damped Plant after DVF is applied (png, pdf)

-
-
-
- -
-

4.6 Conclusion

-
-
-

-Direct Velocity Feedback: -

- -
-
-
-
- -
-

5 Comparison

-
-

- -

-
-
-

5.1 Load the plants

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

5.2 Sensitivity to Disturbance

-
- -
-

sensitivity_comp_ground_motion_z.png -

-

Figure 26: caption (png, pdf)

-
- - - -
-

sensitivity_comp_direct_forces_z.png -

-

Figure 27: caption (png, pdf)

-
- - -
-

sensitivity_comp_spindle_z.png -

-

Figure 28: caption (png, pdf)

-
- - -
-

sensitivity_comp_ty_z.png -

-

Figure 29: caption (png, pdf)

-
- - - -
-

sensitivity_comp_ty_x.png -

-

Figure 30: caption (png, pdf)

-
-
-
- -
-

5.3 Damped Plant

-
- -
-

plant_comp_damping_z.png -

-

Figure 31: Plant for the \(z\) direction for different active damping technique used (png, pdf)

-
- - -
-

plant_comp_damping_x.png -

-

Figure 32: Plant for the \(x\) direction for different active damping technique used (png, pdf)

-
- - -
-

plant_comp_damping_coupling.png -

-

Figure 33: Comparison of one off-diagonal plant for different damping technique applied (png, pdf)

-
-
-
-
- -
-

6 Conclusion

-
-

- -

-
-
-
-
-

Author: Dehaeze Thomas

-

Created: 2019-12-11 mer. 16:55

-

Validate

-
- - diff --git a/active_damping_uniaxial/mat/plants.mat b/active_damping_uniaxial/mat/plants.mat deleted file mode 100644 index 9677bf1..0000000 Binary files a/active_damping_uniaxial/mat/plants.mat and /dev/null differ diff --git a/control/figs b/control/figs deleted file mode 120000 index 8ea5186..0000000 --- a/control/figs +++ /dev/null @@ -1 +0,0 @@ -../figs \ No newline at end of file diff --git a/disturbances/figs b/disturbances/figs deleted file mode 120000 index 8ea5186..0000000 --- a/disturbances/figs +++ /dev/null @@ -1 +0,0 @@ -../figs \ No newline at end of file diff --git a/active_damping/index.html b/docs/active_damping.html similarity index 75% rename from active_damping/index.html rename to docs/active_damping.html index 389745d..4f140b1 100644 --- a/active_damping/index.html +++ b/docs/active_damping.html @@ -1,10 +1,11 @@ + - + Active Damping applied on the Simscape Model @@ -269,113 +270,113 @@ for the JavaScript code in this tag.

Table of Contents

-First, in section 1, we look at the undamped system and we identify the dynamics from the actuators to the three sensor types. +First, in section 1, we look at the undamped system and we identify the dynamics from the actuators to the three sensor types.

-Then, in section 2, we study the change of dynamics for the active damping plants with respect to various experimental conditions such as the sample mass and the spindle rotation speed. +Then, in section 2, we study the change of dynamics for the active damping plants with respect to various experimental conditions such as the sample mass and the spindle rotation speed.

Then, we will apply and compare the results of three active damping techniques:

@@ -423,11 +424,11 @@ For each of the active damping technique, we:

  • Compare the sensitivity from disturbances
  • -
    -

    1 Undamped System

    +
    +

    1 Undamped System

    - +

    In this section, we identify the dynamic of the system from forces applied in the nano-hexapod legs to the various sensors included in the nano-hexapod that could be use for Active Damping, namely: @@ -443,12 +444,12 @@ After that, a tomography experiment is simulation without any active damping tec

    -
    -

    1.1 Identification of the dynamics for Active Damping

    +
    +

    1.1 Identification of the dynamics for Active Damping

    -
    -

    1.1.1 Identification

    +
    +

    1.1.1 Identification

    We initialize all the stages with the default parameters. @@ -505,8 +506,8 @@ And we save them for further analysis.

    -
    -

    1.1.2 Obtained Plants for Active Damping

    +
    +

    1.1.2 Obtained Plants for Active Damping

    load('./active_damping/mat/undamped_plants.mat', 'G_iff', 'G_dvf', 'G_ine');
    @@ -514,21 +515,21 @@ And we save them for further analysis.
     
    -
    +

    nass_active_damping_iff_plant.png

    Figure 1: G_iff: Transfer functions from forces applied in the actuators to the force sensor in each actuator (png, pdf)

    -
    +

    nass_active_damping_dvf_plant.png

    Figure 2: G_dvf: Transfer functions from forces applied in the actuators to the relative motion sensor in each actuator (png, pdf)

    -
    +

    nass_active_damping_inertial_plant.png

    Figure 3: G_ine: Transfer functions from forces applied in the actuators to the geophone located in each leg measuring the absolute velocity of the top part of the leg in the direction of the leg (png, pdf)

    @@ -537,12 +538,12 @@ And we save them for further analysis.
    -
    -

    1.2 Identification of the dynamics for High Authority Control

    +
    +

    1.2 Identification of the dynamics for High Authority Control

    -
    -

    1.2.1 Identification

    +
    +

    1.2.1 Identification

    We initialize all the stages with the default parameters. @@ -585,8 +586,8 @@ And we save them for further analysis.

    -
    -

    1.2.2 Obtained Plants

    +
    +

    1.2.2 Obtained Plants

    load('./active_damping/mat/cart_plants.mat', 'G_cart', 'masses');
    @@ -594,7 +595,7 @@ And we save them for further analysis.
     
    -
    +

    undamped_hac_plant_translations.png

    Figure 4: Undamped Plant - Translations (png, pdf)

    @@ -602,7 +603,7 @@ And we save them for further analysis. -
    +

    undamped_hac_plant_rotations.png

    Figure 5: Undamped Plant - Rotations (png, pdf)

    @@ -611,12 +612,12 @@ And we save them for further analysis.
    -
    -

    1.3 Tomography Experiment

    +
    +

    1.3 Tomography Experiment

    -
    -

    1.3.1 Simulation

    +
    +

    1.3.1 Simulation

    We initialize elements for the tomography experiment. @@ -653,8 +654,8 @@ Finally, we save the simulation results for further analysis

    -
    -

    1.3.2 Results

    +
    +

    1.3.2 Results

    We load the results of tomography experiments. @@ -667,14 +668,14 @@ t = (1/Fs)*[0 -

    +

    nass_act_damp_undamped_sim_tomo_trans.png

    Figure 6: Position Error during tomography experiment - Translations (png, pdf)

    -
    +

    nass_act_damp_undamped_sim_tomo_rot.png

    Figure 7: Position Error during tomography experiment - Rotations (png, pdf)

    @@ -684,22 +685,22 @@ t = (1/Fs)*[0
    -
    -

    2 Variability of the system dynamics for Active Damping

    +
    +

    2 Variability of the system dynamics for Active Damping

    - +

    The goal of this section is to study how the dynamics of the Active Damping plants are changing with the experimental conditions. These experimental conditions are:

      -
    • The mass of the sample (section 2.1)
    • -
    • The spindle angle with a null rotating speed (section 2.2)
    • -
    • The spindle rotation speed (section 2.3)
    • -
    • The tilt angle (section 2.4)
    • -
    • The scans of the translation stage (section 2.5)
    • +
    • The mass of the sample (section 2.1)
    • +
    • The spindle angle with a null rotating speed (section 2.2)
    • +
    • The spindle rotation speed (section 2.3)
    • +
    • The tilt angle (section 2.4)
    • +
    • The scans of the translation stage (section 2.5)

    @@ -708,11 +709,11 @@ This is done in order for the transient phase to be over.

    -
    -

    2.1 Variation of the Sample Mass

    +
    +

    2.1 Variation of the Sample Mass

    - +

    For all the identifications, the disturbances are disabled and no controller are used. @@ -733,21 +734,21 @@ We identify the dynamics for the following sample mass.

    -
    +

    act_damp_variability_iff_sample_mass.png

    Figure 8: Variability of the dynamics from actuator force to force sensor with the Sample Mass (png, pdf)

    -
    +

    act_damp_variability_dvf_sample_mass.png

    Figure 9: Variability of the dynamics from actuator force to relative motion sensor with the Sample Mass (png, pdf)

    -
    +

    act_damp_variability_ine_sample_mass.png

    Figure 10: Variability of the dynamics from actuator force to absolute velocity with the Sample Mass (png, pdf)

    @@ -755,11 +756,11 @@ We identify the dynamics for the following sample mass.
    -
    -

    2.2 Variation of the Spindle Angle

    +
    +

    2.2 Variation of the Spindle Angle

    - +

    We initialize all the stages with the default parameters. @@ -777,21 +778,21 @@ We identify the dynamics for the following Spindle angles.

    -
    +

    act_damp_variability_iff_spindle_angle.png

    Figure 11: Variability of the dynamics from the actuator force to the force sensor with the Spindle Angle (png, pdf)

    -
    +

    act_damp_variability_dvf_spindle_angle.png

    Figure 12: Variability of the dynamics from actuator force to relative motion sensor with the Spindle Angle (png, pdf)

    -
    +

    act_damp_variability_ine_spindle_angle.png

    Figure 13: Variability of the dynamics from actuator force to absolute velocity with the Spindle Angle (png, pdf)

    @@ -799,11 +800,11 @@ We identify the dynamics for the following Spindle angles.
    -
    -

    2.3 Variation of the Spindle Rotation Speed

    +
    +

    2.3 Variation of the Spindle Rotation Speed

    - +

    We initialize all the stages with the default parameters. @@ -825,46 +826,46 @@ We identify the dynamics for the following Spindle rotation periods. The identification of the dynamics is done at the same Spindle angle position.

    -
    -

    2.3.1 Dynamics of the Active Damping plants

    +
    +

    2.3.1 Dynamics of the Active Damping plants

    -
    +

    act_damp_variability_iff_spindle_speed.png

    Figure 14: Variability of the dynamics from the actuator force to the force sensor with the Spindle rotation speed (png, pdf)

    -
    +

    act_damp_variability_iff_spindle_speed_zoom.png

    Figure 15: Variability of the dynamics from the actuator force to the force sensor with the Spindle rotation speed (png, pdf)

    -
    +

    act_damp_variability_dvf_spindle_speed.png

    Figure 16: Variability of the dynamics from the actuator force to the relative motion sensor with the Spindle rotation speed (png, pdf)

    -
    +

    act_damp_variability_dvf_spindle_speed_zoom.png

    Figure 17: Variability of the dynamics from the actuator force to the relative motion sensor with the Spindle rotation speed (png, pdf)

    -
    +

    act_damp_variability_ine_spindle_speed.png

    Figure 18: Variability of the dynamics from the actuator force to the absolute velocity sensor with the Spindle rotation speed (png, pdf)

    -
    +

    act_damp_variability_ine_spindle_speed_zoom.png

    Figure 19: Variability of the dynamics from the actuator force to the absolute velocity sensor with the Spindle rotation speed (png, pdf)

    @@ -872,18 +873,18 @@ The identification of the dynamics is done at the same Spindle angle position.
    -
    -

    2.3.2 Variation of the poles and zeros with the Spindle rotation frequency

    +
    +

    2.3.2 Variation of the poles and zeros with the Spindle rotation frequency

    -
    +

    campbell_diagram_spindle_rotation.png

    Figure 20: Evolution of the pole with respect to the spindle rotation speed (png, pdf)

    -
    +

    variation_zeros_active_damping_plants.png

    Figure 21: Evolution of the zero with respect to the spindle rotation speed (png, pdf)

    @@ -892,11 +893,11 @@ The identification of the dynamics is done at the same Spindle angle position.
    -
    -

    2.4 Variation of the Tilt Angle

    +
    +

    2.4 Variation of the Tilt Angle

    - +

    We initialize all the stages with the default parameters. @@ -914,21 +915,21 @@ We identify the dynamics for the following Tilt stage angles.

    -
    +

    act_damp_variability_iff_tilt_angle.png

    Figure 22: Variability of the dynamics from the actuator force to the force sensor with the Tilt stage Angle (png, pdf)

    -
    +

    act_damp_variability_dvf_tilt_angle.png

    Figure 23: Variability of the dynamics from the actuator force to the relative motion sensor with the Tilt Angle (png, pdf)

    -
    +

    act_damp_variability_ine_tilt_angle.png

    Figure 24: Variability of the dynamics from the actuator force to the absolute velocity sensor with the Tilt Angle (png, pdf)

    @@ -936,11 +937,11 @@ We identify the dynamics for the following Tilt stage angles.
    -
    -

    2.5 Scans of the Translation Stage

    +
    +

    2.5 Scans of the Translation Stage

    - +

    We want here to verify if the dynamics used for Active damping is varying when using the translation stage for scans. @@ -954,7 +955,7 @@ We initialize all the stages with the default parameters.

    -We initialize the translation stage reference to be a sinus with an amplitude of 5mm and a period of 1s (Figure 25). +We initialize the translation stage reference to be a sinus with an amplitude of 5mm and a period of 1s (Figure 25).

    initializeReferences('Dy_type', 'sinusoidal', ...
    @@ -964,7 +965,7 @@ We initialize the translation stage reference to be a sinus with an amplitude of
     
    -
    +

    ty_scanning_reference_sinus.png

    Figure 25: Reference path for the translation stage (png, pdf)

    @@ -978,21 +979,21 @@ We identify the dynamics at different positions (times) when scanning with the T
    -
    +

    act_damp_variability_iff_ty_scans.png

    Figure 26: Variability of the dynamics from the actuator force to the absolute velocity sensor plant at different Ty scan positions (png, pdf)

    -
    +

    act_damp_variability_dvf_ty_scans.png

    Figure 27: Variability of the dynamics from actuator force to relative displacement sensor at different Ty scan positions (png, pdf)

    -
    +

    act_damp_variability_ine_ty_scans.png

    Figure 28: Variability of the Inertial plant at different Ty scan positions (png, pdf)

    @@ -1000,10 +1001,10 @@ We identify the dynamics at different positions (times) when scanning with the T
    -
    -

    2.6 Conclusion

    +
    +

    2.6 Conclusion

    - +
    @@ -1060,11 +1061,11 @@ Thus, the developed damping techniques should be robust to variations of the sam -
    -

    3 Integral Force Feedback

    +
    +

    3 Integral Force Feedback

    - +

    @@ -1081,23 +1082,23 @@ The IFF control is applied in a decentralized way: there is on controller for ea

    -The control architecture is represented in figure 29 where one of the 6 nano-hexapod legs is represented. +The control architecture is represented in figure 29 where one of the 6 nano-hexapod legs is represented.

    -
    +

    iff_1dof.png

    Figure 29: Integral Force Feedback applied to a 1dof system

    -
    -

    3.1 Control Design

    +
    +

    3.1 Control Design

    -
    -

    3.1.1 Plant

    +
    +

    3.1.1 Plant

    Let’s load the previously identified undamped plant: @@ -1109,11 +1110,11 @@ load('./active_damping/mat/plants_variable.mat',

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

    -
    +

    iff_plant.png

    Figure 30: Transfer function from forces applied in the legs to force sensor (png, pdf)

    @@ -1121,8 +1122,8 @@ Let’s look at the transfer function from actuator forces in the nano-hexap
    -
    -

    3.1.2 Control Design

    +
    +

    3.1.2 Control Design

    The controller for each pair of actuator/sensor is: @@ -1134,11 +1135,11 @@ K_iff = -5000/s

    -The corresponding loop gains are shown in figure 31. +The corresponding loop gains are shown in figure 31.

    -
    +

    iff_open_loop.png

    Figure 31: Loop Gain for the Integral Force Feedback (png, pdf)

    @@ -1146,8 +1147,8 @@ The corresponding loop gains are shown in figure 31.
    -
    -

    3.1.3 Diagonal Controller

    +
    +

    3.1.3 Diagonal Controller

    We create the diagonal controller and we add a minus sign as we have a positive @@ -1169,12 +1170,12 @@ We save the controller for further analysis.

    -
    -

    3.2 Tomography Experiment

    +
    +

    3.2 Tomography Experiment

    -
    -

    3.2.1 Simulation with IFF Controller

    +
    +

    3.2.1 Simulation with IFF Controller

    We initialize elements for the tomography experiment. @@ -1222,25 +1223,25 @@ save('./active_damping/mat/tomo_exp.mat',

    -
    -

    3.2.2 Compare with Undamped system

    +
    +

    3.2.2 Compare with Undamped system

    -
    +

    nass_act_damp_iff_sim_tomo_xy.png

    Figure 32: Position Error during tomography experiment - XY Motion (png, pdf)

    -
    +

    nass_act_damp_iff_sim_tomo_trans.png

    Figure 33: Position Error during tomography experiment - Translations (png, pdf)

    -
    +

    nass_act_damp_iff_sim_tomo_rot.png

    Figure 34: Position Error during tomography experiment - Rotations (png, pdf)

    @@ -1249,8 +1250,8 @@ save('./active_damping/mat/tomo_exp.mat',
    -
    -

    3.3 Conclusion

    +
    +

    3.3 Conclusion

    @@ -1267,11 +1268,11 @@ Integral Force Feedback using a force sensor:

    -
    -

    4 Direct Velocity Feedback

    +
    +

    4 Direct Velocity Feedback

    - +

    @@ -1285,12 +1286,12 @@ The actuator displacement can be measured with a capacitive sensor for instance.

    -
    -

    4.1 Control Design

    +
    +

    4.1 Control Design

    -
    -

    4.1.1 Plant

    +
    +

    4.1.1 Plant

    Let’s load the undamped plant: @@ -1302,11 +1303,11 @@ load('./active_damping/mat/plants_variable.mat',

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

    -
    +

    dvf_plant.png

    Figure 35: Transfer function from forces applied in the legs to leg displacement sensor (png, pdf)

    @@ -1314,8 +1315,8 @@ Let’s look at the transfer function from actuator forces in the nano-hexap
    -
    -

    4.1.2 Control Design

    +
    +

    4.1.2 Control Design

    The Direct Velocity Feedback is defined below. @@ -1327,11 +1328,11 @@ A Low pass Filter is added to make the controller transfer function proper.

    -The obtained loop gains are shown in figure 36. +The obtained loop gains are shown in figure 36.

    -
    +

    dvf_open_loop.png

    Figure 36: Loop Gain for the Integral Force Feedback (png, pdf)

    @@ -1339,8 +1340,8 @@ The obtained loop gains are shown in figure 36.
    -
    -

    4.1.3 Diagonal Controller

    +
    +

    4.1.3 Diagonal Controller

    We create the diagonal controller and we add a minus sign as we have a positive feedback architecture. @@ -1361,12 +1362,12 @@ We save the controller for further analysis.

    -
    -

    4.2 Tomography Experiment

    +
    +

    4.2 Tomography Experiment

    -
    -

    4.2.1 Initialize the Simulation

    +
    +

    4.2.1 Initialize the Simulation

    We initialize elements for the tomography experiment. @@ -1414,25 +1415,25 @@ save('./active_damping/mat/tomo_exp.mat',

    -
    -

    4.2.2 Compare with Undamped system

    +
    +

    4.2.2 Compare with Undamped system

    -
    +

    nass_act_damp_dvf_sim_tomo_xy.png

    Figure 37: Position Error during tomography experiment - XY Motion (png, pdf)

    -
    +

    nass_act_damp_dvf_sim_tomo_trans.png

    Figure 38: Position Error during tomography experiment - Translations (png, pdf)

    -
    +

    nass_act_damp_dvf_sim_tomo_rot.png

    Figure 39: Position Error during tomography experiment - Rotations (png, pdf)

    @@ -1441,8 +1442,8 @@ save('./active_damping/mat/tomo_exp.mat',
    -
    -

    4.3 Conclusion

    +
    +

    4.3 Conclusion

    @@ -1457,11 +1458,11 @@ Direct Velocity Feedback using a relative motion sensor:

    -
    -

    5 Inertial Control

    +
    +

    5 Inertial Control

    - +

    @@ -1474,12 +1475,12 @@ In Inertial Control, a feedback is applied between the measured absolute

    -
    -

    5.1 Control Design

    +
    +

    5.1 Control Design

    -
    -

    5.1.1 Plant

    +
    +

    5.1.1 Plant

    Let’s load the undamped plant: @@ -1491,11 +1492,11 @@ load('./active_damping/mat/plants_variable.mat',

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

    -
    +

    ine_plant.png

    Figure 40: Transfer function from forces applied in the legs to leg velocity sensor (png, pdf)

    @@ -1503,11 +1504,11 @@ Let’s look at the transfer function from actuator forces in the nano-hexap
    -
    -

    5.1.2 Control Design

    +
    +

    5.1.2 Control Design

    -The controller is defined below and the obtained loop gain is shown in figure 41. +The controller is defined below and the obtained loop gain is shown in figure 41.

    @@ -1516,7 +1517,7 @@ The controller is defined below and the obtained loop gain is shown in figure -
    +

    ine_open_loop_gain.png

    Figure 41: Loop Gain for Inertial Control (png, pdf)

    @@ -1524,8 +1525,8 @@ The controller is defined below and the obtained loop gain is shown in figure
    -
    -

    5.1.3 Diagonal Controller

    +
    +

    5.1.3 Diagonal Controller

    We create the diagonal controller and we add a minus sign as we have a positive feedback architecture. @@ -1546,8 +1547,8 @@ We save the controller for further analysis.

    -
    -

    5.2 Conclusion

    +
    +

    5.2 Conclusion

    @@ -1559,15 +1560,15 @@ Inertial Control should not be used.

    -
    -

    6 TODO Comparison

    +
    +

    6 Comparison

    - +

    -
    -

    6.1 Load the plants

    +
    +

    6.1 Load the plants

    load('./active_damping/mat/plants.mat', 'G', 'G_iff', 'G_ine', 'G_dvf');
    @@ -1576,11 +1577,11 @@ Inertial Control should not be used.
     
    -
    -

    6.2 TODO Sensitivity to Disturbance

    +
    +

    6.2 Sensitivity to Disturbance

    -
    +

    sensitivity_comp_ground_motion_z.png

    Figure 42: Sensitivity to ground motion in the Z direction on the Z motion error (png, pdf)

    @@ -1588,21 +1589,21 @@ Inertial Control should not be used. -
    +

    sensitivity_comp_direct_forces_z.png

    Figure 43: Compliance in the Z direction: Sensitivity of direct forces applied on the sample in the Z direction on the Z motion error (png, pdf)

    -
    +

    sensitivity_comp_spindle_z.png

    Figure 44: Sensitivity to forces applied in the Z direction by the Spindle on the Z motion error (png, pdf)

    -
    +

    sensitivity_comp_ty_z.png

    Figure 45: Sensitivity to forces applied in the Z direction by the Y translation stage on the Z motion error (png, pdf)

    @@ -1610,7 +1611,7 @@ Inertial Control should not be used. -
    +

    sensitivity_comp_ty_x.png

    Figure 46: Sensitivity to forces applied in the X direction by the Y translation stage on the X motion error (png, pdf)

    @@ -1618,25 +1619,25 @@ Inertial Control should not be used.
    -
    -

    6.3 TODO Damped Plant

    +
    +

    6.3 Damped Plant

    -
    +

    plant_comp_damping_z.png

    Figure 47: Plant for the \(z\) direction for different active damping technique used (png, pdf)

    -
    +

    plant_comp_damping_x.png

    Figure 48: Plant for the \(x\) direction for different active damping technique used (png, pdf)

    -
    +

    plant_comp_damping_coupling.png

    Figure 49: Comparison of one off-diagonal plant for different damping technique applied (png, pdf)

    @@ -1644,8 +1645,8 @@ Inertial Control should not be used.
    -
    -

    6.4 Tomography Experiment - Frequency Domain analysis

    +
    +

    6.4 Tomography Experiment - Frequency Domain analysis

    load('./active_damping/mat/tomo_exp.mat', 'En', 'En_iff', 'En_dvf');
    @@ -1677,28 +1678,28 @@ han_win = hanning(ceil(length(En(:, 1))
     
     
    -
    +

    act_damp_tomo_exp_comp_psd_trans.png

    Figure 50: PSD of the translation errors in the X direction for applied Active Damping techniques (png, pdf)

    -
    +

    act_damp_tomo_exp_comp_psd_rot.png

    Figure 51: PSD of the rotation errors in the X direction for applied Active Damping techniques (png, pdf)

    -
    +

    act_damp_tomo_exp_comp_cps_trans.png

    Figure 52: CPS of the translation errors in the X direction for applied Active Damping techniques (png, pdf)

    -
    +

    act_damp_tomo_exp_comp_cps_rot.png

    Figure 53: CPS of the rotation errors in the X direction for applied Active Damping techniques (png, pdf)

    @@ -1707,15 +1708,15 @@ han_win = hanning(ceil(length(En(:, 1))
    -
    -

    7 Useful Functions

    +
    +

    7 Useful Functions

    -
    -

    7.1 prepareLinearizeIdentification

    +
    +

    7.1 prepareLinearizeIdentification

    - +

    @@ -1723,9 +1724,9 @@ This Matlab function is accessible -

    Function Description

    -
    +
    +

    Function Description

    +
    function [] = prepareLinearizeIdentification(args)
     
    @@ -1733,9 +1734,9 @@ This Matlab function is accessible
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         args.nass_actuator       char   {mustBeMember(args.nass_actuator,{'piezo', 'lorentz'})} = 'piezo'
    @@ -1746,9 +1747,9 @@ This Matlab function is accessible 
    -

    Initialize the Simulation

    -
    +
    +

    Initialize the Simulation

    +

    We initialize all the stages with the default parameters.

    @@ -1809,11 +1810,11 @@ We do not need to log any signal.
    -
    -

    7.2 prepareTomographyExperiment

    +
    +

    7.2 prepareTomographyExperiment

    - +

    @@ -1821,9 +1822,9 @@ This Matlab function is accessible h

    -
    -

    Function Description

    -
    +
    +

    Function Description

    +
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    -
    -

    Initialize the Simulation

    -
    +
    +

    Initialize the Simulation

    +

    We initialize all the stages with the default parameters.

    @@ -1915,7 +1916,7 @@ We log the signals.

    Author: Dehaeze Thomas

    -

    Created: 2020-02-18 mar. 17:49

    +

    Created: 2020-02-25 mar. 18:07

    diff --git a/docs/active_damping_uniaxial.html b/docs/active_damping_uniaxial.html new file mode 100644 index 0000000..122d12e --- /dev/null +++ b/docs/active_damping_uniaxial.html @@ -0,0 +1,1534 @@ + + + + + + + + + +Active Damping with an uni-axial model + + + + + + + + + + + + + + + +
    +

    Active Damping with an uni-axial model

    + + +

    +First, in section 1, we will looked at the undamped system. +

    + +

    +Then, we will compare three active damping techniques: +

    +
      +
    • In section 2: the integral force feedback is used
    • +
    • In section 3: the relative motion control is used
    • +
    • In section 4: the direct velocity feedback is used
    • +
    + +

    +For each of the active damping technique, we will: +

    +
      +
    • Compare the sensitivity from disturbances
    • +
    • Look at the damped plant
    • +
    + +

    +The disturbances are: +

    +
      +
    • Ground motion
    • +
    • Direct forces
    • +
    • Motion errors of all the stages
    • +
    + +
    +

    1 Undamped System

    +
    +

    + +

    +
    +

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

    + +
    +

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

    +
    + +
    +

    1.1 Init

    +
    +

    +We initialize all the stages with the default parameters. +The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg. +

    + +
    +
    initializeReferences();
    +initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod('actuator', 'piezo');
    +initializeSample('mass', 50);
    +
    +
    + +

    +All the controllers are set to 0. +

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

    1.2 Identification

    +
    +

    +We identify the various transfer functions of the system +

    +
    +
    G = identifyPlant();
    +
    +
    + +

    +And we save it for further analysis. +

    +
    +
    save('./active_damping_uniaxial/mat/plants.mat', 'G', '-append');
    +
    +
    +
    +
    + +
    +

    1.3 Sensitivity to disturbances

    +
    +

    +The sensitivity to disturbances are shown on figure 1. +

    + + +
    +

    sensitivity_dist_undamped.png +

    +

    Figure 1: Undamped sensitivity to disturbances (png, pdf)

    +
    + + +
    +

    sensitivity_dist_stages.png +

    +

    Figure 2: Sensitivity to force disturbances in various stages (png, pdf)

    +
    +
    +
    + +
    +

    1.4 Undamped Plant

    +
    +

    +The “plant” (transfer function from forces applied by the nano-hexapod to the measured displacement of the sample with respect to the granite) bode plot is shown on figure 1. +

    + + +
    +

    plant_undamped.png +

    +

    Figure 3: Transfer Function from cartesian forces to displacement for the undamped plant (png, pdf)

    +
    +
    +
    +
    + +
    +

    2 Integral Force Feedback

    +
    +

    + +

    +
    +

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

    + +
    +

    +Integral Force Feedback is applied. +In section 2.1, IFF is applied on a uni-axial system to understand its behavior. +Then, it is applied on the simscape model. +

    +
    + +
    +

    2.1 One degree-of-freedom example

    +
    +

    + +

    +
    +
    +

    2.1.1 Equations

    +
    + +
    +

    iff_1dof.png +

    +

    Figure 4: Integral Force Feedback applied to a 1dof system

    +
    + +

    +The dynamic of the system is described by the following equation: +

    +\begin{equation} + ms^2x = F_d - kx - csx + kw + csw + F +\end{equation} +

    +The measured force \(F_m\) is: +

    +\begin{align} + F_m &= F - kx - csx + kw + csw \\ + &= ms^2 x - F_d +\end{align} +

    +The Integral Force Feedback controller is \(K = -\frac{g}{s}\), and thus the applied force by this controller is: +

    +\begin{equation} + F_{\text{IFF}} = -\frac{g}{s} F_m = -\frac{g}{s} (ms^2 x - F_d) +\end{equation} +

    +Once the IFF is applied, the new dynamics of the system is: +

    +\begin{equation} + ms^2x = F_d + F - kx - csx + kw + csw - \frac{g}{s} (ms^2x - F_d) +\end{equation} + +

    +And finally: +

    +\begin{equation} + x = F_d \frac{1 + \frac{g}{s}}{ms^2 + (mg + c)s + k} + F \frac{1}{ms^2 + (mg + c)s + k} + w \frac{k + cs}{ms^2 + (mg + c)s + k} +\end{equation} + +

    +We can see that this: +

    +
      +
    • adds damping to the system by a value \(mg\)
    • +
    • lower the compliance as low frequency by a factor: \(1 + g/s\)
    • +
    + +

    +If we want critical damping: +

    +\begin{equation} + \xi = \frac{1}{2} \frac{c + gm}{\sqrt{km}} = \frac{1}{2} +\end{equation} + +

    +This is attainable if we have: +

    +\begin{equation} + g = \frac{\sqrt{km} - c}{m} +\end{equation} +
    +
    + +
    +

    2.1.2 Matlab Example

    +
    +

    +Let define the system parameters. +

    +
    +
    m = 50; % [kg]
    +k = 1e6; % [N/m]
    +c = 1e3; % [N/(m/s)]
    +
    +
    + +

    +The state space model of the system is defined below. +

    +
    +
    A = [-c/m -k/m;
    +     1     0];
    +
    +B = [1/m 1/m -1;
    +     0   0    0];
    +
    +C = [ 0  1;
    +     -c -k];
    +
    +D = [0 0 0;
    +     1 0 0];
    +
    +sys = ss(A, B, C, D);
    +sys.InputName = {'F', 'Fd', 'wddot'};
    +sys.OutputName = {'d', 'Fm'};
    +sys.StateName = {'ddot', 'd'};
    +
    +
    + +

    +The controller \(K_\text{IFF}\) is: +

    +
    +
    Kiff = -((sqrt(k*m)-c)/m)/s;
    +Kiff.InputName = {'Fm'};
    +Kiff.OutputName = {'F'};
    +
    +
    + +

    +And the closed loop system is computed below. +

    +
    +
    sys_iff = feedback(sys, Kiff, 'name', +1);
    +
    +
    + + +
    +

    iff_1dof_sensitivitiy.png +

    +

    Figure 5: Sensitivity to disturbance when IFF is applied on the 1dof system (png, pdf)

    +
    +
    +
    +
    + +
    +

    2.2 Control Design

    +
    +

    +Let’s load the undamped plant: +

    +
    +
    load('./active_damping_uniaxial/mat/plants.mat', 'G');
    +
    +
    + +

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

    + + +
    +

    iff_plant.png +

    +

    Figure 6: Transfer function from forces applied in the legs to force sensor (png, pdf)

    +
    + +

    +The controller for each pair of actuator/sensor is: +

    +
    +
    K_iff = -1000/s;
    +
    +
    + +

    +The corresponding loop gains are shown in figure 7. +

    + + +
    +

    iff_open_loop.png +

    +

    Figure 7: Loop Gain for the Integral Force Feedback (png, pdf)

    +
    +
    +
    + +
    +

    2.3 Identification of the damped plant

    +
    +

    +Let’s initialize the system prior to identification. +

    +
    +
    initializeReferences();
    +initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod('actuator', 'piezo');
    +initializeSample('mass', 50);
    +
    +
    + +

    +All the controllers are set to 0. +

    +
    +
    K = tf(zeros(6));
    +save('./mat/controllers.mat', 'K', '-append');
    +K_iff = -K_iff*eye(6);
    +save('./mat/controllers.mat', 'K_iff', '-append');
    +K_rmc = tf(zeros(6));
    +save('./mat/controllers.mat', 'K_rmc', '-append');
    +K_dvf = tf(zeros(6));
    +save('./mat/controllers.mat', 'K_dvf', '-append');
    +
    +
    + +

    +We identify the system dynamics now that the IFF controller is ON. +

    +
    +
    G_iff = identifyPlant();
    +
    +
    + +

    +And we save the damped plant for further analysis +

    +
    +
    save('./active_damping_uniaxial/mat/plants.mat', 'G_iff', '-append');
    +
    +
    +
    +
    + +
    +

    2.4 Sensitivity to disturbances

    +
    +

    +As shown on figure 8: +

    +
      +
    • The top platform of the nano-hexapod how behaves as a “free-mass”.
    • +
    • The transfer function from direct forces \(F_s\) to the relative displacement \(D\) is equivalent to the one of an isolated mass.
    • +
    • The transfer function from ground motion \(D_g\) to the relative displacement \(D\) tends to the transfer function from \(D_g\) to the displacement of the granite (the sample is being isolated thanks to IFF). +However, as the goal is to make the relative displacement \(D\) as small as possible (e.g. to make the sample motion follows the granite motion), this is not a good thing.
    • +
    + + +
    +

    sensitivity_dist_iff.png +

    +

    Figure 8: Sensitivity to disturbance once the IFF controller is applied to the system (png, pdf)

    +
    + +
    +

    +The order of the models are very high and thus the plots may be wrong. +For instance, the plots are not the same when using minreal. +

    + +
    + + +
    +

    sensitivity_dist_stages_iff.png +

    +

    Figure 9: Sensitivity to force disturbances in various stages when IFF is applied (png, pdf)

    +
    +
    +
    + +
    +

    2.5 Damped Plant

    +
    +

    +Now, look at the new damped plant to control. +

    + +

    +It damps the plant (resonance of the nano hexapod as well as other resonances) as shown in figure 10. +

    + + +
    +

    plant_iff_damped.png +

    +

    Figure 10: Damped Plant after IFF is applied (png, pdf)

    +
    + +

    +However, it increases coupling at low frequency (figure 11). +

    + +
    +

    plant_iff_coupling.png +

    +

    Figure 11: Coupling induced by IFF (png, pdf)

    +
    +
    +
    + +
    +

    2.6 Conclusion

    +
    +
    +

    +Integral Force Feedback: +

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

    3 Relative Motion Control

    +
    +

    + +

    +
    +

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

    + +
    +

    +In the Relative Motion Control (RMC), a derivative feedback is applied between the measured actuator displacement to the actuator force input. +

    +
    + +
    +

    3.1 One degree-of-freedom example

    +
    +

    + +

    +
    +
    +

    3.1.1 Equations

    +
    + +
    +

    rmc_1dof.png +

    +

    Figure 12: Relative Motion Control applied to a 1dof system

    +
    + +

    +The dynamic of the system is: +

    +\begin{equation} + ms^2x = F_d - kx - csx + kw + csw + F +\end{equation} +

    +In terms of the stage deformation \(d = x - w\): +

    +\begin{equation} + (ms^2 + cs + k) d = -ms^2 w + F_d + F +\end{equation} +

    +The relative motion control law is: +

    +\begin{equation} + K = -g s +\end{equation} +

    +Thus, the applied force is: +

    +\begin{equation} + F = -g s d +\end{equation} +

    +And the new dynamics will be: +

    +\begin{equation} + d = w \frac{-ms^2}{ms^2 + (c + g)s + k} + F_d \frac{1}{ms^2 + (c + g)s + k} + F \frac{1}{ms^2 + (c + g)s + k} +\end{equation} + +

    +And thus damping is added. +

    + +

    +If critical damping is wanted: +

    +\begin{equation} + \xi = \frac{1}{2}\frac{c + g}{\sqrt{km}} = \frac{1}{2} +\end{equation} +

    +This corresponds to a gain: +

    +\begin{equation} + g = \sqrt{km} - c +\end{equation} +
    +
    + +
    +

    3.1.2 Matlab Example

    +
    +

    +Let define the system parameters. +

    +
    +
    m = 50; % [kg]
    +k = 1e6; % [N/m]
    +c = 1e3; % [N/(m/s)]
    +
    +
    + +

    +The state space model of the system is defined below. +

    +
    +
    A = [-c/m -k/m;
    +     1     0];
    +
    +B = [1/m 1/m -1;
    +     0   0    0];
    +
    +C = [ 0  1;
    +     -c -k];
    +
    +D = [0 0 0;
    +     1 0 0];
    +
    +sys = ss(A, B, C, D);
    +sys.InputName = {'F', 'Fd', 'wddot'};
    +sys.OutputName = {'d', 'Fm'};
    +sys.StateName = {'ddot', 'd'};
    +
    +
    + +

    +The controller \(K_\text{RMC}\) is: +

    +
    +
    Krmc = -(sqrt(k*m)-c)*s;
    +Krmc.InputName = {'d'};
    +Krmc.OutputName = {'F'};
    +
    +
    + +

    +And the closed loop system is computed below. +

    +
    +
    sys_rmc = feedback(sys, Krmc, 'name', +1);
    +
    +
    + + +
    +

    rmc_1dof_sensitivitiy.png +

    +

    Figure 13: Sensitivity to disturbance when RMC is applied on the 1dof system (png, pdf)

    +
    +
    +
    +
    + +
    +

    3.2 Control Design

    +
    +

    +Let’s load the undamped plant: +

    +
    +
    load('./active_damping_uniaxial/mat/plants.mat', 'G');
    +
    +
    + +

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

    + + +
    +

    rmc_plant.png +

    +

    Figure 14: Transfer function from forces applied in the legs to leg displacement sensor (png, pdf)

    +
    + +

    +The Relative Motion Controller is defined below. +A Low pass Filter is added to make the controller transfer function proper. +

    +
    +
    K_rmc = s*50000/(1 + s/2/pi/10000);
    +
    +
    + +

    +The obtained loop gains are shown in figure 15. +

    + + +
    +

    rmc_open_loop.png +

    +

    Figure 15: Loop Gain for the Integral Force Feedback (png, pdf)

    +
    +
    +
    + +
    +

    3.3 Identification of the damped plant

    +
    +

    +Let’s initialize the system prior to identification. +

    +
    +
    initializeReferences();
    +initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod('actuator', 'piezo');
    +initializeSample('mass', 50);
    +
    +
    + +

    +And initialize the controllers. +

    +
    +
    K = tf(zeros(6));
    +save('./mat/controllers.mat', 'K', '-append');
    +K_iff = tf(zeros(6));
    +save('./mat/controllers.mat', 'K_iff', '-append');
    +K_rmc = -K_rmc*eye(6);
    +save('./mat/controllers.mat', 'K_rmc', '-append');
    +K_dvf = tf(zeros(6));
    +save('./mat/controllers.mat', 'K_dvf', '-append');
    +
    +
    + +

    +We identify the system dynamics now that the RMC controller is ON. +

    +
    +
    G_rmc = identifyPlant();
    +
    +
    + +

    +And we save the damped plant for further analysis. +

    +
    +
    save('./active_damping_uniaxial/mat/plants.mat', 'G_rmc', '-append');
    +
    +
    +
    +
    + +
    +

    3.4 Sensitivity to disturbances

    +
    +

    +As shown in figure 16, RMC control succeed in lowering the sensitivity to disturbances near resonance of the system. +

    + + +
    +

    sensitivity_dist_rmc.png +

    +

    Figure 16: Sensitivity to disturbance once the RMC controller is applied to the system (png, pdf)

    +
    + + +
    +

    sensitivity_dist_stages_rmc.png +

    +

    Figure 17: Sensitivity to force disturbances in various stages when RMC is applied (png, pdf)

    +
    +
    +
    + +
    +

    3.5 Damped Plant

    +
    + +
    +

    plant_rmc_damped.png +

    +

    Figure 18: Damped Plant after RMC is applied (png, pdf)

    +
    +
    +
    + +
    +

    3.6 Conclusion

    +
    +
    +

    +Relative Motion Control: +

    +
      +
    • +
    + +
    +
    +
    +
    + +
    +

    4 Direct Velocity Feedback

    +
    +

    + +

    +
    +

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

    + +
    +

    +In the Relative Motion Control (RMC), a feedback is applied between the measured velocity of the platform to the actuator force input. +

    +
    + +
    +

    4.1 One degree-of-freedom example

    +
    +

    + +

    +
    +
    +

    4.1.1 Equations

    +
    + +
    +

    dvf_1dof.png +

    +

    Figure 19: Direct Velocity Feedback applied to a 1dof system

    +
    + +

    +The dynamic of the system is: +

    +\begin{equation} + ms^2x = F_d - kx - csx + kw + csw + F +\end{equation} +

    +In terms of the stage deformation \(d = x - w\): +

    +\begin{equation} + (ms^2 + cs + k) d = -ms^2 w + F_d + F +\end{equation} +

    +The direct velocity feedback law shown in figure 19 is: +

    +\begin{equation} + K = -g +\end{equation} +

    +Thus, the applied force is: +

    +\begin{equation} + F = -g \dot{x} +\end{equation} +

    +And the new dynamics will be: +

    +\begin{equation} + d = w \frac{-ms^2 - gs}{ms^2 + (c + g)s + k} + F_d \frac{1}{ms^2 + (c + g)s + k} + F \frac{1}{ms^2 + (c + g)s + k} +\end{equation} + +

    +And thus damping is added. +

    + +

    +If critical damping is wanted: +

    +\begin{equation} + \xi = \frac{1}{2}\frac{c + g}{\sqrt{km}} = \frac{1}{2} +\end{equation} +

    +This corresponds to a gain: +

    +\begin{equation} + g = \sqrt{km} - c +\end{equation} +
    +
    + +
    +

    4.1.2 Matlab Example

    +
    +

    +Let define the system parameters. +

    +
    +
    m = 50; % [kg]
    +k = 1e6; % [N/m]
    +c = 1e3; % [N/(m/s)]
    +
    +
    + +

    +The state space model of the system is defined below. +

    +
    +
    A = [-c/m -k/m;
    +     1     0];
    +
    +B = [1/m 1/m -1;
    +     0   0    0];
    +
    +C = [1 0;
    +     0 1;
    +     0 0];
    +
    +D = [0 0 0;
    +     0 0 0;
    +     0 0 1];
    +
    +sys = ss(A, B, C, D);
    +sys.InputName = {'F', 'Fd', 'wddot'};
    +sys.OutputName = {'ddot', 'd', 'wddot'};
    +sys.StateName = {'ddot', 'd'};
    +
    +
    + +

    +Because we need \(\dot{x}\) for feedback, we compute it from the outputs +

    +
    +
    G_xdot = [1, 0, 1/s;
    +          0, 1, 0];
    +G_xdot.InputName = {'ddot', 'd', 'wddot'};
    +G_xdot.OutputName = {'xdot', 'd'};
    +
    +
    + +

    +Finally, the system is described by sys as defined below. +

    +
    +
    sys = series(sys, G_xdot, [1 2 3], [1 2 3]);
    +
    +
    + +

    +The controller \(K_\text{DVF}\) is: +

    +
    +
    Kdvf = tf(-(sqrt(k*m)-c));
    +Kdvf.InputName = {'xdot'};
    +Kdvf.OutputName = {'F'};
    +
    +
    + +

    +And the closed loop system is computed below. +

    +
    +
    sys_dvf = feedback(sys, Kdvf, 'name', +1);
    +
    +
    + +

    +The obtained sensitivity to disturbances is shown in figure 20. +

    + +
    +

    dvf_1dof_sensitivitiy.png +

    +

    Figure 20: Sensitivity to disturbance when DVF is applied on the 1dof system (png, pdf)

    +
    +
    +
    +
    + +
    +

    4.2 Control Design

    +
    +

    +Let’s load the undamped plant: +

    +
    +
    load('./active_damping_uniaxial/mat/plants.mat', 'G');
    +
    +
    + +

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

    + + +
    +

    dvf_plant.png +

    +

    Figure 21: Transfer function from forces applied in the legs to leg velocity sensor (png, pdf)

    +
    + +

    +The controller is defined below and the obtained loop gain is shown in figure 22. +

    + +
    +
    K_dvf = tf(3e4);
    +
    +
    + + +
    +

    dvf_open_loop_gain.png +

    +

    Figure 22: Loop Gain for DVF (png, pdf)

    +
    +
    +
    + +
    +

    4.3 Identification of the damped plant

    +
    +

    +Let’s initialize the system prior to identification. +

    +
    +
    initializeReferences();
    +initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod('actuator', 'piezo');
    +initializeSample('mass', 50);
    +
    +
    + +

    +And initialize the controllers. +

    +
    +
    K = tf(zeros(6));
    +save('./mat/controllers.mat', 'K', '-append');
    +K_iff = tf(zeros(6));
    +save('./mat/controllers.mat', 'K_iff', '-append');
    +K_rmc = tf(zeros(6));
    +save('./mat/controllers.mat', 'K_rmc', '-append');
    +K_dvf = -K_dvf*eye(6);
    +save('./mat/controllers.mat', 'K_dvf', '-append');
    +
    +
    + +

    +We identify the system dynamics now that the RMC controller is ON. +

    +
    +
    G_dvf = identifyPlant();
    +
    +
    + +

    +And we save the damped plant for further analysis. +

    +
    +
    save('./active_damping_uniaxial/mat/plants.mat', 'G_dvf', '-append');
    +
    +
    +
    +
    + +
    +

    4.4 Sensitivity to disturbances

    +
    + +
    +

    sensitivity_dist_dvf.png +

    +

    Figure 23: Sensitivity to disturbance once the DVF controller is applied to the system (png, pdf)

    +
    + + + +
    +

    sensitivity_dist_stages_dvf.png +

    +

    Figure 24: Sensitivity to force disturbances in various stages when DVF is applied (png, pdf)

    +
    +
    +
    + +
    +

    4.5 Damped Plant

    +
    + +
    +

    plant_dvf_damped.png +

    +

    Figure 25: Damped Plant after DVF is applied (png, pdf)

    +
    +
    +
    + +
    +

    4.6 Conclusion

    +
    +
    +

    +Direct Velocity Feedback: +

    + +
    +
    +
    +
    + +
    +

    5 Comparison

    +
    +

    + +

    +
    +
    +

    5.1 Load the plants

    +
    +
    +
    load('./active_damping_uniaxial/mat/plants.mat', 'G', 'G_iff', 'G_rmc', 'G_dvf');
    +
    +
    +
    +
    + +
    +

    5.2 Sensitivity to Disturbance

    +
    + +
    +

    sensitivity_comp_ground_motion_z.png +

    +

    Figure 26: caption (png, pdf)

    +
    + + + +
    +

    sensitivity_comp_direct_forces_z.png +

    +

    Figure 27: caption (png, pdf)

    +
    + + +
    +

    sensitivity_comp_spindle_z.png +

    +

    Figure 28: caption (png, pdf)

    +
    + + +
    +

    sensitivity_comp_ty_z.png +

    +

    Figure 29: caption (png, pdf)

    +
    + + + +
    +

    sensitivity_comp_ty_x.png +

    +

    Figure 30: caption (png, pdf)

    +
    +
    +
    + +
    +

    5.3 Damped Plant

    +
    + +
    +

    plant_comp_damping_z.png +

    +

    Figure 31: Plant for the \(z\) direction for different active damping technique used (png, pdf)

    +
    + + +
    +

    plant_comp_damping_x.png +

    +

    Figure 32: Plant for the \(x\) direction for different active damping technique used (png, pdf)

    +
    + + +
    +

    plant_comp_damping_coupling.png +

    +

    Figure 33: Comparison of one off-diagonal plant for different damping technique applied (png, pdf)

    +
    +
    +
    +
    + +
    +

    6 Conclusion

    +
    +

    + +

    +
    +
    +
    +
    +

    Author: Dehaeze Thomas

    +

    Created: 2020-02-25 mar. 18:08

    +
    + + diff --git a/control/index.html b/docs/control.html similarity index 97% rename from control/index.html rename to docs/control.html index 1301dd2..b4ff7bb 100644 --- a/control/index.html +++ b/docs/control.html @@ -1,9 +1,11 @@ + + - + Control of the NASS @@ -205,7 +207,7 @@ @licstart The following is the entire license notice for the JavaScript code in this tag. -Copyright (C) 2012-2019 Free Software Foundation, Inc. +Copyright (C) 2012-2020 Free Software Foundation, Inc. The JavaScript code in this tag is free software: you can redistribute it and/or modify it under the terms of the GNU @@ -257,8 +259,7 @@ for the JavaScript code in this tag.

    Author: Dehaeze Thomas

    -

    Created: 2019-10-08 mar. 11:13

    -

    Validate

    +

    Created: 2020-02-25 mar. 18:08

    diff --git a/css/htmlize.css b/docs/css/htmlize.css similarity index 100% rename from css/htmlize.css rename to docs/css/htmlize.css diff --git a/css/readtheorg.css b/docs/css/readtheorg.css similarity index 100% rename from css/readtheorg.css rename to docs/css/readtheorg.css diff --git a/disturbances/index.html b/docs/disturbances.html similarity index 93% rename from disturbances/index.html rename to docs/disturbances.html index e17037c..777050f 100644 --- a/disturbances/index.html +++ b/docs/disturbances.html @@ -1,10 +1,11 @@ + - + Identification of the disturbances @@ -285,7 +286,7 @@ The goal here is to extract the Power Spectral Density of the sources of perturb

    -The sources of perturbations are (schematically shown in figure 1): +The sources of perturbations are (schematically shown in figure 1):

    • \(D_w\): Ground Motion
    • @@ -294,12 +295,12 @@ These forces can be due to imperfect guiding for instance.

    -Because we cannot measure directly the perturbation forces, we have the measure the effect of those perturbations on the system (in terms of velocity for instance using geophones, \(D\) on figure 1) and then, using a model, compute the forces that induced such velocity. +Because we cannot measure directly the perturbation forces, we have the measure the effect of those perturbations on the system (in terms of velocity for instance using geophones, \(D\) on figure 1) and then, using a model, compute the forces that induced such velocity.

    -
    +

    uniaxial-model-micro-station.png

    Figure 1: Schematic of the Micro Station and the sources of disturbance

    @@ -310,19 +311,19 @@ Because we cannot measure directly the perturbation forces, we have the measure This file is divided in the following sections:

      -
    • Section 1: the simscape model used here is presented
    • -
    • Section 2: transfer functions from the disturbance forces to the relative velocity of the hexapod with respect to the granite are computed using the Simscape Model representing the experimental setup
    • -
    • Section 3: the bode plot of those transfer functions are shown
    • -
    • Section 4: the measured PSD of the effect of the disturbances are shown
    • -
    • Section 5: from the model and the measured PSD, the PSD of the disturbance forces are computed
    • -
    • Section 6: with the computed PSD, the noise budget of the system is done
    • +
    • Section 1: the simscape model used here is presented
    • +
    • Section 2: transfer functions from the disturbance forces to the relative velocity of the hexapod with respect to the granite are computed using the Simscape Model representing the experimental setup
    • +
    • Section 3: the bode plot of those transfer functions are shown
    • +
    • Section 4: the measured PSD of the effect of the disturbances are shown
    • +
    • Section 5: from the model and the measured PSD, the PSD of the disturbance forces are computed
    • +
    • Section 6: with the computed PSD, the noise budget of the system is done
    -
    +

    1 Simscape Model

    - +

    @@ -363,11 +364,11 @@ initializeSample('type', +

    2 Identification

    - + The transfer functions from the disturbance forces to the relative velocity of the hexapod with respect to the granite are computed using the Simscape Model representing the experimental setup with the code below.

    @@ -416,15 +417,15 @@ G.OutputName = {'Vm'};
    -
    +

    3 Sensitivity to Disturbances

    - +

    -
    +

    sensitivity_dist_gm.png

    Figure 2: Sensitivity to Ground Motion (png, pdf)

    @@ -432,7 +433,7 @@ G.OutputName = {'Vm'}; -
    +

    sensitivity_dist_fty.png

    Figure 3: Sensitivity to vertical forces applied by the Ty stage (png, pdf)

    @@ -440,7 +441,7 @@ G.OutputName = {'Vm'}; -
    +

    sensitivity_dist_frz.png

    Figure 4: Sensitivity to vertical forces applied by the Rz stage (png, pdf)

    @@ -448,11 +449,11 @@ G.OutputName = {'Vm'};
    -
    +

    4 Power Spectral Density of the effect of the disturbances

    - + The PSD of the relative velocity between the hexapod and the marble in \([(m/s)^2/Hz]\) are loaded for the following sources of disturbance:

      @@ -481,15 +482,15 @@ We now compute the relative velocity between the hexapod and the granite due to

    -The Power Spectral Density of the relative motion/velocity of the hexapod with respect to the granite are shown in figures 5 and 6. +The Power Spectral Density of the relative motion/velocity of the hexapod with respect to the granite are shown in figures 5 and 6.

    -The Cumulative Amplitude Spectrum of the relative motion is shown in figure 7. +The Cumulative Amplitude Spectrum of the relative motion is shown in figure 7.

    -
    +

    dist_effect_relative_velocity.png

    Figure 5: Amplitude Spectral Density of the relative velocity of the hexapod with respect to the granite due to different sources of perturbation (png, pdf)

    @@ -497,14 +498,14 @@ The Cumulative Amplitude Spectrum of the relative motion is shown in figure + -
    +

    dist_effect_relative_motion_cas.png

    Figure 7: Cumulative Amplitude Spectrum of the relative motion due to different sources of perturbation (png, pdf)

    @@ -512,15 +513,15 @@ The Cumulative Amplitude Spectrum of the relative motion is shown in figure
    -
    +

    5 Compute the Power Spectral Density of the disturbance force

    - +

    -Now, from the extracted transfer functions from the disturbance force to the relative motion of the hexapod with respect to the granite (section 3) and from the measured PSD of the relative motion (section 4), we can compute the PSD of the disturbance force. +Now, from the extracted transfer functions from the disturbance force to the relative motion of the hexapod with respect to the granite (section 3) and from the measured PSD of the relative motion (section 4), we can compute the PSD of the disturbance force.

    @@ -530,7 +531,7 @@ tyz.psd_f = tyz.pxz_ty_r./abs(squeeze(freqresp(G(<
    -
    +

    dist_force_psd.png

    Figure 8: Amplitude Spectral Density of the disturbance force (png, pdf)

    @@ -538,11 +539,11 @@ tyz.psd_f = tyz.pxz_ty_r./abs(squeeze(freqresp(G(<
    -
    +

    6 Noise Budget

    - +

    @@ -551,7 +552,7 @@ We should verify that this is coherent with the measurements.

    -
    +

    psd_effect_dist_verif.png

    Figure 9: Computed Effect of the disturbances on the relative displacement hexapod/granite (png, pdf)

    @@ -559,7 +560,7 @@ We should verify that this is coherent with the measurements. -
    +

    cas_computed_relative_displacement.png

    Figure 10: CAS of the total Relative Displacement due to all considered sources of perturbation (png, pdf)

    @@ -567,7 +568,7 @@ We should verify that this is coherent with the measurements.
    -
    +

    7 Save

    @@ -591,7 +592,7 @@ save('./disturbances/mat/dist_psd.mat',

    Author: Dehaeze Thomas

    -

    Created: 2020-02-18 mar. 17:44

    +

    Created: 2020-02-25 mar. 18:08

    diff --git a/docs/experiments.html b/docs/experiments.html new file mode 100644 index 0000000..015bdba --- /dev/null +++ b/docs/experiments.html @@ -0,0 +1,801 @@ + + + + + + + + + +Tomography Experiment + + + + + + + + + + + + + +
    + UP + | + HOME +
    +

    Tomography Experiment

    + + +

    +The goal here is to simulate some scientific experiments with the tuned Simscape model when no control is applied to the nano-hexapod. +

    + +

    +This has several goals: +

    +
      +
    • Validate the model
    • +
    • Estimate the expected error motion for the experiments
    • +
    • Estimate the stroke that we may need for the nano-hexapod
    • +
    + +

    +The document in organized as follow: +

    +
      +
    • In section 1 the Simscape model is initialized
    • +
    • In section 2 a tomography experiment is performed where the sample is aligned with the rotation axis. No disturbance is included
    • +
    • In section 3, the same is done but with disturbance included
    • +
    • In section 4 the micro-hexapod translate the sample such that its center of mass is no longer aligned with the rotation axis. No disturbance is included
    • +
    • In section 5, scans with the translation stage are simulated with no perturbation included
    • +
    + +
    +

    1 Simscape Model

    +
    +

    + +

    + +
    +
    open('nass_model.slx');
    +
    +
    + +

    +We load the shared simulink configuration and we set the StopTime. +

    +
    +
    load('mat/conf_simulink.mat');
    +set_param(conf_simulink, 'StopTime', '5');
    +
    +
    + +

    +We first initialize all the stages. +

    +
    +
    initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod('actuator', 'piezo');
    +initializeSample('mass', 1);
    +
    +
    + +

    +We initialize the reference path for all the stages. +All stage is set to its zero position except the Spindle which is rotating at 60rpm. +

    +
    +
    initializeReferences('Rz_type', 'rotating', 'Rz_period', 1);
    +
    +
    +
    +
    + +
    +

    2 Tomography Experiment with no disturbances

    +
    +

    + +

    +
    +
    +

    2.1 Simulation Setup

    +
    +

    +And we initialize the disturbances to be equal to zero. +

    +
    +
    initializeDisturbances(...
    +    'Dwx', false, ... % Ground Motion - X direction
    +    'Dwy', false, ... % Ground Motion - Y direction
    +    'Dwz', false, ... % Ground Motion - Z direction
    +    'Fty_x', false, ... % Translation Stage - X direction
    +    'Fty_z', false, ... % Translation Stage - Z direction
    +    'Frz_z', false  ... % Spindle - Z direction
    +    );
    +
    +
    + +

    +We simulate the model. +

    +
    +
    sim('nass_model');
    +
    +
    + +

    +And we save the obtained data. +

    +
    +
    tomo_align_no_dist = struct('t', t, 'MTr', MTr);
    +save('experiment_tomography/mat/experiment.mat', 'tomo_align_no_dist', '-append');
    +
    +
    +
    +
    + +
    +

    2.2 Analysis

    +
    +
    +
    load('experiment_tomography/mat/experiment.mat', 'tomo_align_no_dist');
    +t = tomo_align_no_dist.t;
    +MTr = tomo_align_no_dist.MTr;
    +
    +
    + +
    +
    Edx = squeeze(MTr(1, 4, :));
    +Edy = squeeze(MTr(2, 4, :));
    +Edz = squeeze(MTr(3, 4, :));
    +% The angles obtained are u-v-w Euler angles (rotations in the moving frame)
    +Ery = atan2( squeeze(MTr(1, 3, :)),           squeeze(sqrt(MTr(1, 1, :).^2 + MTr(1, 2, :).^2)));
    +Erx = atan2(-squeeze(MTr(2, 3, :))./cos(Ery), squeeze(MTr(3, 3, :))./cos(Ery));
    +Erz = atan2(-squeeze(MTr(1, 2, :))./cos(Ery), squeeze(MTr(1, 1, :))./cos(Ery));
    +
    +
    + + +
    +

    exp_tomo_without_dist_trans.png +

    +

    Figure 1: X-Y-Z translation of the sample w.r.t. granite when performing tomography experiment with no disturbances (png, pdf)

    +
    + + +
    +

    exp_tomo_without_dist_rot.png +

    +

    Figure 2: X-Y-Z rotations of the sample w.r.t. granite when performing tomography experiment with no disturbances (png, pdf)

    +
    +
    +
    + +
    +

    2.3 Conclusion

    +
    +
    +

    +When everything is aligned, the resulting error motion is very small (nm range) and is quite negligible with respect to the error when disturbances are included. +This residual error motion probably comes from a small misalignment somewhere. +

    + +
    +
    +
    +
    + +
    +

    3 Tomography Experiment with included perturbations

    +
    +

    + +

    +
    +
    +

    3.1 Simulation Setup

    +
    +

    +We now activate the disturbances. +

    +
    +
    initializeDisturbances(...
    +    'Dwx', true, ... % Ground Motion - X direction
    +    'Dwy', true, ... % Ground Motion - Y direction
    +    'Dwz', true, ... % Ground Motion - Z direction
    +    'Fty_x', true, ... % Translation Stage - X direction
    +    'Fty_z', true, ... % Translation Stage - Z direction
    +    'Frz_z', true  ... % Spindle - Z direction
    +    );
    +
    +
    + +

    +We simulate the model. +

    +
    +
    sim('nass_model');
    +
    +
    + +

    +And we save the obtained data. +

    +
    +
    tomo_align_dist = struct('t', t, 'MTr', MTr);
    +save('experiment_tomography/mat/experiment.mat', 'tomo_align_dist', '-append');
    +
    +
    +
    +
    + +
    +

    3.2 Analysis

    +
    +
    +
    load('experiment_tomography/mat/experiment.mat', 'tomo_align_dist');
    +t = tomo_align_dist.t;
    +MTr = tomo_align_dist.MTr;
    +
    +
    + +
    +
    Edx = squeeze(MTr(1, 4, :));
    +Edy = squeeze(MTr(2, 4, :));
    +Edz = squeeze(MTr(3, 4, :));
    +% The angles obtained are u-v-w Euler angles (rotations in the moving frame)
    +Ery = atan2( squeeze(MTr(1, 3, :)),           squeeze(sqrt(MTr(1, 1, :).^2 + MTr(1, 2, :).^2)));
    +Erx = atan2(-squeeze(MTr(2, 3, :))./cos(Ery), squeeze(MTr(3, 3, :))./cos(Ery));
    +Erz = atan2(-squeeze(MTr(1, 2, :))./cos(Ery), squeeze(MTr(1, 1, :))./cos(Ery));
    +
    +
    + + +
    +

    exp_tomo_dist_trans.png +

    +

    Figure 3: X-Y-Z translation of the sample w.r.t. the granite when performing tomography experiment with disturbances (png, pdf)

    +
    + + +
    +

    exp_tomo_dist_rot.png +

    +

    Figure 4: X-Y-Z rotations of the sample w.r.t. the granite when performing tomography experiment with disturbances (png, pdf)

    +
    +
    +
    + +
    +

    3.3 Conclusion

    +
    +
    +

    +Error motion is what expected from the disturbance measurements. +

    + +
    +
    +
    +
    + +
    +

    4 Tomography when the micro-hexapod is not centered

    +
    +

    + +

    +
    +
    +

    4.1 Simulation Setup

    +
    +

    +We first set the wanted translation of the Micro Hexapod. +

    +
    +
    P_micro_hexapod = [0.01; 0; 0]; % [m]
    +
    +
    + +

    +We initialize the reference path. +

    +
    +
    initializeReferences('Dh_pos', [P_micro_hexapod; 0; 0; 0], 'Rz_type', 'rotating', 'Rz_period', 1);
    +
    +
    + +

    +We initialize the stages. +

    +
    +
    initializeMicroHexapod('AP', P_micro_hexapod);
    +
    +
    + +

    +And we initialize the disturbances to zero. +

    +
    +
    initializeDisturbances(...
    +    'Dwx', false, ... % Ground Motion - X direction
    +    'Dwy', false, ... % Ground Motion - Y direction
    +    'Dwz', false, ... % Ground Motion - Z direction
    +    'Fty_x', false, ... % Translation Stage - X direction
    +    'Fty_z', false, ... % Translation Stage - Z direction
    +    'Frz_z', false  ... % Spindle - Z direction
    +    );
    +
    +
    + +

    +We simulate the model. +

    +
    +
    sim('nass_model');
    +
    +
    + +

    +And we save the obtained data. +

    +
    +
    tomo_not_align = struct('t', t, 'MTr', MTr);
    +save('experiment_tomography/mat/experiment.mat', 'tomo_not_align', '-append');
    +
    +
    +
    +
    + +
    +

    4.2 Analysis

    +
    +
    +
    load('experiment_tomography/mat/experiment.mat', 'tomo_not_align');
    +t = tomo_not_align.t;
    +MTr = tomo_not_align.MTr;
    +
    +
    + +
    +
    Edx = squeeze(MTr(1, 4, :));
    +Edy = squeeze(MTr(2, 4, :));
    +Edz = squeeze(MTr(3, 4, :));
    +% The angles obtained are u-v-w Euler angles (rotations in the moving frame)
    +Ery = atan2( squeeze(MTr(1, 3, :)),           squeeze(sqrt(MTr(1, 1, :).^2 + MTr(1, 2, :).^2)));
    +Erx = atan2(-squeeze(MTr(2, 3, :))./cos(Ery), squeeze(MTr(3, 3, :))./cos(Ery));
    +Erz = atan2(-squeeze(MTr(1, 2, :))./cos(Ery), squeeze(MTr(1, 1, :))./cos(Ery));
    +
    +
    + + +
    +

    exp_tomo_offset_trans.png +

    +

    Figure 5: X-Y-Z translation of the sample w.r.t. granite when performing tomography experiment with no disturbances (png, pdf)

    +
    + + +
    +

    exp_tomo_offset_rot.png +

    +

    Figure 6: X-Y-Z rotations of the sample w.r.t. granite when performing tomography experiment with no disturbances (png, pdf)

    +
    +
    +
    + +
    +

    4.3 Conclusion

    +
    +
    +

    +The main motions are translations in the X direction of the mobile platform (corresponds to the eccentricity of the micro-hexapod) and rotations along the rotating Y axis. +

    + +
    +
    +
    +
    + +
    +

    5 Raster Scans with the translation stage

    +
    +

    + +

    +
    +
    +

    5.1 Simulation Setup

    +
    +

    +We set the reference path. +

    +
    +
    initializeReferences('Dy_type', 'triangular', 'Dy_amplitude', 10e-3, 'Dy_period', 1);
    +
    +
    + +

    +We initialize the stages. +

    +
    +
    initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod('actuator', 'piezo');
    +initializeSample('mass', 1);
    +
    +
    + +

    +And we initialize the disturbances to zero. +

    +
    +
    initializeDisturbances(...
    +    'Dwx', false, ... % Ground Motion - X direction
    +    'Dwy', false, ... % Ground Motion - Y direction
    +    'Dwz', false, ... % Ground Motion - Z direction
    +    'Fty_x', false, ... % Translation Stage - X direction
    +    'Fty_z', false, ... % Translation Stage - Z direction
    +    'Frz_z', false  ... % Spindle - Z direction
    +    );
    +
    +
    + +

    +We simulate the model. +

    +
    +
    sim('nass_model');
    +
    +
    + +

    +And we save the obtained data. +

    +
    +
    ty_scan = struct('t', t, 'MTr', MTr);
    +save('experiment_tomography/mat/experiment.mat', 'ty_scan', '-append');
    +
    +
    +
    +
    + +
    +

    5.2 Analysis

    +
    +
    +
    load('experiment_tomography/mat/experiment.mat', 'ty_scan');
    +t = ty_scan.t;
    +MTr = ty_scan.MTr;
    +
    +
    + +
    +
    Edx = squeeze(MTr(1, 4, :));
    +Edy = squeeze(MTr(2, 4, :));
    +Edz = squeeze(MTr(3, 4, :));
    +% The angles obtained are u-v-w Euler angles (rotations in the moving frame)
    +Ery = atan2( squeeze(MTr(1, 3, :)),           squeeze(sqrt(MTr(1, 1, :).^2 + MTr(1, 2, :).^2)));
    +Erx = atan2(-squeeze(MTr(2, 3, :))./cos(Ery), squeeze(MTr(3, 3, :))./cos(Ery));
    +Erz = atan2(-squeeze(MTr(1, 2, :))./cos(Ery), squeeze(MTr(1, 1, :))./cos(Ery));
    +
    +
    + + +
    +

    exp_ty_scan_trans.png +

    +

    Figure 7: X-Y-Z translation of the sample w.r.t. granite when performing tomography experiment with no disturbances (png, pdf)

    +
    + + +
    +

    exp_ty_scan_rot.png +

    +

    Figure 8: X-Y-Z rotations of the sample w.r.t. granite when performing tomography experiment with no disturbances (png, pdf)

    +
    +
    +
    + +
    +

    5.3 Conclusion

    +
    +
    +

    +This is logic that the main error moving is translation along the Y axis and rotation along the X axis. +In order to reduce the errors, we can make a smoother reference path for the translation stage. +

    + +
    +
    +
    +
    +
    +
    +

    Author: Dehaeze Thomas

    +

    Created: 2020-02-25 mar. 18:08

    +
    + + diff --git a/figs/G_x_mass.pdf b/docs/figs/G_x_mass.pdf similarity index 100% rename from figs/G_x_mass.pdf rename to docs/figs/G_x_mass.pdf diff --git a/figs/G_x_mass_paper.pdf b/docs/figs/G_x_mass_paper.pdf similarity index 100% rename from figs/G_x_mass_paper.pdf rename to docs/figs/G_x_mass_paper.pdf diff --git a/figs/G_xyz.pdf b/docs/figs/G_xyz.pdf similarity index 100% rename from figs/G_xyz.pdf rename to docs/figs/G_xyz.pdf diff --git a/figs/G_xyz_1.pdf b/docs/figs/G_xyz_1.pdf similarity index 100% rename from figs/G_xyz_1.pdf rename to docs/figs/G_xyz_1.pdf diff --git a/figs/G_xyz_20.pdf b/docs/figs/G_xyz_20.pdf similarity index 100% rename from figs/G_xyz_20.pdf rename to docs/figs/G_xyz_20.pdf diff --git a/figs/G_y_mass.pdf b/docs/figs/G_y_mass.pdf similarity index 100% rename from figs/G_y_mass.pdf rename to docs/figs/G_y_mass.pdf diff --git a/figs/G_z_mass.pdf b/docs/figs/G_z_mass.pdf similarity index 100% rename from figs/G_z_mass.pdf rename to docs/figs/G_z_mass.pdf diff --git a/figs/act_damp_tomo_exp_comp_cps_rot.pdf b/docs/figs/act_damp_tomo_exp_comp_cps_rot.pdf similarity index 100% rename from figs/act_damp_tomo_exp_comp_cps_rot.pdf rename to docs/figs/act_damp_tomo_exp_comp_cps_rot.pdf diff --git a/figs/act_damp_tomo_exp_comp_cps_rot.png b/docs/figs/act_damp_tomo_exp_comp_cps_rot.png similarity index 100% rename from figs/act_damp_tomo_exp_comp_cps_rot.png rename to docs/figs/act_damp_tomo_exp_comp_cps_rot.png diff --git a/figs/act_damp_tomo_exp_comp_cps_trans.pdf b/docs/figs/act_damp_tomo_exp_comp_cps_trans.pdf similarity index 100% rename from figs/act_damp_tomo_exp_comp_cps_trans.pdf rename to docs/figs/act_damp_tomo_exp_comp_cps_trans.pdf diff --git a/figs/act_damp_tomo_exp_comp_cps_trans.png b/docs/figs/act_damp_tomo_exp_comp_cps_trans.png similarity index 100% rename from figs/act_damp_tomo_exp_comp_cps_trans.png rename to docs/figs/act_damp_tomo_exp_comp_cps_trans.png diff --git a/figs/act_damp_tomo_exp_comp_psd_rot.pdf b/docs/figs/act_damp_tomo_exp_comp_psd_rot.pdf similarity index 100% rename from figs/act_damp_tomo_exp_comp_psd_rot.pdf rename to docs/figs/act_damp_tomo_exp_comp_psd_rot.pdf diff --git a/figs/act_damp_tomo_exp_comp_psd_rot.png b/docs/figs/act_damp_tomo_exp_comp_psd_rot.png similarity index 100% rename from figs/act_damp_tomo_exp_comp_psd_rot.png rename to docs/figs/act_damp_tomo_exp_comp_psd_rot.png diff --git a/figs/act_damp_tomo_exp_comp_psd_trans.pdf b/docs/figs/act_damp_tomo_exp_comp_psd_trans.pdf similarity index 100% rename from figs/act_damp_tomo_exp_comp_psd_trans.pdf rename to docs/figs/act_damp_tomo_exp_comp_psd_trans.pdf diff --git a/figs/act_damp_tomo_exp_comp_psd_trans.png b/docs/figs/act_damp_tomo_exp_comp_psd_trans.png similarity index 100% rename from figs/act_damp_tomo_exp_comp_psd_trans.png rename to docs/figs/act_damp_tomo_exp_comp_psd_trans.png diff --git a/figs/act_damp_variability_dvf_sample_mass.pdf b/docs/figs/act_damp_variability_dvf_sample_mass.pdf similarity index 100% rename from figs/act_damp_variability_dvf_sample_mass.pdf rename to docs/figs/act_damp_variability_dvf_sample_mass.pdf diff --git a/figs/act_damp_variability_dvf_sample_mass.png b/docs/figs/act_damp_variability_dvf_sample_mass.png similarity index 100% rename from figs/act_damp_variability_dvf_sample_mass.png rename to docs/figs/act_damp_variability_dvf_sample_mass.png diff --git a/figs/act_damp_variability_dvf_spindle_angle.pdf b/docs/figs/act_damp_variability_dvf_spindle_angle.pdf similarity index 100% rename from figs/act_damp_variability_dvf_spindle_angle.pdf rename to docs/figs/act_damp_variability_dvf_spindle_angle.pdf diff --git a/figs/act_damp_variability_dvf_spindle_angle.png b/docs/figs/act_damp_variability_dvf_spindle_angle.png similarity index 100% rename from figs/act_damp_variability_dvf_spindle_angle.png rename to docs/figs/act_damp_variability_dvf_spindle_angle.png diff --git a/figs/act_damp_variability_dvf_spindle_speed.pdf b/docs/figs/act_damp_variability_dvf_spindle_speed.pdf similarity index 100% rename from figs/act_damp_variability_dvf_spindle_speed.pdf rename to docs/figs/act_damp_variability_dvf_spindle_speed.pdf diff --git a/figs/act_damp_variability_dvf_spindle_speed.png b/docs/figs/act_damp_variability_dvf_spindle_speed.png similarity index 100% rename from figs/act_damp_variability_dvf_spindle_speed.png rename to docs/figs/act_damp_variability_dvf_spindle_speed.png diff --git a/figs/act_damp_variability_dvf_spindle_speed_zoom.pdf b/docs/figs/act_damp_variability_dvf_spindle_speed_zoom.pdf similarity index 100% rename from figs/act_damp_variability_dvf_spindle_speed_zoom.pdf rename to docs/figs/act_damp_variability_dvf_spindle_speed_zoom.pdf diff --git a/figs/act_damp_variability_dvf_spindle_speed_zoom.png b/docs/figs/act_damp_variability_dvf_spindle_speed_zoom.png similarity index 100% rename from figs/act_damp_variability_dvf_spindle_speed_zoom.png rename to docs/figs/act_damp_variability_dvf_spindle_speed_zoom.png diff --git a/figs/act_damp_variability_dvf_tilt_angle.pdf b/docs/figs/act_damp_variability_dvf_tilt_angle.pdf similarity index 100% rename from figs/act_damp_variability_dvf_tilt_angle.pdf rename to docs/figs/act_damp_variability_dvf_tilt_angle.pdf diff --git a/figs/act_damp_variability_dvf_tilt_angle.png b/docs/figs/act_damp_variability_dvf_tilt_angle.png similarity index 100% rename from figs/act_damp_variability_dvf_tilt_angle.png rename to docs/figs/act_damp_variability_dvf_tilt_angle.png diff --git a/figs/act_damp_variability_dvf_ty_scans.pdf b/docs/figs/act_damp_variability_dvf_ty_scans.pdf similarity index 100% rename from figs/act_damp_variability_dvf_ty_scans.pdf rename to docs/figs/act_damp_variability_dvf_ty_scans.pdf diff --git a/figs/act_damp_variability_dvf_ty_scans.png b/docs/figs/act_damp_variability_dvf_ty_scans.png similarity index 100% rename from figs/act_damp_variability_dvf_ty_scans.png rename to docs/figs/act_damp_variability_dvf_ty_scans.png diff --git a/figs/act_damp_variability_iff_sample_mass.pdf b/docs/figs/act_damp_variability_iff_sample_mass.pdf similarity index 100% rename from figs/act_damp_variability_iff_sample_mass.pdf rename to docs/figs/act_damp_variability_iff_sample_mass.pdf diff --git a/figs/act_damp_variability_iff_sample_mass.png b/docs/figs/act_damp_variability_iff_sample_mass.png similarity index 100% rename from figs/act_damp_variability_iff_sample_mass.png rename to docs/figs/act_damp_variability_iff_sample_mass.png diff --git a/figs/act_damp_variability_iff_spindle_angle.pdf b/docs/figs/act_damp_variability_iff_spindle_angle.pdf similarity index 100% rename from figs/act_damp_variability_iff_spindle_angle.pdf rename to docs/figs/act_damp_variability_iff_spindle_angle.pdf diff --git a/figs/act_damp_variability_iff_spindle_angle.png b/docs/figs/act_damp_variability_iff_spindle_angle.png similarity index 100% rename from figs/act_damp_variability_iff_spindle_angle.png rename to docs/figs/act_damp_variability_iff_spindle_angle.png diff --git a/figs/act_damp_variability_iff_spindle_speed.pdf b/docs/figs/act_damp_variability_iff_spindle_speed.pdf similarity index 100% rename from figs/act_damp_variability_iff_spindle_speed.pdf rename to docs/figs/act_damp_variability_iff_spindle_speed.pdf diff --git a/figs/act_damp_variability_iff_spindle_speed.png b/docs/figs/act_damp_variability_iff_spindle_speed.png similarity index 100% rename from figs/act_damp_variability_iff_spindle_speed.png rename to docs/figs/act_damp_variability_iff_spindle_speed.png diff --git a/figs/act_damp_variability_iff_spindle_speed_zoom.pdf b/docs/figs/act_damp_variability_iff_spindle_speed_zoom.pdf similarity index 100% rename from figs/act_damp_variability_iff_spindle_speed_zoom.pdf rename to docs/figs/act_damp_variability_iff_spindle_speed_zoom.pdf diff --git a/figs/act_damp_variability_iff_spindle_speed_zoom.png b/docs/figs/act_damp_variability_iff_spindle_speed_zoom.png similarity index 100% rename from figs/act_damp_variability_iff_spindle_speed_zoom.png rename to docs/figs/act_damp_variability_iff_spindle_speed_zoom.png diff --git a/figs/act_damp_variability_iff_tilt_angle.pdf b/docs/figs/act_damp_variability_iff_tilt_angle.pdf similarity index 100% rename from figs/act_damp_variability_iff_tilt_angle.pdf rename to docs/figs/act_damp_variability_iff_tilt_angle.pdf diff --git a/figs/act_damp_variability_iff_tilt_angle.png b/docs/figs/act_damp_variability_iff_tilt_angle.png similarity index 100% rename from figs/act_damp_variability_iff_tilt_angle.png rename to docs/figs/act_damp_variability_iff_tilt_angle.png diff --git a/figs/act_damp_variability_iff_ty_scans.pdf b/docs/figs/act_damp_variability_iff_ty_scans.pdf similarity index 100% rename from figs/act_damp_variability_iff_ty_scans.pdf rename to docs/figs/act_damp_variability_iff_ty_scans.pdf diff --git a/figs/act_damp_variability_iff_ty_scans.png b/docs/figs/act_damp_variability_iff_ty_scans.png similarity index 100% rename from figs/act_damp_variability_iff_ty_scans.png rename to docs/figs/act_damp_variability_iff_ty_scans.png diff --git a/figs/act_damp_variability_ine_sample_mass.pdf b/docs/figs/act_damp_variability_ine_sample_mass.pdf similarity index 100% rename from figs/act_damp_variability_ine_sample_mass.pdf rename to docs/figs/act_damp_variability_ine_sample_mass.pdf diff --git a/figs/act_damp_variability_ine_sample_mass.png b/docs/figs/act_damp_variability_ine_sample_mass.png similarity index 100% rename from figs/act_damp_variability_ine_sample_mass.png rename to docs/figs/act_damp_variability_ine_sample_mass.png diff --git a/figs/act_damp_variability_ine_spindle_angle.pdf b/docs/figs/act_damp_variability_ine_spindle_angle.pdf similarity index 100% rename from figs/act_damp_variability_ine_spindle_angle.pdf rename to docs/figs/act_damp_variability_ine_spindle_angle.pdf diff --git a/figs/act_damp_variability_ine_spindle_angle.png b/docs/figs/act_damp_variability_ine_spindle_angle.png similarity index 100% rename from figs/act_damp_variability_ine_spindle_angle.png rename to docs/figs/act_damp_variability_ine_spindle_angle.png diff --git a/figs/act_damp_variability_ine_spindle_speed.pdf b/docs/figs/act_damp_variability_ine_spindle_speed.pdf similarity index 100% rename from figs/act_damp_variability_ine_spindle_speed.pdf rename to docs/figs/act_damp_variability_ine_spindle_speed.pdf diff --git a/figs/act_damp_variability_ine_spindle_speed.png b/docs/figs/act_damp_variability_ine_spindle_speed.png similarity index 100% rename from figs/act_damp_variability_ine_spindle_speed.png rename to docs/figs/act_damp_variability_ine_spindle_speed.png diff --git a/figs/act_damp_variability_ine_spindle_speed_zoom.pdf b/docs/figs/act_damp_variability_ine_spindle_speed_zoom.pdf similarity index 100% rename from figs/act_damp_variability_ine_spindle_speed_zoom.pdf rename to docs/figs/act_damp_variability_ine_spindle_speed_zoom.pdf diff --git a/figs/act_damp_variability_ine_spindle_speed_zoom.png b/docs/figs/act_damp_variability_ine_spindle_speed_zoom.png similarity index 100% rename from figs/act_damp_variability_ine_spindle_speed_zoom.png rename to docs/figs/act_damp_variability_ine_spindle_speed_zoom.png diff --git a/figs/act_damp_variability_ine_tilt_angle.pdf b/docs/figs/act_damp_variability_ine_tilt_angle.pdf similarity index 100% rename from figs/act_damp_variability_ine_tilt_angle.pdf rename to docs/figs/act_damp_variability_ine_tilt_angle.pdf diff --git a/figs/act_damp_variability_ine_tilt_angle.png b/docs/figs/act_damp_variability_ine_tilt_angle.png similarity index 100% rename from figs/act_damp_variability_ine_tilt_angle.png rename to docs/figs/act_damp_variability_ine_tilt_angle.png diff --git a/figs/act_damp_variability_ine_ty_scans.pdf b/docs/figs/act_damp_variability_ine_ty_scans.pdf similarity index 100% rename from figs/act_damp_variability_ine_ty_scans.pdf rename to docs/figs/act_damp_variability_ine_ty_scans.pdf diff --git a/figs/act_damp_variability_ine_ty_scans.png b/docs/figs/act_damp_variability_ine_ty_scans.png similarity index 100% rename from figs/act_damp_variability_ine_ty_scans.png rename to docs/figs/act_damp_variability_ine_ty_scans.png diff --git a/figs/bushing_joint_transform.png b/docs/figs/bushing_joint_transform.png similarity index 100% rename from figs/bushing_joint_transform.png rename to docs/figs/bushing_joint_transform.png diff --git a/figs/campbell_diagram_spindle_rotation.pdf b/docs/figs/campbell_diagram_spindle_rotation.pdf similarity index 100% rename from figs/campbell_diagram_spindle_rotation.pdf rename to docs/figs/campbell_diagram_spindle_rotation.pdf diff --git a/figs/campbell_diagram_spindle_rotation.png b/docs/figs/campbell_diagram_spindle_rotation.png similarity index 100% rename from figs/campbell_diagram_spindle_rotation.png rename to docs/figs/campbell_diagram_spindle_rotation.png diff --git a/figs/cas_computed_relative_displacement.pdf b/docs/figs/cas_computed_relative_displacement.pdf similarity index 100% rename from figs/cas_computed_relative_displacement.pdf rename to docs/figs/cas_computed_relative_displacement.pdf diff --git a/figs/cas_computed_relative_displacement.png b/docs/figs/cas_computed_relative_displacement.png similarity index 100% rename from figs/cas_computed_relative_displacement.png rename to docs/figs/cas_computed_relative_displacement.png diff --git a/figs/cedrat-uniaxial-actuator.pdf b/docs/figs/cedrat-uniaxial-actuator.pdf similarity index 100% rename from figs/cedrat-uniaxial-actuator.pdf rename to docs/figs/cedrat-uniaxial-actuator.pdf diff --git a/figs/cedrat-uniaxial-actuator.png b/docs/figs/cedrat-uniaxial-actuator.png similarity index 100% rename from figs/cedrat-uniaxial-actuator.png rename to docs/figs/cedrat-uniaxial-actuator.png diff --git a/figs/comp_estimation_cas_disturbances.pdf b/docs/figs/comp_estimation_cas_disturbances.pdf similarity index 100% rename from figs/comp_estimation_cas_disturbances.pdf rename to docs/figs/comp_estimation_cas_disturbances.pdf diff --git a/figs/comp_estimation_cas_disturbances.png b/docs/figs/comp_estimation_cas_disturbances.png similarity index 100% rename from figs/comp_estimation_cas_disturbances.png rename to docs/figs/comp_estimation_cas_disturbances.png diff --git a/figs/control-schematic-nass.pdf b/docs/figs/control-schematic-nass.pdf similarity index 100% rename from figs/control-schematic-nass.pdf rename to docs/figs/control-schematic-nass.pdf diff --git a/figs/control-schematic-nass.png b/docs/figs/control-schematic-nass.png similarity index 100% rename from figs/control-schematic-nass.png rename to docs/figs/control-schematic-nass.png diff --git a/figs/dist_effect_relative_motion.pdf b/docs/figs/dist_effect_relative_motion.pdf similarity index 100% rename from figs/dist_effect_relative_motion.pdf rename to docs/figs/dist_effect_relative_motion.pdf diff --git a/figs/dist_effect_relative_motion.png b/docs/figs/dist_effect_relative_motion.png similarity index 100% rename from figs/dist_effect_relative_motion.png rename to docs/figs/dist_effect_relative_motion.png diff --git a/figs/dist_effect_relative_motion_cas.pdf b/docs/figs/dist_effect_relative_motion_cas.pdf similarity index 100% rename from figs/dist_effect_relative_motion_cas.pdf rename to docs/figs/dist_effect_relative_motion_cas.pdf diff --git a/figs/dist_effect_relative_motion_cas.png b/docs/figs/dist_effect_relative_motion_cas.png similarity index 100% rename from figs/dist_effect_relative_motion_cas.png rename to docs/figs/dist_effect_relative_motion_cas.png diff --git a/figs/dist_effect_relative_velocity.pdf b/docs/figs/dist_effect_relative_velocity.pdf similarity index 100% rename from figs/dist_effect_relative_velocity.pdf rename to docs/figs/dist_effect_relative_velocity.pdf diff --git a/figs/dist_effect_relative_velocity.png b/docs/figs/dist_effect_relative_velocity.png similarity index 100% rename from figs/dist_effect_relative_velocity.png rename to docs/figs/dist_effect_relative_velocity.png diff --git a/figs/dist_force_psd.pdf b/docs/figs/dist_force_psd.pdf similarity index 100% rename from figs/dist_force_psd.pdf rename to docs/figs/dist_force_psd.pdf diff --git a/figs/dist_force_psd.png b/docs/figs/dist_force_psd.png similarity index 100% rename from figs/dist_force_psd.png rename to docs/figs/dist_force_psd.png diff --git a/figs/dvf_1dof.pdf b/docs/figs/dvf_1dof.pdf similarity index 100% rename from figs/dvf_1dof.pdf rename to docs/figs/dvf_1dof.pdf diff --git a/figs/dvf_1dof.png b/docs/figs/dvf_1dof.png similarity index 100% rename from figs/dvf_1dof.png rename to docs/figs/dvf_1dof.png diff --git a/figs/dvf_1dof_sensitivitiy.pdf b/docs/figs/dvf_1dof_sensitivitiy.pdf similarity index 100% rename from figs/dvf_1dof_sensitivitiy.pdf rename to docs/figs/dvf_1dof_sensitivitiy.pdf diff --git a/figs/dvf_1dof_sensitivitiy.png b/docs/figs/dvf_1dof_sensitivitiy.png similarity index 100% rename from figs/dvf_1dof_sensitivitiy.png rename to docs/figs/dvf_1dof_sensitivitiy.png diff --git a/figs/dvf_open_loop.pdf b/docs/figs/dvf_open_loop.pdf similarity index 100% rename from figs/dvf_open_loop.pdf rename to docs/figs/dvf_open_loop.pdf diff --git a/figs/dvf_open_loop.png b/docs/figs/dvf_open_loop.png similarity index 100% rename from figs/dvf_open_loop.png rename to docs/figs/dvf_open_loop.png diff --git a/figs/dvf_open_loop_gain.pdf b/docs/figs/dvf_open_loop_gain.pdf similarity index 100% rename from figs/dvf_open_loop_gain.pdf rename to docs/figs/dvf_open_loop_gain.pdf diff --git a/figs/dvf_open_loop_gain.png b/docs/figs/dvf_open_loop_gain.png similarity index 100% rename from figs/dvf_open_loop_gain.png rename to docs/figs/dvf_open_loop_gain.png diff --git a/figs/dvf_plant.pdf b/docs/figs/dvf_plant.pdf similarity index 100% rename from figs/dvf_plant.pdf rename to docs/figs/dvf_plant.pdf diff --git a/figs/dvf_plant.png b/docs/figs/dvf_plant.png similarity index 100% rename from figs/dvf_plant.png rename to docs/figs/dvf_plant.png diff --git a/figs/estimate_spectral_density_disturbances.pdf b/docs/figs/estimate_spectral_density_disturbances.pdf similarity index 100% rename from figs/estimate_spectral_density_disturbances.pdf rename to docs/figs/estimate_spectral_density_disturbances.pdf diff --git a/figs/estimate_spectral_density_disturbances.png b/docs/figs/estimate_spectral_density_disturbances.png similarity index 100% rename from figs/estimate_spectral_density_disturbances.png rename to docs/figs/estimate_spectral_density_disturbances.png diff --git a/figs/exp_tomo_dist_rot.pdf b/docs/figs/exp_tomo_dist_rot.pdf similarity index 100% rename from figs/exp_tomo_dist_rot.pdf rename to docs/figs/exp_tomo_dist_rot.pdf diff --git a/figs/exp_tomo_dist_rot.png b/docs/figs/exp_tomo_dist_rot.png similarity index 100% rename from figs/exp_tomo_dist_rot.png rename to docs/figs/exp_tomo_dist_rot.png diff --git a/figs/exp_tomo_dist_trans.pdf b/docs/figs/exp_tomo_dist_trans.pdf similarity index 100% rename from figs/exp_tomo_dist_trans.pdf rename to docs/figs/exp_tomo_dist_trans.pdf diff --git a/figs/exp_tomo_dist_trans.png b/docs/figs/exp_tomo_dist_trans.png similarity index 100% rename from figs/exp_tomo_dist_trans.png rename to docs/figs/exp_tomo_dist_trans.png diff --git a/figs/exp_tomo_offset_rot.pdf b/docs/figs/exp_tomo_offset_rot.pdf similarity index 100% rename from figs/exp_tomo_offset_rot.pdf rename to docs/figs/exp_tomo_offset_rot.pdf diff --git a/figs/exp_tomo_offset_rot.png b/docs/figs/exp_tomo_offset_rot.png similarity index 100% rename from figs/exp_tomo_offset_rot.png rename to docs/figs/exp_tomo_offset_rot.png diff --git a/figs/exp_tomo_offset_trans.pdf b/docs/figs/exp_tomo_offset_trans.pdf similarity index 100% rename from figs/exp_tomo_offset_trans.pdf rename to docs/figs/exp_tomo_offset_trans.pdf diff --git a/figs/exp_tomo_offset_trans.png b/docs/figs/exp_tomo_offset_trans.png similarity index 100% rename from figs/exp_tomo_offset_trans.png rename to docs/figs/exp_tomo_offset_trans.png diff --git a/figs/exp_tomo_without_dist_rot.pdf b/docs/figs/exp_tomo_without_dist_rot.pdf similarity index 100% rename from figs/exp_tomo_without_dist_rot.pdf rename to docs/figs/exp_tomo_without_dist_rot.pdf diff --git a/figs/exp_tomo_without_dist_rot.png b/docs/figs/exp_tomo_without_dist_rot.png similarity index 100% rename from figs/exp_tomo_without_dist_rot.png rename to docs/figs/exp_tomo_without_dist_rot.png diff --git a/figs/exp_tomo_without_dist_trans.pdf b/docs/figs/exp_tomo_without_dist_trans.pdf similarity index 100% rename from figs/exp_tomo_without_dist_trans.pdf rename to docs/figs/exp_tomo_without_dist_trans.pdf diff --git a/figs/exp_tomo_without_dist_trans.png b/docs/figs/exp_tomo_without_dist_trans.png similarity index 100% rename from figs/exp_tomo_without_dist_trans.png rename to docs/figs/exp_tomo_without_dist_trans.png diff --git a/figs/exp_ty_scan_rot.pdf b/docs/figs/exp_ty_scan_rot.pdf similarity index 100% rename from figs/exp_ty_scan_rot.pdf rename to docs/figs/exp_ty_scan_rot.pdf diff --git a/figs/exp_ty_scan_rot.png b/docs/figs/exp_ty_scan_rot.png similarity index 100% rename from figs/exp_ty_scan_rot.png rename to docs/figs/exp_ty_scan_rot.png diff --git a/figs/exp_ty_scan_trans.pdf b/docs/figs/exp_ty_scan_trans.pdf similarity index 100% rename from figs/exp_ty_scan_trans.pdf rename to docs/figs/exp_ty_scan_trans.pdf diff --git a/figs/exp_ty_scan_trans.png b/docs/figs/exp_ty_scan_trans.png similarity index 100% rename from figs/exp_ty_scan_trans.png rename to docs/figs/exp_ty_scan_trans.png diff --git a/figs/exp_w_wo_nass_xy.pdf b/docs/figs/exp_w_wo_nass_xy.pdf similarity index 100% rename from figs/exp_w_wo_nass_xy.pdf rename to docs/figs/exp_w_wo_nass_xy.pdf diff --git a/figs/exp_w_wo_nass_y.pdf b/docs/figs/exp_w_wo_nass_y.pdf similarity index 100% rename from figs/exp_w_wo_nass_y.pdf rename to docs/figs/exp_w_wo_nass_y.pdf diff --git a/figs/flexibilities.pdf b/docs/figs/flexibilities.pdf similarity index 100% rename from figs/flexibilities.pdf rename to docs/figs/flexibilities.pdf diff --git a/figs/gm_control_psd_z.pdf b/docs/figs/gm_control_psd_z.pdf similarity index 100% rename from figs/gm_control_psd_z.pdf rename to docs/figs/gm_control_psd_z.pdf diff --git a/figs/gm_control_xz.pdf b/docs/figs/gm_control_xz.pdf similarity index 100% rename from figs/gm_control_xz.pdf rename to docs/figs/gm_control_xz.pdf diff --git a/figs/ground_motion_effect.pdf b/docs/figs/ground_motion_effect.pdf similarity index 100% rename from figs/ground_motion_effect.pdf rename to docs/figs/ground_motion_effect.pdf diff --git a/figs/hexapod_cart_coupling.pdf b/docs/figs/hexapod_cart_coupling.pdf similarity index 100% rename from figs/hexapod_cart_coupling.pdf rename to docs/figs/hexapod_cart_coupling.pdf diff --git a/figs/hexapod_cart_rot.pdf b/docs/figs/hexapod_cart_rot.pdf similarity index 100% rename from figs/hexapod_cart_rot.pdf rename to docs/figs/hexapod_cart_rot.pdf diff --git a/figs/hexapod_cart_trans.pdf b/docs/figs/hexapod_cart_trans.pdf similarity index 100% rename from figs/hexapod_cart_trans.pdf rename to docs/figs/hexapod_cart_trans.pdf diff --git a/figs/hexapod_legs.pdf b/docs/figs/hexapod_legs.pdf similarity index 100% rename from figs/hexapod_legs.pdf rename to docs/figs/hexapod_legs.pdf diff --git a/figs/hexapod_legs_coupling.pdf b/docs/figs/hexapod_legs_coupling.pdf similarity index 100% rename from figs/hexapod_legs_coupling.pdf rename to docs/figs/hexapod_legs_coupling.pdf diff --git a/figs/id_hexapod_coupling.pdf b/docs/figs/id_hexapod_coupling.pdf similarity index 100% rename from figs/id_hexapod_coupling.pdf rename to docs/figs/id_hexapod_coupling.pdf diff --git a/figs/id_hexapod_rot.pdf b/docs/figs/id_hexapod_rot.pdf similarity index 100% rename from figs/id_hexapod_rot.pdf rename to docs/figs/id_hexapod_rot.pdf diff --git a/figs/id_hexapod_trans.pdf b/docs/figs/id_hexapod_trans.pdf similarity index 100% rename from figs/id_hexapod_trans.pdf rename to docs/figs/id_hexapod_trans.pdf diff --git a/figs/id_nass_coupling.pdf b/docs/figs/id_nass_coupling.pdf similarity index 100% rename from figs/id_nass_coupling.pdf rename to docs/figs/id_nass_coupling.pdf diff --git a/figs/id_nass_rot.pdf b/docs/figs/id_nass_rot.pdf similarity index 100% rename from figs/id_nass_rot.pdf rename to docs/figs/id_nass_rot.pdf diff --git a/figs/id_nass_trans.pdf b/docs/figs/id_nass_trans.pdf similarity index 100% rename from figs/id_nass_trans.pdf rename to docs/figs/id_nass_trans.pdf diff --git a/figs/id_ry.pdf b/docs/figs/id_ry.pdf similarity index 100% rename from figs/id_ry.pdf rename to docs/figs/id_ry.pdf diff --git a/figs/id_ty.pdf b/docs/figs/id_ty.pdf similarity index 100% rename from figs/id_ty.pdf rename to docs/figs/id_ty.pdf diff --git a/figs/identification_comp_bot_stages.pdf b/docs/figs/identification_comp_bot_stages.pdf similarity index 100% rename from figs/identification_comp_bot_stages.pdf rename to docs/figs/identification_comp_bot_stages.pdf diff --git a/figs/identification_comp_bot_stages.png b/docs/figs/identification_comp_bot_stages.png similarity index 100% rename from figs/identification_comp_bot_stages.png rename to docs/figs/identification_comp_bot_stages.png diff --git a/figs/identification_comp_mid_stages.pdf b/docs/figs/identification_comp_mid_stages.pdf similarity index 100% rename from figs/identification_comp_mid_stages.pdf rename to docs/figs/identification_comp_mid_stages.pdf diff --git a/figs/identification_comp_mid_stages.png b/docs/figs/identification_comp_mid_stages.png similarity index 100% rename from figs/identification_comp_mid_stages.png rename to docs/figs/identification_comp_mid_stages.png diff --git a/figs/identification_comp_top_stages.pdf b/docs/figs/identification_comp_top_stages.pdf similarity index 100% rename from figs/identification_comp_top_stages.pdf rename to docs/figs/identification_comp_top_stages.pdf diff --git a/figs/identification_comp_top_stages.png b/docs/figs/identification_comp_top_stages.png similarity index 100% rename from figs/identification_comp_top_stages.png rename to docs/figs/identification_comp_top_stages.png diff --git a/figs/iff_1dof.pdf b/docs/figs/iff_1dof.pdf similarity index 100% rename from figs/iff_1dof.pdf rename to docs/figs/iff_1dof.pdf diff --git a/figs/iff_1dof.png b/docs/figs/iff_1dof.png similarity index 100% rename from figs/iff_1dof.png rename to docs/figs/iff_1dof.png diff --git a/figs/iff_1dof_sensitivitiy.pdf b/docs/figs/iff_1dof_sensitivitiy.pdf similarity index 100% rename from figs/iff_1dof_sensitivitiy.pdf rename to docs/figs/iff_1dof_sensitivitiy.pdf diff --git a/figs/iff_1dof_sensitivitiy.png b/docs/figs/iff_1dof_sensitivitiy.png similarity index 100% rename from figs/iff_1dof_sensitivitiy.png rename to docs/figs/iff_1dof_sensitivitiy.png diff --git a/figs/iff_hpf_open_loop.pdf b/docs/figs/iff_hpf_open_loop.pdf similarity index 100% rename from figs/iff_hpf_open_loop.pdf rename to docs/figs/iff_hpf_open_loop.pdf diff --git a/figs/iff_hpf_open_loop.png b/docs/figs/iff_hpf_open_loop.png similarity index 100% rename from figs/iff_hpf_open_loop.png rename to docs/figs/iff_hpf_open_loop.png diff --git a/figs/iff_open_loop.pdf b/docs/figs/iff_open_loop.pdf similarity index 100% rename from figs/iff_open_loop.pdf rename to docs/figs/iff_open_loop.pdf diff --git a/figs/iff_open_loop.png b/docs/figs/iff_open_loop.png similarity index 100% rename from figs/iff_open_loop.png rename to docs/figs/iff_open_loop.png diff --git a/figs/iff_plant.pdf b/docs/figs/iff_plant.pdf similarity index 100% rename from figs/iff_plant.pdf rename to docs/figs/iff_plant.pdf diff --git a/figs/iff_plant.png b/docs/figs/iff_plant.png similarity index 100% rename from figs/iff_plant.png rename to docs/figs/iff_plant.png diff --git a/figs/images/axisc.png b/docs/figs/images/axisc.png similarity index 100% rename from figs/images/axisc.png rename to docs/figs/images/axisc.png diff --git a/figs/images/granite.png b/docs/figs/images/granite.png similarity index 100% rename from figs/images/granite.png rename to docs/figs/images/granite.png diff --git a/figs/images/ground.png b/docs/figs/images/ground.png similarity index 100% rename from figs/images/ground.png rename to docs/figs/images/ground.png diff --git a/figs/images/mirror.png b/docs/figs/images/mirror.png similarity index 100% rename from figs/images/mirror.png rename to docs/figs/images/mirror.png diff --git a/figs/images/n_hexa.png b/docs/figs/images/n_hexa.png similarity index 100% rename from figs/images/n_hexa.png rename to docs/figs/images/n_hexa.png diff --git a/figs/images/ry.png b/docs/figs/images/ry.png similarity index 100% rename from figs/images/ry.png rename to docs/figs/images/ry.png diff --git a/figs/images/rz.png b/docs/figs/images/rz.png similarity index 100% rename from figs/images/rz.png rename to docs/figs/images/rz.png diff --git a/figs/images/sample.png b/docs/figs/images/sample.png similarity index 100% rename from figs/images/sample.png rename to docs/figs/images/sample.png diff --git a/figs/images/simscape_model_axisc.pdf b/docs/figs/images/simscape_model_axisc.pdf similarity index 100% rename from figs/images/simscape_model_axisc.pdf rename to docs/figs/images/simscape_model_axisc.pdf diff --git a/figs/images/simscape_model_axisc.png b/docs/figs/images/simscape_model_axisc.png similarity index 100% rename from figs/images/simscape_model_axisc.png rename to docs/figs/images/simscape_model_axisc.png diff --git a/figs/images/simscape_model_granite.pdf b/docs/figs/images/simscape_model_granite.pdf similarity index 100% rename from figs/images/simscape_model_granite.pdf rename to docs/figs/images/simscape_model_granite.pdf diff --git a/figs/images/simscape_model_granite.png b/docs/figs/images/simscape_model_granite.png similarity index 100% rename from figs/images/simscape_model_granite.png rename to docs/figs/images/simscape_model_granite.png diff --git a/figs/images/simscape_model_ground.pdf b/docs/figs/images/simscape_model_ground.pdf similarity index 100% rename from figs/images/simscape_model_ground.pdf rename to docs/figs/images/simscape_model_ground.pdf diff --git a/figs/images/simscape_model_ground.png b/docs/figs/images/simscape_model_ground.png similarity index 100% rename from figs/images/simscape_model_ground.png rename to docs/figs/images/simscape_model_ground.png diff --git a/figs/images/simscape_model_micro_hexapod.png b/docs/figs/images/simscape_model_micro_hexapod.png similarity index 100% rename from figs/images/simscape_model_micro_hexapod.png rename to docs/figs/images/simscape_model_micro_hexapod.png diff --git a/figs/images/simscape_model_mirror.pdf b/docs/figs/images/simscape_model_mirror.pdf similarity index 100% rename from figs/images/simscape_model_mirror.pdf rename to docs/figs/images/simscape_model_mirror.pdf diff --git a/figs/images/simscape_model_mirror.png b/docs/figs/images/simscape_model_mirror.png similarity index 100% rename from figs/images/simscape_model_mirror.png rename to docs/figs/images/simscape_model_mirror.png diff --git a/figs/images/simscape_model_nano_hexapod.png b/docs/figs/images/simscape_model_nano_hexapod.png similarity index 100% rename from figs/images/simscape_model_nano_hexapod.png rename to docs/figs/images/simscape_model_nano_hexapod.png diff --git a/figs/images/simscape_model_ry.pdf b/docs/figs/images/simscape_model_ry.pdf similarity index 100% rename from figs/images/simscape_model_ry.pdf rename to docs/figs/images/simscape_model_ry.pdf diff --git a/figs/images/simscape_model_ry.png b/docs/figs/images/simscape_model_ry.png similarity index 100% rename from figs/images/simscape_model_ry.png rename to docs/figs/images/simscape_model_ry.png diff --git a/figs/images/simscape_model_rz.pdf b/docs/figs/images/simscape_model_rz.pdf similarity index 100% rename from figs/images/simscape_model_rz.pdf rename to docs/figs/images/simscape_model_rz.pdf diff --git a/figs/images/simscape_model_rz.png b/docs/figs/images/simscape_model_rz.png similarity index 100% rename from figs/images/simscape_model_rz.png rename to docs/figs/images/simscape_model_rz.png diff --git a/figs/images/simscape_model_sample.pdf b/docs/figs/images/simscape_model_sample.pdf similarity index 100% rename from figs/images/simscape_model_sample.pdf rename to docs/figs/images/simscape_model_sample.pdf diff --git a/figs/images/simscape_model_sample.png b/docs/figs/images/simscape_model_sample.png similarity index 100% rename from figs/images/simscape_model_sample.png rename to docs/figs/images/simscape_model_sample.png diff --git a/figs/images/simscape_model_ty.pdf b/docs/figs/images/simscape_model_ty.pdf similarity index 100% rename from figs/images/simscape_model_ty.pdf rename to docs/figs/images/simscape_model_ty.pdf diff --git a/figs/images/simscape_model_ty.png b/docs/figs/images/simscape_model_ty.png similarity index 100% rename from figs/images/simscape_model_ty.png rename to docs/figs/images/simscape_model_ty.png diff --git a/figs/images/simscape_picture.png b/docs/figs/images/simscape_picture.png similarity index 100% rename from figs/images/simscape_picture.png rename to docs/figs/images/simscape_picture.png diff --git a/figs/images/simscape_picture_axisc.png b/docs/figs/images/simscape_picture_axisc.png similarity index 100% rename from figs/images/simscape_picture_axisc.png rename to docs/figs/images/simscape_picture_axisc.png diff --git a/figs/images/simscape_picture_granite.png b/docs/figs/images/simscape_picture_granite.png similarity index 100% rename from figs/images/simscape_picture_granite.png rename to docs/figs/images/simscape_picture_granite.png diff --git a/figs/images/simscape_picture_ground.png b/docs/figs/images/simscape_picture_ground.png similarity index 100% rename from figs/images/simscape_picture_ground.png rename to docs/figs/images/simscape_picture_ground.png diff --git a/figs/images/simscape_picture_micro_hexapod.png b/docs/figs/images/simscape_picture_micro_hexapod.png similarity index 100% rename from figs/images/simscape_picture_micro_hexapod.png rename to docs/figs/images/simscape_picture_micro_hexapod.png diff --git a/figs/images/simscape_picture_mirror.png b/docs/figs/images/simscape_picture_mirror.png similarity index 100% rename from figs/images/simscape_picture_mirror.png rename to docs/figs/images/simscape_picture_mirror.png diff --git a/figs/images/simscape_picture_nano_hexapod.png b/docs/figs/images/simscape_picture_nano_hexapod.png similarity index 100% rename from figs/images/simscape_picture_nano_hexapod.png rename to docs/figs/images/simscape_picture_nano_hexapod.png diff --git a/figs/images/simscape_picture_ry.png b/docs/figs/images/simscape_picture_ry.png similarity index 100% rename from figs/images/simscape_picture_ry.png rename to docs/figs/images/simscape_picture_ry.png diff --git a/figs/images/simscape_picture_rz.png b/docs/figs/images/simscape_picture_rz.png similarity index 100% rename from figs/images/simscape_picture_rz.png rename to docs/figs/images/simscape_picture_rz.png diff --git a/figs/images/simscape_picture_sample.png b/docs/figs/images/simscape_picture_sample.png similarity index 100% rename from figs/images/simscape_picture_sample.png rename to docs/figs/images/simscape_picture_sample.png diff --git a/figs/images/simscape_picture_ty.png b/docs/figs/images/simscape_picture_ty.png similarity index 100% rename from figs/images/simscape_picture_ty.png rename to docs/figs/images/simscape_picture_ty.png diff --git a/figs/images/ty.png b/docs/figs/images/ty.png similarity index 100% rename from figs/images/ty.png rename to docs/figs/images/ty.png diff --git a/figs/images/u_hexa.png b/docs/figs/images/u_hexa.png similarity index 100% rename from figs/images/u_hexa.png rename to docs/figs/images/u_hexa.png diff --git a/figs/ine_open_loop_gain.pdf b/docs/figs/ine_open_loop_gain.pdf similarity index 100% rename from figs/ine_open_loop_gain.pdf rename to docs/figs/ine_open_loop_gain.pdf diff --git a/figs/ine_open_loop_gain.png b/docs/figs/ine_open_loop_gain.png similarity index 100% rename from figs/ine_open_loop_gain.png rename to docs/figs/ine_open_loop_gain.png diff --git a/figs/ine_plant.pdf b/docs/figs/ine_plant.pdf similarity index 100% rename from figs/ine_plant.pdf rename to docs/figs/ine_plant.pdf diff --git a/figs/ine_plant.png b/docs/figs/ine_plant.png similarity index 100% rename from figs/ine_plant.png rename to docs/figs/ine_plant.png diff --git a/figs/loopgain.pdf b/docs/figs/loopgain.pdf similarity index 100% rename from figs/loopgain.pdf rename to docs/figs/loopgain.pdf diff --git a/figs/movies/Assemblage.avi b/docs/figs/movies/Assemblage.avi similarity index 100% rename from figs/movies/Assemblage.avi rename to docs/figs/movies/Assemblage.avi diff --git a/figs/movies/Assemblage.gif b/docs/figs/movies/Assemblage.gif similarity index 100% rename from figs/movies/Assemblage.gif rename to docs/figs/movies/Assemblage.gif diff --git a/figs/movies/close_loop.avi b/docs/figs/movies/close_loop.avi similarity index 100% rename from figs/movies/close_loop.avi rename to docs/figs/movies/close_loop.avi diff --git a/figs/movies/close_loop_zoom.avi b/docs/figs/movies/close_loop_zoom.avi similarity index 100% rename from figs/movies/close_loop_zoom.avi rename to docs/figs/movies/close_loop_zoom.avi diff --git a/figs/movies/open_loop.avi b/docs/figs/movies/open_loop.avi similarity index 100% rename from figs/movies/open_loop.avi rename to docs/figs/movies/open_loop.avi diff --git a/figs/nass_act_damp_dvf_sim_tomo_rot.pdf b/docs/figs/nass_act_damp_dvf_sim_tomo_rot.pdf similarity index 100% rename from figs/nass_act_damp_dvf_sim_tomo_rot.pdf rename to docs/figs/nass_act_damp_dvf_sim_tomo_rot.pdf diff --git a/figs/nass_act_damp_dvf_sim_tomo_rot.png b/docs/figs/nass_act_damp_dvf_sim_tomo_rot.png similarity index 100% rename from figs/nass_act_damp_dvf_sim_tomo_rot.png rename to docs/figs/nass_act_damp_dvf_sim_tomo_rot.png diff --git a/figs/nass_act_damp_dvf_sim_tomo_trans.pdf b/docs/figs/nass_act_damp_dvf_sim_tomo_trans.pdf similarity index 100% rename from figs/nass_act_damp_dvf_sim_tomo_trans.pdf rename to docs/figs/nass_act_damp_dvf_sim_tomo_trans.pdf diff --git a/figs/nass_act_damp_dvf_sim_tomo_trans.png b/docs/figs/nass_act_damp_dvf_sim_tomo_trans.png similarity index 100% rename from figs/nass_act_damp_dvf_sim_tomo_trans.png rename to docs/figs/nass_act_damp_dvf_sim_tomo_trans.png diff --git a/figs/nass_act_damp_dvf_sim_tomo_xy.pdf b/docs/figs/nass_act_damp_dvf_sim_tomo_xy.pdf similarity index 100% rename from figs/nass_act_damp_dvf_sim_tomo_xy.pdf rename to docs/figs/nass_act_damp_dvf_sim_tomo_xy.pdf diff --git a/figs/nass_act_damp_dvf_sim_tomo_xy.png b/docs/figs/nass_act_damp_dvf_sim_tomo_xy.png similarity index 100% rename from figs/nass_act_damp_dvf_sim_tomo_xy.png rename to docs/figs/nass_act_damp_dvf_sim_tomo_xy.png diff --git a/figs/nass_act_damp_iff_sim_tomo_rot.pdf b/docs/figs/nass_act_damp_iff_sim_tomo_rot.pdf similarity index 100% rename from figs/nass_act_damp_iff_sim_tomo_rot.pdf rename to docs/figs/nass_act_damp_iff_sim_tomo_rot.pdf diff --git a/figs/nass_act_damp_iff_sim_tomo_rot.png b/docs/figs/nass_act_damp_iff_sim_tomo_rot.png similarity index 100% rename from figs/nass_act_damp_iff_sim_tomo_rot.png rename to docs/figs/nass_act_damp_iff_sim_tomo_rot.png diff --git a/figs/nass_act_damp_iff_sim_tomo_trans.pdf b/docs/figs/nass_act_damp_iff_sim_tomo_trans.pdf similarity index 100% rename from figs/nass_act_damp_iff_sim_tomo_trans.pdf rename to docs/figs/nass_act_damp_iff_sim_tomo_trans.pdf diff --git a/figs/nass_act_damp_iff_sim_tomo_trans.png b/docs/figs/nass_act_damp_iff_sim_tomo_trans.png similarity index 100% rename from figs/nass_act_damp_iff_sim_tomo_trans.png rename to docs/figs/nass_act_damp_iff_sim_tomo_trans.png diff --git a/figs/nass_act_damp_iff_sim_tomo_xy.pdf b/docs/figs/nass_act_damp_iff_sim_tomo_xy.pdf similarity index 100% rename from figs/nass_act_damp_iff_sim_tomo_xy.pdf rename to docs/figs/nass_act_damp_iff_sim_tomo_xy.pdf diff --git a/figs/nass_act_damp_iff_sim_tomo_xy.png b/docs/figs/nass_act_damp_iff_sim_tomo_xy.png similarity index 100% rename from figs/nass_act_damp_iff_sim_tomo_xy.png rename to docs/figs/nass_act_damp_iff_sim_tomo_xy.png diff --git a/figs/nass_act_damp_undamped_sim_tomo_rot.pdf b/docs/figs/nass_act_damp_undamped_sim_tomo_rot.pdf similarity index 100% rename from figs/nass_act_damp_undamped_sim_tomo_rot.pdf rename to docs/figs/nass_act_damp_undamped_sim_tomo_rot.pdf diff --git a/figs/nass_act_damp_undamped_sim_tomo_rot.png b/docs/figs/nass_act_damp_undamped_sim_tomo_rot.png similarity index 100% rename from figs/nass_act_damp_undamped_sim_tomo_rot.png rename to docs/figs/nass_act_damp_undamped_sim_tomo_rot.png diff --git a/figs/nass_act_damp_undamped_sim_tomo_trans.pdf b/docs/figs/nass_act_damp_undamped_sim_tomo_trans.pdf similarity index 100% rename from figs/nass_act_damp_undamped_sim_tomo_trans.pdf rename to docs/figs/nass_act_damp_undamped_sim_tomo_trans.pdf diff --git a/figs/nass_act_damp_undamped_sim_tomo_trans.png b/docs/figs/nass_act_damp_undamped_sim_tomo_trans.png similarity index 100% rename from figs/nass_act_damp_undamped_sim_tomo_trans.png rename to docs/figs/nass_act_damp_undamped_sim_tomo_trans.png diff --git a/figs/nass_active_damping_dvf_plant.pdf b/docs/figs/nass_active_damping_dvf_plant.pdf similarity index 100% rename from figs/nass_active_damping_dvf_plant.pdf rename to docs/figs/nass_active_damping_dvf_plant.pdf diff --git a/figs/nass_active_damping_dvf_plant.png b/docs/figs/nass_active_damping_dvf_plant.png similarity index 100% rename from figs/nass_active_damping_dvf_plant.png rename to docs/figs/nass_active_damping_dvf_plant.png diff --git a/figs/nass_active_damping_iff_plant.pdf b/docs/figs/nass_active_damping_iff_plant.pdf similarity index 100% rename from figs/nass_active_damping_iff_plant.pdf rename to docs/figs/nass_active_damping_iff_plant.pdf diff --git a/figs/nass_active_damping_iff_plant.png b/docs/figs/nass_active_damping_iff_plant.png similarity index 100% rename from figs/nass_active_damping_iff_plant.png rename to docs/figs/nass_active_damping_iff_plant.png diff --git a/figs/nass_active_damping_ine_plant.pdf b/docs/figs/nass_active_damping_ine_plant.pdf similarity index 100% rename from figs/nass_active_damping_ine_plant.pdf rename to docs/figs/nass_active_damping_ine_plant.pdf diff --git a/figs/nass_active_damping_ine_plant.png b/docs/figs/nass_active_damping_ine_plant.png similarity index 100% rename from figs/nass_active_damping_ine_plant.png rename to docs/figs/nass_active_damping_ine_plant.png diff --git a/figs/nass_active_damping_inertial_plant.pdf b/docs/figs/nass_active_damping_inertial_plant.pdf similarity index 100% rename from figs/nass_active_damping_inertial_plant.pdf rename to docs/figs/nass_active_damping_inertial_plant.pdf diff --git a/figs/nass_active_damping_inertial_plant.png b/docs/figs/nass_active_damping_inertial_plant.png similarity index 100% rename from figs/nass_active_damping_inertial_plant.png rename to docs/figs/nass_active_damping_inertial_plant.png diff --git a/figs/nass_cart_x_mass.pdf b/docs/figs/nass_cart_x_mass.pdf similarity index 100% rename from figs/nass_cart_x_mass.pdf rename to docs/figs/nass_cart_x_mass.pdf diff --git a/figs/nass_cart_xyz.pdf b/docs/figs/nass_cart_xyz.pdf similarity index 100% rename from figs/nass_cart_xyz.pdf rename to docs/figs/nass_cart_xyz.pdf diff --git a/figs/nass_cart_y_mass.pdf b/docs/figs/nass_cart_y_mass.pdf similarity index 100% rename from figs/nass_cart_y_mass.pdf rename to docs/figs/nass_cart_y_mass.pdf diff --git a/figs/nass_cart_z_mass.pdf b/docs/figs/nass_cart_z_mass.pdf similarity index 100% rename from figs/nass_cart_z_mass.pdf rename to docs/figs/nass_cart_z_mass.pdf diff --git a/figs/plant_G_cart.pdf b/docs/figs/plant_G_cart.pdf similarity index 100% rename from figs/plant_G_cart.pdf rename to docs/figs/plant_G_cart.pdf diff --git a/figs/plant_G_cart.png b/docs/figs/plant_G_cart.png similarity index 100% rename from figs/plant_G_cart.png rename to docs/figs/plant_G_cart.png diff --git a/figs/plant_comp_damping_coupling.pdf b/docs/figs/plant_comp_damping_coupling.pdf similarity index 100% rename from figs/plant_comp_damping_coupling.pdf rename to docs/figs/plant_comp_damping_coupling.pdf diff --git a/figs/plant_comp_damping_coupling.png b/docs/figs/plant_comp_damping_coupling.png similarity index 100% rename from figs/plant_comp_damping_coupling.png rename to docs/figs/plant_comp_damping_coupling.png diff --git a/figs/plant_comp_damping_x.pdf b/docs/figs/plant_comp_damping_x.pdf similarity index 100% rename from figs/plant_comp_damping_x.pdf rename to docs/figs/plant_comp_damping_x.pdf diff --git a/figs/plant_comp_damping_x.png b/docs/figs/plant_comp_damping_x.png similarity index 100% rename from figs/plant_comp_damping_x.png rename to docs/figs/plant_comp_damping_x.png diff --git a/figs/plant_comp_damping_z.pdf b/docs/figs/plant_comp_damping_z.pdf similarity index 100% rename from figs/plant_comp_damping_z.pdf rename to docs/figs/plant_comp_damping_z.pdf diff --git a/figs/plant_comp_damping_z.png b/docs/figs/plant_comp_damping_z.png similarity index 100% rename from figs/plant_comp_damping_z.png rename to docs/figs/plant_comp_damping_z.png diff --git a/figs/plant_dvf_coupling.pdf b/docs/figs/plant_dvf_coupling.pdf similarity index 100% rename from figs/plant_dvf_coupling.pdf rename to docs/figs/plant_dvf_coupling.pdf diff --git a/figs/plant_dvf_coupling.png b/docs/figs/plant_dvf_coupling.png similarity index 100% rename from figs/plant_dvf_coupling.png rename to docs/figs/plant_dvf_coupling.png diff --git a/figs/plant_dvf_damped.pdf b/docs/figs/plant_dvf_damped.pdf similarity index 100% rename from figs/plant_dvf_damped.pdf rename to docs/figs/plant_dvf_damped.pdf diff --git a/figs/plant_dvf_damped.png b/docs/figs/plant_dvf_damped.png similarity index 100% rename from figs/plant_dvf_damped.png rename to docs/figs/plant_dvf_damped.png diff --git a/figs/plant_dvf_damped_rotations.pdf b/docs/figs/plant_dvf_damped_rotations.pdf similarity index 100% rename from figs/plant_dvf_damped_rotations.pdf rename to docs/figs/plant_dvf_damped_rotations.pdf diff --git a/figs/plant_dvf_damped_rotations.png b/docs/figs/plant_dvf_damped_rotations.png similarity index 100% rename from figs/plant_dvf_damped_rotations.png rename to docs/figs/plant_dvf_damped_rotations.png diff --git a/figs/plant_dvf_damped_translations.pdf b/docs/figs/plant_dvf_damped_translations.pdf similarity index 100% rename from figs/plant_dvf_damped_translations.pdf rename to docs/figs/plant_dvf_damped_translations.pdf diff --git a/figs/plant_dvf_damped_translations.png b/docs/figs/plant_dvf_damped_translations.png similarity index 100% rename from figs/plant_dvf_damped_translations.png rename to docs/figs/plant_dvf_damped_translations.png diff --git a/figs/plant_iff_coupling.pdf b/docs/figs/plant_iff_coupling.pdf similarity index 100% rename from figs/plant_iff_coupling.pdf rename to docs/figs/plant_iff_coupling.pdf diff --git a/figs/plant_iff_coupling.png b/docs/figs/plant_iff_coupling.png similarity index 100% rename from figs/plant_iff_coupling.png rename to docs/figs/plant_iff_coupling.png diff --git a/figs/plant_iff_damped.pdf b/docs/figs/plant_iff_damped.pdf similarity index 100% rename from figs/plant_iff_damped.pdf rename to docs/figs/plant_iff_damped.pdf diff --git a/figs/plant_iff_damped.png b/docs/figs/plant_iff_damped.png similarity index 100% rename from figs/plant_iff_damped.png rename to docs/figs/plant_iff_damped.png diff --git a/figs/plant_iff_damped_rotations.pdf b/docs/figs/plant_iff_damped_rotations.pdf similarity index 100% rename from figs/plant_iff_damped_rotations.pdf rename to docs/figs/plant_iff_damped_rotations.pdf diff --git a/figs/plant_iff_damped_rotations.png b/docs/figs/plant_iff_damped_rotations.png similarity index 100% rename from figs/plant_iff_damped_rotations.png rename to docs/figs/plant_iff_damped_rotations.png diff --git a/figs/plant_iff_damped_translations.pdf b/docs/figs/plant_iff_damped_translations.pdf similarity index 100% rename from figs/plant_iff_damped_translations.pdf rename to docs/figs/plant_iff_damped_translations.pdf diff --git a/figs/plant_iff_damped_translations.png b/docs/figs/plant_iff_damped_translations.png similarity index 100% rename from figs/plant_iff_damped_translations.png rename to docs/figs/plant_iff_damped_translations.png diff --git a/figs/plant_ine_coupling.pdf b/docs/figs/plant_ine_coupling.pdf similarity index 100% rename from figs/plant_ine_coupling.pdf rename to docs/figs/plant_ine_coupling.pdf diff --git a/figs/plant_ine_coupling.png b/docs/figs/plant_ine_coupling.png similarity index 100% rename from figs/plant_ine_coupling.png rename to docs/figs/plant_ine_coupling.png diff --git a/figs/plant_ine_damped_rotations.pdf b/docs/figs/plant_ine_damped_rotations.pdf similarity index 100% rename from figs/plant_ine_damped_rotations.pdf rename to docs/figs/plant_ine_damped_rotations.pdf diff --git a/figs/plant_ine_damped_rotations.png b/docs/figs/plant_ine_damped_rotations.png similarity index 100% rename from figs/plant_ine_damped_rotations.png rename to docs/figs/plant_ine_damped_rotations.png diff --git a/figs/plant_ine_damped_translations.pdf b/docs/figs/plant_ine_damped_translations.pdf similarity index 100% rename from figs/plant_ine_damped_translations.pdf rename to docs/figs/plant_ine_damped_translations.pdf diff --git a/figs/plant_ine_damped_translations.png b/docs/figs/plant_ine_damped_translations.png similarity index 100% rename from figs/plant_ine_damped_translations.png rename to docs/figs/plant_ine_damped_translations.png diff --git a/figs/plant_rmc_damped.pdf b/docs/figs/plant_rmc_damped.pdf similarity index 100% rename from figs/plant_rmc_damped.pdf rename to docs/figs/plant_rmc_damped.pdf diff --git a/figs/plant_rmc_damped.png b/docs/figs/plant_rmc_damped.png similarity index 100% rename from figs/plant_rmc_damped.png rename to docs/figs/plant_rmc_damped.png diff --git a/figs/plant_undamped.pdf b/docs/figs/plant_undamped.pdf similarity index 100% rename from figs/plant_undamped.pdf rename to docs/figs/plant_undamped.pdf diff --git a/figs/plant_undamped.png b/docs/figs/plant_undamped.png similarity index 100% rename from figs/plant_undamped.png rename to docs/figs/plant_undamped.png diff --git a/figs/psd_effect_dist_verif.pdf b/docs/figs/psd_effect_dist_verif.pdf similarity index 100% rename from figs/psd_effect_dist_verif.pdf rename to docs/figs/psd_effect_dist_verif.pdf diff --git a/figs/psd_effect_dist_verif.png b/docs/figs/psd_effect_dist_verif.png similarity index 100% rename from figs/psd_effect_dist_verif.png rename to docs/figs/psd_effect_dist_verif.png diff --git a/figs/rmc_1dof.pdf b/docs/figs/rmc_1dof.pdf similarity index 100% rename from figs/rmc_1dof.pdf rename to docs/figs/rmc_1dof.pdf diff --git a/figs/rmc_1dof.png b/docs/figs/rmc_1dof.png similarity index 100% rename from figs/rmc_1dof.png rename to docs/figs/rmc_1dof.png diff --git a/figs/rmc_1dof_sensitivitiy.pdf b/docs/figs/rmc_1dof_sensitivitiy.pdf similarity index 100% rename from figs/rmc_1dof_sensitivitiy.pdf rename to docs/figs/rmc_1dof_sensitivitiy.pdf diff --git a/figs/rmc_1dof_sensitivitiy.png b/docs/figs/rmc_1dof_sensitivitiy.png similarity index 100% rename from figs/rmc_1dof_sensitivitiy.png rename to docs/figs/rmc_1dof_sensitivitiy.png diff --git a/figs/rmc_open_loop.pdf b/docs/figs/rmc_open_loop.pdf similarity index 100% rename from figs/rmc_open_loop.pdf rename to docs/figs/rmc_open_loop.pdf diff --git a/figs/rmc_open_loop.png b/docs/figs/rmc_open_loop.png similarity index 100% rename from figs/rmc_open_loop.png rename to docs/figs/rmc_open_loop.png diff --git a/figs/rmc_plant.pdf b/docs/figs/rmc_plant.pdf similarity index 100% rename from figs/rmc_plant.pdf rename to docs/figs/rmc_plant.pdf diff --git a/figs/rmc_plant.png b/docs/figs/rmc_plant.png similarity index 100% rename from figs/rmc_plant.png rename to docs/figs/rmc_plant.png diff --git a/figs/sensitivity_dist_frz.pdf b/docs/figs/sensitivity_dist_frz.pdf similarity index 100% rename from figs/sensitivity_dist_frz.pdf rename to docs/figs/sensitivity_dist_frz.pdf diff --git a/figs/sensitivity_dist_frz.png b/docs/figs/sensitivity_dist_frz.png similarity index 100% rename from figs/sensitivity_dist_frz.png rename to docs/figs/sensitivity_dist_frz.png diff --git a/figs/sensitivity_dist_fty.pdf b/docs/figs/sensitivity_dist_fty.pdf similarity index 100% rename from figs/sensitivity_dist_fty.pdf rename to docs/figs/sensitivity_dist_fty.pdf diff --git a/figs/sensitivity_dist_fty.png b/docs/figs/sensitivity_dist_fty.png similarity index 100% rename from figs/sensitivity_dist_fty.png rename to docs/figs/sensitivity_dist_fty.png diff --git a/figs/sensitivity_dist_gm.pdf b/docs/figs/sensitivity_dist_gm.pdf similarity index 100% rename from figs/sensitivity_dist_gm.pdf rename to docs/figs/sensitivity_dist_gm.pdf diff --git a/figs/sensitivity_dist_gm.png b/docs/figs/sensitivity_dist_gm.png similarity index 100% rename from figs/sensitivity_dist_gm.png rename to docs/figs/sensitivity_dist_gm.png diff --git a/figs/tomo_time_translations.pdf b/docs/figs/tomo_time_translations.pdf similarity index 100% rename from figs/tomo_time_translations.pdf rename to docs/figs/tomo_time_translations.pdf diff --git a/figs/transmissibility_ol_cl.pdf b/docs/figs/transmissibility_ol_cl.pdf similarity index 100% rename from figs/transmissibility_ol_cl.pdf rename to docs/figs/transmissibility_ol_cl.pdf diff --git a/figs/ty_scanning_reference_sinus.pdf b/docs/figs/ty_scanning_reference_sinus.pdf similarity index 100% rename from figs/ty_scanning_reference_sinus.pdf rename to docs/figs/ty_scanning_reference_sinus.pdf diff --git a/figs/ty_scanning_reference_sinus.png b/docs/figs/ty_scanning_reference_sinus.png similarity index 100% rename from figs/ty_scanning_reference_sinus.png rename to docs/figs/ty_scanning_reference_sinus.png diff --git a/figs/undamped_hac_plant_rotations.pdf b/docs/figs/undamped_hac_plant_rotations.pdf similarity index 100% rename from figs/undamped_hac_plant_rotations.pdf rename to docs/figs/undamped_hac_plant_rotations.pdf diff --git a/figs/undamped_hac_plant_rotations.png b/docs/figs/undamped_hac_plant_rotations.png similarity index 100% rename from figs/undamped_hac_plant_rotations.png rename to docs/figs/undamped_hac_plant_rotations.png diff --git a/figs/undamped_hac_plant_translations.pdf b/docs/figs/undamped_hac_plant_translations.pdf similarity index 100% rename from figs/undamped_hac_plant_translations.pdf rename to docs/figs/undamped_hac_plant_translations.pdf diff --git a/figs/undamped_hac_plant_translations.png b/docs/figs/undamped_hac_plant_translations.png similarity index 100% rename from figs/undamped_hac_plant_translations.png rename to docs/figs/undamped_hac_plant_translations.png diff --git a/figs/uniaxial-cas-dist.pdf b/docs/figs/uniaxial-cas-dist.pdf similarity index 100% rename from figs/uniaxial-cas-dist.pdf rename to docs/figs/uniaxial-cas-dist.pdf diff --git a/figs/uniaxial-cas-dist.png b/docs/figs/uniaxial-cas-dist.png similarity index 100% rename from figs/uniaxial-cas-dist.png rename to docs/figs/uniaxial-cas-dist.png diff --git a/figs/uniaxial-cas-iff-vc.pdf b/docs/figs/uniaxial-cas-iff-vc.pdf similarity index 100% rename from figs/uniaxial-cas-iff-vc.pdf rename to docs/figs/uniaxial-cas-iff-vc.pdf diff --git a/figs/uniaxial-cas-iff-vc.png b/docs/figs/uniaxial-cas-iff-vc.png similarity index 100% rename from figs/uniaxial-cas-iff-vc.png rename to docs/figs/uniaxial-cas-iff-vc.png diff --git a/figs/uniaxial-comp-cas-dist.pdf b/docs/figs/uniaxial-comp-cas-dist.pdf similarity index 100% rename from figs/uniaxial-comp-cas-dist.pdf rename to docs/figs/uniaxial-comp-cas-dist.pdf diff --git a/figs/uniaxial-comp-cas-dist.png b/docs/figs/uniaxial-comp-cas-dist.png similarity index 100% rename from figs/uniaxial-comp-cas-dist.png rename to docs/figs/uniaxial-comp-cas-dist.png diff --git a/figs/uniaxial-iff-cas-dist.pdf b/docs/figs/uniaxial-iff-cas-dist.pdf similarity index 100% rename from figs/uniaxial-iff-cas-dist.pdf rename to docs/figs/uniaxial-iff-cas-dist.pdf diff --git a/figs/uniaxial-iff-cas-dist.png b/docs/figs/uniaxial-iff-cas-dist.png similarity index 100% rename from figs/uniaxial-iff-cas-dist.png rename to docs/figs/uniaxial-iff-cas-dist.png diff --git a/figs/uniaxial-iff-psd-dist.pdf b/docs/figs/uniaxial-iff-psd-dist.pdf similarity index 100% rename from figs/uniaxial-iff-psd-dist.pdf rename to docs/figs/uniaxial-iff-psd-dist.pdf diff --git a/figs/uniaxial-iff-psd-dist.png b/docs/figs/uniaxial-iff-psd-dist.png similarity index 100% rename from figs/uniaxial-iff-psd-dist.png rename to docs/figs/uniaxial-iff-psd-dist.png diff --git a/figs/uniaxial-model-act_damp.pdf b/docs/figs/uniaxial-model-act_damp.pdf similarity index 100% rename from figs/uniaxial-model-act_damp.pdf rename to docs/figs/uniaxial-model-act_damp.pdf diff --git a/figs/uniaxial-model-act_damp.png b/docs/figs/uniaxial-model-act_damp.png similarity index 100% rename from figs/uniaxial-model-act_damp.png rename to docs/figs/uniaxial-model-act_damp.png diff --git a/figs/uniaxial-model-micro-station.pdf b/docs/figs/uniaxial-model-micro-station.pdf similarity index 100% rename from figs/uniaxial-model-micro-station.pdf rename to docs/figs/uniaxial-model-micro-station.pdf diff --git a/figs/uniaxial-model-micro-station.png b/docs/figs/uniaxial-model-micro-station.png similarity index 100% rename from figs/uniaxial-model-micro-station.png rename to docs/figs/uniaxial-model-micro-station.png diff --git a/figs/uniaxial-model-nass-flexible-active-damping.pdf b/docs/figs/uniaxial-model-nass-flexible-active-damping.pdf similarity index 100% rename from figs/uniaxial-model-nass-flexible-active-damping.pdf rename to docs/figs/uniaxial-model-nass-flexible-active-damping.pdf diff --git a/figs/uniaxial-model-nass-flexible-active-damping.png b/docs/figs/uniaxial-model-nass-flexible-active-damping.png similarity index 100% rename from figs/uniaxial-model-nass-flexible-active-damping.png rename to docs/figs/uniaxial-model-nass-flexible-active-damping.png diff --git a/figs/uniaxial-model-nass-flexible-dvf.pdf b/docs/figs/uniaxial-model-nass-flexible-dvf.pdf similarity index 100% rename from figs/uniaxial-model-nass-flexible-dvf.pdf rename to docs/figs/uniaxial-model-nass-flexible-dvf.pdf diff --git a/figs/uniaxial-model-nass-flexible-dvf.png b/docs/figs/uniaxial-model-nass-flexible-dvf.png similarity index 100% rename from figs/uniaxial-model-nass-flexible-dvf.png rename to docs/figs/uniaxial-model-nass-flexible-dvf.png diff --git a/figs/uniaxial-model-nass-flexible-iff.pdf b/docs/figs/uniaxial-model-nass-flexible-iff.pdf similarity index 100% rename from figs/uniaxial-model-nass-flexible-iff.pdf rename to docs/figs/uniaxial-model-nass-flexible-iff.pdf diff --git a/figs/uniaxial-model-nass-flexible-iff.png b/docs/figs/uniaxial-model-nass-flexible-iff.png similarity index 100% rename from figs/uniaxial-model-nass-flexible-iff.png rename to docs/figs/uniaxial-model-nass-flexible-iff.png diff --git a/figs/uniaxial-model-nass-flexible-rmc.pdf b/docs/figs/uniaxial-model-nass-flexible-rmc.pdf similarity index 100% rename from figs/uniaxial-model-nass-flexible-rmc.pdf rename to docs/figs/uniaxial-model-nass-flexible-rmc.pdf diff --git a/figs/uniaxial-model-nass-flexible-rmc.png b/docs/figs/uniaxial-model-nass-flexible-rmc.png similarity index 100% rename from figs/uniaxial-model-nass-flexible-rmc.png rename to docs/figs/uniaxial-model-nass-flexible-rmc.png diff --git a/figs/uniaxial-model-nass-flexible.pdf b/docs/figs/uniaxial-model-nass-flexible.pdf similarity index 100% rename from figs/uniaxial-model-nass-flexible.pdf rename to docs/figs/uniaxial-model-nass-flexible.pdf diff --git a/figs/uniaxial-model-nass-flexible.png b/docs/figs/uniaxial-model-nass-flexible.png similarity index 100% rename from figs/uniaxial-model-nass-flexible.png rename to docs/figs/uniaxial-model-nass-flexible.png diff --git a/figs/uniaxial-plant.pdf b/docs/figs/uniaxial-plant.pdf similarity index 100% rename from figs/uniaxial-plant.pdf rename to docs/figs/uniaxial-plant.pdf diff --git a/figs/uniaxial-plant.png b/docs/figs/uniaxial-plant.png similarity index 100% rename from figs/uniaxial-plant.png rename to docs/figs/uniaxial-plant.png diff --git a/figs/uniaxial-psd-dist.pdf b/docs/figs/uniaxial-psd-dist.pdf similarity index 100% rename from figs/uniaxial-psd-dist.pdf rename to docs/figs/uniaxial-psd-dist.pdf diff --git a/figs/uniaxial-psd-dist.png b/docs/figs/uniaxial-psd-dist.png similarity index 100% rename from figs/uniaxial-psd-dist.png rename to docs/figs/uniaxial-psd-dist.png diff --git a/figs/uniaxial-sensitivity-disturbances.pdf b/docs/figs/uniaxial-sensitivity-disturbances.pdf similarity index 100% rename from figs/uniaxial-sensitivity-disturbances.pdf rename to docs/figs/uniaxial-sensitivity-disturbances.pdf diff --git a/figs/uniaxial-sensitivity-disturbances.png b/docs/figs/uniaxial-sensitivity-disturbances.png similarity index 100% rename from figs/uniaxial-sensitivity-disturbances.png rename to docs/figs/uniaxial-sensitivity-disturbances.png diff --git a/figs/uniaxial-sensitivity-force-dist.pdf b/docs/figs/uniaxial-sensitivity-force-dist.pdf similarity index 100% rename from figs/uniaxial-sensitivity-force-dist.pdf rename to docs/figs/uniaxial-sensitivity-force-dist.pdf diff --git a/figs/uniaxial-sensitivity-force-dist.png b/docs/figs/uniaxial-sensitivity-force-dist.png similarity index 100% rename from figs/uniaxial-sensitivity-force-dist.png rename to docs/figs/uniaxial-sensitivity-force-dist.png diff --git a/figs/uniaxial-sensitivity-vc-disturbances.pdf b/docs/figs/uniaxial-sensitivity-vc-disturbances.pdf similarity index 100% rename from figs/uniaxial-sensitivity-vc-disturbances.pdf rename to docs/figs/uniaxial-sensitivity-vc-disturbances.pdf diff --git a/figs/uniaxial-sensitivity-vc-disturbances.png b/docs/figs/uniaxial-sensitivity-vc-disturbances.png similarity index 100% rename from figs/uniaxial-sensitivity-vc-disturbances.png rename to docs/figs/uniaxial-sensitivity-vc-disturbances.png diff --git a/figs/uniaxial-sensitivity-vc-force-dist.pdf b/docs/figs/uniaxial-sensitivity-vc-force-dist.pdf similarity index 100% rename from figs/uniaxial-sensitivity-vc-force-dist.pdf rename to docs/figs/uniaxial-sensitivity-vc-force-dist.pdf diff --git a/figs/uniaxial-sensitivity-vc-force-dist.png b/docs/figs/uniaxial-sensitivity-vc-force-dist.png similarity index 100% rename from figs/uniaxial-sensitivity-vc-force-dist.png rename to docs/figs/uniaxial-sensitivity-vc-force-dist.png diff --git a/figs/uniaxial-vc-cas-dist.pdf b/docs/figs/uniaxial-vc-cas-dist.pdf similarity index 100% rename from figs/uniaxial-vc-cas-dist.pdf rename to docs/figs/uniaxial-vc-cas-dist.pdf diff --git a/figs/uniaxial-vc-cas-dist.png b/docs/figs/uniaxial-vc-cas-dist.png similarity index 100% rename from figs/uniaxial-vc-cas-dist.png rename to docs/figs/uniaxial-vc-cas-dist.png diff --git a/figs/uniaxial-vc-psd-dist.pdf b/docs/figs/uniaxial-vc-psd-dist.pdf similarity index 100% rename from figs/uniaxial-vc-psd-dist.pdf rename to docs/figs/uniaxial-vc-psd-dist.pdf diff --git a/figs/uniaxial-vc-psd-dist.png b/docs/figs/uniaxial-vc-psd-dist.png similarity index 100% rename from figs/uniaxial-vc-psd-dist.png rename to docs/figs/uniaxial-vc-psd-dist.png diff --git a/figs/uniaxial_cedrat_open_loop.pdf b/docs/figs/uniaxial_cedrat_open_loop.pdf similarity index 100% rename from figs/uniaxial_cedrat_open_loop.pdf rename to docs/figs/uniaxial_cedrat_open_loop.pdf diff --git a/figs/uniaxial_cedrat_open_loop.png b/docs/figs/uniaxial_cedrat_open_loop.png similarity index 100% rename from figs/uniaxial_cedrat_open_loop.png rename to docs/figs/uniaxial_cedrat_open_loop.png diff --git a/figs/uniaxial_cedrat_plant.pdf b/docs/figs/uniaxial_cedrat_plant.pdf similarity index 100% rename from figs/uniaxial_cedrat_plant.pdf rename to docs/figs/uniaxial_cedrat_plant.pdf diff --git a/figs/uniaxial_cedrat_plant.png b/docs/figs/uniaxial_cedrat_plant.png similarity index 100% rename from figs/uniaxial_cedrat_plant.png rename to docs/figs/uniaxial_cedrat_plant.png diff --git a/figs/uniaxial_dvf_loop_gain.pdf b/docs/figs/uniaxial_dvf_loop_gain.pdf similarity index 100% rename from figs/uniaxial_dvf_loop_gain.pdf rename to docs/figs/uniaxial_dvf_loop_gain.pdf diff --git a/figs/uniaxial_dvf_loop_gain.png b/docs/figs/uniaxial_dvf_loop_gain.png similarity index 100% rename from figs/uniaxial_dvf_loop_gain.png rename to docs/figs/uniaxial_dvf_loop_gain.png diff --git a/figs/uniaxial_dvf_plant.pdf b/docs/figs/uniaxial_dvf_plant.pdf similarity index 100% rename from figs/uniaxial_dvf_plant.pdf rename to docs/figs/uniaxial_dvf_plant.pdf diff --git a/figs/uniaxial_dvf_plant.png b/docs/figs/uniaxial_dvf_plant.png similarity index 100% rename from figs/uniaxial_dvf_plant.png rename to docs/figs/uniaxial_dvf_plant.png diff --git a/figs/uniaxial_iff_open_loop.pdf b/docs/figs/uniaxial_iff_open_loop.pdf similarity index 100% rename from figs/uniaxial_iff_open_loop.pdf rename to docs/figs/uniaxial_iff_open_loop.pdf diff --git a/figs/uniaxial_iff_open_loop.png b/docs/figs/uniaxial_iff_open_loop.png similarity index 100% rename from figs/uniaxial_iff_open_loop.png rename to docs/figs/uniaxial_iff_open_loop.png diff --git a/figs/uniaxial_iff_plant.pdf b/docs/figs/uniaxial_iff_plant.pdf similarity index 100% rename from figs/uniaxial_iff_plant.pdf rename to docs/figs/uniaxial_iff_plant.pdf diff --git a/figs/uniaxial_iff_plant.png b/docs/figs/uniaxial_iff_plant.png similarity index 100% rename from figs/uniaxial_iff_plant.png rename to docs/figs/uniaxial_iff_plant.png diff --git a/figs/uniaxial_iff_vc_open_loop.pdf b/docs/figs/uniaxial_iff_vc_open_loop.pdf similarity index 100% rename from figs/uniaxial_iff_vc_open_loop.pdf rename to docs/figs/uniaxial_iff_vc_open_loop.pdf diff --git a/figs/uniaxial_iff_vc_open_loop.png b/docs/figs/uniaxial_iff_vc_open_loop.png similarity index 100% rename from figs/uniaxial_iff_vc_open_loop.png rename to docs/figs/uniaxial_iff_vc_open_loop.png diff --git a/figs/uniaxial_plant_cedrat_damped.pdf b/docs/figs/uniaxial_plant_cedrat_damped.pdf similarity index 100% rename from figs/uniaxial_plant_cedrat_damped.pdf rename to docs/figs/uniaxial_plant_cedrat_damped.pdf diff --git a/figs/uniaxial_plant_cedrat_damped.png b/docs/figs/uniaxial_plant_cedrat_damped.png similarity index 100% rename from figs/uniaxial_plant_cedrat_damped.png rename to docs/figs/uniaxial_plant_cedrat_damped.png diff --git a/figs/uniaxial_plant_damped_comp.pdf b/docs/figs/uniaxial_plant_damped_comp.pdf similarity index 100% rename from figs/uniaxial_plant_damped_comp.pdf rename to docs/figs/uniaxial_plant_damped_comp.pdf diff --git a/figs/uniaxial_plant_damped_comp.png b/docs/figs/uniaxial_plant_damped_comp.png similarity index 100% rename from figs/uniaxial_plant_damped_comp.png rename to docs/figs/uniaxial_plant_damped_comp.png diff --git a/figs/uniaxial_plant_dvf_damped.pdf b/docs/figs/uniaxial_plant_dvf_damped.pdf similarity index 100% rename from figs/uniaxial_plant_dvf_damped.pdf rename to docs/figs/uniaxial_plant_dvf_damped.pdf diff --git a/figs/uniaxial_plant_dvf_damped.png b/docs/figs/uniaxial_plant_dvf_damped.png similarity index 100% rename from figs/uniaxial_plant_dvf_damped.png rename to docs/figs/uniaxial_plant_dvf_damped.png diff --git a/figs/uniaxial_plant_iff_damped.pdf b/docs/figs/uniaxial_plant_iff_damped.pdf similarity index 100% rename from figs/uniaxial_plant_iff_damped.pdf rename to docs/figs/uniaxial_plant_iff_damped.pdf diff --git a/figs/uniaxial_plant_iff_damped.png b/docs/figs/uniaxial_plant_iff_damped.png similarity index 100% rename from figs/uniaxial_plant_iff_damped.png rename to docs/figs/uniaxial_plant_iff_damped.png diff --git a/figs/uniaxial_plant_rmc_damped.pdf b/docs/figs/uniaxial_plant_rmc_damped.pdf similarity index 100% rename from figs/uniaxial_plant_rmc_damped.pdf rename to docs/figs/uniaxial_plant_rmc_damped.pdf diff --git a/figs/uniaxial_plant_rmc_damped.png b/docs/figs/uniaxial_plant_rmc_damped.png similarity index 100% rename from figs/uniaxial_plant_rmc_damped.png rename to docs/figs/uniaxial_plant_rmc_damped.png diff --git a/figs/uniaxial_rmc_open_loop.pdf b/docs/figs/uniaxial_rmc_open_loop.pdf similarity index 100% rename from figs/uniaxial_rmc_open_loop.pdf rename to docs/figs/uniaxial_rmc_open_loop.pdf diff --git a/figs/uniaxial_rmc_open_loop.png b/docs/figs/uniaxial_rmc_open_loop.png similarity index 100% rename from figs/uniaxial_rmc_open_loop.png rename to docs/figs/uniaxial_rmc_open_loop.png diff --git a/figs/uniaxial_rmc_plant.pdf b/docs/figs/uniaxial_rmc_plant.pdf similarity index 100% rename from figs/uniaxial_rmc_plant.pdf rename to docs/figs/uniaxial_rmc_plant.pdf diff --git a/figs/uniaxial_rmc_plant.png b/docs/figs/uniaxial_rmc_plant.png similarity index 100% rename from figs/uniaxial_rmc_plant.png rename to docs/figs/uniaxial_rmc_plant.png diff --git a/figs/uniaxial_sensitivity_direct_force.pdf b/docs/figs/uniaxial_sensitivity_direct_force.pdf similarity index 100% rename from figs/uniaxial_sensitivity_direct_force.pdf rename to docs/figs/uniaxial_sensitivity_direct_force.pdf diff --git a/figs/uniaxial_sensitivity_direct_force.png b/docs/figs/uniaxial_sensitivity_direct_force.png similarity index 100% rename from figs/uniaxial_sensitivity_direct_force.png rename to docs/figs/uniaxial_sensitivity_direct_force.png diff --git a/figs/uniaxial_sensitivity_dist_cedrat.pdf b/docs/figs/uniaxial_sensitivity_dist_cedrat.pdf similarity index 100% rename from figs/uniaxial_sensitivity_dist_cedrat.pdf rename to docs/figs/uniaxial_sensitivity_dist_cedrat.pdf diff --git a/figs/uniaxial_sensitivity_dist_cedrat.png b/docs/figs/uniaxial_sensitivity_dist_cedrat.png similarity index 100% rename from figs/uniaxial_sensitivity_dist_cedrat.png rename to docs/figs/uniaxial_sensitivity_dist_cedrat.png diff --git a/figs/uniaxial_sensitivity_dist_comp.pdf b/docs/figs/uniaxial_sensitivity_dist_comp.pdf similarity index 100% rename from figs/uniaxial_sensitivity_dist_comp.pdf rename to docs/figs/uniaxial_sensitivity_dist_comp.pdf diff --git a/figs/uniaxial_sensitivity_dist_comp.png b/docs/figs/uniaxial_sensitivity_dist_comp.png similarity index 100% rename from figs/uniaxial_sensitivity_dist_comp.png rename to docs/figs/uniaxial_sensitivity_dist_comp.png diff --git a/figs/uniaxial_sensitivity_dist_dvf.pdf b/docs/figs/uniaxial_sensitivity_dist_dvf.pdf similarity index 100% rename from figs/uniaxial_sensitivity_dist_dvf.pdf rename to docs/figs/uniaxial_sensitivity_dist_dvf.pdf diff --git a/figs/uniaxial_sensitivity_dist_dvf.png b/docs/figs/uniaxial_sensitivity_dist_dvf.png similarity index 100% rename from figs/uniaxial_sensitivity_dist_dvf.png rename to docs/figs/uniaxial_sensitivity_dist_dvf.png diff --git a/figs/uniaxial_sensitivity_dist_iff.pdf b/docs/figs/uniaxial_sensitivity_dist_iff.pdf similarity index 100% rename from figs/uniaxial_sensitivity_dist_iff.pdf rename to docs/figs/uniaxial_sensitivity_dist_iff.pdf diff --git a/figs/uniaxial_sensitivity_dist_iff.png b/docs/figs/uniaxial_sensitivity_dist_iff.png similarity index 100% rename from figs/uniaxial_sensitivity_dist_iff.png rename to docs/figs/uniaxial_sensitivity_dist_iff.png diff --git a/figs/uniaxial_sensitivity_dist_rmc.pdf b/docs/figs/uniaxial_sensitivity_dist_rmc.pdf similarity index 100% rename from figs/uniaxial_sensitivity_dist_rmc.pdf rename to docs/figs/uniaxial_sensitivity_dist_rmc.pdf diff --git a/figs/uniaxial_sensitivity_dist_rmc.png b/docs/figs/uniaxial_sensitivity_dist_rmc.png similarity index 100% rename from figs/uniaxial_sensitivity_dist_rmc.png rename to docs/figs/uniaxial_sensitivity_dist_rmc.png diff --git a/figs/uniaxial_sensitivity_dist_stages_cedrat.pdf b/docs/figs/uniaxial_sensitivity_dist_stages_cedrat.pdf similarity index 100% rename from figs/uniaxial_sensitivity_dist_stages_cedrat.pdf rename to docs/figs/uniaxial_sensitivity_dist_stages_cedrat.pdf diff --git a/figs/uniaxial_sensitivity_dist_stages_cedrat.png b/docs/figs/uniaxial_sensitivity_dist_stages_cedrat.png similarity index 100% rename from figs/uniaxial_sensitivity_dist_stages_cedrat.png rename to docs/figs/uniaxial_sensitivity_dist_stages_cedrat.png diff --git a/figs/uniaxial_sensitivity_dist_stages_comp.pdf b/docs/figs/uniaxial_sensitivity_dist_stages_comp.pdf similarity index 100% rename from figs/uniaxial_sensitivity_dist_stages_comp.pdf rename to docs/figs/uniaxial_sensitivity_dist_stages_comp.pdf diff --git a/figs/uniaxial_sensitivity_dist_stages_comp.png b/docs/figs/uniaxial_sensitivity_dist_stages_comp.png similarity index 100% rename from figs/uniaxial_sensitivity_dist_stages_comp.png rename to docs/figs/uniaxial_sensitivity_dist_stages_comp.png diff --git a/figs/uniaxial_sensitivity_dist_stages_dvf.pdf b/docs/figs/uniaxial_sensitivity_dist_stages_dvf.pdf similarity index 100% rename from figs/uniaxial_sensitivity_dist_stages_dvf.pdf rename to docs/figs/uniaxial_sensitivity_dist_stages_dvf.pdf diff --git a/figs/uniaxial_sensitivity_dist_stages_dvf.png b/docs/figs/uniaxial_sensitivity_dist_stages_dvf.png similarity index 100% rename from figs/uniaxial_sensitivity_dist_stages_dvf.png rename to docs/figs/uniaxial_sensitivity_dist_stages_dvf.png diff --git a/figs/uniaxial_sensitivity_dist_stages_iff.pdf b/docs/figs/uniaxial_sensitivity_dist_stages_iff.pdf similarity index 100% rename from figs/uniaxial_sensitivity_dist_stages_iff.pdf rename to docs/figs/uniaxial_sensitivity_dist_stages_iff.pdf diff --git a/figs/uniaxial_sensitivity_dist_stages_iff.png b/docs/figs/uniaxial_sensitivity_dist_stages_iff.png similarity index 100% rename from figs/uniaxial_sensitivity_dist_stages_iff.png rename to docs/figs/uniaxial_sensitivity_dist_stages_iff.png diff --git a/figs/uniaxial_sensitivity_dist_stages_rmc.pdf b/docs/figs/uniaxial_sensitivity_dist_stages_rmc.pdf similarity index 100% rename from figs/uniaxial_sensitivity_dist_stages_rmc.pdf rename to docs/figs/uniaxial_sensitivity_dist_stages_rmc.pdf diff --git a/figs/uniaxial_sensitivity_dist_stages_rmc.png b/docs/figs/uniaxial_sensitivity_dist_stages_rmc.png similarity index 100% rename from figs/uniaxial_sensitivity_dist_stages_rmc.png rename to docs/figs/uniaxial_sensitivity_dist_stages_rmc.png diff --git a/figs/uniaxial_sensitivity_frz.pdf b/docs/figs/uniaxial_sensitivity_frz.pdf similarity index 100% rename from figs/uniaxial_sensitivity_frz.pdf rename to docs/figs/uniaxial_sensitivity_frz.pdf diff --git a/figs/uniaxial_sensitivity_frz.png b/docs/figs/uniaxial_sensitivity_frz.png similarity index 100% rename from figs/uniaxial_sensitivity_frz.png rename to docs/figs/uniaxial_sensitivity_frz.png diff --git a/figs/uniaxial_sensitivity_fty.pdf b/docs/figs/uniaxial_sensitivity_fty.pdf similarity index 100% rename from figs/uniaxial_sensitivity_fty.pdf rename to docs/figs/uniaxial_sensitivity_fty.pdf diff --git a/figs/uniaxial_sensitivity_fty.png b/docs/figs/uniaxial_sensitivity_fty.png similarity index 100% rename from figs/uniaxial_sensitivity_fty.png rename to docs/figs/uniaxial_sensitivity_fty.png diff --git a/figs/uniaxial_sensitivity_ground_motion.pdf b/docs/figs/uniaxial_sensitivity_ground_motion.pdf similarity index 100% rename from figs/uniaxial_sensitivity_ground_motion.pdf rename to docs/figs/uniaxial_sensitivity_ground_motion.pdf diff --git a/figs/uniaxial_sensitivity_ground_motion.png b/docs/figs/uniaxial_sensitivity_ground_motion.png similarity index 100% rename from figs/uniaxial_sensitivity_ground_motion.png rename to docs/figs/uniaxial_sensitivity_ground_motion.png diff --git a/figs/variation_zeros_active_damping_plants.pdf b/docs/figs/variation_zeros_active_damping_plants.pdf similarity index 100% rename from figs/variation_zeros_active_damping_plants.pdf rename to docs/figs/variation_zeros_active_damping_plants.pdf diff --git a/figs/variation_zeros_active_damping_plants.png b/docs/figs/variation_zeros_active_damping_plants.png similarity index 100% rename from figs/variation_zeros_active_damping_plants.png rename to docs/figs/variation_zeros_active_damping_plants.png diff --git a/functions/index.html b/docs/functions.html similarity index 86% rename from functions/index.html rename to docs/functions.html index 5955185..a2193ab 100644 --- a/functions/index.html +++ b/docs/functions.html @@ -1,10 +1,11 @@ + - + Matlab Functions used for the NASS Project @@ -259,21 +260,20 @@ for the JavaScript code in this tag.

    Table of Contents

    -
    -

    1 TODO computePsdDispl

    +
    +

    1 computePsdDispl

    - +

    @@ -309,11 +309,11 @@ This Matlab function is accessible here.

    -
    -

    2 TODO computeSetpoint

    +
    +

    2 computeSetpoint

    - +

    @@ -385,11 +385,11 @@ setpoint(4:6) = [thetax, thetay, thetaz];

    -
    -

    3 TODO converErrorBasis

    +
    +

    3 converErrorBasis

    - +

    @@ -527,48 +527,11 @@ error_nass = [dx; dy; dz; thetax; thetay; thetaz];

    -
    -

    4 Inverse Kinematics of the Hexapod

    +
    +

    4 computeReferencePose

    - -

    - -

    -This Matlab function is accessible here. -

    - -
    -
    function [L] = inverseKinematicsHexapod(hexapod, AP, ARB)
    -% inverseKinematicsHexapod - Compute the initial position of each leg to have the wanted Hexapod's position
    -%
    -% Syntax: inverseKinematicsHexapod(hexapod, AP, ARB)
    -%
    -% Inputs:
    -%    - hexapod - Hexapod object containing the geometry of the hexapod
    -%    - AP - Position vector of point OB expressed in frame {A} in [m]
    -%    - ARB - Rotation Matrix expressed in frame {A}
    -
    -  % Wanted Length of the hexapod's legs [m]
    -  L = zeros(6, 1);
    -
    -  for i = 1:length(L)
    -    Bbi = hexapod.pos_top_tranform(i, :)' - 1e-3*[0 ; 0 ; hexapod.TP.thickness+hexapod.Leg.sphere.top+hexapod.SP.thickness.top+hexapod.jacobian]; % [m]
    -    Aai = hexapod.pos_base(i, :)' + 1e-3*[0 ; 0 ; hexapod.BP.thickness+hexapod.Leg.sphere.bottom+hexapod.SP.thickness.bottom-hexapod.h-hexapod.jacobian]; % [m]
    -
    -    L(i) = sqrt(AP'*AP + Bbi'*Bbi + Aai'*Aai - 2*AP'*Aai + 2*AP'*(ARB*Bbi) - 2*(ARB*Bbi)'*Aai);
    -  end
    -end
    -
    -
    -
    -
    - -
    -

    5 computeReferencePose

    -
    -

    - +

    @@ -648,7 +611,7 @@ This Matlab function is accessible here 0 0 1 Dn(3) ; 0 0 0 1 ]; - Rn(1:3, 1:3) = Rnx*Rny*Rnz; + Rn(1:3, 1:3) = Rnz*Rny*Rnx; %% Total Homogeneous transformation WTr = Rty*Rry*Rrz*Rh*Rn; @@ -657,11 +620,11 @@ This Matlab function is accessible here

    -
    -

    6 Compute the Sample Position Error w.r.t. the NASS

    -
    +
    +

    5 Compute the Sample Position Error w.r.t. the NASS

    +

    - +

    @@ -696,7 +659,7 @@ MTr = [WTm(1:3,1:3)<

    Author: Dehaeze Thomas

    -

    Created: 2020-01-29 mer. 20:25

    +

    Created: 2020-02-25 mar. 18:08

    diff --git a/hac_lac/index.html b/docs/hac_lac.html similarity index 80% rename from hac_lac/index.html rename to docs/hac_lac.html index 28709ea..375a2e3 100644 --- a/hac_lac/index.html +++ b/docs/hac_lac.html @@ -1,10 +1,11 @@ + - + HAC-LAC applied on the Simscape Model @@ -259,28 +260,28 @@ for the JavaScript code in this tag.

    Table of Contents

    -
    -

    1 Undamped System

    +
    +

    1 Undamped System

    - +

    -
    -

    1.1 Identification of the plant

    +
    +

    1.1 Identification of the plant

    -
    -

    1.1.1 Initialize the Simulation

    +
    +

    1.1.1 Initialize the Simulation

    We initialize all the stages with the default parameters. @@ -348,21 +349,14 @@ We set the references to zero. And all the controllers are set to 0.

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

    1.1.2 Identification

    +
    +

    1.1.2 Identification

    First, we identify the dynamics of the system using the linearize function. @@ -373,12 +367,12 @@ options = linearizeOptions; options.SampleTime = 0; %% Name of the Simulink File -mdl = 'sim_nass_hac_lac'; +mdl = 'nass_model'; %% Input/Output definition clear io; io_i = 1; -io(io_i) = linio([mdl, '/HAC'], 1, 'openinput'); io_i = io_i + 1; -io(io_i) = linio([mdl, '/Compute Error in NASS base'], 2, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs +io(io_i) = linio([mdl, '/Tracking Error'], 1, 'openoutput', [], 'En'); io_i = io_i + 1; % Metrology Outputs %% Run the linearization G = linearize(mdl, io, options); @@ -402,11 +396,11 @@ G_legs.OutputName = {'e1', -

    1.1.3 Display TF

    +
    +

    1.1.3 Display TF

    -
    +

    plant_G_cart.png

    Figure 1: Transfer Function from forces applied by the nano-hexapod to position error (png, pdf)

    @@ -414,25 +408,25 @@ G_legs.OutputName = {'e1', -

    1.1.4 Obtained Plants for Active Damping

    +
    +

    1.1.4 Obtained Plants for Active Damping

    -
    +

    nass_active_damping_iff_plant.png

    Figure 2: G_iff: IFF Plant (png, pdf)

    -
    +

    nass_active_damping_ine_plant.png

    Figure 3: G_dvf: Plant for Direct Velocity Feedback (png, pdf)

    -
    +

    nass_active_damping_inertial_plant.png

    Figure 4: Inertial Feedback Plant (png, pdf)

    @@ -441,12 +435,12 @@ G_legs.OutputName = {'e1', -

    1.2 Tomography Experiment

    +
    +

    1.2 Tomography Experiment

    -
    -

    1.2.1 Simulation

    +
    +

    1.2.1 Simulation

    We initialize elements for the tomography experiment. @@ -460,8 +454,8 @@ We initialize elements for the tomography experiment. We change the simulation stop time.

    -
    load('mat/conf_simscape.mat');
    -set_param(conf_simscape, 'StopTime', '3');
    +
    load('mat/conf_simulink.mat');
    +set_param(conf_simulink, 'StopTime', '3');
     
    @@ -469,7 +463,7 @@ We change the simulation stop time. And we simulate the system.

    -
    sim('sim_nass_active_damping');
    +
    sim('nass_model');
     
    @@ -483,8 +477,8 @@ Finally, we save the simulation results for further analysis
    -
    -

    1.2.2 Results

    +
    +

    1.2.2 Results

    We load the results of tomography experiments. @@ -496,14 +490,14 @@ t = linspace(0, 3, length(En(:,1)));

    -
    +

    nass_act_damp_undamped_sim_tomo_trans.png

    Figure 5: Position Error during tomography experiment - Translations (png, pdf)

    -
    +

    nass_act_damp_undamped_sim_tomo_rot.png

    Figure 6: Position Error during tomography experiment - Rotations (png, pdf)

    @@ -511,12 +505,13 @@ t = linspace(0, 3, length(En(:,1)));
    -
    -

    1.3 Verification of the transfer function from nano hexapod to metrology

    + +
    +

    1.3 Verification of the transfer function from nano hexapod to metrology

    -
    -

    1.3.1 Initialize the Simulation

    +
    +

    1.3.1 Initialize the Simulation

    We initialize all the stages with the default parameters. @@ -562,21 +557,14 @@ We set the references to zero. And all the controllers are set to 0.

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

    1.3.2 Identification

    +
    +

    1.3.2 Identification

    First, we identify the dynamics of the system using the linearize function. @@ -587,12 +575,12 @@ options = linearizeOptions; options.SampleTime = 0; %% Name of the Simulink File -mdl = 'sim_nass_hac_lac'; +mdl = 'nass_model'; %% Input/Output definition clear io; io_i = 1; -io(io_i) = linio([mdl, '/HAC'], 1, 'openinput'); io_i = io_i + 1; -io(io_i) = linio([mdl, '/Compute Error in NASS base'], 2, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs +io(io_i) = linio([mdl, '/Tracking Error'], 1, 'openoutput', [], 'En'); io_i = io_i + 1; % Metrology Outputs %% Run the linearization G = linearize(mdl, io, options); @@ -616,11 +604,11 @@ G_legs.OutputName = {'e1', -

    1.3.3 Display TF

    +
    +

    1.3.3 Display TF

    -
    +

    plant_G_cart.png

    Figure 7: Transfer Function from forces applied by the nano-hexapod to position error (png, pdf)

    @@ -628,25 +616,25 @@ G_legs.OutputName = {'e1', -

    1.3.4 Obtained Plants for Active Damping

    +
    +

    1.3.4 Obtained Plants for Active Damping

    -
    +

    nass_active_damping_iff_plant.png

    Figure 8: G_iff: IFF Plant (png, pdf)

    -
    +

    nass_active_damping_ine_plant.png

    Figure 9: G_dvf: Plant for Direct Velocity Feedback (png, pdf)

    -
    +

    nass_active_damping_inertial_plant.png

    Figure 10: Inertial Feedback Plant (png, pdf)

    @@ -658,7 +646,7 @@ G_legs.OutputName = {'e1',

    Author: Dehaeze Thomas

    -

    Created: 2020-01-29 mer. 20:35

    +

    Created: 2020-02-25 mar. 18:08

    diff --git a/identification/index.html b/docs/identification.html similarity index 63% rename from identification/index.html rename to docs/identification.html index 3b67031..acc7622 100644 --- a/identification/index.html +++ b/docs/identification.html @@ -1,9 +1,11 @@ + + - + Identification @@ -205,7 +207,7 @@ @licstart The following is the entire license notice for the JavaScript code in this tag. -Copyright (C) 2012-2019 Free Software Foundation, Inc. +Copyright (C) 2012-2020 Free Software Foundation, Inc. The JavaScript code in this tag is free software: you can redistribute it and/or modify it under the terms of the GNU @@ -246,31 +248,16 @@ for the JavaScript code in this tag. } /*]]>*///--> - - + + @@ -314,8 +301,8 @@ We can then compare the measured Frequency Response Functions with the identifie Finally, this should help to tune the parameters of the model such that the dynamics is closer to the measured FRF.

    -
    -

    1 Some notes about the Simscape Model

    +
    +

    1 Some notes about the Simscape Model

    The Simscape Model of the micro-station consists of several solid bodies: @@ -341,19 +328,19 @@ Some of the springs and dampers values can be estimated from the joints/stages s

    -
    -

    2 Compare with measurements at the CoM of each element

    +
    +

    2 Compare with measurements at the CoM of each element

    -
    -

    2.1 Prepare the Simulation

    +
    +

    2.1 Prepare the Simulation

    -
    open('identification/matlab/sim_micro_station_com.slx')
    +
    open('nass_model.slx')
     
    @@ -361,7 +348,7 @@ Some of the springs and dampers values can be estimated from the joints/stages s We load the configuration.

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

    -
    set_param(conf_simscape, 'StopTime', '0.5');
    +
    set_param(conf_simulink, 'StopTime', '0.5');
     
    @@ -377,38 +364,46 @@ We set a small StopTime. We initialize all the stages.

    -
    initializeGround();
    -initializeGranite();
    -initializeTy();
    -initializeRy();
    -initializeRz();
    -initializeMicroHexapod();
    -initializeAxisc();
    -initializeMirror();
    -initializeNanoHexapod(struct('actuator', 'piezo'));
    -initializeSample(struct('mass', 50));
    +
    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');
    +
    +initializeController(  'type', 'open-loop');
    +
    +initializeLoggingConfiguration('log', 'none');
    +
    +initializeReferences();
    +initializeDisturbances('enable', false);
     
    -
    -

    2.2 Estimate the position of the CoM of each solid and compare with the one took for the Measurement Analysis

    +
    +

    2.2 Estimate the position of the CoM of each solid and compare with the one took for the Measurement Analysis

    Thanks to the Inertia Sensor simscape block, it is possible to estimate the position of the Center of Mass of a solid body with respect to a defined frame.

    -
    sim('sim_micro_station_com')
    +
    sim('nass_model')
     

    -The results are shown in the table 1. +The results are shown in the table 1.

    -
    Table 1: Conclusion on the variability of the system dynamics for active damping
    +
    @@ -471,10 +466,10 @@ The results are shown in the table 1.
    Table 1: Center of Mass of each solid body as defined in Simscape

    -We can compare the obtained center of mass (table 1) with the one used for the Modal Analysis shown in table 2. +We can compare the obtained center of mass (table 1) with the one used for the Modal Analysis shown in table 2.

    - +
    @@ -548,8 +543,8 @@ However, in SolidWorks, this has probably not be included with the top granite. -
    -

    2.3 Create a frame at the CoM of each solid body

    +
    +

    2.3 Create a frame at the CoM of each solid body

    Now we use one inertiasensor block connected on each solid body that measured the center of mass of this solid with respect to the same connected frame. @@ -560,12 +555,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')
     
    @@ -635,14 +630,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');
     
    @@ -652,60 +647,57 @@ Then, we use the obtained results to add a rigidTransform block in
    -
    -

    2.4 Identification of the dynamics of the Simscape Model

    +
    +

    2.4 Identification of the dynamics of the Simscape Model

    We now use a new Simscape Model where 6DoF inertial sensors are located at the Center of Mass of each solid body.

    -
    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('identification/matlab/sim_micro_station_modal_analysis_com.slx')
    +
    open('nass_model.slx')
     

    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 = linearizeOptions;
    -options.SampleTime = 0;
    +options.SampleTime = 0;
     
     %% Name of the Simulink File
    -mdl = 'sim_micro_station_modal_analysis_com';
    -
    -
    +mdl = 'nass_model'; -
    -
    %% Micro-Hexapod
    -% Input/Output definition
    -io(1) = linio([mdl, '/F_hammer'],1,'openinput');
    -io(2) = linio([mdl, '/acc_gtop'],1,'output');
    -io(3) = linio([mdl, '/acc_ty'],1,'output');
    -io(4) = linio([mdl, '/acc_ry'],1,'output');
    -io(5) = linio([mdl, '/acc_rz'],1,'output');
    -io(6) = linio([mdl, '/acc_hexa'],1,'output');
    +%% 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;
     
    % Run the linearization
    -G_ms = linearize(mdl, io, 0);
    +G_ms = linearize(mdl, io, 0);
     
    -% Input/Output names
    -G_ms.InputName  = {'Fx', 'Fy', 'Fz'};
    -G_ms.OutputName = {'gtop_x', 'gtop_y', 'gtop_z', 'gtop_rx', 'gtop_ry', 'gtop_rz', ...
    +%% Input/Output definition
    +clear io; io_i = 1;
    +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'};
    +                   'hexa_x', 'hexa_y', 'hexa_z', 'hexa_rx', 'hexa_ry', 'hexa_rz'};
     
    @@ -714,22 +706,22 @@ 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;
     
    -
    -

    2.5 Compare with measurements

    +
    +

    2.5 Compare with measurements

    We now load the Frequency Response Functions measurements during the Modal Analysis (accessible here).

    -
    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');
     
    @@ -738,7 +730,7 @@ We then compare the measurements with the identified transfer functions using th

    -
    +

    identification_comp_bot_stages.png

    Figure 1: caption (png, pdf)

    @@ -746,7 +738,7 @@ We then compare the measurements with the identified transfer functions using th -
    +

    identification_comp_mid_stages.png

    Figure 2: caption (png, pdf)

    @@ -754,7 +746,7 @@ We then compare the measurements with the identified transfer functions using th -
    +

    identification_comp_top_stages.png

    Figure 3: caption (png, pdf)

    @@ -764,8 +756,8 @@ We then compare the measurements with the identified transfer functions using th
    -
    -

    3 Conclusion

    +
    +

    3 Conclusion

    @@ -279,28 +279,28 @@ for the JavaScript code in this tag. Here are links to the documents related to the Simscape model of the Nano-Active-Stabilization-System.

    -
    -

    1 Simulink Project (link)

    +
    +

    1 Simulink Project (link)

    The project is managed with a Simulink Project. -Such project is briefly presented here. +Such project is briefly presented here.

    -
    -

    2 Simscape Model (link)

    +
    +

    2 Simscape Model (link)

    The model of the NASS is based on Simulink and Simscape Multi-Body. -Such toolbox is presented here. +Such toolbox is presented here.

    -
    -

    3 Simscape Subsystems (link)

    +
    +

    3 Simscape Subsystems (link)

    The model is decomposed of multiple subsystems. @@ -309,64 +309,55 @@ These subsystems are shared among multiple files.

    -All these subsystems are described here. +All these subsystems are described here.

    -
    -

    4 Kinematics of the Station (link)

    +
    +

    4 Kinematics of the Station (link)

    First, we consider perfectly rigid elements and joints and we just study the kinematic of the station. This permits to test if each stage is moving correctly. -This is detailed here. +This is detailed here.

    -
    -

    5 Metrology (link)

    +
    +

    5 Computation of the positioning error of the Sample (link)

    -In this document (accessible here), we discuss the measurement of the sample with respect to the granite. -

    -
    -
    - -
    -

    6 Computation of the positioning error of the Sample (link)

    -
    -

    From the measurement of the position of the sample with respect to the granite and from the wanted position of each stage, we can compute the positioning error of the sample with respect to the nano-hexapod. -This is done here. +This is done here.

    -
    -

    7 Tuning of the Dynamics of the Simscape model (link)

    -
    +
    +

    6 Tuning of the Dynamics of the Simscape model (link)

    +

    From dynamical measurements perform on the real positioning station, we tune the parameters of the simscape model to have similar dynamics.

    -This is explained here. +This is explained here.

    -
    -

    8 Disturbances (link)

    -
    +
    +

    7 Disturbances (link)

    +

    The effect of disturbances on the position of the micro-station have been measured. These are now converted to force disturbances using the Simscape model.

    -This is discussed here. +This is discussed here.

    @@ -375,53 +366,53 @@ We also discuss how the disturbances are implemented in the model.

    -
    -

    9 Tomography Experiment (link)

    -
    +
    +

    8 Tomography Experiment (link)

    +

    Now that the dynamics of the Model have been tuned and the Disturbances have included, we can simulate experiments.

    -Tomography experiments are simulated and the results are presented here. +Tomography experiments are simulated and the results are presented here.

    -
    -

    10 Active Damping Techniques on the Uni-axial Model (link)

    -
    +
    +

    9 Active Damping Techniques on the Uni-axial Model (link)

    +

    Active damping techniques are applied to the Uniaxial Simscape model.

    -
    -

    11 Active Damping Techniques on the full Simscape Model (link)

    -
    +
    +

    10 Active Damping Techniques on the full Simscape Model (link)

    +

    Active damping techniques are applied to the full Simscape model.

    -
    -

    12 Useful Matlab Functions (link)

    -
    +
    +

    11 Useful Matlab Functions (link)

    +

    Many matlab functions are shared among all the files of the projects.

    -These functions are all defined here. +These functions are all defined here.

    Author: Dehaeze Thomas

    -

    Created: 2020-01-30 jeu. 13:56

    +

    Created: 2020-02-25 mar. 18:08

    diff --git a/js/bootstrap.min.js b/docs/js/bootstrap.min.js similarity index 100% rename from js/bootstrap.min.js rename to docs/js/bootstrap.min.js diff --git a/js/jquery.min.js b/docs/js/jquery.min.js similarity index 100% rename from js/jquery.min.js rename to docs/js/jquery.min.js diff --git a/js/jquery.stickytableheaders.min.js b/docs/js/jquery.stickytableheaders.min.js similarity index 100% rename from js/jquery.stickytableheaders.min.js rename to docs/js/jquery.stickytableheaders.min.js diff --git a/js/readtheorg.js b/docs/js/readtheorg.js similarity index 100% rename from js/readtheorg.js rename to docs/js/readtheorg.js diff --git a/kinematics/index.html b/docs/kinematics.html similarity index 66% rename from kinematics/index.html rename to docs/kinematics.html index 6a07f96..7f0c87d 100644 --- a/kinematics/index.html +++ b/docs/kinematics.html @@ -1,9 +1,11 @@ + + - + Kinematics of the station @@ -205,7 +207,7 @@ @licstart The following is the entire license notice for the JavaScript code in this tag. -Copyright (C) 2012-2019 Free Software Foundation, Inc. +Copyright (C) 2012-2020 Free Software Foundation, Inc. The JavaScript code in this tag is free software: you can redistribute it and/or modify it under the terms of the GNU @@ -246,31 +248,16 @@ for the JavaScript code in this tag. } /*]]>*///--> - - + +
    @@ -283,16 +270,16 @@ for the JavaScript code in this tag.

    Table of Contents

      -
    • 1. Micro Hexapod +
    • 1. Micro Hexapod
        -
      • 1.1. How the Symetrie Hexapod is controlled on the micro station
      • -
      • 1.2. Control of the Micro-Hexapod using Simscape +
      • 1.1. How the Symetrie Hexapod is controlled on the micro station
      • +
      • 1.2. Control of the Micro-Hexapod using Simscape @@ -307,12 +294,12 @@ for the JavaScript code in this tag. In this document, we discuss the way the motion of each stage is defined.

        -
        -

        1 Micro Hexapod

        +
        +

        1 Micro Hexapod

        -
        -

        1.1 How the Symetrie Hexapod is controlled on the micro station

        +
        +

        1.1 How the Symetrie Hexapod is controlled on the micro station

        For the Micro-Hexapod, the convention for the angles are defined in MAN_A_Software API_4.0.150918_EN.pdf on page 13 (section 2.4 - Rotation Vectors): @@ -340,7 +327,7 @@ This writing is unique and equal to:

        The Euler type II convention corresponding to the succession of rotations with respect to fixed axes: first around X0, then Y0 and Z0. -This is equivalent to the succession of rotations with respect to mobile axes: first around Z0, then Y1' and X2'. +This is equivalent to the succession of rotations with respect to mobile axes: first around Z0, then Y1’ and X2’.

        @@ -360,8 +347,8 @@ Thus, it does the translations and then the rotation around the new translated f
        -
        -

        1.2 Control of the Micro-Hexapod using Simscape

        +
        +

        1.2 Control of the Micro-Hexapod using Simscape

        We can think of two main ways to position the Micro-Hexapod using Simscape. @@ -378,15 +365,15 @@ This require a little bit more of mathematical derivations but this is the chose

        -
        -

        1.2.1 Using Bushing Joint

        +
        +

        1.2.1 Using Bushing Joint

        -In the documentation of the Bushing Joint (doc "Bushing Joint") that is used to position the Hexapods, it is mention that the following frame is positioned with respect to the base frame in a way shown in figure 1. +In the documentation of the Bushing Joint (doc "Bushing Joint") that is used to position the Hexapods, it is mention that the following frame is positioned with respect to the base frame in a way shown in figure 1.

        -
        +

        bushing_joint_transform.png

        Figure 1: Joint Transformation Sequence for the Bushing Joint

        @@ -399,13 +386,13 @@ The three rotations that we define thus corresponds to the Euler U-V-W angles.

        We should have the same behavior for the Micro-Hexapod on Simscape (same inputs at least). -However, the Bushing Joint makes rotations around mobiles axes (X, Y' and then Z'') and not fixed axes (X, Y and Z). +However, the Bushing Joint makes rotations around mobiles axes (X, Y’ and then Z’’) and not fixed axes (X, Y and Z).

        -
        -

        1.2.2 Using Inverse Kinematics and Leg Actuators

        +
        +

        1.2.2 Using Inverse Kinematics and Leg Actuators

        Here, we can use the Inverse Kinematic of the Hexapod to determine the length of each leg in order to obtain some defined translation and rotation of the mobile platform. @@ -416,7 +403,7 @@ The advantages are:

        • we can position the Hexapod as we want by specifying a rotation matrix
        • -
        • the hexapod keeps its full flexibility as we don't specify any wanted displacements, only leg's rest position
        • +
        • the hexapod keeps its full flexibility as we don’t specify any wanted displacements, only leg’s rest position

        @@ -431,8 +418,8 @@ Thus, for this simulation, we remove the gravity.

        -
        -
        1.2.2.1 Theory
        +
        +
        1.2.2.1 Theory

        For inverse kinematic analysis, it is assumed that the position \({}^A\bm{P}\) and orientation of the moving platform \({}^A\bm{R}_B\) are given and the problem is to obtain the joint variables, namely, \(\bm{L} = [l_1, l_2, \dots, l_6]^T\). @@ -462,19 +449,19 @@ Hence, for \(i = 1, 2, \dots, 6\), each limb length can be uniquely determined b

        If the position and orientation of the moving platform lie in the feasible workspace of the manipulator, one unique solution to the limb length is determined by the above equation. -Otherwise, when the limbs' lengths derived yield complex numbers, then the position or orientation of the moving platform is not reachable. +Otherwise, when the limbs’ lengths derived yield complex numbers, then the position or orientation of the moving platform is not reachable.

        -
        -
        1.2.2.2 Matlab Implementation
        +
        +
        1.2.2.2 Matlab Implementation

        We open the Simulink file.

        -
        open('kinematics/matlab/hexapod_tests.slx')
        +
        open('nass_model.slx')
         
        @@ -482,8 +469,8 @@ We open the Simulink file. We load the configuration and set a small StopTime.

        -
        load('mat/conf_simscape.mat');
        -set_param(conf_simscape, 'StopTime', '0.5');
        +
        load('mat/conf_simulink.mat');
        +set_param(conf_simulink, 'StopTime', '0.1');
         
        @@ -491,26 +478,40 @@ We load the configuration and set a small StopTime. We define the wanted position/orientation of the Hexapod under study.

        -
        tx = 0.1; % [rad]
        -ty = 0.2; % [rad]
        -tz = 0.05; % [rad]
        +
        tx = 0.05; % [rad]
        +ty = 0.1; % [rad]
        +tz = 0.02; % [rad]
         
        -Rx = [1 0        0;
        -      0 cos(tx) -sin(tx);
        -      0 sin(tx)  cos(tx)];
        +Rx = [1 0        0;
        +      0 cos(tx) -sin(tx);
        +      0 sin(tx)  cos(tx)];
         
        -Ry = [ cos(ty) 0 sin(ty);
        -      0        1 0;
        -      -sin(ty) 0 cos(ty)];
        +Ry = [ cos(ty) 0 sin(ty);
        +      0        1 0;
        +      -sin(ty) 0 cos(ty)];
         
        -Rz = [cos(tz) -sin(tz) 0;
        -      sin(tz)  cos(tz) 0;
        -      0        0       1];
        +Rz = [cos(tz) -sin(tz) 0;
        +      sin(tz)  cos(tz) 0;
        +      0        0       1];
         
         ARB = Rz*Ry*Rx;
        -AP = [0.01; 0.02; 0.03]; % [m]
        +AP = [0.1; 0.005; 0.01]; % [m]
        +
        +
        -hexapod = initializeMicroHexapod(struct('AP', AP, 'ARB', ARB)); +
        +
        initializeSimscapeConfiguration('gravity', false);
        +initializeGround('type', 'none');
        +initializeGranite('type', 'none');
        +initializeTy('type', 'none');
        +initializeRy('type', 'none');
        +initializeRz('type', 'none');
        +initializeMicroHexapod('type', 'rigid', 'AP', AP, 'ARB', ARB);
        +initializeAxisc('type', 'none');
        +initializeMirror('type', 'none');
        +initializeNanoHexapod('type', 'none');
        +initializeSample('type', 'none');
        +initializeLoggingConfiguration('log', 'all');
         
        @@ -518,7 +519,7 @@ hexapod = initializeMicroHexapod(
        -
        sim('hexapod_tests')
        +
        sim('nass_model');
         
        @@ -526,7 +527,7 @@ We run the simulation. And we verify that we indeed succeed to go to the wanted position.

        -
        [simout.x.Data(end) ; simout.y.Data(end) ; simout.z.Data(end)] - AP
        +
        [simout.Dhm.x.Data(end) ; simout.Dhm.y.Data(end) ; simout.Dhm.z.Data(end)] - AP
         
        @@ -538,21 +539,21 @@ And we verify that we indeed succeed to go to the wanted position.
    - + - + - +
    Table 2: Estimated Center of Mass of each solid body using Solidworks
    1.611e-108.4655e-16
    -1.3748e-101.5586e-15
    8.4879e-11-2.1337e-16
    -
    simout.R.Data(:, :, end)-ARB
    +
    simout.Dhm.R.Data(:, :, end)-ARB
     
    @@ -568,21 +569,21 @@ And we verify that we indeed succeed to go to the wanted position. --1.2659e-10 -6.5603e-11 -6.2183e-10 +-1.1102e-16 +-1.36e-15 +4.2744e-15 -1.0354e-10 --5.2439e-11 --5.2425e-10 +1.0651e-15 +6.6613e-16 +5.1278e-15 --5.9816e-10 -5.532e-10 --1.7737e-10 +-4.2882e-15 +-4.9336e-15 +1.1102e-16 @@ -594,8 +595,7 @@ And we verify that we indeed succeed to go to the wanted position.

    Author: Dehaeze Thomas

    -

    Created: 2019-12-12 jeu. 11:39

    -

    Validate

    +

    Created: 2020-02-25 mar. 18:07

    diff --git a/positioning_error/index.html b/docs/positioning_error.html similarity index 76% rename from positioning_error/index.html rename to docs/positioning_error.html index 373c2c4..775177d 100644 --- a/positioning_error/index.html +++ b/docs/positioning_error.html @@ -1,10 +1,11 @@ + - + Computation of the Positioning Error with respect to the nano-hexapod @@ -247,31 +248,16 @@ for the JavaScript code in this tag. } /*]]>*///--> - - + +
    @@ -284,19 +270,20 @@ for the JavaScript code in this tag.

    Table of Contents

    -The global measurement and control schematic is shown in figure 1. +The global measurement and control schematic is shown in figure 1.

    -
    +

    control-schematic-nass.png

    Figure 1: Global Control Schematic for the Station

    -In this document, we develop and verify that the two green blocs are working. +In this document, are interesting by the “compute Sample Position w.r.t. Granite” bloc and we develop and verify that the two green blocs are working.

    @@ -330,34 +317,69 @@ Also, all the stages can be perfectly positioned.

    -In section 1, we verify that the function developed to compute the wanted pose (translation and orientation) of the sample with respect to the granite can be determined from the wanted position of each stage (translation stage, tilt stage, spindle and micro-hexapod). This corresponds to the bloc “Compute Wanted Sample Position w.r.t. Granite” in figure 1. +First, in section 1, is explained how the measurement of the position of the sample with respect to the granite is performed (using Simscape blocs). +

    + +

    +In section 2, we verify that the function developed to compute the wanted pose (translation and orientation) of the sample with respect to the granite can be determined from the wanted position of each stage (translation stage, tilt stage, spindle and micro-hexapod). This corresponds to the bloc “Compute Wanted Sample Position w.r.t. Granite” in figure 1. To do so, we impose a perfect displacement and all the stage, we perfectly measure the position of the sample with respect to the granite, and we verify that this measured position corresponds to the computed wanted pose of the sample.

    -Then, in section 2, we introduce some positioning error in the micro-station’s stages. -The positioning error of the sample expressed with respect to the granite frame (the one measured) is expressed in a frame connected to the NASS top platform (corresponding to the green bloc “Compute Sample Position Error w.r.t. NASS” in figure 1). +Then, in section 3, we introduce some positioning error in the micro-station’s stages. +The positioning error of the sample expressed with respect to the granite frame (the one measured) is expressed in a frame connected to the NASS top platform (corresponding to the green bloc “Compute Sample Position Error w.r.t. NASS” in figure 1). Then, we move the NASS such that it compensate for the positioning error that are expressed in the frame of the NASS, and we verify that the positioning error of the sample is well compensated.

    -
    -

    1 Verify that the function to compute the reference pose is correct

    +
    +

    1 How do we measure the position of the sample with respect to the granite

    - + +A transform sensor block gives the translation and orientation of the follower frame with respect to the base frame. +

    + +

    +The base frame is fixed to the granite and located at the initial sample location that defines the zero position. +

    + +

    +The follower frame is attached to the sample (or more precisely to the reflector). +

    + +

    +The outputs of the transform sensor are: +

    +
      +
    • the 3 translations x, y and z in meter
    • +
    • the rotation matrix \(\bm{R}\) that permits to rotate the base frame into the follower frame.
    • +
    + +

    +We can then determine extract other orientation conventions such that Euler angles or screw axis. +

    +
    +
    + +
    +

    2 Verify that the function to compute the reference pose is correct

    +
    +

    +

    The goal here is to perfectly move the station and verify that there is no mismatch between the metrology measurement and the computation of the reference pose.

    -
    -

    1.1 Prepare the Simulation

    -
    +
    +

    2.1 Prepare the Simulation

    +

    We set a small StopTime.

    -
    set_param(conf_simscape, 'StopTime', '0.5');
    +
    load('mat/conf_simulink.mat');
    +set_param(conf_simulink, 'StopTime', '0.5');
     
    @@ -365,16 +387,25 @@ We set a small StopTime. We initialize all the stages.

    -
    initializeGround();
    -initializeGranite();
    -initializeTy();
    -initializeRy();
    -initializeRz();
    -initializeMicroHexapod();
    -initializeAxisc();
    -initializeMirror();
    -initializeNanoHexapod('actuator', 'piezo');
    -initializeSample('mass', 50);
    +
    initializeGround('type', 'rigid');
    +initializeGranite('type', 'rigid');
    +initializeTy('type', 'rigid');
    +initializeRy('type', 'rigid');
    +initializeRz('type', 'rigid');
    +initializeMicroHexapod('type', 'rigid');
    +initializeAxisc('type', 'rigid');
    +initializeMirror('type', 'rigid');
    +initializeNanoHexapod('type', 'rigid', 'actuator', 'piezo');
    +initializeSample('type', 'rigid', 'mass', 50);
    +
    +
    + +

    +No disturbance and no gravity. +

    +
    +
    initializeSimscapeConfiguration('gravity', false);
    +initializeDisturbances('enable', false);
     
    @@ -416,19 +447,27 @@ Dne = zeros(6,1); % [m,m,m,rad,rad,rad]
    +

    +We want to log the signals +

    +
    +
    initializeLoggingConfiguration('log', 'all');
    +
    +
    +

    And we run the simulation.

    -
    sim('sim_nano_station_metrology');
    +
    sim('nass_model');
     
    -
    -

    1.2 Verify that the pose of the sample is the same as the computed one

    -
    +
    +

    2.2 Verify that the pose of the sample is the same as the computed one

    +

    Let’s denote:

    @@ -450,10 +489,10 @@ We have then computed: We load the reference and we compute the desired trajectory of the sample in the form of an homogeneous transformation matrix \({}^W\bm{T}_R\).

    -
    n = length(Dref.Dy.Time);
    +
    n = length(simout.r.Dy.Time);
     WTr = zeros(4, 4, n);
     for i = 1:n
    -  WTr(:, :, i) = computeReferencePose(Dref.Dy.Data(i), Dref.Ry.Data(i), Dref.Rz.Data(i), Dref.Dh.Data(i,:), Dref.Dn.Data(i,:));
    +  WTr(:, :, i) = computeReferencePose(simout.r.Dy.Data(i), simout.r.Ry.Data(i), simout.r.Rz.Data(i), simout.r.Dh.Data(i,:), simout.r.Dn.Data(i,:));
     end
     
    @@ -463,10 +502,10 @@ As the displacement is perfect, we also measure in simulation the pose of the sa From that we can compute the homogeneous transformation matrix \({}^W\bm{T}_M\).

    -
    n = length(Dsm.R.Time);
    +
    n = length(simout.y.R.Time);
     WTm = zeros(4, 4, n);
    -WTm(1:3, 1:3, :) = Dsm.R.Data;
    -WTm(1:3, 4, :) = [Dsm.x.Data' ; Dsm.y.Data' ; Dsm.z.Data'];
    +WTm(1:3, 1:3, :) = simout.y.R.Data;
    +WTm(1:3, 4, :) = [simout.y.x.Data' ; simout.y.y.Data' ; simout.y.z.Data'];
     WTm(4, 4, :) = 1;
     
    @@ -503,9 +542,9 @@ ans =
    -
    -

    1.3 Conclusion

    -
    +
    +

    2.3 Conclusion

    +

    We are able to compute the wanted position and orientation of the sample. @@ -517,11 +556,11 @@ Both the measurement and the theory gives the same result.

    -
    -

    2 Verify that the function to convert the position error in the frame fixed to the nano-hexapod is working

    -
    +
    +

    3 Verify that the function to convert the position error in the frame fixed to the nano-hexapod is working

    +

    - +

    We now introduce some positioning error in the stage. @@ -532,22 +571,15 @@ This will induce a global positioning error of the sample with respect to the de We want to verify that we are able to measure this positioning error and convert it in the frame attached to the Nano-hexapod.

    -
    -

    2.1 Prepare the Simulation

    -
    -

    -We load the configuration. -

    -
    -
    load('mat/conf_simscape.mat');
    -
    -
    - +
    +

    3.1 Prepare the Simulation

    +

    We set a small StopTime.

    -
    set_param(conf_simscape, 'StopTime', '0.5');
    +
    load('mat/conf_simulink.mat');
    +set_param(conf_simulink, 'StopTime', '0.5');
     
    @@ -555,16 +587,25 @@ We set a small StopTime. We initialize all the stages.

    -
    initializeGround();
    -initializeGranite();
    -initializeTy();
    -initializeRy();
    -initializeRz();
    -initializeMicroHexapod();
    -initializeAxisc();
    -initializeMirror();
    -initializeNanoHexapod('actuator', 'piezo');
    -initializeSample('mass', 50);
    +
    initializeGround('type', 'rigid');
    +initializeGranite('type', 'rigid');
    +initializeTy('type', 'rigid');
    +initializeRy('type', 'rigid');
    +initializeRz('type', 'rigid');
    +initializeMicroHexapod('type', 'rigid');
    +initializeAxisc('type', 'rigid');
    +initializeMirror('type', 'rigid');
    +initializeNanoHexapod('type', 'rigid', 'actuator', 'piezo');
    +initializeSample('type', 'rigid', 'mass', 50);
    +
    +
    + +

    +No disturbance and no gravity. +

    +
    +
    initializeSimscapeConfiguration('gravity', false);
    +initializeDisturbances('enable', false);
     
    @@ -597,9 +638,7 @@ Now we introduce some positioning error.
    Dye = 1e-6; % [m]
     Rye = 2e-4; % [rad]
     Rze = 1e-5; % [rad]
    -Dhe = zeros(6,1);
    -Dhle = [1e-6 ; 2e-6 ; 3e-6 ; -2e-6 ; 1e-6 ; 2e-6]; % [m]
    -Dne = zeros(6,1);
    +initializePosError('error', true, 'Dy', Dye, 'Ry', Rye, 'Rz', Rze);
     
    @@ -607,15 +646,15 @@ Dne = zeros(6,1); And we run the simulation.

    -
    sim('sim_nano_station_metrology');
    +
    sim('nass_model');
     
    -
    -

    2.2 Compute the wanted pose of the sample in the NASS Base from the metrology and the reference

    -
    +
    +

    3.2 Compute the wanted pose of the sample in the NASS Base from the metrology and the reference

    +

    Now that we have introduced some positioning error, the computed wanted pose and the measured pose will not be the same.

    @@ -640,10 +679,10 @@ The top platform of the nano-hexapod is considered to be rigidly connected to th We load the reference and we compute the desired trajectory of the sample in the form of an homogeneous transformation matrix \({}^W\bm{T}_R\).

    -
    n = length(Dref.Dy.Time);
    +
    n = length(simout.r.Dy.Time);
     WTr = zeros(4, 4, n);
     for i = 1:n
    -  WTr(:, :, i) = computeReferencePose(Dref.Dy.Data(i), Dref.Ry.Data(i), Dref.Rz.Data(i), Dref.Dh.Data(i,:), Dref.Dn.Data(i,:));
    +  WTr(:, :, i) = computeReferencePose(simout.r.Dy.Data(i), simout.r.Ry.Data(i), simout.r.Rz.Data(i), simout.r.Dh.Data(i,:), simout.r.Dn.Data(i,:));
     end
     
    @@ -653,10 +692,10 @@ We also measure in simulation the pose of the sample with respect to the granite From that we can compute the homogeneous transformation matrix \({}^W\bm{T}_M\).

    -
    n = length(Dsm.R.Time);
    +
    n = length(simout.y.R.Time);
     WTm = zeros(4, 4, n);
    -WTm(1:3, 1:3, :) = Dsm.R.Data;
    -WTm(1:3, 4, :) = [Dsm.x.Data' ; Dsm.y.Data' ; Dsm.z.Data'];
    +WTm(1:3, 1:3, :) = simout.y.R.Data;
    +WTm(1:3, 4, :) = [simout.y.x.Data' ; simout.y.y.Data' ; simout.y.z.Data'];
     WTm(4, 4, :) = 1;
     
    @@ -737,21 +776,21 @@ Rz = [cos(Erz) -sin(Erz) 0; Error -2.8e-06 --2.0e-06 --1.3e-06 --5.1e-06 --1.8e-04 -4.2e-07 +-1.0e-11 +-1.0e-06 +-6.2e-16 +-2.0e-09 +-2.0e-04 +-1.0e-05
    -
    -

    2.3 Verify that be imposing the error motion on the nano-hexapod, we indeed have zero error at the end

    -
    +
    +

    3.3 Verify that be imposing the error motion on the nano-hexapod, we indeed have zero error at the end

    +

    We now keep the wanted pose but we impose a displacement of the nano hexapod corresponding to the measured position error.

    @@ -769,7 +808,7 @@ We now keep the wanted pose but we impose a displacement of the nano hexapod cor 'Rm_type', 'constant', ... % For now, only constant is implemented 'Rm_pos', [0, pi]', ... % Initial position of the two masses 'Dn_type', 'constant', ... % For now, only constant is implemented - 'Dn_pos', [Edx, Edy, Edz, Erx, Ery, Erz]' ... % Initial position [m,m,m,rad,rad,rad] of the top platform + 'Dn_pos', [Edx; Edy; Edz; Erx; Ery; Erz] ... % Initial position [m,m,m,rad,rad,rad] of the top platform );
    @@ -778,7 +817,7 @@ We now keep the wanted pose but we impose a displacement of the nano hexapod cor And we run the simulation.

    -
    sim('sim_nano_station_metrology');
    +
    sim('nass_model');
     
    @@ -791,10 +830,10 @@ As the displacement is perfect, we also measure in simulation the pose of the sa From that we can compute the homogeneous transformation matrix \({}^W\bm{T}_M\).

    -
    n = length(Dsm.R.Time);
    +
    n = length(simout.y.R.Time);
     WTm = zeros(4, 4, n);
    -WTm(1:3, 1:3, :) = Dsm.R.Data;
    -WTm(1:3, 4, :) = [Dsm.x.Data' ; Dsm.y.Data' ; Dsm.z.Data'];
    +WTm(1:3, 1:3, :) = simout.y.R.Data;
    +WTm(1:3, 4, :) = [simout.y.x.Data' ; simout.y.y.Data' ; simout.y.z.Data'];
     WTm(4, 4, :) = 1;
     
    @@ -845,21 +884,21 @@ Verify that the pose error is small. Error -2.0e-16 -1.1e-16 -3.2e-18 --1.1e-17 -1.0e-17 --9.5e-16 +2.4e-16 +-9.9e-17 +4.4e-16 +2.0e-09 +-8.9e-15 +2.0e-13
    -
    -

    2.4 Conclusion

    -
    +
    +

    3.4 Conclusion

    +

    Indeed, we are able to convert the position error in the frame of the NASS and then compensate these errors with the NASS. @@ -872,7 +911,7 @@ Indeed, we are able to convert the position error in the frame of the NASS and t

    Author: Dehaeze Thomas

    -

    Created: 2020-01-22 mer. 09:36

    +

    Created: 2020-02-25 mar. 18:08

    diff --git a/simscape/index.html b/docs/simscape.html similarity index 95% rename from simscape/index.html rename to docs/simscape.html index 45ff355..fc320e7 100644 --- a/simscape/index.html +++ b/docs/simscape.html @@ -1,9 +1,11 @@ + + - + Simscape Model @@ -205,7 +207,7 @@ @licstart The following is the entire license notice for the JavaScript code in this tag. -Copyright (C) 2012-2019 Free Software Foundation, Inc. +Copyright (C) 2012-2020 Free Software Foundation, Inc. The JavaScript code in this tag is free software: you can redistribute it and/or modify it under the terms of the GNU @@ -258,11 +260,11 @@ for the JavaScript code in this tag.

    Table of Contents

    @@ -275,8 +277,8 @@ A simscape model per Simscape Multibody permits to model multibody systems using blocks representing bodies, joints, constraints, force elements, and sensors.

    -
    -

    1 Solid bodies

    +
    +

    1 Solid bodies

    Each solid body is represented by a solid block. @@ -285,8 +287,8 @@ The geometry of the solid body can be imported using a step file. T

    -
    -

    2 Frames

    +
    +

    2 Frames

    Frames are very important in simscape multibody, they defined where the forces are applied, where the joints are located and where the measurements are made. @@ -298,8 +300,8 @@ They can be defined from the solid body geometry, or using the -

    3 Joints

    +
    +

    3 Joints

    Solid Bodies are connected with joints (between frames of the two solid bodies). @@ -309,7 +311,7 @@ Solid Bodies are connected with joints (between frames of the two solid bodies). There are various types of joints that are all described here.

    - +
    @@ -442,7 +444,7 @@ Joint blocks are assortments of joint primitives:
  • Constant Velocity: Allows rotation at constant velocity between intersection through arbitrarily aligned shafts: CV
  • -
    Table 1: Degrees of freedom associated with each joint
    +
    @@ -734,8 +736,8 @@ Composite Force/Torque sensing: -
    -

    4 Measurements

    +
    +

    4 Measurements

    A transform sensor block measures the spatial relationship between two frames: the base B and the follower F. @@ -759,8 +761,8 @@ If we want to simulate an inertial sensor, we just have to choose B

    -
    -

    5 Excitation

    +
    +

    5 Excitation

    We can apply external forces to the model by using an external force and torque block. @@ -774,8 +776,7 @@ Internal force, acting reciprocally between base and following origins is implem

    Author: Dehaeze Thomas

    -

    Created: 2019-12-11 mer. 17:06

    -

    Validate

    +

    Created: 2020-02-25 mar. 18:08

    diff --git a/simscape_subsystems/index.html b/docs/simscape_subsystems.html similarity index 57% rename from simscape_subsystems/index.html rename to docs/simscape_subsystems.html index cf4a1c1..0c086cd 100644 --- a/simscape_subsystems/index.html +++ b/docs/simscape_subsystems.html @@ -1,10 +1,11 @@ + - + Subsystems used for the Simscape Models @@ -259,126 +260,204 @@ for the JavaScript code in this tag.

    Table of Contents

    -The full Simscape Model is represented in Figure 1. +The full Simscape Model is represented in Figure 1.

    -
    +

    simscape_picture.png

    Figure 1: Screenshot of the Multi-Body Model representation

    @@ -397,17 +476,161 @@ Each stage is configured (geometry, mass properties, dynamic properties … These functions are defined below.

    -
    -

    1 Ground

    +
    +

    1 Simscape Configuration

    - +

    -
    -

    Simscape Model

    -
    +
    +

    Function description

    +
    +
    +
    function [] = initializeSimscapeConfiguration(args)
    +
    +
    +
    +
    + +
    +

    Optional Parameters

    +
    +
    +
    arguments
    +  args.gravity logical {mustBeNumericOrLogical} = true
    +end
    +
    +
    +
    +
    + +
    +

    Structure initialization

    +
    +
    +
    conf_simscape = struct();
    +
    +
    +
    +
    + +
    +

    Add Type

    +
    +
    +
    if args.gravity
    +  conf_simscape.type = 1;
    +else
    +  conf_simscape.type = 2;
    +end
    +
    +
    +
    +
    + +
    +

    Save the Structure

    +
    +
    +
    save('./mat/conf_simscape.mat', 'conf_simscape');
    +
    +
    +
    +
    +
    + +
    +

    2 Logging Configuration

    +
    +

    + +

    +
    + +
    +

    Function description

    +
    +
    +
    function [] = initializeLoggingConfiguration(args)
    +
    +
    +
    +
    + +
    +

    Optional Parameters

    +
    +
    +
    arguments
    +  args.log      char   {mustBeMember(args.log,{'none', 'all', 'forces'})} = 'none'
    +  args.Ts (1,1) double {mustBeNumeric, mustBePositive} = 1e-3
    +end
    +
    +
    +
    +
    + +
    +

    Structure initialization

    +
    +
    +
    conf_log = struct();
    +
    +
    +
    +
    + +
    +

    Add Type

    +
    +
    +
    switch args.log
    +  case 'none'
    +    conf_log.type = 0;
    +  case 'all'
    +    conf_log.type = 1;
    +  case 'forces'
    +    conf_log.type = 2;
    +end
    +
    +
    +
    +
    + +
    +

    Sampling Time

    +
    +
    +
    conf_log.Ts = args.Ts;
    +
    +
    +
    +
    + +
    +

    Save the Structure

    +
    +
    +
    save('./mat/conf_log.mat', 'conf_log');
    +
    +
    +
    +
    +
    + +
    +

    3 Ground

    +
    +

    + +

    +
    + +
    +

    Simscape Model

    +

    The model of the Ground is composed of:

    @@ -417,14 +640,14 @@ The model of the Ground is composed of: -
    +

    simscape_model_ground.png

    Figure 2: Simscape model for the Ground

    -
    +

    simscape_picture_ground.png

    Figure 3: Simscape picture for the Ground

    @@ -432,19 +655,31 @@ The model of the Ground is composed of:
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [ground] = initializeGround()
    +
    function [ground] = initializeGround(args)
     
    -
    -

    1.1 Function content

    -
    +
    +

    Optional Parameters

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

    Structure initialization

    +

    First, we initialize the granite structure.

    @@ -452,16 +687,41 @@ First, we initialize the granite structure.
    ground = struct();
     
    +
    +
    +
    +

    Add Type

    +
    +
    +
    switch args.type
    +  case 'none'
    +    ground.type = 0;
    +  case 'rigid'
    +    ground.type = 1;
    +end
    +
    +
    +
    +
    + +
    +

    Ground Solid properties

    +

    We set the shape and density of the ground solid element.

    -
    ground.shape = [2, 2, 0.5]; % [m]
    -ground.density = 2800; % [kg/m3]
    +
    ground.shape   = [2, 2, 0.5]; % [m]
    +ground.density = 2800;        % [kg/m3]
     
    +
    +
    +
    +

    Save the Structure

    +

    The ground structure is saved.

    @@ -473,17 +733,17 @@ The ground structure is saved.
    -
    -

    2 Granite

    -
    +
    +

    4 Granite

    +

    - +

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    The Simscape model of the granite is composed of:

    @@ -497,14 +757,14 @@ The output sample_pos corresponds to the impact point of the X-ray.

    -
    +

    simscape_model_granite.png

    Figure 4: Simscape model for the Granite

    -
    +

    simscape_picture_granite.png

    Figure 5: Simscape picture for the Granite

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

    Function description

    -
    +
    +

    Function description

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

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
    -    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]
    -    args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m]
    +  args.type          char    {mustBeMember(args.type,{'rigid', 'flexible', 'none', 'modal-analysis', 'init'})} = 'flexible'
    +  args.Foffset       logical {mustBeNumericOrLogical} = true
    +  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]
    +  args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m]
     end
     
    -
    -

    Function content

    -
    + +
    +

    Structure initialization

    +

    First, we initialize the granite structure.

    @@ -547,7 +810,33 @@ First, we initialize the granite structure.
    granite = struct();
     
    +
    +
    +
    +

    Add Granite Type

    +
    +
    +
    switch args.type
    +  case 'none'
    +    granite.type = 0;
    +  case 'rigid'
    +    granite.type = 1;
    +  case 'flexible'
    +    granite.type = 2;
    +  case 'modal-analysis'
    +    granite.type = 3;
    +  case 'init'
    +    granite.type = 4;
    +end
    +
    +
    +
    +
    + +
    +

    Material and Geometry

    +

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

    @@ -557,36 +846,6 @@ granite.STEP = './STEPS/granite/granite.STEP'
    -

    -Stiffness of the connection with Ground. -

    -
    -
    granite.k.x = 4e9; % [N/m]
    -granite.k.y = 3e8; % [N/m]
    -granite.k.z = 8e8; % [N/m]
    -
    -
    - -

    -Damping of the connection with Ground. -

    -
    -
    granite.c.x  = 4.0e5; % [N/(m/s)]
    -granite.c.y  = 1.1e5; % [N/(m/s)]
    -granite.c.z  = 9.0e5; % [N/(m/s)]
    -
    -
    - -

    -Equilibrium position of the Cartesian joint. -

    -
    -
    granite.x0 = args.x0;
    -granite.y0 = args.y0;
    -granite.z0 = args.z0;
    -
    -
    -

    Z-offset for the initial position of the sample with respect to the granite top surface.

    @@ -594,7 +853,38 @@ Z-offset for the initial position of the sample with respect to the granite top
    granite.sample_pos = 0.8; % [m]
     
    +
    +
    +
    +

    Stiffness and Damping properties

    +
    +
    +
    granite.K = [4e9; 3e8; 8e8]; % [N/m]
    +granite.C = [4.0e5; 1.1e5; 9.0e5]; % [N/(m/s)]
    +
    +
    +
    +
    + +
    +

    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');
    +  granite.Deq = -Fgm'./granite.K;
    +else
    +  granite.Deq = zeros(6,1);
    +end
    +
    +
    +
    +
    + +
    +

    Save the Structure

    +

    The granite structure is saved.

    @@ -606,17 +896,17 @@ The granite structure is saved.
    -
    -

    3 Translation Stage

    -
    +
    +

    5 Translation Stage

    +

    - +

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    The Simscape model of the Translation stage consist of:

    @@ -631,14 +921,14 @@ It is used to impose the motion in the Y direction -
    +

    simscape_model_ty.png

    Figure 6: Simscape model for the Translation Stage

    -
    +

    simscape_picture_ty.png

    Figure 7: Simscape picture for the Translation Stage

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

    Function description

    -
    +
    +

    Function description

    +
    function [ty] = initializeTy(args)
     
    @@ -656,28 +946,22 @@ It is used to impose the motion in the Y direction
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
    -    args.x11 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.z11 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.x21 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.z21 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.x12 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.z12 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.x22 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.z22 (1,1) double {mustBeNumeric} = 0 % [m]
    +  args.type      char   {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'modal-analysis', 'init'})} = 'flexible'
    +  args.Foffset logical {mustBeNumericOrLogical} = true
     end
     
    -
    -

    Function content

    -
    +
    +

    Structure initialization

    +

    First, we initialize the ty structure.

    @@ -685,7 +969,33 @@ First, we initialize the ty structure.
    ty = struct();
     
    +
    +
    +
    +

    Add Translation Stage Type

    +
    +
    +
    switch args.type
    +  case 'none'
    +    ty.type = 0;
    +  case 'rigid'
    +    ty.type = 1;
    +  case 'flexible'
    +    ty.type = 2;
    +  case 'modal-analysis'
    +    ty.type = 3;
    +  case 'init'
    +    ty.type = 4;
    +end
    +
    +
    +
    +
    + +
    +

    Material and Geometry

    +

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

    @@ -727,40 +1037,38 @@ ty.rotor.density = 5400; % [kg/m3] ty.rotor.STEP = './STEPS/ty/Ty_Motor_Rotor.STEP';
    - -

    -Stiffness of the stage. -

    -
    -
    ty.k.ax  = 5e8; % Axial Stiffness for each of the 4 guidance (y) [N/m]
    -ty.k.rad = 5e7; % Radial Stiffness for each of the 4 guidance (x-z) [N/m]
    -
    +
    -

    -Damping of the stage. -

    +
    +

    Stiffness and Damping properties

    +
    -
    ty.c.ax  = 70710; % [N/(m/s)]
    -ty.c.rad = 22360; % [N/(m/s)]
    +
    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)]
     
    - -

    -Equilibrium position of the joints. -

    -
    -
    ty.x0_11 = args.x11;
    -ty.z0_11 = args.z11;
    -ty.x0_12 = args.x12;
    -ty.z0_12 = args.z12;
    -ty.x0_21 = args.x21;
    -ty.z0_21 = args.z21;
    -ty.x0_22 = args.x22;
    -ty.z0_22 = args.z22;
    -
    +
    +
    +

    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');
    +  ty.Deq = -Ftym'./ty.K;
    +else
    +  ty.Deq = zeros(6,1);
    +end
    +
    +
    +
    +
    + +
    +

    Save the Structure

    +

    The ty structure is saved.

    @@ -772,17 +1080,17 @@ The ty structure is saved.
    -
    -

    4 Tilt Stage

    -
    +
    +

    6 Tilt Stage

    +

    - +

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    The Simscape model of the Tilt stage is composed of:

    @@ -797,14 +1105,14 @@ The Ry motion is imposed by the input. -
    +

    simscape_model_ry.png

    Figure 8: Simscape model for the Tilt Stage

    -
    +

    simscape_picture_ry.png

    Figure 9: Simscape picture for the Tilt Stage

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

    Function description

    -
    +
    +

    Function description

    +
    function [ry] = initializeRy(args)
     
    @@ -822,32 +1130,23 @@ The Ry motion is imposed by the input.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
    -    args.x11 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.y11 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.z11 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.x12 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.y12 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.z12 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.x21 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.y21 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.z21 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.x22 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.y22 (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.z22 (1,1) double {mustBeNumeric} = 0 % [m]
    +  args.type          char    {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'modal-analysis', 'init'})} = 'flexible'
    +  args.Foffset       logical {mustBeNumericOrLogical} = true
    +  args.Ry_init (1,1) double  {mustBeNumeric} = 0
     end
     
    -
    -

    Function content

    -
    +
    +

    Structure initialization

    +

    First, we initialize the ry structure.

    @@ -855,7 +1154,34 @@ First, we initialize the ry structure.
    ry = struct();
     
    +
    +
    + +
    +

    Add Tilt Type

    +
    +
    +
    switch args.type
    +  case 'none'
    +    ry.type = 0;
    +  case 'rigid'
    +    ry.type = 1;
    +  case 'flexible'
    +    ry.type = 2;
    +  case 'modal-analysis'
    +    ry.type = 3;
    +  case 'init'
    +    ry.type = 4;
    +end
    +
    +
    +
    +
    + +
    +

    Material and Geometry

    +

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

    @@ -878,47 +1204,6 @@ ry.stage.STEP = './STEPS/ry/Tilt_Stage.STEP';
    -

    -Stiffness of the stage. -

    -
    -
    ry.k.tilt = 1e4; % Rotation stiffness around y [N*m/deg]
    -ry.k.h    = 1e8; % Stiffness in the direction of the guidance [N/m]
    -ry.k.rad  = 1e8; % Stiffness in the top direction [N/m]
    -ry.k.rrad = 1e8; % Stiffness in the side direction [N/m]
    -
    -
    - -

    -Damping of the stage. -

    -
    -
    ry.c.tilt = 2.8e2;
    -ry.c.h    = 2.8e4;
    -ry.c.rad  = 2.8e4;
    -ry.c.rrad = 2.8e4;
    -
    -
    - -

    -Equilibrium position of the joints. -

    -
    -
    ry.x0_11 = args.x11;
    -ry.y0_11 = args.y11;
    -ry.z0_11 = args.z11;
    -ry.x0_12 = args.x12;
    -ry.y0_12 = args.y12;
    -ry.z0_12 = args.z12;
    -ry.x0_21 = args.x21;
    -ry.y0_21 = args.y21;
    -ry.z0_21 = args.z21;
    -ry.x0_22 = args.x22;
    -ry.y0_22 = args.y22;
    -ry.z0_22 = args.z22;
    -
    -
    -

    Z-Offset so that the center of rotation matches the sample center;

    @@ -927,8 +1212,44 @@ Z-Offset so that the center of rotation matches the sample center;
    +
    +
    ry.Ry_init = args.Ry_init; % [rad]
    +
    +
    +
    +
    + +
    +

    Stiffness and Damping properties

    +
    +
    +
    ry.K = [3.8e8; 4e8; 3.8e8; 1.2e8; 6e4; 1.2e8];
    +ry.C = [1e5;   1e5; 1e5;   3e4;   1e3; 3e4];
    +
    +
    +
    +
    + +
    +

    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');
    +  ry.Deq = -Fym'./ry.K;
    +else
    +  ry.Deq = zeros(6,1);
    +end
    +
    +
    +
    +
    + +
    +

    Save the Structure

    +

    -The ty structure is saved. +The ry structure is saved.

    save('./mat/stages.mat', 'ry', '-append');
    @@ -938,17 +1259,17 @@ The ty structure is saved.
     
    -
    -

    5 Spindle

    -
    +
    +

    7 Spindle

    +

    - +

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    The Simscape model of the Spindle is composed of:

    @@ -959,14 +1280,14 @@ The Simscape model of the Spindle is composed of: -
    +

    simscape_model_rz.png

    Figure 10: Simscape model for the Spindle

    -
    +

    simscape_picture_rz.png

    Figure 11: Simscape picture for the Spindle

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

    Function description

    -
    +
    +

    Function description

    +
    function [rz] = initializeRz(args)
     
    @@ -984,26 +1305,22 @@ The Simscape model of the Spindle is composed of:
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
    -    args.rigid logical {mustBeNumericOrLogical} = false
    -    args.x0  (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.y0  (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.z0  (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.rx0 (1,1) double {mustBeNumeric} = 0 % [rad]
    -    args.ry0 (1,1) double {mustBeNumeric} = 0 % [rad]
    +  args.type    char    {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'modal-analysis', 'init'})} = 'flexible'
    +  args.Foffset logical {mustBeNumericOrLogical} = true
     end
     
    -
    -

    Function content

    -
    +
    +

    Structure initialization

    +

    First, we initialize the rz structure.

    @@ -1011,7 +1328,33 @@ First, we initialize the rz structure.
    rz = struct();
     
    +
    +
    +
    +

    Add Spindle Type

    +
    +
    +
    switch args.type
    +  case 'none'
    +    rz.type = 0;
    +  case 'rigid'
    +    rz.type = 1;
    +  case 'flexible'
    +    rz.type = 2;
    +  case 'modal-analysis'
    +    rz.type = 3;
    +  case 'init'
    +    rz.type = 4;
    +end
    +
    +
    +
    +
    + +
    +

    Material and Geometry

    +

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

    @@ -1029,41 +1372,38 @@ rz.stator.density = 7800; % [kg/m3] rz.stator.STEP = './STEPS/rz/Spindle_Stator.STEP';
    - -

    -Stiffness of the stage. -

    -
    -
    rz.k.rot  = 1e6; % TODO - Rotational Stiffness (Rz) [N*m/deg]
    -rz.k.tilt = 1e6; % Rotational Stiffness (Rx, Ry) [N*m/deg]
    -rz.k.ax   = 2e9; % Axial Stiffness (Z) [N/m]
    -rz.k.rad  = 7e8; % Radial Stiffness (X, Y) [N/m]
    -
    +
    -

    -Damping of the stage. -

    +
    +

    Stiffness and Damping properties

    +
    -
    rz.c.rot  = 1.6e3;
    -rz.c.tilt = 1.6e3;
    -rz.c.ax   = 7.1e4;
    -rz.c.rad  = 4.2e4;
    +
    rz.K = [7e8; 7e8; 2e9; 1e7; 1e7; 1e7];
    +rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4];
     
    - -

    -Equilibrium position of the joints. -

    -
    -
    rz.x0 = args.x0;
    -rz.y0 = args.y0;
    -rz.z0 = args.z0;
    -rz.rx0 = args.rx0;
    -rz.ry0 = args.ry0;
    -
    +
    +
    +

    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');
    +  rz.Deq = -Fzm'./rz.K;
    +else
    +  rz.Deq = zeros(6,1);
    +end
    +
    +
    +
    +
    + +
    +

    Save the Structure

    +

    The rz structure is saved.

    @@ -1075,26 +1415,26 @@ The rz structure is saved.
    -
    -

    6 Micro Hexapod

    -
    +
    +

    8 Micro Hexapod

    +

    - +

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +
    -
    +

    simscape_model_micro_hexapod.png

    Figure 12: Simscape model for the Micro-Hexapod

    -
    +

    simscape_picture_micro_hexapod.png

    Figure 13: Simscape picture for the Micro-Hexapod

    @@ -1102,9 +1442,9 @@ The rz structure is saved.
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [micro_hexapod] = initializeMicroHexapod(args)
     
    @@ -1112,11 +1452,12 @@ The rz structure is saved.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
    +    args.type      char   {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'modal-analysis', 'init'})} = 'flexible'
         % initializeFramesPositions
         args.H    (1,1) double {mustBeNumeric, mustBePositive} = 350e-3
         args.MO_B (1,1) double {mustBeNumeric} = 270e-3
    @@ -1147,17 +1488,17 @@ The rz structure is saved.
         % inverseKinematics
         args.AP  (3,1) double {mustBeNumeric} = zeros(3,1)
         args.ARB (3,3) double {mustBeNumeric} = eye(3)
    -    % Equilibrium position of each leg
    -    args.dLeq (6,1) double {mustBeNumeric} = zeros(6,1)
    +    % Force that stiffness of each joint should apply at t=0
    +    args.Foffset      logical {mustBeNumericOrLogical} = true
     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);
    @@ -1176,10 +1517,41 @@ micro_hexapod.dLi = dLi;
     Equilibrium position of the each joint.
     

    -
    micro_hexapod.dLeq = args.dLeq;
    +
    if args.Foffset && ~strcmp(args.type, 'none') && ~strcmp(args.type, 'rigid') && ~strcmp(args.type, 'init')
    +  load('mat/Foffset.mat', 'Fhm');
    +  micro_hexapod.dLeq = -Fhm'./args.Ki;
    +else
    +  micro_hexapod.dLeq = zeros(6,1);
    +end
     
    +
    +
    +
    +

    Add Type

    +
    +
    +
    switch args.type
    +  case 'none'
    +    micro_hexapod.type = 0;
    +  case 'rigid'
    +    micro_hexapod.type = 1;
    +  case 'flexible'
    +    micro_hexapod.type = 2;
    +  case 'modal-analysis'
    +    micro_hexapod.type = 3;
    +  case 'init'
    +    micro_hexapod.type = 4;
    +end
    +
    +
    +
    +
    + +
    +

    Save the Structure

    +

    The micro_hexapod structure is saved.

    @@ -1191,17 +1563,17 @@ The micro_hexapod structure is saved.
    -
    -

    7 Center of gravity compensation

    -
    +
    +

    9 Center of gravity compensation

    +

    - +

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

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

    @@ -1211,14 +1583,14 @@ The Simscape model of the Center of gravity compensator is composed of: -
    +

    simscape_model_axisc.png

    Figure 14: Simscape model for the Center of Mass compensation system

    -
    +

    simscape_picture_axisc.png

    Figure 15: Simscape picture for the Center of Mass compensation system

    @@ -1226,26 +1598,31 @@ The Simscape model of the Center of gravity compensator is composed of:
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [axisc] = initializeAxisc()
    +
    function [axisc] = initializeAxisc(args)
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

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

    Function content

    -
    +
    +

    Structure initialization

    +

    First, we initialize the axisc structure.

    @@ -1253,7 +1630,29 @@ First, we initialize the axisc structure.
    axisc = struct();
     
    +
    +
    +
    +

    Add Type

    +
    +
    +
    switch args.type
    +  case 'none'
    +    axisc.type = 0;
    +  case 'rigid'
    +    axisc.type = 1;
    +  case 'flexible'
    +    axisc.type = 2;
    +end
    +
    +
    +
    +
    + +
    +

    Material and Geometry

    +

    Properties of the Material and link to the geometry files.

    @@ -1275,7 +1674,12 @@ axisc.gear.density = 7800; % [kg/m3] axisc.gear.STEP = './STEPS/axisc/axisc_gear.STEP';
    +
    +
    +
    +

    Save the Structure

    +

    The axisc structure is saved.

    @@ -1287,31 +1691,31 @@ The axisc structure is saved.
    -
    -

    8 Mirror

    -
    +
    +

    10 Mirror

    +

    - +

    -
    -

    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

    -
    +

    simscape_model_mirror.png

    Figure 16: Simscape model for the Mirror

    -
    +

    simscape_picture_mirror.png

    Figure 17: Simscape picture for the Mirror

    @@ -1319,9 +1723,9 @@ The output mirror_center corresponds to the center of the Sphere an
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [] = initializeMirror(args)
     
    @@ -1329,22 +1733,23 @@ The output mirror_center corresponds to the center of the Sphere an
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
    -    args.shape       char   {mustBeMember(args.shape,{'spherical', 'conical'})} = 'spherical'
    -    args.angle (1,1) double {mustBeNumeric, mustBePositive} = 45 % [deg]
    +  args.type        char   {mustBeMember(args.type,{'none', 'rigid'})} = 'rigid'
    +  args.shape       char   {mustBeMember(args.shape,{'spherical', 'conical'})} = 'spherical'
    +  args.angle (1,1) double {mustBeNumeric, mustBePositive} = 45 % [deg]
     end
     
    -
    -

    Function content

    -
    +
    +

    Structure initialization

    +

    First, we initialize the mirror structure.

    @@ -1352,17 +1757,48 @@ First, we initialize the mirror structure.
    mirror = struct();
     
    +
    +
    +
    +

    Add Mirror Type

    +
    +
    +
    switch args.type
    +  case 'none'
    +    mirror.type = 0;
    +  case 'rigid'
    +    mirror.type = 1;
    +end
    +
    +
    +
    +
    + +
    +

    Material and Geometry

    +

    We define the geometrical values.

    -
    mirror.h = 50; % Height of the mirror [mm]
    -mirror.thickness = 25; % Thickness of the plate supporting the sample [mm]
    -mirror.hole_rad = 120; % radius of the hole in the mirror [mm]
    -mirror.support_rad = 100; % radius of the support plate [mm]
    -mirror.jacobian = 150; % point of interest offset in z (above the top surfave) [mm]
    -mirror.rad = 180; % radius of the mirror (at the bottom surface) [mm]
    +
    mirror.h = 0.05; % Height of the mirror [m]
    +
    +mirror.thickness = 0.025; % Thickness of the plate supporting the sample [m]
    +
    +mirror.hole_rad = 0.120; % radius of the hole in the mirror [m]
    +
    +mirror.support_rad = 0.1; % radius of the support plate [m]
    +
    +% point of interest offset in z (above the top surfave) [m]
    +switch args.type
    +  case 'none'
    +    mirror.jacobian = 0.20;
    +  case 'rigid'
    +    mirror.jacobian = 0.20 - mirror.h;
    +end
    +
    +mirror.rad = 0.180; % radius of the mirror (at the bottom surface) [m]
     
    @@ -1415,7 +1851,12 @@ Finally, we close the shape.
    mirror.shape = [mirror.shape; 0 mirror.h];
     
    +
    +
    +
    +

    Save the Structure

    +

    The mirror structure is saved.

    @@ -1427,26 +1868,26 @@ The mirror structure is saved.
    -
    -

    9 Nano Hexapod

    -
    +
    +

    11 Nano Hexapod

    +

    - +

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +
    -
    +

    simscape_model_nano_hexapod.png

    Figure 18: Simscape model for the Nano Hexapod

    -
    +

    simscape_picture_nano_hexapod.png

    Figure 19: Simscape picture for the Nano Hexapod

    @@ -1454,9 +1895,9 @@ The mirror structure is saved.
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    function [nano_hexapod] = initializeNanoHexapod(args)
     
    @@ -1464,11 +1905,12 @@ The mirror structure is saved.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
    +    args.type      char   {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible'
         % initializeFramesPositions
         args.H    (1,1) double {mustBeNumeric, mustBePositive} = 90e-3
         args.MO_B (1,1) double {mustBeNumeric} = 175e-3
    @@ -1506,9 +1948,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);
    @@ -1533,7 +1975,29 @@ nano_hexapod.dLi = dLi;
     
    nano_hexapod.dLeq = args.dLeq;
     
    +
    +
    +
    +

    Add Type

    +
    +
    +
    switch args.type
    +  case 'none'
    +    nano_hexapod.type = 0;
    +  case 'rigid'
    +    nano_hexapod.type = 1;
    +  case 'flexible'
    +    nano_hexapod.type = 2;
    +end
    +
    +
    +
    +
    + +
    +

    Save the Structure

    +
    save('./mat/stages.mat', 'nano_hexapod', '-append');
     
    @@ -1542,17 +2006,17 @@ nano_hexapod.dLi = dLi;
    -
    -

    10 Sample

    -
    +
    +

    12 Sample

    +

    - +

    -
    -

    Simscape Model

    -
    +
    +

    Simscape Model

    +

    The Simscape model of the sample environment is composed of:

    @@ -1565,14 +2029,14 @@ This could be the case for cable forces for instance. -
    +

    simscape_model_sample.png

    Figure 20: Simscape model for the Sample

    -
    +

    simscape_picture_sample.png

    Figure 21: Simscape picture for the Sample

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

    Function description

    -
    +
    +

    Function description

    +
    function [sample] = initializeSample(args)
     
    @@ -1590,28 +2054,27 @@ This could be the case for cable forces for instance.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
    -    args.radius (1,1) double {mustBeNumeric, mustBePositive} = 0.1 % [m]
    -    args.height (1,1) double {mustBeNumeric, mustBePositive} = 0.3 % [m]
    -    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.x0     (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.y0     (1,1) double {mustBeNumeric} = 0 % [m]
    -    args.z0     (1,1) double {mustBeNumeric} = 0 % [m]
    +  args.type         char    {mustBeMember(args.type,{'rigid', 'flexible', 'none', 'init'})} = 'flexible'
    +  args.radius (1,1) double  {mustBeNumeric, mustBePositive} = 0.1 % [m]
    +  args.height (1,1) double  {mustBeNumeric, mustBePositive} = 0.3 % [m]
    +  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
     end
     
    -
    -

    Function content

    -
    +
    +

    Structure initialization

    +

    First, we initialize the sample structure.

    @@ -1619,48 +2082,73 @@ First, we initialize the sample structure.
    sample = struct();
     
    +
    +
    +
    +

    Add Sample Type

    +
    +
    +
    switch args.type
    +  case 'none'
    +    sample.type = 0;
    +  case 'rigid'
    +    sample.type = 1;
    +  case 'flexible'
    +    sample.type = 2;
    +  case 'init'
    +    sample.type = 3;
    +end
    +
    +
    +
    +
    + +
    +

    Material and Geometry

    +

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

    sample.radius = args.radius; % [m]
     sample.height = args.height; % [m]
    -sample.mass = args.mass; % [kg]
    +sample.mass   = args.mass; % [kg]
     sample.offset = args.offset; % [m]
     
    - -

    -Stiffness of the sample fixation. -

    -
    -
    sample.k.x = sample.mass * (2*pi * args.freq)^2; % [N/m]
    -sample.k.y = sample.mass * (2*pi * args.freq)^2; % [N/m]
    -sample.k.z = sample.mass * (2*pi * args.freq)^2; % [N/m]
    -
    +
    -

    -Damping of the sample fixation. -

    +
    +

    Stiffness and Damping properties

    +
    -
    sample.c.x = 0.1*sqrt(sample.k.x*sample.mass); % [N/(m/s)]
    -sample.c.y = 0.1*sqrt(sample.k.y*sample.mass); % [N/(m/s)]
    -sample.c.z = 0.1*sqrt(sample.k.z*sample.mass); % [N/(m/s)]
    +
    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)]
     
    - -

    -Equilibrium position of the Cartesian joint corresponding to the sample fixation. -

    -
    -
    sample.x0 = args.x0; % [m]
    -sample.y0 = args.y0; % [m]
    -sample.z0 = args.z0; % [m]
    -
    +
    +
    +

    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');
    +  sample.Deq = -Fsm'./sample.K;
    +else
    +  sample.Deq = zeros(3,1);
    +end
    +
    +
    +
    +
    + +
    +

    Save the Structure

    +

    The sample structure is saved.

    @@ -1672,17 +2160,102 @@ The sample structure is saved.
    -
    -

    11 Generate Reference Signals

    -
    +
    +

    13 Initialize Controller

    +

    - +

    -
    -

    Function Declaration and Documentation

    -
    +
    +

    Function Declaration and Documentation

    +
    +
    +
    function [] = initializeController(args)
    +
    +
    +
    +
    + +
    +

    Optional Parameters

    +
    +
    +
    arguments
    +  args.type         char   {mustBeMember(args.type,{'open-loop', 'iff', 'dvf'})} = 'open-loop'
    +  args.K (6,6)                                                                   = ss(zeros(6, 6))
    +end
    +
    +
    +
    +
    + +
    +

    Structure initialization

    +
    +

    +First, we initialize the controller structure. +

    +
    +
    controller = struct();
    +
    +
    +
    +
    + +
    +

    Controller Type

    +
    +
    +
    switch args.type
    +  case 'open-loop'
    +    controller.type = 1;
    +  case 'dvf'
    +    controller.type = 2;
    +  case 'iff'
    +    controller.type = 3;
    +end
    +
    +
    +
    +
    + +
    +

    Control Law

    +
    +
    +
    controller.K = args.K;
    +
    +
    +
    +
    + +
    +

    Save the Structure

    +
    +

    +The controller structure is saved. +

    +
    +
    save('./mat/controller.mat', 'controller');
    +
    +
    +
    +
    +
    + +
    +

    14 Generate Reference Signals

    +
    +

    + +

    +
    + +
    +

    Function Declaration and Documentation

    +
    function [ref] = initializeReferences(args)
     
    @@ -1690,9 +2263,9 @@ The sample structure is saved.
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         % Sampling Frequency [s]
    @@ -1736,9 +2309,9 @@ The sample structure is saved.
     
    -
    -

    Initialize Parameters

    -
    +
    +

    Initialize Parameters

    +
    %% Set Sampling Time
     Ts = args.Ts;
    @@ -1754,9 +2327,9 @@ H_lpf = 1/(1 + 2
     
    -
    -

    Translation Stage

    -
    +
    +

    Translation Stage

    +
    %% Translation stage - Dy
     t = 0:Ts:Tmax; % Time Vector [s]
    @@ -1765,9 +2338,9 @@ Dyd  = zeros(length(t), 1);
     Dydd = zeros(length(t), 1);
     switch args.Dy_type
       case 'constant'
    -    Dy(:) = args.Dy_amplitude;
    -    Dyd(:)   = 0;
    -    Dydd(:)  = 0;
    +    Dy(:)   = args.Dy_amplitude;
    +    Dyd(:)  = 0;
    +    Dydd(:) = 0;
       case 'triangular'
         % This is done to unsure that we start with no displacement
         Dy_raw = args.Dy_amplitude*sawtooth(2*pi*t/args.Dy_period,1/2);
    @@ -1793,9 +2366,9 @@ Dy = struct('time', t, 
     
    -
    -

    Tilt Stage

    -
    +
    +

    Tilt Stage

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

    Spindle

    -
    +
    +

    Spindle

    +
    %% Spindle - Rz
     t = 0:Ts:Tmax; % Time Vector [s]
    @@ -1845,16 +2418,19 @@ Rzdd = zeros(length(t), 1);
     
     switch args.Rz_type
       case 'constant'
    -    Rz(:) = args.Rz_amplitude;
    -    Rzd(:)   = 0;
    -    Rzdd(:)  = 0;
    +    Rz(:)   = args.Rz_amplitude;
    +    Rzd(:)  = 0;
    +    Rzdd(:) = 0;
       case 'rotating'
    -    Rz(:) = args.Rz_amplitude+2*pi/args.Rz_period*t;
    +    Rz(:) = 2*pi/args.Rz_period*t;
     
         % The signal is filtered out
         Rz   = lsim(H_lpf,     Rz, t);
         Rzd  = lsim(H_lpf*s,   Rz, t);
         Rzdd = lsim(H_lpf*s^2, Rz, t);
    +
    +    % We add the angle offset
    +    Rz = Rz + args.Rz_amplitude;
       otherwise
         warning('Rz_type is not set correctly');
     end
    @@ -1865,9 +2441,9 @@ Rz = struct('time', t, 
     
    -
    -

    Micro Hexapod

    -
    +
    +

    Micro Hexapod

    +
    %% Micro-Hexapod
     t = [0, Ts];
    @@ -1909,9 +2485,9 @@ Dhl = struct('time', t, 
     
    -
    -

    Axis Compensation

    -
    +
    +

    Axis Compensation

    +
    %% Axis Compensation - Rm
     t = [0, Ts];
    @@ -1923,9 +2499,9 @@ Rm = struct('time', t, 
     
    -
    -

    Nano Hexapod

    -
    +
    +

    Nano Hexapod

    +
    %% Nano-Hexapod
     t = [0, Ts];
    @@ -1934,22 +2510,44 @@ Dn = zeros(length(t), 6);
     switch args.Dn_type
       case 'constant'
         Dn = [args.Dn_pos, args.Dn_pos];
    +
    +    load('mat/stages.mat', 'nano_hexapod');
    +
    +    AP = [args.Dn_pos(1) ; args.Dn_pos(2) ; args.Dn_pos(3)];
    +
    +    tx = args.Dn_pos(4);
    +    ty = args.Dn_pos(5);
    +    tz = args.Dn_pos(6);
    +
    +    ARB = [cos(tz) -sin(tz) 0;
    +           sin(tz)  cos(tz) 0;
    +           0        0       1]*...
    +          [ cos(ty) 0 sin(ty);
    +            0       1 0;
    +           -sin(ty) 0 cos(ty)]*...
    +          [1 0        0;
    +           0 cos(tx) -sin(tx);
    +           0 sin(tx)  cos(tx)];
    +
    +    [~, Dnl] = inverseKinematics(nano_hexapod, 'AP', AP, 'ARB', ARB);
    +    Dnl = [Dnl, Dnl];
       otherwise
         warning('Dn_type is not set correctly');
     end
     
     Dn = struct('time', t, 'signals', struct('values', Dn));
    +Dnl = struct('time', t, 'signals', struct('values', Dnl));
     
    -
    -

    Save

    -
    +
    +

    Save

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

    12 Initialize Disturbances

    -
    +
    +

    15 Initialize Disturbances

    +

    - +

    -
    -

    Function Declaration and Documentation

    -
    +
    +

    Function Declaration and Documentation

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

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         % Global parameter to enable or disable the disturbances
    @@ -2008,9 +2606,9 @@ Dn = struct('time', t, 
     
    -
    -

    Load Data

    -
    +
    +

    Load Data

    +
    load('./disturbances/mat/dist_psd.mat', 'dist_f');
     
    @@ -2021,9 +2619,9 @@ We remove the first frequency point that usually is very large.

    -
    -

    Parameters

    -
    +
    +

    Parameters

    +

    We define some parameters that will be used in the algorithm.

    @@ -2040,9 +2638,9 @@ Ts = 1/Fs; -

    Ground Motion

    -
    +
    +

    Ground Motion

    +
    phi = dist_f.psd_gm;
     C = zeros(N/2,1);
    @@ -2054,6 +2652,7 @@ C = zeros(N/2,1);
     
     
    if args.Dwx && args.enable
    +  rng(111);
       theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
       Cx = [0 ; C.*complex(cos(theta),sin(theta))];
       Cx = [Cx; flipud(conj(Cx(2:end)))];;
    @@ -2066,6 +2665,7 @@ C = zeros(N/2,1);
     
     
    if args.Dwy && args.enable
    +  rng(112);
       theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
       Cx = [0 ; C.*complex(cos(theta),sin(theta))];
       Cx = [Cx; flipud(conj(Cx(2:end)))];;
    @@ -2078,6 +2678,7 @@ C = zeros(N/2,1);
     
     
    if args.Dwy && args.enable
    +  rng(113);
       theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
       Cx = [0 ; C.*complex(cos(theta),sin(theta))];
       Cx = [Cx; flipud(conj(Cx(2:end)))];;
    @@ -2090,9 +2691,9 @@ C = zeros(N/2,1);
     
    -
    -

    Translation Stage - X direction

    -
    +
    +

    Translation Stage - X direction

    +
    if args.Fty_x && args.enable
       phi = dist_f.psd_ty; % TODO - we take here the vertical direction which is wrong but approximate
    @@ -2100,6 +2701,7 @@ C = zeros(N/2,1);
       for i = 1:N/2
         C(i) = sqrt(phi(i)*df);
       end
    +  rng(121);
       theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
       Cx = [0 ; C.*complex(cos(theta),sin(theta))];
       Cx = [Cx; flipud(conj(Cx(2:end)))];;
    @@ -2113,9 +2715,9 @@ C = zeros(N/2,1);
     
    -
    -

    Translation Stage - Z direction

    -
    +
    +

    Translation Stage - Z direction

    +
    if args.Fty_z && args.enable
       phi = dist_f.psd_ty;
    @@ -2123,6 +2725,7 @@ C = zeros(N/2,1);
       for i = 1:N/2
         C(i) = sqrt(phi(i)*df);
       end
    +  rng(122);
       theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
       Cx = [0 ; C.*complex(cos(theta),sin(theta))];
       Cx = [Cx; flipud(conj(Cx(2:end)))];;
    @@ -2136,9 +2739,9 @@ C = zeros(N/2,1);
     
    -
    -

    Spindle - Z direction

    -
    +
    +

    Spindle - Z direction

    +
    if args.Frz_z && args.enable
       phi = dist_f.psd_rz;
    @@ -2146,6 +2749,7 @@ C = zeros(N/2,1);
       for i = 1:N/2
         C(i) = sqrt(phi(i)*df);
       end
    +  rng(131);
       theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
       Cx = [0 ; C.*complex(cos(theta),sin(theta))];
       Cx = [Cx; flipud(conj(Cx(2:end)))];;
    @@ -2159,9 +2763,9 @@ C = zeros(N/2,1);
     
    -
    -

    Direct Forces

    -
    +
    +

    Direct Forces

    +
    u = zeros(length(t), 6);
     Fd = u;
    @@ -2170,9 +2774,9 @@ Fd = u;
     
    -
    -

    Set initial value to zero

    -
    +
    +

    Set initial value to zero

    +
    Dwx    = Dwx   - Dwx(1);
     Dwy    = Dwy   - Dwy(1);
    @@ -2185,9 +2789,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');
     
    @@ -2196,11 +2800,101 @@ Frz_z = Frz_z - Frz_z(1);
    -
    -

    13 Z-Axis Geophone

    -
    +
    +

    16 Initialize Position Errors

    +

    - + +

    +
    + +
    +

    Function Declaration and Documentation

    +
    +
    +
    function [] = initializePosError(args)
    +% initializePosError - Initialize the position errors
    +%
    +% Syntax: [] = initializePosError(args)
    +%
    +% Inputs:
    +%    - args -
    +
    +
    +
    +
    +
    + +
    +

    Optional Parameters

    +
    +
    +
    arguments
    +    args.error    logical {mustBeNumericOrLogical} = false
    +    args.Dy (1,1) double  {mustBeNumeric} = 0 % [m]
    +    args.Ry (1,1) double  {mustBeNumeric} = 0 % [m]
    +    args.Rz (1,1) double  {mustBeNumeric} = 0 % [m]
    +end
    +
    +
    +
    +
    + +
    +

    Structure initialization

    +
    +

    +First, we initialize the pos_error structure. +

    +
    +
    pos_error = struct();
    +
    +
    +
    +
    + +
    +

    Type

    +
    +
    +
    if args.error
    +  pos_error.type = 1;
    +else
    +  pos_error.type = 0;
    +end
    +
    +
    +
    +
    + +
    +

    Position Errors

    +
    +
    +
    pos_error.Dy = args.Dy;
    +pos_error.Ry = args.Ry;
    +pos_error.Rz = args.Rz;
    +
    +
    +
    +
    + +
    +

    Save

    +
    +
    +
    save('mat/pos_error.mat', 'pos_error');
    +
    +
    +
    +
    +
    + +
    +

    17 Z-Axis Geophone

    +
    +

    +

    @@ -2227,11 +2921,11 @@ Frz_z = Frz_z - Frz_z(1);
    -
    -

    14 Z-Axis Accelerometer

    -
    +
    +

    18 Z-Axis Accelerometer

    +

    - +

    @@ -2263,7 +2957,7 @@ Frz_z = Frz_z - Frz_z(1);

    Author: Dehaeze Thomas

    -

    Created: 2020-02-03 lun. 17:50

    +

    Created: 2020-02-25 mar. 18:08

    diff --git a/simulink_project/index.html b/docs/simulink_project.html similarity index 90% rename from simulink_project/index.html rename to docs/simulink_project.html index 290e3c4..3a714d7 100644 --- a/simulink_project/index.html +++ b/docs/simulink_project.html @@ -1,9 +1,11 @@ + + - + Simulink Project for the NASS @@ -205,7 +207,7 @@ @licstart The following is the entire license notice for the JavaScript code in this tag. -Copyright (C) 2012-2019 Free Software Foundation, Inc. +Copyright (C) 2012-2020 Free Software Foundation, Inc. The JavaScript code in this tag is free software: you can redistribute it and/or modify it under the terms of the GNU @@ -282,7 +284,7 @@ The project can be opened using the simulinkproject function:

    -
    simulinkproject('./');
    +
    simulinkproject('./');
     
    @@ -294,13 +296,16 @@ The startup script is defined below and is exported to the project_startup
    project = simulinkproject;
     projectRoot = project.RootFolder;
     
    -myCacheFolder = fullfile(projectRoot, '.SimulinkCache');
    -myCodeFolder = fullfile(projectRoot, '.SimulinkCode');
    +myCacheFolder = fullfile(projectRoot, '.SimulinkCache');
    +myCodeFolder = fullfile(projectRoot, '.SimulinkCode');
     
    -Simulink.fileGenControl('set',...
    +Simulink.fileGenControl('set',...
         'CacheFolder', myCacheFolder,...
         'CodeGenFolder', myCodeFolder,...
    -    'createDir', true);
    +    'createDir', true);
    +
    +%% Load the Simscape Configuration
    +load('mat/conf_simulink.mat');
     
    @@ -308,7 +313,7 @@ Simulink.fileGenControl(project_shutdown.m script defined below.

    -
    Simulink.fileGenControl('reset');
    +
    Simulink.fileGenControl('reset');
     
    @@ -318,8 +323,7 @@ The project also permits to automatically add defined folder to the path when th

    Author: Dehaeze Thomas

    -

    Created: 2019-12-11 mer. 17:06

    -

    Validate

    +

    Created: 2020-02-25 mar. 18:08

    diff --git a/docs/stewart_platform.html b/docs/stewart_platform.html new file mode 100644 index 0000000..edba4a2 --- /dev/null +++ b/docs/stewart_platform.html @@ -0,0 +1,1377 @@ + + + + + + + + + +Stewart Platform - Simscape Model + + + + + + + + + + + + + + +
    + UP + | + HOME +
    +

    Stewart Platform - Simscape Model

    +
    +

    Table of Contents

    +
    + +
    +
    + +

    +Stewart platforms are generated in multiple steps. +

    + +

    +We define 4 important frames: +

    +
      +
    • \(\{F\}\): Frame fixed to the Fixed base and located at the center of its bottom surface. +This is used to fix the Stewart platform to some support.
    • +
    • \(\{M\}\): Frame fixed to the Moving platform and located at the center of its top surface. +This is used to place things on top of the Stewart platform.
    • +
    • \(\{A\}\): Frame fixed to the fixed base. +It defined the center of rotation of the moving platform.
    • +
    • \(\{B\}\): Frame fixed to the moving platform. +The motion of the moving platforms and forces applied to it are defined with respect to this frame \(\{B\}\).
    • +
    + +

    +Then, we define the location of the spherical joints: +

    +
      +
    • \(\bm{a}_{i}\) are the position of the spherical joints fixed to the fixed base
    • +
    • \(\bm{b}_{i}\) are the position of the spherical joints fixed to the moving platform
    • +
    + +

    +We define the rest position of the Stewart platform: +

    +
      +
    • For simplicity, we suppose that the fixed base and the moving platform are parallel and aligned with the vertical axis at their rest position.
    • +
    • Thus, to define the rest position of the Stewart platform, we just have to defined its total height \(H\). +\(H\) corresponds to the distance from the bottom of the fixed base to the top of the moving platform.
    • +
    + +

    +From \(\bm{a}_{i}\) and \(\bm{b}_{i}\), we can determine the length and orientation of each strut: +

    +
      +
    • \(l_{i}\) is the length of the strut
    • +
    • \({}^{A}\hat{\bm{s}}_{i}\) is the unit vector align with the strut
    • +
    + +

    +The position of the Spherical joints can be computed using various methods: +

    +
      +
    • Cubic configuration
    • +
    • Circular configuration
    • +
    • Arbitrary position
    • +
    • These methods should be easily scriptable and corresponds to specific functions that returns \({}^{F}\bm{a}_{i}\) and \({}^{M}\bm{b}_{i}\). +The input of these functions are the parameters corresponding to the wanted geometry.
    • +
    + +

    +For Simscape, we need: +

    +
      +
    • The position and orientation of each spherical joint fixed to the fixed base: \({}^{F}\bm{a}_{i}\) and \({}^{F}\bm{R}_{a_{i}}\)
    • +
    • The position and orientation of each spherical joint fixed to the moving platform: \({}^{M}\bm{b}_{i}\) and \({}^{M}\bm{R}_{b_{i}}\)
    • +
    • The rest length of each strut: \(l_{i}\)
    • +
    • The stiffness and damping of each actuator: \(k_{i}\) and \(c_{i}\)
    • +
    • The position of the frame \(\{A\}\) with respect to the frame \(\{F\}\): \({}^{F}\bm{O}_{A}\)
    • +
    • The position of the frame \(\{B\}\) with respect to the frame \(\{M\}\): \({}^{M}\bm{O}_{B}\)
    • +
    + +
    +

    1 initializeFramesPositions: Initialize the positions of frames {A}, {B}, {F} and {M}

    +
    +

    + +

    + +

    +This Matlab function is accessible here. +

    +
    + +
    +

    1.1 Function description

    +
    +
    +
    function [stewart] = initializeFramesPositions(args)
    +% initializeFramesPositions - Initialize the positions of frames {A}, {B}, {F} and {M}
    +%
    +% Syntax: [stewart] = initializeFramesPositions(args)
    +%
    +% Inputs:
    +%    - args - Can have the following fields:
    +%        - H    [1x1] - Total Height of the Stewart Platform (height from {F} to {M}) [m]
    +%        - MO_B [1x1] - Height of the frame {B} with respect to {M} [m]
    +%
    +% Outputs:
    +%    - stewart - A structure with the following fields:
    +%        - H    [1x1] - Total Height of the Stewart Platform [m]
    +%        - FO_M [3x1] - Position of {M} with respect to {F} [m]
    +%        - MO_B [3x1] - Position of {B} with respect to {M} [m]
    +%        - FO_A [3x1] - Position of {A} with respect to {F} [m]
    +
    +
    +
    +
    + +
    +

    1.2 Documentation

    +
    + +
    +

    stewart-frames-position.png +

    +

    Figure 1: Definition of the position of the frames

    +
    +
    +
    + +
    +

    1.3 Optional Parameters

    +
    +
    +
    arguments
    +    args.H    (1,1) double {mustBeNumeric, mustBePositive} = 90e-3
    +    args.MO_B (1,1) double {mustBeNumeric} = 50e-3
    +end
    +
    +
    +
    +
    + +
    +

    1.4 Initialize the Stewart structure

    +
    +
    +
    stewart = struct();
    +
    +
    +
    +
    + +
    +

    1.5 Compute the position of each frame

    +
    +
    +
    stewart.H = args.H; % Total Height of the Stewart Platform [m]
    +
    +stewart.FO_M = [0; 0; stewart.H]; % Position of {M} with respect to {F} [m]
    +
    +stewart.MO_B = [0; 0; args.MO_B]; % Position of {B} with respect to {M} [m]
    +
    +stewart.FO_A = stewart.MO_B + stewart.FO_M; % Position of {A} with respect to {F} [m]
    +
    +
    +
    +
    +
    + +
    +

    2 Initialize the position of the Joints

    +
    +
    +
    +

    2.1 generateCubicConfiguration: Generate a Cubic Configuration

    +
    +

    + +

    + +

    +This Matlab function is accessible here. +

    +
    + +
    +

    2.1.1 Function description

    +
    +
    +
    function [stewart] = generateCubicConfiguration(stewart, args)
    +% generateCubicConfiguration - Generate a Cubic Configuration
    +%
    +% Syntax: [stewart] = generateCubicConfiguration(stewart, args)
    +%
    +% Inputs:
    +%    - stewart - A structure with the following fields
    +%        - H   [1x1] - Total height of the platform [m]
    +%    - args - Can have the following fields:
    +%        - Hc  [1x1] - Height of the "useful" part of the cube [m]
    +%        - FOc [1x1] - Height of the center of the cube with respect to {F} [m]
    +%        - FHa [1x1] - Height of the plane joining the points ai with respect to the frame {F} [m]
    +%        - MHb [1x1] - Height of the plane joining the points bi with respect to the frame {M} [m]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%        - Fa  [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
    +%        - Mb  [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
    +
    +
    +
    +
    + +
    +

    2.1.2 Documentation

    +
    + +
    +

    cubic-configuration-definition.png +

    +

    Figure 2: Cubic Configuration

    +
    +
    +
    + +
    +

    2.1.3 Optional Parameters

    +
    +
    +
    arguments
    +    stewart
    +    args.Hc  (1,1) double {mustBeNumeric, mustBePositive} = 60e-3
    +    args.FOc (1,1) double {mustBeNumeric} = 50e-3
    +    args.FHa (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
    +    args.MHb (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
    +end
    +
    +
    +
    +
    + +
    +

    2.1.4 Position of the Cube

    +
    +

    +We define the useful points of the cube with respect to the Cube’s center. +\({}^{C}C\) are the 6 vertices of the cubes expressed in a frame {C} which is +located at the center of the cube and aligned with {F} and {M}. +

    + +
    +
    sx = [ 2; -1; -1];
    +sy = [ 0;  1; -1];
    +sz = [ 1;  1;  1];
    +
    +R = [sx, sy, sz]./vecnorm([sx, sy, sz]);
    +
    +L = args.Hc*sqrt(3);
    +
    +Cc = R'*[[0;0;L],[L;0;L],[L;0;0],[L;L;0],[0;L;0],[0;L;L]] - [0;0;1.5*args.Hc];
    +
    +CCf = [Cc(:,1), Cc(:,3), Cc(:,3), Cc(:,5), Cc(:,5), Cc(:,1)]; % CCf(:,i) corresponds to the bottom cube's vertice corresponding to the i'th leg
    +CCm = [Cc(:,2), Cc(:,2), Cc(:,4), Cc(:,4), Cc(:,6), Cc(:,6)]; % CCm(:,i) corresponds to the top cube's vertice corresponding to the i'th leg
    +
    +
    +
    +
    + +
    +

    2.1.5 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}\)). +

    +
    +
    CSi = (CCm - CCf)./vecnorm(CCm - CCf);
    +
    +
    + +

    +We now which to compute the position of the joints \(a_{i}\) and \(b_{i}\). +

    +
    +
    stewart.Fa = CCf + [0; 0; args.FOc] + ((args.FHa-(args.FOc-args.Hc/2))./CSi(3,:)).*CSi;
    +stewart.Mb = CCf + [0; 0; args.FOc-stewart.H] + ((stewart.H-args.MHb-(args.FOc-args.Hc/2))./CSi(3,:)).*CSi;
    +
    +
    +
    +
    +
    + +
    +

    2.2 generateGeneralConfiguration: Generate a Very General Configuration

    +
    +

    + +

    + +

    +This Matlab function is accessible here. +

    +
    + +
    +

    2.2.1 Function description

    +
    +
    +
    function [stewart] = generateGeneralConfiguration(stewart, args)
    +% generateGeneralConfiguration - Generate a Very General Configuration
    +%
    +% Syntax: [stewart] = generateGeneralConfiguration(stewart, args)
    +%
    +% Inputs:
    +%    - args - Can have the following fields:
    +%        - FH  [1x1] - Height of the position of the fixed joints with respect to the frame {F} [m]
    +%        - FR  [1x1] - Radius of the position of the fixed joints in the X-Y [m]
    +%        - FTh [6x1] - Angles of the fixed joints in the X-Y plane with respect to the X axis [rad]
    +%        - MH  [1x1] - Height of the position of the mobile joints with respect to the frame {M} [m]
    +%        - FR  [1x1] - Radius of the position of the mobile joints in the X-Y [m]
    +%        - MTh [6x1] - Angles of the mobile joints in the X-Y plane with respect to the X axis [rad]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%        - Fa  [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
    +%        - Mb  [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
    +
    +
    +
    +
    + +
    +

    2.2.2 Documentation

    +
    +

    +Joints are positions on a circle centered with the Z axis of {F} and {M} and at a chosen distance from {F} and {M}. +The radius of the circles can be chosen as well as the angles where the joints are located. +

    +
    +
    + +
    +

    2.2.3 Optional Parameters

    +
    +
    +
    arguments
    +    stewart
    +    args.FH  (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
    +    args.FR  (1,1) double {mustBeNumeric, mustBePositive} = 90e-3;
    +    args.FTh (6,1) double {mustBeNumeric} = [-10, 10, 120-10, 120+10, 240-10, 240+10]*(pi/180);
    +    args.MH  (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
    +    args.MR  (1,1) double {mustBeNumeric, mustBePositive} = 70e-3;
    +    args.MTh (6,1) double {mustBeNumeric} = [-60+10, 60-10, 60+10, 180-10, 180+10, -60-10]*(pi/180);
    +end
    +
    +
    +
    +
    + +
    +

    2.2.4 Compute the pose

    +
    +
    +
    stewart.Fa = zeros(3,6);
    +stewart.Mb = zeros(3,6);
    +
    +
    + +
    +
    for i = 1:6
    +  stewart.Fa(:,i) = [args.FR*cos(args.FTh(i)); args.FR*sin(args.FTh(i)); args.FH];
    +  stewart.Mb(:,i) = [args.MR*cos(args.MTh(i)); args.MR*sin(args.MTh(i)); -args.MH];
    +end
    +
    +
    +
    +
    +
    +
    + +
    +

    3 computeJointsPose: Compute the Pose of the Joints

    +
    +

    + +

    + +

    +This Matlab function is accessible here. +

    +
    + +
    +

    3.1 Function description

    +
    +
    +
    function [stewart] = computeJointsPose(stewart)
    +% computeJointsPose -
    +%
    +% Syntax: [stewart] = computeJointsPose(stewart)
    +%
    +% Inputs:
    +%    - stewart - A structure with the following fields
    +%        - Fa   [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
    +%        - Mb   [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
    +%        - FO_A [3x1] - Position of {A} with respect to {F}
    +%        - MO_B [3x1] - Position of {B} with respect to {M}
    +%        - FO_M [3x1] - Position of {M} with respect to {F}
    +%
    +% Outputs:
    +%    - stewart - A structure with the following added fields
    +%        - Aa  [3x6]   - The i'th column is the position of ai with respect to {A}
    +%        - Ab  [3x6]   - The i'th column is the position of bi with respect to {A}
    +%        - Ba  [3x6]   - The i'th column is the position of ai with respect to {B}
    +%        - Bb  [3x6]   - The i'th column is the position of bi with respect to {B}
    +%        - l   [6x1]   - The i'th element is the initial length of strut i
    +%        - As  [3x6]   - The i'th column is the unit vector of strut i expressed in {A}
    +%        - Bs  [3x6]   - The i'th column is the unit vector of strut i expressed in {B}
    +%        - FRa [3x3x6] - The i'th 3x3 array is the rotation matrix to orientate the bottom of the i'th strut from {F}
    +%        - MRb [3x3x6] - The i'th 3x3 array is the rotation matrix to orientate the top of the i'th strut from {M}
    +
    +
    +
    +
    + +
    +

    3.2 Documentation

    +
    + +
    +

    stewart-struts.png +

    +

    Figure 3: Position and orientation of the struts

    +
    +
    +
    + +
    +

    3.3 Compute the position of the Joints

    +
    +
    +
    stewart.Aa = stewart.Fa - repmat(stewart.FO_A, [1, 6]);
    +stewart.Bb = stewart.Mb - repmat(stewart.MO_B, [1, 6]);
    +
    +stewart.Ab = stewart.Bb - repmat(-stewart.MO_B-stewart.FO_M+stewart.FO_A, [1, 6]);
    +stewart.Ba = stewart.Aa - repmat( stewart.MO_B+stewart.FO_M-stewart.FO_A, [1, 6]);
    +
    +
    +
    +
    + +
    +

    3.4 Compute the strut length and orientation

    +
    +
    +
    stewart.As = (stewart.Ab - stewart.Aa)./vecnorm(stewart.Ab - stewart.Aa); % As_i is the i'th vector of As
    +
    +stewart.l = vecnorm(stewart.Ab - stewart.Aa)';
    +
    +
    + +
    +
    stewart.Bs = (stewart.Bb - stewart.Ba)./vecnorm(stewart.Bb - stewart.Ba);
    +
    +
    +
    +
    + +
    +

    3.5 Compute the orientation of the Joints

    +
    +
    +
    stewart.FRa = zeros(3,3,6);
    +stewart.MRb = zeros(3,3,6);
    +
    +for i = 1:6
    +  stewart.FRa(:,:,i) = [cross([0;1;0], stewart.As(:,i)) , cross(stewart.As(:,i), cross([0;1;0], stewart.As(:,i))) , stewart.As(:,i)];
    +  stewart.FRa(:,:,i) = stewart.FRa(:,:,i)./vecnorm(stewart.FRa(:,:,i));
    +
    +  stewart.MRb(:,:,i) = [cross([0;1;0], stewart.Bs(:,i)) , cross(stewart.Bs(:,i), cross([0;1;0], stewart.Bs(:,i))) , stewart.Bs(:,i)];
    +  stewart.MRb(:,:,i) = stewart.MRb(:,:,i)./vecnorm(stewart.MRb(:,:,i));
    +end
    +
    +
    +
    +
    +
    + +
    +

    4 initializeStrutDynamics: Add Stiffness and Damping properties of each strut

    +
    +

    + +

    + +

    +This Matlab function is accessible here. +

    +
    + +
    +

    4.1 Function description

    +
    +
    +
    function [stewart] = initializeStrutDynamics(stewart, args)
    +% initializeStrutDynamics - Add Stiffness and Damping properties of each strut
    +%
    +% Syntax: [stewart] = initializeStrutDynamics(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - Ki [6x1] - Stiffness of each strut [N/m]
    +%        - Ci [6x1] - Damping of each strut [N/(m/s)]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%        - Ki [6x1] - Stiffness of each strut [N/m]
    +%        - Ci [6x1] - Damping of each strut [N/(m/s)]
    +
    +
    +
    +
    + +
    +

    4.2 Optional Parameters

    +
    +
    +
    arguments
    +    stewart
    +    args.Ki (6,1) double {mustBeNumeric, mustBePositive} = 1e6*ones(6,1)
    +    args.Ci (6,1) double {mustBeNumeric, mustBePositive} = 1e3*ones(6,1)
    +end
    +
    +
    +
    +
    + +
    +

    4.3 Add Stiffness and Damping properties of each strut

    +
    +
    +
    stewart.Ki = args.Ki;
    +stewart.Ci = args.Ci;
    +
    +
    +
    +
    +
    + +
    +

    5 computeJacobian: Compute the Jacobian Matrix

    +
    +

    + +

    + +

    +This Matlab function is accessible here. +

    +
    + +
    +

    5.1 Function description

    +
    +
    +
    function [stewart] = computeJacobian(stewart)
    +% computeJacobian -
    +%
    +% Syntax: [stewart] = computeJacobian(stewart)
    +%
    +% Inputs:
    +%    - stewart - With at least the following fields:
    +%        - As [3x6] - The 6 unit vectors for each strut expressed in {A}
    +%        - Ab [3x6] - The 6 position of the joints bi expressed in {A}
    +%
    +% Outputs:
    +%    - stewart - With the 3 added field:
    +%        - J [6x6] - The Jacobian Matrix
    +%        - K [6x6] - The Stiffness Matrix
    +%        - C [6x6] - The Compliance Matrix
    +
    +
    +
    +
    + +
    +

    5.2 Compute Jacobian Matrix

    +
    +
    +
    stewart.J = [stewart.As' , cross(stewart.Ab, stewart.As)'];
    +
    +
    +
    +
    + +
    +

    5.3 Compute Stiffness Matrix

    +
    +
    +
    stewart.K = stewart.J'*diag(stewart.Ki)*stewart.J;
    +
    +
    +
    +
    + +
    +

    5.4 Compute Compliance Matrix

    +
    +
    +
    stewart.C = inv(stewart.K);
    +
    +
    +
    +
    +
    + +
    +

    6 Initialize the Geometry of the Mechanical Elements

    +
    +
    +
    +

    6.1 initializeCylindricalPlatforms: Initialize the geometry of the Fixed and Mobile Platforms

    +
    +

    + +

    + +

    +This Matlab function is accessible here. +

    +
    + +
    +

    6.1.1 Function description

    +
    +
    +
    function [stewart] = initializeCylindricalPlatforms(stewart, args)
    +% initializeCylindricalPlatforms - Initialize the geometry of the Fixed and Mobile Platforms
    +%
    +% Syntax: [stewart] = initializeCylindricalPlatforms(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - Fpm [1x1] - Fixed Platform Mass [kg]
    +%        - Fph [1x1] - Fixed Platform Height [m]
    +%        - Fpr [1x1] - Fixed Platform Radius [m]
    +%        - Mpm [1x1] - Mobile Platform Mass [kg]
    +%        - Mph [1x1] - Mobile Platform Height [m]
    +%        - Mpr [1x1] - Mobile Platform Radius [m]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%      - platforms [struct] - structure with the following fields:
    +%        - Fpm [1x1] - Fixed Platform Mass [kg]
    +%        - Msi [3x3] - Mobile Platform Inertia matrix [kg*m^2]
    +%        - Fph [1x1] - Fixed Platform Height [m]
    +%        - Fpr [1x1] - Fixed Platform Radius [m]
    +%        - Mpm [1x1] - Mobile Platform Mass [kg]
    +%        - Fsi [3x3] - Fixed Platform Inertia matrix [kg*m^2]
    +%        - Mph [1x1] - Mobile Platform Height [m]
    +%        - Mpr [1x1] - Mobile Platform Radius [m]
    +
    +
    +
    +
    + +
    +

    6.1.2 Optional Parameters

    +
    +
    +
    arguments
    +    stewart
    +    args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
    +    args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
    +    args.Fpr (1,1) double {mustBeNumeric, mustBePositive} = 125e-3
    +    args.Mpm (1,1) double {mustBeNumeric, mustBePositive} = 1
    +    args.Mph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
    +    args.Mpr (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
    +end
    +
    +
    +
    +
    + +
    +

    6.1.3 Create the platforms struct

    +
    +
    +
    platforms = struct();
    +
    +platforms.Fpm = args.Fpm;
    +platforms.Fph = args.Fph;
    +platforms.Fpr = args.Fpr;
    +platforms.Fpi = diag([1/12 * platforms.Fpm * (3*platforms.Fpr^2 + platforms.Fph^2), ...
    +                      1/12 * platforms.Fpm * (3*platforms.Fpr^2 + platforms.Fph^2), ...
    +                      1/2  * platforms.Fpm * platforms.Fpr^2]);
    +
    +platforms.Mpm = args.Mpm;
    +platforms.Mph = args.Mph;
    +platforms.Mpr = args.Mpr;
    +platforms.Mpi = diag([1/12 * platforms.Mpm * (3*platforms.Mpr^2 + platforms.Mph^2), ...
    +                      1/12 * platforms.Mpm * (3*platforms.Mpr^2 + platforms.Mph^2), ...
    +                      1/2  * platforms.Mpm * platforms.Mpr^2]);
    +
    +
    +
    +
    + +
    +

    6.1.4 Save the platforms struct

    +
    +
    +
    stewart.platforms = platforms;
    +
    +
    +
    +
    +
    + +
    +

    6.2 initializeCylindricalStruts: Define the mass and moment of inertia of cylindrical struts

    +
    +

    + +

    + +

    +This Matlab function is accessible here. +

    +
    + +
    +

    6.2.1 Function description

    +
    +
    +
    function [stewart] = initializeCylindricalStruts(stewart, args)
    +% initializeCylindricalStruts - Define the mass and moment of inertia of cylindrical struts
    +%
    +% Syntax: [stewart] = initializeCylindricalStruts(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - Fsm [1x1] - Mass of the Fixed part of the struts [kg]
    +%        - Fsh [1x1] - Height of cylinder for the Fixed part of the struts [m]
    +%        - Fsr [1x1] - Radius of cylinder for the Fixed part of the struts [m]
    +%        - Msm [1x1] - Mass of the Mobile part of the struts [kg]
    +%        - Msh [1x1] - Height of cylinder for the Mobile part of the struts [m]
    +%        - Msr [1x1] - Radius of cylinder for the Mobile part of the struts [m]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%      - struts [struct] - structure with the following fields:
    +%        - Fsm [6x1]   - Mass of the Fixed part of the struts [kg]
    +%        - Fsi [3x3x6] - Moment of Inertia for the Fixed part of the struts [kg*m^2]
    +%        - Msm [6x1]   - Mass of the Mobile part of the struts [kg]
    +%        - Msi [3x3x6] - Moment of Inertia for the Mobile part of the struts [kg*m^2]
    +%        - Fsh [6x1]   - Height of cylinder for the Fixed part of the struts [m]
    +%        - Fsr [6x1]   - Radius of cylinder for the Fixed part of the struts [m]
    +%        - Msh [6x1]   - Height of cylinder for the Mobile part of the struts [m]
    +%        - Msr [6x1]   - Radius of cylinder for the Mobile part of the struts [m]
    +
    +
    +
    +
    + +
    +

    6.2.2 Optional Parameters

    +
    +
    +
    arguments
    +    stewart
    +    args.Fsm (1,1) double {mustBeNumeric, mustBePositive} = 0.1
    +    args.Fsh (1,1) double {mustBeNumeric, mustBePositive} = 50e-3
    +    args.Fsr (1,1) double {mustBeNumeric, mustBePositive} = 5e-3
    +    args.Msm (1,1) double {mustBeNumeric, mustBePositive} = 0.1
    +    args.Msh (1,1) double {mustBeNumeric, mustBePositive} = 50e-3
    +    args.Msr (1,1) double {mustBeNumeric, mustBePositive} = 5e-3
    +end
    +
    +
    +
    +
    + +
    +

    6.2.3 Create the struts structure

    +
    +
    +
    struts = struct();
    +
    +struts.Fsm = ones(6,1).*args.Fsm;
    +struts.Msm = ones(6,1).*args.Msm;
    +
    +struts.Fsh = ones(6,1).*args.Fsh;
    +struts.Fsr = ones(6,1).*args.Fsr;
    +struts.Msh = ones(6,1).*args.Msh;
    +struts.Msr = ones(6,1).*args.Msr;
    +
    +struts.Fsi = zeros(3, 3, 6);
    +struts.Msi = zeros(3, 3, 6);
    +for i = 1:6
    +  struts.Fsi(:,:,i) = diag([1/12 * struts.Fsm(i) * (3*struts.Fsr(i)^2 + struts.Fsh(i)^2), ...
    +                            1/12 * struts.Fsm(i) * (3*struts.Fsr(i)^2 + struts.Fsh(i)^2), ...
    +                            1/2  * struts.Fsm(i) * struts.Fsr(i)^2]);
    +  struts.Msi(:,:,i) = diag([1/12 * struts.Msm(i) * (3*struts.Msr(i)^2 + struts.Msh(i)^2), ...
    +                            1/12 * struts.Msm(i) * (3*struts.Msr(i)^2 + struts.Msh(i)^2), ...
    +                            1/2  * struts.Msm(i) * struts.Msr(i)^2]);
    +end
    +
    +
    + +
    +
    stewart.struts = struts;
    +
    +
    +
    +
    +
    +
    + +
    +

    7 Utility Functions

    +
    +
    +
    +

    7.1 inverseKinematics: Compute Inverse Kinematics

    +
    +

    + +

    + +

    +This Matlab function is accessible here. +

    +
    + +
    +

    7.1.1 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}
    +%
    +% Syntax: [stewart] = inverseKinematics(stewart)
    +%
    +% Inputs:
    +%    - stewart - A structure with the following fields
    +%        - Aa   [3x6] - The positions ai expressed in {A}
    +%        - Bb   [3x6] - The positions bi expressed in {B}
    +%    - args - Can have the following fields:
    +%        - AP   [3x1] - The wanted position of {B} with respect to {A}
    +%        - ARB  [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
    +%
    +% Outputs:
    +%    - Li   [6x1] - The 6 needed length of the struts in [m] to have the wanted pose of {B} w.r.t. {A}
    +%    - dLi  [6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A}
    +
    +
    +
    +
    + +
    +

    7.1.2 Optional Parameters

    +
    +
    +
    arguments
    +    stewart
    +    args.AP  (3,1) double {mustBeNumeric} = zeros(3,1)
    +    args.ARB (3,3) double {mustBeNumeric} = eye(3)
    +end
    +
    +
    +
    +
    + +
    +

    7.1.3 Theory

    +
    +

    +For inverse kinematic analysis, it is assumed that the position \({}^A\bm{P}\) and orientation of the moving platform \({}^A\bm{R}_B\) are given and the problem is to obtain the joint variables, namely, \(\bm{L} = [l_1, l_2, \dots, l_6]^T\). +

    + +

    +From the geometry of the manipulator, the loop closure for each limb, \(i = 1, 2, \dots, 6\) can be written as +

    +\begin{align*} + l_i {}^A\hat{\bm{s}}_i &= {}^A\bm{A} + {}^A\bm{b}_i - {}^A\bm{a}_i \\ + &= {}^A\bm{A} + {}^A\bm{R}_b {}^B\bm{b}_i - {}^A\bm{a}_i +\end{align*} + +

    +To obtain the length of each actuator and eliminate \(\hat{\bm{s}}_i\), it is sufficient to dot multiply each side by itself: +

    +\begin{equation} + l_i^2 \left[ {}^A\hat{\bm{s}}_i^T {}^A\hat{\bm{s}}_i \right] = \left[ {}^A\bm{P} + {}^A\bm{R}_B {}^B\bm{b}_i - {}^A\bm{a}_i \right]^T \left[ {}^A\bm{P} + {}^A\bm{R}_B {}^B\bm{b}_i - {}^A\bm{a}_i \right] +\end{equation} + +

    +Hence, for \(i = 1, 2, \dots, 6\), each limb length can be uniquely determined by: +

    +\begin{equation} + l_i = \sqrt{{}^A\bm{P}^T {}^A\bm{P} + {}^B\bm{b}_i^T {}^B\bm{b}_i + {}^A\bm{a}_i^T {}^A\bm{a}_i - 2 {}^A\bm{P}^T {}^A\bm{a}_i + 2 {}^A\bm{P}^T \left[{}^A\bm{R}_B {}^B\bm{b}_i\right] - 2 \left[{}^A\bm{R}_B {}^B\bm{b}_i\right]^T {}^A\bm{a}_i} +\end{equation} + +

    +If the position and orientation of the moving platform lie in the feasible workspace of the manipulator, one unique solution to the limb length is determined by the above equation. +Otherwise, when the limbs’ lengths derived yield complex numbers, then the position or orientation of the moving platform is not reachable. +

    +
    +
    + +
    +

    7.1.4 Compute

    +
    +
    +
    Li = sqrt(args.AP'*args.AP + diag(stewart.Bb'*stewart.Bb) + diag(stewart.Aa'*stewart.Aa) - (2*args.AP'*stewart.Aa)' + (2*args.AP'*(args.ARB*stewart.Bb))' - diag(2*(args.ARB*stewart.Bb)'*stewart.Aa));
    +
    +
    + +
    +
    dLi = Li-stewart.l;
    +
    +
    +
    +
    +
    + +
    +

    7.2 forwardKinematicsApprox: Compute the Forward Kinematics

    +
    +

    + +

    + +

    +This Matlab function is accessible here. +

    +
    + +
    +

    7.2.1 Function description

    +
    +
    +
    function [P, R] = forwardKinematicsApprox(stewart, args)
    +% forwardKinematicsApprox - Computed the approximate pose of {B} with respect to {A} from the length of each strut and using
    +%                           the Jacobian Matrix
    +%
    +% Syntax: [P, R] = forwardKinematicsApprox(stewart, args)
    +%
    +% Inputs:
    +%    - stewart - A structure with the following fields
    +%        - J  [6x6] - The Jacobian Matrix
    +%    - args - Can have the following fields:
    +%        - dL [6x1] - Displacement of each strut [m]
    +%
    +% Outputs:
    +%    - P  [3x1] - The estimated position of {B} with respect to {A}
    +%    - R  [3x3] - The estimated rotation matrix that gives the orientation of {B} with respect to {A}
    +
    +
    +
    +
    + +
    +

    7.2.2 Optional Parameters

    +
    +
    +
    arguments
    +    stewart
    +    args.dL (6,1) double {mustBeNumeric} = zeros(6,1)
    +end
    +
    +
    +
    +
    + +
    +

    7.2.3 Computation

    +
    +

    +From a small displacement of each strut \(d\bm{\mathcal{L}}\), we can compute the +position and orientation of {B} with respect to {A} using the following formula: +\[ d \bm{\mathcal{X}} = \bm{J}^{-1} d\bm{\mathcal{L}} \] +

    +
    +
    X = stewart.J\args.dL;
    +
    +
    + +

    +The position vector corresponds to the first 3 elements. +

    +
    +
    P = X(1:3);
    +
    +
    + +

    +The next 3 elements are the orientation of {B} with respect to {A} expressed +using the screw axis. +

    +
    +
    theta = norm(X(4:6));
    +s = X(4:6)/theta;
    +
    +
    + +

    +We then compute the corresponding rotation matrix. +

    +
    +
    R = [s(1)^2*(1-cos(theta)) + cos(theta) ,        s(1)*s(2)*(1-cos(theta)) - s(3)*sin(theta), s(1)*s(3)*(1-cos(theta)) + s(2)*sin(theta);
    +     s(2)*s(1)*(1-cos(theta)) + s(3)*sin(theta), s(2)^2*(1-cos(theta)) + cos(theta),         s(2)*s(3)*(1-cos(theta)) - s(1)*sin(theta);
    +     s(3)*s(1)*(1-cos(theta)) - s(2)*sin(theta), s(3)*s(2)*(1-cos(theta)) + s(1)*sin(theta), s(3)^2*(1-cos(theta)) + cos(theta)];
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Author: Dehaeze Thomas

    +

    Created: 2020-02-25 mar. 18:08

    +
    + + diff --git a/docs/uniaxial.html b/docs/uniaxial.html new file mode 100644 index 0000000..8337ecb --- /dev/null +++ b/docs/uniaxial.html @@ -0,0 +1,1903 @@ + + + + + + + + + +Simscape Uniaxial Model + + + + + + + + + + + + + + + +
    + UP + | + HOME +
    +

    Simscape Uniaxial Model

    + + +

    +The idea is to use the same model as the full Simscape Model but to restrict the motion only in the vertical direction. +

    + +

    +This is done in order to more easily study the system and evaluate control techniques. +

    + +
    +

    1 Simscape Model

    +
    +

    + +

    + +

    +A schematic of the uniaxial model used for simulations is represented in figure 1. +

    + +

    +The perturbations \(w\) are: +

    +
      +
    • \(F_s\): direct forces applied to the sample such as inertia forces and cable forces
    • +
    • \(F_{rz}\): parasitic forces due to the rotation of the spindle
    • +
    • \(F_{ty}\): parasitic forces due to scans with the translation stage
    • +
    • \(D_w\): ground motion
    • +
    + +

    +The quantity to \(z\) to control is: +

    +
      +
    • \(D\): the position of the sample with respect to the granite
    • +
    + +

    +The measured quantities \(v\) are: +

    +
      +
    • \(D\): the position of the sample with respect to the granite
    • +
    + +

    +We study the use of an additional sensor: +

    +
      +
    • \(F_n\): a force sensor located in the nano-hexapod
    • +
    • \(v_n\): an absolute velocity sensor located on the top platform of the nano-hexapod
    • +
    • \(d_r\): a relative motion sensor located in the nano-hexapod
    • +
    + +

    +The control signal \(u\) is: +

    +
      +
    • \(F\) the force applied by the nano-hexapod actuator
    • +
    + + +
    +

    uniaxial-model-nass-flexible.png +

    +

    Figure 1: Schematic of the uniaxial model used

    +
    + + +

    +Few active damping techniques will be compared in order to decide which sensor is to be included in the system. +Schematics of the active damping techniques are displayed in figure 2. +

    + + +
    +

    uniaxial-model-nass-flexible-active-damping.png +

    +

    Figure 2: Comparison of used active damping techniques

    +
    +
    +
    + +
    +

    2 Undamped System

    +
    +

    + +

    +

    +Let’s start by study the undamped system. +

    +
    +
    +

    2.1 Init

    +
    +

    +We initialize all the stages with the default parameters. +The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg. +

    + +

    +All the controllers are set to 0 (Open Loop). +

    +
    +
    +
    +

    2.2 Identification

    +
    +

    +We identify the dynamics of the system. +

    +
    +
    %% Options for Linearized
    +options = linearizeOptions;
    +options.SampleTime = 0;
    +
    +%% Name of the Simulink File
    +mdl = 'sim_nano_station_uniaxial';
    +
    +
    + +

    +The inputs and outputs are defined below and corresponds to the name of simulink blocks. +

    +
    +
    %% Input/Output definition
    +io(1)  = linio([mdl, '/Dw'],   1, 'input'); % Ground Motion
    +io(2)  = linio([mdl, '/Fs'],   1, 'input'); % Force applied on the sample
    +io(3)  = linio([mdl, '/Fnl'],  1, 'input'); % Force applied by the NASS
    +io(4)  = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty
    +io(5)  = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz
    +
    +io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    +io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    +io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    +io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    +io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    +
    +
    + +

    +Finally, we use the linearize Matlab function to extract a state space model from the simscape model. +

    +
    +
    %% Run the linearization
    +G = linearize(mdl, io, options);
    +G.InputName  = {'Dw',   ... % Ground Motion [m]
    +                'Fs',   ... % Force Applied on Sample [N]
    +                'Fn',   ... % Force applied by NASS [N]
    +                'Fty',  ... % Parasitic Force Ty [N]
    +                'Frz'};     % Parasitic Force Rz [N]
    +G.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    +                'Fnm',  ... % Force Sensor in NASS [N]
    +                'Dnm',  ... % Displacement Sensor in NASS [m]
    +                'Dgm',  ... % Asbolute displacement of Granite [m]
    +                'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    +
    +
    + +

    +Finally, we save the identified system dynamics for further analysis. +

    +
    +
    save('./uniaxial/mat/plants.mat', 'G');
    +
    +
    +
    +
    + +
    +

    2.3 Sensitivity to Disturbances

    +
    +

    +We show several plots representing the sensitivity to disturbances: +

    +
      +
    • in figure 3 the transfer functions from ground motion \(D_w\) to the sample position \(D\) and the transfer function from direct force on the sample \(F_s\) to the sample position \(D\) are shown
    • +
    • in figure 4, it is the effect of parasitic forces of the positioning stages (\(F_{ty}\) and \(F_{rz}\)) on the position \(D\) of the sample that are shown
    • +
    + + +
    +

    uniaxial-sensitivity-disturbances.png +

    +

    Figure 3: Sensitivity to disturbances (png, pdf)

    +
    + + + +
    +

    uniaxial-sensitivity-force-dist.png +

    +

    Figure 4: Sensitivity to disturbances (png, pdf)

    +
    +
    +
    + +
    +

    2.4 Noise Budget

    +
    +

    +We first load the measured PSD of the disturbance. +

    +
    +
    load('./disturbances/mat/dist_psd.mat', 'dist_f');
    +
    +
    + +

    +The effect of these disturbances on the distance \(D\) is computed below. +The PSD of the obtain distance \(D\) due to each of the perturbation is shown in figure 5 and the Cumulative Amplitude Spectrum is shown in figure 6. +

    + + +

    +The Root Mean Square value of the obtained displacement \(D\) is computed below and can be determined from the figure 6. +

    +
    +3.3793e-06
    +
    + + + +
    +

    uniaxial-psd-dist.png +

    +

    Figure 5: PSD of the effect of disturbances on \(D\) (png, pdf)

    +
    + + + +
    +

    uniaxial-cas-dist.png +

    +

    Figure 6: CAS of the effect of disturbances on \(D\) (png, pdf)

    +
    +
    +
    + +
    +

    2.5 Plant

    +
    +

    +The transfer function from the force \(F\) applied by the nano-hexapod to the position of the sample \(D\) is shown in figure 7. +It corresponds to the plant to control. +

    + + +
    +

    uniaxial-plant.png +

    +

    Figure 7: Bode plot of the Plant (png, pdf)

    +
    +
    +
    +
    + +
    +

    3 Integral Force Feedback

    +
    +

    + +

    + +
    +

    uniaxial-model-nass-flexible-iff.png +

    +

    Figure 8: Uniaxial IFF Control Schematic

    +
    +
    +
    +

    3.1 Control Design

    +
    +
    +
    load('./uniaxial/mat/plants.mat', 'G');
    +
    +
    + +

    +Let’s look at the transfer function from actuator forces in the nano-hexapod to the force sensor in the nano-hexapod legs for all 6 pairs of actuator/sensor. +

    + + +
    +

    uniaxial_iff_plant.png +

    +

    Figure 9: Transfer function from forces applied in the legs to force sensor (png, pdf)

    +
    + +

    +The controller for each pair of actuator/sensor is: +

    +
    +
    K_iff = -1000/s;
    +
    +
    + + +
    +

    uniaxial_iff_open_loop.png +

    +

    Figure 10: Loop Gain for the Integral Force Feedback (png, pdf)

    +
    +
    +
    + +
    +

    3.2 Identification

    +
    +

    +Let’s initialize the system prior to identification. +

    +
    +
    initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod('actuator', 'piezo');
    +initializeSample('mass', 50);
    +
    +
    + +

    +All the controllers are set to 0. +

    +
    +
    K = tf(0);
    +save('./mat/controllers.mat', 'K', '-append');
    +K_iff = -K_iff;
    +save('./mat/controllers.mat', 'K_iff', '-append');
    +K_rmc = tf(0);
    +save('./mat/controllers.mat', 'K_rmc', '-append');
    +K_dvf = tf(0);
    +save('./mat/controllers.mat', 'K_dvf', '-append');
    +
    +
    + +
    +
    %% Options for Linearized
    +options = linearizeOptions;
    +options.SampleTime = 0;
    +
    +%% Name of the Simulink File
    +mdl = 'sim_nano_station_uniaxial';
    +
    +
    + +
    +
    %% Input/Output definition
    +io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    +io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    +io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    +io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    +io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    +
    +io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    +io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    +io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    +io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    +io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    +
    +
    + +
    +
    %% Run the linearization
    +G_iff = linearize(mdl, io, options);
    +G_iff.InputName  = {'Dw',   ... % Ground Motion [m]
    +                    'Fs',   ... % Force Applied on Sample [N]
    +                    'Fn',   ... % Force applied by NASS [N]
    +                    'Fty',  ... % Parasitic Force Ty [N]
    +                    'Frz'};     % Parasitic Force Rz [N]
    +G_iff.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    +                    'Fnm',  ... % Force Sensor in NASS [N]
    +                    'Dnm',  ... % Displacement Sensor in NASS [m]
    +                    'Dgm',  ... % Asbolute displacement of Granite [m]
    +                    'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    +
    +
    + +
    +
    save('./uniaxial/mat/plants.mat', 'G_iff', '-append');
    +
    +
    +
    +
    + +
    +

    3.3 Sensitivity to Disturbance

    +
    + +
    +

    uniaxial_sensitivity_dist_iff.png +

    +

    Figure 11: Sensitivity to disturbance once the IFF controller is applied to the system (png, pdf)

    +
    + + +
    +

    uniaxial_sensitivity_dist_stages_iff.png +

    +

    Figure 12: Sensitivity to force disturbances in various stages when IFF is applied (png, pdf)

    +
    +
    +
    + +
    +

    3.4 Damped Plant

    +
    + +
    +

    uniaxial_plant_iff_damped.png +

    +

    Figure 13: Damped Plant after IFF is applied (png, pdf)

    +
    +
    +
    + +
    +

    3.5 Conclusion

    +
    +
    +

    +Integral Force Feedback: +

    + +
    +
    +
    +
    + +
    +

    4 Relative Motion Control

    +
    +

    + +

    +

    +In the Relative Motion Control (RMC), a derivative feedback is applied between the measured actuator displacement to the actuator force input. +

    + + +
    +

    uniaxial-model-nass-flexible-rmc.png +

    +

    Figure 14: Uniaxial RMC Control Schematic

    +
    +
    +
    +

    4.1 Control Design

    +
    +
    +
    load('./uniaxial/mat/plants.mat', 'G');
    +
    +
    + +

    +Let’s look at the transfer function from actuator forces in the nano-hexapod to the measured displacement of the actuator for all 6 pairs of actuator/sensor. +

    + + +
    +

    uniaxial_rmc_plant.png +

    +

    Figure 15: Transfer function from forces applied in the legs to leg displacement sensor (png, pdf)

    +
    + +

    +The Relative Motion Controller is defined below. +A Low pass Filter is added to make the controller transfer function proper. +

    +
    +
    K_rmc = s*50000/(1 + s/2/pi/10000);
    +
    +
    + + +
    +

    uniaxial_rmc_open_loop.png +

    +

    Figure 16: Loop Gain for the Integral Force Feedback (png, pdf)

    +
    +
    +
    + +
    +

    4.2 Identification

    +
    +

    +Let’s initialize the system prior to identification. +

    +
    +
    initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod('actuator', 'piezo');
    +initializeSample('mass', 50);
    +
    +
    + +

    +And initialize the controllers. +

    +
    +
    K = tf(0);
    +save('./mat/controllers.mat', 'K', '-append');
    +K_iff = tf(0);
    +save('./mat/controllers.mat', 'K_iff', '-append');
    +K_rmc = -K_rmc;
    +save('./mat/controllers.mat', 'K_rmc', '-append');
    +K_dvf = tf(0);
    +save('./mat/controllers.mat', 'K_dvf', '-append');
    +
    +
    + +
    +
    %% Options for Linearized
    +options = linearizeOptions;
    +options.SampleTime = 0;
    +
    +%% Name of the Simulink File
    +mdl = 'sim_nano_station_uniaxial';
    +
    +
    + +
    +
    %% Input/Output definition
    +io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    +io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    +io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    +io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    +io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    +
    +io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    +io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    +io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    +io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    +io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    +
    +
    + +
    +
    %% Run the linearization
    +G_rmc = linearize(mdl, io, options);
    +G_rmc.InputName  = {'Dw',   ... % Ground Motion [m]
    +                    'Fs',   ... % Force Applied on Sample [N]
    +                    'Fn',   ... % Force applied by NASS [N]
    +                    'Fty',  ... % Parasitic Force Ty [N]
    +                    'Frz'};     % Parasitic Force Rz [N]
    +G_rmc.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    +                    'Fnm',  ... % Force Sensor in NASS [N]
    +                    'Dnm',  ... % Displacement Sensor in NASS [m]
    +                    'Dgm',  ... % Asbolute displacement of Granite [m]
    +                    'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    +
    +
    + +
    +
    save('./uniaxial/mat/plants.mat', 'G_rmc', '-append');
    +
    +
    +
    +
    + + +
    +

    4.3 Sensitivity to Disturbance

    +
    + +
    +

    uniaxial_sensitivity_dist_rmc.png +

    +

    Figure 17: Sensitivity to disturbance once the RMC controller is applied to the system (png, pdf)

    +
    + + +
    +

    uniaxial_sensitivity_dist_stages_rmc.png +

    +

    Figure 18: Sensitivity to force disturbances in various stages when RMC is applied (png, pdf)

    +
    +
    +
    + +
    +

    4.4 Damped Plant

    +
    + +
    +

    uniaxial_plant_rmc_damped.png +

    +

    Figure 19: Damped Plant after RMC is applied (png, pdf)

    +
    +
    +
    + +
    +

    4.5 Conclusion

    +
    +
    +

    +Relative Motion Control: +

    + +
    +
    +
    +
    + +
    +

    5 Direct Velocity Feedback

    +
    +

    + +

    +

    +In the Relative Motion Control (RMC), a feedback is applied between the measured velocity of the platform to the actuator force input. +

    + + +
    +

    uniaxial-model-nass-flexible-dvf.png +

    +

    Figure 20: Uniaxial DVF Control Schematic

    +
    +
    +
    +

    5.1 Control Design

    +
    +
    +
    load('./uniaxial/mat/plants.mat', 'G');
    +
    +
    + + +
    +

    uniaxial_dvf_plant.png +

    +

    Figure 21: Transfer function from forces applied in the legs to leg velocity sensor (png, pdf)

    +
    + +
    +
    K_dvf = tf(5e4);
    +
    +
    + + +
    +

    uniaxial_dvf_loop_gain.png +

    +

    Figure 22: Transfer function from forces applied in the legs to leg velocity sensor (png, pdf)

    +
    +
    +
    + +
    +

    5.2 Identification

    +
    +

    +Let’s initialize the system prior to identification. +

    +
    +
    initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod('actuator', 'piezo');
    +initializeSample('mass', 50);
    +
    +
    + +

    +And initialize the controllers. +

    +
    +
    K = tf(0);
    +save('./mat/controllers.mat', 'K', '-append');
    +K_iff = tf(0);
    +save('./mat/controllers.mat', 'K_iff', '-append');
    +K_rmc = tf(0);
    +save('./mat/controllers.mat', 'K_rmc', '-append');
    +K_dvf = -K_dvf;
    +save('./mat/controllers.mat', 'K_dvf', '-append');
    +
    +
    + +
    +
    %% Options for Linearized
    +options = linearizeOptions;
    +options.SampleTime = 0;
    +
    +%% Name of the Simulink File
    +mdl = 'sim_nano_station_uniaxial';
    +
    +
    + +
    +
    %% Input/Output definition
    +io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    +io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    +io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    +io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    +io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    +
    +io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    +io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    +io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    +io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    +io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    +
    +
    + +
    +
    %% Run the linearization
    +G_dvf = linearize(mdl, io, options);
    +G_dvf.InputName  = {'Dw',   ... % Ground Motion [m]
    +                    'Fs',   ... % Force Applied on Sample [N]
    +                    'Fn',   ... % Force applied by NASS [N]
    +                    'Fty',  ... % Parasitic Force Ty [N]
    +                    'Frz'};     % Parasitic Force Rz [N]
    +G_dvf.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    +                    'Fnm',  ... % Force Sensor in NASS [N]
    +                    'Dnm',  ... % Displacement Sensor in NASS [m]
    +                    'Dgm',  ... % Asbolute displacement of Granite [m]
    +                    'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    +
    +
    + +
    +
    save('./uniaxial/mat/plants.mat', 'G_dvf', '-append');
    +
    +
    +
    +
    + +
    +

    5.3 Sensitivity to Disturbance

    +
    + +
    +

    uniaxial_sensitivity_dist_dvf.png +

    +

    Figure 23: Sensitivity to disturbance once the DVF controller is applied to the system (png, pdf)

    +
    + + +
    +

    uniaxial_sensitivity_dist_stages_dvf.png +

    +

    Figure 24: Sensitivity to force disturbances in various stages when DVF is applied (png, pdf)

    +
    +
    +
    + +
    +

    5.4 Damped Plant

    +
    + +
    +

    uniaxial_plant_dvf_damped.png +

    +

    Figure 25: Damped Plant after DVF is applied (png, pdf)

    +
    +
    +
    + +
    +

    5.5 Conclusion

    +
    +
    +

    +Direct Velocity Feedback: +

    + +
    +
    +
    +
    +
    +

    6 With Cedrat Piezo-electric Actuators

    +
    +

    + +

    +

    +The model used for the Cedrat actuator is shown in figure 26. +

    + + +
    +

    cedrat-uniaxial-actuator.png +

    +

    Figure 26: Schematic of the model used for the Cedrat Actuator

    +
    +
    +
    +

    6.1 Identification

    +
    +

    +Let’s initialize the system prior to identification. +

    +
    +
    initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod('actuator', 'piezo');
    +initializeCedratPiezo();
    +initializeSample('mass', 50);
    +
    +
    + +

    +And initialize the controllers. +

    +
    +
    K = tf(0);
    +save('./mat/controllers.mat', 'K', '-append');
    +K_iff = tf(0);
    +save('./mat/controllers.mat', 'K_iff', '-append');
    +K_rmc = tf(0);
    +save('./mat/controllers.mat', 'K_rmc', '-append');
    +K_dvf = tf(0);
    +save('./mat/controllers.mat', 'K_dvf', '-append');
    +
    +
    + +

    +We identify the dynamics of the system. +

    +
    +
    %% Options for Linearized
    +options = linearizeOptions;
    +options.SampleTime = 0;
    +
    +%% Name of the Simulink File
    +mdl = 'sim_nano_station_uniaxial_cedrat_bis';
    +
    +
    + +

    +The inputs and outputs are defined below and corresponds to the name of simulink blocks. +

    +
    +
    %% Input/Output definition
    +io(1)  = linio([mdl, '/Dw'],   1, 'input'); % Ground Motion
    +io(2)  = linio([mdl, '/Fs'],   1, 'input'); % Force applied on the sample
    +io(3)  = linio([mdl, '/Fnl'],  1, 'input'); % Force applied by the NASS
    +io(4)  = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty
    +io(5)  = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz
    +
    +io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    +io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    +io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    +io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    +io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    +
    +
    + +

    +Finally, we use the linearize Matlab function to extract a state space model from the simscape model. +

    +
    +
    %% Run the linearization
    +G = linearize(mdl, io, options);
    +G.InputName  = {'Dw',   ... % Ground Motion [m]
    +                'Fs',   ... % Force Applied on Sample [N]
    +                'Fn',   ... % Force applied by NASS [N]
    +                'Fty',  ... % Parasitic Force Ty [N]
    +                'Frz'};     % Parasitic Force Rz [N]
    +G.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    +                'Fnm',  ... % Force Sensor in NASS [N]
    +                'Dnm',  ... % Displacement Sensor in NASS [m]
    +                'Dgm',  ... % Asbolute displacement of Granite [m]
    +                'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    +
    +
    +
    +
    + +
    +

    6.2 Control Design

    +
    +

    +Let’s look at the transfer function from actuator forces in the nano-hexapod to the force sensor in the nano-hexapod legs for all 6 pairs of actuator/sensor. +

    + + +
    +

    uniaxial_cedrat_plant.png +

    +

    Figure 27: Transfer function from forces applied in the legs to force sensor (png, pdf)

    +
    + +

    +The controller for each pair of actuator/sensor is: +

    +
    +
    K_cedrat = -5000/s;
    +
    +
    + + +
    +

    uniaxial_cedrat_open_loop.png +

    +

    Figure 28: Loop Gain for the Integral Force Feedback (png, pdf)

    +
    +
    +
    + +
    +

    6.3 Identification

    +
    +

    +Let’s initialize the system prior to identification. +

    +
    +
    initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod('actuator', 'piezo');
    +initializeCedratPiezo();
    +initializeSample('mass', 50);
    +
    +
    + +

    +All the controllers are set to 0. +

    +
    +
    K = tf(0);
    +save('./mat/controllers.mat', 'K', '-append');
    +K_iff = -K_cedrat;
    +save('./mat/controllers.mat', 'K_iff', '-append');
    +K_rmc = tf(0);
    +save('./mat/controllers.mat', 'K_rmc', '-append');
    +K_dvf = tf(0);
    +save('./mat/controllers.mat', 'K_dvf', '-append');
    +
    +
    + +
    +
    %% Options for Linearized
    +options = linearizeOptions;
    +options.SampleTime = 0;
    +
    +%% Name of the Simulink File
    +mdl = 'sim_nano_station_uniaxial_cedrat_bis';
    +
    +
    + +
    +
    %% Input/Output definition
    +io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    +io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    +io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    +io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    +io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    +
    +io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    +io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    +io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    +io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    +io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    +
    +
    + +
    +
    %% Run the linearization
    +G_cedrat = linearize(mdl, io, options);
    +G_cedrat.InputName  = {'Dw',   ... % Ground Motion [m]
    +                    'Fs',   ... % Force Applied on Sample [N]
    +                    'Fn',   ... % Force applied by NASS [N]
    +                    'Fty',  ... % Parasitic Force Ty [N]
    +                    'Frz'};     % Parasitic Force Rz [N]
    +G_cedrat.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    +                    'Fnm',  ... % Force Sensor in NASS [N]
    +                    'Dnm',  ... % Displacement Sensor in NASS [m]
    +                    'Dgm',  ... % Asbolute displacement of Granite [m]
    +                    'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    +
    +
    + +
    +
    % save('./uniaxial/mat/plants.mat', 'G_cedrat', '-append');
    +
    +
    +
    +
    + +
    +

    6.4 Sensitivity to Disturbance

    +
    + +
    +

    uniaxial_sensitivity_dist_cedrat.png +

    +

    Figure 29: Sensitivity to disturbance once the CEDRAT controller is applied to the system (png, pdf)

    +
    + + +
    +

    uniaxial_sensitivity_dist_stages_cedrat.png +

    +

    Figure 30: Sensitivity to force disturbances in various stages when CEDRAT is applied (png, pdf)

    +
    +
    +
    + +
    +

    6.5 Damped Plant

    +
    + +
    +

    uniaxial_plant_cedrat_damped.png +

    +

    Figure 31: Damped Plant after CEDRAT is applied (png, pdf)

    +
    +
    +
    + +
    +

    6.6 Conclusion

    +
    +
    +

    +This gives similar results than with a classical force sensor. +

    + +
    +
    +
    +
    + +
    +

    7 Comparison of Active Damping Techniques

    +
    +

    + +

    +
    +
    +

    7.1 Load the plants

    +
    +
    +
    load('./uniaxial/mat/plants.mat', 'G', 'G_iff', 'G_rmc', 'G_dvf');
    +
    +
    +
    +
    + +
    +

    7.2 Sensitivity to Disturbance

    +
    + +
    +

    uniaxial_sensitivity_ground_motion.png +

    +

    Figure 32: Sensitivity to Ground Motion - Comparison (png, pdf)

    +
    + + + +
    +

    uniaxial_sensitivity_direct_force.png +

    +

    Figure 33: Sensitivity to disturbance - Comparison (png, pdf)

    +
    + + +
    +

    uniaxial_sensitivity_fty.png +

    +

    Figure 34: Sensitivity to force disturbances - Comparison (png, pdf)

    +
    + + +
    +

    uniaxial_sensitivity_frz.png +

    +

    Figure 35: Sensitivity to force disturbances - Comparison (png, pdf)

    +
    +
    +
    + +
    +

    7.3 Noise Budget

    +
    +

    +We first load the measured PSD of the disturbance. +

    +
    +
    load('./disturbances/mat/dist_psd.mat', 'dist_f');
    +
    +
    + +

    +The effect of these disturbances on the distance \(D\) is computed for all active damping techniques. +We then compute the Cumulative Amplitude Spectrum (figure 36). +

    + +
    +

    uniaxial-comp-cas-dist.png +

    +

    Figure 36: Comparison of the Cumulative Amplitude Spectrum of \(D\) for different active damping techniques (png, pdf)

    +
    + +

    +The obtained Root Mean Square Value for each active damping technique is shown below. +

    +
    Table 2: Joint primitives for each joint type
    + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1: Obtain Root Mean Square value of \(D\) for each Active Damping Technique applied
     D [m rms]
    OL3.38e-06
    IFF3.40e-06
    RMC3.37e-06
    DVF3.38e-06
    + +

    +It is important to note that the effect of direct forces applied to the sample are not taken into account here. +

    +
    +
    + +
    +

    7.4 Damped Plant

    +
    + +
    +

    uniaxial_plant_damped_comp.png +

    +

    Figure 37: Damped Plant - Comparison (png, pdf)

    +
    +
    +
    + +
    +

    7.5 Conclusion

    +
    + + + +++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 2: Comparison of proposed active damping techniques
     IFFRMCDVF
    Sensor TypeForce sensorRelative MotionInertial
    Guaranteed Stability++-
    Sensitivity (\(D_w\))-+-
    Sensitivity (\(F_s\))- (at low freq)++
    Sensitivity (\(F_{ty,rz}\))+-+
    Overall RMS of \(D\)===
    +
    +
    +
    +
    +

    8 Voice Coil

    +
    +

    + +

    +
    +
    +

    8.1 Init

    +
    +

    +We initialize all the stages with the default parameters. +The nano-hexapod is an hexapod with voice coils and the sample has a mass of 50kg. +

    + +

    +All the controllers are set to 0 (Open Loop). +

    +
    +
    +
    +

    8.2 Identification

    +
    +

    +We identify the dynamics of the system. +

    +
    +
    %% Options for Linearized
    +options = linearizeOptions;
    +options.SampleTime = 0;
    +
    +%% Name of the Simulink File
    +mdl = 'sim_nano_station_uniaxial';
    +
    +
    + +

    +The inputs and outputs are defined below and corresponds to the name of simulink blocks. +

    +
    +
    %% Input/Output definition
    +io(1)  = linio([mdl, '/Dw'],   1, 'input'); % Ground Motion
    +io(2)  = linio([mdl, '/Fs'],   1, 'input'); % Force applied on the sample
    +io(3)  = linio([mdl, '/Fnl'],  1, 'input'); % Force applied by the NASS
    +io(4)  = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty
    +io(5)  = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz
    +
    +io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    +io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    +io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    +io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    +io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    +
    +
    + +

    +Finally, we use the linearize Matlab function to extract a state space model from the simscape model. +

    +
    +
    %% Run the linearization
    +G_vc = linearize(mdl, io, options);
    +G_vc.InputName  = {'Dw',   ... % Ground Motion [m]
    +                   'Fs',   ... % Force Applied on Sample [N]
    +                   'Fn',   ... % Force applied by NASS [N]
    +                   'Fty',  ... % Parasitic Force Ty [N]
    +                   'Frz'};     % Parasitic Force Rz [N]
    +G_vc.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    +                   'Fnm',  ... % Force Sensor in NASS [N]
    +                   'Dnm',  ... % Displacement Sensor in NASS [m]
    +                   'Dgm',  ... % Asbolute displacement of Granite [m]
    +                   'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    +
    +
    + +

    +Finally, we save the identified system dynamics for further analysis. +

    +
    +
    save('./uniaxial/mat/plants.mat', 'G_vc', '-append');
    +
    +
    +
    +
    + +
    +

    8.3 Sensitivity to Disturbances

    +
    +

    +We load the dynamics when using a piezo-electric nano hexapod to compare the results. +

    +
    +
    load('./uniaxial/mat/plants.mat', 'G');
    +
    +
    + +

    +We show several plots representing the sensitivity to disturbances: +

    +
      +
    • in figure 38 the transfer functions from ground motion \(D_w\) to the sample position \(D\) and the transfer function from direct force on the sample \(F_s\) to the sample position \(D\) are shown
    • +
    • in figure 39, it is the effect of parasitic forces of the positioning stages (\(F_{ty}\) and \(F_{rz}\)) on the position \(D\) of the sample that are shown
    • +
    + + +
    +

    uniaxial-sensitivity-vc-disturbances.png +

    +

    Figure 38: Sensitivity to disturbances (png, pdf)

    +
    + + +
    +

    uniaxial-sensitivity-vc-force-dist.png +

    +

    Figure 39: Sensitivity to disturbances (png, pdf)

    +
    +
    +
    + +
    +

    8.4 Noise Budget

    +
    +

    +We first load the measured PSD of the disturbance. +

    +
    +
    load('./disturbances/mat/dist_psd.mat', 'dist_f');
    +
    +
    + +

    +The effect of these disturbances on the distance \(D\) is computed below. +The PSD of the obtain distance \(D\) due to each of the perturbation is shown in figure 40 and the Cumulative Amplitude Spectrum is shown in figure 41. +

    + +

    +The Root Mean Square value of the obtained displacement \(D\) is computed below and can be determined from the figure 41. +

    +
    +4.8793e-06
    +
    + + + +
    +

    uniaxial-vc-psd-dist.png +

    +

    Figure 40: PSD of the displacement \(D\) due to disturbances (png, pdf)

    +
    + + +
    +

    uniaxial-vc-cas-dist.png +

    +

    Figure 41: CAS of the displacement \(D\) due the disturbances (png, pdf)

    +
    + +
    +

    +Even though the RMS value of the displacement \(D\) is lower when using a piezo-electric actuator, the motion is mainly due to high frequency disturbances which are more difficult to control (an higher control bandwidth is required). +

    + +

    +Thus, it may be desirable to use voice coil actuators. +

    + +
    +
    +
    +
    +

    8.5 Integral Force Feedback

    +
    +
    +
    K_iff = -20/s;
    +
    +
    + + +
    +

    uniaxial_iff_vc_open_loop.png +

    +

    Figure 42: Open Loop Transfer Function for IFF control when using a voice coil actuator (png, pdf)

    +
    +
    +
    + +
    +

    8.6 Identification of the Damped Plant

    +
    +

    +Let’s initialize the system prior to identification. +

    +
    +
    initializeGround();
    +initializeGranite();
    +initializeTy();
    +initializeRy();
    +initializeRz();
    +initializeMicroHexapod();
    +initializeAxisc();
    +initializeMirror();
    +initializeNanoHexapod('actuator', 'lorentz');
    +initializeSample('mass', 50);
    +
    +
    + +

    +All the controllers are set to 0. +

    +
    +
    K = tf(0);
    +save('./mat/controllers.mat', 'K', '-append');
    +K_iff = -K_iff;
    +save('./mat/controllers.mat', 'K_iff', '-append');
    +K_rmc = tf(0);
    +save('./mat/controllers.mat', 'K_rmc', '-append');
    +K_dvf = tf(0);
    +save('./mat/controllers.mat', 'K_dvf', '-append');
    +
    +
    + +
    +
    %% Options for Linearized
    +options = linearizeOptions;
    +options.SampleTime = 0;
    +
    +%% Name of the Simulink File
    +mdl = 'sim_nano_station_uniaxial';
    +
    +
    + +
    +
    %% Input/Output definition
    +io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    +io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    +io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    +io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    +io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    +
    +io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    +io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    +io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    +io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    +io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    +
    +
    + +
    +
    %% Run the linearization
    +G_vc_iff = linearize(mdl, io, options);
    +G_vc_iff.InputName  = {'Dw',   ... % Ground Motion [m]
    +                       'Fs',   ... % Force Applied on Sample [N]
    +                       'Fn',   ... % Force applied by NASS [N]
    +                       'Fty',  ... % Parasitic Force Ty [N]
    +                       'Frz'};     % Parasitic Force Rz [N]
    +G_vc_iff.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    +                       'Fnm',  ... % Force Sensor in NASS [N]
    +                       'Dnm',  ... % Displacement Sensor in NASS [m]
    +                       'Dgm',  ... % Asbolute displacement of Granite [m]
    +                       'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    +
    +
    +
    +
    + +
    +

    8.7 Noise Budget

    +
    +

    +We compute the obtain PSD of the displacement \(D\) when using IFF. +

    + +
    +

    uniaxial-cas-iff-vc.png +

    +

    Figure 43: CAS of the displacement \(D\) (png, pdf)

    +
    +
    +
    + +
    +

    8.8 Conclusion

    +
    +
    +

    +The use of voice coil actuators would allow a better disturbance rejection for a fixed bandwidth compared with a piezo-electric hexapod. +

    + +

    +Similarly, it would require much lower bandwidth to attain the same level of disturbance rejection for \(D\). +

    + +
    +
    +
    +
    +
    +
    +

    Author: Dehaeze Thomas

    +

    Created: 2020-02-25 mar. 18:08

    +
    + + diff --git a/experiment_tomography/figs b/experiment_tomography/figs deleted file mode 120000 index 8ea5186..0000000 --- a/experiment_tomography/figs +++ /dev/null @@ -1 +0,0 @@ -../figs \ No newline at end of file diff --git a/experiment_tomography/index.html b/experiment_tomography/index.html deleted file mode 100644 index f406560..0000000 --- a/experiment_tomography/index.html +++ /dev/null @@ -1,807 +0,0 @@ - - - - - - - -Tomography Experiment - - - - - - - - - - - - - -
    - UP - | - HOME -
    -

    Tomography Experiment

    - - -

    -The goal here is to simulate some scientific experiments with the tuned Simscape model when no control is applied to the nano-hexapod. -

    - -

    -This has several goals: -

    -
      -
    • Validate the model
    • -
    • Estimate the expected error motion for the experiments
    • -
    • Estimate the stroke that we may need for the nano-hexapod
    • -
    - -

    -The document in organized as follow: -

    -
      -
    • In section 1 the Simscape model is initialized
    • -
    • In section 2 a tomography experiment is performed where the sample is aligned with the rotation axis. No disturbance is included
    • -
    • In section 3, the same is done but with disturbance included
    • -
    • In section 4 the micro-hexapod translate the sample such that its center of mass is no longer aligned with the rotation axis. No disturbance is included
    • -
    • In section 5, scans with the translation stage are simulated with no perturbation included
    • -
    - -
    -

    1 Simscape Model

    -
    -

    - -

    - -

    -The simulink file to do tomography experiments is sim_nano_station_tomo.slx. -

    -
    -
    open('experiment_tomography/matlab/sim_nano_station_tomo.slx')
    -
    -
    - -

    -We load the shared simulink configuration and we set the StopTime. -

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

    -We first initialize all the stages. -

    -
    -
    initializeGround();
    -initializeGranite();
    -initializeTy();
    -initializeRy();
    -initializeRz();
    -initializeMicroHexapod();
    -initializeAxisc();
    -initializeMirror();
    -initializeNanoHexapod(struct('actuator', 'piezo'));
    -initializeSample(struct('mass', 1));
    -
    -
    - -

    -We initialize the reference path for all the stages. -All stage is set to its zero position except the Spindle which is rotating at 60rpm. -

    -
    -
    initializeReferences(struct('Rz_type', 'rotating', 'Rz_period', 1));
    -
    -
    -
    -
    - -
    -

    2 Tomography Experiment with no disturbances

    -
    -

    - -

    -
    -
    -

    2.1 Simulation Setup

    -
    -

    -And we initialize the disturbances to be equal to zero. -

    -
    -
    opts = struct(...
    -    'Dwx', false, ... % Ground Motion - X direction
    -    'Dwy', false, ... % Ground Motion - Y direction
    -    'Dwz', false, ... % Ground Motion - Z direction
    -    'Fty_x', false, ... % Translation Stage - X direction
    -    'Fty_z', false, ... % Translation Stage - Z direction
    -    'Frz_z', false  ... % Spindle - Z direction
    -);
    -initDisturbances(opts);
    -
    -
    - -

    -We simulate the model. -

    -
    -
    sim('sim_nano_station_tomo');
    -
    -
    - -

    -And we save the obtained data. -

    -
    -
    tomo_align_no_dist = struct('t', t, 'MTr', MTr);
    -save('experiment_tomography/mat/experiment.mat', 'tomo_align_no_dist', '-append');
    -
    -
    -
    -
    - -
    -

    2.2 Analysis

    -
    -
    -
    load('experiment_tomography/mat/experiment.mat', 'tomo_align_no_dist');
    -t = tomo_align_no_dist.t;
    -MTr = tomo_align_no_dist.MTr;
    -
    -
    - -
    -
    Edx = squeeze(MTr(1, 4, :));
    -Edy = squeeze(MTr(2, 4, :));
    -Edz = squeeze(MTr(3, 4, :));
    -% The angles obtained are u-v-w Euler angles (rotations in the moving frame)
    -Ery = atan2( squeeze(MTr(1, 3, :)),           squeeze(sqrt(MTr(1, 1, :).^2 + MTr(1, 2, :).^2)));
    -Erx = atan2(-squeeze(MTr(2, 3, :))./cos(Ery), squeeze(MTr(3, 3, :))./cos(Ery));
    -Erz = atan2(-squeeze(MTr(1, 2, :))./cos(Ery), squeeze(MTr(1, 1, :))./cos(Ery));
    -
    -
    - - -
    -

    exp_tomo_without_dist_trans.png -

    -

    Figure 1: X-Y-Z translation of the sample w.r.t. granite when performing tomography experiment with no disturbances (png, pdf)

    -
    - - -
    -

    exp_tomo_without_dist_rot.png -

    -

    Figure 2: X-Y-Z rotations of the sample w.r.t. granite when performing tomography experiment with no disturbances (png, pdf)

    -
    -
    -
    - -
    -

    2.3 Conclusion

    -
    -
    -

    -When everything is aligned, the resulting error motion is very small (nm range) and is quite negligible with respect to the error when disturbances are included. -This residual error motion probably comes from a small misalignment somewhere. -

    - -
    -
    -
    -
    - -
    -

    3 Tomography Experiment with included perturbations

    -
    -

    - -

    -
    -
    -

    3.1 Simulation Setup

    -
    -

    -We now activate the disturbances. -

    -
    -
    opts = struct(...
    -    'Dwx', true, ... % Ground Motion - X direction
    -    'Dwy', true, ... % Ground Motion - Y direction
    -    'Dwz', true, ... % Ground Motion - Z direction
    -    'Fty_x', true, ... % Translation Stage - X direction
    -    'Fty_z', true, ... % Translation Stage - Z direction
    -    'Frz_z', true  ... % Spindle - Z direction
    -);
    -initDisturbances(opts);
    -
    -
    - -

    -We simulate the model. -

    -
    -
    sim('sim_nano_station_tomo');
    -
    -
    - -

    -And we save the obtained data. -

    -
    -
    tomo_align_dist = struct('t', t, 'MTr', MTr);
    -save('experiment_tomography/mat/experiment.mat', 'tomo_align_dist', '-append');
    -
    -
    -
    -
    - -
    -

    3.2 Analysis

    -
    -
    -
    load('experiment_tomography/mat/experiment.mat', 'tomo_align_dist');
    -t = tomo_align_dist.t;
    -MTr = tomo_align_dist.MTr;
    -
    -
    - -
    -
    Edx = squeeze(MTr(1, 4, :));
    -Edy = squeeze(MTr(2, 4, :));
    -Edz = squeeze(MTr(3, 4, :));
    -% The angles obtained are u-v-w Euler angles (rotations in the moving frame)
    -Ery = atan2( squeeze(MTr(1, 3, :)),           squeeze(sqrt(MTr(1, 1, :).^2 + MTr(1, 2, :).^2)));
    -Erx = atan2(-squeeze(MTr(2, 3, :))./cos(Ery), squeeze(MTr(3, 3, :))./cos(Ery));
    -Erz = atan2(-squeeze(MTr(1, 2, :))./cos(Ery), squeeze(MTr(1, 1, :))./cos(Ery));
    -
    -
    - - -
    -

    exp_tomo_dist_trans.png -

    -

    Figure 3: X-Y-Z translation of the sample w.r.t. the granite when performing tomography experiment with disturbances (png, pdf)

    -
    - - -
    -

    exp_tomo_dist_rot.png -

    -

    Figure 4: X-Y-Z rotations of the sample w.r.t. the granite when performing tomography experiment with disturbances (png, pdf)

    -
    -
    -
    - -
    -

    3.3 Conclusion

    -
    -
    -

    -Error motion is what expected from the disturbance measurements. -

    - -
    -
    -
    -
    - -
    -

    4 Tomography when the micro-hexapod is not centered

    -
    -

    - -

    -
    -
    -

    4.1 Simulation Setup

    -
    -

    -We first set the wanted translation of the Micro Hexapod. -

    -
    -
    P_micro_hexapod = [0.01; 0; 0]; % [m]
    -
    -
    - -

    -We initialize the reference path. -

    -
    -
    initializeReferences(struct('Dh_pos', [P_micro_hexapod; 0; 0; 0], 'Rz_type', 'rotating', 'Rz_period', 1));
    -
    -
    - -

    -We initialize the stages. -

    -
    -
    initializeMicroHexapod(struct('AP', P_micro_hexapod));
    -
    -
    - -

    -And we initialize the disturbances to zero. -

    -
    -
    opts = struct(...
    -    'Dwx', false, ... % Ground Motion - X direction
    -    'Dwy', false, ... % Ground Motion - Y direction
    -    'Dwz', false, ... % Ground Motion - Z direction
    -    'Fty_x', false, ... % Translation Stage - X direction
    -    'Fty_z', false, ... % Translation Stage - Z direction
    -    'Frz_z', false  ... % Spindle - Z direction
    -);
    -initDisturbances(opts);
    -
    -
    - -

    -We simulate the model. -

    -
    -
    sim('sim_nano_station_tomo');
    -
    -
    - -

    -And we save the obtained data. -

    -
    -
    tomo_not_align = struct('t', t, 'MTr', MTr);
    -save('experiment_tomography/mat/experiment.mat', 'tomo_not_align', '-append');
    -
    -
    -
    -
    - -
    -

    4.2 Analysis

    -
    -
    -
    load('experiment_tomography/mat/experiment.mat', 'tomo_not_align');
    -t = tomo_not_align.t;
    -MTr = tomo_not_align.MTr;
    -
    -
    - -
    -
    Edx = squeeze(MTr(1, 4, :));
    -Edy = squeeze(MTr(2, 4, :));
    -Edz = squeeze(MTr(3, 4, :));
    -% The angles obtained are u-v-w Euler angles (rotations in the moving frame)
    -Ery = atan2( squeeze(MTr(1, 3, :)),           squeeze(sqrt(MTr(1, 1, :).^2 + MTr(1, 2, :).^2)));
    -Erx = atan2(-squeeze(MTr(2, 3, :))./cos(Ery), squeeze(MTr(3, 3, :))./cos(Ery));
    -Erz = atan2(-squeeze(MTr(1, 2, :))./cos(Ery), squeeze(MTr(1, 1, :))./cos(Ery));
    -
    -
    - - -
    -

    exp_tomo_offset_trans.png -

    -

    Figure 5: X-Y-Z translation of the sample w.r.t. granite when performing tomography experiment with no disturbances (png, pdf)

    -
    - - -
    -

    exp_tomo_offset_rot.png -

    -

    Figure 6: X-Y-Z rotations of the sample w.r.t. granite when performing tomography experiment with no disturbances (png, pdf)

    -
    -
    -
    - -
    -

    4.3 Conclusion

    -
    -
    -

    -The main motions are translations in the X direction of the mobile platform (corresponds to the eccentricity of the micro-hexapod) and rotations along the rotating Y axis. -

    - -
    -
    -
    -
    - -
    -

    5 Raster Scans with the translation stage

    -
    -

    - -

    -
    -
    -

    5.1 Simulation Setup

    -
    -

    -We set the reference path. -

    -
    -
    initializeReferences(struct('Dy_type', 'triangular', 'Dy_amplitude', 10e-3, 'Dy_period', 1));
    -
    -
    - -

    -We initialize the stages. -

    -
    -
    initializeGround();
    -initializeGranite();
    -initializeTy();
    -initializeRy();
    -initializeRz();
    -initializeMicroHexapod();
    -initializeAxisc();
    -initializeMirror();
    -initializeNanoHexapod(struct('actuator', 'piezo'));
    -initializeSample(struct('mass', 1));
    -
    -
    - -

    -And we initialize the disturbances to zero. -

    -
    -
    opts = struct(...
    -    'Dwx', false, ... % Ground Motion - X direction
    -    'Dwy', false, ... % Ground Motion - Y direction
    -    'Dwz', false, ... % Ground Motion - Z direction
    -    'Fty_x', false, ... % Translation Stage - X direction
    -    'Fty_z', false, ... % Translation Stage - Z direction
    -    'Frz_z', false  ... % Spindle - Z direction
    -);
    -initDisturbances(opts);
    -
    -
    - -

    -We simulate the model. -

    -
    -
    sim('sim_nano_station_tomo');
    -
    -
    - -

    -And we save the obtained data. -

    -
    -
    ty_scan = struct('t', t, 'MTr', MTr);
    -save('experiment_tomography/mat/experiment.mat', 'ty_scan', '-append');
    -
    -
    -
    -
    - -
    -

    5.2 Analysis

    -
    -
    -
    load('experiment_tomography/mat/experiment.mat', 'ty_scan');
    -t = ty_scan.t;
    -MTr = ty_scan.MTr;
    -
    -
    - -
    -
    Edx = squeeze(MTr(1, 4, :));
    -Edy = squeeze(MTr(2, 4, :));
    -Edz = squeeze(MTr(3, 4, :));
    -% The angles obtained are u-v-w Euler angles (rotations in the moving frame)
    -Ery = atan2( squeeze(MTr(1, 3, :)),           squeeze(sqrt(MTr(1, 1, :).^2 + MTr(1, 2, :).^2)));
    -Erx = atan2(-squeeze(MTr(2, 3, :))./cos(Ery), squeeze(MTr(3, 3, :))./cos(Ery));
    -Erz = atan2(-squeeze(MTr(1, 2, :))./cos(Ery), squeeze(MTr(1, 1, :))./cos(Ery));
    -
    -
    - - -
    -

    exp_ty_scan_trans.png -

    -

    Figure 7: X-Y-Z translation of the sample w.r.t. granite when performing tomography experiment with no disturbances (png, pdf)

    -
    - - -
    -

    exp_ty_scan_rot.png -

    -

    Figure 8: X-Y-Z rotations of the sample w.r.t. granite when performing tomography experiment with no disturbances (png, pdf)

    -
    -
    -
    - -
    -

    5.3 Conclusion

    -
    -
    -

    -This is logic that the main error moving is translation along the Y axis and rotation along the X axis. -In order to reduce the errors, we can make a smoother reference path for the translation stage. -

    - -
    -
    -
    -
    -
    -
    -

    Author: Dehaeze Thomas

    -

    Created: 2019-12-19 jeu. 12:47

    -

    Validate

    -
    - - diff --git a/figs b/figs new file mode 120000 index 0000000..4ee4865 --- /dev/null +++ b/figs @@ -0,0 +1 @@ +docs/figs/ \ No newline at end of file diff --git a/hac_lac/figs b/hac_lac/figs deleted file mode 120000 index d440220..0000000 --- a/hac_lac/figs +++ /dev/null @@ -1 +0,0 @@ -../figs/ \ No newline at end of file diff --git a/identification/figs b/identification/figs deleted file mode 120000 index 8ea5186..0000000 --- a/identification/figs +++ /dev/null @@ -1 +0,0 @@ -../figs \ No newline at end of file diff --git a/kinematics/figs b/kinematics/figs deleted file mode 120000 index 8ea5186..0000000 --- a/kinematics/figs +++ /dev/null @@ -1 +0,0 @@ -../figs \ No newline at end of file diff --git a/active_damping/mat/K_dvf.mat b/mat/K_dvf.mat similarity index 100% rename from active_damping/mat/K_dvf.mat rename to mat/K_dvf.mat diff --git a/active_damping/mat/K_iff_hpf.mat b/mat/K_iff_hpf.mat similarity index 100% rename from active_damping/mat/K_iff_hpf.mat rename to mat/K_iff_hpf.mat diff --git a/active_damping/mat/K_ine.mat b/mat/K_ine.mat similarity index 100% rename from active_damping/mat/K_ine.mat rename to mat/K_ine.mat diff --git a/active_damping/mat/K_rmc.mat b/mat/K_rmc.mat similarity index 100% rename from active_damping/mat/K_rmc.mat rename to mat/K_rmc.mat diff --git a/active_damping/mat/cart_plants.mat b/mat/cart_plants.mat similarity index 100% rename from active_damping/mat/cart_plants.mat rename to mat/cart_plants.mat diff --git a/disturbances/mat/dist_psd.mat b/mat/dist_psd.mat similarity index 100% rename from disturbances/mat/dist_psd.mat rename to mat/dist_psd.mat diff --git a/experiment_tomography/mat/experiment.mat b/mat/experiment.mat similarity index 100% rename from experiment_tomography/mat/experiment.mat rename to mat/experiment.mat diff --git a/active_damping/mat/plants.mat b/mat/plants.mat similarity index 100% rename from active_damping/mat/plants.mat rename to mat/plants.mat diff --git a/active_damping/mat/plants_variable.mat b/mat/plants_variable.mat similarity index 100% rename from active_damping/mat/plants_variable.mat rename to mat/plants_variable.mat diff --git a/disturbances/mat/psd_gm.mat b/mat/psd_gm.mat similarity index 100% rename from disturbances/mat/psd_gm.mat rename to mat/psd_gm.mat diff --git a/disturbances/mat/pxe_ty_r.mat b/mat/pxe_ty_r.mat similarity index 100% rename from disturbances/mat/pxe_ty_r.mat rename to mat/pxe_ty_r.mat diff --git a/disturbances/mat/pxsp_r.mat b/mat/pxsp_r.mat similarity index 100% rename from disturbances/mat/pxsp_r.mat rename to mat/pxsp_r.mat diff --git a/disturbances/mat/pxz_ty_r.mat b/mat/pxz_ty_r.mat similarity index 100% rename from disturbances/mat/pxz_ty_r.mat rename to mat/pxz_ty_r.mat diff --git a/disturbances/mat/tf_dist.mat b/mat/tf_dist.mat similarity index 100% rename from disturbances/mat/tf_dist.mat rename to mat/tf_dist.mat diff --git a/active_damping/mat/tomo_exp.mat b/mat/tomo_exp.mat similarity index 100% rename from active_damping/mat/tomo_exp.mat rename to mat/tomo_exp.mat diff --git a/active_damping/mat/undamped_plants.mat b/mat/undamped_plants.mat similarity index 100% rename from active_damping/mat/undamped_plants.mat rename to mat/undamped_plants.mat diff --git a/active_damping/matlab/act_damp_variability_plant.m b/matlab/act_damp_variability_plant.m similarity index 100% rename from active_damping/matlab/act_damp_variability_plant.m rename to matlab/act_damp_variability_plant.m diff --git a/active_damping/matlab/dvf.m b/matlab/dvf.m similarity index 100% rename from active_damping/matlab/dvf.m rename to matlab/dvf.m diff --git a/active_damping/matlab/iff.m b/matlab/iff.m similarity index 100% rename from active_damping/matlab/iff.m rename to matlab/iff.m diff --git a/active_damping/matlab/ine.m b/matlab/ine.m similarity index 100% rename from active_damping/matlab/ine.m rename to matlab/ine.m diff --git a/simscape/nass_model.slx b/matlab/nass_model.slx similarity index 100% rename from simscape/nass_model.slx rename to matlab/nass_model.slx diff --git a/experiment_tomography/matlab/tomo_exp.m b/matlab/tomo_exp.m similarity index 100% rename from experiment_tomography/matlab/tomo_exp.m rename to matlab/tomo_exp.m diff --git a/active_damping/matlab/undamped_system.m b/matlab/undamped_system.m similarity index 100% rename from active_damping/matlab/undamped_system.m rename to matlab/undamped_system.m diff --git a/active_damping/index.org b/org/active_damping.org similarity index 85% rename from active_damping/index.org rename to org/active_damping.org index 101ac95..ad368e2 100644 --- a/active_damping/index.org +++ b/org/active_damping.org @@ -3529,726 +3529,3 @@ We log the signals. initializeLoggingConfiguration('log', 'all'); #+end_src -* TODO Order :noexport: -** Undamped -*** Identification of the transfer function from disturbance to position error -#+begin_src matlab - %% Options for Linearized - options = linearizeOptions; - options.SampleTime = 0; - - %% Name of the Simulink File - mdl = 'nass_model'; - - %% Input/Output definition - clear io; io_i = 1; - io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwx'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwy'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwz'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1; - - %% Run the linearization - G = linearize(mdl, io, options); - G.InputName = {'Dwx', 'Dwy', 'Dwz'}; - G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; -#+end_src - -*** Identification of the plant -#+begin_src matlab - %% Options for Linearized - options = linearizeOptions; - options.SampleTime = 0; - - %% Name of the Simulink File - mdl = 'nass_model'; - - %% Input/Output definition - clear io; io_i = 1; - io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs - io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1; - - %% Run the linearization - G = linearize(mdl, io, options); - G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}; - G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; -#+end_src - -#+begin_src matlab - load('mat/stages.mat', 'nano_hexapod'); - G_cart = G*inv(nano_hexapod.J'); - G_cart.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'}; -#+end_src - -#+begin_src matlab :exports none - freqs = logspace(0, 3, 1000); - - figure; - - ax1 = subplot(2, 1, 1); - hold on; - plot(freqs, abs(squeeze(freqresp(G_cart('Edx', 'Fnx'), freqs, 'Hz'))), 'DisplayName', '$T_{x}$'); - plot(freqs, abs(squeeze(freqresp(G_cart('Edy', 'Fny'), freqs, 'Hz'))), 'DisplayName', '$T_{y}$'); - plot(freqs, abs(squeeze(freqresp(G_cart('Edz', 'Fnz'), freqs, 'Hz'))), 'DisplayName', '$T_{z}$'); - hold off; - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); - legend('location', 'southwest') - - ax2 = subplot(2, 1, 2); - hold on; - plot(freqs, 180/pi*angle(squeeze(freqresp(G_cart('Edx', 'Fnx'), freqs, 'Hz')))); - plot(freqs, 180/pi*angle(squeeze(freqresp(G_cart('Edy', 'Fny'), freqs, 'Hz')))); - plot(freqs, 180/pi*angle(squeeze(freqresp(G_cart('Edz', 'Fnz'), freqs, 'Hz')))); - hold off; - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); - ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); - ylim([-180, 180]); - yticks([-180, -90, 0, 90, 180]); - - linkaxes([ax1,ax2],'x'); -#+end_src - -#+begin_src matlab :exports none - freqs = logspace(0, 3, 1000); - - figure; - - ax1 = subplot(2, 1, 1); - hold on; - plot(freqs, abs(squeeze(freqresp(G_cart('Erx', 'Mnx'), freqs, 'Hz'))), 'DisplayName', '$R_{x}$'); - plot(freqs, abs(squeeze(freqresp(G_cart('Ery', 'Mny'), freqs, 'Hz'))), 'DisplayName', '$R_{y}$'); - plot(freqs, abs(squeeze(freqresp(G_cart('Erz', 'Mnz'), freqs, 'Hz'))), 'DisplayName', '$R_{z}$'); - hold off; - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); - legend('location', 'southwest') - - ax2 = subplot(2, 1, 2); - hold on; - plot(freqs, 180/pi*angle(squeeze(freqresp(G_cart('Erx', 'Mnx'), freqs, 'Hz')))); - plot(freqs, 180/pi*angle(squeeze(freqresp(G_cart('Ery', 'Mny'), freqs, 'Hz')))); - plot(freqs, 180/pi*angle(squeeze(freqresp(G_cart('Erz', 'Mnz'), freqs, 'Hz')))); - hold off; - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); - ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); - ylim([-180, 180]); - yticks([-180, -90, 0, 90, 180]); - - linkaxes([ax1,ax2],'x'); -#+end_src - -*** Sensitivity to disturbances -The sensitivity to disturbances are shown on figure [[fig:sensitivity_dist_undamped]]. - -#+begin_src matlab :exports none - freqs = logspace(0, 3, 1000); - - figure; - - subplot(2, 1, 1); - title('$D_g$ to $D$'); - hold on; - plot(freqs, abs(squeeze(freqresp(G.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / D_{g,x}\right|$'); - plot(freqs, abs(squeeze(freqresp(G.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / D_{g,y}\right|$'); - plot(freqs, abs(squeeze(freqresp(G.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / D_{g,z}\right|$'); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]'); - legend('location', 'southeast'); - - subplot(2, 1, 2); - title('$F_s$ to $D$'); - hold on; - plot(freqs, abs(squeeze(freqresp(G.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{s,x}\right|$'); - plot(freqs, abs(squeeze(freqresp(G.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / F_{s,y}\right|$'); - plot(freqs, abs(squeeze(freqresp(G.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{s,z}\right|$'); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); - legend('location', 'northeast'); -#+end_src - -#+HEADER: :tangle no :exports results :results none :noweb yes -#+begin_src matlab :var filepath="figs/sensitivity_dist_undamped.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") - <> -#+end_src - -#+name: fig:sensitivity_dist_undamped -#+caption: Undamped sensitivity to disturbances ([[./figs/sensitivity_dist_undamped.png][png]], [[./figs/sensitivity_dist_undamped.pdf][pdf]]) -[[file:figs/sensitivity_dist_undamped.png]] - -#+begin_src matlab :exports none - freqs = logspace(0, 3, 1000); - - figure; - hold on; - plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Frzz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{rz, z}\right|$'); - plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Ftyz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{ty, z}\right|$'); - plot(freqs, abs(squeeze(freqresp(G.G_dist('Dx', 'Ftyx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{ty, x}\right|$'); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); - legend('location', 'northeast'); -#+end_src - -#+HEADER: :tangle no :exports results :results none :noweb yes -#+begin_src matlab :var filepath="figs/sensitivity_dist_stages.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") - <> -#+end_src - -#+name: fig:sensitivity_dist_stages -#+caption: Sensitivity to force disturbances in various stages ([[./figs/sensitivity_dist_stages.png][png]], [[./figs/sensitivity_dist_stages.pdf][pdf]]) -[[file:figs/sensitivity_dist_stages.png]] -*** Undamped Plant -The "plant" (transfer function from forces applied by the nano-hexapod to the measured displacement of the sample with respect to the granite) bode plot is shown on figure [[fig:sensitivity_dist_undamped]]. - -#+begin_src matlab :exports none - freqs = logspace(0, 3, 1000); - - figure; - - ax1 = subplot(2, 1, 1); - hold on; - plot(freqs, abs(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz')))); - hold off; - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); - - ax2 = subplot(2, 1, 2); - hold on; - plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), 'DisplayName', '$D_x / F_x$'); - plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz'))), 'DisplayName', '$D_y / F_y$'); - plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), 'DisplayName', '$D_z / F_z$'); - hold off; - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); - ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); - ylim([-180, 180]); - yticks([-180, -90, 0, 90, 180]); - legend('location', 'southwest'); - - linkaxes([ax1,ax2],'x'); -#+end_src - -#+HEADER: :tangle no :exports results :results none :noweb yes -#+begin_src matlab :var filepath="figs/plant_undamped.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") - <> -#+end_src - -#+name: fig:plant_undamped -#+caption: Transfer Function from cartesian forces to displacement for the undamped plant ([[./figs/plant_undamped.png][png]], [[./figs/plant_undamped.pdf][pdf]]) -[[file:figs/plant_undamped.png]] - - -** Direct Velocity Feedback -*** One degree-of-freedom example -:PROPERTIES: -:header-args:matlab+: :tangle no -:END: -<> -**** Equations -#+begin_src latex :file rmc_1dof.pdf :post pdf2svg(file=*this*, ext="png") :exports results - \begin{tikzpicture} - % Ground - \draw (-1, 0) -- (1, 0); - - % Ground Displacement - \draw[dashed] (-1, 0) -- ++(-0.5, 0) coordinate(w); - \draw[->] (w) -- ++(0, 0.5) node[left]{$w$}; - - % Mass - \draw[fill=white] (-1, 1) rectangle ++(2, 0.8) node[pos=0.5]{$m$}; - - % Displacement of the mass - \draw[dashed] (-1, 1.8) -- ++(-0.5, 0) coordinate(x); - \draw[->] (x) -- ++(0, 0.5) node[left]{$x$}; - - % Spring, Damper, and Actuator - \draw[spring] (-0.8, 0) -- (-0.8, 1) node[midway, left=0.1]{$k$}; - \draw[damper] (0, 0) -- (0, 1) node[midway, left=0.2]{$c$}; - \draw[actuator={0.4}{0.2}] (0.8, 0) -- (0.8, 1) coordinate[midway, right=0.1](F); - - % Measured deformation - \draw[dashed] (1, 0) -- ++(2, 0) coordinate(d_bot); - \draw[dashed] (1, 1) -- ++(2, 0) coordinate(d_top); - \draw[<->] (d_bot) --coordinate[midway](d) (d_top); - - % Displacements - \node[block={0.8cm}{0.6cm}, right=0.6 of F] (Krmc) {$K$}; - \draw[->] (Krmc.west) -- (F) node[above right]{$F$}; - \draw[->] (d)node[above left]{$d$} -- (Krmc.east); - \end{tikzpicture} -#+end_src - -#+name: fig:rmc_1dof -#+caption: Relative Motion Control applied to a 1dof system -#+RESULTS: -[[file:figs/rmc_1dof.png]] - -The dynamic of the system is: -\begin{equation} - ms^2x = F_d - kx - csx + kw + csw + F -\end{equation} -In terms of the stage deformation $d = x - w$: -\begin{equation} - (ms^2 + cs + k) d = -ms^2 w + F_d + F -\end{equation} -The relative motion control law is: -\begin{equation} - K = -g s -\end{equation} -Thus, the applied force is: -\begin{equation} - F = -g s d -\end{equation} -And the new dynamics will be: -\begin{equation} - d = w \frac{-ms^2}{ms^2 + (c + g)s + k} + F_d \frac{1}{ms^2 + (c + g)s + k} + F \frac{1}{ms^2 + (c + g)s + k} -\end{equation} - -And thus damping is added. - -If critical damping is wanted: -\begin{equation} - \xi = \frac{1}{2}\frac{c + g}{\sqrt{km}} = \frac{1}{2} -\end{equation} -This corresponds to a gain: -\begin{equation} - g = \sqrt{km} - c -\end{equation} - -**** 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 - -**** Matlab Example -Let define the system parameters. -#+begin_src matlab - m = 50; % [kg] - k = 1e6; % [N/m] - c = 1e3; % [N/(m/s)] -#+end_src - -The state space model of the system is defined below. -#+begin_src matlab - A = [-c/m -k/m; - 1 0]; - - B = [1/m 1/m -1; - 0 0 0]; - - C = [ 0 1; - -c -k]; - - D = [0 0 0; - 1 0 0]; - - sys = ss(A, B, C, D); - sys.InputName = {'F', 'Fd', 'wddot'}; - sys.OutputName = {'d', 'Fm'}; - sys.StateName = {'ddot', 'd'}; -#+end_src - -The controller $K_\text{RMC}$ is: -#+begin_src matlab - Krmc = -(sqrt(k*m)-c)*s; - Krmc.InputName = {'d'}; - Krmc.OutputName = {'F'}; -#+end_src - -And the closed loop system is computed below. -#+begin_src matlab - sys_rmc = feedback(sys, Krmc, 'name', +1); -#+end_src - -#+begin_src matlab :exports none - freqs = logspace(-1, 3, 1000); - - figure; - - subplot(2, 2, 1); - title('Fd to d') - hold on; - plot(freqs, abs(squeeze(freqresp(sys('d', 'Fd'), freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(sys_rmc('d', 'Fd'), freqs, 'Hz')))); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); - xlim([freqs(1), freqs(end)]); - - subplot(2, 2, 3); - title('Fd to x') - hold on; - plot(freqs, abs(squeeze(freqresp(sys('d', 'Fd'), freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(sys_rmc('d', 'Fd'), freqs, 'Hz')))); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); - xlim([freqs(1), freqs(end)]); - - subplot(2, 2, 2); - title('w to d') - hold on; - plot(freqs, abs(squeeze(freqresp(sys('d', 'wddot')*s^2, freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(sys_rmc('d', 'wddot')*s^2, freqs, 'Hz')))); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]'); - xlim([freqs(1), freqs(end)]); - - subplot(2, 2, 4); - title('w to x') - hold on; - plot(freqs, abs(squeeze(freqresp(1+sys('d', 'wddot')*s^2, freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(1+sys_rmc('d', 'wddot')*s^2, freqs, 'Hz')))); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]'); - xlim([freqs(1), freqs(end)]); -#+end_src - -#+HEADER: :tangle no :exports results :results none :noweb yes -#+begin_src matlab :var filepath="figs/rmc_1dof_sensitivitiy.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") - <> -#+end_src - -#+name: fig:rmc_1dof_sensitivitiy -#+caption: Sensitivity to disturbance when RMC is applied on the 1dof system ([[./figs/rmc_1dof_sensitivitiy.png][png]], [[./figs/rmc_1dof_sensitivitiy.pdf][pdf]]) -[[file:figs/rmc_1dof_sensitivitiy.png]] -** Inertial Control -*** One degree-of-freedom example -:PROPERTIES: -:header-args:matlab+: :tangle no -:END: -<> -**** Equations -#+begin_src latex :file ine_1dof.pdf :post pdf2svg(file=*this*, ext="png") :exports results - \begin{tikzpicture} - % Ground - \draw (-1, 0) -- (1, 0); - - % Ground Displacement - \draw[dashed] (-1, 0) -- ++(-0.5, 0) coordinate(w); - \draw[->] (w) -- ++(0, 0.5) node[left]{$w$}; - - % Mass - \draw[fill=white] (-1, 1) rectangle ++(2, 0.8) node[pos=0.5]{$m$}; - - % Velocity Sensor - \node[inertialsensor={0.3}] (velg) at (1, 1.8){}; - \node[above] at (velg.north) {$\dot{x}$}; - - % Displacement of the mass - \draw[dashed] (-1, 1.8) -- ++(-0.5, 0) coordinate(x); - \draw[->] (x) -- ++(0, 0.5) node[left]{$x$}; - - % Spring, Damper, and Actuator - \draw[spring] (-0.8, 0) -- (-0.8, 1) node[midway, left=0.1]{$k$}; - \draw[damper] (0, 0) -- (0, 1) node[midway, left=0.2]{$c$}; - \draw[actuator={0.4}{0.2}] (0.8, 0) -- (0.8, 1) coordinate[midway, right=0.1](F); - - % Control - \node[block={0.8cm}{0.6cm}, right=0.6 of F] (Kine) {$K$}; - \draw[->] (Kine.west) -- (F) node[above right]{$F$}; - \draw[<-] (Kine.east) -- ++(0.5, 0) |- (velg.east); - \end{tikzpicture} -#+end_src - -#+name: fig:ine_1dof -#+caption: Direct Velocity Feedback applied to a 1dof system -#+RESULTS: -[[file:figs/ine_1dof.png]] - -The dynamic of the system is: -\begin{equation} - ms^2x = F_d - kx - csx + kw + csw + F -\end{equation} -In terms of the stage deformation $d = x - w$: -\begin{equation} - (ms^2 + cs + k) d = -ms^2 w + F_d + F -\end{equation} -The direct velocity feedback law shown in figure [[fig:ine_1dof]] is: -\begin{equation} - K = -g -\end{equation} -Thus, the applied force is: -\begin{equation} - F = -g \dot{x} -\end{equation} -And the new dynamics will be: -\begin{equation} - d = w \frac{-ms^2 - gs}{ms^2 + (c + g)s + k} + F_d \frac{1}{ms^2 + (c + g)s + k} + F \frac{1}{ms^2 + (c + g)s + k} -\end{equation} - -And thus damping is added. - -If critical damping is wanted: -\begin{equation} - \xi = \frac{1}{2}\frac{c + g}{\sqrt{km}} = \frac{1}{2} -\end{equation} -This corresponds to a gain: -\begin{equation} - g = \sqrt{km} - c -\end{equation} - -**** 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 - -**** Matlab Example -Let define the system parameters. -#+begin_src matlab - m = 50; % [kg] - k = 1e6; % [N/m] - c = 1e3; % [N/(m/s)] -#+end_src - -The state space model of the system is defined below. -#+begin_src matlab - A = [-c/m -k/m; - 1 0]; - - B = [1/m 1/m -1; - 0 0 0]; - - C = [1 0; - 0 1; - 0 0]; - - D = [0 0 0; - 0 0 0; - 0 0 1]; - - sys = ss(A, B, C, D); - sys.InputName = {'F', 'Fd', 'wddot'}; - sys.OutputName = {'ddot', 'd', 'wddot'}; - sys.StateName = {'ddot', 'd'}; -#+end_src - -Because we need $\dot{x}$ for feedback, we compute it from the outputs -#+begin_src matlab - G_xdot = [1, 0, 1/s; - 0, 1, 0]; - G_xdot.InputName = {'ddot', 'd', 'wddot'}; - G_xdot.OutputName = {'xdot', 'd'}; -#+end_src - -Finally, the system is described by =sys= as defined below. -#+begin_src matlab - sys = series(sys, G_xdot, [1 2 3], [1 2 3]); -#+end_src - -The controller $K_\text{INE}$ is: -#+begin_src matlab - Kine = tf(-(sqrt(k*m)-c)); - Kine.InputName = {'xdot'}; - Kine.OutputName = {'F'}; -#+end_src - -And the closed loop system is computed below. -#+begin_src matlab - sys_ine = feedback(sys, Kine, 'name', +1); -#+end_src - -The obtained sensitivity to disturbances is shown in figure [[fig:ine_1dof_sensitivitiy]]. -#+begin_src matlab :exports none - freqs = logspace(-1, 3, 1000); - - figure; - - subplot(2, 2, 1); - title('Fd to d') - hold on; - plot(freqs, abs(squeeze(freqresp(sys('d', 'Fd'), freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(sys_ine('d', 'Fd'), freqs, 'Hz')))); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); - xlim([freqs(1), freqs(end)]); - - subplot(2, 2, 3); - title('Fd to x') - hold on; - plot(freqs, abs(squeeze(freqresp(sys('xdot', 'Fd')/s, freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(sys_ine('xdot', 'Fd')/s, freqs, 'Hz')))); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); - xlim([freqs(1), freqs(end)]); - - subplot(2, 2, 2); - title('w to d') - hold on; - plot(freqs, abs(squeeze(freqresp(sys('d', 'wddot')*s^2, freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(sys_ine('d', 'wddot')*s^2, freqs, 'Hz')))); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]'); - xlim([freqs(1), freqs(end)]); - - subplot(2, 2, 4); - title('w to x') - hold on; - plot(freqs, abs(squeeze(freqresp(1+sys('d', 'wddot')*s^2, freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(1+sys_ine('d', 'wddot')*s^2, freqs, 'Hz')))); - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]'); - xlim([freqs(1), freqs(end)]); -#+end_src - -#+HEADER: :tangle no :exports results :results none :noweb yes -#+begin_src matlab :var filepath="figs/ine_1dof_sensitivitiy.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") - <> -#+end_src - -#+name: fig:ine_1dof_sensitivitiy -#+caption: Sensitivity to disturbance when INE is applied on the 1dof system ([[./figs/ine_1dof_sensitivitiy.png][png]], [[./figs/ine_1dof_sensitivitiy.pdf][pdf]]) -[[file:figs/ine_1dof_sensitivitiy.png]] -* Test :noexport: -#+begin_src matlab - AP = [0; 0; 0]; -#+end_src - -#+begin_src matlab - load('mat/conf_simulink.mat'); - set_param(conf_simulink, 'StopTime', '0.5'); - - initializeSimscapeConfiguration('gravity', true); - - initializeLoggingConfiguration('log', 'forces'); - - initializeGround('type', 'none'); - initializeGranite('type', 'none'); - initializeTy('type', 'rigid'); - initializeRy('type', 'init'); - initializeRz('type', 'none'); - initializeMicroHexapod('type', 'rigid', 'AP', AP, 'Foffset', false); - initializeAxisc('type', 'none'); - initializeMirror('type', 'none'); - initializeNanoHexapod('type', 'none'); - initializeSample('type', 'init', 'Foffset', false); - - sim('nass_model'); -#+end_src - -#+begin_src matlab - save('./mat/Foffset.mat', 'Foffset'); -#+end_src - -#+begin_src matlab - initializeRz('type', 'flexible'); - initializeMicroHexapod('type', 'flexible', 'AP', AP); - initializeSample('type', 'flexible'); - - sim('nass_model'); -#+end_src -* Test bis :noexport: -#+begin_src matlab - AP = [0; 0; 0]; -#+end_src - -#+begin_src matlab - load('mat/conf_simulink.mat'); - set_param(conf_simulink, 'StopTime', '0.5'); - - initializeSimscapeConfiguration('gravity', true); - - initializeLoggingConfiguration('log', 'forces'); - - initializeGround('type', 'none'); - initializeGranite('type', 'none'); - initializeTy('type', 'rigid'); - initializeRy('type', 'flexible'); - initializeRz('type', 'none'); - initializeMicroHexapod('type', 'none'); - initializeAxisc('type', 'none'); - initializeMirror('type', 'none'); - initializeNanoHexapod('type', 'none'); - initializeSample('type', 'none'); - - sim('nass_model'); -#+end_src - -#+begin_src matlab - save('./mat/Foffset.mat', 'Foffset'); -#+end_src - -#+begin_src matlab - initializeRz('type', 'flexible'); - initializeMicroHexapod('type', 'flexible', 'AP', AP); - initializeSample('type', 'flexible'); - - sim('nass_model'); -#+end_src -* Use only one joint for the tilt stage -#+begin_src matlab - K = [2.8e4; 2.8e4; 2.8e4]; - %K = [1e8; 1e8; 1e8]; - - ty = 7*(2*pi)/180; - Ry = [ cos(ty) 0 sin(ty); - 0 1 0; - -sin(ty) 0 cos(ty)]; - - K11 = abs(Ry*K); - K12 = abs(Ry*K); - - ty = -7*(2*pi)/180; - Ry = [ cos(ty) 0 sin(ty); - 0 1 0; - -sin(ty) 0 cos(ty)]; - - K21 = abs(Ry*K); - K22 = abs(Ry*K); - - Ktot = zeros(6,1); - - Ktot(1) = K11(1) + K12(1) + K21(1) + K22(1); - Ktot(2) = K11(2) + K12(2) + K21(2) + K22(2); - Ktot(3) = K11(3) + K12(3) + K21(3) + K22(3); - - %% Stiffness in rotation - - % Position of the joint from the next wanted joint position (in the rotated frame) - P11 = [0; 0.334; 0]; - P12 = [0; 0.334; 0]; - P21 = [0; 0.334; 0]; - P22 = [0; 0.334; 0]; - - Ktot(4:6) = abs(cross(P11, K11)) + abs(cross(P12, K12)) + abs(cross(P21, K21)) + abs(cross(P22, K22)) -#+end_src - -#+begin_src matlab - Ry_init = 0; -#+end_src - -#+begin_src matlab - initializeSimscapeConfiguration('gravity', true); - initializeLoggingConfiguration('log', 'none'); - - initializeGround('type', 'none'); - initializeGranite('type', 'none'); - initializeTy('type', 'none'); - initializeRy('type', 'init', 'Ry_init', Ry_init); - initializeRz('type', 'init'); - initializeMicroHexapod('type', 'init'); - initializeAxisc('type', 'none'); - initializeMirror('type', 'none'); - initializeNanoHexapod('type', 'none'); - initializeSample('type', 'init'); - - sim('nass_model'); -#+end_src - -#+begin_src matlab - save('./mat/Foffset.mat', 'Fym'); -#+end_src - -#+begin_src matlab - initializeReferences('Ry_amplitude', 3*(2*pi)/180) - - initializeRy('type', 'flexible', 'Ry_init', 3*(2*pi)/180); - - sim('nass_model'); -#+end_src diff --git a/active_damping_uniaxial/index.org b/org/active_damping_uniaxial.org similarity index 100% rename from active_damping_uniaxial/index.org rename to org/active_damping_uniaxial.org diff --git a/control/index.org b/org/control.org similarity index 100% rename from control/index.org rename to org/control.org diff --git a/disturbances/index.org b/org/disturbances.org similarity index 100% rename from disturbances/index.org rename to org/disturbances.org diff --git a/experiment_tomography/index.org b/org/experiments.org similarity index 100% rename from experiment_tomography/index.org rename to org/experiments.org diff --git a/org/figs b/org/figs new file mode 120000 index 0000000..966bcbf --- /dev/null +++ b/org/figs @@ -0,0 +1 @@ +../docs/figs/ \ No newline at end of file diff --git a/functions/index.org b/org/functions.org similarity index 100% rename from functions/index.org rename to org/functions.org diff --git a/hac_lac/index.org b/org/hac_lac.org similarity index 100% rename from hac_lac/index.org rename to org/hac_lac.org diff --git a/identification/index.org b/org/identification.org similarity index 100% rename from identification/index.org rename to org/identification.org diff --git a/index.org b/org/index.org similarity index 69% rename from index.org rename to org/index.org index f11fde7..aab799e 100644 --- a/index.org +++ b/org/index.org @@ -43,58 +43,55 @@ Here are links to the documents related to the Simscape model of the Nano-Active-Stabilization-System. -* Simulink Project ([[./simulink_project/index.org][link]]) +* Simulink Project ([[./org/simulink_project.org][link]]) The project is managed with a Simulink Project. -Such project is briefly presented [[./simulink_project/index.org][here]]. +Such project is briefly presented [[./org/simulink_project.org][here]]. -* Simscape Model ([[./simscape/index.org][link]]) +* Simscape Model ([[./org/simscape.org][link]]) The model of the NASS is based on Simulink and Simscape Multi-Body. -Such toolbox is presented [[./simscape/index.org][here]]. +Such toolbox is presented [[./org/simscape.org][here]]. -* Simscape Subsystems ([[./simscape_subsystems/index.org][link]]) +* Simscape Subsystems ([[./org/simscape_subsystems.org][link]]) The model is decomposed of multiple subsystems. Subsystems can represent physical elements such as complete stages or basic simulink blocs. These subsystems are shared among multiple files. -All these subsystems are described [[./simscape_subsystems/index.org][here]]. +All these subsystems are described [[./org/simscape_subsystems.org][here]]. -* Kinematics of the Station ([[./kinematics/index.org][link]]) +* Kinematics of the Station ([[./org/kinematics.org][link]]) First, we consider perfectly rigid elements and joints and we just study the kinematic of the station. This permits to test if each stage is moving correctly. -This is detailed [[./kinematics/index.org][here]]. +This is detailed [[./org/kinematics.org][here]]. -* Metrology ([[./metrology/index.org][link]]) -In this document (accessible [[./metrology/index.org][here]]), we discuss the measurement of the sample with respect to the granite. - -* Computation of the positioning error of the Sample ([[./positioning_error/index.org][link]]) +* Computation of the positioning error of the Sample ([[./org/positioning_error.org][link]]) From the measurement of the position of the sample with respect to the granite and from the wanted position of each stage, we can compute the positioning error of the sample with respect to the nano-hexapod. -This is done [[./positioning_error/index.org][here]]. +This is done [[./org/positioning_error.org][here]]. -* Tuning of the Dynamics of the Simscape model ([[./identification/index.org][link]]) +* Tuning of the Dynamics of the Simscape model ([[./org/identification.org][link]]) From dynamical measurements perform on the real positioning station, we tune the parameters of the simscape model to have similar dynamics. -This is explained [[./identification/index.org][here]]. +This is explained [[./org/identification.org][here]]. -* Disturbances ([[./disturbances/index.org][link]]) +* Disturbances ([[./org/disturbances.org][link]]) The effect of disturbances on the position of the micro-station have been measured. These are now converted to force disturbances using the Simscape model. -This is discussed [[./disturbances/index.org][here]]. +This is discussed [[./org/disturbances.org][here]]. We also discuss how the disturbances are implemented in the model. -* Tomography Experiment ([[./experiment_tomography/index.org][link]]) +* Tomography Experiment ([[./org/experiments.org][link]]) Now that the dynamics of the Model have been tuned and the Disturbances have included, we can simulate experiments. -Tomography experiments are simulated and the results are presented [[./experiment_tomography/index.org][here]]. +Tomography experiments are simulated and the results are presented [[./org/experiments.org][here]]. -* Active Damping Techniques on the Uni-axial Model ([[./active_damping_uniaxial/index.org][link]]) +* Active Damping Techniques on the Uni-axial Model ([[./org/active_damping_uniaxial.org][link]]) Active damping techniques are applied to the Uniaxial Simscape model. -* Active Damping Techniques on the full Simscape Model ([[./active_damping/index.org][link]]) +* Active Damping Techniques on the full Simscape Model ([[./org/active_damping.org][link]]) Active damping techniques are applied to the full Simscape model. -* Useful Matlab Functions ([[./functions/index.org][link]]) +* Useful Matlab Functions ([[./org/functions.org][link]]) Many matlab functions are shared among all the files of the projects. -These functions are all defined [[./functions/index.org][here]]. +These functions are all defined [[./org/functions.org][here]]. diff --git a/kinematics/index.org b/org/kinematics.org similarity index 100% rename from kinematics/index.org rename to org/kinematics.org diff --git a/positioning_error/index.org b/org/positioning_error.org similarity index 100% rename from positioning_error/index.org rename to org/positioning_error.org diff --git a/simscape/index.org b/org/simscape.org similarity index 100% rename from simscape/index.org rename to org/simscape.org diff --git a/simscape_subsystems/index.org b/org/simscape_subsystems.org similarity index 100% rename from simscape_subsystems/index.org rename to org/simscape_subsystems.org diff --git a/simulink_project/index.org b/org/simulink_project.org similarity index 100% rename from simulink_project/index.org rename to org/simulink_project.org diff --git a/stewart_platform/index.org b/org/stewart_platform.org similarity index 100% rename from stewart_platform/index.org rename to org/stewart_platform.org diff --git a/uniaxial/index.org b/org/uniaxial.org similarity index 100% rename from uniaxial/index.org rename to org/uniaxial.org diff --git a/positioning_error/figs b/positioning_error/figs deleted file mode 120000 index 8ea5186..0000000 --- a/positioning_error/figs +++ /dev/null @@ -1 +0,0 @@ -../figs \ No newline at end of file diff --git a/readme.org b/readme.org new file mode 100644 index 0000000..cbb5521 --- /dev/null +++ b/readme.org @@ -0,0 +1,27 @@ +#+TITLE: Nano-Active-Stabilization-System - Matlab/Simscape Study +#+AUTHOR: Dehaeze Thomas +#+EMAIL: dehaeze.thomas@gmail.com +#+OPTIONS: num:nil toc:nil todo:nil +#+EXPORT_EXCLUDE_TAGS: exclude noexport + +The goal of this project is to study the Nano-Active-Stabilization-System concept using Matlab/Simscape. + +* Org Publish Configuration :noexport: +#+begin_src emacs-lisp :results none + (setq org-publish-project-alist + '(("nass-simscape" + :base-directory "~/Cloud/thesis/matlab/nass-simscape/org/" + :base-extension "org" + :publishing-directory "~/Cloud/thesis/matlab/nass-simscape/docs/" + :author "Dehaeze Thomas" + :email "dehaeze.thomas@gmail.com/" + :recursive nil + :publishing-function org-html-publish-to-html + :auto-preamble t + :auto-sitemap nil + :html-link-up "index.html" + :html-link-home "index.html" + :with-todo-keywords nil + :html-wrap-src-lines nil + :table-of-contents nil))) +#+end_src diff --git a/simscape_subsystems/figs b/simscape_subsystems/figs deleted file mode 120000 index 8ea5186..0000000 --- a/simscape_subsystems/figs +++ /dev/null @@ -1 +0,0 @@ -../figs \ No newline at end of file diff --git a/active_damping/src/prepareLinearizeIdentification.m b/src/prepareLinearizeIdentification.m similarity index 100% rename from active_damping/src/prepareLinearizeIdentification.m rename to src/prepareLinearizeIdentification.m diff --git a/active_damping/src/prepareTomographyExperiment.m b/src/prepareTomographyExperiment.m similarity index 100% rename from active_damping/src/prepareTomographyExperiment.m rename to src/prepareTomographyExperiment.m diff --git a/active_damping_uniaxial/matlab/dvf.m b/to-order/active_damping_uniaxial/matlab/dvf.m similarity index 100% rename from active_damping_uniaxial/matlab/dvf.m rename to to-order/active_damping_uniaxial/matlab/dvf.m diff --git a/active_damping_uniaxial/matlab/iff.m b/to-order/active_damping_uniaxial/matlab/iff.m similarity index 100% rename from active_damping_uniaxial/matlab/iff.m rename to to-order/active_damping_uniaxial/matlab/iff.m diff --git a/active_damping_uniaxial/matlab/rmc.m b/to-order/active_damping_uniaxial/matlab/rmc.m similarity index 100% rename from active_damping_uniaxial/matlab/rmc.m rename to to-order/active_damping_uniaxial/matlab/rmc.m diff --git a/active_damping_uniaxial/matlab/sim_nano_station_id.slx b/to-order/active_damping_uniaxial/matlab/sim_nano_station_id.slx similarity index 100% rename from active_damping_uniaxial/matlab/sim_nano_station_id.slx rename to to-order/active_damping_uniaxial/matlab/sim_nano_station_id.slx diff --git a/identification/matlab/sim_micro_station_com.slx b/to-order/identification/matlab/sim_micro_station_com.slx similarity index 100% rename from identification/matlab/sim_micro_station_com.slx rename to to-order/identification/matlab/sim_micro_station_com.slx diff --git a/identification/matlab/sim_micro_station_com_estimation.slx b/to-order/identification/matlab/sim_micro_station_com_estimation.slx similarity index 100% rename from identification/matlab/sim_micro_station_com_estimation.slx rename to to-order/identification/matlab/sim_micro_station_com_estimation.slx diff --git a/identification/matlab/sim_micro_station_id.slx b/to-order/identification/matlab/sim_micro_station_id.slx similarity index 100% rename from identification/matlab/sim_micro_station_id.slx rename to to-order/identification/matlab/sim_micro_station_id.slx diff --git a/identification/matlab/sim_micro_station_modal_analysis.slx b/to-order/identification/matlab/sim_micro_station_modal_analysis.slx similarity index 100% rename from identification/matlab/sim_micro_station_modal_analysis.slx rename to to-order/identification/matlab/sim_micro_station_modal_analysis.slx diff --git a/identification/matlab/sim_micro_station_modal_analysis_com.slx b/to-order/identification/matlab/sim_micro_station_modal_analysis_com.slx similarity index 100% rename from identification/matlab/sim_micro_station_modal_analysis_com.slx rename to to-order/identification/matlab/sim_micro_station_modal_analysis_com.slx diff --git a/simscape_subsystems/accelerometer_z_axis.slx b/to-order/simscape_subsystems/accelerometer_z_axis.slx similarity index 100% rename from simscape_subsystems/accelerometer_z_axis.slx rename to to-order/simscape_subsystems/accelerometer_z_axis.slx diff --git a/simscape_subsystems/hexapod_leg.slx b/to-order/simscape_subsystems/hexapod_leg.slx similarity index 100% rename from simscape_subsystems/hexapod_leg.slx rename to to-order/simscape_subsystems/hexapod_leg.slx diff --git a/simscape_subsystems/hexapod_leg_rigid.slx b/to-order/simscape_subsystems/hexapod_leg_rigid.slx similarity index 100% rename from simscape_subsystems/hexapod_leg_rigid.slx rename to to-order/simscape_subsystems/hexapod_leg_rigid.slx diff --git a/simscape_subsystems/metrology_6dof.slx b/to-order/simscape_subsystems/metrology_6dof.slx similarity index 100% rename from simscape_subsystems/metrology_6dof.slx rename to to-order/simscape_subsystems/metrology_6dof.slx diff --git a/simscape_subsystems/micro_hexapod_leg.slx b/to-order/simscape_subsystems/micro_hexapod_leg.slx similarity index 100% rename from simscape_subsystems/micro_hexapod_leg.slx rename to to-order/simscape_subsystems/micro_hexapod_leg.slx diff --git a/simscape_subsystems/micro_hexapod_leg_rigid.slx b/to-order/simscape_subsystems/micro_hexapod_leg_rigid.slx similarity index 100% rename from simscape_subsystems/micro_hexapod_leg_rigid.slx rename to to-order/simscape_subsystems/micro_hexapod_leg_rigid.slx diff --git a/simscape_subsystems/micro_hexapod_new.slx b/to-order/simscape_subsystems/micro_hexapod_new.slx similarity index 100% rename from simscape_subsystems/micro_hexapod_new.slx rename to to-order/simscape_subsystems/micro_hexapod_new.slx diff --git a/simscape_subsystems/nano_hexapod_F.slx b/to-order/simscape_subsystems/nano_hexapod_F.slx similarity index 100% rename from simscape_subsystems/nano_hexapod_F.slx rename to to-order/simscape_subsystems/nano_hexapod_F.slx diff --git a/simscape_subsystems/nano_hexapod_fixed_base.slx b/to-order/simscape_subsystems/nano_hexapod_fixed_base.slx similarity index 100% rename from simscape_subsystems/nano_hexapod_fixed_base.slx rename to to-order/simscape_subsystems/nano_hexapod_fixed_base.slx diff --git a/simscape_subsystems/nano_hexapod_leg.slx b/to-order/simscape_subsystems/nano_hexapod_leg.slx similarity index 100% rename from simscape_subsystems/nano_hexapod_leg.slx rename to to-order/simscape_subsystems/nano_hexapod_leg.slx diff --git a/simscape_subsystems/nano_hexapod_leg_rigid.slx b/to-order/simscape_subsystems/nano_hexapod_leg_rigid.slx similarity index 100% rename from simscape_subsystems/nano_hexapod_leg_rigid.slx rename to to-order/simscape_subsystems/nano_hexapod_leg_rigid.slx diff --git a/simscape_subsystems/nano_hexapod_mobile_platform.slx b/to-order/simscape_subsystems/nano_hexapod_mobile_platform.slx similarity index 100% rename from simscape_subsystems/nano_hexapod_mobile_platform.slx rename to to-order/simscape_subsystems/nano_hexapod_mobile_platform.slx diff --git a/simscape_subsystems/nass_disturbances.slx b/to-order/simscape_subsystems/nass_disturbances.slx similarity index 100% rename from simscape_subsystems/nass_disturbances.slx rename to to-order/simscape_subsystems/nass_disturbances.slx diff --git a/simscape_subsystems/nass_references.slx b/to-order/simscape_subsystems/nass_references.slx similarity index 100% rename from simscape_subsystems/nass_references.slx rename to to-order/simscape_subsystems/nass_references.slx diff --git a/simscape_subsystems/old/axisc.slx b/to-order/simscape_subsystems/old/axisc.slx similarity index 100% rename from simscape_subsystems/old/axisc.slx rename to to-order/simscape_subsystems/old/axisc.slx diff --git a/simscape_subsystems/old/axisc_weld.slx b/to-order/simscape_subsystems/old/axisc_weld.slx similarity index 100% rename from simscape_subsystems/old/axisc_weld.slx rename to to-order/simscape_subsystems/old/axisc_weld.slx diff --git a/simscape_subsystems/old/granite.slx b/to-order/simscape_subsystems/old/granite.slx similarity index 100% rename from simscape_subsystems/old/granite.slx rename to to-order/simscape_subsystems/old/granite.slx diff --git a/simscape_subsystems/old/granite_3dof.slx b/to-order/simscape_subsystems/old/granite_3dof.slx similarity index 100% rename from simscape_subsystems/old/granite_3dof.slx rename to to-order/simscape_subsystems/old/granite_3dof.slx diff --git a/simscape_subsystems/old/granite_rigid.slx b/to-order/simscape_subsystems/old/granite_rigid.slx similarity index 100% rename from simscape_subsystems/old/granite_rigid.slx rename to to-order/simscape_subsystems/old/granite_rigid.slx diff --git a/simscape_subsystems/old/ground.slx b/to-order/simscape_subsystems/old/ground.slx similarity index 100% rename from simscape_subsystems/old/ground.slx rename to to-order/simscape_subsystems/old/ground.slx diff --git a/simscape_subsystems/old/micro_hexapod_F.slx b/to-order/simscape_subsystems/old/micro_hexapod_F.slx similarity index 100% rename from simscape_subsystems/old/micro_hexapod_F.slx rename to to-order/simscape_subsystems/old/micro_hexapod_F.slx diff --git a/simscape_subsystems/old/micro_hexapod_rigid.slx b/to-order/simscape_subsystems/old/micro_hexapod_rigid.slx similarity index 100% rename from simscape_subsystems/old/micro_hexapod_rigid.slx rename to to-order/simscape_subsystems/old/micro_hexapod_rigid.slx diff --git a/simscape_subsystems/old/micro_hexapod_rigid_legs.slx b/to-order/simscape_subsystems/old/micro_hexapod_rigid_legs.slx similarity index 100% rename from simscape_subsystems/old/micro_hexapod_rigid_legs.slx rename to to-order/simscape_subsystems/old/micro_hexapod_rigid_legs.slx diff --git a/simscape_subsystems/old/micro_hexapod_rigid_simple.slx b/to-order/simscape_subsystems/old/micro_hexapod_rigid_simple.slx similarity index 100% rename from simscape_subsystems/old/micro_hexapod_rigid_simple.slx rename to to-order/simscape_subsystems/old/micro_hexapod_rigid_simple.slx diff --git a/simscape_subsystems/old/reference_mirror.slx b/to-order/simscape_subsystems/old/reference_mirror.slx similarity index 100% rename from simscape_subsystems/old/reference_mirror.slx rename to to-order/simscape_subsystems/old/reference_mirror.slx diff --git a/simscape_subsystems/old/sample_environment.slx b/to-order/simscape_subsystems/old/sample_environment.slx similarity index 100% rename from simscape_subsystems/old/sample_environment.slx rename to to-order/simscape_subsystems/old/sample_environment.slx diff --git a/simscape_subsystems/old/sample_environment_rigid.slx b/to-order/simscape_subsystems/old/sample_environment_rigid.slx similarity index 100% rename from simscape_subsystems/old/sample_environment_rigid.slx rename to to-order/simscape_subsystems/old/sample_environment_rigid.slx diff --git a/simscape_subsystems/old/spindle_D.slx b/to-order/simscape_subsystems/old/spindle_D.slx similarity index 100% rename from simscape_subsystems/old/spindle_D.slx rename to to-order/simscape_subsystems/old/spindle_D.slx diff --git a/simscape_subsystems/old/spindle_rigid.slx b/to-order/simscape_subsystems/old/spindle_rigid.slx similarity index 100% rename from simscape_subsystems/old/spindle_rigid.slx rename to to-order/simscape_subsystems/old/spindle_rigid.slx diff --git a/simscape_subsystems/old/test_force_sensor.slx b/to-order/simscape_subsystems/old/test_force_sensor.slx similarity index 100% rename from simscape_subsystems/old/test_force_sensor.slx rename to to-order/simscape_subsystems/old/test_force_sensor.slx diff --git a/simscape_subsystems/old/test_impose_motion.slx b/to-order/simscape_subsystems/old/test_impose_motion.slx similarity index 100% rename from simscape_subsystems/old/test_impose_motion.slx rename to to-order/simscape_subsystems/old/test_impose_motion.slx diff --git a/simscape_subsystems/old/test_nano_hexapod.slx b/to-order/simscape_subsystems/old/test_nano_hexapod.slx similarity index 100% rename from simscape_subsystems/old/test_nano_hexapod.slx rename to to-order/simscape_subsystems/old/test_nano_hexapod.slx diff --git a/simscape_subsystems/old/tilt_stage_D.slx b/to-order/simscape_subsystems/old/tilt_stage_D.slx similarity index 100% rename from simscape_subsystems/old/tilt_stage_D.slx rename to to-order/simscape_subsystems/old/tilt_stage_D.slx diff --git a/simscape_subsystems/old/tilt_stage_rigid.slx b/to-order/simscape_subsystems/old/tilt_stage_rigid.slx similarity index 100% rename from simscape_subsystems/old/tilt_stage_rigid.slx rename to to-order/simscape_subsystems/old/tilt_stage_rigid.slx diff --git a/simscape_subsystems/old/translation_stage_D.slx b/to-order/simscape_subsystems/old/translation_stage_D.slx similarity index 100% rename from simscape_subsystems/old/translation_stage_D.slx rename to to-order/simscape_subsystems/old/translation_stage_D.slx diff --git a/simscape_subsystems/old/translation_stage_F.slx b/to-order/simscape_subsystems/old/translation_stage_F.slx similarity index 100% rename from simscape_subsystems/old/translation_stage_F.slx rename to to-order/simscape_subsystems/old/translation_stage_F.slx diff --git a/simscape_subsystems/old/translation_stage_rigid.slx b/to-order/simscape_subsystems/old/translation_stage_rigid.slx similarity index 100% rename from simscape_subsystems/old/translation_stage_rigid.slx rename to to-order/simscape_subsystems/old/translation_stage_rigid.slx diff --git a/simscape_subsystems/to-order/geophone_z_axis.slx b/to-order/simscape_subsystems/to-order/geophone_z_axis.slx similarity index 100% rename from simscape_subsystems/to-order/geophone_z_axis.slx rename to to-order/simscape_subsystems/to-order/geophone_z_axis.slx diff --git a/simscape_subsystems/to-order/metrology_6dof_homog_transform.slx b/to-order/simscape_subsystems/to-order/metrology_6dof_homog_transform.slx similarity index 100% rename from simscape_subsystems/to-order/metrology_6dof_homog_transform.slx rename to to-order/simscape_subsystems/to-order/metrology_6dof_homog_transform.slx diff --git a/simscape_subsystems/to-order/metrology_6dof_rotation_matrix.slx b/to-order/simscape_subsystems/to-order/metrology_6dof_rotation_matrix.slx similarity index 100% rename from simscape_subsystems/to-order/metrology_6dof_rotation_matrix.slx rename to to-order/simscape_subsystems/to-order/metrology_6dof_rotation_matrix.slx diff --git a/simscape_subsystems/to-order/nano_hexapod_D.slx b/to-order/simscape_subsystems/to-order/nano_hexapod_D.slx similarity index 100% rename from simscape_subsystems/to-order/nano_hexapod_D.slx rename to to-order/simscape_subsystems/to-order/nano_hexapod_D.slx diff --git a/simscape_subsystems/to-order/nano_hexapod_cedrat_1dof.slx b/to-order/simscape_subsystems/to-order/nano_hexapod_cedrat_1dof.slx similarity index 100% rename from simscape_subsystems/to-order/nano_hexapod_cedrat_1dof.slx rename to to-order/simscape_subsystems/to-order/nano_hexapod_cedrat_1dof.slx diff --git a/simscape_subsystems/to-order/nano_hexapod_leg_rigid.slx b/to-order/simscape_subsystems/to-order/nano_hexapod_leg_rigid.slx similarity index 100% rename from simscape_subsystems/to-order/nano_hexapod_leg_rigid.slx rename to to-order/simscape_subsystems/to-order/nano_hexapod_leg_rigid.slx diff --git a/simscape_subsystems/to-order/nano_hexapod_rigid.slx b/to-order/simscape_subsystems/to-order/nano_hexapod_rigid.slx similarity index 100% rename from simscape_subsystems/to-order/nano_hexapod_rigid.slx rename to to-order/simscape_subsystems/to-order/nano_hexapod_rigid.slx diff --git a/simscape_subsystems/to-order/nano_hexapod_rigid_simple.slx b/to-order/simscape_subsystems/to-order/nano_hexapod_rigid_simple.slx similarity index 100% rename from simscape_subsystems/to-order/nano_hexapod_rigid_simple.slx rename to to-order/simscape_subsystems/to-order/nano_hexapod_rigid_simple.slx diff --git a/simscape_subsystems/to-order/piezo_actuator_cedrat.slx b/to-order/simscape_subsystems/to-order/piezo_actuator_cedrat.slx similarity index 100% rename from simscape_subsystems/to-order/piezo_actuator_cedrat.slx rename to to-order/simscape_subsystems/to-order/piezo_actuator_cedrat.slx diff --git a/simscape_subsystems/to-order/piezo_actuator_cedrat_simple.slx b/to-order/simscape_subsystems/to-order/piezo_actuator_cedrat_simple.slx similarity index 100% rename from simscape_subsystems/to-order/piezo_actuator_cedrat_simple.slx rename to to-order/simscape_subsystems/to-order/piezo_actuator_cedrat_simple.slx diff --git a/simscape_subsystems/to-order/translation_stage_modal_analysis.slx b/to-order/simscape_subsystems/to-order/translation_stage_modal_analysis.slx similarity index 100% rename from simscape_subsystems/to-order/translation_stage_modal_analysis.slx rename to to-order/simscape_subsystems/to-order/translation_stage_modal_analysis.slx diff --git a/simscape_subsystems_uniaxial/granite_1dof.slx b/to-order/simscape_subsystems_uniaxial/granite_1dof.slx similarity index 100% rename from simscape_subsystems_uniaxial/granite_1dof.slx rename to to-order/simscape_subsystems_uniaxial/granite_1dof.slx diff --git a/simscape_subsystems_uniaxial/ground_1dof.slx b/to-order/simscape_subsystems_uniaxial/ground_1dof.slx similarity index 100% rename from simscape_subsystems_uniaxial/ground_1dof.slx rename to to-order/simscape_subsystems_uniaxial/ground_1dof.slx diff --git a/simscape_subsystems_uniaxial/micro_hexapod_1dof.slx b/to-order/simscape_subsystems_uniaxial/micro_hexapod_1dof.slx similarity index 100% rename from simscape_subsystems_uniaxial/micro_hexapod_1dof.slx rename to to-order/simscape_subsystems_uniaxial/micro_hexapod_1dof.slx diff --git a/simscape_subsystems_uniaxial/nano_hexapod_1dof.slx b/to-order/simscape_subsystems_uniaxial/nano_hexapod_1dof.slx similarity index 100% rename from simscape_subsystems_uniaxial/nano_hexapod_1dof.slx rename to to-order/simscape_subsystems_uniaxial/nano_hexapod_1dof.slx diff --git a/simscape_subsystems_uniaxial/sample_environment_1dof.slx b/to-order/simscape_subsystems_uniaxial/sample_environment_1dof.slx similarity index 100% rename from simscape_subsystems_uniaxial/sample_environment_1dof.slx rename to to-order/simscape_subsystems_uniaxial/sample_environment_1dof.slx diff --git a/simscape_subsystems_uniaxial/sample_environment_1dof_rigid.slx b/to-order/simscape_subsystems_uniaxial/sample_environment_1dof_rigid.slx similarity index 100% rename from simscape_subsystems_uniaxial/sample_environment_1dof_rigid.slx rename to to-order/simscape_subsystems_uniaxial/sample_environment_1dof_rigid.slx diff --git a/simscape_subsystems_uniaxial/spindle_1dof.slx b/to-order/simscape_subsystems_uniaxial/spindle_1dof.slx similarity index 100% rename from simscape_subsystems_uniaxial/spindle_1dof.slx rename to to-order/simscape_subsystems_uniaxial/spindle_1dof.slx diff --git a/simscape_subsystems_uniaxial/tilt_stage_1dof.slx b/to-order/simscape_subsystems_uniaxial/tilt_stage_1dof.slx similarity index 100% rename from simscape_subsystems_uniaxial/tilt_stage_1dof.slx rename to to-order/simscape_subsystems_uniaxial/tilt_stage_1dof.slx diff --git a/simscape_subsystems_uniaxial/translation_stage_1dof.slx b/to-order/simscape_subsystems_uniaxial/translation_stage_1dof.slx similarity index 100% rename from simscape_subsystems_uniaxial/translation_stage_1dof.slx rename to to-order/simscape_subsystems_uniaxial/translation_stage_1dof.slx diff --git a/uniaxial/mat/plants.mat b/to-order/uniaxial/mat/plants.mat similarity index 100% rename from uniaxial/mat/plants.mat rename to to-order/uniaxial/mat/plants.mat diff --git a/uniaxial/matlab/sim_nano_station_uniaxial.slx b/to-order/uniaxial/matlab/sim_nano_station_uniaxial.slx similarity index 100% rename from uniaxial/matlab/sim_nano_station_uniaxial.slx rename to to-order/uniaxial/matlab/sim_nano_station_uniaxial.slx diff --git a/uniaxial/matlab/sim_nano_station_uniaxial_cedrat.slx b/to-order/uniaxial/matlab/sim_nano_station_uniaxial_cedrat.slx similarity index 100% rename from uniaxial/matlab/sim_nano_station_uniaxial_cedrat.slx rename to to-order/uniaxial/matlab/sim_nano_station_uniaxial_cedrat.slx diff --git a/uniaxial/matlab/sim_nano_station_uniaxial_cedrat_bis.slx b/to-order/uniaxial/matlab/sim_nano_station_uniaxial_cedrat_bis.slx similarity index 100% rename from uniaxial/matlab/sim_nano_station_uniaxial_cedrat_bis.slx rename to to-order/uniaxial/matlab/sim_nano_station_uniaxial_cedrat_bis.slx diff --git a/uniaxial/figs b/uniaxial/figs deleted file mode 120000 index d440220..0000000 --- a/uniaxial/figs +++ /dev/null @@ -1 +0,0 @@ -../figs/ \ No newline at end of file diff --git a/uniaxial/index.html b/uniaxial/index.html deleted file mode 100644 index 1af0916..0000000 --- a/uniaxial/index.html +++ /dev/null @@ -1,1914 +0,0 @@ - - - - - - - -Simscape Uniaxial Model - - - - - - - - - - - - - - - -
    - UP - | - HOME -
    -

    Simscape Uniaxial Model

    - - -

    -The idea is to use the same model as the full Simscape Model but to restrict the motion only in the vertical direction. -

    - -

    -This is done in order to more easily study the system and evaluate control techniques. -

    - -
    -

    1 Simscape Model

    -
    -

    - -

    - -

    -A schematic of the uniaxial model used for simulations is represented in figure 1. -

    - -

    -The perturbations \(w\) are: -

    -
      -
    • \(F_s\): direct forces applied to the sample such as inertia forces and cable forces
    • -
    • \(F_{rz}\): parasitic forces due to the rotation of the spindle
    • -
    • \(F_{ty}\): parasitic forces due to scans with the translation stage
    • -
    • \(D_w\): ground motion
    • -
    - -

    -The quantity to \(z\) to control is: -

    -
      -
    • \(D\): the position of the sample with respect to the granite
    • -
    - -

    -The measured quantities \(v\) are: -

    -
      -
    • \(D\): the position of the sample with respect to the granite
    • -
    - -

    -We study the use of an additional sensor: -

    -
      -
    • \(F_n\): a force sensor located in the nano-hexapod
    • -
    • \(v_n\): an absolute velocity sensor located on the top platform of the nano-hexapod
    • -
    • \(d_r\): a relative motion sensor located in the nano-hexapod
    • -
    - -

    -The control signal \(u\) is: -

    -
      -
    • \(F\) the force applied by the nano-hexapod actuator
    • -
    - - -
    -

    uniaxial-model-nass-flexible.png -

    -

    Figure 1: Schematic of the uniaxial model used

    -
    - - -

    -Few active damping techniques will be compared in order to decide which sensor is to be included in the system. -Schematics of the active damping techniques are displayed in figure 2. -

    - - -
    -

    uniaxial-model-nass-flexible-active-damping.png -

    -

    Figure 2: Comparison of used active damping techniques

    -
    -
    -
    - -
    -

    2 Undamped System

    -
    -

    - -

    -

    -Let's start by study the undamped system. -

    -
    -
    -

    2.1 Init

    -
    -

    -We initialize all the stages with the default parameters. -The nano-hexapod is a piezoelectric hexapod and the sample has a mass of 50kg. -

    - -

    -All the controllers are set to 0 (Open Loop). -

    -
    -
    -
    -

    2.2 Identification

    -
    -

    -We identify the dynamics of the system. -

    -
    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'sim_nano_station_uniaxial';
    -
    -
    - -

    -The inputs and outputs are defined below and corresponds to the name of simulink blocks. -

    -
    -
    %% Input/Output definition
    -io(1)  = linio([mdl, '/Dw'],   1, 'input'); % Ground Motion
    -io(2)  = linio([mdl, '/Fs'],   1, 'input'); % Force applied on the sample
    -io(3)  = linio([mdl, '/Fnl'],  1, 'input'); % Force applied by the NASS
    -io(4)  = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty
    -io(5)  = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz
    -
    -io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    -io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    -io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    -io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    -io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    -
    -
    - -

    -Finally, we use the linearize Matlab function to extract a state space model from the simscape model. -

    -
    -
    %% Run the linearization
    -G = linearize(mdl, io, options);
    -G.InputName  = {'Dw',   ... % Ground Motion [m]
    -                'Fs',   ... % Force Applied on Sample [N]
    -                'Fn',   ... % Force applied by NASS [N]
    -                'Fty',  ... % Parasitic Force Ty [N]
    -                'Frz'};     % Parasitic Force Rz [N]
    -G.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    -                'Fnm',  ... % Force Sensor in NASS [N]
    -                'Dnm',  ... % Displacement Sensor in NASS [m]
    -                'Dgm',  ... % Asbolute displacement of Granite [m]
    -                'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    -
    -
    - -

    -Finally, we save the identified system dynamics for further analysis. -

    -
    -
    save('./uniaxial/mat/plants.mat', 'G');
    -
    -
    -
    -
    - -
    -

    2.3 Sensitivity to Disturbances

    -
    -

    -We show several plots representing the sensitivity to disturbances: -

    -
      -
    • in figure 3 the transfer functions from ground motion \(D_w\) to the sample position \(D\) and the transfer function from direct force on the sample \(F_s\) to the sample position \(D\) are shown
    • -
    • in figure 4, it is the effect of parasitic forces of the positioning stages (\(F_{ty}\) and \(F_{rz}\)) on the position \(D\) of the sample that are shown
    • -
    - - -
    -

    uniaxial-sensitivity-disturbances.png -

    -

    Figure 3: Sensitivity to disturbances (png, pdf)

    -
    - - - -
    -

    uniaxial-sensitivity-force-dist.png -

    -

    Figure 4: Sensitivity to disturbances (png, pdf)

    -
    -
    -
    - -
    -

    2.4 Noise Budget

    -
    -

    -We first load the measured PSD of the disturbance. -

    -
    -
    load('./disturbances/mat/dist_psd.mat', 'dist_f');
    -
    -
    - -

    -The effect of these disturbances on the distance \(D\) is computed below. -The PSD of the obtain distance \(D\) due to each of the perturbation is shown in figure 5 and the Cumulative Amplitude Spectrum is shown in figure 6. -

    - - -

    -The Root Mean Square value of the obtained displacement \(D\) is computed below and can be determined from the figure 6. -

    -
    -3.3793e-06
    -
    - - - -
    -

    uniaxial-psd-dist.png -

    -

    Figure 5: PSD of the effect of disturbances on \(D\) (png, pdf)

    -
    - - - -
    -

    uniaxial-cas-dist.png -

    -

    Figure 6: CAS of the effect of disturbances on \(D\) (png, pdf)

    -
    -
    -
    - -
    -

    2.5 Plant

    -
    -

    -The transfer function from the force \(F\) applied by the nano-hexapod to the position of the sample \(D\) is shown in figure 7. -It corresponds to the plant to control. -

    - - -
    -

    uniaxial-plant.png -

    -

    Figure 7: Bode plot of the Plant (png, pdf)

    -
    -
    -
    -
    - -
    -

    3 Integral Force Feedback

    -
    -

    - -

    - -
    -

    uniaxial-model-nass-flexible-iff.png -

    -

    Figure 8: Uniaxial IFF Control Schematic

    -
    -
    -
    -

    3.1 Control Design

    -
    -
    -
    load('./uniaxial/mat/plants.mat', 'G');
    -
    -
    - -

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

    - - -
    -

    uniaxial_iff_plant.png -

    -

    Figure 9: Transfer function from forces applied in the legs to force sensor (png, pdf)

    -
    - -

    -The controller for each pair of actuator/sensor is: -

    -
    -
    K_iff = -1000/s;
    -
    -
    - - -
    -

    uniaxial_iff_open_loop.png -

    -

    Figure 10: Loop Gain for the Integral Force Feedback (png, pdf)

    -
    -
    -
    - -
    -

    3.2 Identification

    -
    -

    -Let's initialize the system prior to identification. -

    -
    -
    initializeGround();
    -initializeGranite();
    -initializeTy();
    -initializeRy();
    -initializeRz();
    -initializeMicroHexapod();
    -initializeAxisc();
    -initializeMirror();
    -initializeNanoHexapod(struct('actuator', 'piezo'));
    -initializeSample(struct('mass', 50));
    -
    -
    - -

    -All the controllers are set to 0. -

    -
    -
    K = tf(0);
    -save('./mat/controllers.mat', 'K', '-append');
    -K_iff = -K_iff;
    -save('./mat/controllers.mat', 'K_iff', '-append');
    -K_rmc = tf(0);
    -save('./mat/controllers.mat', 'K_rmc', '-append');
    -K_dvf = tf(0);
    -save('./mat/controllers.mat', 'K_dvf', '-append');
    -
    -
    - -
    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'sim_nano_station_uniaxial';
    -
    -
    - -
    -
    %% Input/Output definition
    -io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    -io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    -io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    -io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    -io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    -
    -io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    -io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    -io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    -io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    -io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    -
    -
    - -
    -
    %% Run the linearization
    -G_iff = linearize(mdl, io, options);
    -G_iff.InputName  = {'Dw',   ... % Ground Motion [m]
    -                    'Fs',   ... % Force Applied on Sample [N]
    -                    'Fn',   ... % Force applied by NASS [N]
    -                    'Fty',  ... % Parasitic Force Ty [N]
    -                    'Frz'};     % Parasitic Force Rz [N]
    -G_iff.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    -                    'Fnm',  ... % Force Sensor in NASS [N]
    -                    'Dnm',  ... % Displacement Sensor in NASS [m]
    -                    'Dgm',  ... % Asbolute displacement of Granite [m]
    -                    'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    -
    -
    - -
    -
    save('./uniaxial/mat/plants.mat', 'G_iff', '-append');
    -
    -
    -
    -
    - -
    -

    3.3 Sensitivity to Disturbance

    -
    - -
    -

    uniaxial_sensitivity_dist_iff.png -

    -

    Figure 11: Sensitivity to disturbance once the IFF controller is applied to the system (png, pdf)

    -
    - - -
    -

    uniaxial_sensitivity_dist_stages_iff.png -

    -

    Figure 12: Sensitivity to force disturbances in various stages when IFF is applied (png, pdf)

    -
    -
    -
    - -
    -

    3.4 Damped Plant

    -
    - -
    -

    uniaxial_plant_iff_damped.png -

    -

    Figure 13: Damped Plant after IFF is applied (png, pdf)

    -
    -
    -
    - -
    -

    3.5 Conclusion

    -
    -
    -

    -Integral Force Feedback: -

    - -
    -
    -
    -
    - -
    -

    4 Relative Motion Control

    -
    -

    - -

    -

    -In the Relative Motion Control (RMC), a derivative feedback is applied between the measured actuator displacement to the actuator force input. -

    - - -
    -

    uniaxial-model-nass-flexible-rmc.png -

    -

    Figure 14: Uniaxial RMC Control Schematic

    -
    -
    -
    -

    4.1 Control Design

    -
    -
    -
    load('./uniaxial/mat/plants.mat', 'G');
    -
    -
    - -

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

    - - -
    -

    uniaxial_rmc_plant.png -

    -

    Figure 15: Transfer function from forces applied in the legs to leg displacement sensor (png, pdf)

    -
    - -

    -The Relative Motion Controller is defined below. -A Low pass Filter is added to make the controller transfer function proper. -

    -
    -
    K_rmc = s*50000/(1 + s/2/pi/10000);
    -
    -
    - - -
    -

    uniaxial_rmc_open_loop.png -

    -

    Figure 16: Loop Gain for the Integral Force Feedback (png, pdf)

    -
    -
    -
    - -
    -

    4.2 Identification

    -
    -

    -Let's initialize the system prior to identification. -

    -
    -
    initializeGround();
    -initializeGranite();
    -initializeTy();
    -initializeRy();
    -initializeRz();
    -initializeMicroHexapod();
    -initializeAxisc();
    -initializeMirror();
    -initializeNanoHexapod(struct('actuator', 'piezo'));
    -initializeSample(struct('mass', 50));
    -
    -
    - -

    -And initialize the controllers. -

    -
    -
    K = tf(0);
    -save('./mat/controllers.mat', 'K', '-append');
    -K_iff = tf(0);
    -save('./mat/controllers.mat', 'K_iff', '-append');
    -K_rmc = -K_rmc;
    -save('./mat/controllers.mat', 'K_rmc', '-append');
    -K_dvf = tf(0);
    -save('./mat/controllers.mat', 'K_dvf', '-append');
    -
    -
    - -
    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'sim_nano_station_uniaxial';
    -
    -
    - -
    -
    %% Input/Output definition
    -io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    -io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    -io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    -io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    -io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    -
    -io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    -io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    -io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    -io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    -io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    -
    -
    - -
    -
    %% Run the linearization
    -G_rmc = linearize(mdl, io, options);
    -G_rmc.InputName  = {'Dw',   ... % Ground Motion [m]
    -                    'Fs',   ... % Force Applied on Sample [N]
    -                    'Fn',   ... % Force applied by NASS [N]
    -                    'Fty',  ... % Parasitic Force Ty [N]
    -                    'Frz'};     % Parasitic Force Rz [N]
    -G_rmc.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    -                    'Fnm',  ... % Force Sensor in NASS [N]
    -                    'Dnm',  ... % Displacement Sensor in NASS [m]
    -                    'Dgm',  ... % Asbolute displacement of Granite [m]
    -                    'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    -
    -
    - -
    -
    save('./uniaxial/mat/plants.mat', 'G_rmc', '-append');
    -
    -
    -
    -
    - - -
    -

    4.3 Sensitivity to Disturbance

    -
    - -
    -

    uniaxial_sensitivity_dist_rmc.png -

    -

    Figure 17: Sensitivity to disturbance once the RMC controller is applied to the system (png, pdf)

    -
    - - -
    -

    uniaxial_sensitivity_dist_stages_rmc.png -

    -

    Figure 18: Sensitivity to force disturbances in various stages when RMC is applied (png, pdf)

    -
    -
    -
    - -
    -

    4.4 Damped Plant

    -
    - -
    -

    uniaxial_plant_rmc_damped.png -

    -

    Figure 19: Damped Plant after RMC is applied (png, pdf)

    -
    -
    -
    - -
    -

    4.5 Conclusion

    -
    -
    -

    -Relative Motion Control: -

    - -
    -
    -
    -
    - -
    -

    5 Direct Velocity Feedback

    -
    -

    - -

    -

    -In the Relative Motion Control (RMC), a feedback is applied between the measured velocity of the platform to the actuator force input. -

    - - -
    -

    uniaxial-model-nass-flexible-dvf.png -

    -

    Figure 20: Uniaxial DVF Control Schematic

    -
    -
    -
    -

    5.1 Control Design

    -
    -
    -
    load('./uniaxial/mat/plants.mat', 'G');
    -
    -
    - - -
    -

    uniaxial_dvf_plant.png -

    -

    Figure 21: Transfer function from forces applied in the legs to leg velocity sensor (png, pdf)

    -
    - -
    -
    K_dvf = tf(5e4);
    -
    -
    - - -
    -

    uniaxial_dvf_loop_gain.png -

    -

    Figure 22: Transfer function from forces applied in the legs to leg velocity sensor (png, pdf)

    -
    -
    -
    - -
    -

    5.2 Identification

    -
    -

    -Let's initialize the system prior to identification. -

    -
    -
    initializeGround();
    -initializeGranite();
    -initializeTy();
    -initializeRy();
    -initializeRz();
    -initializeMicroHexapod();
    -initializeAxisc();
    -initializeMirror();
    -initializeNanoHexapod(struct('actuator', 'piezo'));
    -initializeSample(struct('mass', 50));
    -
    -
    - -

    -And initialize the controllers. -

    -
    -
    K = tf(0);
    -save('./mat/controllers.mat', 'K', '-append');
    -K_iff = tf(0);
    -save('./mat/controllers.mat', 'K_iff', '-append');
    -K_rmc = tf(0);
    -save('./mat/controllers.mat', 'K_rmc', '-append');
    -K_dvf = -K_dvf;
    -save('./mat/controllers.mat', 'K_dvf', '-append');
    -
    -
    - -
    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'sim_nano_station_uniaxial';
    -
    -
    - -
    -
    %% Input/Output definition
    -io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    -io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    -io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    -io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    -io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    -
    -io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    -io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    -io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    -io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    -io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    -
    -
    - -
    -
    %% Run the linearization
    -G_dvf = linearize(mdl, io, options);
    -G_dvf.InputName  = {'Dw',   ... % Ground Motion [m]
    -                    'Fs',   ... % Force Applied on Sample [N]
    -                    'Fn',   ... % Force applied by NASS [N]
    -                    'Fty',  ... % Parasitic Force Ty [N]
    -                    'Frz'};     % Parasitic Force Rz [N]
    -G_dvf.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    -                    'Fnm',  ... % Force Sensor in NASS [N]
    -                    'Dnm',  ... % Displacement Sensor in NASS [m]
    -                    'Dgm',  ... % Asbolute displacement of Granite [m]
    -                    'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    -
    -
    - -
    -
    save('./uniaxial/mat/plants.mat', 'G_dvf', '-append');
    -
    -
    -
    -
    - -
    -

    5.3 Sensitivity to Disturbance

    -
    - -
    -

    uniaxial_sensitivity_dist_dvf.png -

    -

    Figure 23: Sensitivity to disturbance once the DVF controller is applied to the system (png, pdf)

    -
    - - -
    -

    uniaxial_sensitivity_dist_stages_dvf.png -

    -

    Figure 24: Sensitivity to force disturbances in various stages when DVF is applied (png, pdf)

    -
    -
    -
    - -
    -

    5.4 Damped Plant

    -
    - -
    -

    uniaxial_plant_dvf_damped.png -

    -

    Figure 25: Damped Plant after DVF is applied (png, pdf)

    -
    -
    -
    - -
    -

    5.5 Conclusion

    -
    -
    -

    -Direct Velocity Feedback: -

    - -
    -
    -
    -
    -
    -

    6 With Cedrat Piezo-electric Actuators

    -
    -

    - -

    -

    -The model used for the Cedrat actuator is shown in figure 26. -

    - - -
    -

    cedrat-uniaxial-actuator.png -

    -

    Figure 26: Schematic of the model used for the Cedrat Actuator

    -
    -
    -
    -

    6.1 Identification

    -
    -

    -Let's initialize the system prior to identification. -

    -
    -
    initializeGround();
    -initializeGranite();
    -initializeTy();
    -initializeRy();
    -initializeRz();
    -initializeMicroHexapod();
    -initializeAxisc();
    -initializeMirror();
    -initializeNanoHexapod(struct('actuator', 'piezo'));
    -initializeCedratPiezo();
    -initializeSample(struct('mass', 50));
    -
    -
    - -

    -And initialize the controllers. -

    -
    -
    K = tf(0);
    -save('./mat/controllers.mat', 'K', '-append');
    -K_iff = tf(0);
    -save('./mat/controllers.mat', 'K_iff', '-append');
    -K_rmc = tf(0);
    -save('./mat/controllers.mat', 'K_rmc', '-append');
    -K_dvf = tf(0);
    -save('./mat/controllers.mat', 'K_dvf', '-append');
    -
    -
    - -

    -We identify the dynamics of the system. -

    -
    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'sim_nano_station_uniaxial_cedrat_bis';
    -
    -
    - -

    -The inputs and outputs are defined below and corresponds to the name of simulink blocks. -

    -
    -
    %% Input/Output definition
    -io(1)  = linio([mdl, '/Dw'],   1, 'input'); % Ground Motion
    -io(2)  = linio([mdl, '/Fs'],   1, 'input'); % Force applied on the sample
    -io(3)  = linio([mdl, '/Fnl'],  1, 'input'); % Force applied by the NASS
    -io(4)  = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty
    -io(5)  = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz
    -
    -io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    -io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    -io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    -io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    -io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    -
    -
    - -

    -Finally, we use the linearize Matlab function to extract a state space model from the simscape model. -

    -
    -
    %% Run the linearization
    -G = linearize(mdl, io, options);
    -G.InputName  = {'Dw',   ... % Ground Motion [m]
    -                'Fs',   ... % Force Applied on Sample [N]
    -                'Fn',   ... % Force applied by NASS [N]
    -                'Fty',  ... % Parasitic Force Ty [N]
    -                'Frz'};     % Parasitic Force Rz [N]
    -G.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    -                'Fnm',  ... % Force Sensor in NASS [N]
    -                'Dnm',  ... % Displacement Sensor in NASS [m]
    -                'Dgm',  ... % Asbolute displacement of Granite [m]
    -                'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    -
    -
    -
    -
    - -
    -

    6.2 Control Design

    -
    -

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

    - - -
    -

    uniaxial_cedrat_plant.png -

    -

    Figure 27: Transfer function from forces applied in the legs to force sensor (png, pdf)

    -
    - -

    -The controller for each pair of actuator/sensor is: -

    -
    -
    K_cedrat = -5000/s;
    -
    -
    - - -
    -

    uniaxial_cedrat_open_loop.png -

    -

    Figure 28: Loop Gain for the Integral Force Feedback (png, pdf)

    -
    -
    -
    - -
    -

    6.3 Identification

    -
    -

    -Let's initialize the system prior to identification. -

    -
    -
    initializeGround();
    -initializeGranite();
    -initializeTy();
    -initializeRy();
    -initializeRz();
    -initializeMicroHexapod();
    -initializeAxisc();
    -initializeMirror();
    -initializeNanoHexapod(struct('actuator', 'piezo'));
    -initializeCedratPiezo();
    -initializeSample(struct('mass', 50));
    -
    -
    - -

    -All the controllers are set to 0. -

    -
    -
    K = tf(0);
    -save('./mat/controllers.mat', 'K', '-append');
    -K_iff = -K_cedrat;
    -save('./mat/controllers.mat', 'K_iff', '-append');
    -K_rmc = tf(0);
    -save('./mat/controllers.mat', 'K_rmc', '-append');
    -K_dvf = tf(0);
    -save('./mat/controllers.mat', 'K_dvf', '-append');
    -
    -
    - -
    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'sim_nano_station_uniaxial_cedrat_bis';
    -
    -
    - -
    -
    %% Input/Output definition
    -io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    -io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    -io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    -io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    -io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    -
    -io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    -io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    -io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    -io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    -io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    -
    -
    - -
    -
    %% Run the linearization
    -G_cedrat = linearize(mdl, io, options);
    -G_cedrat.InputName  = {'Dw',   ... % Ground Motion [m]
    -                    'Fs',   ... % Force Applied on Sample [N]
    -                    'Fn',   ... % Force applied by NASS [N]
    -                    'Fty',  ... % Parasitic Force Ty [N]
    -                    'Frz'};     % Parasitic Force Rz [N]
    -G_cedrat.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    -                    'Fnm',  ... % Force Sensor in NASS [N]
    -                    'Dnm',  ... % Displacement Sensor in NASS [m]
    -                    'Dgm',  ... % Asbolute displacement of Granite [m]
    -                    'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    -
    -
    - -
    -
    % save('./uniaxial/mat/plants.mat', 'G_cedrat', '-append');
    -
    -
    -
    -
    - -
    -

    6.4 Sensitivity to Disturbance

    -
    - -
    -

    uniaxial_sensitivity_dist_cedrat.png -

    -

    Figure 29: Sensitivity to disturbance once the CEDRAT controller is applied to the system (png, pdf)

    -
    - - -
    -

    uniaxial_sensitivity_dist_stages_cedrat.png -

    -

    Figure 30: Sensitivity to force disturbances in various stages when CEDRAT is applied (png, pdf)

    -
    -
    -
    - -
    -

    6.5 Damped Plant

    -
    - -
    -

    uniaxial_plant_cedrat_damped.png -

    -

    Figure 31: Damped Plant after CEDRAT is applied (png, pdf)

    -
    -
    -
    - -
    -

    6.6 Conclusion

    -
    -
    -

    -This gives similar results than with a classical force sensor. -

    - -
    -
    -
    -
    - -
    -

    7 Comparison of Active Damping Techniques

    -
    -

    - -

    -
    -
    -

    7.1 Load the plants

    -
    -
    -
    load('./uniaxial/mat/plants.mat', 'G', 'G_iff', 'G_rmc', 'G_dvf');
    -
    -
    -
    -
    - -
    -

    7.2 Sensitivity to Disturbance

    -
    - -
    -

    uniaxial_sensitivity_ground_motion.png -

    -

    Figure 32: Sensitivity to Ground Motion - Comparison (png, pdf)

    -
    - - - -
    -

    uniaxial_sensitivity_direct_force.png -

    -

    Figure 33: Sensitivity to disturbance - Comparison (png, pdf)

    -
    - - -
    -

    uniaxial_sensitivity_fty.png -

    -

    Figure 34: Sensitivity to force disturbances - Comparison (png, pdf)

    -
    - - -
    -

    uniaxial_sensitivity_frz.png -

    -

    Figure 35: Sensitivity to force disturbances - Comparison (png, pdf)

    -
    -
    -
    - -
    -

    7.3 Noise Budget

    -
    -

    -We first load the measured PSD of the disturbance. -

    -
    -
    load('./disturbances/mat/dist_psd.mat', 'dist_f');
    -
    -
    - -

    -The effect of these disturbances on the distance \(D\) is computed for all active damping techniques. -We then compute the Cumulative Amplitude Spectrum (figure 36). -

    - -
    -

    uniaxial-comp-cas-dist.png -

    -

    Figure 36: Comparison of the Cumulative Amplitude Spectrum of \(D\) for different active damping techniques (png, pdf)

    -
    - -

    -The obtained Root Mean Square Value for each active damping technique is shown below. -

    - - - --- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table 1: Obtain Root Mean Square value of \(D\) for each Active Damping Technique applied
     D [m rms]
    OL3.38e-06
    IFF3.40e-06
    RMC3.37e-06
    DVF3.38e-06
    - -

    -It is important to note that the effect of direct forces applied to the sample are not taken into account here. -

    -
    -
    - -
    -

    7.4 Damped Plant

    -
    - -
    -

    uniaxial_plant_damped_comp.png -

    -

    Figure 37: Damped Plant - Comparison (png, pdf)

    -
    -
    -
    - -
    -

    7.5 Conclusion

    -
    - - - --- -- -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table 2: Comparison of proposed active damping techniques
     IFFRMCDVF
    Sensor TypeForce sensorRelative MotionInertial
    Guaranteed Stability++-
    Sensitivity (\(D_w\))-+-
    Sensitivity (\(F_s\))- (at low freq)++
    Sensitivity (\(F_{ty,rz}\))+-+
    Overall RMS of \(D\)===
    -
    -
    -
    -
    -

    8 Voice Coil

    -
    -

    - -

    -
    -
    -

    8.1 Init

    -
    -

    -We initialize all the stages with the default parameters. -The nano-hexapod is an hexapod with voice coils and the sample has a mass of 50kg. -

    - -

    -All the controllers are set to 0 (Open Loop). -

    -
    -
    -
    -

    8.2 Identification

    -
    -

    -We identify the dynamics of the system. -

    -
    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'sim_nano_station_uniaxial';
    -
    -
    - -

    -The inputs and outputs are defined below and corresponds to the name of simulink blocks. -

    -
    -
    %% Input/Output definition
    -io(1)  = linio([mdl, '/Dw'],   1, 'input'); % Ground Motion
    -io(2)  = linio([mdl, '/Fs'],   1, 'input'); % Force applied on the sample
    -io(3)  = linio([mdl, '/Fnl'],  1, 'input'); % Force applied by the NASS
    -io(4)  = linio([mdl, '/Fdty'], 1, 'input'); % Parasitic force Ty
    -io(5)  = linio([mdl, '/Fdrz'], 1, 'input'); % Parasitic force Rz
    -
    -io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    -io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    -io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    -io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    -io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    -
    -
    - -

    -Finally, we use the linearize Matlab function to extract a state space model from the simscape model. -

    -
    -
    %% Run the linearization
    -G_vc = linearize(mdl, io, options);
    -G_vc.InputName  = {'Dw',   ... % Ground Motion [m]
    -                   'Fs',   ... % Force Applied on Sample [N]
    -                   'Fn',   ... % Force applied by NASS [N]
    -                   'Fty',  ... % Parasitic Force Ty [N]
    -                   'Frz'};     % Parasitic Force Rz [N]
    -G_vc.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    -                   'Fnm',  ... % Force Sensor in NASS [N]
    -                   'Dnm',  ... % Displacement Sensor in NASS [m]
    -                   'Dgm',  ... % Asbolute displacement of Granite [m]
    -                   'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    -
    -
    - -

    -Finally, we save the identified system dynamics for further analysis. -

    -
    -
    save('./uniaxial/mat/plants.mat', 'G_vc', '-append');
    -
    -
    -
    -
    - -
    -

    8.3 Sensitivity to Disturbances

    -
    -

    -We load the dynamics when using a piezo-electric nano hexapod to compare the results. -

    -
    -
    load('./uniaxial/mat/plants.mat', 'G');
    -
    -
    - -

    -We show several plots representing the sensitivity to disturbances: -

    -
      -
    • in figure 38 the transfer functions from ground motion \(D_w\) to the sample position \(D\) and the transfer function from direct force on the sample \(F_s\) to the sample position \(D\) are shown
    • -
    • in figure 39, it is the effect of parasitic forces of the positioning stages (\(F_{ty}\) and \(F_{rz}\)) on the position \(D\) of the sample that are shown
    • -
    - - -
    -

    uniaxial-sensitivity-vc-disturbances.png -

    -

    Figure 38: Sensitivity to disturbances (png, pdf)

    -
    - - -
    -

    uniaxial-sensitivity-vc-force-dist.png -

    -

    Figure 39: Sensitivity to disturbances (png, pdf)

    -
    -
    -
    - -
    -

    8.4 Noise Budget

    -
    -

    -We first load the measured PSD of the disturbance. -

    -
    -
    load('./disturbances/mat/dist_psd.mat', 'dist_f');
    -
    -
    - -

    -The effect of these disturbances on the distance \(D\) is computed below. -The PSD of the obtain distance \(D\) due to each of the perturbation is shown in figure 40 and the Cumulative Amplitude Spectrum is shown in figure 41. -

    - -

    -The Root Mean Square value of the obtained displacement \(D\) is computed below and can be determined from the figure 41. -

    -
    -4.8793e-06
    -
    - - - -
    -

    uniaxial-vc-psd-dist.png -

    -

    Figure 40: PSD of the displacement \(D\) due to disturbances (png, pdf)

    -
    - - -
    -

    uniaxial-vc-cas-dist.png -

    -

    Figure 41: CAS of the displacement \(D\) due the disturbances (png, pdf)

    -
    - -
    -

    -Even though the RMS value of the displacement \(D\) is lower when using a piezo-electric actuator, the motion is mainly due to high frequency disturbances which are more difficult to control (an higher control bandwidth is required). -

    - -

    -Thus, it may be desirable to use voice coil actuators. -

    - -
    -
    -
    -
    -

    8.5 Integral Force Feedback

    -
    -
    -
    K_iff = -20/s;
    -
    -
    - - -
    -

    uniaxial_iff_vc_open_loop.png -

    -

    Figure 42: Open Loop Transfer Function for IFF control when using a voice coil actuator (png, pdf)

    -
    -
    -
    - -
    -

    8.6 Identification of the Damped Plant

    -
    -

    -Let's initialize the system prior to identification. -

    -
    -
    initializeGround();
    -initializeGranite();
    -initializeTy();
    -initializeRy();
    -initializeRz();
    -initializeMicroHexapod();
    -initializeAxisc();
    -initializeMirror();
    -initializeNanoHexapod(struct('actuator', 'lorentz'));
    -initializeSample(struct('mass', 50));
    -
    -
    - -

    -All the controllers are set to 0. -

    -
    -
    K = tf(0);
    -save('./mat/controllers.mat', 'K', '-append');
    -K_iff = -K_iff;
    -save('./mat/controllers.mat', 'K_iff', '-append');
    -K_rmc = tf(0);
    -save('./mat/controllers.mat', 'K_rmc', '-append');
    -K_dvf = tf(0);
    -save('./mat/controllers.mat', 'K_dvf', '-append');
    -
    -
    - -
    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'sim_nano_station_uniaxial';
    -
    -
    - -
    -
    %% Input/Output definition
    -io(1)  = linio([mdl, '/Dw'],    1, 'input');  % Ground Motion
    -io(2)  = linio([mdl, '/Fs'],    1, 'input');  % Force applied on the sample
    -io(3)  = linio([mdl, '/Fnl'],   1, 'input');  % Force applied by the NASS
    -io(4)  = linio([mdl, '/Fdty'],  1, 'input');  % Parasitic force Ty
    -io(5)  = linio([mdl, '/Fdrz'],  1, 'input');  % Parasitic force Rz
    -
    -io(6)  = linio([mdl, '/Dsm'],  1, 'output'); % Displacement of the sample
    -io(7)  = linio([mdl, '/Fnlm'], 1, 'output'); % Force sensor in NASS's legs
    -io(8)  = linio([mdl, '/Dnlm'], 1, 'output'); % Displacement of NASS's legs
    -io(9)  = linio([mdl, '/Dgm'],  1, 'output'); % Absolute displacement of the granite
    -io(10) = linio([mdl, '/Vlm'],  1, 'output'); % Measured absolute velocity of the top NASS platform
    -
    -
    - -
    -
    %% Run the linearization
    -G_vc_iff = linearize(mdl, io, options);
    -G_vc_iff.InputName  = {'Dw',   ... % Ground Motion [m]
    -                       'Fs',   ... % Force Applied on Sample [N]
    -                       'Fn',   ... % Force applied by NASS [N]
    -                       'Fty',  ... % Parasitic Force Ty [N]
    -                       'Frz'};     % Parasitic Force Rz [N]
    -G_vc_iff.OutputName = {'D',    ... % Measured sample displacement x.r.t. granite [m]
    -                       'Fnm',  ... % Force Sensor in NASS [N]
    -                       'Dnm',  ... % Displacement Sensor in NASS [m]
    -                       'Dgm',  ... % Asbolute displacement of Granite [m]
    -                       'Vlm'}; ... % Absolute Velocity of NASS [m/s]
    -
    -
    -
    -
    - -
    -

    8.7 Noise Budget

    -
    -

    -We compute the obtain PSD of the displacement \(D\) when using IFF. -

    - -
    -

    uniaxial-cas-iff-vc.png -

    -

    Figure 43: CAS of the displacement \(D\) (png, pdf)

    -
    -
    -
    - -
    -

    8.8 Conclusion

    -
    -
    -

    -The use of voice coil actuators would allow a better disturbance rejection for a fixed bandwidth compared with a piezo-electric hexapod. -

    - -

    -Similarly, it would require much lower bandwidth to attain the same level of disturbance rejection for \(D\). -

    - -
    -
    -
    -
    -
    -
    -

    Author: Dehaeze Thomas

    -

    Created: 2019-11-11 lun. 14:50

    -

    Validate

    -
    - -