Compare commits
7 Commits
0faaef06e6
...
master
Author | SHA1 | Date | |
---|---|---|---|
13c6750b15 | |||
ed0c18829b | |||
f5922ca970 | |||
240d113062 | |||
32330b92f0 | |||
58cd2026dc | |||
7fad722181 |
@@ -3,25 +3,30 @@
|
|||||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||||
<head>
|
<head>
|
||||||
<!-- 2020-08-05 mer. 13:27 -->
|
<!-- 2021-01-08 ven. 15:53 -->
|
||||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
<title>Stewart Platform - Decentralized Active Damping</title>
|
<title>Stewart Platform - Decentralized Active Damping</title>
|
||||||
<meta name="generator" content="Org mode" />
|
<meta name="generator" content="Org mode" />
|
||||||
<meta name="author" content="Dehaeze Thomas" />
|
<meta name="author" content="Dehaeze Thomas" />
|
||||||
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
<link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
<script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
<script src="./js/jquery.min.js"></script>
|
<script>
|
||||||
<script src="./js/bootstrap.min.js"></script>
|
MathJax = {
|
||||||
<script src="./js/jquery.stickytableheaders.min.js"></script>
|
svg: {
|
||||||
<script src="./js/readtheorg.js"></script>
|
scale: 1,
|
||||||
<script>MathJax = {
|
fontCache: "global"
|
||||||
tex: {
|
},
|
||||||
tags: 'ams',
|
tex: {
|
||||||
macros: {bm: ["\\boldsymbol{#1}",1],}
|
tags: "ams",
|
||||||
}
|
multlineWidth: "%MULTLINEWIDTH",
|
||||||
};
|
tagSide: "right",
|
||||||
</script>
|
macros: {bm: ["\\boldsymbol{#1}",1],},
|
||||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
|
tagIndent: ".8em"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<script id="MathJax-script" async
|
||||||
|
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="org-div-home-and-up">
|
<div id="org-div-home-and-up">
|
||||||
@@ -34,35 +39,35 @@
|
|||||||
<h2>Table of Contents</h2>
|
<h2>Table of Contents</h2>
|
||||||
<div id="text-table-of-contents">
|
<div id="text-table-of-contents">
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orgc22d5d6">1. Inertial Control</a>
|
<li><a href="#orgddaf52f">1. Inertial Control</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#org1671c0b">1.1. Identification of the Dynamics</a></li>
|
<li><a href="#org933440d">1.1. Identification of the Dynamics</a></li>
|
||||||
<li><a href="#orgdae44ba">1.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li>
|
<li><a href="#org2875dd1">1.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li>
|
||||||
<li><a href="#org89e2002">1.3. Obtained Damping</a></li>
|
<li><a href="#org0cea759">1.3. Obtained Damping</a></li>
|
||||||
<li><a href="#org3904320">1.4. Conclusion</a></li>
|
<li><a href="#orga866100">1.4. Conclusion</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#org89e426a">2. Integral Force Feedback</a>
|
<li><a href="#orgf8ed544">2. Integral Force Feedback</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orgcb85703">2.1. Identification of the Dynamics with perfect Joints</a></li>
|
<li><a href="#orga2d019b">2.1. Identification of the Dynamics with perfect Joints</a></li>
|
||||||
<li><a href="#org4ca24f7">2.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li>
|
<li><a href="#org6ac04ee">2.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li>
|
||||||
<li><a href="#org11e5ee2">2.3. Obtained Damping</a></li>
|
<li><a href="#org06e1086">2.3. Obtained Damping</a></li>
|
||||||
<li><a href="#orgca67baa">2.4. Conclusion</a></li>
|
<li><a href="#orgfa832d6">2.4. Conclusion</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#org47a29be">3. Direct Velocity Feedback</a>
|
<li><a href="#orgabec4e1">3. Direct Velocity Feedback</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orgc82a6a7">3.1. Identification of the Dynamics with perfect Joints</a></li>
|
<li><a href="#org19cbcee">3.1. Identification of the Dynamics with perfect Joints</a></li>
|
||||||
<li><a href="#org92d6cb1">3.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li>
|
<li><a href="#org0fabf01">3.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li>
|
||||||
<li><a href="#org7497409">3.3. Obtained Damping</a></li>
|
<li><a href="#org6c74c9a">3.3. Obtained Damping</a></li>
|
||||||
<li><a href="#org61c422b">3.4. Conclusion</a></li>
|
<li><a href="#org81b2156">3.4. Conclusion</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#orgc84bb75">4. Compliance and Transmissibility Comparison</a>
|
<li><a href="#orgc7e2089">4. Compliance and Transmissibility Comparison</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orgebeb03b">4.1. Initialization</a></li>
|
<li><a href="#org6ec3b9e">4.1. Initialization</a></li>
|
||||||
<li><a href="#orgdde930c">4.2. Identification</a></li>
|
<li><a href="#orge87554a">4.2. Identification</a></li>
|
||||||
<li><a href="#orgcfd0381">4.3. Results</a></li>
|
<li><a href="#org1d70ccd">4.3. Results</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -73,19 +78,19 @@
|
|||||||
The following decentralized active damping techniques are briefly studied:
|
The following decentralized active damping techniques are briefly studied:
|
||||||
</p>
|
</p>
|
||||||
<ul class="org-ul">
|
<ul class="org-ul">
|
||||||
<li>Inertial Control (proportional feedback of the absolute velocity): Section <a href="#orgb2aa4b3">1</a></li>
|
<li>Inertial Control (proportional feedback of the absolute velocity): Section <a href="#org709d56c">1</a></li>
|
||||||
<li>Integral Force Feedback: Section <a href="#org44cadc6">2</a></li>
|
<li>Integral Force Feedback: Section <a href="#org1f0d316">2</a></li>
|
||||||
<li>Direct feedback of the relative velocity of each strut: Section <a href="#orgbdd1eba">3</a></li>
|
<li>Direct feedback of the relative velocity of each strut: Section <a href="#org63027d0">3</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<div id="outline-container-orgc22d5d6" class="outline-2">
|
<div id="outline-container-orgddaf52f" class="outline-2">
|
||||||
<h2 id="orgc22d5d6"><span class="section-number-2">1</span> Inertial Control</h2>
|
<h2 id="orgddaf52f"><span class="section-number-2">1</span> Inertial Control</h2>
|
||||||
<div class="outline-text-2" id="text-1">
|
<div class="outline-text-2" id="text-1">
|
||||||
<p>
|
<p>
|
||||||
<a id="orgb2aa4b3"></a>
|
<a id="org709d56c"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="note">
|
<div class="note" id="org1ae7526">
|
||||||
<p>
|
<p>
|
||||||
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_inertial.m">here</a>.
|
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_inertial.m">here</a>.
|
||||||
</p>
|
</p>
|
||||||
@@ -97,56 +102,56 @@ To run the script, open the Simulink Project, and type <code>run active_damping_
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org1671c0b" class="outline-3">
|
<div id="outline-container-org933440d" class="outline-3">
|
||||||
<h3 id="org1671c0b"><span class="section-number-3">1.1</span> Identification of the Dynamics</h3>
|
<h3 id="org933440d"><span class="section-number-3">1.1</span> Identification of the Dynamics</h3>
|
||||||
<div class="outline-text-3" id="text-1-1">
|
<div class="outline-text-3" id="text-1-1">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">stewart = initializeStewartPlatform();
|
<pre class="src src-matlab">stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
|
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'accelerometer'</span>, <span class="org-string">'freq'</span>, 5e3);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
|
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'rot_point'</span>, stewart.platform_F.FO_A);
|
||||||
payload = initializePayload('type', 'none');
|
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
controller = initializeController('type', 'open-loop');
|
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">%% Options for Linearized
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
|
||||||
options = linearizeOptions;
|
options = linearizeOptions;
|
||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
||||||
mdl = 'stewart_platform_model';
|
mdl = <span class="org-string">'stewart_platform_model'</span>;
|
||||||
|
|
||||||
%% Input/Output definition
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
|
||||||
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'Vm'); io_i = io_i + 1; % Absolute velocity of each leg [m/s]
|
io(io_i) = linio([mdl, <span class="org-string">'/Stewart Platform'</span>], 1, <span class="org-string">'openoutput'</span>, [], <span class="org-string">'Vm'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Absolute velocity of each leg [m/s]</span>
|
||||||
|
|
||||||
%% Run the linearization
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
||||||
G = linearize(mdl, io, options);
|
G = linearize(mdl, io, options);
|
||||||
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
|
||||||
G.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
|
G.OutputName = {<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>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The transfer function from actuator forces to force sensors is shown in Figure <a href="#org116ea42">1</a>.
|
The transfer function from actuator forces to force sensors is shown in Figure <a href="#org5cd47c9">1</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div id="org116ea42" class="figure">
|
<div id="org5cd47c9" class="figure">
|
||||||
<p><img src="figs/inertial_plant_coupling.png" alt="inertial_plant_coupling.png" />
|
<p><img src="figs/inertial_plant_coupling.png" alt="inertial_plant_coupling.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 1: </span>Transfer function from the Actuator force \(F_{i}\) to the absolute velocity of the same leg \(v_{m,i}\) and to the absolute velocity of the other legs \(v_{m,j}\) with \(i \neq j\) in grey (<a href="./figs/inertial_plant_coupling.png">png</a>, <a href="./figs/inertial_plant_coupling.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 1: </span>Transfer function from the Actuator force \(F_{i}\) to the absolute velocity of the same leg \(v_{m,i}\) and to the absolute velocity of the other legs \(v_{m,j}\) with \(i \neq j\) in grey (<a href="./figs/inertial_plant_coupling.png">png</a>, <a href="./figs/inertial_plant_coupling.pdf">pdf</a>)</p>
|
||||||
@@ -154,17 +159,17 @@ The transfer function from actuator forces to force sensors is shown in Figure <
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgdae44ba" class="outline-3">
|
<div id="outline-container-org2875dd1" class="outline-3">
|
||||||
<h3 id="orgdae44ba"><span class="section-number-3">1.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
|
<h3 id="org2875dd1"><span class="section-number-3">1.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
|
||||||
<div class="outline-text-3" id="text-1-2">
|
<div class="outline-text-3" id="text-1-2">
|
||||||
<p>
|
<p>
|
||||||
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
|
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
|
<pre class="src src-matlab">stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical'</span>);
|
||||||
Gf = linearize(mdl, io, options);
|
Gf = linearize(mdl, io, options);
|
||||||
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
Gf.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
|
||||||
Gf.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
|
Gf.OutputName = {<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>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -174,16 +179,16 @@ We now use the amplified actuators and re-identify the dynamics
|
|||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
|
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
|
||||||
Ga = linearize(mdl, io, options);
|
Ga = linearize(mdl, io, options);
|
||||||
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
Ga.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
|
||||||
Ga.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
|
Ga.OutputName = {<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>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The new dynamics from force actuator to force sensor is shown in Figure <a href="#org620efcd">2</a>.
|
The new dynamics from force actuator to force sensor is shown in Figure <a href="#org8fcc87b">2</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div id="org620efcd" class="figure">
|
<div id="org8fcc87b" class="figure">
|
||||||
<p><img src="figs/inertial_plant_flexible_joint_decentralized.png" alt="inertial_plant_flexible_joint_decentralized.png" />
|
<p><img src="figs/inertial_plant_flexible_joint_decentralized.png" alt="inertial_plant_flexible_joint_decentralized.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 2: </span>Transfer function from the Actuator force \(F_{i}\) to the absolute velocity sensor \(v_{m,i}\) (<a href="./figs/inertial_plant_flexible_joint_decentralized.png">png</a>, <a href="./figs/inertial_plant_flexible_joint_decentralized.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 2: </span>Transfer function from the Actuator force \(F_{i}\) to the absolute velocity sensor \(v_{m,i}\) (<a href="./figs/inertial_plant_flexible_joint_decentralized.png">png</a>, <a href="./figs/inertial_plant_flexible_joint_decentralized.pdf">pdf</a>)</p>
|
||||||
@@ -191,8 +196,8 @@ The new dynamics from force actuator to force sensor is shown in Figure <a href=
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org89e2002" class="outline-3">
|
<div id="outline-container-org0cea759" class="outline-3">
|
||||||
<h3 id="org89e2002"><span class="section-number-3">1.3</span> Obtained Damping</h3>
|
<h3 id="org0cea759"><span class="section-number-3">1.3</span> Obtained Damping</h3>
|
||||||
<div class="outline-text-3" id="text-1-3">
|
<div class="outline-text-3" id="text-1-3">
|
||||||
<p>
|
<p>
|
||||||
The control is a performed in a decentralized manner.
|
The control is a performed in a decentralized manner.
|
||||||
@@ -206,10 +211,10 @@ The \(6 \times 6\) control is a diagonal matrix with pure proportional action on
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The root locus is shown in figure <a href="#org9cabaee">3</a>.
|
The root locus is shown in figure <a href="#orgaea8656">3</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div id="org9cabaee" class="figure">
|
<div id="orgaea8656" class="figure">
|
||||||
<p><img src="figs/root_locus_inertial_rot_stiffness.png" alt="root_locus_inertial_rot_stiffness.png" />
|
<p><img src="figs/root_locus_inertial_rot_stiffness.png" alt="root_locus_inertial_rot_stiffness.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 3: </span>Root Locus plot with Decentralized Inertial Control when considering the stiffness of flexible joints (<a href="./figs/root_locus_inertial_rot_stiffness.png">png</a>, <a href="./figs/root_locus_inertial_rot_stiffness.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 3: </span>Root Locus plot with Decentralized Inertial Control when considering the stiffness of flexible joints (<a href="./figs/root_locus_inertial_rot_stiffness.png">png</a>, <a href="./figs/root_locus_inertial_rot_stiffness.pdf">pdf</a>)</p>
|
||||||
@@ -217,10 +222,10 @@ The root locus is shown in figure <a href="#org9cabaee">3</a>.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org3904320" class="outline-3">
|
<div id="outline-container-orga866100" class="outline-3">
|
||||||
<h3 id="org3904320"><span class="section-number-3">1.4</span> Conclusion</h3>
|
<h3 id="orga866100"><span class="section-number-3">1.4</span> Conclusion</h3>
|
||||||
<div class="outline-text-3" id="text-1-4">
|
<div class="outline-text-3" id="text-1-4">
|
||||||
<div class="important">
|
<div class="important" id="org91c21ee">
|
||||||
<p>
|
<p>
|
||||||
We do not have guaranteed stability with Inertial control. This is because of the flexibility inside the internal sensor.
|
We do not have guaranteed stability with Inertial control. This is because of the flexibility inside the internal sensor.
|
||||||
</p>
|
</p>
|
||||||
@@ -230,14 +235,14 @@ We do not have guaranteed stability with Inertial control. This is because of th
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org89e426a" class="outline-2">
|
<div id="outline-container-orgf8ed544" class="outline-2">
|
||||||
<h2 id="org89e426a"><span class="section-number-2">2</span> Integral Force Feedback</h2>
|
<h2 id="orgf8ed544"><span class="section-number-2">2</span> Integral Force Feedback</h2>
|
||||||
<div class="outline-text-2" id="text-2">
|
<div class="outline-text-2" id="text-2">
|
||||||
<p>
|
<p>
|
||||||
<a id="org44cadc6"></a>
|
<a id="org1f0d316"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="note">
|
<div class="note" id="org30f755d">
|
||||||
<p>
|
<p>
|
||||||
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_iff.m">here</a>.
|
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_iff.m">here</a>.
|
||||||
</p>
|
</p>
|
||||||
@@ -249,31 +254,31 @@ To run the script, open the Simulink Project, and type <code>run active_damping_
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgcb85703" class="outline-3">
|
<div id="outline-container-orga2d019b" class="outline-3">
|
||||||
<h3 id="orgcb85703"><span class="section-number-3">2.1</span> Identification of the Dynamics with perfect Joints</h3>
|
<h3 id="orga2d019b"><span class="section-number-3">2.1</span> Identification of the Dynamics with perfect Joints</h3>
|
||||||
<div class="outline-text-3" id="text-2-1">
|
<div class="outline-text-3" id="text-2-1">
|
||||||
<p>
|
<p>
|
||||||
We first initialize the Stewart platform without joint stiffness.
|
We first initialize the Stewart platform without joint stiffness.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">stewart = initializeStewartPlatform();
|
<pre class="src src-matlab">stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'none');
|
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
|
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'rot_point'</span>, stewart.platform_F.FO_A);
|
||||||
payload = initializePayload('type', 'none');
|
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
controller = initializeController('type', 'open-loop');
|
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -281,26 +286,26 @@ controller = initializeController('type', 'open-loop');
|
|||||||
And we identify the dynamics from force actuators to force sensors.
|
And we identify the dynamics from force actuators to force sensors.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">%% Name of the Simulink File
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
||||||
mdl = 'stewart_platform_model';
|
mdl = <span class="org-string">'stewart_platform_model'</span>;
|
||||||
|
|
||||||
%% Input/Output definition
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
|
||||||
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'Taum'); io_i = io_i + 1; % Force Sensor Outputs [N]
|
io(io_i) = linio([mdl, <span class="org-string">'/Stewart Platform'</span>], 1, <span class="org-string">'openoutput'</span>, [], <span class="org-string">'Taum'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Force Sensor Outputs [N]</span>
|
||||||
|
|
||||||
%% Run the linearization
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
||||||
G = linearize(mdl, io);
|
G = linearize(mdl, io);
|
||||||
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
|
||||||
G.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
|
G.OutputName = {<span class="org-string">'Fm1'</span>, <span class="org-string">'Fm2'</span>, <span class="org-string">'Fm3'</span>, <span class="org-string">'Fm4'</span>, <span class="org-string">'Fm5'</span>, <span class="org-string">'Fm6'</span>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The transfer function from actuator forces to force sensors is shown in Figure <a href="#org8f016dc">4</a>.
|
The transfer function from actuator forces to force sensors is shown in Figure <a href="#org3b3de64">4</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div id="org8f016dc" class="figure">
|
<div id="org3b3de64" class="figure">
|
||||||
<p><img src="figs/iff_plant_coupling.png" alt="iff_plant_coupling.png" />
|
<p><img src="figs/iff_plant_coupling.png" alt="iff_plant_coupling.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 4: </span>Transfer function from the Actuator force \(F_{i}\) to the Force sensor of the same leg \(F_{m,i}\) and to the force sensor of the other legs \(F_{m,j}\) with \(i \neq j\) in grey (<a href="./figs/iff_plant_coupling.png">png</a>, <a href="./figs/iff_plant_coupling.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 4: </span>Transfer function from the Actuator force \(F_{i}\) to the Force sensor of the same leg \(F_{m,i}\) and to the force sensor of the other legs \(F_{m,j}\) with \(i \neq j\) in grey (<a href="./figs/iff_plant_coupling.png">png</a>, <a href="./figs/iff_plant_coupling.pdf">pdf</a>)</p>
|
||||||
@@ -308,17 +313,17 @@ The transfer function from actuator forces to force sensors is shown in Figure <
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org4ca24f7" class="outline-3">
|
<div id="outline-container-org6ac04ee" class="outline-3">
|
||||||
<h3 id="org4ca24f7"><span class="section-number-3">2.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
|
<h3 id="org6ac04ee"><span class="section-number-3">2.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
|
||||||
<div class="outline-text-3" id="text-2-2">
|
<div class="outline-text-3" id="text-2-2">
|
||||||
<p>
|
<p>
|
||||||
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
|
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
|
<pre class="src src-matlab">stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical'</span>);
|
||||||
Gf = linearize(mdl, io);
|
Gf = linearize(mdl, io);
|
||||||
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
Gf.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
|
||||||
Gf.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
|
Gf.OutputName = {<span class="org-string">'Fm1'</span>, <span class="org-string">'Fm2'</span>, <span class="org-string">'Fm3'</span>, <span class="org-string">'Fm4'</span>, <span class="org-string">'Fm5'</span>, <span class="org-string">'Fm6'</span>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -328,16 +333,16 @@ We now use the amplified actuators and re-identify the dynamics
|
|||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
|
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
|
||||||
Ga = linearize(mdl, io);
|
Ga = linearize(mdl, io);
|
||||||
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
Ga.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
|
||||||
Ga.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
|
Ga.OutputName = {<span class="org-string">'Fm1'</span>, <span class="org-string">'Fm2'</span>, <span class="org-string">'Fm3'</span>, <span class="org-string">'Fm4'</span>, <span class="org-string">'Fm5'</span>, <span class="org-string">'Fm6'</span>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The new dynamics from force actuator to force sensor is shown in Figure <a href="#org4a92e1b">5</a>.
|
The new dynamics from force actuator to force sensor is shown in Figure <a href="#org1902b8f">5</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div id="org4a92e1b" class="figure">
|
<div id="org1902b8f" class="figure">
|
||||||
<p><img src="figs/iff_plant_flexible_joint_decentralized.png" alt="iff_plant_flexible_joint_decentralized.png" />
|
<p><img src="figs/iff_plant_flexible_joint_decentralized.png" alt="iff_plant_flexible_joint_decentralized.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 5: </span>Transfer function from the Actuator force \(F_{i}\) to the force sensor \(F_{m,i}\) (<a href="./figs/iff_plant_flexible_joint_decentralized.png">png</a>, <a href="./figs/iff_plant_flexible_joint_decentralized.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 5: </span>Transfer function from the Actuator force \(F_{i}\) to the force sensor \(F_{m,i}\) (<a href="./figs/iff_plant_flexible_joint_decentralized.png">png</a>, <a href="./figs/iff_plant_flexible_joint_decentralized.pdf">pdf</a>)</p>
|
||||||
@@ -345,8 +350,8 @@ The new dynamics from force actuator to force sensor is shown in Figure <a href=
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org11e5ee2" class="outline-3">
|
<div id="outline-container-org06e1086" class="outline-3">
|
||||||
<h3 id="org11e5ee2"><span class="section-number-3">2.3</span> Obtained Damping</h3>
|
<h3 id="org06e1086"><span class="section-number-3">2.3</span> Obtained Damping</h3>
|
||||||
<div class="outline-text-3" id="text-2-3">
|
<div class="outline-text-3" id="text-2-3">
|
||||||
<p>
|
<p>
|
||||||
The control is a performed in a decentralized manner.
|
The control is a performed in a decentralized manner.
|
||||||
@@ -360,17 +365,17 @@ The \(6 \times 6\) control is a diagonal matrix with pure integration action on
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The root locus is shown in figure <a href="#orgc8981ba">6</a> and the obtained pole damping function of the control gain is shown in figure <a href="#orgd7fefc7">7</a>.
|
The root locus is shown in figure <a href="#orgce5d8d8">6</a> and the obtained pole damping function of the control gain is shown in figure <a href="#org67419cd">7</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div id="orgc8981ba" class="figure">
|
<div id="orgce5d8d8" class="figure">
|
||||||
<p><img src="figs/root_locus_iff_rot_stiffness.png" alt="root_locus_iff_rot_stiffness.png" />
|
<p><img src="figs/root_locus_iff_rot_stiffness.png" alt="root_locus_iff_rot_stiffness.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 6: </span>Root Locus plot with Decentralized Integral Force Feedback when considering the stiffness of flexible joints (<a href="./figs/root_locus_iff_rot_stiffness.png">png</a>, <a href="./figs/root_locus_iff_rot_stiffness.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 6: </span>Root Locus plot with Decentralized Integral Force Feedback when considering the stiffness of flexible joints (<a href="./figs/root_locus_iff_rot_stiffness.png">png</a>, <a href="./figs/root_locus_iff_rot_stiffness.pdf">pdf</a>)</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div id="orgd7fefc7" class="figure">
|
<div id="org67419cd" class="figure">
|
||||||
<p><img src="figs/pole_damping_gain_iff_rot_stiffness.png" alt="pole_damping_gain_iff_rot_stiffness.png" />
|
<p><img src="figs/pole_damping_gain_iff_rot_stiffness.png" alt="pole_damping_gain_iff_rot_stiffness.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 7: </span>Damping of the poles with respect to the gain of the Decentralized Integral Force Feedback when considering the stiffness of flexible joints (<a href="./figs/pole_damping_gain_iff_rot_stiffness.png">png</a>, <a href="./figs/pole_damping_gain_iff_rot_stiffness.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 7: </span>Damping of the poles with respect to the gain of the Decentralized Integral Force Feedback when considering the stiffness of flexible joints (<a href="./figs/pole_damping_gain_iff_rot_stiffness.png">png</a>, <a href="./figs/pole_damping_gain_iff_rot_stiffness.pdf">pdf</a>)</p>
|
||||||
@@ -378,10 +383,10 @@ The root locus is shown in figure <a href="#orgc8981ba">6</a> and the obtained p
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgca67baa" class="outline-3">
|
<div id="outline-container-orgfa832d6" class="outline-3">
|
||||||
<h3 id="orgca67baa"><span class="section-number-3">2.4</span> Conclusion</h3>
|
<h3 id="orgfa832d6"><span class="section-number-3">2.4</span> Conclusion</h3>
|
||||||
<div class="outline-text-3" id="text-2-4">
|
<div class="outline-text-3" id="text-2-4">
|
||||||
<div class="important">
|
<div class="important" id="orgad0c17b">
|
||||||
<p>
|
<p>
|
||||||
The joint stiffness has a huge impact on the attainable active damping performance when using force sensors.
|
The joint stiffness has a huge impact on the attainable active damping performance when using force sensors.
|
||||||
Thus, if Integral Force Feedback is to be used in a Stewart platform with flexible joints, the rotational stiffness of the joints should be minimized.
|
Thus, if Integral Force Feedback is to be used in a Stewart platform with flexible joints, the rotational stiffness of the joints should be minimized.
|
||||||
@@ -392,14 +397,14 @@ Thus, if Integral Force Feedback is to be used in a Stewart platform with flexib
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org47a29be" class="outline-2">
|
<div id="outline-container-orgabec4e1" class="outline-2">
|
||||||
<h2 id="org47a29be"><span class="section-number-2">3</span> Direct Velocity Feedback</h2>
|
<h2 id="orgabec4e1"><span class="section-number-2">3</span> Direct Velocity Feedback</h2>
|
||||||
<div class="outline-text-2" id="text-3">
|
<div class="outline-text-2" id="text-3">
|
||||||
<p>
|
<p>
|
||||||
<a id="orgbdd1eba"></a>
|
<a id="org63027d0"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="note">
|
<div class="note" id="orgadea9d6">
|
||||||
<p>
|
<p>
|
||||||
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_dvf.m">here</a>.
|
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_dvf.m">here</a>.
|
||||||
</p>
|
</p>
|
||||||
@@ -411,31 +416,31 @@ To run the script, open the Simulink Project, and type <code>run active_damping_
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgc82a6a7" class="outline-3">
|
<div id="outline-container-org19cbcee" class="outline-3">
|
||||||
<h3 id="orgc82a6a7"><span class="section-number-3">3.1</span> Identification of the Dynamics with perfect Joints</h3>
|
<h3 id="org19cbcee"><span class="section-number-3">3.1</span> Identification of the Dynamics with perfect Joints</h3>
|
||||||
<div class="outline-text-3" id="text-3-1">
|
<div class="outline-text-3" id="text-3-1">
|
||||||
<p>
|
<p>
|
||||||
We first initialize the Stewart platform without joint stiffness.
|
We first initialize the Stewart platform without joint stiffness.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">stewart = initializeStewartPlatform();
|
<pre class="src src-matlab">stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'none');
|
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
|
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'rot_point'</span>, stewart.platform_F.FO_A);
|
||||||
payload = initializePayload('type', 'none');
|
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
controller = initializeController('type', 'open-loop');
|
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -443,30 +448,30 @@ controller = initializeController('type', 'open-loop');
|
|||||||
And we identify the dynamics from force actuators to force sensors.
|
And we identify the dynamics from force actuators to force sensors.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">%% Options for Linearized
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
|
||||||
options = linearizeOptions;
|
options = linearizeOptions;
|
||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
||||||
mdl = 'stewart_platform_model';
|
mdl = <span class="org-string">'stewart_platform_model'</span>;
|
||||||
|
|
||||||
%% Input/Output definition
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
|
||||||
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
|
io(io_i) = linio([mdl, <span class="org-string">'/Stewart Platform'</span>], 1, <span class="org-string">'openoutput'</span>, [], <span class="org-string">'dLm'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Relative Displacement Outputs [m]</span>
|
||||||
|
|
||||||
%% Run the linearization
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
||||||
G = linearize(mdl, io, options);
|
G = linearize(mdl, io, options);
|
||||||
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
|
||||||
G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
|
G.OutputName = {<span class="org-string">'Dm1'</span>, <span class="org-string">'Dm2'</span>, <span class="org-string">'Dm3'</span>, <span class="org-string">'Dm4'</span>, <span class="org-string">'Dm5'</span>, <span class="org-string">'Dm6'</span>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The transfer function from actuator forces to relative motion sensors is shown in Figure <a href="#org6de423c">8</a>.
|
The transfer function from actuator forces to relative motion sensors is shown in Figure <a href="#org34c24ba">8</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div id="org6de423c" class="figure">
|
<div id="org34c24ba" class="figure">
|
||||||
<p><img src="figs/dvf_plant_coupling.png" alt="dvf_plant_coupling.png" />
|
<p><img src="figs/dvf_plant_coupling.png" alt="dvf_plant_coupling.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 8: </span>Transfer function from the Actuator force \(F_{i}\) to the Relative Motion Sensor \(D_{m,j}\) with \(i \neq j\) (<a href="./figs/dvf_plant_coupling.png">png</a>, <a href="./figs/dvf_plant_coupling.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 8: </span>Transfer function from the Actuator force \(F_{i}\) to the Relative Motion Sensor \(D_{m,j}\) with \(i \neq j\) (<a href="./figs/dvf_plant_coupling.png">png</a>, <a href="./figs/dvf_plant_coupling.pdf">pdf</a>)</p>
|
||||||
@@ -475,17 +480,17 @@ The transfer function from actuator forces to relative motion sensors is shown i
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div id="outline-container-org92d6cb1" class="outline-3">
|
<div id="outline-container-org0fabf01" class="outline-3">
|
||||||
<h3 id="org92d6cb1"><span class="section-number-3">3.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
|
<h3 id="org0fabf01"><span class="section-number-3">3.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
|
||||||
<div class="outline-text-3" id="text-3-2">
|
<div class="outline-text-3" id="text-3-2">
|
||||||
<p>
|
<p>
|
||||||
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
|
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
|
<pre class="src src-matlab">stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical'</span>);
|
||||||
Gf = linearize(mdl, io, options);
|
Gf = linearize(mdl, io, options);
|
||||||
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
Gf.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
|
||||||
Gf.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
|
Gf.OutputName = {<span class="org-string">'Dm1'</span>, <span class="org-string">'Dm2'</span>, <span class="org-string">'Dm3'</span>, <span class="org-string">'Dm4'</span>, <span class="org-string">'Dm5'</span>, <span class="org-string">'Dm6'</span>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -495,16 +500,16 @@ We now use the amplified actuators and re-identify the dynamics
|
|||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
|
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
|
||||||
Ga = linearize(mdl, io, options);
|
Ga = linearize(mdl, io, options);
|
||||||
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
Ga.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
|
||||||
Ga.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
|
Ga.OutputName = {<span class="org-string">'Dm1'</span>, <span class="org-string">'Dm2'</span>, <span class="org-string">'Dm3'</span>, <span class="org-string">'Dm4'</span>, <span class="org-string">'Dm5'</span>, <span class="org-string">'Dm6'</span>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The new dynamics from force actuator to relative motion sensor is shown in Figure <a href="#org5f559a9">9</a>.
|
The new dynamics from force actuator to relative motion sensor is shown in Figure <a href="#orgba524e3">9</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div id="org5f559a9" class="figure">
|
<div id="orgba524e3" class="figure">
|
||||||
<p><img src="figs/dvf_plant_flexible_joint_decentralized.png" alt="dvf_plant_flexible_joint_decentralized.png" />
|
<p><img src="figs/dvf_plant_flexible_joint_decentralized.png" alt="dvf_plant_flexible_joint_decentralized.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 9: </span>Transfer function from the Actuator force \(F_{i}\) to the relative displacement sensor \(D_{m,i}\) (<a href="./figs/dvf_plant_flexible_joint_decentralized.png">png</a>, <a href="./figs/dvf_plant_flexible_joint_decentralized.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 9: </span>Transfer function from the Actuator force \(F_{i}\) to the relative displacement sensor \(D_{m,i}\) (<a href="./figs/dvf_plant_flexible_joint_decentralized.png">png</a>, <a href="./figs/dvf_plant_flexible_joint_decentralized.pdf">pdf</a>)</p>
|
||||||
@@ -512,8 +517,8 @@ The new dynamics from force actuator to relative motion sensor is shown in Figur
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org7497409" class="outline-3">
|
<div id="outline-container-org6c74c9a" class="outline-3">
|
||||||
<h3 id="org7497409"><span class="section-number-3">3.3</span> Obtained Damping</h3>
|
<h3 id="org6c74c9a"><span class="section-number-3">3.3</span> Obtained Damping</h3>
|
||||||
<div class="outline-text-3" id="text-3-3">
|
<div class="outline-text-3" id="text-3-3">
|
||||||
<p>
|
<p>
|
||||||
The control is a performed in a decentralized manner.
|
The control is a performed in a decentralized manner.
|
||||||
@@ -527,10 +532,10 @@ The \(6 \times 6\) control is a diagonal matrix with pure derivative action on t
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The root locus is shown in figure <a href="#org5e168d0">10</a>.
|
The root locus is shown in figure <a href="#org0436b4d">10</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div id="org5e168d0" class="figure">
|
<div id="org0436b4d" class="figure">
|
||||||
<p><img src="figs/root_locus_dvf_rot_stiffness.png" alt="root_locus_dvf_rot_stiffness.png" />
|
<p><img src="figs/root_locus_dvf_rot_stiffness.png" alt="root_locus_dvf_rot_stiffness.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 10: </span>Root Locus plot with Direct Velocity Feedback when considering the Stiffness of flexible joints (<a href="./figs/root_locus_dvf_rot_stiffness.png">png</a>, <a href="./figs/root_locus_dvf_rot_stiffness.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 10: </span>Root Locus plot with Direct Velocity Feedback when considering the Stiffness of flexible joints (<a href="./figs/root_locus_dvf_rot_stiffness.png">png</a>, <a href="./figs/root_locus_dvf_rot_stiffness.pdf">pdf</a>)</p>
|
||||||
@@ -538,10 +543,10 @@ The root locus is shown in figure <a href="#org5e168d0">10</a>.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org61c422b" class="outline-3">
|
<div id="outline-container-org81b2156" class="outline-3">
|
||||||
<h3 id="org61c422b"><span class="section-number-3">3.4</span> Conclusion</h3>
|
<h3 id="org81b2156"><span class="section-number-3">3.4</span> Conclusion</h3>
|
||||||
<div class="outline-text-3" id="text-3-4">
|
<div class="outline-text-3" id="text-3-4">
|
||||||
<div class="important">
|
<div class="important" id="orgb486ca9">
|
||||||
<p>
|
<p>
|
||||||
Joint stiffness does increase the resonance frequencies of the system but does not change the attainable damping when using relative motion sensors.
|
Joint stiffness does increase the resonance frequencies of the system but does not change the attainable damping when using relative motion sensors.
|
||||||
</p>
|
</p>
|
||||||
@@ -551,28 +556,28 @@ Joint stiffness does increase the resonance frequencies of the system but does n
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgc84bb75" class="outline-2">
|
<div id="outline-container-orgc7e2089" class="outline-2">
|
||||||
<h2 id="orgc84bb75"><span class="section-number-2">4</span> Compliance and Transmissibility Comparison</h2>
|
<h2 id="orgc7e2089"><span class="section-number-2">4</span> Compliance and Transmissibility Comparison</h2>
|
||||||
<div class="outline-text-2" id="text-4">
|
<div class="outline-text-2" id="text-4">
|
||||||
</div>
|
</div>
|
||||||
<div id="outline-container-orgebeb03b" class="outline-3">
|
<div id="outline-container-org6ec3b9e" class="outline-3">
|
||||||
<h3 id="orgebeb03b"><span class="section-number-3">4.1</span> Initialization</h3>
|
<h3 id="org6ec3b9e"><span class="section-number-3">4.1</span> Initialization</h3>
|
||||||
<div class="outline-text-3" id="text-4-1">
|
<div class="outline-text-3" id="text-4-1">
|
||||||
<p>
|
<p>
|
||||||
We first initialize the Stewart platform without joint stiffness.
|
We first initialize the Stewart platform without joint stiffness.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">stewart = initializeStewartPlatform();
|
<pre class="src src-matlab">stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'none');
|
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -580,22 +585,22 @@ stewart = initializeInertialSensor(stewart, 'type', 'none');
|
|||||||
The rotation point of the ground is located at the origin of frame \(\{A\}\).
|
The rotation point of the ground is located at the origin of frame \(\{A\}\).
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
|
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'rot_point'</span>, stewart.platform_F.FO_A);
|
||||||
payload = initializePayload('type', 'none');
|
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
controller = initializeController('type', 'open-loop');
|
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgdde930c" class="outline-3">
|
<div id="outline-container-orge87554a" class="outline-3">
|
||||||
<h3 id="orgdde930c"><span class="section-number-3">4.2</span> Identification</h3>
|
<h3 id="orge87554a"><span class="section-number-3">4.2</span> Identification</h3>
|
||||||
<div class="outline-text-3" id="text-4-2">
|
<div class="outline-text-3" id="text-4-2">
|
||||||
<p>
|
<p>
|
||||||
Let’s first identify the transmissibility and compliance in the open-loop case.
|
Let’s first identify the transmissibility and compliance in the open-loop case.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">controller = initializeController('type', 'open-loop');
|
<pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
|
||||||
[T_ol, T_norm_ol, freqs] = computeTransmissibility();
|
[T_ol, T_norm_ol, freqs] = computeTransmissibility();
|
||||||
[C_ol, C_norm_ol, freqs] = computeCompliance();
|
[C_ol, C_norm_ol, freqs] = computeCompliance();
|
||||||
</pre>
|
</pre>
|
||||||
@@ -605,11 +610,11 @@ Let’s first identify the transmissibility and compliance in the open-loop
|
|||||||
Now, let’s identify the transmissibility and compliance for the Integral Force Feedback architecture.
|
Now, let’s identify the transmissibility and compliance for the Integral Force Feedback architecture.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">controller = initializeController('type', 'iff');
|
<pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'iff'</span>);
|
||||||
K_iff = (1e4/s)*eye(6);
|
K_iff = (1e4<span class="org-type">/</span>s)<span class="org-type">*</span>eye(6);
|
||||||
|
|
||||||
[T_iff, T_norm_iff, ~] = computeTransmissibility();
|
[T_iff, T_norm_iff, <span class="org-type">~</span>] = computeTransmissibility();
|
||||||
[C_iff, C_norm_iff, ~] = computeCompliance();
|
[C_iff, C_norm_iff, <span class="org-type">~</span>] = computeCompliance();
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -617,35 +622,35 @@ K_iff = (1e4/s)*eye(6);
|
|||||||
And for the Direct Velocity Feedback.
|
And for the Direct Velocity Feedback.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">controller = initializeController('type', 'dvf');
|
<pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'dvf'</span>);
|
||||||
K_dvf = 1e4*s/(1+s/2/pi/5000)*eye(6);
|
K_dvf = 1e4<span class="org-type">*</span>s<span class="org-type">/</span>(1<span class="org-type">+</span>s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>5000)<span class="org-type">*</span>eye(6);
|
||||||
|
|
||||||
[T_dvf, T_norm_dvf, ~] = computeTransmissibility();
|
[T_dvf, T_norm_dvf, <span class="org-type">~</span>] = computeTransmissibility();
|
||||||
[C_dvf, C_norm_dvf, ~] = computeCompliance();
|
[C_dvf, C_norm_dvf, <span class="org-type">~</span>] = computeCompliance();
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgcfd0381" class="outline-3">
|
<div id="outline-container-org1d70ccd" class="outline-3">
|
||||||
<h3 id="orgcfd0381"><span class="section-number-3">4.3</span> Results</h3>
|
<h3 id="org1d70ccd"><span class="section-number-3">4.3</span> Results</h3>
|
||||||
<div class="outline-text-3" id="text-4-3">
|
<div class="outline-text-3" id="text-4-3">
|
||||||
|
|
||||||
<div id="orgc1f4c92" class="figure">
|
<div id="org908e692" class="figure">
|
||||||
<p><img src="figs/transmissibility_iff_dvf.png" alt="transmissibility_iff_dvf.png" />
|
<p><img src="figs/transmissibility_iff_dvf.png" alt="transmissibility_iff_dvf.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 11: </span>Obtained transmissibility for Open-Loop Control (Blue), Integral Force Feedback (Red) and Direct Velocity Feedback (Yellow) (<a href="./figs/transmissibility_iff_dvf.png">png</a>, <a href="./figs/transmissibility_iff_dvf.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 11: </span>Obtained transmissibility for Open-Loop Control (Blue), Integral Force Feedback (Red) and Direct Velocity Feedback (Yellow) (<a href="./figs/transmissibility_iff_dvf.png">png</a>, <a href="./figs/transmissibility_iff_dvf.pdf">pdf</a>)</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div id="org2d1b516" class="figure">
|
<div id="orgc10c609" class="figure">
|
||||||
<p><img src="figs/compliance_iff_dvf.png" alt="compliance_iff_dvf.png" />
|
<p><img src="figs/compliance_iff_dvf.png" alt="compliance_iff_dvf.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 12: </span>Obtained compliance for Open-Loop Control (Blue), Integral Force Feedback (Red) and Direct Velocity Feedback (Yellow) (<a href="./figs/compliance_iff_dvf.png">png</a>, <a href="./figs/compliance_iff_dvf.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 12: </span>Obtained compliance for Open-Loop Control (Blue), Integral Force Feedback (Red) and Direct Velocity Feedback (Yellow) (<a href="./figs/compliance_iff_dvf.png">png</a>, <a href="./figs/compliance_iff_dvf.pdf">pdf</a>)</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div id="orgf9b6a2b" class="figure">
|
<div id="orgd54f179" class="figure">
|
||||||
<p><img src="figs/frobenius_norm_T_C_iff_dvf.png" alt="frobenius_norm_T_C_iff_dvf.png" />
|
<p><img src="figs/frobenius_norm_T_C_iff_dvf.png" alt="frobenius_norm_T_C_iff_dvf.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 13: </span>Frobenius norm of the Transmissibility and Compliance Matrices (<a href="./figs/frobenius_norm_T_C_iff_dvf.png">png</a>, <a href="./figs/frobenius_norm_T_C_iff_dvf.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 13: </span>Frobenius norm of the Transmissibility and Compliance Matrices (<a href="./figs/frobenius_norm_T_C_iff_dvf.png">png</a>, <a href="./figs/frobenius_norm_T_C_iff_dvf.pdf">pdf</a>)</p>
|
||||||
@@ -656,7 +661,7 @@ K_dvf = 1e4*s/(1+s/2/pi/5000)*eye(6);
|
|||||||
</div>
|
</div>
|
||||||
<div id="postamble" class="status">
|
<div id="postamble" class="status">
|
||||||
<p class="author">Author: Dehaeze Thomas</p>
|
<p class="author">Author: Dehaeze Thomas</p>
|
||||||
<p class="date">Created: 2020-08-05 mer. 13:27</p>
|
<p class="date">Created: 2021-01-08 ven. 15:53</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@@ -1,145 +0,0 @@
|
|||||||
.org-bold { /* bold */ font-weight: bold; }
|
|
||||||
.org-bold-italic { /* bold-italic */ font-weight: bold; font-style: italic; }
|
|
||||||
.org-buffer-menu-buffer { /* buffer-menu-buffer */ font-weight: bold; }
|
|
||||||
.org-builtin { /* font-lock-builtin-face */ color: #7a378b; }
|
|
||||||
.org-button { /* button */ text-decoration: underline; }
|
|
||||||
.org-calendar-today { /* calendar-today */ text-decoration: underline; }
|
|
||||||
.org-change-log-acknowledgement { /* change-log-acknowledgement */ color: #b22222; }
|
|
||||||
.org-change-log-conditionals { /* change-log-conditionals */ color: #a0522d; }
|
|
||||||
.org-change-log-date { /* change-log-date */ color: #8b2252; }
|
|
||||||
.org-change-log-email { /* change-log-email */ color: #a0522d; }
|
|
||||||
.org-change-log-file { /* change-log-file */ color: #0000ff; }
|
|
||||||
.org-change-log-function { /* change-log-function */ color: #a0522d; }
|
|
||||||
.org-change-log-list { /* change-log-list */ color: #a020f0; }
|
|
||||||
.org-change-log-name { /* change-log-name */ color: #008b8b; }
|
|
||||||
.org-comint-highlight-input { /* comint-highlight-input */ font-weight: bold; }
|
|
||||||
.org-comint-highlight-prompt { /* comint-highlight-prompt */ color: #00008b; }
|
|
||||||
.org-comment { /* font-lock-comment-face */ color: #999988; font-style: italic; }
|
|
||||||
.org-comment-delimiter { /* font-lock-comment-delimiter-face */ color: #999988; font-style: italic; }
|
|
||||||
.org-completions-annotations { /* completions-annotations */ font-style: italic; }
|
|
||||||
.org-completions-common-part { /* completions-common-part */ color: #000000; background-color: #ffffff; }
|
|
||||||
.org-completions-first-difference { /* completions-first-difference */ font-weight: bold; }
|
|
||||||
.org-constant { /* font-lock-constant-face */ color: #008b8b; }
|
|
||||||
.org-diary { /* diary */ color: #ff0000; }
|
|
||||||
.org-diff-context { /* diff-context */ color: #7f7f7f; }
|
|
||||||
.org-diff-file-header { /* diff-file-header */ background-color: #b3b3b3; font-weight: bold; }
|
|
||||||
.org-diff-function { /* diff-function */ background-color: #cccccc; }
|
|
||||||
.org-diff-header { /* diff-header */ background-color: #cccccc; }
|
|
||||||
.org-diff-hunk-header { /* diff-hunk-header */ background-color: #cccccc; }
|
|
||||||
.org-diff-index { /* diff-index */ background-color: #b3b3b3; font-weight: bold; }
|
|
||||||
.org-diff-nonexistent { /* diff-nonexistent */ background-color: #b3b3b3; font-weight: bold; }
|
|
||||||
.org-diff-refine-change { /* diff-refine-change */ background-color: #d9d9d9; }
|
|
||||||
.org-dired-directory { /* dired-directory */ color: #0000ff; }
|
|
||||||
.org-dired-flagged { /* dired-flagged */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-dired-header { /* dired-header */ color: #228b22; }
|
|
||||||
.org-dired-ignored { /* dired-ignored */ color: #7f7f7f; }
|
|
||||||
.org-dired-mark { /* dired-mark */ color: #008b8b; }
|
|
||||||
.org-dired-marked { /* dired-marked */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-dired-perm-write { /* dired-perm-write */ color: #b22222; }
|
|
||||||
.org-dired-symlink { /* dired-symlink */ color: #a020f0; }
|
|
||||||
.org-dired-warning { /* dired-warning */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-doc { /* font-lock-doc-face */ color: #8b2252; }
|
|
||||||
.org-escape-glyph { /* escape-glyph */ color: #a52a2a; }
|
|
||||||
.org-file-name-shadow { /* file-name-shadow */ color: #7f7f7f; }
|
|
||||||
.org-flyspell-duplicate { /* flyspell-duplicate */ color: #cdad00; font-weight: bold; text-decoration: underline; }
|
|
||||||
.org-flyspell-incorrect { /* flyspell-incorrect */ color: #ff4500; font-weight: bold; text-decoration: underline; }
|
|
||||||
.org-fringe { /* fringe */ background-color: #f2f2f2; }
|
|
||||||
.org-function-name { /* font-lock-function-name-face */ color: teal; }
|
|
||||||
.org-header-line { /* header-line */ color: #333333; background-color: #e5e5e5; }
|
|
||||||
.org-help-argument-name { /* help-argument-name */ font-style: italic; }
|
|
||||||
.org-highlight { /* highlight */ background-color: #b4eeb4; }
|
|
||||||
.org-holiday { /* holiday */ background-color: #ffc0cb; }
|
|
||||||
.org-isearch { /* isearch */ color: #b0e2ff; background-color: #cd00cd; }
|
|
||||||
.org-isearch-fail { /* isearch-fail */ background-color: #ffc1c1; }
|
|
||||||
.org-italic { /* italic */ font-style: italic; }
|
|
||||||
.org-keyword { /* font-lock-keyword-face */ color: #0086b3; }
|
|
||||||
.org-lazy-highlight { /* lazy-highlight */ background-color: #afeeee; }
|
|
||||||
.org-link { /* link */ color: #0000ff; text-decoration: underline; }
|
|
||||||
.org-link-visited { /* link-visited */ color: #8b008b; text-decoration: underline; }
|
|
||||||
.org-log-edit-header { /* log-edit-header */ color: #a020f0; }
|
|
||||||
.org-log-edit-summary { /* log-edit-summary */ color: #0000ff; }
|
|
||||||
.org-log-edit-unknown-header { /* log-edit-unknown-header */ color: #b22222; }
|
|
||||||
.org-match { /* match */ background-color: #ffff00; }
|
|
||||||
.org-next-error { /* next-error */ background-color: #eedc82; }
|
|
||||||
.org-nobreak-space { /* nobreak-space */ color: #a52a2a; text-decoration: underline; }
|
|
||||||
.org-org-archived { /* org-archived */ color: #7f7f7f; }
|
|
||||||
.org-org-block { /* org-block */ color: #7f7f7f; }
|
|
||||||
.org-org-block-begin-line { /* org-block-begin-line */ color: #b22222; }
|
|
||||||
.org-org-block-end-line { /* org-block-end-line */ color: #b22222; }
|
|
||||||
.org-org-checkbox { /* org-checkbox */ font-weight: bold; }
|
|
||||||
.org-org-checkbox-statistics-done { /* org-checkbox-statistics-done */ color: #228b22; font-weight: bold; }
|
|
||||||
.org-org-checkbox-statistics-todo { /* org-checkbox-statistics-todo */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-org-clock-overlay { /* org-clock-overlay */ background-color: #ffff00; }
|
|
||||||
.org-org-code { /* org-code */ color: #7f7f7f; }
|
|
||||||
.org-org-column { /* org-column */ background-color: #e5e5e5; }
|
|
||||||
.org-org-column-title { /* org-column-title */ background-color: #e5e5e5; font-weight: bold; text-decoration: underline; }
|
|
||||||
.org-org-date { /* org-date */ color: #a020f0; text-decoration: underline; }
|
|
||||||
.org-org-document-info { /* org-document-info */ color: #191970; }
|
|
||||||
.org-org-document-info-keyword { /* org-document-info-keyword */ color: #7f7f7f; }
|
|
||||||
.org-org-document-title { /* org-document-title */ color: #191970; font-size: 144%; font-weight: bold; }
|
|
||||||
.org-org-done { /* org-done */ color: #228b22; font-weight: bold; }
|
|
||||||
.org-org-drawer { /* org-drawer */ color: #0000ff; }
|
|
||||||
.org-org-ellipsis { /* org-ellipsis */ color: #b8860b; text-decoration: underline; }
|
|
||||||
.org-org-footnote { /* org-footnote */ color: #a020f0; text-decoration: underline; }
|
|
||||||
.org-org-formula { /* org-formula */ color: #b22222; }
|
|
||||||
.org-org-headline-done { /* org-headline-done */ color: #bc8f8f; }
|
|
||||||
.org-org-hide { /* org-hide */ color: #ffffff; }
|
|
||||||
.org-org-latex-and-export-specials { /* org-latex-and-export-specials */ color: #8b4513; }
|
|
||||||
.org-org-level-1 { /* org-level-1 */ color: #0000ff; }
|
|
||||||
.org-org-level-2 { /* org-level-2 */ color: #a0522d; }
|
|
||||||
.org-org-level-3 { /* org-level-3 */ color: #a020f0; }
|
|
||||||
.org-org-level-4 { /* org-level-4 */ color: #b22222; }
|
|
||||||
.org-org-level-5 { /* org-level-5 */ color: #228b22; }
|
|
||||||
.org-org-level-6 { /* org-level-6 */ color: #008b8b; }
|
|
||||||
.org-org-level-7 { /* org-level-7 */ color: #7a378b; }
|
|
||||||
.org-org-level-8 { /* org-level-8 */ color: #8b2252; }
|
|
||||||
.org-org-link { /* org-link */ color: #0000ff; text-decoration: underline; }
|
|
||||||
.org-org-meta-line { /* org-meta-line */ color: #b22222; }
|
|
||||||
.org-org-mode-line-clock { /* org-mode-line-clock */ color: #000000; background-color: #bfbfbf; }
|
|
||||||
.org-org-mode-line-clock-overrun { /* org-mode-line-clock-overrun */ color: #000000; background-color: #ff0000; }
|
|
||||||
.org-org-quote { /* org-quote */ color: #7f7f7f; }
|
|
||||||
.org-org-scheduled { /* org-scheduled */ color: #006400; }
|
|
||||||
.org-org-scheduled-previously { /* org-scheduled-previously */ color: #b22222; }
|
|
||||||
.org-org-scheduled-today { /* org-scheduled-today */ color: #006400; }
|
|
||||||
.org-org-sexp-date { /* org-sexp-date */ color: #a020f0; }
|
|
||||||
.org-org-special-keyword { /* org-special-keyword */ color: #a020f0; }
|
|
||||||
.org-org-table { /* org-table */ color: #0000ff; }
|
|
||||||
.org-org-tag { /* org-tag */ font-weight: bold; }
|
|
||||||
.org-org-target { /* org-target */ text-decoration: underline; }
|
|
||||||
.org-org-time-grid { /* org-time-grid */ color: #b8860b; }
|
|
||||||
.org-org-todo { /* org-todo */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-org-upcoming-deadline { /* org-upcoming-deadline */ color: #b22222; }
|
|
||||||
.org-org-verbatim { /* org-verbatim */ color: #7f7f7f; }
|
|
||||||
.org-org-verse { /* org-verse */ color: #7f7f7f; }
|
|
||||||
.org-org-warning { /* org-warning */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-outline-1 { /* outline-1 */ color: #0000ff; }
|
|
||||||
.org-outline-2 { /* outline-2 */ color: #a0522d; }
|
|
||||||
.org-outline-3 { /* outline-3 */ color: #a020f0; }
|
|
||||||
.org-outline-4 { /* outline-4 */ color: #b22222; }
|
|
||||||
.org-outline-5 { /* outline-5 */ color: #228b22; }
|
|
||||||
.org-outline-6 { /* outline-6 */ color: #008b8b; }
|
|
||||||
.org-outline-7 { /* outline-7 */ color: #7a378b; }
|
|
||||||
.org-outline-8 { /* outline-8 */ color: #8b2252; }
|
|
||||||
.org-preprocessor { /* font-lock-preprocessor-face */ color: #7a378b; }
|
|
||||||
.org-query-replace { /* query-replace */ color: #b0e2ff; background-color: #cd00cd; }
|
|
||||||
.org-regexp-grouping-backslash { /* font-lock-regexp-grouping-backslash */ font-weight: bold; }
|
|
||||||
.org-regexp-grouping-construct { /* font-lock-regexp-grouping-construct */ font-weight: bold; }
|
|
||||||
.org-region { /* region */ background-color: #eedc82; }
|
|
||||||
.org-secondary-selection { /* secondary-selection */ background-color: #ffff00; }
|
|
||||||
.org-shadow { /* shadow */ color: #7f7f7f; }
|
|
||||||
.org-show-paren-match { /* show-paren-match */ background-color: #40e0d0; }
|
|
||||||
.org-show-paren-mismatch { /* show-paren-mismatch */ color: #ffffff; background-color: #a020f0; }
|
|
||||||
.org-string { /* font-lock-string-face */ color: #dd1144; }
|
|
||||||
.org-tool-bar { /* tool-bar */ color: #000000; background-color: #bfbfbf; }
|
|
||||||
.org-tooltip { /* tooltip */ color: #000000; background-color: #ffffe0; }
|
|
||||||
.org-trailing-whitespace { /* trailing-whitespace */ background-color: #ff0000; }
|
|
||||||
.org-type { /* font-lock-type-face */ color: #228b22; }
|
|
||||||
.org-underline { /* underline */ text-decoration: underline; }
|
|
||||||
.org-variable-name { /* font-lock-variable-name-face */ color: teal; }
|
|
||||||
.org-warning { /* font-lock-warning-face */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-widget-button { /* widget-button */ font-weight: bold; }
|
|
||||||
.org-widget-button-pressed { /* widget-button-pressed */ color: #ff0000; }
|
|
||||||
.org-widget-documentation { /* widget-documentation */ color: #006400; }
|
|
||||||
.org-widget-field { /* widget-field */ background-color: #d9d9d9; }
|
|
||||||
.org-widget-inactive { /* widget-inactive */ color: #7f7f7f; }
|
|
||||||
.org-widget-single-line-field { /* widget-single-line-field */ background-color: #d9d9d9; }
|
|
@@ -3,25 +3,30 @@
|
|||||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||||
<head>
|
<head>
|
||||||
<!-- 2020-08-05 mer. 13:27 -->
|
<!-- 2021-01-08 ven. 15:52 -->
|
||||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
<title>Stewart Platform - Dynamics Study</title>
|
<title>Stewart Platform - Dynamics Study</title>
|
||||||
<meta name="generator" content="Org mode" />
|
<meta name="generator" content="Org mode" />
|
||||||
<meta name="author" content="Dehaeze Thomas" />
|
<meta name="author" content="Dehaeze Thomas" />
|
||||||
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
<link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
<script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
<script src="./js/jquery.min.js"></script>
|
<script>
|
||||||
<script src="./js/bootstrap.min.js"></script>
|
MathJax = {
|
||||||
<script src="./js/jquery.stickytableheaders.min.js"></script>
|
svg: {
|
||||||
<script src="./js/readtheorg.js"></script>
|
scale: 1,
|
||||||
<script>MathJax = {
|
fontCache: "global"
|
||||||
tex: {
|
},
|
||||||
tags: 'ams',
|
tex: {
|
||||||
macros: {bm: ["\\boldsymbol{#1}",1],}
|
tags: "ams",
|
||||||
}
|
multlineWidth: "%MULTLINEWIDTH",
|
||||||
};
|
tagSide: "right",
|
||||||
</script>
|
macros: {bm: ["\\boldsymbol{#1}",1],},
|
||||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
|
tagIndent: ".8em"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<script id="MathJax-script" async
|
||||||
|
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="org-div-home-and-up">
|
<div id="org-div-home-and-up">
|
||||||
@@ -34,49 +39,49 @@
|
|||||||
<h2>Table of Contents</h2>
|
<h2>Table of Contents</h2>
|
||||||
<div id="text-table-of-contents">
|
<div id="text-table-of-contents">
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orgc59e712">1. Compare external forces and forces applied by the actuators</a>
|
<li><a href="#org7743c04">1. Compare external forces and forces applied by the actuators</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#org4509b7d">1.1. Comparison with fixed support</a></li>
|
<li><a href="#orgc730bef">1.1. Comparison with fixed support</a></li>
|
||||||
<li><a href="#org8662186">1.2. Comparison with a flexible support</a></li>
|
<li><a href="#orgefde538">1.2. Comparison with a flexible support</a></li>
|
||||||
<li><a href="#org55e0dad">1.3. Conclusion</a></li>
|
<li><a href="#orga9eb2fd">1.3. Conclusion</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#org81ab204">2. Comparison of the static transfer function and the Compliance matrix</a>
|
<li><a href="#orgb6a1ef7">2. Comparison of the static transfer function and the Compliance matrix</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orge7e7242">2.1. Analysis</a></li>
|
<li><a href="#org3f1c253">2.1. Analysis</a></li>
|
||||||
<li><a href="#org9ee3939">2.2. Conclusion</a></li>
|
<li><a href="#orge261263">2.2. Conclusion</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgc59e712" class="outline-2">
|
<div id="outline-container-org7743c04" class="outline-2">
|
||||||
<h2 id="orgc59e712"><span class="section-number-2">1</span> Compare external forces and forces applied by the actuators</h2>
|
<h2 id="org7743c04"><span class="section-number-2">1</span> Compare external forces and forces applied by the actuators</h2>
|
||||||
<div class="outline-text-2" id="text-1">
|
<div class="outline-text-2" id="text-1">
|
||||||
<p>
|
<p>
|
||||||
In this section, we wish to compare the effect of forces/torques applied by the actuators with the effect of external forces/torques on the displacement of the mobile platform.
|
In this section, we wish to compare the effect of forces/torques applied by the actuators with the effect of external forces/torques on the displacement of the mobile platform.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org4509b7d" class="outline-3">
|
<div id="outline-container-orgc730bef" class="outline-3">
|
||||||
<h3 id="org4509b7d"><span class="section-number-3">1.1</span> Comparison with fixed support</h3>
|
<h3 id="orgc730bef"><span class="section-number-3">1.1</span> Comparison with fixed support</h3>
|
||||||
<div class="outline-text-3" id="text-1-1">
|
<div class="outline-text-3" id="text-1-1">
|
||||||
<p>
|
<p>
|
||||||
Let’s generate a Stewart platform.
|
Let’s generate a Stewart platform.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">stewart = initializeStewartPlatform();
|
<pre class="src src-matlab">stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'none');
|
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -85,9 +90,9 @@ We don’t put any flexibility below the Stewart platform such that <b>its b
|
|||||||
We also don’t put any payload on top of the Stewart platform.
|
We also don’t put any payload on top of the Stewart platform.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">ground = initializeGround('type', 'none');
|
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
payload = initializePayload('type', 'none');
|
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
controller = initializeController('type', 'open-loop');
|
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -95,22 +100,22 @@ controller = initializeController('type', 'open-loop');
|
|||||||
The transfer function from actuator forces \(\bm{\tau}\) to the relative displacement of the mobile platform \(\mathcal{\bm{X}}\) is extracted.
|
The transfer function from actuator forces \(\bm{\tau}\) to the relative displacement of the mobile platform \(\mathcal{\bm{X}}\) is extracted.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">%% Options for Linearized
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
|
||||||
options = linearizeOptions;
|
options = linearizeOptions;
|
||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
||||||
mdl = 'stewart_platform_model';
|
mdl = <span class="org-string">'stewart_platform_model'</span>;
|
||||||
|
|
||||||
%% Input/Output definition
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
|
||||||
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
io(io_i) = linio([mdl, <span class="org-string">'/Relative Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Position/Orientation of {B} w.r.t. {A}</span>
|
||||||
|
|
||||||
%% Run the linearization
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
||||||
G = linearize(mdl, io, options);
|
G = linearize(mdl, io, options);
|
||||||
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
|
||||||
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
G.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -118,8 +123,8 @@ G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
|||||||
Using the Jacobian matrix, we compute the transfer function from force/torques applied by the actuators on the frame \(\{B\}\) fixed to the mobile platform:
|
Using the Jacobian matrix, we compute the transfer function from force/torques applied by the actuators on the frame \(\{B\}\) fixed to the mobile platform:
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">Gc = minreal(G*inv(stewart.kinematics.J'));
|
<pre class="src src-matlab">Gc = minreal(G<span class="org-type">*</span>inv(stewart.kinematics.J<span class="org-type">'</span>));
|
||||||
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
|
Gc.InputName = {<span class="org-string">'Fnx'</span>, <span class="org-string">'Fny'</span>, <span class="org-string">'Fnz'</span>, <span class="org-string">'Mnx'</span>, <span class="org-string">'Mny'</span>, <span class="org-string">'Mnz'</span>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -127,35 +132,35 @@ Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
|
|||||||
We also extract the transfer function from external forces \(\bm{\mathcal{F}}_{\text{ext}}\) on the frame \(\{B\}\) fixed to the mobile platform to the relative displacement \(\mathcal{\bm{X}}\) of \(\{B\}\) with respect to frame \(\{A\}\):
|
We also extract the transfer function from external forces \(\bm{\mathcal{F}}_{\text{ext}}\) on the frame \(\{B\}\) fixed to the mobile platform to the relative displacement \(\mathcal{\bm{X}}\) of \(\{B\}\) with respect to frame \(\{A\}\):
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">%% Input/Output definition
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext'); io_i = io_i + 1; % External forces/torques applied on {B}
|
io(io_i) = linio([mdl, <span class="org-string">'/Disturbances'</span>], 1, <span class="org-string">'openinput'</span>, [], <span class="org-string">'F_ext'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% External forces/torques applied on {B}</span>
|
||||||
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
io(io_i) = linio([mdl, <span class="org-string">'/Relative Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Position/Orientation of {B} w.r.t. {A}</span>
|
||||||
|
|
||||||
%% Run the linearization
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
||||||
Gd = linearize(mdl, io, options);
|
Gd = linearize(mdl, io, options);
|
||||||
Gd.InputName = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
|
Gd.InputName = {<span class="org-string">'Fex'</span>, <span class="org-string">'Fey'</span>, <span class="org-string">'Fez'</span>, <span class="org-string">'Mex'</span>, <span class="org-string">'Mey'</span>, <span class="org-string">'Mez'</span>};
|
||||||
Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
Gd.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The comparison of the two transfer functions is shown in Figure <a href="#orgbf9a54a">1</a>.
|
The comparison of the two transfer functions is shown in Figure <a href="#org2de43b3">1</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<div id="orgbf9a54a" class="figure">
|
<div id="org2de43b3" class="figure">
|
||||||
<p><img src="figs/comparison_Fext_F_fixed_base.png" alt="comparison_Fext_F_fixed_base.png" />
|
<p><img src="figs/comparison_Fext_F_fixed_base.png" alt="comparison_Fext_F_fixed_base.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 1: </span>Comparison of the transfer functions from \(\bm{\mathcal{F}}\) to \(\mathcal{\bm{X}}\) and from \(\bm{\mathcal{F}}_{\text{ext}}\) to \(\mathcal{\bm{X}}\) (<a href="./figs/comparison_Fext_F_fixed_base.png">png</a>, <a href="./figs/comparison_Fext_F_fixed_base.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 1: </span>Comparison of the transfer functions from \(\bm{\mathcal{F}}\) to \(\mathcal{\bm{X}}\) and from \(\bm{\mathcal{F}}_{\text{ext}}\) to \(\mathcal{\bm{X}}\) (<a href="./figs/comparison_Fext_F_fixed_base.png">png</a>, <a href="./figs/comparison_Fext_F_fixed_base.pdf">pdf</a>)</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
This can be understood from figure <a href="#org8bd3e63">2</a> where \(\mathcal{F}_{x}\) and \(\mathcal{F}_{x,\text{ext}}\) have clearly the same effect on \(\mathcal{X}_{x}\).
|
This can be understood from figure <a href="#orgd6db375">2</a> where \(\mathcal{F}_{x}\) and \(\mathcal{F}_{x,\text{ext}}\) have clearly the same effect on \(\mathcal{X}_{x}\).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<div id="org8bd3e63" class="figure">
|
<div id="orgd6db375" class="figure">
|
||||||
<p><img src="figs/1dof_actuator_external_forces.png" alt="1dof_actuator_external_forces.png" />
|
<p><img src="figs/1dof_actuator_external_forces.png" alt="1dof_actuator_external_forces.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 2: </span>Schematic representation of the stewart platform on a rigid support</p>
|
<p><span class="figure-number">Figure 2: </span>Schematic representation of the stewart platform on a rigid support</p>
|
||||||
@@ -163,14 +168,14 @@ This can be understood from figure <a href="#org8bd3e63">2</a> where \(\mathcal{
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org8662186" class="outline-3">
|
<div id="outline-container-orgefde538" class="outline-3">
|
||||||
<h3 id="org8662186"><span class="section-number-3">1.2</span> Comparison with a flexible support</h3>
|
<h3 id="orgefde538"><span class="section-number-3">1.2</span> Comparison with a flexible support</h3>
|
||||||
<div class="outline-text-3" id="text-1-2">
|
<div class="outline-text-3" id="text-1-2">
|
||||||
<p>
|
<p>
|
||||||
We now add a flexible support under the Stewart platform.
|
We now add a flexible support under the Stewart platform.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">ground = initializeGround('type', 'flexible');
|
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'flexible'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -178,50 +183,50 @@ We now add a flexible support under the Stewart platform.
|
|||||||
And we perform again the identification.
|
And we perform again the identification.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">%% Input/Output definition
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
|
||||||
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
io(io_i) = linio([mdl, <span class="org-string">'/Relative Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Position/Orientation of {B} w.r.t. {A}</span>
|
||||||
|
|
||||||
%% Run the linearization
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
||||||
G = linearize(mdl, io, options);
|
G = linearize(mdl, io, options);
|
||||||
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
|
||||||
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
G.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
|
||||||
|
|
||||||
Gc = minreal(G*inv(stewart.kinematics.J'));
|
Gc = minreal(G<span class="org-type">*</span>inv(stewart.kinematics.J<span class="org-type">'</span>));
|
||||||
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
|
Gc.InputName = {<span class="org-string">'Fnx'</span>, <span class="org-string">'Fny'</span>, <span class="org-string">'Fnz'</span>, <span class="org-string">'Mnx'</span>, <span class="org-string">'Mny'</span>, <span class="org-string">'Mnz'</span>};
|
||||||
|
|
||||||
%% Input/Output definition
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext'); io_i = io_i + 1; % External forces/torques applied on {B}
|
io(io_i) = linio([mdl, <span class="org-string">'/Disturbances'</span>], 1, <span class="org-string">'openinput'</span>, [], <span class="org-string">'F_ext'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% External forces/torques applied on {B}</span>
|
||||||
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
io(io_i) = linio([mdl, <span class="org-string">'/Relative Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Position/Orientation of {B} w.r.t. {A}</span>
|
||||||
|
|
||||||
%% Run the linearization
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
||||||
Gd = linearize(mdl, io, options);
|
Gd = linearize(mdl, io, options);
|
||||||
Gd.InputName = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
|
Gd.InputName = {<span class="org-string">'Fex'</span>, <span class="org-string">'Fey'</span>, <span class="org-string">'Fez'</span>, <span class="org-string">'Mex'</span>, <span class="org-string">'Mey'</span>, <span class="org-string">'Mez'</span>};
|
||||||
Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
Gd.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The comparison between the obtained transfer functions is shown in Figure <a href="#orga2f2bd5">3</a>.
|
The comparison between the obtained transfer functions is shown in Figure <a href="#org593368e">3</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<div id="orga2f2bd5" class="figure">
|
<div id="org593368e" class="figure">
|
||||||
<p><img src="figs/comparison_Fext_F_flexible_base.png" alt="comparison_Fext_F_flexible_base.png" />
|
<p><img src="figs/comparison_Fext_F_flexible_base.png" alt="comparison_Fext_F_flexible_base.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 3: </span>Comparison of the transfer functions from \(\bm{\mathcal{F}}\) to \(\mathcal{\bm{X}}\) and from \(\bm{\mathcal{F}}_{\text{ext}}\) to \(\mathcal{\bm{X}}\) (<a href="./figs/comparison_Fext_F_flexible_base.png">png</a>, <a href="./figs/comparison_Fext_F_flexible_base.pdf">pdf</a>)</p>
|
<p><span class="figure-number">Figure 3: </span>Comparison of the transfer functions from \(\bm{\mathcal{F}}\) to \(\mathcal{\bm{X}}\) and from \(\bm{\mathcal{F}}_{\text{ext}}\) to \(\mathcal{\bm{X}}\) (<a href="./figs/comparison_Fext_F_flexible_base.png">png</a>, <a href="./figs/comparison_Fext_F_flexible_base.pdf">pdf</a>)</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The addition of a flexible support can be schematically represented in Figure <a href="#orgee3ecbe">4</a>.
|
The addition of a flexible support can be schematically represented in Figure <a href="#orga537ded">4</a>.
|
||||||
We see that \(\mathcal{F}_{x}\) applies a force both on \(m\) and \(m^{\prime}\) whereas \(\mathcal{F}_{x,\text{ext}}\) only applies a force on \(m\).
|
We see that \(\mathcal{F}_{x}\) applies a force both on \(m\) and \(m^{\prime}\) whereas \(\mathcal{F}_{x,\text{ext}}\) only applies a force on \(m\).
|
||||||
And thus \(\mathcal{F}_{x}\) and \(\mathcal{F}_{x,\text{ext}}\) have clearly <b>not</b> the same effect on \(\mathcal{X}_{x}\).
|
And thus \(\mathcal{F}_{x}\) and \(\mathcal{F}_{x,\text{ext}}\) have clearly <b>not</b> the same effect on \(\mathcal{X}_{x}\).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<div id="orgee3ecbe" class="figure">
|
<div id="orga537ded" class="figure">
|
||||||
<p><img src="figs/2dof_actuator_external_forces.png" alt="2dof_actuator_external_forces.png" />
|
<p><img src="figs/2dof_actuator_external_forces.png" alt="2dof_actuator_external_forces.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 4: </span>Schematic representation of the stewart platform on top of a flexible support</p>
|
<p><span class="figure-number">Figure 4: </span>Schematic representation of the stewart platform on top of a flexible support</p>
|
||||||
@@ -230,10 +235,10 @@ And thus \(\mathcal{F}_{x}\) and \(\mathcal{F}_{x,\text{ext}}\) have clearly <b>
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div id="outline-container-org55e0dad" class="outline-3">
|
<div id="outline-container-orga9eb2fd" class="outline-3">
|
||||||
<h3 id="org55e0dad"><span class="section-number-3">1.3</span> Conclusion</h3>
|
<h3 id="orga9eb2fd"><span class="section-number-3">1.3</span> Conclusion</h3>
|
||||||
<div class="outline-text-3" id="text-1-3">
|
<div class="outline-text-3" id="text-1-3">
|
||||||
<div class="important">
|
<div class="important" id="org4878fef">
|
||||||
<p>
|
<p>
|
||||||
The transfer function from forces/torques applied by the actuators on the payload \(\bm{\mathcal{F}} = \bm{J}^T \bm{\tau}\) to the pose of the mobile platform \(\bm{\mathcal{X}}\) is the same as the transfer function from external forces/torques to \(\bm{\mathcal{X}}\) as long as the Stewart platform’s base is fixed.
|
The transfer function from forces/torques applied by the actuators on the payload \(\bm{\mathcal{F}} = \bm{J}^T \bm{\tau}\) to the pose of the mobile platform \(\bm{\mathcal{X}}\) is the same as the transfer function from external forces/torques to \(\bm{\mathcal{X}}\) as long as the Stewart platform’s base is fixed.
|
||||||
</p>
|
</p>
|
||||||
@@ -243,32 +248,32 @@ The transfer function from forces/torques applied by the actuators on the payloa
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org81ab204" class="outline-2">
|
<div id="outline-container-orgb6a1ef7" class="outline-2">
|
||||||
<h2 id="org81ab204"><span class="section-number-2">2</span> Comparison of the static transfer function and the Compliance matrix</h2>
|
<h2 id="orgb6a1ef7"><span class="section-number-2">2</span> Comparison of the static transfer function and the Compliance matrix</h2>
|
||||||
<div class="outline-text-2" id="text-2">
|
<div class="outline-text-2" id="text-2">
|
||||||
<p>
|
<p>
|
||||||
In this section, we see how the Compliance matrix of the Stewart platform is linked to the static relation between \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\).
|
In this section, we see how the Compliance matrix of the Stewart platform is linked to the static relation between \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\).
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orge7e7242" class="outline-3">
|
<div id="outline-container-org3f1c253" class="outline-3">
|
||||||
<h3 id="orge7e7242"><span class="section-number-3">2.1</span> Analysis</h3>
|
<h3 id="org3f1c253"><span class="section-number-3">2.1</span> Analysis</h3>
|
||||||
<div class="outline-text-3" id="text-2-1">
|
<div class="outline-text-3" id="text-2-1">
|
||||||
<p>
|
<p>
|
||||||
Initialization of the Stewart platform.
|
Initialization of the Stewart platform.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">stewart = initializeStewartPlatform();
|
<pre class="src src-matlab">stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'none');
|
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -276,9 +281,9 @@ stewart = initializeInertialSensor(stewart, 'type', 'none');
|
|||||||
No flexibility below the Stewart platform and no payload.
|
No flexibility below the Stewart platform and no payload.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">ground = initializeGround('type', 'none');
|
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
payload = initializePayload('type', 'none');
|
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
controller = initializeController('type', 'open-loop');
|
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -286,28 +291,28 @@ controller = initializeController('type', 'open-loop');
|
|||||||
Estimation of the transfer function from \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\):
|
Estimation of the transfer function from \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\):
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">%% Options for Linearized
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
|
||||||
options = linearizeOptions;
|
options = linearizeOptions;
|
||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
||||||
mdl = 'stewart_platform_model';
|
mdl = <span class="org-string">'stewart_platform_model'</span>;
|
||||||
|
|
||||||
%% Input/Output definition
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
|
||||||
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
io(io_i) = linio([mdl, <span class="org-string">'/Relative Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Position/Orientation of {B} w.r.t. {A}</span>
|
||||||
|
|
||||||
%% Run the linearization
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
||||||
G = linearize(mdl, io, options);
|
G = linearize(mdl, io, options);
|
||||||
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
|
||||||
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
G.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">Gc = minreal(G*inv(stewart.kinematics.J'));
|
<pre class="src src-matlab">Gc = minreal(G<span class="org-type">*</span>inv(stewart.kinematics.J<span class="org-type">'</span>));
|
||||||
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
|
Gc.InputName = {<span class="org-string">'Fnx'</span>, <span class="org-string">'Fny'</span>, <span class="org-string">'Fnz'</span>, <span class="org-string">'Mnx'</span>, <span class="org-string">'Mny'</span>, <span class="org-string">'Mnz'</span>};
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -465,10 +470,10 @@ And now at the Compliance matrix.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org9ee3939" class="outline-3">
|
<div id="outline-container-orge261263" class="outline-3">
|
||||||
<h3 id="org9ee3939"><span class="section-number-3">2.2</span> Conclusion</h3>
|
<h3 id="orge261263"><span class="section-number-3">2.2</span> Conclusion</h3>
|
||||||
<div class="outline-text-3" id="text-2-2">
|
<div class="outline-text-3" id="text-2-2">
|
||||||
<div class="important">
|
<div class="important" id="org2428297">
|
||||||
<p>
|
<p>
|
||||||
The low frequency transfer function matrix from \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\) corresponds to the compliance matrix of the Stewart platform.
|
The low frequency transfer function matrix from \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\) corresponds to the compliance matrix of the Stewart platform.
|
||||||
</p>
|
</p>
|
||||||
@@ -480,7 +485,7 @@ The low frequency transfer function matrix from \(\mathcal{\bm{F}}\) to \(\mathc
|
|||||||
</div>
|
</div>
|
||||||
<div id="postamble" class="status">
|
<div id="postamble" class="status">
|
||||||
<p class="author">Author: Dehaeze Thomas</p>
|
<p class="author">Author: Dehaeze Thomas</p>
|
||||||
<p class="date">Created: 2020-08-05 mer. 13:27</p>
|
<p class="date">Created: 2021-01-08 ven. 15:52</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
BIN
docs/figs/afzali_parametrization_hexapod.png
Normal file
After Width: | Height: | Size: 179 KiB |
BIN
docs/figs/afzali_stewart_platform_characteristics.png
Normal file
After Width: | Height: | Size: 168 KiB |
BIN
docs/figs/afzali_top_view.png
Normal file
After Width: | Height: | Size: 120 KiB |
BIN
docs/figs/comp_relative_motion_sensor_act_leg.pdf
Normal file
BIN
docs/figs/comp_relative_motion_sensor_act_leg.png
Normal file
After Width: | Height: | Size: 97 KiB |
BIN
docs/figs/comp_relative_motion_sensor_act_leg_encoder.pdf
Normal file
BIN
docs/figs/comp_relative_motion_sensor_act_leg_encoder.png
Normal file
After Width: | Height: | Size: 121 KiB |
BIN
docs/figs/introduction_stewart_mov_pos.pdf
Normal file
BIN
docs/figs/introduction_stewart_mov_pos.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
docs/figs/introduction_stewart_rest_pos.pdf
Normal file
BIN
docs/figs/introduction_stewart_rest_pos.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
docs/figs/stewart_examples/stewart_beijen.jpg
Normal file
After Width: | Height: | Size: 81 KiB |
BIN
docs/figs/stewart_examples/stewart_cleary.jpg
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
docs/figs/stewart_examples/stewart_czech.jpg
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
docs/figs/stewart_examples/stewart_dong07.jpg
Normal file
After Width: | Height: | Size: 125 KiB |
BIN
docs/figs/stewart_examples/stewart_du14.jpg
Normal file
After Width: | Height: | Size: 91 KiB |
BIN
docs/figs/stewart_examples/stewart_furutani.jpg
Normal file
After Width: | Height: | Size: 94 KiB |
BIN
docs/figs/stewart_examples/stewart_geng.jpg
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
docs/figs/stewart_examples/stewart_ht_uw.jpg
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
docs/figs/stewart_examples/stewart_iran.jpg
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
docs/figs/stewart_examples/stewart_jpl.jpg
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
docs/figs/stewart_examples/stewart_kim00.jpg
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
docs/figs/stewart_examples/stewart_mais.jpg
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
docs/figs/stewart_examples/stewart_nanoscale.jpg
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
docs/figs/stewart_examples/stewart_naval.jpg
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
docs/figs/stewart_examples/stewart_naves.jpg
Normal file
After Width: | Height: | Size: 119 KiB |
BIN
docs/figs/stewart_examples/stewart_pph.jpg
Normal file
After Width: | Height: | Size: 99 KiB |
BIN
docs/figs/stewart_examples/stewart_satra.jpg
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
docs/figs/stewart_examples/stewart_su04.jpg
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
docs/figs/stewart_examples/stewart_tang18.jpg
Normal file
After Width: | Height: | Size: 102 KiB |
BIN
docs/figs/stewart_examples/stewart_ting07.jpg
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
docs/figs/stewart_examples/stewart_torii.jpg
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
docs/figs/stewart_examples/stewart_ulb_pz.jpg
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
docs/figs/stewart_examples/stewart_ulb_vc.jpg
Normal file
After Width: | Height: | Size: 87 KiB |
BIN
docs/figs/stewart_examples/stewart_uqp.jpg
Normal file
After Width: | Height: | Size: 107 KiB |
BIN
docs/figs/stewart_examples/stewart_uw_gsp.jpg
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
docs/figs/stewart_examples/stewart_wang16.jpg
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
docs/figs/stewart_examples/stewart_yang19.jpg
Normal file
After Width: | Height: | Size: 111 KiB |
BIN
docs/figs/stewart_examples/stewart_zhang11.jpg
Normal file
After Width: | Height: | Size: 25 KiB |
@@ -3,51 +3,45 @@
|
|||||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||||
<head>
|
<head>
|
||||||
<!-- 2020-08-05 mer. 13:27 -->
|
<!-- 2021-01-08 ven. 15:30 -->
|
||||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
<title>Stewart Platforms</title>
|
<title>Stewart Platforms</title>
|
||||||
<meta name="generator" content="Org mode" />
|
<meta name="generator" content="Org mode" />
|
||||||
<meta name="author" content="Dehaeze Thomas" />
|
<meta name="author" content="Dehaeze Thomas" />
|
||||||
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
<link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
<script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
<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>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="org-div-home-and-up">
|
<div id="org-div-home-and-up">
|
||||||
<a accesskey="h" href="index.html"> UP </a>
|
<a accesskey="h" href="https://research.tdehaeze.xyz/"> UP </a>
|
||||||
|
|
|
|
||||||
<a accesskey="H" href="index.html"> HOME </a>
|
<a accesskey="H" href="https://research.tdehaeze.xyz/"> HOME </a>
|
||||||
</div><div id="content">
|
</div><div id="content">
|
||||||
<h1 class="title">Stewart Platforms</h1>
|
<h1 class="title">Stewart Platforms</h1>
|
||||||
<div id="table-of-contents">
|
<div id="table-of-contents">
|
||||||
<h2>Table of Contents</h2>
|
<h2>Table of Contents</h2>
|
||||||
<div id="text-table-of-contents">
|
<div id="text-table-of-contents">
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orgff0bfd7">1. Simulink Project (link)</a></li>
|
<li><a href="#orgad01eeb">1. Simulink Project (link)</a></li>
|
||||||
<li><a href="#org38b9089">2. Stewart Platform Architecture Definition (link)</a></li>
|
<li><a href="#orgf0936f9">2. Stewart Platform Architecture Definition (link)</a></li>
|
||||||
<li><a href="#orgf1c7b3b">3. Simscape Model of the Stewart Platform (link)</a></li>
|
<li><a href="#org4bef8ba">3. Simscape Model of the Stewart Platform (link)</a></li>
|
||||||
<li><a href="#org369c8bb">4. Kinematic Analysis (link)</a></li>
|
<li><a href="#orgfd134cc">4. Kinematic Analysis (link)</a></li>
|
||||||
<li><a href="#org2e3169e">5. Identification of the Stewart Dynamics (link)</a></li>
|
<li><a href="#org2e5eede">5. Identification of the Stewart Dynamics (link)</a></li>
|
||||||
<li><a href="#org0fdb910">6. Control</a></li>
|
<li><a href="#orgb272d52">6. Control</a></li>
|
||||||
<li><a href="#org1f468b1">7. Cubic Configuration (link)</a></li>
|
<li><a href="#org7c7008e">7. Cubic Configuration (link)</a></li>
|
||||||
<li><a href="#orga2bd0e9">8. Bibliography (link)</a></li>
|
<li><a href="#org1f2f2c6">8. Bibliography (link)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The goal of this project is to provide a Matlab/Simscape Toolbox to study Stewart platforms.
|
The goal of this project is to provide a Matlab/Simscape Toolbox to study Stewart platforms.
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The project is divided into several section listed below.
|
The project is divided into several section listed below.
|
||||||
|
The git repository of the project is accessible <a href="https://git.tdehaeze.xyz/tdehaeze/stewart-simscape">here</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div id="outline-container-orgff0bfd7" class="outline-2">
|
<div id="outline-container-orgad01eeb" class="outline-2">
|
||||||
<h2 id="orgff0bfd7"><span class="section-number-2">1</span> Simulink Project (<a href="simulink-project.html">link</a>)</h2>
|
<h2 id="orgad01eeb"><span class="section-number-2">1</span> Simulink Project (<a href="simulink-project.html">link</a>)</h2>
|
||||||
<div class="outline-text-2" id="text-1">
|
<div class="outline-text-2" id="text-1">
|
||||||
<p>
|
<p>
|
||||||
The project is managed with a <b>Simulink Project</b>.
|
The project is managed with a <b>Simulink Project</b>.
|
||||||
@@ -56,8 +50,8 @@ Such project is briefly presented <a href="simulink-project.html">here</a>.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org38b9089" class="outline-2">
|
<div id="outline-container-orgf0936f9" class="outline-2">
|
||||||
<h2 id="org38b9089"><span class="section-number-2">2</span> Stewart Platform Architecture Definition (<a href="stewart-architecture.html">link</a>)</h2>
|
<h2 id="orgf0936f9"><span class="section-number-2">2</span> Stewart Platform Architecture Definition (<a href="stewart-architecture.html">link</a>)</h2>
|
||||||
<div class="outline-text-2" id="text-2">
|
<div class="outline-text-2" id="text-2">
|
||||||
<p>
|
<p>
|
||||||
The way the Stewart Platform is defined is explained <a href="stewart-architecture.html">here</a>.
|
The way the Stewart Platform is defined is explained <a href="stewart-architecture.html">here</a>.
|
||||||
@@ -82,8 +76,8 @@ Other parameters are also defined such as:
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgf1c7b3b" class="outline-2">
|
<div id="outline-container-org4bef8ba" class="outline-2">
|
||||||
<h2 id="orgf1c7b3b"><span class="section-number-2">3</span> Simscape Model of the Stewart Platform (<a href="simscape-model.html">link</a>)</h2>
|
<h2 id="org4bef8ba"><span class="section-number-2">3</span> Simscape Model of the Stewart Platform (<a href="simscape-model.html">link</a>)</h2>
|
||||||
<div class="outline-text-2" id="text-3">
|
<div class="outline-text-2" id="text-3">
|
||||||
<p>
|
<p>
|
||||||
The Stewart Platform is then modeled using <a href="https://www.mathworks.com/products/simscape.html">Simscape</a>.
|
The Stewart Platform is then modeled using <a href="https://www.mathworks.com/products/simscape.html">Simscape</a>.
|
||||||
@@ -95,8 +89,8 @@ The way to model is build and works is explained <a href="simscape-model.html">h
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org369c8bb" class="outline-2">
|
<div id="outline-container-orgfd134cc" class="outline-2">
|
||||||
<h2 id="org369c8bb"><span class="section-number-2">4</span> Kinematic Analysis (<a href="kinematic-study.html">link</a>)</h2>
|
<h2 id="orgfd134cc"><span class="section-number-2">4</span> Kinematic Analysis (<a href="kinematic-study.html">link</a>)</h2>
|
||||||
<div class="outline-text-2" id="text-4">
|
<div class="outline-text-2" id="text-4">
|
||||||
<p>
|
<p>
|
||||||
From the defined geometry of the Stewart platform, we can perform static analysis such as:
|
From the defined geometry of the Stewart platform, we can perform static analysis such as:
|
||||||
@@ -116,8 +110,8 @@ All these analysis are described <a href="kinematic-study.html">here</a>.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org2e3169e" class="outline-2">
|
<div id="outline-container-org2e5eede" class="outline-2">
|
||||||
<h2 id="org2e3169e"><span class="section-number-2">5</span> Identification of the Stewart Dynamics (<a href="identification.html">link</a>)</h2>
|
<h2 id="org2e5eede"><span class="section-number-2">5</span> Identification of the Stewart Dynamics (<a href="identification.html">link</a>)</h2>
|
||||||
<div class="outline-text-2" id="text-5">
|
<div class="outline-text-2" id="text-5">
|
||||||
<p>
|
<p>
|
||||||
The Dynamics of the Stewart platform can be identified using the Simscape model.
|
The Dynamics of the Stewart platform can be identified using the Simscape model.
|
||||||
@@ -138,8 +132,8 @@ The code that is used for identification is explained <a href="identification.ht
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org0fdb910" class="outline-2">
|
<div id="outline-container-orgb272d52" class="outline-2">
|
||||||
<h2 id="org0fdb910"><span class="section-number-2">6</span> Control</h2>
|
<h2 id="orgb272d52"><span class="section-number-2">6</span> Control</h2>
|
||||||
<div class="outline-text-2" id="text-6">
|
<div class="outline-text-2" id="text-6">
|
||||||
<p>
|
<p>
|
||||||
The use of active control for Stewart platforms is a wide subject.
|
The use of active control for Stewart platforms is a wide subject.
|
||||||
@@ -182,8 +176,8 @@ Different control architectures (centralized and decentralized) are compared for
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org1f468b1" class="outline-2">
|
<div id="outline-container-org7c7008e" class="outline-2">
|
||||||
<h2 id="org1f468b1"><span class="section-number-2">7</span> Cubic Configuration (<a href="cubic-configuration.html">link</a>)</h2>
|
<h2 id="org7c7008e"><span class="section-number-2">7</span> Cubic Configuration (<a href="cubic-configuration.html">link</a>)</h2>
|
||||||
<div class="outline-text-2" id="text-7">
|
<div class="outline-text-2" id="text-7">
|
||||||
<p>
|
<p>
|
||||||
The cubic configuration is a special class of Stewart platform that has interesting properties.
|
The cubic configuration is a special class of Stewart platform that has interesting properties.
|
||||||
@@ -195,8 +189,8 @@ These properties are studied in <a href="cubic-configuration.html">this</a> docu
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orga2bd0e9" class="outline-2">
|
<div id="outline-container-org1f2f2c6" class="outline-2">
|
||||||
<h2 id="orga2bd0e9"><span class="section-number-2">8</span> Bibliography (<a href="bibliography.html">link</a>)</h2>
|
<h2 id="org1f2f2c6"><span class="section-number-2">8</span> Bibliography (<a href="bibliography.html">link</a>)</h2>
|
||||||
<div class="outline-text-2" id="text-8">
|
<div class="outline-text-2" id="text-8">
|
||||||
<p>
|
<p>
|
||||||
Many text books, PhD thesis and articles related to parallel robots and Stewart platforms are gathered in <a href="bibliography.html">this</a> document.
|
Many text books, PhD thesis and articles related to parallel robots and Stewart platforms are gathered in <a href="bibliography.html">this</a> document.
|
||||||
@@ -206,7 +200,7 @@ Many text books, PhD thesis and articles related to parallel robots and Stewart
|
|||||||
</div>
|
</div>
|
||||||
<div id="postamble" class="status">
|
<div id="postamble" class="status">
|
||||||
<p class="author">Author: Dehaeze Thomas</p>
|
<p class="author">Author: Dehaeze Thomas</p>
|
||||||
<p class="date">Created: 2020-08-05 mer. 13:27</p>
|
<p class="date">Created: 2021-01-08 ven. 15:30</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
7
docs/js/bootstrap.min.js
vendored
4
docs/js/jquery.min.js
vendored
1
docs/js/jquery.stickytableheaders.min.js
vendored
@@ -1 +0,0 @@
|
|||||||
!function(a,b){"use strict";function c(c,g){var h=this;h.$el=a(c),h.el=c,h.id=e++,h.$window=a(b),h.$document=a(document),h.$el.bind("destroyed",a.proxy(h.teardown,h)),h.$clonedHeader=null,h.$originalHeader=null,h.isSticky=!1,h.hasBeenSticky=!1,h.leftOffset=null,h.topOffset=null,h.init=function(){h.$el.each(function(){var b=a(this);b.css("padding",0),h.$originalHeader=a("thead:first",this),h.$clonedHeader=h.$originalHeader.clone(),b.trigger("clonedHeader."+d,[h.$clonedHeader]),h.$clonedHeader.addClass("tableFloatingHeader"),h.$clonedHeader.css("display","none"),h.$originalHeader.addClass("tableFloatingHeaderOriginal"),h.$originalHeader.after(h.$clonedHeader),h.$printStyle=a('<style type="text/css" media="print">.tableFloatingHeader{display:none !important;}.tableFloatingHeaderOriginal{position:static !important;}</style>'),a("head").append(h.$printStyle)}),h.setOptions(g),h.updateWidth(),h.toggleHeaders(),h.bind()},h.destroy=function(){h.$el.unbind("destroyed",h.teardown),h.teardown()},h.teardown=function(){h.isSticky&&h.$originalHeader.css("position","static"),a.removeData(h.el,"plugin_"+d),h.unbind(),h.$clonedHeader.remove(),h.$originalHeader.removeClass("tableFloatingHeaderOriginal"),h.$originalHeader.css("visibility","visible"),h.$printStyle.remove(),h.el=null,h.$el=null},h.bind=function(){h.$scrollableArea.on("scroll."+d,h.toggleHeaders),h.isWindowScrolling||(h.$window.on("scroll."+d+h.id,h.setPositionValues),h.$window.on("resize."+d+h.id,h.toggleHeaders)),h.$scrollableArea.on("resize."+d,h.toggleHeaders),h.$scrollableArea.on("resize."+d,h.updateWidth)},h.unbind=function(){h.$scrollableArea.off("."+d,h.toggleHeaders),h.isWindowScrolling||(h.$window.off("."+d+h.id,h.setPositionValues),h.$window.off("."+d+h.id,h.toggleHeaders)),h.$scrollableArea.off("."+d,h.updateWidth)},h.toggleHeaders=function(){h.$el&&h.$el.each(function(){var b,c=a(this),d=h.isWindowScrolling?isNaN(h.options.fixedOffset)?h.options.fixedOffset.outerHeight():h.options.fixedOffset:h.$scrollableArea.offset().top+(isNaN(h.options.fixedOffset)?0:h.options.fixedOffset),e=c.offset(),f=h.$scrollableArea.scrollTop()+d,g=h.$scrollableArea.scrollLeft(),i=h.isWindowScrolling?f>e.top:d>e.top,j=(h.isWindowScrolling?f:0)<e.top+c.height()-h.$clonedHeader.height()-(h.isWindowScrolling?0:d);i&&j?(b=e.left-g+h.options.leftOffset,h.$originalHeader.css({position:"fixed","margin-top":h.options.marginTop,left:b,"z-index":3}),h.leftOffset=b,h.topOffset=d,h.$clonedHeader.css("display",""),h.isSticky||(h.isSticky=!0,h.updateWidth()),h.setPositionValues()):h.isSticky&&(h.$originalHeader.css("position","static"),h.$clonedHeader.css("display","none"),h.isSticky=!1,h.resetWidth(a("td,th",h.$clonedHeader),a("td,th",h.$originalHeader)))})},h.setPositionValues=function(){var a=h.$window.scrollTop(),b=h.$window.scrollLeft();!h.isSticky||0>a||a+h.$window.height()>h.$document.height()||0>b||b+h.$window.width()>h.$document.width()||h.$originalHeader.css({top:h.topOffset-(h.isWindowScrolling?0:a),left:h.leftOffset-(h.isWindowScrolling?0:b)})},h.updateWidth=function(){if(h.isSticky){h.$originalHeaderCells||(h.$originalHeaderCells=a("th,td",h.$originalHeader)),h.$clonedHeaderCells||(h.$clonedHeaderCells=a("th,td",h.$clonedHeader));var b=h.getWidth(h.$clonedHeaderCells);h.setWidth(b,h.$clonedHeaderCells,h.$originalHeaderCells),h.$originalHeader.css("width",h.$clonedHeader.width())}},h.getWidth=function(c){var d=[];return c.each(function(c){var e,f=a(this);if("border-box"===f.css("box-sizing"))e=f[0].getBoundingClientRect().width;else{var g=a("th",h.$originalHeader);if("collapse"===g.css("border-collapse"))if(b.getComputedStyle)e=parseFloat(b.getComputedStyle(this,null).width);else{var i=parseFloat(f.css("padding-left")),j=parseFloat(f.css("padding-right")),k=parseFloat(f.css("border-width"));e=f.outerWidth()-i-j-k}else e=f.width()}d[c]=e}),d},h.setWidth=function(a,b,c){b.each(function(b){var d=a[b];c.eq(b).css({"min-width":d,"max-width":d})})},h.resetWidth=function(b,c){b.each(function(b){var d=a(this);c.eq(b).css({"min-width":d.css("min-width"),"max-width":d.css("max-width")})})},h.setOptions=function(c){h.options=a.extend({},f,c),h.$scrollableArea=a(h.options.scrollableArea),h.isWindowScrolling=h.$scrollableArea[0]===b},h.updateOptions=function(a){h.setOptions(a),h.unbind(),h.bind(),h.updateWidth(),h.toggleHeaders()},h.init()}var d="stickyTableHeaders",e=0,f={fixedOffset:0,leftOffset:0,marginTop:0,scrollableArea:b};a.fn[d]=function(b){return this.each(function(){var e=a.data(this,"plugin_"+d);e?"string"==typeof b?e[b].apply(e):e.updateOptions(b):"destroy"!==b&&a.data(this,"plugin_"+d,new c(this,b))})}}(jQuery,window);
|
|
@@ -1,85 +0,0 @@
|
|||||||
$(function() {
|
|
||||||
$('.note').before("<p class='admonition-title note'>Note</p>");
|
|
||||||
$('.seealso').before("<p class='admonition-title seealso'>See also</p>");
|
|
||||||
$('.warning').before("<p class='admonition-title warning'>Warning</p>");
|
|
||||||
$('.caution').before("<p class='admonition-title caution'>Caution</p>");
|
|
||||||
$('.attention').before("<p class='admonition-title attention'>Attention</p>");
|
|
||||||
$('.tip').before("<p class='admonition-title tip'>Tip</p>");
|
|
||||||
$('.important').before("<p class='admonition-title important'>Important</p>");
|
|
||||||
$('.hint').before("<p class='admonition-title hint'>Hint</p>");
|
|
||||||
$('.error').before("<p class='admonition-title error'>Error</p>");
|
|
||||||
$('.danger').before("<p class='admonition-title danger'>Danger</p>");
|
|
||||||
});
|
|
||||||
|
|
||||||
$( document ).ready(function() {
|
|
||||||
|
|
||||||
// Shift nav in mobile when clicking the menu.
|
|
||||||
$(document).on('click', "[data-toggle='wy-nav-top']", function() {
|
|
||||||
$("[data-toggle='wy-nav-shift']").toggleClass("shift");
|
|
||||||
$("[data-toggle='rst-versions']").toggleClass("shift");
|
|
||||||
});
|
|
||||||
// Close menu when you click a link.
|
|
||||||
$(document).on('click', ".wy-menu-vertical .current ul li a", function() {
|
|
||||||
$("[data-toggle='wy-nav-shift']").removeClass("shift");
|
|
||||||
$("[data-toggle='rst-versions']").toggleClass("shift");
|
|
||||||
});
|
|
||||||
$(document).on('click', "[data-toggle='rst-current-version']", function() {
|
|
||||||
$("[data-toggle='rst-versions']").toggleClass("shift-up");
|
|
||||||
});
|
|
||||||
// Make tables responsive
|
|
||||||
$("table.docutils:not(.field-list)").wrap("<div class='wy-table-responsive'></div>");
|
|
||||||
});
|
|
||||||
|
|
||||||
$( document ).ready(function() {
|
|
||||||
$('#text-table-of-contents ul').first().addClass('nav');
|
|
||||||
// ScrollSpy also requires that we use
|
|
||||||
// a Bootstrap nav component.
|
|
||||||
$('body').scrollspy({target: '#text-table-of-contents'});
|
|
||||||
|
|
||||||
// add sticky table headers
|
|
||||||
$('table').stickyTableHeaders();
|
|
||||||
|
|
||||||
// set the height of tableOfContents
|
|
||||||
var $postamble = $('#postamble');
|
|
||||||
var $tableOfContents = $('#table-of-contents');
|
|
||||||
$tableOfContents.css({paddingBottom: $postamble.outerHeight()});
|
|
||||||
|
|
||||||
// add TOC button
|
|
||||||
var toggleSidebar = $('<div id="toggle-sidebar"><a href="#table-of-contents"><h2>Table of Contents</h2></a></div>');
|
|
||||||
$('#content').prepend(toggleSidebar);
|
|
||||||
|
|
||||||
// add close button when sidebar showed in mobile screen
|
|
||||||
var closeBtn = $('<a class="close-sidebar" href="#">Close</a>');
|
|
||||||
var tocTitle = $('#table-of-contents').find('h2');
|
|
||||||
tocTitle.append(closeBtn);
|
|
||||||
});
|
|
||||||
|
|
||||||
window.SphinxRtdTheme = (function (jquery) {
|
|
||||||
var stickyNav = (function () {
|
|
||||||
var navBar,
|
|
||||||
win,
|
|
||||||
stickyNavCssClass = 'stickynav',
|
|
||||||
applyStickNav = function () {
|
|
||||||
if (navBar.height() <= win.height()) {
|
|
||||||
navBar.addClass(stickyNavCssClass);
|
|
||||||
} else {
|
|
||||||
navBar.removeClass(stickyNavCssClass);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
enable = function () {
|
|
||||||
applyStickNav();
|
|
||||||
win.on('resize', applyStickNav);
|
|
||||||
},
|
|
||||||
init = function () {
|
|
||||||
navBar = jquery('nav.wy-nav-side:first');
|
|
||||||
win = jquery(window);
|
|
||||||
};
|
|
||||||
jquery(init);
|
|
||||||
return {
|
|
||||||
enable : enable
|
|
||||||
};
|
|
||||||
}());
|
|
||||||
return {
|
|
||||||
StickyNav : stickyNav
|
|
||||||
};
|
|
||||||
}($));
|
|
83
docs/nass.html
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<?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>
|
||||||
|
<!-- 2021-01-08 ven. 15:53 -->
|
||||||
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
|
<title>Stewart Platform - NASS</title>
|
||||||
|
<meta name="generator" content="Org mode" />
|
||||||
|
<meta name="author" content="Dehaeze Thomas" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
|
<script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.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">Stewart Platform - NASS</h1>
|
||||||
|
<div id="table-of-contents">
|
||||||
|
<h2>Table of Contents</h2>
|
||||||
|
<div id="text-table-of-contents">
|
||||||
|
<ul>
|
||||||
|
<li><a href="#org07676ec">1. NASS</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#org0167386">1.1. Identification of the Dynamics</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-org07676ec" class="outline-2">
|
||||||
|
<h2 id="org07676ec"><span class="section-number-2">1</span> NASS</h2>
|
||||||
|
<div class="outline-text-2" id="text-1">
|
||||||
|
</div>
|
||||||
|
<div id="outline-container-org0167386" class="outline-3">
|
||||||
|
<h3 id="org0167386"><span class="section-number-3">1.1</span> Identification of the Dynamics</h3>
|
||||||
|
<div class="outline-text-3" id="text-1-1">
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">apa = load(<span class="org-string">'./mat/APA300ML.mat'</span>, <span class="org-string">'int_xyz'</span>, <span class="org-string">'int_i'</span>, <span class="org-string">'n_xyz'</span>, <span class="org-string">'n_i'</span>, <span class="org-string">'nodes'</span>, <span class="org-string">'M'</span>, <span class="org-string">'K'</span>);
|
||||||
|
flex_joint = load(<span class="org-string">'./mat/flexor_ID16.mat'</span>, <span class="org-string">'int_xyz'</span>, <span class="org-string">'int_i'</span>, <span class="org-string">'n_xyz'</span>, <span class="org-string">'n_i'</span>, <span class="org-string">'nodes'</span>, <span class="org-string">'M'</span>, <span class="org-string">'K'</span>);
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">stewart = initializeStewartPlatform();
|
||||||
|
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 175e<span class="org-type">-</span>3);
|
||||||
|
stewart = generateGeneralConfiguration(stewart, <span class="org-string">'FH'</span>, 20e<span class="org-type">-</span>3, <span class="org-string">'MH'</span>, 20e<span class="org-type">-</span>3, <span class="org-string">'FR'</span>, 228e<span class="org-type">-</span>3<span class="org-type">/</span>2, <span class="org-string">'MR'</span>, 220e<span class="org-type">-</span>3<span class="org-type">/</span>2, <span class="org-string">'FTh'</span>, [<span class="org-type">-</span>9, 9, 120<span class="org-type">-</span>9, 120<span class="org-type">+</span>9, 240<span class="org-type">-</span>9, 240<span class="org-type">+</span>9]<span class="org-type">*</span>(<span class="org-constant">pi</span><span class="org-type">/</span>180), <span class="org-string">'MTh'</span>, [<span class="org-type">-</span>60<span class="org-type">+</span>15, 60<span class="org-type">-</span>15, 60<span class="org-type">+</span>15, 180<span class="org-type">-</span>15, 180<span class="org-type">+</span>15, <span class="org-type">-</span>60<span class="org-type">-</span>15]<span class="org-type">*</span>(<span class="org-constant">pi</span><span class="org-type">/</span>180));
|
||||||
|
stewart = computeJointsPose(stewart);
|
||||||
|
stewart = initializeFlexibleStrutDynamics(stewart, <span class="org-string">'H'</span>, 0.03, <span class="org-string">'K'</span>, apa.K, <span class="org-string">'M'</span>, apa.M, <span class="org-string">'n_xyz'</span>, apa.n_xyz, <span class="org-string">'xi'</span>, 0.1, <span class="org-string">'step_file'</span>, <span class="org-string">'mat/APA300ML.STEP'</span>);
|
||||||
|
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'K_F'</span>, flex_joint.K, <span class="org-string">'M_F'</span>, flex_joint.M, <span class="org-string">'n_xyz_F'</span>, flex_joint.n_xyz, <span class="org-string">'xi_F'</span>, 0.1, <span class="org-string">'step_file_F'</span>, <span class="org-string">'mat/flexor_ID16.STEP'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'K_M'</span>, flex_joint.K, <span class="org-string">'M_M'</span>, flex_joint.M, <span class="org-string">'n_xyz_M'</span>, flex_joint.n_xyz, <span class="org-string">'xi_M'</span>, 0.1, <span class="org-string">'step_file_M'</span>, <span class="org-string">'mat/flexor_ID16.STEP'</span>);
|
||||||
|
stewart = initializeCylindricalPlatforms(stewart, <span class="org-string">'Fpr'</span>, 150e<span class="org-type">-</span>3, <span class="org-string">'Mpr'</span>, 125e<span class="org-type">-</span>3);
|
||||||
|
stewart = initializeCylindricalStruts(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'none'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'none'</span>);
|
||||||
|
stewart = computeJacobian(stewart);
|
||||||
|
stewart = initializeStewartPose(stewart);
|
||||||
|
stewart = initializeInertialSensor(stewart);
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
|
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'m'</span>, 50);
|
||||||
|
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">disturbances = initializeDisturbances();
|
||||||
|
references = initializeReferences(stewart);
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="postamble" class="status">
|
||||||
|
<p class="author">Author: Dehaeze Thomas</p>
|
||||||
|
<p class="date">Created: 2021-01-08 ven. 15:53</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@@ -3,25 +3,30 @@
|
|||||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||||
<head>
|
<head>
|
||||||
<!-- 2020-08-05 mer. 13:27 -->
|
<!-- 2021-01-08 ven. 15:52 -->
|
||||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
<title>Stewart Platform - Simscape Model</title>
|
<title>Stewart Platform - Simscape Model</title>
|
||||||
<meta name="generator" content="Org mode" />
|
<meta name="generator" content="Org mode" />
|
||||||
<meta name="author" content="Dehaeze Thomas" />
|
<meta name="author" content="Dehaeze Thomas" />
|
||||||
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
<link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
<script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
<script src="./js/jquery.min.js"></script>
|
<script>
|
||||||
<script src="./js/bootstrap.min.js"></script>
|
MathJax = {
|
||||||
<script src="./js/jquery.stickytableheaders.min.js"></script>
|
svg: {
|
||||||
<script src="./js/readtheorg.js"></script>
|
scale: 1,
|
||||||
<script>MathJax = {
|
fontCache: "global"
|
||||||
tex: {
|
},
|
||||||
tags: 'ams',
|
tex: {
|
||||||
macros: {bm: ["\\boldsymbol{#1}",1],}
|
tags: "ams",
|
||||||
}
|
multlineWidth: "%MULTLINEWIDTH",
|
||||||
};
|
tagSide: "right",
|
||||||
</script>
|
macros: {bm: ["\\boldsymbol{#1}",1],},
|
||||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
|
tagIndent: ".8em"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<script id="MathJax-script" async
|
||||||
|
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="org-div-home-and-up">
|
<div id="org-div-home-and-up">
|
||||||
@@ -34,47 +39,47 @@
|
|||||||
<h2>Table of Contents</h2>
|
<h2>Table of Contents</h2>
|
||||||
<div id="text-table-of-contents">
|
<div id="text-table-of-contents">
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orgc6e0b93">1. Parameters used for the Simscape Model</a></li>
|
<li><a href="#org79eeba1">1. Parameters used for the Simscape Model</a></li>
|
||||||
<li><a href="#org66977e8">2. Simulation Configuration - Configuration reference</a></li>
|
<li><a href="#org677dd01">2. Simulation Configuration - Configuration reference</a></li>
|
||||||
<li><a href="#orgb2362eb">3. Subsystem Reference</a></li>
|
<li><a href="#orge89e3e7">3. Subsystem Reference</a></li>
|
||||||
<li><a href="#orgdfad86d">4. Subsystem - Fixed base and Mobile Platform</a></li>
|
<li><a href="#org5f42d80">4. Subsystem - Fixed base and Mobile Platform</a></li>
|
||||||
<li><a href="#org9d4af75">5. Subsystem - Struts</a></li>
|
<li><a href="#orgbec2976">5. Subsystem - Struts</a></li>
|
||||||
<li><a href="#org7e2c432">6. Other Elements</a>
|
<li><a href="#org806ecc3">6. Other Elements</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#org3535b6d">6.1. Payload</a>
|
<li><a href="#orgf4bef70">6.1. Payload</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orgd38089d">Function description</a></li>
|
<li><a href="#org920bdd0">Function description</a></li>
|
||||||
<li><a href="#org5518a84">Optional Parameters</a></li>
|
<li><a href="#orgbc7950f">Optional Parameters</a></li>
|
||||||
<li><a href="#orgeeb8d35">Add Payload Type</a></li>
|
<li><a href="#org4ef4a9f">Add Payload Type</a></li>
|
||||||
<li><a href="#org6d52ffc">Add Stiffness, Damping and Mass properties of the Payload</a></li>
|
<li><a href="#org3243d76">Add Stiffness, Damping and Mass properties of the Payload</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#orgaaed406">6.2. Ground</a>
|
<li><a href="#orgd9e12ef">6.2. Ground</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#org7732939">Function description</a></li>
|
<li><a href="#orgc300ecf">Function description</a></li>
|
||||||
<li><a href="#org480f36e">Optional Parameters</a></li>
|
<li><a href="#org1ee272a">Optional Parameters</a></li>
|
||||||
<li><a href="#orgef7035d">Add Ground Type</a></li>
|
<li><a href="#org2d22970">Add Ground Type</a></li>
|
||||||
<li><a href="#org95633e8">Add Stiffness and Damping properties of the Ground</a></li>
|
<li><a href="#orgf76def4">Add Stiffness and Damping properties of the Ground</a></li>
|
||||||
<li><a href="#org14ff2fc">Rotation Point</a></li>
|
<li><a href="#orgdb67a68">Rotation Point</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#orgae6907a">7. Initialize Disturbances</a>
|
<li><a href="#org6d3b61e">7. Initialize Disturbances</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orge2fa859">Function Declaration and Documentation</a></li>
|
<li><a href="#orgf124972">Function Declaration and Documentation</a></li>
|
||||||
<li><a href="#org6adb628">Optional Parameters</a></li>
|
<li><a href="#org668f4bb">Optional Parameters</a></li>
|
||||||
<li><a href="#org30dc07c">Structure initialization</a></li>
|
<li><a href="#org0f7e4dd">Structure initialization</a></li>
|
||||||
<li><a href="#org0755155">Ground Motion</a></li>
|
<li><a href="#org1a28fcd">Ground Motion</a></li>
|
||||||
<li><a href="#org7617a55">Direct Forces</a></li>
|
<li><a href="#org90b72d6">Direct Forces</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#orgd45a07f">8. Initialize References</a>
|
<li><a href="#org93f2d30">8. Initialize References</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orge5deaa1">Function Declaration and Documentation</a></li>
|
<li><a href="#org81500bb">Function Declaration and Documentation</a></li>
|
||||||
<li><a href="#orgeebb364">Optional Parameters</a></li>
|
<li><a href="#org05322ee">Optional Parameters</a></li>
|
||||||
<li><a href="#orgc274320">8.1. Compute the corresponding strut length</a></li>
|
<li><a href="#org6f05adc">8.1. Compute the corresponding strut length</a></li>
|
||||||
<li><a href="#org36ac3fa">References</a></li>
|
<li><a href="#orgda73a50">References</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -89,18 +94,18 @@ In this document is explained how the Simscape model of the Stewart Platform is
|
|||||||
It is divided in the following sections:
|
It is divided in the following sections:
|
||||||
</p>
|
</p>
|
||||||
<ul class="org-ul">
|
<ul class="org-ul">
|
||||||
<li>section <a href="#org8d965c3">1</a>: is explained how the parameters of the Stewart platform are set for the Simscape model</li>
|
<li>section <a href="#orge8daba9">1</a>: is explained how the parameters of the Stewart platform are set for the Simscape model</li>
|
||||||
<li>section <a href="#org354bfdb">2</a>: the Simulink configuration (solver, simulation time, …) is shared among all the Simulink files. It is explain how this is done.</li>
|
<li>section <a href="#org11ed7ef">2</a>: the Simulink configuration (solver, simulation time, …) is shared among all the Simulink files. It is explain how this is done.</li>
|
||||||
<li>section <a href="#org66bbae2">3</a>: All the elements (platforms, struts, sensors, …) are saved in separate files and imported in Simulink files using “subsystem referenced”.</li>
|
<li>section <a href="#org1a0307c">3</a>: All the elements (platforms, struts, sensors, …) are saved in separate files and imported in Simulink files using “subsystem referenced”.</li>
|
||||||
<li>section <a href="#orga4915c4">4</a>: The simscape model for the fixed base and mobile platform are described in this section.</li>
|
<li>section <a href="#org5fac181">4</a>: The simscape model for the fixed base and mobile platform are described in this section.</li>
|
||||||
<li>section <a href="#orgdb5206f">5</a>: The simscape model for the Stewart platform struts is described in this section.</li>
|
<li>section <a href="#org793a5c7">5</a>: The simscape model for the Stewart platform struts is described in this section.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<div id="outline-container-orgc6e0b93" class="outline-2">
|
<div id="outline-container-org79eeba1" class="outline-2">
|
||||||
<h2 id="orgc6e0b93"><span class="section-number-2">1</span> Parameters used for the Simscape Model</h2>
|
<h2 id="org79eeba1"><span class="section-number-2">1</span> Parameters used for the Simscape Model</h2>
|
||||||
<div class="outline-text-2" id="text-1">
|
<div class="outline-text-2" id="text-1">
|
||||||
<p>
|
<p>
|
||||||
<a id="org8d965c3"></a>
|
<a id="orge8daba9"></a>
|
||||||
The Simscape Model of the Stewart Platform is working with the <code>stewart</code> structure generated using the functions described <a href="stewart-architecture.html">here</a>.
|
The Simscape Model of the Stewart Platform is working with the <code>stewart</code> structure generated using the functions described <a href="stewart-architecture.html">here</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -122,11 +127,11 @@ The main advantage to have all the parameters defined in one structure (and not
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org66977e8" class="outline-2">
|
<div id="outline-container-org677dd01" class="outline-2">
|
||||||
<h2 id="org66977e8"><span class="section-number-2">2</span> Simulation Configuration - Configuration reference</h2>
|
<h2 id="org677dd01"><span class="section-number-2">2</span> Simulation Configuration - Configuration reference</h2>
|
||||||
<div class="outline-text-2" id="text-2">
|
<div class="outline-text-2" id="text-2">
|
||||||
<p>
|
<p>
|
||||||
<a id="org354bfdb"></a>
|
<a id="org11ed7ef"></a>
|
||||||
As multiple simulink files will be used for simulation and tests, it is very useful to determine good simulation configuration that will be <b>shared</b> among all the simulink files.
|
As multiple simulink files will be used for simulation and tests, it is very useful to determine good simulation configuration that will be <b>shared</b> among all the simulink files.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -139,7 +144,7 @@ Basically, the configuration is stored in a mat file <code>conf_simscape.mat</co
|
|||||||
It is automatically loaded when the Simulink project is open. It can be loaded manually with the command:
|
It is automatically loaded when the Simulink project is open. It can be loaded manually with the command:
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">load('mat/conf_simscape.mat');
|
<pre class="src src-matlab">load(<span class="org-string">'mat/conf_simscape.mat'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -147,17 +152,17 @@ It is automatically loaded when the Simulink project is open. It can be loaded m
|
|||||||
It is however possible to modify specific parameters just for one simulation using the <code>set_param</code> command:
|
It is however possible to modify specific parameters just for one simulation using the <code>set_param</code> command:
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">set_param(conf_simscape, 'StopTime', 1);
|
<pre class="src src-matlab"><span class="org-matlab-simulink-keyword">set_param</span>(<span class="org-variable-name">conf_simscape</span>, <span class="org-string">'StopTime'</span>, 1);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgb2362eb" class="outline-2">
|
<div id="outline-container-orge89e3e7" class="outline-2">
|
||||||
<h2 id="orgb2362eb"><span class="section-number-2">3</span> Subsystem Reference</h2>
|
<h2 id="orge89e3e7"><span class="section-number-2">3</span> Subsystem Reference</h2>
|
||||||
<div class="outline-text-2" id="text-3">
|
<div class="outline-text-2" id="text-3">
|
||||||
<p>
|
<p>
|
||||||
<a id="org66bbae2"></a>
|
<a id="org1a0307c"></a>
|
||||||
Several Stewart platform models are used, for instance one is use to study the dynamics while the other is used to apply active damping techniques.
|
Several Stewart platform models are used, for instance one is use to study the dynamics while the other is used to apply active damping techniques.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -175,12 +180,12 @@ These shared subsystems are:
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
These subsystems are referenced from another subsystem called <code>Stewart_Platform.slx</code> shown in figure <a href="#orgf687c71">1</a>, that basically connect them correctly.
|
These subsystems are referenced from another subsystem called <code>Stewart_Platform.slx</code> shown in figure <a href="#org18dcfb1">1</a>, that basically connect them correctly.
|
||||||
This subsystem is then referenced in other simulink models for various purposes (control, analysis, simulation, …).
|
This subsystem is then referenced in other simulink models for various purposes (control, analysis, simulation, …).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<div id="orgf687c71" class="figure">
|
<div id="org18dcfb1" class="figure">
|
||||||
<p><img src="figs/simscape_stewart_platform.png" alt="simscape_stewart_platform.png" />
|
<p><img src="figs/simscape_stewart_platform.png" alt="simscape_stewart_platform.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 1: </span>Simscape Subsystem of the Stewart platform. Encapsulate the Subsystems corresponding to the fixed base, mobile platform and all the struts.</p>
|
<p><span class="figure-number">Figure 1: </span>Simscape Subsystem of the Stewart platform. Encapsulate the Subsystems corresponding to the fixed base, mobile platform and all the struts.</p>
|
||||||
@@ -188,11 +193,11 @@ This subsystem is then referenced in other simulink models for various purposes
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgdfad86d" class="outline-2">
|
<div id="outline-container-org5f42d80" class="outline-2">
|
||||||
<h2 id="orgdfad86d"><span class="section-number-2">4</span> Subsystem - Fixed base and Mobile Platform</h2>
|
<h2 id="org5f42d80"><span class="section-number-2">4</span> Subsystem - Fixed base and Mobile Platform</h2>
|
||||||
<div class="outline-text-2" id="text-4">
|
<div class="outline-text-2" id="text-4">
|
||||||
<p>
|
<p>
|
||||||
<a id="orga4915c4"></a>
|
<a id="org5fac181"></a>
|
||||||
Both the fixed base and the mobile platform simscape models share many similarities.
|
Both the fixed base and the mobile platform simscape models share many similarities.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -210,14 +215,14 @@ As always, the parameters that define the geometry are taken from the <code>stew
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<div id="org858f0b4" class="figure">
|
<div id="org7b43415" class="figure">
|
||||||
<p><img src="figs/simscape_fixed_base.png" alt="simscape_fixed_base.png" width="1000px" />
|
<p><img src="figs/simscape_fixed_base.png" alt="simscape_fixed_base.png" width="1000px" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 2: </span>Simscape Model of the Fixed base</p>
|
<p><span class="figure-number">Figure 2: </span>Simscape Model of the Fixed base</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div id="org4b31aa3" class="figure">
|
<div id="org7ed0d98" class="figure">
|
||||||
<p><img src="figs/simscape_mobile_platform.png" alt="simscape_mobile_platform.png" width="800px" />
|
<p><img src="figs/simscape_mobile_platform.png" alt="simscape_mobile_platform.png" width="800px" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 3: </span>Simscape Model of the Mobile platform</p>
|
<p><span class="figure-number">Figure 3: </span>Simscape Model of the Mobile platform</p>
|
||||||
@@ -225,13 +230,13 @@ As always, the parameters that define the geometry are taken from the <code>stew
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org9d4af75" class="outline-2">
|
<div id="outline-container-orgbec2976" class="outline-2">
|
||||||
<h2 id="org9d4af75"><span class="section-number-2">5</span> Subsystem - Struts</h2>
|
<h2 id="orgbec2976"><span class="section-number-2">5</span> Subsystem - Struts</h2>
|
||||||
<div class="outline-text-2" id="text-5">
|
<div class="outline-text-2" id="text-5">
|
||||||
<p>
|
<p>
|
||||||
<a id="orgdb5206f"></a>
|
<a id="org793a5c7"></a>
|
||||||
For the Stewart platform, the 6 struts are identical.
|
For the Stewart platform, the 6 struts are identical.
|
||||||
Thus, all the struts used in the Stewart platform are referring to the same subsystem called <code>stewart_strut.slx</code> and shown in Figure <a href="#org1dc8fce">4</a>.
|
Thus, all the struts used in the Stewart platform are referring to the same subsystem called <code>stewart_strut.slx</code> and shown in Figure <a href="#org96a73eb">4</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -253,7 +258,7 @@ This is why the <b>UPS</b> configuration is used, but other configuration can be
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<div id="org1dc8fce" class="figure">
|
<div id="org96a73eb" class="figure">
|
||||||
<p><img src="figs/simscape_strut.png" alt="simscape_strut.png" width="800px" />
|
<p><img src="figs/simscape_strut.png" alt="simscape_strut.png" width="800px" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 4: </span>Simscape model of the Stewart platform’s strut</p>
|
<p><span class="figure-number">Figure 4: </span>Simscape model of the Stewart platform’s strut</p>
|
||||||
@@ -282,15 +287,15 @@ Both inertial sensors are described bellow.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org7e2c432" class="outline-2">
|
<div id="outline-container-org806ecc3" class="outline-2">
|
||||||
<h2 id="org7e2c432"><span class="section-number-2">6</span> Other Elements</h2>
|
<h2 id="org806ecc3"><span class="section-number-2">6</span> Other Elements</h2>
|
||||||
<div class="outline-text-2" id="text-6">
|
<div class="outline-text-2" id="text-6">
|
||||||
</div>
|
</div>
|
||||||
<div id="outline-container-org3535b6d" class="outline-3">
|
<div id="outline-container-orgf4bef70" class="outline-3">
|
||||||
<h3 id="org3535b6d"><span class="section-number-3">6.1</span> Payload</h3>
|
<h3 id="orgf4bef70"><span class="section-number-3">6.1</span> Payload</h3>
|
||||||
<div class="outline-text-3" id="text-6-1">
|
<div class="outline-text-3" id="text-6-1">
|
||||||
<p>
|
<p>
|
||||||
<a id="org3a56808"></a>
|
<a id="orgdd9802d"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -298,77 +303,77 @@ This Matlab function is accessible <a href="../src/initializePayload.m">here</a>
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgd38089d" class="outline-4">
|
<div id="outline-container-org920bdd0" class="outline-4">
|
||||||
<h4 id="orgd38089d">Function description</h4>
|
<h4 id="org920bdd0">Function description</h4>
|
||||||
<div class="outline-text-4" id="text-orgd38089d">
|
<div class="outline-text-4" id="text-org920bdd0">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">function [payload] = initializePayload(args)
|
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[payload]</span> = <span class="org-function-name">initializePayload</span>(<span class="org-variable-name">args</span>)
|
||||||
% initializePayload - Initialize the Payload that can then be used for simulations and analysis
|
<span class="org-comment">% initializePayload - Initialize the Payload that can then be used for simulations and analysis</span>
|
||||||
%
|
<span class="org-comment">%</span>
|
||||||
% Syntax: [payload] = initializePayload(args)
|
<span class="org-comment">% Syntax: [payload] = initializePayload(args)</span>
|
||||||
%
|
<span class="org-comment">%</span>
|
||||||
% Inputs:
|
<span class="org-comment">% Inputs:</span>
|
||||||
% - args - Structure with the following fields:
|
<span class="org-comment">% - args - Structure with the following fields:</span>
|
||||||
% - type - 'none', 'rigid', 'flexible', 'cartesian'
|
<span class="org-comment">% - type - 'none', 'rigid', 'flexible', 'cartesian'</span>
|
||||||
% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]
|
<span class="org-comment">% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]</span>
|
||||||
% This also the position where K and C are defined
|
<span class="org-comment">% This also the position where K and C are defined</span>
|
||||||
% - K [6x1] - Stiffness of the Payload [N/m, N/rad]
|
<span class="org-comment">% - K [6x1] - Stiffness of the Payload [N/m, N/rad]</span>
|
||||||
% - C [6x1] - Damping of the Payload [N/(m/s), N/(rad/s)]
|
<span class="org-comment">% - C [6x1] - Damping of the Payload [N/(m/s), N/(rad/s)]</span>
|
||||||
% - m [1x1] - Mass of the Payload [kg]
|
<span class="org-comment">% - m [1x1] - Mass of the Payload [kg]</span>
|
||||||
% - I [3x3] - Inertia matrix for the Payload [kg*m2]
|
<span class="org-comment">% - I [3x3] - Inertia matrix for the Payload [kg*m2]</span>
|
||||||
%
|
<span class="org-comment">%</span>
|
||||||
% Outputs:
|
<span class="org-comment">% Outputs:</span>
|
||||||
% - payload - Struture with the following properties:
|
<span class="org-comment">% - payload - Struture with the following properties:</span>
|
||||||
% - type - 1 (none), 2 (rigid), 3 (flexible)
|
<span class="org-comment">% - type - 1 (none), 2 (rigid), 3 (flexible)</span>
|
||||||
% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]
|
<span class="org-comment">% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]</span>
|
||||||
% - K [6x1] - Stiffness of the Payload [N/m, N/rad]
|
<span class="org-comment">% - K [6x1] - Stiffness of the Payload [N/m, N/rad]</span>
|
||||||
% - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)]
|
<span class="org-comment">% - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)]</span>
|
||||||
% - m [1x1] - Mass of the Payload [kg]
|
<span class="org-comment">% - m [1x1] - Mass of the Payload [kg]</span>
|
||||||
% - I [3x3] - Inertia matrix for the Payload [kg*m2]
|
<span class="org-comment">% - I [3x3] - Inertia matrix for the Payload [kg*m2]</span>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org5518a84" class="outline-4">
|
<div id="outline-container-orgbc7950f" class="outline-4">
|
||||||
<h4 id="org5518a84">Optional Parameters</h4>
|
<h4 id="orgbc7950f">Optional Parameters</h4>
|
||||||
<div class="outline-text-4" id="text-org5518a84">
|
<div class="outline-text-4" id="text-orgbc7950f">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">arguments
|
<pre class="src src-matlab"><span class="org-keyword">arguments</span>
|
||||||
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'cartesian'})} = 'none'
|
<span class="org-variable-name">args</span>.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'cartesian'</span>})} = <span class="org-string">'none'</span>
|
||||||
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(6,1)
|
<span class="org-variable-name">args</span>.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e8<span class="org-type">*</span>ones(6,1)
|
||||||
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
<span class="org-variable-name">args</span>.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1<span class="org-type">*</span>ones(6,1)
|
||||||
args.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e-3
|
<span class="org-variable-name">args</span>.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e<span class="org-type">-</span>3
|
||||||
args.m (1,1) double {mustBeNumeric, mustBeNonnegative} = 10
|
<span class="org-variable-name">args</span>.m (1,1) double {mustBeNumeric, mustBeNonnegative} = 10
|
||||||
args.I (3,3) double {mustBeNumeric, mustBeNonnegative} = 1*eye(3)
|
<span class="org-variable-name">args</span>.I (3,3) double {mustBeNumeric, mustBeNonnegative} = 1<span class="org-type">*</span>eye(3)
|
||||||
end
|
<span class="org-keyword">end</span>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgeeb8d35" class="outline-4">
|
<div id="outline-container-org4ef4a9f" class="outline-4">
|
||||||
<h4 id="orgeeb8d35">Add Payload Type</h4>
|
<h4 id="org4ef4a9f">Add Payload Type</h4>
|
||||||
<div class="outline-text-4" id="text-orgeeb8d35">
|
<div class="outline-text-4" id="text-org4ef4a9f">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">switch args.type
|
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
|
||||||
case 'none'
|
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
|
||||||
payload.type = 1;
|
payload.type = 1;
|
||||||
case 'rigid'
|
<span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
|
||||||
payload.type = 2;
|
payload.type = 2;
|
||||||
case 'flexible'
|
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
|
||||||
payload.type = 3;
|
payload.type = 3;
|
||||||
case 'cartesian'
|
<span class="org-keyword">case</span> <span class="org-string">'cartesian'</span>
|
||||||
payload.type = 4;
|
payload.type = 4;
|
||||||
end
|
<span class="org-keyword">end</span>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org6d52ffc" class="outline-4">
|
<div id="outline-container-org3243d76" class="outline-4">
|
||||||
<h4 id="org6d52ffc">Add Stiffness, Damping and Mass properties of the Payload</h4>
|
<h4 id="org3243d76">Add Stiffness, Damping and Mass properties of the Payload</h4>
|
||||||
<div class="outline-text-4" id="text-org6d52ffc">
|
<div class="outline-text-4" id="text-org3243d76">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">payload.K = args.K;
|
<pre class="src src-matlab">payload.K = args.K;
|
||||||
payload.C = args.C;
|
payload.C = args.C;
|
||||||
@@ -382,11 +387,11 @@ payload.h = args.h;
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgaaed406" class="outline-3">
|
<div id="outline-container-orgd9e12ef" class="outline-3">
|
||||||
<h3 id="orgaaed406"><span class="section-number-3">6.2</span> Ground</h3>
|
<h3 id="orgd9e12ef"><span class="section-number-3">6.2</span> Ground</h3>
|
||||||
<div class="outline-text-3" id="text-6-2">
|
<div class="outline-text-3" id="text-6-2">
|
||||||
<p>
|
<p>
|
||||||
<a id="orge64ba82"></a>
|
<a id="org140423a"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -394,67 +399,67 @@ This Matlab function is accessible <a href="../src/initializeGround.m">here</a>.
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org7732939" class="outline-4">
|
<div id="outline-container-orgc300ecf" class="outline-4">
|
||||||
<h4 id="org7732939">Function description</h4>
|
<h4 id="orgc300ecf">Function description</h4>
|
||||||
<div class="outline-text-4" id="text-org7732939">
|
<div class="outline-text-4" id="text-orgc300ecf">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">function [ground] = initializeGround(args)
|
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[ground]</span> = <span class="org-function-name">initializeGround</span>(<span class="org-variable-name">args</span>)
|
||||||
% initializeGround - Initialize the Ground that can then be used for simulations and analysis
|
<span class="org-comment">% initializeGround - Initialize the Ground that can then be used for simulations and analysis</span>
|
||||||
%
|
<span class="org-comment">%</span>
|
||||||
% Syntax: [ground] = initializeGround(args)
|
<span class="org-comment">% Syntax: [ground] = initializeGround(args)</span>
|
||||||
%
|
<span class="org-comment">%</span>
|
||||||
% Inputs:
|
<span class="org-comment">% Inputs:</span>
|
||||||
% - args - Structure with the following fields:
|
<span class="org-comment">% - args - Structure with the following fields:</span>
|
||||||
% - type - 'none', 'solid', 'flexible'
|
<span class="org-comment">% - type - 'none', 'solid', 'flexible'</span>
|
||||||
% - rot_point [3x1] - Rotation point for the ground motion [m]
|
<span class="org-comment">% - rot_point [3x1] - Rotation point for the ground motion [m]</span>
|
||||||
% - K [3x1] - Translation Stiffness of the Ground [N/m]
|
<span class="org-comment">% - K [3x1] - Translation Stiffness of the Ground [N/m]</span>
|
||||||
% - C [3x1] - Translation Damping of the Ground [N/(m/s)]
|
<span class="org-comment">% - C [3x1] - Translation Damping of the Ground [N/(m/s)]</span>
|
||||||
%
|
<span class="org-comment">%</span>
|
||||||
% Outputs:
|
<span class="org-comment">% Outputs:</span>
|
||||||
% - ground - Struture with the following properties:
|
<span class="org-comment">% - ground - Struture with the following properties:</span>
|
||||||
% - type - 1 (none), 2 (rigid), 3 (flexible)
|
<span class="org-comment">% - type - 1 (none), 2 (rigid), 3 (flexible)</span>
|
||||||
% - K [3x1] - Translation Stiffness of the Ground [N/m]
|
<span class="org-comment">% - K [3x1] - Translation Stiffness of the Ground [N/m]</span>
|
||||||
% - C [3x1] - Translation Damping of the Ground [N/(m/s)]
|
<span class="org-comment">% - C [3x1] - Translation Damping of the Ground [N/(m/s)]</span>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org480f36e" class="outline-4">
|
<div id="outline-container-org1ee272a" class="outline-4">
|
||||||
<h4 id="org480f36e">Optional Parameters</h4>
|
<h4 id="org1ee272a">Optional Parameters</h4>
|
||||||
<div class="outline-text-4" id="text-org480f36e">
|
<div class="outline-text-4" id="text-org1ee272a">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">arguments
|
<pre class="src src-matlab"><span class="org-keyword">arguments</span>
|
||||||
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'none'
|
<span class="org-variable-name">args</span>.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>})} = <span class="org-string">'none'</span>
|
||||||
args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1)
|
<span class="org-variable-name">args</span>.rot_point (3,1) double {mustBeNumeric} = zeros(3,1)
|
||||||
args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(3,1)
|
<span class="org-variable-name">args</span>.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8<span class="org-type">*</span>ones(3,1)
|
||||||
args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(3,1)
|
<span class="org-variable-name">args</span>.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1<span class="org-type">*</span>ones(3,1)
|
||||||
end
|
<span class="org-keyword">end</span>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgef7035d" class="outline-4">
|
<div id="outline-container-org2d22970" class="outline-4">
|
||||||
<h4 id="orgef7035d">Add Ground Type</h4>
|
<h4 id="org2d22970">Add Ground Type</h4>
|
||||||
<div class="outline-text-4" id="text-orgef7035d">
|
<div class="outline-text-4" id="text-org2d22970">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">switch args.type
|
<pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
|
||||||
case 'none'
|
<span class="org-keyword">case</span> <span class="org-string">'none'</span>
|
||||||
ground.type = 1;
|
ground.type = 1;
|
||||||
case 'rigid'
|
<span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
|
||||||
ground.type = 2;
|
ground.type = 2;
|
||||||
case 'flexible'
|
<span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
|
||||||
ground.type = 3;
|
ground.type = 3;
|
||||||
end
|
<span class="org-keyword">end</span>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org95633e8" class="outline-4">
|
<div id="outline-container-orgf76def4" class="outline-4">
|
||||||
<h4 id="org95633e8">Add Stiffness and Damping properties of the Ground</h4>
|
<h4 id="orgf76def4">Add Stiffness and Damping properties of the Ground</h4>
|
||||||
<div class="outline-text-4" id="text-org95633e8">
|
<div class="outline-text-4" id="text-orgf76def4">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">ground.K = args.K;
|
<pre class="src src-matlab">ground.K = args.K;
|
||||||
ground.C = args.C;
|
ground.C = args.C;
|
||||||
@@ -463,9 +468,9 @@ ground.C = args.C;
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org14ff2fc" class="outline-4">
|
<div id="outline-container-orgdb67a68" class="outline-4">
|
||||||
<h4 id="org14ff2fc">Rotation Point</h4>
|
<h4 id="orgdb67a68">Rotation Point</h4>
|
||||||
<div class="outline-text-4" id="text-org14ff2fc">
|
<div class="outline-text-4" id="text-orgdb67a68">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">ground.rot_point = args.rot_point;
|
<pre class="src src-matlab">ground.rot_point = args.rot_point;
|
||||||
</pre>
|
</pre>
|
||||||
@@ -474,50 +479,50 @@ ground.C = args.C;
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="outline-container-orgae6907a" class="outline-2">
|
<div id="outline-container-org6d3b61e" class="outline-2">
|
||||||
<h2 id="orgae6907a"><span class="section-number-2">7</span> Initialize Disturbances</h2>
|
<h2 id="org6d3b61e"><span class="section-number-2">7</span> Initialize Disturbances</h2>
|
||||||
<div class="outline-text-2" id="text-7">
|
<div class="outline-text-2" id="text-7">
|
||||||
<p>
|
<p>
|
||||||
<a id="org96254bf"></a>
|
<a id="org5c942ea"></a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orge2fa859" class="outline-3">
|
<div id="outline-container-orgf124972" class="outline-3">
|
||||||
<h3 id="orge2fa859">Function Declaration and Documentation</h3>
|
<h3 id="orgf124972">Function Declaration and Documentation</h3>
|
||||||
<div class="outline-text-3" id="text-orge2fa859">
|
<div class="outline-text-3" id="text-orgf124972">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">function [disturbances] = initializeDisturbances(args)
|
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[disturbances]</span> = <span class="org-function-name">initializeDisturbances</span>(<span class="org-variable-name">args</span>)
|
||||||
% initializeDisturbances - Initialize the disturbances
|
<span class="org-comment">% initializeDisturbances - Initialize the disturbances</span>
|
||||||
%
|
<span class="org-comment">%</span>
|
||||||
% Syntax: [disturbances] = initializeDisturbances(args)
|
<span class="org-comment">% Syntax: [disturbances] = initializeDisturbances(args)</span>
|
||||||
%
|
<span class="org-comment">%</span>
|
||||||
% Inputs:
|
<span class="org-comment">% Inputs:</span>
|
||||||
% - args -
|
<span class="org-comment">% - args -</span>
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org6adb628" class="outline-3">
|
<div id="outline-container-org668f4bb" class="outline-3">
|
||||||
<h3 id="org6adb628">Optional Parameters</h3>
|
<h3 id="org668f4bb">Optional Parameters</h3>
|
||||||
<div class="outline-text-3" id="text-org6adb628">
|
<div class="outline-text-3" id="text-org668f4bb">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">arguments
|
<pre class="src src-matlab"><span class="org-keyword">arguments</span>
|
||||||
args.Fd double {mustBeNumeric, mustBeReal} = zeros(6,1)
|
<span class="org-variable-name">args</span>.Fd double {mustBeNumeric, mustBeReal} = zeros(6,1)
|
||||||
args.Fd_t double {mustBeNumeric, mustBeReal} = 0
|
<span class="org-variable-name">args</span>.Fd_t double {mustBeNumeric, mustBeReal} = 0
|
||||||
args.Dw double {mustBeNumeric, mustBeReal} = zeros(6,1)
|
<span class="org-variable-name">args</span>.Dw double {mustBeNumeric, mustBeReal} = zeros(6,1)
|
||||||
args.Dw_t double {mustBeNumeric, mustBeReal} = 0
|
<span class="org-variable-name">args</span>.Dw_t double {mustBeNumeric, mustBeReal} = 0
|
||||||
end
|
<span class="org-keyword">end</span>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div id="outline-container-org30dc07c" class="outline-3">
|
<div id="outline-container-org0f7e4dd" class="outline-3">
|
||||||
<h3 id="org30dc07c">Structure initialization</h3>
|
<h3 id="org0f7e4dd">Structure initialization</h3>
|
||||||
<div class="outline-text-3" id="text-org30dc07c">
|
<div class="outline-text-3" id="text-org0f7e4dd">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">disturbances = struct();
|
<pre class="src src-matlab">disturbances = struct();
|
||||||
</pre>
|
</pre>
|
||||||
@@ -525,9 +530,9 @@ end
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org0755155" class="outline-3">
|
<div id="outline-container-org1a28fcd" class="outline-3">
|
||||||
<h3 id="org0755155">Ground Motion</h3>
|
<h3 id="org1a28fcd">Ground Motion</h3>
|
||||||
<div class="outline-text-3" id="text-org0755155">
|
<div class="outline-text-3" id="text-org1a28fcd">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">disturbances.Dw = timeseries([args.Dw], args.Dw_t);
|
<pre class="src src-matlab">disturbances.Dw = timeseries([args.Dw], args.Dw_t);
|
||||||
</pre>
|
</pre>
|
||||||
@@ -535,9 +540,9 @@ end
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org7617a55" class="outline-3">
|
<div id="outline-container-org90b72d6" class="outline-3">
|
||||||
<h3 id="org7617a55">Direct Forces</h3>
|
<h3 id="org90b72d6">Direct Forces</h3>
|
||||||
<div class="outline-text-3" id="text-org7617a55">
|
<div class="outline-text-3" id="text-org90b72d6">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">disturbances.Fd = timeseries([args.Fd], args.Fd_t);
|
<pre class="src src-matlab">disturbances.Fd = timeseries([args.Fd], args.Fd_t);
|
||||||
</pre>
|
</pre>
|
||||||
@@ -546,73 +551,73 @@ end
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgd45a07f" class="outline-2">
|
<div id="outline-container-org93f2d30" class="outline-2">
|
||||||
<h2 id="orgd45a07f"><span class="section-number-2">8</span> Initialize References</h2>
|
<h2 id="org93f2d30"><span class="section-number-2">8</span> Initialize References</h2>
|
||||||
<div class="outline-text-2" id="text-8">
|
<div class="outline-text-2" id="text-8">
|
||||||
<p>
|
<p>
|
||||||
<a id="org7e762f4"></a>
|
<a id="orge24eeb5"></a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orge5deaa1" class="outline-3">
|
<div id="outline-container-org81500bb" class="outline-3">
|
||||||
<h3 id="orge5deaa1">Function Declaration and Documentation</h3>
|
<h3 id="org81500bb">Function Declaration and Documentation</h3>
|
||||||
<div class="outline-text-3" id="text-orge5deaa1">
|
<div class="outline-text-3" id="text-org81500bb">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">function [references] = initializeReferences(stewart, args)
|
<pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[references]</span> = <span class="org-function-name">initializeReferences</span>(<span class="org-variable-name">stewart</span>, <span class="org-variable-name">args</span>)
|
||||||
% initializeReferences - Initialize the references
|
<span class="org-comment">% initializeReferences - Initialize the references</span>
|
||||||
%
|
<span class="org-comment">%</span>
|
||||||
% Syntax: [references] = initializeReferences(args)
|
<span class="org-comment">% Syntax: [references] = initializeReferences(args)</span>
|
||||||
%
|
<span class="org-comment">%</span>
|
||||||
% Inputs:
|
<span class="org-comment">% Inputs:</span>
|
||||||
% - args -
|
<span class="org-comment">% - args -</span>
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgeebb364" class="outline-3">
|
<div id="outline-container-org05322ee" class="outline-3">
|
||||||
<h3 id="orgeebb364">Optional Parameters</h3>
|
<h3 id="org05322ee">Optional Parameters</h3>
|
||||||
<div class="outline-text-3" id="text-orgeebb364">
|
<div class="outline-text-3" id="text-org05322ee">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">arguments
|
<pre class="src src-matlab"><span class="org-keyword">arguments</span>
|
||||||
stewart
|
<span class="org-variable-name">stewart</span>
|
||||||
args.t double {mustBeNumeric, mustBeReal} = 0
|
<span class="org-variable-name">args</span>.t double {mustBeNumeric, mustBeReal} = 0
|
||||||
args.r double {mustBeNumeric, mustBeReal} = zeros(6, 1)
|
<span class="org-variable-name">args</span>.r double {mustBeNumeric, mustBeReal} = zeros(6, 1)
|
||||||
end
|
<span class="org-keyword">end</span>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgc274320" class="outline-3">
|
<div id="outline-container-org6f05adc" class="outline-3">
|
||||||
<h3 id="orgc274320"><span class="section-number-3">8.1</span> Compute the corresponding strut length</h3>
|
<h3 id="org6f05adc"><span class="section-number-3">8.1</span> Compute the corresponding strut length</h3>
|
||||||
<div class="outline-text-3" id="text-8-1">
|
<div class="outline-text-3" id="text-8-1">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">rL = zeros(6, length(args.t));
|
<pre class="src src-matlab">rL = zeros(6, length(args.t));
|
||||||
|
|
||||||
for i = 1:length(args.t)
|
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(args.t)</span>
|
||||||
R = [cos(args.r(6,i)) -sin(args.r(6,i)) 0;
|
R = [cos(args.r(6,<span class="org-constant">i</span>)) <span class="org-type">-</span>sin(args.r(6,<span class="org-constant">i</span>)) 0;
|
||||||
sin(args.r(6,i)) cos(args.r(6,i)) 0;
|
sin(args.r(6,<span class="org-constant">i</span>)) cos(args.r(6,<span class="org-constant">i</span>)) 0;
|
||||||
0 0 1] * ...
|
0 0 1] <span class="org-type">*</span> ...
|
||||||
[cos(args.r(5,i)) 0 sin(args.r(5,i));
|
[cos(args.r(5,<span class="org-constant">i</span>)) 0 sin(args.r(5,<span class="org-constant">i</span>));
|
||||||
0 1 0;
|
0 1 0;
|
||||||
-sin(args.r(5,i)) 0 cos(args.r(5,i))] * ...
|
<span class="org-type">-</span>sin(args.r(5,<span class="org-constant">i</span>)) 0 cos(args.r(5,<span class="org-constant">i</span>))] <span class="org-type">*</span> ...
|
||||||
[1 0 0;
|
[1 0 0;
|
||||||
0 cos(args.r(4,i)) -sin(args.r(4,i));
|
0 cos(args.r(4,<span class="org-constant">i</span>)) <span class="org-type">-</span>sin(args.r(4,<span class="org-constant">i</span>));
|
||||||
0 sin(args.r(4,i)) cos(args.r(4,i))];
|
0 sin(args.r(4,<span class="org-constant">i</span>)) cos(args.r(4,<span class="org-constant">i</span>))];
|
||||||
|
|
||||||
[Li, dLi] = inverseKinematics(stewart, 'AP', [args.r(1,i); args.r(2,i); args.r(3,i)], 'ARB', R);
|
[Li, dLi] = inverseKinematics(stewart, <span class="org-string">'AP'</span>, [args.r(1,<span class="org-constant">i</span>); args.r(2,<span class="org-constant">i</span>); args.r(3,<span class="org-constant">i</span>)], <span class="org-string">'ARB'</span>, R);
|
||||||
rL(:, i) = dLi;
|
rL(<span class="org-type">:</span>, <span class="org-constant">i</span>) = dLi;
|
||||||
end
|
<span class="org-keyword">end</span>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org36ac3fa" class="outline-3">
|
<div id="outline-container-orgda73a50" class="outline-3">
|
||||||
<h3 id="org36ac3fa">References</h3>
|
<h3 id="orgda73a50">References</h3>
|
||||||
<div class="outline-text-3" id="text-org36ac3fa">
|
<div class="outline-text-3" id="text-orgda73a50">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">references.r = timeseries(args.r, args.t);
|
<pre class="src src-matlab">references.r = timeseries(args.r, args.t);
|
||||||
references.rL = timeseries(rL, args.t);
|
references.rL = timeseries(rL, args.t);
|
||||||
@@ -624,7 +629,7 @@ references.rL = timeseries(rL, args.t);
|
|||||||
</div>
|
</div>
|
||||||
<div id="postamble" class="status">
|
<div id="postamble" class="status">
|
||||||
<p class="author">Author: Dehaeze Thomas</p>
|
<p class="author">Author: Dehaeze Thomas</p>
|
||||||
<p class="date">Created: 2020-08-05 mer. 13:27</p>
|
<p class="date">Created: 2021-01-08 ven. 15:52</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@@ -3,17 +3,13 @@
|
|||||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||||
<head>
|
<head>
|
||||||
<!-- 2020-08-05 mer. 13:27 -->
|
<!-- 2021-01-08 ven. 15:52 -->
|
||||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
<title>Simulink Project for the Stewart Simscape folder</title>
|
<title>Simulink Project for the Stewart Simscape folder</title>
|
||||||
<meta name="generator" content="Org mode" />
|
<meta name="generator" content="Org mode" />
|
||||||
<meta name="author" content="Dehaeze Thomas" />
|
<meta name="author" content="Dehaeze Thomas" />
|
||||||
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
<link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
<script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
<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>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="org-div-home-and-up">
|
<div id="org-div-home-and-up">
|
||||||
@@ -49,7 +45,7 @@ The project can be opened using the <code>simulinkproject</code> function:
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">simulinkproject('../');
|
<pre class="src src-matlab">simulinkproject(<span class="org-string">'../'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -61,16 +57,16 @@ The startup script is defined below and is exported to the <code>project_startup
|
|||||||
<pre class="src src-matlab">project = simulinkproject;
|
<pre class="src src-matlab">project = simulinkproject;
|
||||||
projectRoot = project.RootFolder;
|
projectRoot = project.RootFolder;
|
||||||
|
|
||||||
myCacheFolder = fullfile(projectRoot, '.SimulinkCache');
|
myCacheFolder = fullfile(projectRoot, <span class="org-string">'.SimulinkCache'</span>);
|
||||||
myCodeFolder = fullfile(projectRoot, '.SimulinkCode');
|
myCodeFolder = fullfile(projectRoot, <span class="org-string">'.SimulinkCode'</span>);
|
||||||
|
|
||||||
Simulink.fileGenControl('set',...
|
Simulink.fileGenControl(<span class="org-string">'set'</span>,...
|
||||||
'CacheFolder', myCacheFolder,...
|
<span class="org-string">'CacheFolder'</span>, myCacheFolder,...
|
||||||
'CodeGenFolder', myCodeFolder,...
|
<span class="org-string">'CodeGenFolder'</span>, myCodeFolder,...
|
||||||
'createDir', true);
|
<span class="org-string">'createDir'</span>, <span class="org-constant">true</span>);
|
||||||
|
|
||||||
%% Load the Simscape Configuration
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Load the Simscape Configuration</span></span>
|
||||||
load('mat/conf_simscape.mat');
|
load(<span class="org-string">'mat/conf_simscape.mat'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -78,7 +74,7 @@ load('mat/conf_simscape.mat');
|
|||||||
When the project closes, it runs the <code>project_shutdown.m</code> script defined below.
|
When the project closes, it runs the <code>project_shutdown.m</code> script defined below.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">Simulink.fileGenControl('reset');
|
<pre class="src src-matlab">Simulink.fileGenControl(<span class="org-string">'reset'</span>);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -88,7 +84,7 @@ The project also permits to automatically add defined folder to the path when th
|
|||||||
</div>
|
</div>
|
||||||
<div id="postamble" class="status">
|
<div id="postamble" class="status">
|
||||||
<p class="author">Author: Dehaeze Thomas</p>
|
<p class="author">Author: Dehaeze Thomas</p>
|
||||||
<p class="date">Created: 2020-08-05 mer. 13:27</p>
|
<p class="date">Created: 2021-01-08 ven. 15:52</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@@ -3,25 +3,30 @@
|
|||||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||||
<head>
|
<head>
|
||||||
<!-- 2020-08-05 mer. 13:27 -->
|
<!-- 2021-01-08 ven. 15:53 -->
|
||||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
<title>Stewart Platform - Static Analysis</title>
|
<title>Stewart Platform - Static Analysis</title>
|
||||||
<meta name="generator" content="Org mode" />
|
<meta name="generator" content="Org mode" />
|
||||||
<meta name="author" content="Dehaeze Thomas" />
|
<meta name="author" content="Dehaeze Thomas" />
|
||||||
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
<link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
<script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
<script src="./js/jquery.min.js"></script>
|
<script>
|
||||||
<script src="./js/bootstrap.min.js"></script>
|
MathJax = {
|
||||||
<script src="./js/jquery.stickytableheaders.min.js"></script>
|
svg: {
|
||||||
<script src="./js/readtheorg.js"></script>
|
scale: 1,
|
||||||
<script>MathJax = {
|
fontCache: "global"
|
||||||
tex: {
|
},
|
||||||
tags: 'ams',
|
tex: {
|
||||||
macros: {bm: ["\\boldsymbol{#1}",1],}
|
tags: "ams",
|
||||||
}
|
multlineWidth: "%MULTLINEWIDTH",
|
||||||
};
|
tagSide: "right",
|
||||||
</script>
|
macros: {bm: ["\\boldsymbol{#1}",1],},
|
||||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
|
tagIndent: ".8em"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<script id="MathJax-script" async
|
||||||
|
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="org-div-home-and-up">
|
<div id="org-div-home-and-up">
|
||||||
@@ -34,20 +39,20 @@
|
|||||||
<h2>Table of Contents</h2>
|
<h2>Table of Contents</h2>
|
||||||
<div id="text-table-of-contents">
|
<div id="text-table-of-contents">
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orgc502e97">1. Coupling</a></li>
|
<li><a href="#org5d87fd3">1. Coupling</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgc502e97" class="outline-2">
|
<div id="outline-container-org5d87fd3" class="outline-2">
|
||||||
<h2 id="orgc502e97"><span class="section-number-2">1</span> Coupling</h2>
|
<h2 id="org5d87fd3"><span class="section-number-2">1</span> Coupling</h2>
|
||||||
<div class="outline-text-2" id="text-1">
|
<div class="outline-text-2" id="text-1">
|
||||||
<p>
|
<p>
|
||||||
What causes the coupling from \(F_i\) to \(X_i\) ?
|
What causes the coupling from \(F_i\) to \(X_i\) ?
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<div id="org41430df" class="figure">
|
<div id="orgd94ead3" class="figure">
|
||||||
<p><img src="figs/coupling.png" alt="coupling.png" />
|
<p><img src="figs/coupling.png" alt="coupling.png" />
|
||||||
</p>
|
</p>
|
||||||
<p><span class="figure-number">Figure 1: </span>Block diagram to control an hexapod</p>
|
<p><span class="figure-number">Figure 1: </span>Block diagram to control an hexapod</p>
|
||||||
@@ -69,7 +74,7 @@ Thus, the system is uncoupled if \(G\) and \(K\) are diagonal.
|
|||||||
</div>
|
</div>
|
||||||
<div id="postamble" class="status">
|
<div id="postamble" class="status">
|
||||||
<p class="author">Author: Dehaeze Thomas</p>
|
<p class="author">Author: Dehaeze Thomas</p>
|
||||||
<p class="date">Created: 2020-08-05 mer. 13:27</p>
|
<p class="date">Created: 2021-01-08 ven. 15:53</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
BIN
mat/APA300ML.mat
12918
mat/base_plate.STEP
Normal file
BIN
mat/flexor_025.mat
Normal file
4118
mat/flexor_025.step
Executable file
BIN
mat/motion_error_ol.mat
Normal file
BIN
mat/strut_encoder.mat
Normal file
63197
mat/strut_encoder.step
Normal file
11895
mat/top_plate.STEP
Normal file
@@ -23,8 +23,9 @@ stewart = computeJacobian(stewart);
|
|||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'none');
|
stewart = initializeInertialSensor(stewart, 'type', 'none');
|
||||||
|
|
||||||
ground = initializeGround('type', 'none');
|
ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
|
||||||
payload = initializePayload('type', 'none');
|
payload = initializePayload('type', 'none');
|
||||||
|
controller = initializeController('type', 'open-loop');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -58,8 +59,8 @@ figure;
|
|||||||
ax1 = subplot(2, 1, 1);
|
ax1 = subplot(2, 1, 1);
|
||||||
hold on;
|
hold on;
|
||||||
for i = 2:6
|
for i = 2:6
|
||||||
set(gca,'ColorOrderIndex',2);
|
set(gca,'ColorOrderIndex',2);
|
||||||
plot(freqs, abs(squeeze(freqresp(G(['Dm', num2str(i)], 'F1'), freqs, 'Hz'))));
|
plot(freqs, abs(squeeze(freqresp(G(['Dm', num2str(i)], 'F1'), freqs, 'Hz'))));
|
||||||
end
|
end
|
||||||
set(gca,'ColorOrderIndex',1);
|
set(gca,'ColorOrderIndex',1);
|
||||||
plot(freqs, abs(squeeze(freqresp(G('Dm1', 'F1'), freqs, 'Hz'))));
|
plot(freqs, abs(squeeze(freqresp(G('Dm1', 'F1'), freqs, 'Hz'))));
|
||||||
@@ -70,8 +71,8 @@ ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
|||||||
ax2 = subplot(2, 1, 2);
|
ax2 = subplot(2, 1, 2);
|
||||||
hold on;
|
hold on;
|
||||||
for i = 2:6
|
for i = 2:6
|
||||||
set(gca,'ColorOrderIndex',2);
|
set(gca,'ColorOrderIndex',2);
|
||||||
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(['Dm', num2str(i)], 'F1'), freqs, 'Hz'))));
|
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(['Dm', num2str(i)], 'F1'), freqs, 'Hz'))));
|
||||||
end
|
end
|
||||||
set(gca,'ColorOrderIndex',1);
|
set(gca,'ColorOrderIndex',1);
|
||||||
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G('Dm1', 'F1'), freqs, 'Hz'))));
|
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G('Dm1', 'F1'), freqs, 'Hz'))));
|
||||||
@@ -156,17 +157,17 @@ plot(real(tzero(G)), imag(tzero(G)), 'o');
|
|||||||
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
|
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
|
||||||
plot(real(tzero(Ga)), imag(tzero(Gf)), 'o');
|
plot(real(tzero(Ga)), imag(tzero(Gf)), 'o');
|
||||||
for i = 1:length(gains)
|
for i = 1:length(gains)
|
||||||
set(gca,'ColorOrderIndex',1);
|
set(gca,'ColorOrderIndex',1);
|
||||||
cl_poles = pole(feedback(G, (gains(i)*s)*eye(6)));
|
cl_poles = pole(feedback(G, (gains(i)*s)*eye(6)));
|
||||||
p1 = plot(real(cl_poles), imag(cl_poles), '.');
|
p1 = plot(real(cl_poles), imag(cl_poles), '.');
|
||||||
|
|
||||||
set(gca,'ColorOrderIndex',2);
|
set(gca,'ColorOrderIndex',2);
|
||||||
cl_poles = pole(feedback(Gf, (gains(i)*s)*eye(6)));
|
cl_poles = pole(feedback(Gf, (gains(i)*s)*eye(6)));
|
||||||
p2 = plot(real(cl_poles), imag(cl_poles), '.');
|
p2 = plot(real(cl_poles), imag(cl_poles), '.');
|
||||||
|
|
||||||
set(gca,'ColorOrderIndex',3);
|
set(gca,'ColorOrderIndex',3);
|
||||||
cl_poles = pole(feedback(Ga, (gains(i)*s)*eye(6)));
|
cl_poles = pole(feedback(Ga, (gains(i)*s)*eye(6)));
|
||||||
p3 = plot(real(cl_poles), imag(cl_poles), '.');
|
p3 = plot(real(cl_poles), imag(cl_poles), '.');
|
||||||
end
|
end
|
||||||
ylim([0, 1.1*max(imag(pole(G)))]);
|
ylim([0, 1.1*max(imag(pole(G)))]);
|
||||||
xlim([-1.1*max(imag(pole(G))),0]);
|
xlim([-1.1*max(imag(pole(G))),0]);
|
||||||
|
@@ -23,17 +23,14 @@ stewart = computeJacobian(stewart);
|
|||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'none');
|
stewart = initializeInertialSensor(stewart, 'type', 'none');
|
||||||
|
|
||||||
ground = initializeGround('type', 'none');
|
ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
|
||||||
payload = initializePayload('type', 'none');
|
payload = initializePayload('type', 'none');
|
||||||
|
controller = initializeController('type', 'open-loop');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% And we identify the dynamics from force actuators to force sensors.
|
% And we identify the dynamics from force actuators to force sensors.
|
||||||
|
|
||||||
%% Options for Linearized
|
|
||||||
options = linearizeOptions;
|
|
||||||
options.SampleTime = 0;
|
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'stewart_platform_model';
|
mdl = 'stewart_platform_model';
|
||||||
|
|
||||||
@@ -43,7 +40,7 @@ io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1;
|
|||||||
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'Taum'); io_i = io_i + 1; % Force Sensor Outputs [N]
|
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'Taum'); io_i = io_i + 1; % Force Sensor Outputs [N]
|
||||||
|
|
||||||
%% Run the linearization
|
%% Run the linearization
|
||||||
G = linearize(mdl, io, options);
|
G = linearize(mdl, io);
|
||||||
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
||||||
G.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
|
G.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
|
||||||
|
|
||||||
@@ -58,8 +55,8 @@ figure;
|
|||||||
ax1 = subplot(2, 1, 1);
|
ax1 = subplot(2, 1, 1);
|
||||||
hold on;
|
hold on;
|
||||||
for i = 2:6
|
for i = 2:6
|
||||||
set(gca,'ColorOrderIndex',2);
|
set(gca,'ColorOrderIndex',2);
|
||||||
plot(freqs, abs(squeeze(freqresp(G(['Fm', num2str(i)], 'F1'), freqs, 'Hz'))));
|
plot(freqs, abs(squeeze(freqresp(G(['Fm', num2str(i)], 'F1'), freqs, 'Hz'))));
|
||||||
end
|
end
|
||||||
set(gca,'ColorOrderIndex',1);
|
set(gca,'ColorOrderIndex',1);
|
||||||
plot(freqs, abs(squeeze(freqresp(G('Fm1', 'F1'), freqs, 'Hz'))));
|
plot(freqs, abs(squeeze(freqresp(G('Fm1', 'F1'), freqs, 'Hz'))));
|
||||||
@@ -70,8 +67,8 @@ ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]);
|
|||||||
ax2 = subplot(2, 1, 2);
|
ax2 = subplot(2, 1, 2);
|
||||||
hold on;
|
hold on;
|
||||||
for i = 2:6
|
for i = 2:6
|
||||||
set(gca,'ColorOrderIndex',2);
|
set(gca,'ColorOrderIndex',2);
|
||||||
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(['Fm', num2str(i)], 'F1'), freqs, 'Hz'))));
|
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(['Fm', num2str(i)], 'F1'), freqs, 'Hz'))));
|
||||||
end
|
end
|
||||||
set(gca,'ColorOrderIndex',1);
|
set(gca,'ColorOrderIndex',1);
|
||||||
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G('Fm1', 'F1'), freqs, 'Hz'))));
|
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G('Fm1', 'F1'), freqs, 'Hz'))));
|
||||||
@@ -88,7 +85,7 @@ linkaxes([ax1,ax2],'x');
|
|||||||
% We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
|
% We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
|
||||||
|
|
||||||
stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
|
stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
|
||||||
Gf = linearize(mdl, io, options);
|
Gf = linearize(mdl, io);
|
||||||
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
||||||
Gf.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
|
Gf.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
|
||||||
|
|
||||||
@@ -97,7 +94,7 @@ Gf.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
|
|||||||
% We now use the amplified actuators and re-identify the dynamics
|
% We now use the amplified actuators and re-identify the dynamics
|
||||||
|
|
||||||
stewart = initializeAmplifiedStrutDynamics(stewart);
|
stewart = initializeAmplifiedStrutDynamics(stewart);
|
||||||
Ga = linearize(mdl, io, options);
|
Ga = linearize(mdl, io);
|
||||||
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
||||||
Ga.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
|
Ga.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
|
||||||
|
|
||||||
@@ -156,17 +153,17 @@ plot(real(tzero(G)), imag(tzero(G)), 'o');
|
|||||||
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
|
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
|
||||||
plot(real(tzero(Ga)), imag(tzero(Ga)), 'o');
|
plot(real(tzero(Ga)), imag(tzero(Ga)), 'o');
|
||||||
for i = 1:length(gains)
|
for i = 1:length(gains)
|
||||||
cl_poles = pole(feedback(G, (gains(i)/s)*eye(6)));
|
cl_poles = pole(feedback(G, (gains(i)/s)*eye(6)));
|
||||||
set(gca,'ColorOrderIndex',1);
|
set(gca,'ColorOrderIndex',1);
|
||||||
p1 = plot(real(cl_poles), imag(cl_poles), '.');
|
p1 = plot(real(cl_poles), imag(cl_poles), '.');
|
||||||
|
|
||||||
cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6)));
|
cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6)));
|
||||||
set(gca,'ColorOrderIndex',2);
|
set(gca,'ColorOrderIndex',2);
|
||||||
p2 = plot(real(cl_poles), imag(cl_poles), '.');
|
p2 = plot(real(cl_poles), imag(cl_poles), '.');
|
||||||
|
|
||||||
cl_poles = pole(feedback(Ga, (gains(i)/s)*eye(6)));
|
cl_poles = pole(feedback(Ga, (gains(i)/s)*eye(6)));
|
||||||
set(gca,'ColorOrderIndex',3);
|
set(gca,'ColorOrderIndex',3);
|
||||||
p3 = plot(real(cl_poles), imag(cl_poles), '.');
|
p3 = plot(real(cl_poles), imag(cl_poles), '.');
|
||||||
end
|
end
|
||||||
ylim([0, 1.1*max(imag(pole(G)))]);
|
ylim([0, 1.1*max(imag(pole(G)))]);
|
||||||
xlim([-1.1*max(imag(pole(G))),0]);
|
xlim([-1.1*max(imag(pole(G))),0]);
|
||||||
@@ -187,20 +184,20 @@ gains = logspace(0, 5, 1000);
|
|||||||
figure;
|
figure;
|
||||||
hold on;
|
hold on;
|
||||||
for i = 1:length(gains)
|
for i = 1:length(gains)
|
||||||
set(gca,'ColorOrderIndex',1);
|
set(gca,'ColorOrderIndex',1);
|
||||||
cl_poles = pole(feedback(G, (gains(i)/s)*eye(6)));
|
cl_poles = pole(feedback(G, (gains(i)/s)*eye(6)));
|
||||||
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
|
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
|
||||||
p1 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
|
p1 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
|
||||||
|
|
||||||
set(gca,'ColorOrderIndex',2);
|
set(gca,'ColorOrderIndex',2);
|
||||||
cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6)));
|
cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6)));
|
||||||
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
|
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
|
||||||
p2 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
|
p2 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
|
||||||
|
|
||||||
set(gca,'ColorOrderIndex',3);
|
set(gca,'ColorOrderIndex',3);
|
||||||
cl_poles = pole(feedback(Ga, (gains(i)/s)*eye(6)));
|
cl_poles = pole(feedback(Ga, (gains(i)/s)*eye(6)));
|
||||||
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
|
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
|
||||||
p3 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
|
p3 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
|
||||||
end
|
end
|
||||||
xlabel('Control Gain');
|
xlabel('Control Gain');
|
||||||
ylabel('Damping of the Poles');
|
ylabel('Damping of the Poles');
|
||||||
|
@@ -22,8 +22,9 @@ stewart = computeJacobian(stewart);
|
|||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
|
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
|
||||||
|
|
||||||
ground = initializeGround('type', 'none');
|
ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
|
||||||
payload = initializePayload('type', 'none');
|
payload = initializePayload('type', 'none');
|
||||||
|
controller = initializeController('type', 'open-loop');
|
||||||
|
|
||||||
%% Options for Linearized
|
%% Options for Linearized
|
||||||
options = linearizeOptions;
|
options = linearizeOptions;
|
||||||
@@ -53,8 +54,8 @@ figure;
|
|||||||
ax1 = subplot(2, 1, 1);
|
ax1 = subplot(2, 1, 1);
|
||||||
hold on;
|
hold on;
|
||||||
for i = 2:6
|
for i = 2:6
|
||||||
set(gca,'ColorOrderIndex',2);
|
set(gca,'ColorOrderIndex',2);
|
||||||
plot(freqs, abs(squeeze(freqresp(G(['Vm', num2str(i)], 'F1'), freqs, 'Hz'))));
|
plot(freqs, abs(squeeze(freqresp(G(['Vm', num2str(i)], 'F1'), freqs, 'Hz'))));
|
||||||
end
|
end
|
||||||
set(gca,'ColorOrderIndex',1);
|
set(gca,'ColorOrderIndex',1);
|
||||||
plot(freqs, abs(squeeze(freqresp(G('Vm1', 'F1'), freqs, 'Hz'))));
|
plot(freqs, abs(squeeze(freqresp(G('Vm1', 'F1'), freqs, 'Hz'))));
|
||||||
@@ -65,8 +66,8 @@ ylabel('Amplitude [$\frac{m/s}{N}$]'); set(gca, 'XTickLabel',[]);
|
|||||||
ax2 = subplot(2, 1, 2);
|
ax2 = subplot(2, 1, 2);
|
||||||
hold on;
|
hold on;
|
||||||
for i = 2:6
|
for i = 2:6
|
||||||
set(gca,'ColorOrderIndex',2);
|
set(gca,'ColorOrderIndex',2);
|
||||||
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(['Vm', num2str(i)], 'F1'), freqs, 'Hz'))));
|
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(['Vm', num2str(i)], 'F1'), freqs, 'Hz'))));
|
||||||
end
|
end
|
||||||
set(gca,'ColorOrderIndex',1);
|
set(gca,'ColorOrderIndex',1);
|
||||||
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G('Vm1', 'F1'), freqs, 'Hz'))));
|
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G('Vm1', 'F1'), freqs, 'Hz'))));
|
||||||
@@ -151,17 +152,17 @@ plot(real(tzero(G)), imag(tzero(G)), 'o');
|
|||||||
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
|
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
|
||||||
plot(real(tzero(Ga)), imag(tzero(Ga)), 'o');
|
plot(real(tzero(Ga)), imag(tzero(Ga)), 'o');
|
||||||
for i = 1:length(gains)
|
for i = 1:length(gains)
|
||||||
set(gca,'ColorOrderIndex',1);
|
set(gca,'ColorOrderIndex',1);
|
||||||
cl_poles = pole(feedback(G, gains(i)*eye(6)));
|
cl_poles = pole(feedback(G, gains(i)*eye(6)));
|
||||||
p1 = plot(real(cl_poles), imag(cl_poles), '.');
|
p1 = plot(real(cl_poles), imag(cl_poles), '.');
|
||||||
|
|
||||||
set(gca,'ColorOrderIndex',2);
|
set(gca,'ColorOrderIndex',2);
|
||||||
cl_poles = pole(feedback(Gf, gains(i)*eye(6)));
|
cl_poles = pole(feedback(Gf, gains(i)*eye(6)));
|
||||||
p2 = plot(real(cl_poles), imag(cl_poles), '.');
|
p2 = plot(real(cl_poles), imag(cl_poles), '.');
|
||||||
|
|
||||||
set(gca,'ColorOrderIndex',3);
|
set(gca,'ColorOrderIndex',3);
|
||||||
cl_poles = pole(feedback(Ga, gains(i)*eye(6)));
|
cl_poles = pole(feedback(Ga, gains(i)*eye(6)));
|
||||||
p3 = plot(real(cl_poles), imag(cl_poles), '.');
|
p3 = plot(real(cl_poles), imag(cl_poles), '.');
|
||||||
end
|
end
|
||||||
ylim([0, 3*max(imag(pole(G)))]);
|
ylim([0, 3*max(imag(pole(G)))]);
|
||||||
xlim([-3*max(imag(pole(G))),0]);
|
xlim([-3*max(imag(pole(G))),0]);
|
||||||
|
@@ -9,12 +9,8 @@
|
|||||||
#+HTML_LINK_HOME: ./index.html
|
#+HTML_LINK_HOME: ./index.html
|
||||||
#+HTML_LINK_UP: ./index.html
|
#+HTML_LINK_UP: ./index.html
|
||||||
|
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
|
|
||||||
|
|
||||||
#+PROPERTY: header-args:matlab :session *MATLAB*
|
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||||||
#+PROPERTY: header-args:matlab+ :comments org
|
#+PROPERTY: header-args:matlab+ :comments org
|
||||||
|
@@ -9,12 +9,8 @@
|
|||||||
#+HTML_LINK_HOME: ./index.html
|
#+HTML_LINK_HOME: ./index.html
|
||||||
#+HTML_LINK_UP: ./index.html
|
#+HTML_LINK_UP: ./index.html
|
||||||
|
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
|
|
||||||
|
|
||||||
#+PROPERTY: header-args:matlab :session *MATLAB*
|
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||||||
#+PROPERTY: header-args:matlab+ :comments org
|
#+PROPERTY: header-args:matlab+ :comments org
|
||||||
@@ -44,111 +40,111 @@ In this section, we wish to compare the effect of forces/torques applied by the
|
|||||||
|
|
||||||
** Matlab Init :noexport:ignore:
|
** Matlab Init :noexport:ignore:
|
||||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||||
<<matlab-dir>>
|
<<matlab-dir>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent :noweb yes
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||||||
<<matlab-init>>
|
<<matlab-init>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
simulinkproject('../');
|
simulinkproject('../');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
open('stewart_platform_model.slx')
|
open('stewart_platform_model.slx')
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Comparison with fixed support
|
** Comparison with fixed support
|
||||||
Let's generate a Stewart platform.
|
Let's generate a Stewart platform.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
stewart = initializeStewartPlatform();
|
stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'none');
|
stewart = initializeInertialSensor(stewart, 'type', 'none');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
We don't put any flexibility below the Stewart platform such that *its base is fixed to an inertial frame*.
|
We don't put any flexibility below the Stewart platform such that *its base is fixed to an inertial frame*.
|
||||||
We also don't put any payload on top of the Stewart platform.
|
We also don't put any payload on top of the Stewart platform.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
ground = initializeGround('type', 'none');
|
ground = initializeGround('type', 'none');
|
||||||
payload = initializePayload('type', 'none');
|
payload = initializePayload('type', 'none');
|
||||||
controller = initializeController('type', 'open-loop');
|
controller = initializeController('type', 'open-loop');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
The transfer function from actuator forces $\bm{\tau}$ to the relative displacement of the mobile platform $\mathcal{\bm{X}}$ is extracted.
|
The transfer function from actuator forces $\bm{\tau}$ to the relative displacement of the mobile platform $\mathcal{\bm{X}}$ is extracted.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
%% Options for Linearized
|
%% Options for Linearized
|
||||||
options = linearizeOptions;
|
options = linearizeOptions;
|
||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'stewart_platform_model';
|
mdl = 'stewart_platform_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
||||||
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
||||||
|
|
||||||
%% Run the linearization
|
%% Run the linearization
|
||||||
G = linearize(mdl, io, options);
|
G = linearize(mdl, io, options);
|
||||||
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
||||||
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
Using the Jacobian matrix, we compute the transfer function from force/torques applied by the actuators on the frame $\{B\}$ fixed to the mobile platform:
|
Using the Jacobian matrix, we compute the transfer function from force/torques applied by the actuators on the frame $\{B\}$ fixed to the mobile platform:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Gc = minreal(G*inv(stewart.kinematics.J'));
|
Gc = minreal(G*inv(stewart.kinematics.J'));
|
||||||
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
|
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
We also extract the transfer function from external forces $\bm{\mathcal{F}}_{\text{ext}}$ on the frame $\{B\}$ fixed to the mobile platform to the relative displacement $\mathcal{\bm{X}}$ of $\{B\}$ with respect to frame $\{A\}$:
|
We also extract the transfer function from external forces $\bm{\mathcal{F}}_{\text{ext}}$ on the frame $\{B\}$ fixed to the mobile platform to the relative displacement $\mathcal{\bm{X}}$ of $\{B\}$ with respect to frame $\{A\}$:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext'); io_i = io_i + 1; % External forces/torques applied on {B}
|
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext'); io_i = io_i + 1; % External forces/torques applied on {B}
|
||||||
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
||||||
|
|
||||||
%% Run the linearization
|
%% Run the linearization
|
||||||
Gd = linearize(mdl, io, options);
|
Gd = linearize(mdl, io, options);
|
||||||
Gd.InputName = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
|
Gd.InputName = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
|
||||||
Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
The comparison of the two transfer functions is shown in Figure [[fig:comparison_Fext_F_fixed_base]].
|
The comparison of the two transfer functions is shown in Figure [[fig:comparison_Fext_F_fixed_base]].
|
||||||
|
|
||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
freqs = logspace(1, 4, 1000);
|
freqs = logspace(1, 4, 1000);
|
||||||
|
|
||||||
figure;
|
figure;
|
||||||
|
|
||||||
ax1 = subplot(2, 1, 1);
|
ax1 = subplot(2, 1, 1);
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-');
|
plot(freqs, abs(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-');
|
||||||
plot(freqs, abs(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--');
|
plot(freqs, abs(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--');
|
||||||
hold off;
|
hold off;
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||||
|
|
||||||
ax2 = subplot(2, 1, 2);
|
ax2 = subplot(2, 1, 2);
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-');
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--');
|
||||||
hold off;
|
hold off;
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
ylim([-180, 180]);
|
ylim([-180, 180]);
|
||||||
yticks([-180, -90, 0, 90, 180]);
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
legend({'$\mathcal{X}_{x}/\mathcal{F}_{x}$', '$\mathcal{X}_{x}/\mathcal{F}_{x,ext}$'});
|
legend({'$\mathcal{X}_{x}/\mathcal{F}_{x}$', '$\mathcal{X}_{x}/\mathcal{F}_{x,ext}$'});
|
||||||
|
|
||||||
linkaxes([ax1,ax2],'x');
|
linkaxes([ax1,ax2],'x');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+header: :tangle no :exports results :results none :noweb yes
|
#+header: :tangle no :exports results :results none :noweb yes
|
||||||
@@ -163,19 +159,19 @@ The comparison of the two transfer functions is shown in Figure [[fig:comparison
|
|||||||
This can be understood from figure [[fig:1dof_actuator_external_forces]] where $\mathcal{F}_{x}$ and $\mathcal{F}_{x,\text{ext}}$ have clearly the same effect on $\mathcal{X}_{x}$.
|
This can be understood from figure [[fig:1dof_actuator_external_forces]] where $\mathcal{F}_{x}$ and $\mathcal{F}_{x,\text{ext}}$ have clearly the same effect on $\mathcal{X}_{x}$.
|
||||||
|
|
||||||
#+begin_src latex :file 1dof_actuator_external_forces.pdf
|
#+begin_src latex :file 1dof_actuator_external_forces.pdf
|
||||||
\begin{tikzpicture}
|
\begin{tikzpicture}
|
||||||
\draw[ground] (-1, 0) -- (1, 0);
|
\draw[ground] (-1, 0) -- (1, 0);
|
||||||
|
|
||||||
\draw[spring] (-0.6, 0) -- (-0.6, 1.5) node[midway, left=0.1]{$k$};
|
\draw[spring] (-0.6, 0) -- (-0.6, 1.5) node[midway, left=0.1]{$k$};
|
||||||
\draw[actuator] ( 0.6, 0) -- ( 0.6, 1.5) node[midway, left=0.1](F){$\mathcal{F}_{x}$};
|
\draw[actuator] ( 0.6, 0) -- ( 0.6, 1.5) node[midway, left=0.1](F){$\mathcal{F}_{x}$};
|
||||||
|
|
||||||
\draw[fill=white] (-1, 1.5) rectangle (1, 2) node[pos=0.5]{$m$};
|
\draw[fill=white] (-1, 1.5) rectangle (1, 2) node[pos=0.5]{$m$};
|
||||||
|
|
||||||
\draw[dashed] (1, 2) -- ++(0.5, 0);
|
\draw[dashed] (1, 2) -- ++(0.5, 0);
|
||||||
\draw[->] (1.5, 2) -- ++(0, 0.5) node[right]{$\mathcal{X}_{x}$};
|
\draw[->] (1.5, 2) -- ++(0, 0.5) node[right]{$\mathcal{X}_{x}$};
|
||||||
|
|
||||||
\draw[->] (0, 2) node[]{$\bullet$} -- (0, 2.8) node[below right]{$\mathcal{F}_{x,\text{ext}}$};
|
\draw[->] (0, 2) node[]{$\bullet$} -- (0, 2.8) node[below right]{$\mathcal{F}_{x,\text{ext}}$};
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:1dof_actuator_external_forces
|
#+name: fig:1dof_actuator_external_forces
|
||||||
@@ -186,62 +182,62 @@ This can be understood from figure [[fig:1dof_actuator_external_forces]] where $
|
|||||||
** Comparison with a flexible support
|
** Comparison with a flexible support
|
||||||
We now add a flexible support under the Stewart platform.
|
We now add a flexible support under the Stewart platform.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
ground = initializeGround('type', 'flexible');
|
ground = initializeGround('type', 'flexible');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
And we perform again the identification.
|
And we perform again the identification.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
||||||
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
||||||
|
|
||||||
%% Run the linearization
|
%% Run the linearization
|
||||||
G = linearize(mdl, io, options);
|
G = linearize(mdl, io, options);
|
||||||
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
||||||
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
||||||
|
|
||||||
Gc = minreal(G*inv(stewart.kinematics.J'));
|
Gc = minreal(G*inv(stewart.kinematics.J'));
|
||||||
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
|
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext'); io_i = io_i + 1; % External forces/torques applied on {B}
|
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext'); io_i = io_i + 1; % External forces/torques applied on {B}
|
||||||
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
||||||
|
|
||||||
%% Run the linearization
|
%% Run the linearization
|
||||||
Gd = linearize(mdl, io, options);
|
Gd = linearize(mdl, io, options);
|
||||||
Gd.InputName = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
|
Gd.InputName = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
|
||||||
Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
The comparison between the obtained transfer functions is shown in Figure [[fig:comparison_Fext_F_flexible_base]].
|
The comparison between the obtained transfer functions is shown in Figure [[fig:comparison_Fext_F_flexible_base]].
|
||||||
|
|
||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
freqs = logspace(1, 4, 1000);
|
freqs = logspace(1, 4, 1000);
|
||||||
|
|
||||||
figure;
|
figure;
|
||||||
|
|
||||||
ax1 = subplot(2, 1, 1);
|
ax1 = subplot(2, 1, 1);
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-');
|
plot(freqs, abs(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-');
|
||||||
plot(freqs, abs(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--');
|
plot(freqs, abs(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--');
|
||||||
hold off;
|
hold off;
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||||
|
|
||||||
ax2 = subplot(2, 1, 2);
|
ax2 = subplot(2, 1, 2);
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-');
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--');
|
||||||
hold off;
|
hold off;
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
ylim([-180, 180]);
|
ylim([-180, 180]);
|
||||||
yticks([-180, -90, 0, 90, 180]);
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
legend({'$\mathcal{X}_{x}/\mathcal{F}_{x}$', '$\mathcal{X}_{x}/\mathcal{F}_{x,ext}$'});
|
legend({'$\mathcal{X}_{x}/\mathcal{F}_{x}$', '$\mathcal{X}_{x}/\mathcal{F}_{x,ext}$'});
|
||||||
|
|
||||||
linkaxes([ax1,ax2],'x');
|
linkaxes([ax1,ax2],'x');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+header: :tangle no :exports results :results none :noweb yes
|
#+header: :tangle no :exports results :results none :noweb yes
|
||||||
@@ -258,22 +254,22 @@ We see that $\mathcal{F}_{x}$ applies a force both on $m$ and $m^{\prime}$ where
|
|||||||
And thus $\mathcal{F}_{x}$ and $\mathcal{F}_{x,\text{ext}}$ have clearly *not* the same effect on $\mathcal{X}_{x}$.
|
And thus $\mathcal{F}_{x}$ and $\mathcal{F}_{x,\text{ext}}$ have clearly *not* the same effect on $\mathcal{X}_{x}$.
|
||||||
|
|
||||||
#+begin_src latex :file 2dof_actuator_external_forces.pdf
|
#+begin_src latex :file 2dof_actuator_external_forces.pdf
|
||||||
\begin{tikzpicture}
|
\begin{tikzpicture}
|
||||||
\draw[ground] (-1, 0) -- (1, 0);
|
\draw[ground] (-1, 0) -- (1, 0);
|
||||||
|
|
||||||
\draw[spring] (0, 0) -- (0, 1.5) node[midway, left=0.1]{$k^{\prime}$};
|
\draw[spring] (0, 0) -- (0, 1.5) node[midway, left=0.1]{$k^{\prime}$};
|
||||||
\draw[fill=white] (-1, 1.5) rectangle (1, 2) node[pos=0.5]{$m^{\prime}$};
|
\draw[fill=white] (-1, 1.5) rectangle (1, 2) node[pos=0.5]{$m^{\prime}$};
|
||||||
|
|
||||||
\draw[spring] (-0.6, 2) -- (-0.6, 3.5) node[midway, left=0.1]{$k$};
|
\draw[spring] (-0.6, 2) -- (-0.6, 3.5) node[midway, left=0.1]{$k$};
|
||||||
\draw[actuator] ( 0.6, 2) -- ( 0.6, 3.5) node[midway, left=0.1](F){$\mathcal{F}_{x}$};
|
\draw[actuator] ( 0.6, 2) -- ( 0.6, 3.5) node[midway, left=0.1](F){$\mathcal{F}_{x}$};
|
||||||
|
|
||||||
\draw[fill=white] (-1, 3.5) rectangle (1, 4) node[pos=0.5]{$m$};
|
\draw[fill=white] (-1, 3.5) rectangle (1, 4) node[pos=0.5]{$m$};
|
||||||
|
|
||||||
\draw[dashed] (1, 4) -- ++(0.5, 0);
|
\draw[dashed] (1, 4) -- ++(0.5, 0);
|
||||||
\draw[->] (1.5, 4) -- ++(0, 0.5) node[right]{$\mathcal{X}_{x}$};
|
\draw[->] (1.5, 4) -- ++(0, 0.5) node[right]{$\mathcal{X}_{x}$};
|
||||||
|
|
||||||
\draw[->] (0, 4) node[]{$\bullet$} -- (0, 4.8) node[below right]{$\mathcal{F}_{x,\text{ext}}$};
|
\draw[->] (0, 4) node[]{$\bullet$} -- (0, 4.8) node[below right]{$\mathcal{F}_{x,\text{ext}}$};
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:2dof_actuator_external_forces
|
#+name: fig:2dof_actuator_external_forces
|
||||||
@@ -293,67 +289,67 @@ In this section, we see how the Compliance matrix of the Stewart platform is lin
|
|||||||
|
|
||||||
** Matlab Init :noexport:ignore:
|
** Matlab Init :noexport:ignore:
|
||||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||||
<<matlab-dir>>
|
<<matlab-dir>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent :noweb yes
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||||||
<<matlab-init>>
|
<<matlab-init>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
simulinkproject('../');
|
simulinkproject('../');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
open('stewart_platform_model.slx')
|
open('stewart_platform_model.slx')
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Analysis
|
** Analysis
|
||||||
Initialization of the Stewart platform.
|
Initialization of the Stewart platform.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
stewart = initializeStewartPlatform();
|
stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'none');
|
stewart = initializeInertialSensor(stewart, 'type', 'none');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
No flexibility below the Stewart platform and no payload.
|
No flexibility below the Stewart platform and no payload.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
ground = initializeGround('type', 'none');
|
ground = initializeGround('type', 'none');
|
||||||
payload = initializePayload('type', 'none');
|
payload = initializePayload('type', 'none');
|
||||||
controller = initializeController('type', 'open-loop');
|
controller = initializeController('type', 'open-loop');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
Estimation of the transfer function from $\mathcal{\bm{F}}$ to $\mathcal{\bm{X}}$:
|
Estimation of the transfer function from $\mathcal{\bm{F}}$ to $\mathcal{\bm{X}}$:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
%% Options for Linearized
|
%% Options for Linearized
|
||||||
options = linearizeOptions;
|
options = linearizeOptions;
|
||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'stewart_platform_model';
|
mdl = 'stewart_platform_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
||||||
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
||||||
|
|
||||||
%% Run the linearization
|
%% Run the linearization
|
||||||
G = linearize(mdl, io, options);
|
G = linearize(mdl, io, options);
|
||||||
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
||||||
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Gc = minreal(G*inv(stewart.kinematics.J'));
|
Gc = minreal(G*inv(stewart.kinematics.J'));
|
||||||
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
|
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
Let's first look at the low frequency transfer function matrix from $\mathcal{\bm{F}}$ to $\mathcal{\bm{X}}$.
|
Let's first look at the low frequency transfer function matrix from $\mathcal{\bm{F}}$ to $\mathcal{\bm{X}}$.
|
||||||
|
@@ -9,12 +9,8 @@
|
|||||||
#+HTML_LINK_HOME: ./index.html
|
#+HTML_LINK_HOME: ./index.html
|
||||||
#+HTML_LINK_UP: ./index.html
|
#+HTML_LINK_UP: ./index.html
|
||||||
|
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
|
|
||||||
|
|
||||||
#+PROPERTY: header-args:matlab :session *MATLAB*
|
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||||||
#+PROPERTY: header-args:matlab+ :comments org
|
#+PROPERTY: header-args:matlab+ :comments org
|
||||||
@@ -50,66 +46,66 @@ In this document, we discuss the various methods to identify the behavior of the
|
|||||||
** Introduction :ignore:
|
** Introduction :ignore:
|
||||||
** Matlab Init :noexport:ignore:
|
** Matlab Init :noexport:ignore:
|
||||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||||
<<matlab-dir>>
|
<<matlab-dir>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent :noweb yes
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||||||
<<matlab-init>>
|
<<matlab-init>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :results none :exports none
|
#+begin_src matlab :results none :exports none
|
||||||
simulinkproject('../');
|
simulinkproject('../');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
open('stewart_platform_model.slx')
|
open('stewart_platform_model.slx')
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Initialize the Stewart Platform
|
** Initialize the Stewart Platform
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
stewart = initializeStewartPlatform();
|
stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart);
|
stewart = initializeFramesPositions(stewart);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart);
|
stewart = initializeInertialSensor(stewart);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
ground = initializeGround('type', 'none');
|
ground = initializeGround('type', 'none');
|
||||||
payload = initializePayload('type', 'none');
|
payload = initializePayload('type', 'none');
|
||||||
controller = initializeController('type', 'open-loop');
|
controller = initializeController('type', 'open-loop');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Identification
|
** Identification
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
%% Options for Linearized
|
%% Options for Linearized
|
||||||
options = linearizeOptions;
|
options = linearizeOptions;
|
||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'stewart_platform_model';
|
mdl = 'stewart_platform_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
||||||
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
|
||||||
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 2, 'openoutput'); io_i = io_i + 1; % Velocity of {B} w.r.t. {A}
|
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 2, 'openoutput'); io_i = io_i + 1; % Velocity of {B} w.r.t. {A}
|
||||||
|
|
||||||
%% Run the linearization
|
%% Run the linearization
|
||||||
G = linearize(mdl, io);
|
G = linearize(mdl, io);
|
||||||
% G.InputName = {'tau1', 'tau2', 'tau3', 'tau4', 'tau5', 'tau6'};
|
% G.InputName = {'tau1', 'tau2', 'tau3', 'tau4', 'tau5', 'tau6'};
|
||||||
% G.OutputName = {'Xdx', 'Xdy', 'Xdz', 'Xrx', 'Xry', 'Xrz', 'Vdx', 'Vdy', 'Vdz', 'Vrx', 'Vry', 'Vrz'};
|
% G.OutputName = {'Xdx', 'Xdy', 'Xdz', 'Xrx', 'Xry', 'Xrz', 'Vdx', 'Vdy', 'Vdz', 'Vrx', 'Vry', 'Vrz'};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
Let's check the size of =G=:
|
Let's check the size of =G=:
|
||||||
#+begin_src matlab :results replace output
|
#+begin_src matlab :results replace output
|
||||||
size(G)
|
size(G)
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
@@ -121,7 +117,7 @@ Let's check the size of =G=:
|
|||||||
|
|
||||||
We expect to have only 12 states (corresponding to the 6dof of the mobile platform).
|
We expect to have only 12 states (corresponding to the 6dof of the mobile platform).
|
||||||
#+begin_src matlab :results replace output
|
#+begin_src matlab :results replace output
|
||||||
Gm = minreal(G);
|
Gm = minreal(G);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
@@ -133,7 +129,7 @@ And indeed, we obtain 12 states.
|
|||||||
** Coordinate transformation
|
** Coordinate transformation
|
||||||
We can perform the following transformation using the =ss2ss= command.
|
We can perform the following transformation using the =ss2ss= command.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Gt = ss2ss(Gm, Gm.C);
|
Gt = ss2ss(Gm, Gm.C);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
Then, the =C= matrix of =Gt= is the unity matrix which means that the states of the state space model are equal to the measurements $\bm{Y}$.
|
Then, the =C= matrix of =Gt= is the unity matrix which means that the states of the state space model are equal to the measurements $\bm{Y}$.
|
||||||
@@ -142,29 +138,29 @@ The measurements are the 6 displacement and 6 velocities of mobile platform with
|
|||||||
|
|
||||||
We could perform the transformation by hand:
|
We could perform the transformation by hand:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
At = Gm.C*Gm.A*pinv(Gm.C);
|
At = Gm.C*Gm.A*pinv(Gm.C);
|
||||||
|
|
||||||
Bt = Gm.C*Gm.B;
|
Bt = Gm.C*Gm.B;
|
||||||
|
|
||||||
Ct = eye(12);
|
Ct = eye(12);
|
||||||
Dt = zeros(12, 6);
|
Dt = zeros(12, 6);
|
||||||
|
|
||||||
Gt = ss(At, Bt, Ct, Dt);
|
Gt = ss(At, Bt, Ct, Dt);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Analysis
|
** Analysis
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
[V,D] = eig(Gt.A);
|
[V,D] = eig(Gt.A);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
|
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
|
||||||
ws = imag(diag(D))/2/pi;
|
ws = imag(diag(D))/2/pi;
|
||||||
[ws,I] = sort(ws)
|
[ws,I] = sort(ws)
|
||||||
|
|
||||||
xi = 100*real(diag(D))./imag(diag(D));
|
xi = 100*real(diag(D))./imag(diag(D));
|
||||||
xi = xi(I);
|
xi = xi(I);
|
||||||
|
|
||||||
data2orgtable([[1:length(ws(ws>0))]', ws(ws>0), xi(xi>0)], {}, {'Mode Number', 'Resonance Frequency [Hz]', 'Damping Ratio [%]'}, ' %.1f ');
|
data2orgtable([[1:length(ws(ws>0))]', ws(ws>0), xi(xi>0)], {}, {'Mode Number', 'Resonance Frequency [Hz]', 'Damping Ratio [%]'}, ' %.1f ');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
@@ -184,54 +180,54 @@ To visualize the i'th mode, we may excite the system using the inputs $U_i$ such
|
|||||||
|
|
||||||
Let's first sort the modes and just take the modes corresponding to a eigenvalue with a positive imaginary part.
|
Let's first sort the modes and just take the modes corresponding to a eigenvalue with a positive imaginary part.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
ws = imag(diag(D));
|
ws = imag(diag(D));
|
||||||
[ws,I] = sort(ws)
|
[ws,I] = sort(ws)
|
||||||
ws = ws(7:end); I = I(7:end);
|
ws = ws(7:end); I = I(7:end);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
for i = 1:length(ws)
|
for i = 1:length(ws)
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
i_mode = I(i); % the argument is the i'th mode
|
i_mode = I(i); % the argument is the i'th mode
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
lambda_i = D(i_mode, i_mode);
|
lambda_i = D(i_mode, i_mode);
|
||||||
xi_i = V(:,i_mode);
|
xi_i = V(:,i_mode);
|
||||||
|
|
||||||
a_i = real(lambda_i);
|
a_i = real(lambda_i);
|
||||||
b_i = imag(lambda_i);
|
b_i = imag(lambda_i);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
Let do 10 periods of the mode.
|
Let do 10 periods of the mode.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
t = linspace(0, 10/(imag(lambda_i)/2/pi), 1000);
|
t = linspace(0, 10/(imag(lambda_i)/2/pi), 1000);
|
||||||
U_i = pinv(Gt.B) * real(xi_i * lambda_i * (cos(b_i * t) + 1i*sin(b_i * t)));
|
U_i = pinv(Gt.B) * real(xi_i * lambda_i * (cos(b_i * t) + 1i*sin(b_i * t)));
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
U = timeseries(U_i, t);
|
U = timeseries(U_i, t);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
Simulation:
|
Simulation:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
load('mat/conf_simscape.mat');
|
load('mat/conf_simscape.mat');
|
||||||
set_param(conf_simscape, 'StopTime', num2str(t(end)));
|
set_param(conf_simscape, 'StopTime', num2str(t(end)));
|
||||||
sim(mdl);
|
sim(mdl);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
Save the movie of the mode shape.
|
Save the movie of the mode shape.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
smwritevideo(mdl, sprintf('figs/mode%i', i), ...
|
smwritevideo(mdl, sprintf('figs/mode%i', i), ...
|
||||||
'PlaybackSpeedRatio', 1/(b_i/2/pi), ...
|
'PlaybackSpeedRatio', 1/(b_i/2/pi), ...
|
||||||
'FrameRate', 30, ...
|
'FrameRate', 30, ...
|
||||||
'FrameSize', [800, 400]);
|
'FrameSize', [800, 400]);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:mode1
|
#+name: fig:mode1
|
||||||
@@ -251,83 +247,83 @@ Save the movie of the mode shape.
|
|||||||
** Introduction :ignore:
|
** Introduction :ignore:
|
||||||
** Matlab Init :noexport:
|
** Matlab Init :noexport:
|
||||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||||
<<matlab-dir>>
|
<<matlab-dir>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent :noweb yes
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||||||
<<matlab-init>>
|
<<matlab-init>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
simulinkproject('../');
|
simulinkproject('../');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
open('stewart_platform_model.slx')
|
open('stewart_platform_model.slx')
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Initialize the Stewart platform
|
** Initialize the Stewart platform
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
stewart = initializeStewartPlatform();
|
stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
|
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$.
|
We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
|
ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
|
||||||
payload = initializePayload('type', 'rigid');
|
payload = initializePayload('type', 'rigid');
|
||||||
controller = initializeController('type', 'open-loop');
|
controller = initializeController('type', 'open-loop');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Transmissibility
|
** Transmissibility
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
%% Options for Linearized
|
%% Options for Linearized
|
||||||
options = linearizeOptions;
|
options = linearizeOptions;
|
||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'stewart_platform_model';
|
mdl = 'stewart_platform_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Disturbances/D_w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad]
|
io(io_i) = linio([mdl, '/Disturbances/D_w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad]
|
||||||
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
|
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
|
||||||
|
|
||||||
%% Run the linearization
|
%% Run the linearization
|
||||||
T = linearize(mdl, io, options);
|
T = linearize(mdl, io, options);
|
||||||
T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
|
T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
|
||||||
T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
freqs = logspace(1, 4, 1000);
|
freqs = logspace(1, 4, 1000);
|
||||||
|
|
||||||
figure;
|
figure;
|
||||||
for ix = 1:6
|
for ix = 1:6
|
||||||
for iy = 1:6
|
for iy = 1:6
|
||||||
subplot(6, 6, (ix-1)*6 + iy);
|
subplot(6, 6, (ix-1)*6 + iy);
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
|
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
ylim([1e-5, 10]);
|
ylim([1e-5, 10]);
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
if ix < 6
|
if ix < 6
|
||||||
xticklabels({});
|
xticklabels({});
|
||||||
end
|
end
|
||||||
if iy > 1
|
if iy > 1
|
||||||
yticklabels({});
|
yticklabels({});
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
From cite:preumont07_six_axis_singl_stage_activ, one can use the Frobenius norm of the transmissibility matrix to obtain a scalar indicator of the transmissibility performance of the system:
|
From cite:preumont07_six_axis_singl_stage_activ, one can use the Frobenius norm of the transmissibility matrix to obtain a scalar indicator of the transmissibility performance of the system:
|
||||||
@@ -337,26 +333,26 @@ From cite:preumont07_six_axis_singl_stage_activ, one can use the Frobenius norm
|
|||||||
\end{align*}
|
\end{align*}
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
freqs = logspace(1, 4, 1000);
|
freqs = logspace(1, 4, 1000);
|
||||||
|
|
||||||
T_norm = zeros(length(freqs), 1);
|
T_norm = zeros(length(freqs), 1);
|
||||||
|
|
||||||
for i = 1:length(freqs)
|
for i = 1:length(freqs)
|
||||||
T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')'));
|
T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')'));
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
And we normalize by a factor $\sqrt{6}$ to obtain a performance metric comparable to the transmissibility of a one-axis isolator:
|
And we normalize by a factor $\sqrt{6}$ to obtain a performance metric comparable to the transmissibility of a one-axis isolator:
|
||||||
\[ \Gamma(\omega) = \|\bm{T}(\omega)\| / \sqrt{6} \]
|
\[ \Gamma(\omega) = \|\bm{T}(\omega)\| / \sqrt{6} \]
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Gamma = T_norm/sqrt(6);
|
Gamma = T_norm/sqrt(6);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
figure;
|
figure;
|
||||||
plot(freqs, Gamma)
|
plot(freqs, Gamma)
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* Compliance Analysis
|
* Compliance Analysis
|
||||||
@@ -364,101 +360,101 @@ And we normalize by a factor $\sqrt{6}$ to obtain a performance metric comparabl
|
|||||||
** Introduction :ignore:
|
** Introduction :ignore:
|
||||||
** Matlab Init :noexport:
|
** Matlab Init :noexport:
|
||||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||||
<<matlab-dir>>
|
<<matlab-dir>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent :noweb yes
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||||||
<<matlab-init>>
|
<<matlab-init>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
simulinkproject('../');
|
simulinkproject('../');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
open('stewart_platform_model.slx')
|
open('stewart_platform_model.slx')
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Initialize the Stewart platform
|
** Initialize the Stewart platform
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
stewart = initializeStewartPlatform();
|
stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
|
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$.
|
We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
ground = initializeGround('type', 'none');
|
ground = initializeGround('type', 'none');
|
||||||
payload = initializePayload('type', 'rigid');
|
payload = initializePayload('type', 'rigid');
|
||||||
controller = initializeController('type', 'open-loop');
|
controller = initializeController('type', 'open-loop');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Compliance
|
** Compliance
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
%% Options for Linearized
|
%% Options for Linearized
|
||||||
options = linearizeOptions;
|
options = linearizeOptions;
|
||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'stewart_platform_model';
|
mdl = 'stewart_platform_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Disturbances/F_ext'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad]
|
io(io_i) = linio([mdl, '/Disturbances/F_ext'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad]
|
||||||
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
|
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
|
||||||
|
|
||||||
%% Run the linearization
|
%% Run the linearization
|
||||||
C = linearize(mdl, io, options);
|
C = linearize(mdl, io, options);
|
||||||
C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
|
C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
|
||||||
C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
freqs = logspace(1, 4, 1000);
|
freqs = logspace(1, 4, 1000);
|
||||||
|
|
||||||
figure;
|
figure;
|
||||||
for ix = 1:6
|
for ix = 1:6
|
||||||
for iy = 1:6
|
for iy = 1:6
|
||||||
subplot(6, 6, (ix-1)*6 + iy);
|
subplot(6, 6, (ix-1)*6 + iy);
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
|
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
ylim([1e-10, 1e-3]);
|
ylim([1e-10, 1e-3]);
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
if ix < 6
|
if ix < 6
|
||||||
xticklabels({});
|
xticklabels({});
|
||||||
end
|
end
|
||||||
if iy > 1
|
if iy > 1
|
||||||
yticklabels({});
|
yticklabels({});
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
We can try to use the Frobenius norm to obtain a scalar value representing the 6-dof compliance of the Stewart platform.
|
We can try to use the Frobenius norm to obtain a scalar value representing the 6-dof compliance of the Stewart platform.
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
freqs = logspace(1, 4, 1000);
|
freqs = logspace(1, 4, 1000);
|
||||||
|
|
||||||
C_norm = zeros(length(freqs), 1);
|
C_norm = zeros(length(freqs), 1);
|
||||||
|
|
||||||
for i = 1:length(freqs)
|
for i = 1:length(freqs)
|
||||||
C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
|
C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
figure;
|
figure;
|
||||||
plot(freqs, C_norm)
|
plot(freqs, C_norm)
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* Functions
|
* Functions
|
||||||
@@ -474,20 +470,20 @@ We can try to use the Frobenius norm to obtain a scalar value representing the 6
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
function [T, T_norm, freqs] = computeTransmissibility(args)
|
function [T, T_norm, freqs] = computeTransmissibility(args)
|
||||||
% computeTransmissibility -
|
% computeTransmissibility -
|
||||||
%
|
%
|
||||||
% Syntax: [T, T_norm, freqs] = computeTransmissibility(args)
|
% Syntax: [T, T_norm, freqs] = computeTransmissibility(args)
|
||||||
%
|
%
|
||||||
% Inputs:
|
% Inputs:
|
||||||
% - args - Structure with the following fields:
|
% - args - Structure with the following fields:
|
||||||
% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
|
% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
|
||||||
% - freqs [] - Frequency vector to estimate the Frobenius norm
|
% - freqs [] - Frequency vector to estimate the Frobenius norm
|
||||||
%
|
%
|
||||||
% Outputs:
|
% Outputs:
|
||||||
% - T [6x6 ss] - Transmissibility matrix
|
% - T [6x6 ss] - Transmissibility matrix
|
||||||
% - T_norm [length(freqs)x1] - Frobenius norm of the Transmissibility matrix
|
% - T_norm [length(freqs)x1] - Frobenius norm of the Transmissibility matrix
|
||||||
% - freqs [length(freqs)x1] - Frequency vector in [Hz]
|
% - freqs [length(freqs)x1] - Frequency vector in [Hz]
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Optional Parameters
|
*** Optional Parameters
|
||||||
@@ -495,14 +491,14 @@ We can try to use the Frobenius norm to obtain a scalar value representing the 6
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
arguments
|
arguments
|
||||||
args.plots logical {mustBeNumericOrLogical} = false
|
args.plots logical {mustBeNumericOrLogical} = false
|
||||||
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
|
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
freqs = args.freqs;
|
freqs = args.freqs;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Identification of the Transmissibility Matrix
|
*** Identification of the Transmissibility Matrix
|
||||||
@@ -510,43 +506,43 @@ We can try to use the Frobenius norm to obtain a scalar value representing the 6
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
%% Options for Linearized
|
%% Options for Linearized
|
||||||
options = linearizeOptions;
|
options = linearizeOptions;
|
||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'stewart_platform_model';
|
mdl = 'stewart_platform_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Disturbances/D_w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad]
|
io(io_i) = linio([mdl, '/Disturbances/D_w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad]
|
||||||
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'output'); io_i = io_i + 1; % Absolute Motion [m, rad]
|
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'output'); io_i = io_i + 1; % Absolute Motion [m, rad]
|
||||||
|
|
||||||
%% Run the linearization
|
%% Run the linearization
|
||||||
T = linearize(mdl, io, options);
|
T = linearize(mdl, io, options);
|
||||||
T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
|
T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
|
||||||
T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
If wanted, the 6x6 transmissibility matrix is plotted.
|
If wanted, the 6x6 transmissibility matrix is plotted.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
p_handle = zeros(6*6,1);
|
p_handle = zeros(6*6,1);
|
||||||
|
|
||||||
if args.plots
|
if args.plots
|
||||||
fig = figure;
|
fig = figure;
|
||||||
for ix = 1:6
|
for ix = 1:6
|
||||||
for iy = 1:6
|
for iy = 1:6
|
||||||
p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
|
p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
|
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
if ix < 6
|
if ix < 6
|
||||||
xticklabels({});
|
xticklabels({});
|
||||||
|
end
|
||||||
|
if iy > 1
|
||||||
|
yticklabels({});
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if iy > 1
|
|
||||||
yticklabels({});
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
linkaxes(p_handle, 'xy')
|
linkaxes(p_handle, 'xy')
|
||||||
@@ -558,7 +554,7 @@ If wanted, the 6x6 transmissibility matrix is plotted.
|
|||||||
han.YLabel.Visible = 'on';
|
han.YLabel.Visible = 'on';
|
||||||
xlabel(han, 'Frequency [Hz]');
|
xlabel(han, 'Frequency [Hz]');
|
||||||
ylabel(han, 'Transmissibility [m/m]');
|
ylabel(han, 'Transmissibility [m/m]');
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Computation of the Frobenius norm
|
*** Computation of the Frobenius norm
|
||||||
@@ -566,25 +562,25 @@ If wanted, the 6x6 transmissibility matrix is plotted.
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
T_norm = zeros(length(freqs), 1);
|
T_norm = zeros(length(freqs), 1);
|
||||||
|
|
||||||
for i = 1:length(freqs)
|
for i = 1:length(freqs)
|
||||||
T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')'));
|
T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')'));
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
T_norm = T_norm/sqrt(6);
|
T_norm = T_norm/sqrt(6);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
if args.plots
|
if args.plots
|
||||||
figure;
|
figure;
|
||||||
plot(freqs, T_norm)
|
plot(freqs, T_norm)
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
xlabel('Frequency [Hz]');
|
xlabel('Frequency [Hz]');
|
||||||
ylabel('Transmissibility - Frobenius Norm');
|
ylabel('Transmissibility - Frobenius Norm');
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Compute the Compliance
|
** Compute the Compliance
|
||||||
@@ -599,20 +595,20 @@ If wanted, the 6x6 transmissibility matrix is plotted.
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
function [C, C_norm, freqs] = computeCompliance(args)
|
function [C, C_norm, freqs] = computeCompliance(args)
|
||||||
% computeCompliance -
|
% computeCompliance -
|
||||||
%
|
%
|
||||||
% Syntax: [C, C_norm, freqs] = computeCompliance(args)
|
% Syntax: [C, C_norm, freqs] = computeCompliance(args)
|
||||||
%
|
%
|
||||||
% Inputs:
|
% Inputs:
|
||||||
% - args - Structure with the following fields:
|
% - args - Structure with the following fields:
|
||||||
% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
|
% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
|
||||||
% - freqs [] - Frequency vector to estimate the Frobenius norm
|
% - freqs [] - Frequency vector to estimate the Frobenius norm
|
||||||
%
|
%
|
||||||
% Outputs:
|
% Outputs:
|
||||||
% - C [6x6 ss] - Compliance matrix
|
% - C [6x6 ss] - Compliance matrix
|
||||||
% - C_norm [length(freqs)x1] - Frobenius norm of the Compliance matrix
|
% - C_norm [length(freqs)x1] - Frobenius norm of the Compliance matrix
|
||||||
% - freqs [length(freqs)x1] - Frequency vector in [Hz]
|
% - freqs [length(freqs)x1] - Frequency vector in [Hz]
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Optional Parameters
|
*** Optional Parameters
|
||||||
@@ -620,14 +616,14 @@ If wanted, the 6x6 transmissibility matrix is plotted.
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
arguments
|
arguments
|
||||||
args.plots logical {mustBeNumericOrLogical} = false
|
args.plots logical {mustBeNumericOrLogical} = false
|
||||||
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
|
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
freqs = args.freqs;
|
freqs = args.freqs;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Identification of the Compliance Matrix
|
*** Identification of the Compliance Matrix
|
||||||
@@ -635,43 +631,43 @@ If wanted, the 6x6 transmissibility matrix is plotted.
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
%% Options for Linearized
|
%% Options for Linearized
|
||||||
options = linearizeOptions;
|
options = linearizeOptions;
|
||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'stewart_platform_model';
|
mdl = 'stewart_platform_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Disturbances/F_ext'], 1, 'openinput'); io_i = io_i + 1; % External forces [N, N*m]
|
io(io_i) = linio([mdl, '/Disturbances/F_ext'], 1, 'openinput'); io_i = io_i + 1; % External forces [N, N*m]
|
||||||
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'output'); io_i = io_i + 1; % Absolute Motion [m, rad]
|
io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'output'); io_i = io_i + 1; % Absolute Motion [m, rad]
|
||||||
|
|
||||||
%% Run the linearization
|
%% Run the linearization
|
||||||
C = linearize(mdl, io, options);
|
C = linearize(mdl, io, options);
|
||||||
C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
|
C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
|
||||||
C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
If wanted, the 6x6 transmissibility matrix is plotted.
|
If wanted, the 6x6 transmissibility matrix is plotted.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
p_handle = zeros(6*6,1);
|
p_handle = zeros(6*6,1);
|
||||||
|
|
||||||
if args.plots
|
if args.plots
|
||||||
fig = figure;
|
fig = figure;
|
||||||
for ix = 1:6
|
for ix = 1:6
|
||||||
for iy = 1:6
|
for iy = 1:6
|
||||||
p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
|
p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
|
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
if ix < 6
|
if ix < 6
|
||||||
xticklabels({});
|
xticklabels({});
|
||||||
|
end
|
||||||
|
if iy > 1
|
||||||
|
yticklabels({});
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if iy > 1
|
|
||||||
yticklabels({});
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
linkaxes(p_handle, 'xy')
|
linkaxes(p_handle, 'xy')
|
||||||
@@ -682,7 +678,7 @@ If wanted, the 6x6 transmissibility matrix is plotted.
|
|||||||
han.YLabel.Visible = 'on';
|
han.YLabel.Visible = 'on';
|
||||||
xlabel(han, 'Frequency [Hz]');
|
xlabel(han, 'Frequency [Hz]');
|
||||||
ylabel(han, 'Compliance [m/N, rad/(N*m)]');
|
ylabel(han, 'Compliance [m/N, rad/(N*m)]');
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Computation of the Frobenius norm
|
*** Computation of the Frobenius norm
|
||||||
@@ -690,21 +686,21 @@ If wanted, the 6x6 transmissibility matrix is plotted.
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
freqs = args.freqs;
|
freqs = args.freqs;
|
||||||
|
|
||||||
C_norm = zeros(length(freqs), 1);
|
C_norm = zeros(length(freqs), 1);
|
||||||
|
|
||||||
for i = 1:length(freqs)
|
for i = 1:length(freqs)
|
||||||
C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
|
C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
if args.plots
|
if args.plots
|
||||||
figure;
|
figure;
|
||||||
plot(freqs, C_norm)
|
plot(freqs, C_norm)
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
xlabel('Frequency [Hz]');
|
xlabel('Frequency [Hz]');
|
||||||
ylabel('Compliance - Frobenius Norm');
|
ylabel('Compliance - Frobenius Norm');
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
@@ -1,11 +1,10 @@
|
|||||||
#+TITLE: Stewart Platforms
|
#+TITLE: Stewart Platforms
|
||||||
:DRAWER:
|
:DRAWER:
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
#+HTML_LINK_HOME: https://research.tdehaeze.xyz/
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
#+HTML_LINK_UP: https://research.tdehaeze.xyz/
|
||||||
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
|
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
|
|
||||||
|
|
||||||
#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}")
|
#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}")
|
||||||
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes
|
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes
|
||||||
@@ -20,8 +19,8 @@
|
|||||||
|
|
||||||
* Introduction :ignore:
|
* Introduction :ignore:
|
||||||
The goal of this project is to provide a Matlab/Simscape Toolbox to study Stewart platforms.
|
The goal of this project is to provide a Matlab/Simscape Toolbox to study Stewart platforms.
|
||||||
|
|
||||||
The project is divided into several section listed below.
|
The project is divided into several section listed below.
|
||||||
|
The git repository of the project is accessible [[https://git.tdehaeze.xyz/tdehaeze/stewart-simscape][here]].
|
||||||
|
|
||||||
* Simulink Project ([[file:simulink-project.org][link]])
|
* Simulink Project ([[file:simulink-project.org][link]])
|
||||||
The project is managed with a *Simulink Project*.
|
The project is managed with a *Simulink Project*.
|
||||||
|
@@ -9,12 +9,8 @@
|
|||||||
#+HTML_LINK_HOME: ./index.html
|
#+HTML_LINK_HOME: ./index.html
|
||||||
#+HTML_LINK_UP: ./index.html
|
#+HTML_LINK_UP: ./index.html
|
||||||
|
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
|
|
||||||
|
|
||||||
#+PROPERTY: header-args:matlab :session *MATLAB*
|
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||||||
#+PROPERTY: header-args:matlab+ :comments org
|
#+PROPERTY: header-args:matlab+ :comments org
|
||||||
@@ -238,30 +234,30 @@ This will also gives us the range for which the approximate forward kinematic is
|
|||||||
|
|
||||||
** Matlab Init :noexport:ignore:
|
** Matlab Init :noexport:ignore:
|
||||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||||
<<matlab-dir>>
|
<<matlab-dir>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent :noweb yes
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||||||
<<matlab-init>>
|
<<matlab-init>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :results none :exports none
|
#+begin_src matlab :results none :exports none
|
||||||
simulinkproject('../');
|
simulinkproject('../');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Stewart architecture definition
|
** Stewart architecture definition
|
||||||
We first define some general Stewart architecture.
|
We first define some general Stewart architecture.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
stewart = initializeStewartPlatform();
|
stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart);
|
stewart = initializeJointDynamics(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Comparison for "pure" translations
|
** Comparison for "pure" translations
|
||||||
@@ -271,31 +267,31 @@ We compute the approximate and exact required strut stroke to have the wanted mo
|
|||||||
The estimate required strut stroke for both the approximate and exact solutions are shown in Figure [[fig:inverse_kinematics_approx_validity_x_translation]].
|
The estimate required strut stroke for both the approximate and exact solutions are shown in Figure [[fig:inverse_kinematics_approx_validity_x_translation]].
|
||||||
The relative strut length displacement is shown in Figure [[fig:inverse_kinematics_approx_validity_x_translation_relative]].
|
The relative strut length displacement is shown in Figure [[fig:inverse_kinematics_approx_validity_x_translation_relative]].
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Xrs = logspace(-6, -1, 100); % Wanted X translation of the mobile platform [m]
|
Xrs = logspace(-6, -1, 100); % Wanted X translation of the mobile platform [m]
|
||||||
|
|
||||||
Ls_approx = zeros(6, length(Xrs));
|
Ls_approx = zeros(6, length(Xrs));
|
||||||
Ls_exact = zeros(6, length(Xrs));
|
Ls_exact = zeros(6, length(Xrs));
|
||||||
|
|
||||||
for i = 1:length(Xrs)
|
for i = 1:length(Xrs)
|
||||||
Xr = Xrs(i);
|
Xr = Xrs(i);
|
||||||
L_approx(:, i) = stewart.kinematics.J*[Xr; 0; 0; 0; 0; 0;];
|
L_approx(:, i) = stewart.kinematics.J*[Xr; 0; 0; 0; 0; 0;];
|
||||||
[~, L_exact(:, i)] = inverseKinematics(stewart, 'AP', [Xr; 0; 0]);
|
[~, L_exact(:, i)] = inverseKinematics(stewart, 'AP', [Xr; 0; 0]);
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
figure;
|
figure;
|
||||||
hold on;
|
hold on;
|
||||||
for i = 1:6
|
for i = 1:6
|
||||||
set(gca,'ColorOrderIndex',i);
|
set(gca,'ColorOrderIndex',i);
|
||||||
plot(Xrs, abs(L_approx(i, :)));
|
plot(Xrs, abs(L_approx(i, :)));
|
||||||
set(gca,'ColorOrderIndex',i);
|
set(gca,'ColorOrderIndex',i);
|
||||||
plot(Xrs, abs(L_exact(i, :)), '--');
|
plot(Xrs, abs(L_exact(i, :)), '--');
|
||||||
end
|
end
|
||||||
hold off;
|
hold off;
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
xlabel('Wanted $x$ displacement [m]');
|
xlabel('Wanted $x$ displacement [m]');
|
||||||
ylabel('Estimated required stroke');
|
ylabel('Estimated required stroke');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+HEADER: :tangle no :exports results :results none :noweb yes
|
#+HEADER: :tangle no :exports results :results none :noweb yes
|
||||||
@@ -308,15 +304,15 @@ The relative strut length displacement is shown in Figure [[fig:inverse_kinemati
|
|||||||
[[file:figs/inverse_kinematics_approx_validity_x_translation.png]]
|
[[file:figs/inverse_kinematics_approx_validity_x_translation.png]]
|
||||||
|
|
||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
figure;
|
figure;
|
||||||
hold on;
|
hold on;
|
||||||
for i = 1:6
|
for i = 1:6
|
||||||
plot(Xrs, abs(L_approx(i, :) - L_exact(i, :))./abs(L_approx(i, :) + L_exact(i, :)), 'k-');
|
plot(Xrs, abs(L_approx(i, :) - L_exact(i, :))./abs(L_approx(i, :) + L_exact(i, :)), 'k-');
|
||||||
end
|
end
|
||||||
hold off;
|
hold off;
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
xlabel('Wanted $x$ displacement [m]');
|
xlabel('Wanted $x$ displacement [m]');
|
||||||
ylabel('Relative Stroke Error');
|
ylabel('Relative Stroke Error');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+HEADER: :tangle no :exports results :results none :noweb yes
|
#+HEADER: :tangle no :exports results :results none :noweb yes
|
||||||
@@ -353,41 +349,41 @@ This is what is analyzed in this section.
|
|||||||
|
|
||||||
** Matlab Init :noexport:ignore:
|
** Matlab Init :noexport:ignore:
|
||||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||||
<<matlab-dir>>
|
<<matlab-dir>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent :noweb yes
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||||||
<<matlab-init>>
|
<<matlab-init>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :results none :exports none
|
#+begin_src matlab :results none :exports none
|
||||||
simulinkproject('../');
|
simulinkproject('../');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Stewart architecture definition
|
** Stewart architecture definition
|
||||||
Let's first define the Stewart platform architecture that we want to study.
|
Let's first define the Stewart platform architecture that we want to study.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
stewart = initializeStewartPlatform();
|
stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart);
|
stewart = initializeJointDynamics(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Wanted translations and rotations
|
** Wanted translations and rotations
|
||||||
Let's now define the wanted extreme translations and rotations.
|
Let's now define the wanted extreme translations and rotations.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Tx_max = 50e-6; % Translation [m]
|
Tx_max = 50e-6; % Translation [m]
|
||||||
Ty_max = 50e-6; % Translation [m]
|
Ty_max = 50e-6; % Translation [m]
|
||||||
Tz_max = 50e-6; % Translation [m]
|
Tz_max = 50e-6; % Translation [m]
|
||||||
Rx_max = 30e-6; % Rotation [rad]
|
Rx_max = 30e-6; % Rotation [rad]
|
||||||
Ry_max = 30e-6; % Rotation [rad]
|
Ry_max = 30e-6; % Rotation [rad]
|
||||||
Rz_max = 0; % Rotation [rad]
|
Rz_max = 0; % Rotation [rad]
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Needed stroke for "pure" rotations or translations
|
** Needed stroke for "pure" rotations or translations
|
||||||
@@ -395,17 +391,17 @@ As a first estimation, we estimate the needed actuator stroke for "pure" rotatio
|
|||||||
We do that using either the Inverse Kinematic solution or the Jacobian matrix as an approximation.
|
We do that using either the Inverse Kinematic solution or the Jacobian matrix as an approximation.
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
LTx = stewart.kinematics.J*[Tx_max 0 0 0 0 0]';
|
LTx = stewart.kinematics.J*[Tx_max 0 0 0 0 0]';
|
||||||
LTy = stewart.kinematics.J*[0 Ty_max 0 0 0 0]';
|
LTy = stewart.kinematics.J*[0 Ty_max 0 0 0 0]';
|
||||||
LTz = stewart.kinematics.J*[0 0 Tz_max 0 0 0]';
|
LTz = stewart.kinematics.J*[0 0 Tz_max 0 0 0]';
|
||||||
LRx = stewart.kinematics.J*[0 0 0 Rx_max 0 0]';
|
LRx = stewart.kinematics.J*[0 0 0 Rx_max 0 0]';
|
||||||
LRy = stewart.kinematics.J*[0 0 0 0 Ry_max 0]';
|
LRy = stewart.kinematics.J*[0 0 0 0 Ry_max 0]';
|
||||||
LRz = stewart.kinematics.J*[0 0 0 0 0 Rz_max]';
|
LRz = stewart.kinematics.J*[0 0 0 0 0 Rz_max]';
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
The obtain required stroke is:
|
The obtain required stroke is:
|
||||||
#+begin_src matlab :results value replace :exports results
|
#+begin_src matlab :results value replace :exports results
|
||||||
ans = sprintf('From %.2g[m] to %.2g[m]: Total stroke = %.1f[um]', min(min([LTx,LTy,LTz,LRx,LRy])), max(max([LTx,LTy,LTz,LRx,LRy])), 1e6*(max(max([LTx,LTy,LTz,LRx,LRy]))-min(min([LTx,LTy,LTz,LRx,LRy]))))
|
ans = sprintf('From %.2g[m] to %.2g[m]: Total stroke = %.1f[um]', min(min([LTx,LTy,LTz,LRx,LRy])), max(max([LTx,LTy,LTz,LRx,LRy])), 1e6*(max(max([LTx,LTy,LTz,LRx,LRy]))-min(min([LTx,LTy,LTz,LRx,LRy]))))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
@@ -420,11 +416,11 @@ To do so, we may estimate the required actuator stroke for all possible combinat
|
|||||||
|
|
||||||
Let's first generate all the possible combination of maximum translation and rotations.
|
Let's first generate all the possible combination of maximum translation and rotations.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max];
|
Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max];
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
|
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
|
||||||
data2orgtable(Ps, {}, {'*Tx [m]*', '*Ty [m]*', '*Tz [m]*', '*Rx [rad]*', '*Ry [rad]*', '*Rz [rad]*'}, ' %.1e ');
|
data2orgtable(Ps, {}, {'*Tx [m]*', '*Ty [m]*', '*Tz [m]*', '*Rx [rad]*', '*Ry [rad]*', '*Rz [rad]*'}, ' %.1e ');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
@@ -458,17 +454,17 @@ Let's first generate all the possible combination of maximum translation and rot
|
|||||||
|
|
||||||
For all possible combination, we compute the required actuator stroke using the inverse kinematic solution.
|
For all possible combination, we compute the required actuator stroke using the inverse kinematic solution.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
L_min = 0;
|
L_min = 0;
|
||||||
L_max = 0;
|
L_max = 0;
|
||||||
|
|
||||||
for i = 1:size(Ps,1)
|
for i = 1:size(Ps,1)
|
||||||
Rx = [1 0 0;
|
Rx = [1 0 0;
|
||||||
0 cos(Ps(i, 4)) -sin(Ps(i, 4));
|
0 cos(Ps(i, 4)) -sin(Ps(i, 4));
|
||||||
0 sin(Ps(i, 4)) cos(Ps(i, 4))];
|
0 sin(Ps(i, 4)) cos(Ps(i, 4))];
|
||||||
|
|
||||||
Ry = [ cos(Ps(i, 5)) 0 sin(Ps(i, 5));
|
Ry = [ cos(Ps(i, 5)) 0 sin(Ps(i, 5));
|
||||||
0 1 0;
|
0 1 0;
|
||||||
-sin(Ps(i, 5)) 0 cos(Ps(i, 5))];
|
-sin(Ps(i, 5)) 0 cos(Ps(i, 5))];
|
||||||
|
|
||||||
Rz = [cos(Ps(i, 6)) -sin(Ps(i, 6)) 0;
|
Rz = [cos(Ps(i, 6)) -sin(Ps(i, 6)) 0;
|
||||||
sin(Ps(i, 6)) cos(Ps(i, 6)) 0;
|
sin(Ps(i, 6)) cos(Ps(i, 6)) 0;
|
||||||
@@ -478,17 +474,17 @@ For all possible combination, we compute the required actuator stroke using the
|
|||||||
[~, Ls] = inverseKinematics(stewart, 'AP', Ps(i, 1:3)', 'ARB', ARB);
|
[~, Ls] = inverseKinematics(stewart, 'AP', Ps(i, 1:3)', 'ARB', ARB);
|
||||||
|
|
||||||
if min(Ls) < L_min
|
if min(Ls) < L_min
|
||||||
L_min = min(Ls)
|
L_min = min(Ls)
|
||||||
end
|
end
|
||||||
if max(Ls) > L_max
|
if max(Ls) > L_max
|
||||||
L_max = max(Ls)
|
L_max = max(Ls)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
We obtain the required actuator stroke:
|
We obtain the required actuator stroke:
|
||||||
#+begin_src matlab :results value replace :exports results
|
#+begin_src matlab :results value replace :exports results
|
||||||
ans = sprintf('From %.2g[m] to %.2g[m]: Total stroke = %.1f[um]', L_min, L_max, 1e6*(L_max-L_min))
|
ans = sprintf('From %.2g[m] to %.2g[m]: Total stroke = %.1f[um]', L_min, L_max, 1e6*(L_max-L_min))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
@@ -517,36 +513,36 @@ However, for small displacements, we can use the Jacobian as an approximate solu
|
|||||||
|
|
||||||
** Matlab Init :noexport:ignore:
|
** Matlab Init :noexport:ignore:
|
||||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||||
<<matlab-dir>>
|
<<matlab-dir>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent :noweb yes
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||||||
<<matlab-init>>
|
<<matlab-init>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :results none :exports none
|
#+begin_src matlab :results none :exports none
|
||||||
simulinkproject('../');
|
simulinkproject('../');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Stewart architecture definition
|
** Stewart architecture definition
|
||||||
Let's first define the Stewart platform architecture that we want to study.
|
Let's first define the Stewart platform architecture that we want to study.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
stewart = initializeStewartPlatform();
|
stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart);
|
stewart = initializeJointDynamics(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
Let's now define the actuator stroke.
|
Let's now define the actuator stroke.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
L_min = -50e-6; % [m]
|
L_min = -50e-6; % [m]
|
||||||
L_max = 50e-6; % [m]
|
L_max = 50e-6; % [m]
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Pure translations
|
** Pure translations
|
||||||
@@ -561,21 +557,21 @@ To obtain the mobility "volume" attainable by the Stewart platform when it's ori
|
|||||||
|
|
||||||
For each possible value of $(\theta, \phi)$, we compute the maximum radius $r$ attainable with the constraint that the stroke of each actuator should be between =L_min= and =L_max=.
|
For each possible value of $(\theta, \phi)$, we compute the maximum radius $r$ attainable with the constraint that the stroke of each actuator should be between =L_min= and =L_max=.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
thetas = linspace(0, pi, 50);
|
thetas = linspace(0, pi, 50);
|
||||||
phis = linspace(0, 2*pi, 50);
|
phis = linspace(0, 2*pi, 50);
|
||||||
rs = zeros(length(thetas), length(phis));
|
rs = zeros(length(thetas), length(phis));
|
||||||
|
|
||||||
for i = 1:length(thetas)
|
for i = 1:length(thetas)
|
||||||
for j = 1:length(phis)
|
for j = 1:length(phis)
|
||||||
Tx = sin(thetas(i))*cos(phis(j));
|
Tx = sin(thetas(i))*cos(phis(j));
|
||||||
Ty = sin(thetas(i))*sin(phis(j));
|
Ty = sin(thetas(i))*sin(phis(j));
|
||||||
Tz = cos(thetas(i));
|
Tz = cos(thetas(i));
|
||||||
|
|
||||||
dL = stewart.kinematics.J*[Tx; Ty; Tz; 0; 0; 0;]; % dL required for 1m displacement in theta/phi direction
|
dL = stewart.kinematics.J*[Tx; Ty; Tz; 0; 0; 0;]; % dL required for 1m displacement in theta/phi direction
|
||||||
|
|
||||||
rs(i, j) = max([dL(dL<0)*L_min; dL(dL>0)*L_max]);
|
rs(i, j) = max([dL(dL<0)*L_min; dL(dL>0)*L_max]);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
@@ -592,13 +588,13 @@ data2orgtable([1e6*L_min, 1e6*L_max, 1e6*(min(min(rs)))], {}, {'=L_min= [$\mu m$
|
|||||||
| -50.0 | 50.0 | 31.5 |
|
| -50.0 | 50.0 | 31.5 |
|
||||||
|
|
||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
figure;
|
figure;
|
||||||
plot3(reshape(rs.*(sin(thetas)'*cos(phis)), [1, length(thetas)*length(phis)]), ...
|
plot3(reshape(rs.*(sin(thetas)'*cos(phis)), [1, length(thetas)*length(phis)]), ...
|
||||||
reshape(rs.*(sin(thetas)'*sin(phis)), [1, length(thetas)*length(phis)]), ...
|
reshape(rs.*(sin(thetas)'*sin(phis)), [1, length(thetas)*length(phis)]), ...
|
||||||
reshape(rs.*(cos(thetas)'*ones(1, length(phis))), [1, length(thetas)*length(phis)]))
|
reshape(rs.*(cos(thetas)'*ones(1, length(phis))), [1, length(thetas)*length(phis)]))
|
||||||
xlabel('X Translation [m]');
|
xlabel('X Translation [m]');
|
||||||
ylabel('Y Translation [m]');
|
ylabel('Y Translation [m]');
|
||||||
zlabel('Z Translation [m]');
|
zlabel('Z Translation [m]');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+HEADER: :tangle no :exports results :results none :noweb yes
|
#+HEADER: :tangle no :exports results :results none :noweb yes
|
||||||
@@ -617,93 +613,93 @@ using this function https://fr.mathworks.com/help/matlab/ref/contour3.html
|
|||||||
** Introduction :ignore:
|
** Introduction :ignore:
|
||||||
** Matlab Init :noexport:ignore:
|
** Matlab Init :noexport:ignore:
|
||||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||||
<<matlab-dir>>
|
<<matlab-dir>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :exports none :results silent :noweb yes
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||||||
<<matlab-init>>
|
<<matlab-init>>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :results none :exports none
|
#+begin_src matlab :results none :exports none
|
||||||
simulinkproject('../');
|
simulinkproject('../');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Estimation with an analytical model
|
** Estimation with an analytical model
|
||||||
Let's first define the Stewart Platform Geometry.
|
Let's first define the Stewart Platform Geometry.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
stewart = initializeStewartPlatform();
|
stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 150e-3);
|
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 150e-3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart, 'AP', [0; 0; 0]);
|
stewart = computeJointsPose(stewart, 'AP', [0; 0; 0]);
|
||||||
|
|
||||||
As_init = stewart.geometry.As;
|
As_init = stewart.geometry.As;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Tx_max = 60e-6; % Translation [m]
|
Tx_max = 60e-6; % Translation [m]
|
||||||
Ty_max = 60e-6; % Translation [m]
|
Ty_max = 60e-6; % Translation [m]
|
||||||
Tz_max = 60e-6; % Translation [m]
|
Tz_max = 60e-6; % Translation [m]
|
||||||
Rx_max = 30e-6; % Rotation [rad]
|
Rx_max = 30e-6; % Rotation [rad]
|
||||||
Ry_max = 30e-6; % Rotation [rad]
|
Ry_max = 30e-6; % Rotation [rad]
|
||||||
Rz_max = 0; % Rotation [rad]
|
Rz_max = 0; % Rotation [rad]
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max];
|
Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max];
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
flex_ang = zeros(size(Ps, 1), 6);
|
flex_ang = zeros(size(Ps, 1), 6);
|
||||||
Rxs = zeros(size(Ps, 1), 6)
|
Rxs = zeros(size(Ps, 1), 6)
|
||||||
Rys = zeros(size(Ps, 1), 6)
|
Rys = zeros(size(Ps, 1), 6)
|
||||||
Rzs = zeros(size(Ps, 1), 6)
|
Rzs = zeros(size(Ps, 1), 6)
|
||||||
|
|
||||||
for Ps_i = 1:size(Ps, 1)
|
for Ps_i = 1:size(Ps, 1)
|
||||||
Rx = [1 0 0;
|
Rx = [1 0 0;
|
||||||
0 cos(Ps(Ps_i, 4)) -sin(Ps(Ps_i, 4));
|
0 cos(Ps(Ps_i, 4)) -sin(Ps(Ps_i, 4));
|
||||||
0 sin(Ps(Ps_i, 4)) cos(Ps(Ps_i, 4))];
|
0 sin(Ps(Ps_i, 4)) cos(Ps(Ps_i, 4))];
|
||||||
|
|
||||||
Ry = [ cos(Ps(Ps_i, 5)) 0 sin(Ps(Ps_i, 5));
|
Ry = [ cos(Ps(Ps_i, 5)) 0 sin(Ps(Ps_i, 5));
|
||||||
0 1 0;
|
0 1 0;
|
||||||
-sin(Ps(Ps_i, 5)) 0 cos(Ps(Ps_i, 5))];
|
-sin(Ps(Ps_i, 5)) 0 cos(Ps(Ps_i, 5))];
|
||||||
|
|
||||||
Rz = [cos(Ps(Ps_i, 6)) -sin(Ps(Ps_i, 6)) 0;
|
Rz = [cos(Ps(Ps_i, 6)) -sin(Ps(Ps_i, 6)) 0;
|
||||||
sin(Ps(Ps_i, 6)) cos(Ps(Ps_i, 6)) 0;
|
sin(Ps(Ps_i, 6)) cos(Ps(Ps_i, 6)) 0;
|
||||||
0 0 1];
|
0 0 1];
|
||||||
|
|
||||||
ARB = Rz*Ry*Rx;
|
ARB = Rz*Ry*Rx;
|
||||||
|
|
||||||
stewart = computeJointsPose(stewart, 'AP', Ps(Ps_i, 1:3)', 'ARB', ARB);
|
stewart = computeJointsPose(stewart, 'AP', Ps(Ps_i, 1:3)', 'ARB', ARB);
|
||||||
|
|
||||||
flex_ang(Ps_i, :) = acos(sum(As_init.*stewart.geometry.As));
|
flex_ang(Ps_i, :) = acos(sum(As_init.*stewart.geometry.As));
|
||||||
|
|
||||||
for l_i = 1:6
|
for l_i = 1:6
|
||||||
MRf = stewart.platform_M.MRb(:,:,l_i)*(ARB')*(stewart.platform_F.FRa(:,:,l_i)');
|
MRf = stewart.platform_M.MRb(:,:,l_i)*(ARB')*(stewart.platform_F.FRa(:,:,l_i)');
|
||||||
|
|
||||||
Rys(Ps_i, l_i) = atan2(MRf(1,3), sqrt(MRf(1,1)^2 + MRf(2,2)^2));
|
Rys(Ps_i, l_i) = atan2(MRf(1,3), sqrt(MRf(1,1)^2 + MRf(2,2)^2));
|
||||||
Rxs(Ps_i, l_i) = atan2(-MRf(2,3)/cos(Rys(Ps_i, l_i)), MRf(3,3)/cos(Rys(Ps_i, l_i)));
|
Rxs(Ps_i, l_i) = atan2(-MRf(2,3)/cos(Rys(Ps_i, l_i)), MRf(3,3)/cos(Rys(Ps_i, l_i)));
|
||||||
Rzs(Ps_i, l_i) = atan2(-MRf(1,2)/cos(Rys(Ps_i, l_i)), MRf(1,1)/cos(Rys(Ps_i, l_i)));
|
Rzs(Ps_i, l_i) = atan2(-MRf(1,2)/cos(Rys(Ps_i, l_i)), MRf(1,1)/cos(Rys(Ps_i, l_i)));
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
And the maximum bending of the flexible joints is: (in [mrad])
|
And the maximum bending of the flexible joints is: (in [mrad])
|
||||||
#+begin_src matlab :results replace value
|
#+begin_src matlab :results replace value
|
||||||
1e3*max(max(abs(flex_ang)))
|
1e3*max(max(abs(flex_ang)))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
: 1.1704
|
: 1.1704
|
||||||
|
|
||||||
#+begin_src matlab :results replace value
|
#+begin_src matlab :results replace value
|
||||||
1e3*max(max(sqrt(Rxs.^2 + Rys.^2)))
|
1e3*max(max(sqrt(Rxs.^2 + Rys.^2)))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
: 0.075063
|
: 0.075063
|
||||||
|
|
||||||
#+begin_src matlab :results replace value
|
#+begin_src matlab :results replace value
|
||||||
1e3*max(max(Rzs))
|
1e3*max(max(Rzs))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
@@ -712,89 +708,89 @@ And the maximum bending of the flexible joints is: (in [mrad])
|
|||||||
** Estimation using the Simscape Model
|
** Estimation using the Simscape Model
|
||||||
*** Model Init
|
*** Model Init
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
open('stewart_platform_model.slx')
|
open('stewart_platform_model.slx')
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
stewart = initializeStewartPlatform();
|
stewart = initializeStewartPlatform();
|
||||||
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
||||||
stewart = generateGeneralConfiguration(stewart);
|
stewart = generateGeneralConfiguration(stewart);
|
||||||
stewart = computeJointsPose(stewart);
|
stewart = computeJointsPose(stewart);
|
||||||
stewart = initializeStrutDynamics(stewart);
|
stewart = initializeStrutDynamics(stewart);
|
||||||
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
|
||||||
stewart = initializeCylindricalPlatforms(stewart);
|
stewart = initializeCylindricalPlatforms(stewart);
|
||||||
stewart = initializeCylindricalStruts(stewart);
|
stewart = initializeCylindricalStruts(stewart);
|
||||||
stewart = computeJacobian(stewart);
|
stewart = computeJacobian(stewart);
|
||||||
stewart = initializeStewartPose(stewart);
|
stewart = initializeStewartPose(stewart);
|
||||||
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
|
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
ground = initializeGround('type', 'rigid');
|
ground = initializeGround('type', 'rigid');
|
||||||
payload = initializePayload('type', 'none');
|
payload = initializePayload('type', 'none');
|
||||||
controller = initializeController('type', 'open-loop');
|
controller = initializeController('type', 'open-loop');
|
||||||
disturbances = initializeDisturbances();
|
disturbances = initializeDisturbances();
|
||||||
references = initializeReferences(stewart);
|
references = initializeReferences(stewart);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Controller design to be close to the wanted displacement
|
*** Controller design to be close to the wanted displacement
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'stewart_platform_model';
|
mdl = 'stewart_platform_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
|
||||||
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
|
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
|
||||||
|
|
||||||
%% Run the linearization
|
%% Run the linearization
|
||||||
G = linearize(mdl, io);
|
G = linearize(mdl, io);
|
||||||
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
|
||||||
G.OutputName = {'L1', 'L2', 'L3', 'L4', 'L5', 'L6'};
|
G.OutputName = {'L1', 'L2', 'L3', 'L4', 'L5', 'L6'};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
wc = 2*pi*30;
|
wc = 2*pi*30;
|
||||||
Kl = diag(1./diag(abs(freqresp(G, wc)))) * wc/s * 1/(1 + s/3/wc);
|
Kl = diag(1./diag(abs(freqresp(G, wc)))) * wc/s * 1/(1 + s/3/wc);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
controller = initializeController('type', 'ref-track-L');
|
controller = initializeController('type', 'ref-track-L');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Simulations
|
*** Simulations
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Tx_max = 60e-6; % Translation [m]
|
Tx_max = 60e-6; % Translation [m]
|
||||||
Ty_max = 60e-6; % Translation [m]
|
Ty_max = 60e-6; % Translation [m]
|
||||||
Tz_max = 60e-6; % Translation [m]
|
Tz_max = 60e-6; % Translation [m]
|
||||||
Rx_max = 30e-6; % Rotation [rad]
|
Rx_max = 30e-6; % Rotation [rad]
|
||||||
Ry_max = 30e-6; % Rotation [rad]
|
Ry_max = 30e-6; % Rotation [rad]
|
||||||
Rz_max = 0; % Rotation [rad]
|
Rz_max = 0; % Rotation [rad]
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max];
|
Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max];
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
cl_perf = zeros(size(Ps, 1), 1); % Closed loop performance [percentage]
|
cl_perf = zeros(size(Ps, 1), 1); % Closed loop performance [percentage]
|
||||||
Rs = zeros(size(Ps, 1), 5); % Max Flexor angles for the 6 legs [mrad]
|
Rs = zeros(size(Ps, 1), 5); % Max Flexor angles for the 6 legs [mrad]
|
||||||
|
|
||||||
for Ps_i = 1:size(Ps, 1)
|
for Ps_i = 1:size(Ps, 1)
|
||||||
fprintf('Experiment %i over %i', Ps_i, size(Ps, 1));
|
fprintf('Experiment %i over %i', Ps_i, size(Ps, 1));
|
||||||
|
|
||||||
references = initializeReferences(stewart, 't', 0, 'r', Ps(Ps_i, :)');
|
references = initializeReferences(stewart, 't', 0, 'r', Ps(Ps_i, :)');
|
||||||
set_param('stewart_platform_model','StopTime','0.1');
|
set_param('stewart_platform_model','StopTime','0.1');
|
||||||
sim('stewart_platform_model');
|
sim('stewart_platform_model');
|
||||||
|
|
||||||
cl_perf(Ps_i) = 100*max(abs((simout.y.dLm.Data(end, :) - references.rL.Data(:,1,1)')./simout.y.dLm.Data(end, :)));
|
cl_perf(Ps_i) = 100*max(abs((simout.y.dLm.Data(end, :) - references.rL.Data(:,1,1)')./simout.y.dLm.Data(end, :)));
|
||||||
Rs(Ps_i, :) = [max(abs(1e3*simout.y.Rf.Data(end, 1:2:end))), max(abs(1e3*simout.y.Rf.Data(end, 2:2:end))), max(abs(1e3*simout.y.Rm.Data(end, 1:3:end))), max(abs(1e3*simout.y.Rm.Data(end, 2:3:end))), max(abs(1e3*simout.y.Rm.Data(end, 3:3:end)))]';
|
Rs(Ps_i, :) = [max(abs(1e3*simout.y.Rf.Data(end, 1:2:end))), max(abs(1e3*simout.y.Rf.Data(end, 2:2:end))), max(abs(1e3*simout.y.Rm.Data(end, 1:3:end))), max(abs(1e3*simout.y.Rm.Data(end, 2:3:end))), max(abs(1e3*simout.y.Rm.Data(end, 3:3:end)))]';
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
Verify that the simulations are all correct:
|
Verify that the simulations are all correct:
|
||||||
#+begin_src matlab :results replace value
|
#+begin_src matlab :results replace value
|
||||||
max(cl_perf)
|
max(cl_perf)
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
@@ -802,7 +798,7 @@ Verify that the simulations are all correct:
|
|||||||
|
|
||||||
*** Results
|
*** Results
|
||||||
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
|
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
|
||||||
data2orgtable(max(Rs)', {'Rx bot', 'Ry bot', 'Rx top', 'Ry top', 'Rz top'}, {'Stroke [mrad]'}, ' %.2f ');
|
data2orgtable(max(Rs)', {'Rx bot', 'Ry bot', 'Rx top', 'Ry top', 'Rz top'}, {'Stroke [mrad]'}, ' %.2f ');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
@@ -830,22 +826,22 @@ This Matlab function is accessible [[file:../src/computeJacobian.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
function [stewart] = computeJacobian(stewart)
|
function [stewart] = computeJacobian(stewart)
|
||||||
% computeJacobian -
|
% computeJacobian -
|
||||||
%
|
%
|
||||||
% Syntax: [stewart] = computeJacobian(stewart)
|
% Syntax: [stewart] = computeJacobian(stewart)
|
||||||
%
|
%
|
||||||
% Inputs:
|
% Inputs:
|
||||||
% - stewart - With at least the following fields:
|
% - stewart - With at least the following fields:
|
||||||
% - geometry.As [3x6] - The 6 unit vectors for each strut expressed in {A}
|
% - geometry.As [3x6] - The 6 unit vectors for each strut expressed in {A}
|
||||||
% - geometry.Ab [3x6] - The 6 position of the joints bi expressed in {A}
|
% - geometry.Ab [3x6] - The 6 position of the joints bi expressed in {A}
|
||||||
% - actuators.K [6x1] - Total stiffness of the actuators
|
% - actuators.K [6x1] - Total stiffness of the actuators
|
||||||
%
|
%
|
||||||
% Outputs:
|
% Outputs:
|
||||||
% - stewart - With the 3 added field:
|
% - stewart - With the 3 added field:
|
||||||
% - kinematics.J [6x6] - The Jacobian Matrix
|
% - kinematics.J [6x6] - The Jacobian Matrix
|
||||||
% - kinematics.K [6x6] - The Stiffness Matrix
|
% - kinematics.K [6x6] - The Stiffness Matrix
|
||||||
% - kinematics.C [6x6] - The Compliance Matrix
|
% - kinematics.C [6x6] - The Compliance Matrix
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Check the =stewart= structure elements
|
*** Check the =stewart= structure elements
|
||||||
@@ -853,14 +849,14 @@ This Matlab function is accessible [[file:../src/computeJacobian.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
assert(isfield(stewart.geometry, 'As'), 'stewart.geometry should have attribute As')
|
assert(isfield(stewart.geometry, 'As'), 'stewart.geometry should have attribute As')
|
||||||
As = stewart.geometry.As;
|
As = stewart.geometry.As;
|
||||||
|
|
||||||
assert(isfield(stewart.geometry, 'Ab'), 'stewart.geometry should have attribute Ab')
|
assert(isfield(stewart.geometry, 'Ab'), 'stewart.geometry should have attribute Ab')
|
||||||
Ab = stewart.geometry.Ab;
|
Ab = stewart.geometry.Ab;
|
||||||
|
|
||||||
assert(isfield(stewart.actuators, 'K'), 'stewart.actuators should have attribute K')
|
assert(isfield(stewart.actuators, 'K'), 'stewart.actuators should have attribute K')
|
||||||
Ki = stewart.actuators.K;
|
Ki = stewart.actuators.K;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
@@ -869,7 +865,7 @@ This Matlab function is accessible [[file:../src/computeJacobian.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
J = [As' , cross(Ab, As)'];
|
J = [As' , cross(Ab, As)'];
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Compute Stiffness Matrix
|
*** Compute Stiffness Matrix
|
||||||
@@ -877,7 +873,7 @@ This Matlab function is accessible [[file:../src/computeJacobian.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
K = J'*diag(Ki)*J;
|
K = J'*diag(Ki)*J;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Compute Compliance Matrix
|
*** Compute Compliance Matrix
|
||||||
@@ -885,7 +881,7 @@ This Matlab function is accessible [[file:../src/computeJacobian.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
C = inv(K);
|
C = inv(K);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Populate the =stewart= structure
|
*** Populate the =stewart= structure
|
||||||
@@ -893,9 +889,9 @@ This Matlab function is accessible [[file:../src/computeJacobian.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
stewart.kinematics.J = J;
|
stewart.kinematics.J = J;
|
||||||
stewart.kinematics.K = K;
|
stewart.kinematics.K = K;
|
||||||
stewart.kinematics.C = C;
|
stewart.kinematics.C = C;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
@@ -938,23 +934,23 @@ Otherwise, when the limbs' lengths derived yield complex numbers, then the posit
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
function [Li, dLi] = inverseKinematics(stewart, args)
|
function [Li, dLi] = inverseKinematics(stewart, args)
|
||||||
% inverseKinematics - Compute the needed length of each strut to have the wanted position and orientation of {B} with respect to {A}
|
% inverseKinematics - Compute the needed length of each strut to have the wanted position and orientation of {B} with respect to {A}
|
||||||
%
|
%
|
||||||
% Syntax: [stewart] = inverseKinematics(stewart)
|
% Syntax: [stewart] = inverseKinematics(stewart)
|
||||||
%
|
%
|
||||||
% Inputs:
|
% Inputs:
|
||||||
% - stewart - A structure with the following fields
|
% - stewart - A structure with the following fields
|
||||||
% - geometry.Aa [3x6] - The positions ai expressed in {A}
|
% - geometry.Aa [3x6] - The positions ai expressed in {A}
|
||||||
% - geometry.Bb [3x6] - The positions bi expressed in {B}
|
% - geometry.Bb [3x6] - The positions bi expressed in {B}
|
||||||
% - geometry.l [6x1] - Length of each strut
|
% - geometry.l [6x1] - Length of each strut
|
||||||
% - args - Can have the following fields:
|
% - args - Can have the following fields:
|
||||||
% - AP [3x1] - The wanted position of {B} with respect to {A}
|
% - AP [3x1] - The wanted position of {B} with respect to {A}
|
||||||
% - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
|
% - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
|
||||||
%
|
%
|
||||||
% Outputs:
|
% Outputs:
|
||||||
% - Li [6x1] - The 6 needed length of the struts in [m] to have the wanted pose of {B} w.r.t. {A}
|
% - Li [6x1] - The 6 needed length of the struts in [m] to have the wanted pose of {B} w.r.t. {A}
|
||||||
% - dLi [6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A}
|
% - dLi [6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Optional Parameters
|
*** Optional Parameters
|
||||||
@@ -962,11 +958,11 @@ Otherwise, when the limbs' lengths derived yield complex numbers, then the posit
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
arguments
|
arguments
|
||||||
stewart
|
stewart
|
||||||
args.AP (3,1) double {mustBeNumeric} = zeros(3,1)
|
args.AP (3,1) double {mustBeNumeric} = zeros(3,1)
|
||||||
args.ARB (3,3) double {mustBeNumeric} = eye(3)
|
args.ARB (3,3) double {mustBeNumeric} = eye(3)
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Check the =stewart= structure elements
|
*** Check the =stewart= structure elements
|
||||||
@@ -974,14 +970,14 @@ Otherwise, when the limbs' lengths derived yield complex numbers, then the posit
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
assert(isfield(stewart.geometry, 'Aa'), 'stewart.geometry should have attribute Aa')
|
assert(isfield(stewart.geometry, 'Aa'), 'stewart.geometry should have attribute Aa')
|
||||||
Aa = stewart.geometry.Aa;
|
Aa = stewart.geometry.Aa;
|
||||||
|
|
||||||
assert(isfield(stewart.geometry, 'Bb'), 'stewart.geometry should have attribute Bb')
|
assert(isfield(stewart.geometry, 'Bb'), 'stewart.geometry should have attribute Bb')
|
||||||
Bb = stewart.geometry.Bb;
|
Bb = stewart.geometry.Bb;
|
||||||
|
|
||||||
assert(isfield(stewart.geometry, 'l'), 'stewart.geometry should have attribute l')
|
assert(isfield(stewart.geometry, 'l'), 'stewart.geometry should have attribute l')
|
||||||
l = stewart.geometry.l;
|
l = stewart.geometry.l;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
@@ -990,11 +986,11 @@ Otherwise, when the limbs' lengths derived yield complex numbers, then the posit
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Li = sqrt(args.AP'*args.AP + diag(Bb'*Bb) + diag(Aa'*Aa) - (2*args.AP'*Aa)' + (2*args.AP'*(args.ARB*Bb))' - diag(2*(args.ARB*Bb)'*Aa));
|
Li = sqrt(args.AP'*args.AP + diag(Bb'*Bb) + diag(Aa'*Aa) - (2*args.AP'*Aa)' + (2*args.AP'*(args.ARB*Bb))' - diag(2*(args.ARB*Bb)'*Aa));
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
dLi = Li-l;
|
dLi = Li-l;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** =forwardKinematicsApprox=: Compute the Approximate Forward Kinematics
|
** =forwardKinematicsApprox=: Compute the Approximate Forward Kinematics
|
||||||
@@ -1011,21 +1007,21 @@ This Matlab function is accessible [[file:../src/forwardKinematicsApprox.m][here
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
function [P, R] = forwardKinematicsApprox(stewart, args)
|
function [P, R] = forwardKinematicsApprox(stewart, args)
|
||||||
% forwardKinematicsApprox - Computed the approximate pose of {B} with respect to {A} from the length of each strut and using
|
% forwardKinematicsApprox - Computed the approximate pose of {B} with respect to {A} from the length of each strut and using
|
||||||
% the Jacobian Matrix
|
% the Jacobian Matrix
|
||||||
%
|
%
|
||||||
% Syntax: [P, R] = forwardKinematicsApprox(stewart, args)
|
% Syntax: [P, R] = forwardKinematicsApprox(stewart, args)
|
||||||
%
|
%
|
||||||
% Inputs:
|
% Inputs:
|
||||||
% - stewart - A structure with the following fields
|
% - stewart - A structure with the following fields
|
||||||
% - kinematics.J [6x6] - The Jacobian Matrix
|
% - kinematics.J [6x6] - The Jacobian Matrix
|
||||||
% - args - Can have the following fields:
|
% - args - Can have the following fields:
|
||||||
% - dL [6x1] - Displacement of each strut [m]
|
% - dL [6x1] - Displacement of each strut [m]
|
||||||
%
|
%
|
||||||
% Outputs:
|
% Outputs:
|
||||||
% - P [3x1] - The estimated position of {B} with respect to {A}
|
% - P [3x1] - The estimated position of {B} with respect to {A}
|
||||||
% - R [3x3] - The estimated rotation matrix that gives the orientation of {B} with respect to {A}
|
% - R [3x3] - The estimated rotation matrix that gives the orientation of {B} with respect to {A}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Optional Parameters
|
*** Optional Parameters
|
||||||
@@ -1033,10 +1029,10 @@ This Matlab function is accessible [[file:../src/forwardKinematicsApprox.m][here
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
arguments
|
arguments
|
||||||
stewart
|
stewart
|
||||||
args.dL (6,1) double {mustBeNumeric} = zeros(6,1)
|
args.dL (6,1) double {mustBeNumeric} = zeros(6,1)
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Check the =stewart= structure elements
|
*** Check the =stewart= structure elements
|
||||||
@@ -1044,8 +1040,8 @@ This Matlab function is accessible [[file:../src/forwardKinematicsApprox.m][here
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
assert(isfield(stewart.kinematics, 'J'), 'stewart.kinematics should have attribute J')
|
assert(isfield(stewart.kinematics, 'J'), 'stewart.kinematics should have attribute J')
|
||||||
J = stewart.kinematics.J;
|
J = stewart.kinematics.J;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Computation
|
*** Computation
|
||||||
@@ -1056,26 +1052,26 @@ From a small displacement of each strut $d\bm{\mathcal{L}}$, we can compute the
|
|||||||
position and orientation of {B} with respect to {A} using the following formula:
|
position and orientation of {B} with respect to {A} using the following formula:
|
||||||
\[ d \bm{\mathcal{X}} = \bm{J}^{-1} d\bm{\mathcal{L}} \]
|
\[ d \bm{\mathcal{X}} = \bm{J}^{-1} d\bm{\mathcal{L}} \]
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
X = J\args.dL;
|
X = J\args.dL;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
The position vector corresponds to the first 3 elements.
|
The position vector corresponds to the first 3 elements.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
P = X(1:3);
|
P = X(1:3);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
The next 3 elements are the orientation of {B} with respect to {A} expressed
|
The next 3 elements are the orientation of {B} with respect to {A} expressed
|
||||||
using the screw axis.
|
using the screw axis.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
theta = norm(X(4:6));
|
theta = norm(X(4:6));
|
||||||
s = X(4:6)/theta;
|
s = X(4:6)/theta;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
We then compute the corresponding rotation matrix.
|
We then compute the corresponding rotation matrix.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
R = [s(1)^2*(1-cos(theta)) + cos(theta) , s(1)*s(2)*(1-cos(theta)) - s(3)*sin(theta), s(1)*s(3)*(1-cos(theta)) + s(2)*sin(theta);
|
R = [s(1)^2*(1-cos(theta)) + cos(theta) , s(1)*s(2)*(1-cos(theta)) - s(3)*sin(theta), s(1)*s(3)*(1-cos(theta)) + s(2)*sin(theta);
|
||||||
s(2)*s(1)*(1-cos(theta)) + s(3)*sin(theta), s(2)^2*(1-cos(theta)) + cos(theta), s(2)*s(3)*(1-cos(theta)) - s(1)*sin(theta);
|
s(2)*s(1)*(1-cos(theta)) + s(3)*sin(theta), s(2)^2*(1-cos(theta)) + cos(theta), s(2)*s(3)*(1-cos(theta)) - s(1)*sin(theta);
|
||||||
s(3)*s(1)*(1-cos(theta)) - s(2)*sin(theta), s(3)*s(2)*(1-cos(theta)) + s(1)*sin(theta), s(3)^2*(1-cos(theta)) + cos(theta)];
|
s(3)*s(1)*(1-cos(theta)) - s(2)*sin(theta), s(3)*s(2)*(1-cos(theta)) + s(1)*sin(theta), s(3)^2*(1-cos(theta)) + cos(theta)];
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* Bibliography :ignore:
|
* Bibliography :ignore:
|
||||||
|
84
org/nass.org
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
#+TITLE: Stewart Platform - NASS
|
||||||
|
:DRAWER:
|
||||||
|
#+STARTUP: overview
|
||||||
|
|
||||||
|
#+LANGUAGE: en
|
||||||
|
#+EMAIL: dehaeze.thomas@gmail.com
|
||||||
|
#+AUTHOR: Dehaeze Thomas
|
||||||
|
|
||||||
|
#+HTML_LINK_HOME: ./index.html
|
||||||
|
#+HTML_LINK_UP: ./index.html
|
||||||
|
|
||||||
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
|
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
|
|
||||||
|
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||||||
|
#+PROPERTY: header-args:matlab+ :comments org
|
||||||
|
#+PROPERTY: header-args:matlab+ :exports both
|
||||||
|
#+PROPERTY: header-args:matlab+ :results none
|
||||||
|
#+PROPERTY: header-args:matlab+ :eval no-export
|
||||||
|
#+PROPERTY: header-args:matlab+ :noweb yes
|
||||||
|
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
||||||
|
#+PROPERTY: header-args:matlab+ :output-dir figs
|
||||||
|
|
||||||
|
#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}")
|
||||||
|
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes
|
||||||
|
#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150
|
||||||
|
#+PROPERTY: header-args:latex+ :imoutoptions -quality 100
|
||||||
|
#+PROPERTY: header-args:latex+ :results file raw replace
|
||||||
|
#+PROPERTY: header-args:latex+ :buffer no
|
||||||
|
#+PROPERTY: header-args:latex+ :eval no-export
|
||||||
|
#+PROPERTY: header-args:latex+ :exports results
|
||||||
|
#+PROPERTY: header-args:latex+ :mkdirp yes
|
||||||
|
#+PROPERTY: header-args:latex+ :output-dir figs
|
||||||
|
#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png")
|
||||||
|
:END:
|
||||||
|
|
||||||
|
* NASS
|
||||||
|
** Matlab Init :noexport:ignore:
|
||||||
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||||
|
<<matlab-dir>>
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none :results silent :noweb yes
|
||||||
|
<<matlab-init>>
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
simulinkproject('../');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
open('stewart_platform_model.slx')
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Identification of the Dynamics
|
||||||
|
#+begin_src matlab
|
||||||
|
apa = load('./mat/APA300ML.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
|
||||||
|
flex_joint = load('./mat/flexor_ID16.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
stewart = initializeStewartPlatform();
|
||||||
|
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 175e-3);
|
||||||
|
stewart = generateGeneralConfiguration(stewart, 'FH', 20e-3, 'MH', 20e-3, 'FR', 228e-3/2, 'MR', 220e-3/2, 'FTh', [-9, 9, 120-9, 120+9, 240-9, 240+9]*(pi/180), 'MTh', [-60+15, 60-15, 60+15, 180-15, 180+15, -60-15]*(pi/180));
|
||||||
|
stewart = computeJointsPose(stewart);
|
||||||
|
stewart = initializeFlexibleStrutDynamics(stewart, 'H', 0.03, 'K', apa.K, 'M', apa.M, 'n_xyz', apa.n_xyz, 'xi', 0.1, 'step_file', 'mat/APA300ML.STEP');
|
||||||
|
stewart = initializeJointDynamics(stewart, 'type_F', 'flexible', 'K_F', flex_joint.K, 'M_F', flex_joint.M, 'n_xyz_F', flex_joint.n_xyz, 'xi_F', 0.1, 'step_file_F', 'mat/flexor_ID16.STEP', 'type_M', 'flexible', 'K_M', flex_joint.K, 'M_M', flex_joint.M, 'n_xyz_M', flex_joint.n_xyz, 'xi_M', 0.1, 'step_file_M', 'mat/flexor_ID16.STEP');
|
||||||
|
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 150e-3, 'Mpr', 125e-3);
|
||||||
|
stewart = initializeCylindricalStruts(stewart, 'type_F', 'none', 'type_M', 'none');
|
||||||
|
stewart = computeJacobian(stewart);
|
||||||
|
stewart = initializeStewartPose(stewart);
|
||||||
|
stewart = initializeInertialSensor(stewart);
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
ground = initializeGround('type', 'none');
|
||||||
|
payload = initializePayload('type', 'rigid', 'm', 50);
|
||||||
|
controller = initializeController('type', 'open-loop');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
disturbances = initializeDisturbances();
|
||||||
|
references = initializeReferences(stewart);
|
||||||
|
#+end_src
|
@@ -9,12 +9,8 @@
|
|||||||
#+HTML_LINK_HOME: ./index.html
|
#+HTML_LINK_HOME: ./index.html
|
||||||
#+HTML_LINK_UP: ./index.html
|
#+HTML_LINK_UP: ./index.html
|
||||||
|
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
|
|
||||||
|
|
||||||
#+PROPERTY: header-args:matlab :session *MATLAB*
|
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||||||
#+PROPERTY: header-args:matlab+ :comments org
|
#+PROPERTY: header-args:matlab+ :comments org
|
||||||
@@ -69,12 +65,12 @@ This is done using something called "*Configuration Reference*" ([[https://fr.ma
|
|||||||
Basically, the configuration is stored in a mat file =conf_simscape.mat= and then loaded in the workspace for it to be accessible to all the simulink models.
|
Basically, the configuration is stored in a mat file =conf_simscape.mat= and then loaded in the workspace for it to be accessible to all the simulink models.
|
||||||
It is automatically loaded when the Simulink project is open. It can be loaded manually with the command:
|
It is automatically loaded when the Simulink project is open. It can be loaded manually with the command:
|
||||||
#+begin_src matlab :eval no
|
#+begin_src matlab :eval no
|
||||||
load('mat/conf_simscape.mat');
|
load('mat/conf_simscape.mat');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
It is however possible to modify specific parameters just for one simulation using the =set_param= command:
|
It is however possible to modify specific parameters just for one simulation using the =set_param= command:
|
||||||
#+begin_src matlab :eval no
|
#+begin_src matlab :eval no
|
||||||
set_param(conf_simscape, 'StopTime', 1);
|
set_param(conf_simscape, 'StopTime', 1);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* Subsystem Reference
|
* Subsystem Reference
|
||||||
@@ -162,29 +158,29 @@ This Matlab function is accessible [[file:../src/initializePayload.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
function [payload] = initializePayload(args)
|
function [payload] = initializePayload(args)
|
||||||
% initializePayload - Initialize the Payload that can then be used for simulations and analysis
|
% initializePayload - Initialize the Payload that can then be used for simulations and analysis
|
||||||
%
|
%
|
||||||
% Syntax: [payload] = initializePayload(args)
|
% Syntax: [payload] = initializePayload(args)
|
||||||
%
|
%
|
||||||
% Inputs:
|
% Inputs:
|
||||||
% - args - Structure with the following fields:
|
% - args - Structure with the following fields:
|
||||||
% - type - 'none', 'rigid', 'flexible', 'cartesian'
|
% - type - 'none', 'rigid', 'flexible', 'cartesian'
|
||||||
% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]
|
% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]
|
||||||
% This also the position where K and C are defined
|
% This also the position where K and C are defined
|
||||||
% - K [6x1] - Stiffness of the Payload [N/m, N/rad]
|
% - K [6x1] - Stiffness of the Payload [N/m, N/rad]
|
||||||
% - C [6x1] - Damping of the Payload [N/(m/s), N/(rad/s)]
|
% - C [6x1] - Damping of the Payload [N/(m/s), N/(rad/s)]
|
||||||
% - m [1x1] - Mass of the Payload [kg]
|
% - m [1x1] - Mass of the Payload [kg]
|
||||||
% - I [3x3] - Inertia matrix for the Payload [kg*m2]
|
% - I [3x3] - Inertia matrix for the Payload [kg*m2]
|
||||||
%
|
%
|
||||||
% Outputs:
|
% Outputs:
|
||||||
% - payload - Struture with the following properties:
|
% - payload - Struture with the following properties:
|
||||||
% - type - 1 (none), 2 (rigid), 3 (flexible)
|
% - type - 1 (none), 2 (rigid), 3 (flexible)
|
||||||
% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]
|
% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]
|
||||||
% - K [6x1] - Stiffness of the Payload [N/m, N/rad]
|
% - K [6x1] - Stiffness of the Payload [N/m, N/rad]
|
||||||
% - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)]
|
% - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)]
|
||||||
% - m [1x1] - Mass of the Payload [kg]
|
% - m [1x1] - Mass of the Payload [kg]
|
||||||
% - I [3x3] - Inertia matrix for the Payload [kg*m2]
|
% - I [3x3] - Inertia matrix for the Payload [kg*m2]
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Optional Parameters
|
*** Optional Parameters
|
||||||
@@ -192,14 +188,14 @@ This Matlab function is accessible [[file:../src/initializePayload.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
arguments
|
arguments
|
||||||
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'cartesian'})} = 'none'
|
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'cartesian'})} = 'none'
|
||||||
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(6,1)
|
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(6,1)
|
||||||
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
args.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e-3
|
args.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e-3
|
||||||
args.m (1,1) double {mustBeNumeric, mustBeNonnegative} = 10
|
args.m (1,1) double {mustBeNumeric, mustBeNonnegative} = 10
|
||||||
args.I (3,3) double {mustBeNumeric, mustBeNonnegative} = 1*eye(3)
|
args.I (3,3) double {mustBeNumeric, mustBeNonnegative} = 1*eye(3)
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Add Payload Type
|
*** Add Payload Type
|
||||||
@@ -207,16 +203,16 @@ This Matlab function is accessible [[file:../src/initializePayload.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
switch args.type
|
switch args.type
|
||||||
case 'none'
|
case 'none'
|
||||||
payload.type = 1;
|
payload.type = 1;
|
||||||
case 'rigid'
|
case 'rigid'
|
||||||
payload.type = 2;
|
payload.type = 2;
|
||||||
case 'flexible'
|
case 'flexible'
|
||||||
payload.type = 3;
|
payload.type = 3;
|
||||||
case 'cartesian'
|
case 'cartesian'
|
||||||
payload.type = 4;
|
payload.type = 4;
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Add Stiffness, Damping and Mass properties of the Payload
|
*** Add Stiffness, Damping and Mass properties of the Payload
|
||||||
@@ -224,12 +220,12 @@ This Matlab function is accessible [[file:../src/initializePayload.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
payload.K = args.K;
|
payload.K = args.K;
|
||||||
payload.C = args.C;
|
payload.C = args.C;
|
||||||
payload.m = args.m;
|
payload.m = args.m;
|
||||||
payload.I = args.I;
|
payload.I = args.I;
|
||||||
|
|
||||||
payload.h = args.h;
|
payload.h = args.h;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Ground
|
** Ground
|
||||||
@@ -246,23 +242,23 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
function [ground] = initializeGround(args)
|
function [ground] = initializeGround(args)
|
||||||
% initializeGround - Initialize the Ground that can then be used for simulations and analysis
|
% initializeGround - Initialize the Ground that can then be used for simulations and analysis
|
||||||
%
|
%
|
||||||
% Syntax: [ground] = initializeGround(args)
|
% Syntax: [ground] = initializeGround(args)
|
||||||
%
|
%
|
||||||
% Inputs:
|
% Inputs:
|
||||||
% - args - Structure with the following fields:
|
% - args - Structure with the following fields:
|
||||||
% - type - 'none', 'solid', 'flexible'
|
% - type - 'none', 'solid', 'flexible'
|
||||||
% - rot_point [3x1] - Rotation point for the ground motion [m]
|
% - rot_point [3x1] - Rotation point for the ground motion [m]
|
||||||
% - K [3x1] - Translation Stiffness of the Ground [N/m]
|
% - K [3x1] - Translation Stiffness of the Ground [N/m]
|
||||||
% - C [3x1] - Translation Damping of the Ground [N/(m/s)]
|
% - C [3x1] - Translation Damping of the Ground [N/(m/s)]
|
||||||
%
|
%
|
||||||
% Outputs:
|
% Outputs:
|
||||||
% - ground - Struture with the following properties:
|
% - ground - Struture with the following properties:
|
||||||
% - type - 1 (none), 2 (rigid), 3 (flexible)
|
% - type - 1 (none), 2 (rigid), 3 (flexible)
|
||||||
% - K [3x1] - Translation Stiffness of the Ground [N/m]
|
% - K [3x1] - Translation Stiffness of the Ground [N/m]
|
||||||
% - C [3x1] - Translation Damping of the Ground [N/(m/s)]
|
% - C [3x1] - Translation Damping of the Ground [N/(m/s)]
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Optional Parameters
|
*** Optional Parameters
|
||||||
@@ -270,12 +266,12 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
arguments
|
arguments
|
||||||
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'none'
|
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'none'
|
||||||
args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1)
|
args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1)
|
||||||
args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(3,1)
|
args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(3,1)
|
||||||
args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(3,1)
|
args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(3,1)
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Add Ground Type
|
*** Add Ground Type
|
||||||
@@ -283,14 +279,14 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
switch args.type
|
switch args.type
|
||||||
case 'none'
|
case 'none'
|
||||||
ground.type = 1;
|
ground.type = 1;
|
||||||
case 'rigid'
|
case 'rigid'
|
||||||
ground.type = 2;
|
ground.type = 2;
|
||||||
case 'flexible'
|
case 'flexible'
|
||||||
ground.type = 3;
|
ground.type = 3;
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Add Stiffness and Damping properties of the Ground
|
*** Add Stiffness and Damping properties of the Ground
|
||||||
@@ -298,8 +294,8 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
ground.K = args.K;
|
ground.K = args.K;
|
||||||
ground.C = args.C;
|
ground.C = args.C;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Rotation Point
|
*** Rotation Point
|
||||||
@@ -307,7 +303,7 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
ground.rot_point = args.rot_point;
|
ground.rot_point = args.rot_point;
|
||||||
#+end_src
|
#+end_src
|
||||||
* Initialize Disturbances
|
* Initialize Disturbances
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
@@ -322,13 +318,13 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
function [disturbances] = initializeDisturbances(args)
|
function [disturbances] = initializeDisturbances(args)
|
||||||
% initializeDisturbances - Initialize the disturbances
|
% initializeDisturbances - Initialize the disturbances
|
||||||
%
|
%
|
||||||
% Syntax: [disturbances] = initializeDisturbances(args)
|
% Syntax: [disturbances] = initializeDisturbances(args)
|
||||||
%
|
%
|
||||||
% Inputs:
|
% Inputs:
|
||||||
% - args -
|
% - args -
|
||||||
|
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@@ -337,12 +333,12 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
arguments
|
arguments
|
||||||
args.Fd double {mustBeNumeric, mustBeReal} = zeros(6,1)
|
args.Fd double {mustBeNumeric, mustBeReal} = zeros(6,1)
|
||||||
args.Fd_t double {mustBeNumeric, mustBeReal} = 0
|
args.Fd_t double {mustBeNumeric, mustBeReal} = 0
|
||||||
args.Dw double {mustBeNumeric, mustBeReal} = zeros(6,1)
|
args.Dw double {mustBeNumeric, mustBeReal} = zeros(6,1)
|
||||||
args.Dw_t double {mustBeNumeric, mustBeReal} = 0
|
args.Dw_t double {mustBeNumeric, mustBeReal} = 0
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
@@ -351,7 +347,7 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
disturbances = struct();
|
disturbances = struct();
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Ground Motion
|
** Ground Motion
|
||||||
@@ -359,7 +355,7 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
disturbances.Dw = timeseries([args.Dw], args.Dw_t);
|
disturbances.Dw = timeseries([args.Dw], args.Dw_t);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Direct Forces
|
** Direct Forces
|
||||||
@@ -367,7 +363,7 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
disturbances.Fd = timeseries([args.Fd], args.Fd_t);
|
disturbances.Fd = timeseries([args.Fd], args.Fd_t);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* Initialize References
|
* Initialize References
|
||||||
@@ -383,13 +379,13 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
function [references] = initializeReferences(stewart, args)
|
function [references] = initializeReferences(stewart, args)
|
||||||
% initializeReferences - Initialize the references
|
% initializeReferences - Initialize the references
|
||||||
%
|
%
|
||||||
% Syntax: [references] = initializeReferences(args)
|
% Syntax: [references] = initializeReferences(args)
|
||||||
%
|
%
|
||||||
% Inputs:
|
% Inputs:
|
||||||
% - args -
|
% - args -
|
||||||
|
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@@ -398,31 +394,31 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
arguments
|
arguments
|
||||||
stewart
|
stewart
|
||||||
args.t double {mustBeNumeric, mustBeReal} = 0
|
args.t double {mustBeNumeric, mustBeReal} = 0
|
||||||
args.r double {mustBeNumeric, mustBeReal} = zeros(6, 1)
|
args.r double {mustBeNumeric, mustBeReal} = zeros(6, 1)
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Compute the corresponding strut length
|
** Compute the corresponding strut length
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
rL = zeros(6, length(args.t));
|
rL = zeros(6, length(args.t));
|
||||||
|
|
||||||
for i = 1:length(args.t)
|
for i = 1:length(args.t)
|
||||||
R = [cos(args.r(6,i)) -sin(args.r(6,i)) 0;
|
R = [cos(args.r(6,i)) -sin(args.r(6,i)) 0;
|
||||||
sin(args.r(6,i)) cos(args.r(6,i)) 0;
|
sin(args.r(6,i)) cos(args.r(6,i)) 0;
|
||||||
0 0 1] * ...
|
0 0 1] * ...
|
||||||
[cos(args.r(5,i)) 0 sin(args.r(5,i));
|
[cos(args.r(5,i)) 0 sin(args.r(5,i));
|
||||||
0 1 0;
|
0 1 0;
|
||||||
-sin(args.r(5,i)) 0 cos(args.r(5,i))] * ...
|
-sin(args.r(5,i)) 0 cos(args.r(5,i))] * ...
|
||||||
[1 0 0;
|
[1 0 0;
|
||||||
0 cos(args.r(4,i)) -sin(args.r(4,i));
|
0 cos(args.r(4,i)) -sin(args.r(4,i));
|
||||||
0 sin(args.r(4,i)) cos(args.r(4,i))];
|
0 sin(args.r(4,i)) cos(args.r(4,i))];
|
||||||
|
|
||||||
[Li, dLi] = inverseKinematics(stewart, 'AP', [args.r(1,i); args.r(2,i); args.r(3,i)], 'ARB', R);
|
[Li, dLi] = inverseKinematics(stewart, 'AP', [args.r(1,i); args.r(2,i); args.r(3,i)], 'ARB', R);
|
||||||
rL(:, i) = dLi;
|
rL(:, i) = dLi;
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** References
|
** References
|
||||||
@@ -430,6 +426,6 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
|
|||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
references.r = timeseries(args.r, args.t);
|
references.r = timeseries(args.r, args.t);
|
||||||
references.rL = timeseries(rL, args.t);
|
references.rL = timeseries(rL, args.t);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
@@ -9,12 +9,8 @@
|
|||||||
#+HTML_LINK_HOME: ./index.html
|
#+HTML_LINK_HOME: ./index.html
|
||||||
#+HTML_LINK_UP: ./index.html
|
#+HTML_LINK_UP: ./index.html
|
||||||
|
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
|
|
||||||
|
|
||||||
#+PROPERTY: header-args:matlab :session *MATLAB*
|
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||||||
#+PROPERTY: header-args:matlab+ :comments org
|
#+PROPERTY: header-args:matlab+ :comments org
|
||||||
@@ -53,30 +49,30 @@ From the [[https://mathworks.com/products/simulink/projects.html][Simulink proje
|
|||||||
The project can be opened using the =simulinkproject= function:
|
The project can be opened using the =simulinkproject= function:
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
simulinkproject('../');
|
simulinkproject('../');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
When the project opens, a startup script is ran.
|
When the project opens, a startup script is ran.
|
||||||
The startup script is defined below and is exported to the =project_startup.m= script.
|
The startup script is defined below and is exported to the =project_startup.m= script.
|
||||||
#+begin_src matlab :eval no :tangle ../src/project_startup.m
|
#+begin_src matlab :eval no :tangle ../src/project_startup.m
|
||||||
project = simulinkproject;
|
project = simulinkproject;
|
||||||
projectRoot = project.RootFolder;
|
projectRoot = project.RootFolder;
|
||||||
|
|
||||||
myCacheFolder = fullfile(projectRoot, '.SimulinkCache');
|
myCacheFolder = fullfile(projectRoot, '.SimulinkCache');
|
||||||
myCodeFolder = fullfile(projectRoot, '.SimulinkCode');
|
myCodeFolder = fullfile(projectRoot, '.SimulinkCode');
|
||||||
|
|
||||||
Simulink.fileGenControl('set',...
|
Simulink.fileGenControl('set',...
|
||||||
'CacheFolder', myCacheFolder,...
|
'CacheFolder', myCacheFolder,...
|
||||||
'CodeGenFolder', myCodeFolder,...
|
'CodeGenFolder', myCodeFolder,...
|
||||||
'createDir', true);
|
'createDir', true);
|
||||||
|
|
||||||
%% Load the Simscape Configuration
|
%% Load the Simscape Configuration
|
||||||
load('mat/conf_simscape.mat');
|
load('mat/conf_simscape.mat');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
When the project closes, it runs the =project_shutdown.m= script defined below.
|
When the project closes, it runs the =project_shutdown.m= script defined below.
|
||||||
#+begin_src matlab :eval no :tangle ../src/project_shutdown.m
|
#+begin_src matlab :eval no :tangle ../src/project_shutdown.m
|
||||||
Simulink.fileGenControl('reset');
|
Simulink.fileGenControl('reset');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
The project also permits to automatically add defined folder to the path when the project is opened.
|
The project also permits to automatically add defined folder to the path when the project is opened.
|
||||||
|
@@ -9,12 +9,8 @@
|
|||||||
#+HTML_LINK_HOME: ./index.html
|
#+HTML_LINK_HOME: ./index.html
|
||||||
#+HTML_LINK_UP: ./index.html
|
#+HTML_LINK_UP: ./index.html
|
||||||
|
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
|
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
|
|
||||||
|
|
||||||
#+PROPERTY: header-args:matlab :session *MATLAB*
|
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||||||
#+PROPERTY: header-args:matlab+ :comments org
|
#+PROPERTY: header-args:matlab+ :comments org
|
||||||
@@ -42,16 +38,16 @@
|
|||||||
What causes the coupling from $F_i$ to $X_i$ ?
|
What causes the coupling from $F_i$ to $X_i$ ?
|
||||||
|
|
||||||
#+begin_src latex :file coupling.pdf
|
#+begin_src latex :file coupling.pdf
|
||||||
\begin{tikzpicture}
|
\begin{tikzpicture}
|
||||||
\node[block] (Jt) at (0, 0) {$J^{-T}$};
|
\node[block] (Jt) at (0, 0) {$J^{-T}$};
|
||||||
\node[block, right= of Jt] (G) {$G$};
|
\node[block, right= of Jt] (G) {$G$};
|
||||||
\node[block, right= of G] (J) {$J^{-1}$};
|
\node[block, right= of G] (J) {$J^{-1}$};
|
||||||
|
|
||||||
\draw[->] ($(Jt.west)+(-0.8, 0)$) -- (Jt.west) node[above left]{$F_i$};
|
\draw[->] ($(Jt.west)+(-0.8, 0)$) -- (Jt.west) node[above left]{$F_i$};
|
||||||
\draw[->] (Jt.east) -- (G.west) node[above left]{$\tau_i$};
|
\draw[->] (Jt.east) -- (G.west) node[above left]{$\tau_i$};
|
||||||
\draw[->] (G.east) -- (J.west) node[above left]{$q_i$};
|
\draw[->] (G.east) -- (J.west) node[above left]{$q_i$};
|
||||||
\draw[->] (J.east) -- ++(0.8, 0) node[above left]{$X_i$};
|
\draw[->] (J.east) -- ++(0.8, 0) node[above left]{$X_i$};
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:block_diag_coupling
|
#+name: fig:block_diag_coupling
|
||||||
|
48
src/initializeFlexibleStrutAndJointDynamics.m
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
function [stewart] = initializeFlexibleStrutAndJointDynamics(stewart, args)
|
||||||
|
% initializeFlexibleStrutAndJointDynamics - Add Stiffness and Damping properties of each strut
|
||||||
|
%
|
||||||
|
% Syntax: [stewart] = initializeFlexibleStrutAndJointDynamics(args)
|
||||||
|
%
|
||||||
|
% Inputs:
|
||||||
|
% - args - Structure with the following fields:
|
||||||
|
% - K [nxn] - Vertical stiffness contribution of the piezoelectric stack [N/m]
|
||||||
|
% - M [nxn] - Vertical damping contribution of the piezoelectric stack [N/(m/s)]
|
||||||
|
% - xi [1x1] - Vertical (residual) stiffness when the piezoelectric stack is removed [N/m]
|
||||||
|
% - step_file [6x1] - Vertical (residual) damping when the piezoelectric stack is removed [N/(m/s)]
|
||||||
|
% - Gf [6x1] - Gain from strain in [m] to measured [N] such that it matches
|
||||||
|
%
|
||||||
|
% Outputs:
|
||||||
|
% - stewart - updated Stewart structure with the added fields:
|
||||||
|
|
||||||
|
arguments
|
||||||
|
stewart
|
||||||
|
args.K double {mustBeNumeric} = zeros(6,6)
|
||||||
|
args.M double {mustBeNumeric} = zeros(6,6)
|
||||||
|
args.H double {mustBeNumeric} = 0
|
||||||
|
args.n_xyz double {mustBeNumeric} = zeros(2,3)
|
||||||
|
args.xi double {mustBeNumeric} = 0.1
|
||||||
|
args.Gf double {mustBeNumeric} = 1
|
||||||
|
args.step_file char {} = ''
|
||||||
|
end
|
||||||
|
|
||||||
|
stewart.actuators.ax_off = (stewart.geometry.l(1) - args.H)/2; % Axial Offset at the ends of the actuator
|
||||||
|
|
||||||
|
stewart.joints_F.type = 10;
|
||||||
|
stewart.joints_M.type = 10;
|
||||||
|
|
||||||
|
stewart.struts_F.type = 3;
|
||||||
|
stewart.struts_M.type = 3;
|
||||||
|
|
||||||
|
stewart.actuators.type = 4;
|
||||||
|
|
||||||
|
stewart.actuators.Km = args.K;
|
||||||
|
stewart.actuators.Mm = args.M;
|
||||||
|
|
||||||
|
stewart.actuators.n_xyz = args.n_xyz;
|
||||||
|
stewart.actuators.xi = args.xi;
|
||||||
|
|
||||||
|
stewart.actuators.step_file = args.step_file;
|
||||||
|
|
||||||
|
stewart.actuators.K = args.K(3,3); % Axial Stiffness
|
||||||
|
|
||||||
|
stewart.actuators.Gf = args.Gf;
|
30
src/initializeSolidPlatforms.m
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
function [stewart] = initializeSolidPlatforms(stewart, args)
|
||||||
|
% initializeSolidPlatforms - Initialize the geometry of the Fixed and Mobile Platforms
|
||||||
|
%
|
||||||
|
% Syntax: [stewart] = initializeSolidPlatforms(args)
|
||||||
|
%
|
||||||
|
% Inputs:
|
||||||
|
% - args - Structure with the following fields:
|
||||||
|
% - density [1x1] - Density of the platforms [kg]
|
||||||
|
%
|
||||||
|
% Outputs:
|
||||||
|
% - stewart - updated Stewart structure with the added fields:
|
||||||
|
% - platform_F [struct] - structure with the following fields:
|
||||||
|
% - type = 2
|
||||||
|
% - M [1x1] - Fixed Platform Density [kg/m^3]
|
||||||
|
% - platform_M [struct] - structure with the following fields:
|
||||||
|
% - type = 2
|
||||||
|
% - M [1x1] - Mobile Platform Density [kg/m^3]
|
||||||
|
|
||||||
|
arguments
|
||||||
|
stewart
|
||||||
|
args.density (1,1) double {mustBeNumeric, mustBePositive} = 7800
|
||||||
|
end
|
||||||
|
|
||||||
|
stewart.platform_F.type = 2;
|
||||||
|
|
||||||
|
stewart.platform_F.density = args.density;
|
||||||
|
|
||||||
|
stewart.platform_M.type = 2;
|
||||||
|
|
||||||
|
stewart.platform_M.density = args.density;
|