2019-03-22 12:03:59 +01:00
<?xml version="1.0" encoding="utf-8"?>
2020-01-29 17:52:04 +01:00
<?xml version="1.0" encoding="utf-8"?>
2019-03-22 12:03:59 +01:00
< !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-11 15:27:39 +01:00
<!-- 2020 - 02 - 11 mar. 15:26 -->
2019-03-22 12:03:59 +01:00
< meta http-equiv = "Content-Type" content = "text/html;charset=utf-8" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1" / >
< title > Identification of the Stewart Platform using Simscape< / title >
< meta name = "generator" content = "Org mode" / >
2020-01-29 17:52:04 +01:00
< meta name = "author" content = "Dehaeze Thomas" / >
2019-03-22 12:03:59 +01:00
< 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 >
2019-08-26 11:58:44 +02:00
< 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 >
2019-03-22 12:03:59 +01:00
< script type = "text/javascript" >
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
2020-01-29 17:52:04 +01:00
Copyright (C) 2012-2020 Free Software Foundation, Inc.
2019-03-22 12:03:59 +01:00
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 >
2020-01-29 17:52:04 +01:00
< script >
2020-02-11 15:27:39 +01:00
MathJax = {
tex: { macros: {
bm: ["\\boldsymbol{#1}",1],
}
2020-01-29 17:52:04 +01:00
}
2020-02-11 15:27:39 +01:00
};
< / script >
< script type = "text/javascript"
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">< / script >
2019-03-22 12:03:59 +01:00
< / head >
< body >
2019-08-26 11:58:44 +02:00
< 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" >
2019-03-22 12:03:59 +01:00
< h1 class = "title" > Identification of the Stewart Platform using Simscape< / h1 >
< div id = "table-of-contents" >
< h2 > Table of Contents< / h2 >
< div id = "text-table-of-contents" >
< ul >
2020-02-11 15:27:39 +01:00
< li > < a href = "#orgf65174f" > Identification< / a >
2020-01-29 17:52:04 +01:00
< ul >
2020-02-11 15:27:39 +01:00
< li > < a href = "#org5b89813" > Simscape Model< / a > < / li >
< li > < a href = "#org2bfdf1b" > Initialize the Stewart Platform< / a > < / li >
< li > < a href = "#org0d97b27" > Identification< / a > < / li >
2020-01-29 17:52:04 +01:00
< / ul >
< / li >
2020-02-11 15:27:39 +01:00
< li > < a href = "#orge464de2" > States as the motion of the mobile platform< / a >
2020-01-29 17:52:04 +01:00
< ul >
2020-02-11 15:27:39 +01:00
< li > < a href = "#org987daca" > Initialize the Stewart Platform< / a > < / li >
< li > < a href = "#orgc808316" > Identification< / a > < / li >
< li > < a href = "#orge68adea" > Coordinate transformation< / a > < / li >
< li > < a href = "#org4973ae1" > Analysis< / a > < / li >
< li > < a href = "#orge7b97c8" > Visualizing the modes< / a > < / li >
< li > < a href = "#org5d63457" > Identification< / a > < / li >
< li > < a href = "#orgf7a52cb" > Change of states< / a > < / li >
2020-01-29 17:52:04 +01:00
< / ul >
< / li >
2020-02-11 15:27:39 +01:00
< li > < a href = "#org23d7e7b" > Simple Model without any sensor< / a >
2020-01-29 17:52:04 +01:00
< ul >
2020-02-11 15:27:39 +01:00
< li > < a href = "#org69b8a98" > Simscape Model< / a > < / li >
< li > < a href = "#org4aef27a" > Initialize the Stewart Platform< / a > < / li >
< li > < a href = "#orgb9fd532" > Identification< / a > < / li >
2020-01-29 17:52:04 +01:00
< / ul >
< / li >
2020-02-11 15:27:39 +01:00
< li > < a href = "#org0502cd2" > Cartesian Plot< / a > < / li >
< li > < a href = "#org32e2eb3" > From a force to force sensor< / a > < / li >
< li > < a href = "#org8ddfd2c" > From a force applied in the leg to the displacement of the leg< / a > < / li >
< li > < a href = "#org5685537" > Transmissibility< / a > < / li >
< li > < a href = "#org3335d1e" > Compliance< / a > < / li >
< li > < a href = "#org5ca7af8" > Inertial< / a > < / li >
2019-03-22 12:03:59 +01:00
< / ul >
< / div >
< / div >
< p >
2020-01-29 17:52:04 +01:00
We would like to extract a state space model of the Stewart Platform from the Simscape model.
2019-03-22 12:03:59 +01:00
< / p >
2019-08-26 11:58:44 +02:00
2020-01-29 17:52:04 +01:00
< p >
The inputs are:
< / p >
< table border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
< colgroup >
< col class = "org-left" / >
< col class = "org-left" / >
< / colgroup >
< thead >
< tr >
< th scope = "col" class = "org-left" > Symbol< / th >
< th scope = "col" class = "org-left" > Meaning< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "org-left" > \(\bm{\mathcal{F}}_{d}\)< / td >
< td class = "org-left" > External forces applied in {B}< / td >
< / tr >
< tr >
< td class = "org-left" > \(\bm{\tau}\)< / td >
< td class = "org-left" > Joint forces< / td >
< / tr >
< tr >
< td class = "org-left" > \(\bm{\mathcal{F}}\)< / td >
< td class = "org-left" > Cartesian forces applied by the Joints< / td >
< / tr >
< tr >
< td class = "org-left" > \(\bm{D}_{w}\)< / td >
< td class = "org-left" > Fixed Based translation and rotations around {A}< / td >
< / tr >
< / tbody >
< / table >
< p >
The outputs are:
< / p >
< table border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
< colgroup >
< col class = "org-left" / >
< col class = "org-left" / >
< / colgroup >
< thead >
< tr >
< th scope = "col" class = "org-left" > Symbol< / th >
< th scope = "col" class = "org-left" > Meaning< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "org-left" > \(\bm{\mathcal{X}}\)< / td >
< td class = "org-left" > Relative Motion of {B} with respect to {A}< / td >
< / tr >
< tr >
< td class = "org-left" > \(\bm{\mathcal{L}}\)< / td >
< td class = "org-left" > Joint Displacement< / td >
< / tr >
< tr >
< td class = "org-left" > \(\bm{F}_{m}\)< / td >
< td class = "org-left" > Force Sensors in each strut< / td >
< / tr >
< tr >
< td class = "org-left" > \(\bm{v}_{m}\)< / td >
< td class = "org-left" > Inertial Sensors located at \(b_i\) measuring in the direction of the strut< / td >
< / tr >
< / tbody >
< / table >
< blockquote >
< p >
An important difference from basic Simulink models is that the states in a physical network are not independent in general, because some states have dependencies on other states through constraints.
< / p >
< / blockquote >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-orgf65174f" class = "outline-2" >
< h2 id = "orgf65174f" > Identification< / h2 >
< div class = "outline-text-2" id = "text-orgf65174f" >
2020-01-29 17:52:04 +01:00
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org5b89813" class = "outline-3" >
< h3 id = "org5b89813" > Simscape Model< / h3 >
2019-08-26 11:58:44 +02:00
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org2bfdf1b" class = "outline-3" >
< h3 id = "org2bfdf1b" > Initialize the Stewart Platform< / h3 >
< div class = "outline-text-3" id = "text-org2bfdf1b" >
2019-08-26 11:58:44 +02:00
< div class = "org-src-container" >
2020-02-11 15:27:39 +01:00
< pre class = "src src-matlab" > stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart);
2020-01-29 17:52:04 +01:00
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< / div >
< / div >
2019-03-22 12:03:59 +01:00
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org0d97b27" class = "outline-3" >
< h3 id = "org0d97b27" > Identification< / h3 >
< div class = "outline-text-3" id = "text-org0d97b27" >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Options for Linearized< / span > < / span >
options = linearizeOptions;
options.SampleTime = 0;
< span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Name of the Simulink File< / span > < / span >
mdl = < span class = "org-string" > 'stewart_platform_identification'< / 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" > '/tau'< / span > ], 1, < span class = "org-string" > 'openinput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
io(io_i) = linio([mdl, < span class = "org-string" > '/Fext'< / span > ], 1, < span class = "org-string" > 'openinput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
io(io_i) = linio([mdl, < span class = "org-string" > '/X'< / span > ], 1, < span class = "org-string" > 'openoutput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
io(io_i) = linio([mdl, < span class = "org-string" > '/Vm'< / span > ], 1, < span class = "org-string" > 'openoutput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
io(io_i) = linio([mdl, < span class = "org-string" > '/Taum'< / span > ], 1, < span class = "org-string" > 'openoutput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
io(io_i) = linio([mdl, < span class = "org-string" > '/Lm'< / span > ], 1, < span class = "org-string" > 'openoutput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
< span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Run the linearization< / span > < / span >
G = linearize(mdl, io, options);
G.InputName = {< span class = "org-string" > 'tau1'< / span > , < span class = "org-string" > 'tau2'< / span > , < span class = "org-string" > 'tau3'< / span > , < span class = "org-string" > 'tau4'< / span > , < span class = "org-string" > 'tau5'< / span > , < span class = "org-string" > 'tau6'< / span > , ...
< 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 > };
G.OutputName = {< span class = "org-string" > 'Xdx'< / span > , < span class = "org-string" > 'Xdy'< / span > , < span class = "org-string" > 'Xdz'< / span > , < span class = "org-string" > 'Xrx'< / span > , < span class = "org-string" > 'Xry'< / span > , < span class = "org-string" > 'Xrz'< / span > , ...
< span class = "org-string" > 'Vm1'< / span > , < span class = "org-string" > 'Vm2'< / span > , < span class = "org-string" > 'Vm3'< / span > , < span class = "org-string" > 'Vm4'< / span > , < span class = "org-string" > 'Vm5'< / span > , < span class = "org-string" > 'Vm6'< / span > , ...
< span class = "org-string" > 'taum1'< / span > , < span class = "org-string" > 'taum2'< / span > , < span class = "org-string" > 'taum3'< / span > , < span class = "org-string" > 'taum4'< / span > , < span class = "org-string" > 'taum5'< / span > , < span class = "org-string" > 'taum6'< / span > , ...
< span class = "org-string" > 'Lm1'< / span > , < span class = "org-string" > 'Lm2'< / span > , < span class = "org-string" > 'Lm3'< / span > , < span class = "org-string" > 'Lm4'< / span > , < span class = "org-string" > 'Lm5'< / span > , < span class = "org-string" > 'Lm6'< / span > };
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
< / div >
< / div >
2020-01-29 17:52:04 +01:00
< / div >
2019-03-22 12:03:59 +01:00
2020-02-11 15:27:39 +01:00
< div id = "outline-container-orge464de2" class = "outline-2" >
< h2 id = "orge464de2" > States as the motion of the mobile platform< / h2 >
< div class = "outline-text-2" id = "text-orge464de2" >
2020-01-29 17:52:04 +01:00
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org987daca" class = "outline-3" >
< h3 id = "org987daca" > Initialize the Stewart Platform< / h3 >
< div class = "outline-text-3" id = "text-org987daca" >
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
2020-02-11 15:27:39 +01:00
< pre class = "src src-matlab" > stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart);
2020-01-29 17:52:04 +01:00
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
< / pre >
< / div >
< / div >
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-orgc808316" class = "outline-3" >
< h3 id = "orgc808316" > Identification< / h3 >
< div class = "outline-text-3" id = "text-orgc808316" >
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Options for Linearized< / span > < / span >
options = linearizeOptions;
options.SampleTime = 0;
< span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Name of the Simulink File< / span > < / span >
mdl = < span class = "org-string" > 'stewart_platform_identification_simple'< / 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" > '/tau'< / span > ], 1, < span class = "org-string" > 'openinput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
io(io_i) = linio([mdl, < span class = "org-string" > '/X'< / span > ], 1, < span class = "org-string" > 'openoutput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
io(io_i) = linio([mdl, < span class = "org-string" > '/Xdot'< / span > ], 1, < span class = "org-string" > 'openoutput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
< span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Run the linearization< / span > < / span >
G = linearize(mdl, io);
< span class = "org-comment" > % G.InputName = {'tau1', 'tau2', 'tau3', 'tau4', 'tau5', 'tau6'};< / span >
< span class = "org-comment" > % G.OutputName = {'Xdx', 'Xdy', 'Xdz', 'Xrx', 'Xry', 'Xrz', 'Vdx', 'Vdy', 'Vdz', 'Vrx', 'Vry', 'Vrz'};< / span >
< / pre >
< / div >
2019-03-22 12:03:59 +01:00
< p >
2020-01-29 17:52:04 +01:00
Let’ s check the size of < code > G< / code > :
2019-03-22 12:03:59 +01:00
< / p >
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > size(G)
2019-08-26 11:58:44 +02:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< pre class = "example" >
size(G)
State-space model with 12 outputs, 6 inputs, and 18 states.
'org_babel_eoe'
ans =
'org_babel_eoe'
< / pre >
< p >
We expect to have only 12 states (corresponding to the 6dof of the mobile platform).
< / p >
2019-08-26 11:58:44 +02:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > Gm = minreal(G);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< pre class = "example" >
Gm = minreal(G);
6 states removed.
< / pre >
< p >
And indeed, we obtain 12 states.
< / p >
2019-03-22 12:03:59 +01:00
< / div >
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-orge68adea" class = "outline-3" >
< h3 id = "orge68adea" > Coordinate transformation< / h3 >
< div class = "outline-text-3" id = "text-orge68adea" >
2020-01-29 17:52:04 +01:00
< p >
We can perform the following transformation using the < code > ss2ss< / code > command.
< / p >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > Gt = ss2ss(Gm, Gm.C);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< p >
Then, the < code > C< / code > matrix of < code > Gt< / code > is the unity matrix which means that the states of the state space model are equal to the measurements \(\bm{Y}\).
< / p >
< p >
The measurements are the 6 displacement and 6 velocities of mobile platform with respect to \(\{B\}\).
< / p >
< p >
We could perform the transformation by hand:
< / p >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > At = Gm.C< span class = "org-type" > *< / span > Gm.A< span class = "org-type" > *< / span > pinv(Gm.C);
Bt = Gm.C< span class = "org-type" > *< / span > Gm.B;
Ct = eye(12);
Dt = zeros(12, 6);
Gt = ss(At, Bt, Ct, Dt);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
< / div >
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org4973ae1" class = "outline-3" >
< h3 id = "org4973ae1" > Analysis< / h3 >
< div class = "outline-text-3" id = "text-org4973ae1" >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > [V,D] = eig(Gt.A);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< table border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
< colgroup >
< col class = "org-right" / >
< col class = "org-right" / >
< col class = "org-right" / >
< / colgroup >
< thead >
< tr >
< th scope = "col" class = "org-right" > Mode Number< / th >
< th scope = "col" class = "org-right" > Resonance Frequency [Hz]< / th >
< th scope = "col" class = "org-right" > Damping Ratio [%]< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "org-right" > 1.0< / td >
< td class = "org-right" > 174.5< / td >
< td class = "org-right" > 0.9< / td >
< / tr >
< tr >
< td class = "org-right" > 2.0< / td >
< td class = "org-right" > 174.5< / td >
< td class = "org-right" > 0.7< / td >
< / tr >
< tr >
< td class = "org-right" > 3.0< / td >
< td class = "org-right" > 202.1< / td >
< td class = "org-right" > 0.7< / td >
< / tr >
< tr >
< td class = "org-right" > 4.0< / td >
< td class = "org-right" > 237.3< / td >
< td class = "org-right" > 0.6< / td >
< / tr >
< tr >
< td class = "org-right" > 5.0< / td >
< td class = "org-right" > 237.3< / td >
< td class = "org-right" > 0.5< / td >
< / tr >
< tr >
< td class = "org-right" > 6.0< / td >
< td class = "org-right" > 283.8< / td >
< td class = "org-right" > 0.5< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-orge7b97c8" class = "outline-3" >
< h3 id = "orge7b97c8" > Visualizing the modes< / h3 >
< div class = "outline-text-3" id = "text-orge7b97c8" >
2020-01-29 17:52:04 +01:00
< p >
To visualize the i’ th mode, we may excite the system using the inputs \(U_i\) such that \(B U_i\) is co-linear to \(\xi_i\) (the mode we want to excite).
< / p >
< p >
\[ U(t) = e^{\alpha t} ( ) \]
< / p >
< p >
Let’ s first sort the modes and just take the modes corresponding to a eigenvalue with a positive imaginary part.
< / p >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > ws = imag(diag(D));
[ws,I] = sort(ws)
ws = ws(7< span class = "org-type" > :< / span > end); I = I(7< span class = "org-type" > :< / span > end);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-keyword" > for< / span > < span class = "org-variable-name" > < span class = "org-constant" > i< / span > < / span > = < span class = "org-constant" > 1:length(ws)< / span >
< / pre >
2019-03-22 12:03:59 +01:00
< / div >
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > i_mode = I(< span class = "org-constant" > i< / span > ); < span class = "org-comment" > % the argument is the i'th mode< / span >
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > lambda_i = D(i_mode, i_mode);
xi_i = V(< span class = "org-type" > :< / span > ,i_mode);
a_i = real(lambda_i);
b_i = imag(lambda_i);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< p >
Let do 10 periods of the mode.
< / p >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > t = linspace(0, 10< span class = "org-type" > /< / span > (imag(lambda_i)< span class = "org-type" > /< / span > 2< span class = "org-type" > /< / span > < span class = "org-constant" > pi< / span > ), 1000);
U_i = pinv(Gt.B) < span class = "org-type" > *< / span > real(xi_i < span class = "org-type" > *< / span > lambda_i < span class = "org-type" > *< / span > (cos(b_i < span class = "org-type" > *< / span > t) < span class = "org-type" > +< / span > 1< span class = "org-constant" > i< / span > < span class = "org-type" > *< / span > sin(b_i < span class = "org-type" > *< / span > t)));
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > U = timeseries(U_i, t);
< / pre >
2019-03-22 12:03:59 +01:00
< / div >
2020-01-29 17:52:04 +01:00
< p >
Simulation:
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > load(< span class = "org-string" > 'mat/conf_simscape.mat'< / span > );
< span class = "org-matlab-simulink-keyword" > set_param< / span > (< span class = "org-variable-name" > conf_simscape< / span > , < span class = "org-string" > 'StopTime'< / span > , num2str(t(< span class = "org-variable-name" > end< / span > )));
< span class = "org-matlab-simulink-keyword" > sim< / span > (mdl);
< / pre >
2019-03-22 12:03:59 +01:00
< / div >
< p >
2020-01-29 17:52:04 +01:00
Save the movie of the mode shape.
2019-03-22 12:03:59 +01:00
< / p >
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > smwritevideo(mdl, sprintf(< span class = "org-string" > 'figs/mode%i'< / span > , < span class = "org-constant" > i< / span > ), ...
< span class = "org-string" > 'PlaybackSpeedRatio'< / span > , 1< span class = "org-type" > /< / span > (b_i< span class = "org-type" > /< / span > 2< span class = "org-type" > /< / span > < span class = "org-constant" > pi< / span > ), ...
< span class = "org-string" > 'FrameRate'< / span > , 30, ...
< span class = "org-string" > 'FrameSize'< / span > , [800, 400]);
< / pre >
< / div >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > < span class = "org-keyword" > end< / span >
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
2020-02-11 15:27:39 +01:00
< div id = "orgb15855a" class = "figure" >
2020-01-29 17:52:04 +01:00
< p > < img src = "figs/mode1.gif" alt = "mode1.gif" / >
< / p >
< p > < span class = "figure-number" > Figure 1: < / span > Identified mode - 1< / p >
2019-03-22 12:03:59 +01:00
< / div >
2020-01-29 17:52:04 +01:00
2020-02-11 15:27:39 +01:00
< div id = "org1816e59" class = "figure" >
2020-01-29 17:52:04 +01:00
< p > < img src = "figs/mode3.gif" alt = "mode3.gif" / >
< / p >
< p > < span class = "figure-number" > Figure 2: < / span > Identified mode - 3< / p >
2019-03-22 12:03:59 +01:00
< / div >
2020-01-29 17:52:04 +01:00
2020-02-11 15:27:39 +01:00
< div id = "org01c8dca" class = "figure" >
2020-01-29 17:52:04 +01:00
< p > < img src = "figs/mode5.gif" alt = "mode5.gif" / >
2019-03-22 12:03:59 +01:00
< / p >
2020-01-29 17:52:04 +01:00
< p > < span class = "figure-number" > Figure 3: < / span > Identified mode - 5< / p >
< / div >
< / div >
< / div >
2019-03-22 12:03:59 +01:00
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org5d63457" class = "outline-3" >
< h3 id = "org5d63457" > Identification< / h3 >
< div class = "outline-text-3" id = "text-org5d63457" >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Options for Linearized< / span > < / span >
options = linearizeOptions;
options.SampleTime = 0;
< span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Name of the Simulink File< / span > < / span >
mdl = < span class = "org-string" > 'stewart_platform_identification'< / 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" > '/tau'< / span > ], 1, < span class = "org-string" > 'openinput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
io(io_i) = linio([mdl, < span class = "org-string" > '/Lm'< / span > ], 1, < span class = "org-string" > 'openoutput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
< span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Run the linearization< / span > < / span >
G = linearize(mdl, io, options);
< span class = "org-comment" > % G.InputName = {'tau1', 'tau2', 'tau3', 'tau4', 'tau5', 'tau6'};< / span >
< span class = "org-comment" > % G.OutputName = {'Xdx', 'Xdy', 'Xdz', 'Xrx', 'Xry', 'Xrz', 'Vdx', 'Vdy', 'Vdz', 'Vrx', 'Vry', 'Vrz'};< / span >
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > size(G)
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
< / div >
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-orgf7a52cb" class = "outline-3" >
< h3 id = "orgf7a52cb" > Change of states< / h3 >
< div class = "outline-text-3" id = "text-orgf7a52cb" >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > At = G.C< span class = "org-type" > *< / span > G.A< span class = "org-type" > *< / span > pinv(G.C);
Bt = G.C< span class = "org-type" > *< / span > G.B;
Ct = eye(12);
Dt = zeros(12, 6);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > Gt = ss(At, Bt, Ct, Dt);
< / pre >
< / div >
2019-08-26 11:58:44 +02:00
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > size(Gt)
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< / div >
< / div >
< / div >
2019-03-22 12:03:59 +01:00
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org23d7e7b" class = "outline-2" >
< h2 id = "org23d7e7b" > Simple Model without any sensor< / h2 >
< div class = "outline-text-2" id = "text-org23d7e7b" >
2020-01-29 17:52:04 +01:00
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org69b8a98" class = "outline-3" >
< h3 id = "org69b8a98" > Simscape Model< / h3 >
< div class = "outline-text-3" id = "text-org69b8a98" >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > open < span class = "org-string" > 'stewart_identification_simple.slx'< / span >
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< / div >
< / div >
2019-03-22 12:03:59 +01:00
2020-01-29 17:52:04 +01:00
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org4aef27a" class = "outline-3" >
< h3 id = "org4aef27a" > Initialize the Stewart Platform< / h3 >
< div class = "outline-text-3" id = "text-org4aef27a" >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-02-11 15:27:39 +01:00
< pre class = "src src-matlab" > stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart);
2020-01-29 17:52:04 +01:00
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
< / pre >
< / div >
< / div >
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-orgb9fd532" class = "outline-3" >
< h3 id = "orgb9fd532" > Identification< / h3 >
< div class = "outline-text-3" id = "text-orgb9fd532" >
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > stateorder = {...
< span class = "org-string" > 'stewart_platform_identification_simple/Solver Configuration/EVAL_KEY/INPUT_1_1_1'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple/Solver Configuration/EVAL_KEY/INPUT_2_1_1'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple/Solver Configuration/EVAL_KEY/INPUT_3_1_1'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple/Solver Configuration/EVAL_KEY/INPUT_4_1_1'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple/Solver Configuration/EVAL_KEY/INPUT_5_1_1'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple/Solver Configuration/EVAL_KEY/INPUT_6_1_1'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_1.Subsystem.cylindrical_joint.Rz.q'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_2.Subsystem.cylindrical_joint.Rz.q'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_3.Subsystem.cylindrical_joint.Rz.q'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_4.Subsystem.cylindrical_joint.Rz.q'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_5.Subsystem.cylindrical_joint.Rz.q'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_6.Subsystem.cylindrical_joint.Rz.q'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_1.Subsystem.cylindrical_joint.Pz.p'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_2.Subsystem.cylindrical_joint.Pz.p'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_3.Subsystem.cylindrical_joint.Pz.p'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_4.Subsystem.cylindrical_joint.Pz.p'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_5.Subsystem.cylindrical_joint.Pz.p'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_6.Subsystem.cylindrical_joint.Pz.p'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_1.Subsystem.cylindrical_joint.Rz.w'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_2.Subsystem.cylindrical_joint.Rz.w'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_3.Subsystem.cylindrical_joint.Rz.w'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_4.Subsystem.cylindrical_joint.Rz.w'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_5.Subsystem.cylindrical_joint.Rz.w'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_6.Subsystem.cylindrical_joint.Rz.w'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_1.Subsystem.cylindrical_joint.Pz.v'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_2.Subsystem.cylindrical_joint.Pz.v'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_3.Subsystem.cylindrical_joint.Pz.v'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_4.Subsystem.cylindrical_joint.Pz.v'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_5.Subsystem.cylindrical_joint.Pz.v'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_6.Subsystem.cylindrical_joint.Pz.v'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_1.Subsystem.spherical_joint_F.S.Q'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_2.Subsystem.spherical_joint_F.S.Q'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_3.Subsystem.spherical_joint_F.S.Q'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_4.Subsystem.spherical_joint_F.S.Q'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_5.Subsystem.spherical_joint_F.S.Q'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_6.Subsystem.spherical_joint_F.S.Q'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_2.Subsystem.spherical_joint_F.S.w'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_3.Subsystem.spherical_joint_F.S.w'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_4.Subsystem.spherical_joint_F.S.w'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_5.Subsystem.spherical_joint_F.S.w'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_6.Subsystem.spherical_joint_F.S.w'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_1.Subsystem.spherical_joint_F.S.w'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_1.Subsystem.spherical_joint_M.S.Q'< / span > ,...
< span class = "org-string" > 'stewart_platform_identification_simple.Stewart_Platform.Strut_1.Subsystem.spherical_joint_M.S.w'< / span > };
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Options for Linearized< / span > < / span >
options = linearizeOptions;
options.SampleTime = 0;
< span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Name of the Simulink File< / span > < / span >
mdl = < span class = "org-string" > 'stewart_platform_identification_simple'< / 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" > '/tau'< / span > ], 1, < span class = "org-string" > 'openinput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
io(io_i) = linio([mdl, < span class = "org-string" > '/X'< / span > ], 1, < span class = "org-string" > 'openoutput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
io(io_i) = linio([mdl, < span class = "org-string" > '/Xdot'< / span > ], 1, < span class = "org-string" > 'openoutput'< / span > ); io_i = io_i < span class = "org-type" > +< / span > 1;
< span class = "org-matlab-cellbreak" > < span class = "org-comment" > %% Run the linearization< / span > < / span >
G = linearize(mdl, io, options);
G.InputName = {< span class = "org-string" > 'tau1'< / span > , < span class = "org-string" > 'tau2'< / span > , < span class = "org-string" > 'tau3'< / span > , < span class = "org-string" > 'tau4'< / span > , < span class = "org-string" > 'tau5'< / span > , < span class = "org-string" > 'tau6'< / span > };
G.OutputName = {< span class = "org-string" > 'Xdx'< / span > , < span class = "org-string" > 'Xdy'< / span > , < span class = "org-string" > 'Xdz'< / span > , < span class = "org-string" > 'Xrx'< / span > , < span class = "org-string" > 'Xry'< / span > , < span class = "org-string" > 'Xrz'< / span > , < span class = "org-string" > 'Vdx'< / span > , < span class = "org-string" > 'Vdy'< / span > , < span class = "org-string" > 'Vdz'< / span > , < span class = "org-string" > 'Vrx'< / span > , < span class = "org-string" > 'Vry'< / span > , < span class = "org-string" > 'Vrz'< / span > };
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > size(G)
< / pre >
< / div >
2019-08-26 11:58:44 +02:00
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > G.StateName
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< / div >
< / div >
< / div >
2019-03-22 12:03:59 +01:00
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org0502cd2" class = "outline-2" >
< h2 id = "org0502cd2" > Cartesian Plot< / h2 >
< div class = "outline-text-2" id = "text-org0502cd2" >
2019-03-22 12:03:59 +01:00
< p >
2020-01-29 17:52:04 +01:00
From a force applied in the Cartesian frame to a displacement in the Cartesian frame.
2019-03-22 12:03:59 +01:00
< / p >
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > < span class = "org-type" > figure< / span > ;
hold on;
plot(freqs, abs(squeeze(freqresp(G.G_cart(1, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))));
plot(freqs, abs(squeeze(freqresp(G.G_cart(2, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))));
plot(freqs, abs(squeeze(freqresp(G.G_cart(3, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))));
hold off;
< span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'XScale'< / span > , < span class = "org-string" > 'log'< / span > ); < span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'YScale'< / span > , < span class = "org-string" > 'log'< / span > );
xlabel(< span class = "org-string" > 'Frequency [Hz]'< / span > ); ylabel(< span class = "org-string" > 'Amplitude'< / span > );
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-type" > figure< / span > ;
bode(G.G_cart, freqs);
< / pre >
< / div >
< / div >
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org32e2eb3" class = "outline-2" >
< h2 id = "org32e2eb3" > From a force to force sensor< / h2 >
< div class = "outline-text-2" id = "text-org32e2eb3" >
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-type" > figure< / span > ;
hold on;
plot(freqs, abs(squeeze(freqresp(G.G_forc(1, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k-'< / span > , < span class = "org-string" > 'DisplayName'< / span > , < span class = "org-string" > '$F_{m_i}/F_{i}$'< / span > );
hold off;
< span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'XScale'< / span > , < span class = "org-string" > 'log'< / span > ); < span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'YScale'< / span > , < span class = "org-string" > 'log'< / span > );
xlabel(< span class = "org-string" > 'Frequency [Hz]'< / span > ); ylabel(< span class = "org-string" > 'Amplitude [N/N]'< / span > );
legend(< span class = "org-string" > 'location'< / span > , < span class = "org-string" > 'southeast'< / span > );
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-type" > figure< / span > ;
hold on;
plot(freqs, abs(squeeze(freqresp(G.G_forc(1, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k-'< / span > , < span class = "org-string" > 'DisplayName'< / span > , < span class = "org-string" > '$F_{m_i}/F_{i}$'< / span > );
plot(freqs, abs(squeeze(freqresp(G.G_forc(2, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k--'< / span > , < span class = "org-string" > 'DisplayName'< / span > , < span class = "org-string" > '$F_{m_j}/F_{i}$'< / span > );
plot(freqs, abs(squeeze(freqresp(G.G_forc(3, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k--'< / span > , < span class = "org-string" > 'HandleVisibility'< / span > , < span class = "org-string" > 'off'< / span > );
plot(freqs, abs(squeeze(freqresp(G.G_forc(4, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k--'< / span > , < span class = "org-string" > 'HandleVisibility'< / span > , < span class = "org-string" > 'off'< / span > );
plot(freqs, abs(squeeze(freqresp(G.G_forc(5, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k--'< / span > , < span class = "org-string" > 'HandleVisibility'< / span > , < span class = "org-string" > 'off'< / span > );
plot(freqs, abs(squeeze(freqresp(G.G_forc(6, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k--'< / span > , < span class = "org-string" > 'HandleVisibility'< / span > , < span class = "org-string" > 'off'< / span > );
hold off;
< span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'XScale'< / span > , < span class = "org-string" > 'log'< / span > ); < span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'YScale'< / span > , < span class = "org-string" > 'log'< / span > );
xlabel(< span class = "org-string" > 'Frequency [Hz]'< / span > ); ylabel(< span class = "org-string" > 'Amplitude [N/N]'< / span > );
legend(< span class = "org-string" > 'location'< / span > , < span class = "org-string" > 'southeast'< / span > );
< / pre >
< / div >
< / div >
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org8ddfd2c" class = "outline-2" >
< h2 id = "org8ddfd2c" > From a force applied in the leg to the displacement of the leg< / h2 >
< div class = "outline-text-2" id = "text-org8ddfd2c" >
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-type" > figure< / span > ;
hold on;
plot(freqs, abs(squeeze(freqresp(G.G_legs(1, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k-'< / span > , < span class = "org-string" > 'DisplayName'< / span > , < span class = "org-string" > '$D_{i}/F_{i}$'< / span > );
hold off;
< span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'XScale'< / span > , < span class = "org-string" > 'log'< / span > ); < span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'YScale'< / span > , < span class = "org-string" > 'log'< / span > );
xlabel(< span class = "org-string" > 'Frequency [Hz]'< / span > ); ylabel(< span class = "org-string" > 'Amplitude [m/N]'< / span > );
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-type" > figure< / span > ;
hold on;
plot(freqs, abs(squeeze(freqresp(G.G_legs(1, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k-'< / span > , < span class = "org-string" > 'DisplayName'< / span > , < span class = "org-string" > '$D_{i}/F_{i}$'< / span > );
plot(freqs, abs(squeeze(freqresp(G.G_legs(2, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k--'< / span > , < span class = "org-string" > 'DisplayName'< / span > , < span class = "org-string" > '$D_{j}/F_{i}$'< / span > );
plot(freqs, abs(squeeze(freqresp(G.G_legs(3, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k--'< / span > , < span class = "org-string" > 'HandleVisibility'< / span > , < span class = "org-string" > 'off'< / span > );
plot(freqs, abs(squeeze(freqresp(G.G_legs(4, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k--'< / span > , < span class = "org-string" > 'HandleVisibility'< / span > , < span class = "org-string" > 'off'< / span > );
plot(freqs, abs(squeeze(freqresp(G.G_legs(5, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k--'< / span > , < span class = "org-string" > 'HandleVisibility'< / span > , < span class = "org-string" > 'off'< / span > );
plot(freqs, abs(squeeze(freqresp(G.G_legs(6, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))), < span class = "org-string" > 'k--'< / span > , < span class = "org-string" > 'HandleVisibility'< / span > , < span class = "org-string" > 'off'< / span > );
hold off;
< span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'XScale'< / span > , < span class = "org-string" > 'log'< / span > ); < span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'YScale'< / span > , < span class = "org-string" > 'log'< / span > );
xlabel(< span class = "org-string" > 'Frequency [Hz]'< / span > ); ylabel(< span class = "org-string" > 'Amplitude [m/N]'< / span > );
legend(< span class = "org-string" > 'location'< / span > , < span class = "org-string" > 'northeast'< / span > );
< / pre >
< / div >
< / div >
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org5685537" class = "outline-2" >
< h2 id = "org5685537" > Transmissibility< / h2 >
< div class = "outline-text-2" id = "text-org5685537" >
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-type" > figure< / span > ;
hold on;
plot(freqs, abs(squeeze(freqresp(G.G_tran(1, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))));
plot(freqs, abs(squeeze(freqresp(G.G_tran(2, 2), freqs, < span class = "org-string" > 'Hz'< / span > ))));
plot(freqs, abs(squeeze(freqresp(G.G_tran(3, 3), freqs, < span class = "org-string" > 'Hz'< / span > ))));
hold off;
< span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'XScale'< / span > , < span class = "org-string" > 'log'< / span > ); < span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'YScale'< / span > , < span class = "org-string" > 'log'< / span > );
xlabel(< span class = "org-string" > 'Frequency [Hz]'< / span > ); ylabel(< span class = "org-string" > 'Amplitude [m/m]'< / span > );
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > < span class = "org-type" > figure< / span > ;
hold on;
plot(freqs, abs(squeeze(freqresp(G.G_tran(4, 4), freqs, < span class = "org-string" > 'Hz'< / span > ))));
plot(freqs, abs(squeeze(freqresp(G.G_tran(5, 5), freqs, < span class = "org-string" > 'Hz'< / span > ))));
plot(freqs, abs(squeeze(freqresp(G.G_tran(6, 6), freqs, < span class = "org-string" > 'Hz'< / span > ))));
hold off;
< span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'XScale'< / span > , < span class = "org-string" > 'log'< / span > ); < span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'YScale'< / span > , < span class = "org-string" > 'log'< / span > );
xlabel(< span class = "org-string" > 'Frequency [Hz]'< / span > ); ylabel(< span class = "org-string" > 'Amplitude [$\frac{rad/s}{rad/s}$]'< / span > );
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > < span class = "org-type" > figure< / span > ;
hold on;
plot(freqs, abs(squeeze(freqresp(G.G_tran(1, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))));
plot(freqs, abs(squeeze(freqresp(G.G_tran(1, 2), freqs, < span class = "org-string" > 'Hz'< / span > ))));
plot(freqs, abs(squeeze(freqresp(G.G_tran(1, 3), freqs, < span class = "org-string" > 'Hz'< / span > ))));
hold off;
< span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'XScale'< / span > , < span class = "org-string" > 'log'< / span > ); < span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'YScale'< / span > , < span class = "org-string" > 'log'< / span > );
xlabel(< span class = "org-string" > 'Frequency [Hz]'< / span > ); ylabel(< span class = "org-string" > 'Amplitude [m/m]'< / span > );
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< / div >
< / div >
2019-03-22 12:03:59 +01:00
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org3335d1e" class = "outline-2" >
< h2 id = "org3335d1e" > Compliance< / h2 >
< div class = "outline-text-2" id = "text-org3335d1e" >
2019-03-22 12:03:59 +01:00
< p >
2020-01-29 17:52:04 +01:00
From a force applied in the Cartesian frame to a relative displacement of the mobile platform with respect to the base.
2019-03-22 12:03:59 +01:00
< / p >
2020-01-29 17:52:04 +01:00
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > < span class = "org-type" > figure< / span > ;
hold on;
plot(freqs, abs(squeeze(freqresp(G.G_comp(1, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))));
plot(freqs, abs(squeeze(freqresp(G.G_comp(2, 2), freqs, < span class = "org-string" > 'Hz'< / span > ))));
plot(freqs, abs(squeeze(freqresp(G.G_comp(3, 3), freqs, < span class = "org-string" > 'Hz'< / span > ))));
hold off;
< span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'XScale'< / span > , < span class = "org-string" > 'log'< / span > ); < span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'YScale'< / span > , < span class = "org-string" > 'log'< / span > );
xlabel(< span class = "org-string" > 'Frequency [Hz]'< / span > ); ylabel(< span class = "org-string" > 'Amplitude [m/N]'< / span > );
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< / div >
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org5ca7af8" class = "outline-2" >
< h2 id = "org5ca7af8" > Inertial< / h2 >
< div class = "outline-text-2" id = "text-org5ca7af8" >
2020-01-29 17:52:04 +01:00
< p >
From a force applied on the Cartesian frame to the absolute displacement of the mobile platform.
< / p >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > < span class = "org-type" > figure< / span > ;
hold on;
plot(freqs, abs(squeeze(freqresp(G.G_iner(1, 1), freqs, < span class = "org-string" > 'Hz'< / span > ))));
plot(freqs, abs(squeeze(freqresp(G.G_iner(2, 2), freqs, < span class = "org-string" > 'Hz'< / span > ))));
plot(freqs, abs(squeeze(freqresp(G.G_iner(3, 3), freqs, < span class = "org-string" > 'Hz'< / span > ))));
hold off;
< span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'XScale'< / span > , < span class = "org-string" > 'log'< / span > ); < span class = "org-type" > set< / span > (< span class = "org-variable-name" > gca< / span > , < span class = "org-string" > 'YScale'< / span > , < span class = "org-string" > 'log'< / span > );
xlabel(< span class = "org-string" > 'Frequency [Hz]'< / span > ); ylabel(< span class = "org-string" > 'Amplitude [m/N]'< / span > );
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
< / div >
< / div >
< / div >
< div id = "postamble" class = "status" >
2020-01-29 17:52:04 +01:00
< p class = "author" > Author: Dehaeze Thomas< / p >
2020-02-11 15:27:39 +01:00
< p class = "date" > Created: 2020-02-11 mar. 15:26< / p >
2019-03-22 12:03:59 +01:00
< / div >
< / body >
< / html >