Model flexible nano-hexapod elements
This commit is contained in:
		@@ -1,10 +1,9 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 | 
			
		||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 | 
			
		||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
<!-- 2020-05-05 mar. 11:50 -->
 | 
			
		||||
<!-- 2020-11-03 mar. 09:45 -->
 | 
			
		||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 | 
			
		||||
<title>Study of the Flexible Joints</title>
 | 
			
		||||
<meta name="generator" content="Org mode" />
 | 
			
		||||
@@ -37,19 +36,19 @@
 | 
			
		||||
<ul>
 | 
			
		||||
<li><a href="#orge032d30">1. Bending and Torsional Stiffness</a>
 | 
			
		||||
<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>
 | 
			
		||||
<ul>
 | 
			
		||||
<li><a href="#orgdb214f9">1.2.1. Direct Velocity Feedback</a></li>
 | 
			
		||||
<li><a href="#org4069e58">1.2.2. Primary Plant</a></li>
 | 
			
		||||
<li><a href="#orga32adf0">1.2.3. Conclusion</a></li>
 | 
			
		||||
<li><a href="#orge13b41c">1.2.1. Direct Velocity Feedback</a></li>
 | 
			
		||||
<li><a href="#orgd5fd59b">1.2.2. Primary Plant</a></li>
 | 
			
		||||
<li><a href="#org865157e">1.2.3. Conclusion</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
<li><a href="#org8ad3f34">1.3. Parametric Study</a>
 | 
			
		||||
<ul>
 | 
			
		||||
<li><a href="#org4adf147">1.3.1. Direct Velocity Feedback</a></li>
 | 
			
		||||
<li><a href="#org53e5f08">1.3.2. Primary Control</a></li>
 | 
			
		||||
<li><a href="#orgc45ccb0">1.3.3. Conclusion</a></li>
 | 
			
		||||
<li><a href="#orgc98ee7c">1.3.1. Direct Velocity Feedback</a></li>
 | 
			
		||||
<li><a href="#org15c2c08">1.3.2. Primary Control</a></li>
 | 
			
		||||
<li><a href="#org5322ecd">1.3.3. Conclusion</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
</ul>
 | 
			
		||||
@@ -58,22 +57,29 @@
 | 
			
		||||
<ul>
 | 
			
		||||
<li><a href="#org969d9e7">2.1. Realistic Translation Stiffness Values</a>
 | 
			
		||||
<ul>
 | 
			
		||||
<li><a href="#orge82a7c2">2.1.1. Initialization</a></li>
 | 
			
		||||
<li><a href="#org44f67b8">2.1.2. Direct Velocity Feedback</a></li>
 | 
			
		||||
<li><a href="#orgd5fd59b">2.1.3. Primary Plant</a></li>
 | 
			
		||||
<li><a href="#org552093a">2.1.4. Conclusion</a></li>
 | 
			
		||||
<li><a href="#org7dd21d5">2.1.1. Initialization</a></li>
 | 
			
		||||
<li><a href="#org47be52b">2.1.2. Direct Velocity Feedback</a></li>
 | 
			
		||||
<li><a href="#org15105f5">2.1.3. Primary Plant</a></li>
 | 
			
		||||
<li><a href="#org2098f1e">2.1.4. Conclusion</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
<li><a href="#org0275632">2.2. Parametric study</a>
 | 
			
		||||
<ul>
 | 
			
		||||
<li><a href="#orge13b41c">2.2.1. Direct Velocity Feedback</a></li>
 | 
			
		||||
<li><a href="#org15c2c08">2.2.2. Primary Control</a></li>
 | 
			
		||||
<li><a href="#orgd87b94b">2.2.1. Direct Velocity Feedback</a></li>
 | 
			
		||||
<li><a href="#orge5d1c12">2.2.2. Primary Control</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</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>
 | 
			
		||||
</li>
 | 
			
		||||
<li><a href="#org865157e">3. Conclusion</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -106,8 +112,8 @@ In this section, we wish to study the effect of the rotation flexibility of the
 | 
			
		||||
</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-org8fdef7f" class="outline-3">
 | 
			
		||||
<h3 id="org8fdef7f"><span class="section-number-3">1.1</span> Initialization</h3>
 | 
			
		||||
<div id="outline-container-orge82a7c2" class="outline-3">
 | 
			
		||||
<h3 id="orge82a7c2"><span class="section-number-3">1.1</span> Initialization</h3>
 | 
			
		||||
<div class="outline-text-3" id="text-1-1">
 | 
			
		||||
<p>
 | 
			
		||||
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.
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">initializeSample('mass', 50, 'freq', 200*ones(6,1));
 | 
			
		||||
initializeReferences('Rz_type', 'rotating-not-filtered', 'Rz_period', 60);
 | 
			
		||||
<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>
 | 
			
		||||
@@ -147,10 +153,10 @@ Let’s compare the ideal case (zero stiffness in rotation and infinite stif
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">Kf_M = 15*ones(6,1);
 | 
			
		||||
Kf_F = 15*ones(6,1);
 | 
			
		||||
Kt_M = 20*ones(6,1);
 | 
			
		||||
Kt_F = 20*ones(6,1);
 | 
			
		||||
<pre class="src src-matlab">Kf_M = 15<span class="org-type">*</span>ones(6,1);
 | 
			
		||||
Kf_F = 15<span class="org-type">*</span>ones(6,1);
 | 
			
		||||
Kt_M = 20<span class="org-type">*</span>ones(6,1);
 | 
			
		||||
Kt_F = 20<span class="org-type">*</span>ones(6,1);
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
@@ -158,8 +164,8 @@ Kt_F = 20*ones(6,1);
 | 
			
		||||
The stiffness and damping of the nano-hexapod’s legs are:
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">k_opt = 1e5; % [N/m]
 | 
			
		||||
c_opt = 2e2; % [N/(m/s)]
 | 
			
		||||
<pre class="src src-matlab">k_opt = 1e5; <span class="org-comment">% [N/m]</span>
 | 
			
		||||
c_opt = 2e2; <span class="org-comment">% [N/(m/s)]</span>
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
@@ -168,8 +174,8 @@ This corresponds to the optimal identified stiffness.
 | 
			
		||||
</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-orgdb214f9" class="outline-4">
 | 
			
		||||
<h4 id="orgdb214f9"><span class="section-number-4">1.2.1</span> Direct Velocity Feedback</h4>
 | 
			
		||||
<div id="outline-container-orge13b41c" class="outline-4">
 | 
			
		||||
<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">
 | 
			
		||||
<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.
 | 
			
		||||
@@ -189,8 +195,8 @@ It is shown that the adding of stiffness for the flexible joints does increase a
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-org4069e58" class="outline-4">
 | 
			
		||||
<h4 id="org4069e58"><span class="section-number-4">1.2.2</span> Primary Plant</h4>
 | 
			
		||||
<div id="outline-container-orgd5fd59b" class="outline-4">
 | 
			
		||||
<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">
 | 
			
		||||
<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).
 | 
			
		||||
@@ -210,10 +216,10 @@ The plant dynamics is not found to be changing significantly.
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-orga32adf0" class="outline-4">
 | 
			
		||||
<h4 id="orga32adf0"><span class="section-number-4">1.2.3</span> Conclusion</h4>
 | 
			
		||||
<div id="outline-container-org865157e" class="outline-4">
 | 
			
		||||
<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="important">
 | 
			
		||||
<div class="important" id="org69f9617">
 | 
			
		||||
<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.
 | 
			
		||||
</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:
 | 
			
		||||
</p>
 | 
			
		||||
<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>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
@@ -248,8 +254,8 @@ We also consider here a nano-hexapod with the identified optimal actuator stiffn
 | 
			
		||||
</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-org4adf147" class="outline-4">
 | 
			
		||||
<h4 id="org4adf147"><span class="section-number-4">1.3.1</span> Direct Velocity Feedback</h4>
 | 
			
		||||
<div id="outline-container-orgc98ee7c" class="outline-4">
 | 
			
		||||
<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">
 | 
			
		||||
<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>.
 | 
			
		||||
@@ -279,8 +285,8 @@ It is shown that the bending stiffness of the flexible joints does indeed change
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-org53e5f08" class="outline-4">
 | 
			
		||||
<h4 id="org53e5f08"><span class="section-number-4">1.3.2</span> Primary Control</h4>
 | 
			
		||||
<div id="outline-container-org15c2c08" class="outline-4">
 | 
			
		||||
<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">
 | 
			
		||||
<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>.
 | 
			
		||||
@@ -299,10 +305,10 @@ It is shown that the bending stiffness of the flexible joints have very little i
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-orgc45ccb0" class="outline-4">
 | 
			
		||||
<h4 id="orgc45ccb0"><span class="section-number-4">1.3.3</span> Conclusion</h4>
 | 
			
		||||
<div id="outline-container-org5322ecd" class="outline-4">
 | 
			
		||||
<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="important">
 | 
			
		||||
<div class="important" id="orga223c1a">
 | 
			
		||||
<p>
 | 
			
		||||
The bending stiffness of the flexible joint does not significantly change the dynamics.
 | 
			
		||||
</p>
 | 
			
		||||
@@ -333,16 +339,16 @@ We choose realistic values of the axial stiffness of the joints:
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">Kz_F = 60e6*ones(6,1); % [N/m]
 | 
			
		||||
Kz_M = 60e6*ones(6,1); % [N/m]
 | 
			
		||||
Cz_F = 1*ones(6,1); % [N/(m/s)]
 | 
			
		||||
Cz_M = 1*ones(6,1); % [N/(m/s)]
 | 
			
		||||
<pre class="src src-matlab">Ka_F = 60e6<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/m]</span>
 | 
			
		||||
Ka_M = 60e6<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/m]</span>
 | 
			
		||||
Ca_F = 1<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/(m/s)]</span>
 | 
			
		||||
Ca_M = 1<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/(m/s)]</span>
 | 
			
		||||
</pre>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-orge82a7c2" class="outline-4">
 | 
			
		||||
<h4 id="orge82a7c2"><span class="section-number-4">2.1.1</span> Initialization</h4>
 | 
			
		||||
<div id="outline-container-org7dd21d5" class="outline-4">
 | 
			
		||||
<h4 id="org7dd21d5"><span class="section-number-4">2.1.1</span> Initialization</h4>
 | 
			
		||||
<div class="outline-text-4" id="text-2-1-1">
 | 
			
		||||
<p>
 | 
			
		||||
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.
 | 
			
		||||
</p>
 | 
			
		||||
<div class="org-src-container">
 | 
			
		||||
<pre class="src src-matlab">initializeSample('mass', 50, 'freq', 200*ones(6,1));
 | 
			
		||||
initializeReferences('Rz_type', 'rotating-not-filtered', 'Rz_period', 60);
 | 
			
		||||
<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>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-org44f67b8" class="outline-4">
 | 
			
		||||
<h4 id="org44f67b8"><span class="section-number-4">2.1.2</span> Direct Velocity Feedback</h4>
 | 
			
		||||
<div id="outline-container-org47be52b" class="outline-4">
 | 
			
		||||
<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">
 | 
			
		||||
<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.
 | 
			
		||||
@@ -390,11 +396,11 @@ The obtained dynamics are shown in Figure <a href="#org78dd87a">6</a>.
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-orgd5fd59b" class="outline-4">
 | 
			
		||||
<h4 id="orgd5fd59b"><span class="section-number-4">2.1.3</span> Primary Plant</h4>
 | 
			
		||||
<div id="outline-container-org15105f5" class="outline-4">
 | 
			
		||||
<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="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>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
@@ -415,10 +421,10 @@ The dynamics is compare with and without the joint flexibility in Figure <a href
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-org552093a" class="outline-4">
 | 
			
		||||
<h4 id="org552093a"><span class="section-number-4">2.1.4</span> Conclusion</h4>
 | 
			
		||||
<div id="outline-container-org2098f1e" class="outline-4">
 | 
			
		||||
<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="important">
 | 
			
		||||
<div class="important" id="org3a7d9f4">
 | 
			
		||||
<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.
 | 
			
		||||
</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:
 | 
			
		||||
</p>
 | 
			
		||||
<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>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
@@ -448,8 +454,8 @@ We also consider here a nano-hexapod with the identified optimal actuator stiffn
 | 
			
		||||
</p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-orge13b41c" class="outline-4">
 | 
			
		||||
<h4 id="orge13b41c"><span class="section-number-4">2.2.1</span> Direct Velocity Feedback</h4>
 | 
			
		||||
<div id="outline-container-orgd87b94b" class="outline-4">
 | 
			
		||||
<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">
 | 
			
		||||
<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>.
 | 
			
		||||
@@ -491,8 +497,8 @@ It can be seen that very little active damping can be achieve for axial stiffnes
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-org15c2c08" class="outline-4">
 | 
			
		||||
<h4 id="org15c2c08"><span class="section-number-4">2.2.2</span> Primary Control</h4>
 | 
			
		||||
<div id="outline-container-orge5d1c12" class="outline-4">
 | 
			
		||||
<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">
 | 
			
		||||
<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>.
 | 
			
		||||
@@ -508,10 +514,10 @@ The dynamics from \(\bm{\tau}^\prime\) to \(\bm{\epsilon}_{\mathcal{X}_n}\) (for
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-orgce1052e" class="outline-3">
 | 
			
		||||
<h3 id="orgce1052e"><span class="section-number-3">2.3</span> Conclusion</h3>
 | 
			
		||||
<div id="outline-container-org382b3cb" class="outline-3">
 | 
			
		||||
<h3 id="org382b3cb"><span class="section-number-3">2.3</span> Conclusion</h3>
 | 
			
		||||
<div class="outline-text-3" id="text-2-3">
 | 
			
		||||
<div class="important">
 | 
			
		||||
<div class="important" id="org422e802">
 | 
			
		||||
<p>
 | 
			
		||||
The axial stiffness of the flexible joints should be maximized.
 | 
			
		||||
</p>
 | 
			
		||||
@@ -533,14 +539,14 @@ We may interpolate the results and say that the axial joint stiffness should be
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="outline-container-org865157e" class="outline-2">
 | 
			
		||||
<h2 id="org865157e"><span class="section-number-2">3</span> Conclusion</h2>
 | 
			
		||||
<div id="outline-container-orgb6f6c0a" class="outline-2">
 | 
			
		||||
<h2 id="orgb6f6c0a"><span class="section-number-2">3</span> Conclusion</h2>
 | 
			
		||||
<div class="outline-text-2" id="text-3">
 | 
			
		||||
<p>
 | 
			
		||||
<a id="org6614f42"></a>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<div class="important">
 | 
			
		||||
<div class="important" id="org3cbf243">
 | 
			
		||||
<p>
 | 
			
		||||
In this study we considered the bending, torsional and axial stiffnesses of the flexible joints used for the nano-hexapod.
 | 
			
		||||
</p>
 | 
			
		||||
@@ -575,10 +581,80 @@ As there is generally a trade-off between bending stiffness and axial stiffness,
 | 
			
		||||
</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 id="postamble" class="status">
 | 
			
		||||
<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>
 | 
			
		||||
</body>
 | 
			
		||||
</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] \]
 | 
			
		||||
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  Kz_F = 60e6*ones(6,1); % [N/m]
 | 
			
		||||
  Kz_M = 60e6*ones(6,1); % [N/m]
 | 
			
		||||
  Cz_F = 1*ones(6,1); % [N/(m/s)]
 | 
			
		||||
  Cz_M = 1*ones(6,1); % [N/(m/s)]
 | 
			
		||||
  Ka_F = 60e6*ones(6,1); % [N/m]
 | 
			
		||||
  Ka_M = 60e6*ones(6,1); % [N/m]
 | 
			
		||||
  Ca_F = 1*ones(6,1); % [N/(m/s)]
 | 
			
		||||
  Ca_M = 1*ones(6,1); % [N/(m/s)]
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
*** Initialization
 | 
			
		||||
@@ -591,10 +591,10 @@ The obtained dynamics are shown in Figure [[fig:flex_joint_trans_dvf]].
 | 
			
		||||
  initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
 | 
			
		||||
                        'type_F', 'universal_3dof', ...
 | 
			
		||||
                        'type_M', 'spherical_3dof', ...
 | 
			
		||||
                        'Kz_F', Kz_F, ...
 | 
			
		||||
                        'Kz_M', Kz_M, ...
 | 
			
		||||
                        'Cz_F', Cz_F, ...
 | 
			
		||||
                        'Cz_M', Cz_M);
 | 
			
		||||
                        'Ka_F', Ka_F, ...
 | 
			
		||||
                        'Ka_M', Ka_M, ...
 | 
			
		||||
                        'Ca_F', Ca_F, ...
 | 
			
		||||
                        'Ca_M', Ca_M);
 | 
			
		||||
 | 
			
		||||
  G_dvf_3dof = linearize(mdl, io);
 | 
			
		||||
  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, ...
 | 
			
		||||
                        'type_F', 'universal_3dof', ...
 | 
			
		||||
                        'type_M', 'spherical_3dof', ...
 | 
			
		||||
                        'Kz_F', Kz_F, ...
 | 
			
		||||
                        'Kz_M', Kz_M, ...
 | 
			
		||||
                        'Cz_F', Cz_F, ...
 | 
			
		||||
                        'Cz_M', Cz_M);
 | 
			
		||||
                        'Ka_F', Ka_F, ...
 | 
			
		||||
                        'Ka_M', Ka_M, ...
 | 
			
		||||
                        'Ca_F', Ca_F, ...
 | 
			
		||||
                        'Ca_M', Ca_M);
 | 
			
		||||
 | 
			
		||||
  G = linearize(mdl, io);
 | 
			
		||||
  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:
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  Kzs = [1e4, 1e5, 1e6, 1e7, 1e8, 1e9]; % [N/m]
 | 
			
		||||
  Kas = [1e4, 1e5, 1e6, 1e7, 1e8, 1e9]; % [N/m]
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
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, '/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, ...
 | 
			
		||||
                            'type_F', 'universal_3dof', ...
 | 
			
		||||
                            'type_M', 'spherical_3dof', ...
 | 
			
		||||
                            'Kz_F', Kzs(i), ...
 | 
			
		||||
                            'Kz_M', Kzs(i), ...
 | 
			
		||||
                            'Cz_F', 0.05*sqrt(Kzs(i)*10), ...
 | 
			
		||||
                            'Cz_M', 0.05*sqrt(Kzs(i)*10));
 | 
			
		||||
                            'Ka_F', Kas(i), ...
 | 
			
		||||
                            'Ka_M', Kas(i), ...
 | 
			
		||||
                            'Ca_F', 0.05*sqrt(Kas(i)*10), ...
 | 
			
		||||
                            'Ca_M', 0.05*sqrt(Kas(i)*10));
 | 
			
		||||
 | 
			
		||||
      G = linearize(mdl, io);
 | 
			
		||||
      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);
 | 
			
		||||
  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'))));
 | 
			
		||||
  end
 | 
			
		||||
  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);
 | 
			
		||||
  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')))), ...
 | 
			
		||||
           'DisplayName', sprintf('$k = %.0g$ [N/m]', Kzs(i)));
 | 
			
		||||
           'DisplayName', sprintf('$k = %.0g$ [N/m]', Kas(i)));
 | 
			
		||||
  end
 | 
			
		||||
  plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz')))), 'k--', ...
 | 
			
		||||
       '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);
 | 
			
		||||
 | 
			
		||||
  hold on;
 | 
			
		||||
  for i = 1:length(Kzs)
 | 
			
		||||
  for i = 1:length(Kas)
 | 
			
		||||
      set(gca,'ColorOrderIndex',i);
 | 
			
		||||
      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);
 | 
			
		||||
      plot(real(tzero(G_dvf_3dof_s{i})),  imag(tzero(G_dvf_3dof_s{i})), 'o', ...
 | 
			
		||||
           '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');
 | 
			
		||||
 | 
			
		||||
  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, ...
 | 
			
		||||
                            'type_F', 'universal_3dof', ...
 | 
			
		||||
                            'type_M', 'spherical_3dof', ...
 | 
			
		||||
                            'Kz_F', Kzs(i), ...
 | 
			
		||||
                            'Kz_M', Kzs(i), ...
 | 
			
		||||
                            'Cz_F', 0.05*sqrt(Kzs(i)*10), ...
 | 
			
		||||
                            'Cz_M', 0.05*sqrt(Kzs(i)*10));
 | 
			
		||||
                            'Ka_F', Kas(i), ...
 | 
			
		||||
                            'Ka_M', Kas(i), ...
 | 
			
		||||
                            'Ca_F', 0.05*sqrt(Kas(i)*10), ...
 | 
			
		||||
                            'Ca_M', 0.05*sqrt(Kas(i)*10));
 | 
			
		||||
 | 
			
		||||
      G = linearize(mdl, io);
 | 
			
		||||
      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);
 | 
			
		||||
  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'))));
 | 
			
		||||
  end
 | 
			
		||||
  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);
 | 
			
		||||
  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')))), ...
 | 
			
		||||
         'DisplayName', sprintf('$k = %.0g$ [N/m]', Kzs(i)));
 | 
			
		||||
         'DisplayName', sprintf('$k = %.0g$ [N/m]', Kas(i)));
 | 
			
		||||
  end
 | 
			
		||||
  hold off;
 | 
			
		||||
  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.
 | 
			
		||||
#+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.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.sample_pos (1,1) double {mustBeNumeric} = 0.8 % Height of the measurment point [m]
 | 
			
		||||
  end
 | 
			
		||||
#+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.
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  granite.sample_pos = 0.8; % [m]
 | 
			
		||||
  granite.sample_pos = args.sample_pos; % [m]
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
** Stiffness and Damping properties
 | 
			
		||||
@@ -1169,7 +1170,7 @@ We define the geometrical values.
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  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]
 | 
			
		||||
 | 
			
		||||
@@ -1178,11 +1179,11 @@ We define the geometrical values.
 | 
			
		||||
  % point of interest offset in z (above the top surfave) [m]
 | 
			
		||||
  switch args.type
 | 
			
		||||
    case 'none'
 | 
			
		||||
      mirror.jacobian = 0.20;
 | 
			
		||||
      mirror.jacobian = 0.205;
 | 
			
		||||
    case 'rigid'
 | 
			
		||||
      mirror.jacobian = 0.20 - mirror.h;
 | 
			
		||||
      mirror.jacobian = 0.205 - mirror.h;
 | 
			
		||||
    case 'flexible'
 | 
			
		||||
      mirror.jacobian = 0.20 - mirror.h;
 | 
			
		||||
      mirror.jacobian = 0.205 - mirror.h;
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  mirror.rad = 0.180; % radius of the mirror (at the bottom surface) [m]
 | 
			
		||||
@@ -1269,8 +1270,8 @@ The =mirror= structure is saved.
 | 
			
		||||
  arguments
 | 
			
		||||
      args.type      char   {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible'
 | 
			
		||||
      % initializeFramesPositions
 | 
			
		||||
      args.H    (1,1) double {mustBeNumeric, mustBePositive} = 90e-3
 | 
			
		||||
      args.MO_B (1,1) double {mustBeNumeric} = 175e-3
 | 
			
		||||
      args.H    (1,1) double {mustBeNumeric, mustBePositive} = 95e-3
 | 
			
		||||
      args.MO_B (1,1) double {mustBeNumeric} = 170e-3
 | 
			
		||||
      % generateGeneralConfiguration
 | 
			
		||||
      args.FH  (1,1) double {mustBeNumeric, mustBePositive} = 15e-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.ka  (1,1) double {mustBeNumeric} = 60e6
 | 
			
		||||
      args.c1  (1,1) double {mustBeNumeric} = 10
 | 
			
		||||
      args.ce  (1,1) double {mustBeNumeric} = 10
 | 
			
		||||
      args.ca  (1,1) double {mustBeNumeric} = 10
 | 
			
		||||
      args.F_gain  (1,1) double {mustBeNumeric} = 1
 | 
			
		||||
      args.k   (1,1) double {mustBeNumeric} = -1
 | 
			
		||||
      args.c   (1,1) double {mustBeNumeric} = -1
 | 
			
		||||
      % initializeJointDynamics
 | 
			
		||||
      args.type_F     char   {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal'
 | 
			
		||||
      args.type_M     char   {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'spherical_3dof'})} = 'spherical'
 | 
			
		||||
      args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
 | 
			
		||||
      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', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'spherical'
 | 
			
		||||
      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.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.Kz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*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.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*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.Kz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
 | 
			
		||||
      args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
 | 
			
		||||
      args.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*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
 | 
			
		||||
      args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
 | 
			
		||||
      args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
 | 
			
		||||
@@ -1355,9 +1359,8 @@ The =mirror= structure is saved.
 | 
			
		||||
                                        'k1', args.k1*ones(6,1), ...
 | 
			
		||||
                                        'c1', args.c1*ones(6,1), ...
 | 
			
		||||
                                        'ka', args.ka*ones(6,1), ...
 | 
			
		||||
                                        'ca', args.ca*ones(6,1), ...
 | 
			
		||||
                                        'ke', args.ke*ones(6,1), ...
 | 
			
		||||
                                        'ce', args.ce*ones(6,1));
 | 
			
		||||
                                        'F_gain', args.F_gain*ones(6,1));
 | 
			
		||||
  else
 | 
			
		||||
      error('args.actuator should be piezo, lorentz or amplified');
 | 
			
		||||
  end
 | 
			
		||||
@@ -1367,18 +1370,22 @@ The =mirror= structure is saved.
 | 
			
		||||
  stewart = initializeJointDynamics(stewart, ...
 | 
			
		||||
                                    'type_F', args.type_F, ...
 | 
			
		||||
                                    'type_M', args.type_M, ...
 | 
			
		||||
                                    'Kf_M'  , args.Kf_M, ...
 | 
			
		||||
                                    'Cf_M'  , args.Cf_M, ...
 | 
			
		||||
                                    'Kt_M'  , args.Kt_M, ...
 | 
			
		||||
                                    'Ct_M'  , args.Ct_M, ...
 | 
			
		||||
                                    'Kz_M'  , args.Kz_M, ...
 | 
			
		||||
                                    'Cz_M'  , args.Cz_M, ...
 | 
			
		||||
                                    'Kf_F'  , args.Kf_F, ...
 | 
			
		||||
                                    'Cf_F'  , args.Cf_F, ...
 | 
			
		||||
                                    'Kt_F'  , args.Kt_F, ...
 | 
			
		||||
                                    'Ct_F'  , args.Ct_F, ...
 | 
			
		||||
                                    'Kz_F'  , args.Kz_F, ...
 | 
			
		||||
                                    'Cz_F'  , args.Cz_F);
 | 
			
		||||
                                    'Kf_M', args.Kf_M, ...
 | 
			
		||||
                                    'Cf_M', args.Cf_M, ...
 | 
			
		||||
                                    'Kt_M', args.Kt_M, ...
 | 
			
		||||
                                    'Ct_M', args.Ct_M, ...
 | 
			
		||||
                                    'Kf_F', args.Kf_F, ...
 | 
			
		||||
                                    'Cf_F', args.Cf_F, ...
 | 
			
		||||
                                    'Kt_F', args.Kt_F, ...
 | 
			
		||||
                                    'Ct_F', args.Ct_F, ...
 | 
			
		||||
                                    'Ka_F', args.Ka_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
 | 
			
		||||
 | 
			
		||||
#+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}.
 | 
			
		||||
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}
 | 
			
		||||
    % Internal and external limit
 | 
			
		||||
    \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
 | 
			
		||||
- $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}
 | 
			
		||||
    \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.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1)
 | 
			
		||||
      args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1)
 | 
			
		||||
      args.k1 (6,1) double {mustBeNumeric} = 1e6
 | 
			
		||||
      args.ke (6,1) double {mustBeNumeric} = 5e6
 | 
			
		||||
      args.ka (6,1) double {mustBeNumeric} = 60e6
 | 
			
		||||
      args.c1 (6,1) double {mustBeNumeric} = 10
 | 
			
		||||
      args.ce (6,1) double {mustBeNumeric} = 10
 | 
			
		||||
      args.ca (6,1) double {mustBeNumeric} = 10
 | 
			
		||||
      args.me (6,1) double {mustBeNumeric} = 0.05
 | 
			
		||||
      args.ma (6,1) double {mustBeNumeric} = 0.05
 | 
			
		||||
      args.k1 (6,1) double {mustBeNumeric} = 1e6*ones(6,1)
 | 
			
		||||
      args.ke (6,1) double {mustBeNumeric} = 5e6*ones(6,1)
 | 
			
		||||
      args.ka (6,1) double {mustBeNumeric} = 60e6*ones(6,1)
 | 
			
		||||
      args.c1 (6,1) double {mustBeNumeric} = 10*ones(6,1)
 | 
			
		||||
      args.F_gain (6,1) double {mustBeNumeric} = 1*ones(6,1)
 | 
			
		||||
      args.me (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
 | 
			
		||||
      args.ma (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
 | 
			
		||||
  end
 | 
			
		||||
#+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.ka = args.ka;
 | 
			
		||||
  stewart.actuators.ca = args.ca;
 | 
			
		||||
 | 
			
		||||
  stewart.actuators.ke = args.ke;
 | 
			
		||||
  stewart.actuators.ce = args.ce;
 | 
			
		||||
 | 
			
		||||
  stewart.actuators.F_gain = args.F_gain;
 | 
			
		||||
 | 
			
		||||
  stewart.actuators.ma = args.ma;
 | 
			
		||||
  stewart.actuators.me = args.me;
 | 
			
		||||
#+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
 | 
			
		||||
:PROPERTIES:
 | 
			
		||||
: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]
 | 
			
		||||
  %        - 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)]
 | 
			
		||||
  %        - 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]
 | 
			
		||||
  %        - 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] - 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:
 | 
			
		||||
  %    - 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
 | 
			
		||||
  arguments
 | 
			
		||||
      stewart
 | 
			
		||||
      args.type_F     char   {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal'
 | 
			
		||||
      args.type_M     char   {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'spherical_3dof'})} = 'spherical'
 | 
			
		||||
      args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
 | 
			
		||||
      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', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'spherical'
 | 
			
		||||
      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.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.Kz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*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.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*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.Kz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
 | 
			
		||||
      args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
 | 
			
		||||
      args.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*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_src
 | 
			
		||||
 | 
			
		||||
@@ -1051,11 +930,15 @@ This Matlab function is accessible [[file:../src/initializeJointDynamics.m][here
 | 
			
		||||
    case 'spherical'
 | 
			
		||||
      stewart.joints_F.type = 2;
 | 
			
		||||
    case 'universal_p'
 | 
			
		||||
      stewart.joints_F.type = 1;
 | 
			
		||||
      stewart.joints_F.type = 3;
 | 
			
		||||
    case 'spherical_p'
 | 
			
		||||
      stewart.joints_F.type = 2;
 | 
			
		||||
    case 'universal_3dof'
 | 
			
		||||
      stewart.joints_F.type = 4;
 | 
			
		||||
    case 'flexible'
 | 
			
		||||
      stewart.joints_F.type = 5;
 | 
			
		||||
    case 'universal_3dof'
 | 
			
		||||
      stewart.joints_F.type = 6;
 | 
			
		||||
    case 'spherical_3dof'
 | 
			
		||||
      stewart.joints_F.type = 7;
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  switch args.type_M
 | 
			
		||||
@@ -1064,56 +947,38 @@ This Matlab function is accessible [[file:../src/initializeJointDynamics.m][here
 | 
			
		||||
    case 'spherical'
 | 
			
		||||
      stewart.joints_M.type = 2;
 | 
			
		||||
    case 'universal_p'
 | 
			
		||||
      stewart.joints_M.type = 1;
 | 
			
		||||
      stewart.joints_M.type = 3;
 | 
			
		||||
    case 'spherical_p'
 | 
			
		||||
      stewart.joints_M.type = 2;
 | 
			
		||||
    case 'spherical_3dof'
 | 
			
		||||
      stewart.joints_M.type = 4;
 | 
			
		||||
    case 'flexible'
 | 
			
		||||
      stewart.joints_M.type = 5;
 | 
			
		||||
    case 'universal_3dof'
 | 
			
		||||
      stewart.joints_M.type = 6;
 | 
			
		||||
    case 'spherical_3dof'
 | 
			
		||||
      stewart.joints_M.type = 7;
 | 
			
		||||
  end
 | 
			
		||||
#+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
 | 
			
		||||
:PROPERTIES:
 | 
			
		||||
:UNNUMBERED: t
 | 
			
		||||
:END:
 | 
			
		||||
Translation Stiffness
 | 
			
		||||
Axial and Radial (shear) Stiffness
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  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
 | 
			
		||||
  stewart.joints_M.Ka = args.Ka_M;
 | 
			
		||||
  stewart.joints_M.Kr = args.Kr_M;
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
  stewart.joints_F.Ka = args.Ka_F;
 | 
			
		||||
  stewart.joints_F.Kr = args.Kr_F;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
** Add Stiffness and Damping in Rotation of each strut
 | 
			
		||||
@@ -1122,21 +987,40 @@ Translation Stiffness
 | 
			
		||||
:END:
 | 
			
		||||
Rotational Stiffness
 | 
			
		||||
#+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.Cf = args.Cf_M;
 | 
			
		||||
  stewart.joints_M.Kf = args.Kf_M;
 | 
			
		||||
  stewart.joints_M.Kt = args.Kt_M;
 | 
			
		||||
 | 
			
		||||
      stewart.joints_M.Kt = args.Kt_M;
 | 
			
		||||
      stewart.joints_M.Ct = args.Ct_M;
 | 
			
		||||
  end
 | 
			
		||||
  stewart.joints_F.Kf = args.Kf_F;
 | 
			
		||||
  stewart.joints_F.Kt = args.Kt_F;
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
  if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p')
 | 
			
		||||
      stewart.joints_F.Kf = args.Kf_F;
 | 
			
		||||
      stewart.joints_F.Cf = args.Cf_F;
 | 
			
		||||
Rotational Damping
 | 
			
		||||
#+begin_src matlab
 | 
			
		||||
  stewart.joints_M.Cf = args.Cf_M;
 | 
			
		||||
  stewart.joints_M.Ct = args.Ct_M;
 | 
			
		||||
 | 
			
		||||
      stewart.joints_F.Kt = args.Kt_F;
 | 
			
		||||
      stewart.joints_F.Ct = args.Ct_F;
 | 
			
		||||
  end
 | 
			
		||||
  stewart.joints_F.Cf = args.Cf_F;
 | 
			
		||||
  stewart.joints_F.Ct = args.Ct_F;
 | 
			
		||||
#+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
 | 
			
		||||
 | 
			
		||||
* =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')
 | 
			
		||||
  case 2
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
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')
 | 
			
		||||
  case 2
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
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.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.sample_pos (1,1) double {mustBeNumeric} = 0.8 % Height of the measurment point [m]
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
granite = struct();
 | 
			
		||||
@@ -29,7 +30,7 @@ end
 | 
			
		||||
granite.density = args.density; % [kg/m3]
 | 
			
		||||
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.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]
 | 
			
		||||
%        - 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)]
 | 
			
		||||
%        - 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]
 | 
			
		||||
%        - 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] - 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:
 | 
			
		||||
%    - stewart - updated Stewart structure with the added fields:
 | 
			
		||||
@@ -33,20 +29,34 @@ function [stewart] = initializeJointDynamics(stewart, args)
 | 
			
		||||
 | 
			
		||||
arguments
 | 
			
		||||
    stewart
 | 
			
		||||
    args.type_F     char   {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal'
 | 
			
		||||
    args.type_M     char   {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'spherical_3dof'})} = 'spherical'
 | 
			
		||||
    args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
 | 
			
		||||
    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', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'spherical'
 | 
			
		||||
    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.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.Kz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*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.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*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.Kz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
 | 
			
		||||
    args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
 | 
			
		||||
    args.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*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
 | 
			
		||||
 | 
			
		||||
switch args.type_F
 | 
			
		||||
@@ -55,11 +65,15 @@ switch args.type_F
 | 
			
		||||
  case 'spherical'
 | 
			
		||||
    stewart.joints_F.type = 2;
 | 
			
		||||
  case 'universal_p'
 | 
			
		||||
    stewart.joints_F.type = 1;
 | 
			
		||||
    stewart.joints_F.type = 3;
 | 
			
		||||
  case 'spherical_p'
 | 
			
		||||
    stewart.joints_F.type = 2;
 | 
			
		||||
  case 'universal_3dof'
 | 
			
		||||
    stewart.joints_F.type = 4;
 | 
			
		||||
  case 'flexible'
 | 
			
		||||
    stewart.joints_F.type = 5;
 | 
			
		||||
  case 'universal_3dof'
 | 
			
		||||
    stewart.joints_F.type = 6;
 | 
			
		||||
  case 'spherical_3dof'
 | 
			
		||||
    stewart.joints_F.type = 7;
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
switch args.type_M
 | 
			
		||||
@@ -68,59 +82,50 @@ switch args.type_M
 | 
			
		||||
  case 'spherical'
 | 
			
		||||
    stewart.joints_M.type = 2;
 | 
			
		||||
  case 'universal_p'
 | 
			
		||||
    stewart.joints_M.type = 1;
 | 
			
		||||
    stewart.joints_M.type = 3;
 | 
			
		||||
  case 'spherical_p'
 | 
			
		||||
    stewart.joints_M.type = 2;
 | 
			
		||||
  case 'spherical_3dof'
 | 
			
		||||
    stewart.joints_M.type = 4;
 | 
			
		||||
  case 'flexible'
 | 
			
		||||
    stewart.joints_M.type = 5;
 | 
			
		||||
  case 'universal_3dof'
 | 
			
		||||
    stewart.joints_M.type = 6;
 | 
			
		||||
  case 'spherical_3dof'
 | 
			
		||||
    stewart.joints_M.type = 7;
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
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.Ka = args.Ka_M;
 | 
			
		||||
stewart.joints_M.Kr = args.Kr_M;
 | 
			
		||||
 | 
			
		||||
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_F.Ka = args.Ka_F;
 | 
			
		||||
stewart.joints_F.Kr = args.Kr_F;
 | 
			
		||||
 | 
			
		||||
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.Ca = args.Ca_M;
 | 
			
		||||
stewart.joints_M.Cr = args.Cr_M;
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
stewart.joints_F.Ca = args.Ca_F;
 | 
			
		||||
stewart.joints_F.Cr = args.Cr_F;
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
stewart.joints_M.Kf = args.Kf_M;
 | 
			
		||||
stewart.joints_M.Kt = args.Kt_M;
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
stewart.joints_F.Kf = args.Kf_F;
 | 
			
		||||
stewart.joints_F.Kt = args.Kt_F;
 | 
			
		||||
 | 
			
		||||
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p')
 | 
			
		||||
    stewart.joints_M.Kf = args.Kf_M;
 | 
			
		||||
    stewart.joints_M.Cf = args.Cf_M;
 | 
			
		||||
stewart.joints_M.Cf = args.Cf_M;
 | 
			
		||||
stewart.joints_M.Ct = args.Ct_M;
 | 
			
		||||
 | 
			
		||||
    stewart.joints_M.Kt = args.Kt_M;
 | 
			
		||||
    stewart.joints_M.Ct = args.Ct_M;
 | 
			
		||||
end
 | 
			
		||||
stewart.joints_F.Cf = args.Cf_F;
 | 
			
		||||
stewart.joints_F.Ct = args.Ct_F;
 | 
			
		||||
 | 
			
		||||
if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p')
 | 
			
		||||
    stewart.joints_F.Kf = args.Kf_F;
 | 
			
		||||
    stewart.joints_F.Cf = args.Cf_F;
 | 
			
		||||
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_F.Kt = args.Kt_F;
 | 
			
		||||
    stewart.joints_F.Ct = args.Ct_F;
 | 
			
		||||
end
 | 
			
		||||
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.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]
 | 
			
		||||
 | 
			
		||||
@@ -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]
 | 
			
		||||
switch args.type
 | 
			
		||||
  case 'none'
 | 
			
		||||
    mirror.jacobian = 0.20;
 | 
			
		||||
    mirror.jacobian = 0.205;
 | 
			
		||||
  case 'rigid'
 | 
			
		||||
    mirror.jacobian = 0.20 - mirror.h;
 | 
			
		||||
    mirror.jacobian = 0.205 - mirror.h;
 | 
			
		||||
  case 'flexible'
 | 
			
		||||
    mirror.jacobian = 0.20 - mirror.h;
 | 
			
		||||
    mirror.jacobian = 0.205 - mirror.h;
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
mirror.rad = 0.180; % radius of the mirror (at the bottom surface) [m]
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,8 @@ function [nano_hexapod] = initializeNanoHexapod(args)
 | 
			
		||||
arguments
 | 
			
		||||
    args.type      char   {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible'
 | 
			
		||||
    % initializeFramesPositions
 | 
			
		||||
    args.H    (1,1) double {mustBeNumeric, mustBePositive} = 90e-3
 | 
			
		||||
    args.MO_B (1,1) double {mustBeNumeric} = 175e-3
 | 
			
		||||
    args.H    (1,1) double {mustBeNumeric, mustBePositive} = 95e-3
 | 
			
		||||
    args.MO_B (1,1) double {mustBeNumeric} = 170e-3
 | 
			
		||||
    % generateGeneralConfiguration
 | 
			
		||||
    args.FH  (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
 | 
			
		||||
    args.FR  (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
 | 
			
		||||
@@ -18,25 +18,28 @@ arguments
 | 
			
		||||
    args.ke  (1,1) double {mustBeNumeric} = 5e6
 | 
			
		||||
    args.ka  (1,1) double {mustBeNumeric} = 60e6
 | 
			
		||||
    args.c1  (1,1) double {mustBeNumeric} = 10
 | 
			
		||||
    args.ce  (1,1) double {mustBeNumeric} = 10
 | 
			
		||||
    args.ca  (1,1) double {mustBeNumeric} = 10
 | 
			
		||||
    args.F_gain  (1,1) double {mustBeNumeric} = 1
 | 
			
		||||
    args.k   (1,1) double {mustBeNumeric} = -1
 | 
			
		||||
    args.c   (1,1) double {mustBeNumeric} = -1
 | 
			
		||||
    % initializeJointDynamics
 | 
			
		||||
    args.type_F     char   {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal'
 | 
			
		||||
    args.type_M     char   {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'spherical_3dof'})} = 'spherical'
 | 
			
		||||
    args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
 | 
			
		||||
    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', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'spherical'
 | 
			
		||||
    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.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.Kz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*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.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*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.Kz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
 | 
			
		||||
    args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
 | 
			
		||||
    args.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*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
 | 
			
		||||
    args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
 | 
			
		||||
    args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
 | 
			
		||||
@@ -81,9 +84,8 @@ elseif strcmp(args.actuator, 'amplified')
 | 
			
		||||
                                      'k1', args.k1*ones(6,1), ...
 | 
			
		||||
                                      'c1', args.c1*ones(6,1), ...
 | 
			
		||||
                                      'ka', args.ka*ones(6,1), ...
 | 
			
		||||
                                      'ca', args.ca*ones(6,1), ...
 | 
			
		||||
                                      'ke', args.ke*ones(6,1), ...
 | 
			
		||||
                                      'ce', args.ce*ones(6,1));
 | 
			
		||||
                                      'F_gain', args.F_gain*ones(6,1));
 | 
			
		||||
else
 | 
			
		||||
    error('args.actuator should be piezo, lorentz or amplified');
 | 
			
		||||
end
 | 
			
		||||
@@ -91,18 +93,22 @@ end
 | 
			
		||||
stewart = initializeJointDynamics(stewart, ...
 | 
			
		||||
                                  'type_F', args.type_F, ...
 | 
			
		||||
                                  'type_M', args.type_M, ...
 | 
			
		||||
                                  'Kf_M'  , args.Kf_M, ...
 | 
			
		||||
                                  'Cf_M'  , args.Cf_M, ...
 | 
			
		||||
                                  'Kt_M'  , args.Kt_M, ...
 | 
			
		||||
                                  'Ct_M'  , args.Ct_M, ...
 | 
			
		||||
                                  'Kz_M'  , args.Kz_M, ...
 | 
			
		||||
                                  'Cz_M'  , args.Cz_M, ...
 | 
			
		||||
                                  'Kf_F'  , args.Kf_F, ...
 | 
			
		||||
                                  'Cf_F'  , args.Cf_F, ...
 | 
			
		||||
                                  'Kt_F'  , args.Kt_F, ...
 | 
			
		||||
                                  'Ct_F'  , args.Ct_F, ...
 | 
			
		||||
                                  'Kz_F'  , args.Kz_F, ...
 | 
			
		||||
                                  'Cz_F'  , args.Cz_F);
 | 
			
		||||
                                  'Kf_M', args.Kf_M, ...
 | 
			
		||||
                                  'Cf_M', args.Cf_M, ...
 | 
			
		||||
                                  'Kt_M', args.Kt_M, ...
 | 
			
		||||
                                  'Ct_M', args.Ct_M, ...
 | 
			
		||||
                                  'Kf_F', args.Kf_F, ...
 | 
			
		||||
                                  'Cf_F', args.Cf_F, ...
 | 
			
		||||
                                  'Kt_F', args.Kt_F, ...
 | 
			
		||||
                                  'Ct_F', args.Ct_F, ...
 | 
			
		||||
                                  'Ka_F', args.Ka_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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,14 +19,13 @@ arguments
 | 
			
		||||
    args.type char {mustBeMember(args.type,{'classical', 'amplified'})} = 'classical'
 | 
			
		||||
    args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1)
 | 
			
		||||
    args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1)
 | 
			
		||||
    args.k1 (6,1) double {mustBeNumeric} = 1e6
 | 
			
		||||
    args.ke (6,1) double {mustBeNumeric} = 5e6
 | 
			
		||||
    args.ka (6,1) double {mustBeNumeric} = 60e6
 | 
			
		||||
    args.c1 (6,1) double {mustBeNumeric} = 10
 | 
			
		||||
    args.ce (6,1) double {mustBeNumeric} = 10
 | 
			
		||||
    args.ca (6,1) double {mustBeNumeric} = 10
 | 
			
		||||
    args.me (6,1) double {mustBeNumeric} = 0.05
 | 
			
		||||
    args.ma (6,1) double {mustBeNumeric} = 0.05
 | 
			
		||||
    args.k1 (6,1) double {mustBeNumeric} = 1e6*ones(6,1)
 | 
			
		||||
    args.ke (6,1) double {mustBeNumeric} = 5e6*ones(6,1)
 | 
			
		||||
    args.ka (6,1) double {mustBeNumeric} = 60e6*ones(6,1)
 | 
			
		||||
    args.c1 (6,1) double {mustBeNumeric} = 10*ones(6,1)
 | 
			
		||||
    args.F_gain (6,1) double {mustBeNumeric} = 1*ones(6,1)
 | 
			
		||||
    args.me (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
 | 
			
		||||
    args.ma (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
if strcmp(args.type, 'classical')
 | 
			
		||||
@@ -42,10 +41,9 @@ stewart.actuators.k1 = args.k1;
 | 
			
		||||
stewart.actuators.c1 = args.c1;
 | 
			
		||||
 | 
			
		||||
stewart.actuators.ka = args.ka;
 | 
			
		||||
stewart.actuators.ca = args.ca;
 | 
			
		||||
 | 
			
		||||
stewart.actuators.ke = args.ke;
 | 
			
		||||
stewart.actuators.ce = args.ce;
 | 
			
		||||
 | 
			
		||||
stewart.actuators.F_gain = args.F_gain;
 | 
			
		||||
 | 
			
		||||
stewart.actuators.ma = args.ma;
 | 
			
		||||
stewart.actuators.me = args.me;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user