Add all data files

This commit is contained in:
Thomas Dehaeze 2024-11-06 12:30:29 +01:00
parent 31d4dd5f24
commit 13a2e57322
70 changed files with 932 additions and 707 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

21
matlab/src/circlefit.m Normal file
View File

@ -0,0 +1,21 @@
function [xc,yc,R,a] = circlefit(x,y)
%
% [xc yx R] = circfit(x,y)
%
% fits a circle in x,y plane in a more accurate
% (less prone to ill condition )
% procedure than circfit2 but using more memory
% x,y are column vector where (x(i),y(i)) is a measured point
%
% result is center point (yc,xc) and radius R
% an optional output is the vector of coeficient a
% describing the circle's equation
%
% x^2+y^2+a(1)*x+a(2)*y+a(3)=0
%
% By: Izhak bucher 25/oct /1991,
x=x(:); y=y(:);
a=[x y ones(size(x))]\[-(x.^2+y.^2)];
xc = -.5*a(1);
yc = -.5*a(2);
R = sqrt((a(1)^2+a(2)^2)/4-a(3));

View File

@ -10,15 +10,15 @@ arguments
% Global parameter to enable or disable the disturbances
args.enable logical {mustBeNumericOrLogical} = true
% Ground Motion - X direction
args.Dwx logical {mustBeNumericOrLogical} = true
args.Dw_x logical {mustBeNumericOrLogical} = true
% Ground Motion - Y direction
args.Dwy logical {mustBeNumericOrLogical} = true
args.Dw_y logical {mustBeNumericOrLogical} = true
% Ground Motion - Z direction
args.Dwz logical {mustBeNumericOrLogical} = true
args.Dw_z logical {mustBeNumericOrLogical} = true
% Translation Stage - X direction
args.Fty_x logical {mustBeNumericOrLogical} = true
args.Fdy_x logical {mustBeNumericOrLogical} = true
% Translation Stage - Z direction
args.Fty_z logical {mustBeNumericOrLogical} = true
args.Fdy_z logical {mustBeNumericOrLogical} = true
% Spindle - X direction
args.Frz_x logical {mustBeNumericOrLogical} = true
% Spindle - Y direction
@ -31,175 +31,163 @@ end
rng("shuffle");
%% Ground Motion
load('dist_psd.mat', 'dist_f');
if args.enable
% Load the PSD of disturbance
load('ustation_disturbance_psd.mat', 'gm_dist')
% Frequency Data
Dw.f = dist_f.f(2:end);
Dw.psd_x = dist_f.psd_gm(2:end);
Dw.psd_y = dist_f.psd_gm(2:end);
Dw.psd_z = dist_f.psd_gm(2:end);
% Frequency Data
Dw.f = gm_dist.f;
Dw.psd_x = gm_dist.pxx_x;
Dw.psd_y = gm_dist.pxx_y;
Dw.psd_z = gm_dist.pxx_z;
% Time data
Fs = 2*Dw.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Dw.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Dw.t = linspace(0, T0, N+1)'; % Time Vector [s]
% Time data
Fs = 2*Dw.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Dw.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Dw.t = linspace(0, T0, N+1)'; % Time Vector [s]
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(Dw.psd_x(i)/T0);
end
if args.Dwx && args.enable
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)))];;
Dw.x = N/sqrt(2)*ifft(Cx); % Ground Motion - x direction [m]
else
Dw.x = zeros(length(Dw.t), 1);
end
if args.Dwy && args.enable
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)))];;
Dw.y = N/sqrt(2)*ifft(Cx); % Ground Motion - y direction [m]
else
Dw.y = zeros(length(Dw.t), 1);
end
if args.Dwy && args.enable
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)))];;
Dw.z = N/sqrt(2)*ifft(Cx); % Ground Motion - z direction [m]
else
Dw.z = zeros(length(Dw.t), 1);
end
load('dist_psd.mat', 'dist_f');
dist_f.f = dist_f.f(2:end);
dist_f.psd_gm = dist_f.psd_gm(2:end);
dist_f.psd_ty = dist_f.psd_ty(2:end);
dist_f.psd_rz = dist_f.psd_rz(2:end);
%% Translation Stage
load('dist_psd.mat', 'dist_f');
% Frequency Data
Ty.f = dist_f.f(2:end);
Ty.psd_x = dist_f.psd_ty(2:end); % TODO - we take here the vertical direction which is wrong but approximate
Ty.psd_z = dist_f.psd_ty(2:end);
% Time data
Fs = 2*Ty.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Ty.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Ty.t = linspace(0, T0, N+1)'; % Time Vector [s]
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(Ty.psd_x(i)/T0);
end
% Translation Stage - X
if args.Fty_x && args.enable
phi = Ty.psd_x;
% ASD representation of the ground motion
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
C(i) = sqrt(Dw.psd_x(i)/T0);
end
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)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Ty x [N]
Ty.x = u;
if args.Dw_x
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)))];;
Dw.x = N/sqrt(2)*ifft(Cx); % Ground Motion - x direction [m]
else
Dw.x = zeros(length(Dw.t), 1);
end
if args.Dw_y
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)))];;
Dw.y = N/sqrt(2)*ifft(Cx); % Ground Motion - y direction [m]
else
Dw.y = zeros(length(Dw.t), 1);
end
if args.Dw_y
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)))];;
Dw.z = N/sqrt(2)*ifft(Cx); % Ground Motion - z direction [m]
else
Dw.z = zeros(length(Dw.t), 1);
end
else
Ty.x = zeros(length(Ty.t), 1);
Dw.t = [0,1]; % Time Vector [s]
Dw.x = [0,0]; % Ground Motion - X [m]
Dw.y = [0,0]; % Ground Motion - Y [m]
Dw.z = [0,0]; % Ground Motion - Z [m]
end
% Translation Stage - Z
if args.Fty_z && args.enable
phi = Ty.psd_z;
%% Translation stage
if args.enable
% Load the PSD of disturbance
load('ustation_disturbance_psd.mat', 'dy_dist')
% Frequency Data
Dy.f = dy_dist.f;
Dy.psd_x = dy_dist.pxx_fx;
Dy.psd_z = dy_dist.pxx_fz;
% Time data
Fs = 2*Dy.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Dy.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Dy.t = linspace(0, T0, N+1)'; % Time Vector [s]
% ASD representation of the disturbance voice
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
C(i) = sqrt(Dy.psd_x(i)/T0);
end
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)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Ty z [N]
Ty.z = u;
if args.Fdy_x
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)))];;
Dy.x = N/sqrt(2)*ifft(Cx); % Translation stage disturbances - X direction [N]
else
Dy.x = zeros(length(Dy.t), 1);
end
if args.Fdy_z
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)))];;
Dy.z = N/sqrt(2)*ifft(Cx); % Translation stage disturbances - Z direction [N]
else
Dy.z = zeros(length(Dy.t), 1);
end
else
Ty.z = zeros(length(Ty.t), 1);
Dy.t = [0,1]; % Time Vector [s]
Dy.x = [0,0]; % Translation Stage disturbances - X [N]
Dy.z = [0,0]; % Translation Stage disturbances - Z [N]
end
%% Translation Stage
load('dist_psd.mat', 'dist_f');
%% Spindle
if args.enable
% Load the PSD of disturbance
load('ustation_disturbance_psd.mat', 'rz_dist')
% Frequency Data
Rz.f = dist_f.f(2:end);
Rz.psd_x = dist_f.psd_rz(2:end); % TODO - we take here the vertical direction which is wrong but approximate
Rz.psd_y = dist_f.psd_rz(2:end); % TODO - we take here the vertical direction which is wrong but approximate
Rz.psd_z = dist_f.psd_rz(2:end);
% Frequency Data
Rz.f = rz_dist.f;
Rz.psd_x = rz_dist.pxx_fx;
Rz.psd_y = rz_dist.pxx_fy;
Rz.psd_z = rz_dist.pxx_fz;
% Time data
Fs = 2*Rz.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Rz.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Rz.t = linspace(0, T0, N+1)'; % Time Vector [s]
% Time data
Fs = 2*Rz.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Rz.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Rz.t = linspace(0, T0, N+1)'; % Time Vector [s]
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(Rz.psd_x(i)/T0);
end
% Translation Stage - X
if args.Frz_x && args.enable
phi = Rz.psd_x;
% ASD representation of the disturbance voice
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
C(i) = sqrt(Rz.psd_x(i)/T0);
end
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)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz x [N]
Rz.x = u;
else
Rz.x = zeros(length(Rz.t), 1);
end
% Translation Stage - Y
if args.Frz_y && args.enable
phi = Rz.psd_y;
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
if args.Frz_x
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)))];;
Rz.x = N/sqrt(2)*ifft(Cx); % spindle disturbances - X direction [N]
else
Rz.x = zeros(length(Rz.t), 1);
end
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)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz y [N]
Rz.y = u;
else
Rz.y = zeros(length(Rz.t), 1);
end
% Translation Stage - Z
if args.Frz_z && args.enable
phi = Rz.psd_z;
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
if args.Frz_y
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)))];;
Rz.y = N/sqrt(2)*ifft(Cx); % spindle disturbances - Y direction [N]
else
Rz.y = zeros(length(Rz.t), 1);
end
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)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz z [N]
Rz.z = u;
if args.Frz_z
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)))];;
Rz.z = N/sqrt(2)*ifft(Cx); % spindle disturbances - Z direction [N]
else
Rz.z = zeros(length(Rz.t), 1);
end
else
Rz.z = zeros(length(Rz.t), 1);
Rz.t = [0,1]; % Time Vector [s]
Rz.x = [0,0]; % Spindle disturbances - X [N]
Rz.y = [0,0]; % Spindle disturbances - X [N]
Rz.z = [0,0]; % Spindle disturbances - Z [N]
end
u = zeros(100, 6);
@ -208,22 +196,16 @@ Fd = u;
Dw.x = Dw.x - Dw.x(1);
Dw.y = Dw.y - Dw.y(1);
Dw.z = Dw.z - Dw.z(1);
Ty.x = Ty.x - Ty.x(1);
Ty.z = Ty.z - Ty.z(1);
Dy.x = Dy.x - Dy.x(1);
Dy.z = Dy.z - Dy.z(1);
Rz.x = Rz.x - Rz.x(1);
Rz.y = Rz.y - Rz.y(1);
Rz.z = Rz.z - Rz.z(1);
if exist('./mat', 'dir')
if exist('./mat/nass_disturbances.mat', 'file')
save('mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args', '-append');
else
save('mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args');
end
save('mat/nass_disturbances.mat', 'Dw', 'Dy', 'Rz', 'Fd', 'args');
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_disturbances.mat', 'file')
save('matlab/mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args', '-append');
else
save('matlab/mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args');
end
save('matlab/mat/nass_disturbances.mat', 'Dw', 'Dy', 'Rz', 'Fd', 'args');
end

Binary file not shown.

View File

@ -0,0 +1,22 @@
@book{preumont94_random_vibrat_spect_analy,
author = {Andr{\'e} Preumont},
title = {Random Vibration and Spectral Analysis},
year = 1994,
publisher = {Springer Netherlands},
url = {https://doi.org/10.1007/978-94-017-2840-9},
doi = {10.1007/978-94-017-2840-9},
series = {Solid Mechanics and Its Applications},
}
@book{taghirad13_paral,
author = {Taghirad, Hamid},
title = {Parallel robots : mechanics and control},
year = 2013,
publisher = {CRC Press},
address = {Boca Raton, FL},
isbn = 9781466555778,
keywords = {favorite, parallel robot},
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,4 +1,4 @@
% Created 2024-11-05 Tue 22:36
% Created 2024-11-06 Wed 12:01
% Intended LaTeX compiler: pdflatex
\documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt}
@ -24,7 +24,6 @@
\begin{table}[htbp]
\caption{\label{tab:ustation_section_matlab_code}Report sections and corresponding Matlab files}
\centering
\begin{tabularx}{0.6\linewidth}{lX}
\toprule
@ -36,6 +35,8 @@ Section \ref{sec:ustation_disturbances} & \texttt{ustation\_3\_disturbances.m}\\
Section \ref{sec:ustation_experiments} & \texttt{ustation\_4\_experiments.m}\\
\bottomrule
\end{tabularx}
\caption{\label{tab:ustation_section_matlab_code}Report sections and corresponding Matlab files}
\end{table}
\chapter{Micro-Station Kinematics}
@ -53,7 +54,6 @@ The micro-station degrees-of-freedom are summarized in Table \ref{tab:ustation_d
\end{figure}
\begin{table}[htbp]
\caption{\label{tab:ustation_dof_summary}Summary of the micro-station degrees-of-freedom}
\centering
\begin{tabularx}{\linewidth}{lX}
\toprule
@ -65,6 +65,8 @@ Spindle & \(R_z = 360\,\text{deg}\)\\
Micro Hexapod & \(D_{xyz} = \pm 10\,mm\), \(R_{xyz} = \pm 3\,\text{deg}\)\\
\bottomrule
\end{tabularx}
\caption{\label{tab:ustation_dof_summary}Summary of the micro-station degrees-of-freedom}
\end{table}
There are different ways of modelling the stage dynamics in a multi-body model.
@ -424,7 +426,6 @@ The springs and dampers values were first estimated from the joints/stages speci
The spring values are summarized in Table \ref{tab:ustation_6dof_stiffness_values}.
\begin{table}[htbp]
\caption{\label{tab:ustation_6dof_stiffness_values}Summary of the stage stiffnesses. Contrained degrees-of-freedom are indicated by ``-''. The location of the 6-DoF joints in which the stiffnesses are defined are indicated by the frame in figures of Section \ref{ssec:ustation_stages}}
\centering
\begin{tabularx}{\linewidth}{Xcccccc}
\toprule
@ -437,6 +438,8 @@ Spindle & \(700\,N/\mu m\) & \(700\,N/\mu m\) & \(2\,kN/\mu m\) & \(10\,Nm/\mu\t
Hexapod & \(10\,N/\mu m\) & \(10\,N/\mu m\) & \(100\,N/\mu m\) & \(1.5\,Nm/rad\) & \(1.5\,Nm/rad\) & \(0.27\,Nm/rad\)\\
\bottomrule
\end{tabularx}
\caption{\label{tab:ustation_6dof_stiffness_values}Summary of the stage stiffnesses. Contrained degrees-of-freedom are indicated by ``-''. The location of the 6-DoF joints in which the stiffnesses are defined are indicated by the frame in figures of Section \ref{ssec:ustation_stages}}
\end{table}
\section{With comparison with the measurements}
@ -603,11 +606,18 @@ Therefore, from a control point of view, they are not important.
The ground motion is simply measured by using a sensitive 3-axis geophone placed on the ground.
The generated voltages are recorded with a high resolution DAC, and converted to displacement using the Geophone sensitivity transfer function.
The obtained ground motion displacement is shown in Figure \ref{fig:ustation_ground_disturbance}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/ustation_ground_disturbance.png}
\caption{\label{fig:ustation_ground_disturbance}Measured ground motion}
\end{figure}
\paragraph{Ty Stage}
To measure the positioning errors of the translation stage, the setup shown in Figure \ref{fig:ustation_errors_ty_setup} is used.
A special optical element (called a ``straightness interferometer''\footnote{The special optics (straightness interferometer and reflector) are the manufactured by Agilent (10774A).}) is fixed on top of the micro-station, while a laser source\footnote{Laser source is manufactured by Agilent (5519b)} and a straightness reflector are fixed on the ground.
A special optical element (called a ``straightness interferometer''\footnote{The special optics (straightness interferometer and reflector) are manufactured by Agilent (10774A).}) is fixed on top of the micro-station, while a laser source\footnote{Laser source is manufactured by Agilent (5519b)} and a straightness reflector are fixed on the ground.
A similar setup is used to measure the horizontal deviation (i.e. in the \(x\) direction), as well as the pitch and yaw errors of the translation stage.
\begin{figure}[htbp]
@ -664,7 +674,10 @@ From the 5 measured displacements \([d_1,\,d_2,\,d_3,\,d_4,\,d_5]\), the transla
A measurement is performed at 60rpm during 10 turns, and the obtained results are shown in Figure \ref{fig:ustation_errors_spindle}.
A fraction of the radial (Figure \ref{fig:ustation_errors_spindle_radial}) and tilt (Figure \ref{fig:ustation_errors_spindle_tilt}) errors is linked to the fact that the two spheres are not perfectly aligned with the rotation axis of the Spindle.
However, it is in practice very difficult to align the ``point-of-interest'' of the sample with the rotation axis, so the NASS will be used to actively keep the PoI on the rotation axis.
This is displayed by the dashed circle.
After removing the best circular fit from the data, the vibrations induced by the Spindle may be viewed as stochastic disturbances.
However, some misalignment between the ``point-of-interest'' of the sample with the rotation axis will be considered as it is very difficult to align in practice.
The NASS will be used to actively keep the PoI on the rotation axis.
The vertical motion induced by the scanning of the spindle is in the order of \(\pm 30\,nm\) (Figure \ref{fig:ustation_errors_spindle_axial}).
\begin{figure}[htbp]
@ -686,7 +699,7 @@ The vertical motion induced by the scanning of the spindle is in the order of \(
\end{center}
\subcaption{\label{fig:ustation_errors_spindle_tilt}Tilt errors}
\end{subfigure}
\caption{\label{fig:ustation_errors_spindle}Measurement of the radial (\subref{fig:ustation_errors_spindle_radial}), axial (\subref{fig:ustation_errors_spindle_axial}) and tilt (\subref{fig:ustation_errors_spindle_tilt}) Spindle errors.}
\caption{\label{fig:ustation_errors_spindle}Measurement of the radial (\subref{fig:ustation_errors_spindle_radial}), axial (\subref{fig:ustation_errors_spindle_axial}) and tilt (\subref{fig:ustation_errors_spindle_tilt}) Spindle errors during a 60rpm spindle rotation. A circular best fit is shown by the dashed circle. It represents the misalignment of the spheres with the rotation axis.}
\end{figure}
\section{Sensitivity to disturbances}
@ -694,7 +707,6 @@ The vertical motion induced by the scanning of the spindle is in the order of \(
In order to compute the disturbance source (i.e. forces) that induced the measured vibrations in Section \ref{ssec:ustation_disturbances_meas}, the transfer function from the disturbance sources to the stage vibration (i.e. the ``sensitivity to disturbances'') needs to be estimated.
This is done using the multi-body that was presented in Section \ref{sec:ustation_modeling}.
The obtained transfer functions are shown in Figure \ref{fig:ustation_model_sensitivity}.
\begin{figure}[htbp]
@ -722,161 +734,87 @@ The obtained transfer functions are shown in Figure \ref{fig:ustation_model_sens
\section{Obtained disturbance sources}
\label{ssec:ustation_disturbances_results}
\begin{itemize}
\item[{$\square$}] Display PSD of disturbances
\end{itemize}
From the measured effect of disturbances in Section \ref{ssec:ustation_disturbances_meas} and the sensitivity to disturbances extracted from the Simscape model in Section \ref{ssec:ustation_disturbances_sensitivity}, the power spectral density of the disturbance sources (i.e. forces applied in the stage's joint) can be estimated.
They are shown in Figure \ref{fig:ustation_dist_sources}.
The obtained amplitude spectral densities of the disturbance forces are shown in Figure \ref{fig:dist_force_psd}.
\begin{figure}[htbp]
\begin{subfigure}{0.33\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/ustation_dist_source_ground_motion.png}
\end{center}
\subcaption{\label{fig:ustation_dist_source_ground_motion}Ground Motion}
\end{subfigure}
\begin{subfigure}{0.33\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/ustation_dist_source_translation_stage.png}
\end{center}
\subcaption{\label{fig:ustation_dist_source_translation_stage}Translation Stage}
\end{subfigure}
\begin{subfigure}{0.33\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/ustation_dist_source_spindle.png}
\end{center}
\subcaption{\label{fig:ustation_dist_source_spindle}Spindle}
\end{subfigure}
\caption{\label{fig:ustation_dist_sources}Measured spectral density of the micro-station disturbances sources. Ground motion (\subref{fig:ustation_dist_source_ground_motion}), translation stage (\subref{fig:ustation_dist_source_translation_stage}) and spindle (\subref{fig:ustation_dist_source_spindle}).}
\end{figure}
The disturbances are characterized by their power spectral densities as shown in Figure \ref{fig:ustation_dist_sources}.
However, in order to perform time domain simulations, disturbances needs to be represented by a time domain.
In order to generate stochastic time domain signals having the same power spectral densities as the ones estimated, the discrete inverse Fourier transform is used as explained in \cite[chap. 12.11]{preumont94_random_vibrat_spect_analy}.
Examples of obtained time domain disturbance signals are shown in Figure \ref{fig:ustation_dist_sources_time}.
\begin{figure}[htbp]
\begin{subfigure}{0.33\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/ustation_dist_source_ground_motion_time.png}
\end{center}
\subcaption{\label{fig:ustation_dist_source_ground_motion_time}Ground Motion}
\end{subfigure}
\begin{subfigure}{0.33\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/ustation_dist_source_translation_stage_time.png}
\end{center}
\subcaption{\label{fig:ustation_dist_source_translation_stage_time}Translation Stage}
\end{subfigure}
\begin{subfigure}{0.33\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/ustation_dist_source_spindle_time.png}
\end{center}
\subcaption{\label{fig:ustation_dist_source_spindle_time}Spindle}
\end{subfigure}
\caption{\label{fig:ustation_dist_sources_time}Generated time domain disturbance signals. Ground motion (\subref{fig:ustation_dist_source_ground_motion_time}), translation stage (\subref{fig:ustation_dist_source_translation_stage_time}) and spindle (\subref{fig:ustation_dist_source_spindle_time}).}
\end{figure}
\chapter{Simulation of Scientific Experiments}
\label{sec:ustation_experiments}
The goal here is to simulate some scientific experiments with the Simscape model when no control is applied to the nano-hexapod.
This has several goals:
\begin{itemize}
\item Validate the model
\item Estimate the expected error motion for the experiments
\item Estimate the stroke that we may need for the nano-hexapod
\item Compare with experiments when control is applied
\item[{$\square$}] Perfect tomography => no error
\item[{$\square$}] Add vibrations and some off-center => results, compare with measurements
\item[{$\square$}] Ty scans (-4.5mm to 4.5mm) => compare with measurements
\end{itemize}
The document in organized as follow:
\begin{itemize}
\item In section \ref{sec:simscape_model} the Simscape model is initialized
\item In section \ref{sec:tomo_no_dist} a tomography experiment is performed where the sample is aligned with the rotation axis. No disturbance is included
\item In section \ref{sec:tomo_dist}, the same is done but with disturbance included
\item In section \ref{sec:tomo_hexa_trans} the micro-hexapod translate the sample such that its center of mass is no longer aligned with the rotation axis. No disturbance is included
\item In section \ref{sec:ty_scans}, scans with the translation stage are simulated with no perturbation included
\end{itemize}
\section{Simscape Model}
\label{sec:simscape_model}
We load the shared simulink configuration and we set the \texttt{StopTime}.
We first initialize all the stages.
The nano-hexapod is considered to be a rigid body.
No controller is used (Open Loop).
We don't gravity.
We log the signals for further analysis.
\section{Tomography Experiment with no disturbances}
\label{sec:tomo_no_dist}
In this section, a tomography experiment is performed with the sample aligned with the rotation axis.
No disturbance is included.
\subsection{Simulation Setup}
And we initialize the disturbances to be equal to zero.
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.
We simulate the model.
And we save the obtained data.
\subsection{Analysis}
\section{Tomography Experiment}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/exp_tomo_without_dist.png}
\caption{\label{fig:exp_tomo_without_dist}X-Y-Z translation of the sample w.r.t. granite when performing tomography experiment with no disturbances (\href{./figs/exp\_tomo\_without\_dist.png}{png}, \href{./figs/exp\_tomo\_without\_dist.pdf}{pdf})}
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,scale=1]{figs/ustation_errors_model_spindle_radial.png}
\end{center}
\subcaption{\label{fig:ustation_errors_model_spindle_radial}Radial error}
\end{subfigure}
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,scale=1]{figs/ustation_errors_model_spindle_axial.png}
\end{center}
\subcaption{\label{fig:ustation_errors_model_spindle_axial}Axial error}
\end{subfigure}
\caption{\label{fig:ustation_errors_model_spindle}Measurement of strut flexible modes}
\end{figure}
\subsection{Conclusion}
\begin{important}
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.
\end{important}
\section{Tomography Experiment with included perturbations}
\label{sec:tomo_dist}
In this section, we also perform a tomography experiment with the sample's center of mass aligned with the rotation axis.
However this time, we include perturbations such as ground motion and stage vibrations.
\subsection{Simulation Setup}
We now activate the disturbances.
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.
We simulate the model.
And we save the obtained data.
\subsection{Analysis}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/exp_tomo_dist.png}
\caption{\label{fig:exp_tomo_dist}X-Y-Z translations and rotations of the sample w.r.t. the granite when performing tomography experiment with disturbances (\href{./figs/exp\_tomo\_dist.png}{png}, \href{./figs/exp\_tomo\_dist.pdf}{pdf})}
\end{figure}
\subsection{Conclusion}
\begin{important}
Here, no vibration is included in the X and Y directions.
\end{important}
\section{Tomography Experiment with Ty raster scans}
\label{sec:tomo_dist_ty_scans}
In this section, we also perform a tomography experiment with scans of the Translation stage.
All the perturbations are included.
\subsection{Simulation Setup}
We now activate the disturbances.
We initialize the reference path for all the stages.
The Spindle which is rotating at 60rpm and the translation stage not moving as it would take a long time to simulate.
However, vibrations of the Ty stage are included.
We simulate the model.
And we save the obtained data.
\subsection{Analysis}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/exp_scans_rz_dist.png}
\caption{\label{fig:exp_scans_rz_dist}X-Y-Z translations and rotations of the sample w.r.t. the granite when performing tomography experiment and scans with the translation stage at the same time}
\end{figure}
\subsection{Conclusion}
\section{Tomography when the micro-hexapod is not centered}
\label{sec:tomo_hexa_trans}
In this section, the sample's center of mass is not aligned with the rotation axis anymore.
This is due to the fact that the micro-hexapod has performed some displacement.
No disturbances are included.
\subsection{Simulation Setup}
We first set the wanted translation of the Micro Hexapod.
We initialize the reference path.
We initialize the stages.
And we initialize the disturbances to zero.
We simulate the model.
And we save the obtained data.
\subsection{Analysis}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/exp_tomo_offset.png}
\caption{\label{fig:exp_tomo_offset}X-Y-Z translation of the sample w.r.t. granite when performing tomography experiment with no disturbances (\href{./figs/exp\_tomo\_offset.png}{png}, \href{./figs/exp\_tomo\_offset.pdf}{pdf})}
\end{figure}
\subsection{Conclusion}
\begin{important}
The main motion error are 1Hz X-Y translations and constant Ry error.
This is mainly due to finite stiffness of the elements.
\end{important}
\section{Raster Scans with the translation stage}
\label{sec:ty_scans}
In this section, scans with the translation stage are performed.
\subsection{Simulation Setup}
We initialize the stages.
And we initialize the disturbances to zero.
We set the reference path to be a triangular signal for the Translation Stage.
We simulate the model.
And we save the obtained data.
We now set the reference path to be a sinusoidal signal for the Translation Stage.
We simulate the model.
And we save the obtained data.
\subsection{Analysis}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/exp_ty_scan.png}
\caption{\label{fig:exp_ty_scan}X-Y-Z translation of the sample w.r.t. granite when performing tomography experiment with no disturbances (\href{./figs/exp\_ty\_scan.png}{png}, \href{./figs/exp\_ty\_scan.pdf}{pdf})}
\end{figure}
\subsection{Conclusion}
\begin{important}
Scans with the translation stage induces some errors in the Y direction and Rx translations.
Also, scanning with a sinusoidal wave induces less position errors and at lower frequencies.
Thus, this should be preferred.
\end{important}
\chapter{Conclusion}
\label{sec:uniaxial_conclusion}
\printbibliography[heading=bibintoc,title={Bibliography}]
\end{document}