Add link to tangled files

This commit is contained in:
Thomas Dehaeze 2020-02-13 16:46:47 +01:00
parent d12891df43
commit b5b3a756a4
17 changed files with 1423 additions and 281 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. 14:50 --> <!-- 2020-02-13 jeu. 16:46 -->
<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>
@ -271,25 +271,25 @@ 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="#orgd5c2ca3">1.2. Effect of the Flexible Joint stiffness and Actuator amplification on 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="#org2123b01">1.3. Obtained Damping</a></li> <li><a href="#org53a0870">1.3. Obtained Damping</a></li>
<li><a href="#org3471687">1.4. Conclusion</a></li> <li><a href="#org51b20eb">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="#org79e6a47">2.1. Identification of the Dynamics with perfect Joints</a></li> <li><a href="#org9e45139">2.1. Identification of the Dynamics with perfect Joints</a></li>
<li><a href="#orgf71d9f1">2.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</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="#orgaaed0b1">2.3. Obtained Damping</a></li> <li><a href="#org947ca92">2.3. Obtained Damping</a></li>
<li><a href="#orgf95ef97">2.4. Conclusion</a></li> <li><a href="#orgade2418">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="#orgc7446b0">3.1. Identification of the Dynamics with perfect Joints</a></li> <li><a href="#orgcaa6199">3.1. Identification of the Dynamics with perfect Joints</a></li>
<li><a href="#orged14fce">3.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</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="#orga745203">3.3. Obtained Damping</a></li> <li><a href="#orgd895eeb">3.3. Obtained Damping</a></li>
<li><a href="#org711b15d">3.4. Conclusion</a></li> <li><a href="#orgeaf5ef8">3.4. Conclusion</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -311,6 +311,17 @@ The following decentralized active damping techniques are briefly studied:
<p> <p>
<a id="orgeb37c7d"></a> <a id="orgeb37c7d"></a>
</p> </p>
<div class="note">
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_inertial.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run active_damping_inertial.m</code>.
</p>
</div>
</div> </div>
<div id="outline-container-org5f749c8" class="outline-3"> <div id="outline-container-org5f749c8" class="outline-3">
@ -369,8 +380,8 @@ The transfer function from actuator forces to force sensors is shown in Figure <
</div> </div>
</div> </div>
<div id="outline-container-orgd5c2ca3" class="outline-3"> <div id="outline-container-org07e81b1" class="outline-3">
<h3 id="orgd5c2ca3"><span class="section-number-3">1.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3> <h3 id="org07e81b1"><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.
@ -406,8 +417,8 @@ The new dynamics from force actuator to force sensor is shown in Figure <a href=
</div> </div>
</div> </div>
<div id="outline-container-org2123b01" class="outline-3"> <div id="outline-container-org53a0870" class="outline-3">
<h3 id="org2123b01"><span class="section-number-3">1.3</span> Obtained Damping</h3> <h3 id="org53a0870"><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.
@ -432,8 +443,8 @@ The root locus is shown in figure <a href="#org9af9e33">3</a>.
</div> </div>
</div> </div>
<div id="outline-container-org3471687" class="outline-3"> <div id="outline-container-org51b20eb" class="outline-3">
<h3 id="org3471687"><span class="section-number-3">1.4</span> Conclusion</h3> <h3 id="org51b20eb"><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>
@ -451,10 +462,21 @@ We do not have guaranteed stability with Inertial control. This is because of th
<p> <p>
<a id="orgab5e6b5"></a> <a id="orgab5e6b5"></a>
</p> </p>
<div class="note">
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_iff.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run active_damping_iff.m</code>.
</p>
</div>
</div> </div>
<div id="outline-container-org79e6a47" class="outline-3"> <div id="outline-container-org9e45139" class="outline-3">
<h3 id="org79e6a47"><span class="section-number-3">2.1</span> Identification of the Dynamics with perfect Joints</h3> <h3 id="org9e45139"><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.
@ -515,8 +537,8 @@ The transfer function from actuator forces to force sensors is shown in Figure <
</div> </div>
</div> </div>
<div id="outline-container-orgf71d9f1" class="outline-3"> <div id="outline-container-org494bb35" class="outline-3">
<h3 id="orgf71d9f1"><span class="section-number-3">2.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3> <h3 id="org494bb35"><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.
@ -552,8 +574,8 @@ The new dynamics from force actuator to force sensor is shown in Figure <a href=
</div> </div>
</div> </div>
<div id="outline-container-orgaaed0b1" class="outline-3"> <div id="outline-container-org947ca92" class="outline-3">
<h3 id="orgaaed0b1"><span class="section-number-3">2.3</span> Obtained Damping</h3> <h3 id="org947ca92"><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.
@ -585,8 +607,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-orgf95ef97" class="outline-3"> <div id="outline-container-orgade2418" class="outline-3">
<h3 id="orgf95ef97"><span class="section-number-3">2.4</span> Conclusion</h3> <h3 id="orgade2418"><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>
@ -605,10 +627,21 @@ Thus, if Integral Force Feedback is to be used in a Stewart platform with flexib
<p> <p>
<a id="org0aa816a"></a> <a id="org0aa816a"></a>
</p> </p>
<div class="note">
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_dvf.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run active_damping_dvf.m</code>.
</p>
</div>
</div> </div>
<div id="outline-container-orgc7446b0" class="outline-3"> <div id="outline-container-orgcaa6199" class="outline-3">
<h3 id="orgc7446b0"><span class="section-number-3">3.1</span> Identification of the Dynamics with perfect Joints</h3> <h3 id="orgcaa6199"><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.
@ -670,8 +703,8 @@ The transfer function from actuator forces to relative motion sensors is shown i
</div> </div>
<div id="outline-container-orged14fce" class="outline-3"> <div id="outline-container-orgd637197" class="outline-3">
<h3 id="orged14fce"><span class="section-number-3">3.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3> <h3 id="orgd637197"><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.
@ -707,8 +740,8 @@ The new dynamics from force actuator to relative motion sensor is shown in Figur
</div> </div>
</div> </div>
<div id="outline-container-orga745203" class="outline-3"> <div id="outline-container-orgd895eeb" class="outline-3">
<h3 id="orga745203"><span class="section-number-3">3.3</span> Obtained Damping</h3> <h3 id="orgd895eeb"><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.
@ -733,8 +766,8 @@ The root locus is shown in figure <a href="#org277d60d">10</a>.
</div> </div>
</div> </div>
<div id="outline-container-org711b15d" class="outline-3"> <div id="outline-container-orgeaf5ef8" class="outline-3">
<h3 id="org711b15d"><span class="section-number-3">3.4</span> Conclusion</h3> <h3 id="orgeaf5ef8"><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>
@ -748,7 +781,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. 14:50</p> <p class="date">Created: 2020-02-13 jeu. 16:46</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:01 --> <!-- 2020-02-13 jeu. 16:46 -->
<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>
@ -274,33 +274,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="#org510da86">1.5. Conclusion</a></li> <li><a href="#orgaaa4012">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="#org949a403">2.2. Conclusion</a></li> <li><a href="#orge4b07dd">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="#orgfc7135f">3.2. Conclusion</a></li> <li><a href="#orga34a399">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="#org2e09bcb">4.3. Conclusion</a></li> <li><a href="#org2a36f1e">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="#org8c1a310">5.3. Conclusion</a></li> <li><a href="#orgbde7788">5.3. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org3044455">6. Functions</a> <li><a href="#org3044455">6. Functions</a>
@ -355,6 +355,17 @@ In this document, the cubic architecture is analyzed:
<p> <p>
<a id="orgda0ee50"></a> <a id="orgda0ee50"></a>
</p> </p>
<div class="note">
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/cubic_conf_stiffnessl.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run cubic_conf_stiffness.m</code>.
</p>
</div>
<p> <p>
First, we have to understand what is the physical meaning of the Stiffness matrix \(\bm{K}\). First, we have to understand what is the physical meaning of the Stiffness matrix \(\bm{K}\).
</p> </p>
@ -389,6 +400,7 @@ One has to note that this is only valid in a static way.
We here study what makes the Stiffness matrix diagonal when using a cubic configuration. We here study what makes the Stiffness matrix diagonal when using a cubic configuration.
</p> </p>
</div> </div>
<div id="outline-container-orgf6f7ad2" class="outline-3"> <div id="outline-container-orgf6f7ad2" class="outline-3">
<h3 id="orgf6f7ad2"><span class="section-number-3">1.1</span> Cubic Stewart platform centered with the cube center - Jacobian estimated at the cube center</h3> <h3 id="orgf6f7ad2"><span class="section-number-3">1.1</span> Cubic Stewart platform centered with the cube center - Jacobian estimated at the cube center</h3>
<div class="outline-text-3" id="text-1-1"> <div class="outline-text-3" id="text-1-1">
@ -836,8 +848,8 @@ stewart = initializeCylindricalPlatforms(stewart, <span class="org-string">'Fpr'
</div> </div>
</div> </div>
<div id="outline-container-org510da86" class="outline-3"> <div id="outline-container-orgaaa4012" class="outline-3">
<h3 id="org510da86"><span class="section-number-3">1.5</span> Conclusion</h3> <h3 id="orgaaa4012"><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>
@ -859,6 +871,17 @@ Here are the conclusion about the Stiffness matrix for the Cubic configuration:
<p> <p>
<a id="orgb73265d"></a> <a id="orgb73265d"></a>
</p> </p>
<div class="note">
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/cubic_conf_above_platforml.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run cubic_conf_above_platform.m</code>.
</p>
</div>
<p> <p>
We saw in section <a href="#orgda0ee50">1</a> that in order to have a diagonal stiffness matrix, we need the cube&rsquo;s center to be located at frames \(\{A\}\) and \(\{B\}\). We saw in section <a href="#orgda0ee50">1</a> that in order to have a diagonal stiffness matrix, we need the cube&rsquo;s center to be located at frames \(\{A\}\) and \(\{B\}\).
Or, we usually want to have \(\{A\}\) and \(\{B\}\) located above the top platform where forces are applied and where displacements are expressed. Or, we usually want to have \(\{A\}\) and \(\{B\}\) located above the top platform where forces are applied and where displacements are expressed.
@ -868,6 +891,7 @@ Or, we usually want to have \(\{A\}\) and \(\{B\}\) located above the top platfo
We here see if the cubic configuration can provide a diagonal stiffness matrix when \(\{A\}\) and \(\{B\}\) are above the mobile platform. We here see if the cubic configuration can provide a diagonal stiffness matrix when \(\{A\}\) and \(\{B\}\) are above the mobile platform.
</p> </p>
</div> </div>
<div id="outline-container-org8afa645" class="outline-3"> <div id="outline-container-org8afa645" class="outline-3">
<h3 id="org8afa645"><span class="section-number-3">2.1</span> Having Cube&rsquo;s center above the top platform</h3> <h3 id="org8afa645"><span class="section-number-3">2.1</span> Having Cube&rsquo;s center above the top platform</h3>
<div class="outline-text-3" id="text-2-1"> <div class="outline-text-3" id="text-2-1">
@ -1162,8 +1186,8 @@ FOc = H <span class="org-type">+</span> MO_B; <span class="org-comment">% Cente
</div> </div>
</div> </div>
<div id="outline-container-org949a403" class="outline-3"> <div id="outline-container-orge4b07dd" class="outline-3">
<h3 id="org949a403"><span class="section-number-3">2.2</span> Conclusion</h3> <h3 id="orge4b07dd"><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>
@ -1182,6 +1206,17 @@ Depending on the cube&rsquo;s size, we obtain 3 different configurations.
<p> <p>
<a id="org348ec7d"></a> <a id="org348ec7d"></a>
</p> </p>
<div class="note">
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/cubic_conf_size_analysisl.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run cubic_conf_size_analysis.m</code>.
</p>
</div>
<p> <p>
We here study the effect of the size of the cube used for the Stewart Cubic configuration. We here study the effect of the size of the cube used for the Stewart Cubic configuration.
</p> </p>
@ -1194,6 +1229,7 @@ We fix the height of the Stewart platform, the center of the cube is at the cent
We only vary the size of the cube. We only vary the size of the cube.
</p> </p>
</div> </div>
<div id="outline-container-org0029d8c" class="outline-3"> <div id="outline-container-org0029d8c" class="outline-3">
<h3 id="org0029d8c"><span class="section-number-3">3.1</span> Analysis</h3> <h3 id="org0029d8c"><span class="section-number-3">3.1</span> Analysis</h3>
<div class="outline-text-3" id="text-3-1"> <div class="outline-text-3" id="text-3-1">
@ -1237,8 +1273,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-orgfc7135f" class="outline-3"> <div id="outline-container-orga34a399" class="outline-3">
<h3 id="orgfc7135f"><span class="section-number-3">3.2</span> Conclusion</h3> <h3 id="orga34a399"><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.
@ -1260,6 +1296,17 @@ In order to maximize the rotational stiffness of the Stewart platform, the size
<p> <p>
<a id="org00d3816"></a> <a id="org00d3816"></a>
</p> </p>
<div class="note">
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/cubic_conf_coupling_cartesianl.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run cubic_conf_coupling_cartesian.m</code>.
</p>
</div>
<p> <p>
In this section, we study the dynamics of the platform in the cartesian frame. In this section, we study the dynamics of the platform in the cartesian frame.
</p> </p>
@ -1316,6 +1363,7 @@ We conclude that the <b>static</b> behavior of the platform depends on the stiff
For the cubic configuration, we have a diagonal stiffness matrix is the frames \(\{A\}\) and \(\{B\}\) are coincident with the cube&rsquo;s center. For the cubic configuration, we have a diagonal stiffness matrix is the frames \(\{A\}\) and \(\{B\}\) are coincident with the cube&rsquo;s center.
</p> </p>
</div> </div>
<div id="outline-container-org5fe01ec" class="outline-3"> <div id="outline-container-org5fe01ec" class="outline-3">
<h3 id="org5fe01ec"><span class="section-number-3">4.1</span> Cube&rsquo;s center at the Center of Mass of the mobile platform</h3> <h3 id="org5fe01ec"><span class="section-number-3">4.1</span> Cube&rsquo;s center at the Center of Mass of the mobile platform</h3>
<div class="outline-text-3" id="text-4-1"> <div class="outline-text-3" id="text-4-1">
@ -1595,8 +1643,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-org2e09bcb" class="outline-3"> <div id="outline-container-org2a36f1e" class="outline-3">
<h3 id="org2e09bcb"><span class="section-number-3">4.3</span> Conclusion</h3> <h3 id="org2a36f1e"><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>
@ -1618,6 +1666,17 @@ Some conclusions can be drawn from the above analysis:
<p> <p>
<a id="org5b5c8a9"></a> <a id="org5b5c8a9"></a>
</p> </p>
<div class="note">
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/cubic_conf_coupling_strutsl.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run cubic_conf_coupling_struts.m</code>.
</p>
</div>
<p> <p>
From <a class='org-ref-reference' href="#preumont07_six_axis_singl_stage_activ">preumont07_six_axis_singl_stage_activ</a>, the cubic configuration &ldquo;<i>minimizes the cross-coupling amongst actuators and sensors of different legs (being orthogonal to each other)</i>&rdquo;. From <a class='org-ref-reference' href="#preumont07_six_axis_singl_stage_activ">preumont07_six_axis_singl_stage_activ</a>, the cubic configuration &ldquo;<i>minimizes the cross-coupling amongst actuators and sensors of different legs (being orthogonal to each other)</i>&rdquo;.
</p> </p>
@ -1630,6 +1689,7 @@ In this section, we wish to study such properties of the cubic architecture.
We will compare the transfer function from sensors to actuators in each strut for a cubic architecture and for a non-cubic architecture (where the struts are not orthogonal with each other). We will compare the transfer function from sensors to actuators in each strut for a cubic architecture and for a non-cubic architecture (where the struts are not orthogonal with each other).
</p> </p>
</div> </div>
<div id="outline-container-org6e391c9" class="outline-3"> <div id="outline-container-org6e391c9" class="outline-3">
<h3 id="org6e391c9"><span class="section-number-3">5.1</span> Coupling between the actuators and sensors - Cubic Architecture</h3> <h3 id="org6e391c9"><span class="section-number-3">5.1</span> Coupling between the actuators and sensors - Cubic Architecture</h3>
<div class="outline-text-3" id="text-5-1"> <div class="outline-text-3" id="text-5-1">
@ -1766,8 +1826,8 @@ And we identify the dynamics from the actuator forces \(\tau_{i}\) to the relati
</div> </div>
</div> </div>
<div id="outline-container-org8c1a310" class="outline-3"> <div id="outline-container-orgbde7788" class="outline-3">
<h3 id="org8c1a310"><span class="section-number-3">5.3</span> Conclusion</h3> <h3 id="orgbde7788"><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>
@ -1938,7 +1998,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-13 jeu. 15:01</p> <p class="date">Created: 2020-02-13 jeu. 16:46</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-12 mer. 10:22 --> <!-- 2020-02-13 jeu. 16:46 -->
<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>Kinematic Study of the Stewart Platform</title> <title>Kinematic Study of the Stewart Platform</title>
@ -285,55 +285,55 @@ for the JavaScript code in this tag.
<li><a href="#orgebda1d9">3.1. Inverse Kinematics</a></li> <li><a href="#orgebda1d9">3.1. Inverse Kinematics</a></li>
<li><a href="#org1795522">3.2. Forward Kinematics</a></li> <li><a href="#org1795522">3.2. Forward Kinematics</a></li>
<li><a href="#org5a3ce80">3.3. Approximate solution of the Forward and Inverse Kinematic problem for small displacement using the Jacobian matrix</a></li> <li><a href="#org5a3ce80">3.3. Approximate solution of the Forward and Inverse Kinematic problem for small displacement using the Jacobian matrix</a></li>
<li><a href="#org86b4b35">3.4. Estimation of the range validity of the approximate inverse kinematics</a>
<ul>
<li><a href="#orgc3c7024">3.4.1. Stewart architecture definition</a></li>
<li><a href="#orgd83ccf3">3.4.2. Comparison for &ldquo;pure&rdquo; translations</a></li>
<li><a href="#org4871c83">3.4.3. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org86b4b35">4. Estimation of the range validity of the approximate inverse kinematics</a>
<ul>
<li><a href="#org4c04fb5">4.1. Stewart architecture definition</a></li>
<li><a href="#orgd83ccf3">4.2. Comparison for &ldquo;pure&rdquo; translations</a></li>
<li><a href="#org4871c83">4.3. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org63255f9">4. Estimated required actuator stroke from specified platform mobility</a> <li><a href="#org63255f9">5. Estimated required actuator stroke from specified platform mobility</a>
<ul> <ul>
<li><a href="#orgea4978b">4.1. Stewart architecture definition</a></li> <li><a href="#org62824e9">5.1. Stewart architecture definition</a></li>
<li><a href="#orgde50dd3">4.2. Wanted translations and rotations</a></li> <li><a href="#orgde50dd3">5.2. Wanted translations and rotations</a></li>
<li><a href="#org24e45ca">4.3. Needed stroke for &ldquo;pure&rdquo; rotations or translations</a></li> <li><a href="#org24e45ca">5.3. Needed stroke for &ldquo;pure&rdquo; rotations or translations</a></li>
<li><a href="#orgf6ba90c">4.4. Needed stroke for &ldquo;combined&rdquo; rotations or translations</a></li> <li><a href="#orgf6ba90c">5.4. Needed stroke for &ldquo;combined&rdquo; rotations or translations</a></li>
</ul> </ul>
</li> </li>
<li><a href="#orgbbbf7b3">5. Estimated platform mobility from specified actuator stroke</a> <li><a href="#orgbbbf7b3">6. Estimated platform mobility from specified actuator stroke</a>
<ul> <ul>
<li><a href="#orgbecdc67">5.1. Stewart architecture definition</a></li> <li><a href="#org7423428">6.1. Stewart architecture definition</a></li>
<li><a href="#org2c6819e">5.2. Pure translations</a></li> <li><a href="#org2c6819e">6.2. Pure translations</a></li>
</ul> </ul>
</li> </li>
<li><a href="#orgc4916dc">6. Functions</a> <li><a href="#orgc4916dc">7. Functions</a>
<ul> <ul>
<li><a href="#org26e8b28">6.1. <code>computeJacobian</code>: Compute the Jacobian Matrix</a> <li><a href="#org26e8b28">7.1. <code>computeJacobian</code>: Compute the Jacobian Matrix</a>
<ul> <ul>
<li><a href="#org1a620fe">Function description</a></li> <li><a href="#orgd29f673">Function description</a></li>
<li><a href="#org9c3aa33">Check the <code>stewart</code> structure elements</a></li> <li><a href="#org4bcb03f">Check the <code>stewart</code> structure elements</a></li>
<li><a href="#org0cd57b5">Compute Jacobian Matrix</a></li> <li><a href="#org0cd57b5">Compute Jacobian Matrix</a></li>
<li><a href="#orge21dcfc">Compute Stiffness Matrix</a></li> <li><a href="#orge21dcfc">Compute Stiffness Matrix</a></li>
<li><a href="#orgae76071">Compute Compliance Matrix</a></li> <li><a href="#orgae76071">Compute Compliance Matrix</a></li>
<li><a href="#org78f18d7">Populate the <code>stewart</code> structure</a></li> <li><a href="#org78f18d7">Populate the <code>stewart</code> structure</a></li>
</ul> </ul>
</li> </li>
<li><a href="#orgb82066f">6.2. <code>inverseKinematics</code>: Compute Inverse Kinematics</a> <li><a href="#orgb82066f">7.2. <code>inverseKinematics</code>: Compute Inverse Kinematics</a>
<ul> <ul>
<li><a href="#org89930b7">Theory</a></li> <li><a href="#org89930b7">Theory</a></li>
<li><a href="#orgd97252a">Function description</a></li> <li><a href="#org9c9b2ba">Function description</a></li>
<li><a href="#org7be1dc4">Optional Parameters</a></li> <li><a href="#orgd8e2476">Optional Parameters</a></li>
<li><a href="#orga7b29d7">Check the <code>stewart</code> structure elements</a></li> <li><a href="#org8d85541">Check the <code>stewart</code> structure elements</a></li>
<li><a href="#org0d64c23">Compute</a></li> <li><a href="#org0d64c23">Compute</a></li>
</ul> </ul>
</li> </li>
<li><a href="#orgf5d8f0b">6.3. <code>forwardKinematicsApprox</code>: Compute the Approximate Forward Kinematics</a> <li><a href="#orgf5d8f0b">7.3. <code>forwardKinematicsApprox</code>: Compute the Approximate Forward Kinematics</a>
<ul> <ul>
<li><a href="#org1a280b0">Function description</a></li> <li><a href="#orgd0d007d">Function description</a></li>
<li><a href="#orge4b0020">Optional Parameters</a></li> <li><a href="#org867b3a0">Optional Parameters</a></li>
<li><a href="#org08a6ec5">Check the <code>stewart</code> structure elements</a></li> <li><a href="#orge1b5b04">Check the <code>stewart</code> structure elements</a></li>
<li><a href="#orge5ade24">Computation</a></li> <li><a href="#orge5ade24">Computation</a></li>
</ul> </ul>
</li> </li>
@ -360,7 +360,8 @@ The current document is divided in the following sections:
<li>Section <a href="#orgc45d118">1</a>: The Jacobian matrix is derived from the geometry of the Stewart platform. Then it is shown that the Jacobian can link velocities and forces present in the system, and thus this matrix can be very useful for both analysis and control of the Stewart platform.</li> <li>Section <a href="#orgc45d118">1</a>: The Jacobian matrix is derived from the geometry of the Stewart platform. Then it is shown that the Jacobian can link velocities and forces present in the system, and thus this matrix can be very useful for both analysis and control of the Stewart platform.</li>
<li>Section <a href="#orgf9e4f1a">2</a>: The stiffness and compliance matrices are derived from the Jacobian matrix and the stiffness of each strut.</li> <li>Section <a href="#orgf9e4f1a">2</a>: The stiffness and compliance matrices are derived from the Jacobian matrix and the stiffness of each strut.</li>
<li>Section <a href="#orgca82bb8">3</a>: The Forward and Inverse kinematic problems are presented.</li> <li>Section <a href="#orgca82bb8">3</a>: The Forward and Inverse kinematic problems are presented.</li>
<li>Section <a href="#orge72d811">4</a>: The Inverse kinematic solution is used to estimate required actuator stroke from the wanted mobility of the Stewart platform.</li> <li>Section <a href="#org7d1d866">4</a>: The approximate solution of the Inverse kinematic problem is compared with the exact solution in order to determine the validity of the approximation.</li>
<li>Section <a href="#org1f540fa">5</a>: The Inverse kinematic solution is used to estimate required actuator stroke from the wanted mobility of the Stewart platform.</li>
</ul> </ul>
<div id="outline-container-org6858f1f" class="outline-2"> <div id="outline-container-org6858f1f" class="outline-2">
@ -647,13 +648,25 @@ The function <code>forwardKinematicsApprox</code> (described <a href="#orgdb3143
</p> </p>
</div> </div>
</div> </div>
</div>
<div id="outline-container-org86b4b35" class="outline-3"> <div id="outline-container-org86b4b35" class="outline-2">
<h3 id="org86b4b35"><span class="section-number-3">3.4</span> Estimation of the range validity of the approximate inverse kinematics</h3> <h2 id="org86b4b35"><span class="section-number-2">4</span> Estimation of the range validity of the approximate inverse kinematics</h2>
<div class="outline-text-3" id="text-3-4"> <div class="outline-text-2" id="text-4">
<p> <p>
<a id="org2bfd694"></a> <a id="org7d1d866"></a>
</p> </p>
<div class="note">
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/kinematic_study_approximation_validity.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run kinematic_study_approximation_validity.m</code>.
</p>
</div>
<p> <p>
As we know how to exactly solve the Inverse kinematic problem, we can compare the exact solution with the approximate solution using the Jacobian matrix. As we know how to exactly solve the Inverse kinematic problem, we can compare the exact solution with the approximate solution using the Jacobian matrix.
For small displacements, the approximate solution is expected to work well. For small displacements, the approximate solution is expected to work well.
@ -666,9 +679,9 @@ This will also gives us the range for which the approximate forward kinematic is
</p> </p>
</div> </div>
<div id="outline-container-orgc3c7024" class="outline-4"> <div id="outline-container-org4c04fb5" class="outline-3">
<h4 id="orgc3c7024"><span class="section-number-4">3.4.1</span> Stewart architecture definition</h4> <h3 id="org4c04fb5"><span class="section-number-3">4.1</span> Stewart architecture definition</h3>
<div class="outline-text-4" id="text-3-4-1"> <div class="outline-text-3" id="text-4-1">
<p> <p>
We first define some general Stewart architecture. We first define some general Stewart architecture.
</p> </p>
@ -688,9 +701,9 @@ stewart = computeJacobian(stewart);
</div> </div>
</div> </div>
<div id="outline-container-orgd83ccf3" class="outline-4"> <div id="outline-container-orgd83ccf3" class="outline-3">
<h4 id="orgd83ccf3"><span class="section-number-4">3.4.2</span> Comparison for &ldquo;pure&rdquo; translations</h4> <h3 id="orgd83ccf3"><span class="section-number-3">4.2</span> Comparison for &ldquo;pure&rdquo; translations</h3>
<div class="outline-text-4" id="text-3-4-2"> <div class="outline-text-3" id="text-4-2">
<p> <p>
Let&rsquo;s first compare the perfect and approximate solution of the inverse for pure \(x\) translations. Let&rsquo;s first compare the perfect and approximate solution of the inverse for pure \(x\) translations.
</p> </p>
@ -730,9 +743,9 @@ Ls_exact = zeros(6, length(Xrs));
</div> </div>
</div> </div>
<div id="outline-container-org4871c83" class="outline-4"> <div id="outline-container-org4871c83" class="outline-3">
<h4 id="org4871c83"><span class="section-number-4">3.4.3</span> Conclusion</h4> <h3 id="org4871c83"><span class="section-number-3">4.3</span> Conclusion</h3>
<div class="outline-text-4" id="text-3-4-3"> <div class="outline-text-3" id="text-4-3">
<div class="important"> <div class="important">
<p> <p>
For small wanted displacements (up to \(\approx 1\%\) of the size of the Hexapod), the approximate inverse kinematic solution using the Jacobian matrix is quite correct. For small wanted displacements (up to \(\approx 1\%\) of the size of the Hexapod), the approximate inverse kinematic solution using the Jacobian matrix is quite correct.
@ -742,23 +755,34 @@ For small wanted displacements (up to \(\approx 1\%\) of the size of the Hexapod
</div> </div>
</div> </div>
</div> </div>
</div>
<div id="outline-container-org63255f9" class="outline-2"> <div id="outline-container-org63255f9" class="outline-2">
<h2 id="org63255f9"><span class="section-number-2">4</span> Estimated required actuator stroke from specified platform mobility</h2> <h2 id="org63255f9"><span class="section-number-2">5</span> Estimated required actuator stroke from specified platform mobility</h2>
<div class="outline-text-2" id="text-4"> <div class="outline-text-2" id="text-5">
<p> <p>
<a id="orge72d811"></a> <a id="org1f540fa"></a>
</p> </p>
<div class="note">
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/kinematic_study_required_actuator_stroke.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run kinematic_study_required_actuator_stroke.m</code>.
</p>
</div>
<p> <p>
Let&rsquo;s say one want to design a Stewart platform with some specified mobility (position and orientation). Let&rsquo;s say one want to design a Stewart platform with some specified mobility (position and orientation).
One may want to determine the required actuator stroke required to obtain the specified mobility. One may want to determine the required actuator stroke required to obtain the specified mobility.
This is what is analyzed in this section. This is what is analyzed in this section.
</p> </p>
</div> </div>
<div id="outline-container-orgea4978b" class="outline-3">
<h3 id="orgea4978b"><span class="section-number-3">4.1</span> Stewart architecture definition</h3> <div id="outline-container-org62824e9" class="outline-3">
<div class="outline-text-3" id="text-4-1"> <h3 id="org62824e9"><span class="section-number-3">5.1</span> Stewart architecture definition</h3>
<div class="outline-text-3" id="text-5-1">
<p> <p>
Let&rsquo;s first define the Stewart platform architecture that we want to study. Let&rsquo;s first define the Stewart platform architecture that we want to study.
</p> </p>
@ -779,8 +803,8 @@ stewart = computeJacobian(stewart);
</div> </div>
<div id="outline-container-orgde50dd3" class="outline-3"> <div id="outline-container-orgde50dd3" class="outline-3">
<h3 id="orgde50dd3"><span class="section-number-3">4.2</span> Wanted translations and rotations</h3> <h3 id="orgde50dd3"><span class="section-number-3">5.2</span> Wanted translations and rotations</h3>
<div class="outline-text-3" id="text-4-2"> <div class="outline-text-3" id="text-5-2">
<p> <p>
Let&rsquo;s now define the wanted extreme translations and rotations. Let&rsquo;s now define the wanted extreme translations and rotations.
</p> </p>
@ -797,8 +821,8 @@ Rz_max = 0; <span class="org-comment">% Rotation [rad]</span>
</div> </div>
<div id="outline-container-org24e45ca" class="outline-3"> <div id="outline-container-org24e45ca" class="outline-3">
<h3 id="org24e45ca"><span class="section-number-3">4.3</span> Needed stroke for &ldquo;pure&rdquo; rotations or translations</h3> <h3 id="org24e45ca"><span class="section-number-3">5.3</span> Needed stroke for &ldquo;pure&rdquo; rotations or translations</h3>
<div class="outline-text-3" id="text-4-3"> <div class="outline-text-3" id="text-5-3">
<p> <p>
As a first estimation, we estimate the needed actuator stroke for &ldquo;pure&rdquo; rotations and translation. As a first estimation, we estimate the needed actuator stroke for &ldquo;pure&rdquo; rotations and translation.
We do that using either the Inverse Kinematic solution or the Jacobian matrix as an approximation. We do that using either the Inverse Kinematic solution or the Jacobian matrix as an approximation.
@ -829,8 +853,8 @@ This is surely a low estimation of the required stroke.
</div> </div>
<div id="outline-container-orgf6ba90c" class="outline-3"> <div id="outline-container-orgf6ba90c" class="outline-3">
<h3 id="orgf6ba90c"><span class="section-number-3">4.4</span> Needed stroke for &ldquo;combined&rdquo; rotations or translations</h3> <h3 id="orgf6ba90c"><span class="section-number-3">5.4</span> Needed stroke for &ldquo;combined&rdquo; rotations or translations</h3>
<div class="outline-text-3" id="text-4-4"> <div class="outline-text-3" id="text-5-4">
<p> <p>
We know would like to have a more precise estimation. We know would like to have a more precise estimation.
</p> </p>
@ -1150,11 +1174,22 @@ This is probably a much realistic estimation of the required actuator stroke.
</div> </div>
<div id="outline-container-orgbbbf7b3" class="outline-2"> <div id="outline-container-orgbbbf7b3" class="outline-2">
<h2 id="orgbbbf7b3"><span class="section-number-2">5</span> Estimated platform mobility from specified actuator stroke</h2> <h2 id="orgbbbf7b3"><span class="section-number-2">6</span> Estimated platform mobility from specified actuator stroke</h2>
<div class="outline-text-2" id="text-5"> <div class="outline-text-2" id="text-6">
<p> <p>
<a id="orgeca09fb"></a> <a id="org9e16ee3"></a>
</p> </p>
<div class="note">
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/kinematic_study_mobility.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run kinematic_study_mobility.m</code>.
</p>
</div>
<p> <p>
Here, from some value of the actuator stroke, we would like to estimate the mobility of the Stewart platform. Here, from some value of the actuator stroke, we would like to estimate the mobility of the Stewart platform.
</p> </p>
@ -1164,9 +1199,10 @@ As explained in section <a href="#orgca82bb8">3</a>, the forward kinematic probl
However, for small displacements, we can use the Jacobian as an approximate solution. However, for small displacements, we can use the Jacobian as an approximate solution.
</p> </p>
</div> </div>
<div id="outline-container-orgbecdc67" class="outline-3">
<h3 id="orgbecdc67"><span class="section-number-3">5.1</span> Stewart architecture definition</h3> <div id="outline-container-org7423428" class="outline-3">
<div class="outline-text-3" id="text-5-1"> <h3 id="org7423428"><span class="section-number-3">6.1</span> Stewart architecture definition</h3>
<div class="outline-text-3" id="text-6-1">
<p> <p>
Let&rsquo;s first define the Stewart platform architecture that we want to study. Let&rsquo;s first define the Stewart platform architecture that we want to study.
</p> </p>
@ -1196,8 +1232,8 @@ L_max = 50e<span class="org-type">-</span>6; <span class="org-comment">% [m]</s
</div> </div>
<div id="outline-container-org2c6819e" class="outline-3"> <div id="outline-container-org2c6819e" class="outline-3">
<h3 id="org2c6819e"><span class="section-number-3">5.2</span> Pure translations</h3> <h3 id="org2c6819e"><span class="section-number-3">6.2</span> Pure translations</h3>
<div class="outline-text-3" id="text-5-2"> <div class="outline-text-3" id="text-6-2">
<p> <p>
Let&rsquo;s first estimate the mobility in translation when the orientation of the Stewart platform stays the same. Let&rsquo;s first estimate the mobility in translation when the orientation of the Stewart platform stays the same.
</p> </p>
@ -1278,15 +1314,15 @@ We can also approximate the mobility by a sphere with a radius equal to the mini
</div> </div>
<div id="outline-container-orgc4916dc" class="outline-2"> <div id="outline-container-orgc4916dc" class="outline-2">
<h2 id="orgc4916dc"><span class="section-number-2">6</span> Functions</h2> <h2 id="orgc4916dc"><span class="section-number-2">7</span> Functions</h2>
<div class="outline-text-2" id="text-6"> <div class="outline-text-2" id="text-7">
<p> <p>
<a id="orgf9a6042"></a> <a id="orgf9a6042"></a>
</p> </p>
</div> </div>
<div id="outline-container-org26e8b28" class="outline-3"> <div id="outline-container-org26e8b28" class="outline-3">
<h3 id="org26e8b28"><span class="section-number-3">6.1</span> <code>computeJacobian</code>: Compute the Jacobian Matrix</h3> <h3 id="org26e8b28"><span class="section-number-3">7.1</span> <code>computeJacobian</code>: Compute the Jacobian Matrix</h3>
<div class="outline-text-3" id="text-6-1"> <div class="outline-text-3" id="text-7-1">
<p> <p>
<a id="org2387f19"></a> <a id="org2387f19"></a>
</p> </p>
@ -1296,9 +1332,9 @@ This Matlab function is accessible <a href="../src/computeJacobian.m">here</a>.
</p> </p>
</div> </div>
<div id="outline-container-org1a620fe" class="outline-4"> <div id="outline-container-orgd29f673" class="outline-4">
<h4 id="org1a620fe">Function description</h4> <h4 id="orgd29f673">Function description</h4>
<div class="outline-text-4" id="text-org1a620fe"> <div class="outline-text-4" id="text-orgd29f673">
<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">[stewart]</span> = <span class="org-function-name">computeJacobian</span>(<span class="org-variable-name">stewart</span>) <pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[stewart]</span> = <span class="org-function-name">computeJacobian</span>(<span class="org-variable-name">stewart</span>)
<span class="org-comment">% computeJacobian -</span> <span class="org-comment">% computeJacobian -</span>
@ -1321,9 +1357,9 @@ This Matlab function is accessible <a href="../src/computeJacobian.m">here</a>.
</div> </div>
</div> </div>
<div id="outline-container-org9c3aa33" class="outline-4"> <div id="outline-container-org4bcb03f" class="outline-4">
<h4 id="org9c3aa33">Check the <code>stewart</code> structure elements</h4> <h4 id="org4bcb03f">Check the <code>stewart</code> structure elements</h4>
<div class="outline-text-4" id="text-org9c3aa33"> <div class="outline-text-4" id="text-org4bcb03f">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">assert(isfield(stewart.geometry, <span class="org-string">'As'</span>), <span class="org-string">'stewart.geometry should have attribute As'</span>) <pre class="src src-matlab">assert(isfield(stewart.geometry, <span class="org-string">'As'</span>), <span class="org-string">'stewart.geometry should have attribute As'</span>)
As = stewart.geometry.As; As = stewart.geometry.As;
@ -1384,8 +1420,8 @@ stewart.kinematics.C = C;
<div id="outline-container-orgb82066f" class="outline-3"> <div id="outline-container-orgb82066f" class="outline-3">
<h3 id="orgb82066f"><span class="section-number-3">6.2</span> <code>inverseKinematics</code>: Compute Inverse Kinematics</h3> <h3 id="orgb82066f"><span class="section-number-3">7.2</span> <code>inverseKinematics</code>: Compute Inverse Kinematics</h3>
<div class="outline-text-3" id="text-6-2"> <div class="outline-text-3" id="text-7-2">
<p> <p>
<a id="orgb8859d7"></a> <a id="orgb8859d7"></a>
</p> </p>
@ -1431,9 +1467,9 @@ Otherwise, when the limbs&rsquo; lengths derived yield complex numbers, then the
</div> </div>
</div> </div>
<div id="outline-container-orgd97252a" class="outline-4"> <div id="outline-container-org9c9b2ba" class="outline-4">
<h4 id="orgd97252a">Function description</h4> <h4 id="org9c9b2ba">Function description</h4>
<div class="outline-text-4" id="text-orgd97252a"> <div class="outline-text-4" id="text-org9c9b2ba">
<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">[Li, dLi]</span> = <span class="org-function-name">inverseKinematics</span>(<span class="org-variable-name">stewart</span>, <span class="org-variable-name">args</span>) <pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[Li, dLi]</span> = <span class="org-function-name">inverseKinematics</span>(<span class="org-variable-name">stewart</span>, <span class="org-variable-name">args</span>)
<span class="org-comment">% inverseKinematics - Compute the needed length of each strut to have the wanted position and orientation of {B} with respect to {A}</span> <span class="org-comment">% inverseKinematics - Compute the needed length of each strut to have the wanted position and orientation of {B} with respect to {A}</span>
@ -1457,9 +1493,9 @@ Otherwise, when the limbs&rsquo; lengths derived yield complex numbers, then the
</div> </div>
</div> </div>
<div id="outline-container-org7be1dc4" class="outline-4"> <div id="outline-container-orgd8e2476" class="outline-4">
<h4 id="org7be1dc4">Optional Parameters</h4> <h4 id="orgd8e2476">Optional Parameters</h4>
<div class="outline-text-4" id="text-org7be1dc4"> <div class="outline-text-4" id="text-orgd8e2476">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">arguments <pre class="src src-matlab">arguments
stewart stewart
@ -1471,9 +1507,9 @@ Otherwise, when the limbs&rsquo; lengths derived yield complex numbers, then the
</div> </div>
</div> </div>
<div id="outline-container-orga7b29d7" class="outline-4"> <div id="outline-container-org8d85541" class="outline-4">
<h4 id="orga7b29d7">Check the <code>stewart</code> structure elements</h4> <h4 id="org8d85541">Check the <code>stewart</code> structure elements</h4>
<div class="outline-text-4" id="text-orga7b29d7"> <div class="outline-text-4" id="text-org8d85541">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">assert(isfield(stewart.geometry, <span class="org-string">'Aa'</span>), <span class="org-string">'stewart.geometry should have attribute Aa'</span>) <pre class="src src-matlab">assert(isfield(stewart.geometry, <span class="org-string">'Aa'</span>), <span class="org-string">'stewart.geometry should have attribute Aa'</span>)
Aa = stewart.geometry.Aa; Aa = stewart.geometry.Aa;
@ -1506,8 +1542,8 @@ l = stewart.geometry.l;
</div> </div>
<div id="outline-container-orgf5d8f0b" class="outline-3"> <div id="outline-container-orgf5d8f0b" class="outline-3">
<h3 id="orgf5d8f0b"><span class="section-number-3">6.3</span> <code>forwardKinematicsApprox</code>: Compute the Approximate Forward Kinematics</h3> <h3 id="orgf5d8f0b"><span class="section-number-3">7.3</span> <code>forwardKinematicsApprox</code>: Compute the Approximate Forward Kinematics</h3>
<div class="outline-text-3" id="text-6-3"> <div class="outline-text-3" id="text-7-3">
<p> <p>
<a id="orgdb31434"></a> <a id="orgdb31434"></a>
</p> </p>
@ -1517,9 +1553,9 @@ This Matlab function is accessible <a href="../src/forwardKinematicsApprox.m">he
</p> </p>
</div> </div>
<div id="outline-container-org1a280b0" class="outline-4"> <div id="outline-container-orgd0d007d" class="outline-4">
<h4 id="org1a280b0">Function description</h4> <h4 id="orgd0d007d">Function description</h4>
<div class="outline-text-4" id="text-org1a280b0"> <div class="outline-text-4" id="text-orgd0d007d">
<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">[P, R]</span> = <span class="org-function-name">forwardKinematicsApprox</span>(<span class="org-variable-name">stewart</span>, <span class="org-variable-name">args</span>) <pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[P, R]</span> = <span class="org-function-name">forwardKinematicsApprox</span>(<span class="org-variable-name">stewart</span>, <span class="org-variable-name">args</span>)
<span class="org-comment">% forwardKinematicsApprox - Computed the approximate pose of {B} with respect to {A} from the length of each strut and using</span> <span class="org-comment">% forwardKinematicsApprox - Computed the approximate pose of {B} with respect to {A} from the length of each strut and using</span>
@ -1541,9 +1577,9 @@ This Matlab function is accessible <a href="../src/forwardKinematicsApprox.m">he
</div> </div>
</div> </div>
<div id="outline-container-orge4b0020" class="outline-4"> <div id="outline-container-org867b3a0" class="outline-4">
<h4 id="orge4b0020">Optional Parameters</h4> <h4 id="org867b3a0">Optional Parameters</h4>
<div class="outline-text-4" id="text-orge4b0020"> <div class="outline-text-4" id="text-org867b3a0">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">arguments <pre class="src src-matlab">arguments
stewart stewart
@ -1554,9 +1590,9 @@ This Matlab function is accessible <a href="../src/forwardKinematicsApprox.m">he
</div> </div>
</div> </div>
<div id="outline-container-org08a6ec5" class="outline-4"> <div id="outline-container-orge1b5b04" class="outline-4">
<h4 id="org08a6ec5">Check the <code>stewart</code> structure elements</h4> <h4 id="orge1b5b04">Check the <code>stewart</code> structure elements</h4>
<div class="outline-text-4" id="text-org08a6ec5"> <div class="outline-text-4" id="text-orge1b5b04">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">assert(isfield(stewart.kinematics, <span class="org-string">'J'</span>), <span class="org-string">'stewart.kinematics should have attribute J'</span>) <pre class="src src-matlab">assert(isfield(stewart.kinematics, <span class="org-string">'J'</span>), <span class="org-string">'stewart.kinematics should have attribute J'</span>)
J = stewart.kinematics.J; J = stewart.kinematics.J;
@ -1619,7 +1655,7 @@ We then compute the corresponding rotation matrix.
</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-12 mer. 10:22</p> <p class="date">Created: 2020-02-13 jeu. 16:46</p>
</div> </div>
</body> </body>
</html> </html>

View File

@ -4,22 +4,27 @@ clear; close all; clc;
%% Intialize Laplace variable %% Intialize Laplace variable
s = zpk('s'); s = zpk('s');
simulinkproject('./'); simulinkproject('../');
open('simulink/stewart_active_damping.slx') open('stewart_platform_model.slx')
% Identification of the Dynamics with perfect Joints % Identification of the Dynamics with perfect Joints
% We first initialize the Stewart platform without joint stiffness. % We first initialize the Stewart platform without joint stiffness.
stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'disable', true); stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none');
ground = initializeGround('type', 'none');
payload = initializePayload('type', 'none');
@ -30,12 +35,12 @@ options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'stewart_active_damping'; mdl = 'stewart_platform_model';
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/F'], 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]
io(io_i) = linio([mdl, '/Dm'], 1, 'openoutput'); io_i = io_i + 1; % Relative Displacement Outputs [N] io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
%% Run the linearization %% Run the linearization
G = linearize(mdl, io, options); G = linearize(mdl, io, options);
@ -46,7 +51,7 @@ G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
% The transfer function from actuator forces to relative motion sensors is shown in Figure [[fig:dvf_plant_coupling]]. % The transfer function from actuator forces to relative motion sensors is shown in Figure [[fig:dvf_plant_coupling]].
freqs = logspace(1, 3, 1000); freqs = logspace(1, 4, 1000);
figure; figure;
@ -79,19 +84,28 @@ legend([p1, p2], {'$D_{m,i}/F_i$', '$D_{m,j}/F_i$'})
linkaxes([ax1,ax2],'x'); linkaxes([ax1,ax2],'x');
% Effect of the Flexible Joint stiffness on the Dynamics % Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics
% 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.
stewart = initializeJointDynamics(stewart); stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
Gf = linearize(mdl, io, options); Gf = linearize(mdl, io, options);
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Gf.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'}; Gf.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
% We now use the amplified actuators and re-identify the dynamics
stewart = initializeAmplifiedStrutDynamics(stewart);
Ga = linearize(mdl, io, options);
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Ga.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
% The new dynamics from force actuator to relative motion sensor is shown in Figure [[fig:dvf_plant_flexible_joint_decentralized]]. % The new dynamics from force actuator to relative motion sensor is shown in Figure [[fig:dvf_plant_flexible_joint_decentralized]].
freqs = logspace(1, 3, 1000); freqs = logspace(1, 4, 1000);
figure; figure;
@ -99,6 +113,7 @@ ax1 = subplot(2, 1, 1);
hold on; hold on;
plot(freqs, abs(squeeze(freqresp(G( 'Dm1', 'F1'), freqs, 'Hz')))); plot(freqs, abs(squeeze(freqresp(G( 'Dm1', 'F1'), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gf('Dm1', 'F1'), freqs, 'Hz')))); plot(freqs, abs(squeeze(freqresp(Gf('Dm1', 'F1'), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Ga('Dm1', 'F1'), freqs, 'Hz'))));
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
@ -107,6 +122,7 @@ ax2 = subplot(2, 1, 2);
hold on; hold on;
plot(freqs, 180/pi*angle(squeeze(freqresp(G( 'Dm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Perfect Joints'); plot(freqs, 180/pi*angle(squeeze(freqresp(G( 'Dm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Perfect Joints');
plot(freqs, 180/pi*angle(squeeze(freqresp(Gf('Dm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Flexible Joints'); plot(freqs, 180/pi*angle(squeeze(freqresp(Gf('Dm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Flexible Joints');
plot(freqs, 180/pi*angle(squeeze(freqresp(Ga('Dm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Amplified Actuators');
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
@ -126,7 +142,7 @@ linkaxes([ax1,ax2],'x');
% & & s % & & s
% \end{bmatrix} \] % \end{bmatrix} \]
% The root locus is shown in figure [[fig:root_locus_dvf_rot_stiffness]] and the obtained pole damping function of the control gain is shown in figure [[fig:pole_damping_gain_dvf_rot_stiffness]]. % The root locus is shown in figure [[fig:root_locus_dvf_rot_stiffness]].
gains = logspace(0, 5, 1000); gains = logspace(0, 5, 1000);
@ -134,45 +150,27 @@ figure;
hold on; hold on;
plot(real(pole(G)), imag(pole(G)), 'x'); plot(real(pole(G)), imag(pole(G)), 'x');
plot(real(pole(Gf)), imag(pole(Gf)), 'x'); plot(real(pole(Gf)), imag(pole(Gf)), 'x');
plot(real(pole(Ga)), imag(pole(Gf)), 'x');
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
plot(real(tzero(G)), imag(tzero(G)), 'o'); plot(real(tzero(G)), imag(tzero(G)), 'o');
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o'); plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
plot(real(tzero(Ga)), imag(tzero(Gf)), 'o');
for i = 1:length(gains) for i = 1:length(gains)
cl_poles = pole(feedback(G, (gains(i)*s)*eye(6)));
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
plot(real(cl_poles), imag(cl_poles), '.'); cl_poles = pole(feedback(G, (gains(i)*s)*eye(6)));
cl_poles = pole(feedback(Gf, (gains(i)*s)*eye(6))); p1 = plot(real(cl_poles), imag(cl_poles), '.');
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
plot(real(cl_poles), imag(cl_poles), '.'); cl_poles = pole(feedback(Gf, (gains(i)*s)*eye(6)));
p2 = plot(real(cl_poles), imag(cl_poles), '.');
set(gca,'ColorOrderIndex',3);
cl_poles = pole(feedback(Ga, (gains(i)*s)*eye(6)));
p3 = plot(real(cl_poles), imag(cl_poles), '.');
end end
ylim([0,inf]); ylim([0, 1.1*max(imag(pole(G)))]);
xlim([-3000,0]); xlim([-1.1*max(imag(pole(G))),0]);
xlabel('Real Part') xlabel('Real Part')
ylabel('Imaginary Part') ylabel('Imaginary Part')
axis square axis square
legend([p1, p2, p3], {'Perfect Joints', 'Flexible Joints', 'Amplified Actuator'}, 'location', 'northwest');
% #+name: fig:root_locus_dvf_rot_stiffness
% #+caption: Root Locus plot with Direct Velocity Feedback when considering the Stiffness of flexible joints ([[./figs/root_locus_dvf_rot_stiffness.png][png]], [[./figs/root_locus_dvf_rot_stiffness.pdf][pdf]])
% [[file:figs/root_locus_dvf_rot_stiffness.png]]
gains = logspace(0, 5, 1000);
figure;
hold on;
for i = 1:length(gains)
set(gca,'ColorOrderIndex',1);
cl_poles = pole(feedback(G, (gains(i)*s)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
set(gca,'ColorOrderIndex',2);
cl_poles = pole(feedback(Gf, (gains(i)*s)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
end
xlabel('Control Gain');
ylabel('Damping of the Poles');
set(gca, 'XScale', 'log');
ylim([0,pi/2]);

View File

@ -4,22 +4,27 @@ clear; close all; clc;
%% Intialize Laplace variable %% Intialize Laplace variable
s = zpk('s'); s = zpk('s');
simulinkproject('./'); simulinkproject('../');
open('simulink/stewart_active_damping.slx') open('stewart_platform_model.slx')
% Identification of the Dynamics with perfect Joints % Identification of the Dynamics with perfect Joints
% We first initialize the Stewart platform without joint stiffness. % We first initialize the Stewart platform without joint stiffness.
stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'disable', true); stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none');
ground = initializeGround('type', 'none');
payload = initializePayload('type', 'none');
@ -30,12 +35,12 @@ options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'stewart_active_damping'; mdl = 'stewart_platform_model';
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/F'], 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]
io(io_i) = linio([mdl, '/Fm'], 1, 'openoutput'); io_i = io_i + 1; % Force Sensor Outputs [N] io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'Taum'); io_i = io_i + 1; % Force Sensor Outputs [N]
%% Run the linearization %% Run the linearization
G = linearize(mdl, io, options); G = linearize(mdl, io, options);
@ -46,7 +51,7 @@ G.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
% The transfer function from actuator forces to force sensors is shown in Figure [[fig:iff_plant_coupling]]. % The transfer function from actuator forces to force sensors is shown in Figure [[fig:iff_plant_coupling]].
freqs = logspace(1, 3, 1000); freqs = logspace(1, 4, 1000);
figure; figure;
@ -79,19 +84,28 @@ legend([p1, p2], {'$F_{m,i}/F_i$', '$F_{m,j}/F_i$'})
linkaxes([ax1,ax2],'x'); linkaxes([ax1,ax2],'x');
% Effect of the Flexible Joint stiffness on the Dynamics % Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics
% 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.
stewart = initializeJointDynamics(stewart); stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
Gf = linearize(mdl, io, options); Gf = linearize(mdl, io, options);
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Gf.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'}; Gf.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
% We now use the amplified actuators and re-identify the dynamics
stewart = initializeAmplifiedStrutDynamics(stewart);
Ga = linearize(mdl, io, options);
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Ga.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
% The new dynamics from force actuator to force sensor is shown in Figure [[fig:iff_plant_flexible_joint_decentralized]]. % The new dynamics from force actuator to force sensor is shown in Figure [[fig:iff_plant_flexible_joint_decentralized]].
freqs = logspace(1, 3, 1000); freqs = logspace(1, 4, 1000);
figure; figure;
@ -99,6 +113,7 @@ ax1 = subplot(2, 1, 1);
hold on; hold on;
plot(freqs, abs(squeeze(freqresp(G( 'Fm1', 'F1'), freqs, 'Hz')))); plot(freqs, abs(squeeze(freqresp(G( 'Fm1', 'F1'), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gf('Fm1', 'F1'), freqs, 'Hz')))); plot(freqs, abs(squeeze(freqresp(Gf('Fm1', 'F1'), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Ga('Fm1', 'F1'), freqs, 'Hz'))));
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]); ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]);
@ -107,6 +122,7 @@ ax2 = subplot(2, 1, 2);
hold on; hold on;
plot(freqs, 180/pi*angle(squeeze(freqresp(G( 'Fm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Perfect Joints'); plot(freqs, 180/pi*angle(squeeze(freqresp(G( 'Fm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Perfect Joints');
plot(freqs, 180/pi*angle(squeeze(freqresp(Gf('Fm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Flexible Joints'); plot(freqs, 180/pi*angle(squeeze(freqresp(Gf('Fm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Flexible Joints');
plot(freqs, 180/pi*angle(squeeze(freqresp(Ga('Fm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Amplified Actuators');
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
@ -134,22 +150,30 @@ figure;
hold on; hold on;
plot(real(pole(G)), imag(pole(G)), 'x'); plot(real(pole(G)), imag(pole(G)), 'x');
plot(real(pole(Gf)), imag(pole(Gf)), 'x'); plot(real(pole(Gf)), imag(pole(Gf)), 'x');
plot(real(pole(Ga)), imag(pole(Ga)), 'x');
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
plot(real(tzero(G)), imag(tzero(G)), 'o'); plot(real(tzero(G)), imag(tzero(G)), 'o');
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o'); plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
plot(real(tzero(Ga)), imag(tzero(Ga)), 'o');
for i = 1:length(gains) for i = 1:length(gains)
cl_poles = pole(feedback(G, (gains(i)/s)*eye(6))); cl_poles = pole(feedback(G, (gains(i)/s)*eye(6)));
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
plot(real(cl_poles), imag(cl_poles), '.'); p1 = plot(real(cl_poles), imag(cl_poles), '.');
cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6))); cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6)));
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
plot(real(cl_poles), imag(cl_poles), '.'); p2 = plot(real(cl_poles), imag(cl_poles), '.');
cl_poles = pole(feedback(Ga, (gains(i)/s)*eye(6)));
set(gca,'ColorOrderIndex',3);
p3 = plot(real(cl_poles), imag(cl_poles), '.');
end end
ylim([0,inf]); ylim([0, 1.1*max(imag(pole(G)))]);
xlim([-3000,0]); xlim([-1.1*max(imag(pole(G))),0]);
xlabel('Real Part') xlabel('Real Part')
ylabel('Imaginary Part') ylabel('Imaginary Part')
axis square axis square
legend([p1, p2, p3], {'Perfect Joints', 'Flexible Joints', 'Amplified Actuator'}, 'location', 'northwest');
@ -166,13 +190,20 @@ for i = 1:length(gains)
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
cl_poles = pole(feedback(G, (gains(i)/s)*eye(6))); cl_poles = pole(feedback(G, (gains(i)/s)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2; poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
plot(gains(i)*ones(size(poles_damp)), poles_damp, '.'); p1 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6))); cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2; poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
plot(gains(i)*ones(size(poles_damp)), poles_damp, '.'); p2 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
set(gca,'ColorOrderIndex',3);
cl_poles = pole(feedback(Ga, (gains(i)/s)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
p3 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
end end
xlabel('Control Gain'); xlabel('Control Gain');
ylabel('Damping of the Poles'); ylabel('Damping of the Poles');
set(gca, 'XScale', 'log'); set(gca, 'XScale', 'log');
ylim([0,pi/2]); ylim([0,pi/2]);
legend([p1, p2, p3], {'Perfect Joints', 'Flexible Joints', 'Amplified Actuator'}, 'location', 'northwest');

View File

@ -4,33 +4,38 @@ clear; close all; clc;
%% Intialize Laplace variable %% Intialize Laplace variable
s = zpk('s'); s = zpk('s');
simulinkproject('./'); simulinkproject('../');
open('simulink/stewart_active_damping.slx') open('stewart_platform_model.slx')
% Identification of the Dynamics % Identification of the Dynamics
stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'disable', true); stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
ground = initializeGround('type', 'none');
payload = initializePayload('type', 'none');
%% Options for Linearized %% Options for Linearized
options = linearizeOptions; options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'stewart_active_damping'; mdl = 'stewart_platform_model';
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/F'], 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]
io(io_i) = linio([mdl, '/Vm'], 1, 'openoutput'); io_i = io_i + 1; % Absolute velocity of each leg [m/s] io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'Vm'); io_i = io_i + 1; % Absolute velocity of each leg [m/s]
%% Run the linearization %% Run the linearization
G = linearize(mdl, io, options); G = linearize(mdl, io, options);
@ -41,7 +46,7 @@ G.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
% The transfer function from actuator forces to force sensors is shown in Figure [[fig:inertial_plant_coupling]]. % The transfer function from actuator forces to force sensors is shown in Figure [[fig:inertial_plant_coupling]].
freqs = logspace(1, 3, 1000); freqs = logspace(1, 4, 1000);
figure; figure;
@ -74,19 +79,28 @@ legend([p1, p2], {'$F_{m,i}/F_i$', '$F_{m,j}/F_i$'})
linkaxes([ax1,ax2],'x'); linkaxes([ax1,ax2],'x');
% Effect of the Flexible Joint stiffness on the Dynamics % Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics
% 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.
stewart = initializeJointDynamics(stewart); stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
Gf = linearize(mdl, io, options); Gf = linearize(mdl, io, options);
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Gf.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'}; Gf.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
% We now use the amplified actuators and re-identify the dynamics
stewart = initializeAmplifiedStrutDynamics(stewart);
Ga = linearize(mdl, io, options);
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Ga.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
% The new dynamics from force actuator to force sensor is shown in Figure [[fig:inertial_plant_flexible_joint_decentralized]]. % The new dynamics from force actuator to force sensor is shown in Figure [[fig:inertial_plant_flexible_joint_decentralized]].
freqs = logspace(1, 3, 1000); freqs = logspace(1, 4, 1000);
figure; figure;
@ -94,6 +108,7 @@ ax1 = subplot(2, 1, 1);
hold on; hold on;
plot(freqs, abs(squeeze(freqresp(G( 'Vm1', 'F1'), freqs, 'Hz')))); plot(freqs, abs(squeeze(freqresp(G( 'Vm1', 'F1'), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gf('Vm1', 'F1'), freqs, 'Hz')))); plot(freqs, abs(squeeze(freqresp(Gf('Vm1', 'F1'), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Ga('Vm1', 'F1'), freqs, 'Hz'))));
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [$\frac{m/s}{N}$]'); set(gca, 'XTickLabel',[]); ylabel('Amplitude [$\frac{m/s}{N}$]'); set(gca, 'XTickLabel',[]);
@ -102,6 +117,7 @@ ax2 = subplot(2, 1, 2);
hold on; hold on;
plot(freqs, 180/pi*angle(squeeze(freqresp(G( 'Vm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Perfect Joints'); plot(freqs, 180/pi*angle(squeeze(freqresp(G( 'Vm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Perfect Joints');
plot(freqs, 180/pi*angle(squeeze(freqresp(Gf('Vm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Flexible Joints'); plot(freqs, 180/pi*angle(squeeze(freqresp(Gf('Vm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Flexible Joints');
plot(freqs, 180/pi*angle(squeeze(freqresp(Ga('Vm1', 'F1'), freqs, 'Hz'))), 'DisplayName', 'Amplified Actuator');
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
@ -121,53 +137,35 @@ linkaxes([ax1,ax2],'x');
% 0 & & 1 % 0 & & 1
% \end{bmatrix} \] % \end{bmatrix} \]
% The root locus is shown in figure [[fig:root_locus_inertial_rot_stiffness]] and the obtained pole damping function of the control gain is shown in figure [[fig:pole_damping_gain_inertial_rot_stiffness]]. % The root locus is shown in figure [[fig:root_locus_inertial_rot_stiffness]].
gains = logspace(0, 5, 1000); gains = logspace(2, 5, 100);
figure; figure;
hold on; hold on;
plot(real(pole(G)), imag(pole(G)), 'x'); plot(real(pole(G)), imag(pole(G)), 'x');
plot(real(pole(Gf)), imag(pole(Gf)), 'x'); plot(real(pole(Gf)), imag(pole(Gf)), 'x');
plot(real(pole(Ga)), imag(pole(Ga)), 'x');
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
plot(real(tzero(G)), imag(tzero(G)), 'o'); plot(real(tzero(G)), imag(tzero(G)), 'o');
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o'); plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
plot(real(tzero(Ga)), imag(tzero(Ga)), 'o');
for i = 1:length(gains) for i = 1:length(gains)
cl_poles = pole(feedback(G, gains(i)*eye(6)));
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
plot(real(cl_poles), imag(cl_poles), '.'); cl_poles = pole(feedback(G, gains(i)*eye(6)));
cl_poles = pole(feedback(Gf, gains(i)*eye(6))); p1 = plot(real(cl_poles), imag(cl_poles), '.');
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
plot(real(cl_poles), imag(cl_poles), '.'); cl_poles = pole(feedback(Gf, gains(i)*eye(6)));
p2 = plot(real(cl_poles), imag(cl_poles), '.');
set(gca,'ColorOrderIndex',3);
cl_poles = pole(feedback(Ga, gains(i)*eye(6)));
p3 = plot(real(cl_poles), imag(cl_poles), '.');
end end
ylim([0,2000]); ylim([0, 3*max(imag(pole(G)))]);
xlim([-2000,0]); xlim([-3*max(imag(pole(G))),0]);
xlabel('Real Part') xlabel('Real Part')
ylabel('Imaginary Part') ylabel('Imaginary Part')
axis square axis square
legend([p1, p2, p3], {'Perfect Joints', 'Flexible Joints', 'Amplified Actuator'}, 'location', 'northwest');
% #+name: fig:root_locus_inertial_rot_stiffness
% #+caption: Root Locus plot with Decentralized Inertial Control when considering the stiffness of flexible joints ([[./figs/root_locus_inertial_rot_stiffness.png][png]], [[./figs/root_locus_inertial_rot_stiffness.pdf][pdf]])
% [[file:figs/root_locus_inertial_rot_stiffness.png]]
gains = logspace(0, 5, 1000);
figure;
hold on;
for i = 1:length(gains)
set(gca,'ColorOrderIndex',1);
cl_poles = pole(feedback(G, gains(i)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
set(gca,'ColorOrderIndex',2);
cl_poles = pole(feedback(Gf, gains(i)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
end
xlabel('Control Gain');
ylabel('Damping of the Poles');
set(gca, 'XScale', 'log');
ylim([0,pi/2]);

View File

@ -0,0 +1,93 @@
%% Clear Workspace and Close figures
clear; close all; clc;
%% Intialize Laplace variable
s = zpk('s');
simulinkproject('../');
% Having Cube's center above the top platform
% Let's say we want to have a diagonal stiffness matrix when $\{A\}$ and $\{B\}$ are located above the top platform.
% Thus, we want the cube's center to be located above the top center.
% Let's fix the Height of the Stewart platform and the position of frames $\{A\}$ and $\{B\}$:
H = 100e-3; % height of the Stewart platform [m]
MO_B = 20e-3; % Position {B} with respect to {M} [m]
% We find the several Cubic configuration for the Stewart platform where the center of the cube is located at frame $\{A\}$.
% The differences between the configuration are the cube's size:
% - Small Cube Size in Figure [[fig:stewart_cubic_conf_type_1]]
% - Medium Cube Size in Figure [[fig:stewart_cubic_conf_type_2]]
% - Large Cube Size in Figure [[fig:stewart_cubic_conf_type_3]]
% For each of the configuration, the Stiffness matrix is diagonal with $k_x = k_y = k_y = 2k$ with $k$ is the stiffness of each strut.
% However, the rotational stiffnesses are increasing with the cube's size but the required size of the platform is also increasing, so there is a trade-off here.
Hc = 0.4*H; % Size of the useful part of the cube [m]
FOc = H + MO_B; % Center of the cube with respect to {F}
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
stewart = computeJacobian(stewart);
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), 'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
displayArchitecture(stewart, 'labels', false);
scatter3(0, 0, FOc, 200, 'kh');
% #+name: tab:stewart_cubic_conf_type_1
% #+caption: Stiffness Matrix
% #+RESULTS:
% | 2 | 0 | -2.8e-16 | 0 | 2.4e-17 | 0 |
% | 0 | 2 | 0 | -2.3e-17 | 0 | 0 |
% | -2.8e-16 | 0 | 2 | -2.1e-19 | 0 | 0 |
% | 0 | -2.3e-17 | -2.1e-19 | 0.0024 | -5.4e-20 | 6.5e-19 |
% | 2.4e-17 | 0 | 4.9e-19 | -2.3e-20 | 0.0024 | 0 |
% | -1.2e-18 | 1.1e-18 | 0 | 6.2e-19 | 0 | 0.0096 |
Hc = 1.5*H; % Size of the useful part of the cube [m]
FOc = H + MO_B; % Center of the cube with respect to {F}
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
stewart = computeJacobian(stewart);
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), 'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
displayArchitecture(stewart, 'labels', false);
scatter3(0, 0, FOc, 200, 'kh');
% #+name: tab:stewart_cubic_conf_type_2
% #+caption: Stiffness Matrix
% #+RESULTS:
% | 2 | 0 | -1.9e-16 | 0 | 5.6e-17 | 0 |
% | 0 | 2 | 0 | -7.6e-17 | 0 | 0 |
% | -1.9e-16 | 0 | 2 | 2.5e-18 | 2.8e-17 | 0 |
% | 0 | -7.6e-17 | 2.5e-18 | 0.034 | 8.7e-19 | 8.7e-18 |
% | 5.7e-17 | 0 | 3.2e-17 | 2.9e-19 | 0.034 | 0 |
% | -1e-18 | -1.3e-17 | 5.6e-17 | 8.4e-18 | 0 | 0.14 |
Hc = 2.5*H; % Size of the useful part of the cube [m]
FOc = H + MO_B; % Center of the cube with respect to {F}
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
stewart = computeJacobian(stewart);
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), 'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
displayArchitecture(stewart, 'labels', false);
scatter3(0, 0, FOc, 200, 'kh');

View File

@ -0,0 +1,336 @@
%% Clear Workspace and Close figures
clear; close all; clc;
%% Intialize Laplace variable
s = zpk('s');
simulinkproject('../');
% Cube's center at the Center of Mass of the mobile platform
% Let's create a Cubic Stewart Platform where the *Center of Mass of the mobile platform is located at the center of the cube*.
% We define the size of the Stewart platform and the position of frames $\{A\}$ and $\{B\}$.
H = 200e-3; % height of the Stewart platform [m]
MO_B = -10e-3; % Position {B} with respect to {M} [m]
% Now, we set the cube's parameters such that the center of the cube is coincident with $\{A\}$ and $\{B\}$.
Hc = 2.5*H; % Size of the useful part of the cube [m]
FOc = H + MO_B; % Center of the cube with respect to {F}
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 25e-3, 'MHb', 25e-3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1));
stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
% Now we set the geometry and mass of the mobile platform such that its center of mass is coincident with $\{A\}$ and $\{B\}$.
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ...
'Mpm', 10, ...
'Mph', 20e-3, ...
'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
% And we set small mass for the struts.
stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
stewart = initializeInertialSensor(stewart);
% No flexibility below the Stewart platform and no payload.
ground = initializeGround('type', 'none');
payload = initializePayload('type', 'none');
% The obtain geometry is shown in figure [[fig:stewart_cubic_conf_decouple_dynamics]].
displayArchitecture(stewart, 'labels', false, 'view', 'all');
% #+name: fig:stewart_cubic_conf_decouple_dynamics
% #+caption: Geometry used for the simulations - The cube's center, the frames $\{A\}$ and $\{B\}$ and the Center of mass of the mobile platform are coincident ([[./figs/stewart_cubic_conf_decouple_dynamics.png][png]], [[./figs/stewart_cubic_conf_decouple_dynamics.pdf][pdf]])
% [[file:figs/stewart_cubic_conf_decouple_dynamics.png]]
% We now identify the dynamics from forces applied in each strut $\bm{\tau}$ to the displacement of each strut $d \bm{\mathcal{L}}$.
open('stewart_platform_model.slx')
%% 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, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
%% Run the linearization
G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
% Now, thanks to the Jacobian (Figure [[fig:local_to_cartesian_coordinates]]), we compute the transfer function from $\bm{\mathcal{F}}$ to $\bm{\mathcal{X}}$.
Gc = inv(stewart.kinematics.J)*G*inv(stewart.kinematics.J');
Gc.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
Gc.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
% The obtain dynamics $\bm{G}_{c}(s) = \bm{J}^{-T} \bm{G}(s) \bm{J}^{-1}$ is shown in Figure [[fig:stewart_cubic_decoupled_dynamics_cartesian]].
freqs = logspace(1, 3, 500);
figure;
ax1 = subplot(2, 2, 1);
hold on;
for i = 1:6
for j = i+1:6
plot(freqs, abs(squeeze(freqresp(Gc(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(Gc(1, 1), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gc(2, 2), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gc(3, 3), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ax3 = subplot(2, 2, 3);
hold on;
for i = 1:6
for j = i+1:6
p4 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(1, 1), freqs, 'Hz'))));
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(2, 2), freqs, 'Hz'))));
p3 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(3, 3), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
legend([p1, p2, p3, p4], {'$D_x/F_x$','$D_y/F_y$', '$D_z/F_z$', '$D_i/F_j$'})
ax2 = subplot(2, 2, 2);
hold on;
for i = 1:6
for j = i+1:6
plot(freqs, abs(squeeze(freqresp(Gc(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(Gc(4, 4), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gc(5, 5), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gc(6, 6), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ax4 = subplot(2, 2, 4);
hold on;
for i = 1:6
for j = i+1:6
p4 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(4, 4), freqs, 'Hz'))));
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(5, 5), freqs, 'Hz'))));
p3 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(6, 6), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
legend([p1, p2, p3, p4], {'$R_x/M_x$','$R_y/M_y$', '$R_z/M_z$', '$R_i/M_j$'})
linkaxes([ax1,ax2,ax3,ax4],'x');
% Cube's center not coincident with the Mass of the Mobile platform
% Let's create a Stewart platform with a cubic architecture where the cube's center is at the center of the Stewart platform.
H = 200e-3; % height of the Stewart platform [m]
MO_B = -100e-3; % Position {B} with respect to {M} [m]
% Now, we set the cube's parameters such that the center of the cube is coincident with $\{A\}$ and $\{B\}$.
Hc = 2.5*H; % Size of the useful part of the cube [m]
FOc = H + MO_B; % Center of the cube with respect to {F}
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 25e-3, 'MHb', 25e-3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1));
stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
% However, the Center of Mass of the mobile platform is *not* located at the cube's center.
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ...
'Mpm', 10, ...
'Mph', 20e-3, ...
'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
% And we set small mass for the struts.
stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
stewart = initializeInertialSensor(stewart);
% No flexibility below the Stewart platform and no payload.
ground = initializeGround('type', 'none');
payload = initializePayload('type', 'none');
% The obtain geometry is shown in figure [[fig:stewart_cubic_conf_mass_above]].
displayArchitecture(stewart, 'labels', false, 'view', 'all');
% #+name: fig:stewart_cubic_conf_mass_above
% #+caption: Geometry used for the simulations - The cube's center is coincident with the frames $\{A\}$ and $\{B\}$ but not with the Center of mass of the mobile platform ([[./figs/stewart_cubic_conf_mass_above.png][png]], [[./figs/stewart_cubic_conf_mass_above.pdf][pdf]])
% [[file:figs/stewart_cubic_conf_mass_above.png]]
% We now identify the dynamics from forces applied in each strut $\bm{\tau}$ to the displacement of each strut $d \bm{\mathcal{L}}$.
open('stewart_platform_model.slx')
%% 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, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
%% Run the linearization
G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
% And we use the Jacobian to compute the transfer function from $\bm{\mathcal{F}}$ to $\bm{\mathcal{X}}$.
Gc = inv(stewart.kinematics.J)*G*inv(stewart.kinematics.J');
Gc.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
Gc.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
% The obtain dynamics $\bm{G}_{c}(s) = \bm{J}^{-T} \bm{G}(s) \bm{J}^{-1}$ is shown in Figure [[fig:stewart_conf_coupling_mass_matrix]].
freqs = logspace(1, 3, 500);
figure;
ax1 = subplot(2, 2, 1);
hold on;
for i = 1:6
for j = i+1:6
plot(freqs, abs(squeeze(freqresp(Gc(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(Gc(1, 1), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gc(2, 2), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gc(3, 3), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ax3 = subplot(2, 2, 3);
hold on;
for i = 1:6
for j = i+1:6
p4 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(1, 1), freqs, 'Hz'))));
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(2, 2), freqs, 'Hz'))));
p3 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(3, 3), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
legend([p1, p2, p3, p4], {'$D_x/F_x$','$D_y/F_y$', '$D_z/F_z$', '$D_i/F_j$'})
ax2 = subplot(2, 2, 2);
hold on;
for i = 1:6
for j = i+1:6
plot(freqs, abs(squeeze(freqresp(Gc(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(Gc(4, 4), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gc(5, 5), freqs, 'Hz'))));
plot(freqs, abs(squeeze(freqresp(Gc(6, 6), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ax4 = subplot(2, 2, 4);
hold on;
for i = 1:6
for j = i+1:6
p4 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(4, 4), freqs, 'Hz'))));
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(5, 5), freqs, 'Hz'))));
p3 = plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(6, 6), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
legend([p1, p2, p3, p4], {'$R_x/M_x$','$R_y/M_y$', '$R_z/M_z$', '$R_i/M_j$'})
linkaxes([ax1,ax2,ax3,ax4],'x');

View File

@ -0,0 +1,301 @@
%% Clear Workspace and Close figures
clear; close all; clc;
%% Intialize Laplace variable
s = zpk('s');
simulinkproject('../');
% Coupling between the actuators and sensors - Cubic Architecture
% Let's generate a Cubic architecture where the cube's center and the frames $\{A\}$ and $\{B\}$ are coincident.
H = 200e-3; % height of the Stewart platform [m]
MO_B = -10e-3; % Position {B} with respect to {M} [m]
Hc = 2.5*H; % Size of the useful part of the cube [m]
FOc = H + MO_B; % Center of the cube with respect to {F}
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 25e-3, 'MHb', 25e-3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1));
stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ...
'Mpm', 10, ...
'Mph', 20e-3, ...
'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
stewart = initializeInertialSensor(stewart);
% No flexibility below the Stewart platform and no payload.
ground = initializeGround('type', 'none');
payload = initializePayload('type', 'none');
displayArchitecture(stewart, 'labels', false, 'view', 'all');
% #+name: fig:stewart_architecture_coupling_struts_cubic
% #+caption: Geometry of the generated Stewart platform ([[./figs/stewart_architecture_coupling_struts_cubic.png][png]], [[./figs/stewart_architecture_coupling_struts_cubic.pdf][pdf]])
% [[file:figs/stewart_architecture_coupling_struts_cubic.png]]
% And we identify the dynamics from the actuator forces $\tau_{i}$ to the relative motion sensors $\delta \mathcal{L}_{i}$ (Figure [[fig:coupling_struts_relative_sensor_cubic]]) and to the force sensors $\tau_{m,i}$ (Figure [[fig:coupling_struts_force_sensor_cubic]]).
open('stewart_platform_model.slx')
%% 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, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
%% Run the linearization
G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
freqs = logspace(1, 3, 1000);
figure;
ax1 = subplot(2, 1, 1);
hold on;
for i = 1:6
for j = i+1:6
plot(freqs, abs(squeeze(freqresp(G(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(G(1, 1), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ax3 = subplot(2, 1, 2);
hold on;
for i = 1:6
for j = i+1:6
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(1, 1), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
legend([p1, p2], {'$L_i/\tau_i$', '$L_i/\tau_j$'})
linkaxes([ax1,ax2],'x');
% #+name: fig:coupling_struts_relative_sensor_cubic
% #+caption: Dynamics from the force actuators to the relative motion sensors ([[./figs/coupling_struts_relative_sensor_cubic.png][png]], [[./figs/coupling_struts_relative_sensor_cubic.pdf][pdf]])
% [[file:figs/coupling_struts_relative_sensor_cubic.png]]
%% Input/Output definition
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, '/Stewart Platform'], 1, 'openoutput', [], 'Taum'); io_i = io_i + 1; % Force Sensor Outputs [N]
%% Run the linearization
G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
freqs = logspace(1, 3, 500);
figure;
ax1 = subplot(2, 1, 1);
hold on;
for i = 1:6
for j = i+1:6
plot(freqs, abs(squeeze(freqresp(G(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(G(1, 1), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]);
ax3 = subplot(2, 1, 2);
hold on;
for i = 1:6
for j = i+1:6
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(1, 1), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
legend([p1, p2], {'$F_{m,i}/\tau_i$', '$F_{m,i}/\tau_j$'})
linkaxes([ax1,ax2],'x');
% Coupling between the actuators and sensors - Non-Cubic Architecture
% Now we generate a Stewart platform which is not cubic but with approximately the same size as the previous cubic architecture.
H = 200e-3; % height of the Stewart platform [m]
MO_B = -10e-3; % Position {B} with respect to {M} [m]
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateGeneralConfiguration(stewart, 'FR', 250e-3, 'MR', 150e-3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1));
stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ...
'Mpm', 10, ...
'Mph', 20e-3, ...
'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
stewart = initializeInertialSensor(stewart);
% No flexibility below the Stewart platform and no payload.
ground = initializeGround('type', 'none');
payload = initializePayload('type', 'none');
displayArchitecture(stewart, 'labels', false, 'view', 'all');
% #+name: fig:stewart_architecture_coupling_struts_non_cubic
% #+caption: Geometry of the generated Stewart platform ([[./figs/stewart_architecture_coupling_struts_non_cubic.png][png]], [[./figs/stewart_architecture_coupling_struts_non_cubic.pdf][pdf]])
% [[file:figs/stewart_architecture_coupling_struts_non_cubic.png]]
% And we identify the dynamics from the actuator forces $\tau_{i}$ to the relative motion sensors $\delta \mathcal{L}_{i}$ (Figure [[fig:coupling_struts_relative_sensor_non_cubic]]) and to the force sensors $\tau_{m,i}$ (Figure [[fig:coupling_struts_force_sensor_non_cubic]]).
open('stewart_platform_model.slx')
%% 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, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
%% Run the linearization
G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
freqs = logspace(1, 3, 1000);
figure;
ax1 = subplot(2, 1, 1);
hold on;
for i = 1:6
for j = i+1:6
plot(freqs, abs(squeeze(freqresp(G(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(G(1, 1), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ax3 = subplot(2, 1, 2);
hold on;
for i = 1:6
for j = i+1:6
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(1, 1), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
legend([p1, p2], {'$L_i/\tau_i$', '$L_i/\tau_j$'})
linkaxes([ax1,ax2],'x');
% #+name: fig:coupling_struts_relative_sensor_non_cubic
% #+caption: Dynamics from the force actuators to the relative motion sensors ([[./figs/coupling_struts_relative_sensor_non_cubic.png][png]], [[./figs/coupling_struts_relative_sensor_non_cubic.pdf][pdf]])
% [[file:figs/coupling_struts_relative_sensor_non_cubic.png]]
%% Input/Output definition
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, '/Stewart Platform'], 1, 'openoutput', [], 'Taum'); io_i = io_i + 1; % Force Sensor Outputs [N]
%% Run the linearization
G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
freqs = logspace(1, 3, 500);
figure;
ax1 = subplot(2, 1, 1);
hold on;
for i = 1:6
for j = i+1:6
plot(freqs, abs(squeeze(freqresp(G(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(G(1, 1), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]);
ax3 = subplot(2, 1, 2);
hold on;
for i = 1:6
for j = i+1:6
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(i, j), freqs, 'Hz'))), 'k-');
end
end
set(gca,'ColorOrderIndex',1);
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(1, 1), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
legend([p1, p2], {'$F_{m,i}/\tau_i$', '$F_{m,i}/\tau_j$'})
linkaxes([ax1,ax2],'x');

View File

@ -0,0 +1,51 @@
%% Clear Workspace and Close figures
clear; close all; clc;
%% Intialize Laplace variable
s = zpk('s');
simulinkproject('../');
% Analysis
% We initialize the wanted cube's size.
Hcs = 1e-3*[250:20:350]; % Heights for the Cube [m]
Ks = zeros(6, 6, length(Hcs));
% The height of the Stewart platform is fixed:
H = 100e-3; % height of the Stewart platform [m]
% The frames $\{A\}$ and $\{B\}$ are positioned at the Stewart platform center as well as the cube's center:
MO_B = -50e-3; % Position {B} with respect to {M} [m]
FOc = H + MO_B; % Center of the cube with respect to {F}
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
for i = 1:length(Hcs)
Hc = Hcs(i);
stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
stewart = computeJacobian(stewart);
Ks(:,:,i) = stewart.kinematics.K;
end
% We find that for all the cube's size, $k_x = k_y = k_z = k$ where $k$ is the strut stiffness.
% We also find that $k_{\theta_x} = k_{\theta_y}$ and $k_{\theta_z}$ are varying with the cube's size (figure [[fig:stiffness_cube_size]]).
figure;
hold on;
plot(Hcs, squeeze(Ks(4, 4, :)), 'DisplayName', '$k_{\theta_x} = k_{\theta_y}$');
plot(Hcs, squeeze(Ks(6, 6, :)), 'DisplayName', '$k_{\theta_z}$');
hold off;
legend('location', 'northwest');
xlabel('Cube Size [m]'); ylabel('Rotational stiffnes [normalized]');

View File

@ -0,0 +1,96 @@
%% Clear Workspace and Close figures
clear; close all; clc;
%% Intialize Laplace variable
s = zpk('s');
simulinkproject('../');
% Cubic Stewart platform centered with the cube center - Jacobian estimated at the cube center
% We create a cubic Stewart platform (figure [[fig:cubic_conf_centered_J_center]]) in such a way that the center of the cube (black star) is located at the center of the Stewart platform (blue dot).
% The Jacobian matrix is estimated at the location of the center of the cube.
H = 100e-3; % height of the Stewart platform [m]
MO_B = -H/2; % Position {B} with respect to {M} [m]
Hc = H; % Size of the useful part of the cube [m]
FOc = H + MO_B; % Center of the cube with respect to {F}
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
stewart = computeJacobian(stewart);
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 175e-3, 'Mpr', 150e-3);
displayArchitecture(stewart, 'labels', false);
scatter3(0, 0, FOc, 200, 'kh');
% Cubic Stewart platform centered with the cube center - Jacobian not estimated at the cube center
% We create a cubic Stewart platform with center of the cube located at the center of the Stewart platform (figure [[fig:cubic_conf_centered_J_not_center]]).
% The Jacobian matrix is not estimated at the location of the center of the cube.
H = 100e-3; % height of the Stewart platform [m]
MO_B = 20e-3; % Position {B} with respect to {M} [m]
Hc = H; % Size of the useful part of the cube [m]
FOc = H/2; % Center of the cube with respect to {F}
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
stewart = computeJacobian(stewart);
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 175e-3, 'Mpr', 150e-3);
displayArchitecture(stewart, 'labels', false);
scatter3(0, 0, FOc, 200, 'kh');
% Cubic Stewart platform not centered with the cube center - Jacobian estimated at the cube center
% Here, the "center" of the Stewart platform is not at the cube center (figure [[fig:cubic_conf_not_centered_J_center]]).
% The Jacobian is estimated at the cube center.
H = 80e-3; % height of the Stewart platform [m]
MO_B = -30e-3; % Position {B} with respect to {M} [m]
Hc = 100e-3; % Size of the useful part of the cube [m]
FOc = H + MO_B; % Center of the cube with respect to {F}
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
stewart = computeJacobian(stewart);
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 175e-3, 'Mpr', 150e-3);
displayArchitecture(stewart, 'labels', false);
scatter3(0, 0, FOc, 200, 'kh');
% Cubic Stewart platform not centered with the cube center - Jacobian estimated at the Stewart platform center
% Here, the "center" of the Stewart platform is not at the cube center.
% The Jacobian is estimated at the center of the Stewart platform.
% The center of the cube is at $z = 110$.
% The Stewart platform is from $z = H_0 = 75$ to $z = H_0 + H_{tot} = 175$.
% The center height of the Stewart platform is then at $z = \frac{175-75}{2} = 50$.
% The center of the cube from the top platform is at $z = 110 - 175 = -65$.
H = 100e-3; % height of the Stewart platform [m]
MO_B = -H/2; % Position {B} with respect to {M} [m]
Hc = 1.5*H; % Size of the useful part of the cube [m]
FOc = H/2 + 10e-3; % Center of the cube with respect to {F}
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
stewart = computeJacobian(stewart);
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 215e-3, 'Mpr', 195e-3);
displayArchitecture(stewart, 'labels', false);
scatter3(0, 0, FOc, 200, 'kh');

View File

@ -1,11 +1,16 @@
%% Clear Workspace and Close figures
clear; close all; clc;
%% Intialize Laplace variable
s = zpk('s');
simulinkproject('./'); simulinkproject('../');
% Stewart architecture definition % Stewart architecture definition
% We first define some general Stewart architecture. % We first define some general Stewart architecture.
stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
@ -29,7 +34,7 @@ Ls_exact = zeros(6, length(Xrs));
for i = 1:length(Xrs) for i = 1:length(Xrs)
Xr = Xrs(i); Xr = Xrs(i);
L_approx(:, i) = stewart.J*[Xr; 0; 0; 0; 0; 0;]; L_approx(:, i) = stewart.kinematics.J*[Xr; 0; 0; 0; 0; 0;];
[~, L_exact(:, i)] = inverseKinematics(stewart, 'AP', [Xr; 0; 0]); [~, L_exact(:, i)] = inverseKinematics(stewart, 'AP', [Xr; 0; 0]);
end end

View File

@ -1,17 +1,22 @@
%% Clear Workspace and Close figures
clear; close all; clc;
%% Intialize Laplace variable
s = zpk('s');
simulinkproject('./'); simulinkproject('../');
% Stewart architecture definition % Stewart architecture definition
% Let's first define the Stewart platform architecture that we want to study. % Let's first define the Stewart platform architecture that we want to study.
stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1)); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart); stewart = initializeJointDynamics(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
@ -44,7 +49,7 @@ for i = 1:length(thetas)
Ty = sin(thetas(i))*sin(phis(j)); Ty = sin(thetas(i))*sin(phis(j));
Tz = cos(thetas(i)); Tz = cos(thetas(i));
dL = stewart.J*[Tx; Ty; Tz; 0; 0; 0;]; % dL required for 1m displacement in theta/phi direction dL = stewart.kinematics.J*[Tx; Ty; Tz; 0; 0; 0;]; % dL required for 1m displacement in theta/phi direction
rs(i, j) = max([dL(dL<0)*L_min; dL(dL>0)*L_max]); rs(i, j) = max([dL(dL<0)*L_min; dL(dL>0)*L_max]);
end end

View File

@ -1,17 +1,22 @@
%% Clear Workspace and Close figures
clear; close all; clc;
%% Intialize Laplace variable
s = zpk('s');
simulinkproject('./'); simulinkproject('../');
% Stewart architecture definition % Stewart architecture definition
% Let's first define the Stewart platform architecture that we want to study. % Let's first define the Stewart platform architecture that we want to study.
stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1)); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart); stewart = initializeJointDynamics(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
@ -30,12 +35,12 @@ Rz_max = 0; % Rotation [rad]
% We do that using either the Inverse Kinematic solution or the Jacobian matrix as an approximation. % We do that using either the Inverse Kinematic solution or the Jacobian matrix as an approximation.
LTx = stewart.J*[Tx_max 0 0 0 0 0]'; LTx = stewart.kinematics.J*[Tx_max 0 0 0 0 0]';
LTy = stewart.J*[0 Ty_max 0 0 0 0]'; LTy = stewart.kinematics.J*[0 Ty_max 0 0 0 0]';
LTz = stewart.J*[0 0 Tz_max 0 0 0]'; LTz = stewart.kinematics.J*[0 0 Tz_max 0 0 0]';
LRx = stewart.J*[0 0 0 Rx_max 0 0]'; LRx = stewart.kinematics.J*[0 0 0 Rx_max 0 0]';
LRy = stewart.J*[0 0 0 0 Ry_max 0]'; LRy = stewart.kinematics.J*[0 0 0 0 Ry_max 0]';
LRz = stewart.J*[0 0 0 0 0 Rz_max]'; LRz = stewart.kinematics.J*[0 0 0 0 0 Rz_max]';

View File

@ -51,6 +51,12 @@ The following decentralized active damping techniques are briefly studied:
:END: :END:
<<sec:active_damping_inertial>> <<sec:active_damping_inertial>>
#+begin_note
The Matlab script corresponding to this section is accessible [[file:../matlab/active_damping_inertial.m][here]].
To run the script, open the Simulink Project, and type =run active_damping_inertial.m=.
#+end_note
** 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)
@ -274,6 +280,12 @@ The root locus is shown in figure [[fig:root_locus_inertial_rot_stiffness]].
:END: :END:
<<sec:active_damping_iff>> <<sec:active_damping_iff>>
#+begin_note
The Matlab script corresponding to this section is accessible [[file:../matlab/active_damping_iff.m][here]].
To run the script, open the Simulink Project, and type =run active_damping_iff.m=.
#+end_note
** 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)
@ -537,6 +549,12 @@ The root locus is shown in figure [[fig:root_locus_iff_rot_stiffness]] and the o
:END: :END:
<<sec:active_damping_dvf>> <<sec:active_damping_dvf>>
#+begin_note
The Matlab script corresponding to this section is accessible [[file:../matlab/active_damping_dvf.m][here]].
To run the script, open the Simulink Project, and type =run active_damping_dvf.m=.
#+end_note
** 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)

View File

@ -57,7 +57,18 @@ In this document, the cubic architecture is analyzed:
- In section [[sec:functions]], function related to the cubic configuration are defined. To generate and study the Stewart platform with a Cubic configuration, the Matlab function =generateCubicConfiguration= is used (described [[sec:generateCubicConfiguration][here]]). - In section [[sec:functions]], function related to the cubic configuration are defined. To generate and study the Stewart platform with a Cubic configuration, the Matlab function =generateCubicConfiguration= is used (described [[sec:generateCubicConfiguration][here]]).
* Stiffness Matrix for the Cubic configuration * Stiffness Matrix for the Cubic configuration
:PROPERTIES:
:header-args:matlab+: :tangle ../matlab/cubic_conf_stiffnessl.m
:header-args:matlab+: :comments org :mkdirp yes
:END:
<<sec:cubic_conf_stiffness>> <<sec:cubic_conf_stiffness>>
#+begin_note
The Matlab script corresponding to this section is accessible [[file:../matlab/cubic_conf_stiffnessl.m][here]].
To run the script, open the Simulink Project, and type =run cubic_conf_stiffness.m=.
#+end_note
** Introduction :ignore: ** Introduction :ignore:
First, we have to understand what is the physical meaning of the Stiffness matrix $\bm{K}$. First, we have to understand what is the physical meaning of the Stiffness matrix $\bm{K}$.
@ -301,7 +312,18 @@ Here are the conclusion about the Stiffness matrix for the Cubic configuration:
#+end_important #+end_important
* Configuration with the Cube's center above the mobile platform * Configuration with the Cube's center above the mobile platform
:PROPERTIES:
:header-args:matlab+: :tangle ../matlab/cubic_conf_above_platforml.m
:header-args:matlab+: :comments org :mkdirp yes
:END:
<<sec:cubic_conf_above_platform>> <<sec:cubic_conf_above_platform>>
#+begin_note
The Matlab script corresponding to this section is accessible [[file:../matlab/cubic_conf_above_platforml.m][here]].
To run the script, open the Simulink Project, and type =run cubic_conf_above_platform.m=.
#+end_note
** Introduction :ignore: ** Introduction :ignore:
We saw in section [[sec:cubic_conf_stiffness]] that in order to have a diagonal stiffness matrix, we need the cube's center to be located at frames $\{A\}$ and $\{B\}$. We saw in section [[sec:cubic_conf_stiffness]] that in order to have a diagonal stiffness matrix, we need the cube's center to be located at frames $\{A\}$ and $\{B\}$.
Or, we usually want to have $\{A\}$ and $\{B\}$ located above the top platform where forces are applied and where displacements are expressed. Or, we usually want to have $\{A\}$ and $\{B\}$ located above the top platform where forces are applied and where displacements are expressed.
@ -469,7 +491,18 @@ However, the rotational stiffnesses are increasing with the cube's size but the
#+end_important #+end_important
* Cubic size analysis * Cubic size analysis
:PROPERTIES:
:header-args:matlab+: :tangle ../matlab/cubic_conf_size_analysisl.m
:header-args:matlab+: :comments org :mkdirp yes
:END:
<<sec:cubic_conf_size_analysis>> <<sec:cubic_conf_size_analysis>>
#+begin_note
The Matlab script corresponding to this section is accessible [[file:../matlab/cubic_conf_size_analysisl.m][here]].
To run the script, open the Simulink Project, and type =run cubic_conf_size_analysis.m=.
#+end_note
** Introduction :ignore: ** Introduction :ignore:
We here study the effect of the size of the cube used for the Stewart Cubic configuration. We here study the effect of the size of the cube used for the Stewart Cubic configuration.
@ -553,7 +586,18 @@ We observe that $k_{\theta_x} = k_{\theta_y}$ and $k_{\theta_z}$ increase linear
#+end_important #+end_important
* Dynamic Coupling in the Cartesian Frame * Dynamic Coupling in the Cartesian Frame
:PROPERTIES:
:header-args:matlab+: :tangle ../matlab/cubic_conf_coupling_cartesianl.m
:header-args:matlab+: :comments org :mkdirp yes
:END:
<<sec:cubic_conf_coupling_cartesian>> <<sec:cubic_conf_coupling_cartesian>>
#+begin_note
The Matlab script corresponding to this section is accessible [[file:../matlab/cubic_conf_coupling_cartesianl.m][here]].
To run the script, open the Simulink Project, and type =run cubic_conf_coupling_cartesian.m=.
#+end_note
** Introduction :ignore: ** Introduction :ignore:
In this section, we study the dynamics of the platform in the cartesian frame. In this section, we study the dynamics of the platform in the cartesian frame.
@ -980,7 +1024,18 @@ Some conclusions can be drawn from the above analysis:
#+end_important #+end_important
* Dynamic Coupling between actuators and sensors of each strut * Dynamic Coupling between actuators and sensors of each strut
:PROPERTIES:
:header-args:matlab+: :tangle ../matlab/cubic_conf_coupling_strutsl.m
:header-args:matlab+: :comments org :mkdirp yes
:END:
<<sec:cubic_conf_coupling_struts>> <<sec:cubic_conf_coupling_struts>>
#+begin_note
The Matlab script corresponding to this section is accessible [[file:../matlab/cubic_conf_coupling_strutsl.m][here]].
To run the script, open the Simulink Project, and type =run cubic_conf_coupling_struts.m=.
#+end_note
** Introduction :ignore: ** Introduction :ignore:
From cite:preumont07_six_axis_singl_stage_activ, the cubic configuration "/minimizes the cross-coupling amongst actuators and sensors of different legs (being orthogonal to each other)/". From cite:preumont07_six_axis_singl_stage_activ, the cubic configuration "/minimizes the cross-coupling amongst actuators and sensors of different legs (being orthogonal to each other)/".

View File

@ -49,7 +49,8 @@ The current document is divided in the following sections:
- Section [[sec:jacobian_analysis]]: The Jacobian matrix is derived from the geometry of the Stewart platform. Then it is shown that the Jacobian can link velocities and forces present in the system, and thus this matrix can be very useful for both analysis and control of the Stewart platform. - Section [[sec:jacobian_analysis]]: The Jacobian matrix is derived from the geometry of the Stewart platform. Then it is shown that the Jacobian can link velocities and forces present in the system, and thus this matrix can be very useful for both analysis and control of the Stewart platform.
- Section [[sec:stiffness_analysis]]: The stiffness and compliance matrices are derived from the Jacobian matrix and the stiffness of each strut. - Section [[sec:stiffness_analysis]]: The stiffness and compliance matrices are derived from the Jacobian matrix and the stiffness of each strut.
- Section [[sec:forward_inverse_kinematics]]: The Forward and Inverse kinematic problems are presented. - Section [[sec:forward_inverse_kinematics]]: The Forward and Inverse kinematic problems are presented.
- Section [[sec:required_actuator_stroke]]: The Inverse kinematic solution is used to estimate required actuator stroke from the wanted mobility of the Stewart platform. - Section [[sec:kinematic_study_approximation_validity]]: The approximate solution of the Inverse kinematic problem is compared with the exact solution in order to determine the validity of the approximation.
- Section [[sec:kinematic_study_required_actuator_stroke]]: The Inverse kinematic solution is used to estimate required actuator stroke from the wanted mobility of the Stewart platform.
* Jacobian Analysis * Jacobian Analysis
<<sec:jacobian_analysis>> <<sec:jacobian_analysis>>
@ -213,14 +214,20 @@ As the inverse kinematic can be easily solved exactly this is not much useful, h
The function =forwardKinematicsApprox= (described [[sec:forwardKinematicsApprox][here]]) can be used to solve the forward kinematic problem using the Jacobian matrix. The function =forwardKinematicsApprox= (described [[sec:forwardKinematicsApprox][here]]) can be used to solve the forward kinematic problem using the Jacobian matrix.
** Estimation of the range validity of the approximate inverse kinematics * Estimation of the range validity of the approximate inverse kinematics
:PROPERTIES: :PROPERTIES:
:header-args:matlab+: :tangle ../matlab/approximate_inverse_kinematics_validity.m :header-args:matlab+: :tangle ../matlab/kinematic_study_approximation_validity.m
:header-args:matlab+: :comments org :mkdirp yes :header-args:matlab+: :comments org :mkdirp yes
:END: :END:
<<sec:approximate_inverse_kinematics_validity>> <<sec:kinematic_study_approximation_validity>>
*** Introduction :ignore: #+begin_note
The Matlab script corresponding to this section is accessible [[file:../matlab/kinematic_study_approximation_validity.m][here]].
To run the script, open the Simulink Project, and type =run kinematic_study_approximation_validity.m=.
#+end_note
** Introduction :ignore:
As we know how to exactly solve the Inverse kinematic problem, we can compare the exact solution with the approximate solution using the Jacobian matrix. As we know how to exactly solve the Inverse kinematic problem, we can compare the exact solution with the approximate solution using the Jacobian matrix.
For small displacements, the approximate solution is expected to work well. For small displacements, the approximate solution is expected to work well.
We would like here to determine up to what displacement this approximation can be considered as correct. We would like here to determine up to what displacement this approximation can be considered as correct.
@ -228,7 +235,7 @@ We would like here to determine up to what displacement this approximation can b
Then, we can determine the range for which the approximate inverse kinematic is valid. Then, we can determine the range for which the approximate inverse kinematic is valid.
This will also gives us the range for which the approximate forward kinematic is valid. This will also gives us the range for which the approximate forward kinematic is valid.
*** 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)
<<matlab-dir>> <<matlab-dir>>
#+end_src #+end_src
@ -241,7 +248,7 @@ This will also gives us the range for which the approximate forward kinematic is
simulinkproject('../'); simulinkproject('../');
#+end_src #+end_src
*** Stewart architecture definition ** Stewart architecture definition
We first define some general Stewart architecture. We first define some general Stewart architecture.
#+begin_src matlab #+begin_src matlab
stewart = initializeStewartPlatform(); stewart = initializeStewartPlatform();
@ -256,7 +263,7 @@ We first define some general Stewart architecture.
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
#+end_src #+end_src
*** Comparison for "pure" translations ** Comparison for "pure" translations
Let's first compare the perfect and approximate solution of the inverse for pure $x$ translations. Let's first compare the perfect and approximate solution of the inverse for pure $x$ translations.
We compute the approximate and exact required strut stroke to have the wanted mobile platform $x$ displacement. We compute the approximate and exact required strut stroke to have the wanted mobile platform $x$ displacement.
@ -320,17 +327,24 @@ The relative strut length displacement is shown in Figure [[fig:inverse_kinemati
#+CAPTION: Relative length error by using the Approximate solution of the Inverse kinematic problem ([[./figs/inverse_kinematics_approx_validity_x_translation_relative.png][png]], [[./figs/inverse_kinematics_approx_validity_x_translation_relative.pdf][pdf]]) #+CAPTION: Relative length error by using the Approximate solution of the Inverse kinematic problem ([[./figs/inverse_kinematics_approx_validity_x_translation_relative.png][png]], [[./figs/inverse_kinematics_approx_validity_x_translation_relative.pdf][pdf]])
[[file:figs/inverse_kinematics_approx_validity_x_translation_relative.png]] [[file:figs/inverse_kinematics_approx_validity_x_translation_relative.png]]
*** Conclusion ** Conclusion
#+begin_important #+begin_important
For small wanted displacements (up to $\approx 1\%$ of the size of the Hexapod), the approximate inverse kinematic solution using the Jacobian matrix is quite correct. For small wanted displacements (up to $\approx 1\%$ of the size of the Hexapod), the approximate inverse kinematic solution using the Jacobian matrix is quite correct.
#+end_important #+end_important
* Estimated required actuator stroke from specified platform mobility * Estimated required actuator stroke from specified platform mobility
:PROPERTIES: :PROPERTIES:
:header-args:matlab+: :tangle ../matlab/required_stroke_from_mobility.m :header-args:matlab+: :tangle ../matlab/kinematic_study_required_actuator_stroke.m
:header-args:matlab+: :comments org :mkdirp yes :header-args:matlab+: :comments org :mkdirp yes
:END: :END:
<<sec:required_actuator_stroke>> <<sec:kinematic_study_required_actuator_stroke>>
#+begin_note
The Matlab script corresponding to this section is accessible [[file:../matlab/kinematic_study_required_actuator_stroke.m][here]].
To run the script, open the Simulink Project, and type =run kinematic_study_required_actuator_stroke.m=.
#+end_note
** Introduction :ignore: ** Introduction :ignore:
Let's say one want to design a Stewart platform with some specified mobility (position and orientation). Let's say one want to design a Stewart platform with some specified mobility (position and orientation).
One may want to determine the required actuator stroke required to obtain the specified mobility. One may want to determine the required actuator stroke required to obtain the specified mobility.
@ -483,10 +497,17 @@ This is probably a much realistic estimation of the required actuator stroke.
* Estimated platform mobility from specified actuator stroke * Estimated platform mobility from specified actuator stroke
:PROPERTIES: :PROPERTIES:
:header-args:matlab+: :tangle ../matlab/mobility_from_actuator_stroke.m :header-args:matlab+: :tangle ../matlab/kinematic_study_mobility.m
:header-args:matlab+: :comments org :mkdirp yes :header-args:matlab+: :comments org :mkdirp yes
:END: :END:
<<sec:obtained_mobility_from_stroke>> <<sec:kinematic_study_mobility>>
#+begin_note
The Matlab script corresponding to this section is accessible [[file:../matlab/kinematic_study_mobility.m][here]].
To run the script, open the Simulink Project, and type =run kinematic_study_mobility.m=.
#+end_note
** Introduction :ignore: ** Introduction :ignore:
Here, from some value of the actuator stroke, we would like to estimate the mobility of the Stewart platform. Here, from some value of the actuator stroke, we would like to estimate the mobility of the Stewart platform.