Rename mat files

This commit is contained in:
Thomas Dehaeze 2024-11-06 15:16:41 +01:00
parent 13a2e57322
commit 3ee0784e22
37 changed files with 247 additions and 212 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 111 KiB

BIN
matlab/mat/conf_log.mat Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
matlab/mat/nass_stages.mat Normal file

Binary file not shown.

View File

@ -9,7 +9,7 @@
% Outputs:
% - -
load('./mat/conf_simscape.mat', 'conf_simscape');
load('./mat/nass_model_conf_simscape.mat', 'conf_simscape');
fprintf('Simscape Configuration:\n');
@ -21,7 +21,7 @@
fprintf('\n');
load('./mat/nass_disturbances.mat', 'args');
load('./mat/nass_model_disturbances.mat', 'args');
fprintf('Disturbances:\n');
if ~args.enable
@ -30,7 +30,7 @@
if args.Dwx && args.Dwy && args.Dwz
fprintf('- Ground motion\n');
end
if args.Fty_x && args.Fty_z
if args.Fdy_x && args.Fdy_z
fprintf('- Vibrations of the Translation Stage\n');
end
if args.Frz_z
@ -39,7 +39,7 @@
end
fprintf('\n');
load('./mat/nass_references.mat', 'args');
load('./mat/nass_model_references.mat', 'args');
fprintf('Reference Tracking:\n');
fprintf('- Translation Stage:\n');
@ -93,13 +93,7 @@
fprintf('\n');
load('./mat/controller.mat', 'controller');
fprintf('Controller:\n');
fprintf('- %s\n', controller.name);
fprintf('\n');
load('./mat/stages.mat', 'ground', 'granite', 'ty', 'ry', 'rz', 'micro_hexapod', 'axisc');
load('./mat/nass_model_stages.mat', 'ground', 'granite', 'ty', 'ry', 'rz', 'micro_hexapod', 'axisc');
fprintf('Micro Station:\n');

View File

@ -205,7 +205,7 @@ Rz.y = Rz.y - Rz.y(1);
Rz.z = Rz.z - Rz.z(1);
if exist('./mat', 'dir')
save('mat/nass_disturbances.mat', 'Dw', 'Dy', 'Rz', 'Fd', 'args');
save('mat/nass_model_disturbances.mat', 'Dw', 'Dy', 'Rz', 'Fd', 'args');
elseif exist('./matlab', 'dir')
save('matlab/mat/nass_disturbances.mat', 'Dw', 'Dy', 'Rz', 'Fd', 'args');
save('matlab/mat/nass_model_disturbances.mat', 'Dw', 'Dy', 'Rz', 'Fd', 'args');
end

View File

@ -31,15 +31,15 @@
granite.C = args.C; % [N/(m/s)]
if exist('./mat', 'dir')
if exist('./mat/nass_stages.mat', 'file')
save('mat/nass_stages.mat', 'granite', '-append');
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'granite', '-append');
else
save('mat/nass_stages.mat', 'granite');
save('mat/nass_model_stages.mat', 'granite');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_stages.mat', 'file')
save('matlab/mat/nass_stages.mat', 'granite', '-append');
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'granite', '-append');
else
save('matlab/mat/nass_stages.mat', 'granite');
save('matlab/mat/nass_model_stages.mat', 'granite');
end
end

View File

@ -20,15 +20,15 @@
ground.rot_point = args.rot_point;
if exist('./mat', 'dir')
if exist('./mat/nass_stages.mat', 'file')
save('mat/nass_stages.mat', 'ground', '-append');
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'ground', '-append');
else
save('mat/nass_stages.mat', 'ground');
save('mat/nass_model_stages.mat', 'ground');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_stages.mat', 'file')
save('matlab/mat/nass_stages.mat', 'ground', '-append');
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'ground', '-append');
else
save('matlab/mat/nass_stages.mat', 'ground');
save('matlab/mat/nass_model_stages.mat', 'ground');
end
end

View File

@ -19,15 +19,15 @@
conf_log.Ts = args.Ts;
if exist('./mat', 'dir')
if exist('./mat/conf_log.mat', 'file')
save('mat/conf_log.mat', 'conf_log', '-append');
if exist('./mat/nass_model_conf_log.mat', 'file')
save('mat/nass_model_conf_log.mat', 'conf_log', '-append');
else
save('mat/conf_log.mat', 'conf_log');
save('mat/nass_model_conf_log.mat', 'conf_log');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/conf_log.mat', 'file')
save('matlab/mat/conf_log.mat', 'conf_log', '-append');
if exist('./matlab/mat/nass_model_conf_log.mat', 'file')
save('matlab/mat/nass_model_conf_log.mat', 'conf_log', '-append');
else
save('matlab/mat/conf_log.mat', 'conf_log');
save('matlab/mat/nass_model_conf_log.mat', 'conf_log');
end
end

View File

@ -93,15 +93,15 @@
micro_hexapod = stewart;
if exist('./mat', 'dir')
if exist('./mat/nass_stages.mat', 'file')
save('mat/nass_stages.mat', 'micro_hexapod', '-append');
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'micro_hexapod', '-append');
else
save('mat/nass_stages.mat', 'micro_hexapod');
save('mat/nass_model_stages.mat', 'micro_hexapod');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_stages.mat', 'file')
save('matlab/mat/nass_stages.mat', 'micro_hexapod', '-append');
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'micro_hexapod', '-append');
else
save('matlab/mat/nass_stages.mat', 'micro_hexapod');
save('matlab/mat/nass_model_stages.mat', 'micro_hexapod');
end
end

View File

@ -157,7 +157,7 @@
case 'constant'
Dh = [args.Dh_pos, args.Dh_pos];
load('nass_stages.mat', 'micro_hexapod');
load('nass_model_stages.mat', 'micro_hexapod');
AP = [args.Dh_pos(1) ; args.Dh_pos(2) ; args.Dh_pos(3)];
@ -185,15 +185,15 @@
Dhl = struct('time', t, 'signals', struct('values', Dhl));
if exist('./mat', 'dir')
if exist('./mat/nass_references.mat', 'file')
save('mat/nass_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'args', 'Ts', '-append');
if exist('./mat/nass_model_references.mat', 'file')
save('mat/nass_model_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'args', 'Ts', '-append');
else
save('mat/nass_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'args', 'Ts');
save('mat/nass_model_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'args', 'Ts');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_references.mat', 'file')
save('matlab/mat/nass_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'args', 'Ts', '-append');
if exist('./matlab/mat/nass_model_references.mat', 'file')
save('matlab/mat/nass_model_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'args', 'Ts', '-append');
else
save('matlab/mat/nass_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'args', 'Ts');
save('matlab/mat/nass_model_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'args', 'Ts');
end
end

View File

@ -40,15 +40,15 @@
ry.C = [1e5; 1e5; 1e5; 3e4; 1e3; 3e4];
if exist('./mat', 'dir')
if exist('./mat/nass_stages.mat', 'file')
save('mat/nass_stages.mat', 'ry', '-append');
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'ry', '-append');
else
save('mat/nass_stages.mat', 'ry');
save('mat/nass_model_stages.mat', 'ry');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_stages.mat', 'file')
save('matlab/mat/nass_stages.mat', 'ry', '-append');
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'ry', '-append');
else
save('matlab/mat/nass_stages.mat', 'ry');
save('matlab/mat/nass_model_stages.mat', 'ry');
end
end

View File

@ -31,15 +31,15 @@
rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4];
if exist('./mat', 'dir')
if exist('./mat/nass_stages.mat', 'file')
save('mat/nass_stages.mat', 'rz', '-append');
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'rz', '-append');
else
save('mat/nass_stages.mat', 'rz');
save('mat/nass_model_stages.mat', 'rz');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_stages.mat', 'file')
save('matlab/mat/nass_stages.mat', 'rz', '-append');
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'rz', '-append');
else
save('matlab/mat/nass_stages.mat', 'rz');
save('matlab/mat/nass_model_stages.mat', 'rz');
end
end

View File

@ -13,15 +13,15 @@
end
if exist('./mat', 'dir')
if exist('./mat/conf_simscape.mat', 'file')
save('mat/conf_simscape.mat', 'conf_simscape', '-append');
if exist('./mat/nass_model_conf_simscape.mat', 'file')
save('mat/nass_model_conf_simscape.mat', 'conf_simscape', '-append');
else
save('mat/conf_simscape.mat', 'conf_simscape');
save('mat/nass_model_conf_simscape.mat', 'conf_simscape');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/conf_simscape.mat', 'file')
save('matlab/mat/conf_simscape.mat', 'conf_simscape', '-append');
if exist('./matlab/mat/nass_model_conf_simscape.mat', 'file')
save('matlab/mat/nass_model_conf_simscape.mat', 'conf_simscape', '-append');
else
save('matlab/mat/conf_simscape.mat', 'conf_simscape');
save('matlab/mat/nass_model_conf_simscape.mat', 'conf_simscape');
end
end

View File

@ -55,15 +55,15 @@
ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 1e4]; % [N/(m/s), N*m/(rad/s)]
if exist('./mat', 'dir')
if exist('./mat/nass_stages.mat', 'file')
save('mat/nass_stages.mat', 'ty', '-append');
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'ty', '-append');
else
save('mat/nass_stages.mat', 'ty');
save('mat/nass_model_stages.mat', 'ty');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_stages.mat', 'file')
save('matlab/mat/nass_stages.mat', 'ty', '-append');
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'ty', '-append');
else
save('matlab/mat/nass_stages.mat', 'ty');
save('matlab/mat/nass_model_stages.mat', 'ty');
end
end

Binary file not shown.

View File

@ -43,9 +43,9 @@
#+PROPERTY: header-args:latex+ :mkdirp yes
#+PROPERTY: header-args:latex+ :output-dir figs
#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png")
:END:
#+latex: \clearpage
:END:
* Build :noexport:
#+NAME: startblock
@ -314,6 +314,46 @@ Be able to pass custom =.mat= files (one mat file per disturbance)?
- Wait for Marc reply
** Backup - Kinematics
*** Micro-Station DoF table
#+name: tab:ustation_dof_summary
#+caption: Summary of the micro-station degrees-of-freedom
#+attr_latex: :environment tabularx :width \linewidth :align lX
#+attr_latex: :center t :booktabs t
| *Stage* | *Degrees of Freedom* |
|-------------------+-------------------------------------------------------|
| Translation stage | $D_y = \pm 10\,mm$ |
| Tilt stage | $R_y = \pm 3\,\text{deg}$ |
| Spindle | $R_z = 360\,\text{deg}$ |
| Micro Hexapod | $D_{xyz} = \pm 10\,mm$, $R_{xyz} = \pm 3\,\text{deg}$ |
*** Stage specifications
Translation Stage
| Axial Motion ($y$) | Radial Motion ($y-z$) | Rotation motion ($\theta-z$) |
|--------------------+-----------------------+------------------------------|
| $40nm$ repeat | $20nm$ | $< 1.7 \mu rad$ |
Tilt stage
| Axial Error ($y$) | Radial Error ($z$) | Tilt error ($R_y$) |
|-------------------+--------------------+--------------------|
| $0.5\mu m$ | $10nm$ | $5 \mu rad$ repeat |
Spindle
| Radial Error ($x$-$y$) | Vertical Error ($z$) | Rz |
|------------------------+----------------------+----------------------------|
| $0.33\mu m$ | $0.07\mu m$ | $5\,\mu \text{rad}$ repeat |
Micro Hexapod
| Motion | Stroke | Repetability | MIM | Stiffness |
|------------------+--------------+----------------+--------------+---------------|
| $T_{\mu_x}$ | $\pm10mm$ | $\pm1\mu m$ | $0.5\mu m$ | $>12N/\mu m$ |
| $T_{\mu_y}$ | $\pm10mm$ | $\pm1\mu m$ | $0.5\mu m$ | $>12N/\mu m$ |
| $T_{\mu_z}$ | $\pm10mm$ | $\pm1\mu m$ | $0.5\mu m$ | $>135N/\mu m$ |
| $\theta_{\mu_x}$ | $\pm3 deg$ | $\pm5 \mu rad$ | $2.5\mu rad$ | |
| $\theta_{\mu_y}$ | $\pm3 deg$ | $\pm5 \mu rad$ | $2.5\mu rad$ | |
| $\theta_{\mu_z}$ | $\pm0.5 deg$ | $\pm5 \mu rad$ | $2.5\mu rad$ | |
*** Frames
Let's define the following frames:
- $\{W\}$ the frame that is *fixed to the granite* and its origin at the theoretical meeting point between the X-ray and the spindle axis.
@ -833,17 +873,18 @@ xlim([2, 500]);
* Introduction :ignore:
Introduction...
#+name: tab:ustation_section_matlab_code
#+caption: Report sections and corresponding Matlab files
#+attr_latex: :environment tabularx :width 0.6\linewidth :align lX
#+attr_latex: :center t :booktabs t
| *Sections* | *Matlab File* |
|---------------------------------------+-----------------------------|
| Section ref:sec:ustation_kinematics | =ustation_1_kinematics.m= |
| Section ref:sec:ustation_modeling | =ustation_2_modeling.m= |
| Section ref:sec:ustation_disturbances | =ustation_3_disturbances.m= |
| Section ref:sec:ustation_experiments | =ustation_4_experiments.m= |
# #+name: tab:ustation_section_matlab_code
# #+caption: Report sections and corresponding Matlab files
# #+attr_latex: :environment tabularx :width 0.6\linewidth :align lX
# #+attr_latex: :center t :booktabs t
# | *Sections* | *Matlab File* |
# |---------------------------------------+-----------------------------|
# | Section ref:sec:ustation_kinematics | =ustation_1_kinematics.m= |
# | Section ref:sec:ustation_modeling | =ustation_2_modeling.m= |
# | Section ref:sec:ustation_disturbances | =ustation_3_disturbances.m= |
# | Section ref:sec:ustation_experiments | =ustation_4_experiments.m= |
* Micro-Station Kinematics
:PROPERTIES:
@ -854,26 +895,13 @@ xlim([2, 500]);
The micro-station consists of 4 stacked positioning stages (Figure ref:fig:ustation_cad_view).
From bottom to top, the stacked stages are the translation stage $D_y$, the tilt stage $R_y$, the rotation stage (Spindle) $R_z$ and the positioning hexapod.
Such stacked architecture allows high mobility, but the overall stiffness is reduced and the dynamics is very complex. complex dynamics.
The micro-station degrees-of-freedom are summarized in Table ref:tab:ustation_dof_summary.
#+name: fig:ustation_cad_view
#+caption: CAD view of the micro-station with the translation stage (in blue), the tilt stage (in red), the rotation stage (in yellow) and the positioning hexapod (in purple). On top of these four stages, a solid part (shown in green) will be replaced by the stabilization stage.
#+attr_latex: :width \linewidth
[[file:figs/ustation_cad_view.png]]
#+name: tab:ustation_dof_summary
#+caption: Summary of the micro-station degrees-of-freedom
#+attr_latex: :environment tabularx :width \linewidth :align lX
#+attr_latex: :center t :booktabs t
| *Stage* | *Degrees of Freedom* |
|-------------------+-------------------------------------------------------|
| Translation stage | $D_y = \pm 10\,mm$ |
| Tilt stage | $R_y = \pm 3\,\text{deg}$ |
| Spindle | $R_z = 360\,\text{deg}$ |
| Micro Hexapod | $D_{xyz} = \pm 10\,mm$, $R_{xyz} = \pm 3\,\text{deg}$ |
There are different ways of modelling the stage dynamics in a multi-body model.
The one chosen in this work consists of modelling each stage by two solid bodies connected by one 6-DoF joint.
The stiffness and damping properties of the joint can be tuned separately for each DoF.
@ -922,14 +950,6 @@ An optical linear encoder is used to measure the stage motion and for PID contro
Four cylindrical bearings[fn:4] are used to guide the motion (i.e. minimize the parasitic motions) and have high stiffness.
#+name: fig:ustation_ty_stage
#+caption: Translation Stage
[[file:figs/ustation_ty_stage.png]]
# | Axial Motion ($y$) | Radial Motion ($y-z$) | Rotation motion ($\theta-z$) |
# |--------------------+-----------------------+------------------------------|
# | $40nm$ repeat | $20nm$ | $< 1.7 \mu rad$ |
**** Tilt Stage
The tilt stage is guided by four linear motion guides[fn:1] which are placed such that the center of rotation coincide with the X-ray beam.
@ -940,13 +960,21 @@ This stage can also be used to tilt the rotation axis of the Spindle.
To precisely control the $R_y$ angle, a stepper motor as well as two optical encoders are used in a PID feedback loop.
#+attr_latex: :options [b]{0.48\linewidth}
#+begin_minipage
#+name: fig:ustation_ty_stage
#+caption: Translation Stage
#+attr_latex: :scale 1 :float nil
[[file:figs/ustation_ty_stage.png]]
#+end_minipage
\hfill
#+attr_latex: :options [b]{0.48\linewidth}
#+begin_minipage
#+name: fig:ustation_ry_stage
#+caption: Tilt Stage
#+attr_latex: :scale 1 :float nil
[[file:figs/ustation_ry_stage.png]]
# | Axial Error ($y$) | Radial Error ($z$) | Tilt error ($R_y$) |
# |-------------------+--------------------+--------------------|
# | $0.5\mu m$ | $10nm$ | $5 \mu rad$ repeat |
#+end_minipage
**** Spindle
@ -955,14 +983,6 @@ It is composed of an air bearing spindle[fn:2], whose angular position is contro
Additional rotary unions and slip-rings to be able to pass through the rotation many electrical signals and fluids and gazes.
#+name: fig:ustation_rz_stage
#+caption: Rotation Stage (Spindle)
[[file:figs/ustation_rz_stage.png]]
# | Radial Error ($x$-$y$) | Vertical Error ($z$) | Rz |
# |------------------------+----------------------+----------------------------|
# | $0.33\mu m$ | $0.07\mu m$ | $5\,\mu \text{rad}$ repeat |
**** Micro-Hexapod
Finally, a Stewart platform[fn:3] is used to position the sample.
@ -971,18 +991,21 @@ It includes a DC motor and an optical linear encoders in each of the six strut.
It is used to position the point of interest of the sample with respect to the spindle rotation axis.
It can also be used to precisely position the PoI vertically with respect to the x-ray.
#+attr_latex: :options [t]{0.49\linewidth}
#+begin_minipage
#+name: fig:ustation_rz_stage
#+caption: Rotation Stage (Spindle)
#+attr_latex: :scale 1 :float nil
[[file:figs/ustation_rz_stage.png]]
#+end_minipage
\hfill
#+attr_latex: :options [t]{0.49\linewidth}
#+begin_minipage
#+name: fig:ustation_hexapod_stage
#+caption: Micro Hexapod
#+attr_latex: :scale 1 :float nil
[[file:figs/ustation_hexapod_stage.png]]
# | Motion | Stroke | Repetability | MIM | Stiffness |
# |------------------+--------------+----------------+--------------+---------------|
# | $T_{\mu_x}$ | $\pm10mm$ | $\pm1\mu m$ | $0.5\mu m$ | $>12N/\mu m$ |
# | $T_{\mu_y}$ | $\pm10mm$ | $\pm1\mu m$ | $0.5\mu m$ | $>12N/\mu m$ |
# | $T_{\mu_z}$ | $\pm10mm$ | $\pm1\mu m$ | $0.5\mu m$ | $>135N/\mu m$ |
# | $\theta_{\mu_x}$ | $\pm3 deg$ | $\pm5 \mu rad$ | $2.5\mu rad$ | |
# | $\theta_{\mu_y}$ | $\pm3 deg$ | $\pm5 \mu rad$ | $2.5\mu rad$ | |
# | $\theta_{\mu_z}$ | $\pm0.5 deg$ | $\pm5 \mu rad$ | $2.5\mu rad$ | |
#+end_minipage
** Mathematical description of a rigid body motion
<<ssec:ustation_motion_description>>
@ -1789,13 +1812,13 @@ exportFig('figs/ustation_frf_compliance_Rxyz.pdf', 'width', 'half', 'height', 'n
#+caption: Measured FRF of the compliance of the micro-station expressed in frame $\{\mathcal{X}\}$. Both translation terms (\subref{fig:ustation_frf_compliance_xyz}) and rotational terms (\subref{fig:ustation_frf_compliance_Rxyz}) are displayed.
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:ustation_frf_compliance_xyz}sub caption a}
#+attr_latex: :caption \subcaption{\label{fig:ustation_frf_compliance_xyz}Compliance in translation}
#+attr_latex: :options {0.49\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
[[file:figs/ustation_frf_compliance_xyz.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:ustation_frf_compliance_Rxyz}sub caption b}
#+attr_latex: :caption \subcaption{\label{fig:ustation_frf_compliance_Rxyz}Compliance in rotation}
#+attr_latex: :options {0.49\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
@ -1886,13 +1909,13 @@ exportFig('figs/ustation_frf_compliance_Rxyz_model.pdf', 'width', 'half', 'heigh
#+caption: Measured FRF of the compliance of the micro-station expressed in frame $\{\mathcal{X}\}$. Both translation terms (\subref{fig:ustation_frf_compliance_xyz_model}) and rotational terms (\subref{fig:ustation_frf_compliance_Rxyz_model}) are displayed.
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:ustation_frf_compliance_xyz_model}sub caption a}
#+attr_latex: :caption \subcaption{\label{fig:ustation_frf_compliance_xyz_model}Compliance in translation}
#+attr_latex: :options {0.49\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
[[file:figs/ustation_frf_compliance_xyz_model.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:ustation_frf_compliance_Rxyz_model}sub caption b}
#+attr_latex: :caption \subcaption{\label{fig:ustation_frf_compliance_Rxyz_model}Compliance in rotation}
#+attr_latex: :options {0.49\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
@ -2606,6 +2629,10 @@ exportFig('figs/ustation_dist_source_ground_motion_time.pdf', 'width', 'third',
** Introduction :ignore:
In order to fully validate the micro-station multi-body model, two time domain simulations corresponding to typical use cases are performed.
First, a tomography experiment (i.e. a constant Spindle rotation) is performed and compared with experimental measurements (Section ref:sec:ustation_experiments_tomography).
Second, a constant velocity scans with the translation stage is performed and also compared with experimental data (Section ref:sec:ustation_experiments_ty_scans).
** Matlab Init :noexport:ignore:
#+begin_src matlab
@ -2628,16 +2655,23 @@ exportFig('figs/ustation_dist_source_ground_motion_time.pdf', 'width', 'third',
<<m-init-path-tangle>>
#+end_src
#+begin_src matlab :noweb yes
<<m-init-simscape>>
#+end_src
#+begin_src matlab :noweb yes
<<m-init-other>>
#+end_src
** Tomography Experiment
60rpm
ground motion + spindle vibrations
Measurement of the PoI position with respect to the granite
<<sec:ustation_experiments_tomography>>
To simulate a tomography experiment, the setpoint of the Spindle is configured to perform a constant rotation with a rotational velocity of 60rpm.
Both ground motion and spindle vibration disturbances are simulation based on what was computed in Section ref:sec:ustation_disturbances.
A radial offset of $\approx 1\,\mu m$ between the "point-of-interest" and the spindle's rotation axis is introduced to represent what is experimentally observed.
During the 10 second simulation (i.e. 10 spindle turns), the position of the "point-of-interest" with respect to the granite is recorded.
Results are shown in Figure ref:fig:ustation_errors_model_spindle.
Great match with measurements of Figure ref:fig:ustation_errors_spindle.
A good correlation with the measurements are observed both for radial errors (Figure ref:fig:ustation_errors_model_spindle_radial) and axial errors (Figure ref:fig:ustation_errors_model_spindle_axial).
#+begin_src matlab
%% Tomography experiment
@ -2705,8 +2739,8 @@ exportFig('figs/ustation_errors_model_spindle_radial.pdf', 'width', 'half', 'hei
%% Measured axial errors of the Spindle
figure;
hold on;
plot(spindle_errors.deg(1:100:end)/360, 1e9*spindle_errors.Dz(1:100:end), 'DisplayName', 'Measurements')
plot(exp_tomography.y.z.Time, 1e9*exp_tomography.y.z.Data, 'DisplayName', 'Simulation')
plot(spindle_errors.deg(1:100:end)/360, detrend(1e9*spindle_errors.Dz(1:100:end), 0), 'DisplayName', 'Measurements')
plot(exp_tomography.y.z.Time, detrend(1e9*exp_tomography.y.z.Data, 0), 'DisplayName', 'Simulation')
hold off;
xlabel('Rotation [turn]'); ylabel('Z displacement [nm]');
axis square
@ -2720,7 +2754,7 @@ exportFig('figs/ustation_errors_model_spindle_axial.pdf', 'width', 'half', 'heig
#+end_src
#+name: fig:ustation_errors_model_spindle
#+caption: Measurement of strut flexible modes
#+caption: Simulation results for a tomography experiment with a constant velocity of 60rpm. The comparison is made with measurements both for radial (\subref{fig:ustation_errors_model_spindle_radial}) and axial errors (\subref{fig:ustation_errors_model_spindle_axial}).
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:ustation_errors_model_spindle_radial}Radial error}
@ -2738,17 +2772,17 @@ exportFig('figs/ustation_errors_model_spindle_axial.pdf', 'width', 'half', 'heig
#+end_figure
** Raster Scans with the translation stage
<<sec:ustation_experiments_ty_scans>>
+/-5mm constant velocity scans.
ground motion + translation stage vibrations
Measurement of the PoI position with respect to the granite
Results are shown in Figure ref:fig:ustation_errors_model_spindle.
Great match with measurements of Figure ref:fig:ustation_errors_spindle.
A second experiment is performed in which the translation stage is scanned with a constant velocity.
The translation stage setpoint is configured to have a "triangular" shape with stroke of $\pm 4.5\, mm$.
Both ground motion and translation stage vibrations are included in the simulation.
Similar to what was performed for the tomography simulation, the PoI position with respect to the granite is recorded and compared with experimental measurements in Figure ref:fig:ustation_errors_model_dy_vertical.
Similar error amplitude can be observed, thus indicating that the multi-body model with included disturbances is accurately representing the micro-station behavior for typical scientific experiments.
#+begin_src matlab
%% Translation stage latteral scans
set_param(conf_simulink, 'StopTime', '4');
set_param(conf_simulink, 'StopTime', '2');
initializeGround();
initializeGranite();
@ -2772,27 +2806,32 @@ initializeDisturbances(...
initializeReferences(...
'Dy_type', 'triangular', ...
'Dy_amplitude', 5e-3, ...
'Dy_period', 4);
'Dy_amplitude', 4.5e-3, ...
'Dy_period', 2);
sim(mdl);
exp_latteral_scans = simout;
#+end_src
#+begin_src matlab
%% Load the experimentally measured errors
% Load the experimentally measured errors
ty_errors = load('ustation_errors_ty.mat');
% Compute best straight line to remove it from data
average_error = mean(ty_errors.ty_z')';
straight_line = average_error - detrend(average_error, 1);
% Only plot data for the scan from -4.5mm to 4.5mm
dy_setpoint = 1e3*exp_latteral_scans.y.y.Data(exp_latteral_scans.y.y.time > 0.5 & exp_latteral_scans.y.y.time < 1.5);
dz_error = detrend(1e6*exp_latteral_scans.y.z.Data(exp_latteral_scans.y.y.time > 0.5 & exp_latteral_scans.y.y.time < 1.5), 0);
#+end_src
#+begin_src matlab :exports none :results none
figure;
hold on;
plot(ty_errors.setpoint, ty_errors.ty_z(:,1) - straight_line, 'DisplayName', 'Measurement')
plot(1e3*exp_latteral_scans.y.y.Data, 1e6*exp_latteral_scans.y.z.Data, 'DisplayName', 'Simulation')
plot(ty_errors.setpoint, detrend(ty_errors.ty_z(:,1) - straight_line, 0), 'color', colors(1,:), 'DisplayName', 'Measurement')
% plot(ty_errors.setpoint, detrend(ty_errors.ty_z(:,[4,6]) - straight_line, 0), 'color', colors(1,:), 'HandleVisibility', 'off')
plot(dy_setpoint, dz_error, 'color', colors(2,:), 'DisplayName', 'Simulation')
hold off;
xlabel('$D_y$ position [mm]'); ylabel('Vertical error [$\mu$m]');
xlim([-5, 5]); ylim([-0.4, 0.4]);
@ -2800,13 +2839,14 @@ leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;
#+end_src
#+begin_src matlab :tangle no :exports results :results file none
#+begin_src matlab :tangle no :exports results :results file replace
xticks([-5:1:5]); yticks([-0.4:0.1:0.4]);
exportFig('figs/ustation_errors_model_dy_vertical.pdf', 'width', 'half', 'height', 'normal');
#+end_src
#+name: fig:ustation_errors_model_dy_vertical
#+caption: Figure caption
#+caption: Vertical errors during a constant velocity scan of the translation stage. Comparison of the measurements and simulated errors.
#+RESULTS:
[[file:figs/ustation_errors_model_dy_vertical.png]]
* Conclusion

Binary file not shown.

View File

@ -1,4 +1,4 @@
% Created 2024-11-06 Wed 12:01
% Created 2024-11-06 Wed 15:14
% Intended LaTeX compiler: pdflatex
\documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt}
@ -22,30 +22,16 @@
\maketitle
\tableofcontents
\clearpage
\begin{table}[htbp]
\centering
\begin{tabularx}{0.6\linewidth}{lX}
\toprule
\textbf{Sections} & \textbf{Matlab File}\\
\midrule
Section \ref{sec:ustation_kinematics} & \texttt{ustation\_1\_kinematics.m}\\
Section \ref{sec:ustation_modeling} & \texttt{ustation\_2\_modeling.m}\\
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}
Introduction\ldots{}
\end{table}
\chapter{Micro-Station Kinematics}
\label{sec:ustation_kinematics}
The micro-station consists of 4 stacked positioning stages (Figure \ref{fig:ustation_cad_view}).
From bottom to top, the stacked stages are the translation stage \(D_y\), the tilt stage \(R_y\), the rotation stage (Spindle) \(R_z\) and the positioning hexapod.
Such stacked architecture allows high mobility, but the overall stiffness is reduced and the dynamics is very complex. complex dynamics.
The micro-station degrees-of-freedom are summarized in Table \ref{tab:ustation_dof_summary}.
\begin{figure}[htbp]
\centering
@ -53,22 +39,6 @@ The micro-station degrees-of-freedom are summarized in Table \ref{tab:ustation_d
\caption{\label{fig:ustation_cad_view}CAD view of the micro-station with the translation stage (in blue), the tilt stage (in red), the rotation stage (in yellow) and the positioning hexapod (in purple). On top of these four stages, a solid part (shown in green) will be replaced by the stabilization stage.}
\end{figure}
\begin{table}[htbp]
\centering
\begin{tabularx}{\linewidth}{lX}
\toprule
\textbf{Stage} & \textbf{Degrees of Freedom}\\
\midrule
Translation stage & \(D_y = \pm 10\,mm\)\\
Tilt stage & \(R_y = \pm 3\,\text{deg}\)\\
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.
The one chosen in this work consists of modelling each stage by two solid bodies connected by one 6-DoF joint.
The stiffness and damping properties of the joint can be tuned separately for each DoF.
@ -87,13 +57,6 @@ An optical linear encoder is used to measure the stage motion and for PID contro
Four cylindrical bearings\footnote{Ball cage (N501) and guide bush (N550) from Mahr are used} are used to guide the motion (i.e. minimize the parasitic motions) and have high stiffness.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/ustation_ty_stage.png}
\caption{\label{fig:ustation_ty_stage}Translation Stage}
\end{figure}
\paragraph{Tilt Stage}
The tilt stage is guided by four linear motion guides\footnote{HCR 35 A C1, from THK} which are placed such that the center of rotation coincide with the X-ray beam.
@ -104,12 +67,19 @@ This stage can also be used to tilt the rotation axis of the Spindle.
To precisely control the \(R_y\) angle, a stepper motor as well as two optical encoders are used in a PID feedback loop.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/ustation_ry_stage.png}
\caption{\label{fig:ustation_ry_stage}Tilt Stage}
\end{figure}
\begin{minipage}[b]{0.48\linewidth}
\begin{center}
\includegraphics[scale=1,scale=1]{figs/ustation_ty_stage.png}
\captionof{figure}{\label{fig:ustation_ty_stage}Translation Stage}
\end{center}
\end{minipage}
\hfill
\begin{minipage}[b]{0.48\linewidth}
\begin{center}
\includegraphics[scale=1,scale=1]{figs/ustation_ry_stage.png}
\captionof{figure}{\label{fig:ustation_ry_stage}Tilt Stage}
\end{center}
\end{minipage}
\paragraph{Spindle}
@ -118,13 +88,6 @@ It is composed of an air bearing spindle\footnote{Made by LAB Motion Systems}, w
Additional rotary unions and slip-rings to be able to pass through the rotation many electrical signals and fluids and gazes.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/ustation_rz_stage.png}
\caption{\label{fig:ustation_rz_stage}Rotation Stage (Spindle)}
\end{figure}
\paragraph{Micro-Hexapod}
Finally, a Stewart platform\footnote{Modified Zonda Hexapod by Symetrie} is used to position the sample.
@ -133,12 +96,19 @@ It includes a DC motor and an optical linear encoders in each of the six strut.
It is used to position the point of interest of the sample with respect to the spindle rotation axis.
It can also be used to precisely position the PoI vertically with respect to the x-ray.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/ustation_hexapod_stage.png}
\caption{\label{fig:ustation_hexapod_stage}Micro Hexapod}
\end{figure}
\begin{minipage}[t]{0.49\linewidth}
\begin{center}
\includegraphics[scale=1,scale=1]{figs/ustation_rz_stage.png}
\captionof{figure}{\label{fig:ustation_rz_stage}Rotation Stage (Spindle)}
\end{center}
\end{minipage}
\hfill
\begin{minipage}[t]{0.49\linewidth}
\begin{center}
\includegraphics[scale=1,scale=1]{figs/ustation_hexapod_stage.png}
\captionof{figure}{\label{fig:ustation_hexapod_stage}Micro Hexapod}
\end{center}
\end{minipage}
\section{Mathematical description of a rigid body motion}
\label{ssec:ustation_motion_description}
@ -788,13 +758,21 @@ Examples of obtained time domain disturbance signals are shown in Figure \ref{fi
\chapter{Simulation of Scientific Experiments}
\label{sec:ustation_experiments}
\begin{itemize}
\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}
In order to fully validate the micro-station multi-body model, two time domain simulations corresponding to typical use cases are performed.
First, a tomography experiment (i.e. a constant Spindle rotation) is performed and compared with experimental measurements (Section \ref{sec:ustation_experiments_tomography}).
Second, a constant velocity scans with the translation stage is performed and also compared with experimental data (Section \ref{sec:ustation_experiments_ty_scans}).
\section{Tomography Experiment}
\label{sec:ustation_experiments_tomography}
To simulate a tomography experiment, the setpoint of the Spindle is configured to perform a constant rotation with a rotational velocity of 60rpm.
Both ground motion and spindle vibration disturbances are simulation based on what was computed in Section \ref{sec:ustation_disturbances}.
A radial offset of \(\approx 1\,\mu m\) between the ``point-of-interest'' and the spindle's rotation axis is introduced to represent what is experimentally observed.
During the 10 second simulation (i.e. 10 spindle turns), the position of the ``point-of-interest'' with respect to the granite is recorded.
Results are shown in Figure \ref{fig:ustation_errors_model_spindle}.
A good correlation with the measurements are observed both for radial errors (Figure \ref{fig:ustation_errors_model_spindle_radial}) and axial errors (Figure \ref{fig:ustation_errors_model_spindle_axial}).
\begin{figure}[htbp]
\begin{subfigure}{0.49\textwidth}
\begin{center}
@ -808,13 +786,36 @@ Examples of obtained time domain disturbance signals are shown in Figure \ref{fi
\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}
\caption{\label{fig:ustation_errors_model_spindle}Simulation results for a tomography experiment with a constant velocity of 60rpm. The comparison is made with measurements both for radial (\subref{fig:ustation_errors_model_spindle_radial}) and axial errors (\subref{fig:ustation_errors_model_spindle_axial}).}
\end{figure}
\section{Raster Scans with the translation stage}
\label{sec:ustation_experiments_ty_scans}
A second experiment is performed in which the translation stage is scanned with a constant velocity.
The translation stage setpoint is configured to have a ``triangular'' shape with stroke of \(\pm 4.5\, mm\).
Both ground motion and translation stage vibrations are included in the simulation.
Similar to what was performed for the tomography simulation, the PoI position with respect to the granite is recorded and compared with experimental measurements in Figure \ref{fig:ustation_errors_model_dy_vertical}.
Similar error amplitude can be observed, thus indicating that the multi-body model with included disturbances is accurately representing the micro-station behavior for typical scientific experiments.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/ustation_errors_model_dy_vertical.png}
\caption{\label{fig:ustation_errors_model_dy_vertical}Vertical errors during a constant velocity scan of the translation stage. Comparison of the measurements and simulated errors.}
\end{figure}
\chapter{Conclusion}
\label{sec:uniaxial_conclusion}
In order to have good model:
\begin{itemize}
\item kinematics
\item dynamics
\item disturbances
\end{itemize}
Validated with time domain simulations.
\printbibliography[heading=bibintoc,title={Bibliography}]
\end{document}