Add link to matlab pdf and matlab zip
This commit is contained in:
parent
8ceca4c432
commit
89b994c3ba
File diff suppressed because it is too large
Load Diff
@ -6,8 +6,14 @@
|
||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||
|
||||
#+LATEX_CLASS: cleanreport
|
||||
#+LATEX_CLASS_OPTIONS: [tocnp, secbreak, minted]
|
||||
#+BIND: org-latex-image-default-option "scale=1"
|
||||
#+BIND: org-latex-bib-compiler "biber"
|
||||
#+BIND: org-latex-image-default-width ""
|
||||
|
||||
#+LaTeX_CLASS: scrreprt
|
||||
#+LaTeX_CLASS_OPTIONS: [a4paper, 10pt, DIV=12, parskip=full]
|
||||
#+LaTeX_HEADER_EXTRA: \input{preamble.tex}
|
||||
#+LATEX_HEADER_EXTRA: \addbibresource{ref.bib}
|
||||
|
||||
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||||
#+PROPERTY: header-args:matlab+ :comments org
|
||||
@ -19,8 +25,14 @@
|
||||
#+PROPERTY: header-args:matlab+ :output-dir figs
|
||||
:END:
|
||||
|
||||
#+begin_export html
|
||||
<hr>
|
||||
<p>This report is also available as a <a href="./index.pdf">pdf</a>.</p>
|
||||
<hr>
|
||||
#+end_export
|
||||
|
||||
* Introduction :ignore:
|
||||
This document gathers the Matlab code used to for the paper cite:dehaeze20_activ_dampin_rotat_platf_integ_force_feedb.
|
||||
This document gathers the Matlab code used to for the conference paper cite:dehaeze20_activ_dampin_rotat_platf_integ_force_feedb and the journal paper cite:dehaeze21_activ_dampin_rotat_platf_using.
|
||||
|
||||
It is structured in several sections:
|
||||
- Section [[sec:system_description]]: presents a simple model of a rotating suspended platform that will be used throughout this study.
|
||||
@ -30,7 +42,7 @@ It is structured in several sections:
|
||||
- Section [[sec:comparison]]: compares both proposed modifications to the classical IFF in terms of damping authority and closed-loop system behavior.
|
||||
- Section [[sec:notations]]: contains the notations used for both the Matlab code and the paper
|
||||
|
||||
The matlab code is accessible on [[https://zenodo.org/record/3894343][Zonodo]] and [[https://github.com/tdehaeze/dehaeze20_contr_stewa_platf][Github]] cite:dehaeze20_activ_dampin_rotat_posit_platf.
|
||||
The matlab code is accessible on [[https://zenodo.org/record/3894343][Zonodo]] and [[https://github.com/tdehaeze/dehaeze20_contr_stewa_platf][Github]] cite:dehaeze20_activ_dampin_rotat_posit_platf. It can also be download as a =.zip= file [[file:matlab.zip][here]].
|
||||
|
||||
To run the Matlab code, go in the =matlab= directory and run the following Matlab files corresponding to each section.
|
||||
|
||||
@ -2131,8 +2143,9 @@ Critical Damping corresponds to to $\xi = 1$, and thus:
|
||||
| Frequency | $\omega$ | =w= | [rad/s] |
|
||||
|
||||
* Bibliography :ignore:
|
||||
bibliographystyle:unsrt
|
||||
#+latex: \printbibliography
|
||||
bibliography:ref.bib
|
||||
|
||||
* Functions :noexport:
|
||||
** Sort Poles for the Root Locus
|
||||
:PROPERTIES:
|
||||
@ -2291,3 +2304,4 @@ This Matlab function is accessible [[file:src/rootLocusPolesSorted.m][here]].
|
||||
end
|
||||
end
|
||||
#+end_src
|
||||
|
||||
|
BIN
matlab/index.pdf
Normal file
BIN
matlab/index.pdf
Normal file
Binary file not shown.
950
matlab/index.tex
Normal file
950
matlab/index.tex
Normal file
@ -0,0 +1,950 @@
|
||||
% Created 2021-02-20 sam. 14:43
|
||||
% Intended LaTeX compiler: pdflatex
|
||||
\documentclass[a4paper, 10pt, DIV=12, parskip=full]{scrreprt}
|
||||
|
||||
\input{preamble.tex}
|
||||
\addbibresource{ref.bib}
|
||||
\author{Thomas Dehaeze}
|
||||
\date{\today}
|
||||
\title{Active Damping of Rotating Platforms using Integral Force Feedback - Matlab Computation}
|
||||
\hypersetup{
|
||||
pdfauthor={Thomas Dehaeze},
|
||||
pdftitle={Active Damping of Rotating Platforms using Integral Force Feedback - Matlab Computation},
|
||||
pdfkeywords={},
|
||||
pdfsubject={},
|
||||
pdfcreator={Emacs 27.1 (Org mode 9.5)},
|
||||
pdflang={English}}
|
||||
\begin{document}
|
||||
|
||||
\maketitle
|
||||
\tableofcontents
|
||||
|
||||
|
||||
This document gathers the Matlab code used to for the conference paper \cite{dehaeze20_activ_dampin_rotat_platf_integ_force_feedb} and the journal paper \cite{dehaeze21_activ_dampin_rotat_platf_using}.
|
||||
|
||||
It is structured in several sections:
|
||||
\begin{itemize}
|
||||
\item Section \ref{sec:system_description}: presents a simple model of a rotating suspended platform that will be used throughout this study.
|
||||
\item Section \ref{sec:iff_pure_int}: explains how the unconditional stability of IFF is lost due to Gyroscopic effects induced by the rotation.
|
||||
\item Section \ref{sec:iff_pseudo_int}: suggests a simple modification of the control law such that damping can be added to the suspension modes in a robust way.
|
||||
\item Section \ref{sec:iff_parallel_stiffness}: proposes to add springs in parallel with the force sensors to regain the unconditional stability of IFF.
|
||||
\item Section \ref{sec:comparison}: compares both proposed modifications to the classical IFF in terms of damping authority and closed-loop system behavior.
|
||||
\item Section \ref{sec:notations}: contains the notations used for both the Matlab code and the paper
|
||||
\end{itemize}
|
||||
|
||||
The matlab code is accessible on \href{https://zenodo.org/record/3894343}{Zonodo} and \href{https://github.com/tdehaeze/dehaeze20\_contr\_stewa\_platf}{Github} \cite{dehaeze20_activ_dampin_rotat_posit_platf}. It can also be download as a \texttt{.zip} file \href{matlab.zip}{here}.
|
||||
|
||||
To run the Matlab code, go in the \texttt{matlab} directory and run the following Matlab files corresponding to each section.
|
||||
|
||||
\begin{table}[htbp]
|
||||
\caption{Paper's sections and corresponding Matlab files}
|
||||
\centering
|
||||
\begin{tabular}{ll}
|
||||
Sections & Matlab File\\
|
||||
\hline
|
||||
Section \ref{sec:system_description} & \texttt{s1\_system\_description.m}\\
|
||||
Section \ref{sec:iff_pure_int} & \texttt{s2\_iff\_pure\_int.m}\\
|
||||
Section \ref{sec:iff_pseudo_int} & \texttt{s3\_iff\_hpf.m}\\
|
||||
Section \ref{sec:iff_parallel_stiffness} & \texttt{s4\_iff\_kp.m}\\
|
||||
Section \ref{sec:comparison} & \texttt{s5\_act\_damp\_comparison.m}\\
|
||||
\end{tabular}
|
||||
\end{table}
|
||||
|
||||
\chapter{System Description and Analysis}
|
||||
\label{sec:org866deeb}
|
||||
\label{sec:system_description}
|
||||
|
||||
\section{System description}
|
||||
\label{sec:org597d9d5}
|
||||
The system consists of one 2 degree of freedom translation stage on top of a spindle (figure \ref{fig:system}).
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs-paper/system.png}
|
||||
\caption{\label{fig:system}Schematic of the studied system}
|
||||
\end{figure}
|
||||
|
||||
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\).
|
||||
|
||||
\section{Equations}
|
||||
\label{sec:orge2ee0c6}
|
||||
Based on the Figure \ref{fig:system}, the equations of motions are:
|
||||
\begin{important}
|
||||
\begin{equation}
|
||||
\begin{bmatrix} d_u \\ d_v \end{bmatrix} =
|
||||
\bm{G}_d
|
||||
\begin{bmatrix} F_u \\ F_v \end{bmatrix}
|
||||
\end{equation}
|
||||
Where \(\bm{G}_d\) is a \(2 \times 2\) transfer function matrix.
|
||||
|
||||
\begin{equation}
|
||||
\bm{G}_d = \frac{1}{k} \frac{1}{G_{dp}}
|
||||
\begin{bmatrix}
|
||||
G_{dz} & G_{dc} \\
|
||||
-G_{dc} & G_{dz}
|
||||
\end{bmatrix}
|
||||
\end{equation}
|
||||
With:
|
||||
\begin{align}
|
||||
G_{dp} &= \left( \frac{s^2}{{\omega_0}^2} + 2 \xi \frac{s}{\omega_0} + 1 - \frac{{\Omega}^2}{{\omega_0}^2} \right)^2 + \left( 2 \frac{\Omega}{\omega_0} \frac{s}{\omega_0} \right)^2 \\
|
||||
G_{dz} &= \frac{s^2}{{\omega_0}^2} + 2 \xi \frac{s}{\omega_0} + 1 - \frac{{\Omega}^2}{{\omega_0}^2} \\
|
||||
G_{dc} &= 2 \frac{\Omega}{\omega_0} \frac{s}{\omega_0}
|
||||
\end{align}
|
||||
\end{important}
|
||||
|
||||
\section{Numerical Values}
|
||||
\label{sec:orgafc7947}
|
||||
Let's define initial values for the model.
|
||||
\begin{minted}[]{matlab}
|
||||
k = 1; % Actuator Stiffness [N/m]
|
||||
c = 0.05; % Actuator Damping [N/(m/s)]
|
||||
m = 1; % Payload mass [kg]
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
xi = c/(2*sqrt(k*m));
|
||||
w0 = sqrt(k/m); % [rad/s]
|
||||
\end{minted}
|
||||
|
||||
\section{Campbell Diagram}
|
||||
\label{sec:org008e1a4}
|
||||
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 \ref{fig:campbell_diagram_real} and \ref{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).
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/campbell_diagram_real.png}
|
||||
\caption{\label{fig:campbell_diagram_real}Campbell Diagram - Real Part}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/campbell_diagram_imag.png}
|
||||
\caption{\label{fig:campbell_diagram_imag}Campbell Diagram - Imaginary Part}
|
||||
\end{figure}
|
||||
|
||||
\section{Simscape Model}
|
||||
\label{sec:org50f1e50}
|
||||
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.
|
||||
\begin{minted}[]{matlab}
|
||||
W = 0.1; % Rotation Speed [rad/s]
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
open('rotating_frame.slx');
|
||||
\end{minted}
|
||||
|
||||
The transfer function from \([F_u, F_v]\) to \([d_u, d_v]\) is identified from the Simscape model.
|
||||
|
||||
\begin{minted}[]{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;
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
G = linearize(mdl, io, 0);
|
||||
|
||||
%% Input/Output definition
|
||||
G.InputName = {'Fu', 'Fv'};
|
||||
G.OutputName = {'du', 'dv'};
|
||||
\end{minted}
|
||||
|
||||
The same transfer function from \([F_u, F_v]\) to \([d_u, d_v]\) is written down from the analytical model.
|
||||
\begin{minted}[]{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)];
|
||||
\end{minted}
|
||||
|
||||
Both transfer functions are compared in Figure \ref{fig:plant_simscape_analytical} and are found to perfectly match.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/plant_simscape_analytical.png}
|
||||
\caption{\label{fig:plant_simscape_analytical}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}
|
||||
\end{figure}
|
||||
|
||||
\section{Effect of the rotation speed}
|
||||
\label{sec:org6d643e3}
|
||||
The transfer functions from \([F_u, F_v]\) to \([d_u, d_v]\) are identified for the following rotating speeds.
|
||||
\begin{minted}[]{matlab}
|
||||
Ws = [0, 0.2, 0.7, 1.1]*w0; % Rotating Speeds [rad/s]
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{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
|
||||
\end{minted}
|
||||
|
||||
They are compared in Figures \ref{fig:plant_compare_rotating_speed_direct} and \ref{fig:plant_compare_rotating_speed_coupling}.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/plant_compare_rotating_speed_direct.png}
|
||||
\caption{\label{fig:plant_compare_rotating_speed_direct}Comparison of the transfer functions from \([F_u, F_v]\) to \([d_u, d_v]\) for several rotating speed - Direct Terms}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/plant_compare_rotating_speed_coupling.png}
|
||||
\caption{\label{fig:plant_compare_rotating_speed_coupling}Comparison of the transfer functions from \([F_u, F_v]\) to \([d_u, d_v]\) for several rotating speed - Coupling Terms}
|
||||
\end{figure}
|
||||
|
||||
\chapter{Problem with pure Integral Force Feedback}
|
||||
\label{sec:org02f3cde}
|
||||
\label{sec:iff_pure_int}
|
||||
Force sensors are added in series with the two actuators (Figure \ref{fig:system_iff}).
|
||||
|
||||
Two identical controllers \(K_F\) are used to feedback each of the sensed force to its associated actuator.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs-paper/system_iff.png}
|
||||
\caption{\label{fig:system_iff}System with added Force Sensor in series with the actuators}
|
||||
\end{figure}
|
||||
|
||||
\section{Plant Parameters}
|
||||
\label{sec:orgd2d5c32}
|
||||
Let's define initial values for the model.
|
||||
\begin{minted}[]{matlab}
|
||||
k = 1; % Actuator Stiffness [N/m]
|
||||
c = 0.05; % Actuator Damping [N/(m/s)]
|
||||
m = 1; % Payload mass [kg]
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
xi = c/(2*sqrt(k*m));
|
||||
w0 = sqrt(k/m); % [rad/s]
|
||||
\end{minted}
|
||||
|
||||
\section{Equations}
|
||||
\label{sec:orgad8546b}
|
||||
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{important}
|
||||
\begin{equation}
|
||||
\begin{bmatrix} f_{u} \\ f_{v} \end{bmatrix} =
|
||||
\bm{G}_{f}
|
||||
\begin{bmatrix} F_u \\ F_v \end{bmatrix}
|
||||
\end{equation}
|
||||
|
||||
\begin{equation}
|
||||
\begin{bmatrix} f_{u} \\ f_{v} \end{bmatrix} =
|
||||
\frac{1}{G_{fp}}
|
||||
\begin{bmatrix}
|
||||
G_{fz} & -G_{fc} \\
|
||||
G_{fc} & G_{fz}
|
||||
\end{bmatrix}
|
||||
\begin{bmatrix} F_u \\ F_v \end{bmatrix}
|
||||
\end{equation}
|
||||
|
||||
\begin{align}
|
||||
G_{fp} &= \left( \frac{s^2}{{\omega_0}^2} + 2 \xi \frac{s}{\omega_0} + 1 - \frac{{\Omega}^2}{{\omega_0}^2} \right)^2 + \left( 2 \frac{\Omega}{\omega_0} \frac{s}{\omega_0} \right)^2 \\
|
||||
G_{fz} &= \left( \frac{s^2}{{\omega_0}^2} - \frac{\Omega^2}{{\omega_0}^2} \right) \left( \frac{s^2}{{\omega_0}^2} + 2 \xi \frac{s}{\omega_0} + 1 - \frac{{\Omega}^2}{{\omega_0}^2} \right) + \left( 2 \frac{\Omega}{\omega_0} \frac{s}{\omega_0} \right)^2 \\
|
||||
G_{fc} &= \left( 2 \xi \frac{s}{\omega_0} + 1 \right) \left( 2 \frac{\Omega}{\omega_0} \frac{s}{\omega_0} \right)
|
||||
\end{align}
|
||||
\end{important}
|
||||
|
||||
\section{Comparison of the Analytical Model and the Simscape Model}
|
||||
\label{sec:org5d37f2f}
|
||||
The rotation speed is set to \(\Omega = 0.1 \omega_0\).
|
||||
\begin{minted}[]{matlab}
|
||||
W = 0.1*w0; % [rad/s]
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
open('rotating_frame.slx');
|
||||
\end{minted}
|
||||
|
||||
And the transfer function from \([F_u, F_v]\) to \([f_u, f_v]\) is identified using the Simscape model.
|
||||
\begin{minted}[]{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;
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
Giff = linearize(mdl, io, 0);
|
||||
|
||||
%% Input/Output definition
|
||||
Giff.InputName = {'Fu', 'Fv'};
|
||||
Giff.OutputName = {'fu', 'fv'};
|
||||
\end{minted}
|
||||
|
||||
The same transfer function from \([F_u, F_v]\) to \([f_u, f_v]\) is written down from the analytical model.
|
||||
\begin{minted}[]{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];
|
||||
\end{minted}
|
||||
|
||||
The two are compared in Figure \ref{fig:plant_iff_comp_simscape_analytical} and found to perfectly match.
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/plant_iff_comp_simscape_analytical.png}
|
||||
\caption{\label{fig:plant_iff_comp_simscape_analytical}Comparison of the transfer functions from \([F_u, F_v]\) to \([f_u, f_v]\) between the Simscape model and the analytical one}
|
||||
\end{figure}
|
||||
|
||||
\section{Effect of the rotation speed}
|
||||
\label{sec:org17fee48}
|
||||
The transfer functions from \([F_u, F_v]\) to \([f_u, f_v]\) are identified for the following rotating speeds.
|
||||
\begin{minted}[]{matlab}
|
||||
Ws = [0, 0.2, 0.7]*w0; % Rotating Speeds [rad/s]
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{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
|
||||
\end{minted}
|
||||
|
||||
The obtained transfer functions are shown in Figure \ref{fig:plant_iff_compare_rotating_speed}.
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/plant_iff_compare_rotating_speed.png}
|
||||
\caption{\label{fig:plant_iff_compare_rotating_speed}Comparison of the transfer functions from \([F_u, F_v]\) to \([f_u, f_v]\) for several rotating speed}
|
||||
\end{figure}
|
||||
|
||||
\section{Decentralized Integral Force Feedback}
|
||||
\label{sec:org2d5427a}
|
||||
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 \ref{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.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/root_locus_pure_iff.png}
|
||||
\caption{\label{fig:root_locus_pure_iff}Root Locus for the Decentralized Integral Force Feedback controller. Several rotating speed are shown.}
|
||||
\end{figure}
|
||||
|
||||
\chapter{Integral Force Feedback with an High Pass Filter}
|
||||
\label{sec:orgf9854e9}
|
||||
\label{sec:iff_pseudo_int}
|
||||
|
||||
\section{Plant Parameters}
|
||||
\label{sec:org11b9a15}
|
||||
Let's define initial values for the model.
|
||||
\begin{minted}[]{matlab}
|
||||
k = 1; % Actuator Stiffness [N/m]
|
||||
c = 0.05; % Actuator Damping [N/(m/s)]
|
||||
m = 1; % Payload mass [kg]
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
xi = c/(2*sqrt(k*m));
|
||||
w0 = sqrt(k/m); % [rad/s]
|
||||
\end{minted}
|
||||
|
||||
\section{Modified Integral Force Feedback Controller}
|
||||
\label{sec:orgf920a8a}
|
||||
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:
|
||||
\begin{minted}[]{matlab}
|
||||
g = 2;
|
||||
wi = 0.1*w0;
|
||||
\end{minted}
|
||||
|
||||
And the following rotating speed.
|
||||
\begin{minted}[]{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];
|
||||
\end{minted}
|
||||
|
||||
The obtained Loop Gain is shown in Figure \ref{fig:loop_gain_modified_iff}.
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/loop_gain_modified_iff.png}
|
||||
\caption{\label{fig:loop_gain_modified_iff}Loop Gain for the modified IFF controller}
|
||||
\end{figure}
|
||||
|
||||
\section{Root Locus}
|
||||
\label{sec:org911f45b}
|
||||
As shown in the Root Locus plot (Figure \ref{fig:root_locus_modified_iff}), for some value of the gain, the system remains stable.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/root_locus_modified_iff.png}
|
||||
\caption{\label{fig:root_locus_modified_iff}Root Locus for the modified IFF controller}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/root_locus_modified_iff_zoom.png}
|
||||
\caption{\label{fig:root_locus_modified_iff_zoom}Root Locus for the modified IFF controller - Zoom}
|
||||
\end{figure}
|
||||
|
||||
\section{What is the optimal \(\omega_i\) and \(g\)?}
|
||||
\label{sec:org028e747}
|
||||
In order to visualize the effect of \(\omega_i\) on the attainable damping, the Root Locus is displayed in Figure \ref{fig:root_locus_wi_modified_iff} for the following \(\omega_i\):
|
||||
\begin{minted}[]{matlab}
|
||||
wis = [0.01, 0.1, 0.5, 1]*w0; % [rad/s]
|
||||
\end{minted}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/root_locus_wi_modified_iff.png}
|
||||
\caption{\label{fig:root_locus_wi_modified_iff}Root Locus for the modified IFF controller (zoomed plot on the left)}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/root_locus_wi_modified_iff_zoom.png}
|
||||
\caption{\label{fig:root_locus_wi_modified_iff_zoom}Root Locus for the modified IFF controller (zoomed plot on the left)}
|
||||
\end{figure}
|
||||
|
||||
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 \ref{fig:root_locus_wi_modified_iff}), the control gains may be limited to small values due to \eqref{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 \ref{fig:mod_iff_damping_wi}).
|
||||
|
||||
\begin{minted}[]{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
|
||||
\end{minted}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/mod_iff_damping_wi.png}
|
||||
\caption{\label{fig:mod_iff_damping_wi}Simultaneous attainable damping of the closed loop poles as a function of \(\omega_i\)}
|
||||
\end{figure}
|
||||
|
||||
\chapter{IFF with a stiffness in parallel with the force sensor}
|
||||
\label{sec:orgc5ba04a}
|
||||
\label{sec:iff_parallel_stiffness}
|
||||
|
||||
\section{Schematic}
|
||||
\label{sec:orgc647af5}
|
||||
In this section additional springs in parallel with the force sensors are added to counteract the negative stiffness induced by the rotation.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs-paper/system_parallel_springs.png}
|
||||
\caption{\label{fig:system_parallel_springs}Studied system with additional springs in parallel with the actuators and force sensors}
|
||||
\end{figure}
|
||||
|
||||
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}
|
||||
|
||||
\section{Equations}
|
||||
\label{sec:org0de17db}
|
||||
\begin{important}
|
||||
\begin{equation}
|
||||
\begin{bmatrix} f_u \\ f_v \end{bmatrix} =
|
||||
\bm{G}_k
|
||||
\begin{bmatrix} F_u \\ F_v \end{bmatrix}
|
||||
\end{equation}
|
||||
|
||||
\begin{equation}
|
||||
\begin{bmatrix} f_u \\ f_v \end{bmatrix} =
|
||||
\frac{1}{G_{kp}}
|
||||
\begin{bmatrix}
|
||||
G_{kz} & -G_{kc} \\
|
||||
G_{kc} & G_{kz}
|
||||
\end{bmatrix}
|
||||
\begin{bmatrix} F_u \\ F_v \end{bmatrix}
|
||||
\end{equation}
|
||||
With:
|
||||
\begin{align}
|
||||
G_{kp} &= \left( \frac{s^2}{{\omega_0}^2} + 2\xi \frac{s}{{\omega_0}^2} + 1 - \frac{\Omega^2}{{\omega_0}^2} \right)^2 + \left( 2 \frac{\Omega}{\omega_0}\frac{s}{\omega_0} \right)^2 \\
|
||||
G_{kz} &= \left( \frac{s^2}{{\omega_0}^2} - \frac{\Omega^2}{{\omega_0}^2} + \alpha \right) \left( \frac{s^2}{{\omega_0}^2} + 2\xi \frac{s}{{\omega_0}^2} + 1 - \frac{\Omega^2}{{\omega_0}^2} \right) + \left( 2 \frac{\Omega}{\omega_0}\frac{s}{\omega_0} \right)^2 \\
|
||||
G_{kc} &= \left( 2 \xi \frac{s}{\omega_0} + 1 - \alpha \right) \left( 2 \frac{\Omega}{\omega_0}\frac{s}{\omega_0} \right)
|
||||
\end{align}
|
||||
\end{important}
|
||||
|
||||
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}
|
||||
|
||||
\section{Plant Parameters}
|
||||
\label{sec:orga1e1958}
|
||||
Let's define initial values for the model.
|
||||
\begin{minted}[]{matlab}
|
||||
k = 1; % Actuator Stiffness [N/m]
|
||||
c = 0.05; % Actuator Damping [N/(m/s)]
|
||||
m = 1; % Payload mass [kg]
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
xi = c/(2*sqrt(k*m));
|
||||
w0 = sqrt(k/m); % [rad/s]
|
||||
\end{minted}
|
||||
|
||||
\section{Comparison of the Analytical Model and the Simscape Model}
|
||||
\label{sec:orgbea84d1}
|
||||
The same transfer function from \([F_u, F_v]\) to \([f_u, f_v]\) is written down from the analytical model.
|
||||
\begin{minted}[]{matlab}
|
||||
W = 0.1*w0; % [rad/s]
|
||||
|
||||
kp = 1.5*m*W^2;
|
||||
cp = 0;
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
open('rotating_frame.slx');
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{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'};
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{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'};
|
||||
\end{minted}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/plant_iff_kp_comp_simscape_analytical.png}
|
||||
\caption{\label{fig:plant_iff_kp_comp_simscape_analytical}Comparison of the transfer functions from \([F_u, F_v]\) to \([f_u, f_v]\) between the Simscape model and the analytical one}
|
||||
\end{figure}
|
||||
|
||||
\section{Effect of the parallel stiffness on the IFF plant}
|
||||
\label{sec:orge9068cb}
|
||||
The rotation speed is set to \(\Omega = 0.1 \omega_0\).
|
||||
\begin{minted}[]{matlab}
|
||||
W = 0.1*w0; % [rad/s]
|
||||
\end{minted}
|
||||
|
||||
And the IFF plant (transfer function from \([F_u, F_v]\) to \([f_u, f_v]\)) is identified in three different cases:
|
||||
\begin{itemize}
|
||||
\item without parallel stiffness
|
||||
\item with a small parallel stiffness \(k_p < m \Omega^2\)
|
||||
\item with a large parallel stiffness \(k_p > m \Omega^2\)
|
||||
\end{itemize}
|
||||
|
||||
The results are shown in Figure \ref{fig:plant_iff_kp}.
|
||||
|
||||
One can see that for \(k_p > m \Omega^2\), the systems shows alternating complex conjugate poles and zeros.
|
||||
|
||||
\begin{minted}[]{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];
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{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];
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{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];
|
||||
\end{minted}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/plant_iff_kp.png}
|
||||
\caption{\label{fig:plant_iff_kp}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\)}
|
||||
\end{figure}
|
||||
|
||||
\section{IFF when adding a spring in parallel}
|
||||
\label{sec:org9f1e3df}
|
||||
In Figure \ref{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}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/root_locus_iff_kp.png}
|
||||
\caption{\label{fig:root_locus_iff_kp}Root Locus}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/root_locus_iff_kp_zoom.png}
|
||||
\caption{\label{fig:root_locus_iff_kp_zoom}Root Locus}
|
||||
\end{figure}
|
||||
|
||||
\section{Effect of \(k_p\) on the attainable damping}
|
||||
\label{sec:orgcb7905c}
|
||||
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 \ref{fig:root_locus_iff_kps}.
|
||||
\begin{minted}[]{matlab}
|
||||
kps = [2, 20, 40]*m*W^2;
|
||||
\end{minted}
|
||||
|
||||
It is shown that large values of \(k_p\) decreases the attainable damping.
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/root_locus_iff_kps.png}
|
||||
\caption{\label{fig:root_locus_iff_kps}Root Locus plot}
|
||||
\end{figure}
|
||||
|
||||
\begin{minted}[]{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
|
||||
\end{minted}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/opt_damp_alpha.png}
|
||||
\caption{\label{fig:opt_damp_alpha}Attainable damping ratio and corresponding controller gain for different parameter \(\alpha\)}
|
||||
\end{figure}
|
||||
|
||||
\chapter{Comparison}
|
||||
\label{sec:org4714bd6}
|
||||
\label{sec: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.
|
||||
|
||||
\section{Plant Parameters}
|
||||
\label{sec:org90a54af}
|
||||
Let's define initial values for the model.
|
||||
\begin{minted}[]{matlab}
|
||||
k = 1; % Actuator Stiffness [N/m]
|
||||
c = 0.05; % Actuator Damping [N/(m/s)]
|
||||
m = 1; % Payload mass [kg]
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
xi = c/(2*sqrt(k*m));
|
||||
w0 = sqrt(k/m); % [rad/s]
|
||||
\end{minted}
|
||||
|
||||
The rotating speed is set to \(\Omega = 0.1 \omega_0\).
|
||||
\begin{minted}[]{matlab}
|
||||
W = 0.1*w0;
|
||||
\end{minted}
|
||||
|
||||
\section{Root Locus}
|
||||
\label{sec:orgf922463}
|
||||
IFF with High Pass Filter
|
||||
\begin{minted}[]{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];
|
||||
\end{minted}
|
||||
|
||||
IFF With parallel Stiffness
|
||||
\begin{minted}[]{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;
|
||||
\end{minted}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/comp_root_locus.png}
|
||||
\caption{\label{fig:comp_root_locus}Root Locus plot - Comparison of IFF with additional high pass filter, IFF with additional parallel stiffness}
|
||||
\end{figure}
|
||||
|
||||
\section{Controllers - Optimal Gains}
|
||||
\label{sec:org1889cfc}
|
||||
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.
|
||||
|
||||
\begin{center}
|
||||
\begin{tabular}{lrr}
|
||||
& Obtained \(\xi\) & Control Gain\\
|
||||
\hline
|
||||
Modified IFF & 0.83 & 1.99\\
|
||||
IFF with \(k_p\) & 0.83 & 2.02\\
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
|
||||
\section{Passive Damping - Critical Damping}
|
||||
\label{sec:org81b0306}
|
||||
\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}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
c_opt = 2*sqrt(k*m);
|
||||
\end{minted}
|
||||
|
||||
\section{Transmissibility And Compliance}
|
||||
\label{sec:orge56633c}
|
||||
\label{sec:comp_transmissibilty}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
open('rotating_frame.slx');
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{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;
|
||||
\end{minted}
|
||||
\begin{minted}[]{matlab}
|
||||
G_ol = linearize(mdl, io, 0);
|
||||
|
||||
%% Input/Output definition
|
||||
G_ol.InputName = {'Dwx', 'Dwy', 'Fdx', 'Fdy'};
|
||||
G_ol.OutputName = {'Dx', 'Dy'};
|
||||
\end{minted}
|
||||
|
||||
\subsection{Passive Damping}
|
||||
\label{sec:orgc0de759}
|
||||
\begin{minted}[]{matlab}
|
||||
kp = 0;
|
||||
cp = 0;
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
c_old = c;
|
||||
c = c_opt;
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
G_pas = linearize(mdl, io, 0);
|
||||
|
||||
%% Input/Output definition
|
||||
G_pas.InputName = {'Dwx', 'Dwy', 'Fdx', 'Fdy'};
|
||||
G_pas.OutputName = {'Dx', 'Dy'};
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
c = c_old;
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
Kiff = opt_gain_iff/(wi + s)*tf(eye(2));
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
G_iff = linearize(mdl, io, 0);
|
||||
|
||||
%% Input/Output definition
|
||||
G_iff.InputName = {'Dwx', 'Dwy', 'Fdx', 'Fdy'};
|
||||
G_iff.OutputName = {'Dx', 'Dy'};
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
kp = 5*m*W^2;
|
||||
cp = 0.01;
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
Kiff = opt_gain_kp/s*tf(eye(2));
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[]{matlab}
|
||||
G_kp = linearize(mdl, io, 0);
|
||||
|
||||
%% Input/Output definition
|
||||
G_kp.InputName = {'Dwx', 'Dwy', 'Fdx', 'Fdy'};
|
||||
G_kp.OutputName = {'Dx', 'Dy'};
|
||||
\end{minted}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/comp_transmissibility.png}
|
||||
\caption{\label{fig:comp_transmissibility}Comparison of the transmissibility}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/comp_compliance.png}
|
||||
\caption{\label{fig:comp_compliance}Comparison of the obtained Compliance}
|
||||
\end{figure}
|
||||
|
||||
\chapter{Notations}
|
||||
\label{sec:org61801fb}
|
||||
\label{sec:notations}
|
||||
|
||||
\begin{center}
|
||||
\begin{tabular}{llll}
|
||||
& Mathematical Notation & Matlab & Unit\\
|
||||
\hline
|
||||
Actuator Stiffness & \(k\) & \texttt{k} & N/m\\
|
||||
Actuator Damping & \(c\) & \texttt{c} & N/(m/s)\\
|
||||
Payload Mass & \(m\) & \texttt{m} & kg\\
|
||||
Damping Ratio & \(\xi = \frac{c}{2\sqrt{km}}\) & \texttt{xi} & \\
|
||||
Actuator Force & \(\bm{F}, F_u, F_v\) & \texttt{F} \texttt{Fu} \texttt{Fv} & N\\
|
||||
Force Sensor signal & \(\bm{f}, f_u, f_v\) & \texttt{f} \texttt{fu} \texttt{fv} & N\\
|
||||
Relative Displacement & \(\bm{d}, d_u, d_v\) & \texttt{d} \texttt{du} \texttt{dv} & m\\
|
||||
Resonance freq. when \(\Omega = 0\) & \(\omega_0\) & \texttt{w0} & rad/s\\
|
||||
Rotation Speed & \(\Omega = \dot{\theta}\) & \texttt{W} & rad/s\\
|
||||
Low Pass Filter corner frequency & \(\omega_i\) & \texttt{wi} & rad/s\\
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
|
||||
\begin{center}
|
||||
\begin{tabular}{llll}
|
||||
& Mathematical Notation & Matlab & Unit\\
|
||||
\hline
|
||||
Laplace variable & \(s\) & \texttt{s} & \\
|
||||
Complex number & \(j\) & \texttt{j} & \\
|
||||
Frequency & \(\omega\) & \texttt{w} & [rad/s]\\
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
|
||||
\printbibliography
|
||||
|
||||
\bibliography{ref}
|
||||
\end{document}
|
BIN
matlab/matlab.zip
Normal file
BIN
matlab/matlab.zip
Normal file
Binary file not shown.
114
matlab/preamble.tex
Normal file
114
matlab/preamble.tex
Normal file
@ -0,0 +1,114 @@
|
||||
\usepackage{float}
|
||||
|
||||
\usepackage{caption,tabularx,booktabs}
|
||||
|
||||
\usepackage{biblatex}
|
||||
|
||||
\usepackage{fontawesome}
|
||||
|
||||
\usepackage{caption}
|
||||
\usepackage{subcaption}
|
||||
|
||||
\captionsetup[figure]{labelfont=bf}
|
||||
\captionsetup[subfigure]{labelfont=bf}
|
||||
\captionsetup[listing]{labelfont=bf}
|
||||
\captionsetup[table]{labelfont=bf}
|
||||
|
||||
\usepackage{xcolor}
|
||||
|
||||
\definecolor{my-blue}{HTML}{6b7adb}
|
||||
\definecolor{my-pale-blue}{HTML}{e6e9f9}
|
||||
\definecolor{my-red}{HTML}{db6b6b}
|
||||
\definecolor{my-pale-red}{HTML}{f9e6e6}
|
||||
\definecolor{my-green}{HTML}{6bdbb6}
|
||||
\definecolor{my-pale-green}{HTML}{e6f9f3}
|
||||
\definecolor{my-yellow}{HTML}{dbd26b}
|
||||
\definecolor{my-pale-yellow}{HTML}{f9f7e6}
|
||||
\definecolor{my-orange}{HTML}{dba76b}
|
||||
\definecolor{my-pale-orange}{HTML}{f9f0e6}
|
||||
\definecolor{my-grey}{HTML}{a3a3a3}
|
||||
\definecolor{my-pale-grey}{HTML}{f0f0f0}
|
||||
\definecolor{my-turq}{HTML}{6bc7db}
|
||||
\definecolor{my-pale-turq}{HTML}{e6f6f9}
|
||||
|
||||
\usepackage{inconsolata}
|
||||
|
||||
\usepackage[newfloat=true, chapter]{minted}
|
||||
\usemintedstyle{autumn}
|
||||
|
||||
\setminted{frame=lines,breaklines=true,tabsize=4,fontsize=\scriptsize,autogobble=true,labelposition=topline,bgcolor=my-pale-grey}
|
||||
\setminted[matlab]{label=Matlab}
|
||||
\setminted[latex]{label=LaTeX}
|
||||
\setminted[bash]{label=Bash}
|
||||
\setminted[python]{label=Python}
|
||||
\setminted[text]{label=Results}
|
||||
\setminted[md]{label=Org Mode}
|
||||
|
||||
\setmintedinline{fontsize=\normalsize,bgcolor=my-pale-grey}
|
||||
|
||||
\usepackage[most]{tcolorbox}
|
||||
|
||||
\tcbuselibrary{minted}
|
||||
|
||||
\newtcolorbox{seealso}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=See Also}
|
||||
\newtcolorbox{hint}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=Hint}
|
||||
\newtcolorbox{definition}{enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Definition}
|
||||
\newtcolorbox{important}{ enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Important}
|
||||
\newtcolorbox{exampl}[1][]{ enhanced,breakable,colback=my-pale-green,colframe=my-green,fonttitle=\bfseries,title=Example,#1}
|
||||
\newtcolorbox{exercice}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Exercice}
|
||||
\newtcolorbox{question}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Question}
|
||||
\newtcolorbox{answer}{ enhanced,breakable,colback=my-pale-turq,colframe=my-turq,fonttitle=\bfseries,title=Answer}
|
||||
\newtcolorbox{summary}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Summary}
|
||||
\newtcolorbox{note}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Note}
|
||||
\newtcolorbox{caution}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Caution}
|
||||
\newtcolorbox{warning}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Warning}
|
||||
|
||||
\newtcolorbox{my-quote}[1]{%
|
||||
colback=my-pale-grey,
|
||||
grow to right by=-10mm,
|
||||
grow to left by=-10mm,
|
||||
boxrule=0pt,
|
||||
boxsep=0pt,
|
||||
breakable,
|
||||
enhanced jigsaw,
|
||||
borderline west={4pt}{0pt}{my-grey}}
|
||||
|
||||
\renewenvironment{quote}{\begin{my-quote}}{\end{my-quote}}
|
||||
|
||||
\newtcolorbox{my-verse}[1]{%
|
||||
colback=my-pale-grey,
|
||||
grow to right by=-10mm,
|
||||
grow to left by=-10mm,
|
||||
boxrule=0pt,
|
||||
boxsep=0pt,
|
||||
breakable,
|
||||
enhanced jigsaw,
|
||||
borderline west={4pt}{0pt}{my-grey}}
|
||||
|
||||
\renewenvironment{verse}{\begin{my-verse}}{\end{my-verse}}
|
||||
|
||||
\usepackage{environ}% http://ctan.org/pkg/environ
|
||||
\NewEnviron{aside}{%
|
||||
\marginpar{\BODY}
|
||||
}
|
||||
|
||||
\renewenvironment{verbatim}{\VerbatimEnvironment\begin{minted}[]{text}}{\end{minted}}
|
||||
|
||||
\usepackage{soul}
|
||||
\sethlcolor{my-pale-grey}
|
||||
|
||||
\let\OldTexttt\texttt
|
||||
\renewcommand{\texttt}[1]{{\ttfamily\hl{\mbox{\,#1\,}}}}
|
||||
|
||||
\makeatletter
|
||||
\preto\Gin@extensions{png,}
|
||||
\DeclareGraphicsRule{.png}{pdf}{.pdf}{\noexpand\Gin@base.pdf}
|
||||
\makeatother
|
||||
|
||||
\usepackage{hyperref}
|
||||
\hypersetup{
|
||||
colorlinks = true,
|
||||
allcolors = my-blue
|
||||
}
|
||||
|
||||
\usepackage{hypcap}
|
@ -84,3 +84,11 @@
|
||||
doi = {10.5281/zenodo.3894342},
|
||||
year = 2020,
|
||||
}
|
||||
|
||||
@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},
|
||||
url = {http://iopscience.iop.org/article/10.1088/2631-8695/abe803},
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user