diff --git a/content/research/brumund21_multib_simul_reduc_order_flexib_bodies_fea/_index.md b/content/research/brumund21_multib_simul_reduc_order_flexib_bodies_fea/_index.md new file mode 100644 index 0000000..d58817e --- /dev/null +++ b/content/research/brumund21_multib_simul_reduc_order_flexib_bodies_fea/_index.md @@ -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. diff --git a/content/research/brumund21_multib_simul_reduc_order_flexib_bodies_fea/paper/brumund21_multib_simul_reduc_order_flexib_bodies_fea.pdf b/content/research/brumund21_multib_simul_reduc_order_flexib_bodies_fea/paper/brumund21_multib_simul_reduc_order_flexib_bodies_fea.pdf new file mode 100644 index 0000000..ad1c948 Binary files /dev/null and b/content/research/brumund21_multib_simul_reduc_order_flexib_bodies_fea/paper/brumund21_multib_simul_reduc_order_flexib_bodies_fea.pdf differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/_index.md b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/_index.md new file mode 100644 index 0000000..1a2a0b8 --- /dev/null +++ b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/_index.md @@ -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., & Collette, C., Sample Stabilization For Tomography Experiments In Presence Of Large Plant Uncertainty, In MEDSI'18 (pp. 153–157) (2018). Geneva, Switzerland diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/paper/dehaeze18_sampl_stabil_for_tomog_exper.pdf b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/paper/dehaeze18_sampl_stabil_for_tomog_exper.pdf new file mode 100644 index 0000000..240fbb3 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/paper/dehaeze18_sampl_stabil_for_tomog_exper.pdf differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/poster/dehaeze18_sampl_stabil_for_tomog_exper_poster.pdf b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/poster/dehaeze18_sampl_stabil_for_tomog_exper_poster.pdf new file mode 100644 index 0000000..830a386 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/poster/dehaeze18_sampl_stabil_for_tomog_exper_poster.pdf differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/talk/dehaeze18_sampl_stabil_for_tomog_exper_talk.pdf b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/talk/dehaeze18_sampl_stabil_for_tomog_exper_talk.pdf new file mode 100644 index 0000000..938e54a Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/talk/dehaeze18_sampl_stabil_for_tomog_exper_talk.pdf differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/_index.md b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/_index.md new file mode 100644 index 0000000..9e96e87 --- /dev/null +++ b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/_index.md @@ -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} + + + +{{< figure src="figs/schematic_sys_without_nass.png" caption="Figure 1: 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} +``` + + + +{{< figure src="figs/assemblage.png" caption="Figure 2: 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} +``` + + + +{{< figure src="figs/exp_setup.png" caption="Figure 3: 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} + + + +{{< figure src="figs/system_control.png" caption="Figure 4: 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} + + + +{{< figure src="figs/G_x_mass.png" caption="Figure 5: 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} +``` + + + +{{< figure src="figs/general_conf_K.png" caption="Figure 6: 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} + + + +{{< figure src="figs/loopgain.png" caption="Figure 7: 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} + + + +{{< figure src="figs/exp_w_wo_nass_xy.png" caption="Figure 8: 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} + + + +{{< figure src="figs/exp_full_setup.png" caption="Figure 9: Schematic of the Tomography Experiment ([png](figs/exp_full_setup.png), [pdf](figs/exp_full_setup.pdf), [tex](./figs/exp_full_setup.tex))." >}} diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/config.md b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/config.md new file mode 100644 index 0000000..df320c7 --- /dev/null +++ b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/config.md @@ -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} +``` diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/G_x_mass.pdf b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/G_x_mass.pdf new file mode 100644 index 0000000..23f7794 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/G_x_mass.pdf differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/G_x_mass.png b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/G_x_mass.png new file mode 100644 index 0000000..70f08b5 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/G_x_mass.png differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/assemblage.pdf b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/assemblage.pdf new file mode 100644 index 0000000..f04d8db Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/assemblage.pdf differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/assemblage.png b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/assemblage.png new file mode 100644 index 0000000..15fa4c6 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/assemblage.png differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_full_setup.pdf b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_full_setup.pdf new file mode 100644 index 0000000..5777c66 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_full_setup.pdf differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_full_setup.png b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_full_setup.png new file mode 100644 index 0000000..45d9f17 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_full_setup.png differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_setup.pdf b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_setup.pdf new file mode 100644 index 0000000..dcd64f0 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_setup.pdf differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_setup.png b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_setup.png new file mode 100644 index 0000000..fbe5175 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_setup.png differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_w_wo_nass_xy.pdf b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_w_wo_nass_xy.pdf new file mode 100644 index 0000000..923685f Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_w_wo_nass_xy.pdf differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_w_wo_nass_xy.png b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_w_wo_nass_xy.png new file mode 100644 index 0000000..880f272 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/exp_w_wo_nass_xy.png differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/general_conf_K.pdf b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/general_conf_K.pdf new file mode 100644 index 0000000..669b2f7 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/general_conf_K.pdf differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/general_conf_K.png b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/general_conf_K.png new file mode 100644 index 0000000..212cb8c Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/general_conf_K.png differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/loopgain.pdf b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/loopgain.pdf new file mode 100644 index 0000000..c3d7baa Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/loopgain.pdf differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/loopgain.png b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/loopgain.png new file mode 100644 index 0000000..58c03af Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/loopgain.png differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/schematic_sys_without_nass.pdf b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/schematic_sys_without_nass.pdf new file mode 100644 index 0000000..1d84678 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/schematic_sys_without_nass.pdf differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/schematic_sys_without_nass.png b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/schematic_sys_without_nass.png new file mode 100644 index 0000000..e6c197d Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/schematic_sys_without_nass.png differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/system_control.pdf b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/system_control.pdf new file mode 100644 index 0000000..ace4e96 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/system_control.pdf differ diff --git a/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/system_control.png b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/system_control.png new file mode 100644 index 0000000..0944928 Binary files /dev/null and b/content/research/dehaeze18_sampl_stabil_for_tomog_exper/tikz/figs/system_control.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/_index.md b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/_index.md new file mode 100644 index 0000000..8082fab --- /dev/null +++ b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/_index.md @@ -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., & 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} + + diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/campbell_diagram_imag.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/campbell_diagram_imag.png new file mode 100644 index 0000000..0e82123 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/campbell_diagram_imag.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/campbell_diagram_real.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/campbell_diagram_real.png new file mode 100644 index 0000000..a1f5f76 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/campbell_diagram_real.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/comp_compliance.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/comp_compliance.png new file mode 100644 index 0000000..0948226 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/comp_compliance.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/comp_root_locus.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/comp_root_locus.png new file mode 100644 index 0000000..26aca74 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/comp_root_locus.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/comp_transmissibility.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/comp_transmissibility.png new file mode 100644 index 0000000..ea63ec7 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/comp_transmissibility.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/loop_gain_modified_iff.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/loop_gain_modified_iff.png new file mode 100644 index 0000000..8662d20 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/loop_gain_modified_iff.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/mod_iff_damping_wi.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/mod_iff_damping_wi.png new file mode 100644 index 0000000..315a57d Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/mod_iff_damping_wi.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/opt_damp_alpha.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/opt_damp_alpha.png new file mode 100644 index 0000000..c686509 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/opt_damp_alpha.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_compare_rotating_speed_coupling.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_compare_rotating_speed_coupling.png new file mode 100644 index 0000000..1e46deb Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_compare_rotating_speed_coupling.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_compare_rotating_speed_direct.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_compare_rotating_speed_direct.png new file mode 100644 index 0000000..deb3e8d Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_compare_rotating_speed_direct.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_iff_comp_simscape_analytical.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_iff_comp_simscape_analytical.png new file mode 100644 index 0000000..501ed46 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_iff_comp_simscape_analytical.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_iff_compare_rotating_speed.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_iff_compare_rotating_speed.png new file mode 100644 index 0000000..9d16e7d Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_iff_compare_rotating_speed.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_iff_kp.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_iff_kp.png new file mode 100644 index 0000000..1568266 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_iff_kp.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_iff_kp_comp_simscape_analytical.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_iff_kp_comp_simscape_analytical.png new file mode 100644 index 0000000..f4a5c5c Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_iff_kp_comp_simscape_analytical.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_simscape_analytical.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_simscape_analytical.png new file mode 100644 index 0000000..7ef5d5a Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/plant_simscape_analytical.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_iff_kp.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_iff_kp.png new file mode 100644 index 0000000..4e85a33 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_iff_kp.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_iff_kp_zoom.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_iff_kp_zoom.png new file mode 100644 index 0000000..8e88764 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_iff_kp_zoom.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_iff_kps.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_iff_kps.png new file mode 100644 index 0000000..eb5022f Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_iff_kps.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_modified_iff.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_modified_iff.png new file mode 100644 index 0000000..ae4f6de Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_modified_iff.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_modified_iff_zoom.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_modified_iff_zoom.png new file mode 100644 index 0000000..867bc5b Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_modified_iff_zoom.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_pure_iff.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_pure_iff.png new file mode 100644 index 0000000..2d95877 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_pure_iff.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_wi_modified_iff.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_wi_modified_iff.png new file mode 100644 index 0000000..e0a9035 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_wi_modified_iff.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_wi_modified_iff_zoom.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_wi_modified_iff_zoom.png new file mode 100644 index 0000000..10c86e1 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/figs/root_locus_wi_modified_iff_zoom.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/index.md b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/index.md new file mode 100644 index 0000000..881206c --- /dev/null +++ b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/index.md @@ -0,0 +1,959 @@ ++++ +title = "Active Damping of Rotating Platforms using Integral Force Feedback - Matlab Computation" +author = ["Dehaeze Thomas"] +draft = false ++++ + +
+

This report is also available as a pdf.

+
+ +This document gathers the Matlab code used to for the conference paper (Dehaeze and Collette 2020) and the journal paper (Dehaeze and Collette 2021). + +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) (Dehaeze 2020). 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. + +
+ Table 1: + Paper's sections and corresponding Matlab files +
+ +| 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} + + + + +### 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)). + + + +{{< figure src="system.png" caption="Figure 1: 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: + +
+ +\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} + +
+ + +### 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). + + + +{{< figure src="figs/campbell_diagram_real.png" caption="Figure 2: Campbell Diagram - Real Part" >}} + + + +{{< figure src="figs/campbell_diagram_imag.png" caption="Figure 3: 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. + + + +{{< figure src="figs/plant_simscape_analytical.png" caption="Figure 4: 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). + + + +{{< figure src="figs/plant_compare_rotating_speed_direct.png" caption="Figure 5: Comparison of the transfer functions from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) for several rotating speed - Direct Terms" >}} + + + +{{< figure src="figs/plant_compare_rotating_speed_coupling.png" caption="Figure 6: 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} + + + +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. + + + +{{< figure src="system_iff.png" caption="Figure 7: 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: + +
+ +\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} + +
+ + +### 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. + + + +{{< figure src="figs/plant_iff_comp_simscape_analytical.png" caption="Figure 8: 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). + + + +{{< figure src="figs/plant_iff_compare_rotating_speed.png" caption="Figure 9: 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. + + + +{{< figure src="figs/root_locus_pure_iff.png" caption="Figure 10: 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} + + + + +### 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). + + + +{{< figure src="figs/loop_gain_modified_iff.png" caption="Figure 11: 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. + + + +{{< figure src="figs/root_locus_modified_iff.png" caption="Figure 12: Root Locus for the modified IFF controller" >}} + + + +{{< figure src="figs/root_locus_modified_iff_zoom.png" caption="Figure 13: 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] +``` + + + +{{< figure src="figs/root_locus_wi_modified_iff.png" caption="Figure 14: Root Locus for the modified IFF controller (zoomed plot on the left)" >}} + + + +{{< figure src="figs/root_locus_wi_modified_iff_zoom.png" caption="Figure 15: 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 +``` + + + +{{< figure src="figs/mod_iff_damping_wi.png" caption="Figure 16: 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} + + + + +### Schematic {#schematic} + +In this section additional springs in parallel with the force sensors are added to counteract the negative stiffness induced by the rotation. + + + +{{< figure src="system_parallel_springs.png" caption="Figure 17: 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} + +
+ +\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} + +
+ +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'}; +``` + + + +{{< figure src="figs/plant_iff_kp_comp_simscape_analytical.png" caption="Figure 18: 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]; +``` + + + +{{< figure src="figs/plant_iff_kp.png" caption="Figure 19: 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} + + + +{{< figure src="figs/root_locus_iff_kp.png" caption="Figure 20: Root Locus" >}} + + + +{{< figure src="figs/root_locus_iff_kp_zoom.png" caption="Figure 21: 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. + + + +{{< figure src="figs/root_locus_iff_kps.png" caption="Figure 22: 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 +``` + + + +{{< figure src="figs/opt_damp_alpha.png" caption="Figure 23: Attainable damping ratio and corresponding controller gain for different parameter \\(\alpha\\)" >}} + + +## Comparison {#comparison} + + + +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; +``` + + + +{{< figure src="figs/comp_root_locus.png" caption="Figure 24: 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} + + + +```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'}; +``` + + + +{{< figure src="figs/comp_transmissibility.png" caption="Figure 25: Comparison of the transmissibility" >}} + + + +{{< figure src="figs/comp_compliance.png" caption="Figure 26: Comparison of the obtained Compliance" >}} + + +## Notations {#notations} + + + +| | 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] | + +
+
Dehaeze, T., and C. Collette. 2020. “Active Damping of Rotating Platforms Using Integral Force Feedback.” In Proceedings of the International Conference on Modal Analysis Noise and Vibration Engineering (ISMA).
+
Dehaeze, Thomas. 2020. “Active Damping of Rotating Positioning Platforms.” Source Code on Zonodo. doi:10.5281/zenodo.3894342.
+
Dehaeze, Thomas, and Christophe Collette. 2021. “Active Damping of Rotating Platforms Using Integral Force Feedback.” Engineering Research Express. http://iopscience.iop.org/article/10.1088/2631-8695/abe803.
+
diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/system.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/system.png new file mode 100644 index 0000000..63ee834 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/system.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/system_iff.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/system_iff.png new file mode 100644 index 0000000..bad0bd9 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/system_iff.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/system_parallel_springs.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/system_parallel_springs.png new file mode 100644 index 0000000..6c527a6 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/matlab/system_parallel_springs.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/paper/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb.pdf b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/paper/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb.pdf new file mode 100644 index 0000000..c789dca Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/paper/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb.pdf differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/talk/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb_talk.pdf b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/talk/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb_talk.pdf new file mode 100644 index 0000000..e665fc6 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/talk/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb_talk.pdf differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/_index.md b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/_index.md new file mode 100644 index 0000000..cf67be6 --- /dev/null +++ b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/_index.md @@ -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" >}} diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/config.md b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/config.md new file mode 100644 index 0000000..257404e --- /dev/null +++ b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/config.md @@ -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, + } + } +``` diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/control_diagram_iff.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/control_diagram_iff.png new file mode 100644 index 0000000..f12d9ae Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/control_diagram_iff.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/system.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/system.png new file mode 100644 index 0000000..63ee834 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/system.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/system_iff.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/system_iff.png new file mode 100644 index 0000000..bad0bd9 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/system_iff.png differ diff --git a/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/system_parallel_springs.png b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/system_parallel_springs.png new file mode 100644 index 0000000..6c527a6 Binary files /dev/null and b/content/research/dehaeze20_activ_dampin_rotat_platf_integ_force_feedb/tikz/system_parallel_springs.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/_index.md b/content/research/dehaeze21_activ_dampin_rotat_platf_using/_index.md new file mode 100644 index 0000000..87f1f08 --- /dev/null +++ b/content/research/dehaeze21_activ_dampin_rotat_platf_using/_index.md @@ -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., & 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" >}}). diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/journal/dehaeze21_activ_dampin_rotat_platf_using.pdf b/content/research/dehaeze21_activ_dampin_rotat_platf_using/journal/dehaeze21_activ_dampin_rotat_platf_using.pdf new file mode 100644 index 0000000..247dbf8 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/journal/dehaeze21_activ_dampin_rotat_platf_using.pdf differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/campbell_diagram_imag.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/campbell_diagram_imag.png new file mode 100644 index 0000000..0e82123 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/campbell_diagram_imag.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/campbell_diagram_real.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/campbell_diagram_real.png new file mode 100644 index 0000000..a1f5f76 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/campbell_diagram_real.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/comp_compliance.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/comp_compliance.png new file mode 100644 index 0000000..0948226 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/comp_compliance.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/comp_root_locus.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/comp_root_locus.png new file mode 100644 index 0000000..26aca74 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/comp_root_locus.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/comp_transmissibility.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/comp_transmissibility.png new file mode 100644 index 0000000..ea63ec7 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/comp_transmissibility.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/loop_gain_modified_iff.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/loop_gain_modified_iff.png new file mode 100644 index 0000000..8662d20 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/loop_gain_modified_iff.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/mod_iff_damping_wi.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/mod_iff_damping_wi.png new file mode 100644 index 0000000..315a57d Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/mod_iff_damping_wi.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/opt_damp_alpha.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/opt_damp_alpha.png new file mode 100644 index 0000000..c686509 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/opt_damp_alpha.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_compare_rotating_speed_coupling.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_compare_rotating_speed_coupling.png new file mode 100644 index 0000000..1e46deb Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_compare_rotating_speed_coupling.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_compare_rotating_speed_direct.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_compare_rotating_speed_direct.png new file mode 100644 index 0000000..deb3e8d Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_compare_rotating_speed_direct.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_iff_comp_simscape_analytical.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_iff_comp_simscape_analytical.png new file mode 100644 index 0000000..501ed46 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_iff_comp_simscape_analytical.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_iff_compare_rotating_speed.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_iff_compare_rotating_speed.png new file mode 100644 index 0000000..9d16e7d Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_iff_compare_rotating_speed.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_iff_kp.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_iff_kp.png new file mode 100644 index 0000000..1568266 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_iff_kp.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_iff_kp_comp_simscape_analytical.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_iff_kp_comp_simscape_analytical.png new file mode 100644 index 0000000..f4a5c5c Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_iff_kp_comp_simscape_analytical.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_simscape_analytical.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_simscape_analytical.png new file mode 100644 index 0000000..7ef5d5a Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/plant_simscape_analytical.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_iff_kp.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_iff_kp.png new file mode 100644 index 0000000..4e85a33 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_iff_kp.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_iff_kp_zoom.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_iff_kp_zoom.png new file mode 100644 index 0000000..8e88764 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_iff_kp_zoom.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_iff_kps.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_iff_kps.png new file mode 100644 index 0000000..eb5022f Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_iff_kps.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_modified_iff.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_modified_iff.png new file mode 100644 index 0000000..ae4f6de Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_modified_iff.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_modified_iff_zoom.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_modified_iff_zoom.png new file mode 100644 index 0000000..867bc5b Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_modified_iff_zoom.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_pure_iff.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_pure_iff.png new file mode 100644 index 0000000..2d95877 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_pure_iff.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_wi_modified_iff.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_wi_modified_iff.png new file mode 100644 index 0000000..e0a9035 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_wi_modified_iff.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_wi_modified_iff_zoom.png b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_wi_modified_iff_zoom.png new file mode 100644 index 0000000..10c86e1 Binary files /dev/null and b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/figs/root_locus_wi_modified_iff_zoom.png differ diff --git a/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/index.md b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/index.md new file mode 100644 index 0000000..16608cd --- /dev/null +++ b/content/research/dehaeze21_activ_dampin_rotat_platf_using/matlab/index.md @@ -0,0 +1,959 @@ ++++ +title = "Active Damping of Rotating Platforms using Integral Force Feedback - Matlab Computation" +author = ["Dehaeze Thomas"] +draft = false ++++ + +
+

This report is also available as a pdf.

+
+ +This document gathers the Matlab code used to for the conference paper (Dehaeze and Collette 2020) and the journal paper (Dehaeze and Collette 2021). + +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) (Dehaeze 2020). 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. + +
+ Table 1: + Paper's sections and corresponding Matlab files +
+ +| 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} + + + + +### 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)). + + + +{{< figure src="figs-paper/system.png" caption="Figure 1: 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: + +
+ +\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} + +
+ + +### 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). + + + +{{< figure src="figs/campbell_diagram_real.png" caption="Figure 2: Campbell Diagram - Real Part" >}} + + + +{{< figure src="figs/campbell_diagram_imag.png" caption="Figure 3: 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. + + + +{{< figure src="figs/plant_simscape_analytical.png" caption="Figure 4: 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). + + + +{{< figure src="figs/plant_compare_rotating_speed_direct.png" caption="Figure 5: Comparison of the transfer functions from \\([F\_u, F\_v]\\) to \\([d\_u, d\_v]\\) for several rotating speed - Direct Terms" >}} + + + +{{< figure src="figs/plant_compare_rotating_speed_coupling.png" caption="Figure 6: 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} + + + +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. + + + +{{< figure src="figs-paper/system_iff.png" caption="Figure 7: 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: + +
+ +\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} + +
+ + +### 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. + + + +{{< figure src="figs/plant_iff_comp_simscape_analytical.png" caption="Figure 8: 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). + + + +{{< figure src="figs/plant_iff_compare_rotating_speed.png" caption="Figure 9: 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. + + + +{{< figure src="figs/root_locus_pure_iff.png" caption="Figure 10: 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} + + + + +### 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). + + + +{{< figure src="figs/loop_gain_modified_iff.png" caption="Figure 11: 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. + + + +{{< figure src="figs/root_locus_modified_iff.png" caption="Figure 12: Root Locus for the modified IFF controller" >}} + + + +{{< figure src="figs/root_locus_modified_iff_zoom.png" caption="Figure 13: 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] +``` + + + +{{< figure src="figs/root_locus_wi_modified_iff.png" caption="Figure 14: Root Locus for the modified IFF controller (zoomed plot on the left)" >}} + + + +{{< figure src="figs/root_locus_wi_modified_iff_zoom.png" caption="Figure 15: 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 +``` + + + +{{< figure src="figs/mod_iff_damping_wi.png" caption="Figure 16: 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} + + + + +### Schematic {#schematic} + +In this section additional springs in parallel with the force sensors are added to counteract the negative stiffness induced by the rotation. + + + +{{< figure src="figs-paper/system_parallel_springs.png" caption="Figure 17: 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} + +
+ +\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} + +
+ +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'}; +``` + + + +{{< figure src="figs/plant_iff_kp_comp_simscape_analytical.png" caption="Figure 18: 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]; +``` + + + +{{< figure src="figs/plant_iff_kp.png" caption="Figure 19: 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} + + + +{{< figure src="figs/root_locus_iff_kp.png" caption="Figure 20: Root Locus" >}} + + + +{{< figure src="figs/root_locus_iff_kp_zoom.png" caption="Figure 21: 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. + + + +{{< figure src="figs/root_locus_iff_kps.png" caption="Figure 22: 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 +``` + + + +{{< figure src="figs/opt_damp_alpha.png" caption="Figure 23: Attainable damping ratio and corresponding controller gain for different parameter \\(\alpha\\)" >}} + + +## Comparison {#comparison} + + + +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; +``` + + + +{{< figure src="figs/comp_root_locus.png" caption="Figure 24: 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} + + + +```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'}; +``` + + + +{{< figure src="figs/comp_transmissibility.png" caption="Figure 25: Comparison of the transmissibility" >}} + + + +{{< figure src="figs/comp_compliance.png" caption="Figure 26: Comparison of the obtained Compliance" >}} + + +## Notations {#notations} + + + +| | 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] | + +
+
Dehaeze, T., and C. Collette. 2020. “Active Damping of Rotating Platforms Using Integral Force Feedback.” In Proceedings of the International Conference on Modal Analysis Noise and Vibration Engineering (ISMA).
+
Dehaeze, Thomas. 2020. “Active Damping of Rotating Positioning Platforms.” Source Code on Zonodo. doi:10.5281/zenodo.3894342.
+
Dehaeze, Thomas, and Christophe Collette. 2021. “Active Damping of Rotating Platforms Using Integral Force Feedback.” Engineering Research Express. http://iopscience.iop.org/article/10.1088/2631-8695/abe803.
+
diff --git a/content/research/dehaeze21_mechatronics_approach_nass.md b/content/research/dehaeze21_mechatronics_approach_nass.md deleted file mode 100644 index 33a3469..0000000 --- a/content/research/dehaeze21_mechatronics_approach_nass.md +++ /dev/null @@ -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} diff --git a/content/research/dehaeze21_mechatronics_approach_nass/_index.md b/content/research/dehaeze21_mechatronics_approach_nass/_index.md new file mode 100644 index 0000000..2cd2753 --- /dev/null +++ b/content/research/dehaeze21_mechatronics_approach_nass/_index.md @@ -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} + + + + +## 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., & Collette, C., Mechatronics approach for the development of a nano-active-stabilization-system, In MEDSI'20 (2021), JACoW Publishing. diff --git a/content/research/dehaeze21_mechatronics_approach_nass/paper/dehaeze21_mechatronics_approach_nass.pdf b/content/research/dehaeze21_mechatronics_approach_nass/paper/dehaeze21_mechatronics_approach_nass.pdf new file mode 100644 index 0000000..258f64f Binary files /dev/null and b/content/research/dehaeze21_mechatronics_approach_nass/paper/dehaeze21_mechatronics_approach_nass.pdf differ diff --git a/content/research/dehaeze21_mechatronics_approach_nass/talk/dehaeze21_mechatronics_approach_nass_talk.pdf b/content/research/dehaeze21_mechatronics_approach_nass/talk/dehaeze21_mechatronics_approach_nass_talk.pdf new file mode 100644 index 0000000..fb67212 Binary files /dev/null and b/content/research/dehaeze21_mechatronics_approach_nass/talk/dehaeze21_mechatronics_approach_nass_talk.pdf differ diff --git a/content/research/dehaeze21_mechatronics_approach_nass/tikz/_index.md b/content/research/dehaeze21_mechatronics_approach_nass/tikz/_index.md new file mode 100644 index 0000000..96e38f7 --- /dev/null +++ b/content/research/dehaeze21_mechatronics_approach_nass/tikz/_index.md @@ -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} +``` diff --git a/content/research/dehaeze21_mechatronics_approach_nass/tikz/config.md b/content/research/dehaeze21_mechatronics_approach_nass/tikz/config.md new file mode 100644 index 0000000..30a4c7d --- /dev/null +++ b/content/research/dehaeze21_mechatronics_approach_nass/tikz/config.md @@ -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} +``` diff --git a/content/research/dehaeze21_mechatronics_approach_nass/tikz/mass_spring_damper_hac_lac.png b/content/research/dehaeze21_mechatronics_approach_nass/tikz/mass_spring_damper_hac_lac.png new file mode 100644 index 0000000..2f9ec11 Binary files /dev/null and b/content/research/dehaeze21_mechatronics_approach_nass/tikz/mass_spring_damper_hac_lac.png differ diff --git a/content/research/dehaeze21_mechatronics_approach_nass/tikz/nass_hac_lac_block_diagram.png b/content/research/dehaeze21_mechatronics_approach_nass/tikz/nass_hac_lac_block_diagram.png new file mode 100644 index 0000000..99ee811 Binary files /dev/null and b/content/research/dehaeze21_mechatronics_approach_nass/tikz/nass_hac_lac_block_diagram.png differ diff --git a/content/research/dehaeze21_mechatronics_approach_nass/tikz/nass_hac_lac_block_diagram_without_elec.png b/content/research/dehaeze21_mechatronics_approach_nass/tikz/nass_hac_lac_block_diagram_without_elec.png new file mode 100644 index 0000000..459ffad Binary files /dev/null and b/content/research/dehaeze21_mechatronics_approach_nass/tikz/nass_hac_lac_block_diagram_without_elec.png differ diff --git a/content/research/dehaeze21_mechatronics_approach_nass/tikz/nass_mechatronics_approach.png b/content/research/dehaeze21_mechatronics_approach_nass/tikz/nass_mechatronics_approach.png new file mode 100644 index 0000000..d0efa14 Binary files /dev/null and b/content/research/dehaeze21_mechatronics_approach_nass/tikz/nass_mechatronics_approach.png differ diff --git a/data/publications.toml b/data/publications.toml index 9a156cd..03fedf9 100644 --- a/data/publications.toml +++ b/data/publications.toml @@ -79,15 +79,6 @@ note = "coming soon" # ---------------------------------------------------------------- Conference Publications -[[publications]] -key = "dehaeze22_fastj_uhv" -type = "conference" -authors = ["T. Dehaeze", "L. Ducotté"] -title = "The Fastjack - A robust, UHV compatible and high performance linear actuator" -venue = "euspen" -year = 2022 -page = "dehaeze22_fast_jack" - [[publications]] key = "dehaeze21_mechat_approac_devel_nano_activ_stabil_system" type = "conference" diff --git a/layouts/partials/research/paper-links.html b/layouts/partials/research/paper-links.html index 1c65539..d952d33 100644 --- a/layouts/partials/research/paper-links.html +++ b/layouts/partials/research/paper-links.html @@ -3,7 +3,7 @@ {{- $pdf := .Params.pdf -}} {{- if not $pdf }} - {{- with .Resources.Match "paper/*.pdf" }} + {{- with .Resources.Match "{paper,journal}/*.pdf" }} {{- range first 1 . }} {{- $pdf = .RelPermalink -}} {{- end }} diff --git a/layouts/partials/research/publication-entry.html b/layouts/partials/research/publication-entry.html index 7e9bfe0..19b2555 100644 --- a/layouts/partials/research/publication-entry.html +++ b/layouts/partials/research/publication-entry.html @@ -10,7 +10,7 @@ {{- $pdf := "" -}} {{- if $page }} - {{- with $page.Resources.Match "paper/*.pdf" }} + {{- with $page.Resources.Match "{paper,journal}/*.pdf" }} {{- range first 1 . }} {{- $pdf = .RelPermalink -}} {{- end }} diff --git a/static/ox-hugo/dehaeze21_mechatronics_approach_nass.pdf b/static/ox-hugo/dehaeze21_mechatronics_approach_nass.pdf deleted file mode 100644 index a72fd42..0000000 Binary files a/static/ox-hugo/dehaeze21_mechatronics_approach_nass.pdf and /dev/null differ