stewart-simscape/cubic-configuration.html

989 lines
37 KiB
HTML

<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2020-02-06 jeu. 18:22 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Cubic configuration for the Stewart Platform</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Dehaeze Thomas" />
<style type="text/css">
<!--/*--><![CDATA[/*><!--*/
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #ccc;
box-shadow: 3px 3px 3px #eee;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: visible;
padding-top: 1.2em;
}
pre.src:before {
display: none;
position: absolute;
background-color: white;
top: -10px;
right: 10px;
padding: 3px;
border: 1px solid black;
}
pre.src:hover:before { display: inline;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { width: 90%; }
/*]]>*/-->
</style>
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
<script src="./js/jquery.min.js"></script>
<script src="./js/bootstrap.min.js"></script>
<script src="./js/jquery.stickytableheaders.min.js"></script>
<script src="./js/readtheorg.js"></script>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2020 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id)
{
var target = document.getElementById(id);
if(null != target) {
elem.cacheClassElem = elem.className;
elem.cacheClassTarget = target.className;
target.className = "code-highlighted";
elem.className = "code-highlighted";
}
}
function CodeHighlightOff(elem, id)
{
var target = document.getElementById(id);
if(elem.cacheClassElem)
elem.className = elem.cacheClassElem;
if(elem.cacheClassTarget)
target.className = elem.cacheClassTarget;
}
/*]]>*///-->
</script>
<script>
MathJax = {
tex: { macros: {
bm: ["\\boldsymbol{#1}",1],
}
}
};
</script>
<script type="text/javascript"
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
</head>
<body>
<div id="org-div-home-and-up">
<a accesskey="h" href="./index.html"> UP </a>
|
<a accesskey="H" href="./index.html"> HOME </a>
</div><div id="content">
<h1 class="title">Cubic configuration for the Stewart Platform</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org8350a45">1. Configuration Analysis - Stiffness Matrix</a>
<ul>
<li><a href="#org6b34363">1.1. Cubic Stewart platform centered with the cube center - Jacobian estimated at the cube center</a></li>
<li><a href="#orgd59e9f0">1.2. Cubic Stewart platform centered with the cube center - Jacobian not estimated at the cube center</a></li>
<li><a href="#org27bd91a">1.3. Cubic Stewart platform not centered with the cube center - Jacobian estimated at the cube center</a></li>
<li><a href="#org4adea52">1.4. Cubic Stewart platform not centered with the cube center - Jacobian estimated at the Stewart platform center</a></li>
<li><a href="#org5defe19">1.5. Conclusion</a></li>
<li><a href="#org905f726">1.6. Having Cube&rsquo;s center above the top platform</a></li>
</ul>
</li>
<li><a href="#org6746f61">2. Functions</a>
<ul>
<li><a href="#org80fcb20">2.1. <code>generateCubicConfiguration</code>: Generate a Cubic Configuration</a>
<ul>
<li><a href="#orgd3654f4">Function description</a></li>
<li><a href="#orgf1c4374">Documentation</a></li>
<li><a href="#org7703a4a">Optional Parameters</a></li>
<li><a href="#org43039c1">Position of the Cube</a></li>
<li><a href="#orga18e804">Compute the pose</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<p>
The discovery of the Cubic configuration is done in <a class='org-ref-reference' href="#geng94_six_degree_of_freed_activ">geng94_six_degree_of_freed_activ</a>.
Further analysis is conducted in
</p>
<p>
The specificity of the Cubic configuration is that each actuator is orthogonal with the others.
</p>
<p>
The cubic (or orthogonal) configuration of the Stewart platform is now widely used (<a class='org-ref-reference' href="#preumont07_six_axis_singl_stage_activ">preumont07_six_axis_singl_stage_activ</a>,<a class='org-ref-reference' href="#jafari03_orthog_gough_stewar_platf_microm">jafari03_orthog_gough_stewar_platf_microm</a>).
</p>
<p>
According to <a class='org-ref-reference' href="#preumont07_six_axis_singl_stage_activ">preumont07_six_axis_singl_stage_activ</a>, the cubic configuration provides a uniform stiffness in all directions and <b>minimizes the crosscoupling</b> from actuator to sensor of different legs (being orthogonal to each other).
</p>
<p>
To generate and study the Cubic configuration, <code>generateCubicConfiguration</code> is used (description in section <a href="#orgfe8cdfe">2.1</a>).
The goal is to study the benefits of using a cubic configuration:
</p>
<ul class="org-ul">
<li>Equal stiffness in all the degrees of freedom?</li>
<li>No coupling between the actuators?</li>
<li>Is the center of the cube an important point?</li>
</ul>
<div id="outline-container-org8350a45" class="outline-2">
<h2 id="org8350a45"><span class="section-number-2">1</span> Configuration Analysis - Stiffness Matrix</h2>
<div class="outline-text-2" id="text-1">
</div>
<div id="outline-container-org6b34363" class="outline-3">
<h3 id="org6b34363"><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">
<p>
We create a cubic Stewart platform (figure <a href="#org964919a">1</a>) in such a way that the center of the cube (black dot) 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.
</p>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeFramesPositions(<span class="org-string">'H'</span>, 100e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, <span class="org-type">-</span>50e<span class="org-type">-</span>3);
stewart = generateCubicConfiguration(stewart, <span class="org-string">'Hc'</span>, 100e<span class="org-type">-</span>3, <span class="org-string">'FOc'</span>, 50e<span class="org-type">-</span>3, <span class="org-string">'FHa'</span>, 0, <span class="org-string">'MHb'</span>, 0);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, <span class="org-string">'Ki'</span>, ones(6,1));
stewart = computeJacobian(stewart);
</pre>
</div>
<div id="org964919a" class="figure">
<p><img src="./figs/3d-cubic-stewart-aligned.png" alt="3d-cubic-stewart-aligned.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Centered cubic configuration</p>
</div>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
</colgroup>
<tbody>
<tr>
<td class="org-right">2</td>
<td class="org-right">0</td>
<td class="org-right">-2.5e-16</td>
<td class="org-right">0</td>
<td class="org-right">2.1e-17</td>
<td class="org-right">0</td>
</tr>
<tr>
<td class="org-right">0</td>
<td class="org-right">2</td>
<td class="org-right">0</td>
<td class="org-right">-7.8e-19</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
</tr>
<tr>
<td class="org-right">-2.5e-16</td>
<td class="org-right">0</td>
<td class="org-right">2</td>
<td class="org-right">-2.4e-18</td>
<td class="org-right">-1.4e-17</td>
<td class="org-right">0</td>
</tr>
<tr>
<td class="org-right">0</td>
<td class="org-right">-7.8e-19</td>
<td class="org-right">-2.4e-18</td>
<td class="org-right">0.015</td>
<td class="org-right">-4.3e-19</td>
<td class="org-right">1.7e-18</td>
</tr>
<tr>
<td class="org-right">1.8e-17</td>
<td class="org-right">0</td>
<td class="org-right">-1.1e-17</td>
<td class="org-right">0</td>
<td class="org-right">0.015</td>
<td class="org-right">0</td>
</tr>
<tr>
<td class="org-right">6.6e-18</td>
<td class="org-right">-3.3e-18</td>
<td class="org-right">0</td>
<td class="org-right">1.7e-18</td>
<td class="org-right">0</td>
<td class="org-right">0.06</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="outline-container-orgd59e9f0" class="outline-3">
<h3 id="orgd59e9f0"><span class="section-number-3">1.2</span> Cubic Stewart platform centered with the cube center - Jacobian not estimated at the cube center</h3>
<div class="outline-text-3" id="text-1-2">
<p>
We create a cubic Stewart platform with center of the cube located at the center of the Stewart platform (figure <a href="#org964919a">1</a>).
The Jacobian matrix is not estimated at the location of the center of the cube.
</p>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeFramesPositions(<span class="org-string">'H'</span>, 100e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 0);
stewart = generateCubicConfiguration(stewart, <span class="org-string">'Hc'</span>, 100e<span class="org-type">-</span>3, <span class="org-string">'FOc'</span>, 50e<span class="org-type">-</span>3, <span class="org-string">'FHa'</span>, 0, <span class="org-string">'MHb'</span>, 0);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, <span class="org-string">'Ki'</span>, ones(6,1));
stewart = computeJacobian(stewart);
</pre>
</div>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
</colgroup>
<tbody>
<tr>
<td class="org-right">2</td>
<td class="org-right">0</td>
<td class="org-right">-2.5e-16</td>
<td class="org-right">1.4e-17</td>
<td class="org-right">-0.1</td>
<td class="org-right">0</td>
</tr>
<tr>
<td class="org-right">0</td>
<td class="org-right">2</td>
<td class="org-right">0</td>
<td class="org-right">0.1</td>
<td class="org-right">0</td>
<td class="org-right">0</td>
</tr>
<tr>
<td class="org-right">-2.5e-16</td>
<td class="org-right">0</td>
<td class="org-right">2</td>
<td class="org-right">3.4e-18</td>
<td class="org-right">-1.4e-17</td>
<td class="org-right">0</td>
</tr>
<tr>
<td class="org-right">1.4e-17</td>
<td class="org-right">0.1</td>
<td class="org-right">3.4e-18</td>
<td class="org-right">0.02</td>
<td class="org-right">1.1e-20</td>
<td class="org-right">3.4e-18</td>
</tr>
<tr>
<td class="org-right">-0.1</td>
<td class="org-right">0</td>
<td class="org-right">-1.4e-17</td>
<td class="org-right">1.4e-19</td>
<td class="org-right">0.02</td>
<td class="org-right">-1.7e-18</td>
</tr>
<tr>
<td class="org-right">6.6e-18</td>
<td class="org-right">-3.3e-18</td>
<td class="org-right">0</td>
<td class="org-right">3.6e-18</td>
<td class="org-right">-1.7e-18</td>
<td class="org-right">0.06</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="outline-container-org27bd91a" class="outline-3">
<h3 id="org27bd91a"><span class="section-number-3">1.3</span> Cubic Stewart platform not centered with the cube center - Jacobian estimated at the cube center</h3>
<div class="outline-text-3" id="text-1-3">
<p>
Here, the &ldquo;center&rdquo; of the Stewart platform is not at the cube center (figure <a href="#orgeceb55c">2</a>).
The Jacobian is estimated at the cube center.
</p>
<div id="orgeceb55c" class="figure">
<p><img src="./figs/3d-cubic-stewart-misaligned.png" alt="3d-cubic-stewart-misaligned.png" />
</p>
<p><span class="figure-number">Figure 2: </span>Not centered cubic configuration</p>
</div>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeFramesPositions(<span class="org-string">'H'</span>, 80e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, <span class="org-type">-</span>40e<span class="org-type">-</span>3);
stewart = generateCubicConfiguration(stewart, <span class="org-string">'Hc'</span>, 100e<span class="org-type">-</span>3, <span class="org-string">'FOc'</span>, 50e<span class="org-type">-</span>3, <span class="org-string">'FHa'</span>, 0, <span class="org-string">'MHb'</span>, 0);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, <span class="org-string">'Ki'</span>, ones(6,1));
stewart = computeJacobian(stewart);
</pre>
</div>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
</colgroup>
<tbody>
<tr>
<td class="org-right">2</td>
<td class="org-right">0</td>
<td class="org-right">-1.5e-16</td>
<td class="org-right">0</td>
<td class="org-right">0.04</td>
<td class="org-right">0</td>
</tr>
<tr>
<td class="org-right">0</td>
<td class="org-right">2</td>
<td class="org-right">0</td>
<td class="org-right">-0.04</td>
<td class="org-right">0</td>
<td class="org-right">-2.8e-17</td>
</tr>
<tr>
<td class="org-right">-1.5e-16</td>
<td class="org-right">0</td>
<td class="org-right">2</td>
<td class="org-right">1.2e-18</td>
<td class="org-right">-1e-17</td>
<td class="org-right">0</td>
</tr>
<tr>
<td class="org-right">0</td>
<td class="org-right">-0.04</td>
<td class="org-right">1.2e-18</td>
<td class="org-right">0.016</td>
<td class="org-right">0</td>
<td class="org-right">8.7e-19</td>
</tr>
<tr>
<td class="org-right">0.04</td>
<td class="org-right">0</td>
<td class="org-right">-6.2e-18</td>
<td class="org-right">-1.1e-19</td>
<td class="org-right">0.016</td>
<td class="org-right">8.7e-19</td>
</tr>
<tr>
<td class="org-right">-3.7e-19</td>
<td class="org-right">-2.5e-17</td>
<td class="org-right">0</td>
<td class="org-right">1.2e-18</td>
<td class="org-right">8.7e-19</td>
<td class="org-right">0.06</td>
</tr>
</tbody>
</table>
<p>
We obtain \(k_x = k_y = k_z\) and \(k_{\theta_x} = k_{\theta_y}\), but the Stiffness matrix is not diagonal.
</p>
</div>
</div>
<div id="outline-container-org4adea52" class="outline-3">
<h3 id="org4adea52"><span class="section-number-3">1.4</span> Cubic Stewart platform not centered with the cube center - Jacobian estimated at the Stewart platform center</h3>
<div class="outline-text-3" id="text-1-4">
<p>
Here, the &ldquo;center&rdquo; of the Stewart platform is not at the cube center.
The Jacobian is estimated at the center of the Stewart platform.
</p>
<p>
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\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeFramesPositions(<span class="org-string">'H'</span>, 80e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, <span class="org-type">-</span>30e<span class="org-type">-</span>3);
stewart = generateCubicConfiguration(stewart, <span class="org-string">'Hc'</span>, 100e<span class="org-type">-</span>3, <span class="org-string">'FOc'</span>, 50e<span class="org-type">-</span>3, <span class="org-string">'FHa'</span>, 0, <span class="org-string">'MHb'</span>, 0);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, <span class="org-string">'Ki'</span>, ones(6,1));
stewart = computeJacobian(stewart);
</pre>
</div>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
</colgroup>
<tbody>
<tr>
<td class="org-right">2</td>
<td class="org-right">0</td>
<td class="org-right">-1.7e-16</td>
<td class="org-right">0</td>
<td class="org-right">4.9e-17</td>
<td class="org-right">0</td>
</tr>
<tr>
<td class="org-right">0</td>
<td class="org-right">2</td>
<td class="org-right">0</td>
<td class="org-right">-2.2e-17</td>
<td class="org-right">0</td>
<td class="org-right">2.8e-17</td>
</tr>
<tr>
<td class="org-right">-1.7e-16</td>
<td class="org-right">0</td>
<td class="org-right">2</td>
<td class="org-right">1.1e-18</td>
<td class="org-right">-1.4e-17</td>
<td class="org-right">1.4e-17</td>
</tr>
<tr>
<td class="org-right">0</td>
<td class="org-right">-2.2e-17</td>
<td class="org-right">1.1e-18</td>
<td class="org-right">0.015</td>
<td class="org-right">0</td>
<td class="org-right">3.5e-18</td>
</tr>
<tr>
<td class="org-right">4.4e-17</td>
<td class="org-right">0</td>
<td class="org-right">-1.4e-17</td>
<td class="org-right">-5.7e-20</td>
<td class="org-right">0.015</td>
<td class="org-right">-8.7e-19</td>
</tr>
<tr>
<td class="org-right">6.6e-18</td>
<td class="org-right">2.5e-17</td>
<td class="org-right">0</td>
<td class="org-right">3.5e-18</td>
<td class="org-right">-8.7e-19</td>
<td class="org-right">0.06</td>
</tr>
</tbody>
</table>
<p>
We obtain \(k_x = k_y = k_z\) and \(k_{\theta_x} = k_{\theta_y}\), and the Stiffness matrix is diagonal.
</p>
</div>
</div>
<div id="outline-container-org5defe19" class="outline-3">
<h3 id="org5defe19"><span class="section-number-3">1.5</span> Conclusion</h3>
<div class="outline-text-3" id="text-1-5">
<div class="important">
<ul class="org-ul">
<li>The cubic configuration permits to have \(k_x = k_y = k_z\) and \(k_{\theta_x} = k_{\theta_y}\)</li>
<li>The stiffness matrix \(K\) is diagonal for the cubic configuration if the Jacobian is estimated at the cube center.</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-org905f726" class="outline-3">
<h3 id="org905f726"><span class="section-number-3">1.6</span> Having Cube&rsquo;s center above the top platform</h3>
<div class="outline-text-3" id="text-1-6">
<p>
Let&rsquo;s say we want to have a decouple dynamics above the top platform.
Thus, we want the cube&rsquo;s center to be located above the top center.
This is possible, to do so:
</p>
<ul class="org-ul">
<li>The position of the center of the cube should be positioned at A</li>
<li>The Height of the &ldquo;useful&rdquo; part of the cube should be at least equal to two times the distance from F to A.
It is possible to have small cube, but then to configuration is a little bit strange.</li>
</ul>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeFramesPositions(<span class="org-string">'H'</span>, 100e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 50e<span class="org-type">-</span>3);
FOc = stewart.H <span class="org-type">+</span> stewart.MO_B(3);
Hc = 2<span class="org-type">*</span>(stewart.H <span class="org-type">+</span> stewart.MO_B(3));
stewart = generateCubicConfiguration(stewart, <span class="org-string">'Hc'</span>, Hc, <span class="org-string">'FOc'</span>, FOc, <span class="org-string">'FHa'</span>, 10e<span class="org-type">-</span>3, <span class="org-string">'MHb'</span>, 10e<span class="org-type">-</span>3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, <span class="org-string">'Ki'</span>, ones(6,1));
stewart = initializeJointDynamics(stewart, <span class="org-string">'disable'</span>, <span class="org-constant">true</span>);
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
</pre>
</div>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
</colgroup>
<tbody>
<tr>
<td class="org-right">2</td>
<td class="org-right">0</td>
<td class="org-right">-4.6e-16</td>
<td class="org-right">0</td>
<td class="org-right">4e-17</td>
<td class="org-right">0</td>
</tr>
<tr>
<td class="org-right">0</td>
<td class="org-right">2</td>
<td class="org-right">0</td>
<td class="org-right">-4.8e-17</td>
<td class="org-right">0</td>
<td class="org-right">-3.5e-17</td>
</tr>
<tr>
<td class="org-right">-4.6e-16</td>
<td class="org-right">0</td>
<td class="org-right">2</td>
<td class="org-right">1.5e-20</td>
<td class="org-right">4e-17</td>
<td class="org-right">0</td>
</tr>
<tr>
<td class="org-right">0</td>
<td class="org-right">-4.8e-17</td>
<td class="org-right">1.5e-20</td>
<td class="org-right">0.00034</td>
<td class="org-right">6.8e-21</td>
<td class="org-right">4.2e-19</td>
</tr>
<tr>
<td class="org-right">4e-17</td>
<td class="org-right">0</td>
<td class="org-right">4e-17</td>
<td class="org-right">-3e-21</td>
<td class="org-right">0.00034</td>
<td class="org-right">-2.7e-20</td>
</tr>
<tr>
<td class="org-right">-1.7e-19</td>
<td class="org-right">-3.6e-17</td>
<td class="org-right">0</td>
<td class="org-right">4.2e-19</td>
<td class="org-right">-2.7e-20</td>
<td class="org-right">0.0014</td>
</tr>
</tbody>
</table>
<p>
We obtain \(k_x = k_y = k_z\) and \(k_{\theta_x} = k_{\theta_y}\), but the Stiffness matrix is not diagonal.
</p>
</div>
</div>
</div>
<div id="outline-container-org6746f61" class="outline-2">
<h2 id="org6746f61"><span class="section-number-2">2</span> Functions</h2>
<div class="outline-text-2" id="text-2">
<p>
<a id="org2a4885e"></a>
</p>
</div>
<div id="outline-container-org80fcb20" class="outline-3">
<h3 id="org80fcb20"><span class="section-number-3">2.1</span> <code>generateCubicConfiguration</code>: Generate a Cubic Configuration</h3>
<div class="outline-text-3" id="text-2-1">
<p>
<a id="orgfe8cdfe"></a>
</p>
<p>
This Matlab function is accessible <a href="src/generateCubicConfiguration.m">here</a>.
</p>
</div>
<div id="outline-container-orgd3654f4" class="outline-4">
<h4 id="orgd3654f4">Function description</h4>
<div class="outline-text-4" id="text-orgd3654f4">
<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">generateCubicConfiguration</span>(<span class="org-variable-name">stewart</span>, <span class="org-variable-name">args</span>)
<span class="org-comment">% generateCubicConfiguration - Generate a Cubic Configuration</span>
<span class="org-comment">%</span>
<span class="org-comment">% Syntax: [stewart] = generateCubicConfiguration(stewart, args)</span>
<span class="org-comment">%</span>
<span class="org-comment">% Inputs:</span>
<span class="org-comment">% - stewart - A structure with the following fields</span>
<span class="org-comment">% - H [1x1] - Total height of the platform [m]</span>
<span class="org-comment">% - args - Can have the following fields:</span>
<span class="org-comment">% - Hc [1x1] - Height of the "useful" part of the cube [m]</span>
<span class="org-comment">% - FOc [1x1] - Height of the center of the cube with respect to {F} [m]</span>
<span class="org-comment">% - FHa [1x1] - Height of the plane joining the points ai with respect to the frame {F} [m]</span>
<span class="org-comment">% - MHb [1x1] - Height of the plane joining the points bi with respect to the frame {M} [m]</span>
<span class="org-comment">%</span>
<span class="org-comment">% Outputs:</span>
<span class="org-comment">% - stewart - updated Stewart structure with the added fields:</span>
<span class="org-comment">% - Fa [3x6] - Its i'th column is the position vector of joint ai with respect to {F}</span>
<span class="org-comment">% - Mb [3x6] - Its i'th column is the position vector of joint bi with respect to {M}</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf1c4374" class="outline-4">
<h4 id="orgf1c4374">Documentation</h4>
<div class="outline-text-4" id="text-orgf1c4374">
<div id="org8d1a2f5" class="figure">
<p><img src="figs/cubic-configuration-definition.png" alt="cubic-configuration-definition.png" />
</p>
<p><span class="figure-number">Figure 3: </span>Cubic Configuration</p>
</div>
</div>
</div>
<div id="outline-container-org7703a4a" class="outline-4">
<h4 id="org7703a4a">Optional Parameters</h4>
<div class="outline-text-4" id="text-org7703a4a">
<div class="org-src-container">
<pre class="src src-matlab">arguments
stewart
args.Hc (1,1) double {mustBeNumeric, mustBePositive} = 60e<span class="org-type">-</span>3
args.FOc (1,1) double {mustBeNumeric} = 50e<span class="org-type">-</span>3
args.FHa (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e<span class="org-type">-</span>3
args.MHb (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e<span class="org-type">-</span>3
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org43039c1" class="outline-4">
<h4 id="org43039c1">Position of the Cube</h4>
<div class="outline-text-4" id="text-org43039c1">
<p>
We define the useful points of the cube with respect to the Cube&rsquo;s center.
\({}^{C}C\) are the 6 vertices of the cubes expressed in a frame {C} which is
located at the center of the cube and aligned with {F} and {M}.
</p>
<div class="org-src-container">
<pre class="src src-matlab">sx = [ 2; <span class="org-type">-</span>1; <span class="org-type">-</span>1];
sy = [ 0; 1; <span class="org-type">-</span>1];
sz = [ 1; 1; 1];
R = [sx, sy, sz]<span class="org-type">./</span>vecnorm([sx, sy, sz]);
L = args.Hc<span class="org-type">*</span>sqrt(3);
Cc = R<span class="org-type">'*</span>[[0;0;L],[L;0;L],[L;0;0],[L;L;0],[0;L;0],[0;L;L]] <span class="org-type">-</span> [0;0;1.5<span class="org-type">*</span>args.Hc];
CCf = [Cc(<span class="org-type">:</span>,1), Cc(<span class="org-type">:</span>,3), Cc(<span class="org-type">:</span>,3), Cc(<span class="org-type">:</span>,5), Cc(<span class="org-type">:</span>,5), Cc(<span class="org-type">:</span>,1)]; <span class="org-comment">% CCf(:,i) corresponds to the bottom cube's vertice corresponding to the i'th leg</span>
CCm = [Cc(<span class="org-type">:</span>,2), Cc(<span class="org-type">:</span>,2), Cc(<span class="org-type">:</span>,4), Cc(<span class="org-type">:</span>,4), Cc(<span class="org-type">:</span>,6), Cc(<span class="org-type">:</span>,6)]; <span class="org-comment">% CCm(:,i) corresponds to the top cube's vertice corresponding to the i'th leg</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orga18e804" class="outline-4">
<h4 id="orga18e804">Compute the pose</h4>
<div class="outline-text-4" id="text-orga18e804">
<p>
We can compute the vector of each leg \({}^{C}\hat{\bm{s}}_{i}\) (unit vector from \({}^{C}C_{f}\) to \({}^{C}C_{m}\)).
</p>
<div class="org-src-container">
<pre class="src src-matlab">CSi = (CCm <span class="org-type">-</span> CCf)<span class="org-type">./</span>vecnorm(CCm <span class="org-type">-</span> CCf);
</pre>
</div>
<p>
We now which to compute the position of the joints \(a_{i}\) and \(b_{i}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">stewart.Fa = CCf <span class="org-type">+</span> [0; 0; args.FOc] <span class="org-type">+</span> ((args.FHa<span class="org-type">-</span>(args.FOc<span class="org-type">-</span>args.Hc<span class="org-type">/</span>2))<span class="org-type">./</span>CSi(3,<span class="org-type">:</span>))<span class="org-type">.*</span>CSi;
stewart.Mb = CCf <span class="org-type">+</span> [0; 0; args.FOc<span class="org-type">-</span>stewart.H] <span class="org-type">+</span> ((stewart.H<span class="org-type">-</span>args.MHb<span class="org-type">-</span>(args.FOc<span class="org-type">-</span>args.Hc<span class="org-type">/</span>2))<span class="org-type">./</span>CSi(3,<span class="org-type">:</span>))<span class="org-type">.*</span>CSi;
</pre>
</div>
</div>
</div>
</div>
</div>
<p>
<h1 class='org-ref-bib-h1'>Bibliography</h1>
<ul class='org-ref-bib'><li><a id="geng94_six_degree_of_freed_activ">[geng94_six_degree_of_freed_activ]</a> <a name="geng94_six_degree_of_freed_activ"></a>Geng & Haynes, Six Degree-Of-Freedom Active Vibration Control Using the Stewart Platforms, <i>IEEE Transactions on Control Systems Technology</i>, <b>2(1)</b>, 45-53 (1994). <a href="https://doi.org/10.1109/87.273110">link</a>. <a href="http://dx.doi.org/10.1109/87.273110">doi</a>.</li>
<li><a id="preumont07_six_axis_singl_stage_activ">[preumont07_six_axis_singl_stage_activ]</a> <a name="preumont07_six_axis_singl_stage_activ"></a>Preumont, Horodinca, Romanescu, de Marneffe, Avraam, Deraemaeker, Bossens & Abu Hanieh, A Six-Axis Single-Stage Active Vibration Isolator Based on Stewart Platform, <i>Journal of Sound and Vibration</i>, <b>300(3-5)</b>, 644-661 (2007). <a href="https://doi.org/10.1016/j.jsv.2006.07.050">link</a>. <a href="http://dx.doi.org/10.1016/j.jsv.2006.07.050">doi</a>.</li>
<li><a id="jafari03_orthog_gough_stewar_platf_microm">[jafari03_orthog_gough_stewar_platf_microm]</a> <a name="jafari03_orthog_gough_stewar_platf_microm"></a>Jafari & McInroy, Orthogonal Gough-Stewart Platforms for Micromanipulation, <i>IEEE Transactions on Robotics and Automation</i>, <b>19(4)</b>, 595-603 (2003). <a href="https://doi.org/10.1109/tra.2003.814506">link</a>. <a href="http://dx.doi.org/10.1109/tra.2003.814506">doi</a>.</li>
</ul>
</p>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-02-06 jeu. 18:22</p>
</div>
</body>
</html>