Model flexible nano-hexapod elements
This commit is contained in:
parent
184c755fb8
commit
bd054638b2
@ -1,10 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||||
"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-05-05 mar. 11:50 -->
|
<!-- 2020-11-03 mar. 09:45 -->
|
||||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
<title>Study of the Flexible Joints</title>
|
<title>Study of the Flexible Joints</title>
|
||||||
<meta name="generator" content="Org mode" />
|
<meta name="generator" content="Org mode" />
|
||||||
@ -37,19 +36,19 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orge032d30">1. Bending and Torsional Stiffness</a>
|
<li><a href="#orge032d30">1. Bending and Torsional Stiffness</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#org8fdef7f">1.1. Initialization</a></li>
|
<li><a href="#orge82a7c2">1.1. Initialization</a></li>
|
||||||
<li><a href="#orgde60939">1.2. Realistic Bending Stiffness Values</a>
|
<li><a href="#orgde60939">1.2. Realistic Bending Stiffness Values</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orgdb214f9">1.2.1. Direct Velocity Feedback</a></li>
|
<li><a href="#orge13b41c">1.2.1. Direct Velocity Feedback</a></li>
|
||||||
<li><a href="#org4069e58">1.2.2. Primary Plant</a></li>
|
<li><a href="#orgd5fd59b">1.2.2. Primary Plant</a></li>
|
||||||
<li><a href="#orga32adf0">1.2.3. Conclusion</a></li>
|
<li><a href="#org865157e">1.2.3. Conclusion</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#org8ad3f34">1.3. Parametric Study</a>
|
<li><a href="#org8ad3f34">1.3. Parametric Study</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#org4adf147">1.3.1. Direct Velocity Feedback</a></li>
|
<li><a href="#orgc98ee7c">1.3.1. Direct Velocity Feedback</a></li>
|
||||||
<li><a href="#org53e5f08">1.3.2. Primary Control</a></li>
|
<li><a href="#org15c2c08">1.3.2. Primary Control</a></li>
|
||||||
<li><a href="#orgc45ccb0">1.3.3. Conclusion</a></li>
|
<li><a href="#org5322ecd">1.3.3. Conclusion</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@ -58,22 +57,29 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li><a href="#org969d9e7">2.1. Realistic Translation Stiffness Values</a>
|
<li><a href="#org969d9e7">2.1. Realistic Translation Stiffness Values</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orge82a7c2">2.1.1. Initialization</a></li>
|
<li><a href="#org7dd21d5">2.1.1. Initialization</a></li>
|
||||||
<li><a href="#org44f67b8">2.1.2. Direct Velocity Feedback</a></li>
|
<li><a href="#org47be52b">2.1.2. Direct Velocity Feedback</a></li>
|
||||||
<li><a href="#orgd5fd59b">2.1.3. Primary Plant</a></li>
|
<li><a href="#org15105f5">2.1.3. Primary Plant</a></li>
|
||||||
<li><a href="#org552093a">2.1.4. Conclusion</a></li>
|
<li><a href="#org2098f1e">2.1.4. Conclusion</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#org0275632">2.2. Parametric study</a>
|
<li><a href="#org0275632">2.2. Parametric study</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#orge13b41c">2.2.1. Direct Velocity Feedback</a></li>
|
<li><a href="#orgd87b94b">2.2.1. Direct Velocity Feedback</a></li>
|
||||||
<li><a href="#org15c2c08">2.2.2. Primary Control</a></li>
|
<li><a href="#orge5d1c12">2.2.2. Primary Control</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#orgce1052e">2.3. Conclusion</a></li>
|
<li><a href="#org382b3cb">2.3. Conclusion</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#orgb6f6c0a">3. Conclusion</a></li>
|
||||||
|
<li><a href="#orgdf2870d">4. Designed Flexible Joints</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#orgd355fcb">4.1. Initialization</a></li>
|
||||||
|
<li><a href="#org43c7d3c">4.2. Direct Velocity Feedback</a></li>
|
||||||
|
<li><a href="#org056a1de">4.3. Integral Force Feedback</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#org865157e">3. Conclusion</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -106,8 +112,8 @@ In this section, we wish to study the effect of the rotation flexibility of the
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org8fdef7f" class="outline-3">
|
<div id="outline-container-orge82a7c2" class="outline-3">
|
||||||
<h3 id="org8fdef7f"><span class="section-number-3">1.1</span> Initialization</h3>
|
<h3 id="orge82a7c2"><span class="section-number-3">1.1</span> Initialization</h3>
|
||||||
<div class="outline-text-3" id="text-1-1">
|
<div class="outline-text-3" id="text-1-1">
|
||||||
<p>
|
<p>
|
||||||
Let’s initialize all the stages with default parameters.
|
Let’s initialize all the stages with default parameters.
|
||||||
@ -128,8 +134,8 @@ initializeMirror();
|
|||||||
Let’s consider the heaviest mass which should we the most problematic with it comes to the flexible joints.
|
Let’s consider the heaviest mass which should we the most problematic with it comes to the flexible joints.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">initializeSample('mass', 50, 'freq', 200*ones(6,1));
|
<pre class="src src-matlab">initializeSample(<span class="org-string">'mass'</span>, 50, <span class="org-string">'freq'</span>, 200<span class="org-type">*</span>ones(6,1));
|
||||||
initializeReferences('Rz_type', 'rotating-not-filtered', 'Rz_period', 60);
|
initializeReferences(<span class="org-string">'Rz_type'</span>, <span class="org-string">'rotating-not-filtered'</span>, <span class="org-string">'Rz_period'</span>, 60);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -147,10 +153,10 @@ Let’s compare the ideal case (zero stiffness in rotation and infinite stif
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">Kf_M = 15*ones(6,1);
|
<pre class="src src-matlab">Kf_M = 15<span class="org-type">*</span>ones(6,1);
|
||||||
Kf_F = 15*ones(6,1);
|
Kf_F = 15<span class="org-type">*</span>ones(6,1);
|
||||||
Kt_M = 20*ones(6,1);
|
Kt_M = 20<span class="org-type">*</span>ones(6,1);
|
||||||
Kt_F = 20*ones(6,1);
|
Kt_F = 20<span class="org-type">*</span>ones(6,1);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -158,8 +164,8 @@ Kt_F = 20*ones(6,1);
|
|||||||
The stiffness and damping of the nano-hexapod’s legs are:
|
The stiffness and damping of the nano-hexapod’s legs are:
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">k_opt = 1e5; % [N/m]
|
<pre class="src src-matlab">k_opt = 1e5; <span class="org-comment">% [N/m]</span>
|
||||||
c_opt = 2e2; % [N/(m/s)]
|
c_opt = 2e2; <span class="org-comment">% [N/(m/s)]</span>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -168,8 +174,8 @@ This corresponds to the optimal identified stiffness.
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgdb214f9" class="outline-4">
|
<div id="outline-container-orge13b41c" class="outline-4">
|
||||||
<h4 id="orgdb214f9"><span class="section-number-4">1.2.1</span> Direct Velocity Feedback</h4>
|
<h4 id="orge13b41c"><span class="section-number-4">1.2.1</span> Direct Velocity Feedback</h4>
|
||||||
<div class="outline-text-4" id="text-1-2-1">
|
<div class="outline-text-4" id="text-1-2-1">
|
||||||
<p>
|
<p>
|
||||||
We identify the dynamics from actuators force \(\tau_i\) to relative motion sensors \(d\mathcal{L}_i\) with and without considering the flexible joint stiffness.
|
We identify the dynamics from actuators force \(\tau_i\) to relative motion sensors \(d\mathcal{L}_i\) with and without considering the flexible joint stiffness.
|
||||||
@ -189,8 +195,8 @@ It is shown that the adding of stiffness for the flexible joints does increase a
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org4069e58" class="outline-4">
|
<div id="outline-container-orgd5fd59b" class="outline-4">
|
||||||
<h4 id="org4069e58"><span class="section-number-4">1.2.2</span> Primary Plant</h4>
|
<h4 id="orgd5fd59b"><span class="section-number-4">1.2.2</span> Primary Plant</h4>
|
||||||
<div class="outline-text-4" id="text-1-2-2">
|
<div class="outline-text-4" id="text-1-2-2">
|
||||||
<p>
|
<p>
|
||||||
Let’s now identify the dynamics from \(\bm{\tau}^\prime\) to \(\bm{\epsilon}_{\mathcal{X}_n}\) (for the primary controller designed in the frame of the legs).
|
Let’s now identify the dynamics from \(\bm{\tau}^\prime\) to \(\bm{\epsilon}_{\mathcal{X}_n}\) (for the primary controller designed in the frame of the legs).
|
||||||
@ -210,10 +216,10 @@ The plant dynamics is not found to be changing significantly.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orga32adf0" class="outline-4">
|
<div id="outline-container-org865157e" class="outline-4">
|
||||||
<h4 id="orga32adf0"><span class="section-number-4">1.2.3</span> Conclusion</h4>
|
<h4 id="org865157e"><span class="section-number-4">1.2.3</span> Conclusion</h4>
|
||||||
<div class="outline-text-4" id="text-1-2-3">
|
<div class="outline-text-4" id="text-1-2-3">
|
||||||
<div class="important">
|
<div class="important" id="org69f9617">
|
||||||
<p>
|
<p>
|
||||||
Considering realistic flexible joint bending stiffness for the nano-hexapod does not seems to impose any limitation on the DVF control nor on the primary control.
|
Considering realistic flexible joint bending stiffness for the nano-hexapod does not seems to impose any limitation on the DVF control nor on the primary control.
|
||||||
</p>
|
</p>
|
||||||
@ -239,7 +245,7 @@ This will help to determine the requirements on the joint’s stiffness.
|
|||||||
Let’s consider the following bending stiffness of the flexible joints:
|
Let’s consider the following bending stiffness of the flexible joints:
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">Ks = [1, 5, 10, 50, 100]; % [Nm/rad]
|
<pre class="src src-matlab">Ks = [1, 5, 10, 50, 100]; <span class="org-comment">% [Nm/rad]</span>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -248,8 +254,8 @@ We also consider here a nano-hexapod with the identified optimal actuator stiffn
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org4adf147" class="outline-4">
|
<div id="outline-container-orgc98ee7c" class="outline-4">
|
||||||
<h4 id="org4adf147"><span class="section-number-4">1.3.1</span> Direct Velocity Feedback</h4>
|
<h4 id="orgc98ee7c"><span class="section-number-4">1.3.1</span> Direct Velocity Feedback</h4>
|
||||||
<div class="outline-text-4" id="text-1-3-1">
|
<div class="outline-text-4" id="text-1-3-1">
|
||||||
<p>
|
<p>
|
||||||
The dynamics from the actuators to the relative displacement sensor in each leg is identified and shown in Figure <a href="#org8fbbf9d">3</a>.
|
The dynamics from the actuators to the relative displacement sensor in each leg is identified and shown in Figure <a href="#org8fbbf9d">3</a>.
|
||||||
@ -279,8 +285,8 @@ It is shown that the bending stiffness of the flexible joints does indeed change
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org53e5f08" class="outline-4">
|
<div id="outline-container-org15c2c08" class="outline-4">
|
||||||
<h4 id="org53e5f08"><span class="section-number-4">1.3.2</span> Primary Control</h4>
|
<h4 id="org15c2c08"><span class="section-number-4">1.3.2</span> Primary Control</h4>
|
||||||
<div class="outline-text-4" id="text-1-3-2">
|
<div class="outline-text-4" id="text-1-3-2">
|
||||||
<p>
|
<p>
|
||||||
The dynamics from \(\bm{\tau}^\prime\) to \(\bm{\epsilon}_{\mathcal{X}_n}\) (for the primary controller designed in the frame of the legs) is shown in Figure <a href="#orgb739560">5</a>.
|
The dynamics from \(\bm{\tau}^\prime\) to \(\bm{\epsilon}_{\mathcal{X}_n}\) (for the primary controller designed in the frame of the legs) is shown in Figure <a href="#orgb739560">5</a>.
|
||||||
@ -299,10 +305,10 @@ It is shown that the bending stiffness of the flexible joints have very little i
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgc45ccb0" class="outline-4">
|
<div id="outline-container-org5322ecd" class="outline-4">
|
||||||
<h4 id="orgc45ccb0"><span class="section-number-4">1.3.3</span> Conclusion</h4>
|
<h4 id="org5322ecd"><span class="section-number-4">1.3.3</span> Conclusion</h4>
|
||||||
<div class="outline-text-4" id="text-1-3-3">
|
<div class="outline-text-4" id="text-1-3-3">
|
||||||
<div class="important">
|
<div class="important" id="orga223c1a">
|
||||||
<p>
|
<p>
|
||||||
The bending stiffness of the flexible joint does not significantly change the dynamics.
|
The bending stiffness of the flexible joint does not significantly change the dynamics.
|
||||||
</p>
|
</p>
|
||||||
@ -333,16 +339,16 @@ We choose realistic values of the axial stiffness of the joints:
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">Kz_F = 60e6*ones(6,1); % [N/m]
|
<pre class="src src-matlab">Ka_F = 60e6<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/m]</span>
|
||||||
Kz_M = 60e6*ones(6,1); % [N/m]
|
Ka_M = 60e6<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/m]</span>
|
||||||
Cz_F = 1*ones(6,1); % [N/(m/s)]
|
Ca_F = 1<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/(m/s)]</span>
|
||||||
Cz_M = 1*ones(6,1); % [N/(m/s)]
|
Ca_M = 1<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/(m/s)]</span>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orge82a7c2" class="outline-4">
|
<div id="outline-container-org7dd21d5" class="outline-4">
|
||||||
<h4 id="orge82a7c2"><span class="section-number-4">2.1.1</span> Initialization</h4>
|
<h4 id="org7dd21d5"><span class="section-number-4">2.1.1</span> Initialization</h4>
|
||||||
<div class="outline-text-4" id="text-2-1-1">
|
<div class="outline-text-4" id="text-2-1-1">
|
||||||
<p>
|
<p>
|
||||||
Let’s initialize all the stages with default parameters.
|
Let’s initialize all the stages with default parameters.
|
||||||
@ -363,15 +369,15 @@ initializeMirror();
|
|||||||
Let’s consider the heaviest mass which should we the most problematic with it comes to the flexible joints.
|
Let’s consider the heaviest mass which should we the most problematic with it comes to the flexible joints.
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">initializeSample('mass', 50, 'freq', 200*ones(6,1));
|
<pre class="src src-matlab">initializeSample(<span class="org-string">'mass'</span>, 50, <span class="org-string">'freq'</span>, 200<span class="org-type">*</span>ones(6,1));
|
||||||
initializeReferences('Rz_type', 'rotating-not-filtered', 'Rz_period', 60);
|
initializeReferences(<span class="org-string">'Rz_type'</span>, <span class="org-string">'rotating-not-filtered'</span>, <span class="org-string">'Rz_period'</span>, 60);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org44f67b8" class="outline-4">
|
<div id="outline-container-org47be52b" class="outline-4">
|
||||||
<h4 id="org44f67b8"><span class="section-number-4">2.1.2</span> Direct Velocity Feedback</h4>
|
<h4 id="org47be52b"><span class="section-number-4">2.1.2</span> Direct Velocity Feedback</h4>
|
||||||
<div class="outline-text-4" id="text-2-1-2">
|
<div class="outline-text-4" id="text-2-1-2">
|
||||||
<p>
|
<p>
|
||||||
The dynamics from actuators force \(\tau_i\) to relative motion sensors \(d\mathcal{L}_i\) with and without considering the flexible joint stiffness are identified.
|
The dynamics from actuators force \(\tau_i\) to relative motion sensors \(d\mathcal{L}_i\) with and without considering the flexible joint stiffness are identified.
|
||||||
@ -390,11 +396,11 @@ The obtained dynamics are shown in Figure <a href="#org78dd87a">6</a>.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgd5fd59b" class="outline-4">
|
<div id="outline-container-org15105f5" class="outline-4">
|
||||||
<h4 id="orgd5fd59b"><span class="section-number-4">2.1.3</span> Primary Plant</h4>
|
<h4 id="org15105f5"><span class="section-number-4">2.1.3</span> Primary Plant</h4>
|
||||||
<div class="outline-text-4" id="text-2-1-3">
|
<div class="outline-text-4" id="text-2-1-3">
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">Kdvf = 5e3*s/(1+s/2/pi/1e3)*eye(6);
|
<pre class="src src-matlab">Kdvf = 5e3<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>1e3)<span class="org-type">*</span>eye(6);
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -415,10 +421,10 @@ The dynamics is compare with and without the joint flexibility in Figure <a href
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org552093a" class="outline-4">
|
<div id="outline-container-org2098f1e" class="outline-4">
|
||||||
<h4 id="org552093a"><span class="section-number-4">2.1.4</span> Conclusion</h4>
|
<h4 id="org2098f1e"><span class="section-number-4">2.1.4</span> Conclusion</h4>
|
||||||
<div class="outline-text-4" id="text-2-1-4">
|
<div class="outline-text-4" id="text-2-1-4">
|
||||||
<div class="important">
|
<div class="important" id="org3a7d9f4">
|
||||||
<p>
|
<p>
|
||||||
For the realistic value of the flexible joint axial stiffness, the dynamics is not much impact, and this should not be a problem for control.
|
For the realistic value of the flexible joint axial stiffness, the dynamics is not much impact, and this should not be a problem for control.
|
||||||
</p>
|
</p>
|
||||||
@ -439,7 +445,7 @@ We wish now to see what is the impact of the <b>axial</b> stiffness of the flexi
|
|||||||
Let’s consider the following values for the axial stiffness:
|
Let’s consider the following values for the axial stiffness:
|
||||||
</p>
|
</p>
|
||||||
<div class="org-src-container">
|
<div class="org-src-container">
|
||||||
<pre class="src src-matlab">Kzs = [1e4, 1e5, 1e6, 1e7, 1e8, 1e9]; % [N/m]
|
<pre class="src src-matlab">Kas = [1e4, 1e5, 1e6, 1e7, 1e8, 1e9]; <span class="org-comment">% [N/m]</span>
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -448,8 +454,8 @@ We also consider here a nano-hexapod with the identified optimal actuator stiffn
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orge13b41c" class="outline-4">
|
<div id="outline-container-orgd87b94b" class="outline-4">
|
||||||
<h4 id="orge13b41c"><span class="section-number-4">2.2.1</span> Direct Velocity Feedback</h4>
|
<h4 id="orgd87b94b"><span class="section-number-4">2.2.1</span> Direct Velocity Feedback</h4>
|
||||||
<div class="outline-text-4" id="text-2-2-1">
|
<div class="outline-text-4" id="text-2-2-1">
|
||||||
<p>
|
<p>
|
||||||
The dynamics from the actuators to the relative displacement sensor in each leg is identified and shown in Figure <a href="#orgab9ab86">8</a>.
|
The dynamics from the actuators to the relative displacement sensor in each leg is identified and shown in Figure <a href="#orgab9ab86">8</a>.
|
||||||
@ -491,8 +497,8 @@ It can be seen that very little active damping can be achieve for axial stiffnes
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org15c2c08" class="outline-4">
|
<div id="outline-container-orge5d1c12" class="outline-4">
|
||||||
<h4 id="org15c2c08"><span class="section-number-4">2.2.2</span> Primary Control</h4>
|
<h4 id="orge5d1c12"><span class="section-number-4">2.2.2</span> Primary Control</h4>
|
||||||
<div class="outline-text-4" id="text-2-2-2">
|
<div class="outline-text-4" id="text-2-2-2">
|
||||||
<p>
|
<p>
|
||||||
The dynamics from \(\bm{\tau}^\prime\) to \(\bm{\epsilon}_{\mathcal{X}_n}\) (for the primary controller designed in the frame of the legs) is shown in Figure <a href="#org6070692">11</a>.
|
The dynamics from \(\bm{\tau}^\prime\) to \(\bm{\epsilon}_{\mathcal{X}_n}\) (for the primary controller designed in the frame of the legs) is shown in Figure <a href="#org6070692">11</a>.
|
||||||
@ -508,10 +514,10 @@ The dynamics from \(\bm{\tau}^\prime\) to \(\bm{\epsilon}_{\mathcal{X}_n}\) (for
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orgce1052e" class="outline-3">
|
<div id="outline-container-org382b3cb" class="outline-3">
|
||||||
<h3 id="orgce1052e"><span class="section-number-3">2.3</span> Conclusion</h3>
|
<h3 id="org382b3cb"><span class="section-number-3">2.3</span> Conclusion</h3>
|
||||||
<div class="outline-text-3" id="text-2-3">
|
<div class="outline-text-3" id="text-2-3">
|
||||||
<div class="important">
|
<div class="important" id="org422e802">
|
||||||
<p>
|
<p>
|
||||||
The axial stiffness of the flexible joints should be maximized.
|
The axial stiffness of the flexible joints should be maximized.
|
||||||
</p>
|
</p>
|
||||||
@ -533,14 +539,14 @@ We may interpolate the results and say that the axial joint stiffness should be
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org865157e" class="outline-2">
|
<div id="outline-container-orgb6f6c0a" class="outline-2">
|
||||||
<h2 id="org865157e"><span class="section-number-2">3</span> Conclusion</h2>
|
<h2 id="orgb6f6c0a"><span class="section-number-2">3</span> Conclusion</h2>
|
||||||
<div class="outline-text-2" id="text-3">
|
<div class="outline-text-2" id="text-3">
|
||||||
<p>
|
<p>
|
||||||
<a id="org6614f42"></a>
|
<a id="org6614f42"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="important">
|
<div class="important" id="org3cbf243">
|
||||||
<p>
|
<p>
|
||||||
In this study we considered the bending, torsional and axial stiffnesses of the flexible joints used for the nano-hexapod.
|
In this study we considered the bending, torsional and axial stiffnesses of the flexible joints used for the nano-hexapod.
|
||||||
</p>
|
</p>
|
||||||
@ -575,10 +581,80 @@ As there is generally a trade-off between bending stiffness and axial stiffness,
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="outline-container-orgdf2870d" class="outline-2">
|
||||||
|
<h2 id="orgdf2870d"><span class="section-number-2">4</span> Designed Flexible Joints</h2>
|
||||||
|
<div class="outline-text-2" id="text-4">
|
||||||
|
</div>
|
||||||
|
<div id="outline-container-orgd355fcb" class="outline-3">
|
||||||
|
<h3 id="orgd355fcb"><span class="section-number-3">4.1</span> Initialization</h3>
|
||||||
|
<div class="outline-text-3" id="text-4-1">
|
||||||
|
<p>
|
||||||
|
Let’s initialize all the stages with default parameters.
|
||||||
|
</p>
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">initializeGround();
|
||||||
|
initializeGranite();
|
||||||
|
initializeTy();
|
||||||
|
initializeRy();
|
||||||
|
initializeRz();
|
||||||
|
initializeMicroHexapod();
|
||||||
|
initializeAxisc(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
|
initializeMirror(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
||||||
|
initializeMirror();
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Let’s consider the heaviest mass which should we the most problematic with it comes to the flexible joints.
|
||||||
|
</p>
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">initializeSample(<span class="org-string">'mass'</span>, 50, <span class="org-string">'freq'</span>, 200<span class="org-type">*</span>ones(6,1));
|
||||||
|
initializeReferences(<span class="org-string">'Rz_type'</span>, <span class="org-string">'rotating-not-filtered'</span>, <span class="org-string">'Rz_period'</span>, 60);
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">flex_joint = load(<span class="org-string">'./mat/flexor_025.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>);
|
||||||
|
apa = load(<span class="org-string">'./mat/APA300ML_simplified_model.mat'</span>);
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">initializeNanoHexapod(<span class="org-string">'actuator'</span>, <span class="org-string">'amplified'</span>, ...
|
||||||
|
<span class="org-string">'ke'</span>, apa.ke, <span class="org-string">'ka'</span>, apa.ka, <span class="org-string">'k1'</span>, apa.k1, <span class="org-string">'c1'</span>, apa.c1, <span class="org-string">'F_gain'</span>, apa.F_gain, ...
|
||||||
|
<span class="org-string">'type_M'</span>, <span class="org-string">'spherical_3dof'</span>, ...
|
||||||
|
<span class="org-string">'Kr_M'</span>, flex_joint.K(1,1)<span class="org-type">*</span>ones(6,1), ...
|
||||||
|
<span class="org-string">'Ka_M'</span>, flex_joint.K(3,3)<span class="org-type">*</span>ones(6,1), ...
|
||||||
|
<span class="org-string">'Kf_M'</span>, flex_joint.K(4,4)<span class="org-type">*</span>ones(6,1), ...
|
||||||
|
<span class="org-string">'Kt_M'</span>, flex_joint.K(6,6)<span class="org-type">*</span>ones(6,1), ...
|
||||||
|
<span class="org-string">'type_F'</span>, <span class="org-string">'spherical_3dof'</span>, ...
|
||||||
|
<span class="org-string">'Kr_F'</span>, flex_joint.K(1,1)<span class="org-type">*</span>ones(6,1), ...
|
||||||
|
<span class="org-string">'Ka_F'</span>, flex_joint.K(3,3)<span class="org-type">*</span>ones(6,1), ...
|
||||||
|
<span class="org-string">'Kf_F'</span>, flex_joint.K(4,4)<span class="org-type">*</span>ones(6,1), ...
|
||||||
|
<span class="org-string">'Kt_F'</span>, flex_joint.K(6,6)<span class="org-type">*</span>ones(6,1));
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-matlab">initializeNanoHexapod();
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-org43c7d3c" class="outline-3">
|
||||||
|
<h3 id="org43c7d3c"><span class="section-number-3">4.2</span> Direct Velocity Feedback</h3>
|
||||||
|
</div>
|
||||||
|
<div id="outline-container-org056a1de" class="outline-3">
|
||||||
|
<h3 id="org056a1de"><span class="section-number-3">4.3</span> Integral Force Feedback</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</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-05-05 mar. 11:50</p>
|
<p class="date">Created: 2020-11-03 mar. 09:45</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
BIN
mat/APA300ML.mat
Normal file
BIN
mat/APA300ML.mat
Normal file
Binary file not shown.
BIN
mat/APA300ML_simplified_model.mat
Normal file
BIN
mat/APA300ML_simplified_model.mat
Normal file
Binary file not shown.
BIN
mat/conf_log.mat
BIN
mat/conf_log.mat
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
mat/flexor_025.mat
Normal file
BIN
mat/flexor_025.mat
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
mat/stages.mat
BIN
mat/stages.mat
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -534,10 +534,10 @@ We choose realistic values of the axial stiffness of the joints:
|
|||||||
\[ K_a = 60\,[N/\mu m] \]
|
\[ K_a = 60\,[N/\mu m] \]
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Kz_F = 60e6*ones(6,1); % [N/m]
|
Ka_F = 60e6*ones(6,1); % [N/m]
|
||||||
Kz_M = 60e6*ones(6,1); % [N/m]
|
Ka_M = 60e6*ones(6,1); % [N/m]
|
||||||
Cz_F = 1*ones(6,1); % [N/(m/s)]
|
Ca_F = 1*ones(6,1); % [N/(m/s)]
|
||||||
Cz_M = 1*ones(6,1); % [N/(m/s)]
|
Ca_M = 1*ones(6,1); % [N/(m/s)]
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Initialization
|
*** Initialization
|
||||||
@ -591,10 +591,10 @@ The obtained dynamics are shown in Figure [[fig:flex_joint_trans_dvf]].
|
|||||||
initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
|
initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
|
||||||
'type_F', 'universal_3dof', ...
|
'type_F', 'universal_3dof', ...
|
||||||
'type_M', 'spherical_3dof', ...
|
'type_M', 'spherical_3dof', ...
|
||||||
'Kz_F', Kz_F, ...
|
'Ka_F', Ka_F, ...
|
||||||
'Kz_M', Kz_M, ...
|
'Ka_M', Ka_M, ...
|
||||||
'Cz_F', Cz_F, ...
|
'Ca_F', Ca_F, ...
|
||||||
'Cz_M', Cz_M);
|
'Ca_M', Ca_M);
|
||||||
|
|
||||||
G_dvf_3dof = linearize(mdl, io);
|
G_dvf_3dof = linearize(mdl, io);
|
||||||
G_dvf_3dof.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
|
G_dvf_3dof.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
|
||||||
@ -674,10 +674,10 @@ The dynamics is compare with and without the joint flexibility in Figure [[fig:f
|
|||||||
initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
|
initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
|
||||||
'type_F', 'universal_3dof', ...
|
'type_F', 'universal_3dof', ...
|
||||||
'type_M', 'spherical_3dof', ...
|
'type_M', 'spherical_3dof', ...
|
||||||
'Kz_F', Kz_F, ...
|
'Ka_F', Ka_F, ...
|
||||||
'Kz_M', Kz_M, ...
|
'Ka_M', Ka_M, ...
|
||||||
'Cz_F', Cz_F, ...
|
'Ca_F', Ca_F, ...
|
||||||
'Cz_M', Cz_M);
|
'Ca_M', Ca_M);
|
||||||
|
|
||||||
G = linearize(mdl, io);
|
G = linearize(mdl, io);
|
||||||
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
|
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
|
||||||
@ -759,7 +759,7 @@ We wish now to see what is the impact of the *axial* stiffness of the flexible j
|
|||||||
|
|
||||||
Let's consider the following values for the axial stiffness:
|
Let's consider the following values for the axial stiffness:
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
Kzs = [1e4, 1e5, 1e6, 1e7, 1e8, 1e9]; % [N/m]
|
Kas = [1e4, 1e5, 1e6, 1e7, 1e8, 1e9]; % [N/m]
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
We also consider here a nano-hexapod with the identified optimal actuator stiffness ($k = 10^5\,[N/m]$).
|
We also consider here a nano-hexapod with the identified optimal actuator stiffness ($k = 10^5\,[N/m]$).
|
||||||
@ -788,16 +788,16 @@ It can be seen that very little active damping can be achieve for axial stiffnes
|
|||||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1; % Force Sensors
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1; % Force Sensors
|
||||||
|
|
||||||
G_dvf_3dof_s = {zeros(length(Kzs), 1)};
|
G_dvf_3dof_s = {zeros(length(Kas), 1)};
|
||||||
|
|
||||||
for i = 1:length(Kzs)
|
for i = 1:length(Kas)
|
||||||
initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
|
initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
|
||||||
'type_F', 'universal_3dof', ...
|
'type_F', 'universal_3dof', ...
|
||||||
'type_M', 'spherical_3dof', ...
|
'type_M', 'spherical_3dof', ...
|
||||||
'Kz_F', Kzs(i), ...
|
'Ka_F', Kas(i), ...
|
||||||
'Kz_M', Kzs(i), ...
|
'Ka_M', Kas(i), ...
|
||||||
'Cz_F', 0.05*sqrt(Kzs(i)*10), ...
|
'Ca_F', 0.05*sqrt(Kas(i)*10), ...
|
||||||
'Cz_M', 0.05*sqrt(Kzs(i)*10));
|
'Ca_M', 0.05*sqrt(Kas(i)*10));
|
||||||
|
|
||||||
G = linearize(mdl, io);
|
G = linearize(mdl, io);
|
||||||
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
|
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
|
||||||
@ -814,7 +814,7 @@ It can be seen that very little active damping can be achieve for axial stiffnes
|
|||||||
|
|
||||||
ax1 = subplot(2, 1, 1);
|
ax1 = subplot(2, 1, 1);
|
||||||
hold on;
|
hold on;
|
||||||
for i = 1:length(Kzs)
|
for i = 1:length(Kas)
|
||||||
plot(freqs, abs(squeeze(freqresp(G_dvf_3dof_s{i}(1, 1), freqs, 'Hz'))));
|
plot(freqs, abs(squeeze(freqresp(G_dvf_3dof_s{i}(1, 1), freqs, 'Hz'))));
|
||||||
end
|
end
|
||||||
plot(freqs, abs(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz'))), 'k--');
|
plot(freqs, abs(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz'))), 'k--');
|
||||||
@ -824,9 +824,9 @@ It can be seen that very little active damping can be achieve for axial stiffnes
|
|||||||
|
|
||||||
ax2 = subplot(2, 1, 2);
|
ax2 = subplot(2, 1, 2);
|
||||||
hold on;
|
hold on;
|
||||||
for i = 1:length(Kzs)
|
for i = 1:length(Kas)
|
||||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_dvf_3dof_s{i}(1, 1), freqs, 'Hz')))), ...
|
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_dvf_3dof_s{i}(1, 1), freqs, 'Hz')))), ...
|
||||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Kzs(i)));
|
'DisplayName', sprintf('$k = %.0g$ [N/m]', Kas(i)));
|
||||||
end
|
end
|
||||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz')))), 'k--', ...
|
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz')))), 'k--', ...
|
||||||
'DisplayName', 'Perfect Joint');
|
'DisplayName', 'Perfect Joint');
|
||||||
@ -855,10 +855,10 @@ It can be seen that very little active damping can be achieve for axial stiffnes
|
|||||||
gains = logspace(2, 5, 300);
|
gains = logspace(2, 5, 300);
|
||||||
|
|
||||||
hold on;
|
hold on;
|
||||||
for i = 1:length(Kzs)
|
for i = 1:length(Kas)
|
||||||
set(gca,'ColorOrderIndex',i);
|
set(gca,'ColorOrderIndex',i);
|
||||||
plot(real(pole(G_dvf_3dof_s{i})), imag(pole(G_dvf_3dof_s{i})), 'x', ...
|
plot(real(pole(G_dvf_3dof_s{i})), imag(pole(G_dvf_3dof_s{i})), 'x', ...
|
||||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Kzs(i)));
|
'DisplayName', sprintf('$k = %.0g$ [N/m]', Kas(i)));
|
||||||
set(gca,'ColorOrderIndex',i);
|
set(gca,'ColorOrderIndex',i);
|
||||||
plot(real(tzero(G_dvf_3dof_s{i})), imag(tzero(G_dvf_3dof_s{i})), 'o', ...
|
plot(real(tzero(G_dvf_3dof_s{i})), imag(tzero(G_dvf_3dof_s{i})), 'o', ...
|
||||||
'HandleVisibility', 'off');
|
'HandleVisibility', 'off');
|
||||||
@ -918,16 +918,16 @@ The dynamics from $\bm{\tau}^\prime$ to $\bm{\epsilon}_{\mathcal{X}_n}$ (for the
|
|||||||
|
|
||||||
load('mat/stages.mat', 'nano_hexapod');
|
load('mat/stages.mat', 'nano_hexapod');
|
||||||
|
|
||||||
Gl_3dof_s = {zeros(length(Kzs), 1)};
|
Gl_3dof_s = {zeros(length(Kas), 1)};
|
||||||
|
|
||||||
for i = 1:length(Kzs)
|
for i = 1:length(Kas)
|
||||||
initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
|
initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
|
||||||
'type_F', 'universal_3dof', ...
|
'type_F', 'universal_3dof', ...
|
||||||
'type_M', 'spherical_3dof', ...
|
'type_M', 'spherical_3dof', ...
|
||||||
'Kz_F', Kzs(i), ...
|
'Ka_F', Kas(i), ...
|
||||||
'Kz_M', Kzs(i), ...
|
'Ka_M', Kas(i), ...
|
||||||
'Cz_F', 0.05*sqrt(Kzs(i)*10), ...
|
'Ca_F', 0.05*sqrt(Kas(i)*10), ...
|
||||||
'Cz_M', 0.05*sqrt(Kzs(i)*10));
|
'Ca_M', 0.05*sqrt(Kas(i)*10));
|
||||||
|
|
||||||
G = linearize(mdl, io);
|
G = linearize(mdl, io);
|
||||||
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
|
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
|
||||||
@ -946,7 +946,7 @@ The dynamics from $\bm{\tau}^\prime$ to $\bm{\epsilon}_{\mathcal{X}_n}$ (for the
|
|||||||
|
|
||||||
ax1 = subplot(2, 1, 1);
|
ax1 = subplot(2, 1, 1);
|
||||||
hold on;
|
hold on;
|
||||||
for i = 1:length(Kzs)
|
for i = 1:length(Kas)
|
||||||
plot(freqs, abs(squeeze(freqresp(Gl_3dof_s{i}(1, 1), freqs, 'Hz'))));
|
plot(freqs, abs(squeeze(freqresp(Gl_3dof_s{i}(1, 1), freqs, 'Hz'))));
|
||||||
end
|
end
|
||||||
hold off;
|
hold off;
|
||||||
@ -955,9 +955,9 @@ The dynamics from $\bm{\tau}^\prime$ to $\bm{\epsilon}_{\mathcal{X}_n}$ (for the
|
|||||||
|
|
||||||
ax2 = subplot(2, 1, 2);
|
ax2 = subplot(2, 1, 2);
|
||||||
hold on;
|
hold on;
|
||||||
for i = 1:length(Kzs)
|
for i = 1:length(Kas)
|
||||||
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gl_3dof_s{i}(1, 1), freqs, 'Hz')))), ...
|
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gl_3dof_s{i}(1, 1), freqs, 'Hz')))), ...
|
||||||
'DisplayName', sprintf('$k = %.0g$ [N/m]', Kzs(i)));
|
'DisplayName', sprintf('$k = %.0g$ [N/m]', Kas(i)));
|
||||||
end
|
end
|
||||||
hold off;
|
hold off;
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
@ -1012,3 +1012,262 @@ The dynamics from $\bm{\tau}^\prime$ to $\bm{\epsilon}_{\mathcal{X}_n}$ (for the
|
|||||||
|
|
||||||
As there is generally a trade-off between bending stiffness and axial stiffness, it should be highlighted that the *axial* stiffness is the most important property of the flexible joints.
|
As there is generally a trade-off between bending stiffness and axial stiffness, it should be highlighted that the *axial* stiffness is the most important property of the flexible joints.
|
||||||
#+end_important
|
#+end_important
|
||||||
|
|
||||||
|
|
||||||
|
* Designed Flexible Joints
|
||||||
|
** 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 :tangle no
|
||||||
|
simulinkproject('../');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
load('mat/conf_simulink.mat');
|
||||||
|
open('nass_model.slx')
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Initialization
|
||||||
|
Let's initialize all the stages with default parameters.
|
||||||
|
#+begin_src matlab
|
||||||
|
initializeGround();
|
||||||
|
initializeGranite();
|
||||||
|
initializeTy();
|
||||||
|
initializeRy();
|
||||||
|
initializeRz();
|
||||||
|
initializeMicroHexapod();
|
||||||
|
initializeAxisc('type', 'none');
|
||||||
|
initializeMirror('type', 'none');
|
||||||
|
initializeMirror();
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
initializeSimscapeConfiguration();
|
||||||
|
initializeDisturbances('enable', false);
|
||||||
|
initializeLoggingConfiguration('log', 'none');
|
||||||
|
|
||||||
|
initializeController('type', 'hac-dvf');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Let's consider the heaviest mass which should we the most problematic with it comes to the flexible joints.
|
||||||
|
#+begin_src matlab
|
||||||
|
initializeSample('mass', 50, 'freq', 200*ones(6,1));
|
||||||
|
initializeReferences('Rz_type', 'rotating-not-filtered', 'Rz_period', 60);
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
K = tf(zeros(6));
|
||||||
|
Kdvf = tf(zeros(6));
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
flex_joint = load('./mat/flexor_025.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
|
||||||
|
apa = load('./mat/APA300ML_simplified_model.mat');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
initializeNanoHexapod('actuator', 'amplified', ...
|
||||||
|
'ke', apa.ke, 'ka', apa.ka, 'k1', apa.k1, 'c1', apa.c1, 'F_gain', apa.F_gain, ...
|
||||||
|
'type_M', 'spherical_3dof', ...
|
||||||
|
'Kr_M', flex_joint.K(1,1)*ones(6,1), ...
|
||||||
|
'Ka_M', flex_joint.K(3,3)*ones(6,1), ...
|
||||||
|
'Kf_M', flex_joint.K(4,4)*ones(6,1), ...
|
||||||
|
'Kt_M', flex_joint.K(6,6)*ones(6,1), ...
|
||||||
|
'type_F', 'spherical_3dof', ...
|
||||||
|
'Kr_F', flex_joint.K(1,1)*ones(6,1), ...
|
||||||
|
'Ka_F', flex_joint.K(3,3)*ones(6,1), ...
|
||||||
|
'Kf_F', flex_joint.K(4,4)*ones(6,1), ...
|
||||||
|
'Kt_F', flex_joint.K(6,6)*ones(6,1));
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
initializeNanoHexapod();
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Direct Velocity Feedback
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
%% Name of the Simulink File
|
||||||
|
mdl = 'nass_model';
|
||||||
|
|
||||||
|
%% Input/Output definition
|
||||||
|
clear io; io_i = 1;
|
||||||
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1; % Force Sensors
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
G_dvf = linearize(mdl, io);
|
||||||
|
G_dvf.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
|
||||||
|
G_dvf.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'};
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
freqs = logspace(0, 4, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 1, 1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz'))));
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||||
|
|
||||||
|
ax2 = subplot(2, 1, 2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz')))), ...
|
||||||
|
'DisplayName', 'Designed Joints');
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-270, 90]);
|
||||||
|
yticks([-360:90:360]);
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
K_iff = 1e6*s/(1 + s/2/pi/100)/(1 + s/2/pi/100);
|
||||||
|
|
||||||
|
freqs = logspace(0, 4, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 1, 1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(K_iff*G_dvf(1, 1), freqs, 'Hz'))));
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||||
|
|
||||||
|
ax2 = subplot(2, 1, 2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(K_iff*G_dvf(1, 1), freqs, 'Hz')))), ...
|
||||||
|
'DisplayName', 'Designed Joints');
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-270, 90]);
|
||||||
|
yticks([-360:90:360]);
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
gains = logspace(0, 5, 100);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
hold on;
|
||||||
|
plot(real(pole(G_dvf)), imag(pole(G_dvf)), 'x');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(real(tzero(G_dvf)), imag(tzero(G_dvf)), 'o');
|
||||||
|
for i = 1:length(gains)
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
cl_poles = pole(feedback(G_dvf, (gains(i)*s/(1+s/2/pi/100)^2)*eye(6)));
|
||||||
|
plot(real(cl_poles), imag(cl_poles), '.');
|
||||||
|
end
|
||||||
|
% ylim([0, 2*pi*500]);
|
||||||
|
% xlim([-2*pi*500,0]);
|
||||||
|
xlabel('Real Part')
|
||||||
|
ylabel('Imaginary Part')
|
||||||
|
axis square
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Integral Force Feedback
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
%% Name of the Simulink File
|
||||||
|
mdl = 'nass_model';
|
||||||
|
|
||||||
|
%% Input/Output definition
|
||||||
|
clear io; io_i = 1;
|
||||||
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1; % Force Sensors
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
G_iff = linearize(mdl, io);
|
||||||
|
G_iff.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
|
||||||
|
G_iff.OutputName = {'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'};
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
freqs = logspace(0, 4, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 1, 1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff(1, 1), freqs, 'Hz'))));
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]);
|
||||||
|
|
||||||
|
ax2 = subplot(2, 1, 2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_iff(1, 1), freqs, 'Hz')))), ...
|
||||||
|
'DisplayName', 'Designed Joints');
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-270, 90]);
|
||||||
|
yticks([-360:90:360]);
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
K_iff = -1e4/(s + 2*pi*5)*s/(s + 2*pi*5);
|
||||||
|
|
||||||
|
freqs = logspace(-1, 4, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 1, 1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(K_iff*G_iff(1, 1), freqs, 'Hz'))));
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Loop Gain'); set(gca, 'XTickLabel',[]);
|
||||||
|
|
||||||
|
ax2 = subplot(2, 1, 2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(K_iff*G_iff(1, 1), freqs, 'Hz')))), ...
|
||||||
|
'DisplayName', 'Designed Joints');
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-360:90:360]);
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src matlab :exports none
|
||||||
|
gains = logspace(0, 5, 100);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
hold on;
|
||||||
|
plot(real(pole(G_iff)), imag(pole(G_iff)), 'x');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(real(tzero(G_iff)), imag(tzero(G_iff)), 'o');
|
||||||
|
for i = 1:length(gains)
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
cl_poles = pole(feedback(G_iff, -(gains(i)/(s + 2*pi*5)*s/(s + 2*pi*5))*eye(6)));
|
||||||
|
plot(real(cl_poles), imag(cl_poles), '.');
|
||||||
|
end
|
||||||
|
ylim([0, 2*pi*500]);
|
||||||
|
xlim([-2*pi*500,0]);
|
||||||
|
xlabel('Real Part')
|
||||||
|
ylabel('Imaginary Part')
|
||||||
|
axis square
|
||||||
|
#+end_src
|
||||||
|
@ -278,6 +278,7 @@ The output =sample_pos= corresponds to the impact point of the X-ray.
|
|||||||
args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m]
|
args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m]
|
||||||
args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m]
|
args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m]
|
||||||
args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m]
|
args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m]
|
||||||
|
args.sample_pos (1,1) double {mustBeNumeric} = 0.8 % Height of the measurment point [m]
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -322,7 +323,7 @@ Properties of the Material and link to the geometry of the granite.
|
|||||||
|
|
||||||
Z-offset for the initial position of the sample with respect to the granite top surface.
|
Z-offset for the initial position of the sample with respect to the granite top surface.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
granite.sample_pos = 0.8; % [m]
|
granite.sample_pos = args.sample_pos; % [m]
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Stiffness and Damping properties
|
** Stiffness and Damping properties
|
||||||
@ -1169,7 +1170,7 @@ We define the geometrical values.
|
|||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
mirror.h = 0.05; % Height of the mirror [m]
|
mirror.h = 0.05; % Height of the mirror [m]
|
||||||
|
|
||||||
mirror.thickness = 0.025; % Thickness of the plate supporting the sample [m]
|
mirror.thickness = 0.02; % Thickness of the plate supporting the sample [m]
|
||||||
|
|
||||||
mirror.hole_rad = 0.125; % radius of the hole in the mirror [m]
|
mirror.hole_rad = 0.125; % radius of the hole in the mirror [m]
|
||||||
|
|
||||||
@ -1178,11 +1179,11 @@ We define the geometrical values.
|
|||||||
% point of interest offset in z (above the top surfave) [m]
|
% point of interest offset in z (above the top surfave) [m]
|
||||||
switch args.type
|
switch args.type
|
||||||
case 'none'
|
case 'none'
|
||||||
mirror.jacobian = 0.20;
|
mirror.jacobian = 0.205;
|
||||||
case 'rigid'
|
case 'rigid'
|
||||||
mirror.jacobian = 0.20 - mirror.h;
|
mirror.jacobian = 0.205 - mirror.h;
|
||||||
case 'flexible'
|
case 'flexible'
|
||||||
mirror.jacobian = 0.20 - mirror.h;
|
mirror.jacobian = 0.205 - mirror.h;
|
||||||
end
|
end
|
||||||
|
|
||||||
mirror.rad = 0.180; % radius of the mirror (at the bottom surface) [m]
|
mirror.rad = 0.180; % radius of the mirror (at the bottom surface) [m]
|
||||||
@ -1269,8 +1270,8 @@ The =mirror= structure is saved.
|
|||||||
arguments
|
arguments
|
||||||
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible'
|
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible'
|
||||||
% initializeFramesPositions
|
% initializeFramesPositions
|
||||||
args.H (1,1) double {mustBeNumeric, mustBePositive} = 90e-3
|
args.H (1,1) double {mustBeNumeric, mustBePositive} = 95e-3
|
||||||
args.MO_B (1,1) double {mustBeNumeric} = 175e-3
|
args.MO_B (1,1) double {mustBeNumeric} = 170e-3
|
||||||
% generateGeneralConfiguration
|
% generateGeneralConfiguration
|
||||||
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
|
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
|
||||||
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
|
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
|
||||||
@ -1284,25 +1285,28 @@ The =mirror= structure is saved.
|
|||||||
args.ke (1,1) double {mustBeNumeric} = 5e6
|
args.ke (1,1) double {mustBeNumeric} = 5e6
|
||||||
args.ka (1,1) double {mustBeNumeric} = 60e6
|
args.ka (1,1) double {mustBeNumeric} = 60e6
|
||||||
args.c1 (1,1) double {mustBeNumeric} = 10
|
args.c1 (1,1) double {mustBeNumeric} = 10
|
||||||
args.ce (1,1) double {mustBeNumeric} = 10
|
args.F_gain (1,1) double {mustBeNumeric} = 1
|
||||||
args.ca (1,1) double {mustBeNumeric} = 10
|
|
||||||
args.k (1,1) double {mustBeNumeric} = -1
|
args.k (1,1) double {mustBeNumeric} = -1
|
||||||
args.c (1,1) double {mustBeNumeric} = -1
|
args.c (1,1) double {mustBeNumeric} = -1
|
||||||
% initializeJointDynamics
|
% initializeJointDynamics
|
||||||
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal'
|
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'universal'
|
||||||
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'spherical_3dof'})} = 'spherical'
|
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'spherical'
|
||||||
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
|
args.Ka_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
|
||||||
|
args.Ca_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.Kr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
|
||||||
|
args.Cr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
|
||||||
args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
||||||
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
|
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
|
||||||
args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
||||||
args.Kz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
|
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
|
||||||
args.Cz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
|
|
||||||
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
|
|
||||||
args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
||||||
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
|
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
|
||||||
args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
||||||
args.Kz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
|
args.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
|
||||||
args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
|
args.Ca_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.Kr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
|
||||||
|
args.Cr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
% initializeCylindricalPlatforms
|
% initializeCylindricalPlatforms
|
||||||
args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
|
args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
|
||||||
args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
|
args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
|
||||||
@ -1355,9 +1359,8 @@ The =mirror= structure is saved.
|
|||||||
'k1', args.k1*ones(6,1), ...
|
'k1', args.k1*ones(6,1), ...
|
||||||
'c1', args.c1*ones(6,1), ...
|
'c1', args.c1*ones(6,1), ...
|
||||||
'ka', args.ka*ones(6,1), ...
|
'ka', args.ka*ones(6,1), ...
|
||||||
'ca', args.ca*ones(6,1), ...
|
|
||||||
'ke', args.ke*ones(6,1), ...
|
'ke', args.ke*ones(6,1), ...
|
||||||
'ce', args.ce*ones(6,1));
|
'F_gain', args.F_gain*ones(6,1));
|
||||||
else
|
else
|
||||||
error('args.actuator should be piezo, lorentz or amplified');
|
error('args.actuator should be piezo, lorentz or amplified');
|
||||||
end
|
end
|
||||||
@ -1371,14 +1374,18 @@ The =mirror= structure is saved.
|
|||||||
'Cf_M', args.Cf_M, ...
|
'Cf_M', args.Cf_M, ...
|
||||||
'Kt_M', args.Kt_M, ...
|
'Kt_M', args.Kt_M, ...
|
||||||
'Ct_M', args.Ct_M, ...
|
'Ct_M', args.Ct_M, ...
|
||||||
'Kz_M' , args.Kz_M, ...
|
|
||||||
'Cz_M' , args.Cz_M, ...
|
|
||||||
'Kf_F', args.Kf_F, ...
|
'Kf_F', args.Kf_F, ...
|
||||||
'Cf_F', args.Cf_F, ...
|
'Cf_F', args.Cf_F, ...
|
||||||
'Kt_F', args.Kt_F, ...
|
'Kt_F', args.Kt_F, ...
|
||||||
'Ct_F', args.Ct_F, ...
|
'Ct_F', args.Ct_F, ...
|
||||||
'Kz_F' , args.Kz_F, ...
|
'Ka_F', args.Ka_F, ...
|
||||||
'Cz_F' , args.Cz_F);
|
'Ca_F', args.Ca_F, ...
|
||||||
|
'Kr_F', args.Kr_F, ...
|
||||||
|
'Cr_F', args.Cr_F, ...
|
||||||
|
'Ka_M', args.Ka_M, ...
|
||||||
|
'Ca_M', args.Ca_M, ...
|
||||||
|
'Kr_M', args.Kr_M, ...
|
||||||
|
'Cr_M', args.Cr_M);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
|
@ -198,7 +198,7 @@ This Matlab function is accessible [[file:../src/generateGeneralConfiguration.m]
|
|||||||
Joints are positions on a circle centered with the Z axis of {F} and {M} and at a chosen distance from {F} and {M}.
|
Joints are positions on a circle centered with the Z axis of {F} and {M} and at a chosen distance from {F} and {M}.
|
||||||
The radius of the circles can be chosen as well as the angles where the joints are located (see Figure [[fig:joint_position_general]]).
|
The radius of the circles can be chosen as well as the angles where the joints are located (see Figure [[fig:joint_position_general]]).
|
||||||
|
|
||||||
#+begin_src latex :file stewart_bottom_plate.pdf
|
#+begin_src latex :file stewart_bottom_plate.pdf :tangle no
|
||||||
\begin{tikzpicture}
|
\begin{tikzpicture}
|
||||||
% Internal and external limit
|
% Internal and external limit
|
||||||
\draw[fill=white!80!black] (0, 0) circle [radius=3];
|
\draw[fill=white!80!black] (0, 0) circle [radius=3];
|
||||||
@ -742,7 +742,7 @@ A simplistic model of such amplified actuator is shown in Figure [[fig:actuator_
|
|||||||
- $v_{m}$ represents the absolute velocity of the top part of the actuator
|
- $v_{m}$ represents the absolute velocity of the top part of the actuator
|
||||||
- $d_{m}$ represents the total relative displacement of the actuator
|
- $d_{m}$ represents the total relative displacement of the actuator
|
||||||
|
|
||||||
#+begin_src latex :file actuator_model_simple.pdf
|
#+begin_src latex :file actuator_model_simple.pdf :tangle no
|
||||||
\begin{tikzpicture}
|
\begin{tikzpicture}
|
||||||
\draw (-1, 0) -- (1, 0);
|
\draw (-1, 0) -- (1, 0);
|
||||||
|
|
||||||
@ -801,14 +801,13 @@ A simplistic model of such amplified actuator is shown in Figure [[fig:actuator_
|
|||||||
args.type char {mustBeMember(args.type,{'classical', 'amplified'})} = 'classical'
|
args.type char {mustBeMember(args.type,{'classical', 'amplified'})} = 'classical'
|
||||||
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1)
|
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1)
|
||||||
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1)
|
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1)
|
||||||
args.k1 (6,1) double {mustBeNumeric} = 1e6
|
args.k1 (6,1) double {mustBeNumeric} = 1e6*ones(6,1)
|
||||||
args.ke (6,1) double {mustBeNumeric} = 5e6
|
args.ke (6,1) double {mustBeNumeric} = 5e6*ones(6,1)
|
||||||
args.ka (6,1) double {mustBeNumeric} = 60e6
|
args.ka (6,1) double {mustBeNumeric} = 60e6*ones(6,1)
|
||||||
args.c1 (6,1) double {mustBeNumeric} = 10
|
args.c1 (6,1) double {mustBeNumeric} = 10*ones(6,1)
|
||||||
args.ce (6,1) double {mustBeNumeric} = 10
|
args.F_gain (6,1) double {mustBeNumeric} = 1*ones(6,1)
|
||||||
args.ca (6,1) double {mustBeNumeric} = 10
|
args.me (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
|
||||||
args.me (6,1) double {mustBeNumeric} = 0.05
|
args.ma (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
|
||||||
args.ma (6,1) double {mustBeNumeric} = 0.05
|
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -830,144 +829,14 @@ A simplistic model of such amplified actuator is shown in Figure [[fig:actuator_
|
|||||||
stewart.actuators.c1 = args.c1;
|
stewart.actuators.c1 = args.c1;
|
||||||
|
|
||||||
stewart.actuators.ka = args.ka;
|
stewart.actuators.ka = args.ka;
|
||||||
stewart.actuators.ca = args.ca;
|
|
||||||
|
|
||||||
stewart.actuators.ke = args.ke;
|
stewart.actuators.ke = args.ke;
|
||||||
stewart.actuators.ce = args.ce;
|
|
||||||
|
stewart.actuators.F_gain = args.F_gain;
|
||||||
|
|
||||||
stewart.actuators.ma = args.ma;
|
stewart.actuators.ma = args.ma;
|
||||||
stewart.actuators.me = args.me;
|
stewart.actuators.me = args.me;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* =initializeAmplifiedStrutDynamics=: Add Stiffness and Damping properties of each strut for an amplified piezoelectric actuator
|
|
||||||
:PROPERTIES:
|
|
||||||
:header-args:matlab+: :tangle ../src/initializeAmplifiedStrutDynamics.m
|
|
||||||
:header-args:matlab+: :comments none :mkdirp yes :eval no
|
|
||||||
:END:
|
|
||||||
<<sec:initializeAmplifiedStrutDynamics>>
|
|
||||||
|
|
||||||
This Matlab function is accessible [[file:../src/initializeAmplifiedStrutDynamics.m][here]].
|
|
||||||
|
|
||||||
** Documentation
|
|
||||||
:PROPERTIES:
|
|
||||||
:UNNUMBERED: t
|
|
||||||
:END:
|
|
||||||
|
|
||||||
An amplified piezoelectric actuator is shown in Figure [[fig:cedrat_apa95ml]].
|
|
||||||
|
|
||||||
#+name: fig:cedrat_apa95ml
|
|
||||||
#+attr_html: :width 500px
|
|
||||||
#+caption: Example of an Amplified piezoelectric actuator with an integrated displacement sensor (Cedrat Technologies)
|
|
||||||
[[file:figs/amplified_piezo_with_displacement_sensor.jpg]]
|
|
||||||
|
|
||||||
A simplistic model of such amplified actuator is shown in Figure [[fig:amplified_piezo_model]] where:
|
|
||||||
- $K_{r}$ represent the vertical stiffness when the piezoelectric stack is removed
|
|
||||||
- $K_{a}$ is the vertical stiffness contribution of the piezoelectric stack
|
|
||||||
- $F_{i}$ represents the part of the piezoelectric stack that is used as a force actuator
|
|
||||||
- $F_{m,i}$ represents the remaining part of the piezoelectric stack that is used as a force sensor
|
|
||||||
- $v_{m,i}$ represents the absolute velocity of the top part of the actuator
|
|
||||||
- $d_{m,i}$ represents the total relative displacement of the actuator
|
|
||||||
|
|
||||||
#+begin_src latex :file iff_1dof.pdf
|
|
||||||
\begin{tikzpicture}
|
|
||||||
% Ground
|
|
||||||
\draw (-1.2, 0) -- (1, 0);
|
|
||||||
|
|
||||||
% Mass
|
|
||||||
\draw (-1.2, 1.4) -- ++(2.2, 0);
|
|
||||||
\node[forcesensor={0.4}{0.4}] (fsensn) at (0, 1){};
|
|
||||||
\draw[] (-0.4, 1) -- (0.4, 1);
|
|
||||||
\node[right] at (fsensn.east) {$F_{m}$};
|
|
||||||
|
|
||||||
% Spring, Damper, and Actuator
|
|
||||||
\draw[spring] (-0.4, 0) -- (-0.4, 1) node[midway, right=0.1]{$K_{a}$};
|
|
||||||
\draw[actuator={0.4}{0.2}] (0.4, 0) -- (0.4, 1) node[midway, right=0.1]{$F$};
|
|
||||||
|
|
||||||
\draw[spring] (-1, 0) -- (-1, 1.4) node[midway, left=0.1]{$K_{r}$};
|
|
||||||
|
|
||||||
\draw[dashed] (1, 0) -- ++(0.4, 0);
|
|
||||||
|
|
||||||
\draw[dashed] (1, 1.4) -- ++(0.4, 0);
|
|
||||||
|
|
||||||
\draw[->] (0, 1.4)node[]{$\bullet$} -- ++(0, 0.5) node[right]{$v_{m}$};
|
|
||||||
|
|
||||||
\draw[<->] (1.4, 0) -- ++(0, 1.4) node[midway, right]{$d_{m}$};
|
|
||||||
\end{tikzpicture}
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
#+name: fig:amplified_piezo_model
|
|
||||||
#+caption: Model of an amplified actuator
|
|
||||||
#+RESULTS:
|
|
||||||
[[file:figs/iff_1dof.png]]
|
|
||||||
|
|
||||||
** Function description
|
|
||||||
:PROPERTIES:
|
|
||||||
:UNNUMBERED: t
|
|
||||||
:END:
|
|
||||||
#+begin_src matlab
|
|
||||||
function [stewart] = initializeAmplifiedStrutDynamics(stewart, args)
|
|
||||||
% initializeAmplifiedStrutDynamics - Add Stiffness and Damping properties of each strut
|
|
||||||
%
|
|
||||||
% Syntax: [stewart] = initializeAmplifiedStrutDynamics(args)
|
|
||||||
%
|
|
||||||
% Inputs:
|
|
||||||
% - args - Structure with the following fields:
|
|
||||||
% - Ka [6x1] - Vertical stiffness contribution of the piezoelectric stack [N/m]
|
|
||||||
% - Ca [6x1] - Vertical damping contribution of the piezoelectric stack [N/(m/s)]
|
|
||||||
% - Kr [6x1] - Vertical (residual) stiffness when the piezoelectric stack is removed [N/m]
|
|
||||||
% - Cr [6x1] - Vertical (residual) damping when the piezoelectric stack is removed [N/(m/s)]
|
|
||||||
%
|
|
||||||
% Outputs:
|
|
||||||
% - stewart - updated Stewart structure with the added fields:
|
|
||||||
% - actuators.type = 2
|
|
||||||
% - actuators.K [6x1] - Total Stiffness of each strut [N/m]
|
|
||||||
% - actuators.C [6x1] - Total Damping of each strut [N/(m/s)]
|
|
||||||
% - actuators.Ka [6x1] - Vertical stiffness contribution of the piezoelectric stack [N/m]
|
|
||||||
% - actuators.Ca [6x1] - Vertical damping contribution of the piezoelectric stack [N/(m/s)]
|
|
||||||
% - actuators.Kr [6x1] - Vertical stiffness when the piezoelectric stack is removed [N/m]
|
|
||||||
% - actuators.Cr [6x1] - Vertical damping when the piezoelectric stack is removed [N/(m/s)]
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
** Optional Parameters
|
|
||||||
:PROPERTIES:
|
|
||||||
:UNNUMBERED: t
|
|
||||||
:END:
|
|
||||||
#+begin_src matlab
|
|
||||||
arguments
|
|
||||||
stewart
|
|
||||||
args.Kr (6,1) double {mustBeNumeric, mustBeNonnegative} = 5e6*ones(6,1)
|
|
||||||
args.Cr (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
|
||||||
args.Ka (6,1) double {mustBeNumeric, mustBeNonnegative} = 15e6*ones(6,1)
|
|
||||||
args.Ca (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
|
||||||
end
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
** Compute the total stiffness and damping
|
|
||||||
:PROPERTIES:
|
|
||||||
:UNNUMBERED: t
|
|
||||||
:END:
|
|
||||||
#+begin_src matlab
|
|
||||||
K = args.Ka + args.Kr;
|
|
||||||
C = args.Ca + args.Cr;
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
** Populate the =stewart= structure
|
|
||||||
:PROPERTIES:
|
|
||||||
:UNNUMBERED: t
|
|
||||||
:END:
|
|
||||||
#+begin_src matlab
|
|
||||||
stewart.actuators.type = 2;
|
|
||||||
|
|
||||||
stewart.actuators.Ka = args.Ka;
|
|
||||||
stewart.actuators.Ca = args.Ca;
|
|
||||||
|
|
||||||
stewart.actuators.Kr = args.Kr;
|
|
||||||
stewart.actuators.Cr = args.Cr;
|
|
||||||
|
|
||||||
stewart.actuators.K = K;
|
|
||||||
stewart.actuators.C = K;
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
* =initializeJointDynamics=: Add Stiffness and Damping properties for spherical joints
|
* =initializeJointDynamics=: Add Stiffness and Damping properties for spherical joints
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:header-args:matlab+: :tangle ../src/initializeJointDynamics.m
|
:header-args:matlab+: :tangle ../src/initializeJointDynamics.m
|
||||||
@ -995,14 +864,10 @@ This Matlab function is accessible [[file:../src/initializeJointDynamics.m][here
|
|||||||
% - Kt_M [6x1] - Torsion (Rz) Stiffness for each top joints [(N.m)/rad]
|
% - Kt_M [6x1] - Torsion (Rz) Stiffness for each top joints [(N.m)/rad]
|
||||||
% - Cf_M [6x1] - Bending (Rx, Ry) Damping of each top joint [(N.m)/(rad/s)]
|
% - Cf_M [6x1] - Bending (Rx, Ry) Damping of each top joint [(N.m)/(rad/s)]
|
||||||
% - Ct_M [6x1] - Torsion (Rz) Damping of each top joint [(N.m)/(rad/s)]
|
% - Ct_M [6x1] - Torsion (Rz) Damping of each top joint [(N.m)/(rad/s)]
|
||||||
% - Kz_M [6x1] - Translation (Tz) Stiffness for each top joints [N/m]
|
|
||||||
% - Cz_M [6x1] - Translation (Tz) Damping of each top joint [N/m]
|
|
||||||
% - Kf_F [6x1] - Bending (Rx, Ry) Stiffness for each bottom joints [(N.m)/rad]
|
% - Kf_F [6x1] - Bending (Rx, Ry) Stiffness for each bottom joints [(N.m)/rad]
|
||||||
% - Kt_F [6x1] - Torsion (Rz) Stiffness for each bottom joints [(N.m)/rad]
|
% - Kt_F [6x1] - Torsion (Rz) Stiffness for each bottom joints [(N.m)/rad]
|
||||||
% - Cf_F [6x1] - Bending (Rx, Ry) Damping of each bottom joint [(N.m)/(rad/s)]
|
% - Cf_F [6x1] - Bending (Rx, Ry) Damping of each bottom joint [(N.m)/(rad/s)]
|
||||||
% - Cf_F [6x1] - Torsion (Rz) Damping of each bottom joint [(N.m)/(rad/s)]
|
% - Cf_F [6x1] - Torsion (Rz) Damping of each bottom joint [(N.m)/(rad/s)]
|
||||||
% - Kz_F [6x1] - Translation (Tz) Stiffness for each bottom joints [N/m]
|
|
||||||
% - Cz_F [6x1] - Translation (Tz) Damping of each bottom joint [N/m]
|
|
||||||
%
|
%
|
||||||
% Outputs:
|
% Outputs:
|
||||||
% - stewart - updated Stewart structure with the added fields:
|
% - stewart - updated Stewart structure with the added fields:
|
||||||
@ -1023,20 +888,34 @@ This Matlab function is accessible [[file:../src/initializeJointDynamics.m][here
|
|||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
arguments
|
arguments
|
||||||
stewart
|
stewart
|
||||||
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal'
|
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'universal'
|
||||||
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'spherical_3dof'})} = 'spherical'
|
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'spherical'
|
||||||
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
|
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
|
||||||
args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
||||||
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
|
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
|
||||||
args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
||||||
args.Kz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
|
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
|
||||||
args.Cz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
|
|
||||||
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
|
|
||||||
args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
||||||
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
|
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
|
||||||
args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
||||||
args.Kz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
|
args.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
|
||||||
args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
|
args.Ca_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.Kr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
|
||||||
|
args.Cr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.Ka_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
|
||||||
|
args.Ca_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.Kr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
|
||||||
|
args.Cr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.K_M double {mustBeNumeric} = zeros(6,6)
|
||||||
|
args.M_M double {mustBeNumeric} = zeros(6,6)
|
||||||
|
args.n_xyz_M double {mustBeNumeric} = zeros(2,3)
|
||||||
|
args.xi_M double {mustBeNumeric} = 0.1
|
||||||
|
args.step_file_M char {} = ''
|
||||||
|
args.K_F double {mustBeNumeric} = zeros(6,6)
|
||||||
|
args.M_F double {mustBeNumeric} = zeros(6,6)
|
||||||
|
args.n_xyz_F double {mustBeNumeric} = zeros(2,3)
|
||||||
|
args.xi_F double {mustBeNumeric} = 0.1
|
||||||
|
args.step_file_F char {} = ''
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -1051,11 +930,15 @@ This Matlab function is accessible [[file:../src/initializeJointDynamics.m][here
|
|||||||
case 'spherical'
|
case 'spherical'
|
||||||
stewart.joints_F.type = 2;
|
stewart.joints_F.type = 2;
|
||||||
case 'universal_p'
|
case 'universal_p'
|
||||||
stewart.joints_F.type = 1;
|
stewart.joints_F.type = 3;
|
||||||
case 'spherical_p'
|
case 'spherical_p'
|
||||||
stewart.joints_F.type = 2;
|
stewart.joints_F.type = 4;
|
||||||
case 'universal_3dof'
|
case 'flexible'
|
||||||
stewart.joints_F.type = 5;
|
stewart.joints_F.type = 5;
|
||||||
|
case 'universal_3dof'
|
||||||
|
stewart.joints_F.type = 6;
|
||||||
|
case 'spherical_3dof'
|
||||||
|
stewart.joints_F.type = 7;
|
||||||
end
|
end
|
||||||
|
|
||||||
switch args.type_M
|
switch args.type_M
|
||||||
@ -1064,56 +947,38 @@ This Matlab function is accessible [[file:../src/initializeJointDynamics.m][here
|
|||||||
case 'spherical'
|
case 'spherical'
|
||||||
stewart.joints_M.type = 2;
|
stewart.joints_M.type = 2;
|
||||||
case 'universal_p'
|
case 'universal_p'
|
||||||
stewart.joints_M.type = 1;
|
stewart.joints_M.type = 3;
|
||||||
case 'spherical_p'
|
case 'spherical_p'
|
||||||
stewart.joints_M.type = 2;
|
stewart.joints_M.type = 4;
|
||||||
case 'spherical_3dof'
|
case 'flexible'
|
||||||
|
stewart.joints_M.type = 5;
|
||||||
|
case 'universal_3dof'
|
||||||
stewart.joints_M.type = 6;
|
stewart.joints_M.type = 6;
|
||||||
|
case 'spherical_3dof'
|
||||||
|
stewart.joints_M.type = 7;
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Initialize Stiffness
|
|
||||||
#+begin_src matlab
|
|
||||||
stewart.joints_M.Kx = zeros(6,1);
|
|
||||||
stewart.joints_M.Ky = zeros(6,1);
|
|
||||||
stewart.joints_M.Kz = zeros(6,1);
|
|
||||||
stewart.joints_F.Kx = zeros(6,1);
|
|
||||||
stewart.joints_F.Ky = zeros(6,1);
|
|
||||||
stewart.joints_F.Kz = zeros(6,1);
|
|
||||||
|
|
||||||
stewart.joints_M.Kf = zeros(6,1);
|
|
||||||
stewart.joints_M.Kt = zeros(6,1);
|
|
||||||
stewart.joints_F.Kf = zeros(6,1);
|
|
||||||
stewart.joints_F.Kt = zeros(6,1);
|
|
||||||
|
|
||||||
stewart.joints_M.Cx = zeros(6,1);
|
|
||||||
stewart.joints_M.Cy = zeros(6,1);
|
|
||||||
stewart.joints_M.Cz = zeros(6,1);
|
|
||||||
stewart.joints_F.Cx = zeros(6,1);
|
|
||||||
stewart.joints_F.Cy = zeros(6,1);
|
|
||||||
stewart.joints_F.Cz = zeros(6,1);
|
|
||||||
|
|
||||||
stewart.joints_M.Cf = zeros(6,1);
|
|
||||||
stewart.joints_M.Ct = zeros(6,1);
|
|
||||||
stewart.joints_F.Cf = zeros(6,1);
|
|
||||||
stewart.joints_F.Ct = zeros(6,1);
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
** Add Stiffness and Damping in Translation of each strut
|
** Add Stiffness and Damping in Translation of each strut
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
Translation Stiffness
|
Axial and Radial (shear) Stiffness
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p')
|
stewart.joints_M.Ka = args.Ka_M;
|
||||||
stewart.joints_M.Kz = args.Kz_M;
|
stewart.joints_M.Kr = args.Kr_M;
|
||||||
stewart.joints_M.Cz = args.Cz_M;
|
|
||||||
end
|
|
||||||
|
|
||||||
if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p')
|
stewart.joints_F.Ka = args.Ka_F;
|
||||||
stewart.joints_F.Kz = args.Kz_F;
|
stewart.joints_F.Kr = args.Kr_F;
|
||||||
stewart.joints_F.Cz = args.Cz_F;
|
#+end_src
|
||||||
end
|
|
||||||
|
Translation Damping
|
||||||
|
#+begin_src matlab
|
||||||
|
stewart.joints_M.Ca = args.Ca_M;
|
||||||
|
stewart.joints_M.Cr = args.Cr_M;
|
||||||
|
|
||||||
|
stewart.joints_F.Ca = args.Ca_F;
|
||||||
|
stewart.joints_F.Cr = args.Cr_F;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Add Stiffness and Damping in Rotation of each strut
|
** Add Stiffness and Damping in Rotation of each strut
|
||||||
@ -1122,21 +987,40 @@ Translation Stiffness
|
|||||||
:END:
|
:END:
|
||||||
Rotational Stiffness
|
Rotational Stiffness
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p')
|
|
||||||
stewart.joints_M.Kf = args.Kf_M;
|
stewart.joints_M.Kf = args.Kf_M;
|
||||||
stewart.joints_M.Cf = args.Cf_M;
|
|
||||||
|
|
||||||
stewart.joints_M.Kt = args.Kt_M;
|
stewart.joints_M.Kt = args.Kt_M;
|
||||||
stewart.joints_M.Ct = args.Ct_M;
|
|
||||||
end
|
|
||||||
|
|
||||||
if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p')
|
|
||||||
stewart.joints_F.Kf = args.Kf_F;
|
stewart.joints_F.Kf = args.Kf_F;
|
||||||
stewart.joints_F.Cf = args.Cf_F;
|
|
||||||
|
|
||||||
stewart.joints_F.Kt = args.Kt_F;
|
stewart.joints_F.Kt = args.Kt_F;
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Rotational Damping
|
||||||
|
#+begin_src matlab
|
||||||
|
stewart.joints_M.Cf = args.Cf_M;
|
||||||
|
stewart.joints_M.Ct = args.Ct_M;
|
||||||
|
|
||||||
|
stewart.joints_F.Cf = args.Cf_F;
|
||||||
stewart.joints_F.Ct = args.Ct_F;
|
stewart.joints_F.Ct = args.Ct_F;
|
||||||
end
|
#+end_src
|
||||||
|
|
||||||
|
** Stiffness and Mass matrices for flexible joint
|
||||||
|
:PROPERTIES:
|
||||||
|
:UNNUMBERED: t
|
||||||
|
:END:
|
||||||
|
|
||||||
|
#+begin_src matlab
|
||||||
|
stewart.joints_F.M = args.M_F;
|
||||||
|
stewart.joints_F.K = args.K_F;
|
||||||
|
stewart.joints_F.n_xyz = args.n_xyz_F;
|
||||||
|
stewart.joints_F.xi = args.xi_F;
|
||||||
|
stewart.joints_F.xi = args.xi_F;
|
||||||
|
stewart.joints_F.step_file = args.step_file_F;
|
||||||
|
|
||||||
|
stewart.joints_M.M = args.M_M;
|
||||||
|
stewart.joints_M.K = args.K_M;
|
||||||
|
stewart.joints_M.n_xyz = args.n_xyz_M;
|
||||||
|
stewart.joints_M.xi = args.xi_M;
|
||||||
|
stewart.joints_M.step_file = args.step_file_M;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* =initializeInertialSensor=: Initialize the inertial sensor in each strut
|
* =initializeInertialSensor=: Initialize the inertial sensor in each strut
|
||||||
|
@ -46,6 +46,10 @@ switch stewart.joints_F.type
|
|||||||
fprintf('- The joints on the fixed based are universal joints\n')
|
fprintf('- The joints on the fixed based are universal joints\n')
|
||||||
case 2
|
case 2
|
||||||
fprintf('- The joints on the fixed based are spherical joints\n')
|
fprintf('- The joints on the fixed based are spherical joints\n')
|
||||||
|
case 3
|
||||||
|
fprintf('- The joints on the fixed based are perfect universal joints\n')
|
||||||
|
case 4
|
||||||
|
fprintf('- The joints on the fixed based are perfect spherical joints\n')
|
||||||
end
|
end
|
||||||
|
|
||||||
switch stewart.joints_M.type
|
switch stewart.joints_M.type
|
||||||
@ -53,6 +57,10 @@ switch stewart.joints_M.type
|
|||||||
fprintf('- The joints on the mobile based are universal joints\n')
|
fprintf('- The joints on the mobile based are universal joints\n')
|
||||||
case 2
|
case 2
|
||||||
fprintf('- The joints on the mobile based are spherical joints\n')
|
fprintf('- The joints on the mobile based are spherical joints\n')
|
||||||
|
case 3
|
||||||
|
fprintf('- The joints on the mobile based are perfect universal joints\n')
|
||||||
|
case 4
|
||||||
|
fprintf('- The joints on the mobile based are perfect spherical joints\n')
|
||||||
end
|
end
|
||||||
|
|
||||||
fprintf('- The position of the joints on the fixed based with respect to {F} are (in [mm]):\n')
|
fprintf('- The position of the joints on the fixed based with respect to {F} are (in [mm]):\n')
|
||||||
|
@ -9,6 +9,7 @@ arguments
|
|||||||
args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m]
|
args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m]
|
||||||
args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m]
|
args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m]
|
||||||
args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m]
|
args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m]
|
||||||
|
args.sample_pos (1,1) double {mustBeNumeric} = 0.8 % Height of the measurment point [m]
|
||||||
end
|
end
|
||||||
|
|
||||||
granite = struct();
|
granite = struct();
|
||||||
@ -29,7 +30,7 @@ end
|
|||||||
granite.density = args.density; % [kg/m3]
|
granite.density = args.density; % [kg/m3]
|
||||||
granite.STEP = './STEPS/granite/granite.STEP';
|
granite.STEP = './STEPS/granite/granite.STEP';
|
||||||
|
|
||||||
granite.sample_pos = 0.8; % [m]
|
granite.sample_pos = args.sample_pos; % [m]
|
||||||
|
|
||||||
granite.K = args.K; % [N/m]
|
granite.K = args.K; % [N/m]
|
||||||
granite.C = args.C; % [N/(m/s)]
|
granite.C = args.C; % [N/(m/s)]
|
||||||
|
@ -11,14 +11,10 @@ function [stewart] = initializeJointDynamics(stewart, args)
|
|||||||
% - Kt_M [6x1] - Torsion (Rz) Stiffness for each top joints [(N.m)/rad]
|
% - Kt_M [6x1] - Torsion (Rz) Stiffness for each top joints [(N.m)/rad]
|
||||||
% - Cf_M [6x1] - Bending (Rx, Ry) Damping of each top joint [(N.m)/(rad/s)]
|
% - Cf_M [6x1] - Bending (Rx, Ry) Damping of each top joint [(N.m)/(rad/s)]
|
||||||
% - Ct_M [6x1] - Torsion (Rz) Damping of each top joint [(N.m)/(rad/s)]
|
% - Ct_M [6x1] - Torsion (Rz) Damping of each top joint [(N.m)/(rad/s)]
|
||||||
% - Kz_M [6x1] - Translation (Tz) Stiffness for each top joints [N/m]
|
|
||||||
% - Cz_M [6x1] - Translation (Tz) Damping of each top joint [N/m]
|
|
||||||
% - Kf_F [6x1] - Bending (Rx, Ry) Stiffness for each bottom joints [(N.m)/rad]
|
% - Kf_F [6x1] - Bending (Rx, Ry) Stiffness for each bottom joints [(N.m)/rad]
|
||||||
% - Kt_F [6x1] - Torsion (Rz) Stiffness for each bottom joints [(N.m)/rad]
|
% - Kt_F [6x1] - Torsion (Rz) Stiffness for each bottom joints [(N.m)/rad]
|
||||||
% - Cf_F [6x1] - Bending (Rx, Ry) Damping of each bottom joint [(N.m)/(rad/s)]
|
% - Cf_F [6x1] - Bending (Rx, Ry) Damping of each bottom joint [(N.m)/(rad/s)]
|
||||||
% - Cf_F [6x1] - Torsion (Rz) Damping of each bottom joint [(N.m)/(rad/s)]
|
% - Cf_F [6x1] - Torsion (Rz) Damping of each bottom joint [(N.m)/(rad/s)]
|
||||||
% - Kz_F [6x1] - Translation (Tz) Stiffness for each bottom joints [N/m]
|
|
||||||
% - Cz_F [6x1] - Translation (Tz) Damping of each bottom joint [N/m]
|
|
||||||
%
|
%
|
||||||
% Outputs:
|
% Outputs:
|
||||||
% - stewart - updated Stewart structure with the added fields:
|
% - stewart - updated Stewart structure with the added fields:
|
||||||
@ -33,20 +29,34 @@ function [stewart] = initializeJointDynamics(stewart, args)
|
|||||||
|
|
||||||
arguments
|
arguments
|
||||||
stewart
|
stewart
|
||||||
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal'
|
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'universal'
|
||||||
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'spherical_3dof'})} = 'spherical'
|
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'spherical'
|
||||||
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
|
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
|
||||||
args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
||||||
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
|
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
|
||||||
args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
||||||
args.Kz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
|
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
|
||||||
args.Cz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
|
|
||||||
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
|
|
||||||
args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
||||||
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
|
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
|
||||||
args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
||||||
args.Kz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
|
args.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
|
||||||
args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
|
args.Ca_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.Kr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
|
||||||
|
args.Cr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.Ka_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
|
||||||
|
args.Ca_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.Kr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
|
||||||
|
args.Cr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.K_M double {mustBeNumeric} = zeros(6,6)
|
||||||
|
args.M_M double {mustBeNumeric} = zeros(6,6)
|
||||||
|
args.n_xyz_M double {mustBeNumeric} = zeros(2,3)
|
||||||
|
args.xi_M double {mustBeNumeric} = 0.1
|
||||||
|
args.step_file_M char {} = ''
|
||||||
|
args.K_F double {mustBeNumeric} = zeros(6,6)
|
||||||
|
args.M_F double {mustBeNumeric} = zeros(6,6)
|
||||||
|
args.n_xyz_F double {mustBeNumeric} = zeros(2,3)
|
||||||
|
args.xi_F double {mustBeNumeric} = 0.1
|
||||||
|
args.step_file_F char {} = ''
|
||||||
end
|
end
|
||||||
|
|
||||||
switch args.type_F
|
switch args.type_F
|
||||||
@ -55,11 +65,15 @@ switch args.type_F
|
|||||||
case 'spherical'
|
case 'spherical'
|
||||||
stewart.joints_F.type = 2;
|
stewart.joints_F.type = 2;
|
||||||
case 'universal_p'
|
case 'universal_p'
|
||||||
stewart.joints_F.type = 1;
|
stewart.joints_F.type = 3;
|
||||||
case 'spherical_p'
|
case 'spherical_p'
|
||||||
stewart.joints_F.type = 2;
|
stewart.joints_F.type = 4;
|
||||||
case 'universal_3dof'
|
case 'flexible'
|
||||||
stewart.joints_F.type = 5;
|
stewart.joints_F.type = 5;
|
||||||
|
case 'universal_3dof'
|
||||||
|
stewart.joints_F.type = 6;
|
||||||
|
case 'spherical_3dof'
|
||||||
|
stewart.joints_F.type = 7;
|
||||||
end
|
end
|
||||||
|
|
||||||
switch args.type_M
|
switch args.type_M
|
||||||
@ -68,59 +82,50 @@ switch args.type_M
|
|||||||
case 'spherical'
|
case 'spherical'
|
||||||
stewart.joints_M.type = 2;
|
stewart.joints_M.type = 2;
|
||||||
case 'universal_p'
|
case 'universal_p'
|
||||||
stewart.joints_M.type = 1;
|
stewart.joints_M.type = 3;
|
||||||
case 'spherical_p'
|
case 'spherical_p'
|
||||||
stewart.joints_M.type = 2;
|
stewart.joints_M.type = 4;
|
||||||
case 'spherical_3dof'
|
case 'flexible'
|
||||||
|
stewart.joints_M.type = 5;
|
||||||
|
case 'universal_3dof'
|
||||||
stewart.joints_M.type = 6;
|
stewart.joints_M.type = 6;
|
||||||
|
case 'spherical_3dof'
|
||||||
|
stewart.joints_M.type = 7;
|
||||||
end
|
end
|
||||||
|
|
||||||
stewart.joints_M.Kx = zeros(6,1);
|
stewart.joints_M.Ka = args.Ka_M;
|
||||||
stewart.joints_M.Ky = zeros(6,1);
|
stewart.joints_M.Kr = args.Kr_M;
|
||||||
stewart.joints_M.Kz = zeros(6,1);
|
|
||||||
stewart.joints_F.Kx = zeros(6,1);
|
|
||||||
stewart.joints_F.Ky = zeros(6,1);
|
|
||||||
stewart.joints_F.Kz = zeros(6,1);
|
|
||||||
|
|
||||||
stewart.joints_M.Kf = zeros(6,1);
|
stewart.joints_F.Ka = args.Ka_F;
|
||||||
stewart.joints_M.Kt = zeros(6,1);
|
stewart.joints_F.Kr = args.Kr_F;
|
||||||
stewart.joints_F.Kf = zeros(6,1);
|
|
||||||
stewart.joints_F.Kt = zeros(6,1);
|
|
||||||
|
|
||||||
stewart.joints_M.Cx = zeros(6,1);
|
stewart.joints_M.Ca = args.Ca_M;
|
||||||
stewart.joints_M.Cy = zeros(6,1);
|
stewart.joints_M.Cr = args.Cr_M;
|
||||||
stewart.joints_M.Cz = zeros(6,1);
|
|
||||||
stewart.joints_F.Cx = zeros(6,1);
|
|
||||||
stewart.joints_F.Cy = zeros(6,1);
|
|
||||||
stewart.joints_F.Cz = zeros(6,1);
|
|
||||||
|
|
||||||
stewart.joints_M.Cf = zeros(6,1);
|
stewart.joints_F.Ca = args.Ca_F;
|
||||||
stewart.joints_M.Ct = zeros(6,1);
|
stewart.joints_F.Cr = args.Cr_F;
|
||||||
stewart.joints_F.Cf = zeros(6,1);
|
|
||||||
stewart.joints_F.Ct = zeros(6,1);
|
|
||||||
|
|
||||||
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p')
|
|
||||||
stewart.joints_M.Kz = args.Kz_M;
|
|
||||||
stewart.joints_M.Cz = args.Cz_M;
|
|
||||||
end
|
|
||||||
|
|
||||||
if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p')
|
|
||||||
stewart.joints_F.Kz = args.Kz_F;
|
|
||||||
stewart.joints_F.Cz = args.Cz_F;
|
|
||||||
end
|
|
||||||
|
|
||||||
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p')
|
|
||||||
stewart.joints_M.Kf = args.Kf_M;
|
stewart.joints_M.Kf = args.Kf_M;
|
||||||
stewart.joints_M.Cf = args.Cf_M;
|
|
||||||
|
|
||||||
stewart.joints_M.Kt = args.Kt_M;
|
stewart.joints_M.Kt = args.Kt_M;
|
||||||
stewart.joints_M.Ct = args.Ct_M;
|
|
||||||
end
|
|
||||||
|
|
||||||
if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p')
|
|
||||||
stewart.joints_F.Kf = args.Kf_F;
|
stewart.joints_F.Kf = args.Kf_F;
|
||||||
stewart.joints_F.Cf = args.Cf_F;
|
|
||||||
|
|
||||||
stewart.joints_F.Kt = args.Kt_F;
|
stewart.joints_F.Kt = args.Kt_F;
|
||||||
|
|
||||||
|
stewart.joints_M.Cf = args.Cf_M;
|
||||||
|
stewart.joints_M.Ct = args.Ct_M;
|
||||||
|
|
||||||
|
stewart.joints_F.Cf = args.Cf_F;
|
||||||
stewart.joints_F.Ct = args.Ct_F;
|
stewart.joints_F.Ct = args.Ct_F;
|
||||||
end
|
|
||||||
|
stewart.joints_F.M = args.M_F;
|
||||||
|
stewart.joints_F.K = args.K_F;
|
||||||
|
stewart.joints_F.n_xyz = args.n_xyz_F;
|
||||||
|
stewart.joints_F.xi = args.xi_F;
|
||||||
|
stewart.joints_F.xi = args.xi_F;
|
||||||
|
stewart.joints_F.step_file = args.step_file_F;
|
||||||
|
|
||||||
|
stewart.joints_M.M = args.M_M;
|
||||||
|
stewart.joints_M.K = args.K_M;
|
||||||
|
stewart.joints_M.n_xyz = args.n_xyz_M;
|
||||||
|
stewart.joints_M.xi = args.xi_M;
|
||||||
|
stewart.joints_M.step_file = args.step_file_M;
|
||||||
|
@ -32,7 +32,7 @@ mirror.Deq = zeros(6,1);
|
|||||||
|
|
||||||
mirror.h = 0.05; % Height of the mirror [m]
|
mirror.h = 0.05; % Height of the mirror [m]
|
||||||
|
|
||||||
mirror.thickness = 0.025; % Thickness of the plate supporting the sample [m]
|
mirror.thickness = 0.02; % Thickness of the plate supporting the sample [m]
|
||||||
|
|
||||||
mirror.hole_rad = 0.125; % radius of the hole in the mirror [m]
|
mirror.hole_rad = 0.125; % radius of the hole in the mirror [m]
|
||||||
|
|
||||||
@ -41,11 +41,11 @@ mirror.support_rad = 0.1; % radius of the support plate [m]
|
|||||||
% point of interest offset in z (above the top surfave) [m]
|
% point of interest offset in z (above the top surfave) [m]
|
||||||
switch args.type
|
switch args.type
|
||||||
case 'none'
|
case 'none'
|
||||||
mirror.jacobian = 0.20;
|
mirror.jacobian = 0.205;
|
||||||
case 'rigid'
|
case 'rigid'
|
||||||
mirror.jacobian = 0.20 - mirror.h;
|
mirror.jacobian = 0.205 - mirror.h;
|
||||||
case 'flexible'
|
case 'flexible'
|
||||||
mirror.jacobian = 0.20 - mirror.h;
|
mirror.jacobian = 0.205 - mirror.h;
|
||||||
end
|
end
|
||||||
|
|
||||||
mirror.rad = 0.180; % radius of the mirror (at the bottom surface) [m]
|
mirror.rad = 0.180; % radius of the mirror (at the bottom surface) [m]
|
||||||
|
@ -3,8 +3,8 @@ function [nano_hexapod] = initializeNanoHexapod(args)
|
|||||||
arguments
|
arguments
|
||||||
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible'
|
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible'
|
||||||
% initializeFramesPositions
|
% initializeFramesPositions
|
||||||
args.H (1,1) double {mustBeNumeric, mustBePositive} = 90e-3
|
args.H (1,1) double {mustBeNumeric, mustBePositive} = 95e-3
|
||||||
args.MO_B (1,1) double {mustBeNumeric} = 175e-3
|
args.MO_B (1,1) double {mustBeNumeric} = 170e-3
|
||||||
% generateGeneralConfiguration
|
% generateGeneralConfiguration
|
||||||
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
|
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
|
||||||
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
|
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
|
||||||
@ -18,25 +18,28 @@ arguments
|
|||||||
args.ke (1,1) double {mustBeNumeric} = 5e6
|
args.ke (1,1) double {mustBeNumeric} = 5e6
|
||||||
args.ka (1,1) double {mustBeNumeric} = 60e6
|
args.ka (1,1) double {mustBeNumeric} = 60e6
|
||||||
args.c1 (1,1) double {mustBeNumeric} = 10
|
args.c1 (1,1) double {mustBeNumeric} = 10
|
||||||
args.ce (1,1) double {mustBeNumeric} = 10
|
args.F_gain (1,1) double {mustBeNumeric} = 1
|
||||||
args.ca (1,1) double {mustBeNumeric} = 10
|
|
||||||
args.k (1,1) double {mustBeNumeric} = -1
|
args.k (1,1) double {mustBeNumeric} = -1
|
||||||
args.c (1,1) double {mustBeNumeric} = -1
|
args.c (1,1) double {mustBeNumeric} = -1
|
||||||
% initializeJointDynamics
|
% initializeJointDynamics
|
||||||
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal'
|
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'universal'
|
||||||
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'spherical_3dof'})} = 'spherical'
|
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'spherical'
|
||||||
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
|
args.Ka_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
|
||||||
|
args.Ca_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.Kr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
|
||||||
|
args.Cr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
|
||||||
args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
||||||
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
|
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
|
||||||
args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
||||||
args.Kz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
|
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
|
||||||
args.Cz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
|
|
||||||
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
|
|
||||||
args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
|
||||||
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
|
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
|
||||||
args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
|
||||||
args.Kz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
|
args.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
|
||||||
args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
|
args.Ca_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
|
args.Kr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
|
||||||
|
args.Cr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
|
||||||
% initializeCylindricalPlatforms
|
% initializeCylindricalPlatforms
|
||||||
args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
|
args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
|
||||||
args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
|
args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
|
||||||
@ -81,9 +84,8 @@ elseif strcmp(args.actuator, 'amplified')
|
|||||||
'k1', args.k1*ones(6,1), ...
|
'k1', args.k1*ones(6,1), ...
|
||||||
'c1', args.c1*ones(6,1), ...
|
'c1', args.c1*ones(6,1), ...
|
||||||
'ka', args.ka*ones(6,1), ...
|
'ka', args.ka*ones(6,1), ...
|
||||||
'ca', args.ca*ones(6,1), ...
|
|
||||||
'ke', args.ke*ones(6,1), ...
|
'ke', args.ke*ones(6,1), ...
|
||||||
'ce', args.ce*ones(6,1));
|
'F_gain', args.F_gain*ones(6,1));
|
||||||
else
|
else
|
||||||
error('args.actuator should be piezo, lorentz or amplified');
|
error('args.actuator should be piezo, lorentz or amplified');
|
||||||
end
|
end
|
||||||
@ -95,14 +97,18 @@ stewart = initializeJointDynamics(stewart, ...
|
|||||||
'Cf_M', args.Cf_M, ...
|
'Cf_M', args.Cf_M, ...
|
||||||
'Kt_M', args.Kt_M, ...
|
'Kt_M', args.Kt_M, ...
|
||||||
'Ct_M', args.Ct_M, ...
|
'Ct_M', args.Ct_M, ...
|
||||||
'Kz_M' , args.Kz_M, ...
|
|
||||||
'Cz_M' , args.Cz_M, ...
|
|
||||||
'Kf_F', args.Kf_F, ...
|
'Kf_F', args.Kf_F, ...
|
||||||
'Cf_F', args.Cf_F, ...
|
'Cf_F', args.Cf_F, ...
|
||||||
'Kt_F', args.Kt_F, ...
|
'Kt_F', args.Kt_F, ...
|
||||||
'Ct_F', args.Ct_F, ...
|
'Ct_F', args.Ct_F, ...
|
||||||
'Kz_F' , args.Kz_F, ...
|
'Ka_F', args.Ka_F, ...
|
||||||
'Cz_F' , args.Cz_F);
|
'Ca_F', args.Ca_F, ...
|
||||||
|
'Kr_F', args.Kr_F, ...
|
||||||
|
'Cr_F', args.Cr_F, ...
|
||||||
|
'Ka_M', args.Ka_M, ...
|
||||||
|
'Ca_M', args.Ca_M, ...
|
||||||
|
'Kr_M', args.Kr_M, ...
|
||||||
|
'Cr_M', args.Cr_M);
|
||||||
|
|
||||||
stewart = initializeCylindricalPlatforms(stewart, 'Fpm', args.Fpm, 'Fph', args.Fph, 'Fpr', args.Fpr, 'Mpm', args.Mpm, 'Mph', args.Mph, 'Mpr', args.Mpr);
|
stewart = initializeCylindricalPlatforms(stewart, 'Fpm', args.Fpm, 'Fph', args.Fph, 'Fpr', args.Fpr, 'Mpm', args.Mpm, 'Mph', args.Mph, 'Mpr', args.Mpr);
|
||||||
|
|
||||||
|
@ -19,14 +19,13 @@ arguments
|
|||||||
args.type char {mustBeMember(args.type,{'classical', 'amplified'})} = 'classical'
|
args.type char {mustBeMember(args.type,{'classical', 'amplified'})} = 'classical'
|
||||||
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1)
|
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1)
|
||||||
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1)
|
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1)
|
||||||
args.k1 (6,1) double {mustBeNumeric} = 1e6
|
args.k1 (6,1) double {mustBeNumeric} = 1e6*ones(6,1)
|
||||||
args.ke (6,1) double {mustBeNumeric} = 5e6
|
args.ke (6,1) double {mustBeNumeric} = 5e6*ones(6,1)
|
||||||
args.ka (6,1) double {mustBeNumeric} = 60e6
|
args.ka (6,1) double {mustBeNumeric} = 60e6*ones(6,1)
|
||||||
args.c1 (6,1) double {mustBeNumeric} = 10
|
args.c1 (6,1) double {mustBeNumeric} = 10*ones(6,1)
|
||||||
args.ce (6,1) double {mustBeNumeric} = 10
|
args.F_gain (6,1) double {mustBeNumeric} = 1*ones(6,1)
|
||||||
args.ca (6,1) double {mustBeNumeric} = 10
|
args.me (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
|
||||||
args.me (6,1) double {mustBeNumeric} = 0.05
|
args.ma (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
|
||||||
args.ma (6,1) double {mustBeNumeric} = 0.05
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if strcmp(args.type, 'classical')
|
if strcmp(args.type, 'classical')
|
||||||
@ -42,10 +41,9 @@ stewart.actuators.k1 = args.k1;
|
|||||||
stewart.actuators.c1 = args.c1;
|
stewart.actuators.c1 = args.c1;
|
||||||
|
|
||||||
stewart.actuators.ka = args.ka;
|
stewart.actuators.ka = args.ka;
|
||||||
stewart.actuators.ca = args.ca;
|
|
||||||
|
|
||||||
stewart.actuators.ke = args.ke;
|
stewart.actuators.ke = args.ke;
|
||||||
stewart.actuators.ce = args.ce;
|
|
||||||
|
stewart.actuators.F_gain = args.F_gain;
|
||||||
|
|
||||||
stewart.actuators.ma = args.ma;
|
stewart.actuators.ma = args.ma;
|
||||||
stewart.actuators.me = args.me;
|
stewart.actuators.me = args.me;
|
||||||
|
Loading…
Reference in New Issue
Block a user