#+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: #+HTML_HEAD: #+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

This report is also available as a pdf.


#+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) <> #+end_src #+begin_src matlab :exports none :results silent :noweb yes <> #+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: <> ** 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) <> #+end_src #+begin_src matlab :exports none :results silent :noweb yes <> #+end_src #+begin_src matlab :tangle no :noweb yes <> #+end_src #+begin_src matlab :eval no :noweb yes <> #+end_src #+begin_src matlab :noweb yes <> #+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