Important analysis of the cubic configuration

This commit is contained in:
Thomas Dehaeze 2020-02-12 18:27:31 +01:00
parent aad36ca47f
commit be4d5aec40
25 changed files with 1272 additions and 47 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-12 mer. 11:23 --> <!-- 2020-02-12 mer. 18:26 -->
<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>
@ -268,37 +268,44 @@ for the JavaScript code in this tag.
<h2>Table of Contents</h2> <h2>Table of Contents</h2>
<div id="text-table-of-contents"> <div id="text-table-of-contents">
<ul> <ul>
<li><a href="#org8c6677e">1. Configuration Analysis - Stiffness Matrix</a> <li><a href="#org3d18192">1. Stiffness Matrix for the Cubic configuration</a>
<ul> <ul>
<li><a href="#orgf6f7ad2">1.1. Cubic Stewart platform centered with the cube center - Jacobian estimated at the cube center</a></li> <li><a href="#orgf6f7ad2">1.1. Cubic Stewart platform centered with the cube center - Jacobian 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="#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="#org95af62e">1.5. Conclusion</a></li> <li><a href="#org778aab3">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="#org7673551">2.2. Conclusion</a></li> <li><a href="#org8e940b8">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="#orgcad29fd">3.2. Conclusion</a></li> <li><a href="#org9d42e84">3.2. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org5abef15">4. Dynamic Coupling</a> <li><a href="#orgf09da67">4. Dynamic Coupling in the Cartesian Frame</a>
<ul> <ul>
<li><a href="#org0d67b92">4.1. Cube&rsquo;s center at the Center of Mass of the Payload</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="#org876e05f">4.2. Dynamic decoupling between the actuators and sensors</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="#org213d9b9">4.3. Conclusion</a></li> <li><a href="#org5214dec">4.3. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org3044455">5. Functions</a> <li><a href="#org8f26dc0">5. Dynamic Coupling between actuators and sensors of each strut</a>
<ul> <ul>
<li><a href="#org56504f1">5.1. <code>generateCubicConfiguration</code>: Generate a Cubic Configuration</a> <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="#org0936a8a">5.3. Conclusion</a></li>
</ul>
</li>
<li><a href="#org3044455">6. Functions</a>
<ul>
<li><a href="#org56504f1">6.1. <code>generateCubicConfiguration</code>: Generate a Cubic Configuration</a>
<ul> <ul>
<li><a href="#orga5a9ba8">Function description</a></li> <li><a href="#orga5a9ba8">Function description</a></li>
<li><a href="#org3253792">Documentation</a></li> <li><a href="#org3253792">Documentation</a></li>
@ -337,15 +344,13 @@ In this document, the cubic architecture is analyzed:
<li>In section <a href="#orgda0ee50">1</a>, we study the link between the Stiffness matrix and the cubic architecture and we find what are the conditions to obtain a diagonal stiffness matrix</li> <li>In section <a href="#orgda0ee50">1</a>, we study the link between the Stiffness matrix and the cubic architecture and we find what are the conditions to obtain a diagonal stiffness matrix</li>
<li>In section <a href="#orgb73265d">2</a>, we study cubic configurations where the cube&rsquo;s center is located above the mobile platform</li> <li>In section <a href="#orgb73265d">2</a>, we study cubic configurations where the cube&rsquo;s center is located above the mobile platform</li>
<li>In section <a href="#org348ec7d">3</a>, we study the effect of the cube&rsquo;s size on the Stewart platform properties</li> <li>In section <a href="#org348ec7d">3</a>, we study the effect of the cube&rsquo;s size on the Stewart platform properties</li>
<li>In section <a href="#orgc379ec8">4</a>, we study the dynamic coupling of the cubic configuration</li> <li>In section <a href="#org00d3816">4</a>, we study the dynamic coupling of the cubic configuration in the cartesian frame</li>
<li>In section <a href="#org5b5c8a9">5</a>, we study the dynamic coupling of the cubic configuration from actuators to sensors of each strut</li>
<li>In section <a href="#org28ba607">6</a>, function related to the cubic configuration are defined. To generate and study the Stewart platform with a Cubic configuration, the Matlab function <code>generateCubicConfiguration</code> is used (described <a href="#orga8311d3">here</a>).</li>
</ul> </ul>
<p> <div id="outline-container-org3d18192" class="outline-2">
To generate and study the Stewart platform with a Cubic configuration, the Matlab function <code>generateCubicConfiguration</code> is used (described <a href="#orga8311d3">here</a>). <h2 id="org3d18192"><span class="section-number-2">1</span> Stiffness Matrix for the Cubic configuration</h2>
</p>
<div id="outline-container-org8c6677e" class="outline-2">
<h2 id="org8c6677e"><span class="section-number-2">1</span> Configuration Analysis - Stiffness Matrix</h2>
<div class="outline-text-2" id="text-1"> <div class="outline-text-2" id="text-1">
<p> <p>
<a id="orgda0ee50"></a> <a id="orgda0ee50"></a>
@ -831,8 +836,8 @@ stewart = initializeCylindricalPlatforms(stewart, <span class="org-string">'Fpr'
</div> </div>
</div> </div>
<div id="outline-container-org95af62e" class="outline-3"> <div id="outline-container-org778aab3" class="outline-3">
<h3 id="org95af62e"><span class="section-number-3">1.5</span> Conclusion</h3> <h3 id="org778aab3"><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>
@ -1157,8 +1162,8 @@ FOc = H <span class="org-type">+</span> MO_B; <span class="org-comment">% Cente
</div> </div>
</div> </div>
<div id="outline-container-org7673551" class="outline-3"> <div id="outline-container-org8e940b8" class="outline-3">
<h3 id="org7673551"><span class="section-number-3">2.2</span> Conclusion</h3> <h3 id="org8e940b8"><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>
@ -1232,8 +1237,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-orgcad29fd" class="outline-3"> <div id="outline-container-org9d42e84" class="outline-3">
<h3 id="orgcad29fd"><span class="section-number-3">3.2</span> Conclusion</h3> <h3 id="org9d42e84"><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.
@ -1249,37 +1254,506 @@ In order to maximize the rotational stiffness of the Stewart platform, the size
</div> </div>
</div> </div>
<div id="outline-container-org5abef15" class="outline-2"> <div id="outline-container-orgf09da67" class="outline-2">
<h2 id="org5abef15"><span class="section-number-2">4</span> Dynamic Coupling</h2> <h2 id="orgf09da67"><span class="section-number-2">4</span> Dynamic Coupling in the Cartesian Frame</h2>
<div class="outline-text-2" id="text-4"> <div class="outline-text-2" id="text-4">
<p> <p>
<a id="orgc379ec8"></a> <a id="org00d3816"></a>
</p>
<p>
In this section, we study the dynamics of the platform in the cartesian frame.
</p>
<p>
We here suppose that there is one relative motion sensor in each strut (\(\delta\bm{\mathcal{L}}\) is measured) and we would like to control the position of the top platform pose \(\delta \bm{\mathcal{X}}\).
</p>
<p>
Thanks to the Jacobian matrix, we can use the &ldquo;architecture&rdquo; shown in Figure <a href="#org76f24a0">9</a> to obtain the dynamics of the system from forces/torques applied by the actuators on the top platform to translations/rotations of the top platform.
</p>
<div class="org-src-container">
<pre class="src src-latex"><span class="org-font-latex-sedate"><span class="org-keyword">\begin</span></span>{<span class="org-function-name">tikzpicture</span>}
<span class="org-font-latex-sedate">\node</span>[block] (Jt) at (0, 0) {<span class="org-font-latex-math">$</span><span class="org-font-latex-sedate"><span class="org-font-latex-math">\bm</span></span><span class="org-font-latex-math">{J}</span><span class="org-font-latex-math"><span class="org-font-latex-script-char">^</span></span><span class="org-font-latex-math">{-T}$</span>};
<span class="org-font-latex-sedate">\node</span>[block, right= of Jt] (G) {<span class="org-font-latex-math">$</span><span class="org-font-latex-sedate"><span class="org-font-latex-math">\bm</span></span><span class="org-font-latex-math">{G}$</span>};
<span class="org-font-latex-sedate">\node</span>[block, right= of G] (J) {<span class="org-font-latex-math">$</span><span class="org-font-latex-sedate"><span class="org-font-latex-math">\bm</span></span><span class="org-font-latex-math">{J}</span><span class="org-font-latex-math"><span class="org-font-latex-script-char">^</span></span><span class="org-font-latex-math">{-1}$</span>};
<span class="org-font-latex-sedate">\draw</span>[-&gt;] (<span class="org-font-latex-math">$(Jt.west)+(-0.8, 0)$</span>) -- (Jt.west) node[above left]{<span class="org-font-latex-math">$</span><span class="org-font-latex-sedate"><span class="org-font-latex-math">\bm</span></span><span class="org-font-latex-math">{</span><span class="org-font-latex-sedate"><span class="org-font-latex-math">\mathcal</span></span><span class="org-font-latex-math">{F}}$</span>};
<span class="org-font-latex-sedate">\draw</span>[-&gt;] (Jt.east) -- (G.west) node[above left]{<span class="org-font-latex-math">$</span><span class="org-font-latex-sedate"><span class="org-font-latex-math">\bm</span></span><span class="org-font-latex-math">{</span><span class="org-font-latex-sedate"><span class="org-font-latex-math">\tau</span></span><span class="org-font-latex-math">}$</span>};
<span class="org-font-latex-sedate">\draw</span>[-&gt;] (G.east) -- (J.west) node[above left]{<span class="org-font-latex-math">$</span><span class="org-font-latex-sedate"><span class="org-font-latex-math">\delta\bm</span></span><span class="org-font-latex-math">{</span><span class="org-font-latex-sedate"><span class="org-font-latex-math">\mathcal</span></span><span class="org-font-latex-math">{L}}$</span>};
<span class="org-font-latex-sedate">\draw</span>[-&gt;] (J.east) -- ++(0.8, 0) node[above left]{<span class="org-font-latex-math">$</span><span class="org-font-latex-sedate"><span class="org-font-latex-math">\delta\bm</span></span><span class="org-font-latex-math">{</span><span class="org-font-latex-sedate"><span class="org-font-latex-math">\mathcal</span></span><span class="org-font-latex-math">{X}}$</span>};
<span class="org-font-latex-sedate"><span class="org-keyword">\end</span></span>{<span class="org-function-name">tikzpicture</span>}
</pre>
</div>
<div id="org76f24a0" class="figure">
<p><img src="figs/local_to_cartesian_coordinates.png" alt="local_to_cartesian_coordinates.png" />
</p>
<p><span class="figure-number">Figure 9: </span>From Strut coordinate to Cartesian coordinate using the Jacobian matrix</p>
</div>
<p>
We here study the dynamics from \(\bm{\mathcal{F}}\) to \(\delta\bm{\mathcal{X}}\).
</p>
<p>
One has to note that when considering the static behavior:
\[ \bm{G}(s = 0) = \begin{bmatrix}
1/k_1 & & 0 \\
& \ddots & 0 \\
0 & & 1/k_6
\end{bmatrix}\]
</p>
<p>
And thus:
\[ \frac{\delta\bm{\mathcal{X}}}{\bm{\mathcal{F}}}(s = 0) = \bm{J}^{-1} \bm{G}(s = 0) \bm{J}^{-T} = \bm{K}^{-1} = \bm{C} \]
</p>
<p>
We conclude that the <b>static</b> behavior of the platform depends on the stiffness matrix.
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-org0d67b92" class="outline-3"> <div id="outline-container-org5fe01ec" class="outline-3">
<h3 id="org0d67b92"><span class="section-number-3">4.1</span> Cube&rsquo;s center at the Center of Mass of the Payload</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">
<p>
Let&rsquo;s create a Cubic Stewart Platform where the <b>Center of Mass of the mobile platform is located at the center of the cube</b>.
</p>
<p>
We define the size of the Stewart platform and the position of frames \(\{A\}\) and \(\{B\}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">H = 200e<span class="org-type">-</span>3; <span class="org-comment">% height of the Stewart platform [m]</span>
MO_B = <span class="org-type">-</span>10e<span class="org-type">-</span>3; <span class="org-comment">% Position {B} with respect to {M} [m]</span>
</pre>
</div> </div>
<div id="outline-container-org876e05f" class="outline-3"> <p>
<h3 id="org876e05f"><span class="section-number-3">4.2</span> Dynamic decoupling between the actuators and sensors</h3> Now, we set the cube&rsquo;s parameters such that the center of the cube is coincident with \(\{A\}\) and \(\{B\}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">Hc = 2.5<span class="org-type">*</span>H; <span class="org-comment">% Size of the useful part of the cube [m]</span>
FOc = H <span class="org-type">+</span> MO_B; <span class="org-comment">% Center of the cube with respect to {F}</span>
</pre>
</div> </div>
<div id="outline-container-org213d9b9" class="outline-3"> <div class="org-src-container">
<h3 id="org213d9b9"><span class="section-number-3">4.3</span> Conclusion</h3> <pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, H, <span class="org-string">'MO_B'</span>, MO_B);
stewart = generateCubicConfiguration(stewart, <span class="org-string">'Hc'</span>, Hc, <span class="org-string">'FOc'</span>, FOc, <span class="org-string">'FHa'</span>, 25e<span class="org-type">-</span>3, <span class="org-string">'MHb'</span>, 25e<span class="org-type">-</span>3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, <span class="org-string">'K'</span>, 1e6<span class="org-type">*</span>ones(6,1), <span class="org-string">'C'</span>, 1e1<span class="org-type">*</span>ones(6,1));
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical'</span>);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
</pre>
</div>
<p>
Now we set the geometry and mass of the mobile platform such that its center of mass is coincident with \(\{A\}\) and \(\{B\}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeCylindricalPlatforms(stewart, <span class="org-string">'Fpr'</span>, 1.2<span class="org-type">*</span>max(vecnorm(stewart.platform_F.Fa)), ...
<span class="org-string">'Mpm'</span>, 10, ...
<span class="org-string">'Mph'</span>, 20e<span class="org-type">-</span>3, ...
<span class="org-string">'Mpr'</span>, 1.2<span class="org-type">*</span>max(vecnorm(stewart.platform_M.Mb)));
</pre>
</div>
<p>
And we set small mass for the struts.
</p>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeCylindricalStruts(stewart, <span class="org-string">'Fsm'</span>, 1e<span class="org-type">-</span>3, <span class="org-string">'Msm'</span>, 1e<span class="org-type">-</span>3);
stewart = initializeInertialSensor(stewart);
</pre>
</div>
<p>
The obtain geometry is shown in figure <a href="#orgc92a65b">10</a>.
</p>
<div id="orgc92a65b" class="figure">
<p><img src="figs/stewart_cubic_conf_decouple_dynamics.png" alt="stewart_cubic_conf_decouple_dynamics.png" />
</p>
<p><span class="figure-number">Figure 10: </span>Geometry used for the simulations - The cube&rsquo;s center, the frames \(\{A\}\) and \(\{B\}\) and the Center of mass of the mobile platform are coincident (<a href="./figs/stewart_cubic_conf_decouple_dynamics.png">png</a>, <a href="./figs/stewart_cubic_conf_decouple_dynamics.pdf">pdf</a>)</p>
</div>
<p>
We now identify the dynamics from forces applied in each strut \(\bm{\tau}\) to the displacement of each strut \(d \bm{\mathcal{L}}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">open(<span class="org-string">'simulink/stewart_active_damping.slx'</span>)
<span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
options = linearizeOptions;
options.SampleTime = 0;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = <span class="org-string">'stewart_active_damping'</span>;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1;
io(io_i) = linio([mdl, <span class="org-string">'/F'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
io(io_i) = linio([mdl, <span class="org-string">'/Dm'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Displacement of each leg [m]</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
G = linearize(mdl, io, options);
G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
G.OutputName = {<span class="org-string">'Dm1'</span>, <span class="org-string">'Dm2'</span>, <span class="org-string">'Dm3'</span>, <span class="org-string">'Dm4'</span>, <span class="org-string">'Dm5'</span>, <span class="org-string">'Dm6'</span>};
</pre>
</div>
<p>
Now, thanks to the Jacobian (Figure <a href="#org76f24a0">9</a>), we compute the transfer function from \(\bm{\mathcal{F}}\) to \(\bm{\mathcal{X}}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">Gc = inv(stewart.kinematics.J)<span class="org-type">*</span>G<span class="org-type">*</span>inv(stewart.kinematics.J<span class="org-type">'</span>);
Gc.InputName = {<span class="org-string">'Fx'</span>, <span class="org-string">'Fy'</span>, <span class="org-string">'Fz'</span>, <span class="org-string">'Mx'</span>, <span class="org-string">'My'</span>, <span class="org-string">'Mz'</span>};
Gc.OutputName = {<span class="org-string">'Dx'</span>, <span class="org-string">'Dy'</span>, <span class="org-string">'Dz'</span>, <span class="org-string">'Rx'</span>, <span class="org-string">'Ry'</span>, <span class="org-string">'Rz'</span>};
</pre>
</div>
<p>
The obtain dynamics \(\bm{G}_{c}(s) = \bm{J}^{-T} \bm{G}(s) \bm{J}^{-1}\) is shown in Figure <a href="#orgcb3ac4d">11</a>.
</p>
<div id="orgcb3ac4d" class="figure">
<p><img src="figs/stewart_cubic_decoupled_dynamics_cartesian.png" alt="stewart_cubic_decoupled_dynamics_cartesian.png" />
</p>
<p><span class="figure-number">Figure 11: </span>Dynamics from \(\bm{\mathcal{F}}\) to \(\bm{\mathcal{X}}\) (<a href="./figs/stewart_cubic_decoupled_dynamics_cartesian.png">png</a>, <a href="./figs/stewart_cubic_decoupled_dynamics_cartesian.pdf">pdf</a>)</p>
</div>
<div class="important">
<p>
The dynamics is well decoupled at all frequencies.
</p>
<p>
We have the same dynamics for:
</p>
<ul class="org-ul">
<li>\(D_x/F_x\), \(D_y/F_y\) and \(D_z/F_z\)</li>
<li>\(R_x/M_x\) and \(D_y/F_y\)</li>
</ul>
<p>
The Dynamics from \(F_i\) to \(D_i\) is just a 1-dof mass-spring-damper system.
</p>
<p>
This is because the Mass, Damping and Stiffness matrices are all diagonal.
</p>
</div>
</div>
</div>
<div id="outline-container-org4cb2a36" class="outline-3">
<h3 id="org4cb2a36"><span class="section-number-3">4.2</span> Cube&rsquo;s center not coincident with the Mass of the Mobile platform</h3>
<div class="outline-text-3" id="text-4-2">
<p>
Let&rsquo;s create a Stewart platform with a cubic architecture where the cube&rsquo;s center is at the center of the Stewart platform.
</p>
<div class="org-src-container">
<pre class="src src-matlab">H = 200e<span class="org-type">-</span>3; <span class="org-comment">% height of the Stewart platform [m]</span>
MO_B = <span class="org-type">-</span>100e<span class="org-type">-</span>3; <span class="org-comment">% Position {B} with respect to {M} [m]</span>
</pre>
</div>
<p>
Now, we set the cube&rsquo;s parameters such that the center of the cube is coincident with \(\{A\}\) and \(\{B\}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">Hc = 2.5<span class="org-type">*</span>H; <span class="org-comment">% Size of the useful part of the cube [m]</span>
FOc = H <span class="org-type">+</span> MO_B; <span class="org-comment">% Center of the cube with respect to {F}</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, H, <span class="org-string">'MO_B'</span>, MO_B);
stewart = generateCubicConfiguration(stewart, <span class="org-string">'Hc'</span>, Hc, <span class="org-string">'FOc'</span>, FOc, <span class="org-string">'FHa'</span>, 25e<span class="org-type">-</span>3, <span class="org-string">'MHb'</span>, 25e<span class="org-type">-</span>3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, <span class="org-string">'K'</span>, 1e6<span class="org-type">*</span>ones(6,1), <span class="org-string">'C'</span>, 1e1<span class="org-type">*</span>ones(6,1));
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical'</span>);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
</pre>
</div>
<p>
However, the Center of Mass of the mobile platform is <b>not</b> located at the cube&rsquo;s center.
</p>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeCylindricalPlatforms(stewart, <span class="org-string">'Fpr'</span>, 1.2<span class="org-type">*</span>max(vecnorm(stewart.platform_F.Fa)), ...
<span class="org-string">'Mpm'</span>, 10, ...
<span class="org-string">'Mph'</span>, 20e<span class="org-type">-</span>3, ...
<span class="org-string">'Mpr'</span>, 1.2<span class="org-type">*</span>max(vecnorm(stewart.platform_M.Mb)));
</pre>
</div>
<p>
And we set small mass for the struts.
</p>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeCylindricalStruts(stewart, <span class="org-string">'Fsm'</span>, 1e<span class="org-type">-</span>3, <span class="org-string">'Msm'</span>, 1e<span class="org-type">-</span>3);
stewart = initializeInertialSensor(stewart);
</pre>
</div>
<p>
The obtain geometry is shown in figure <a href="#orgfce7805">12</a>.
</p>
<div id="orgfce7805" class="figure">
<p><img src="figs/stewart_cubic_conf_mass_above.png" alt="stewart_cubic_conf_mass_above.png" />
</p>
<p><span class="figure-number">Figure 12: </span>Geometry used for the simulations - The cube&rsquo;s center is coincident with the frames \(\{A\}\) and \(\{B\}\) but not with the Center of mass of the mobile platform (<a href="./figs/stewart_cubic_conf_mass_above.png">png</a>, <a href="./figs/stewart_cubic_conf_mass_above.pdf">pdf</a>)</p>
</div>
<p>
We now identify the dynamics from forces applied in each strut \(\bm{\tau}\) to the displacement of each strut \(d \bm{\mathcal{L}}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">open(<span class="org-string">'simulink/stewart_active_damping.slx'</span>)
<span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
options = linearizeOptions;
options.SampleTime = 0;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = <span class="org-string">'stewart_active_damping'</span>;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1;
io(io_i) = linio([mdl, <span class="org-string">'/F'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
io(io_i) = linio([mdl, <span class="org-string">'/Dm'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Displacement of each leg [m]</span>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
G = linearize(mdl, io, options);
G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
G.OutputName = {<span class="org-string">'Dm1'</span>, <span class="org-string">'Dm2'</span>, <span class="org-string">'Dm3'</span>, <span class="org-string">'Dm4'</span>, <span class="org-string">'Dm5'</span>, <span class="org-string">'Dm6'</span>};
</pre>
</div>
<p>
And we use the Jacobian to compute the transfer function from \(\bm{\mathcal{F}}\) to \(\bm{\mathcal{X}}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">Gc = inv(stewart.kinematics.J)<span class="org-type">*</span>G<span class="org-type">*</span>inv(stewart.kinematics.J<span class="org-type">'</span>);
Gc.InputName = {<span class="org-string">'Fx'</span>, <span class="org-string">'Fy'</span>, <span class="org-string">'Fz'</span>, <span class="org-string">'Mx'</span>, <span class="org-string">'My'</span>, <span class="org-string">'Mz'</span>};
Gc.OutputName = {<span class="org-string">'Dx'</span>, <span class="org-string">'Dy'</span>, <span class="org-string">'Dz'</span>, <span class="org-string">'Rx'</span>, <span class="org-string">'Ry'</span>, <span class="org-string">'Rz'</span>};
</pre>
</div>
<p>
The obtain dynamics \(\bm{G}_{c}(s) = \bm{J}^{-T} \bm{G}(s) \bm{J}^{-1}\) is shown in Figure <a href="#org7a04d45">13</a>.
</p>
<div id="org7a04d45" class="figure">
<p><img src="figs/stewart_conf_coupling_mass_matrix.png" alt="stewart_conf_coupling_mass_matrix.png" />
</p>
<p><span class="figure-number">Figure 13: </span>Obtained Dynamics from \(\bm{\mathcal{F}}\) to \(\bm{\mathcal{X}}\) (<a href="./figs/stewart_conf_coupling_mass_matrix.png">png</a>, <a href="./figs/stewart_conf_coupling_mass_matrix.pdf">pdf</a>)</p>
</div>
<div class="important">
<p>
The system is decoupled at low frequency (the Stiffness matrix being diagonal), but it is <b>not</b> decoupled at all frequencies.
</p>
<p>
This was expected as the mass matrix is not diagonal (the Center of Mass of the mobile platform not being coincident with the frame \(\{B\}\)).
</p>
</div>
</div>
</div>
<div id="outline-container-org5214dec" class="outline-3">
<h3 id="org5214dec"><span class="section-number-3">4.3</span> Conclusion</h3>
<div class="outline-text-3" id="text-4-3">
<div class="important">
<p>
Some conclusions can be drawn from the above analysis:
</p>
<ul class="org-ul">
<li>Static Decoupling &lt;=&gt; Diagonal Stiffness matrix &lt;=&gt; {A} and {B} at the cube&rsquo;s center</li>
<li>Dynamic Decoupling &lt;=&gt; Static Decoupling + CoM of mobile platform coincident with {A} and {B}.</li>
</ul>
</div>
</div>
</div>
</div>
<div id="outline-container-org8f26dc0" class="outline-2">
<h2 id="org8f26dc0"><span class="section-number-2">5</span> Dynamic Coupling between actuators and sensors of each strut</h2>
<div class="outline-text-2" id="text-5">
<p>
<a id="org5b5c8a9"></a>
</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;.
</p>
<p>
In this section, we wish to study such properties of the cubic architecture.
</p>
<p>
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>
</div>
<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>
<div class="outline-text-3" id="text-5-1">
<p>
Let&rsquo;s generate a Cubic architecture where the cube&rsquo;s center and the frames \(\{A\}\) and \(\{B\}\) are coincident.
</p>
<div class="org-src-container">
<pre class="src src-matlab">H = 200e<span class="org-type">-</span>3; <span class="org-comment">% height of the Stewart platform [m]</span>
MO_B = <span class="org-type">-</span>10e<span class="org-type">-</span>3; <span class="org-comment">% Position {B} with respect to {M} [m]</span>
Hc = 2.5<span class="org-type">*</span>H; <span class="org-comment">% Size of the useful part of the cube [m]</span>
FOc = H <span class="org-type">+</span> MO_B; <span class="org-comment">% Center of the cube with respect to {F}</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, H, <span class="org-string">'MO_B'</span>, MO_B);
stewart = generateCubicConfiguration(stewart, <span class="org-string">'Hc'</span>, Hc, <span class="org-string">'FOc'</span>, FOc, <span class="org-string">'FHa'</span>, 25e<span class="org-type">-</span>3, <span class="org-string">'MHb'</span>, 25e<span class="org-type">-</span>3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, <span class="org-string">'K'</span>, 1e6<span class="org-type">*</span>ones(6,1), <span class="org-string">'C'</span>, 1e1<span class="org-type">*</span>ones(6,1));
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical'</span>);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart, <span class="org-string">'Fpr'</span>, 1.2<span class="org-type">*</span>max(vecnorm(stewart.platform_F.Fa)), ...
<span class="org-string">'Mpm'</span>, 10, ...
<span class="org-string">'Mph'</span>, 20e<span class="org-type">-</span>3, ...
<span class="org-string">'Mpr'</span>, 1.2<span class="org-type">*</span>max(vecnorm(stewart.platform_M.Mb)));
stewart = initializeCylindricalStruts(stewart, <span class="org-string">'Fsm'</span>, 1e<span class="org-type">-</span>3, <span class="org-string">'Msm'</span>, 1e<span class="org-type">-</span>3);
stewart = initializeInertialSensor(stewart);
</pre>
</div>
<div id="org67d7284" class="figure">
<p><img src="figs/stewart_architecture_coupling_struts_cubic.png" alt="stewart_architecture_coupling_struts_cubic.png" />
</p>
<p><span class="figure-number">Figure 14: </span>Geometry of the generated Stewart platform (<a href="./figs/stewart_architecture_coupling_struts_cubic.png">png</a>, <a href="./figs/stewart_architecture_coupling_struts_cubic.pdf">pdf</a>)</p>
</div>
<p>
And we identify the dynamics from the actuator forces \(\tau_{i}\) to the relative motion sensors \(\delta \mathcal{L}_{i}\) (Figure <a href="#orga20cd7d">15</a>) and to the force sensors \(\tau_{m,i}\) (Figure <a href="#org645e6c3">16</a>).
</p>
<div id="orga20cd7d" class="figure">
<p><img src="figs/coupling_struts_relative_sensor_cubic.png" alt="coupling_struts_relative_sensor_cubic.png" />
</p>
<p><span class="figure-number">Figure 15: </span>Dynamics from the force actuators to the relative motion sensors (<a href="./figs/coupling_struts_relative_sensor_cubic.png">png</a>, <a href="./figs/coupling_struts_relative_sensor_cubic.pdf">pdf</a>)</p>
</div>
<div id="org645e6c3" class="figure">
<p><img src="figs/coupling_struts_force_sensor_cubic.png" alt="coupling_struts_force_sensor_cubic.png" />
</p>
<p><span class="figure-number">Figure 16: </span>Dynamics from the force actuators to the force sensors (<a href="./figs/coupling_struts_force_sensor_cubic.png">png</a>, <a href="./figs/coupling_struts_force_sensor_cubic.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orgafd808d" class="outline-3">
<h3 id="orgafd808d"><span class="section-number-3">5.2</span> Coupling between the actuators and sensors - Non-Cubic Architecture</h3>
<div class="outline-text-3" id="text-5-2">
<p>
Now we generate a Stewart platform which is not cubic but with approximately the same size as the previous cubic architecture.
</p>
<div class="org-src-container">
<pre class="src src-matlab">H = 200e<span class="org-type">-</span>3; <span class="org-comment">% height of the Stewart platform [m]</span>
MO_B = <span class="org-type">-</span>10e<span class="org-type">-</span>3; <span class="org-comment">% Position {B} with respect to {M} [m]</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, H, <span class="org-string">'MO_B'</span>, MO_B);
stewart = generateGeneralConfiguration(stewart, <span class="org-string">'FR'</span>, 250e<span class="org-type">-</span>3, <span class="org-string">'MR'</span>, 150e<span class="org-type">-</span>3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, <span class="org-string">'K'</span>, 1e6<span class="org-type">*</span>ones(6,1), <span class="org-string">'C'</span>, 1e1<span class="org-type">*</span>ones(6,1));
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical'</span>);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart, <span class="org-string">'Fpr'</span>, 1.2<span class="org-type">*</span>max(vecnorm(stewart.platform_F.Fa)), ...
<span class="org-string">'Mpm'</span>, 10, ...
<span class="org-string">'Mph'</span>, 20e<span class="org-type">-</span>3, ...
<span class="org-string">'Mpr'</span>, 1.2<span class="org-type">*</span>max(vecnorm(stewart.platform_M.Mb)));
stewart = initializeCylindricalStruts(stewart, <span class="org-string">'Fsm'</span>, 1e<span class="org-type">-</span>3, <span class="org-string">'Msm'</span>, 1e<span class="org-type">-</span>3);
stewart = initializeInertialSensor(stewart);
</pre>
</div>
<div id="org14d3492" class="figure">
<p><img src="figs/stewart_architecture_coupling_struts_non_cubic.png" alt="stewart_architecture_coupling_struts_non_cubic.png" />
</p>
<p><span class="figure-number">Figure 17: </span>Geometry of the generated Stewart platform (<a href="./figs/stewart_architecture_coupling_struts_non_cubic.png">png</a>, <a href="./figs/stewart_architecture_coupling_struts_non_cubic.pdf">pdf</a>)</p>
</div>
<p>
And we identify the dynamics from the actuator forces \(\tau_{i}\) to the relative motion sensors \(\delta \mathcal{L}_{i}\) (Figure <a href="#orgff23a38">18</a>) and to the force sensors \(\tau_{m,i}\) (Figure <a href="#orgd802951">19</a>).
</p>
<div id="orgff23a38" class="figure">
<p><img src="figs/coupling_struts_relative_sensor_non_cubic.png" alt="coupling_struts_relative_sensor_non_cubic.png" />
</p>
<p><span class="figure-number">Figure 18: </span>Dynamics from the force actuators to the relative motion sensors (<a href="./figs/coupling_struts_relative_sensor_non_cubic.png">png</a>, <a href="./figs/coupling_struts_relative_sensor_non_cubic.pdf">pdf</a>)</p>
</div>
<div id="orgd802951" class="figure">
<p><img src="figs/coupling_struts_force_sensor_non_cubic.png" alt="coupling_struts_force_sensor_non_cubic.png" />
</p>
<p><span class="figure-number">Figure 19: </span>Dynamics from the force actuators to the force sensors (<a href="./figs/coupling_struts_force_sensor_non_cubic.png">png</a>, <a href="./figs/coupling_struts_force_sensor_non_cubic.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org0936a8a" class="outline-3">
<h3 id="org0936a8a"><span class="section-number-3">5.3</span> Conclusion</h3>
<div class="outline-text-3" id="text-5-3">
<div class="important">
<p>
The Cubic architecture seems to not have any significant effect on the coupling between actuator and sensors of each strut.
</p>
</div>
</div>
</div> </div>
</div> </div>
<div id="outline-container-org3044455" class="outline-2"> <div id="outline-container-org3044455" class="outline-2">
<h2 id="org3044455"><span class="section-number-2">5</span> Functions</h2> <h2 id="org3044455"><span class="section-number-2">6</span> Functions</h2>
<div class="outline-text-2" id="text-5"> <div class="outline-text-2" id="text-6">
<p> <p>
<a id="org28ba607"></a> <a id="org28ba607"></a>
</p> </p>
</div> </div>
<div id="outline-container-org56504f1" class="outline-3"> <div id="outline-container-org56504f1" class="outline-3">
<h3 id="org56504f1"><span class="section-number-3">5.1</span> <code>generateCubicConfiguration</code>: Generate a Cubic Configuration</h3> <h3 id="org56504f1"><span class="section-number-3">6.1</span> <code>generateCubicConfiguration</code>: Generate a Cubic Configuration</h3>
<div class="outline-text-3" id="text-5-1"> <div class="outline-text-3" id="text-6-1">
<p> <p>
<a id="orga8311d3"></a> <a id="orga8311d3"></a>
</p> </p>
@ -1323,7 +1797,7 @@ This Matlab function is accessible <a href="../src/generateCubicConfiguration.m"
<div id="org8a7f3d8" class="figure"> <div id="org8a7f3d8" class="figure">
<p><img src="figs/cubic-configuration-definition.png" alt="cubic-configuration-definition.png" /> <p><img src="figs/cubic-configuration-definition.png" alt="cubic-configuration-definition.png" />
</p> </p>
<p><span class="figure-number">Figure 9: </span>Cubic Configuration</p> <p><span class="figure-number">Figure 20: </span>Cubic Configuration</p>
</div> </div>
</div> </div>
</div> </div>
@ -1428,7 +1902,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-12 mer. 11:23</p> <p class="date">Created: 2020-02-12 mer. 18:26</p>
</div> </div>
</body> </body>
</html> </html>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

View File

@ -52,11 +52,11 @@ In this document, the cubic architecture is analyzed:
- In section [[sec:cubic_conf_stiffness]], we study the link between the Stiffness matrix and the cubic architecture and we find what are the conditions to obtain a diagonal stiffness matrix - In section [[sec:cubic_conf_stiffness]], we study the link between the Stiffness matrix and the cubic architecture and we find what are the conditions to obtain a diagonal stiffness matrix
- In section [[sec:cubic_conf_above_platform]], we study cubic configurations where the cube's center is located above the mobile platform - In section [[sec:cubic_conf_above_platform]], we study cubic configurations where the cube's center is located above the mobile platform
- In section [[sec:cubic_conf_size_analysis]], we study the effect of the cube's size on the Stewart platform properties - In section [[sec:cubic_conf_size_analysis]], we study the effect of the cube's size on the Stewart platform properties
- In section [[sec:cubic_conf_coupling]], we study the dynamic coupling of the cubic configuration - In section [[sec:cubic_conf_coupling_cartesian]], we study the dynamic coupling of the cubic configuration in the cartesian frame
- In section [[sec:cubic_conf_coupling_struts]], we study the dynamic coupling of the cubic configuration from actuators to sensors of each strut
- 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]]).
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
* Configuration Analysis - Stiffness Matrix
<<sec:cubic_conf_stiffness>> <<sec:cubic_conf_stiffness>>
** 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}$.
@ -552,9 +552,47 @@ We observe that $k_{\theta_x} = k_{\theta_y}$ and $k_{\theta_z}$ increase linear
In order to maximize the rotational stiffness of the Stewart platform, the size of the cube should be the highest possible. In order to maximize the rotational stiffness of the Stewart platform, the size of the cube should be the highest possible.
#+end_important #+end_important
* Dynamic Coupling * Dynamic Coupling in the Cartesian Frame
<<sec:cubic_conf_coupling>> <<sec:cubic_conf_coupling_cartesian>>
** Introduction :ignore: ** Introduction :ignore:
In this section, we study the dynamics of the platform in the cartesian frame.
We here suppose that there is one relative motion sensor in each strut ($\delta\bm{\mathcal{L}}$ is measured) and we would like to control the position of the top platform pose $\delta \bm{\mathcal{X}}$.
Thanks to the Jacobian matrix, we can use the "architecture" shown in Figure [[fig:local_to_cartesian_coordinates]] to obtain the dynamics of the system from forces/torques applied by the actuators on the top platform to translations/rotations of the top platform.
#+begin_src latex :file local_to_cartesian_coordinates.pdf :post pdf2svg(file=*this*, ext="png") :exports both
\begin{tikzpicture}
\node[block] (Jt) at (0, 0) {$\bm{J}^{-T}$};
\node[block, right= of Jt] (G) {$\bm{G}$};
\node[block, right= of G] (J) {$\bm{J}^{-1}$};
\draw[->] ($(Jt.west)+(-0.8, 0)$) -- (Jt.west) node[above left]{$\bm{\mathcal{F}}$};
\draw[->] (Jt.east) -- (G.west) node[above left]{$\bm{\tau}$};
\draw[->] (G.east) -- (J.west) node[above left]{$\delta\bm{\mathcal{L}}$};
\draw[->] (J.east) -- ++(0.8, 0) node[above left]{$\delta\bm{\mathcal{X}}$};
\end{tikzpicture}
#+end_src
#+name: fig:local_to_cartesian_coordinates
#+caption: From Strut coordinate to Cartesian coordinate using the Jacobian matrix
#+RESULTS:
[[file:figs/local_to_cartesian_coordinates.png]]
We here study the dynamics from $\bm{\mathcal{F}}$ to $\delta\bm{\mathcal{X}}$.
One has to note that when considering the static behavior:
\[ \bm{G}(s = 0) = \begin{bmatrix}
1/k_1 & & 0 \\
& \ddots & 0 \\
0 & & 1/k_6
\end{bmatrix}\]
And thus:
\[ \frac{\delta\bm{\mathcal{X}}}{\bm{\mathcal{F}}}(s = 0) = \bm{J}^{-1} \bm{G}(s = 0) \bm{J}^{-T} = \bm{K}^{-1} = \bm{C} \]
We conclude that the *static* behavior of the platform depends on the stiffness matrix.
For the cubic configuration, we have a diagonal stiffness matrix is the frames $\{A\}$ and $\{B\}$ are coincident with the cube's center.
** 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)
@ -569,13 +607,724 @@ We observe that $k_{\theta_x} = k_{\theta_y}$ and $k_{\theta_z}$ increase linear
simulinkproject('../'); simulinkproject('../');
#+end_src #+end_src
** 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\}$.
#+begin_src matlab
H = 200e-3; % height of the Stewart platform [m]
MO_B = -10e-3; % Position {B} with respect to {M} [m]
#+end_src
** Cube's center at the Center of Mass of the Payload Now, we set the cube's parameters such that the center of the cube is coincident with $\{A\}$ and $\{B\}$.
#+begin_src matlab
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}
#+end_src
** Dynamic decoupling between the actuators and sensors #+begin_src matlab
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);
#+end_src
Now we set the geometry and mass of the mobile platform such that its center of mass is coincident with $\{A\}$ and $\{B\}$.
#+begin_src matlab
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)));
#+end_src
And we set small mass for the struts.
#+begin_src matlab
stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
stewart = initializeInertialSensor(stewart);
#+end_src
The obtain geometry is shown in figure [[fig:stewart_cubic_conf_decouple_dynamics]].
#+begin_src matlab :exports none
displayArchitecture(stewart, 'labels', false, 'view', 'all');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/stewart_cubic_conf_decouple_dynamics.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+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}}$.
#+begin_src matlab
open('simulink/stewart_active_damping.slx')
%% Options for Linearized
options = linearizeOptions;
options.SampleTime = 0;
%% Name of the Simulink File
mdl = 'stewart_active_damping';
%% Input/Output definition
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, '/Dm'], 1, 'openoutput'); io_i = io_i + 1; % Displacement of each leg [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'};
#+end_src
Now, thanks to the Jacobian (Figure [[fig:local_to_cartesian_coordinates]]), we compute the transfer function from $\bm{\mathcal{F}}$ to $\bm{\mathcal{X}}$.
#+begin_src matlab
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'};
#+end_src
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]].
#+begin_src matlab :exports none
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');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/stewart_cubic_decoupled_dynamics_cartesian.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+name: fig:stewart_cubic_decoupled_dynamics_cartesian
#+caption: Dynamics from $\bm{\mathcal{F}}$ to $\bm{\mathcal{X}}$ ([[./figs/stewart_cubic_decoupled_dynamics_cartesian.png][png]], [[./figs/stewart_cubic_decoupled_dynamics_cartesian.pdf][pdf]])
[[file:figs/stewart_cubic_decoupled_dynamics_cartesian.png]]
#+begin_important
The dynamics is well decoupled at all frequencies.
We have the same dynamics for:
- $D_x/F_x$, $D_y/F_y$ and $D_z/F_z$
- $R_x/M_x$ and $D_y/F_y$
The Dynamics from $F_i$ to $D_i$ is just a 1-dof mass-spring-damper system.
This is because the Mass, Damping and Stiffness matrices are all diagonal.
#+end_important
** 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.
#+begin_src matlab
H = 200e-3; % height of the Stewart platform [m]
MO_B = -100e-3; % Position {B} with respect to {M} [m]
#+end_src
Now, we set the cube's parameters such that the center of the cube is coincident with $\{A\}$ and $\{B\}$.
#+begin_src matlab
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}
#+end_src
#+begin_src matlab
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);
#+end_src
However, the Center of Mass of the mobile platform is *not* located at the cube's center.
#+begin_src matlab
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)));
#+end_src
And we set small mass for the struts.
#+begin_src matlab
stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
stewart = initializeInertialSensor(stewart);
#+end_src
The obtain geometry is shown in figure [[fig:stewart_cubic_conf_mass_above]].
#+begin_src matlab :exports none
displayArchitecture(stewart, 'labels', false, 'view', 'all');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/stewart_cubic_conf_mass_above.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+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}}$.
#+begin_src matlab
open('simulink/stewart_active_damping.slx')
%% Options for Linearized
options = linearizeOptions;
options.SampleTime = 0;
%% Name of the Simulink File
mdl = 'stewart_active_damping';
%% Input/Output definition
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, '/Dm'], 1, 'openoutput'); io_i = io_i + 1; % Displacement of each leg [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'};
#+end_src
And we use the Jacobian to compute the transfer function from $\bm{\mathcal{F}}$ to $\bm{\mathcal{X}}$.
#+begin_src matlab
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'};
#+end_src
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]].
#+begin_src matlab :exports none
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');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/stewart_conf_coupling_mass_matrix.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+name: fig:stewart_conf_coupling_mass_matrix
#+caption: Obtained Dynamics from $\bm{\mathcal{F}}$ to $\bm{\mathcal{X}}$ ([[./figs/stewart_conf_coupling_mass_matrix.png][png]], [[./figs/stewart_conf_coupling_mass_matrix.pdf][pdf]])
[[file:figs/stewart_conf_coupling_mass_matrix.png]]
#+begin_important
The system is decoupled at low frequency (the Stiffness matrix being diagonal), but it is *not* decoupled at all frequencies.
This was expected as the mass matrix is not diagonal (the Center of Mass of the mobile platform not being coincident with the frame $\{B\}$).
#+end_important
** Conclusion ** Conclusion
#+begin_important
Some conclusions can be drawn from the above analysis:
- Static Decoupling <=> Diagonal Stiffness matrix <=> {A} and {B} at the cube's center
- Dynamic Decoupling <=> Static Decoupling + CoM of mobile platform coincident with {A} and {B}.
#+end_important
* Dynamic Coupling between actuators and sensors of each strut
<<sec:cubic_conf_coupling_struts>>
** 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)/".
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).
** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
#+begin_src matlab :results none :exports none
simulinkproject('../');
#+end_src
** 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.
#+begin_src matlab
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}
#+end_src
#+begin_src matlab
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);
#+end_src
#+begin_src matlab :exports none
displayArchitecture(stewart, 'labels', false, 'view', 'all');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/stewart_architecture_coupling_struts_cubic.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+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]]).
#+begin_src matlab :exports none
open('simulink/stewart_active_damping.slx')
%% Options for Linearized
options = linearizeOptions;
options.SampleTime = 0;
%% Name of the Simulink File
mdl = 'stewart_active_damping';
%% Input/Output definition
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, '/Dm'], 1, 'openoutput'); io_i = io_i + 1; % Displacement of each leg [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'};
#+end_src
#+begin_src matlab :exports none
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');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/coupling_struts_relative_sensor_cubic.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+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]]
#+begin_src matlab :exports none
%% Input/Output definition
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, '/Fm'], 1, 'openoutput'); io_i = io_i + 1; % Displacement of each leg [m]
%% Run the linearization
G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
#+end_src
#+begin_src matlab :exports none
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');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/coupling_struts_force_sensor_cubic.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+name: fig:coupling_struts_force_sensor_cubic
#+caption: Dynamics from the force actuators to the force sensors ([[./figs/coupling_struts_force_sensor_cubic.png][png]], [[./figs/coupling_struts_force_sensor_cubic.pdf][pdf]])
[[file:figs/coupling_struts_force_sensor_cubic.png]]
** 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.
#+begin_src matlab
H = 200e-3; % height of the Stewart platform [m]
MO_B = -10e-3; % Position {B} with respect to {M} [m]
#+end_src
#+begin_src matlab
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);
#+end_src
#+begin_src matlab :exports none
displayArchitecture(stewart, 'labels', false, 'view', 'all');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/stewart_architecture_coupling_struts_non_cubic.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+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]]).
#+begin_src matlab :exports none
open('simulink/stewart_active_damping.slx')
%% Options for Linearized
options = linearizeOptions;
options.SampleTime = 0;
%% Name of the Simulink File
mdl = 'stewart_active_damping';
%% Input/Output definition
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, '/Dm'], 1, 'openoutput'); io_i = io_i + 1; % Displacement of each leg [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'};
#+end_src
#+begin_src matlab :exports none
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');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/coupling_struts_relative_sensor_non_cubic.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+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]]
#+begin_src matlab :exports none
%% Input/Output definition
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, '/Fm'], 1, 'openoutput'); io_i = io_i + 1; % Displacement of each leg [m]
%% Run the linearization
G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
#+end_src
#+begin_src matlab :exports none
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');
#+end_src
#+header: :tangle no :exports results :results none :noweb yes
#+begin_src matlab :var filepath="figs/coupling_struts_force_sensor_non_cubic.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png")
<<plt-matlab>>
#+end_src
#+name: fig:coupling_struts_force_sensor_non_cubic
#+caption: Dynamics from the force actuators to the force sensors ([[./figs/coupling_struts_force_sensor_non_cubic.png][png]], [[./figs/coupling_struts_force_sensor_non_cubic.pdf][pdf]])
[[file:figs/coupling_struts_force_sensor_non_cubic.png]]
** Conclusion
#+begin_important
The Cubic architecture seems to not have any significant effect on the coupling between actuator and sensors of each strut.
#+end_important
* Functions * Functions
<<sec:functions>> <<sec:functions>>

View File

@ -235,4 +235,6 @@ if strcmp(args.views, 'all')
axis equal; axis equal;
axis off; axis off;
title('Side') title('Side')
close(f);
end end