stewart-simscape/docs/control-active-damping.html

668 lines
34 KiB
HTML
Raw Permalink Normal View History

2020-01-22 16:31:44 +01:00
<?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 15:54:58 +01:00
<!-- 2021-01-08 ven. 15:53 -->
2020-01-22 16:31:44 +01:00
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
2020-02-06 15:39:35 +01:00
<title>Stewart Platform - Decentralized Active Damping</title>
2020-01-22 16:31:44 +01:00
<meta name="generator" content="Org mode" />
<meta name="author" content="Dehaeze Thomas" />
2021-01-08 15:34:53 +01:00
<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>
<script>
MathJax = {
svg: {
scale: 1,
fontCache: "global"
},
tex: {
tags: "ams",
multlineWidth: "%MULTLINEWIDTH",
tagSide: "right",
macros: {bm: ["\\boldsymbol{#1}",1],},
tagIndent: ".8em"
}
};
</script>
<script id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
2020-01-22 16:31:44 +01:00
</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">
2020-02-06 15:39:35 +01:00
<h1 class="title">Stewart Platform - Decentralized Active Damping</h1>
2020-01-22 16:31:44 +01:00
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
2021-01-08 15:34:53 +01:00
<li><a href="#orgddaf52f">1. Inertial Control</a>
2020-02-06 15:39:35 +01:00
<ul>
2021-01-08 15:34:53 +01:00
<li><a href="#org933440d">1.1. Identification of the Dynamics</a></li>
2021-01-08 15:54:58 +01:00
<li><a href="#org2875dd1">1.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li>
<li><a href="#org0cea759">1.3. Obtained Damping</a></li>
<li><a href="#orga866100">1.4. Conclusion</a></li>
2020-02-06 15:39:35 +01:00
</ul>
</li>
2021-01-08 15:34:53 +01:00
<li><a href="#orgf8ed544">2. Integral Force Feedback</a>
2020-02-06 15:39:35 +01:00
<ul>
2021-01-08 15:54:58 +01:00
<li><a href="#orga2d019b">2.1. Identification of the Dynamics with perfect Joints</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="#org06e1086">2.3. Obtained Damping</a></li>
<li><a href="#orgfa832d6">2.4. Conclusion</a></li>
2020-02-06 15:39:35 +01:00
</ul>
</li>
2021-01-08 15:34:53 +01:00
<li><a href="#orgabec4e1">3. Direct Velocity Feedback</a>
2020-01-22 16:31:44 +01:00
<ul>
2021-01-08 15:54:58 +01:00
<li><a href="#org19cbcee">3.1. Identification of the Dynamics with perfect Joints</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="#org6c74c9a">3.3. Obtained Damping</a></li>
<li><a href="#org81b2156">3.4. Conclusion</a></li>
</ul>
</li>
2021-01-08 15:34:53 +01:00
<li><a href="#orgc7e2089">4. Compliance and Transmissibility Comparison</a>
<ul>
2021-01-08 15:34:53 +01:00
<li><a href="#org6ec3b9e">4.1. Initialization</a></li>
<li><a href="#orge87554a">4.2. Identification</a></li>
<li><a href="#org1d70ccd">4.3. Results</a></li>
2020-01-22 16:31:44 +01:00
</ul>
</li>
</ul>
</div>
</div>
2020-02-06 15:39:35 +01:00
<p>
The following decentralized active damping techniques are briefly studied:
</p>
<ul class="org-ul">
2021-01-08 15:34:53 +01:00
<li>Inertial Control (proportional feedback of the absolute velocity): Section <a href="#org709d56c">1</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="#org63027d0">3</a></li>
2020-02-06 15:39:35 +01:00
</ul>
2021-01-08 15:34:53 +01:00
<div id="outline-container-orgddaf52f" class="outline-2">
<h2 id="orgddaf52f"><span class="section-number-2">1</span> Inertial Control</h2>
2020-02-11 15:50:52 +01:00
<div class="outline-text-2" id="text-1">
2020-02-06 15:39:35 +01:00
<p>
2021-01-08 15:34:53 +01:00
<a id="org709d56c"></a>
2020-02-06 15:39:35 +01:00
</p>
2020-02-13 16:46:47 +01:00
2021-01-08 15:54:58 +01:00
<div class="note" id="org1ae7526">
2020-02-13 16:46:47 +01:00
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_inertial.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run active_damping_inertial.m</code>.
</p>
</div>
2020-01-22 16:31:44 +01:00
</div>
2020-02-06 15:39:35 +01:00
2021-01-08 15:34:53 +01:00
<div id="outline-container-org933440d" class="outline-3">
<h3 id="org933440d"><span class="section-number-3">1.1</span> Identification of the Dynamics</h3>
2020-02-11 15:50:52 +01:00
<div class="outline-text-3" id="text-1-1">
2020-01-22 16:31:44 +01:00
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<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>, 45e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
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 = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'accelerometer'</span>, <span class="org-string">'freq'</span>, 5e3);
2020-02-06 15:39:35 +01:00
</pre>
</div>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<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(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
</pre>
</div>
2020-02-06 15:39:35 +01:00
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
options = linearizeOptions;
options.SampleTime = 0;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = <span class="org-string">'stewart_platform_model'</span>;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1;
io(io_i) = linio([mdl, <span class="org-string">'/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, <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>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
G = linearize(mdl, io, options);
G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
G.OutputName = {<span class="org-string">'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>};
2020-01-22 16:31:44 +01:00
</pre>
</div>
2020-02-06 15:39:35 +01:00
<p>
2021-01-08 15:34:53 +01:00
The transfer function from actuator forces to force sensors is shown in Figure <a href="#org5cd47c9">1</a>.
2020-02-06 15:39:35 +01:00
</p>
2021-01-08 15:34:53 +01:00
<div id="org5cd47c9" class="figure">
2020-02-06 15:39:35 +01:00
<p><img src="figs/inertial_plant_coupling.png" alt="inertial_plant_coupling.png" />
</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>
</div>
2020-01-22 16:31:44 +01:00
</div>
</div>
2021-01-08 15:54:58 +01:00
<div id="outline-container-org2875dd1" class="outline-3">
<h3 id="org2875dd1"><span class="section-number-3">1.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
2020-02-11 15:50:52 +01:00
<div class="outline-text-3" id="text-1-2">
2020-02-06 15:39:35 +01:00
<p>
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
</p>
2020-01-22 16:31:44 +01:00
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<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.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 = {<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>};
2020-01-22 16:31:44 +01:00
</pre>
</div>
2020-02-06 15:39:35 +01:00
2020-02-11 18:04:45 +01:00
<p>
We now use the amplified actuators and re-identify the dynamics
</p>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
Ga = linearize(mdl, io, options);
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 = {<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>};
2020-02-11 18:04:45 +01:00
</pre>
</div>
2020-02-06 15:39:35 +01:00
<p>
2021-01-08 15:34:53 +01:00
The new dynamics from force actuator to force sensor is shown in Figure <a href="#org8fcc87b">2</a>.
2020-02-06 15:39:35 +01:00
</p>
2021-01-08 15:34:53 +01:00
<div id="org8fcc87b" class="figure">
2020-02-06 15:39:35 +01:00
<p><img src="figs/inertial_plant_flexible_joint_decentralized.png" alt="inertial_plant_flexible_joint_decentralized.png" />
</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>
</div>
2020-01-22 16:31:44 +01:00
</div>
</div>
2021-01-08 15:54:58 +01:00
<div id="outline-container-org0cea759" class="outline-3">
<h3 id="org0cea759"><span class="section-number-3">1.3</span> Obtained Damping</h3>
2020-02-11 15:50:52 +01:00
<div class="outline-text-3" id="text-1-3">
2020-02-06 15:39:35 +01:00
<p>
The control is a performed in a decentralized manner.
The \(6 \times 6\) control is a diagonal matrix with pure proportional action on the diagonal:
\[ K(s) = g
\begin{bmatrix}
1 & & 0 \\
& \ddots & \\
0 & & 1
\end{bmatrix} \]
</p>
<p>
2021-01-08 15:34:53 +01:00
The root locus is shown in figure <a href="#orgaea8656">3</a>.
2020-02-06 15:39:35 +01:00
</p>
2021-01-08 15:34:53 +01:00
<div id="orgaea8656" class="figure">
2020-02-06 15:39:35 +01:00
<p><img src="figs/root_locus_inertial_rot_stiffness.png" alt="root_locus_inertial_rot_stiffness.png" />
</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>
</div>
</div>
</div>
2021-01-08 15:54:58 +01:00
<div id="outline-container-orga866100" class="outline-3">
<h3 id="orga866100"><span class="section-number-3">1.4</span> Conclusion</h3>
2020-02-11 15:50:52 +01:00
<div class="outline-text-3" id="text-1-4">
2021-01-08 15:54:58 +01:00
<div class="important" id="org91c21ee">
2020-02-06 15:39:35 +01:00
<p>
2020-02-11 18:04:45 +01:00
We do not have guaranteed stability with Inertial control. This is because of the flexibility inside the internal sensor.
2020-02-06 15:39:35 +01:00
</p>
</div>
</div>
</div>
</div>
2021-01-08 15:34:53 +01:00
<div id="outline-container-orgf8ed544" class="outline-2">
<h2 id="orgf8ed544"><span class="section-number-2">2</span> Integral Force Feedback</h2>
2020-02-11 15:50:52 +01:00
<div class="outline-text-2" id="text-2">
2020-02-06 15:39:35 +01:00
<p>
2021-01-08 15:34:53 +01:00
<a id="org1f0d316"></a>
2020-02-06 15:39:35 +01:00
</p>
2020-02-13 16:46:47 +01:00
2021-01-08 15:54:58 +01:00
<div class="note" id="org30f755d">
2020-02-13 16:46:47 +01:00
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_iff.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run active_damping_iff.m</code>.
</p>
</div>
2020-02-06 15:39:35 +01:00
</div>
2021-01-08 15:54:58 +01:00
<div id="outline-container-orga2d019b" class="outline-3">
<h3 id="orga2d019b"><span class="section-number-3">2.1</span> Identification of the Dynamics with perfect Joints</h3>
2020-02-11 15:50:52 +01:00
<div class="outline-text-3" id="text-2-1">
2020-02-06 15:39:35 +01:00
<p>
We first initialize the Stewart platform without joint stiffness.
</p>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<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>, 45e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
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 = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
2020-02-06 15:39:35 +01:00
</pre>
</div>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<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(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
</pre>
</div>
2020-02-06 15:39:35 +01:00
<p>
And we identify the dynamics from force actuators to force sensors.
</p>
2020-01-22 16:31:44 +01:00
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = <span class="org-string">'stewart_platform_model'</span>;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1;
io(io_i) = linio([mdl, <span class="org-string">'/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, <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>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
G = linearize(mdl, io);
G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
G.OutputName = {<span class="org-string">'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>};
2020-01-22 16:31:44 +01:00
</pre>
</div>
2020-02-06 15:39:35 +01:00
<p>
2021-01-08 15:34:53 +01:00
The transfer function from actuator forces to force sensors is shown in Figure <a href="#org3b3de64">4</a>.
2020-02-06 15:39:35 +01:00
</p>
2021-01-08 15:34:53 +01:00
<div id="org3b3de64" class="figure">
2020-02-06 15:39:35 +01:00
<p><img src="figs/iff_plant_coupling.png" alt="iff_plant_coupling.png" />
</p>
2020-02-11 18:04:45 +01:00
<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>
2020-02-06 15:39:35 +01:00
</div>
2020-01-22 16:31:44 +01:00
</div>
</div>
2021-01-08 15:54:58 +01:00
<div id="outline-container-org6ac04ee" class="outline-3">
<h3 id="org6ac04ee"><span class="section-number-3">2.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
2020-02-11 15:50:52 +01:00
<div class="outline-text-3" id="text-2-2">
2020-02-06 15:39:35 +01:00
<p>
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
</p>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<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.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 = {<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>};
2020-02-06 15:39:35 +01:00
</pre>
</div>
<p>
2020-02-11 18:04:45 +01:00
We now use the amplified actuators and re-identify the dynamics
</p>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
Ga = linearize(mdl, io);
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 = {<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>};
2020-02-11 18:04:45 +01:00
</pre>
</div>
<p>
2021-01-08 15:34:53 +01:00
The new dynamics from force actuator to force sensor is shown in Figure <a href="#org1902b8f">5</a>.
2020-02-06 15:39:35 +01:00
</p>
2021-01-08 15:34:53 +01:00
<div id="org1902b8f" class="figure">
2020-02-06 15:39:35 +01:00
<p><img src="figs/iff_plant_flexible_joint_decentralized.png" alt="iff_plant_flexible_joint_decentralized.png" />
</p>
2020-02-11 18:04:45 +01:00
<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>
2020-02-06 15:39:35 +01:00
</div>
</div>
</div>
2021-01-08 15:54:58 +01:00
<div id="outline-container-org06e1086" class="outline-3">
<h3 id="org06e1086"><span class="section-number-3">2.3</span> Obtained Damping</h3>
2020-02-11 15:50:52 +01:00
<div class="outline-text-3" id="text-2-3">
2020-02-06 15:39:35 +01:00
<p>
The control is a performed in a decentralized manner.
The \(6 \times 6\) control is a diagonal matrix with pure integration action on the diagonal:
\[ K(s) = g
\begin{bmatrix}
\frac{1}{s} & & 0 \\
& \ddots & \\
0 & & \frac{1}{s}
\end{bmatrix} \]
</p>
<p>
2021-01-08 15:34:53 +01:00
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>.
2020-02-06 15:39:35 +01:00
</p>
2021-01-08 15:34:53 +01:00
<div id="orgce5d8d8" class="figure">
2020-02-06 15:39:35 +01:00
<p><img src="figs/root_locus_iff_rot_stiffness.png" alt="root_locus_iff_rot_stiffness.png" />
</p>
2020-02-11 18:04:45 +01:00
<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>
2020-02-06 15:39:35 +01:00
</div>
2021-01-08 15:34:53 +01:00
<div id="org67419cd" class="figure">
2020-02-06 15:39:35 +01:00
<p><img src="figs/pole_damping_gain_iff_rot_stiffness.png" alt="pole_damping_gain_iff_rot_stiffness.png" />
</p>
2020-02-11 18:04:45 +01:00
<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>
2020-02-06 15:39:35 +01:00
</div>
</div>
</div>
2021-01-08 15:54:58 +01:00
<div id="outline-container-orgfa832d6" class="outline-3">
<h3 id="orgfa832d6"><span class="section-number-3">2.4</span> Conclusion</h3>
2020-02-11 15:50:52 +01:00
<div class="outline-text-3" id="text-2-4">
2021-01-08 15:54:58 +01:00
<div class="important" id="orgad0c17b">
2020-02-06 15:39:35 +01:00
<p>
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.
</p>
</div>
</div>
</div>
</div>
2021-01-08 15:34:53 +01:00
<div id="outline-container-orgabec4e1" class="outline-2">
<h2 id="orgabec4e1"><span class="section-number-2">3</span> Direct Velocity Feedback</h2>
2020-02-11 15:50:52 +01:00
<div class="outline-text-2" id="text-3">
2020-02-06 15:39:35 +01:00
<p>
2021-01-08 15:34:53 +01:00
<a id="org63027d0"></a>
2020-02-06 15:39:35 +01:00
</p>
2020-02-13 16:46:47 +01:00
2021-01-08 15:54:58 +01:00
<div class="note" id="orgadea9d6">
2020-02-13 16:46:47 +01:00
<p>
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_dvf.m">here</a>.
</p>
<p>
To run the script, open the Simulink Project, and type <code>run active_damping_dvf.m</code>.
</p>
</div>
2020-02-06 15:39:35 +01:00
</div>
2021-01-08 15:54:58 +01:00
<div id="outline-container-org19cbcee" class="outline-3">
<h3 id="org19cbcee"><span class="section-number-3">3.1</span> Identification of the Dynamics with perfect Joints</h3>
2020-02-11 15:50:52 +01:00
<div class="outline-text-3" id="text-3-1">
2020-02-06 15:39:35 +01:00
<p>
We first initialize the Stewart platform without joint stiffness.
</p>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<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>, 45e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
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 = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
2020-02-06 15:39:35 +01:00
</pre>
</div>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<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(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
</pre>
</div>
2020-02-06 15:39:35 +01:00
<p>
And we identify the dynamics from force actuators to force sensors.
</p>
2020-01-22 16:31:44 +01:00
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
options = linearizeOptions;
options.SampleTime = 0;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = <span class="org-string">'stewart_platform_model'</span>;
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1;
io(io_i) = linio([mdl, <span class="org-string">'/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, <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>
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
G = linearize(mdl, io, options);
G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
G.OutputName = {<span class="org-string">'Dm1'</span>, <span class="org-string">'Dm2'</span>, <span class="org-string">'Dm3'</span>, <span class="org-string">'Dm4'</span>, <span class="org-string">'Dm5'</span>, <span class="org-string">'Dm6'</span>};
2020-01-22 16:31:44 +01:00
</pre>
</div>
2020-02-06 15:39:35 +01:00
<p>
2021-01-08 15:34:53 +01:00
The transfer function from actuator forces to relative motion sensors is shown in Figure <a href="#org34c24ba">8</a>.
2020-02-06 15:39:35 +01:00
</p>
2021-01-08 15:34:53 +01:00
<div id="org34c24ba" class="figure">
2020-02-06 15:39:35 +01:00
<p><img src="figs/dvf_plant_coupling.png" alt="dvf_plant_coupling.png" />
</p>
2020-02-11 18:04:45 +01:00
<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>
2020-02-06 15:39:35 +01:00
</div>
</div>
</div>
2021-01-08 15:54:58 +01:00
<div id="outline-container-org0fabf01" class="outline-3">
<h3 id="org0fabf01"><span class="section-number-3">3.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
2020-02-11 15:50:52 +01:00
<div class="outline-text-3" id="text-3-2">
2020-02-06 15:39:35 +01:00
<p>
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
</p>
2020-01-22 16:31:44 +01:00
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<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.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 = {<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>};
2020-01-22 16:31:44 +01:00
</pre>
</div>
2020-02-06 15:39:35 +01:00
<p>
2020-02-11 18:04:45 +01:00
We now use the amplified actuators and re-identify the dynamics
</p>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
Ga = linearize(mdl, io, options);
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 = {<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>};
2020-02-11 18:04:45 +01:00
</pre>
</div>
<p>
2021-01-08 15:34:53 +01:00
The new dynamics from force actuator to relative motion sensor is shown in Figure <a href="#orgba524e3">9</a>.
2020-02-06 15:39:35 +01:00
</p>
2021-01-08 15:34:53 +01:00
<div id="orgba524e3" class="figure">
2020-02-06 15:39:35 +01:00
<p><img src="figs/dvf_plant_flexible_joint_decentralized.png" alt="dvf_plant_flexible_joint_decentralized.png" />
</p>
2020-02-11 18:04:45 +01:00
<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>
2020-02-06 15:39:35 +01:00
</div>
2020-01-22 16:31:44 +01:00
</div>
</div>
2021-01-08 15:54:58 +01:00
<div id="outline-container-org6c74c9a" class="outline-3">
<h3 id="org6c74c9a"><span class="section-number-3">3.3</span> Obtained Damping</h3>
2020-02-11 15:50:52 +01:00
<div class="outline-text-3" id="text-3-3">
2020-01-22 16:31:44 +01:00
<p>
2020-02-06 15:39:35 +01:00
The control is a performed in a decentralized manner.
The \(6 \times 6\) control is a diagonal matrix with pure derivative action on the diagonal:
\[ K(s) = g
\begin{bmatrix}
s & & \\
& \ddots & \\
& & s
\end{bmatrix} \]
2020-01-22 16:31:44 +01:00
</p>
2020-02-06 15:39:35 +01:00
<p>
2021-01-08 15:34:53 +01:00
The root locus is shown in figure <a href="#org0436b4d">10</a>.
2020-02-06 15:39:35 +01:00
</p>
2021-01-08 15:34:53 +01:00
<div id="org0436b4d" class="figure">
2020-02-06 15:39:35 +01:00
<p><img src="figs/root_locus_dvf_rot_stiffness.png" alt="root_locus_dvf_rot_stiffness.png" />
</p>
2020-02-11 18:04:45 +01:00
<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>
2020-02-06 15:39:35 +01:00
</div>
</div>
</div>
2021-01-08 15:54:58 +01:00
<div id="outline-container-org81b2156" class="outline-3">
<h3 id="org81b2156"><span class="section-number-3">3.4</span> Conclusion</h3>
2020-02-11 15:50:52 +01:00
<div class="outline-text-3" id="text-3-4">
2021-01-08 15:54:58 +01:00
<div class="important" id="orgb486ca9">
2020-02-06 15:39:35 +01:00
<p>
Joint stiffness does increase the resonance frequencies of the system but does not change the attainable damping when using relative motion sensors.
</p>
</div>
</div>
</div>
</div>
2020-03-12 18:06:56 +01:00
2021-01-08 15:34:53 +01:00
<div id="outline-container-orgc7e2089" class="outline-2">
<h2 id="orgc7e2089"><span class="section-number-2">4</span> Compliance and Transmissibility Comparison</h2>
<div class="outline-text-2" id="text-4">
</div>
2021-01-08 15:34:53 +01:00
<div id="outline-container-org6ec3b9e" class="outline-3">
<h3 id="org6ec3b9e"><span class="section-number-3">4.1</span> Initialization</h3>
<div class="outline-text-3" id="text-4-1">
<p>
We first initialize the Stewart platform without joint stiffness.
</p>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<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>, 45e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
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 = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
</pre>
</div>
<p>
The rotation point of the ground is located at the origin of frame \(\{A\}\).
</p>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<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(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
</pre>
</div>
</div>
</div>
2021-01-08 15:34:53 +01:00
<div id="outline-container-orge87554a" class="outline-3">
<h3 id="orge87554a"><span class="section-number-3">4.2</span> Identification</h3>
<div class="outline-text-3" id="text-4-2">
<p>
Let&rsquo;s first identify the transmissibility and compliance in the open-loop case.
</p>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<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();
[C_ol, C_norm_ol, freqs] = computeCompliance();
</pre>
</div>
<p>
Now, let&rsquo;s identify the transmissibility and compliance for the Integral Force Feedback architecture.
</p>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'iff'</span>);
K_iff = (1e4<span class="org-type">/</span>s)<span class="org-type">*</span>eye(6);
2021-01-08 15:54:58 +01:00
[T_iff, T_norm_iff, <span class="org-type">~</span>] = computeTransmissibility();
[C_iff, C_norm_iff, <span class="org-type">~</span>] = computeCompliance();
</pre>
</div>
<p>
And for the Direct Velocity Feedback.
</p>
<div class="org-src-container">
2021-01-08 15:54:58 +01:00
<pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'dvf'</span>);
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);
2021-01-08 15:54:58 +01:00
[T_dvf, T_norm_dvf, <span class="org-type">~</span>] = computeTransmissibility();
[C_dvf, C_norm_dvf, <span class="org-type">~</span>] = computeCompliance();
</pre>
</div>
</div>
</div>
2021-01-08 15:34:53 +01:00
<div id="outline-container-org1d70ccd" class="outline-3">
<h3 id="org1d70ccd"><span class="section-number-3">4.3</span> Results</h3>
<div class="outline-text-3" id="text-4-3">
2021-01-08 15:34:53 +01:00
<div id="org908e692" class="figure">
<p><img src="figs/transmissibility_iff_dvf.png" alt="transmissibility_iff_dvf.png" />
</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>
2021-01-08 15:34:53 +01:00
<div id="orgc10c609" class="figure">
<p><img src="figs/compliance_iff_dvf.png" alt="compliance_iff_dvf.png" />
</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>
2021-01-08 15:34:53 +01:00
<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>
<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>
2020-02-06 15:39:35 +01:00
</div>
2020-01-22 16:31:44 +01:00
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
2021-01-08 15:54:58 +01:00
<p class="date">Created: 2021-01-08 ven. 15:53</p>
2020-01-22 16:31:44 +01:00
</div>
</body>
</html>