Commit before modification for PhD thesis

This commit is contained in:
Thomas Dehaeze 2024-03-19 15:24:51 +01:00
parent 88c0158d8b
commit 268923286d
79 changed files with 3609 additions and 54 deletions

304
.gitignore vendored
View File

@ -1,52 +1,260 @@
auto/
*.tex
*.bbl
*.synctex.gz
.auctex-auto/
_minted*
# Emacs
auto/
# Simulink Real Time
*bio.m
*pt.m
*ref.m
*ri.m
*xcp.m
*.mldatx
*.slxc
*.xml
*_slrt_rtw/
# data
data/
# Windows default autosave extension
*.asv
# OSX / *nix default autosave extension
*.m~
# Compiled MEX binaries (all platforms)
*.mex*
# Packaged app and toolbox files
*.mlappinstall
*.mltbx
# Generated helpsearch folders
helpsearch*/
# Simulink code generation folders
mat/
figures/
ltximg/
slprj/
sccprj/
matlab/slprj/
*.slxc
# Matlab code generation folders
codegen/
# Simulink autosave extension
*.autosave
# ============================================================
# ============================================================
# LATEX
# ============================================================
# ============================================================
# Octave session info
octave-workspace
## Core latex/pdflatex auxiliary files:
*.aux
*.lof
*.log
*.lot
*.fls
*.out
*.toc
*.fmt
*.fot
*.cb
*.cb2
.*.lb
## Intermediate documents:
*.dvi
*.xdv
*-converted-to.*
# these rules might exclude image files for figures etc.
# *.ps
# *.eps
# *.pdf
## Generated if empty string is given at "Please type another file name for output:"
.pdf
## Bibliography auxiliary files (bibtex/biblatex/biber):
*.bbl
*.bcf
*.blg
*-blx.aux
*-blx.bib
*.run.xml
## Build tool auxiliary files:
*.fdb_latexmk
*.synctex
*.synctex(busy)
*.synctex.gz
*.synctex.gz(busy)
*.pdfsync
## Build tool directories for auxiliary files
# latexrun
latex.out/
## Auxiliary and intermediate files from other packages:
# algorithms
*.alg
*.loa
# achemso
acs-*.bib
# amsthm
*.thm
# beamer
*.nav
*.pre
*.snm
*.vrb
# changes
*.soc
# cprotect
*.cpt
# elsarticle (documentclass of Elsevier journals)
*.spl
# endnotes
*.ent
# fixme
*.lox
# feynmf/feynmp
*.mf
*.mp
*.t[1-9]
*.t[1-9][0-9]
*.tfm
#(r)(e)ledmac/(r)(e)ledpar
*.end
*.?end
*.[1-9]
*.[1-9][0-9]
*.[1-9][0-9][0-9]
*.[1-9]R
*.[1-9][0-9]R
*.[1-9][0-9][0-9]R
*.eledsec[1-9]
*.eledsec[1-9]R
*.eledsec[1-9][0-9]
*.eledsec[1-9][0-9]R
*.eledsec[1-9][0-9][0-9]
*.eledsec[1-9][0-9][0-9]R
# glossaries
*.acn
*.acr
*.glg
*.glo
*.gls
*.glsdefs
# gnuplottex
*-gnuplottex-*
# gregoriotex
*.gaux
*.gtex
# htlatex
*.4ct
*.4tc
*.idv
*.lg
*.trc
*.xref
# hyperref
*.brf
# knitr
*-concordance.tex
# TODO Comment the next line if you want to keep your tikz graphics files
*.tikz
*-tikzDictionary
# listings
*.lol
# makeidx
*.idx
*.ilg
*.ind
*.ist
# minitoc
*.maf
*.mlf
*.mlt
*.mtc[0-9]*
*.slf[0-9]*
*.slt[0-9]*
*.stc[0-9]*
# minted
_minted*
*.pyg
# morewrites
*.mw
# nomencl
*.nlg
*.nlo
*.nls
# pax
*.pax
# pdfpcnotes
*.pdfpc
# sagetex
*.sagetex.sage
*.sagetex.py
*.sagetex.scmd
# scrwfile
*.wrt
# sympy
*.sout
*.sympy
sympy-plots-for-*.tex/
# pdfcomment
*.upa
*.upb
# pythontex
*.pytxcode
pythontex-files-*/
# thmtools
*.loe
# TikZ & PGF
*.dpth
*.md5
*.auxlock
# todonotes
*.tdo
# easy-todo
*.lod
# xmpincl
*.xmpi
# xindy
*.xdy
# xypic precompiled matrices
*.xyc
# endfloat
*.ttt
*.fff
# Latexian
TSWLatexianTemp*
## Editors:
# WinEdt
*.bak
*.sav
# Texpad
.texpadtmp
# LyX
*.lyx~
# Kile
*.backup
# KBibTeX
*~[0-9]*
# auto folder when using emacs and auctex
./auto/*
*.el
# expex forward references with \gathertags
*-tags.tex
# standalone packages
*.sta

111
.latexmkrc Normal file
View File

@ -0,0 +1,111 @@
#!/bin/env perl
# Shebang is only to get syntax highlighting right across GitLab, GitHub and IDEs.
# This file is not meant to be run, but read by `latexmk`.
# ======================================================================================
# Perl `latexmk` configuration file
# ======================================================================================
# ======================================================================================
# PDF Generation/Building/Compilation
# ======================================================================================
@default_files=('test-bench-nass-spindle.tex');
# PDF-generating modes are:
# 1: pdflatex, as specified by $pdflatex variable (still largely in use)
# 2: postscript conversion, as specified by the $ps2pdf variable (useless)
# 3: dvi conversion, as specified by the $dvipdf variable (useless)
# 4: lualatex, as specified by the $lualatex variable (best)
# 5: xelatex, as specified by the $xelatex variable (second best)
$pdf_mode = 1;
# Treat undefined references and citations as well as multiply defined references as
# ERRORS instead of WARNINGS.
# This is only checked in the *last* run, since naturally, there are undefined references
# in initial runs.
# This setting is potentially annoying when debugging/editing, but highly desirable
# in the CI pipeline, where such a warning should result in a failed pipeline, since the
# final document is incomplete/corrupted.
#
# However, I could not eradicate all warnings, so that `latexmk` currently fails with
# this option enabled.
# Specifically, `microtype` fails together with `fontawesome`/`fontawesome5`, see:
# https://tex.stackexchange.com/a/547514/120853
# The fix in that answer did not help.
# Setting `verbose=silent` to mute `microtype` warnings did not work.
# Switching between `fontawesome` and `fontawesome5` did not help.
$warnings_as_errors = 0;
# Show used CPU time. Looks like: https://tex.stackexchange.com/a/312224/120853
$show_time = 1;
# Default is 5; we seem to need more owed to the complexity of the document.
# Actual documents probably don't need this many since they won't use all features,
# plus won't be compiling from cold each time.
$max_repeat=7;
# --shell-escape option (execution of code outside of latex) is required for the
#'svg' package.
# It converts raw SVG files to the PDF+PDF_TEX combo using InkScape.
#
# SyncTeX allows to jump between source (code) and output (PDF) in IDEs with support
# (many have it). A value of `1` is enabled (gzipped), `-1` is enabled but uncompressed,
# `0` is off.
# Testing in VSCode w/ LaTeX Workshop only worked for the compressed version.
# Adjust this as needed. Of course, only relevant for local use, no effect on a remote
# CI pipeline (except for slower compilation, probably).
#
# %O and %S will forward Options and the Source file, respectively, given to latexmk.
#
# `set_tex_cmds` applies to all *latex commands (latex, xelatex, lualatex, ...), so
# no need to specify these each. This allows to simply change `$pdf_mode` to get a
# different engine. Check if this works with `latexmk --commands`.
set_tex_cmds("--shell-escape -interaction=nonstopmode --synctex=1 %O %S");
# Use default pdf viewer
$pdf_previewer = 'zathura';
# option 2 is same as 1 (run biber when necessary), but also deletes the
# regeneratable bbl-file in a clenaup (`latexmk -c`). Do not use if original
# bib file is not available!
$bibtex_use = 2; # default: 1
# Change default `biber` call, help catch errors faster/clearer. See
# https://web.archive.org/web/20200526101657/https://www.semipol.de/2018/06/12/latex-best-practices.html#database-entries
$biber = "biber --validate-datamodel %O %S";
# Glossaries
add_cus_dep('glo', 'gls', 0, 'run_makeglossaries');
add_cus_dep('acn', 'acr', 0, 'run_makeglossaries');
sub run_makeglossaries {
if ( $silent ) {
system "makeglossaries -q -s '$_[0].ist' '$_[0]'";
}
else {
system "makeglossaries -s '$_[0].ist' '$_[0]'";
};
}
# ======================================================================================
# Auxiliary Files
# ======================================================================================
# Let latexmk know about generated files, so they can be used to detect if a
# rerun is required, or be deleted in a cleanup.
# loe: List of Examples (KOMAScript)
# lol: List of Listings (`listings` and `minted` packages)
# run.xml: biber runs
# glg: glossaries log
# glstex: generated from glossaries-extra
push @generated_exts, 'loe', 'lol', 'run.xml', 'glstex', 'glo', 'gls', 'glg', 'acn', 'acr', 'alg';
# Also delete the *.glstex files from package glossaries-extra. Problem is,
# that that package generates files of the form "basename-digit.glstex" if
# multiple glossaries are present. Latexmk looks for "basename.glstex" and so
# does not find those. For that purpose, use wildcard.
# Also delete files generated by gnuplot/pgfplots contour plots
# (.dat, .script, .table).
$clean_ext = "%R-*.glstex %R_contourtmp*.*";

Binary file not shown.

BIN
doc/PD200-V7-R1.pdf Normal file

Binary file not shown.

BIN
doc/m12_f40_schematic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
doc/sea-0013-dual.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
figs/dz_motion_rotation.pdf Normal file

Binary file not shown.

BIN
figs/dz_motion_rotation.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
figs/lab_elmo_issue.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 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: 74 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

137
preamble.tex Normal file
View File

@ -0,0 +1,137 @@
\usepackage{float}
\usepackage{caption,tabularx,booktabs}
\usepackage{bm}
\usepackage{xpatch} % Recommanded for biblatex
\usepackage[ % use biblatex for bibliography
backend=biber, % use biber backend (bibtex replacement) or bibtex
style=ieee, % bib style
hyperref=true, % activate hyperref support
backref=true, % activate backrefs
isbn=false, % don't show isbn tags
url=false, % don't show url tags
doi=false, % don't show doi tags
urldate=long, % display type for dates
maxnames=3, %
minnames=1, %
maxbibnames=5, %
minbibnames=3, %
maxcitenames=2, %
mincitenames=1 %
]{biblatex}
\setlength\bibitemsep{1.1\itemsep}
% \renewcommand*{\bibfont}{\footnotesize}
\usepackage{fontawesome}
\usepackage{caption}
\usepackage{subcaption}
\captionsetup[figure]{labelfont=bf}
\captionsetup[subfigure]{labelfont=bf}
\captionsetup[listing]{labelfont=bf}
\captionsetup[table]{labelfont=bf}
\usepackage{xcolor}
\definecolor{my-blue}{HTML}{6b7adb}
\definecolor{my-pale-blue}{HTML}{e6e9f9}
\definecolor{my-red}{HTML}{db6b6b}
\definecolor{my-pale-red}{HTML}{f9e6e6}
\definecolor{my-green}{HTML}{6bdbb6}
\definecolor{my-pale-green}{HTML}{e6f9f3}
\definecolor{my-yellow}{HTML}{dbd26b}
\definecolor{my-pale-yellow}{HTML}{f9f7e6}
\definecolor{my-orange}{HTML}{dba76b}
\definecolor{my-pale-orange}{HTML}{f9f0e6}
\definecolor{my-grey}{HTML}{a3a3a3}
\definecolor{my-pale-grey}{HTML}{f0f0f0}
\definecolor{my-turq}{HTML}{6bc7db}
\definecolor{my-pale-turq}{HTML}{e6f6f9}
\usepackage{inconsolata}
\usepackage[newfloat=true, chapter]{minted}
\usemintedstyle{autumn}
\setminted{frame=lines,breaklines=true,tabsize=4,fontsize=\scriptsize,autogobble=true,labelposition=topline,bgcolor=my-pale-grey}
\setminted[matlab]{label=Matlab}
\setminted[latex]{label=LaTeX}
\setminted[bash]{label=Bash}
\setminted[python]{label=Python}
\setminted[text]{label=Results}
\setminted[md]{label=Org Mode}
\setmintedinline{fontsize=\normalsize,bgcolor=my-pale-grey}
\usepackage[most]{tcolorbox}
\tcbuselibrary{minted}
\newtcolorbox{seealso}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=See Also}
\newtcolorbox{hint}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=Hint}
\newtcolorbox{definition}{enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Definition}
\newtcolorbox{important}{ enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Important}
\newtcolorbox{exampl}[1][]{ enhanced,breakable,colback=my-pale-green,colframe=my-green,fonttitle=\bfseries,title=Example,#1}
\newtcolorbox{exercice}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Exercice}
\newtcolorbox{question}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Question}
\newtcolorbox{answer}{ enhanced,breakable,colback=my-pale-turq,colframe=my-turq,fonttitle=\bfseries,title=Answer}
\newtcolorbox{summary}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Summary}
\newtcolorbox{note}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Note}
\newtcolorbox{caution}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Caution}
\newtcolorbox{warning}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Warning}
\newtcolorbox{my-quote}[1]{%
colback=my-pale-grey,
grow to right by=-10mm,
grow to left by=-10mm,
boxrule=0pt,
boxsep=0pt,
breakable,
enhanced jigsaw,
borderline west={4pt}{0pt}{my-grey}}
\renewenvironment{quote}{\begin{my-quote}}{\end{my-quote}}
\newtcolorbox{my-verse}[1]{%
colback=my-pale-grey,
grow to right by=-10mm,
grow to left by=-10mm,
boxrule=0pt,
boxsep=0pt,
breakable,
enhanced jigsaw,
borderline west={4pt}{0pt}{my-grey}}
\renewenvironment{verse}{\begin{my-verse}}{\end{my-verse}}
\usepackage{environ}% http://ctan.org/pkg/environ
\NewEnviron{aside}{%
\marginpar{\BODY}
}
\renewenvironment{verbatim}{\VerbatimEnvironment\begin{minted}[]{text}}{\end{minted}}
\usepackage{soul}
\sethlcolor{my-pale-grey}
\let\OldTexttt\texttt
\renewcommand{\texttt}[1]{{\ttfamily\hl{\mbox{\,#1\,}}}}
\makeatletter
\preto\Gin@extensions{png,}
\DeclareGraphicsRule{.png}{pdf}{.pdf}{\noexpand\Gin@base.pdf}
\preto\Gin@extensions{gif,}
\DeclareGraphicsRule{.gif}{png}{.png}{\noexpand\Gin@base.png}
\makeatother
\usepackage{hyperref}
\hypersetup{
colorlinks = true,
allcolors = my-blue
}
\usepackage{hypcap}

View File

File diff suppressed because it is too large Load Diff

Binary file not shown.

508
test-bench-nass-spindle.tex Normal file
View File

@ -0,0 +1,508 @@
% Created 2024-03-19 Tue 11:19
% Intended LaTeX compiler: pdflatex
\documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt}
\input{preamble.tex}
\bibliography{test-bench-nass-spindle.bib}
\author{Dehaeze Thomas}
\date{\today}
\title{Nano-Hexapod on top of a Spindle - Test Bench}
\hypersetup{
pdfauthor={Dehaeze Thomas},
pdftitle={Nano-Hexapod on top of a Spindle - Test Bench},
pdfkeywords={},
pdfsubject={},
pdfcreator={Emacs 29.2 (Org mode 9.7)},
pdflang={English}}
\usepackage{biblatex}
\begin{document}
\maketitle
\tableofcontents
\clearpage
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=\linewidth]{figs/IMG_20221220_152429.jpg}
\caption{\label{fig:picture_setup}Setup with the Spindle, nano-hexapod and metrology}
\end{figure}
\chapter{Test-Bench Description}
\begin{note}
Here are the documentation of the equipment used for this test bench:
\begin{itemize}
\item Voltage Amplifier: PiezoDrive \href{doc/PD200-V7-R1.pdf}{PD200}
\item Amplified Piezoelectric Actuator: Cedrat \href{doc/APA300ML.pdf}{APA300ML}
\item DAC/ADC: Speedgoat \href{doc/IO131-OEM-Datasheet.pdf}{IO131}
\item Encoder: Renishaw \href{doc/L-9517-9678-05-A\_Data\_sheet\_VIONiC\_series\_en.pdf}{Vionic} and used \href{doc/L-9517-9862-01-C\_Data\_sheet\_RKLC\_EN.pdf}{Ruler}
\item LION Precision \href{doc/Catalog-CPL190290.pdf}{CPL290}
\item Spindle: Lab Motion \href{doc/RS250S.pdf}{RT250S} with \href{doc/DB36\_connections\_english\_V2.pdf}{Drivebox 3.6} controller
\end{itemize}
\end{note}
\section{Alignment}
Procedure:
\begin{enumerate}
\item Align bottom sphere with the spindle rotation axis (\textasciitilde{} 10um)
\item Align top sphere with the spindle rotation axis (\textasciitilde{} 10um)
\end{enumerate}
\section{Short Range metrology system}
There are 5 interferometers pointing at 2 spheres as shown in Figure \ref{fig:LION_metrology_interferometers}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=0.5\linewidth]{figs/IMG_20221216_181305.jpg}
\caption{\label{fig:picture_metrology}Metrology system with LION sphere (1 inch diameter) and 5 interferometers fixed to their individual tip-tilts}
\end{figure}
\begin{center}
\begin{tabular}{ll}
& Value\\
\hline
Sphere Diameter & 25.4mm\\
Distance between the spheres & 76.2mm\\
\end{tabular}
\end{center}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=0.5\linewidth]{figs/LION_metrology_interferometers.png}
\caption{\label{fig:LION_metrology_interferometers}Schematic of the measurement system}
\end{figure}
\textbf{Assumptions}:
\begin{itemize}
\item Interferometers are perfectly positioned / oriented
\item Sphere is perfect
\end{itemize}
\textbf{Compute the Jacobian matrix}:
\begin{itemize}
\item From pure X-Y-Z-Rx-Ry small motions, compute the effect on the 5 measured distances
\item Compute the matrix
\item Inverse the matrix
\item Verify that it is working with simple example (for example using Solidworkds)
\end{itemize}
We have the following set of equations:
\begin{align}
d_1 &= -D_y + l_2 R_x \\
d_2 &= -D_y - l_1 R_x \\
d_3 &= -D_x - l_2 R_y \\
d_4 &= -D_x + l_1 R_y \\
d_5 &= -D_z
\end{align}
That can be written as a linear transformation:
\begin{equation}
\begin{bmatrix}
d_1 \\ d_2 \\ d_3 \\ d_4 \\ d_5
\end{bmatrix} = \begin{bmatrix}
0 & -1 & 0 & l_2 & 0 \\
0 & -1 & 0 & -l_1 & 0 \\
-1 & 0 & 0 & 0 & -l_2 \\
-1 & 0 & 0 & 0 & l_1 \\
0 & 0 & -1 & 0 & 0
\end{bmatrix} \cdot \begin{bmatrix}
D_x \\ D_y \\ D_z \\ R_x \\ R_y
\end{bmatrix}
\end{equation}
By inverting the matrix, we obtain the Jacobian relation:
\begin{equation}
\begin{bmatrix}
D_x \\ D_y \\ D_z \\ R_x \\ R_y
\end{bmatrix} = \begin{bmatrix}
0 & -1 & 0 & l_2 & 0 \\
0 & -1 & 0 & -l_1 & 0 \\
-1 & 0 & 0 & 0 & -l_2 \\
-1 & 0 & 0 & 0 & l_1 \\
0 & 0 & -1 & 0 & 0
\end{bmatrix}^{-1} \cdot \begin{bmatrix}
d_1 \\ d_2 \\ d_3 \\ d_4 \\ d_5
\end{bmatrix}
\end{equation}
\begin{table}[htbp]
\caption{\label{tab:jacobian_metrology}Jacobian matrix for the metrology system}
\centering
\begin{tabularx}{\linewidth}{cXXXXX}
\toprule
& \textbf{d1} & \textbf{d2} & \textbf{d3} & \textbf{d4} & \textbf{d5}\\
\midrule
\textbf{Dx} & 0.0 & 0.0 & -0.79 & -0.21 & 0.0\\
\textbf{Dy} & -0.79 & -0.21 & -0.0 & -0.0 & 0.0\\
\textbf{Dz} & 0.0 & 0.0 & 0.0 & 0.0 & -1.0\\
\textbf{Rx} & 13.12 & -13.12 & 0.0 & -0.0 & 0.0\\
\textbf{Ry} & 0.0 & 0.0 & -13.12 & 13.12 & 0.0\\
\bottomrule
\end{tabularx}
\end{table}
\section{Spindle errors}
The spindle is rotated at 60rpm during 10 turns.
The signal of all 5 interferometers are recorded.
\subsection{Errors in \(D_x\) and \(D_y\)}
Because of the eccentricity of the reference surfaces (the spheres), we expect the motion in the X-Y plane to be a circle as a first approximation.
We can first see that in Figure \ref{fig:dx_dy_motion_rotation} that shows the measured \(D_x\) and \(D_y\) motion as a function of the \(R_z\) angle.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/dx_dy_motion_rotation.png}
\caption{\label{fig:dx_dy_motion_rotation}Dx and Dy motion during the rotation}
\end{figure}
A circle is fit, and the obtained radius of the circle (i.e. the excentricity) is estimated to be:
\begin{verbatim}
Error linked to excentricity = 19 um
\end{verbatim}
The motion in the X-Y plane as well as the circle fit and the residual motion (circle fit subtracted from the measured motion) are shown in Figure \ref{fig:dx_dy_spindle_rotation}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/dx_dy_spindle_rotation.png}
\caption{\label{fig:dx_dy_spindle_rotation}Dx and Dy motion during the spindle rotation}
\end{figure}
Let's now analyse the frequency content in the signal.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/dx_dy_spindle_rotation_asd.png}
\caption{\label{fig:dx_dy_spindle_rotation_asd}Amplitude Spectral Density of the measured Dx and Dy motion}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/dx_dy_spindle_rotation_cas.png}
\caption{\label{fig:dx_dy_spindle_rotation_cas}Cumulative Amplitude Spectrum of the measured Dx and Dy motion}
\end{figure}
\subsection{Errors in vertical motion \(D_z\)}
The top interferometer is measuring the vertical motion of the sphere.
However, if the top sphere is not perfectly aligned with the spindle axis, there will also measure some vertical motion due to this excentricity.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/dz_motion_rotation.png}
\caption{\label{fig:dz_motion_rotation}Dz motion during the rotation}
\end{figure}
Let's fit a sinus with a period of one turn.
\begin{verbatim}
Errors linked to excentricity = 410 [nm]
\end{verbatim}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/dz_motion_rotation_excentricity.png}
\caption{\label{fig:dz_motion_rotation_excentricity}Effect of the excentricity and remaining Dz motion}
\end{figure}
If we look at the remaining motion after removing the effect of the eccentricity (Figure \ref{fig:dz_motion_rotation_excentricity}, right), we can see a signal with 20 periods every turn.
Let's fit this.
\begin{verbatim}
Errors linked to spindle motor = 58 [nm]
\end{verbatim}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/dz_motion_rotation_poles.png}
\caption{\label{fig:dz_motion_rotation_poles}Effect of the magnetic pole pairs and remaining Dz motion}
\end{figure}
Let's look at the signal in the frequency domain.
On top of the peak at 1Hz (excentricity) and at 20Hz (number of pole pairs), we can observe a frequency of 126Hz (i.e. 126 periods per turn, approx 2.85 deg).
\begin{quote}
Could this be related to the air bearing system?
\end{quote}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/dz_spindle_rotation_asd.png}
\caption{\label{fig:dz_spindle_rotation_asd}Amplitude Spectral Density of the measured Dz motion}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/dz_spindle_rotation_cas.png}
\caption{\label{fig:dz_spindle_rotation_cas}Cumulative Amplitude Spectrum of the measured Dz motion}
\end{figure}
\subsection{Angle errors in \(R_x\) and \(R_y\)}
\begin{verbatim}
amplitude = 281 urad
\end{verbatim}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/rx_ry_spindle_rotation.png}
\caption{\label{fig:rx_ry_spindle_rotation}Rx and Ry motion during the spindle rotation}
\end{figure}
Let's now analyse the frequency content in the signal.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/rx_ry_spindle_rotation_asd.png}
\caption{\label{fig:rx_ry_spindle_rotation_asd}Amplitude Spectral Density of the measured Rx and Ry motion}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/rx_ry_spindle_rotation_cas.png}
\caption{\label{fig:rx_ry_spindle_rotation_cas}Cumulative Amplitude Spectrum of the measured Rx and Ry motion}
\end{figure}
\chapter{Simscape Model}
A 3D view of the Simscape model is shown in Figure \ref{fig:simscape_model_spindle_bench}.
The Spindle is represented by a \emph{Bushing joint}.
Axial, radial and tilt stiffnesses are taken from the Spindle datasheet (see Table).
\begin{table}[htbp]
\caption{\label{tab:spindle_stiffnesses}Spindle stiffnesses}
\centering
\begin{tabularx}{\linewidth}{lXX}
\toprule
\textbf{Stiffness} & \textbf{Value} & \textbf{Unit}\\
\midrule
Axial & 402 & \(N/\mu m\)\\
Radial & 226 & \(N/\mu m\)\\
Tilt & 2380 & \(Nm/mrad\)\\
\bottomrule
\end{tabularx}
\end{table}
The metrology system consists of 5 distance measurements (represented by the red lines in Figure \ref{fig:simscape_model_spindle_bench}).
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=0.5\linewidth]{figs/simscape_model_spindle_bench.jpg}
\caption{\label{fig:simscape_model_spindle_bench}Screenshot of the 3D view of the Simscape model}
\end{figure}
\section{Simscape model parameters}
The nano-hexapod is initialized.
The Jacobian matrix that computes the \([x, y, z, R_x, R_y]\) motion of the sample from the 5 interferometers is defined below.
\section{Control Architecture}
Let's note:
\begin{itemize}
\item \(d\mathcal{L}_m = [d_{\mathcal{L}_1},\ d_{\mathcal{L}_2},\ d_{\mathcal{L}_3},\ d_{\mathcal{L}_4},\ d_{\mathcal{L}_5},\ d_{\mathcal{L}_6}]\) the measurement of the 6 encoders fixed to the nano-hexapod
\item \(\bm{\tau}_m = [\tau_{m_1},\ \tau_{m_2},\ \tau_{m_3},\ \tau_{m_4},\ \tau_{m_5},\ \tau_{m_6}]\) the voltages measured by the 6 force sensors
\item \(\bm{u} = [u_1,\ u_2,\ u_3,\ u_4,\ u_5,\ u_6]\) the voltages send to the voltage amplifiers for the 6 piezoelectric actuators
\item \(R_z\) the spindle measured angle (encoder)
\item \(\bm{d}_m = [d_1,\ d_2,\ d_3,\ d_4,\ d_5]\) the distances measured by the 5 interferometers (see Figure \ref{fig:LION_metrology_interferometers_bis})
\end{itemize}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=0.5\linewidth]{figs/LION_metrology_interferometers.png}
\caption{\label{fig:LION_metrology_interferometers_bis}Schematic of the measurement system}
\end{figure}
\section{Computation of the strut errors from the external metrology}
The following frames are defined:
\begin{itemize}
\item \(\{ W \}\): the frame that represents the wanted pose of the sample
\item \(\{ M \}\): the frame that represents the measured pose of the sample (estimated from the 5 interferometers and the spindle encoder)
\item \(\{ G \}\): the frame fixed to the granite and positioned at the sample's center
\item \(\{ H \}\): the frame fixed to the the spindle rotor, and positioned at the sample's center
\end{itemize}
We can express several homogeneous transformation matrices.
Frame fixed to the spindle rotor (centered on the sample's position), expressed in the frame of the granite:
\begin{equation}
{}^{G}\bm{T}_H = \begin{bmatrix}
cos(R_z) & -sin(R_z) & 0 & 0 \\
sin(R_z) & cos(R_z) & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
\end{equation}
with \(R_z\) the spindle encoder.
Wanted position expressed in the frame of the granite:
\begin{equation}
{}^{G}\bm{T}_W = \begin{bmatrix}
& & & r_{D_x} \\
& \bm{R}_x(r_{R_x}) \bm{R}_y(r_{R_y}) \bm{R}_z(r_{R_z}) & & r_{D_y} \\
& & & r_{D_z} \\
0 & 0 & 0 & 1
\end{bmatrix}
\end{equation}
with \(\bm{R}(r_{R_x}, r_{R_y}, r_{R_z})\) representing the wanted orientation of the sample with respect to the granite.
Typically, \(r_{R_x} = 0\), \(r_{R_y} = 0\) and \(r_{R_z}\) corresponds to the spindle encoder \(R_z\).
Measured position of the sample with respect to the granite:
\begin{equation}
{}^{G}\bm{T}_M = \begin{bmatrix}
& & & y_{D_x} \\
& \bm{R}_x(y_{R_x}) \bm{R}_y(y_{R_y}) \bm{R}_z(R_z) & & y_{D_y} \\
& & & y_{D_z} \\
0 & 0 & 0 & 1
\end{bmatrix}
\end{equation}
with \(R_z\) the spindle encoder, and \([y_{D_x},\ y_{D_y},\ y_{D_z},\ y_{R_x},\ y_{R_y}]\) are obtained from the 5 interferometers:
\begin{equation}
\begin{bmatrix}
y_{D_x} \\ y_{D_y} \\ y_{D_z} \\ y_{R_x} \\ y_{R_y}
\end{bmatrix} = \begin{bmatrix}
0 & -1 & 0 & l_2 & 0 \\
0 & -1 & 0 & -l_1 & 0 \\
-1 & 0 & 0 & 0 & -l_2 \\
-1 & 0 & 0 & 0 & l_1 \\
0 & 0 & -1 & 0 & 0
\end{bmatrix}^{-1} \cdot \begin{bmatrix}
d_1 \\ d_2 \\ d_3 \\ d_4 \\ d_5
\end{bmatrix}
\end{equation}
In order to have the \textbf{position error in the frame of the nano-hexapod}, we have to compute \({}^M\bm{T}_W\):
\begin{align}
{}^M\bm{T}_W &= {}^M\bm{T}_G \cdot {}^G\bm{T}_W \\
&= {{}^G\bm{T}_M}^{-1} \cdot {}^G\bm{T}_W
\end{align}
The \textbf{inverse of the transformation matrix} can be obtained by
\begin{equation}
{}^B\bm{T}_A = {}^A\bm{T}_B^{-1} =
\left[ \begin{array}{ccc|c}
& & & \\
& {}^A\bm{R}_B^T & & -{}^A \bm{R}_B^T {}^A\bm{P}_{O_B} \\
& & & \cr
\hline
0 & 0 & 0 & 1 \\
\end{array} \right]
\end{equation}
The position errors \(\bm{\epsilon}_{\mathcal{X}} = [\epsilon_{D_x},\ \epsilon_{D_y},\ \epsilon_{D_z},\ \epsilon_{R_x},\ \epsilon_{R_y},\ \epsilon_{R_z}]\) expressed in a frame fixed to the nano-hexapod can be extracted from \({}^W\bm{T}_M\):
\begin{itemize}
\item \(\epsilon_{D_x} = {}^M\bm{T}_W(1,4)\)
\item \(\epsilon_{D_y} = {}^M\bm{T}_W(2,4)\)
\item \(\epsilon_{D_z} = {}^M\bm{T}_W(3,4)\)
\item \(\epsilon_{R_y} = \text{atan2}({}^M\bm{T}_W(1,3), \sqrt{{}^M\bm{T}_W(1,1)^2 + {}^M\bm{T}_W(1,2)^2})\)
\item \(\epsilon_{R_x} = \text{atan2}(\frac{-{}^M\bm{T}_W(2,3)}{\cos(\epsilon_{R_y})}, \frac{{}^M\bm{T}_W(3,3)}{\cos(\epsilon_{R_y})})\)
\item \(\epsilon_{R_z} = \text{atan2}(\frac{-{}^M\bm{T}_W(1,2)}{\cos(\epsilon_{R_y})}, \frac{{}^M\bm{T}_W(1,1)}{\cos(\epsilon_{R_y})})\)
\end{itemize}
Finally, the strut errors \(\bm{\epsilon}_{\mathcal{L}} = [\epsilon_{\matcal{L}_1},\ \epsilon_{\matcal{L}_2},\ \epsilon_{\matcal{L}_3},\ \epsilon_{\matcal{L}_4},\ \epsilon_{\matcal{L}_5},\ \epsilon_{\matcal{L}_6}]\) can be computed from:
\begin{equation}
\bm{\epsilon}_\mathcal{L} = \bm{J} \cdot \bm{\epsilon}_\mathcal{X}
\end{equation}
\section{IFF Plant}
\section{DVF Plant}
\section{HAC Plant}
The transfer functions from the 6 actuator inputs to the 6 estimated strut errors are extracted from the Simscape model.
The obtained transfer functions are shown in Figure \ref{fig:simscape_model_hac_plant}.
We can see that the system is well decoupled at low frequency (i.e. below the first resonance of the Nano-Hexapod).
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/simscape_model_hac_plant.png}
\caption{\label{fig:simscape_model_hac_plant}HAC plant obtained on the Simscape model}
\end{figure}
\chapter{Control Experiment}
\section{IFF Plant}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/G_iif_exp_no_rotation.png}
\caption{\label{fig:G_iif_exp_no_rotation}Obtained transfer function from generated voltages to measured voltages on the piezoelectric force sensor}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/G_iif_exp_comp_no_rotation.png}
\caption{\label{fig:G_iif_exp_comp_no_rotation}Comparison with the model}
\end{figure}
\section{IFF Controller}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/root_locus_iff_no_payload.png}
\caption{\label{fig:root_locus_iff_no_payload}Root Locus for IFF}
\end{figure}
\section{Open Loop Plant}
Here the \(R_z\) motion of the Hexapod is estimated from the encoders.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/G_damp_exp_no_rotation.png}
\caption{\label{fig:G_damp_exp_no_rotation}Obtained transfer function from generated voltages to estimated strut motion}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/comp_hac_plant_exp_simscape.png}
\caption{\label{fig:comp_hac_plant_exp_simscape}Comparison of the open-loop plant measured experimentally and extracted from Simscape}
\end{figure}
\section{Damped Plant}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/G_damp_damped_exp_no_rotation.png}
\caption{\label{fig:G_damp_damped_exp_no_rotation}Obtained transfer function from generated voltages to estimated strut motion}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/comp_damped_undamped_plant.png}
\caption{\label{fig:comp_damped_undamped_plant}Comparison of the undamped and damped plant with IFF}
\end{figure}
\section{HAC Controller}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/first_hac_K_exp_loop_gain.png}
\caption{\label{fig:first_hac_K_exp_loop_gain}Loop gain for the HAC}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/first_hac_K_exp_root_locus.png}
\caption{\label{fig:first_hac_K_exp_root_locus}Obtained Root Locus}
\end{figure}
\section{Compare dynamics seen by interferometers and by encoders}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/comp_dynamics_int_ext_metrology.png}
\caption{\label{fig:comp_dynamics_int_ext_metrology}Comparison of the identified dynamic by the internal metrology (encoders) and by the external metrology (interferometers)}
\end{figure}
\section{Compare dynamics obtained with different Rz estimations}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/comp_plant_encoders_Va.png}
\caption{\label{fig:comp_plant_encoders_Va}Comparison of the obtained plant using the Encoders or using the output Voltages to estimate Rz}
\end{figure}
\chapter{Closed-Loop Results}
\section{Open and Closed loop results}
\begin{center}
\includegraphics[scale=1]{figs/spindle_errors_1rpm_ol.png}
\end{center}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/spindle_errors_1rpm_op_cl.png}
\caption{\label{fig:spindle_errors_1rpm_op_cl}Comparison of the Open-Loop and Closed-Loop spindle errors}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/spindle_errors_1rpm_op_cl_rot.png}
\caption{\label{fig:spindle_errors_1rpm_op_cl_rot}Comparison of the Open-Loop and Closed-Loop spindle errors - Rotation}
\end{figure}
\end{document}