Transmissibility and Compliance comp IFF/DVF/OL

This commit is contained in:
Thomas Dehaeze 2020-02-27 14:23:09 +01:00
parent 1321d12e4d
commit c1ca4b3b78
18 changed files with 1663 additions and 783 deletions

View File

@ -4,7 +4,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-02-13 jeu. 16:46 --> <!-- 2020-02-27 jeu. 14:16 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Stewart Platform - Decentralized Active Damping</title> <title>Stewart Platform - Decentralized Active Damping</title>
@ -201,30 +201,7 @@
<script src="./js/jquery.stickytableheaders.min.js"></script> <script src="./js/jquery.stickytableheaders.min.js"></script>
<script src="./js/readtheorg.js"></script> <script src="./js/readtheorg.js"></script>
<script type="text/javascript"> <script type="text/javascript">
/* // @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2020 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[/*><!--*/ <!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id) function CodeHighlightOn(elem, id)
{ {
@ -245,6 +222,7 @@ for the JavaScript code in this tag.
target.className = elem.cacheClassTarget; target.className = elem.cacheClassTarget;
} }
/*]]>*///--> /*]]>*///-->
// @license-end
</script> </script>
<script> <script>
MathJax = { MathJax = {
@ -271,25 +249,32 @@ for the JavaScript code in this tag.
<li><a href="#orgd59c804">1. Inertial Control</a> <li><a href="#orgd59c804">1. Inertial Control</a>
<ul> <ul>
<li><a href="#org5f749c8">1.1. Identification of the Dynamics</a></li> <li><a href="#org5f749c8">1.1. Identification of the Dynamics</a></li>
<li><a href="#org07e81b1">1.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li> <li><a href="#orgd637197">1.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li>
<li><a href="#org53a0870">1.3. Obtained Damping</a></li> <li><a href="#orgd895eeb">1.3. Obtained Damping</a></li>
<li><a href="#org51b20eb">1.4. Conclusion</a></li> <li><a href="#orgeaf5ef8">1.4. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org74c7eb4">2. Integral Force Feedback</a> <li><a href="#org74c7eb4">2. Integral Force Feedback</a>
<ul> <ul>
<li><a href="#org9e45139">2.1. Identification of the Dynamics with perfect Joints</a></li> <li><a href="#orgcaa6199">2.1. Identification of the Dynamics with perfect Joints</a></li>
<li><a href="#org494bb35">2.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li> <li><a href="#org1910546">2.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li>
<li><a href="#org947ca92">2.3. Obtained Damping</a></li> <li><a href="#org9e1f2e2">2.3. Obtained Damping</a></li>
<li><a href="#orgade2418">2.4. Conclusion</a></li> <li><a href="#org405813e">2.4. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org08917d6">3. Direct Velocity Feedback</a> <li><a href="#org08917d6">3. Direct Velocity Feedback</a>
<ul> <ul>
<li><a href="#orgcaa6199">3.1. Identification of the Dynamics with perfect Joints</a></li> <li><a href="#org7313778">3.1. Identification of the Dynamics with perfect Joints</a></li>
<li><a href="#orgd637197">3.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li> <li><a href="#org3014959">3.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li>
<li><a href="#orgd895eeb">3.3. Obtained Damping</a></li> <li><a href="#orga144352">3.3. Obtained Damping</a></li>
<li><a href="#orgeaf5ef8">3.4. Conclusion</a></li> <li><a href="#org004b094">3.4. Conclusion</a></li>
</ul>
</li>
<li><a href="#org183f3f2">4. Compliance and Transmissibility Comparison</a>
<ul>
<li><a href="#org0ed1499">4.1. Initialization</a></li>
<li><a href="#orgcd64c04">4.2. Identification</a></li>
<li><a href="#orgd30c62d">4.3. Results</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -343,7 +328,7 @@ stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</spa
</div> </div>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>); <pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'rot_point'</span>, stewart.platform_F.FO_A);
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>); payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
</pre> </pre>
</div> </div>
@ -380,8 +365,8 @@ The transfer function from actuator forces to force sensors is shown in Figure <
</div> </div>
</div> </div>
<div id="outline-container-org07e81b1" class="outline-3"> <div id="outline-container-orgd637197" class="outline-3">
<h3 id="org07e81b1"><span class="section-number-3">1.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3> <h3 id="orgd637197"><span class="section-number-3">1.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
<div class="outline-text-3" id="text-1-2"> <div class="outline-text-3" id="text-1-2">
<p> <p>
We add some stiffness and damping in the flexible joints and we re-identify the dynamics. We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
@ -417,8 +402,8 @@ The new dynamics from force actuator to force sensor is shown in Figure <a href=
</div> </div>
</div> </div>
<div id="outline-container-org53a0870" class="outline-3"> <div id="outline-container-orgd895eeb" class="outline-3">
<h3 id="org53a0870"><span class="section-number-3">1.3</span> Obtained Damping</h3> <h3 id="orgd895eeb"><span class="section-number-3">1.3</span> Obtained Damping</h3>
<div class="outline-text-3" id="text-1-3"> <div class="outline-text-3" id="text-1-3">
<p> <p>
The control is a performed in a decentralized manner. The control is a performed in a decentralized manner.
@ -443,8 +428,8 @@ The root locus is shown in figure <a href="#org9af9e33">3</a>.
</div> </div>
</div> </div>
<div id="outline-container-org51b20eb" class="outline-3"> <div id="outline-container-orgeaf5ef8" class="outline-3">
<h3 id="org51b20eb"><span class="section-number-3">1.4</span> Conclusion</h3> <h3 id="orgeaf5ef8"><span class="section-number-3">1.4</span> Conclusion</h3>
<div class="outline-text-3" id="text-1-4"> <div class="outline-text-3" id="text-1-4">
<div class="important"> <div class="important">
<p> <p>
@ -475,8 +460,8 @@ To run the script, open the Simulink Project, and type <code>run active_damping_
</div> </div>
</div> </div>
<div id="outline-container-org9e45139" class="outline-3"> <div id="outline-container-orgcaa6199" class="outline-3">
<h3 id="org9e45139"><span class="section-number-3">2.1</span> Identification of the Dynamics with perfect Joints</h3> <h3 id="orgcaa6199"><span class="section-number-3">2.1</span> Identification of the Dynamics with perfect Joints</h3>
<div class="outline-text-3" id="text-2-1"> <div class="outline-text-3" id="text-2-1">
<p> <p>
We first initialize the Stewart platform without joint stiffness. We first initialize the Stewart platform without joint stiffness.
@ -497,11 +482,16 @@ stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</spa
</div> </div>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>); <pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'rot_point'</span>, stewart.platform_F.FO_A);
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>); payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
</pre> </pre>
</div> </div>
<div class="org-src-container">
<pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
</pre>
</div>
<p> <p>
And we identify the dynamics from force actuators to force sensors. And we identify the dynamics from force actuators to force sensors.
</p> </p>
@ -537,8 +527,8 @@ The transfer function from actuator forces to force sensors is shown in Figure <
</div> </div>
</div> </div>
<div id="outline-container-org494bb35" class="outline-3"> <div id="outline-container-org1910546" class="outline-3">
<h3 id="org494bb35"><span class="section-number-3">2.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3> <h3 id="org1910546"><span class="section-number-3">2.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
<div class="outline-text-3" id="text-2-2"> <div class="outline-text-3" id="text-2-2">
<p> <p>
We add some stiffness and damping in the flexible joints and we re-identify the dynamics. We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
@ -574,8 +564,8 @@ The new dynamics from force actuator to force sensor is shown in Figure <a href=
</div> </div>
</div> </div>
<div id="outline-container-org947ca92" class="outline-3"> <div id="outline-container-org9e1f2e2" class="outline-3">
<h3 id="org947ca92"><span class="section-number-3">2.3</span> Obtained Damping</h3> <h3 id="org9e1f2e2"><span class="section-number-3">2.3</span> Obtained Damping</h3>
<div class="outline-text-3" id="text-2-3"> <div class="outline-text-3" id="text-2-3">
<p> <p>
The control is a performed in a decentralized manner. The control is a performed in a decentralized manner.
@ -607,8 +597,8 @@ The root locus is shown in figure <a href="#orge21bbea">6</a> and the obtained p
</div> </div>
</div> </div>
<div id="outline-container-orgade2418" class="outline-3"> <div id="outline-container-org405813e" class="outline-3">
<h3 id="orgade2418"><span class="section-number-3">2.4</span> Conclusion</h3> <h3 id="org405813e"><span class="section-number-3">2.4</span> Conclusion</h3>
<div class="outline-text-3" id="text-2-4"> <div class="outline-text-3" id="text-2-4">
<div class="important"> <div class="important">
<p> <p>
@ -640,8 +630,8 @@ To run the script, open the Simulink Project, and type <code>run active_damping_
</div> </div>
</div> </div>
<div id="outline-container-orgcaa6199" class="outline-3"> <div id="outline-container-org7313778" class="outline-3">
<h3 id="orgcaa6199"><span class="section-number-3">3.1</span> Identification of the Dynamics with perfect Joints</h3> <h3 id="org7313778"><span class="section-number-3">3.1</span> Identification of the Dynamics with perfect Joints</h3>
<div class="outline-text-3" id="text-3-1"> <div class="outline-text-3" id="text-3-1">
<p> <p>
We first initialize the Stewart platform without joint stiffness. We first initialize the Stewart platform without joint stiffness.
@ -662,7 +652,7 @@ stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</spa
</div> </div>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>); <pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'rot_point'</span>, stewart.platform_F.FO_A);
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>); payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
</pre> </pre>
</div> </div>
@ -703,8 +693,8 @@ The transfer function from actuator forces to relative motion sensors is shown i
</div> </div>
<div id="outline-container-orgd637197" class="outline-3"> <div id="outline-container-org3014959" class="outline-3">
<h3 id="orgd637197"><span class="section-number-3">3.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3> <h3 id="org3014959"><span class="section-number-3">3.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
<div class="outline-text-3" id="text-3-2"> <div class="outline-text-3" id="text-3-2">
<p> <p>
We add some stiffness and damping in the flexible joints and we re-identify the dynamics. We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
@ -740,8 +730,8 @@ The new dynamics from force actuator to relative motion sensor is shown in Figur
</div> </div>
</div> </div>
<div id="outline-container-orgd895eeb" class="outline-3"> <div id="outline-container-orga144352" class="outline-3">
<h3 id="orgd895eeb"><span class="section-number-3">3.3</span> Obtained Damping</h3> <h3 id="orga144352"><span class="section-number-3">3.3</span> Obtained Damping</h3>
<div class="outline-text-3" id="text-3-3"> <div class="outline-text-3" id="text-3-3">
<p> <p>
The control is a performed in a decentralized manner. The control is a performed in a decentralized manner.
@ -766,14 +756,115 @@ The root locus is shown in figure <a href="#org277d60d">10</a>.
</div> </div>
</div> </div>
<div id="outline-container-orgeaf5ef8" class="outline-3"> <div id="outline-container-org004b094" class="outline-3">
<h3 id="orgeaf5ef8"><span class="section-number-3">3.4</span> Conclusion</h3> <h3 id="org004b094"><span class="section-number-3">3.4</span> Conclusion</h3>
<div class="outline-text-3" id="text-3-4"> <div class="outline-text-3" id="text-3-4">
<div class="important"> <div class="important">
<p> <p>
Joint stiffness does increase the resonance frequencies of the system but does not change the attainable damping when using relative motion sensors. Joint stiffness does increase the resonance frequencies of the system but does not change the attainable damping when using relative motion sensors.
</p> </p>
</div>
</div>
</div>
</div>
<div id="outline-container-org183f3f2" class="outline-2">
<h2 id="org183f3f2"><span class="section-number-2">4</span> Compliance and Transmissibility Comparison</h2>
<div class="outline-text-2" id="text-4">
</div>
<div id="outline-container-org0ed1499" class="outline-3">
<h3 id="org0ed1499"><span class="section-number-3">4.1</span> Initialization</h3>
<div class="outline-text-3" id="text-4-1">
<p>
We first initialize the Stewart platform without joint stiffness.
</p>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
</pre>
</div>
<p>
The rotation point of the ground is located at the origin of frame \(\{A\}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'rot_point'</span>, stewart.platform_F.FO_A);
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgcd64c04" class="outline-3">
<h3 id="orgcd64c04"><span class="section-number-3">4.2</span> Identification</h3>
<div class="outline-text-3" id="text-4-2">
<p>
Let&rsquo;s first identify the transmissibility and compliance in the open-loop case.
</p>
<div class="org-src-container">
<pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
[T_ol, T_norm_ol, freqs] = computeTransmissibility();
[C_ol, C_norm_ol, freqs] = computeCompliance();
</pre>
</div>
<p>
Now, let&rsquo;s identify the transmissibility and compliance for the Integral Force Feedback architecture.
</p>
<div class="org-src-container">
<pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'iff'</span>);
G_iff = (2e4<span class="org-type">/</span>s)<span class="org-type">*</span>eye(6);
[T_iff, T_norm_iff, <span class="org-type">~</span>] = computeTransmissibility();
[C_iff, C_norm_iff, <span class="org-type">~</span>] = computeCompliance();
</pre>
</div>
<p>
And for the Direct Velocity Feedback.
</p>
<div class="org-src-container">
<pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'dvf'</span>);
G_dvf = 1e4<span class="org-type">*</span>s<span class="org-type">/</span>(1<span class="org-type">+</span>s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>5000)<span class="org-type">*</span>eye(6);
[T_dvf, T_norm_dvf, <span class="org-type">~</span>] = computeTransmissibility();
[C_dvf, C_norm_dvf, <span class="org-type">~</span>] = computeCompliance();
</pre>
</div>
</div>
</div>
<div id="outline-container-orgd30c62d" class="outline-3">
<h3 id="orgd30c62d"><span class="section-number-3">4.3</span> Results</h3>
<div class="outline-text-3" id="text-4-3">
<div id="org6691389" class="figure">
<p><img src="figs/transmissibility_iff_dvf.png" alt="transmissibility_iff_dvf.png" />
</p>
<p><span class="figure-number">Figure 11: </span>Obtained transmissibility for Open-Loop Control (Blue), Integral Force Feedback (Red) and Direct Velocity Feedback (Yellow) (<a href="./figs/transmissibility_iff_dvf.png">png</a>, <a href="./figs/transmissibility_iff_dvf.pdf">pdf</a>)</p>
</div>
<div id="orgd29218a" class="figure">
<p><img src="figs/compliance_iff_dvf.png" alt="compliance_iff_dvf.png" />
</p>
<p><span class="figure-number">Figure 12: </span>Obtained compliance for Open-Loop Control (Blue), Integral Force Feedback (Red) and Direct Velocity Feedback (Yellow) (<a href="./figs/compliance_iff_dvf.png">png</a>, <a href="./figs/compliance_iff_dvf.pdf">pdf</a>)</p>
</div>
<div id="org2ee9711" class="figure">
<p><img src="figs/frobenius_norm_T_C_iff_dvf.png" alt="frobenius_norm_T_C_iff_dvf.png" />
</p>
<p><span class="figure-number">Figure 13: </span>Frobenius norm of the Transmissibility and Compliance Matrices (<a href="./figs/frobenius_norm_T_C_iff_dvf.png">png</a>, <a href="./figs/frobenius_norm_T_C_iff_dvf.pdf">pdf</a>)</p>
</div> </div>
</div> </div>
</div> </div>
@ -781,7 +872,7 @@ Joint stiffness does increase the resonance frequencies of the system but does n
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-02-13 jeu. 16:46</p> <p class="date">Created: 2020-02-27 jeu. 14:16</p>
</div> </div>
</body> </body>
</html> </html>

View File

@ -4,7 +4,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-02-13 jeu. 14:51 --> <!-- 2020-02-27 jeu. 14:16 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Stewart Platform - Control Study</title> <title>Stewart Platform - Control Study</title>
@ -201,30 +201,7 @@
<script src="./js/jquery.stickytableheaders.min.js"></script> <script src="./js/jquery.stickytableheaders.min.js"></script>
<script src="./js/readtheorg.js"></script> <script src="./js/readtheorg.js"></script>
<script type="text/javascript"> <script type="text/javascript">
/* // @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2020 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[/*><!--*/ <!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id) function CodeHighlightOn(elem, id)
{ {
@ -245,6 +222,7 @@ for the JavaScript code in this tag.
target.className = elem.cacheClassTarget; target.className = elem.cacheClassTarget;
} }
/*]]>*///--> /*]]>*///-->
// @license-end
</script> </script>
<script> <script>
MathJax = { MathJax = {
@ -277,6 +255,18 @@ for the JavaScript code in this tag.
<li><a href="#orga9fb0f5">1.5. Controller Design</a></li> <li><a href="#orga9fb0f5">1.5. Controller Design</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org1ce6b23">2. Functions</a>
<ul>
<li><a href="#org9b036f8">2.1. <code>initializeController</code>: Initialize the Controller</a>
<ul>
<li><a href="#org89608d1">Function description</a></li>
<li><a href="#orgb457316">Optional Parameters</a></li>
<li><a href="#orgad0bd08">Structure initialization</a></li>
<li><a href="#org05c3878">Add Type</a></li>
</ul>
</li>
</ul>
</li>
</ul> </ul>
</div> </div>
</div> </div>
@ -387,10 +377,79 @@ Kl = Kl <span class="org-type">*</span> eye(6);
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-org1ce6b23" class="outline-2">
<h2 id="org1ce6b23"><span class="section-number-2">2</span> Functions</h2>
<div class="outline-text-2" id="text-2">
</div>
<div id="outline-container-org9b036f8" class="outline-3">
<h3 id="org9b036f8"><span class="section-number-3">2.1</span> <code>initializeController</code>: Initialize the Controller</h3>
<div class="outline-text-3" id="text-2-1">
<p>
<a id="org339969f"></a>
</p>
</div>
<div id="outline-container-org89608d1" class="outline-4">
<h4 id="org89608d1">Function description</h4>
<div class="outline-text-4" id="text-org89608d1">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[controller]</span> = <span class="org-function-name">initializeController</span>(<span class="org-variable-name">args</span>)
<span class="org-comment">% initializeController - Initialize the Controller</span>
<span class="org-comment">%</span>
<span class="org-comment">% Syntax: [] = initializeController(args)</span>
<span class="org-comment">%</span>
<span class="org-comment">% Inputs:</span>
<span class="org-comment">% - args - Can have the following fields:</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb457316" class="outline-4">
<h4 id="orgb457316">Optional Parameters</h4>
<div class="outline-text-4" id="text-orgb457316">
<div class="org-src-container">
<pre class="src src-matlab">arguments
args.type char {mustBeMember(args.type, {<span class="org-string">'open-loop'</span>, <span class="org-string">'iff'</span>, <span class="org-string">'dvf'</span>})} = <span class="org-string">'open-loop'</span>
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgad0bd08" class="outline-4">
<h4 id="orgad0bd08">Structure initialization</h4>
<div class="outline-text-4" id="text-orgad0bd08">
<div class="org-src-container">
<pre class="src src-matlab">controller = struct();
</pre>
</div>
</div>
</div>
<div id="outline-container-org05c3878" class="outline-4">
<h4 id="org05c3878">Add Type</h4>
<div class="outline-text-4" id="text-org05c3878">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'open-loop'</span>
controller.type = 0;
<span class="org-keyword">case</span> <span class="org-string">'iff'</span>
controller.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'dvf'</span>
controller.type = 2;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
</div>
</div>
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-02-13 jeu. 14:51</p> <p class="date">Created: 2020-02-27 jeu. 14:16</p>
</div> </div>
</body> </body>
</html> </html>

View File

@ -4,7 +4,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-02-14 ven. 14:11 --> <!-- 2020-02-27 jeu. 14:16 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Cubic configuration for the Stewart Platform</title> <title>Cubic configuration for the Stewart Platform</title>
@ -201,30 +201,7 @@
<script src="./js/jquery.stickytableheaders.min.js"></script> <script src="./js/jquery.stickytableheaders.min.js"></script>
<script src="./js/readtheorg.js"></script> <script src="./js/readtheorg.js"></script>
<script type="text/javascript"> <script type="text/javascript">
/* // @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2020 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[/*><!--*/ <!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id) function CodeHighlightOn(elem, id)
{ {
@ -245,6 +222,7 @@ for the JavaScript code in this tag.
target.className = elem.cacheClassTarget; target.className = elem.cacheClassTarget;
} }
/*]]>*///--> /*]]>*///-->
// @license-end
</script> </script>
<script> <script>
MathJax = { MathJax = {
@ -274,33 +252,33 @@ for the JavaScript code in this tag.
<li><a href="#orga88e79a">1.2. Cubic Stewart platform centered with the cube center - Jacobian not estimated at the cube center</a></li> <li><a href="#orga88e79a">1.2. Cubic Stewart platform centered with the cube center - Jacobian not estimated at the cube center</a></li>
<li><a href="#orge02ec88">1.3. Cubic Stewart platform not centered with the cube center - Jacobian estimated at the cube center</a></li> <li><a href="#orge02ec88">1.3. Cubic Stewart platform not centered with the cube center - Jacobian estimated at the cube center</a></li>
<li><a href="#org43fd7e4">1.4. Cubic Stewart platform not centered with the cube center - Jacobian estimated at the Stewart platform center</a></li> <li><a href="#org43fd7e4">1.4. Cubic Stewart platform not centered with the cube center - Jacobian estimated at the Stewart platform center</a></li>
<li><a href="#orgbde7788">1.5. Conclusion</a></li> <li><a href="#orgd6c60aa">1.5. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#orgd70418b">2. Configuration with the Cube&rsquo;s center above the mobile platform</a> <li><a href="#orgd70418b">2. Configuration with the Cube&rsquo;s center above the mobile platform</a>
<ul> <ul>
<li><a href="#org8afa645">2.1. Having Cube&rsquo;s center above the top platform</a></li> <li><a href="#org8afa645">2.1. Having Cube&rsquo;s center above the top platform</a></li>
<li><a href="#orgc0314ec">2.2. Conclusion</a></li> <li><a href="#org78f0f9c">2.2. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#orgcc4ecce">3. Cubic size analysis</a> <li><a href="#orgcc4ecce">3. Cubic size analysis</a>
<ul> <ul>
<li><a href="#org0029d8c">3.1. Analysis</a></li> <li><a href="#org0029d8c">3.1. Analysis</a></li>
<li><a href="#orgb3ca361">3.2. Conclusion</a></li> <li><a href="#org53a1ab8">3.2. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#orgf09da67">4. Dynamic Coupling in the Cartesian Frame</a> <li><a href="#orgf09da67">4. Dynamic Coupling in the Cartesian Frame</a>
<ul> <ul>
<li><a href="#org5fe01ec">4.1. Cube&rsquo;s center at the Center of Mass of the mobile platform</a></li> <li><a href="#org5fe01ec">4.1. Cube&rsquo;s center at the Center of Mass of the mobile platform</a></li>
<li><a href="#org4cb2a36">4.2. Cube&rsquo;s center not coincident with the Mass of the Mobile platform</a></li> <li><a href="#org4cb2a36">4.2. Cube&rsquo;s center not coincident with the Mass of the Mobile platform</a></li>
<li><a href="#orge33568e">4.3. Conclusion</a></li> <li><a href="#orga0d81dc">4.3. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org8f26dc0">5. Dynamic Coupling between actuators and sensors of each strut</a> <li><a href="#org8f26dc0">5. Dynamic Coupling between actuators and sensors of each strut</a>
<ul> <ul>
<li><a href="#org6e391c9">5.1. Coupling between the actuators and sensors - Cubic Architecture</a></li> <li><a href="#org6e391c9">5.1. Coupling between the actuators and sensors - Cubic Architecture</a></li>
<li><a href="#orgafd808d">5.2. Coupling between the actuators and sensors - Non-Cubic Architecture</a></li> <li><a href="#orgafd808d">5.2. Coupling between the actuators and sensors - Non-Cubic Architecture</a></li>
<li><a href="#org1a90044">5.3. Conclusion</a></li> <li><a href="#org3e2b41c">5.3. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org3044455">6. Functions</a> <li><a href="#org3044455">6. Functions</a>
@ -848,8 +826,8 @@ stewart = initializeCylindricalPlatforms(stewart, <span class="org-string">'Fpr'
</div> </div>
</div> </div>
<div id="outline-container-orgbde7788" class="outline-3"> <div id="outline-container-orgd6c60aa" class="outline-3">
<h3 id="orgbde7788"><span class="section-number-3">1.5</span> Conclusion</h3> <h3 id="orgd6c60aa"><span class="section-number-3">1.5</span> Conclusion</h3>
<div class="outline-text-3" id="text-1-5"> <div class="outline-text-3" id="text-1-5">
<div class="important"> <div class="important">
<p> <p>
@ -1186,8 +1164,8 @@ FOc = H <span class="org-type">+</span> MO_B; <span class="org-comment">% Cente
</div> </div>
</div> </div>
<div id="outline-container-orgc0314ec" class="outline-3"> <div id="outline-container-org78f0f9c" class="outline-3">
<h3 id="orgc0314ec"><span class="section-number-3">2.2</span> Conclusion</h3> <h3 id="org78f0f9c"><span class="section-number-3">2.2</span> Conclusion</h3>
<div class="outline-text-3" id="text-2-2"> <div class="outline-text-3" id="text-2-2">
<div class="important"> <div class="important">
<p> <p>
@ -1273,8 +1251,8 @@ We also find that \(k_{\theta_x} = k_{\theta_y}\) and \(k_{\theta_z}\) are varyi
</div> </div>
</div> </div>
<div id="outline-container-orgb3ca361" class="outline-3"> <div id="outline-container-org53a1ab8" class="outline-3">
<h3 id="orgb3ca361"><span class="section-number-3">3.2</span> Conclusion</h3> <h3 id="org53a1ab8"><span class="section-number-3">3.2</span> Conclusion</h3>
<div class="outline-text-3" id="text-3-2"> <div class="outline-text-3" id="text-3-2">
<p> <p>
We observe that \(k_{\theta_x} = k_{\theta_y}\) and \(k_{\theta_z}\) increase linearly with the cube size. We observe that \(k_{\theta_x} = k_{\theta_y}\) and \(k_{\theta_z}\) increase linearly with the cube size.
@ -1629,8 +1607,8 @@ This was expected as the mass matrix is not diagonal (the Center of Mass of the
</div> </div>
</div> </div>
<div id="outline-container-orge33568e" class="outline-3"> <div id="outline-container-orga0d81dc" class="outline-3">
<h3 id="orge33568e"><span class="section-number-3">4.3</span> Conclusion</h3> <h3 id="orga0d81dc"><span class="section-number-3">4.3</span> Conclusion</h3>
<div class="outline-text-3" id="text-4-3"> <div class="outline-text-3" id="text-4-3">
<div class="important"> <div class="important">
<p> <p>
@ -1812,8 +1790,8 @@ And we identify the dynamics from the actuator forces \(\tau_{i}\) to the relati
</div> </div>
</div> </div>
<div id="outline-container-org1a90044" class="outline-3"> <div id="outline-container-org3e2b41c" class="outline-3">
<h3 id="org1a90044"><span class="section-number-3">5.3</span> Conclusion</h3> <h3 id="org3e2b41c"><span class="section-number-3">5.3</span> Conclusion</h3>
<div class="outline-text-3" id="text-5-3"> <div class="outline-text-3" id="text-5-3">
<div class="important"> <div class="important">
<p> <p>
@ -1984,7 +1962,7 @@ stewart.platform_M.Mb = Mb;
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-02-14 ven. 14:11</p> <p class="date">Created: 2020-02-27 jeu. 14:16</p>
</div> </div>
</body> </body>
</html> </html>

View File

@ -4,7 +4,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-02-14 ven. 14:11 --> <!-- 2020-02-27 jeu. 14:16 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Stewart Platform - Dynamics Study</title> <title>Stewart Platform - Dynamics Study</title>
@ -201,30 +201,7 @@
<script src="./js/jquery.stickytableheaders.min.js"></script> <script src="./js/jquery.stickytableheaders.min.js"></script>
<script src="./js/readtheorg.js"></script> <script src="./js/readtheorg.js"></script>
<script type="text/javascript"> <script type="text/javascript">
/* // @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2020 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[/*><!--*/ <!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id) function CodeHighlightOn(elem, id)
{ {
@ -245,6 +222,7 @@ for the JavaScript code in this tag.
target.className = elem.cacheClassTarget; target.className = elem.cacheClassTarget;
} }
/*]]>*///--> /*]]>*///-->
// @license-end
</script> </script>
<script> <script>
MathJax = { MathJax = {
@ -272,13 +250,13 @@ for the JavaScript code in this tag.
<ul> <ul>
<li><a href="#org4509b7d">1.1. Comparison with fixed support</a></li> <li><a href="#org4509b7d">1.1. Comparison with fixed support</a></li>
<li><a href="#org8662186">1.2. Comparison with a flexible support</a></li> <li><a href="#org8662186">1.2. Comparison with a flexible support</a></li>
<li><a href="#org1cbdf9a">1.3. Conclusion</a></li> <li><a href="#org03b2957">1.3. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org81ab204">2. Comparison of the static transfer function and the Compliance matrix</a> <li><a href="#org81ab204">2. Comparison of the static transfer function and the Compliance matrix</a>
<ul> <ul>
<li><a href="#orge7e7242">2.1. Analysis</a></li> <li><a href="#orge7e7242">2.1. Analysis</a></li>
<li><a href="#org03b2957">2.2. Conclusion</a></li> <li><a href="#org920d3c4">2.2. Conclusion</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -463,8 +441,8 @@ And thus \(\mathcal{F}_{x}\) and \(\mathcal{F}_{x,\text{ext}}\) have clearly <b>
</div> </div>
<div id="outline-container-org1cbdf9a" class="outline-3"> <div id="outline-container-org03b2957" class="outline-3">
<h3 id="org1cbdf9a"><span class="section-number-3">1.3</span> Conclusion</h3> <h3 id="org03b2957"><span class="section-number-3">1.3</span> Conclusion</h3>
<div class="outline-text-3" id="text-1-3"> <div class="outline-text-3" id="text-1-3">
<div class="important"> <div class="important">
<p> <p>
@ -525,11 +503,6 @@ options.SampleTime = 0;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span> <span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = <span class="org-string">'stewart_platform_model'</span>; mdl = <span class="org-string">'stewart_platform_model'</span>;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1;
io(io_i) = linio([mdl, <span class="org-string">'/F'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1;
io(io_i) = linio([mdl, <span class="org-string">'/X'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span> <span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span> io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
@ -702,8 +675,8 @@ And now at the Compliance matrix.
</div> </div>
</div> </div>
<div id="outline-container-org03b2957" class="outline-3"> <div id="outline-container-org920d3c4" class="outline-3">
<h3 id="org03b2957"><span class="section-number-3">2.2</span> Conclusion</h3> <h3 id="org920d3c4"><span class="section-number-3">2.2</span> Conclusion</h3>
<div class="outline-text-3" id="text-2-2"> <div class="outline-text-3" id="text-2-2">
<div class="important"> <div class="important">
<p> <p>
@ -717,7 +690,7 @@ The low frequency transfer function matrix from \(\mathcal{\bm{F}}\) to \(\mathc
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-02-14 ven. 14:11</p> <p class="date">Created: 2020-02-27 jeu. 14:16</p>
</div> </div>
</body> </body>
</html> </html>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

View File

@ -4,7 +4,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-02-13 jeu. 15:44 --> <!-- 2020-02-27 jeu. 14:16 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Identification of the Stewart Platform using Simscape</title> <title>Identification of the Stewart Platform using Simscape</title>
@ -201,30 +201,7 @@
<script src="./js/jquery.stickytableheaders.min.js"></script> <script src="./js/jquery.stickytableheaders.min.js"></script>
<script src="./js/readtheorg.js"></script> <script src="./js/readtheorg.js"></script>
<script type="text/javascript"> <script type="text/javascript">
/* // @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2020 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[/*><!--*/ <!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id) function CodeHighlightOn(elem, id)
{ {
@ -245,6 +222,7 @@ for the JavaScript code in this tag.
target.className = elem.cacheClassTarget; target.className = elem.cacheClassTarget;
} }
/*]]>*///--> /*]]>*///-->
// @license-end
</script> </script>
<script> <script>
MathJax = { MathJax = {
@ -277,13 +255,58 @@ for the JavaScript code in this tag.
<li><a href="#orge7b97c8">1.5. Visualizing the modes</a></li> <li><a href="#orge7b97c8">1.5. Visualizing the modes</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org2891722">2. Transmissibility Analysis</a>
<ul>
<li><a href="#org8c667e9">2.1. Initialize the Stewart platform</a></li>
<li><a href="#org5338f20">2.2. Transmissibility</a></li>
</ul>
</li>
<li><a href="#orgc94edbd">3. Compliance Analysis</a>
<ul>
<li><a href="#orgc8e1f51">3.1. Initialize the Stewart platform</a></li>
<li><a href="#org1177029">3.2. Compliance</a></li>
</ul>
</li>
<li><a href="#org68ca336">4. Functions</a>
<ul>
<li><a href="#org487c4d4">4.1. Compute the Transmissibility</a>
<ul>
<li><a href="#org851f84d">Function description</a></li>
<li><a href="#orgf5e24cd">Optional Parameters</a></li>
<li><a href="#org4629501">Identification of the Transmissibility Matrix</a></li>
<li><a href="#org989379a">Computation of the Frobenius norm</a></li>
</ul>
</li>
<li><a href="#org50e35a6">4.2. Compute the Compliance</a>
<ul>
<li><a href="#org64fc1e2">Function description</a></li>
<li><a href="#org54cab00">Optional Parameters</a></li>
<li><a href="#orgef06b63">Identification of the Compliance Matrix</a></li>
<li><a href="#org6f63d37">Computation of the Frobenius norm</a></li>
</ul>
</li>
</ul>
</li>
</ul> </ul>
</div> </div>
</div> </div>
<p>
In this document, we discuss the various methods to identify the behavior of the Stewart platform.
</p>
<ul class="org-ul">
<li><a href="#org7981e88">1</a></li>
<li><a href="#orga989615">2</a></li>
<li><a href="#org4579374">3</a></li>
</ul>
<div id="outline-container-orgcb2f4c2" class="outline-2"> <div id="outline-container-orgcb2f4c2" class="outline-2">
<h2 id="orgcb2f4c2"><span class="section-number-2">1</span> Modal Analysis of the Stewart Platform</h2> <h2 id="orgcb2f4c2"><span class="section-number-2">1</span> Modal Analysis of the Stewart Platform</h2>
<div class="outline-text-2" id="text-1"> <div class="outline-text-2" id="text-1">
<p>
<a id="org7981e88"></a>
</p>
</div> </div>
<div id="outline-container-org66d09e9" class="outline-3"> <div id="outline-container-org66d09e9" class="outline-3">
<h3 id="org66d09e9"><span class="section-number-3">1.1</span> Initialize the Stewart Platform</h3> <h3 id="org66d09e9"><span class="section-number-3">1.1</span> Initialize the Stewart Platform</h3>
@ -577,10 +600,521 @@ Save the movie of the mode shape.
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-org2891722" class="outline-2">
<h2 id="org2891722"><span class="section-number-2">2</span> Transmissibility Analysis</h2>
<div class="outline-text-2" id="text-2">
<p>
<a id="orga989615"></a>
</p>
</div>
<div id="outline-container-org8c667e9" class="outline-3">
<h3 id="org8c667e9"><span class="section-number-3">2.1</span> Initialize the Stewart platform</h3>
<div class="outline-text-3" id="text-2-1">
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'accelerometer'</span>, <span class="org-string">'freq'</span>, 5e3);
</pre>
</div>
<p>
We set the rotation point of the ground to be at the same point at frames \(\{A\}\) and \(\{B\}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'rot_point'</span>, stewart.platform_F.FO_A);
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org5338f20" class="outline-3">
<h3 id="org5338f20"><span class="section-number-3">2.2</span> Transmissibility</h3>
<div class="outline-text-3" id="text-2-2">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
options = linearizeOptions;
options.SampleTime = 0;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = <span class="org-string">'stewart_platform_model'</span>;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1;
io(io_i) = linio([mdl, <span class="org-string">'/Disturbances/D_w'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Base Motion [m, rad]</span>
io(io_i) = linio([mdl, <span class="org-string">'/Absolute Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Absolute Motion [m, rad]</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
T = linearize(mdl, io, options);
T.InputName = {<span class="org-string">'Wdx'</span>, <span class="org-string">'Wdy'</span>, <span class="org-string">'Wdz'</span>, <span class="org-string">'Wrx'</span>, <span class="org-string">'Wry'</span>, <span class="org-string">'Wrz'</span>};
T.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">freqs = logspace(1, 4, 1000);
<span class="org-type">figure</span>;
<span class="org-keyword">for</span> <span class="org-variable-name">ix</span> = <span class="org-constant">1:6</span>
<span class="org-keyword">for</span> <span class="org-variable-name">iy</span> = <span class="org-constant">1:6</span>
subplot(6, 6, (ix<span class="org-type">-</span>1)<span class="org-type">*</span>6 <span class="org-type">+</span> iy);
hold on;
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, <span class="org-string">'Hz'</span>))), <span class="org-string">'k-'</span>);
<span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'XScale'</span>, <span class="org-string">'log'</span>); <span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'YScale'</span>, <span class="org-string">'log'</span>);
ylim([1e<span class="org-type">-</span>5, 10]);
xlim([freqs(1), freqs(end)]);
<span class="org-keyword">if</span> ix <span class="org-type">&lt;</span> 6
xticklabels({});
<span class="org-keyword">end</span>
<span class="org-keyword">if</span> iy <span class="org-type">&gt;</span> 1
yticklabels({});
<span class="org-keyword">end</span>
<span class="org-keyword">end</span>
<span class="org-keyword">end</span>
</pre>
</div>
<p>
From <a class='org-ref-reference' href="#preumont07_six_axis_singl_stage_activ">preumont07_six_axis_singl_stage_activ</a>, one can use the Frobenius norm of the transmissibility matrix to obtain a scalar indicator of the transmissibility performance of the system:
</p>
\begin{align*}
\| \bm{T}(\omega) \| &= \sqrt{\text{Trace}[\bm{T}(\omega) \bm{T}(\omega)^H]}\\
&= \sqrt{\Sigma_{i=1}^6 \Sigma_{j=1}^6 |T_{ij}|^2}
\end{align*}
<div class="org-src-container">
<pre class="src src-matlab">freqs = logspace(1, 4, 1000);
T_norm = zeros(length(freqs), 1);
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(freqs)</span>
T_norm(<span class="org-constant">i</span>) = sqrt(trace(freqresp(T, freqs(<span class="org-constant">i</span>), <span class="org-string">'Hz'</span>)<span class="org-type">*</span>freqresp(T, freqs(<span class="org-constant">i</span>), <span class="org-string">'Hz'</span>)<span class="org-type">'</span>));
<span class="org-keyword">end</span>
</pre>
</div>
<p>
And we normalize by a factor \(\sqrt{6}\) to obtain a performance metric comparable to the transmissibility of a one-axis isolator:
\[ \Gamma(\omega) = \|\bm{T}(\omega)\| / \sqrt{6} \]
</p>
<div class="org-src-container">
<pre class="src src-matlab">Gamma = T_norm<span class="org-type">/</span>sqrt(6);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-type">figure</span>;
plot(freqs, Gamma)
<span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'XScale'</span>, <span class="org-string">'log'</span>); <span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'YScale'</span>, <span class="org-string">'log'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgc94edbd" class="outline-2">
<h2 id="orgc94edbd"><span class="section-number-2">3</span> Compliance Analysis</h2>
<div class="outline-text-2" id="text-3">
<p>
<a id="org4579374"></a>
</p>
</div>
<div id="outline-container-orgc8e1f51" class="outline-3">
<h3 id="orgc8e1f51"><span class="section-number-3">3.1</span> Initialize the Stewart platform</h3>
<div class="outline-text-3" id="text-3-1">
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'accelerometer'</span>, <span class="org-string">'freq'</span>, 5e3);
</pre>
</div>
<p>
We set the rotation point of the ground to be at the same point at frames \(\{A\}\) and \(\{B\}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org1177029" class="outline-3">
<h3 id="org1177029"><span class="section-number-3">3.2</span> Compliance</h3>
<div class="outline-text-3" id="text-3-2">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
options = linearizeOptions;
options.SampleTime = 0;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = <span class="org-string">'stewart_platform_model'</span>;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1;
io(io_i) = linio([mdl, <span class="org-string">'/Disturbances/F_ext'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Base Motion [m, rad]</span>
io(io_i) = linio([mdl, <span class="org-string">'/Absolute Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Absolute Motion [m, rad]</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
C = linearize(mdl, io, options);
C.InputName = {<span class="org-string">'Fdx'</span>, <span class="org-string">'Fdy'</span>, <span class="org-string">'Fdz'</span>, <span class="org-string">'Mdx'</span>, <span class="org-string">'Mdy'</span>, <span class="org-string">'Mdz'</span>};
C.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">freqs = logspace(1, 4, 1000);
<span class="org-type">figure</span>;
<span class="org-keyword">for</span> <span class="org-variable-name">ix</span> = <span class="org-constant">1:6</span>
<span class="org-keyword">for</span> <span class="org-variable-name">iy</span> = <span class="org-constant">1:6</span>
subplot(6, 6, (ix<span class="org-type">-</span>1)<span class="org-type">*</span>6 <span class="org-type">+</span> iy);
hold on;
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, <span class="org-string">'Hz'</span>))), <span class="org-string">'k-'</span>);
<span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'XScale'</span>, <span class="org-string">'log'</span>); <span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'YScale'</span>, <span class="org-string">'log'</span>);
ylim([1e<span class="org-type">-</span>10, 1e<span class="org-type">-</span>3]);
xlim([freqs(1), freqs(end)]);
<span class="org-keyword">if</span> ix <span class="org-type">&lt;</span> 6
xticklabels({});
<span class="org-keyword">end</span>
<span class="org-keyword">if</span> iy <span class="org-type">&gt;</span> 1
yticklabels({});
<span class="org-keyword">end</span>
<span class="org-keyword">end</span>
<span class="org-keyword">end</span>
</pre>
</div>
<p>
We can try to use the Frobenius norm to obtain a scalar value representing the 6-dof compliance of the Stewart platform.
</p>
<div class="org-src-container">
<pre class="src src-matlab">freqs = logspace(1, 4, 1000);
C_norm = zeros(length(freqs), 1);
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(freqs)</span>
C_norm(<span class="org-constant">i</span>) = sqrt(trace(freqresp(C, freqs(<span class="org-constant">i</span>), <span class="org-string">'Hz'</span>)<span class="org-type">*</span>freqresp(C, freqs(<span class="org-constant">i</span>), <span class="org-string">'Hz'</span>)<span class="org-type">'</span>));
<span class="org-keyword">end</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-type">figure</span>;
plot(freqs, C_norm)
<span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'XScale'</span>, <span class="org-string">'log'</span>); <span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'YScale'</span>, <span class="org-string">'log'</span>);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org68ca336" class="outline-2">
<h2 id="org68ca336"><span class="section-number-2">4</span> Functions</h2>
<div class="outline-text-2" id="text-4">
</div>
<div id="outline-container-org487c4d4" class="outline-3">
<h3 id="org487c4d4"><span class="section-number-3">4.1</span> Compute the Transmissibility</h3>
<div class="outline-text-3" id="text-4-1">
<p>
<a id="orgbca579c"></a>
</p>
</div>
<div id="outline-container-org851f84d" class="outline-4">
<h4 id="org851f84d">Function description</h4>
<div class="outline-text-4" id="text-org851f84d">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[T, T_norm, freqs]</span> = <span class="org-function-name">computeTransmissibility</span>(<span class="org-variable-name">args</span>)
<span class="org-comment">% computeTransmissibility -</span>
<span class="org-comment">%</span>
<span class="org-comment">% Syntax: [T, T_norm, freqs] = computeTransmissibility(args)</span>
<span class="org-comment">%</span>
<span class="org-comment">% Inputs:</span>
<span class="org-comment">% - args - Structure with the following fields:</span>
<span class="org-comment">% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm</span>
<span class="org-comment">% - freqs [] - Frequency vector to estimate the Frobenius norm</span>
<span class="org-comment">%</span>
<span class="org-comment">% Outputs:</span>
<span class="org-comment">% - T [6x6 ss] - Transmissibility matrix</span>
<span class="org-comment">% - T_norm [length(freqs)x1] - Frobenius norm of the Transmissibility matrix</span>
<span class="org-comment">% - freqs [length(freqs)x1] - Frequency vector in [Hz]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf5e24cd" class="outline-4">
<h4 id="orgf5e24cd">Optional Parameters</h4>
<div class="outline-text-4" id="text-orgf5e24cd">
<div class="org-src-container">
<pre class="src src-matlab">arguments
args.plots logical {mustBeNumericOrLogical} = <span class="org-constant">false</span>
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
<span class="org-keyword">end</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">freqs = args.freqs;
</pre>
</div>
</div>
</div>
<div id="outline-container-org4629501" class="outline-4">
<h4 id="org4629501">Identification of the Transmissibility Matrix</h4>
<div class="outline-text-4" id="text-org4629501">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
options = linearizeOptions;
options.SampleTime = 0;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = <span class="org-string">'stewart_platform_model'</span>;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1;
io(io_i) = linio([mdl, <span class="org-string">'/Disturbances/D_w'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Base Motion [m, rad]</span>
io(io_i) = linio([mdl, <span class="org-string">'/Absolute Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Absolute Motion [m, rad]</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
T = linearize(mdl, io, options);
T.InputName = {<span class="org-string">'Wdx'</span>, <span class="org-string">'Wdy'</span>, <span class="org-string">'Wdz'</span>, <span class="org-string">'Wrx'</span>, <span class="org-string">'Wry'</span>, <span class="org-string">'Wrz'</span>};
T.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
</pre>
</div>
<p>
If wanted, the 6x6 transmissibility matrix is plotted.
</p>
<div class="org-src-container">
<pre class="src src-matlab">p_handle = zeros(6<span class="org-type">*</span>6,1);
<span class="org-keyword">if</span> args.plots
fig = <span class="org-type">figure</span>;
<span class="org-keyword">for</span> <span class="org-variable-name">ix</span> = <span class="org-constant">1:6</span>
<span class="org-keyword">for</span> <span class="org-variable-name">iy</span> = <span class="org-constant">1:6</span>
p_handle((ix<span class="org-type">-</span>1)<span class="org-type">*</span>6 <span class="org-type">+</span> iy) = subplot(6, 6, (ix<span class="org-type">-</span>1)<span class="org-type">*</span>6 <span class="org-type">+</span> iy);
hold on;
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, <span class="org-string">'Hz'</span>))), <span class="org-string">'k-'</span>);
<span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'XScale'</span>, <span class="org-string">'log'</span>); <span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'YScale'</span>, <span class="org-string">'log'</span>);
<span class="org-keyword">if</span> ix <span class="org-type">&lt;</span> 6
xticklabels({});
<span class="org-keyword">end</span>
<span class="org-keyword">if</span> iy <span class="org-type">&gt;</span> 1
yticklabels({});
<span class="org-keyword">end</span>
<span class="org-keyword">end</span>
<span class="org-keyword">end</span>
linkaxes(p_handle, <span class="org-string">'xy'</span>)
xlim([freqs(1), freqs(end)]);
ylim([1e<span class="org-type">-</span>5, 1e2]);
han = <span class="org-type">axes</span>(fig, <span class="org-string">'visible'</span>, <span class="org-string">'off'</span>);
han.XLabel.Visible = <span class="org-string">'on'</span>;
han.YLabel.Visible = <span class="org-string">'on'</span>;
ylabel(han, <span class="org-string">'Frequency [Hz]'</span>);
xlabel(han, <span class="org-string">'Transmissibility [m/m]'</span>);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org989379a" class="outline-4">
<h4 id="org989379a">Computation of the Frobenius norm</h4>
<div class="outline-text-4" id="text-org989379a">
<div class="org-src-container">
<pre class="src src-matlab">T_norm = zeros(length(freqs), 1);
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(freqs)</span>
T_norm(<span class="org-constant">i</span>) = sqrt(trace(freqresp(T, freqs(<span class="org-constant">i</span>), <span class="org-string">'Hz'</span>)<span class="org-type">*</span>freqresp(T, freqs(<span class="org-constant">i</span>), <span class="org-string">'Hz'</span>)<span class="org-type">'</span>));
<span class="org-keyword">end</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">T_norm = T_norm<span class="org-type">/</span>sqrt(6);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.plots
<span class="org-type">figure</span>;
plot(freqs, T_norm)
<span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'XScale'</span>, <span class="org-string">'log'</span>); <span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'YScale'</span>, <span class="org-string">'log'</span>);
xlabel(<span class="org-string">'Frequency [Hz]'</span>);
ylabel(<span class="org-string">'Transmissibility - Frobenius Norm'</span>);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org50e35a6" class="outline-3">
<h3 id="org50e35a6"><span class="section-number-3">4.2</span> Compute the Compliance</h3>
<div class="outline-text-3" id="text-4-2">
<p>
<a id="org0a73574"></a>
</p>
</div>
<div id="outline-container-org64fc1e2" class="outline-4">
<h4 id="org64fc1e2">Function description</h4>
<div class="outline-text-4" id="text-org64fc1e2">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[C, C_norm, freqs]</span> = <span class="org-function-name">computeCompliance</span>(<span class="org-variable-name">args</span>)
<span class="org-comment">% computeCompliance -</span>
<span class="org-comment">%</span>
<span class="org-comment">% Syntax: [C, C_norm, freqs] = computeCompliance(args)</span>
<span class="org-comment">%</span>
<span class="org-comment">% Inputs:</span>
<span class="org-comment">% - args - Structure with the following fields:</span>
<span class="org-comment">% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm</span>
<span class="org-comment">% - freqs [] - Frequency vector to estimate the Frobenius norm</span>
<span class="org-comment">%</span>
<span class="org-comment">% Outputs:</span>
<span class="org-comment">% - C [6x6 ss] - Compliance matrix</span>
<span class="org-comment">% - C_norm [length(freqs)x1] - Frobenius norm of the Compliance matrix</span>
<span class="org-comment">% - freqs [length(freqs)x1] - Frequency vector in [Hz]</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org54cab00" class="outline-4">
<h4 id="org54cab00">Optional Parameters</h4>
<div class="outline-text-4" id="text-org54cab00">
<div class="org-src-container">
<pre class="src src-matlab">arguments
args.plots logical {mustBeNumericOrLogical} = <span class="org-constant">false</span>
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
<span class="org-keyword">end</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">freqs = args.freqs;
</pre>
</div>
</div>
</div>
<div id="outline-container-orgef06b63" class="outline-4">
<h4 id="orgef06b63">Identification of the Compliance Matrix</h4>
<div class="outline-text-4" id="text-orgef06b63">
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
options = linearizeOptions;
options.SampleTime = 0;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = <span class="org-string">'stewart_platform_model'</span>;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1;
io(io_i) = linio([mdl, <span class="org-string">'/Disturbances/F_ext'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% External forces [N, N*m]</span>
io(io_i) = linio([mdl, <span class="org-string">'/Absolute Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Absolute Motion [m, rad]</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
C = linearize(mdl, io, options);
C.InputName = {<span class="org-string">'Fdx'</span>, <span class="org-string">'Fdy'</span>, <span class="org-string">'Fdz'</span>, <span class="org-string">'Mdx'</span>, <span class="org-string">'Mdy'</span>, <span class="org-string">'Mdz'</span>};
C.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
</pre>
</div>
<p>
If wanted, the 6x6 transmissibility matrix is plotted.
</p>
<div class="org-src-container">
<pre class="src src-matlab">p_handle = zeros(6<span class="org-type">*</span>6,1);
<span class="org-keyword">if</span> args.plots
fig = <span class="org-type">figure</span>;
<span class="org-keyword">for</span> <span class="org-variable-name">ix</span> = <span class="org-constant">1:6</span>
<span class="org-keyword">for</span> <span class="org-variable-name">iy</span> = <span class="org-constant">1:6</span>
p_handle((ix<span class="org-type">-</span>1)<span class="org-type">*</span>6 <span class="org-type">+</span> iy) = subplot(6, 6, (ix<span class="org-type">-</span>1)<span class="org-type">*</span>6 <span class="org-type">+</span> iy);
hold on;
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, <span class="org-string">'Hz'</span>))), <span class="org-string">'k-'</span>);
<span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'XScale'</span>, <span class="org-string">'log'</span>); <span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'YScale'</span>, <span class="org-string">'log'</span>);
<span class="org-keyword">if</span> ix <span class="org-type">&lt;</span> 6
xticklabels({});
<span class="org-keyword">end</span>
<span class="org-keyword">if</span> iy <span class="org-type">&gt;</span> 1
yticklabels({});
<span class="org-keyword">end</span>
<span class="org-keyword">end</span>
<span class="org-keyword">end</span>
linkaxes(p_handle, <span class="org-string">'xy'</span>)
xlim([freqs(1), freqs(end)]);
han = <span class="org-type">axes</span>(fig, <span class="org-string">'visible'</span>, <span class="org-string">'off'</span>);
han.XLabel.Visible = <span class="org-string">'on'</span>;
han.YLabel.Visible = <span class="org-string">'on'</span>;
xlabel(han, <span class="org-string">'Frequency [Hz]'</span>);
ylabel(han, <span class="org-string">'Compliance [m/N, rad/(N*m)]'</span>);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org6f63d37" class="outline-4">
<h4 id="org6f63d37">Computation of the Frobenius norm</h4>
<div class="outline-text-4" id="text-org6f63d37">
<div class="org-src-container">
<pre class="src src-matlab">freqs = args.freqs;
C_norm = zeros(length(freqs), 1);
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(freqs)</span>
C_norm(<span class="org-constant">i</span>) = sqrt(trace(freqresp(C, freqs(<span class="org-constant">i</span>), <span class="org-string">'Hz'</span>)<span class="org-type">*</span>freqresp(C, freqs(<span class="org-constant">i</span>), <span class="org-string">'Hz'</span>)<span class="org-type">'</span>));
<span class="org-keyword">end</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">if</span> args.plots
<span class="org-type">figure</span>;
plot(freqs, C_norm)
<span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'XScale'</span>, <span class="org-string">'log'</span>); <span class="org-type">set</span>(<span class="org-variable-name">gca</span>, <span class="org-string">'YScale'</span>, <span class="org-string">'log'</span>);
xlabel(<span class="org-string">'Frequency [Hz]'</span>);
ylabel(<span class="org-string">'Compliance - Frobenius Norm'</span>);
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
</div>
</div>
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-02-13 jeu. 15:44</p> <p class="date">Created: 2020-02-27 jeu. 14:16</p>
</div> </div>
</body> </body>
</html> </html>

View File

@ -4,7 +4,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-02-13 jeu. 15:47 --> <!-- 2020-02-27 jeu. 14:16 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Stewart Platform - Simscape Model</title> <title>Stewart Platform - Simscape Model</title>
@ -201,30 +201,7 @@
<script src="./js/jquery.stickytableheaders.min.js"></script> <script src="./js/jquery.stickytableheaders.min.js"></script>
<script src="./js/readtheorg.js"></script> <script src="./js/readtheorg.js"></script>
<script type="text/javascript"> <script type="text/javascript">
/* // @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2020 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[/*><!--*/ <!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id) function CodeHighlightOn(elem, id)
{ {
@ -245,6 +222,7 @@ for the JavaScript code in this tag.
target.className = elem.cacheClassTarget; target.className = elem.cacheClassTarget;
} }
/*]]>*///--> /*]]>*///-->
// @license-end
</script> </script>
<script> <script>
MathJax = { MathJax = {
@ -281,18 +259,19 @@ for the JavaScript code in this tag.
<ul> <ul>
<li><a href="#org3535b6d">6.1. Payload</a> <li><a href="#org3535b6d">6.1. Payload</a>
<ul> <ul>
<li><a href="#org706f994">Function description</a></li> <li><a href="#orge7f39a8">Function description</a></li>
<li><a href="#orgb15b49f">Optional Parameters</a></li> <li><a href="#orgb83df72">Optional Parameters</a></li>
<li><a href="#orgeeb8d35">Add Payload Type</a></li> <li><a href="#orgeeb8d35">Add Payload Type</a></li>
<li><a href="#org6d52ffc">Add Stiffness, Damping and Mass properties of the Payload</a></li> <li><a href="#org6d52ffc">Add Stiffness, Damping and Mass properties of the Payload</a></li>
</ul> </ul>
</li> </li>
<li><a href="#orgaaed406">6.2. Ground</a> <li><a href="#orgaaed406">6.2. Ground</a>
<ul> <ul>
<li><a href="#orge7f39a8">Function description</a></li> <li><a href="#org5d402b9">Function description</a></li>
<li><a href="#orgb83df72">Optional Parameters</a></li> <li><a href="#orgc0da5ca">Optional Parameters</a></li>
<li><a href="#orgef7035d">Add Ground Type</a></li> <li><a href="#orgef7035d">Add Ground Type</a></li>
<li><a href="#org95633e8">Add Stiffness and Damping properties of the Ground</a></li> <li><a href="#org95633e8">Add Stiffness and Damping properties of the Ground</a></li>
<li><a href="#org14ff2fc">Rotation Point</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -525,9 +504,9 @@ This Matlab function is accessible <a href="../src/initializePayload.m">here</a>
</p> </p>
</div> </div>
<div id="outline-container-org706f994" class="outline-4"> <div id="outline-container-orge7f39a8" class="outline-4">
<h4 id="org706f994">Function description</h4> <h4 id="orge7f39a8">Function description</h4>
<div class="outline-text-4" id="text-org706f994"> <div class="outline-text-4" id="text-orge7f39a8">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[payload]</span> = <span class="org-function-name">initializePayload</span>(<span class="org-variable-name">args</span>) <pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[payload]</span> = <span class="org-function-name">initializePayload</span>(<span class="org-variable-name">args</span>)
<span class="org-comment">% initializePayload - Initialize the Payload that can then be used for simulations and analysis</span> <span class="org-comment">% initializePayload - Initialize the Payload that can then be used for simulations and analysis</span>
@ -536,7 +515,7 @@ This Matlab function is accessible <a href="../src/initializePayload.m">here</a>
<span class="org-comment">%</span> <span class="org-comment">%</span>
<span class="org-comment">% Inputs:</span> <span class="org-comment">% Inputs:</span>
<span class="org-comment">% - args - Structure with the following fields:</span> <span class="org-comment">% - args - Structure with the following fields:</span>
<span class="org-comment">% - type - 'none', 'solid', 'flexible', 'cartesian'</span> <span class="org-comment">% - type - 'none', 'rigid', 'flexible', 'cartesian'</span>
<span class="org-comment">% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]</span> <span class="org-comment">% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]</span>
<span class="org-comment">% This also the position where K and C are defined</span> <span class="org-comment">% This also the position where K and C are defined</span>
<span class="org-comment">% - K [6x1] - Stiffness of the Payload [N/m, N/rad]</span> <span class="org-comment">% - K [6x1] - Stiffness of the Payload [N/m, N/rad]</span>
@ -546,7 +525,7 @@ This Matlab function is accessible <a href="../src/initializePayload.m">here</a>
<span class="org-comment">%</span> <span class="org-comment">%</span>
<span class="org-comment">% Outputs:</span> <span class="org-comment">% Outputs:</span>
<span class="org-comment">% - payload - Struture with the following properties:</span> <span class="org-comment">% - payload - Struture with the following properties:</span>
<span class="org-comment">% - type - 1 (none), 2 (solid), 3 (flexible)</span> <span class="org-comment">% - type - 1 (none), 2 (rigid), 3 (flexible)</span>
<span class="org-comment">% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]</span> <span class="org-comment">% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]</span>
<span class="org-comment">% - K [6x1] - Stiffness of the Payload [N/m, N/rad]</span> <span class="org-comment">% - K [6x1] - Stiffness of the Payload [N/m, N/rad]</span>
<span class="org-comment">% - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)]</span> <span class="org-comment">% - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)]</span>
@ -557,12 +536,12 @@ This Matlab function is accessible <a href="../src/initializePayload.m">here</a>
</div> </div>
</div> </div>
<div id="outline-container-orgb15b49f" class="outline-4"> <div id="outline-container-orgb83df72" class="outline-4">
<h4 id="orgb15b49f">Optional Parameters</h4> <h4 id="orgb83df72">Optional Parameters</h4>
<div class="outline-text-4" id="text-orgb15b49f"> <div class="outline-text-4" id="text-orgb83df72">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">arguments <pre class="src src-matlab">arguments
args.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'solid'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'cartesian'</span>})} = <span class="org-string">'none'</span> args.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'cartesian'</span>})} = <span class="org-string">'none'</span>
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e8<span class="org-type">*</span>ones(6,1) args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e8<span class="org-type">*</span>ones(6,1)
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1<span class="org-type">*</span>ones(6,1) args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1<span class="org-type">*</span>ones(6,1)
args.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e<span class="org-type">-</span>3 args.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e<span class="org-type">-</span>3
@ -581,7 +560,7 @@ This Matlab function is accessible <a href="../src/initializePayload.m">here</a>
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span> <pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span> <span class="org-keyword">case</span> <span class="org-string">'none'</span>
payload.type = 1; payload.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'solid'</span> <span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
payload.type = 2; payload.type = 2;
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span> <span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
payload.type = 3; payload.type = 3;
@ -621,9 +600,9 @@ This Matlab function is accessible <a href="../src/initializeGround.m">here</a>.
</p> </p>
</div> </div>
<div id="outline-container-orge7f39a8" class="outline-4"> <div id="outline-container-org5d402b9" class="outline-4">
<h4 id="orge7f39a8">Function description</h4> <h4 id="org5d402b9">Function description</h4>
<div class="outline-text-4" id="text-orge7f39a8"> <div class="outline-text-4" id="text-org5d402b9">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[ground]</span> = <span class="org-function-name">initializeGround</span>(<span class="org-variable-name">args</span>) <pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[ground]</span> = <span class="org-function-name">initializeGround</span>(<span class="org-variable-name">args</span>)
<span class="org-comment">% initializeGround - Initialize the Ground that can then be used for simulations and analysis</span> <span class="org-comment">% initializeGround - Initialize the Ground that can then be used for simulations and analysis</span>
@ -633,12 +612,13 @@ This Matlab function is accessible <a href="../src/initializeGround.m">here</a>.
<span class="org-comment">% Inputs:</span> <span class="org-comment">% Inputs:</span>
<span class="org-comment">% - args - Structure with the following fields:</span> <span class="org-comment">% - args - Structure with the following fields:</span>
<span class="org-comment">% - type - 'none', 'solid', 'flexible'</span> <span class="org-comment">% - type - 'none', 'solid', 'flexible'</span>
<span class="org-comment">% - rot_point [3x1] - Rotation point for the ground motion [m]</span>
<span class="org-comment">% - K [3x1] - Translation Stiffness of the Ground [N/m]</span> <span class="org-comment">% - K [3x1] - Translation Stiffness of the Ground [N/m]</span>
<span class="org-comment">% - C [3x1] - Translation Damping of the Ground [N/(m/s)]</span> <span class="org-comment">% - C [3x1] - Translation Damping of the Ground [N/(m/s)]</span>
<span class="org-comment">%</span> <span class="org-comment">%</span>
<span class="org-comment">% Outputs:</span> <span class="org-comment">% Outputs:</span>
<span class="org-comment">% - ground - Struture with the following properties:</span> <span class="org-comment">% - ground - Struture with the following properties:</span>
<span class="org-comment">% - type - 1 (none), 2 (solid), 3 (flexible)</span> <span class="org-comment">% - type - 1 (none), 2 (rigid), 3 (flexible)</span>
<span class="org-comment">% - K [3x1] - Translation Stiffness of the Ground [N/m]</span> <span class="org-comment">% - K [3x1] - Translation Stiffness of the Ground [N/m]</span>
<span class="org-comment">% - C [3x1] - Translation Damping of the Ground [N/(m/s)]</span> <span class="org-comment">% - C [3x1] - Translation Damping of the Ground [N/(m/s)]</span>
</pre> </pre>
@ -646,12 +626,13 @@ This Matlab function is accessible <a href="../src/initializeGround.m">here</a>.
</div> </div>
</div> </div>
<div id="outline-container-orgb83df72" class="outline-4"> <div id="outline-container-orgc0da5ca" class="outline-4">
<h4 id="orgb83df72">Optional Parameters</h4> <h4 id="orgc0da5ca">Optional Parameters</h4>
<div class="outline-text-4" id="text-orgb83df72"> <div class="outline-text-4" id="text-orgc0da5ca">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">arguments <pre class="src src-matlab">arguments
args.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'solid'</span>, <span class="org-string">'flexible'</span>})} = <span class="org-string">'none'</span> args.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>})} = <span class="org-string">'none'</span>
args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1)
args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8<span class="org-type">*</span>ones(3,1) args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8<span class="org-type">*</span>ones(3,1)
args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1<span class="org-type">*</span>ones(3,1) args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1<span class="org-type">*</span>ones(3,1)
<span class="org-keyword">end</span> <span class="org-keyword">end</span>
@ -667,7 +648,7 @@ This Matlab function is accessible <a href="../src/initializeGround.m">here</a>.
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span> <pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
<span class="org-keyword">case</span> <span class="org-string">'none'</span> <span class="org-keyword">case</span> <span class="org-string">'none'</span>
ground.type = 1; ground.type = 1;
<span class="org-keyword">case</span> <span class="org-string">'solid'</span> <span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
ground.type = 2; ground.type = 2;
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span> <span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
ground.type = 3; ground.type = 3;
@ -687,12 +668,22 @@ ground.C = args.C;
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-org14ff2fc" class="outline-4">
<h4 id="org14ff2fc">Rotation Point</h4>
<div class="outline-text-4" id="text-org14ff2fc">
<div class="org-src-container">
<pre class="src src-matlab">ground.rot_point = args.rot_point;
</pre>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-02-13 jeu. 15:47</p> <p class="date">Created: 2020-02-27 jeu. 14:16</p>
</div> </div>
</body> </body>
</html> </html>

Binary file not shown.

View File

@ -91,7 +91,7 @@ To run the script, open the Simulink Project, and type =run active_damping_inert
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
ground = initializeGround('type', 'none'); ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
payload = initializePayload('type', 'none'); payload = initializePayload('type', 'none');
#+end_src #+end_src
@ -321,10 +321,14 @@ We first initialize the Stewart platform without joint stiffness.
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
ground = initializeGround('type', 'none'); ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
payload = initializePayload('type', 'none'); payload = initializePayload('type', 'none');
#+end_src #+end_src
#+begin_src matlab
controller = initializeController('type', 'open-loop');
#+end_src
And we identify the dynamics from force actuators to force sensors. And we identify the dynamics from force actuators to force sensors.
#+begin_src matlab #+begin_src matlab
%% Options for Linearized %% Options for Linearized
@ -590,7 +594,7 @@ We first initialize the Stewart platform without joint stiffness.
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
ground = initializeGround('type', 'none'); ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
payload = initializePayload('type', 'none'); payload = initializePayload('type', 'none');
#+end_src #+end_src
@ -773,3 +777,170 @@ The root locus is shown in figure [[fig:root_locus_dvf_rot_stiffness]].
#+begin_important #+begin_important
Joint stiffness does increase the resonance frequencies of the system but does not change the attainable damping when using relative motion sensors. Joint stiffness does increase the resonance frequencies of the system but does not change the attainable damping when using relative motion sensors.
#+end_important #+end_important
* Compliance and Transmissibility Comparison
** Initialization
We first initialize the Stewart platform without joint stiffness.
#+begin_src matlab
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none');
#+end_src
The rotation point of the ground is located at the origin of frame $\{A\}$.
#+begin_src matlab
ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
payload = initializePayload('type', 'none');
#+end_src
** Identification
Let's first identify the transmissibility and compliance in the open-loop case.
#+begin_src matlab
controller = initializeController('type', 'open-loop');
[T_ol, T_norm_ol, freqs] = computeTransmissibility();
[C_ol, C_norm_ol, freqs] = computeCompliance();
#+end_src
Now, let's identify the transmissibility and compliance for the Integral Force Feedback architecture.
#+begin_src matlab
controller = initializeController('type', 'iff');
G_iff = (2e4/s)*eye(6);
[T_iff, T_norm_iff, ~] = computeTransmissibility();
[C_iff, C_norm_iff, ~] = computeCompliance();
#+end_src
And for the Direct Velocity Feedback.
#+begin_src matlab
controller = initializeController('type', 'dvf');
G_dvf = 1e4*s/(1+s/2/pi/5000)*eye(6);
[T_dvf, T_norm_dvf, ~] = computeTransmissibility();
[C_dvf, C_norm_dvf, ~] = computeCompliance();
#+end_src
** Results
#+begin_src matlab :exports none
p_handle = zeros(6*6,1);
fig = figure;
for ix = 1:6
for iy = 1:6
p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
hold on;
set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(T_ol(ix, iy), freqs, 'Hz'))));
set(gca,'ColorOrderIndex',2);
plot(freqs, abs(squeeze(freqresp(T_iff(ix, iy), freqs, 'Hz'))));
set(gca,'ColorOrderIndex',3);
plot(freqs, abs(squeeze(freqresp(T_dvf(ix, iy), freqs, 'Hz'))));
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
if ix < 6
xticklabels({});
end
if iy > 1
yticklabels({});
end
end
end
linkaxes(p_handle, 'xy')
xlim([freqs(1), freqs(end)]);
han = axes(fig, 'visible', 'off');
han.XLabel.Visible = 'on';
han.YLabel.Visible = 'on';
ylabel(han, 'Frequency [Hz]');
xlabel(han, 'Transmissibility');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/transmissibility_iff_dvf.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+name: fig:transmissibility_iff_dvf
#+caption: Obtained transmissibility for Open-Loop Control (Blue), Integral Force Feedback (Red) and Direct Velocity Feedback (Yellow) ([[./figs/transmissibility_iff_dvf.png][png]], [[./figs/transmissibility_iff_dvf.pdf][pdf]])
[[file:figs/transmissibility_iff_dvf.png]]
#+begin_src matlab :exports none
p_handle = zeros(6*6,1);
fig = figure;
for ix = 1:6
for iy = 1:6
p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
hold on;
set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(C_ol(ix, iy), freqs, 'Hz'))));
set(gca,'ColorOrderIndex',2);
plot(freqs, abs(squeeze(freqresp(C_iff(ix, iy), freqs, 'Hz'))));
set(gca,'ColorOrderIndex',3);
plot(freqs, abs(squeeze(freqresp(C_dvf(ix, iy), freqs, 'Hz'))));
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
if ix < 6
xticklabels({});
end
if iy > 1
yticklabels({});
end
end
end
linkaxes(p_handle, 'xy')
xlim([freqs(1), freqs(end)]);
han = axes(fig, 'visible', 'off');
han.XLabel.Visible = 'on';
han.YLabel.Visible = 'on';
ylabel(han, 'Frequency [Hz]');
xlabel(han, 'Compliance');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/compliance_iff_dvf.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+name: fig:compliance_iff_dvf
#+caption: Obtained compliance for Open-Loop Control (Blue), Integral Force Feedback (Red) and Direct Velocity Feedback (Yellow) ([[./figs/compliance_iff_dvf.png][png]], [[./figs/compliance_iff_dvf.pdf][pdf]])
[[file:figs/compliance_iff_dvf.png]]
#+begin_src matlab :exports none
figure;
subplot(1,2,1);
hold on;
plot(freqs, T_norm_ol)
plot(freqs, T_norm_iff)
plot(freqs, T_norm_dvf)
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]');
ylabel('Transmissibility - Frobenius Norm');
subplot(1,2,2);
hold on;
plot(freqs, C_norm_ol, 'DisplayName', 'OL')
plot(freqs, C_norm_iff, 'DisplayName', 'IFF')
plot(freqs, C_norm_dvf, 'DisplayName', 'DVF')
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]');
ylabel('Compliance - Frobenius Norm');
legend();
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/frobenius_norm_T_C_iff_dvf.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+name: fig:frobenius_norm_T_C_iff_dvf
#+caption: Frobenius norm of the Transmissibility and Compliance Matrices ([[./figs/frobenius_norm_T_C_iff_dvf.png][png]], [[./figs/frobenius_norm_T_C_iff_dvf.pdf][pdf]])
[[file:figs/frobenius_norm_T_C_iff_dvf.png]]

View File

@ -259,241 +259,27 @@ A lead is added around the crossover frequency which is set to be around 500Hz.
linkaxes([ax1,ax2],'x'); linkaxes([ax1,ax2],'x');
#+end_src #+end_src
* Transmissibility Analysis
** Matlab Init :noexport:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
#+begin_src matlab
simulinkproject('../');
#+end_src
#+begin_src matlab
open('stewart_platform_model.slx')
#+end_src
** Initialize the Stewart platform
#+begin_src matlab
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
#+end_src
We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$.
#+begin_src matlab
ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
payload = initializePayload('type', 'rigid');
#+end_src
** Transmissibility
#+begin_src matlab
%% Options for Linearized
options = linearizeOptions;
options.SampleTime = 0;
%% Name of the Simulink File
mdl = 'stewart_platform_model';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Disturbances/D_w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad]
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
%% Run the linearization
T = linearize(mdl, io, options);
T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src
#+begin_src matlab
freqs = logspace(1, 4, 1000);
figure;
for ix = 1:6
for iy = 1:6
subplot(6, 6, (ix-1)*6 + iy);
hold on;
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylim([1e-5, 10]);
xlim([freqs(1), freqs(end)]);
if ix < 6
xticklabels({});
end
if iy > 1
yticklabels({});
end
end
end
#+end_src
From cite:preumont07_six_axis_singl_stage_activ, one can use the Frobenius norm of the transmissibility matrix to obtain a scalar indicator of the transmissibility performance of the system:
\begin{align*}
\| \bm{T}(\omega) \| &= \sqrt{\text{Trace}[\bm{T}(\omega) \bm{T}(\omega)^H]}\\
&= \sqrt{\Sigma_{i=1}^6 \Sigma_{j=1}^6 |T_{ij}|^2}
\end{align*}
#+begin_src matlab
freqs = logspace(1, 4, 1000);
T_norm = zeros(length(freqs), 1);
for i = 1:length(freqs)
T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')'));
end
#+end_src
And we normalize by a factor $\sqrt{6}$ to obtain a performance metric comparable to the transmissibility of a one-axis isolator:
\[ \Gamma(\omega) = \|\bm{T}(\omega)\| / \sqrt{6} \]
#+begin_src matlab
Gamma = T_norm/sqrt(6);
#+end_src
#+begin_src matlab
figure;
plot(freqs, Gamma)
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
#+end_src
* Compliance Analysis
** Matlab Init :noexport:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
#+begin_src matlab
simulinkproject('../');
#+end_src
#+begin_src matlab
open('stewart_platform_model.slx')
#+end_src
** Initialize the Stewart platform
#+begin_src matlab
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
#+end_src
We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$.
#+begin_src matlab
ground = initializeGround('type', 'none');
payload = initializePayload('type', 'rigid');
#+end_src
** Compliance
#+begin_src matlab
%% Options for Linearized
options = linearizeOptions;
options.SampleTime = 0;
%% Name of the Simulink File
mdl = 'stewart_platform_model';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Disturbances/F_ext'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad]
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
%% Run the linearization
C = linearize(mdl, io, options);
C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src
#+begin_src matlab
freqs = logspace(1, 4, 1000);
figure;
for ix = 1:6
for iy = 1:6
subplot(6, 6, (ix-1)*6 + iy);
hold on;
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylim([1e-10, 1e-3]);
xlim([freqs(1), freqs(end)]);
if ix < 6
xticklabels({});
end
if iy > 1
yticklabels({});
end
end
end
#+end_src
We can try to use the Frobenius norm to obtain a scalar value representing the 6-dof compliance of the Stewart platform.
#+begin_src matlab
freqs = logspace(1, 4, 1000);
C_norm = zeros(length(freqs), 1);
for i = 1:length(freqs)
C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
end
#+end_src
#+begin_src matlab
figure;
plot(freqs, C_norm)
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
#+end_src
* Functions * Functions
** Compute the Transmissibility ** =initializeController=: Initialize the Controller
:PROPERTIES: :PROPERTIES:
:header-args:matlab+: :tangle ../src/computeTransmissibility.m :header-args:matlab+: :tangle ../src/initializeController.m
:header-args:matlab+: :comments none :mkdirp yes :eval no :header-args:matlab+: :comments none :mkdirp yes :eval no
:END: :END:
<<sec:computeTransmissibility>> <<sec:initializeController>>
*** Function description *** Function description
:PROPERTIES: :PROPERTIES:
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
function [T, T_norm, freqs] = computeTransmissibility(args) function [controller] = initializeController(args)
% computeTransmissibility - % initializeController - Initialize the Controller
% %
% Syntax: [T, T_norm, freqs] = computeTransmissibility(args) % Syntax: [] = initializeController(args)
% %
% Inputs: % Inputs:
% - args - Structure with the following fields: % - args - Can have the following fields:
% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
% - freqs [] - Frequency vector to estimate the Frobenius norm
%
% Outputs:
% - T [6x6 ss] - Transmissibility matrix
% - T_norm [length(freqs)x1] - Frobenius norm of the Transmissibility matrix
% - freqs [length(freqs)x1] - Frequency vector in [Hz]
#+end_src #+end_src
*** Optional Parameters *** Optional Parameters
@ -502,215 +288,29 @@ We can try to use the Frobenius norm to obtain a scalar value representing the 6
:END: :END:
#+begin_src matlab #+begin_src matlab
arguments arguments
args.plots logical {mustBeNumericOrLogical} = false args.type char {mustBeMember(args.type, {'open-loop', 'iff', 'dvf'})} = 'open-loop'
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
end end
#+end_src #+end_src
#+begin_src matlab *** Structure initialization
freqs = args.freqs;
#+end_src
*** Identification of the Transmissibility Matrix
:PROPERTIES: :PROPERTIES:
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
%% Options for Linearized controller = struct();
options = linearizeOptions;
options.SampleTime = 0;
%% Name of the Simulink File
mdl = 'stewart_platform_model';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Disturbances/D_w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad]
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
%% Run the linearization
T = linearize(mdl, io, options);
T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src #+end_src
If wanted, the 6x6 transmissibility matrix is plotted. *** Add Type
#+begin_src matlab
p_handle = zeros(6*6,1);
if args.plots
fig = figure;
for ix = 1:6
for iy = 1:6
p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
hold on;
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
if ix < 6
xticklabels({});
end
if iy > 1
yticklabels({});
end
end
end
linkaxes(p_handle, 'xy')
xlim([freqs(1), freqs(end)]);
ylim([1e-5, 1e2]);
han = axes(fig, 'visible', 'off');
han.XLabel.Visible = 'on';
han.YLabel.Visible = 'on';
ylabel(han, 'Frequency [Hz]');
xlabel(han, 'Transmissibility [m/m]');
end
#+end_src
*** Computation of the Frobenius norm
:PROPERTIES: :PROPERTIES:
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
T_norm = zeros(length(freqs), 1); switch args.type
case 'open-loop'
for i = 1:length(freqs) controller.type = 0;
T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')')); case 'iff'
end controller.type = 1;
#+end_src case 'dvf'
controller.type = 2;
#+begin_src matlab
T_norm = T_norm/sqrt(6);
#+end_src
#+begin_src matlab
if args.plots
figure;
plot(freqs, T_norm)
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]');
ylabel('Transmissibility - Frobenius Norm');
end
#+end_src
** Compute the Compliance
:PROPERTIES:
:header-args:matlab+: :tangle ../src/computeCompliance.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:computeCompliance>>
*** Function description
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
function [C, C_norm, freqs] = computeCompliance(args)
% computeCompliance -
%
% Syntax: [C, C_norm, freqs] = computeCompliance(args)
%
% Inputs:
% - args - Structure with the following fields:
% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
% - freqs [] - Frequency vector to estimate the Frobenius norm
%
% Outputs:
% - C [6x6 ss] - Compliance matrix
% - C_norm [length(freqs)x1] - Frobenius norm of the Compliance matrix
% - freqs [length(freqs)x1] - Frequency vector in [Hz]
#+end_src
*** Optional Parameters
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
arguments
args.plots logical {mustBeNumericOrLogical} = false
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
end
#+end_src
#+begin_src matlab
freqs = args.freqs;
#+end_src
*** Identification of the Compliance Matrix
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
%% Options for Linearized
options = linearizeOptions;
options.SampleTime = 0;
%% Name of the Simulink File
mdl = 'stewart_platform_model';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Disturbances/F_ext'], 1, 'openinput'); io_i = io_i + 1; % External forces [N, N*m]
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
%% Run the linearization
C = linearize(mdl, io, options);
C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src
If wanted, the 6x6 transmissibility matrix is plotted.
#+begin_src matlab
p_handle = zeros(6*6,1);
if args.plots
fig = figure;
for ix = 1:6
for iy = 1:6
p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
hold on;
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
if ix < 6
xticklabels({});
end
if iy > 1
yticklabels({});
end
end
end
linkaxes(p_handle, 'xy')
xlim([freqs(1), freqs(end)]);
han = axes(fig, 'visible', 'off');
han.XLabel.Visible = 'on';
han.YLabel.Visible = 'on';
xlabel(han, 'Frequency [Hz]');
ylabel(han, 'Compliance [m/N, rad/(N*m)]');
end
#+end_src
*** Computation of the Frobenius norm
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
freqs = args.freqs;
C_norm = zeros(length(freqs), 1);
for i = 1:length(freqs)
C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
end
#+end_src
#+begin_src matlab
if args.plots
figure;
plot(freqs, C_norm)
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]');
ylabel('Compliance - Frobenius Norm');
end end
#+end_src #+end_src

View File

@ -338,11 +338,6 @@ Estimation of the transfer function from $\mathcal{\bm{F}}$ to $\mathcal{\bm{X}}
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'stewart_platform_model'; mdl = 'stewart_platform_model';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/X'], 1, 'openoutput'); io_i = io_i + 1;
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]

View File

@ -39,8 +39,14 @@
:END: :END:
* Introduction :ignore: * Introduction :ignore:
In this document, we discuss the various methods to identify the behavior of the Stewart platform.
- [[sec:modal_analysis]]
- [[sec:transmissibility]]
- [[sec:compliance]]
* Modal Analysis of the Stewart Platform * Modal Analysis of the Stewart Platform
<<sec:modal_analysis>>
** Introduction :ignore: ** Introduction :ignore:
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
@ -239,3 +245,463 @@ Save the movie of the mode shape.
#+caption: Identified mode - 5 #+caption: Identified mode - 5
[[file:figs/mode5.gif]] [[file:figs/mode5.gif]]
* Transmissibility Analysis
<<sec:transmissibility>>
** Introduction :ignore:
** Matlab Init :noexport:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
#+begin_src matlab
simulinkproject('../');
#+end_src
#+begin_src matlab
open('stewart_platform_model.slx')
#+end_src
** Initialize the Stewart platform
#+begin_src matlab
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
#+end_src
We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$.
#+begin_src matlab
ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
payload = initializePayload('type', 'rigid');
#+end_src
** Transmissibility
#+begin_src matlab
%% Options for Linearized
options = linearizeOptions;
options.SampleTime = 0;
%% Name of the Simulink File
mdl = 'stewart_platform_model';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Disturbances/D_w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad]
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
%% Run the linearization
T = linearize(mdl, io, options);
T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src
#+begin_src matlab
freqs = logspace(1, 4, 1000);
figure;
for ix = 1:6
for iy = 1:6
subplot(6, 6, (ix-1)*6 + iy);
hold on;
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylim([1e-5, 10]);
xlim([freqs(1), freqs(end)]);
if ix < 6
xticklabels({});
end
if iy > 1
yticklabels({});
end
end
end
#+end_src
From cite:preumont07_six_axis_singl_stage_activ, one can use the Frobenius norm of the transmissibility matrix to obtain a scalar indicator of the transmissibility performance of the system:
\begin{align*}
\| \bm{T}(\omega) \| &= \sqrt{\text{Trace}[\bm{T}(\omega) \bm{T}(\omega)^H]}\\
&= \sqrt{\Sigma_{i=1}^6 \Sigma_{j=1}^6 |T_{ij}|^2}
\end{align*}
#+begin_src matlab
freqs = logspace(1, 4, 1000);
T_norm = zeros(length(freqs), 1);
for i = 1:length(freqs)
T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')'));
end
#+end_src
And we normalize by a factor $\sqrt{6}$ to obtain a performance metric comparable to the transmissibility of a one-axis isolator:
\[ \Gamma(\omega) = \|\bm{T}(\omega)\| / \sqrt{6} \]
#+begin_src matlab
Gamma = T_norm/sqrt(6);
#+end_src
#+begin_src matlab
figure;
plot(freqs, Gamma)
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
#+end_src
* Compliance Analysis
<<sec:compliance>>
** Introduction :ignore:
** Matlab Init :noexport:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
#+begin_src matlab
simulinkproject('../');
#+end_src
#+begin_src matlab
open('stewart_platform_model.slx')
#+end_src
** Initialize the Stewart platform
#+begin_src matlab
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
#+end_src
We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$.
#+begin_src matlab
ground = initializeGround('type', 'none');
payload = initializePayload('type', 'rigid');
#+end_src
** Compliance
#+begin_src matlab
%% Options for Linearized
options = linearizeOptions;
options.SampleTime = 0;
%% Name of the Simulink File
mdl = 'stewart_platform_model';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Disturbances/F_ext'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad]
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
%% Run the linearization
C = linearize(mdl, io, options);
C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src
#+begin_src matlab
freqs = logspace(1, 4, 1000);
figure;
for ix = 1:6
for iy = 1:6
subplot(6, 6, (ix-1)*6 + iy);
hold on;
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylim([1e-10, 1e-3]);
xlim([freqs(1), freqs(end)]);
if ix < 6
xticklabels({});
end
if iy > 1
yticklabels({});
end
end
end
#+end_src
We can try to use the Frobenius norm to obtain a scalar value representing the 6-dof compliance of the Stewart platform.
#+begin_src matlab
freqs = logspace(1, 4, 1000);
C_norm = zeros(length(freqs), 1);
for i = 1:length(freqs)
C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
end
#+end_src
#+begin_src matlab
figure;
plot(freqs, C_norm)
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
#+end_src
* Functions
** Compute the Transmissibility
:PROPERTIES:
:header-args:matlab+: :tangle ../src/computeTransmissibility.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:computeTransmissibility>>
*** Function description
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
function [T, T_norm, freqs] = computeTransmissibility(args)
% computeTransmissibility -
%
% Syntax: [T, T_norm, freqs] = computeTransmissibility(args)
%
% Inputs:
% - args - Structure with the following fields:
% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
% - freqs [] - Frequency vector to estimate the Frobenius norm
%
% Outputs:
% - T [6x6 ss] - Transmissibility matrix
% - T_norm [length(freqs)x1] - Frobenius norm of the Transmissibility matrix
% - freqs [length(freqs)x1] - Frequency vector in [Hz]
#+end_src
*** Optional Parameters
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
arguments
args.plots logical {mustBeNumericOrLogical} = false
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
end
#+end_src
#+begin_src matlab
freqs = args.freqs;
#+end_src
*** Identification of the Transmissibility Matrix
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
%% Options for Linearized
options = linearizeOptions;
options.SampleTime = 0;
%% Name of the Simulink File
mdl = 'stewart_platform_model';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Disturbances/D_w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad]
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
%% Run the linearization
T = linearize(mdl, io, options);
T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src
If wanted, the 6x6 transmissibility matrix is plotted.
#+begin_src matlab
p_handle = zeros(6*6,1);
if args.plots
fig = figure;
for ix = 1:6
for iy = 1:6
p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
hold on;
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
if ix < 6
xticklabels({});
end
if iy > 1
yticklabels({});
end
end
end
linkaxes(p_handle, 'xy')
xlim([freqs(1), freqs(end)]);
ylim([1e-5, 1e2]);
han = axes(fig, 'visible', 'off');
han.XLabel.Visible = 'on';
han.YLabel.Visible = 'on';
ylabel(han, 'Frequency [Hz]');
xlabel(han, 'Transmissibility [m/m]');
end
#+end_src
*** Computation of the Frobenius norm
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
T_norm = zeros(length(freqs), 1);
for i = 1:length(freqs)
T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')'));
end
#+end_src
#+begin_src matlab
T_norm = T_norm/sqrt(6);
#+end_src
#+begin_src matlab
if args.plots
figure;
plot(freqs, T_norm)
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]');
ylabel('Transmissibility - Frobenius Norm');
end
#+end_src
** Compute the Compliance
:PROPERTIES:
:header-args:matlab+: :tangle ../src/computeCompliance.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:computeCompliance>>
*** Function description
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
function [C, C_norm, freqs] = computeCompliance(args)
% computeCompliance -
%
% Syntax: [C, C_norm, freqs] = computeCompliance(args)
%
% Inputs:
% - args - Structure with the following fields:
% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
% - freqs [] - Frequency vector to estimate the Frobenius norm
%
% Outputs:
% - C [6x6 ss] - Compliance matrix
% - C_norm [length(freqs)x1] - Frobenius norm of the Compliance matrix
% - freqs [length(freqs)x1] - Frequency vector in [Hz]
#+end_src
*** Optional Parameters
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
arguments
args.plots logical {mustBeNumericOrLogical} = false
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
end
#+end_src
#+begin_src matlab
freqs = args.freqs;
#+end_src
*** Identification of the Compliance Matrix
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
%% Options for Linearized
options = linearizeOptions;
options.SampleTime = 0;
%% Name of the Simulink File
mdl = 'stewart_platform_model';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Disturbances/F_ext'], 1, 'openinput'); io_i = io_i + 1; % External forces [N, N*m]
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
%% Run the linearization
C = linearize(mdl, io, options);
C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src
If wanted, the 6x6 transmissibility matrix is plotted.
#+begin_src matlab
p_handle = zeros(6*6,1);
if args.plots
fig = figure;
for ix = 1:6
for iy = 1:6
p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
hold on;
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
if ix < 6
xticklabels({});
end
if iy > 1
yticklabels({});
end
end
end
linkaxes(p_handle, 'xy')
xlim([freqs(1), freqs(end)]);
han = axes(fig, 'visible', 'off');
han.XLabel.Visible = 'on';
han.YLabel.Visible = 'on';
xlabel(han, 'Frequency [Hz]');
ylabel(han, 'Compliance [m/N, rad/(N*m)]');
end
#+end_src
*** Computation of the Frobenius norm
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
freqs = args.freqs;
C_norm = zeros(length(freqs), 1);
for i = 1:length(freqs)
C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
end
#+end_src
#+begin_src matlab
if args.plots
figure;
plot(freqs, C_norm)
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]');
ylabel('Compliance - Frobenius Norm');
end
#+end_src

View File

@ -0,0 +1,22 @@
function [controller] = initializeController(args)
% initializeController - Initialize the Controller
%
% Syntax: [] = initializeController(args)
%
% Inputs:
% - args - Can have the following fields:
arguments
args.type char {mustBeMember(args.type, {'open-loop', 'iff', 'dvf'})} = 'open-loop'
end
controller = struct();
switch args.type
case 'open-loop'
controller.type = 0;
case 'iff'
controller.type = 1;
case 'dvf'
controller.type = 2;
end