407 lines
17 KiB
Org Mode
407 lines
17 KiB
Org Mode
|
#+TITLE: ESRF Double Crystal Monochromator - Metrology
|
||
|
:DRAWER:
|
||
|
#+LANGUAGE: en
|
||
|
#+EMAIL: dehaeze.thomas@gmail.com
|
||
|
#+AUTHOR: Dehaeze Thomas
|
||
|
|
||
|
#+HTML_LINK_HOME: ../index.html
|
||
|
#+HTML_LINK_UP: ../index.html
|
||
|
|
||
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||
|
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||
|
|
||
|
#+BIND: org-latex-image-default-option "scale=1"
|
||
|
#+BIND: org-latex-image-default-width ""
|
||
|
|
||
|
#+LaTeX_CLASS: scrreprt
|
||
|
#+LaTeX_CLASS_OPTIONS: [a4paper, 10pt, DIV=12, parskip=full]
|
||
|
#+LaTeX_HEADER_EXTRA: \input{preamble.tex}
|
||
|
#+LATEX_HEADER_EXTRA: \bibliography{ref}
|
||
|
|
||
|
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||
|
#+PROPERTY: header-args:matlab+ :comments org
|
||
|
#+PROPERTY: header-args:matlab+ :exports both
|
||
|
#+PROPERTY: header-args:matlab+ :results none
|
||
|
#+PROPERTY: header-args:matlab+ :tangle no
|
||
|
#+PROPERTY: header-args:matlab+ :eval no-export
|
||
|
#+PROPERTY: header-args:matlab+ :noweb yes
|
||
|
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
||
|
#+PROPERTY: header-args:matlab+ :output-dir figs
|
||
|
|
||
|
#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}")
|
||
|
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes
|
||
|
#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150
|
||
|
#+PROPERTY: header-args:latex+ :imoutoptions -quality 100
|
||
|
#+PROPERTY: header-args:latex+ :results file raw replace
|
||
|
#+PROPERTY: header-args:latex+ :buffer no
|
||
|
#+PROPERTY: header-args:latex+ :tangle no
|
||
|
#+PROPERTY: header-args:latex+ :eval no-export
|
||
|
#+PROPERTY: header-args:latex+ :exports results
|
||
|
#+PROPERTY: header-args:latex+ :mkdirp yes
|
||
|
#+PROPERTY: header-args:latex+ :output-dir figs
|
||
|
#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png")
|
||
|
:END:
|
||
|
|
||
|
#+begin_export html
|
||
|
<hr>
|
||
|
<p>This report is also available as a <a href="./dcm_lookup_tables.pdf">pdf</a>.</p>
|
||
|
<hr>
|
||
|
#+end_export
|
||
|
|
||
|
#+latex: \clearpage
|
||
|
|
||
|
* Metrology Concept
|
||
|
** Introduction :ignore:
|
||
|
|
||
|
The goal of the metrology system is to measure the distance and default of parallelism orientation between the first and second crystals
|
||
|
|
||
|
Only 3 degrees of freedom are of interest:
|
||
|
- $d_z$
|
||
|
- $r_y$
|
||
|
- $r_x$
|
||
|
|
||
|
** Matlab Init :noexport:ignore:
|
||
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||
|
<<matlab-dir>>
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||
|
<<matlab-init>>
|
||
|
#+end_src
|
||
|
|
||
|
** Sensor Topology
|
||
|
|
||
|
In order to measure the relative pose of the two crystals, instead of performing a direct measurement which is complicated, the pose of the two crystals are measured from a metrology frame.
|
||
|
Three interferometers are used to measured the 3dof of interest for each crystals.
|
||
|
Three additional interferometers are used to measured the relative motion of the metrology frame.
|
||
|
|
||
|
#+name: tab:metrology_notations
|
||
|
#+caption: Notations for the metrology frame
|
||
|
#+attr_latex: :environment tabularx :width 0.4\linewidth :align cX
|
||
|
#+attr_latex: :center t :booktabs t
|
||
|
| Notation | Meaning |
|
||
|
|----------+--------------------------|
|
||
|
| =d= | "Downstream": Positive X |
|
||
|
| =u= | "Upstream": Negative X |
|
||
|
| =h= | "Hall": Positive Y |
|
||
|
| =r= | "Ring": Negative Y |
|
||
|
| =f= | "Frame" |
|
||
|
| =1= | "First Crystals" |
|
||
|
| =2= | "Second Crystals" |
|
||
|
|
||
|
#+name: fig:metrology_schematic
|
||
|
#+caption: Schematic of the Metrology System
|
||
|
[[file:figs/metrology_schematic.png]]
|
||
|
|
||
|
** Crystal's motion computation
|
||
|
|
||
|
From the raw interferometric measurements, the pose between the first and second crystals can be computed.
|
||
|
|
||
|
First, Jacobian matrices can be used to convert raw interferometer measurements to axial displacement and orientation of the crystals and metrology frame.
|
||
|
|
||
|
For the 311 crystals:
|
||
|
|
||
|
#+name: tab:311_crystals_notations_raw_interf
|
||
|
#+caption: Table caption
|
||
|
#+attr_latex: :environment tabularx :width 0.5\linewidth :align lX
|
||
|
#+attr_latex: :center t :booktabs t
|
||
|
| Notation | Description |
|
||
|
|----------+-----------------------------------|
|
||
|
| =um= | Metrology Frame - Upstream |
|
||
|
| =dhm= | Metrology Frame - Downstream Hall |
|
||
|
| =drm= | Metrology Frame - Downstream Ring |
|
||
|
|----------+-----------------------------------|
|
||
|
| =ur1= | First Crystal - Upstream Ring |
|
||
|
| =h1= | First Crystal - Hall |
|
||
|
| =dr1= | First Crystal - Downstream Ring |
|
||
|
|----------+-----------------------------------|
|
||
|
| =ur2= | First Crystal - Upstream Ring |
|
||
|
| =h2= | First Crystal - Hall |
|
||
|
| =dr2= | First Crystal - Downstream Ring |
|
||
|
|
||
|
#+name: tab:311_crystals_notations_converted_interf
|
||
|
#+caption: Table caption
|
||
|
#+attr_latex: :environment tabularx :width 0.5\linewidth :align lX
|
||
|
#+attr_latex: :center t :booktabs t
|
||
|
| Notation | Description |
|
||
|
|----------+--------------------------------|
|
||
|
| =dzm= | Positive: increase of distance |
|
||
|
| =rym= | |
|
||
|
| =rxm= | |
|
||
|
|----------+--------------------------------|
|
||
|
| =dz1= | Positive: decrease of distance |
|
||
|
| =ry1= | |
|
||
|
| =rx1= | |
|
||
|
|----------+--------------------------------|
|
||
|
| =dz2= | Positive: increase of distance |
|
||
|
| =ry2= | |
|
||
|
| =rx2= | |
|
||
|
|
||
|
#+begin_src latex :file schematic_sensor_jacobian_forward_kinematics_m.pdf
|
||
|
\begin{tikzpicture}
|
||
|
% Blocs
|
||
|
\node[block] (Js_inv) {$\bm{J}_{s,m}^{-1}$};
|
||
|
|
||
|
% Connections and labels
|
||
|
\draw[->] ($(Js_inv.west)+(-1.5,0)$) node[above right]{$\begin{bmatrix} u_{m} \\ dh_{m} \\ dr_{m} \end{bmatrix}$} -- (Js_inv.west);
|
||
|
\draw[->] (Js_inv.east) -- ++(1.5, 0) node[above left]{$\begin{bmatrix} d_{zm} \\ r_{ym} \\ r_{xm} \end{bmatrix}$};
|
||
|
\end{tikzpicture}
|
||
|
#+end_src
|
||
|
|
||
|
#+name: fig:schematic_sensor_jacobian_forward_kinematics_m
|
||
|
#+caption: Forward Kinematics for the Metrology frame
|
||
|
#+RESULTS:
|
||
|
[[file:figs/schematic_sensor_jacobian_forward_kinematics_m.png]]
|
||
|
|
||
|
#+begin_src latex :file schematic_sensor_jacobian_forward_kinematics_1.pdf
|
||
|
\begin{tikzpicture}
|
||
|
% Blocs
|
||
|
\node[block] (Js_inv) {$\bm{J}_{s,1}^{-1}$};
|
||
|
|
||
|
% Connections and labels
|
||
|
\draw[->] ($(Js_inv.west)+(-1.5,0)$) node[above right]{$\begin{bmatrix} u_{r1} \\ h_1 \\ d_{r1} \end{bmatrix}$} -- (Js_inv.west);
|
||
|
\draw[->] (Js_inv.east) -- ++(1.5, 0) node[above left]{$\begin{bmatrix} d_{z1} \\ r_{y1} \\ r_{x1} \end{bmatrix}$};
|
||
|
\end{tikzpicture}
|
||
|
#+end_src
|
||
|
|
||
|
#+name: fig:schematic_sensor_jacobian_forward_kinematics_1
|
||
|
#+caption: Forward Kinematics for the 1st crystal
|
||
|
#+RESULTS:
|
||
|
[[file:figs/schematic_sensor_jacobian_forward_kinematics_1.png]]
|
||
|
|
||
|
#+begin_src latex :file schematic_sensor_jacobian_forward_kinematics_2.pdf
|
||
|
\begin{tikzpicture}
|
||
|
% Blocs
|
||
|
\node[block] (Js_inv) {$\bm{J}_{s,2}^{-1}$};
|
||
|
|
||
|
% Connections and labels
|
||
|
\draw[->] ($(Js_inv.west)+(-1.5,0)$) node[above right]{$\begin{bmatrix} u_{r2} \\ h_2 \\ d_{r2} \end{bmatrix}$} -- (Js_inv.west);
|
||
|
\draw[->] (Js_inv.east) -- ++(1.5, 0) node[above left]{$\begin{bmatrix} d_{z2} \\ r_{y2} \\ r_{x2} \end{bmatrix}$};
|
||
|
\end{tikzpicture}
|
||
|
#+end_src
|
||
|
|
||
|
#+name: fig:schematic_sensor_jacobian_forward_kinematics_2
|
||
|
#+caption: Forward Kinematics for the 2nd crystal
|
||
|
#+RESULTS:
|
||
|
[[file:figs/schematic_sensor_jacobian_forward_kinematics_2.png]]
|
||
|
|
||
|
Then, the displacement and orientations can be combined as follows:
|
||
|
\begin{align}
|
||
|
d_{z} &= + d_{z1} - d_{z2} + d_{zm} \\
|
||
|
d_{r_y} &= - r_{y1} + r_{y2} - r_{ym} \\
|
||
|
d_{r_x} &= - r_{x1} + r_{x2} - r_{xm}
|
||
|
\end{align}
|
||
|
|
||
|
Therefore:
|
||
|
- $d_z$ represents the distance between the two crystals
|
||
|
- $d_{r_y}$ represents the rotation of the second crystal w.r.t. the first crystal around $y$ axis
|
||
|
- $d_{r_x}$ represents the rotation of the second crystal w.r.t. the first crystal around $x$ axis
|
||
|
|
||
|
If $d_{r_y}$ is positive, the second crystal has a positive rotation around $y$ w.r.t. the first crystal.
|
||
|
Therefore, the second crystal should be actuated such that it is making a negative rotation around $y$ w.r.t. metrology frame.
|
||
|
|
||
|
The Jacobian matrices are defined as follow:
|
||
|
#+begin_src matlab
|
||
|
%% Sensor Jacobian matrix for the metrology frame
|
||
|
J_m = [1, 0.102, 0
|
||
|
1, -0.088, 0.1275
|
||
|
1, -0.088, -0.1275];
|
||
|
|
||
|
%% Sensor Jacobian matrix for 1st "111" crystal
|
||
|
J_s_111_1 = [-1, -0.036, -0.015
|
||
|
-1, 0, 0.015
|
||
|
-1, 0.036, -0.015];
|
||
|
|
||
|
%% Sensor Jacobian matrix for 2nd "111" crystal
|
||
|
J_s_111_2 = [1, 0.07, 0.015
|
||
|
1, 0, -0.015
|
||
|
1, -0.07, 0.015];
|
||
|
#+end_src
|
||
|
|
||
|
Therefore, the matrix that gives the relative pose of the crystal from the 9 interferometers is:
|
||
|
#+begin_src matlab
|
||
|
%% Compute the transformation matrix
|
||
|
G_111_t = [-inv(J_s_111_1), inv(J_s_111_2), -inv(J_m)];
|
||
|
|
||
|
% Sign convention for the axial motion
|
||
|
G_111_t(1,:) = -G_111_t(1,:);
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
|
||
|
data2orgtable(G_111_t, ...
|
||
|
{'=dz= [nm]', '=rx= [nrad]', '=ry= [nrad]'}, ...
|
||
|
{'=ur1= [nm]', '=h1= [nm]', '=dr1= [nm]', '=ur2= [nm]', '=h2= [nm]', '=dr1= [nm]', '=um= [nm]', '=dhm= [nm]', '=drm= [nm]'}, ...
|
||
|
' %.3f ');
|
||
|
#+end_src
|
||
|
|
||
|
#+name: tab:transformation_matrix
|
||
|
#+caption: Transformation Matrix
|
||
|
#+attr_latex: :environment tabularx :width \linewidth :align cccccccccc
|
||
|
#+attr_latex: :center t :booktabs t :font \scriptsize
|
||
|
#+RESULTS:
|
||
|
| | =ur1= [nm] | =h1= [nm] | =dr1= [nm] | =ur2= [nm] | =h2= [nm] | =dr1= [nm] | =um= [nm] | =dhm= [nm] | =drm= [nm] |
|
||
|
|-------------+------------+-----------+------------+------------+-----------+------------+-----------+------------+------------|
|
||
|
| =dz= [nm] | -0.25 | -0.5 | -0.25 | -0.25 | -0.5 | -0.25 | 0.463 | 0.268 | 0.268 |
|
||
|
| =rx= [nrad] | 13.889 | 0.0 | -13.889 | 7.143 | 0.0 | -7.143 | -5.263 | 2.632 | 2.632 |
|
||
|
| =ry= [nrad] | 16.667 | -33.333 | 16.667 | 16.667 | -33.333 | 16.667 | 0.0 | -3.922 | 3.922 |
|
||
|
|
||
|
From table [[fig:schematic_sensor_jacobian_forward_kinematics_2]], we can determine the effect of each interferometer on the estimated relative pose between the crystals.
|
||
|
For instance, an error on =dr1= will have much greater impact on =ry= than an error on =drm=.
|
||
|
|
||
|
* Deformations of the Metrology Frame
|
||
|
** Introduction :ignore:
|
||
|
|
||
|
The transformation matrix in Table [[fig:schematic_sensor_jacobian_forward_kinematics_2]] is valid only if the metrology frames are solid bodies.
|
||
|
|
||
|
The metrology frame itself is experiencing some deformations due to the gravity.
|
||
|
When the bragg axis is scanned, the effect of gravity on the metrology frame is changing and this introduce some measurement errors.
|
||
|
|
||
|
This can be calibrated.
|
||
|
|
||
|
** Measurement Setup
|
||
|
|
||
|
Two beam viewers:
|
||
|
- one close to the DCM to measure position of the beam
|
||
|
- one far away to the DCM to measure orientation of the beam
|
||
|
|
||
|
For each Bragg angle, the Fast Jacks are actuated to that the beam is at the center of the beam viewer.
|
||
|
Then, then position of the crystals as measured by the interferometers is recorded.
|
||
|
This position is the wanted position for a given Bragg angle.
|
||
|
|
||
|
** Simulations
|
||
|
|
||
|
The deformations of the metrology frame and therefore the expected interferometric measurements can be computed as a function of the Bragg angle.
|
||
|
This may be done using FE software.
|
||
|
|
||
|
** Comparison
|
||
|
|
||
|
* Attocube - Periodic Non-Linearity
|
||
|
:PROPERTIES:
|
||
|
:header-args:matlab+: :tangle matlab/dcm_attocube_lut.m
|
||
|
:END:
|
||
|
<<sec:dcm_attocube_lut>>
|
||
|
|
||
|
** Introduction :ignore:
|
||
|
|
||
|
The idea is to calibrate the periodic non-linearity of the interferometers, a known displacement must be imposed and the interferometer output compared to this displacement.
|
||
|
This should be performed over several periods in order to characterize the error.
|
||
|
|
||
|
We here suppose that we are already in the frame of the Attocube (the fast-jack displacements are converted to Attocube displacement using the transformation matrices).
|
||
|
We also suppose that we are at a certain Bragg angle, and that the stepper motors are not moving: only the piezoelectric actuators are used.
|
||
|
|
||
|
The setup is schematically with the block diagram in Figure [[fig:block_diagram_lut_attocube]].
|
||
|
The signals are:
|
||
|
- $u$: Actuator Signal (position where we wish to go)
|
||
|
- $d$: Disturbances affecting the signal
|
||
|
- $y$: Displacement of the crystal
|
||
|
- $y_g$: Measurement of the crystal motion by the strain gauge with some noise $n_g$
|
||
|
- $y_a$: Measurement of the crystal motion by the interferometer with some noise $n_a$
|
||
|
|
||
|
#+begin_src latex :file block_diagram_lut_attocube.pdf
|
||
|
\definecolor{myblue}{rgb}{0, 0.447, 0.741}
|
||
|
\definecolor{myred}{rgb}{0.8500, 0.325, 0.098}
|
||
|
|
||
|
\begin{tikzpicture}
|
||
|
\node[block] (G) at (0,0){$G(s)$};
|
||
|
\node[addb, right=1 of G] (addd) {};
|
||
|
\node[block, align=center, right=1 of addd] (non_linearity) {Periodic\\Non-linearity};
|
||
|
\node[addb, right=1 of non_linearity] (addna) {};
|
||
|
\node[addb, below=1.8 of addna] (addnsg) {};
|
||
|
|
||
|
\draw[->] ($(G.west) + (-1.0, 0)$) node[above right]{$u$} -- (G.west);
|
||
|
\draw[->] (G.east) -- (addd.west);
|
||
|
\draw[->] (addd.east) -- (non_linearity.west);
|
||
|
\draw[->] ($(addd.north) + (0, 1.0)$) node[below right]{$d$} -- (addd.north);
|
||
|
\draw[->] (non_linearity.east) -- (addna.west);
|
||
|
\draw[->] (addna.east) -- ++(1.2, 0) node[above left]{$y_a$};
|
||
|
\draw[->] ($(addna.north) + (0, 1.0)$) node[below right](na){$n_a$} -- (addna.north);
|
||
|
\draw[->] ($(addd.east) + (0.4, 0)$)node[branch]{} node[above]{$y$} |- (addnsg.west);
|
||
|
\draw[->] (addnsg.east) -- ++(1.2, 0) node[above left]{$y_g$};
|
||
|
\draw[->] ($(addnsg.north) + (0, 1.0)$) node[below right](nsg){$n_{g}$} -- (addnsg.north);
|
||
|
|
||
|
\begin{scope}[on background layer]
|
||
|
\node[fit={(non_linearity.south west) (na.north east)}, fill=myblue!20!white, draw, inner sep=6pt] (attocube) {};
|
||
|
\node[fit={(non_linearity.west|-addnsg.south) (nsg.north east)}, fill=myred!20!white, draw, inner sep=6pt] (straingauge) {};
|
||
|
\node[below right] at (attocube.north west) {Attocube};
|
||
|
\node[below right] at (straingauge.north west) {Strain Gauge};
|
||
|
\end{scope}
|
||
|
\end{tikzpicture}
|
||
|
#+end_src
|
||
|
|
||
|
#+name: fig:block_diagram_lut_attocube
|
||
|
#+caption: Block Diagram schematic of the setup used to measure the periodic non-linearity of the Attocube
|
||
|
#+RESULTS:
|
||
|
[[file:figs/block_diagram_lut_attocube.png]]
|
||
|
|
||
|
The problem is to estimate the periodic non-linearity of the Attocube from the imperfect measurements $y_a$ and $y_g$.
|
||
|
|
||
|
The wavelength of the Attocube is 1530nm, therefore the non-linearity has a period of 765nm.
|
||
|
The amplitude of the non-linearity can vary from one unit to the other (and maybe from one experimental condition to the other).
|
||
|
It is typically between 5nm peak to peak and 20nm peak to peak.
|
||
|
|
||
|
** Matlab Init :noexport:ignore:
|
||
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||
|
<<matlab-dir>>
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||
|
<<matlab-init>>
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src matlab :tangle no :noweb yes
|
||
|
<<m-init-path>>
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src matlab :eval no :noweb yes
|
||
|
<<m-init-path-tangle>>
|
||
|
#+end_src
|
||
|
|
||
|
#+begin_src matlab :noweb yes
|
||
|
<<m-init-other>>
|
||
|
#+end_src
|
||
|
|
||
|
** Simulations
|
||
|
We have some constrains on the way the motion is imposed and measured:
|
||
|
- We want the frequency content of the imposed motion to be at low frequency in order not to induce vibrations of the structure.
|
||
|
We have to make sure the forces applied by the piezoelectric actuator only moves the crystal and not the fast jack below.
|
||
|
Therefore, we have to move much slower than the first resonance frequency in the system.
|
||
|
- As both $y_a$ and $y_g$ should have rather small noise, we have to filter them with low pass filters.
|
||
|
The cut-off frequency of the low pass filter should be high as compared to the motion (to not induce any distortion) but still reducing sufficiently the noise.
|
||
|
Let's say we want the noise to be less than 1nm ($6 \sigma$).
|
||
|
|
||
|
Suppose we have the power spectral density (PSD) of both $n_a$ and $n_g$.
|
||
|
|
||
|
- [ ] Take the PSD of the Attocube
|
||
|
- [ ] Take the PSD of the strain gauge
|
||
|
- [ ] Using 2nd order low pass filter, estimate the required low pass filter cut-off frequency to have sufficiently low noise
|
||
|
|
||
|
* Helping Functions :noexport:
|
||
|
** Initialize Path
|
||
|
#+NAME: m-init-path
|
||
|
#+BEGIN_SRC matlab
|
||
|
%% Path for functions, data and scripts
|
||
|
addpath('./matlab/mat/'); % Path for data
|
||
|
addpath('./matlab/src/'); % Path for functions
|
||
|
addpath('./matlab/'); % Path for scripts
|
||
|
#+END_SRC
|
||
|
|
||
|
#+NAME: m-init-path-tangle
|
||
|
#+BEGIN_SRC matlab
|
||
|
%% Path for functions, data and scripts
|
||
|
addpath('./mat/'); % Path for data
|
||
|
addpath('./src/'); % Path for functions
|
||
|
#+END_SRC
|
||
|
|
||
|
** Initialize other elements
|
||
|
#+NAME: m-init-other
|
||
|
#+BEGIN_SRC matlab
|
||
|
%% Colors for the figures
|
||
|
colors = colororder;
|
||
|
|
||
|
%% Frequency Vector
|
||
|
freqs = logspace(1, 3, 1000);
|
||
|
#+END_SRC
|
||
|
|
||
|
* Bibliography :ignore:
|
||
|
#+latex: \printbibliography
|