phd-nass-rotating-3dof-model/rotating_frame.html

1351 lines
57 KiB
HTML
Raw Normal View History

2019-01-18 17:18:02 +01:00
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2019-01-23 mer. 15:21 -->
2019-01-18 17:18:02 +01:00
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Control in a rotating frame</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Thomas Dehaeze" />
<style type="text/css">
<!--/*--><![CDATA[/*><!--*/
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #ccc;
box-shadow: 3px 3px 3px #eee;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: visible;
padding-top: 1.2em;
}
pre.src:before {
display: none;
position: absolute;
background-color: white;
top: -10px;
right: 10px;
padding: 3px;
border: 1px solid black;
}
pre.src:hover:before { display: inline;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { width: 90%; }
/*]]>*/-->
</style>
<link rel="stylesheet" type="text/css" href="css/htmlize.css"/>
<link rel="stylesheet" type="text/css" href="css/readtheorg.css"/>
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script type="text/javascript" src="js/jquery.stickytableheaders.min.js"></script>
<script type="text/javascript" src="js/readtheorg.js"></script>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2018 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id)
{
var target = document.getElementById(id);
if(null != target) {
elem.cacheClassElem = elem.className;
elem.cacheClassTarget = target.className;
target.className = "code-highlighted";
elem.className = "code-highlighted";
}
}
function CodeHighlightOff(elem, id)
{
var target = document.getElementById(id);
if(elem.cacheClassElem)
elem.className = elem.cacheClassElem;
if(elem.cacheClassTarget)
target.className = elem.cacheClassTarget;
}
/*]]>*///-->
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
displayAlign: "center",
displayIndent: "0em",
"HTML-CSS": { scale: 100,
linebreaks: { automatic: "false" },
webFont: "TeX"
},
SVG: {scale: 100,
linebreaks: { automatic: "false" },
font: "TeX"},
NativeMML: {scale: 100},
TeX: { equationNumbers: {autoNumber: "AMS"},
MultLineWidth: "85%",
TagSide: "right",
TagIndent: ".8em"
}
});
</script>
<script type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML"></script>
</head>
<body>
<div id="content">
<h1 class="title">Control in a rotating frame</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org9988e59">1. Introduction</a></li>
<li><a href="#orgfd01695">2. System</a>
2019-01-18 17:18:02 +01:00
<ul>
<li><a href="#orged1d203">2.1. System description</a></li>
<li><a href="#orgbcc53a3">2.2. Equations</a></li>
<li><a href="#org28e82a2">2.3. Numerical Values for the NASS</a></li>
<li><a href="#orgd1ccc62">2.4. Euler and Coriolis forces - Numerical Result</a></li>
<li><a href="#org8db03ec">2.5. Negative Spring Effect - Numerical Result</a></li>
<li><a href="#org7e45369">2.6. Limitations due to coupling</a>
2019-01-18 17:46:54 +01:00
<ul>
<li><a href="#orgc898fca">2.6.1. Numerical Analysis</a></li>
2019-01-18 17:18:02 +01:00
</ul>
</li>
<li><a href="#org87cd267">2.7. Limitations due to negative stiffness effect</a></li>
2019-01-18 17:18:02 +01:00
</ul>
</li>
<li><a href="#org86cc8ca">3. Control Strategies</a>
2019-01-18 17:18:02 +01:00
<ul>
<li><a href="#orga1abb2c">3.1. Measurement in the fixed reference frame</a></li>
<li><a href="#org08a5499">3.2. Measurement in the rotating frame</a></li>
2019-01-18 17:18:02 +01:00
</ul>
</li>
<li><a href="#org5b0bef3">4. Multi Body Model - Simscape</a>
2019-01-18 17:46:54 +01:00
<ul>
<li><a href="#org13aaa95">4.1. Parameter for the Simscape simulations</a></li>
<li><a href="#orgd334995">4.2. Identification in the rotating referenced frame</a>
2019-01-21 23:33:23 +01:00
<ul>
<li><a href="#org5cb3ac6">4.2.1. Low rotation speed and High rotation speed</a></li>
2019-01-21 23:33:23 +01:00
</ul>
</li>
<li><a href="#orgb159f85">4.3. Identification in the fixed frame</a></li>
<li><a href="#org6b50e4b">4.4. Identification from actuator forces to displacement in the fixed frame</a></li>
<li><a href="#org6a8d002">4.5. Effect of the rotating Speed</a>
2019-01-21 23:33:23 +01:00
<ul>
<li><a href="#org4a07d2b">4.5.1. <span class="todo TODO">TODO</span> Use realistic parameters for the mass of the sample and stiffness of the X-Y stage</a></li>
<li><a href="#org01d22ae">4.5.2. <span class="todo TODO">TODO</span> Check if the plant is changing a lot when we are not turning to when we are turning at the maximum speed (60rpm)</a></li>
2019-01-18 17:18:02 +01:00
</ul>
</li>
<li><a href="#org6cdc442">4.6. Effect of the X-Y stage stiffness</a>
2019-01-18 17:18:02 +01:00
<ul>
<li><a href="#org74a0c06">4.6.1. <span class="todo TODO">TODO</span> At full speed, check how the coupling changes with the stiffness of the actuators</a></li>
2019-01-21 23:33:23 +01:00
</ul>
</li>
2019-01-18 17:18:02 +01:00
</ul>
</li>
<li><a href="#orge84791a">5. Control Implementation</a>
2019-01-18 17:18:02 +01:00
<ul>
<li><a href="#org86d67af">5.1. Measurement in the fixed reference frame</a></li>
2019-01-18 17:18:02 +01:00
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-org9988e59" class="outline-2">
<h2 id="org9988e59"><span class="section-number-2">1</span> Introduction</h2>
2019-01-18 17:18:02 +01:00
<div class="outline-text-2" id="text-1">
<p>
2019-01-21 23:33:23 +01:00
The objective of this note it to highlight some control problems that arises when controlling the position of an object using actuators that are rotating with respect to a fixed reference frame.
2019-01-18 17:18:02 +01:00
</p>
<p>
In section <a href="#org4f1fd4b">2</a>, a simple system composed of a spindle and a translation stage is defined and the equations of motion are written.
2019-01-21 23:33:23 +01:00
The rotation induces some coupling between the actuators and their displacement, and modifies the dynamics of the system.
This is studied using the equations, and some numerical computations are used to compare the use of voice coil and piezoelectric actuators.
2019-01-18 17:18:02 +01:00
</p>
<p>
Then, in section <a href="#orgdb88326">3</a>, two different control approach are compared where:
2019-01-18 17:18:02 +01:00
</p>
<ul class="org-ul">
<li>the measurement is made in the fixed frame</li>
<li>the measurement is made in the rotating frame</li>
</ul>
2019-01-21 23:33:23 +01:00
<p>
In section <a href="#org8ef210c">4</a>, the analytical study will be validated using a multi body model of the studied system.
2019-01-21 23:33:23 +01:00
</p>
<p>
Finally, in section <a href="#orgd9942b8">5</a>, the control strategies are implemented using Simulink and Simscape and compared.
2019-01-21 23:33:23 +01:00
</p>
2019-01-18 17:18:02 +01:00
</div>
</div>
<div id="outline-container-orgfd01695" class="outline-2">
<h2 id="orgfd01695"><span class="section-number-2">2</span> System</h2>
2019-01-18 17:18:02 +01:00
<div class="outline-text-2" id="text-2">
<p>
<a id="org4f1fd4b"></a>
2019-01-18 17:18:02 +01:00
</p>
</div>
<div id="outline-container-orged1d203" class="outline-3">
<h3 id="orged1d203"><span class="section-number-3">2.1</span> System description</h3>
2019-01-18 17:18:02 +01:00
<div class="outline-text-3" id="text-2-1">
<p>
The system consists of one 2 degree of freedom translation stage on top of a spindle (figure <a href="#orgce6c963">1</a>).
2019-01-18 17:18:02 +01:00
</p>
<p>
2019-01-21 23:33:23 +01:00
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 \(u\) and \(v\).
2019-01-18 17:18:02 +01:00
</p>
<p>
2019-01-21 23:33:23 +01:00
The measurement is either the \(x-y\) displacement of the object located on top of the translation stage or the \(u-v\) displacement of the sample with respect to a fixed reference frame.
2019-01-18 17:18:02 +01:00
</p>
<div id="orgce6c963" class="figure">
2019-01-18 17:18:02 +01:00
<p><img src="./Figures/rotating_frame_2dof.png" alt="rotating_frame_2dof.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Schematic of the mecanical system</p>
</div>
<p>
In the following block diagram:
</p>
<ul class="org-ul">
<li>\(G\) is the transfer function from the forces applied in the actuators to the measurement</li>
<li>\(K\) is the controller to design</li>
<li>\(J\) is a Jacobian matrix usually used to change the reference frame</li>
</ul>
<p>
Indices \(x\) and \(y\) corresponds to signals in the fixed reference frame (along \(\vec{i}_x\) and \(\vec{i}_y\)):
</p>
<ul class="org-ul">
<li>\(D_x\) is the measured position of the sample</li>
<li>\(r_x\) is the reference signal which corresponds to the wanted \(D_x\)</li>
<li>\(\epsilon_x\) is the position error</li>
</ul>
<p>
Indices \(u\) and \(v\) corresponds to signals in the rotating reference frame (\(\vec{i}_u\) and \(\vec{i}_v\)):
</p>
<ul class="org-ul">
<li>\(F_u\) and \(F_v\) are forces applied by the actuators</li>
<li>\(\epsilon_u\) and \(\epsilon_v\) are position error of the sample along \(\vec{i}_u\) and \(\vec{i}_v\)</li>
</ul>
</div>
</div>
<div id="outline-container-orgbcc53a3" class="outline-3">
<h3 id="orgbcc53a3"><span class="section-number-3">2.2</span> Equations</h3>
2019-01-18 17:18:02 +01:00
<div class="outline-text-3" id="text-2-2">
<p>
<a id="org2f020df"></a>
Based on the figure <a href="#orgce6c963">1</a>, we can write the equations of motion of the system.
2019-01-18 17:18:02 +01:00
</p>
<p>
Let's express the kinetic energy \(T\) and the potential energy \(V\) of the mass \(m\):
</p>
\begin{align}
\label{org93a4d45}
2019-01-18 17:18:02 +01:00
T & = \frac{1}{2} m \left( \dot{x}^2 + \dot{y}^2 \right) \\
V & = \frac{1}{2} k \left( x^2 + y^2 \right)
\end{align}
<p>
The Lagrangian is the kinetic energy minus the potential energy.
</p>
\begin{equation}
\label{org19136da}
2019-01-18 17:18:02 +01:00
L = T-V = \frac{1}{2} m \left( \dot{x}^2 + \dot{y}^2 \right) - \frac{1}{2} k \left( x^2 + y^2 \right)
\end{equation}
<p>
The partial derivatives of the Lagrangian with respect to the variables \((x, y)\) are:
</p>
\begin{align*}
\label{org4fc9f2b}
2019-01-18 17:18:02 +01:00
\frac{\partial L}{\partial x} & = -kx \\
\frac{\partial L}{\partial y} & = -ky \\
\frac{d}{dt}\frac{\partial L}{\partial \dot{x}} & = m\ddot{x} \\
\frac{d}{dt}\frac{\partial L}{\partial \dot{y}} & = m\ddot{y}
\end{align*}
<p>
The external forces applied to the mass are:
</p>
\begin{align*}
F_{\text{ext}, x} &= F_u \cos{\theta} - F_v \sin{\theta}\\
F_{\text{ext}, y} &= F_u \sin{\theta} + F_v \cos{\theta}
\end{align*}
<p>
2019-01-18 17:46:54 +01:00
By appling the Lagrangian equations, we obtain:
2019-01-18 17:18:02 +01:00
</p>
\begin{align}
m\ddot{x} + kx = F_u \cos{\theta} - F_v \sin{\theta}\\
m\ddot{y} + ky = F_u \sin{\theta} + F_v \cos{\theta}
\end{align}
<p>
We then change coordinates from \((x, y)\) to \((d_x, d_y, \theta)\).
</p>
\begin{align*}
x & = d_u \cos{\theta} - d_v \sin{\theta}\\
y & = d_u \sin{\theta} + d_v \cos{\theta}
\end{align*}
<p>
We obtain:
</p>
\begin{align*}
\ddot{x} & = \ddot{d_u} \cos{\theta} - 2\dot{d_u}\dot{\theta}\sin{\theta} - d_u\ddot{\theta}\sin{\theta} - d_u\dot{\theta}^2 \cos{\theta}
- \ddot{d_v} \sin{\theta} - 2\dot{d_v}\dot{\theta}\cos{\theta} - d_v\ddot{\theta}\cos{\theta} + d_v\dot{\theta}^2 \sin{\theta} \\
\ddot{y} & = \ddot{d_u} \sin{\theta} + 2\dot{d_u}\dot{\theta}\cos{\theta} + d_u\ddot{\theta}\cos{\theta} - d_u\dot{\theta}^2 \sin{\theta}
+ \ddot{d_v} \cos{\theta} - 2\dot{d_v}\dot{\theta}\sin{\theta} - d_v\ddot{\theta}\sin{\theta} - d_v\dot{\theta}^2 \cos{\theta} \\
\end{align*}
<p>
2019-01-18 17:46:54 +01:00
By injecting the previous result into the Lagrangian equation, we obtain:
2019-01-18 17:18:02 +01:00
</p>
\begin{align*}
m \ddot{d_u} \cos{\theta} - 2m\dot{d_u}\dot{\theta}\sin{\theta} - m d_u\ddot{\theta}\sin{\theta} - m d_u\dot{\theta}^2 \cos{\theta}
-m \ddot{d_v} \sin{\theta} - 2m\dot{d_v}\dot{\theta}\cos{\theta} - m d_v\ddot{\theta}\cos{\theta} + m d_v\dot{\theta}^2 \sin{\theta}
+ k d_u \cos{\theta} - k d_v \sin{\theta} = F_u \cos{\theta} - F_v \sin{\theta} \\
m \ddot{d_u} \sin{\theta} + 2m\dot{d_u}\dot{\theta}\cos{\theta} + m d_u\ddot{\theta}\cos{\theta} - m d_u\dot{\theta}^2 \sin{\theta}
+ m \ddot{d_v} \cos{\theta} - 2m\dot{d_v}\dot{\theta}\sin{\theta} - m d_v\ddot{\theta}\sin{\theta} - m d_v\dot{\theta}^2 \cos{\theta}
+ k d_u \sin{\theta} + k d_v \cos{\theta} = F_u \sin{\theta} + F_v \cos{\theta}
\end{align*}
<p>
Which is equivalent to:
</p>
\begin{align*}
m \ddot{d_u} - 2m\dot{d_u}\dot{\theta}\frac{\sin{\theta}}{\cos{\theta}} - m d_u\ddot{\theta}\frac{\sin{\theta}}{\cos{\theta}} - m d_u\dot{\theta}^2
-m \ddot{d_v} \frac{\sin{\theta}}{\cos{\theta}} - 2m\dot{d_v}\dot{\theta} - m d_v\ddot{\theta} + m d_v\dot{\theta}^2 \frac{\sin{\theta}}{\cos{\theta}}
+ k d_u - k d_v \frac{\sin{\theta}}{\cos{\theta}} = F_u - F_v \frac{\sin{\theta}}{\cos{\theta}} \\
m \ddot{d_u} + 2m\dot{d_u}\dot{\theta}\frac{\cos{\theta}}{\sin{\theta}} + m d_u\ddot{\theta}\frac{\cos{\theta}}{\sin{\theta}} - m d_u\dot{\theta}^2
+ m \ddot{d_v} \frac{\cos{\theta}}{\sin{\theta}} - 2m\dot{d_v}\dot{\theta} - m d_v\ddot{\theta} - m d_v\dot{\theta}^2 \frac{\cos{\theta}}{\sin{\theta}}
+ k d_u + k d_v \frac{\cos{\theta}}{\sin{\theta}} = F_u + F_v \frac{\cos{\theta}}{\sin{\theta}}
\end{align*}
<p>
We can then subtract and add the previous equations to obtain the following equations:
</p>
<div class="important">
2019-01-21 23:33:23 +01:00
\begin{equation}
\label{orgf3ca0ca}
2019-01-21 23:33:23 +01:00
m \ddot{d_u} + (k - m\dot{\theta}^2) d_u = F_u + 2 m\dot{d_v}\dot{\theta} + m d_v\ddot{\theta}
\end{equation}
\begin{equation}
\label{org5e2eb96}
2019-01-21 23:33:23 +01:00
m \ddot{d_v} + (k - m\dot{\theta}^2) d_v = F_v - 2 m\dot{d_u}\dot{\theta} - m d_u\ddot{\theta}
\end{equation}
2019-01-18 17:18:02 +01:00
</div>
<p>
We obtain two differential equations that are coupled through:
</p>
<ul class="org-ul">
<li><b>Euler forces</b>: \(m d_v \ddot{\theta}\)</li>
<li><b>Coriolis forces</b>: \(2 m \dot{d_v} \dot{\theta}\)</li>
</ul>
<p>
2019-01-21 23:33:23 +01:00
Without the coupling terms, each equation is the equation of a one degree of freedom mass-spring system with mass \(m\) and stiffness \(k- m\dot{\theta}^2\).
Thus, the term \(- m\dot{\theta}^2\) acts like a negative stiffness (due to <b>centrifugal forces</b>).
</p>
<p>
The forces induced by the rotating reference frame are independent of the stiffness of the actuator.
The resulting effect of those forces should then be higher when using softer actuators.
2019-01-18 17:18:02 +01:00
</p>
</div>
2019-01-21 23:33:23 +01:00
</div>
2019-01-18 17:46:54 +01:00
<div id="outline-container-org28e82a2" class="outline-3">
<h3 id="org28e82a2"><span class="section-number-3">2.3</span> Numerical Values for the NASS</h3>
2019-01-21 23:33:23 +01:00
<div class="outline-text-3" id="text-2-3">
2019-01-18 17:46:54 +01:00
<p>
2019-01-21 23:33:23 +01:00
Let's define the parameters for the NASS.
2019-01-18 17:46:54 +01:00
</p>
2019-01-21 23:33:23 +01:00
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-right" />
</colgroup>
<tbody>
<tr>
<td class="org-left">Light sample mass [kg]</td>
<td class="org-right">3.5e+01</td>
</tr>
<tr>
<td class="org-left">Heavy sample mass [kg]</td>
<td class="org-right">8.5e+01</td>
</tr>
<tr>
<td class="org-left">Max rot. speed - light [rpm]</td>
<td class="org-right">6.0e+01</td>
</tr>
2019-01-18 17:46:54 +01:00
2019-01-21 23:33:23 +01:00
<tr>
<td class="org-left">Max rot. speed - heavy [rpm]</td>
<td class="org-right">1.0e+00</td>
</tr>
<tr>
<td class="org-left">Voice Coil Stiffness [N/m]</td>
<td class="org-right">1.0e+03</td>
</tr>
<tr>
<td class="org-left">Piezo Stiffness [N/m]</td>
<td class="org-right">1.0e+08</td>
</tr>
<tr>
<td class="org-left">Max rot. acceleration [rad/s2]</td>
<td class="org-right">1.0e+00</td>
</tr>
<tr>
<td class="org-left">Max mass excentricity [m]</td>
<td class="org-right">1.0e-02</td>
</tr>
<tr>
<td class="org-left">Max Horizontal speed [m/s]</td>
<td class="org-right">2.0e-01</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="outline-container-orgd1ccc62" class="outline-3">
<h3 id="orgd1ccc62"><span class="section-number-3">2.4</span> Euler and Coriolis forces - Numerical Result</h3>
2019-01-21 23:33:23 +01:00
<div class="outline-text-3" id="text-2-4">
2019-01-18 17:46:54 +01:00
<p>
2019-01-21 23:33:23 +01:00
First we will determine the value for Euler and Coriolis forces during regular experiment.
2019-01-18 17:46:54 +01:00
</p>
2019-01-21 23:33:23 +01:00
<ul class="org-ul">
<li><b>Euler forces</b>: \(m d_v \ddot{\theta}\)</li>
<li><b>Coriolis forces</b>: \(2 m \dot{d_v} \dot{\theta}\)</li>
</ul>
2019-01-18 17:46:54 +01:00
<p>
The obtained values are displayed in table <a href="#orga16401f">1</a>.
2019-01-18 17:46:54 +01:00
</p>
2019-01-21 23:33:23 +01:00
<table id="orga16401f" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
2019-01-21 23:33:23 +01:00
<caption class="t-above"><span class="table-number">Table 1:</span> Euler and Coriolis forces for the NASS</caption>
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
<th scope="col" class="org-left">Light</th>
<th scope="col" class="org-left">Heavy</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Coriolis</td>
<td class="org-left">88.0N</td>
<td class="org-left">3.6N</td>
</tr>
<tr>
<td class="org-left">Euler</td>
<td class="org-left">0.4N</td>
<td class="org-left">0.8N</td>
</tr>
</tbody>
</table>
2019-01-18 17:18:02 +01:00
</div>
</div>
<div id="outline-container-org8db03ec" class="outline-3">
<h3 id="org8db03ec"><span class="section-number-3">2.5</span> Negative Spring Effect - Numerical Result</h3>
2019-01-21 23:33:23 +01:00
<div class="outline-text-3" id="text-2-5">
2019-01-18 17:18:02 +01:00
<p>
2019-01-21 23:33:23 +01:00
The negative stiffness due to the rotation is equal to \(-m{\omega_0}^2\).
2019-01-18 17:18:02 +01:00
</p>
2019-01-21 23:33:23 +01:00
<p>
The values for the negative spring effect are displayed in table <a href="#org8cad235">2</a>.
2019-01-21 23:33:23 +01:00
</p>
<p>
This is definitely negligible when using piezoelectric actuators. It may not be the case when using voice coil actuators.
</p>
<table id="org8cad235" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
2019-01-21 23:33:23 +01:00
<caption class="t-above"><span class="table-number">Table 2:</span> Negative Spring effect</caption>
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
<th scope="col" class="org-left">Light</th>
<th scope="col" class="org-left">Heavy</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Neg. Spring</td>
<td class="org-left">1381.7[N/m]</td>
<td class="org-left">0.9[N/m]</td>
</tr>
</tbody>
</table>
2019-01-18 17:46:54 +01:00
</div>
</div>
2019-01-21 23:33:23 +01:00
<div id="outline-container-org7e45369" class="outline-3">
<h3 id="org7e45369"><span class="section-number-3">2.6</span> Limitations due to coupling</h3>
2019-01-21 23:33:23 +01:00
<div class="outline-text-3" id="text-2-6">
<p>
To simplify, we consider a constant rotating speed \(\dot{\theta} = {\omega_0}\) and thus \(\ddot{\theta} = 0\).
</p>
<p>
From equations \eqref{orgf3ca0ca} and \eqref{org5e2eb96}, we obtain:
2019-01-21 23:33:23 +01:00
</p>
\begin{align*}
(m s^2 + (k - m{\omega_0}^2)) d_u &= F_u + 2 m {\omega_0} s d_v \\
(m s^2 + (k - m{\omega_0}^2)) d_v &= F_v - 2 m {\omega_0} s d_u \\
\end{align*}
<p>
From second equation:
\[ d_v = \frac{1}{m s^2 + (k - m{\omega_0}^2)} F_v - \frac{2 m {\omega_0} s}{m s^2 + (k - m{\omega_0}^2)} d_u \]
</p>
<p>
And we re-inject \(d_v\) into the first equation:
</p>
\begin{equation*}
(m s^2 + (k - m{\omega_0}^2)) d_u = F_u + \frac{2 m {\omega_0} s}{m s^2 + (k - m{\omega_0}^2)} F_v - \frac{(2 m {\omega_0} s)^2}{m s^2 + (k - m{\omega_0}^2)} d_u
\end{equation*}
\begin{equation*}
\frac{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2}{m s^2 + (k - m{\omega_0}^2)} d_u = F_u + \frac{2 m {\omega_0} s}{m s^2 + (k - m{\omega_0}^2)} F_v
\end{equation*}
<p>
Finally we obtain \(d_u\) function of \(F_u\) and \(F_v\).
\[ d_u = \frac{m s^2 + (k - m{\omega_0}^2)}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2} F_u + \frac{2 m {\omega_0} s}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2} F_v \]
</p>
<p>
Similarly we can obtain \(d_v\) function of \(F_u\) and \(F_v\):
\[ d_v = \frac{m s^2 + (k - m{\omega_0}^2)}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2} F_v - \frac{2 m {\omega_0} s}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2} F_u \]
</p>
<p>
The two previous equations can be written in a matrix form:
</p>
<div class="important">
\begin{equation}
\begin{bmatrix} d_u \\ d_v \end{bmatrix} =
\frac{1}{(m s^2 + (k - m{\omega_0}^2))^2 + (2 m {\omega_0} s)^2}
\begin{bmatrix}
ms^2 + (k-m{\omega_0}^2) & 2 m \omega_0 s \\
-2 m \omega_0 s & ms^2 + (k-m{\omega_0}^2) \\
\end{bmatrix}
\begin{bmatrix} F_u \\ F_v \end{bmatrix}
\end{equation}
2019-01-18 17:46:54 +01:00
</div>
2019-01-18 17:18:02 +01:00
<p>
2019-01-21 23:33:23 +01:00
Then, coupling is negligible if \(|-m \omega^2 + (k - m{\omega_0}^2)| \gg |2 m {\omega_0} \omega|\).
2019-01-18 17:18:02 +01:00
</p>
</div>
<div id="outline-container-orgc898fca" class="outline-4">
<h4 id="orgc898fca"><span class="section-number-4">2.6.1</span> Numerical Analysis</h4>
2019-01-21 23:33:23 +01:00
<div class="outline-text-4" id="text-2-6-1">
2019-01-18 17:18:02 +01:00
<p>
2019-01-21 23:33:23 +01:00
We plot on the same graph \(\frac{|-m \omega^2 + (k - m {\omega_0}^2)|}{|2 m \omega_0 \omega|}\) for the voice coil and the piezo:
2019-01-18 17:18:02 +01:00
</p>
2019-01-21 23:33:23 +01:00
<ul class="org-ul">
<li>with the light sample (figure <a href="#org2b9a0e8">2</a>).</li>
<li>with the heavy sample (figure <a href="#org24d5dc4">3</a>).</li>
2019-01-21 23:33:23 +01:00
</ul>
2019-01-18 17:18:02 +01:00
<div id="org2b9a0e8" class="figure">
2019-01-21 23:33:23 +01:00
<p><img src="Figures/coupling_light.png" alt="coupling_light.png" />
</p>
<p><span class="figure-number">Figure 2: </span>Relative Coupling for light mass and high rotation speed</p>
</div>
<div id="org24d5dc4" class="figure">
2019-01-21 23:33:23 +01:00
<p><img src="Figures/coupling_heavy.png" alt="coupling_heavy.png" />
</p>
<p><span class="figure-number">Figure 3: </span>Relative Coupling for heavy mass and low rotation speed</p>
</div>
<div class="important">
<p>
Coupling is higher for actuators with small stiffness.
</p>
2019-01-18 17:18:02 +01:00
2019-01-21 23:33:23 +01:00
</div>
2019-01-18 17:18:02 +01:00
</div>
2019-01-18 17:46:54 +01:00
</div>
</div>
<div id="outline-container-org87cd267" class="outline-3">
<h3 id="org87cd267"><span class="section-number-3">2.7</span> Limitations due to negative stiffness effect</h3>
2019-01-21 23:33:23 +01:00
<div class="outline-text-3" id="text-2-7">
2019-01-18 17:46:54 +01:00
<p>
2019-01-21 23:33:23 +01:00
If \(\max{\dot{\theta}} \ll \sqrt{\frac{k}{m}}\), then the negative spring effect is negligible and \(k - m\dot{\theta}^2 \approx k\).
2019-01-18 17:46:54 +01:00
</p>
2019-01-18 17:18:02 +01:00
<p>
Let's estimate what is the maximum rotation speed for which the negative stiffness effect is still negligible (\(\omega_\text{max} = 0.1 \sqrt{\frac{k}{m}}\)). Results are shown table <a href="#org84660ee">3</a>.
2019-01-18 17:18:02 +01:00
</p>
<table id="org84660ee" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
2019-01-21 23:33:23 +01:00
<caption class="t-above"><span class="table-number">Table 3:</span> Maximum rotation speed at which negative stiffness is negligible (\(0.1\sqrt{\frac{k}{m}}\))</caption>
2019-01-18 17:18:02 +01:00
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
2019-01-21 23:33:23 +01:00
<th scope="col" class="org-left">Voice Coil</th>
<th scope="col" class="org-left">Piezo</th>
2019-01-18 17:18:02 +01:00
</tr>
</thead>
<tbody>
<tr>
2019-01-21 23:33:23 +01:00
<td class="org-left">Light</td>
<td class="org-left">5[rpm]</td>
<td class="org-left">1614[rpm]</td>
2019-01-18 17:18:02 +01:00
</tr>
<tr>
2019-01-21 23:33:23 +01:00
<td class="org-left">Heavy</td>
<td class="org-left">3[rpm]</td>
<td class="org-left">1036[rpm]</td>
2019-01-18 17:18:02 +01:00
</tr>
</tbody>
</table>
2019-01-21 23:33:23 +01:00
<p>
The negative spring effect is proportional to the rotational speed \(\omega\).
The system dynamics will be much more affected when using soft actuator.
</p>
<div class="important">
<p>
Negative stiffness effect has very important effect when using soft actuators.
</p>
2019-01-18 17:18:02 +01:00
</div>
<p>
2019-01-21 23:33:23 +01:00
The system can even goes unstable when \(m \omega^2 > k\), that is when the centrifugal forces are higher than the forces due to stiffness.
2019-01-18 17:18:02 +01:00
</p>
2019-01-21 23:33:23 +01:00
<p>
From this analysis, we can determine the lowest practical stiffness that is possible to use: \(k_\text{min} = 10 m \omega^2\) (table <a href="#orgbea17e3">4</a>)
2019-01-21 23:33:23 +01:00
</p>
<table id="orgbea17e3" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
2019-01-21 23:33:23 +01:00
<caption class="t-above"><span class="table-number">Table 4:</span> Minimum possible stiffness</caption>
2019-01-18 17:18:02 +01:00
<colgroup>
<col class="org-left" />
2019-01-21 23:33:23 +01:00
<col class="org-right" />
2019-01-18 17:18:02 +01:00
2019-01-21 23:33:23 +01:00
<col class="org-right" />
2019-01-18 17:18:02 +01:00
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
2019-01-21 23:33:23 +01:00
<th scope="col" class="org-right">Light</th>
<th scope="col" class="org-right">Heavy</th>
2019-01-18 17:18:02 +01:00
</tr>
</thead>
<tbody>
<tr>
2019-01-21 23:33:23 +01:00
<td class="org-left">k min [N/m]</td>
<td class="org-right">2199</td>
<td class="org-right">89</td>
2019-01-18 17:18:02 +01:00
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div id="outline-container-org86cc8ca" class="outline-2">
<h2 id="org86cc8ca"><span class="section-number-2">3</span> Control Strategies</h2>
2019-01-21 23:33:23 +01:00
<div class="outline-text-2" id="text-3">
2019-01-18 17:18:02 +01:00
<p>
<a id="orgdb88326"></a>
2019-01-18 17:18:02 +01:00
</p>
</div>
<div id="outline-container-orga1abb2c" class="outline-3">
<h3 id="orga1abb2c"><span class="section-number-3">3.1</span> Measurement in the fixed reference frame</h3>
2019-01-21 23:33:23 +01:00
<div class="outline-text-3" id="text-3-1">
2019-01-18 17:18:02 +01:00
<p>
First, let's consider a measurement in the fixed referenced frame.
</p>
<p>
The transfer function from actuator \([F_u, F_v]\) to sensor \([D_x, D_y]\) is then \(G(\theta)\).
</p>
<p>
Then the measurement is subtracted to the reference signal \([r_x, r_y]\) to obtain the position error in the fixed reference frame \([\epsilon_x, \epsilon_y]\).
</p>
<p>
The position error \([\epsilon_x, \epsilon_y]\) is then express in the rotating frame corresponding to the actuators \([\epsilon_u, \epsilon_v]\).
</p>
<p>
Finally, the control low \(K\) links the position errors \([\epsilon_u, \epsilon_v]\) to the actuator forces \([F_u, F_v]\).
</p>
<p>
The block diagram is shown on figure <a href="#org859df00">4</a>.
2019-01-18 17:18:02 +01:00
</p>
<div id="org859df00" class="figure">
2019-01-18 17:18:02 +01:00
<p><img src="./Figures/control_measure_fixed_2dof.png" alt="control_measure_fixed_2dof.png" />
</p>
2019-01-21 23:33:23 +01:00
<p><span class="figure-number">Figure 4: </span>Control with a measure from fixed frame</p>
2019-01-18 17:18:02 +01:00
</div>
<p>
The loop gain is then \(L = G(\theta) K J(\theta)\).
</p>
<p>
2019-01-18 17:46:54 +01:00
One question we wish to answer is: is \(G(\theta) J(\theta) = G(\theta_0) J(\theta_0)\)?
2019-01-18 17:18:02 +01:00
</p>
</div>
</div>
<div id="outline-container-org08a5499" class="outline-3">
<h3 id="org08a5499"><span class="section-number-3">3.2</span> Measurement in the rotating frame</h3>
2019-01-21 23:33:23 +01:00
<div class="outline-text-3" id="text-3-2">
2019-01-18 17:18:02 +01:00
<p>
2019-01-18 17:46:54 +01:00
Let's consider that the measurement is made in the rotating reference frame.
2019-01-18 17:18:02 +01:00
</p>
<p>
The corresponding block diagram is shown figure <a href="#org36bbc4f">5</a>
2019-01-18 17:18:02 +01:00
</p>
<div id="org36bbc4f" class="figure">
2019-01-18 17:18:02 +01:00
<p><img src="./Figures/control_measure_rotating_2dof.png" alt="control_measure_rotating_2dof.png" />
</p>
2019-01-21 23:33:23 +01:00
<p><span class="figure-number">Figure 5: </span>Control with a measure from rotating frame</p>
2019-01-18 17:18:02 +01:00
</div>
<p>
The loop gain is \(L = G K\).
</p>
</div>
</div>
</div>
<div id="outline-container-org5b0bef3" class="outline-2">
<h2 id="org5b0bef3"><span class="section-number-2">4</span> Multi Body Model - Simscape</h2>
2019-01-21 23:33:23 +01:00
<div class="outline-text-2" id="text-4">
2019-01-18 17:18:02 +01:00
<p>
<a id="org8ef210c"></a>
2019-01-18 17:18:02 +01:00
</p>
</div>
2019-01-18 17:46:54 +01:00
<div id="outline-container-org13aaa95" class="outline-3">
<h3 id="org13aaa95"><span class="section-number-3">4.1</span> Parameter for the Simscape simulations</h3>
2019-01-21 23:33:23 +01:00
<div class="outline-text-3" id="text-4-1">
<div class="org-src-container">
<pre class="src src-matlab">w = <span style="color: #D0372D;">2</span><span style="color: #6434A3;">*</span><span style="color: #D0372D;">pi</span>; <span style="color: #8D8D84; font-style: italic;">% Rotation speed [rad/s]</span>
theta_e = <span style="color: #D0372D;">0</span>; <span style="color: #8D8D84; font-style: italic;">% Static measurement error on the angle theta [rad]</span>
m = <span style="color: #D0372D;">5</span>; <span style="color: #8D8D84; font-style: italic;">% mass of the sample [kg]</span>
mTuv = <span style="color: #D0372D;">30</span>;<span style="color: #8D8D84; font-style: italic;">% Mass of the moving part of the Tuv stage [kg]</span>
kTuv = <span style="color: #D0372D;">1e8</span>; <span style="color: #8D8D84; font-style: italic;">% Stiffness of the Tuv stage [N/m]</span>
cTuv = <span style="color: #D0372D;">0</span>; <span style="color: #8D8D84; font-style: italic;">% Damping of the Tuv stage [N/(m/s)]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">mlight = <span style="color: #D0372D;">5</span>; <span style="color: #8D8D84; font-style: italic;">% Mass for light sample [kg]</span>
mheavy = <span style="color: #D0372D;">55</span>; <span style="color: #8D8D84; font-style: italic;">% Mass for heavy sample [kg]</span>
wlight = <span style="color: #D0372D;">2</span><span style="color: #6434A3;">*</span><span style="color: #D0372D;">pi</span>; <span style="color: #8D8D84; font-style: italic;">% Max rot. speed for light sample [rad/s]</span>
wheavy = <span style="color: #D0372D;">2</span><span style="color: #6434A3;">*</span><span style="color: #D0372D;">pi</span><span style="color: #6434A3;">/</span><span style="color: #D0372D;">60</span>; <span style="color: #8D8D84; font-style: italic;">% Max rot. speed for heavy sample [rad/s]</span>
kvc = <span style="color: #D0372D;">1e3</span>; <span style="color: #8D8D84; font-style: italic;">% Voice Coil Stiffness [N/m]</span>
kpz = <span style="color: #D0372D;">1e8</span>; <span style="color: #8D8D84; font-style: italic;">% Piezo Stiffness [N/m]</span>
d = <span style="color: #D0372D;">0</span>.<span style="color: #D0372D;">01</span>; <span style="color: #8D8D84; font-style: italic;">% Maximum excentricity from rotational axis [m]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgd334995" class="outline-3">
<h3 id="orgd334995"><span class="section-number-3">4.2</span> Identification in the rotating referenced frame</h3>
<div class="outline-text-3" id="text-4-2">
2019-01-21 23:33:23 +01:00
<p>
We initialize the inputs and outputs of the system to identify.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Options for Linearized</span>
options = linearizeOptions;
options.SampleTime = <span style="color: #D0372D;">0</span>;
<span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Name of the Simulink File</span>
mdl = <span style="color: #008000;">'rotating_frame'</span>;
<span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Input/Output definition</span>
io<span style="color: #707183;">(</span><span style="color: #D0372D;">1</span><span style="color: #707183;">)</span> = linio<span style="color: #707183;">(</span><span style="color: #7388D6;">[</span>mdl, '<span style="color: #6434A3;">/</span>fu'<span style="color: #7388D6;">]</span>, <span style="color: #D0372D;">1</span>, 'input'<span style="color: #707183;">)</span>;
io<span style="color: #707183;">(</span><span style="color: #D0372D;">2</span><span style="color: #707183;">)</span> = linio<span style="color: #707183;">(</span><span style="color: #7388D6;">[</span>mdl, '<span style="color: #6434A3;">/</span>fv'<span style="color: #7388D6;">]</span>, <span style="color: #D0372D;">1</span>, 'input'<span style="color: #707183;">)</span>;
io<span style="color: #707183;">(</span><span style="color: #D0372D;">3</span><span style="color: #707183;">)</span> = linio<span style="color: #707183;">(</span><span style="color: #7388D6;">[</span>mdl, '<span style="color: #6434A3;">/</span>du'<span style="color: #7388D6;">]</span>, <span style="color: #D0372D;">1</span>, 'output'<span style="color: #707183;">)</span>;
io<span style="color: #707183;">(</span><span style="color: #D0372D;">4</span><span style="color: #707183;">)</span> = linio<span style="color: #707183;">(</span><span style="color: #7388D6;">[</span>mdl, '<span style="color: #6434A3;">/</span>dv'<span style="color: #7388D6;">]</span>, <span style="color: #D0372D;">1</span>, 'output'<span style="color: #707183;">)</span>;
</pre>
</div>
2019-01-18 17:18:02 +01:00
2019-01-21 23:33:23 +01:00
<p>
We start we identify the transfer functions at high speed with the light sample.
</p>
<div class="org-src-container">
<pre class="src src-matlab">w = wlight; <span style="color: #8D8D84; font-style: italic;">% Rotation speed [rad/s]</span>
m = mlight; <span style="color: #8D8D84; font-style: italic;">% mass of the sample [kg]</span>
2019-01-21 23:33:23 +01:00
kTuv = kpz;
2019-01-21 23:33:23 +01:00
Gpz_light = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span>.<span style="color: #D0372D;">1</span><span style="color: #707183;">)</span>;
Gpz_light.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fu', 'Fv'</span><span style="color: #707183;">}</span>;
Gpz_light.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Du', 'Dv'</span><span style="color: #707183;">}</span>;
kTuv = kvc;
Gvc_light = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span>.<span style="color: #D0372D;">1</span><span style="color: #707183;">)</span>;
2019-01-21 23:33:23 +01:00
Gvc_light.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fu', 'Fv'</span><span style="color: #707183;">}</span>;
Gvc_light.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Du', 'Dv'</span><span style="color: #707183;">}</span>;
</pre>
2019-01-18 17:18:02 +01:00
</div>
2019-01-21 23:33:23 +01:00
<p>
Then we identify the system with an heavy mass and low speed.
</p>
<div class="org-src-container">
<pre class="src src-matlab">w = wheavy; <span style="color: #8D8D84; font-style: italic;">% Rotation speed [rad/s]</span>
m = mheavy; <span style="color: #8D8D84; font-style: italic;">% mass of the sample [kg]</span>
kTuv = kpz;
Gpz_heavy = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span>.<span style="color: #D0372D;">1</span><span style="color: #707183;">)</span>;
Gpz_heavy.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fu', 'Fv'</span><span style="color: #707183;">}</span>;
Gpz_heavy.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Du', 'Dv'</span><span style="color: #707183;">}</span>;
kTuv = kvc;
Gvc_heavy = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span>.<span style="color: #D0372D;">1</span><span style="color: #707183;">)</span>;
Gvc_heavy.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fu', 'Fv'</span><span style="color: #707183;">}</span>;
Gvc_heavy.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Du', 'Dv'</span><span style="color: #707183;">}</span>;
</pre>
</div>
<p>
Finally, we plot the coupling ratio in both case (figure <a href="#orgded0015">6</a>).
We obtain the same result than the analytical case (figures <a href="#org2b9a0e8">2</a> and <a href="#org24d5dc4">3</a>).
</p>
<div id="orgded0015" class="figure">
<p><img src="Figures/coupling_ration_light_heavy.png" alt="coupling_ration_light_heavy.png" />
</p>
</div>
2019-01-21 23:44:33 +01:00
<div class="figure">
<p><img src="Figures/coupling_simscape_light.png" alt="coupling_simscape_light.png" />
</p>
</div>
2019-01-21 23:33:23 +01:00
<p>
And then with the heavy sample.
</p>
<div class="org-src-container">
<pre class="src src-matlab">rot_speed = wheavy;
angle_e = <span style="color: #D0372D;">0</span>;
m = mheavy;
k = kpz;
c = <span style="color: #D0372D;">1e3</span>;
Gpz_heavy = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span>.<span style="color: #D0372D;">1</span><span style="color: #707183;">)</span>;
k = kvc;
c = <span style="color: #D0372D;">1e3</span>;
Gvc_heavy = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span>.<span style="color: #D0372D;">1</span><span style="color: #707183;">)</span>;
Gpz_heavy.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fu', 'Fv'</span><span style="color: #707183;">}</span>;
Gpz_heavy.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Du', 'Dv'</span><span style="color: #707183;">}</span>;
Gvc_heavy.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fu', 'Fv'</span><span style="color: #707183;">}</span>;
Gvc_heavy.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Du', 'Dv'</span><span style="color: #707183;">}</span>;
</pre>
</div>
2019-01-21 23:44:33 +01:00
<div class="figure">
<p><img src="Figures/coupling_simscape_heavy.png" alt="coupling_simscape_heavy.png" />
</p>
</div>
2019-01-21 23:33:23 +01:00
<p>
Plot the ratio between the main transfer function and the coupling term:
</p>
2019-01-21 23:44:33 +01:00
<div class="figure">
<p><img src="Figures/coupling_ration_simscape_light.png" alt="coupling_ration_simscape_light.png" />
</p>
</div>
<div class="figure">
<p><img src="Figures/coupling_ration_simscape_heavy.png" alt="coupling_ration_simscape_heavy.png" />
</p>
2019-01-21 23:33:23 +01:00
</div>
</div>
2019-01-21 23:44:33 +01:00
<div id="outline-container-org5cb3ac6" class="outline-4">
<h4 id="org5cb3ac6"><span class="section-number-4">4.2.1</span> Low rotation speed and High rotation speed</h4>
<div class="outline-text-4" id="text-4-2-1">
2019-01-21 23:33:23 +01:00
<div class="org-src-container">
<pre class="src src-matlab">rot_speed = <span style="color: #D0372D;">2</span><span style="color: #6434A3;">*</span><span style="color: #D0372D;">pi</span><span style="color: #6434A3;">/</span><span style="color: #D0372D;">60</span>; angle_e = <span style="color: #D0372D;">0</span>;
G_low = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span>.<span style="color: #D0372D;">1</span><span style="color: #707183;">)</span>;
rot_speed = <span style="color: #D0372D;">2</span><span style="color: #6434A3;">*</span><span style="color: #D0372D;">pi</span>; angle_e = <span style="color: #D0372D;">0</span>;
G_high = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span>.<span style="color: #D0372D;">1</span><span style="color: #707183;">)</span>;
G_low.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fu', 'Fv'</span><span style="color: #707183;">}</span>;
G_low.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Du', 'Dv'</span><span style="color: #707183;">}</span>;
G_high.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fu', 'Fv'</span><span style="color: #707183;">}</span>;
G_high.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Du', 'Dv'</span><span style="color: #707183;">}</span>;
</pre>
2019-01-18 17:18:02 +01:00
</div>
2019-01-21 23:33:23 +01:00
<div class="org-src-container">
<pre class="src src-matlab"><span style="color: #6434A3;">figure</span>;
bode<span style="color: #707183;">(</span>G_low, G_high<span style="color: #707183;">)</span>;
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgb159f85" class="outline-3">
<h3 id="orgb159f85"><span class="section-number-3">4.3</span> Identification in the fixed frame</h3>
<div class="outline-text-3" id="text-4-3">
2019-01-21 23:33:23 +01:00
<p>
Let's define some options as well as the inputs and outputs for linearization.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Options for Linearized</span>
options = linearizeOptions;
options.SampleTime = <span style="color: #D0372D;">0</span>;
<span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Name of the Simulink File</span>
mdl = <span style="color: #008000;">'rotating_frame'</span>;
<span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Input/Output definition</span>
io<span style="color: #707183;">(</span><span style="color: #D0372D;">1</span><span style="color: #707183;">)</span> = linio<span style="color: #707183;">(</span><span style="color: #7388D6;">[</span>mdl, '<span style="color: #6434A3;">/</span>fx'<span style="color: #7388D6;">]</span>, <span style="color: #D0372D;">1</span>, 'input'<span style="color: #707183;">)</span>;
io<span style="color: #707183;">(</span><span style="color: #D0372D;">2</span><span style="color: #707183;">)</span> = linio<span style="color: #707183;">(</span><span style="color: #7388D6;">[</span>mdl, '<span style="color: #6434A3;">/</span>fy'<span style="color: #7388D6;">]</span>, <span style="color: #D0372D;">1</span>, 'input'<span style="color: #707183;">)</span>;
io<span style="color: #707183;">(</span><span style="color: #D0372D;">3</span><span style="color: #707183;">)</span> = linio<span style="color: #707183;">(</span><span style="color: #7388D6;">[</span>mdl, '<span style="color: #6434A3;">/</span>dx'<span style="color: #7388D6;">]</span>, <span style="color: #D0372D;">1</span>, 'output'<span style="color: #707183;">)</span>;
io<span style="color: #707183;">(</span><span style="color: #D0372D;">4</span><span style="color: #707183;">)</span> = linio<span style="color: #707183;">(</span><span style="color: #7388D6;">[</span>mdl, '<span style="color: #6434A3;">/</span>dy'<span style="color: #7388D6;">]</span>, <span style="color: #D0372D;">1</span>, 'output'<span style="color: #707183;">)</span>;
</pre>
</div>
<p>
We then define the error estimation of the error and the rotational speed.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Run the linearization</span>
angle_e = <span style="color: #D0372D;">0</span>;
rot_speed = <span style="color: #D0372D;">0</span>;
</pre>
</div>
<p>
Finally, we run the linearization.
</p>
<div class="org-src-container">
<pre class="src src-matlab">G = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span><span style="color: #707183;">)</span>;
<span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Input/Output names</span>
G.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fx', 'Fy'</span><span style="color: #707183;">}</span>;
G.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Dx', 'Dy'</span><span style="color: #707183;">}</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Run the linearization</span>
angle_e = <span style="color: #D0372D;">0</span>;
rot_speed = <span style="color: #D0372D;">2</span><span style="color: #6434A3;">*</span><span style="color: #D0372D;">pi</span>;
Gr = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span><span style="color: #707183;">)</span>;
<span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Input/Output names</span>
Gr.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fx', 'Fy'</span><span style="color: #707183;">}</span>;
Gr.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Dx', 'Dy'</span><span style="color: #707183;">}</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Run the linearization</span>
angle_e = <span style="color: #D0372D;">1</span><span style="color: #6434A3;">*</span><span style="color: #D0372D;">2</span><span style="color: #6434A3;">*</span><span style="color: #D0372D;">pi</span><span style="color: #6434A3;">/</span><span style="color: #D0372D;">180</span>;
rot_speed = <span style="color: #D0372D;">2</span><span style="color: #6434A3;">*</span><span style="color: #D0372D;">pi</span>;
Ge = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span><span style="color: #707183;">)</span>;
<span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Input/Output names</span>
Ge.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fx', 'Fy'</span><span style="color: #707183;">}</span>;
Ge.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Dx', 'Dy'</span><span style="color: #707183;">}</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span style="color: #6434A3;">figure</span>;
bode<span style="color: #707183;">(</span>G<span style="color: #707183;">)</span>;
<span style="color: #8D8D84; font-style: italic;">% exportFig('G_x_y', 'wide-tall');</span>
<span style="color: #6434A3;">figure</span>;
bode<span style="color: #707183;">(</span>Ge<span style="color: #707183;">)</span>;
<span style="color: #8D8D84; font-style: italic;">% exportFig('G_x_y_e', 'normal-normal');</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org6b50e4b" class="outline-3">
<h3 id="org6b50e4b"><span class="section-number-3">4.4</span> Identification from actuator forces to displacement in the fixed frame</h3>
<div class="outline-text-3" id="text-4-4">
2019-01-21 23:33:23 +01:00
<div class="org-src-container">
<pre class="src src-matlab"><span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Options for Linearized</span>
options = linearizeOptions;
options.SampleTime = <span style="color: #D0372D;">0</span>;
<span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Name of the Simulink File</span>
mdl = <span style="color: #008000;">'rotating_frame'</span>;
<span style="color: #8D8D84; font-weight: bold; font-style: italic; text-decoration: overline;">%% Input/Output definition</span>
io<span style="color: #707183;">(</span><span style="color: #D0372D;">1</span><span style="color: #707183;">)</span> = linio<span style="color: #707183;">(</span><span style="color: #7388D6;">[</span>mdl, '<span style="color: #6434A3;">/</span>fu'<span style="color: #7388D6;">]</span>, <span style="color: #D0372D;">1</span>, 'input'<span style="color: #707183;">)</span>;
io<span style="color: #707183;">(</span><span style="color: #D0372D;">2</span><span style="color: #707183;">)</span> = linio<span style="color: #707183;">(</span><span style="color: #7388D6;">[</span>mdl, '<span style="color: #6434A3;">/</span>fv'<span style="color: #7388D6;">]</span>, <span style="color: #D0372D;">1</span>, 'input'<span style="color: #707183;">)</span>;
io<span style="color: #707183;">(</span><span style="color: #D0372D;">3</span><span style="color: #707183;">)</span> = linio<span style="color: #707183;">(</span><span style="color: #7388D6;">[</span>mdl, '<span style="color: #6434A3;">/</span>dx'<span style="color: #7388D6;">]</span>, <span style="color: #D0372D;">1</span>, 'output'<span style="color: #707183;">)</span>;
io<span style="color: #707183;">(</span><span style="color: #D0372D;">4</span><span style="color: #707183;">)</span> = linio<span style="color: #707183;">(</span><span style="color: #7388D6;">[</span>mdl, '<span style="color: #6434A3;">/</span>dy'<span style="color: #7388D6;">]</span>, <span style="color: #D0372D;">1</span>, 'output'<span style="color: #707183;">)</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">rot_speed = <span style="color: #D0372D;">2</span><span style="color: #6434A3;">*</span><span style="color: #D0372D;">pi</span>;
angle_e = <span style="color: #D0372D;">0</span>;
G = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span>.<span style="color: #D0372D;">0</span><span style="color: #707183;">)</span>;
G.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fu', 'Fv'</span><span style="color: #707183;">}</span>;
G.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Dx', 'Dy'</span><span style="color: #707183;">}</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">rot_speed = <span style="color: #D0372D;">2</span><span style="color: #6434A3;">*</span><span style="color: #D0372D;">pi</span>;
angle_e = <span style="color: #D0372D;">0</span>;
G1 = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span>.<span style="color: #D0372D;">4</span><span style="color: #707183;">)</span>;
G1.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fu', 'Fv'</span><span style="color: #707183;">}</span>;
G1.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Dx', 'Dy'</span><span style="color: #707183;">}</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">rot_speed = <span style="color: #D0372D;">2</span><span style="color: #6434A3;">*</span><span style="color: #D0372D;">pi</span>;
angle_e = <span style="color: #D0372D;">0</span>;
G2 = linearize<span style="color: #707183;">(</span>mdl, io, <span style="color: #D0372D;">0</span>.<span style="color: #D0372D;">8</span><span style="color: #707183;">)</span>;
G2.InputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Fu', 'Fv'</span><span style="color: #707183;">}</span>;
G2.OutputName = <span style="color: #707183;">{</span><span style="color: #008000;">'Dx', 'Dy'</span><span style="color: #707183;">}</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span style="color: #6434A3;">figure</span>;
bode<span style="color: #707183;">(</span>G, G1, G2<span style="color: #707183;">)</span>;
exportFig<span style="color: #707183;">(</span><span style="color: #008000;">'G_u_v_to_x_y', 'wide-tall'</span><span style="color: #707183;">)</span>;
</pre>
</div>
</div>
</div>
<div id="outline-container-org6a8d002" class="outline-3">
<h3 id="org6a8d002"><span class="section-number-3">4.5</span> Effect of the rotating Speed</h3>
<div class="outline-text-3" id="text-4-5">
2019-01-21 23:33:23 +01:00
<p>
<a id="org5ada9df"></a>
2019-01-21 23:33:23 +01:00
</p>
</div>
<div id="outline-container-org4a07d2b" class="outline-4">
<h4 id="org4a07d2b"><span class="section-number-4">4.5.1</span> <span class="todo TODO">TODO</span> Use realistic parameters for the mass of the sample and stiffness of the X-Y stage</h4>
2019-01-21 23:33:23 +01:00
</div>
<div id="outline-container-org01d22ae" class="outline-4">
<h4 id="org01d22ae"><span class="section-number-4">4.5.2</span> <span class="todo TODO">TODO</span> Check if the plant is changing a lot when we are not turning to when we are turning at the maximum speed (60rpm)</h4>
2019-01-21 23:33:23 +01:00
</div>
</div>
<div id="outline-container-org6cdc442" class="outline-3">
<h3 id="org6cdc442"><span class="section-number-3">4.6</span> Effect of the X-Y stage stiffness</h3>
<div class="outline-text-3" id="text-4-6">
2019-01-21 23:33:23 +01:00
<p>
<a id="org377008c"></a>
2019-01-21 23:33:23 +01:00
</p>
</div>
<div id="outline-container-org74a0c06" class="outline-4">
<h4 id="org74a0c06"><span class="section-number-4">4.6.1</span> <span class="todo TODO">TODO</span> At full speed, check how the coupling changes with the stiffness of the actuators</h4>
2019-01-21 23:33:23 +01:00
</div>
</div>
</div>
<div id="outline-container-orge84791a" class="outline-2">
<h2 id="orge84791a"><span class="section-number-2">5</span> Control Implementation</h2>
2019-01-21 23:33:23 +01:00
<div class="outline-text-2" id="text-5">
2019-01-18 17:18:02 +01:00
<p>
<a id="orgd9942b8"></a>
2019-01-18 17:18:02 +01:00
</p>
</div>
<div id="outline-container-org86d67af" class="outline-3">
<h3 id="org86d67af"><span class="section-number-3">5.1</span> Measurement in the fixed reference frame</h3>
2019-01-18 17:18:02 +01:00
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Thomas Dehaeze</p>
<p class="date">Created: 2019-01-23 mer. 15:21</p>
2019-01-18 17:18:02 +01:00
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
</html>