Publications: add paper pages (dehaeze18, brumund21, dehaeze20, dehaeze21 x2), drop Fastjack, look for PDFs in journal/
Deploy / deploy (push) Successful in 3s

This commit is contained in:
2026-09-27 19:45:28 +02:00
parent 8b90d69df2
commit 7195b9e67a
102 changed files with 5352 additions and 41 deletions
@@ -0,0 +1,51 @@
+++
title = "Multibody Simulations with Reduced Order Flexible Bodies obtained by FEA"
author = ["Dehaeze Thomas"]
draft = false
venue = "MEDSI 2020"
year = 2021
pubtype = "conference"
doi = "10.18429/JACoW-MEDSI2020-WEPB08"
code = "https://git.tdehaeze.xyz/tdehaeze/brumund21_multib_simul_reduc_order_flexib_bodies_fea"
+++
> **Abstract**:
>
> Tighter specifications in synchrotron instrumentation development force the design engineers more and more often to choose a mechatronics design approach.
> This includes actively controlled systems that need to be properly designed.
> The new Nano Active Stabilization System (NASS) for the ESRF beamline ID31 was designed with such an approach.
>
> We chose a multi-body design modelling approach for the development of the NASS end-station.
> Significance of such models depend strongly on its input and consideration of the right stiffness of the system's components and subsystems.
> For that matter, we considered sub-components in the multi-body model as _reduced order flexible bodies_ representing the component's modal behaviour with reduced mass and stiffness matrices obtained from finite element analysis (FEA) models.
> These matrices were created from FEA models via modal reduction techniques, more specifically the component mode synthesis (CMS).
> This makes this design approach a combined multibody-FEA technique.
>
> We validated the technique with a test bench that confirmed the good modelling capabilities using reduced order flexible body models obtained from FEA for an amplified piezoelectric actuator (APA).
## Conference Paper ([pdf](paper/brumund21_multib_simul_reduc_order_flexib_bodies_fea.pdf)) {#conference-paper--pdf-paper-brumund21-multib-simul-reduc-order-flexib-bodies-fea-dot-pdf}
## Cite this work {#cite-this-work}
To cite the conference paper use the following bibTeX code.
```bibtex
@inproceedings{brumund21_multib_simul_reduc_order_flexib_bodies_fea,
author = {Philipp Brumund and Thomas Dehaeze},
title = {Multibody Simulations with Reduced Order Flexible Bodies
obtained by {FEA}},
booktitle = {MEDSI'20},
year = 2021,
language = {english},
publisher = {JACoW Publishing},
series = {Mechanical Engineering Design of Synchrotron Radiation
Equipment and Instrumentation},
venue = {Chicago, USA},
}
```
You can also use the formatted citation below.
> Brumund, P., & Dehaeze, T., Multibody simulations with reduced order flexible bodies obtained by FEA, In MEDSI'20 (2021), JACoW Publishing.
@@ -0,0 +1,72 @@
+++
title = "Sample Stabilization for Tomography Experiments in Presence of Large Plant Uncertainty"
author = ["Dehaeze Thomas"]
draft = false
venue = "MEDSI 2018"
year = 2018
pubtype = "conference"
doi = "10.18429/JACoW-MEDSI2018-WEOAMA02"
code = "https://github.com/tdehaeze/dehaeze18_sampl_stabil_for_tomog_exper"
+++
> **Abstract**:
>
> A new low emittance lattice storage ring is under construction at the ESRF.
> In this new instrument, an upgraded end station for ID31 beamline must allow to position the samples along complex trajectories with a nanometer precision.
> In order to reach these requirements, samples have to be mounted on high precision stages, combining a capability of large stroke, spin motion, and active rejection of disturbances.
> First, the end station will be presented with the associated requirements. However, the precision is limited by thermal expansion and various imperfections that are not actively compensated.
> Our approach is to add a Nano Active Stabilization System (NASS) which is composed of a 6DoF Stewart platform and a 6 DoF metrology system.
> A 3D model of the end station updated with experimental data is developed.
> As the mass of the samples may vary by up to two orders of magnitudes, robust control strategies are required to address such plant uncertainty.
> The proposed control strategy are presented and applied on the developed model by conducting time domain simulations of tomography experiment in presence of instrumentation noise and system uncertainty.
## Paper ([link](paper/dehaeze18_sampl_stabil_for_tomog_exper.pdf)) {#paper--link-paper-dehaeze18-sampl-stabil-for-tomog-exper-dot-pdf}
The paper has been created [Org Mode](https://orgmode.org/) (generating [LaTeX](https://www.latex-project.org/) code) under [Emacs](https://www.gnu.org/software/emacs/).
## Tikz Figures ([link]({{< relref "tikz/_index.md" >}})) {#tikz-figures--link-tikz-index-dot-md}
All the figures for the paper have been generated using [TikZ](https://sourceforge.net/projects/pgf/).
## Poster ([link](poster/dehaeze18_sampl_stabil_for_tomog_exper_poster.pdf)) {#poster--link-poster-dehaeze18-sampl-stabil-for-tomog-exper-poster-dot-pdf}
The poster has been created using the [tikzposter](https://www.ctan.org/pkg/tikzposter) package for [beamer](https://sourceforge.net/projects/latex-beamer/).
## Talk ([link](talk/dehaeze18_sampl_stabil_for_tomog_exper_talk.pdf)) {#talk--link-talk-dehaeze18-sampl-stabil-for-tomog-exper-talk-dot-pdf}
This work has been presented at [MEDSI 2018](https://indico.cern.ch/event/680538/).
## How to cite this paper {#how-to-cite-this-paper}
To cite this paper use the following bibtex code.
```bibtex
@inproceedings{dehaeze18_sampl_stabil_for_tomog_exper,
author = {Thomas Dehaeze and M. Magnin Mattenet and Christophe Collette},
title = {Sample Stabilization For Tomography Experiments In Presence Of
Large Plant Uncertainty},
booktitle = {MEDSI'18},
year = 2018,
number = 10,
pages = {153--157},
doi = {10.18429/JACoW-MEDSI2018-WEOAMA02},
url = {https://doi.org/10.18429/JACoW-MEDSI2018-WEOAMA02},
address = {Geneva, Switzerland},
isbn = {978-3-95450-207-3},
language = {english},
month = {Dec},
publisher = {JACoW Publishing},
series = {Mechanical Engineering Design of Synchrotron Radiation
Equipment and Instrumentation},
venue = {Paris, France},
}
```
You can also use the formatted citation below.
> Dehaeze, T., Mattenet, M. M., &amp; Collette, C., Sample Stabilization For Tomography Experiments In Presence Of Large Plant Uncertainty, In MEDSI'18 (pp. 153–157) (2018). Geneva, Switzerland
@@ -0,0 +1,204 @@
+++
title = "Sample Stabilization for Tomography Experiments in Presence of Large Plant Uncertainty - Tikz Figures"
author = ["Dehaeze Thomas"]
draft = false
+++
Configuration file is accessible [here]({{< relref "config.md" >}}).
## Fig 1: Schematic representation of the ID31 end station {#fig-1-schematic-representation-of-the-id31-end-station}
<a id="figure--fig:schematic-sys-without-nass"></a>
{{< figure src="figs/schematic_sys_without_nass.png" caption="<span class='figure-number'>Figure 1: </span>Schematic representation of the ID31 end station ([png](figs/schematic_sys_without_nass.png), [pdf](figs/schematic_sys_without_nass.pdf), [tex](./figs/schematic_sys_without_nass.tex))." >}}
## Fig 2: CAD View of the ID31 end station {#fig-2-cad-view-of-the-id31-end-station}
```latex
\graphicspath{{~/Cloud/tikz/org/img/}}
\begin{tikzpicture}
\tikzstyle{legend}=[draw, text width=4.2cm, align=center]
\node[inner sep=0pt, anchor=south west] (assemblage) at (0,0)
{\includegraphics[width=0.42\textwidth]{/home/thomas/Cloud/thesis/papers/dehaeze18_sampl_stabil_for_tomog_exper/tikz/img/assemblage_img.png}};
\coordinate[] (aheight) at (assemblage.north west);
\coordinate[] (awidth) at (assemblage.south east);
\coordinate[] (xrightlabel) at (-0.2, 0);
\coordinate[] (xleftlabel) at ($(awidth)+(0.2, 0)$);
% Translation Stage
\coordinate[] (ty) at ($0.5*(aheight)+0.1*(awidth)$);
\draw[<-] (ty) -- (ty-|xrightlabel) node[left, legend]{Translation Stage\\$\SI{-5}{m\metre} < T_y < \SI{5}{m\metre}$};
% Sample Interface
\coordinate[] (sampleint) at ($0.77*(aheight)+0.5*(awidth)$);
\coordinate[] (sampleintmid) at ($(sampleint)+(-1, -0.5)$);
\draw[<-] (sampleint) -- (sampleintmid) -- (sampleintmid-|xrightlabel) node[left, legend]{Sample Interface};
% Sample
\coordinate[] (sample) at ($0.9*(aheight)+0.5*(awidth)$);
\draw[<-] (sample) -- (sample-|xrightlabel) node[left, legend]{Sample Environment\\$\SI{1}{\kg} < M < \SI{50}{\kg}$};
% Tilt Stage
\coordinate[] (tilt) at ($0.55*(aheight)+0.78*(awidth)$);
\coordinate[] (tiltmid) at ($(tilt)+(1, 0.5)$);
\draw[<-] (tilt) -- (tiltmid) -- (tiltmid-|xleftlabel) node[right, legend]{Tilt Stage\\$\ang{-3} < \theta_y < \ang{3}$};
% Spindle
\coordinate[] (spindle) at ($0.53*(aheight)+0.33*(awidth)$);
\coordinate[] (spindlemid) at ($(spindle)+(-1, -1.5)$);
\draw[<-] (spindle) -- (spindlemid) -- (spindlemid-|xrightlabel) node[left, legend]{Spindle\\$\SI{1}{rpm} < \dot{\theta_z} < \SI{60}{rpm}$};
% Center of gravity compensation
\coordinate[] (axisc) at ($0.65*(aheight)+0.65*(awidth)$);
\coordinate[] (axiscmid) at ($(axisc)+(1, 1.5)$);
\draw[<-] (axisc) -- (axiscmid) -- (axiscmid-|xleftlabel) node[right, legend]{Center of gravity\\compensation system};
% Micro Hexapod
\coordinate[] (hexapod) at ($0.52*(aheight)+0.6*(awidth)$);
\coordinate[] (hexapodmid) at ($(hexapod)+(1, -1.0)$);
\draw[<-] (hexapod) -- (hexapodmid) -- (hexapodmid-|xleftlabel) node[right, legend]{Long Stroke Hexapod\\$\SI{-10}{m\metre} < T_{x y z} < \SI{10}{m\metre}$\\$\ang{-3} < \theta_{x y z} < \ang{3}$};
% Frame
\coordinate[] (frame) at ($0.14*(aheight)+0.65*(awidth)$);
\draw[<-] (frame) -- (frame-|xleftlabel) node[right, legend]{Frame fixed\\on the granite};
% X-Ray
\draw[color=red, ->-=0.7] ($0.92*(aheight)+0.8*(awidth)$) -- node[above, color=black]{X-ray} ++(190:1.8);
% Size of the setup
\draw[dashed, <->, color=black!70, line width=0.5pt] ($0.03*(aheight)+0.35*(awidth)$) -- node[below, color=black, pos=0.6]{$\approx\SI{1}{m}$} ($0.14*(aheight)+0.98*(awidth)$);
\draw[dashed, <->, color=black!70, line width=0.5pt] ($0.032*(aheight)+0.32*(awidth)$) -- node[left, color=black, pos=0.4]{$\approx\SI{1}{m}$} ($0.305*(aheight)+0.0*(awidth)$);
% Axis
\begin{scope}[shift={(0.0, 0.7)}]
\draw[->] (0, 0) -- ++(195:0.8) node[above] {$x$};
\draw[->] (0, 0) -- ++(90:0.9) node[right] {$z$};
\draw[->] (0, 0) -- ++(-40:0.7) node[above] {$y$};
\end{scope}
\end{tikzpicture}
```
<a id="figure--fig:assemblage"></a>
{{< figure src="figs/assemblage.png" caption="<span class='figure-number'>Figure 2: </span>CAD View of the ID31 end station ([png](figs/assemblage.png), [pdf](figs/assemblage.pdf), [tex](./figs/assemblage.tex))." >}}
## Fig 3: Picture of the ID31 end station {#fig-3-picture-of-the-id31-end-station}
```latex
\begin{tikzpicture}
\node[inner sep=0pt, anchor=south west] (photo) at (0,0)
{\includegraphics[width=0.39\textwidth]{/home/thomas/Cloud/thesis/papers/dehaeze18_sampl_stabil_for_tomog_exper/tikz/img/exp_setup_photo.png}};
\coordinate[] (aheight) at (photo.north west);
\coordinate[] (awidth) at (photo.south east);
\coordinate[] (granite) at ($0.1*(aheight)+0.1*(awidth)$);
\coordinate[] (trans) at ($0.5*(aheight)+0.4*(awidth)$);
\coordinate[] (tilt) at ($0.65*(aheight)+0.75*(awidth)$);
\coordinate[] (hexapod) at ($0.7*(aheight)+0.5*(awidth)$);
\coordinate[] (sample) at ($0.9*(aheight)+0.55*(awidth)$);
% Granite
\node[labelc] at (granite) {1};
% Translation stage
\node[labelc] at (trans) {2};
% Tilt Stage
\node[labelc] at (tilt) {3};
% Micro-Hexapod
\node[labelc] at (hexapod) {4};
% Sample
\node[labelc] at (sample) {5};
% Axis
\begin{scope}[shift={($0.07*(aheight)+0.87*(awidth)$)}]
\draw[->] (0, 0) -- ++(55:0.7) node[above] {$y$};
\draw[->] (0, 0) -- ++(90:0.9) node[left] {$z$};
\draw[->] (0, 0) -- ++(-20:0.7) node[above] {$x$};
\end{scope}
\end{tikzpicture}
```
<a id="figure--fig:exp-setup"></a>
{{< figure src="figs/exp_setup.png" caption="<span class='figure-number'>Figure 3: </span>Picture of the ID31 end station ([png](figs/exp_setup.png), [pdf](figs/exp_setup.pdf), [tex](./figs/exp_setup.tex))." >}}
## Fig 4: Schematic representation of the NASS added below the sample and the control architecture used {#fig-4-schematic-representation-of-the-nass-added-below-the-sample-and-the-control-architecture-used}
<a id="figure--fig:system-control"></a>
{{< figure src="figs/system_control.png" caption="<span class='figure-number'>Figure 4: </span>Schematic representation of the NASS added below the sample and the control architecture used ([png](figs/system_control.png), [pdf](figs/system_control.pdf), [tex](./figs/system_control.tex))." >}}
## Fig 5: Transfer function from a force applied by the NASS to the displacement of the sample {#fig-5-transfer-function-from-a-force-applied-by-the-nass-to-the-displacement-of-the-sample}
<a id="figure--fig:G-x-mass"></a>
{{< figure src="figs/G_x_mass.png" caption="<span class='figure-number'>Figure 5: </span>Transfer function from a force applied by the NASS to the displacement of the sample ([png](figs/G_x_mass.png), [pdf](figs/G_x_mass.pdf))." >}}
## Fig 6: General control configuration applied to the end station {#fig-6-general-control-configuration-applied-to-the-end-station}
```latex
\begin{tikzpicture}
% Blocs
\node[block={2.5cm}{2cm}] (P) {P};
\node[block={2.5cm}{2cm}, below=1 of P, scale=0.6] (K) {\[%
\begin{pmatrix}
K_{T_x} & 0 & \cdots & 0 \\
0 & \ddots & \ddots & \vdots \\
\vdots & \ddots & \ddots & 0 \\
0 & \cdots & 0 & K_{\theta_z} \\
\end{pmatrix}
\]};
% Block names
\node[above] at (P.north) {End Station};
\node[above] at (K.north) {Controller};
% Input and outputs coordinates
\coordinate[] (inputw) at ($(P.south west)!0.75!(P.north west)$);
\coordinate[] (inputu) at ($(P.south west)!0.25!(P.north west)$);
\coordinate[] (outputz) at ($(P.south east)!0.75!(P.north east)$);
\coordinate[] (outputv) at ($(P.south east)!0.25!(P.north east)$);
% Connections and labels
\draw[<-] (inputw) node[above left]{$w$} -- ++(-0.8, 0);
\draw[<-] (inputu) node[above left]{$F$} -- ++(-0.8, 0) |- (K.west);
\draw[->] (outputz) node[above right]{$z$} -- ++(0.8, 0);
\draw[->] (outputv) node[above right]{$d$} -- ++(0.8, 0) |- (K.east);
\end{tikzpicture}
```
<a id="figure--fig:general-conf-K"></a>
{{< figure src="figs/general_conf_K.png" caption="<span class='figure-number'>Figure 6: </span>General control configuration applied to the end station ([png](figs/general_conf_K.png), [pdf](figs/general_conf_K.pdf), [tex](./figs/general_conf_K.tex))." >}}
## Fig 7: Bode plot of the loop gain for the control in the x direction {#fig-7-bode-plot-of-the-loop-gain-for-the-control-in-the-x-direction}
<a id="figure--fig:loopgain"></a>
{{< figure src="figs/loopgain.png" caption="<span class='figure-number'>Figure 7: </span>Bode plot of the loop gain for the control in the x direction ([png](figs/loopgain.png), [pdf](figs/loopgain.pdf), [tex](./figs/loopgain.tex))." >}}
## Fig 8: Positioning error of the sample in the x and y direction during the simulation of a tomography experiment {#fig-8-positioning-error-of-the-sample-in-the-x-and-y-direction-during-the-simulation-of-a-tomography-experiment}
<a id="figure--fig:exp-w-wo-nass-xy"></a>
{{< figure src="figs/exp_w_wo_nass_xy.png" caption="<span class='figure-number'>Figure 8: </span>Positioning error of the sample in the x and y direction during the simulation of a tomography experiment ([png](figs/exp_w_wo_nass_xy.png), [pdf](figs/exp_w_wo_nass_xy.pdf))." >}}
## Fig 1: Schematic of the Tomography Experiment (Poster) {#fig-1-schematic-of-the-tomography-experiment--poster}
<a id="figure--fig:exp-full-setup"></a>
{{< figure src="figs/exp_full_setup.png" caption="<span class='figure-number'>Figure 9: </span>Schematic of the Tomography Experiment ([png](figs/exp_full_setup.png), [pdf](figs/exp_full_setup.pdf), [tex](./figs/exp_full_setup.tex))." >}}
@@ -0,0 +1,773 @@
+++
title = "LaTeX Configuration for Tikz Figures"
author = ["Dehaeze Thomas"]
draft = false
+++
## Packages {#packages}
```latex
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french, english]{babel} % Last language is main language
\usepackage{lmodern} % Latin Modern Font
\usepackage{gensymb} % Generic symbols for both text and math mode
\usepackage{standalone} % Used to generate standalone Tikz
\usepackage{amsmath} % Main math Package
\usepackage{mathtools} % Extension package to amsmath
\usepackage{amsthm} % Typesetting theorems (AMS style)
\usepackage{amsfonts} % More fonts from the AMS
\usepackage{textcomp} % provide many text symbols
\usepackage{steinmetz} % For phase symbol
\usepackage{xstring} % Utils to manipulate strings
\usepackage{etoolbox} % Add basic if/then
\usepackage{esvect} % Beautyfull vectors
\usepackage{graphicx} % Enhanced support for graphics
\usepackage{grffile} % Used by matlab2tikz
\usepackage{microtype} % typographic tuning
\usepackage{setspace} % for line spacing, e.g. \onehalfspacing
\usepackage{tabularx} % table features
\usepackage{enumitem} % for simple list modifications
\usepackage{booktabs} % better table support
\usepackage{stackengine} %
\usepackage[load-configurations=abbreviations]{siunitx} % SI units
\sisetup{
locale = US,
detect-all,
range-phrase=--,
range-units=single
}
```
## Tikz related packages {#tikz-related-packages}
```latex
\usepackage{tikz} % Tikz
\usepackage{tikzscale} % Used to scale Tikz graphics
\usepackage{adjustbox} % Used to proper positioning of tikz pictures
\usepackage{circuitikz} % Draw electronic circuits
\usepackage{pgfpages} % Needed to use notes
\usepackage{pgfplots} % Used to plot functions
```
## Tikz Libraries {#tikz-libraries}
```latex
\usetikzlibrary{arrows} % Arrow tip library
\usetikzlibrary{arrows.meta} % Add some arrows
\usetikzlibrary{calc} % The library allows advanced Coordinate Calculations
\usetikzlibrary{intersections} % calculate intersections of paths
\usetikzlibrary{matrix} %
\usetikzlibrary{patterns} %
\usetikzlibrary{shapes} % Defines circle and rectangle
\usetikzlibrary{shapes.geometric} % Use for the shape diamond and isosceles triangle
\usetikzlibrary{snakes} % snake=coil and snake=zigzag using segment amplitude=10pt
\usetikzlibrary{positioning} % Additional options for placing nodes
\usetikzlibrary{3d} % Plot 3D shapes
\usetikzlibrary{spy} % Creating a magnified area
\usetikzlibrary{decorations.text} % Used to make text follows a curve
\usetikzlibrary{decorations.pathmorphing} % deformation of a path
\usetikzlibrary{decorations.markings} % Used for spring and damper
\usetikzlibrary{babel} % A tiny library that make the interaction with the babel package easier
\usetikzlibrary{plotmarks} % This library defines a number of plot marks
\usetikzlibrary{fit} % Used to make rectangle as nodes by specifying two points
\usetikzlibrary{backgrounds} % Used to put things under others
```
## PGF Plot libraries and config {#pgf-plot-libraries-and-config}
```latex
\usepgfplotslibrary{patchplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=newest}
\pgfplotsset{plot coordinates/math parser=false}
```
## Setup size of figures {#setup-size-of-figures}
```latex
\newlength{\fheight}
\newlength{\fwidth}
\setlength{\fwidth}{85mm}
\setlength{\fheight}{112mm}
```
## Setup Arrows style {#setup-arrows-style}
```latex
\tikzset{>=Stealth}
% Setup default Linewidth
\tikzset{every path/.style={line width=1pt}}
```
## Colors {#colors}
```latex
\usepackage{xcolor}% Color extension
\definecolor{mycolor1}{RGB}{79,115,193}
\definecolor{mycolor2}{RGB}{213,91,53}
\definecolor{mycolor3}{RGB}{152,126,49}
```
## Control {#control}
### Blocks {#blocks}
```latex
\tikzset{%
block/.style n args={2}{%
draw,
fill=white,
minimum width = #1,
minimum height = #2,
},
block/.default={1.2cm}{1.0cm}
}
```
### Branches {#branches}
```latex
\tikzstyle{branch}=[fill,shape=circle,minimum size=4pt,inner sep=0pt]
\tikzstyle{->top}=[-{Stealth[color=black, scale=0.8]}, draw=white, double=black, double distance=1pt, line width=1pt]
\tikzstyle{<-top}=[{stealth[color=black, scale=0.8]}-, draw=white, double=black, double distance=1pt, line width=1pt]
```
### Hand Writen Style {#hand-writen-style}
Usefull for schematic plots
```latex
\tikzstyle{handwriten}=[decorate,decoration={random steps,amplitude=0.1pt,segment length=0.8pt}]
```
### DAC {#dac}
```latex
\tikzset{%
DAC/.style={%
draw,
signal,
}
}
```
### ADC {#adc}
```latex
\tikzset{%
ADC/.style={%
draw,
signal,
signal to = west,
}
}
```
### Gain {#gain}
```latex
\tikzset{%
gain right/.style={%
draw,
regular polygon,
regular polygon sides = 3,
inner sep = 2pt,
shape border rotate=-90
},
gain left/.style={%
draw,
regular polygon,
regular polygon sides = 3,
inner sep = 2pt,
shape border rotate=90
},
gain top/.style={%
draw,
regular polygon,
regular polygon sides = 3,
inner sep = 2pt,
shape border rotate=0
},
gain bottom/.style={%
draw,
regular polygon,
regular polygon sides = 3,
inner sep = 2pt,
shape border rotate=180
},
}
```
### Add / Substract / Divide / Multiply block {#add-substract-divide-multiply-block}
```latex
\tikzset{% Add block with Circled operations
addc/.style n args={5}{%
draw,
fill=white,
circle,
outer sep = 0pt,
inner sep = 0pt,
minimum size = 2em,
execute at begin node={\LARGE $#1$},
append after command={\pgfextra{\let\mainnode=\tikzlastnode}
\ifx#2\empty\else
node[draw, circle, outer sep=6pt, inner sep=0pt, above left] at (\mainnode.west) {$#2$}%
\fi
\ifx#3\empty\else
node[draw, circle, outer sep=6pt, inner sep=0pt, above right] at (\mainnode.north) {$#3$}%
\fi
\ifx#4\empty\else
node[draw, circle, outer sep=6pt, inner sep=0pt, below right] at (\mainnode.east) {$#4$}%
\fi
\ifx#5\empty\else
node[draw, circle, outer sep=6pt, inner sep=0pt, below left] at (\mainnode.south) {$#5$}%
\fi
}
},
addc/.default={+}{}{}{}{},
}
```
```latex
\tikzset{% Add Block
addb/.style n args={5}{%
draw,
fill=white,
circle,
outer sep = 0pt,
inner sep = 0pt,
minimum size = 2em,
execute at begin node={\LARGE $#1$},
append after command={\pgfextra{\let\mainnode=\tikzlastnode}
\ifx#2\empty\else
node[outer sep=2pt, inner sep=0pt, above left] at (\mainnode.west) {$#2$}%
\fi
\ifx#3\empty\else
node[outer sep=2pt, inner sep=0pt, above right] at (\mainnode.north) {$#3$}%
\fi
\ifx#4\empty\else
node[outer sep=2pt, inner sep=0pt, below right] at (\mainnode.east) {$#4$}%
\fi
\ifx#5\empty\else
node[outer sep=2pt, inner sep=0pt, below left] at (\mainnode.south) {$#5$}%
\fi
}
},
addb/.default={+}{}{}{}{},
}
```
## Plots {#plots}
### Default line caps {#default-line-caps}
```latex
\pgfplotsset{
every axis plot/.append style={line join=round},
every axis plot/.append style={line cap=round},
}
```
### Grid {#grid}
```latex
\pgfplotsset{grid style={black}}
\pgfplotsset{major grid style={black!30!white}}
\pgfplotsset{minor grid style={black!10!white}}
\pgfplotsset{xmajorgrids}
\pgfplotsset{ymajorgrids}
```
### Lines {#lines}
```latex
\pgfplotsset{separate axis lines=false} % draw axis as rectangle and not as 4 lines
\pgfplotsset{every outer x axis line/.append style={black}}
\pgfplotsset{every outer y axis line/.append style={black}}
\pgfplotsset{axis background/.style={fill=white}}
\pgfplotsset{axis x line*=bottom} % solid line on the bottom with thin on the top
\pgfplotsset{axis y line*=left} % solid line on the left with thin on the right
```
### Ticks {#ticks}
```latex
\pgfplotsset{every y tick label/.append style={font=\color{black}}}
\pgfplotsset{every y tick/.append style={black}}
\pgfplotsset{every x tick label/.append style={font=\color{black}}}
\pgfplotsset{every x tick/.append style={black}}
```
### Size {#size}
If `scale only axis=false` (the default), pgfplots will try to produce the desired width including labels, titles and ticks.
```latex
\pgfplotsset{scale only axis=true}
```
### Label {#label}
Used to align all of ylabel of one figure.
```latex
\pgfplotsset{ylabel absolute}
```
### Legend {#legend}
```latex
% https://tex.stackexchange.com/questions/54794/using-a-pgfplots-style-legend-in-a-plain-old-tikzpicture#54834
% argument #1: any options
\newenvironment{customlegend}[1][]{%
\begingroup
% inits/clears the lists (which might be populated from previous
% axes):
\csname pgfplots@init@cleared@structures\endcsname
\pgfplotsset{#1}%
}{%
% draws the legend:
\csname pgfplots@createlegend\endcsname
\endgroup
}%
% makes \addlegendimage available (typically only available within an
% axis environment):
\def\addlegendimage{\csname pgfplots@addlegendimage\endcsname}
% definition to insert numbers
% \pgfkeys{/pgfplots/number in legend/.style={%
% /pgfplots/legend image code/.code={%
% \node at (0.125,-0.0225){#1}; % <= changed x value
% },%
% },
% }
\pgfplotsset{
every legend to name picture/.style={west}
}
```
### Upper and Lower bounds {#upper-and-lower-bounds}
```latex
\pgfplotsset{upperbound}=[line cap=round, postaction={decorate,draw,decoration={border, segment length=0.2cm, amplitude=0.3cm, angle=60}}]
\pgfplotsset{lowerbound}=[line cap=round, postaction={decorate,draw,decoration={border, segment length=0.2cm, amplitude=0.3cm, angle=-60}}]
```
And we add the corresdonding
```latex
\pgfplotsset{
/pgfplots/upperbound/.style 1 args={
legend image code/.code={
\draw[##1, upperbound]
plot coordinates {
(0cm,0cm)
(0.6cm,0cm)
}
}
}
}
```
### Pole {#pole}
```latex
\tikzset{%
pole/.style{%
color=red,
cross out,
draw,
inner sep=0pt,
outer sep=0pt,
minimum size=#1pt
},
pole/.default={4}
}
```
### Zero {#zero}
```latex
\tikzset{%
zero/.style{%
color=red,
circle,
draw,
inner sep=0pt,
outer sep=0pt,
minimum size=#1pt
},
zero/.default={4}
}
```
## Mechanical {#mechanical}
### Spring {#spring}
```latex
\tikzset{%
spring/.style={%
thick,
decoration={
zigzag,
pre length = #1cm,
post length = #1cm,
segment length = 6
},
decorate
},
spring/.default={0.2}
}
```
### Coil {#coil}
```latex
\tikzset{%
coil/.style n args={2}{%
thick,
decoration={
coil,
pre length = #1cm,
post length = #2cm,
segment length = 4
},
decorate
},
coil/.default={0.3}{0.3}
}
```
### Damper {#damper}
```latex
\tikzset{%
damper/.style n args={2}{%
thick,
decoration={markings, mark connection node=dmp, mark=at position 0.5 with {
\node (dmp) [thick,
inner sep = 0pt,
transform shape,
rotate =-90,
minimum width = #1pt,
minimum height = #2pt,
draw=none] {};
\draw [thick] ($(dmp.north east)+(0.6*#2pt,0)$) -- (dmp.south east) -- (dmp.south west) -- ($(dmp.north west)+(0.6*#2pt,0)$);
\draw [thick] ($(dmp.north)+(0,-0.3*#1pt)$) -- ($(dmp.north)+(0,0.3*#1pt)$);
}
},
decorate
},
damper/.default={12}{3}
}
```
### Actuator {#actuator}
```latex
\tikzset{%
actuator/.style n args={2}{%
thick,
draw=none,
decoration={
markings,
mark connection node=my node,
mark=at position .5 with {
\node [draw, inner sep=0pt, minimum width=#1cm, minimum height=#2cm,
transform shape, fill=white] (my node) {};
},
mark=at position .0 with {
\draw[<-] (0, 0) -- (my node);
},
mark=at position 1.0 with {
\draw[<-] (0, 0) -- (my node);
}
},
decorate
},
actuator/.default={0.5}{0.2}
}
```
### Ground {#ground}
```latex
\tikzset{%
ground/.style n args={2}{%
fill,
pattern = north east lines,
draw = none,
anchor = north,
minimum width = #1cm,
minimum height = #2cm,
append after command={
(\tikzlastnode.north west) edge (\tikzlastnode.north east)
}
},
ground/.default={2.5}{0.3}
}
```
### Force Sensor {#force-sensor}
```latex
\tikzset{%
forcesensor/.style n args={2}{%
rectangle,
outer sep=0pt,
inner sep=0pt,
draw=black,
fill=white!60!black,
anchor=south,
minimum width =#1cm,
minimum height=#2cm,
append after command={
[every edge/.append style={
thick,
black,
}]
(\tikzlastnode.north west) edge (\tikzlastnode.south east)
(\tikzlastnode.north east) edge (\tikzlastnode.south west)
}
},
forcesensor/.default={2.0}{0.5}
}
```
### Inertial Sensor {#inertial-sensor}
```latex
\tikzset{%
inertialsensor/.style={%
rectangle,
outer sep=0pt,
inner sep=0pt,
draw=black,
fill=white!60!black,
anchor=south east,
minimum size=#1cm,
append after command={
[every edge/.append style={
thick,
black,
}]
(\tikzlastnode.north west) edge (\tikzlastnode.south east)
(\tikzlastnode.north east) edge (\tikzlastnode.south west)
}
},
inertialsensor/.default={0.3}
}
```
### Cross {#cross}
```latex
\tikzstyle{cross}=[path picture={
\draw[black]
(path picture bounding box.south east) -- (path picture bounding box.north west) (path picture bounding box.south west) -- (path picture bounding box.north east);
}]
```
### Piezoelectric actuator {#piezoelectric-actuator}
```latex
\tikzset{%
piezo/.style n args={3}{%
draw,
rectangle,
minimum width = #1cm,
minimum height = #2cm,
fill=blue!10!white,
anchor=center,
append after command={
[every edge/.append style={
thick,
black,
}]
\foreach \i in {1,...,#3}{
(${\i/(1+#3)}*(\tikzlastnode.north west)+{(1+#3-\i)/(1+#3)}*(\tikzlastnode.south west)+0.1*(#1,0)$) edge (${\i/(1+#3)}*(\tikzlastnode.north east)+{(1+#3-\i)/(1+#3)}*(\tikzlastnode.south east)-0.1*(#1,0)$)
}
}
},
piezo/.default={2}{4}{10}
}
```
### Voice coil {#voice-coil}
```latex
\def\voicecoil#1#2#3{
% ======================
% Parameters
% ======================
\def\voicecoilw{#1} % Total Width
\def\voicecoilh{#2} % Total Height
\def\magnetw{\voicecoilw} % Width of the magnet
\def\magneth{\voicecoilh/1.4} % Height of the magnet
\def\magnetwb{0.15*\magnetw} % Width of the borders of the magnet
\def\magnetmw{0.15*\magnetw} % Width of the middle part of the magnet
\def\magnetwg{0.5*\magnetw} % Width of the gap of the magnet
\def\magnethl{\magnetwb} % Height of the low part of the magnet
\def\magnetmh{0.15*\magneth} % Height of the middle part of the magnet
\def\magnethg{0.2*\magneth} % Height of the gap of the magnet
% ======================
\begin{scope}[shift={(0.5*\voicecoilw, 0.5*\voicecoilh)}, rotate=#3, shift={(0, -0.5*\voicecoilh)}]
% ======================
% Magnet
% ======================
\draw[fill=white] (0, 0) -| ++(0.5*\magnetw, \magneth) -| ++(-0.5*\magnetw+0.5*\magnetwg, -\magnethg) -| (0.5*\magnetw-\magnetwb, \magnethl) -| (-0.5*\magnetw+\magnetwb, \magneth-\magnethg) -| (-0.5*\magnetwg, \magneth) -| (-0.5*\magnetw, 0) -- (cycle);
\begin{scope}[shift={(0, \magnethl)}]
\draw[fill=red] (-0.5*\magnetmw, 0) rectangle (0.5*\magnetmw, \magnetmh);
\draw[fill=blue] (-0.5*\magnetmw, \magnetmh) rectangle (0.5*\magnetmw, 2*\magnetmh);
% Top conductive Magnet
\draw[fill=white] (-0.5*\magnetmw, 2*\magnetmh) -| (0.5*\magnetmw, -\magnethl+\magneth-\magnethg) -| ++(0.1, \magnethg) -| ++(-0.2-\magnetmw, -\magnethg) -| (-0.5*\magnetmw, \magnetmh);
\end{scope}
% ======================
% ======================
% Coil
% ======================
\pgfmathsetmacro{\coilwidth}{0.5*0.5*\magnetmw+0.5*0.1+0.25*\magnetwg}%
\draw[] ( \coilwidth, 0.5*\magneth) -- ++(0, 0.7*\magneth);
\draw[] (-\coilwidth, 0.5*\magneth) -- ++(0, 0.7*\magneth);
% Point on the coil
\foreach \x in {0,1,...,9}
{
\node[circle,inner sep=0.6pt,fill] at ( \coilwidth, \x*0.7*\magneth/10+0.5*\magneth);
\node[circle,inner sep=0.6pt,fill] at (-\coilwidth, \x*0.7*\magneth/10+0.5*\magneth);
}
\draw[fill=white] (-0.5*\magnetw, 1.2*\magneth) rectangle ++(\magnetw, \magnethg);
% ======================
% ======================
% Coordinates
% ======================
% Force
\coordinate[] (vc_force) at (0, \magneth-0.5*\magnethg);
% Coil
\coordinate[] (vc_coil) at (0, \voicecoilh);
% Magnet
\coordinate[] (vc_magnet) at (0, 0);
% Coil Wires
\coordinate[] (vc_wire_one) at ( \coilwidth, 1.2*\magneth);
\coordinate[] (vc_wire_two) at (-\coilwidth, 1.2*\magneth);
% ======================
\end{scope}
}
```
### Axis Rotator {#axis-rotator}
```latex
\newcommand{\AxisRotator}[1][rotate=0]{%
\tikz [x=0.1cm,y=0.30cm,-stealth,#1] \draw (0,0) arc (-150:150:1 and 1);%
}
```
## Optics {#optics}
```latex
\tikzset{%
->-/.style={
decoration={
markings,
mark = at position #1 with {\arrow{>}
}
},
postaction={decorate}
}
}
\tikzset{%
-<-/.style={
decoration={
markings,
mark = at position #1 with {\arrow{<}
}
},
postaction={decorate}
}
}
```
## Misc {#misc}
```latex
\tikzset{%
labelc/.style= {%
draw,
fill=white,
shape=circle,
inner sep=2pt,
outer sep=6pt,
}
}
```
## More Defaults specific to this paper {#more-defaults-specific-to-this-paper}
```latex
\tikzset{block/.default={0.8cm}{0.8cm}}
\tikzset{addb/.append style={scale=0.7}}
\tikzset{node distance=0.6}
```
Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

@@ -0,0 +1,57 @@
+++
title = "Active Damping of Rotating Platforms using Integral Force Feedback"
author = ["Dehaeze Thomas"]
draft = false
venue = "ISMA 2020"
year = 2020
pubtype = "conference"
code = "https://git.tdehaeze.xyz/tdehaeze/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb"
video = "https://www.youtube.com/watch?v=F9j2-ge2FPE"
+++
> **Abstract**:
>
> This paper investigates the use of Integral Force Feedback (IFF) for the active damping of rotating mechanical systems.
> Guaranteed stability, typical benefit of IFF, is lost as soon as the system is rotating due to gyroscopic effects.
> To overcome this issue, two modifications of the classical IFF control scheme are proposed.
> The first consists of slightly modifying the control law while the second consists of adding springs in parallel with the force sensors.
> Conditions for stability and optimal parameters are derived.
> The results reveal that, despite their different implementations, both modified IFF control scheme have almost identical damping authority on suspension modes.
## Conference Paper ([pdf](paper/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb.pdf)) {#conference-paper--pdf-paper-dehaeze20-activ-dampin-rotat-platf-integ-force-feedb-dot-pdf}
To cite this conference paper use the following bibtex code.
```bibtex
@inproceedings{dehaeze20_activ_dampin_rotat_platf_integ_force_feedb,
author = {Dehaeze, T. and Collette, C.},
title = {Active Damping of Rotating Platforms using Integral Force
Feedback},
booktitle = {Proceedings of the International Conference on Modal
Analysis Noise and Vibration Engineering (ISMA)},
year = 2020,
}
```
You can also use the formatted citation below.
> Dehaeze, T., &amp; Collette, C., Active damping of rotating platforms using integral force feedback, In , Proceedings of the International Conference on Modal Analysis Noise and Vibration Engineering (ISMA) (pp. ) (2020)
## Matlab Scripts ([link]({{< relref "matlab/index.md" >}})) {#matlab-scripts--link-matlab-index-dot-md}
The Matlab scripts that permits to obtain all the results presented in the paper are accessible [here]({{< relref "matlab/index.md" >}}).
## Figures ([link]({{< relref "tikz/_index.md" >}})) {#figures--link-tikz-index-dot-md}
All the figures in the paper are generated using either [TikZ](https://sourceforge.net/projects/pgf/) or [Inkscape](https://inkscape.org/). The code snippets that was used to generate the figures are accessible [here]({{< relref "tikz/_index.md" >}}).
## Talk ([link](talk/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb_talk.pdf)) {#talk--link-talk-dehaeze20-activ-dampin-rotat-platf-integ-force-feedb-talk-dot-pdf}
<iframe width="720"
height="540"
src="https://www.youtube.com/embed/F9j2-ge2FPE"
frameborder="0" allowfullscreen> </iframe>
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

@@ -0,0 +1,959 @@
+++
title = "Active Damping of Rotating Platforms using Integral Force Feedback - Matlab Computation"
author = ["Dehaeze Thomas"]
draft = false
+++
<hr>
<p>This report is also available as a <a href="./index.pdf">pdf</a>.</p>
<hr>
This document gathers the Matlab code used to for the conference paper (<a href="#citeproc_bib_item_1">Dehaeze and Collette 2020</a>) and the journal paper (<a href="#citeproc_bib_item_3">Dehaeze and Collette 2021</a>).
It is structured in several sections:
- Section : presents a simple model of a rotating suspended platform that will be used throughout this study.
- Section : explains how the unconditional stability of IFF is lost due to Gyroscopic effects induced by the rotation.
- Section : suggests a simple modification of the control law such that damping can be added to the suspension modes in a robust way.
- Section : proposes to add springs in parallel with the force sensors to regain the unconditional stability of IFF.
- Section : compares both proposed modifications to the classical IFF in terms of damping authority and closed-loop system behavior.
- Section : contains the notations used for both the Matlab code and the paper
The matlab code is accessible on [Zonodo](https://zenodo.org/record/3894343) and [Github](https://github.com/tdehaeze/dehaeze20_contr_stewa_platf) (<a href="#citeproc_bib_item_2">Dehaeze 2020</a>). It can also be download as a `.zip` file [here](https://git.tdehaeze.xyz/tdehaeze/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/archive/master.zip).
To run the Matlab code, go in the `matlab` directory and run the following Matlab files corresponding to each section.
<div class="table-caption">
<span class="table-number">Table 1:</span>
Paper's sections and corresponding Matlab files
</div>
| Sections | Matlab File |
|----------|----------------------------|
| Section | `s1_system_description.m` |
| Section | `s2_iff_pure_int.m` |
| Section | `s3_iff_hpf.m` |
| Section | `s4_iff_kp.m` |
| Section | `s5_act_damp_comparison.m` |
## System Description and Analysis {#system-description-and-analysis}
<span class="org-target" id="org-target--sec-system-description"></span>
### System description {#system-description}
The system consists of one 2 degree of freedom translation stage on top of a spindle (figure [Figure 1](#figure--fig:system)).
<a id="figure--fig:system"></a>
{{< figure src="system.png" caption="<span class='figure-number'>Figure 1: </span>Schematic of the studied system" >}}
The control inputs are the forces applied by the actuators of the translation stage (\\(F\_u\\) and \\(F\_v\\)).
As the translation stage is rotating around the Z axis due to the spindle, the forces are applied along \\(\vec{i}\_u\\) and \\(\vec{i}\_v\\).
### Equations {#equations}
Based on the Figure [Figure 1](#figure--fig:system), the equations of motions are:
<div class="important">
\begin{equation}
\begin{bmatrix} d\_u \\\ d\_v \end{bmatrix} =
\bm{G}\_d
\begin{bmatrix} F\_u \\\ F\_v \end{bmatrix}
\end{equation}
Where \\(\bm{G}\_d\\) is a \\(2 \times 2\\) transfer function matrix.
\begin{equation}
\bm{G}\_d = \frac{1}{k} \frac{1}{G\_{dp}}
\begin{bmatrix}
G\_{dz} & G\_{dc} \\\\
-G\_{dc} & G\_{dz}
\end{bmatrix}
\end{equation}
With:
\begin{align}
G\_{dp} &= \left( \frac{s^2}{{\omega\_0}^2} + 2 \xi \frac{s}{\omega\_0} + 1 - \frac{{\Omega}^2}{{\omega\_0}^2} \right)^2 + \left( 2 \frac{\Omega}{\omega\_0} \frac{s}{\omega\_0} \right)^2 \\\\
G\_{dz} &= \frac{s^2}{{\omega\_0}^2} + 2 \xi \frac{s}{\omega\_0} + 1 - \frac{{\Omega}^2}{{\omega\_0}^2} \\\\
G\_{dc} &= 2 \frac{\Omega}{\omega\_0} \frac{s}{\omega\_0}
\end{align}
</div>
### Numerical Values {#numerical-values}
Let's define initial values for the model.
```matlab
k = 1; % Actuator Stiffness [N/m]
c = 0.05; % Actuator Damping [N/(m/s)]
m = 1; % Payload mass [kg]
```
```matlab
xi = c/(2*sqrt(k*m));
w0 = sqrt(k/m); % [rad/s]
```
### Campbell Diagram {#campbell-diagram}
The Campbell Diagram displays the evolution of the real and imaginary parts of the system as a function of the rotating speed.
It is shown in Figures [Figure 2](#figure--fig:campbell-diagram-real) and [Figure 3](#figure--fig:campbell-diagram-imag), and one can see that the system becomes unstable for \\(\Omega > \omega\_0\\) (the real part of one of the poles becomes positive).
<a id="figure--fig:campbell-diagram-real"></a>
{{< figure src="figs/campbell_diagram_real.png" caption="<span class='figure-number'>Figure 2: </span>Campbell Diagram - Real Part" >}}
<a id="figure--fig:campbell-diagram-imag"></a>
{{< figure src="figs/campbell_diagram_imag.png" caption="<span class='figure-number'>Figure 3: </span>Campbell Diagram - Imaginary Part" >}}
### Simscape Model {#simscape-model}
In order to validate all the equations of motion, a Simscape model of the same system has been developed.
The dynamics of the system can be identified from the Simscape model and compare with the analytical model.
The rotating speed for the Simscape Model is defined.
```matlab
W = 0.1; % Rotation Speed [rad/s]
```
```matlab
open('rotating_frame.slx');
```
The transfer function from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) is identified from the Simscape model.
```matlab
%% Name of the Simulink File
mdl = 'rotating_frame';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/K'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/G'], 2, 'openoutput'); io_i = io_i + 1;
```
```matlab
G = linearize(mdl, io, 0);
%% Input/Output definition
G.InputName = {'Fu', 'Fv'};
G.OutputName = {'du', 'dv'};
```
The same transfer function from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) is written down from the analytical model.
```matlab
Gth = (1/k)/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
[(s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2), 2*W*s/(w0^2) ; ...
-2*W*s/(w0^2), (s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)];
```
Both transfer functions are compared in Figure [Figure 4](#figure--fig:plant-simscape-analytical) and are found to perfectly match.
<a id="figure--fig:plant-simscape-analytical"></a>
{{< figure src="figs/plant_simscape_analytical.png" caption="<span class='figure-number'>Figure 4: </span>Bode plot of the transfer function from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) as identified from the Simscape model and from an analytical model" >}}
### Effect of the rotation speed {#effect-of-the-rotation-speed}
The transfer functions from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) are identified for the following rotating speeds.
```matlab
Ws = [0, 0.2, 0.7, 1.1]*w0; % Rotating Speeds [rad/s]
```
```matlab
Gs = {zeros(2, 2, length(Ws))};
for W_i = 1:length(Ws)
W = Ws(W_i);
Gs(:, :, W_i) = {(1/k)/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
[(s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2), 2*W*s/(w0^2) ; ...
-2*W*s/(w0^2), (s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)]};
end
```
They are compared in Figures [Figure 5](#figure--fig:plant-compare-rotating-speed-direct) and [Figure 6](#figure--fig:plant-compare-rotating-speed-coupling).
<a id="figure--fig:plant-compare-rotating-speed-direct"></a>
{{< figure src="figs/plant_compare_rotating_speed_direct.png" caption="<span class='figure-number'>Figure 5: </span>Comparison of the transfer functions from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) for several rotating speed - Direct Terms" >}}
<a id="figure--fig:plant-compare-rotating-speed-coupling"></a>
{{< figure src="figs/plant_compare_rotating_speed_coupling.png" caption="<span class='figure-number'>Figure 6: </span>Comparison of the transfer functions from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) for several rotating speed - Coupling Terms" >}}
## Problem with pure Integral Force Feedback {#problem-with-pure-integral-force-feedback}
<span class="org-target" id="org-target--sec-iff-pure-int"></span>
Force sensors are added in series with the two actuators (Figure [Figure 7](#figure--fig:system-iff)).
Two identical controllers \\(K\_F\\) are used to feedback each of the sensed force to its associated actuator.
<a id="figure--fig:system-iff"></a>
{{< figure src="system_iff.png" caption="<span class='figure-number'>Figure 7: </span>System with added Force Sensor in series with the actuators" >}}
### Plant Parameters {#plant-parameters}
Let's define initial values for the model.
```matlab
k = 1; % Actuator Stiffness [N/m]
c = 0.05; % Actuator Damping [N/(m/s)]
m = 1; % Payload mass [kg]
```
```matlab
xi = c/(2*sqrt(k*m));
w0 = sqrt(k/m); % [rad/s]
```
### Equations {#equations}
The sensed forces are equal to:
\begin{equation}
\begin{bmatrix} f\_{u} \\\ f\_{v} \end{bmatrix} =
\begin{bmatrix}
1 & 0 \\\\
0 & 1
\end{bmatrix}
\begin{bmatrix} F\_u \\\ F\_v \end{bmatrix} - (c s + k)
\begin{bmatrix} d\_u \\\ d\_v \end{bmatrix}
\end{equation}
Which then gives:
<div class="important">
\begin{equation}
\begin{bmatrix} f\_{u} \\\ f\_{v} \end{bmatrix} =
\bm{G}\_{f}
\begin{bmatrix} F\_u \\\ F\_v \end{bmatrix}
\end{equation}
\begin{equation}
\begin{bmatrix} f\_{u} \\\ f\_{v} \end{bmatrix} =
\frac{1}{G\_{fp}}
\begin{bmatrix}
G\_{fz} & -G\_{fc} \\\\
G\_{fc} & G\_{fz}
\end{bmatrix}
\begin{bmatrix} F\_u \\\ F\_v \end{bmatrix}
\end{equation}
\begin{align}
G\_{fp} &= \left( \frac{s^2}{{\omega\_0}^2} + 2 \xi \frac{s}{\omega\_0} + 1 - \frac{{\Omega}^2}{{\omega\_0}^2} \right)^2 + \left( 2 \frac{\Omega}{\omega\_0} \frac{s}{\omega\_0} \right)^2 \\\\
G\_{fz} &= \left( \frac{s^2}{{\omega\_0}^2} - \frac{\Omega^2}{{\omega\_0}^2} \right) \left( \frac{s^2}{{\omega\_0}^2} + 2 \xi \frac{s}{\omega\_0} + 1 - \frac{{\Omega}^2}{{\omega\_0}^2} \right) + \left( 2 \frac{\Omega}{\omega\_0} \frac{s}{\omega\_0} \right)^2 \\\\
G\_{fc} &= \left( 2 \xi \frac{s}{\omega\_0} + 1 \right) \left( 2 \frac{\Omega}{\omega\_0} \frac{s}{\omega\_0} \right)
\end{align}
</div>
### Comparison of the Analytical Model and the Simscape Model {#comparison-of-the-analytical-model-and-the-simscape-model}
The rotation speed is set to \\(\Omega = 0.1 \omega\_0\\).
```matlab
W = 0.1*w0; % [rad/s]
```
```matlab
open('rotating_frame.slx');
```
And the transfer function from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) is identified using the Simscape model.
```matlab
%% Name of the Simulink File
mdl = 'rotating_frame';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/K'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/G'], 1, 'openoutput'); io_i = io_i + 1;
```
```matlab
Giff = linearize(mdl, io, 0);
%% Input/Output definition
Giff.InputName = {'Fu', 'Fv'};
Giff.OutputName = {'fu', 'fv'};
```
The same transfer function from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) is written down from the analytical model.
```matlab
Giff_th = 1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
[(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ...
(2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2];
```
The two are compared in Figure [Figure 8](#figure--fig:plant-iff-comp-simscape-analytical) and found to perfectly match.
<a id="figure--fig:plant-iff-comp-simscape-analytical"></a>
{{< figure src="figs/plant_iff_comp_simscape_analytical.png" caption="<span class='figure-number'>Figure 8: </span>Comparison of the transfer functions from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) between the Simscape model and the analytical one" >}}
### Effect of the rotation speed {#effect-of-the-rotation-speed}
The transfer functions from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) are identified for the following rotating speeds.
```matlab
Ws = [0, 0.2, 0.7]*w0; % Rotating Speeds [rad/s]
```
```matlab
Gsiff = {zeros(2, 2, length(Ws))};
for W_i = 1:length(Ws)
W = Ws(W_i);
Gsiff(:, :, W_i) = {1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
[(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ...
(2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2]};
end
```
The obtained transfer functions are shown in Figure [Figure 9](#figure--fig:plant-iff-compare-rotating-speed).
<a id="figure--fig:plant-iff-compare-rotating-speed"></a>
{{< figure src="figs/plant_iff_compare_rotating_speed.png" caption="<span class='figure-number'>Figure 9: </span>Comparison of the transfer functions from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) for several rotating speed" >}}
### Decentralized Integral Force Feedback {#decentralized-integral-force-feedback}
The decentralized IFF controller consists of pure integrators:
\begin{equation}
\bm{K}\_{\text{IFF}}(s) = \frac{g}{s} \begin{bmatrix}
1 & 0 \\\\
0 & 1
\end{bmatrix}
\end{equation}
The Root Locus (evolution of the poles of the closed loop system in the complex plane as a function of \\(g\\)) is shown in Figure [Figure 10](#figure--fig:root-locus-pure-iff).
It is shown that for non-null rotating speed, one pole is bound to the right-half plane, and thus the closed loop system is unstable.
<a id="figure--fig:root-locus-pure-iff"></a>
{{< figure src="figs/root_locus_pure_iff.png" caption="<span class='figure-number'>Figure 10: </span>Root Locus for the Decentralized Integral Force Feedback controller. Several rotating speed are shown." >}}
## Integral Force Feedback with an High Pass Filter {#integral-force-feedback-with-an-high-pass-filter}
<span class="org-target" id="org-target--sec-iff-pseudo-int"></span>
### Plant Parameters {#plant-parameters}
Let's define initial values for the model.
```matlab
k = 1; % Actuator Stiffness [N/m]
c = 0.05; % Actuator Damping [N/(m/s)]
m = 1; % Payload mass [kg]
```
```matlab
xi = c/(2*sqrt(k*m));
w0 = sqrt(k/m); % [rad/s]
```
### Modified Integral Force Feedback Controller {#modified-integral-force-feedback-controller}
Let's modify the initial Integral Force Feedback Controller ; instead of using pure integrators, pseudo integrators (i.e. low pass filters) are used:
\begin{equation}
K\_{\text{IFF}}(s) = g\frac{1}{\omega\_i + s} \begin{bmatrix}
1 & 0 \\\\
0 & 1
\end{bmatrix}
\end{equation}
where \\(\omega\_i\\) characterize down to which frequency the signal is integrated.
Let's arbitrary choose the following control parameters:
```matlab
g = 2;
wi = 0.1*w0;
```
And the following rotating speed.
```matlab
Giff = 1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
[(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ...
(2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2];
```
The obtained Loop Gain is shown in Figure [Figure 11](#figure--fig:loop-gain-modified-iff).
<a id="figure--fig:loop-gain-modified-iff"></a>
{{< figure src="figs/loop_gain_modified_iff.png" caption="<span class='figure-number'>Figure 11: </span>Loop Gain for the modified IFF controller" >}}
### Root Locus {#root-locus}
As shown in the Root Locus plot (Figure [Figure 12](#figure--fig:root-locus-modified-iff)), for some value of the gain, the system remains stable.
<a id="figure--fig:root-locus-modified-iff"></a>
{{< figure src="figs/root_locus_modified_iff.png" caption="<span class='figure-number'>Figure 12: </span>Root Locus for the modified IFF controller" >}}
<a id="figure--fig:root-locus-modified-iff-zoom"></a>
{{< figure src="figs/root_locus_modified_iff_zoom.png" caption="<span class='figure-number'>Figure 13: </span>Root Locus for the modified IFF controller - Zoom" >}}
### What is the optimal \\(\omega\_i\\) and \\(g\\)? {#what-is-the-optimal-omega-i-and-g}
In order to visualize the effect of \\(\omega\_i\\) on the attainable damping, the Root Locus is displayed in Figure [Figure 14](#figure--fig:root-locus-wi-modified-iff) for the following \\(\omega\_i\\):
```matlab
wis = [0.01, 0.1, 0.5, 1]*w0; % [rad/s]
```
<a id="figure--fig:root-locus-wi-modified-iff"></a>
{{< figure src="figs/root_locus_wi_modified_iff.png" caption="<span class='figure-number'>Figure 14: </span>Root Locus for the modified IFF controller (zoomed plot on the left)" >}}
<a id="figure--fig:root-locus-wi-modified-iff-zoom"></a>
{{< figure src="figs/root_locus_wi_modified_iff_zoom.png" caption="<span class='figure-number'>Figure 15: </span>Root Locus for the modified IFF controller (zoomed plot on the left)" >}}
For the controller
\begin{equation}
K\_{\text{IFF}}(s) = g\frac{1}{\omega\_i + s} \begin{bmatrix}
1 & 0 \\\\
0 & 1
\end{bmatrix}
\end{equation}
The gain at which the system becomes unstable is
\begin{equation}
g\_\text{max} = \omega\_i \left( \frac{{\omega\_0}^2}{\Omega^2} - 1 \right) \label{eq:iff\_gmax}
\end{equation}
While it seems that small \\(\omega\_i\\) do allow more damping to be added to the system (Figure [Figure 14](#figure--fig:root-locus-wi-modified-iff)), the control gains may be limited to small values due to \ref{eq:iff\_gmax} thus reducing the attainable damping.
There must be an optimum for \\(\omega\_i\\).
To find the optimum, the gain that maximize the simultaneous damping of the mode is identified for a wide range of \\(\omega\_i\\) (Figure [Figure 16](#figure--fig:mod-iff-damping-wi)).
```matlab
wis = logspace(-2, 1, 100)*w0; % [rad/s]
opt_xi = zeros(1, length(wis)); % Optimal simultaneous damping
opt_gain = zeros(1, length(wis)); % Corresponding optimal gain
for wi_i = 1:length(wis)
wi = wis(wi_i);
Kiff = 1/(s + wi)*eye(2);
fun = @(g)computeSimultaneousDamping(g, Giff, Kiff);
[g_opt, xi_opt] = fminsearch(fun, 0.5*wi*((w0/W)^2 - 1));
opt_xi(wi_i) = 1/xi_opt;
opt_gain(wi_i) = g_opt;
end
```
<a id="figure--fig:mod-iff-damping-wi"></a>
{{< figure src="figs/mod_iff_damping_wi.png" caption="<span class='figure-number'>Figure 16: </span>Simultaneous attainable damping of the closed loop poles as a function of \\(\omega\_i\\)" >}}
## IFF with a stiffness in parallel with the force sensor {#iff-with-a-stiffness-in-parallel-with-the-force-sensor}
<span class="org-target" id="org-target--sec-iff-parallel-stiffness"></span>
### Schematic {#schematic}
In this section additional springs in parallel with the force sensors are added to counteract the negative stiffness induced by the rotation.
<a id="figure--fig:system-parallel-springs"></a>
{{< figure src="system_parallel_springs.png" caption="<span class='figure-number'>Figure 17: </span>Studied system with additional springs in parallel with the actuators and force sensors" >}}
In order to keep the overall stiffness \\(k = k\_a + k\_p\\) constant, a scalar parameter \\(\alpha\\) (\\(0 \le \alpha < 1\\)) is defined to describe the fraction of the total stiffness in parallel with the actuator and force sensor
\begin{equation}
k\_p = \alpha k, \quad k\_a = (1 - \alpha) k
\end{equation}
### Equations {#equations}
<div class="important">
\begin{equation}
\begin{bmatrix} f\_u \\\ f\_v \end{bmatrix} =
\bm{G}\_k
\begin{bmatrix} F\_u \\\ F\_v \end{bmatrix}
\end{equation}
\begin{equation}
\begin{bmatrix} f\_u \\\ f\_v \end{bmatrix} =
\frac{1}{G\_{kp}}
\begin{bmatrix}
G\_{kz} & -G\_{kc} \\\\
G\_{kc} & G\_{kz}
\end{bmatrix}
\begin{bmatrix} F\_u \\\ F\_v \end{bmatrix}
\end{equation}
With:
\begin{align}
G\_{kp} &= \left( \frac{s^2}{{\omega\_0}^2} + 2\xi \frac{s}{{\omega\_0}^2} + 1 - \frac{\Omega^2}{{\omega\_0}^2} \right)^2 + \left( 2 \frac{\Omega}{\omega\_0}\frac{s}{\omega\_0} \right)^2 \\\\
G\_{kz} &= \left( \frac{s^2}{{\omega\_0}^2} - \frac{\Omega^2}{{\omega\_0}^2} + \alpha \right) \left( \frac{s^2}{{\omega\_0}^2} + 2\xi \frac{s}{{\omega\_0}^2} + 1 - \frac{\Omega^2}{{\omega\_0}^2} \right) + \left( 2 \frac{\Omega}{\omega\_0}\frac{s}{\omega\_0} \right)^2 \\\\
G\_{kc} &= \left( 2 \xi \frac{s}{\omega\_0} + 1 - \alpha \right) \left( 2 \frac{\Omega}{\omega\_0}\frac{s}{\omega\_0} \right)
\end{align}
</div>
If we compare \\(G\_{kz}\\) and \\(G\_{fz}\\), we see that the spring in parallel adds a term \\(\alpha\\).
In order to have two complex conjugate zeros (instead of real zeros):
\begin{equation}
\alpha > \frac{\Omega^2}{{\omega\_0}^2} \quad \Leftrightarrow \quad k\_p > m \Omega^2
\end{equation}
### Plant Parameters {#plant-parameters}
Let's define initial values for the model.
```matlab
k = 1; % Actuator Stiffness [N/m]
c = 0.05; % Actuator Damping [N/(m/s)]
m = 1; % Payload mass [kg]
```
```matlab
xi = c/(2*sqrt(k*m));
w0 = sqrt(k/m); % [rad/s]
```
### Comparison of the Analytical Model and the Simscape Model {#comparison-of-the-analytical-model-and-the-simscape-model}
The same transfer function from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) is written down from the analytical model.
```matlab
W = 0.1*w0; % [rad/s]
kp = 1.5*m*W^2;
cp = 0;
```
```matlab
open('rotating_frame.slx');
```
```matlab
%% Name of the Simulink File
mdl = 'rotating_frame';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/K'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/G'], 1, 'openoutput'); io_i = io_i + 1;
Giff = linearize(mdl, io, 0);
%% Input/Output definition
Giff.InputName = {'Fu', 'Fv'};
Giff.OutputName = {'fu', 'fv'};
```
```matlab
w0p = sqrt((k + kp)/m);
xip = c/(2*sqrt((k+kp)*m));
Giff_th = 1/( (s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2)^2 + (2*(s/w0p)*(W/w0p))^2 ) * [ ...
(s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2, -(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p));
(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)), (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2 ];
Giff_th.InputName = {'Fu', 'Fv'};
Giff_th.OutputName = {'fu', 'fv'};
```
<a id="figure--fig:plant-iff-kp-comp-simscape-analytical"></a>
{{< figure src="figs/plant_iff_kp_comp_simscape_analytical.png" caption="<span class='figure-number'>Figure 18: </span>Comparison of the transfer functions from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) between the Simscape model and the analytical one" >}}
### Effect of the parallel stiffness on the IFF plant {#effect-of-the-parallel-stiffness-on-the-iff-plant}
The rotation speed is set to \\(\Omega = 0.1 \omega\_0\\).
```matlab
W = 0.1*w0; % [rad/s]
```
And the IFF plant (transfer function from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\)) is identified in three different cases:
- without parallel stiffness
- with a small parallel stiffness \\(k\_p < m \Omega^2\\)
- with a large parallel stiffness \\(k\_p > m \Omega^2\\)
The results are shown in Figure [Figure 19](#figure--fig:plant-iff-kp).
One can see that for \\(k\_p > m \Omega^2\\), the systems shows alternating complex conjugate poles and zeros.
```matlab
kp = 0;
w0p = sqrt((k + kp)/m);
xip = c/(2*sqrt((k+kp)*m));
Giff = 1/( (s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2)^2 + (2*(s/w0p)*(W/w0p))^2 ) * [ ...
(s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2, -(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p));
(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)), (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2];
```
```matlab
kp = 0.5*m*W^2;
k = 1 - kp;
w0p = sqrt((k + kp)/m);
xip = c/(2*sqrt((k+kp)*m));
Giff_s = 1/( (s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2)^2 + (2*(s/w0p)*(W/w0p))^2 ) * [ ...
(s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2, -(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p));
(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)), (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2];
```
```matlab
kp = 1.5*m*W^2;
k = 1 - kp;
w0p = sqrt((k + kp)/m);
xip = c/(2*sqrt((k+kp)*m));
Giff_l = 1/( (s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2)^2 + (2*(s/w0p)*(W/w0p))^2 ) * [ ...
(s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2, -(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p));
(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)), (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2];
```
<a id="figure--fig:plant-iff-kp"></a>
{{< figure src="figs/plant_iff_kp.png" caption="<span class='figure-number'>Figure 19: </span>Transfer function from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) for \\(k\_p = 0\\), \\(k\_p < m \Omega^2\\) and \\(k\_p > m \Omega^2\\)" >}}
### IFF when adding a spring in parallel {#iff-when-adding-a-spring-in-parallel}
In Figure [Figure 20](#figure--fig:root-locus-iff-kp) is displayed the Root Locus in the three considered cases with
\begin{equation}
K\_{\text{IFF}} = \frac{g}{s} \begin{bmatrix}
1 & 0 \\\\
0 & 1
\end{bmatrix}
\end{equation}
One can see that for \\(k\_p > m \Omega^2\\), the root locus stays in the left half of the complex plane and thus the control system is unconditionally stable.
Thus, decentralized IFF controller with pure integrators can be used if:
\begin{equation}
k\_{p} > m \Omega^2
\end{equation}
<a id="figure--fig:root-locus-iff-kp"></a>
{{< figure src="figs/root_locus_iff_kp.png" caption="<span class='figure-number'>Figure 20: </span>Root Locus" >}}
<a id="figure--fig:root-locus-iff-kp-zoom"></a>
{{< figure src="figs/root_locus_iff_kp_zoom.png" caption="<span class='figure-number'>Figure 21: </span>Root Locus" >}}
### Effect of \\(k\_p\\) on the attainable damping {#effect-of-k-p-on-the-attainable-damping}
However, having large values of \\(k\_p\\) may decrease the attainable damping.
To study the second point, Root Locus plots for the following values of \\(k\_p\\) are shown in Figure [Figure 22](#figure--fig:root-locus-iff-kps).
```matlab
kps = [2, 20, 40]*m*W^2;
```
It is shown that large values of \\(k\_p\\) decreases the attainable damping.
<a id="figure--fig:root-locus-iff-kps"></a>
{{< figure src="figs/root_locus_iff_kps.png" caption="<span class='figure-number'>Figure 22: </span>Root Locus plot" >}}
```matlab
alphas = logspace(-2, 0, 100);
opt_xi = zeros(1, length(alphas)); % Optimal simultaneous damping
opt_gain = zeros(1, length(alphas)); % Corresponding optimal gain
Kiff = 1/s*eye(2);
for alpha_i = 1:length(alphas)
kp = alphas(alpha_i);
k = 1 - alphas(alpha_i);
w0p = sqrt((k + kp)/m);
xip = c/(2*sqrt((k+kp)*m));
Giff = 1/( (s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2)^2 + (2*(s/w0p)*(W/w0p))^2 ) * [ ...
(s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2, -(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p));
(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)), (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2];
fun = @(g)computeSimultaneousDamping(g, Giff, Kiff);
[g_opt, xi_opt] = fminsearch(fun, 2);
opt_xi(alpha_i) = 1/xi_opt;
opt_gain(alpha_i) = g_opt;
end
```
<a id="figure--fig:opt-damp-alpha"></a>
{{< figure src="figs/opt_damp_alpha.png" caption="<span class='figure-number'>Figure 23: </span>Attainable damping ratio and corresponding controller gain for different parameter \\(\alpha\\)" >}}
## Comparison {#comparison}
<span class="org-target" id="org-target--sec-comparison"></span>
Two modifications to adapt the IFF control strategy to rotating platforms have been proposed.
These two methods are now compared in terms of added damping, closed-loop compliance and transmissibility.
### Plant Parameters {#plant-parameters}
Let's define initial values for the model.
```matlab
k = 1; % Actuator Stiffness [N/m]
c = 0.05; % Actuator Damping [N/(m/s)]
m = 1; % Payload mass [kg]
```
```matlab
xi = c/(2*sqrt(k*m));
w0 = sqrt(k/m); % [rad/s]
```
The rotating speed is set to \\(\Omega = 0.1 \omega\_0\\).
```matlab
W = 0.1*w0;
```
### Root Locus {#root-locus}
IFF with High Pass Filter
```matlab
wi = 0.1*w0; % [rad/s]
Giff = 1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
[(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ...
(2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2];
```
IFF With parallel Stiffness
```matlab
kp = 5*m*W^2;
k = k - kp;
w0p = sqrt((k + kp)/m);
xip = c/(2*sqrt((k+kp)*m));
Giff_kp = 1/( (s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2)^2 + (2*(s/w0p)*(W/w0p))^2 ) * [ ...
(s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2, -(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p));
(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)), (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2 ];
k = k + kp;
```
<a id="figure--fig:comp-root-locus"></a>
{{< figure src="figs/comp_root_locus.png" caption="<span class='figure-number'>Figure 24: </span>Root Locus plot - Comparison of IFF with additional high pass filter, IFF with additional parallel stiffness" >}}
### Controllers - Optimal Gains {#controllers-optimal-gains}
In order to compare to three considered Active Damping techniques, gains that yield maximum damping of all the modes are computed for each case.
The obtained damping ratio and control are shown below.
| | Obtained \\(\xi\\) | Control Gain |
|---------------------|--------------------|--------------|
| Modified IFF | 0.83 | 1.99 |
| IFF with \\(k\_p\\) | 0.83 | 2.02 |
### Passive Damping - Critical Damping {#passive-damping-critical-damping}
\begin{equation}
\xi = \frac{c}{2 \sqrt{km}}
\end{equation}
Critical Damping corresponds to to \\(\xi = 1\\), and thus:
\begin{equation}
c\_{\text{crit}} = 2 \sqrt{km}
\end{equation}
```matlab
c_opt = 2*sqrt(k*m);
```
### Transmissibility And Compliance {#transmissibility-and-compliance}
<span class="org-target" id="org-target--sec-comp-transmissibilty"></span>
```matlab
open('rotating_frame.slx');
```
```matlab
%% Name of the Simulink File
mdl = 'rotating_frame';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/dw'], 1, 'input'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/fd'], 1, 'input'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/Meas'], 1, 'output'); io_i = io_i + 1;
```
```matlab
G_ol = linearize(mdl, io, 0);
%% Input/Output definition
G_ol.InputName = {'Dwx', 'Dwy', 'Fdx', 'Fdy'};
G_ol.OutputName = {'Dx', 'Dy'};
```
#### Passive Damping {#passive-damping}
```matlab
kp = 0;
cp = 0;
```
```matlab
c_old = c;
c = c_opt;
```
```matlab
G_pas = linearize(mdl, io, 0);
%% Input/Output definition
G_pas.InputName = {'Dwx', 'Dwy', 'Fdx', 'Fdy'};
G_pas.OutputName = {'Dx', 'Dy'};
```
```matlab
c = c_old;
```
```matlab
Kiff = opt_gain_iff/(wi + s)*tf(eye(2));
```
```matlab
G_iff = linearize(mdl, io, 0);
%% Input/Output definition
G_iff.InputName = {'Dwx', 'Dwy', 'Fdx', 'Fdy'};
G_iff.OutputName = {'Dx', 'Dy'};
```
```matlab
kp = 5*m*W^2;
cp = 0.01;
```
```matlab
Kiff = opt_gain_kp/s*tf(eye(2));
```
```matlab
G_kp = linearize(mdl, io, 0);
%% Input/Output definition
G_kp.InputName = {'Dwx', 'Dwy', 'Fdx', 'Fdy'};
G_kp.OutputName = {'Dx', 'Dy'};
```
<a id="figure--fig:comp-transmissibility"></a>
{{< figure src="figs/comp_transmissibility.png" caption="<span class='figure-number'>Figure 25: </span>Comparison of the transmissibility" >}}
<a id="figure--fig:comp-compliance"></a>
{{< figure src="figs/comp_compliance.png" caption="<span class='figure-number'>Figure 26: </span>Comparison of the obtained Compliance" >}}
## Notations {#notations}
<span class="org-target" id="org-target--sec-notations"></span>
| | Mathematical Notation | Matlab | Unit |
|---------------------------------------|----------------------------------|---------------|---------|
| Actuator Stiffness | \\(k\\) | `k` | N/m |
| Actuator Damping | \\(c\\) | `c` | N/(m/s) |
| Payload Mass | \\(m\\) | `m` | kg |
| Damping Ratio | \\(\xi = \frac{c}{2\sqrt{km}}\\) | `xi` | |
| Actuator Force | \\(\bm{F}, F\_u, F\_v\\) | `F` `Fu` `Fv` | N |
| Force Sensor signal | \\(\bm{f}, f\_u, f\_v\\) | `f` `fu` `fv` | N |
| Relative Displacement | \\(\bm{d}, d\_u, d\_v\\) | `d` `du` `dv` | m |
| Resonance freq. when \\(\Omega = 0\\) | \\(\omega\_0\\) | `w0` | rad/s |
| Rotation Speed | \\(\Omega = \dot{\theta}\\) | `W` | rad/s |
| Low Pass Filter corner frequency | \\(\omega\_i\\) | `wi` | rad/s |
| | Mathematical Notation | Matlab | Unit |
|------------------|-----------------------|--------|---------|
| Laplace variable | \\(s\\) | `s` | |
| Complex number | \\(j\\) | `j` | |
| Frequency | \\(\omega\\) | `w` | [rad/s] |
<style>.csl-entry{text-indent: -1.5em; margin-left: 1.5em;}</style><div class="csl-bib-body">
<div class="csl-entry"><a id="citeproc_bib_item_1"></a>Dehaeze, T., and C. Collette. 2020. “Active Damping of Rotating Platforms Using Integral Force Feedback.” In <i>Proceedings of the International Conference on Modal Analysis Noise and Vibration Engineering (ISMA)</i>.</div>
<div class="csl-entry"><a id="citeproc_bib_item_2"></a>Dehaeze, Thomas. 2020. “Active Damping of Rotating Positioning Platforms.” Source Code on Zonodo. doi:<a href="https://doi.org/10.5281/zenodo.3894342">10.5281/zenodo.3894342</a>.</div>
<div class="csl-entry"><a id="citeproc_bib_item_3"></a>Dehaeze, Thomas, and Christophe Collette. 2021. “Active Damping of Rotating Platforms Using Integral Force Feedback.” <i>Engineering Research Express</i>. <a href="http://iopscience.iop.org/article/10.1088/2631-8695/abe803">http://iopscience.iop.org/article/10.1088/2631-8695/abe803</a>.</div>
</div>
Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

@@ -0,0 +1,259 @@
+++
title = "Active Damping of Rotating Platforms using Integral Force Feedback - Tikz Figures"
author = ["Dehaeze Thomas"]
draft = false
+++
Configuration file is accessible [here]({{< relref "config.md" >}}).
## X-Y Rotating Positioning Platform {#x-y-rotating-positioning-platform}
```latex
\begin{tikzpicture}
% Angle
\def\thetau{25}
% Rotational Stage
\draw[fill=black!60!white] (0, 0) circle (4.3);
\draw[fill=black!40!white] (0, 0) circle (3.8);
% Label
\node[anchor=north west, rotate=\thetau] at (-2.5, 2.5) {\small Rotating Stage};
% Rotating Scope
\begin{scope}[rotate=\thetau]
% Rotating Frame
\draw[fill=black!20!white] (-2.6, -2.6) rectangle (2.6, 2.6);
% Label
\node[anchor=north west, rotate=\thetau] at (-2.6, 2.6) {\small Suspended Platform};
% Mass
\draw[fill=white] (-1, -1) rectangle (1, 1);
% Label
\node[anchor=south west, rotate=\thetau] at (-1, -1) {\small Payload};
% Attached Points
\node[] at (-1, 0){$\bullet$};
\draw[] (-1, 0) -- ++(-0.2, 0) coordinate(cu);
\draw[] ($(cu) + (0, -0.8)$) coordinate(actu) -- ($(cu) + (0, 0.8)$) coordinate(ku);
\node[] at (0, -1){$\bullet$};
\draw[] (0, -1) -- ++(0, -0.2) coordinate(cv);
\draw[] ($(cv) + (-0.8, 0)$)coordinate(kv) -- ($(cv) + (0.8, 0)$) coordinate(actv);
% Spring and Actuator for U
\draw[actuator={0.6}{0.2}] (actu) -- node[above=0.1, rotate=\thetau]{$F_u$} (actu-|-2.6,0);
\draw[spring=0.2] (ku) -- node[above=0.1, rotate=\thetau]{$k$} (ku-|-2.6,0);
\draw[damper={8}{8}] (cu) -- node[above left=0.2 and -0.1, rotate=\thetau]{$c$} (cu-|-2.6,0);
\draw[actuator={0.6}{0.2}] (actv) -- node[left, rotate=\thetau]{$F_v$} (actv|-0,-2.6);
\draw[spring=0.2] (kv) -- node[left, rotate=\thetau]{$k$} (kv|-0,-2.6);
\draw[damper={8}{8}] (cv) -- node[left=0.1, rotate=\thetau]{$c$} (cv|-0,-2.6);
\end{scope}
% Inertial Frame
\draw[->] (-4, -4) -- ++(2, 0) node[below]{$\vec{i}_x$};
\draw[->] (-4, -4) -- ++(0, 2) node[left]{$\vec{i}_y$};
\draw[fill, color=black] (-4, -4) circle (0.06);
\node[draw, circle, inner sep=0pt, minimum size=0.3cm, label=left:$\vec{i}_z$] at (-4, -4){};
\draw[->] (0, 0) node[above left, rotate=\thetau]{$\vec{i}_w$} -- ++(\thetau:2) node[above, rotate=\thetau]{$\vec{i}_u$};
\draw[->] (0, 0) -- ++(\thetau+90:2) node[left, rotate=\thetau]{$\vec{i}_v$};
\draw[fill, color=black] (0,0) circle (0.06);
\node[draw, circle, inner sep=0pt, minimum size=0.3cm] at (0, 0){};
\draw[dashed] (0, 0) -- ++(2, 0);
\draw[] (1.5, 0) arc (0:\thetau:1.5) node[midway, right]{$\theta$};
\draw[->] (3.5, 0) arc (0:40:3.5) node[midway, left]{$\Omega$};
\end{tikzpicture}
```
{{< figure src="system.png" >}}
## X-Y Rotating Positioning Platform {#x-y-rotating-positioning-platform}
```latex
\tikzset{block/.default={0.8cm}{0.8cm}}
\tikzset{addb/.append style={scale=0.7}}
\tikzset{node distance=0.6}
\begin{tikzpicture}
\node[block={1.8cm}{2.2cm}] (G) {$\bm{G}_f$};
% Inputs of the controllers
\coordinate[] (output1) at ($(G.south east)!0.75!(G.north east)$);
\coordinate[] (output2) at ($(G.south east)!0.25!(G.north east)$);
\coordinate[] (input1) at ($(G.south west)!0.75!(G.north west)$);
\coordinate[] (input2) at ($(G.south west)!0.25!(G.north west)$);
\node[block, left=1.8 of input1] (K1) {$K_F$};
\node[block] (K2) at ($(K1.east|-input2)+(0.6, 0)$) {$K_F$};
% Connections and labels
\draw[->] (K1.east) -- (input1)node[above left]{$F_u$}node[below left]{$-$};
\draw[->] (K2.east) -- (input2)node[above left]{$F_v$}node[below left]{$-$};
\draw[->] (output1) -- ++(0.8, 0) node[above left]{$f_u$};
\draw[->] (output2) -- ++(0.8, 0) node[above left]{$f_v$};
\draw[->] ($(output1)+(0.2, 0)$)node[branch]{} -- ++(0, 1.2) -| ($(K1.west) + (-0.8, 0)$)coordinate(start) -- (K1.west);
\draw[->] ($(output2)+(0.2, 0)$)node[branch]{} -- ++(0, -1.2) -| (start|-K2) -- (K2.west);
\begin{scope}[on background layer]
\node[fit={(K1.north west) (K2.south east)}, inner sep=6pt, draw, dashed, fill=black!20!white] (K) {};
\node[below left] at (K.north east) {$\bm{K}_F$};
\end{scope}
\end{tikzpicture}
```
{{< figure src="control_diagram_iff.png" >}}
## Decentralized Integral Force Feedback {#decentralized-integral-force-feedback}
```latex
\begin{tikzpicture}
% Angle
\def\thetau{25}
% Rotational Stage
\draw[fill=black!60!white] (0, 0) circle (4.3);
\draw[fill=black!40!white] (0, 0) circle (3.8);
% Label
\node[anchor=north west, rotate=\thetau] at (-2.5, 2.5) {\small Rotating Stage};
% Rotating Scope
\begin{scope}[rotate=\thetau]
% Rotating Frame
\draw[fill=black!20!white] (-2.6, -2.6) rectangle (2.6, 2.6);
% Label
\node[anchor=north west, rotate=\thetau] at (-2.6, 2.6) {\small Suspended Platform};
% Mass
\draw[fill=white] (-1, -1) rectangle (1, 1);
% Label
\node[anchor=south west, rotate=\thetau] at (-1, -1) {\small Payload};
% Attached Points
\node[] at (-1, 0){$\bullet$};
\draw[] (-1, 0) -- ++(-0.2, 0) coordinate(au);
\node[] at (0, -1){$\bullet$};
\draw[] (0, -1) -- ++(0, -0.2) coordinate(av);
% Force Sensors
\draw[fill=white] ($(au) + (-0.2, -0.5)$) rectangle ($(au) + (0, 0.5)$);
\draw[] ($(au) + (-0.2, -0.5)$)coordinate(actu) -- ($(au) + (0, 0.5)$);
\draw[] ($(au) + (-0.2, 0.5)$)coordinate(ku) -- ($(au) + (0, -0.5)$);
\draw[fill=white] ($(av) + (-0.5, -0.2)$) rectangle ($(av) + (0.5, 0)$);
\draw[] ($(av) + ( 0.5, -0.2)$)coordinate(actv) -- ($(av) + (-0.5, 0)$);
\draw[] ($(av) + (-0.5, -0.2)$)coordinate(kv) -- ($(av) + ( 0.5, 0)$);
% Spring and Actuator for U
\draw[actuator={0.6}{0.2}] (actu) -- coordinate[midway](actumid) (actu-|-2.6,0);
\draw[spring=0.2] (ku) -- node[above=0.1, rotate=\thetau]{$k$} (ku-|-2.6,0);
% \draw[actuator={0.6}{0.2}] (actv) -- node[right, rotate=\thetau]{$F_v$} (actv|-0,-2.6);
\draw[actuator={0.6}{0.2}] (actv) -- coordinate[midway](actvmid) (actv|-0,-2.6);
\draw[spring=0.2] (kv) -- node[left, rotate=\thetau]{$k$} (kv|-0,-2.6);
\node[block={0.8cm}{0.6cm}, rotate=\thetau] (Ku) at ($(actumid) + (0, -1.2)$) {$K_{F}$};
\draw[->] ($(au) + (-0.1, -0.5)$) |- (Ku.east) node[below right, rotate=\thetau]{$f_{u}$};
\draw[->] (Ku.north) -- ($(actumid) + (0, -0.1)$) node[below left, rotate=\thetau]{$F_u$} node[below right, rotate=\thetau]{$-$};
\node[block={0.8cm}{0.6cm}, rotate=\thetau] (Kv) at ($(actvmid) + (1.2, 0)$) {$K_{F}$};
\draw[->] ($(av) + (0.5, -0.1)$) -| (Kv.north) node[above right, rotate=\thetau]{$f_{v}$};
\draw[->] (Kv.west) -- ($(actvmid) + (0.1, 0)$) node[below right, rotate=\thetau]{$F_v$} node[above right, rotate=\thetau]{$-$};
\end{scope}
% Inertial Frame
\draw[->] (-4, -4) -- ++(2, 0) node[below]{$\vec{i}_x$};
\draw[->] (-4, -4) -- ++(0, 2) node[left]{$\vec{i}_y$};
\draw[fill, color=black] (-4, -4) circle (0.06);
\node[draw, circle, inner sep=0pt, minimum size=0.3cm, label=left:$\vec{i}_z$] at (-4, -4){};
\node[draw, circle, inner sep=0pt, minimum size=0.3cm] at (0, 0){};
\draw[->] (0, 0) node[above left, rotate=\thetau]{$\vec{i}_w$} -- ++(\thetau:2) node[above, rotate=\thetau]{$\vec{i}_u$};
\draw[->] (0, 0) -- ++(\thetau+90:2) node[left, rotate=\thetau]{$\vec{i}_v$};
\draw[dashed] (0, 0) -- ++(2, 0);
\draw[] (1.5, 0) arc (0:\thetau:1.5) node[midway, right]{$\theta$};
\node[] at (0,0) {$\bullet$};
\draw[->] (3.5, 0) arc (0:40:3.5) node[midway, left]{$\Omega$};
\end{tikzpicture}
```
{{< figure src="system_iff.png" >}}
## Springs in parallel {#springs-in-parallel}
```latex
\begin{tikzpicture}
% Angle
\def\thetau{25}
% Rotational Stage
\draw[fill=black!60!white] (0, 0) circle (4.3);
\draw[fill=black!40!white] (0, 0) circle (3.8);
% Label
\node[anchor=north west, rotate=\thetau] at (-2.5, 2.5) {\small Rotating Stage};
% Rotating Scope
\begin{scope}[rotate=\thetau]
% Rotating Frame
\draw[fill=black!20!white] (-2.6, -2.6) rectangle (2.6, 2.6);
% Label
\node[anchor=north west, rotate=\thetau] at (-2.6, 2.6) {\small Suspended Platform};
% Mass
\draw[fill=white] (-1, -1) rectangle (1, 1);
% Label
\node[anchor=south west, rotate=\thetau] at (-1, -1) {\small Payload};
% Attached Points
\draw[] (-1, 0) -- ++(-0.2, 0) coordinate(au);
\draw[] (0, -1) -- ++(0, -0.2) coordinate(av);
% Force Sensors
\draw[fill=white] ($(au) + (-0.2, -0.5)$) rectangle ($(au) + (0, 0.5)$);
\draw[] ($(au) + (-0.2, -0.5)$)coordinate(actu) -- ($(au) + (0, 0.5)$);
\draw[] ($(au) + (-0.2, 0.5)$)coordinate(ku) -- ($(au) + (0, -0.5)$);
\node[below=0.1, rotate=\thetau] at ($(au) + (-0.1, -0.5)$) {$f_{u}$}
\draw[fill=white] ($(av) + (-0.5, -0.2)$) rectangle ($(av) + (0.5, 0)$);
\draw[] ($(av) + ( 0.5, -0.2)$)coordinate(actv) -- ($(av) + (-0.5, 0)$);
\draw[] ($(av) + (-0.5, -0.2)$)coordinate(kv) -- ($(av) + ( 0.5, 0)$) ;
\node[right=0.1, rotate=\thetau] at ($(av) + (0.5, -0.1)$) {$f_{v}$}
% Spring and Actuator for U
\draw[actuator={0.6}{0.2}] (actu) -- node[below=0.1, rotate=\thetau]{$F_u$} (actu-|-2.6,0);
\draw[spring=0.2] (ku) -- node[below=0.1, rotate=\thetau]{$k_a$} (ku-|-2.6,0);
\draw[spring=0.2] (-1, 0.8) -- node[above=0.1, rotate=\thetau]{$k_p$} (-1, 0.8-|-2.6,0);
\draw[actuator={0.6}{0.2}] (actv) -- node[right=0.1, rotate=\thetau]{$F_v$} (actv|-0,-2.6);
\draw[spring=0.2] (kv) -- node[right=0.1, rotate=\thetau]{$k_a$} (kv|-0,-2.6);
\draw[spring=0.2] (-0.8, -1) -- node[left=0.1, rotate=\thetau]{$k_p$} (-0.8, -1|-0,-2.6);
\end{scope}
% Inertial Frame
\draw[->] (-4, -4) -- ++(2, 0) node[below]{$\vec{i}_x$};
\draw[->] (-4, -4) -- ++(0, 2) node[left]{$\vec{i}_y$};
\draw[fill, color=black] (-4, -4) circle (0.06);
\node[draw, circle, inner sep=0pt, minimum size=0.3cm, label=left:$\vec{i}_z$] at (-4, -4){};
\node[draw, circle, inner sep=0pt, minimum size=0.3cm] at (0, 0){};
\draw[->] (0, 0) node[above left, rotate=\thetau]{$\vec{i}_w$} -- ++(\thetau:2) node[above, rotate=\thetau]{$\vec{i}_u$};
\draw[->] (0, 0) -- ++(\thetau+90:2) node[left, rotate=\thetau]{$\vec{i}_v$};
\draw[dashed] (0, 0) -- ++(2, 0);
\draw[] (1.5, 0) arc (0:\thetau:1.5) node[midway, right]{$\theta$};
\node[] at (0,0) {$\bullet$};
\draw[->] (3.5, 0) arc (0:40:3.5) node[midway, left]{$\Omega$};
\end{tikzpicture}
```
{{< figure src="system_parallel_springs.png" >}}
@@ -0,0 +1,765 @@
+++
title = "LaTeX Configuration for Tikz export"
author = ["Dehaeze Thomas"]
draft = false
+++
## Packages {#packages}
```latex
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french, english]{babel} % Last language is main language
\usepackage{lmodern} % Latin Modern Font
\usepackage{gensymb} % Generic symbols for both text and math mode
\usepackage{standalone} % Used to generate standalone Tikz
\usepackage{amsmath} % Main math Package
\usepackage{mathtools} % Extension package to amsmath
\usepackage{amsthm} % Typesetting theorems (AMS style)
\usepackage{amsfonts} % More fonts from the AMS
\usepackage{textcomp} % provide many text symbols
\usepackage{steinmetz} % For phase symbol
\usepackage{xstring} % Utils to manipulate strings
\usepackage{etoolbox} % Add basic if/then
\usepackage{esvect} % Beautyfull vectors
\usepackage{graphicx} % Enhanced support for graphics
\usepackage{grffile} % Used by matlab2tikz
\usepackage{microtype} % typographic tuning
\usepackage{setspace} % for line spacing, e.g. \onehalfspacing
\usepackage{tabularx} % table features
\usepackage{enumitem} % for simple list modifications
\usepackage{booktabs} % better table support
\usepackage{stackengine} %
\usepackage[load-configurations=abbreviations]{siunitx} % SI units
\sisetup{
locale = US,
detect-all,
range-phrase=--,
range-units=single
}
```
## Tikz related packages {#tikz-related-packages}
```latex
\usepackage{tikz} % Tikz
\usepackage{tikzscale} % Used to scale Tikz graphics
\usepackage{adjustbox} % Used to proper positioning of tikz pictures
\usepackage{circuitikz} % Draw electronic circuits
\usepackage{pgfpages} % Needed to use notes
\usepackage{pgfplots} % Used to plot functions
```
## Tikz Libraries {#tikz-libraries}
```latex
\usetikzlibrary{arrows} % Arrow tip library
\usetikzlibrary{arrows.meta} % Add some arrows
\usetikzlibrary{calc} % The library allows advanced Coordinate Calculations
\usetikzlibrary{intersections} % calculate intersections of paths
\usetikzlibrary{matrix} %
\usetikzlibrary{patterns} %
\usetikzlibrary{shapes} % Defines circle and rectangle
\usetikzlibrary{shapes.geometric} % Use for the shape diamond and isosceles triangle
\usetikzlibrary{snakes} % snake=coil and snake=zigzag using segment amplitude=10pt
\usetikzlibrary{positioning} % Additional options for placing nodes
\usetikzlibrary{3d} % Plot 3D shapes
\usetikzlibrary{spy} % Creating a magnified area
\usetikzlibrary{decorations.text} % Used to make text follows a curve
\usetikzlibrary{decorations.pathmorphing} % deformation of a path
\usetikzlibrary{decorations.markings} % Used for spring and damper
\usetikzlibrary{babel} % A tiny library that make the interaction with the babel package easier
\usetikzlibrary{plotmarks} % This library defines a number of plot marks
\usetikzlibrary{fit} % Used to make rectangle as nodes by specifying two points
\usetikzlibrary{backgrounds} % Used to put things under others
```
## PGF Plot libraries and config {#pgf-plot-libraries-and-config}
```latex
\usepgfplotslibrary{patchplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=newest}
\pgfplotsset{plot coordinates/math parser=false}
```
## Setup size of figures {#setup-size-of-figures}
```latex
\newlength{\fheight}
\newlength{\fwidth}
\setlength{\fwidth}{85mm}
\setlength{\fheight}{112mm}
```
## Setup Arrows style {#setup-arrows-style}
```latex
\tikzset{>=Stealth}
% Setup default Linewidth
\tikzset{every path/.style={line width=1pt}}
```
## Colors {#colors}
```latex
\usepackage{xcolor}% Color extension
\definecolor{colorblack}{rgb}{0, 0, 0}
\definecolor{colorblue}{rgb}{0, 0.4470, 0.7410}
\definecolor{colorred}{rgb}{0.8500, 0.3250, 0.0980}
\definecolor{coloryellow}{rgb}{0.9290, 0.6940, 0.1250}
\definecolor{colorpurple}{rgb}{0.4940, 0.1840, 0.5560}
\definecolor{colorgreen}{rgb}{0.4660, 0.6740, 0.1880}
\definecolor{colorcyan}{rgb}{0.3010, 0.7450, 0.9330}
\definecolor{colorbordeau}{rgb}{0.6350, 0.0780, 0.1840}
% Main color
\definecolor{maincolor}{RGB}{89, 9, 38}
\definecolor{secondcolor}{RGB}{20, 9, 89}
```
## Control {#control}
### Blocks {#blocks}
```latex
\tikzset{%
block/.style n args={2}{%
draw,
fill=white,
minimum width = #1,
minimum height = #2,
},
block/.default={1.2cm}{1.0cm}
}
```
### Branches {#branches}
```latex
\tikzstyle{branch}=[fill,shape=circle,minimum size=4pt,inner sep=0pt]
\tikzstyle{->top}=[-{Stealth[color=black, scale=0.8]}, draw=white, double=black, double distance=1pt, line width=1pt]
\tikzstyle{<-top}=[{stealth[color=black, scale=0.8]}-, draw=white, double=black, double distance=1pt, line width=1pt]
```
### Hand Writen Style {#hand-writen-style}
Usefull for schematic plots
```latex
\tikzstyle{handwriten}=[decorate,decoration={random steps,amplitude=0.1pt,segment length=0.8pt}]
```
### DAC {#dac}
```latex
\tikzset{%
DAC/.style={%
draw,
signal,
}
}
```
### ADC {#adc}
```latex
\tikzset{%
ADC/.style={%
draw,
signal,
signal to = west,
}
}
```
### Gain {#gain}
Maybe use `isosceles` instead of regular polygon?
```latex
\tikzset{%
gain right/.style={%
draw,
regular polygon,
regular polygon sides = 3,
inner sep = 2pt,
shape border rotate=-90
},
gain left/.style={%
draw,
regular polygon,
regular polygon sides = 3,
inner sep = 2pt,
shape border rotate=90
},
gain top/.style={%
draw,
regular polygon,
regular polygon sides = 3,
inner sep = 2pt,
shape border rotate=0
},
gain bottom/.style={%
draw,
regular polygon,
regular polygon sides = 3,
inner sep = 2pt,
shape border rotate=180
},
}
```
### Add / Substract / Divide / Multiply block {#add-substract-divide-multiply-block}
```latex
\tikzset{% Add block with Circled operations
addc/.style n args={5}{%
draw,
fill=white,
circle,
outer sep = 0pt,
inner sep = 0pt,
minimum size = 2em,
execute at begin node={\LARGE $#1$},
append after command={\pgfextra{\let\mainnode=\tikzlastnode}
\ifx#2\empty\else
node[draw, circle, outer sep=6pt, inner sep=0pt, above left] at (\mainnode.west) {$#2$}%
\fi
\ifx#3\empty\else
node[draw, circle, outer sep=6pt, inner sep=0pt, above right] at (\mainnode.north) {$#3$}%
\fi
\ifx#4\empty\else
node[draw, circle, outer sep=6pt, inner sep=0pt, below right] at (\mainnode.east) {$#4$}%
\fi
\ifx#5\empty\else
node[draw, circle, outer sep=6pt, inner sep=0pt, below left] at (\mainnode.south) {$#5$}%
\fi
}
},
addc/.default={+}{}{}{}{},
}
```
```latex
\tikzset{% Add Block
addb/.style n args={5}{%
draw,
fill=white,
circle,
outer sep = 0pt,
inner sep = 0pt,
minimum size = 2em,
execute at begin node={\LARGE $#1$},
append after command={\pgfextra{\let\mainnode=\tikzlastnode}
\ifx#2\empty\else
node[outer sep=2pt, inner sep=0pt, above left] at (\mainnode.west) {$#2$}%
\fi
\ifx#3\empty\else
node[outer sep=2pt, inner sep=0pt, above right] at (\mainnode.north) {$#3$}%
\fi
\ifx#4\empty\else
node[outer sep=2pt, inner sep=0pt, below right] at (\mainnode.east) {$#4$}%
\fi
\ifx#5\empty\else
node[outer sep=2pt, inner sep=0pt, below left] at (\mainnode.south) {$#5$}%
\fi
}
},
addb/.default={+}{}{}{}{},
}
```
## Plots {#plots}
### Grid {#grid}
```latex
\pgfplotsset{grid style={black}}
\pgfplotsset{major grid style={black!30!white}}
\pgfplotsset{minor grid style={black!10!white}}
\pgfplotsset{xmajorgrids}
\pgfplotsset{ymajorgrids}
```
### Lines {#lines}
```latex
\pgfplotsset{separate axis lines=false} % draw axis as rectangle and not as 4 lines
\pgfplotsset{every outer x axis line/.append style={black}}
\pgfplotsset{every outer y axis line/.append style={black}}
\pgfplotsset{axis background/.style={fill=white}}
\pgfplotsset{axis x line*=bottom} % solid line on the bottom with thin on the top
\pgfplotsset{axis y line*=left} % solid line on the left with thin on the right
```
### Ticks {#ticks}
```latex
\pgfplotsset{every y tick label/.append style={font=\color{black}}}
\pgfplotsset{every y tick/.append style={black}}
\pgfplotsset{every x tick label/.append style={font=\color{black}}}
\pgfplotsset{every x tick/.append style={black}}
```
### Size {#size}
If `scale only axis=false` (the default), pgfplots will try to produce the desired width including labels, titles and ticks.
```latex
\pgfplotsset{scale only axis=true}
```
### Label {#label}
Used to align all of ylabel of one figure.
```latex
\pgfplotsset{ylabel absolute}
```
### Legend {#legend}
```latex
% https://tex.stackexchange.com/questions/54794/using-a-pgfplots-style-legend-in-a-plain-old-tikzpicture#54834
% argument #1: any options
\newenvironment{customlegend}[1][]{%
\begingroup
% inits/clears the lists (which might be populated from previous
% axes):
\csname pgfplots@init@cleared@structures\endcsname
\pgfplotsset{#1}%
}{%
% draws the legend:
\csname pgfplots@createlegend\endcsname
\endgroup
}%
% makes \addlegendimage available (typically only available within an
% axis environment):
\def\addlegendimage{\csname pgfplots@addlegendimage\endcsname}
% definition to insert numbers
% \pgfkeys{/pgfplots/number in legend/.style={%
% /pgfplots/legend image code/.code={%
% \node at (0.125,-0.0225){#1}; % <= changed x value
% },%
% },
% }
\pgfplotsset{
every legend to name picture/.style={west}
}
```
### Upper and Lower bounds {#upper-and-lower-bounds}
```latex
\tikzstyle{upperbound}=[line cap=round, postaction={decorate,draw,decoration={border, segment length=0.2cm, amplitude=0.3cm, angle=60}}]
\tikzstyle{lowerbound}=[line cap=round, postaction={decorate,draw,decoration={border, segment length=0.2cm, amplitude=0.3cm, angle=-60}}]
```
And we add the corresdonding
```latex
\pgfplotsset{
/pgfplots/upperbound/.style 1 args={
legend image code/.code={
\draw[##1, upperbound]
plot coordinates {
(0cm,0cm)
(0.6cm,0cm)
}
}
}
}
```
### Pole {#pole}
```latex
\tikzset{%
pole/.style{%
color=red,
cross out,
draw,
inner sep=0pt,
outer sep=0pt,
minimum size=#1pt
},
pole/.default={4}
}
```
### Zero {#zero}
```latex
\tikzset{%
zero/.style{%
color=red,
circle,
draw,
inner sep=0pt,
outer sep=0pt,
minimum size=#1pt
},
zero/.default={4}
}
```
## Mechanical {#mechanical}
### Spring {#spring}
```latex
\tikzset{%
spring/.style={%
thick,
decoration={
zigzag,
pre length = #1cm,
post length = #1cm,
segment length = 6
},
decorate
},
spring/.default={0.2}
}
```
### Coil {#coil}
```latex
\tikzset{%
coil/.style n args={2}{%
thick,
decoration={
coil,
pre length = #1cm,
post length = #2cm,
segment length = 4
},
decorate
},
coil/.default={0.3}{0.3}
}
```
### Damper {#damper}
```latex
\tikzset{%
damper/.style n args={2}{%
thick,
decoration={markings, mark connection node=dmp, mark=at position 0.5 with {
\node (dmp) [thick,
inner sep = 0pt,
transform shape,
rotate =-90,
minimum width = #1pt,
minimum height = #2pt,
draw=none] {};
\draw [thick] ($(dmp.north east)+(0.6*#2pt,0)$) -- (dmp.south east) -- (dmp.south west) -- ($(dmp.north west)+(0.6*#2pt,0)$);
\draw [thick] ($(dmp.north)+(0,-0.3*#1pt)$) -- ($(dmp.north)+(0,0.3*#1pt)$);
}
},
decorate
},
damper/.default={12}{3}
}
```
### Actuator {#actuator}
```latex
\tikzset{%
actuator/.style n args={2}{%
thick,
draw=none,
decoration={
markings,
mark connection node=my node,
mark=at position .5 with {
\node [draw, inner sep=0pt, minimum width=#1cm, minimum height=#2cm,
transform shape, fill=white] (my node) {};
},
mark=at position .0 with {
\draw[<-] (0, 0) -- (my node);
},
mark=at position 1.0 with {
\draw[<-] (0, 0) -- (my node);
}
},
decorate
},
actuator/.default={0.5}{0.2}
}
```
### Ground {#ground}
```latex
\tikzset{%
ground/.style n args={2}{%
fill,
pattern = north east lines,
draw = none,
anchor = north,
minimum width = #1cm,
minimum height = #2cm,
append after command={
(\tikzlastnode.north west) edge (\tikzlastnode.north east)
}
},
ground/.default={2.5}{0.3}
}
```
### Force Sensor {#force-sensor}
```latex
\tikzset{%
forcesensor/.style n args={2}{%
rectangle,
outer sep=0pt,
inner sep=0pt,
draw=black,
fill=white!60!black,
anchor=south,
minimum width =#1cm,
minimum height=#2cm,
append after command={
[every edge/.append style={
thick,
black,
}]
(\tikzlastnode.north west) edge (\tikzlastnode.south east)
(\tikzlastnode.north east) edge (\tikzlastnode.south west)
}
},
forcesensor/.default={2.0}{0.5}
}
```
### Inertial Sensor {#inertial-sensor}
```latex
\tikzset{%
inertialsensor/.style={%
rectangle,
outer sep=0pt,
inner sep=0pt,
draw=black,
fill=white!60!black,
anchor=south east,
minimum size=#1cm,
append after command={
[every edge/.append style={
thick,
black,
}]
(\tikzlastnode.north west) edge (\tikzlastnode.south east)
(\tikzlastnode.north east) edge (\tikzlastnode.south west)
}
},
inertialsensor/.default={0.3}
}
```
### Axis Rotator {#axis-rotator}
```latex
\newcommand{\AxisRotator}[1][rotate=0]{%
\tikz [x=0.1cm,y=0.30cm,-stealth,#1] \draw (0,0) arc (-150:150:1 and 1);%
}
```
### Cross {#cross}
```latex
\tikzstyle{cross}=[path picture={
\draw[black]
(path picture bounding box.south east) -- (path picture bounding box.north west) (path picture bounding box.south west) -- (path picture bounding box.north east);
}]
```
### Piezoelectric actuator {#piezoelectric-actuator}
```latex
\tikzset{%
piezo/.style n args={3}{%
draw,
rectangle,
minimum width = #1cm,
minimum height = #2cm,
fill=blue!10!white,
anchor=center,
append after command={
[every edge/.append style={
thick,
black,
}]
\foreach \i in {1,...,#3}{
(${\i/(1+#3)}*(\tikzlastnode.north west)+{(1+#3-\i)/(1+#3)}*(\tikzlastnode.south west)+0.1*(#1,0)$) edge (${\i/(1+#3)}*(\tikzlastnode.north east)+{(1+#3-\i)/(1+#3)}*(\tikzlastnode.south east)-0.1*(#1,0)$)
}
}
},
piezo/.default={2}{4}{10}
}
```
### Voice coil {#voice-coil}
```latex
\def\voicecoil#1#2#3{
% ======================
% Parameters
% ======================
\def\voicecoilw{#1} % Total Width
\def\voicecoilh{#2} % Total Height
\def\magnetw{\voicecoilw} % Width of the magnet
\def\magneth{\voicecoilh/1.4} % Height of the magnet
\def\magnetwb{0.15*\magnetw} % Width of the borders of the magnet
\def\magnetmw{0.15*\magnetw} % Width of the middle part of the magnet
\def\magnetwg{0.5*\magnetw} % Width of the gap of the magnet
\def\magnethl{\magnetwb} % Height of the low part of the magnet
\def\magnetmh{0.15*\magneth} % Height of the middle part of the magnet
\def\magnethg{0.2*\magneth} % Height of the gap of the magnet
% ======================
\begin{scope}[shift={(0.5*\voicecoilw, 0.5*\voicecoilh)}, rotate=#3, shift={(0, -0.5*\voicecoilh)}]
% ======================
% Magnet
% ======================
\draw[fill=white] (0, 0) -| ++(0.5*\magnetw, \magneth) -| ++(-0.5*\magnetw+0.5*\magnetwg, -\magnethg) -| (0.5*\magnetw-\magnetwb, \magnethl) -| (-0.5*\magnetw+\magnetwb, \magneth-\magnethg) -| (-0.5*\magnetwg, \magneth) -| (-0.5*\magnetw, 0) -- (cycle);
\begin{scope}[shift={(0, \magnethl)}]
\draw[fill=red] (-0.5*\magnetmw, 0) rectangle (0.5*\magnetmw, \magnetmh);
\draw[fill=blue] (-0.5*\magnetmw, \magnetmh) rectangle (0.5*\magnetmw, 2*\magnetmh);
% Top conductive Magnet
\draw[fill=white] (-0.5*\magnetmw, 2*\magnetmh) -| (0.5*\magnetmw, -\magnethl+\magneth-\magnethg) -| ++(0.1, \magnethg) -| ++(-0.2-\magnetmw, -\magnethg) -| (-0.5*\magnetmw, \magnetmh);
\end{scope}
% ======================
% ======================
% Coil
% ======================
\pgfmathsetmacro{\coilwidth}{0.5*0.5*\magnetmw+0.5*0.1+0.25*\magnetwg}%
\draw[] ( \coilwidth, 0.5*\magneth) -- ++(0, 0.7*\magneth);
\draw[] (-\coilwidth, 0.5*\magneth) -- ++(0, 0.7*\magneth);
% Point on the coil
\foreach \x in {0,1,...,9}
{
\node[circle,inner sep=0.6pt,fill] at ( \coilwidth, \x*0.7*\magneth/10+0.5*\magneth);
\node[circle,inner sep=0.6pt,fill] at (-\coilwidth, \x*0.7*\magneth/10+0.5*\magneth);
}
\draw[fill=white] (-0.5*\magnetw, 1.2*\magneth) rectangle ++(\magnetw, \magnethg);
% ======================
% ======================
% Coordinates
% ======================
% Force
\coordinate[] (vc_force) at (0, \magneth-0.5*\magnethg);
% Coil
\coordinate[] (vc_coil) at (0, \voicecoilh);
% Magnet
\coordinate[] (vc_magnet) at (0, 0);
% Coil Wires
\coordinate[] (vc_wire_one) at ( \coilwidth, 1.2*\magneth);
\coordinate[] (vc_wire_two) at (-\coilwidth, 1.2*\magneth);
% ======================
\end{scope}
}
```
## Optics {#optics}
```latex
\tikzset{%
->-/.style={
decoration={
markings,
mark = at position #1 with {\arrow{>}
}
},
postaction={decorate}
}
}
\tikzset{%
-<-/.style={
decoration={
markings,
mark = at position #1 with {\arrow{<}
}
},
postaction={decorate}
}
}
```
## Misc {#misc}
```latex
\tikzset{%
labelc/.style= {%
draw,
fill=white,
shape=circle,
inner sep=2pt,
outer sep=6pt,
}
}
```
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

@@ -0,0 +1,48 @@
+++
title = "Active Damping of Rotating Platforms using Integral Force Feedback"
author = ["Dehaeze Thomas"]
draft = false
venue = "Engineering Research Express"
year = 2021
pubtype = "journal"
doi = "10.1088/2631-8695/abe803"
code = "https://git.tdehaeze.xyz/tdehaeze/dehaeze21_activ_dampin_rotat_platf_using"
+++
> **Abstract**:
>
> This paper investigates the use of Integral Force Feedback (IFF) for the active damping of rotating mechanical systems.
> Guaranteed stability, typical benefit of IFF, is lost as soon as the system is rotating due to gyroscopic effects.
> To overcome this issue, two modifications of the classical IFF control scheme are proposed.
> The first consists of slightly modifying the control law while the second consists of adding springs in parallel with the force sensors.
> Conditions for stability and optimal parameters are derived.
> The results reveal that, despite their different implementations, both modified IFF control scheme have almost identical damping authority on the suspension modes.
## Journal Paper ([pdf](journal/dehaeze21_activ_dampin_rotat_platf_using.pdf)) {#journal-paper--pdf-journal-dehaeze21-activ-dampin-rotat-platf-using-dot-pdf}
The paper has been created using [Org Mode](https://orgmode.org/) (generating [LaTeX](https://www.latex-project.org/) code) under [Emacs](https://www.gnu.org/software/emacs/).
To cite this journal paper use the following bibtex code.
```bibtex
@article{dehaeze21_activ_dampin_rotat_platf_using,
author = {Thomas Dehaeze and Christophe Collette},
title = {Active Damping of Rotating Platforms Using Integral Force
Feedback},
journal = {Engineering Research Express},
year = 2021,
doi = {10.1088/2631-8695/abe803},
url = {https://doi.org/10.1088/2631-8695/abe803},
month = {Feb},
}
```
You can also use the formatted citation below.
> Dehaeze, T., &amp; Collette, C., Active damping of rotating platforms using integral force feedback, Engineering Research Express, (2021).
## Matlab Scripts ([link]({{< relref "matlab/index.md" >}})) {#matlab-scripts--link-matlab-index-dot-md}
The Matlab scripts that permits to obtain all the results presented in the paper are accessible [here]({{< relref "matlab/index.md" >}}).
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

@@ -0,0 +1,959 @@
+++
title = "Active Damping of Rotating Platforms using Integral Force Feedback - Matlab Computation"
author = ["Dehaeze Thomas"]
draft = false
+++
<hr>
<p>This report is also available as a <a href="./index.pdf">pdf</a>.</p>
<hr>
This document gathers the Matlab code used to for the conference paper (<a href="#citeproc_bib_item_1">Dehaeze and Collette 2020</a>) and the journal paper (<a href="#citeproc_bib_item_3">Dehaeze and Collette 2021</a>).
It is structured in several sections:
- Section : presents a simple model of a rotating suspended platform that will be used throughout this study.
- Section : explains how the unconditional stability of IFF is lost due to Gyroscopic effects induced by the rotation.
- Section : suggests a simple modification of the control law such that damping can be added to the suspension modes in a robust way.
- Section : proposes to add springs in parallel with the force sensors to regain the unconditional stability of IFF.
- Section : compares both proposed modifications to the classical IFF in terms of damping authority and closed-loop system behavior.
- Section : contains the notations used for both the Matlab code and the paper
The matlab code is accessible on [Zonodo](https://zenodo.org/record/3894343) and [Github](https://github.com/tdehaeze/dehaeze20_contr_stewa_platf) (<a href="#citeproc_bib_item_2">Dehaeze 2020</a>). It can also be download as a `.zip` file [here](https://git.tdehaeze.xyz/tdehaeze/dehaeze21_activ_dampin_rotat_platf_using/archive/master.zip).
To run the Matlab code, go in the `matlab` directory and run the following Matlab files corresponding to each section.
<div class="table-caption">
<span class="table-number">Table 1:</span>
Paper's sections and corresponding Matlab files
</div>
| Sections | Matlab File |
|----------|----------------------------|
| Section | `s1_system_description.m` |
| Section | `s2_iff_pure_int.m` |
| Section | `s3_iff_hpf.m` |
| Section | `s4_iff_kp.m` |
| Section | `s5_act_damp_comparison.m` |
## System Description and Analysis {#system-description-and-analysis}
<span class="org-target" id="org-target--sec-system-description"></span>
### System description {#system-description}
The system consists of one 2 degree of freedom translation stage on top of a spindle (figure [Figure 1](#figure--fig:system)).
<a id="figure--fig:system"></a>
{{< figure src="figs-paper/system.png" caption="<span class='figure-number'>Figure 1: </span>Schematic of the studied system" >}}
The control inputs are the forces applied by the actuators of the translation stage (\\(F\_u\\) and \\(F\_v\\)).
As the translation stage is rotating around the Z axis due to the spindle, the forces are applied along \\(\vec{i}\_u\\) and \\(\vec{i}\_v\\).
### Equations {#equations}
Based on the Figure [Figure 1](#figure--fig:system), the equations of motions are:
<div class="important">
\begin{equation}
\begin{bmatrix} d\_u \\\ d\_v \end{bmatrix} =
\bm{G}\_d
\begin{bmatrix} F\_u \\\ F\_v \end{bmatrix}
\end{equation}
Where \\(\bm{G}\_d\\) is a \\(2 \times 2\\) transfer function matrix.
\begin{equation}
\bm{G}\_d = \frac{1}{k} \frac{1}{G\_{dp}}
\begin{bmatrix}
G\_{dz} & G\_{dc} \\\\
-G\_{dc} & G\_{dz}
\end{bmatrix}
\end{equation}
With:
\begin{align}
G\_{dp} &= \left( \frac{s^2}{{\omega\_0}^2} + 2 \xi \frac{s}{\omega\_0} + 1 - \frac{{\Omega}^2}{{\omega\_0}^2} \right)^2 + \left( 2 \frac{\Omega}{\omega\_0} \frac{s}{\omega\_0} \right)^2 \\\\
G\_{dz} &= \frac{s^2}{{\omega\_0}^2} + 2 \xi \frac{s}{\omega\_0} + 1 - \frac{{\Omega}^2}{{\omega\_0}^2} \\\\
G\_{dc} &= 2 \frac{\Omega}{\omega\_0} \frac{s}{\omega\_0}
\end{align}
</div>
### Numerical Values {#numerical-values}
Let's define initial values for the model.
```matlab
k = 1; % Actuator Stiffness [N/m]
c = 0.05; % Actuator Damping [N/(m/s)]
m = 1; % Payload mass [kg]
```
```matlab
xi = c/(2*sqrt(k*m));
w0 = sqrt(k/m); % [rad/s]
```
### Campbell Diagram {#campbell-diagram}
The Campbell Diagram displays the evolution of the real and imaginary parts of the system as a function of the rotating speed.
It is shown in Figures [Figure 2](#figure--fig:campbell-diagram-real) and [Figure 3](#figure--fig:campbell-diagram-imag), and one can see that the system becomes unstable for \\(\Omega > \omega\_0\\) (the real part of one of the poles becomes positive).
<a id="figure--fig:campbell-diagram-real"></a>
{{< figure src="figs/campbell_diagram_real.png" caption="<span class='figure-number'>Figure 2: </span>Campbell Diagram - Real Part" >}}
<a id="figure--fig:campbell-diagram-imag"></a>
{{< figure src="figs/campbell_diagram_imag.png" caption="<span class='figure-number'>Figure 3: </span>Campbell Diagram - Imaginary Part" >}}
### Simscape Model {#simscape-model}
In order to validate all the equations of motion, a Simscape model of the same system has been developed.
The dynamics of the system can be identified from the Simscape model and compare with the analytical model.
The rotating speed for the Simscape Model is defined.
```matlab
W = 0.1; % Rotation Speed [rad/s]
```
```matlab
open('rotating_frame.slx');
```
The transfer function from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) is identified from the Simscape model.
```matlab
%% Name of the Simulink File
mdl = 'rotating_frame';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/K'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/G'], 2, 'openoutput'); io_i = io_i + 1;
```
```matlab
G = linearize(mdl, io, 0);
%% Input/Output definition
G.InputName = {'Fu', 'Fv'};
G.OutputName = {'du', 'dv'};
```
The same transfer function from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) is written down from the analytical model.
```matlab
Gth = (1/k)/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
[(s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2), 2*W*s/(w0^2) ; ...
-2*W*s/(w0^2), (s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)];
```
Both transfer functions are compared in Figure [Figure 4](#figure--fig:plant-simscape-analytical) and are found to perfectly match.
<a id="figure--fig:plant-simscape-analytical"></a>
{{< figure src="figs/plant_simscape_analytical.png" caption="<span class='figure-number'>Figure 4: </span>Bode plot of the transfer function from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) as identified from the Simscape model and from an analytical model" >}}
### Effect of the rotation speed {#effect-of-the-rotation-speed}
The transfer functions from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) are identified for the following rotating speeds.
```matlab
Ws = [0, 0.2, 0.7, 1.1]*w0; % Rotating Speeds [rad/s]
```
```matlab
Gs = {zeros(2, 2, length(Ws))};
for W_i = 1:length(Ws)
W = Ws(W_i);
Gs(:, :, W_i) = {(1/k)/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
[(s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2), 2*W*s/(w0^2) ; ...
-2*W*s/(w0^2), (s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)]};
end
```
They are compared in Figures [Figure 5](#figure--fig:plant-compare-rotating-speed-direct) and [Figure 6](#figure--fig:plant-compare-rotating-speed-coupling).
<a id="figure--fig:plant-compare-rotating-speed-direct"></a>
{{< figure src="figs/plant_compare_rotating_speed_direct.png" caption="<span class='figure-number'>Figure 5: </span>Comparison of the transfer functions from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) for several rotating speed - Direct Terms" >}}
<a id="figure--fig:plant-compare-rotating-speed-coupling"></a>
{{< figure src="figs/plant_compare_rotating_speed_coupling.png" caption="<span class='figure-number'>Figure 6: </span>Comparison of the transfer functions from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) for several rotating speed - Coupling Terms" >}}
## Problem with pure Integral Force Feedback {#problem-with-pure-integral-force-feedback}
<span class="org-target" id="org-target--sec-iff-pure-int"></span>
Force sensors are added in series with the two actuators (Figure [Figure 7](#figure--fig:system-iff)).
Two identical controllers \\(K\_F\\) are used to feedback each of the sensed force to its associated actuator.
<a id="figure--fig:system-iff"></a>
{{< figure src="figs-paper/system_iff.png" caption="<span class='figure-number'>Figure 7: </span>System with added Force Sensor in series with the actuators" >}}
### Plant Parameters {#plant-parameters}
Let's define initial values for the model.
```matlab
k = 1; % Actuator Stiffness [N/m]
c = 0.05; % Actuator Damping [N/(m/s)]
m = 1; % Payload mass [kg]
```
```matlab
xi = c/(2*sqrt(k*m));
w0 = sqrt(k/m); % [rad/s]
```
### Equations {#equations}
The sensed forces are equal to:
\begin{equation}
\begin{bmatrix} f\_{u} \\\ f\_{v} \end{bmatrix} =
\begin{bmatrix}
1 & 0 \\\\
0 & 1
\end{bmatrix}
\begin{bmatrix} F\_u \\\ F\_v \end{bmatrix} - (c s + k)
\begin{bmatrix} d\_u \\\ d\_v \end{bmatrix}
\end{equation}
Which then gives:
<div class="important">
\begin{equation}
\begin{bmatrix} f\_{u} \\\ f\_{v} \end{bmatrix} =
\bm{G}\_{f}
\begin{bmatrix} F\_u \\\ F\_v \end{bmatrix}
\end{equation}
\begin{equation}
\begin{bmatrix} f\_{u} \\\ f\_{v} \end{bmatrix} =
\frac{1}{G\_{fp}}
\begin{bmatrix}
G\_{fz} & -G\_{fc} \\\\
G\_{fc} & G\_{fz}
\end{bmatrix}
\begin{bmatrix} F\_u \\\ F\_v \end{bmatrix}
\end{equation}
\begin{align}
G\_{fp} &= \left( \frac{s^2}{{\omega\_0}^2} + 2 \xi \frac{s}{\omega\_0} + 1 - \frac{{\Omega}^2}{{\omega\_0}^2} \right)^2 + \left( 2 \frac{\Omega}{\omega\_0} \frac{s}{\omega\_0} \right)^2 \\\\
G\_{fz} &= \left( \frac{s^2}{{\omega\_0}^2} - \frac{\Omega^2}{{\omega\_0}^2} \right) \left( \frac{s^2}{{\omega\_0}^2} + 2 \xi \frac{s}{\omega\_0} + 1 - \frac{{\Omega}^2}{{\omega\_0}^2} \right) + \left( 2 \frac{\Omega}{\omega\_0} \frac{s}{\omega\_0} \right)^2 \\\\
G\_{fc} &= \left( 2 \xi \frac{s}{\omega\_0} + 1 \right) \left( 2 \frac{\Omega}{\omega\_0} \frac{s}{\omega\_0} \right)
\end{align}
</div>
### Comparison of the Analytical Model and the Simscape Model {#comparison-of-the-analytical-model-and-the-simscape-model}
The rotation speed is set to \\(\Omega = 0.1 \omega\_0\\).
```matlab
W = 0.1*w0; % [rad/s]
```
```matlab
open('rotating_frame.slx');
```
And the transfer function from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) is identified using the Simscape model.
```matlab
%% Name of the Simulink File
mdl = 'rotating_frame';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/K'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/G'], 1, 'openoutput'); io_i = io_i + 1;
```
```matlab
Giff = linearize(mdl, io, 0);
%% Input/Output definition
Giff.InputName = {'Fu', 'Fv'};
Giff.OutputName = {'fu', 'fv'};
```
The same transfer function from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) is written down from the analytical model.
```matlab
Giff_th = 1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
[(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ...
(2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2];
```
The two are compared in Figure [Figure 8](#figure--fig:plant-iff-comp-simscape-analytical) and found to perfectly match.
<a id="figure--fig:plant-iff-comp-simscape-analytical"></a>
{{< figure src="figs/plant_iff_comp_simscape_analytical.png" caption="<span class='figure-number'>Figure 8: </span>Comparison of the transfer functions from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) between the Simscape model and the analytical one" >}}
### Effect of the rotation speed {#effect-of-the-rotation-speed}
The transfer functions from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) are identified for the following rotating speeds.
```matlab
Ws = [0, 0.2, 0.7]*w0; % Rotating Speeds [rad/s]
```
```matlab
Gsiff = {zeros(2, 2, length(Ws))};
for W_i = 1:length(Ws)
W = Ws(W_i);
Gsiff(:, :, W_i) = {1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
[(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ...
(2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2]};
end
```
The obtained transfer functions are shown in Figure [Figure 9](#figure--fig:plant-iff-compare-rotating-speed).
<a id="figure--fig:plant-iff-compare-rotating-speed"></a>
{{< figure src="figs/plant_iff_compare_rotating_speed.png" caption="<span class='figure-number'>Figure 9: </span>Comparison of the transfer functions from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) for several rotating speed" >}}
### Decentralized Integral Force Feedback {#decentralized-integral-force-feedback}
The decentralized IFF controller consists of pure integrators:
\begin{equation}
\bm{K}\_{\text{IFF}}(s) = \frac{g}{s} \begin{bmatrix}
1 & 0 \\\\
0 & 1
\end{bmatrix}
\end{equation}
The Root Locus (evolution of the poles of the closed loop system in the complex plane as a function of \\(g\\)) is shown in Figure [Figure 10](#figure--fig:root-locus-pure-iff).
It is shown that for non-null rotating speed, one pole is bound to the right-half plane, and thus the closed loop system is unstable.
<a id="figure--fig:root-locus-pure-iff"></a>
{{< figure src="figs/root_locus_pure_iff.png" caption="<span class='figure-number'>Figure 10: </span>Root Locus for the Decentralized Integral Force Feedback controller. Several rotating speed are shown." >}}
## Integral Force Feedback with an High Pass Filter {#integral-force-feedback-with-an-high-pass-filter}
<span class="org-target" id="org-target--sec-iff-pseudo-int"></span>
### Plant Parameters {#plant-parameters}
Let's define initial values for the model.
```matlab
k = 1; % Actuator Stiffness [N/m]
c = 0.05; % Actuator Damping [N/(m/s)]
m = 1; % Payload mass [kg]
```
```matlab
xi = c/(2*sqrt(k*m));
w0 = sqrt(k/m); % [rad/s]
```
### Modified Integral Force Feedback Controller {#modified-integral-force-feedback-controller}
Let's modify the initial Integral Force Feedback Controller ; instead of using pure integrators, pseudo integrators (i.e. low pass filters) are used:
\begin{equation}
K\_{\text{IFF}}(s) = g\frac{1}{\omega\_i + s} \begin{bmatrix}
1 & 0 \\\\
0 & 1
\end{bmatrix}
\end{equation}
where \\(\omega\_i\\) characterize down to which frequency the signal is integrated.
Let's arbitrary choose the following control parameters:
```matlab
g = 2;
wi = 0.1*w0;
```
And the following rotating speed.
```matlab
Giff = 1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
[(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ...
(2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2];
```
The obtained Loop Gain is shown in Figure [Figure 11](#figure--fig:loop-gain-modified-iff).
<a id="figure--fig:loop-gain-modified-iff"></a>
{{< figure src="figs/loop_gain_modified_iff.png" caption="<span class='figure-number'>Figure 11: </span>Loop Gain for the modified IFF controller" >}}
### Root Locus {#root-locus}
As shown in the Root Locus plot (Figure [Figure 12](#figure--fig:root-locus-modified-iff)), for some value of the gain, the system remains stable.
<a id="figure--fig:root-locus-modified-iff"></a>
{{< figure src="figs/root_locus_modified_iff.png" caption="<span class='figure-number'>Figure 12: </span>Root Locus for the modified IFF controller" >}}
<a id="figure--fig:root-locus-modified-iff-zoom"></a>
{{< figure src="figs/root_locus_modified_iff_zoom.png" caption="<span class='figure-number'>Figure 13: </span>Root Locus for the modified IFF controller - Zoom" >}}
### What is the optimal \\(\omega\_i\\) and \\(g\\)? {#what-is-the-optimal-omega-i-and-g}
In order to visualize the effect of \\(\omega\_i\\) on the attainable damping, the Root Locus is displayed in Figure [Figure 14](#figure--fig:root-locus-wi-modified-iff) for the following \\(\omega\_i\\):
```matlab
wis = [0.01, 0.1, 0.5, 1]*w0; % [rad/s]
```
<a id="figure--fig:root-locus-wi-modified-iff"></a>
{{< figure src="figs/root_locus_wi_modified_iff.png" caption="<span class='figure-number'>Figure 14: </span>Root Locus for the modified IFF controller (zoomed plot on the left)" >}}
<a id="figure--fig:root-locus-wi-modified-iff-zoom"></a>
{{< figure src="figs/root_locus_wi_modified_iff_zoom.png" caption="<span class='figure-number'>Figure 15: </span>Root Locus for the modified IFF controller (zoomed plot on the left)" >}}
For the controller
\begin{equation}
K\_{\text{IFF}}(s) = g\frac{1}{\omega\_i + s} \begin{bmatrix}
1 & 0 \\\\
0 & 1
\end{bmatrix}
\end{equation}
The gain at which the system becomes unstable is
\begin{equation}
g\_\text{max} = \omega\_i \left( \frac{{\omega\_0}^2}{\Omega^2} - 1 \right) \label{eq:iff\_gmax}
\end{equation}
While it seems that small \\(\omega\_i\\) do allow more damping to be added to the system (Figure [Figure 14](#figure--fig:root-locus-wi-modified-iff)), the control gains may be limited to small values due to \ref{eq:iff\_gmax} thus reducing the attainable damping.
There must be an optimum for \\(\omega\_i\\).
To find the optimum, the gain that maximize the simultaneous damping of the mode is identified for a wide range of \\(\omega\_i\\) (Figure [Figure 16](#figure--fig:mod-iff-damping-wi)).
```matlab
wis = logspace(-2, 1, 100)*w0; % [rad/s]
opt_xi = zeros(1, length(wis)); % Optimal simultaneous damping
opt_gain = zeros(1, length(wis)); % Corresponding optimal gain
for wi_i = 1:length(wis)
wi = wis(wi_i);
Kiff = 1/(s + wi)*eye(2);
fun = @(g)computeSimultaneousDamping(g, Giff, Kiff);
[g_opt, xi_opt] = fminsearch(fun, 0.5*wi*((w0/W)^2 - 1));
opt_xi(wi_i) = 1/xi_opt;
opt_gain(wi_i) = g_opt;
end
```
<a id="figure--fig:mod-iff-damping-wi"></a>
{{< figure src="figs/mod_iff_damping_wi.png" caption="<span class='figure-number'>Figure 16: </span>Simultaneous attainable damping of the closed loop poles as a function of \\(\omega\_i\\)" >}}
## IFF with a stiffness in parallel with the force sensor {#iff-with-a-stiffness-in-parallel-with-the-force-sensor}
<span class="org-target" id="org-target--sec-iff-parallel-stiffness"></span>
### Schematic {#schematic}
In this section additional springs in parallel with the force sensors are added to counteract the negative stiffness induced by the rotation.
<a id="figure--fig:system-parallel-springs"></a>
{{< figure src="figs-paper/system_parallel_springs.png" caption="<span class='figure-number'>Figure 17: </span>Studied system with additional springs in parallel with the actuators and force sensors" >}}
In order to keep the overall stiffness \\(k = k\_a + k\_p\\) constant, a scalar parameter \\(\alpha\\) (\\(0 \le \alpha < 1\\)) is defined to describe the fraction of the total stiffness in parallel with the actuator and force sensor
\begin{equation}
k\_p = \alpha k, \quad k\_a = (1 - \alpha) k
\end{equation}
### Equations {#equations}
<div class="important">
\begin{equation}
\begin{bmatrix} f\_u \\\ f\_v \end{bmatrix} =
\bm{G}\_k
\begin{bmatrix} F\_u \\\ F\_v \end{bmatrix}
\end{equation}
\begin{equation}
\begin{bmatrix} f\_u \\\ f\_v \end{bmatrix} =
\frac{1}{G\_{kp}}
\begin{bmatrix}
G\_{kz} & -G\_{kc} \\\\
G\_{kc} & G\_{kz}
\end{bmatrix}
\begin{bmatrix} F\_u \\\ F\_v \end{bmatrix}
\end{equation}
With:
\begin{align}
G\_{kp} &= \left( \frac{s^2}{{\omega\_0}^2} + 2\xi \frac{s}{{\omega\_0}^2} + 1 - \frac{\Omega^2}{{\omega\_0}^2} \right)^2 + \left( 2 \frac{\Omega}{\omega\_0}\frac{s}{\omega\_0} \right)^2 \\\\
G\_{kz} &= \left( \frac{s^2}{{\omega\_0}^2} - \frac{\Omega^2}{{\omega\_0}^2} + \alpha \right) \left( \frac{s^2}{{\omega\_0}^2} + 2\xi \frac{s}{{\omega\_0}^2} + 1 - \frac{\Omega^2}{{\omega\_0}^2} \right) + \left( 2 \frac{\Omega}{\omega\_0}\frac{s}{\omega\_0} \right)^2 \\\\
G\_{kc} &= \left( 2 \xi \frac{s}{\omega\_0} + 1 - \alpha \right) \left( 2 \frac{\Omega}{\omega\_0}\frac{s}{\omega\_0} \right)
\end{align}
</div>
If we compare \\(G\_{kz}\\) and \\(G\_{fz}\\), we see that the spring in parallel adds a term \\(\alpha\\).
In order to have two complex conjugate zeros (instead of real zeros):
\begin{equation}
\alpha > \frac{\Omega^2}{{\omega\_0}^2} \quad \Leftrightarrow \quad k\_p > m \Omega^2
\end{equation}
### Plant Parameters {#plant-parameters}
Let's define initial values for the model.
```matlab
k = 1; % Actuator Stiffness [N/m]
c = 0.05; % Actuator Damping [N/(m/s)]
m = 1; % Payload mass [kg]
```
```matlab
xi = c/(2*sqrt(k*m));
w0 = sqrt(k/m); % [rad/s]
```
### Comparison of the Analytical Model and the Simscape Model {#comparison-of-the-analytical-model-and-the-simscape-model}
The same transfer function from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) is written down from the analytical model.
```matlab
W = 0.1*w0; % [rad/s]
kp = 1.5*m*W^2;
cp = 0;
```
```matlab
open('rotating_frame.slx');
```
```matlab
%% Name of the Simulink File
mdl = 'rotating_frame';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/K'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/G'], 1, 'openoutput'); io_i = io_i + 1;
Giff = linearize(mdl, io, 0);
%% Input/Output definition
Giff.InputName = {'Fu', 'Fv'};
Giff.OutputName = {'fu', 'fv'};
```
```matlab
w0p = sqrt((k + kp)/m);
xip = c/(2*sqrt((k+kp)*m));
Giff_th = 1/( (s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2)^2 + (2*(s/w0p)*(W/w0p))^2 ) * [ ...
(s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2, -(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p));
(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)), (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2 ];
Giff_th.InputName = {'Fu', 'Fv'};
Giff_th.OutputName = {'fu', 'fv'};
```
<a id="figure--fig:plant-iff-kp-comp-simscape-analytical"></a>
{{< figure src="figs/plant_iff_kp_comp_simscape_analytical.png" caption="<span class='figure-number'>Figure 18: </span>Comparison of the transfer functions from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) between the Simscape model and the analytical one" >}}
### Effect of the parallel stiffness on the IFF plant {#effect-of-the-parallel-stiffness-on-the-iff-plant}
The rotation speed is set to \\(\Omega = 0.1 \omega\_0\\).
```matlab
W = 0.1*w0; % [rad/s]
```
And the IFF plant (transfer function from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\)) is identified in three different cases:
- without parallel stiffness
- with a small parallel stiffness \\(k\_p < m \Omega^2\\)
- with a large parallel stiffness \\(k\_p > m \Omega^2\\)
The results are shown in Figure [Figure 19](#figure--fig:plant-iff-kp).
One can see that for \\(k\_p > m \Omega^2\\), the systems shows alternating complex conjugate poles and zeros.
```matlab
kp = 0;
w0p = sqrt((k + kp)/m);
xip = c/(2*sqrt((k+kp)*m));
Giff = 1/( (s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2)^2 + (2*(s/w0p)*(W/w0p))^2 ) * [ ...
(s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2, -(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p));
(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)), (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2];
```
```matlab
kp = 0.5*m*W^2;
k = 1 - kp;
w0p = sqrt((k + kp)/m);
xip = c/(2*sqrt((k+kp)*m));
Giff_s = 1/( (s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2)^2 + (2*(s/w0p)*(W/w0p))^2 ) * [ ...
(s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2, -(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p));
(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)), (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2];
```
```matlab
kp = 1.5*m*W^2;
k = 1 - kp;
w0p = sqrt((k + kp)/m);
xip = c/(2*sqrt((k+kp)*m));
Giff_l = 1/( (s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2)^2 + (2*(s/w0p)*(W/w0p))^2 ) * [ ...
(s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2, -(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p));
(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)), (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2];
```
<a id="figure--fig:plant-iff-kp"></a>
{{< figure src="figs/plant_iff_kp.png" caption="<span class='figure-number'>Figure 19: </span>Transfer function from \\([F\_u, F\_v]\\) to \\([f\_u, f\_v]\\) for \\(k\_p = 0\\), \\(k\_p < m \Omega^2\\) and \\(k\_p > m \Omega^2\\)" >}}
### IFF when adding a spring in parallel {#iff-when-adding-a-spring-in-parallel}
In Figure [Figure 20](#figure--fig:root-locus-iff-kp) is displayed the Root Locus in the three considered cases with
\begin{equation}
K\_{\text{IFF}} = \frac{g}{s} \begin{bmatrix}
1 & 0 \\\\
0 & 1
\end{bmatrix}
\end{equation}
One can see that for \\(k\_p > m \Omega^2\\), the root locus stays in the left half of the complex plane and thus the control system is unconditionally stable.
Thus, decentralized IFF controller with pure integrators can be used if:
\begin{equation}
k\_{p} > m \Omega^2
\end{equation}
<a id="figure--fig:root-locus-iff-kp"></a>
{{< figure src="figs/root_locus_iff_kp.png" caption="<span class='figure-number'>Figure 20: </span>Root Locus" >}}
<a id="figure--fig:root-locus-iff-kp-zoom"></a>
{{< figure src="figs/root_locus_iff_kp_zoom.png" caption="<span class='figure-number'>Figure 21: </span>Root Locus" >}}
### Effect of \\(k\_p\\) on the attainable damping {#effect-of-k-p-on-the-attainable-damping}
However, having large values of \\(k\_p\\) may decrease the attainable damping.
To study the second point, Root Locus plots for the following values of \\(k\_p\\) are shown in Figure [Figure 22](#figure--fig:root-locus-iff-kps).
```matlab
kps = [2, 20, 40]*m*W^2;
```
It is shown that large values of \\(k\_p\\) decreases the attainable damping.
<a id="figure--fig:root-locus-iff-kps"></a>
{{< figure src="figs/root_locus_iff_kps.png" caption="<span class='figure-number'>Figure 22: </span>Root Locus plot" >}}
```matlab
alphas = logspace(-2, 0, 100);
opt_xi = zeros(1, length(alphas)); % Optimal simultaneous damping
opt_gain = zeros(1, length(alphas)); % Corresponding optimal gain
Kiff = 1/s*eye(2);
for alpha_i = 1:length(alphas)
kp = alphas(alpha_i);
k = 1 - alphas(alpha_i);
w0p = sqrt((k + kp)/m);
xip = c/(2*sqrt((k+kp)*m));
Giff = 1/( (s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2)^2 + (2*(s/w0p)*(W/w0p))^2 ) * [ ...
(s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2, -(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p));
(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)), (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2];
fun = @(g)computeSimultaneousDamping(g, Giff, Kiff);
[g_opt, xi_opt] = fminsearch(fun, 2);
opt_xi(alpha_i) = 1/xi_opt;
opt_gain(alpha_i) = g_opt;
end
```
<a id="figure--fig:opt-damp-alpha"></a>
{{< figure src="figs/opt_damp_alpha.png" caption="<span class='figure-number'>Figure 23: </span>Attainable damping ratio and corresponding controller gain for different parameter \\(\alpha\\)" >}}
## Comparison {#comparison}
<span class="org-target" id="org-target--sec-comparison"></span>
Two modifications to adapt the IFF control strategy to rotating platforms have been proposed.
These two methods are now compared in terms of added damping, closed-loop compliance and transmissibility.
### Plant Parameters {#plant-parameters}
Let's define initial values for the model.
```matlab
k = 1; % Actuator Stiffness [N/m]
c = 0.05; % Actuator Damping [N/(m/s)]
m = 1; % Payload mass [kg]
```
```matlab
xi = c/(2*sqrt(k*m));
w0 = sqrt(k/m); % [rad/s]
```
The rotating speed is set to \\(\Omega = 0.1 \omega\_0\\).
```matlab
W = 0.1*w0;
```
### Root Locus {#root-locus}
IFF with High Pass Filter
```matlab
wi = 0.1*w0; % [rad/s]
Giff = 1/(((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))^2 + (2*W*s/(w0^2))^2) * ...
[(s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2)) + (2*W*s/(w0^2))^2, - (2*xi*s/w0 + 1)*2*W*s/(w0^2) ; ...
(2*xi*s/w0 + 1)*2*W*s/(w0^2), (s^2/w0^2 - W^2/w0^2)*((s^2)/(w0^2) + 2*xi*s/w0 + 1 - (W^2)/(w0^2))+ (2*W*s/(w0^2))^2];
```
IFF With parallel Stiffness
```matlab
kp = 5*m*W^2;
k = k - kp;
w0p = sqrt((k + kp)/m);
xip = c/(2*sqrt((k+kp)*m));
Giff_kp = 1/( (s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2)^2 + (2*(s/w0p)*(W/w0p))^2 ) * [ ...
(s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2, -(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p));
(2*xip*s/w0p + k/(k + kp))*(2*(s/w0p)*(W/w0p)), (s^2/w0p^2 + kp/(k + kp) - W^2/w0p^2)*(s^2/w0p^2 + 2*xip*s/w0p + 1 - W^2/w0p^2) + (2*(s/w0p)*(W/w0p))^2 ];
k = k + kp;
```
<a id="figure--fig:comp-root-locus"></a>
{{< figure src="figs/comp_root_locus.png" caption="<span class='figure-number'>Figure 24: </span>Root Locus plot - Comparison of IFF with additional high pass filter, IFF with additional parallel stiffness" >}}
### Controllers - Optimal Gains {#controllers-optimal-gains}
In order to compare to three considered Active Damping techniques, gains that yield maximum damping of all the modes are computed for each case.
The obtained damping ratio and control are shown below.
| | Obtained \\(\xi\\) | Control Gain |
|---------------------|--------------------|--------------|
| Modified IFF | 0.83 | 1.99 |
| IFF with \\(k\_p\\) | 0.83 | 2.02 |
### Passive Damping - Critical Damping {#passive-damping-critical-damping}
\begin{equation}
\xi = \frac{c}{2 \sqrt{km}}
\end{equation}
Critical Damping corresponds to to \\(\xi = 1\\), and thus:
\begin{equation}
c\_{\text{crit}} = 2 \sqrt{km}
\end{equation}
```matlab
c_opt = 2*sqrt(k*m);
```
### Transmissibility And Compliance {#transmissibility-and-compliance}
<span class="org-target" id="org-target--sec-comp-transmissibilty"></span>
```matlab
open('rotating_frame.slx');
```
```matlab
%% Name of the Simulink File
mdl = 'rotating_frame';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/dw'], 1, 'input'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/fd'], 1, 'input'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/Meas'], 1, 'output'); io_i = io_i + 1;
```
```matlab
G_ol = linearize(mdl, io, 0);
%% Input/Output definition
G_ol.InputName = {'Dwx', 'Dwy', 'Fdx', 'Fdy'};
G_ol.OutputName = {'Dx', 'Dy'};
```
#### Passive Damping {#passive-damping}
```matlab
kp = 0;
cp = 0;
```
```matlab
c_old = c;
c = c_opt;
```
```matlab
G_pas = linearize(mdl, io, 0);
%% Input/Output definition
G_pas.InputName = {'Dwx', 'Dwy', 'Fdx', 'Fdy'};
G_pas.OutputName = {'Dx', 'Dy'};
```
```matlab
c = c_old;
```
```matlab
Kiff = opt_gain_iff/(wi + s)*tf(eye(2));
```
```matlab
G_iff = linearize(mdl, io, 0);
%% Input/Output definition
G_iff.InputName = {'Dwx', 'Dwy', 'Fdx', 'Fdy'};
G_iff.OutputName = {'Dx', 'Dy'};
```
```matlab
kp = 5*m*W^2;
cp = 0.01;
```
```matlab
Kiff = opt_gain_kp/s*tf(eye(2));
```
```matlab
G_kp = linearize(mdl, io, 0);
%% Input/Output definition
G_kp.InputName = {'Dwx', 'Dwy', 'Fdx', 'Fdy'};
G_kp.OutputName = {'Dx', 'Dy'};
```
<a id="figure--fig:comp-transmissibility"></a>
{{< figure src="figs/comp_transmissibility.png" caption="<span class='figure-number'>Figure 25: </span>Comparison of the transmissibility" >}}
<a id="figure--fig:comp-compliance"></a>
{{< figure src="figs/comp_compliance.png" caption="<span class='figure-number'>Figure 26: </span>Comparison of the obtained Compliance" >}}
## Notations {#notations}
<span class="org-target" id="org-target--sec-notations"></span>
| | Mathematical Notation | Matlab | Unit |
|---------------------------------------|----------------------------------|---------------|---------|
| Actuator Stiffness | \\(k\\) | `k` | N/m |
| Actuator Damping | \\(c\\) | `c` | N/(m/s) |
| Payload Mass | \\(m\\) | `m` | kg |
| Damping Ratio | \\(\xi = \frac{c}{2\sqrt{km}}\\) | `xi` | |
| Actuator Force | \\(\bm{F}, F\_u, F\_v\\) | `F` `Fu` `Fv` | N |
| Force Sensor signal | \\(\bm{f}, f\_u, f\_v\\) | `f` `fu` `fv` | N |
| Relative Displacement | \\(\bm{d}, d\_u, d\_v\\) | `d` `du` `dv` | m |
| Resonance freq. when \\(\Omega = 0\\) | \\(\omega\_0\\) | `w0` | rad/s |
| Rotation Speed | \\(\Omega = \dot{\theta}\\) | `W` | rad/s |
| Low Pass Filter corner frequency | \\(\omega\_i\\) | `wi` | rad/s |
| | Mathematical Notation | Matlab | Unit |
|------------------|-----------------------|--------|---------|
| Laplace variable | \\(s\\) | `s` | |
| Complex number | \\(j\\) | `j` | |
| Frequency | \\(\omega\\) | `w` | [rad/s] |
<style>.csl-entry{text-indent: -1.5em; margin-left: 1.5em;}</style><div class="csl-bib-body">
<div class="csl-entry"><a id="citeproc_bib_item_1"></a>Dehaeze, T., and C. Collette. 2020. “Active Damping of Rotating Platforms Using Integral Force Feedback.” In <i>Proceedings of the International Conference on Modal Analysis Noise and Vibration Engineering (ISMA)</i>.</div>
<div class="csl-entry"><a id="citeproc_bib_item_2"></a>Dehaeze, Thomas. 2020. “Active Damping of Rotating Positioning Platforms.” Source Code on Zonodo. doi:<a href="https://doi.org/10.5281/zenodo.3894342">10.5281/zenodo.3894342</a>.</div>
<div class="csl-entry"><a id="citeproc_bib_item_3"></a>Dehaeze, Thomas, and Christophe Collette. 2021. “Active Damping of Rotating Platforms Using Integral Force Feedback.” <i>Engineering Research Express</i>. <a href="http://iopscience.iop.org/article/10.1088/2631-8695/abe803">http://iopscience.iop.org/article/10.1088/2631-8695/abe803</a>.</div>
</div>
@@ -1,30 +0,0 @@
+++
title = "Mechatronics Approach for the Development of a Nano-Active-Stabilization-System"
author = ["Dehaeze Thomas"]
draft = false
+++
> **Abstract**
>
> With the growing number of fourth generation light sources, there is an increased need of fast positioning end-stations with nanometric precision.
> Such systems are usually including dedicated control strategies, and many factors may limit their performances.
> In order to design such complex systems in a predictive way, a mechatronic design approach also known as "model based design", may be utilized.
> In this paper, we present how this mechatronic design approach was used for the development of a nano-hexapod for the ESRF ID31 beamline.
> The chosen design approach consists of using models of the mechatronic system (including sensors, actuators and control strategies) to predict its behavior.
> Based on this behavior and closed-loop simulations, the elements that are limiting the performances can be identified and re-designed accordingly.
> This allows to make adequate choices concerning the design of the nano-hexapod and the overall mechatronic architecture early in the project and save precious time and resources.
> Several test benches were used to validate the models and to gain confidence on the predictability of the final system's performances.
> Measured nano-hexapod's dynamics was shown to be in very good agreement with the models.
> Further tests should be done in order to confirm that the performances of the system match the predicted one.
> The presented development approach is foreseen to be applied more frequently to future mechatronic system design at the ESRF.
## Conference Paper [pdf](/ox-hugo/dehaeze21_mechatronics_approach_nass.pdf) {#conference-paper-pdf--dehaeze21-mechatronics-approach-nass-dot-pdf}
## Code {#code}
[nass-mechatronics on Gitea](https://git.tdehaeze.xyz/tdehaeze/nass-mechatronics)
## References {#references}
@@ -0,0 +1,65 @@
+++
title = "Mechatronics Approach for the Development of a Nano-Active-Stabilization-System"
author = ["Dehaeze Thomas"]
draft = false
venue = "MEDSI 2020"
year = 2021
pubtype = "conference"
doi = "10.18429/JACoW-MEDSI2020-TUIO02"
code = "https://git.tdehaeze.xyz/tdehaeze/dehaeze21_mechatronics_approach_nass"
video = "https://www.youtube.com/watch?v=kaplQJoqqDg"
+++
> **Abstract**:
>
> With the growing number of fourth generation light sources, there is an increased need of fast positioning end-stations with nanometric precision.
> Such systems are usually including dedicated control strategies, and many factors may limit their performances.
> In order to design such complex systems in a predictive way, a mechatronic design approach also known as "model based design", may be utilized.
> In this paper, we present how this mechatronic design approach was used for the development of a nano-hexapod for the ESRF ID31 beamline.
> The chosen design approach consists of using models of the mechatronic system (including sensors, actuators and control strategies) to predict its behavior.
> Based on this behavior and closed-loop simulations, the elements that are limiting the performances can be identified and re-designed accordingly.
> This allows to make adequate choices concerning the design of the nano-hexapod and the overall mechatronic architecture early in the project and save precious time and resources.
> Several test benches were used to validate the models and to gain confidence on the predictability of the final system's performances.
> Measured nano-hexapod's dynamics was shown to be in very good agreement with the models.
> Further tests should be done in order to confirm that the performances of the system match the predicted one.
> The presented development approach is foreseen to be applied more frequently to future mechatronic system design at the ESRF.
## Conference Paper ([pdf](paper/dehaeze21_mechatronics_approach_nass.pdf)) {#conference-paper--pdf-paper-dehaeze21-mechatronics-approach-nass-dot-pdf}
## Talk ([link](talk/dehaeze21_mechatronics_approach_nass_talk.pdf)) {#talk--link-talk-dehaeze21-mechatronics-approach-nass-talk-dot-pdf}
<iframe width="720"
height="540"
src="https://www.youtube.com/embed/kaplQJoqqDg"
frameborder="0" allowfullscreen> </iframe>
## Figures ([link]({{< relref "tikz/_index.md" >}})) {#figures--link-tikz-figures-dot-md}
All the figures in the paper are generated using either [TikZ](https://sourceforge.net/projects/pgf/) or [Inkscape](https://inkscape.org/). The code snippets that was used to generate the figures are accessible [here]({{< relref "tikz/_index.md" >}}).
## Cite this work {#cite-this-work}
To cite this conference paper use the following bibTeX code.
```bibtex
@inproceedings{dehaeze21_mechat_approac_devel_nano_activ_stabil_system,
author = {Dehaeze, T. and Bonnefoy, J. and Collette, C.},
title = {Mechatronics Approach for the Development of a
Nano-Active-Stabilization-System},
booktitle = {MEDSI'20},
year = 2021,
language = {english},
publisher = {JACoW Publishing},
series = {Mechanical Engineering Design of Synchrotron Radiation
Equipment and Instrumentation},
venue = {Chicago, USA},
}
```
You can also use the formatted citation below.
> Dehaeze, T., Bonnefoy, J., &amp; Collette, C., Mechatronics approach for the development of a nano-active-stabilization-system, In MEDSI'20 (2021), JACoW Publishing.
@@ -0,0 +1,363 @@
+++
title = "Tikz Figures"
author = ["Dehaeze Thomas"]
draft = false
+++
## Mechatronic Approach {#mechatronic-approach}
```latex
\graphicspath{ {/home/thomas/Cloud/thesis/papers/dehaeze21_mechatronics_approach_nass/tikz/figs-tikz} }
\begin{tikzpicture}
% Styles
\tikzset{myblock/.style= {draw, thin, color=white!70!black, fill=white, text width=3cm, align=center, minimum height=1.4cm}};
\tikzset{mylabel/.style= {anchor=north, below, font=\bfseries\small, color=black, text width=3cm, align=center}};
\tikzset{mymodel/.style= {anchor=south, above, font=\small, color=black, text width=3cm, align=center}};
\tikzset{mystep/.style= {->, ultra thick}};
% Blocks
\node[draw, fill=lightblue, align=center, label={[mylabel, text width=8.0cm] Dynamical Models}, minimum height = 4.5cm, text width = 8.0cm] (model) at (0, 0) {};
\node[myblock, fill=lightgreen, label={[mylabel] Disturbances}, left = 3 of model.west] (dist) {};
\node[myblock, fill=lightgreen, label={[mylabel] $\mu$ Station}, below = 2pt of dist] (mustation) {};
\node[myblock, fill=lightgreen, label={[mylabel] $\nu$ Hexapod}, above = 2pt of dist] (nanohexapod) {};
\node[myblock, fill=lightyellow, label={[mylabel] Mech. Design}, above = 1 of model.north] (mechanical) {};
\node[myblock, fill=lightyellow, label={[mylabel] Instrumentation}, left = 2pt of mechanical] (instrumentation) {};
\node[myblock, fill=lightyellow, label={[mylabel] FEM}, right = 2pt of mechanical] (fem) {};
\node[myblock, fill=lightred, label={[mylabel] Test Benches}, right = 3 of model.east] (testbenches) {};
\node[myblock, fill=lightred, label={[mylabel] Assembly}, above = 2pt of testbenches] (mounting) {};
\node[myblock, fill=lightred, label={[mylabel] Implementation}, below = 2pt of testbenches] (implementation) {};
% Text
\node[anchor=south, above, text width=8cm, align=left] at (model.south) {Extensive use of models for:\begin{itemize}[noitemsep,topsep=5pt]\item Extraction of transfer functions \\ \item Choice of appropriate control architecture \\ \item Tuning of control laws \\ \item Closed loop simulations \\ \item Noise budgets / Evaluation of performances \\ \item Sensibility to parameters / disturbances\end{itemize}\centerline{Models are at the core the mecatronic approach!}};
\node[mymodel] at (mustation.south) {Multiple stages \\ Complex dynamics};
\node[mymodel] at (dist.south) {Ground motion \\ Position errors};
\node[mymodel] at (nanohexapod.south) {Different concepts \\ Sensors, Actuators};
\node[mymodel] at (instrumentation.south) {Sensors, Actuators \\ Electronics};
\node[mymodel] at (mechanical.south) {Proper integration \\ Ease of assembly};
\node[mymodel] at (fem.south) {Optimize key parts: \\ Joints, Plates, APA};
\node[mymodel] at (mounting.south) {Struts \\ Nano-Hexapod};
\node[mymodel] at (testbenches.south) {Instrumentation \\ APA, Struts};
\node[mymodel] at (implementation.south) {Control tests \\ $\mu$ Station};
% Links
\draw[->] (dist.east) -- node[above, midway]{{\small Measurements}} node[below,midway]{{\small Spectral Analysis}} (dist.east-|model.west);
\draw[->] (mustation.east) -- node[above, midway]{{\small Measurements}} node[below, midway]{{\small CAD Model}} (mustation.east-|model.west);
\draw[->] ($(nanohexapod.east-|model.west)-(0, 0.15)$) -- node[below, midway]{{\small Optimization}} ($(nanohexapod.east)-(0, 0.15)$);
\draw[<-] ($(nanohexapod.east-|model.west)+(0, 0.15)$) -- node[above, midway]{{\small Model}} ($(nanohexapod.east)+(0, 0.15)$);
\draw[->] ($(fem.south|-model.north)+(0.15, 0)$) -- node[right, midway]{{\small Specif.}} ($(fem.south)+(0.15,0)$);
\draw[<-] ($(fem.south|-model.north)-(0.15, 0)$) -- node[left, midway,align=right]{{\small Super}\\{\small Element}} ($(fem.south)-(0.15,0)$);
\draw[->] ($(mechanical.south|-model.north)+(0.15, 0)$) -- node[right, midway]{{\small Specif.}} ($(mechanical.south)+(0.15,0)$);
\draw[<-] ($(mechanical.south|-model.north)-(0.15, 0)$) -- node[left, midway,align=right]{{\small CAD}\\{\small model}} ($(mechanical.south)-(0.15,0)$);
\draw[->] ($(instrumentation.south|-model.north)+(0.15, 0)$) -- node[right, midway]{{\small Specif.}} ($(instrumentation.south)+(0.15,0)$);
\draw[<-] ($(instrumentation.south|-model.north)-(0.15, 0)$) -- node[left, midway]{{\small Model}} ($(instrumentation.south)-(0.15,0)$);
\draw[->] ($(mounting.west-|model.east)+(0, 0.15)$) -- node[above, midway]{{\small Requirements}} ($(mounting.west)+(0, 0.15)$);
\draw[<-] ($(mounting.west-|model.east)-(0, 0.15)$) -- node[below, midway]{{\small Model refinement}} ($(mounting.west)-(0, 0.15)$);
\draw[->] ($(testbenches.west-|model.east)+(0, 0.15)$) -- node[above, midway]{{\small Control Laws}} ($(testbenches.west)+(0, 0.15)$);
\draw[<-] ($(testbenches.west-|model.east)-(0, 0.15)$) -- node[below, midway]{{\small Model refinement}} ($(testbenches.west)-(0, 0.15)$);
\draw[->] ($(implementation.west-|model.east)+(0, 0.15)$) -- node[above, midway]{{\small Control Laws}} ($(implementation.west)+(0, 0.15)$);
\draw[<-] ($(implementation.west-|model.east)-(0, 0.15)$) -- node[below, midway]{{\small Model refinement}} ($(implementation.west)-(0, 0.15)$);
% Main steps
\node[font=\bfseries, rotate=90, anchor=south, above] (conceptual_phase_node) at (dist.west) {1 - Conceptual Phase};
\node[font=\bfseries, above] (detailed_phase_node) at (mechanical.north) {2 - Detail Design Phase};
\node[font=\bfseries, rotate=-90, anchor=south, above] (implementation_phase_node) at (testbenches.east) {3 - Experimental Phase};
\begin{scope}[on background layer]
\node[fit={(conceptual_phase_node.north|-nanohexapod.north) (mustation.south east)}, fill=lightgreen!50!white, draw, inner sep=2pt] (conceptual_phase) {};
\node[fit={(detailed_phase_node.north-|instrumentation.west) (fem.south east)}, fill=lightyellow!50!white, draw, inner sep=2pt] (detailed_phase) {};
\node[fit={(implementation_phase_node.north|-mounting.north) (implementation.south west)}, fill=lightred!50!white, draw, inner sep=2pt] (implementation_phase) {};
% \node[above left] at (dob.south east) {DOB};
\end{scope}
% Between main steps
\draw[mystep, postaction={decorate,decoration={raise=1ex,text along path,text align=center,text={Concept Validation}}}] (conceptual_phase.north) to[out=90, in=180] (detailed_phase.west);
\draw[mystep, postaction={decorate,decoration={raise=1ex,text along path,text align=center,text={Procurement}}}] (detailed_phase.east) to[out=0, in=90] (implementation_phase.north);
% % Inside Model
% \node[inner sep=1pt, outer sep=6pt, anchor=north west, draw, fill=white, thin] (multibodymodel) at ($(model.north west) - (0, 0.5)$)
% {\includegraphics[width=5.6cm]{simscape_nano_hexapod.png}};
% \node[inner sep=1pt, outer sep=6pt, anchor=south west, draw, fill=white, thin] (simscape) at (model.south west)
% {\includegraphics[width=5.6cm]{simscape_picture.jpg}};
% % Feedback Model
% \node[inner sep=3pt, outer sep=6pt, anchor=north east, draw, fill=white, thin] (simscape_sim) at ($(model.north east) - (0, 0.5)$)
% {\includegraphics[width=3.6cm]{simscape_simulations.pdf}};
% % FeedBack
% \node[inner sep=3pt, outer sep=6pt, anchor=south east, draw, fill=white, thin] (feedback) at (model.south east)
% {\includegraphics[width=3.6cm]{classical_feedback_small.pdf}};
\end{tikzpicture}
```
{{< figure src="nass_mechatronics_approach.png" >}}
## HAC-LAC Representation (two columns) {#hac-lac-representation--two-columns}
```latex
\graphicspath{ {/home/thomas/Cloud/thesis/papers/dehaeze21_mechatronics_approach_nass/tikz/figs-tikz} }
\begin{tikzpicture}
\node[inner sep=3pt, fill=white, draw] (plant) at (0, 0)
{\includegraphics[width=4.5cm]{nass_concept_schematic.pdf}};
\coordinate[] (outputf) at ($(plant.south east)!0.75!(plant.north east)$);
\coordinate[] (outputx) at ($(plant.south east)!0.25!(plant.north east)$);
\node[block, left=0.6 of plant] (amp) {Amplifier};
\node[DAC, left=0.6 of amp] (dac) {DAC};
\node[ADC] (adc) at ($(plant.north-|dac) + (0, 0.2)$) {ADC};
\node[addb, left=0.6 of dac] (addu) {};
\node[block, above=0.4 of addu] (Kiff) {$\bm{K}_{\mathcal{L}}$};
\node[block, left=0.6 of addu] (Kl) {$\bm{K}_{\mathcal{X}}$};
\node[block, left=0.6 of Kl] (J) {$\bm{J}$};
\node[block, left=0.6 of J] (pos_error) {Pos. Err.};
\draw[->] (outputf) -- ++(0.2, 0)node[branch]{} |- (adc.east);
\draw[->] (outputf) --node[midway, below]{$\bm{\tau}_m$} ++(0.8, 0);
\draw[->] (outputx) -- ++(0.2, 0)node[branch]{} |- ($(plant.south)+(0, -0.2)$) -| (pos_error.south);
\draw[->] (outputx) --node[midway, above]{$\bm{\mathcal{X}}_m$} ++(0.8, 0);
\draw[->] (pos_error.east) -- node[midway, above]{$\bm{\epsilon}_{\mathcal{X}}$} (J.west);
\draw[->] (J.east) -- node[midway, above]{$\bm{\epsilon}_{\mathcal{L}}$} (Kl.west);
\draw[->] (Kl.east) -- node[midway, above]{$\bm{u}^\prime$} (addu.west);
\draw[->] (addu.east) -- node[midway, above]{$\bm{u}$} (dac.west);
\draw[->] (dac.east) -- (amp.west);
\draw[->] (amp.east) -- (plant.west);
\draw[->] (adc.west) -| (Kiff.north);
\draw[->] (Kiff.south) -- (addu.north);
\draw[<-] (pos_error.west) -- node[midway, above]{$\bm{r}_\mu$} ++(-0.8, 0);
\end{tikzpicture}
```
{{< figure src="nass_hac_lac_block_diagram.png" >}}
## HAC-LAC alternative (one column) {#hac-lac-alternative--one-column}
```latex
\graphicspath{ {/home/thomas/Cloud/thesis/papers/dehaeze21_mechatronics_approach_nass/tikz/figs-tikz} }
\begin{tikzpicture}
% Plant
\node[inner sep=3pt, fill=white, draw] (plant) at (0, 0)
{\includegraphics[width=4cm]{nass_concept_schematic.pdf}};
% Plant outputs
\coordinate[] (outputf) at ($(plant.south east)!0.8!(plant.north east)$);
\coordinate[] (outputx) at ($(plant.south east)!0.2!(plant.north east)$);
% Blocks
\node[addb, left=0.6 of plant] (addu) {};
\node[block, above=0.4 of addu] (Kiff) {$\bm{K}_{\text{\tiny IFF}}$};
\node[block, left=1.0 of addu] (Kl) {$\bm{K}_{\mathcal{L}}$};
\node[block, left=0.6 of Kl] (J) {$\bm{J}$};
\node[addb={+}{}{}{}{-}, left=0.6 of J] (pos_error) {};
% Lines
\draw[->] (outputf) -- ++(0.2, 0)node[below]{$\bm{\tau}$} |- ($(plant.north)+(0, 0.2)$) -| (Kiff.north);
\draw[->] (outputx) -- ++(0.6, 0)node[above]{$\bm{\mathcal{X}}$} |- ($(plant.south)+(0, -0.4)$) -| (pos_error.south);
\draw[->] (pos_error.east) -- node[midway, above]{$\bm{\epsilon}_{\mathcal{X}}$} (J.west);
\draw[->] (J.east) -- node[midway, above]{$\bm{\epsilon}_{\mathcal{L}}$} (Kl.west);
\draw[->] (Kl.east) -- node[near start, above]{$\bm{u}^\prime$} (addu.west);
\draw[->] (addu.east) -- node[midway, above]{$\bm{u}$} (plant.west);
\draw[->] (Kiff.south) -- (addu.north);
\draw[<-] (pos_error.west) -- node[midway, above]{$\bm{r}$} ++(-0.6, 0);
% Damped plant
\begin{scope}[on background layer]
\node[fit={(plant.south-|Kiff.west) ($(plant.north east)+(0.2cm,0.2cm)$)}, fill=black!10!white, draw, dashed, inner sep=0.2cm] (damped_plant) {};
\node[above right, align=left] at (damped_plant.south west) {\small Damped\\Plant};
\end{scope}
\end{tikzpicture}
```
{{< figure src="nass_hac_lac_block_diagram_without_elec.png" >}}
## Mass Spring Damper Model {#mass-spring-damper-model}
```latex
\begin{tikzpicture}
% ====================
% Parameters
% ====================
\def\bracs{0.05} % Brace spacing vertically
\def\brach{-12pt} % Brace shift horizontaly
% ====================
% ====================
% Ground
% ====================
\draw (-0.9, 0) -- (0.9, 0);
\draw[dashed] (0.9, 0) -- ++(0.5, 0);
\draw[->] (1.3, 0) -- ++(0, 0.4) node[right]{$w$};
% ====================
% ====================
% Granite
\begin{scope}[shift={(0, 0)}]
\draw[fill=white] (-0.9, 1.2) rectangle (0.9, 2.0) node[pos=0.5]{$\scriptstyle\text{granite}$};
\draw[spring] (-0.7, 0) -- ++(0, 1.2);
\draw[damper] ( 0, 0) -- ++(0, 1.2);
\draw[dashed] ( 0.9, 2.0) -- ++(2.0, 0) coordinate(xg);
% \draw[decorate, decoration={brace, amplitude=8pt}, xshift=\brach] %
% (-0.9, \bracs) -- ++(0, 2.0) node[midway,rotate=90,anchor=south,yshift=10pt]{Granite};
\end{scope}
% ====================
% ====================
% Stages
\begin{scope}[shift={(0, 2.0)}]
\draw[fill=white] (-0.9, 1.2) rectangle (0.9, 2.0) node[pos=0.5]{$\scriptstyle\mu\text{-station}$};
\draw[spring] (-0.7, 0) -- ++(0, 1.2);
\draw[damper] ( 0, 0) -- ++(0, 1.2);
\draw[actuator] ( 0.7, 0) -- ++(0, 1.2) node[midway, right=0.1](ft){$f_t$};
% \draw[decorate, decoration={brace, amplitude=8pt}, xshift=\brach] %
% (-0.9, \bracs) -- ++(0, 2.0) node[midway,rotate=90,anchor=south,yshift=10pt]{$\mu\text{-station}$};
\end{scope}
% ====================
% ====================
% NASS
\begin{scope}[shift={(0, 4.0)}]
\draw[fill=white] (-0.9, 1.5) rectangle (0.9, 2.3) node[pos=0.5]{$\scriptstyle\nu\text{-hexapod}$};
\draw[dashed] (0.9, 2.3) -- ++(2.0, 0) coordinate(xnpos);
\draw[spring] (-0.7, 0) -- ++(0, 1.2) node[midway, left=0.1]{};
\draw[damper] ( 0, 0) -- ++(0, 1.2) node[midway, left=0.2]{};
\draw[actuator] ( 0.7, 0) -- ++(0, 1.2) coordinate[midway, below right=0.2 and 0.1](f);
\node[forcesensor={1.8}{0.3}] (fsensn) at (0, 1.2){};
% \draw[decorate, decoration={brace, amplitude=8pt}, xshift=\brach] %
% (-0.9, \bracs) -- ++(0, 2.2) node[midway,rotate=90,anchor=south,yshift=10pt]{$\nu\text{-hexapod}$};
\end{scope}
% ====================
% ====================
% Measured Displacement
\draw[<->, dashed] ($(xg)+(-0.1, 0)$) node[above left](d){$d$} -- ($(xnpos)+(-0.1, 0)$);
% ====================
% ====================
% IFF Control
\node[block={2em}{1.5em}, right=0.6 of fsensn] (iff) {$K_{\scriptscriptstyle IFF}$};
\node[addb] (ctrladd) at (f-|iff) {};
\node[block={2em}{1.5em}, below=0.6 of ctrladd] (ctrl) {$K_{X}$};
\draw[->] (fsensn.east) -- node[midway, above]{$\tau_m$} (iff.west);
\draw[->] (iff.south) -- (ctrladd.north);
\draw[->] (ctrladd.west) -- (f.east) node[above right]{$u$};
\draw[->] (d.west) -| (ctrl.south);
\draw[->] (ctrl.north) -- (ctrladd.south) node[below right]{$u^\prime$};
% ====================
\end{tikzpicture}
```
{{< figure src="mass_spring_damper_hac_lac.png" >}}
## Mass Spring Damper Model - Bis {#mass-spring-damper-model-bis}
```latex
\begin{tikzpicture}
% ====================
% Parameters
% ====================
\def\bracs{0.05} % Brace spacing vertically
\def\brach{-12pt} % Brace shift horizontaly
% ====================
% ====================
% Ground
% ====================
\draw (-0.9, 0) -- (0.9, 0);
\draw[dashed] (0.9, 0) -- ++(0.5, 0);
\draw[->] (1.3, 0) -- ++(0, 0.4) node[right]{$w$};
% ====================
% ====================
% Granite
\begin{scope}[shift={(0, 0)}]
\draw[fill=white] (-0.9, 1.2) rectangle (0.9, 2.0) node[pos=0.5]{$\scriptstyle\text{granite}$};
\draw[spring] (-0.7, 0) -- ++(0, 1.2);
\draw[damper] ( 0, 0) -- ++(0, 1.2);
\draw[dashed] ( 0.9, 2.0) -- ++(2.0, 0) coordinate(xg);
% \draw[decorate, decoration={brace, amplitude=8pt}, xshift=\brach] %
% (-0.9, \bracs) -- ++(0, 2.0) node[midway,rotate=90,anchor=south,yshift=10pt]{Granite};
\end{scope}
% ====================
% ====================
% Stages
\begin{scope}[shift={(0, 2.0)}]
\draw[fill=white] (-0.9, 1.2) rectangle (0.9, 2.0) node[pos=0.5]{$\scriptstyle\mu\text{-station}$};
\coordinate (mustation) at (0.9, 1.6);
\draw[spring] (-0.7, 0) -- ++(0, 1.2);
\draw[damper] ( 0, 0) -- ++(0, 1.2);
\draw[actuator] ( 0.7, 0) -- ++(0, 1.2) node[midway, right=0.1](ft){$f_t$};
% \draw[decorate, decoration={brace, amplitude=8pt}, xshift=\brach] %
% (-0.9, \bracs) -- ++(0, 2.0) node[midway,rotate=90,anchor=south,yshift=10pt]{$\mu\text{-station}$};
\end{scope}
% ====================
% ====================
% NASS
\begin{scope}[shift={(0, 4.0)}]
\draw[fill=white] (-0.9, 1.2) rectangle (0.9, 2.0) node[pos=0.5]{$\scriptstyle\nu\text{-hexapod}$};
\draw[dashed] (0.9, 2.0) -- ++(2.0, 0) coordinate(xnpos);
\draw[spring] (-0.7, 0) -- ++(0, 1.2) node[midway, left=0.1]{};
\draw[damper] ( 0, 0) -- ++(0, 1.2) node[midway, left=0.2]{};
\draw[actuator] ( 0.7, 0) -- ++(0, 1.2) coordinate[midway, right=0.1](f);
% \draw[decorate, decoration={brace, amplitude=8pt}, xshift=\brach] %
% (-0.9, \bracs) -- ++(0, 2.2) node[midway,rotate=90,anchor=south,yshift=10pt]{$\nu\text{-hexapod}$};
\end{scope}
% ====================
% ====================
% Measured Displacement
\draw[<->, dashed] ($(xg)+(-0.1, 0)$) node[above left](d){$d$} -- ($(xnpos)+(-0.1, 0)$);
% ====================
% ====================
% IFF Control
% \node[block={2em}{1.5em}, right=0.6 of fsensn] (iff) {$K_{\scriptscriptstyle IFF}$};
% \node[addb] (ctrladd) at (f-|iff) {};
\node[block={2em}{1.5em}, right=0.6 of mustation] (ctrl) {$K$};
% \draw[->] (fsensn.east) -- node[midway, above]{$\tau_m$} (iff.west);
% \draw[->] (iff.south) -- (ctrladd.north);
% \draw[->] (ctrladd.west) -- (f.east) node[above right]{$u$};
\draw[->] (d.west) -| (ctrl.south);
\draw[->] (ctrl.north) |- (f) node[above right]{$u$};
% ====================
\end{tikzpicture}
```
@@ -0,0 +1,775 @@
+++
title = "LaTeX Configuration for Tikz Figures"
author = ["Dehaeze Thomas"]
draft = false
+++
## Packages {#packages}
```latex
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french, english]{babel} % Last language is main language
\usepackage{lmodern} % Latin Modern Font
\usepackage{gensymb} % Generic symbols for both text and math mode
\usepackage{standalone} % Used to generate standalone Tikz
\usepackage{amsmath} % Main math Package
\usepackage{mathtools} % Extension package to amsmath
\usepackage{amsthm} % Typesetting theorems (AMS style)
\usepackage{amsfonts} % More fonts from the AMS
\usepackage{textcomp} % provide many text symbols
\usepackage{steinmetz} % For phase symbol
\usepackage{xstring} % Utils to manipulate strings
\usepackage{etoolbox} % Add basic if/then
\usepackage{esvect} % Beautyfull vectors
\usepackage{graphicx} % Enhanced support for graphics
\usepackage{grffile} % Used by matlab2tikz
\usepackage{microtype} % typographic tuning
\usepackage{setspace} % for line spacing, e.g. \onehalfspacing
\usepackage{tabularx} % table features
\usepackage{enumitem} % for simple list modifications
\usepackage{booktabs} % better table support
\usepackage{stackengine} %
\usepackage[load-configurations=abbreviations]{siunitx} % SI units
\sisetup{
locale = US,
detect-all,
range-phrase=--,
range-units=single
}
```
## Tikz related packages {#tikz-related-packages}
```latex
\usepackage{tikz} % Tikz
\usepackage{tikzscale} % Used to scale Tikz graphics
\usepackage{adjustbox} % Used to proper positioning of tikz pictures
\usepackage{circuitikz} % Draw electronic circuits
\usepackage{pgfpages} % Needed to use notes
\usepackage{pgfplots} % Used to plot functions
```
## Tikz Libraries {#tikz-libraries}
```latex
\usetikzlibrary{arrows} % Arrow tip library
\usetikzlibrary{arrows.meta} % Add some arrows
\usetikzlibrary{calc} % The library allows advanced Coordinate Calculations
\usetikzlibrary{intersections} % calculate intersections of paths
\usetikzlibrary{matrix} %
\usetikzlibrary{patterns} %
\usetikzlibrary{shapes} % Defines circle and rectangle
\usetikzlibrary{shapes.geometric} % Use for the shape diamond and isosceles triangle
\usetikzlibrary{snakes} % snake=coil and snake=zigzag using segment amplitude=10pt
\usetikzlibrary{positioning} % Additional options for placing nodes
\usetikzlibrary{3d} % Plot 3D shapes
\usetikzlibrary{spy} % Creating a magnified area
\usetikzlibrary{decorations.text} % Used to make text follows a curve
\usetikzlibrary{decorations.pathmorphing} % deformation of a path
\usetikzlibrary{decorations.markings} % Used for spring and damper
\usetikzlibrary{babel} % A tiny library that make the interaction with the babel package easier
\usetikzlibrary{plotmarks} % This library defines a number of plot marks
\usetikzlibrary{fit} % Used to make rectangle as nodes by specifying two points
\usetikzlibrary{backgrounds} % Used to put things under others
```
## PGF Plot libraries and config {#pgf-plot-libraries-and-config}
```latex
\usepgfplotslibrary{patchplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=newest}
\pgfplotsset{plot coordinates/math parser=false}
```
## Setup Arrows style {#setup-arrows-style}
```latex
\tikzset{>=Stealth}
% Setup default Linewidth
\tikzset{every path/.style={line width=1pt}}
```
## Colors {#colors}
```latex
\usepackage{xcolor}% Color extension
\definecolor{colorblack}{rgb}{0, 0, 0}
\definecolor{colorblue}{HTML}{0072bd}
\definecolor{colorred}{HTML}{d95218}
\definecolor{coloryellow}{HTML}{ecb01f}
\definecolor{colorpurple}{HTML}{7d2e8e}
\definecolor{colorgreen}{HTML}{77ab2f}
\definecolor{lightblue}{HTML}{dbf0ff}
\definecolor{lightred}{HTML}{f9d9cb}
\definecolor{lightyellow}{HTML}{faf0d1}
\definecolor{lightpurple}{HTML}{efdcf4}
\definecolor{lightgreen}{HTML}{e6f3d3}
% Main color
\definecolor{maincolor}{RGB}{89, 9, 38}
\definecolor{secondcolor}{RGB}{20, 9, 89}
```
## Control {#control}
### Blocks {#blocks}
```latex
\tikzset{%
block/.style n args={2}{%
draw,
fill=white,
minimum width = #1,
minimum height = #2,
},
block/.default={1.2cm}{1.0cm}
}
```
### Branches {#branches}
```latex
\tikzstyle{branch}=[fill,shape=circle,minimum size=4pt,inner sep=0pt]
\tikzstyle{->top}=[-{Stealth[color=black, scale=0.8]}, draw=white, double=black, double distance=1pt, line width=1pt]
\tikzstyle{<-top}=[{stealth[color=black, scale=0.8]}-, draw=white, double=black, double distance=1pt, line width=1pt]
```
### Hand Writen Style {#hand-writen-style}
Usefull for schematic plots
```latex
\tikzstyle{handwriten}=[decorate,decoration={random steps,amplitude=0.1pt,segment length=0.8pt}]
```
### DAC {#dac}
```latex
\tikzset{%
DAC/.style={%
draw,
signal,
}
}
```
### ADC {#adc}
```latex
\tikzset{%
ADC/.style={%
draw,
signal,
signal to = west,
}
}
```
### Gain {#gain}
```latex
\tikzset{%
gain right/.style={%
draw,
regular polygon,
regular polygon sides = 3,
inner sep = 2pt,
shape border rotate=-90
},
gain left/.style={%
draw,
regular polygon,
regular polygon sides = 3,
inner sep = 2pt,
shape border rotate=90
},
gain top/.style={%
draw,
regular polygon,
regular polygon sides = 3,
inner sep = 2pt,
shape border rotate=0
},
gain bottom/.style={%
draw,
regular polygon,
regular polygon sides = 3,
inner sep = 2pt,
shape border rotate=180
},
}
```
### Add / Substract / Divide / Multiply block {#add-substract-divide-multiply-block}
```latex
\tikzset{% Add block with Circled operations
addc/.style n args={5}{%
draw,
fill=white,
circle,
outer sep = 0pt,
inner sep = 0pt,
minimum size = 2em,
execute at begin node={\LARGE $#1$},
append after command={\pgfextra{\let\mainnode=\tikzlastnode}
\ifx#2\empty\else
node[draw, circle, outer sep=6pt, inner sep=0pt, above left] at (\mainnode.west) {$#2$}%
\fi
\ifx#3\empty\else
node[draw, circle, outer sep=6pt, inner sep=0pt, above right] at (\mainnode.north) {$#3$}%
\fi
\ifx#4\empty\else
node[draw, circle, outer sep=6pt, inner sep=0pt, below right] at (\mainnode.east) {$#4$}%
\fi
\ifx#5\empty\else
node[draw, circle, outer sep=6pt, inner sep=0pt, below left] at (\mainnode.south) {$#5$}%
\fi
}
},
addc/.default={+}{}{}{}{},
}
```
```latex
\tikzset{% Add Block
addb/.style n args={5}{%
draw,
fill=white,
circle,
outer sep = 0pt,
inner sep = 0pt,
minimum size = 2em,
execute at begin node={\LARGE $#1$},
append after command={\pgfextra{\let\mainnode=\tikzlastnode}
\ifx#2\empty\else
node[outer sep=2pt, inner sep=0pt, above left] at (\mainnode.west) {$#2$}%
\fi
\ifx#3\empty\else
node[outer sep=2pt, inner sep=0pt, above right] at (\mainnode.north) {$#3$}%
\fi
\ifx#4\empty\else
node[outer sep=2pt, inner sep=0pt, below right] at (\mainnode.east) {$#4$}%
\fi
\ifx#5\empty\else
node[outer sep=2pt, inner sep=0pt, below left] at (\mainnode.south) {$#5$}%
\fi
}
},
addb/.default={+}{}{}{}{},
}
```
## Plots {#plots}
### Default line caps {#default-line-caps}
```latex
\pgfplotsset{
every axis plot/.append style={line join=round},
every axis plot/.append style={line cap=round},
}
```
### Grid {#grid}
```latex
\pgfplotsset{grid style={black}}
\pgfplotsset{major grid style={black!30!white}}
\pgfplotsset{minor grid style={black!10!white}}
\pgfplotsset{xmajorgrids}
\pgfplotsset{ymajorgrids}
```
### Lines {#lines}
```latex
\pgfplotsset{separate axis lines=false} % draw axis as rectangle and not as 4 lines
\pgfplotsset{every outer x axis line/.append style={black}}
\pgfplotsset{every outer y axis line/.append style={black}}
\pgfplotsset{axis background/.style={fill=white}}
\pgfplotsset{axis x line*=bottom} % solid line on the bottom with thin on the top
\pgfplotsset{axis y line*=left} % solid line on the left with thin on the right
```
### Ticks {#ticks}
```latex
\pgfplotsset{every y tick label/.append style={font=\color{black}}}
\pgfplotsset{every y tick/.append style={black}}
\pgfplotsset{every x tick label/.append style={font=\color{black}}}
\pgfplotsset{every x tick/.append style={black}}
```
### Size {#size}
If `scale only axis=false` (the default), pgfplots will try to produce the desired width including labels, titles and ticks.
```latex
\pgfplotsset{scale only axis=true}
```
### Label {#label}
Used to align all of ylabel of one figure.
```latex
\pgfplotsset{ylabel absolute}
```
### Legend {#legend}
```latex
% https://tex.stackexchange.com/questions/54794/using-a-pgfplots-style-legend-in-a-plain-old-tikzpicture#54834
% argument #1: any options
\newenvironment{customlegend}[1][]{%
\begingroup
% inits/clears the lists (which might be populated from previous
% axes):
\csname pgfplots@init@cleared@structures\endcsname
\pgfplotsset{#1}%
}{%
% draws the legend:
\csname pgfplots@createlegend\endcsname
\endgroup
}%
% makes \addlegendimage available (typically only available within an
% axis environment):
\def\addlegendimage{\csname pgfplots@addlegendimage\endcsname}
% definition to insert numbers
% \pgfkeys{/pgfplots/number in legend/.style={%
% /pgfplots/legend image code/.code={%
% \node at (0.125,-0.0225){#1}; % <= changed x value
% },%
% },
% }
\pgfplotsset{
every legend to name picture/.style={west}
}
```
### Upper and Lower bounds {#upper-and-lower-bounds}
```latex
\pgfplotsset{upperbound}=[line cap=round, postaction={decorate,draw,decoration={border, segment length=0.2cm, amplitude=0.3cm, angle=60}}]
\pgfplotsset{lowerbound}=[line cap=round, postaction={decorate,draw,decoration={border, segment length=0.2cm, amplitude=0.3cm, angle=-60}}]
```
And we add the corresdonding
```latex
\pgfplotsset{
/pgfplots/upperbound/.style 1 args={
legend image code/.code={
\draw[##1, upperbound]
plot coordinates {
(0cm,0cm)
(0.6cm,0cm)
}
}
}
}
```
### Pole {#pole}
```latex
\tikzset{%
pole/.style{%
color=red,
cross out,
draw,
inner sep=0pt,
outer sep=0pt,
minimum size=#1pt
},
pole/.default={4}
}
```
### Zero {#zero}
```latex
\tikzset{%
zero/.style{%
color=red,
circle,
draw,
inner sep=0pt,
outer sep=0pt,
minimum size=#1pt
},
zero/.default={4}
}
```
## Mechanical {#mechanical}
### Spring {#spring}
```latex
\tikzset{%
spring/.style={%
thick,
decoration={
zigzag,
pre length = #1cm,
post length = #1cm,
segment length = 6
},
decorate
},
spring/.default={0.2}
}
```
### Coil {#coil}
```latex
\tikzset{%
coil/.style n args={2}{%
thick,
decoration={
coil,
pre length = #1cm,
post length = #2cm,
segment length = 4
},
decorate
},
coil/.default={0.3}{0.3}
}
```
### Damper {#damper}
```latex
\tikzset{%
damper/.style n args={2}{%
thick,
decoration={markings, mark connection node=dmp, mark=at position 0.5 with {
\node (dmp) [thick,
inner sep = 0pt,
transform shape,
rotate =-90,
minimum width = #1pt,
minimum height = #2pt,
draw=none] {};
\draw [thick] ($(dmp.north east)+(0.6*#2pt,0)$) -- (dmp.south east) -- (dmp.south west) -- ($(dmp.north west)+(0.6*#2pt,0)$);
\draw [thick] ($(dmp.north)+(0,-0.3*#1pt)$) -- ($(dmp.north)+(0,0.3*#1pt)$);
}
},
decorate
},
damper/.default={12}{3}
}
```
### Actuator {#actuator}
```latex
\tikzset{%
actuator/.style n args={2}{%
thick,
draw=none,
decoration={
markings,
mark connection node=my node,
mark=at position .5 with {
\node [draw, inner sep=0pt, minimum width=#1cm, minimum height=#2cm,
transform shape, fill=white] (my node) {};
},
mark=at position .0 with {
\draw[<-] (0, 0) -- (my node);
},
mark=at position 1.0 with {
\draw[<-] (0, 0) -- (my node);
}
},
decorate
},
actuator/.default={0.5}{0.2}
}
```
### Ground {#ground}
```latex
\tikzset{%
ground/.style n args={2}{%
fill,
pattern = north east lines,
draw = none,
anchor = north,
minimum width = #1cm,
minimum height = #2cm,
append after command={
(\tikzlastnode.north west) edge (\tikzlastnode.north east)
}
},
ground/.default={2.5}{0.3}
}
```
### Force Sensor {#force-sensor}
```latex
\tikzset{%
forcesensor/.style n args={2}{%
rectangle,
outer sep=0pt,
inner sep=0pt,
draw=black,
fill=white!60!black,
anchor=south,
minimum width =#1cm,
minimum height=#2cm,
append after command={
[every edge/.append style={
thick,
black,
}]
(\tikzlastnode.north west) edge (\tikzlastnode.south east)
(\tikzlastnode.north east) edge (\tikzlastnode.south west)
}
},
forcesensor/.default={2.0}{0.5}
}
```
### Inertial Sensor {#inertial-sensor}
```latex
\tikzset{%
inertialsensor/.style={%
rectangle,
outer sep=0pt,
inner sep=0pt,
draw=black,
fill=white!60!black,
anchor=south east,
minimum size=#1cm,
append after command={
[every edge/.append style={
thick,
black,
}]
(\tikzlastnode.north west) edge (\tikzlastnode.south east)
(\tikzlastnode.north east) edge (\tikzlastnode.south west)
}
},
inertialsensor/.default={0.3}
}
```
### Cross {#cross}
```latex
\tikzstyle{cross}=[path picture={
\draw[black]
(path picture bounding box.south east) -- (path picture bounding box.north west) (path picture bounding box.south west) -- (path picture bounding box.north east);
}]
```
### Piezoelectric actuator {#piezoelectric-actuator}
```latex
\tikzset{%
piezo/.style n args={3}{%
draw,
rectangle,
minimum width = #1cm,
minimum height = #2cm,
fill=blue!10!white,
anchor=center,
append after command={
[every edge/.append style={
thick,
black,
}]
\foreach \i in {1,...,#3}{
(${\i/(1+#3)}*(\tikzlastnode.north west)+{(1+#3-\i)/(1+#3)}*(\tikzlastnode.south west)+0.1*(#1,0)$) edge (${\i/(1+#3)}*(\tikzlastnode.north east)+{(1+#3-\i)/(1+#3)}*(\tikzlastnode.south east)-0.1*(#1,0)$)
}
}
},
piezo/.default={2}{4}{10}
}
```
### Voice coil {#voice-coil}
```latex
\def\voicecoil#1#2#3{
% ======================
% Parameters
% ======================
\def\voicecoilw{#1} % Total Width
\def\voicecoilh{#2} % Total Height
\def\magnetw{\voicecoilw} % Width of the magnet
\def\magneth{\voicecoilh/1.4} % Height of the magnet
\def\magnetwb{0.15*\magnetw} % Width of the borders of the magnet
\def\magnetmw{0.15*\magnetw} % Width of the middle part of the magnet
\def\magnetwg{0.5*\magnetw} % Width of the gap of the magnet
\def\magnethl{\magnetwb} % Height of the low part of the magnet
\def\magnetmh{0.15*\magneth} % Height of the middle part of the magnet
\def\magnethg{0.2*\magneth} % Height of the gap of the magnet
% ======================
\begin{scope}[shift={(0.5*\voicecoilw, 0.5*\voicecoilh)}, rotate=#3, shift={(0, -0.5*\voicecoilh)}]
% ======================
% Magnet
% ======================
\draw[fill=white] (0, 0) -| ++(0.5*\magnetw, \magneth) -| ++(-0.5*\magnetw+0.5*\magnetwg, -\magnethg) -| (0.5*\magnetw-\magnetwb, \magnethl) -| (-0.5*\magnetw+\magnetwb, \magneth-\magnethg) -| (-0.5*\magnetwg, \magneth) -| (-0.5*\magnetw, 0) -- (cycle);
\begin{scope}[shift={(0, \magnethl)}]
\draw[fill=red] (-0.5*\magnetmw, 0) rectangle (0.5*\magnetmw, \magnetmh);
\draw[fill=blue] (-0.5*\magnetmw, \magnetmh) rectangle (0.5*\magnetmw, 2*\magnetmh);
% Top conductive Magnet
\draw[fill=white] (-0.5*\magnetmw, 2*\magnetmh) -| (0.5*\magnetmw, -\magnethl+\magneth-\magnethg) -| ++(0.1, \magnethg) -| ++(-0.2-\magnetmw, -\magnethg) -| (-0.5*\magnetmw, \magnetmh);
\end{scope}
% ======================
% ======================
% Coil
% ======================
\pgfmathsetmacro{\coilwidth}{0.5*0.5*\magnetmw+0.5*0.1+0.25*\magnetwg}%
\draw[] ( \coilwidth, 0.5*\magneth) -- ++(0, 0.7*\magneth);
\draw[] (-\coilwidth, 0.5*\magneth) -- ++(0, 0.7*\magneth);
% Point on the coil
\foreach \x in {0,1,...,9}
{
\node[circle,inner sep=0.6pt,fill] at ( \coilwidth, \x*0.7*\magneth/10+0.5*\magneth);
\node[circle,inner sep=0.6pt,fill] at (-\coilwidth, \x*0.7*\magneth/10+0.5*\magneth);
}
\draw[fill=white] (-0.5*\magnetw, 1.2*\magneth) rectangle ++(\magnetw, \magnethg);
% ======================
% ======================
% Coordinates
% ======================
% Force
\coordinate[] (vc_force) at (0, \magneth-0.5*\magnethg);
% Coil
\coordinate[] (vc_coil) at (0, \voicecoilh);
% Magnet
\coordinate[] (vc_magnet) at (0, 0);
% Coil Wires
\coordinate[] (vc_wire_one) at ( \coilwidth, 1.2*\magneth);
\coordinate[] (vc_wire_two) at (-\coilwidth, 1.2*\magneth);
% ======================
\end{scope}
}
```
### Axis Rotator {#axis-rotator}
```latex
\newcommand{\AxisRotator}[1][rotate=0]{%
\tikz [x=0.1cm,y=0.30cm,-stealth,#1] \draw (0,0) arc (-150:150:1 and 1);%
}
```
## Optics {#optics}
```latex
\tikzset{%
->-/.style={
decoration={
markings,
mark = at position #1 with {\arrow{>}
}
},
postaction={decorate}
}
}
\tikzset{%
-<-/.style={
decoration={
markings,
mark = at position #1 with {\arrow{<}
}
},
postaction={decorate}
}
}
```
## Misc {#misc}
```latex
\tikzset{%
labelc/.style= {%
draw,
fill=white,
shape=circle,
inner sep=2pt,
outer sep=6pt,
}
}
```
## More Defaults specific to this paper {#more-defaults-specific-to-this-paper}
```latex
\tikzset{block/.default={0.8cm}{0.8cm}}
\tikzset{addb/.append style={scale=0.7}}
\tikzset{node distance=0.6}
```
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB