620 lines
21 KiB
Org Mode
620 lines
21 KiB
Org Mode
#+TITLE: Cubic configuration for the Stewart Platform
|
|
:DRAWER:
|
|
#+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>
|
|
|
|
#+PROPERTY: header-args:matlab :session *MATLAB*
|
|
#+PROPERTY: header-args:matlab+ :tangle matlab/cubic_configuration.m
|
|
#+PROPERTY: header-args:matlab+ :comments org
|
|
#+PROPERTY: header-args:matlab+ :exports both
|
|
#+PROPERTY: header-args:matlab+ :results none
|
|
#+PROPERTY: header-args:matlab+ :eval no-export
|
|
#+PROPERTY: header-args:matlab+ :noweb yes
|
|
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
|
#+PROPERTY: header-args:matlab+ :output-dir figs
|
|
:END:
|
|
|
|
* Introduction :ignore:
|
|
The discovery of the Cubic configuration is done in citenum:geng94_six_degree_of_freed_activ.
|
|
Further analysis is conducted in cite:jafari03_orthog_gough_stewar_platf_microm.
|
|
|
|
People using orthogonal/cubic configuration: cite:preumont07_six_axis_singl_stage_activ.
|
|
|
|
|
|
The specificity of the Cubic configuration is that each actuator is orthogonal with the others.
|
|
|
|
To generate and study the Cubic configuration, =initializeCubicConfiguration= is used (description in section [[sec:initializeCubicConfiguration]]).
|
|
|
|
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).
|
|
|
|
* 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 :results none :exports none
|
|
simulinkproject('./');
|
|
#+end_src
|
|
|
|
* 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?
|
|
|
|
* TODO Configuration Analysis - Stiffness Matrix
|
|
** 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
|
|
K = stewart.Jf'*stewart.Jf;
|
|
#+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
|
|
K = stewart.Jf'*stewart.Jf;
|
|
#+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
|
|
K = stewart.Jf'*stewart.Jf;
|
|
#+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
|
|
K = stewart.Jf'*stewart.Jf;
|
|
#+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
|
|
|
|
* TODO Cubic size analysis
|
|
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
|
|
|
|
* 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>>
|
|
|
|
** 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
|
|
|
|
* TODO Tests
|
|
** 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:
|
|
bibliographystyle:unsrt
|
|
bibliography:ref.bib
|