2019-03-25 18:12:43 +01:00
#+TITLE : Cubic configuration for the Stewart Platform
:DRAWER:
2019-08-26 11:58:44 +02:00
#+HTML_LINK_HOME : ./index.html
#+HTML_LINK_UP : ./index.html
#+HTML_HEAD : <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
#+HTML_HEAD : <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
#+HTML_HEAD : <script src="./js/jquery.min.js"></script>
#+HTML_HEAD : <script src="./js/bootstrap.min.js"></script>
#+HTML_HEAD : <script src="./js/jquery.stickytableheaders.min.js"></script>
#+HTML_HEAD : <script src="./js/readtheorg.js"></script>
2019-03-25 18:12:43 +01:00
#+PROPERTY : header-args:matlab :session *MATLAB*
2019-08-26 11:58:44 +02:00
#+PROPERTY : header-args:matlab+ :tangle matlab/cubic_configuration.m
2019-03-25 18:12:43 +01:00
#+PROPERTY : header-args:matlab+ :comments org
#+PROPERTY : header-args:matlab+ :exports both
2019-08-26 11:58:44 +02:00
#+PROPERTY : header-args:matlab+ :results none
2019-03-25 18:12:43 +01:00
#+PROPERTY : header-args:matlab+ :eval no-export
2019-08-26 11:58:44 +02:00
#+PROPERTY : header-args:matlab+ :noweb yes
2019-03-25 18:12:43 +01:00
#+PROPERTY : header-args:matlab+ :mkdirp yes
2019-08-26 11:58:44 +02:00
#+PROPERTY : header-args:matlab+ :output-dir figs
2019-03-25 18:12:43 +01:00
:END:
2019-10-09 11:08:42 +02:00
* Introduction :ignore:
2020-02-06 17:25:38 +01:00
The discovery of the Cubic configuration is done in cite:geng94_six_degree_of_freed_activ.
Further analysis is conducted in
2019-03-26 09:25:04 +01:00
2019-03-25 18:12:43 +01:00
The specificity of the Cubic configuration is that each actuator is orthogonal with the others.
2020-02-06 17:25:38 +01:00
The cubic (or orthogonal) configuration of the Stewart platform is now widely used (cite:preumont07_six_axis_singl_stage_activ,jafari03_orthog_gough_stewar_platf_microm).
2019-03-25 18:12:43 +01:00
2019-10-09 11:08:42 +02:00
According to cite:preumont07_six_axis_singl_stage_activ, the cubic configuration provides a uniform stiffness in all directions and *minimizes the crosscoupling* from actuator to sensor of different legs (being orthogonal to each other).
2020-02-06 17:25:38 +01:00
To generate and study the Cubic configuration, =initializeCubicConfiguration= is used (description in section [[sec:initializeCubicConfiguration ]]).
* Matlab Init :noexport:ignore:
2019-10-09 11:08:42 +02:00
#+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 :results none :exports none
2020-01-22 15:32:32 +01:00
simulinkproject('./');
2019-10-09 11:08:42 +02:00
#+end_src
2019-03-25 18:12:43 +01:00
* Questions we wish to answer with this analysis
The goal is to study the benefits of using a cubic configuration:
- Equal stiffness in all the degrees of freedom?
- No coupling between the actuators?
- Is the center of the cube an important point?
2020-01-22 18:19:40 +01:00
* TODO Configuration Analysis - Stiffness Matrix
2019-03-25 18:12:43 +01:00
** Cubic Stewart platform centered with the cube center - Jacobian estimated at the cube center
We create a cubic Stewart platform (figure [[fig:3d-cubic-stewart-aligned ]]) in such a way that the center of the cube (black dot) is located at the center of the Stewart platform (blue dot).
The Jacobian matrix is estimated at the location of the center of the cube.
#+name : fig:3d-cubic-stewart-aligned
#+caption : Centered cubic configuration
[[file:./figs/3d-cubic-stewart-aligned.png ]]
#+begin_src matlab :results silent
opts = struct(...
'H_tot', 100, ... % Total height of the Hexapod [mm]
'L', 200/sqrt(3), ... % Size of the Cube [mm]
'H', 60, ... % Height between base joints and platform joints [mm]
'H0', 200/2-60/2 ... % Height between the corner of the cube and the plane containing the base joints [mm]
);
stewart = initializeCubicConfiguration(opts);
opts = struct(...
'Jd_pos', [0, 0, -50], ... % Position of the Jacobian for displacement estimation from the top of the mobile platform [mm]
'Jf_pos', [0, 0, -50] ... % Position of the Jacobian for force location from the top of the mobile platform [mm]
);
stewart = computeGeometricalProperties(stewart, opts);
save('./mat/stewart.mat', 'stewart');
#+end_src
#+begin_src matlab :results none :exports code
2019-03-26 09:25:04 +01:00
K = stewart.Jf'*stewart.Jf;
2019-03-25 18:12:43 +01:00
#+end_src
#+begin_src matlab :results value table :exports results
data = K;
data2orgtable(data, {}, {}, ' %.2g ');
#+end_src
#+RESULTS :
| 2 | 1.9e-18 | -2.3e-17 | 1.8e-18 | 5.5e-17 | -1.5e-17 |
| 1.9e-18 | 2 | 6.8e-18 | -6.1e-17 | -1.6e-18 | 4.8e-18 |
| -2.3e-17 | 6.8e-18 | 2 | -6.7e-18 | 4.9e-18 | 5.3e-19 |
| 1.8e-18 | -6.1e-17 | -6.7e-18 | 0.0067 | -2.3e-20 | -6.1e-20 |
| 5.5e-17 | -1.6e-18 | 4.9e-18 | -2.3e-20 | 0.0067 | 1e-18 |
| -1.5e-17 | 4.8e-18 | 5.3e-19 | -6.1e-20 | 1e-18 | 0.027 |
** Cubic Stewart platform centered with the cube center - Jacobian not estimated at the cube center
We create a cubic Stewart platform with center of the cube located at the center of the Stewart platform (figure [[fig:3d-cubic-stewart-aligned ]]).
The Jacobian matrix is not estimated at the location of the center of the cube.
#+begin_src matlab :results silent
opts = struct(...
'H_tot', 100, ... % Total height of the Hexapod [mm]
'L', 200/sqrt(3), ... % Size of the Cube [mm]
'H', 60, ... % Height between base joints and platform joints [mm]
'H0', 200/2-60/2 ... % Height between the corner of the cube and the plane containing the base joints [mm]
);
stewart = initializeCubicConfiguration(opts);
opts = struct(...
'Jd_pos', [0, 0, 0], ... % Position of the Jacobian for displacement estimation from the top of the mobile platform [mm]
'Jf_pos', [0, 0, 0] ... % Position of the Jacobian for force location from the top of the mobile platform [mm]
);
stewart = computeGeometricalProperties(stewart, opts);
#+end_src
#+begin_src matlab :results none :exports code
2019-03-26 09:25:04 +01:00
K = stewart.Jf'*stewart.Jf;
2019-03-25 18:12:43 +01:00
#+end_src
#+begin_src matlab :results value table :exports results
data = K;
data2orgtable(data', {}, {}, ' %.2g ');
#+end_src
#+RESULTS :
| 2 | 1.9e-18 | -2.3e-17 | 1.5e-18 | -0.1 | -1.5e-17 |
| 1.9e-18 | 2 | 6.8e-18 | 0.1 | -1.6e-18 | 4.8e-18 |
| -2.3e-17 | 6.8e-18 | 2 | -5.1e-19 | -5.5e-18 | 5.3e-19 |
| 1.5e-18 | 0.1 | -5.1e-19 | 0.012 | -3e-19 | 3.1e-19 |
| -0.1 | -1.6e-18 | -5.5e-18 | -3e-19 | 0.012 | 1.9e-18 |
| -1.5e-17 | 4.8e-18 | 5.3e-19 | 3.1e-19 | 1.9e-18 | 0.027 |
** Cubic Stewart platform not centered with the cube center - Jacobian estimated at the cube center
Here, the "center" of the Stewart platform is not at the cube center (figure [[fig:3d-cubic-stewart-misaligned ]]).
The Jacobian is estimated at the cube center.
#+name : fig:3d-cubic-stewart-misaligned
#+caption : Not centered cubic configuration
[[file:./figs/3d-cubic-stewart-misaligned.png ]]
The center of the cube is at $z = 110$.
The Stewart platform is from $z = H_0 = 75$ to $z = H_0 + H_{tot} = 175$.
The center height of the Stewart platform is then at $z = \frac{175-75}{2} = 50$.
The center of the cube from the top platform is at $z = 110 - 175 = -65$.
#+begin_src matlab :results silent
opts = struct(...
'H_tot', 100, ... % Total height of the Hexapod [mm]
'L', 220/sqrt(3), ... % Size of the Cube [mm]
'H', 60, ... % Height between base joints and platform joints [mm]
'H0', 75 ... % Height between the corner of the cube and the plane containing the base joints [mm]
);
stewart = initializeCubicConfiguration(opts);
opts = struct(...
'Jd_pos', [0, 0, -65], ... % Position of the Jacobian for displacement estimation from the top of the mobile platform [mm]
'Jf_pos', [0, 0, -65] ... % Position of the Jacobian for force location from the top of the mobile platform [mm]
);
stewart = computeGeometricalProperties(stewart, opts);
#+end_src
#+begin_src matlab :results none :exports code
2019-03-26 09:25:04 +01:00
K = stewart.Jf'*stewart.Jf;
2019-03-25 18:12:43 +01:00
#+end_src
#+begin_src matlab :results value table :exports results
data = K;
data2orgtable(data', {}, {}, ' %.2g ');
#+end_src
#+RESULTS :
| 2 | -1.8e-17 | 2.6e-17 | 3.3e-18 | 0.04 | 1.7e-19 |
| -1.8e-17 | 2 | 1.9e-16 | -0.04 | 2.2e-19 | -5.3e-19 |
| 2.6e-17 | 1.9e-16 | 2 | -8.9e-18 | 6.5e-19 | -5.8e-19 |
| 3.3e-18 | -0.04 | -8.9e-18 | 0.0089 | -9.3e-20 | 9.8e-20 |
| 0.04 | 2.2e-19 | 6.5e-19 | -9.3e-20 | 0.0089 | -2.4e-18 |
| 1.7e-19 | -5.3e-19 | -5.8e-19 | 9.8e-20 | -2.4e-18 | 0.032 |
We obtain $k_x = k_y = k_z$ and $k_ {\theta_x} = k_ {\theta_y}$, but the Stiffness matrix is not diagonal.
** Cubic Stewart platform not centered with the cube center - Jacobian estimated at the Stewart platform center
Here, the "center" of the Stewart platform is not at the cube center.
The Jacobian is estimated at the center of the Stewart platform.
The center of the cube is at $z = 110$.
The Stewart platform is from $z = H_0 = 75$ to $z = H_0 + H_{tot} = 175$.
The center height of the Stewart platform is then at $z = \frac{175-75}{2} = 50$.
The center of the cube from the top platform is at $z = 110 - 175 = -65$.
#+begin_src matlab :results silent
opts = struct(...
'H_tot', 100, ... % Total height of the Hexapod [mm]
'L', 220/sqrt(3), ... % Size of the Cube [mm]
'H', 60, ... % Height between base joints and platform joints [mm]
'H0', 75 ... % Height between the corner of the cube and the plane containing the base joints [mm]
);
stewart = initializeCubicConfiguration(opts);
opts = struct(...
'Jd_pos', [0, 0, -60], ... % Position of the Jacobian for displacement estimation from the top of the mobile platform [mm]
'Jf_pos', [0, 0, -60] ... % Position of the Jacobian for force location from the top of the mobile platform [mm]
);
stewart = computeGeometricalProperties(stewart, opts);
#+end_src
#+begin_src matlab :results none :exports code
2019-03-26 09:25:04 +01:00
K = stewart.Jf'*stewart.Jf;
2019-03-25 18:12:43 +01:00
#+end_src
#+begin_src matlab :results value table :exports results
data = K;
data2orgtable(data', {}, {}, ' %.2g ');
#+end_src
#+RESULTS :
| 2 | -1.8e-17 | 2.6e-17 | -5.7e-19 | 0.03 | 1.7e-19 |
| -1.8e-17 | 2 | 1.9e-16 | -0.03 | 2.2e-19 | -5.3e-19 |
| 2.6e-17 | 1.9e-16 | 2 | -1.5e-17 | 6.5e-19 | -5.8e-19 |
| -5.7e-19 | -0.03 | -1.5e-17 | 0.0085 | 4.9e-20 | 1.7e-19 |
| 0.03 | 2.2e-19 | 6.5e-19 | 4.9e-20 | 0.0085 | -1.1e-18 |
| 1.7e-19 | -5.3e-19 | -5.8e-19 | 1.7e-19 | -1.1e-18 | 0.032 |
We obtain $k_x = k_y = k_z$ and $k_ {\theta_x} = k_ {\theta_y}$, but the Stiffness matrix is not diagonal.
** Conclusion
#+begin_important
- The cubic configuration permits to have $k_x = k_y = k_z$ and $k_ {\theta\x} = k_{\theta_y}$
- The stiffness matrix $K$ is diagonal for the cubic configuration if the Stewart platform and the cube are centered *and* the Jacobian is estimated at the cube center
#+end_important
2020-01-22 18:19:40 +01:00
* TODO Cubic size analysis
2019-03-25 18:12:43 +01:00
We here study the effect of the size of the cube used for the Stewart configuration.
We fix the height of the Stewart platform, the center of the cube is at the center of the Stewart platform.
We only vary the size of the cube.
#+begin_src matlab :results silent
H_cubes = 250:20:350;
stewarts = {zeros(length(H_cubes), 1)};
#+end_src
#+begin_src matlab :results silent
for i = 1:length(H_cubes)
H_cube = H_cubes(i);
H_tot = 100;
H = 80;
opts = struct(...
'H_tot', H_tot, ... % Total height of the Hexapod [mm]
'L', H_cube/sqrt(3), ... % Size of the Cube [mm]
'H', H, ... % Height between base joints and platform joints [mm]
'H0', H_cube/2-H/2 ... % Height between the corner of the cube and the plane containing the base joints [mm]
);
stewart = initializeCubicConfiguration(opts);
opts = struct(...
'Jd_pos', [0, 0, H_cube/2-opts.H0-opts.H_tot], ... % Position of the Jacobian for displacement estimation from the top of the mobile platform [mm]
'Jf_pos', [0, 0, H_cube/2-opts.H0-opts.H_tot] ... % Position of the Jacobian for force location from the top of the mobile platform [mm]
);
stewart = computeGeometricalProperties(stewart, opts);
stewarts(i) = {stewart};
end
#+end_src
The Stiffness matrix is computed for all generated Stewart platforms.
#+begin_src matlab :results none :exports code
Ks = zeros(6, 6, length(H_cube));
for i = 1:length(H_cubes)
Ks(:, :, i) = stewarts{i}.Jd'*stewarts{i}.Jd;
end
#+end_src
The only elements of $K$ that vary are $k_{\theta_x} = k_ {\theta_y}$ and $k_ {\theta_z}$.
Finally, we plot $k_{\theta_x} = k_ {\theta_y}$ and $k_ {\theta_z}$
#+begin_src matlab :results none :exports code
figure;
hold on;
plot(H_cubes, squeeze(Ks(4, 4, :)), 'DisplayName', '$k_ {\theta_x}$');
plot(H_cubes, squeeze(Ks(6, 6, :)), 'DisplayName', '$k_ {\theta_z}$');
hold off;
legend('location', 'northwest');
xlabel('Cube Size [mm]'); ylabel('Rotational stiffnes [normalized]');
#+end_src
#+NAME : fig:stiffness_cube_size
#+HEADER : :tangle no :exports results :results raw :noweb yes
#+begin_src matlab :var filepath="figs/stiffness_cube_size.pdf" :var figsize= "normal-normal" :post pdf2svg(file=*this*, ext= "png")
<<plt-matlab >>
#+end_src
#+NAME : fig:stiffness_cube_size
#+CAPTION : $k_{\theta_x} = k_{\theta_y}$ and $k_{\theta_z}$ function of the size of the cube
#+RESULTS : fig:stiffness_cube_size
[[file:figs/stiffness_cube_size.png ]]
We observe that $k_{\theta_x} = k_ {\theta_y}$ and $k_ {\theta_z}$ increase linearly with the cube size.
#+begin_important
In order to maximize the rotational stiffness of the Stewart platform, the size of the cube should be the highest possible.
In that case, the legs will the further separated. Size of the cube is then limited by allowed space.
#+end_important
2020-02-06 17:25:38 +01:00
* Functions
<<sec:functions >>
** =generateCubicConfiguration=: Generate a Cubic Configuration
:PROPERTIES:
:header-args:matlab+: :tangle src/generateCubicConfiguration.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:generateCubicConfiguration >>
This Matlab function is accessible [[file:src/generateCubicConfiguration.m ][here ]].
*** Function description
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
function [stewart] = generateCubicConfiguration(stewart, args)
% generateCubicConfiguration - Generate a Cubic Configuration
%
% Syntax: [stewart] = generateCubicConfiguration(stewart, args)
%
% Inputs:
% - stewart - A structure with the following fields
% - H [1x1] - Total height of the platform [m]
% - args - Can have the following fields:
% - Hc [1x1] - Height of the "useful" part of the cube [m]
% - FOc [1x1] - Height of the center of the cube with respect to {F} [m]
% - FHa [1x1] - Height of the plane joining the points ai with respect to the frame {F} [m]
% - MHb [1x1] - Height of the plane joining the points bi with respect to the frame {M} [m]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - Fa [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
% - Mb [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
#+end_src
*** Documentation
:PROPERTIES:
:UNNUMBERED: t
:END:
#+name : fig:cubic-configuration-definition
#+caption : Cubic Configuration
[[file:figs/cubic-configuration-definition.png ]]
*** Optional Parameters
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
arguments
stewart
args.Hc (1,1) double {mustBeNumeric, mustBePositive} = 60e-3
args.FOc (1,1) double {mustBeNumeric} = 50e-3
args.FHa (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
args.MHb (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
end
#+end_src
*** Position of the Cube
:PROPERTIES:
:UNNUMBERED: t
:END:
We define the useful points of the cube with respect to the Cube's center.
${}^{C}C$ are the 6 vertices of the cubes expressed in a frame {C} which is
located at the center of the cube and aligned with {F} and {M}.
#+begin_src matlab
sx = [ 2; -1; -1];
sy = [ 0; 1; -1];
sz = [ 1; 1; 1];
R = [sx, sy, sz]./vecnorm([sx, sy, sz]);
L = args.Hc*sqrt(3);
Cc = R'*[[0;0;L],[L;0;L],[L;0;0],[L;L;0],[0;L;0],[0;L;L]] - [0;0;1.5*args.Hc];
CCf = [Cc(:,1), Cc(:,3), Cc(:,3), Cc(:,5), Cc(:,5), Cc(:,1)]; % CCf(:,i) corresponds to the bottom cube's vertice corresponding to the i'th leg
CCm = [Cc(:,2), Cc(:,2), Cc(:,4), Cc(:,4), Cc(:,6), Cc(:,6)]; % CCm(:,i) corresponds to the top cube's vertice corresponding to the i'th leg
#+end_src
*** Compute the pose
:PROPERTIES:
:UNNUMBERED: t
:END:
We can compute the vector of each leg ${}^{C}\hat{\bm{s}}_{i}$ (unit vector from ${}^{C}C_ {f}$ to ${}^{C}C_{m}$).
#+begin_src matlab
CSi = (CCm - CCf)./vecnorm(CCm - CCf);
#+end_src
We now which to compute the position of the joints $a_{i}$ and $b_ {i}$.
#+begin_src matlab
stewart.Fa = CCf + [0; 0; args.FOc] + ((args.FHa-(args.FOc-args.Hc/2))./CSi(3,:)).*CSi;
stewart.Mb = CCf + [0; 0; args.FOc-stewart.H] + ((stewart.H-args.MHb-(args.FOc-args.Hc/2))./CSi(3,:)).*CSi;
#+end_src
2020-01-22 18:19:40 +01:00
* TODO initializeCubicConfiguration
:PROPERTIES:
:HEADER-ARGS:matlab+: :exports code
:HEADER-ARGS:matlab+: :comments no
:HEADER-ARGS:matlab+: :eval no
:HEADER-ARGS:matlab+: :tangle src/initializeCubicConfiguration.m
:END:
<<sec:initializeCubicConfiguration >>
2019-03-25 18:12:43 +01:00
** Function description
#+begin_src matlab
function [stewart] = initializeCubicConfiguration(opts_param)
#+end_src
** Optional Parameters
Default values for opts.
#+begin_src matlab
opts = struct(...
'H_tot', 90, ... % Total height of the Hexapod [mm]
'L', 110, ... % Size of the Cube [mm]
'H', 40, ... % Height between base joints and platform joints [mm]
'H0', 75 ... % Height between the corner of the cube and the plane containing the base joints [mm]
);
#+end_src
Populate opts with input parameters
#+begin_src matlab
if exist('opts_param','var')
for opt = fieldnames(opts_param)'
opts.(opt{1}) = opts_param.(opt{1});
end
end
#+end_src
** Cube Creation
#+begin_src matlab :results none
points = [0, 0, 0; ...
0, 0, 1; ...
0, 1, 0; ...
0, 1, 1; ...
1, 0, 0; ...
1, 0, 1; ...
1, 1, 0; ...
1, 1, 1];
points = opts.L*points;
#+end_src
We create the rotation matrix to rotate the cube
#+begin_src matlab :results none
sx = cross([1, 1, 1], [1 0 0]);
sx = sx/norm(sx);
sy = -cross(sx, [1, 1, 1]);
sy = sy/norm(sy);
sz = [1, 1, 1];
sz = sz/norm(sz);
R = [sx', sy', sz']';
#+end_src
We use to rotation matrix to rotate the cube
#+begin_src matlab :results none
cube = zeros(size(points));
for i = 1:size(points, 1)
cube(i, :) = R * points(i, :)';
end
#+end_src
** Vectors of each leg
#+begin_src matlab :results none
leg_indices = [3, 4; ...
2, 4; ...
2, 6; ...
5, 6; ...
5, 7; ...
3, 7];
#+end_src
Vectors are:
#+begin_src matlab :results none
legs = zeros(6, 3);
legs_start = zeros(6, 3);
for i = 1:6
legs(i, :) = cube(leg_indices(i, 2), :) - cube(leg_indices(i, 1), :);
legs_start(i, :) = cube(leg_indices(i, 1), :);
end
#+end_src
** Verification of Height of the Stewart Platform
If the Stewart platform is not contained in the cube, throw an error.
#+begin_src matlab :results none
Hmax = cube(4, 3) - cube(2, 3);
if opts.H0 < cube(2, 3)
error(sprintf('H0 is not high enought. Minimum H0 = %.1f', cube(2, 3)));
else if opts.H0 + opts.H > cube(4, 3)
error(sprintf('H0+H is too high. Maximum H0+H = %.1f', cube(4, 3)));
error('H0+H is too high');
end
#+end_src
** Determinate the location of the joints
We now determine the location of the joints on the fixed platform w.r.t the fixed frame $\{A\}$.
$\{A\}$ is fixed to the bottom of the base.
#+begin_src matlab :results none
Aa = zeros(6, 3);
for i = 1:6
t = (opts.H0-legs_start(i, 3))/(legs(i, 3));
Aa(i, :) = legs_start(i, :) + t*legs(i, :);
end
#+end_src
And the location of the joints on the mobile platform with respect to $\{A\}$.
#+begin_src matlab :results none
Ab = zeros(6, 3);
for i = 1:6
t = (opts.H0+opts.H-legs_start(i, 3))/(legs(i, 3));
Ab(i, :) = legs_start(i, :) + t*legs(i, :);
end
#+end_src
And the location of the joints on the mobile platform with respect to $\{B\}$.
#+begin_src matlab :results none
Bb = zeros(6, 3);
Bb = Ab - (opts.H0 + opts.H_tot/2 + opts.H/2)*[0, 0, 1];
#+end_src
#+begin_src matlab :results none
h = opts.H0 + opts.H/2 - opts.H_tot/2;
Aa = Aa - h*[0, 0, 1];
Ab = Ab - h*[0, 0, 1];
#+end_src
** Returns Stewart Structure
#+begin_src matlab :results none
stewart = struct();
stewart.Aa = Aa;
stewart.Ab = Ab;
stewart.Bb = Bb;
stewart.H_tot = opts.H_tot;
end
#+end_src
2020-01-22 18:19:40 +01:00
* TODO Tests
2019-03-25 18:12:43 +01:00
** First attempt to parametrisation
#+name : fig:stewart_bottom_plate
#+caption : Schematic of the bottom plates with all the parameters
[[file:./figs/stewart_bottom_plate.png ]]
The goal is to choose $\alpha$, $\beta$, $R_\text{leg, t}$ and $R_ \text{leg, b}$ in such a way that the configuration is cubic.
The configuration is cubic if:
\[ \overrightarrow{a_i b_i} \cdot \overrightarrow{a_j b_j} = 0, \ \forall i, j = [1, \hdots, 6], i \ne j \]
Lets express $a_i$, $b_i$ and $a_j$:
\begin{equation*}
a_1 = \begin{bmatrix}R_ {\text{leg,b}} \cos(120 - \alpha) \\ R_{\text{leg,b}} \cos(120 - \alpha) \\ 0\end{bmatrix} ; \quad
a_2 = \begin{bmatrix}R_ {\text{leg,b}} \cos(120 + \alpha) \\ R_{\text{leg,b}} \cos(120 + \alpha) \\ 0\end{bmatrix} ; \quad
\end{equation*}
\begin{equation*}
b_1 = \begin{bmatrix}R_ {\text{leg,t}} \cos(120 - \beta) \\ R_{\text{leg,t}} \cos(120 - \beta\\ H\end{bmatrix} ; \quad
b_2 = \begin{bmatrix}R_ {\text{leg,t}} \cos(120 + \beta) \\ R_{\text{leg,t}} \cos(120 + \beta\\ H\end{bmatrix} ; \quad
\end{equation*}
\[ \overrightarrow{a_1 b_1} = b_1 - a_1 = \begin{bmatrix}R_{\text{leg}} \cos(120 - \alpha) \\ R_ {\text{leg}} \cos(120 - \alpha) \\ 0\end{bmatrix}\]
** Second attempt
We start with the point of a cube in space:
\begin{align*}
[0, 0, 0] ; \ [0, 0, 1]; \ ...
\end{align*}
We also want the cube to point upward:
\[ [1, 1, 1] \Rightarrow [0, 0, 1] \]
Then we have the direction of all the vectors expressed in the frame of the hexapod.
#+begin_src matlab :results none
points = [0, 0, 0; ...
0, 0, 1; ...
0, 1, 0; ...
0, 1, 1; ...
1, 0, 0; ...
1, 0, 1; ...
1, 1, 0; ...
1, 1, 1];
#+end_src
#+begin_src matlab :results none
figure;
plot3(points(:,1), points(:,2), points(:,3), 'ko')
#+end_src
#+begin_src matlab :results none
sx = cross([1, 1, 1], [1 0 0]);
sx = sx/norm(sx);
sy = -cross(sx, [1, 1, 1]);
sy = sy/norm(sy);
sz = [1, 1, 1];
sz = sz/norm(sz);
R = [sx', sy', sz']';
#+end_src
#+begin_src matlab :results none
cube = zeros(size(points));
for i = 1:size(points, 1)
cube(i, :) = R * points(i, :)';
end
#+end_src
#+begin_src matlab :results none
figure;
hold on;
plot3(points(:,1), points(:,2), points(:,3), 'ko');
plot3(cube(:,1), cube(:,2), cube(:,3), 'ro');
hold off;
#+end_src
Now we plot the legs of the hexapod.
#+begin_src matlab :results none
leg_indices = [3, 4; ...
2, 4; ...
2, 6; ...
5, 6; ...
5, 7; ...
3, 7]
figure;
hold on;
for i = 1:6
plot3(cube(leg_indices(i, :),1), cube(leg_indices(i, :),2), cube(leg_indices(i, :),3), '-');
end
hold off;
#+end_src
Vectors are:
#+begin_src matlab :results none
legs = zeros(6, 3);
legs_start = zeros(6, 3);
for i = 1:6
legs(i, :) = cube(leg_indices(i, 2), :) - cube(leg_indices(i, 1), :);
legs_start(i, :) = cube(leg_indices(i, 1), :)
end
#+end_src
We now have the orientation of each leg.
We here want to see if the position of the "slice" changes something.
Let's first estimate the maximum height of the Stewart platform.
#+begin_src matlab :results none
Hmax = cube(4, 3) - cube(2, 3);
#+end_src
Let's then estimate the middle position of the platform
#+begin_src matlab :results none
Hmid = cube(8, 3)/2;
#+end_src
** Generate the Stewart platform for a Cubic configuration
First we defined the height of the Hexapod.
#+begin_src matlab :results none
H = Hmax/2;
#+end_src
#+begin_src matlab :results none
Zs = 1.2*cube(2, 3); % Height of the fixed platform
Ze = Zs + H; % Height of the mobile platform
#+end_src
We now determine the location of the joints on the fixed platform.
#+begin_src matlab :results none
Aa = zeros(6, 3);
for i = 1:6
t = (Zs-legs_start(i, 3))/(legs(i, 3));
Aa(i, :) = legs_start(i, :) + t*legs(i, :);
end
#+end_src
And the location of the joints on the mobile platform
#+begin_src matlab :results none
Ab = zeros(6, 3);
for i = 1:6
t = (Ze-legs_start(i, 3))/(legs(i, 3));
Ab(i, :) = legs_start(i, :) + t*legs(i, :);
end
#+end_src
And we plot the legs.
#+begin_src matlab :results none
figure;
hold on;
for i = 1:6
plot3([Ab(i, 1),Aa(i, 1)], [Ab(i, 2),Aa(i, 2)], [Ab(i, 3),Aa(i, 3)], 'k-');
end
hold off;
xlim([-1, 1]);
ylim([-1, 1]);
zlim([0, 2]);
#+end_src
* Bibliography :ignore:
2020-02-06 17:25:38 +01:00
bibliographystyle:unsrtnat
2019-12-20 08:55:55 +01:00
bibliography:ref.bib