#+TITLE: Cubic configuration for the Stewart Platform :DRAWER: #+STARTUP: overview #+LANGUAGE: en #+EMAIL: dehaeze.thomas@gmail.com #+AUTHOR: Dehaeze Thomas #+HTML_LINK_HOME: ./index.html #+HTML_LINK_UP: ./index.html #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+PROPERTY: header-args:matlab :session *MATLAB* #+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 #+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/thesis/latex/}{config.tex}") #+PROPERTY: header-args:latex+ :imagemagick t :fit yes #+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150 #+PROPERTY: header-args:latex+ :imoutoptions -quality 100 #+PROPERTY: header-args:latex+ :results file raw replace #+PROPERTY: header-args:latex+ :buffer no #+PROPERTY: header-args:latex+ :eval no-export #+PROPERTY: header-args:latex+ :exports results #+PROPERTY: header-args:latex+ :mkdirp yes #+PROPERTY: header-args:latex+ :output-dir figs #+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png") :END: * Introduction :ignore: The discovery of the Cubic configuration is done in cite:geng94_six_degree_of_freed_activ. The specificity of the Cubic configuration is that each actuator is orthogonal with the others: #+begin_quote the active struts are arranged in a mutually orthogonal configuration connecting the corners of a cube. #+end_quote 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). According to cite:preumont07_six_axis_singl_stage_activ: #+begin_quote This topology provides a uniform control capability and a uniform stiffness in all directions, and it minimizes the cross-coupling amongst actuators and sensors of different legs (being orthogonal to each other). #+end_quote To generate and study the Cubic configuration, =generateCubicConfiguration= is used (description in section [[sec:generateCubicConfiguration]]). 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? * Configuration Analysis - Stiffness Matrix ** Introduction :ignore: First, we have to understand what is the physical meaning of the Stiffness matrix $\bm{K}$. The Stiffness matrix links forces $\bm{f}$ and torques $\bm{n}$ applied on the mobile platform at $\{B\}$ to the displacement $\Delta\bm{\mathcal{X}}$ of the mobile platform represented by $\{B\}$ with respect to $\{A\}$: \[ \bm{\mathcal{F}} = \bm{K} \Delta\bm{\mathcal{X}} \] with: - $\bm{\mathcal{F}} = [\bm{f}\ \bm{n}]^{T}$ - $\Delta\bm{\mathcal{X}} = [\delta x, \delta y, \delta z, \delta \theta_{x}, \delta \theta_{y}, \delta \theta_{z}]^{T}$ If the stiffness matrix is inversible, its inverse is the compliance matrix: $\bm{C} = \bm{K}^{-1$ and: \[ \Delta \bm{\mathcal{X}} = C \bm{\mathcal{F}} \] Thus, if the stiffness matrix is diagonal, the compliance matrix is also diagonal and a force (resp. torque) $\bm{\mathcal{F}}_i$ applied on the mobile platform at $\{B\}$ will induce a pure translation (resp. rotation) of the mobile platform represented by $\{B\}$ with respect to $\{A\}$. One has to note that this is only valid in a static way. ** Matlab Init :noexport:ignore: #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) <> #+end_src #+begin_src matlab :exports none :results silent :noweb yes <> #+end_src #+begin_src matlab :results none :exports none simulinkproject('../'); #+end_src ** 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. #+begin_src matlab H = 100e-3; % height of the Stewart platform [m] MO_B = -H/2; % Position {B} with respect to {M} [m] Hc = H; % Size of the useful part of the cube [m] FOc = H + MO_B; % Center of the cube with respect to {F} #+end_src #+begin_src matlab stewart = initializeStewartPlatform(); stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B); stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0); stewart = computeJointsPose(stewart); stewart = initializeStrutDynamics(stewart, 'K', ones(6,1)); stewart = computeJacobian(stewart); stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 175e-3, 'Mpr', 150e-3); #+end_src #+name: fig:3d-cubic-stewart-aligned #+caption: Centered cubic configuration [[file:figs/3d-cubic-stewart-aligned.png]] #+begin_src matlab :exports none displayArchitecture(stewart, 'labels', false); scatter3(0, 0, FOc, 200, 'kh'); #+end_src #+header: :tangle no :exports results :results none :noweb yes #+begin_src matlab :var filepath="figs/cubic_conf_centered_J_center.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+name: fig:cubic_conf_centered_J_center #+caption: Cubic Stewart platform centered with the cube center - Jacobian estimated at the cube center ([[./figs/cubic_conf_centered_J_center.png][png]], [[./figs/cubic_conf_centered_J_center.pdf][pdf]]) [[file:figs/cubic_conf_centered_J_center.png]] #+begin_src matlab :exports results :results value table replace :tangle no data2orgtable(stewart.kinematics.K, {}, {}, ' %.2g '); #+end_src #+RESULTS: | 2 | 0 | -2.5e-16 | 0 | 2.1e-17 | 0 | | 0 | 2 | 0 | -7.8e-19 | 0 | 0 | | -2.5e-16 | 0 | 2 | -2.4e-18 | -1.4e-17 | 0 | | 0 | -7.8e-19 | -2.4e-18 | 0.015 | -4.3e-19 | 1.7e-18 | | 1.8e-17 | 0 | -1.1e-17 | 0 | 0.015 | 0 | | 6.6e-18 | -3.3e-18 | 0 | 1.7e-18 | 0 | 0.06 | ** 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 H = 100e-3; % height of the Stewart platform [m] MO_B = 20e-3; % Position {B} with respect to {M} [m] Hc = H; % Size of the useful part of the cube [m] FOc = H/2; % Center of the cube with respect to {F} #+end_src #+begin_src matlab stewart = initializeStewartPlatform(); stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B); stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0); stewart = computeJointsPose(stewart); stewart = initializeStrutDynamics(stewart, 'K', ones(6,1)); stewart = computeJacobian(stewart); stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 175e-3, 'Mpr', 150e-3); #+end_src #+begin_src matlab :exports none displayArchitecture(stewart, 'labels', false); scatter3(0, 0, FOc, 200, 'kh'); #+end_src #+header: :tangle no :exports results :results none :noweb yes #+begin_src matlab :var filepath="figs/cubic_conf_centered_J_not_center.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+name: fig:cubic_conf_centered_J_not_center #+caption: Cubic Stewart platform centered with the cube center - Jacobian not estimated at the cube center ([[./figs/cubic_conf_centered_J_not_center.png][png]], [[./figs/cubic_conf_centered_J_not_center.pdf][pdf]]) [[file:figs/cubic_conf_centered_J_not_center.png]] #+begin_src matlab :exports results :results value table replace :tangle no data2orgtable(stewart.kinematics.K, {}, {}, ' %.2g '); #+end_src #+RESULTS: | 2 | 0 | -2.5e-16 | 0 | -0.14 | 0 | | 0 | 2 | 0 | 0.14 | 0 | 0 | | -2.5e-16 | 0 | 2 | -5.3e-19 | 0 | 0 | | 0 | 0.14 | -5.3e-19 | 0.025 | 0 | 8.7e-19 | | -0.14 | 0 | 2.6e-18 | 1.6e-19 | 0.025 | 0 | | 6.6e-18 | -3.3e-18 | 0 | 8.9e-19 | 0 | 0.06 | ** 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:cubic_conf_not_centered_J_center]]). The Jacobian is estimated at the cube center. #+begin_src matlab H = 80e-3; % height of the Stewart platform [m] MO_B = -30e-3; % Position {B} with respect to {M} [m] Hc = 100e-3; % Size of the useful part of the cube [m] FOc = H + MO_B; % Center of the cube with respect to {F} #+end_src #+begin_src matlab stewart = initializeStewartPlatform(); stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B); stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0); stewart = computeJointsPose(stewart); stewart = initializeStrutDynamics(stewart, 'K', ones(6,1)); stewart = computeJacobian(stewart); stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 175e-3, 'Mpr', 150e-3); #+end_src #+begin_src matlab :exports none displayArchitecture(stewart, 'labels', false); scatter3(0, 0, FOc, 200, 'kh'); #+end_src #+header: :tangle no :exports results :results none :noweb yes #+begin_src matlab :var filepath="figs/cubic_conf_not_centered_J_center.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+name: fig:cubic_conf_not_centered_J_center #+caption: Cubic Stewart platform not centered with the cube center - Jacobian estimated at the cube center ([[./figs/cubic_conf_not_centered_J_center.png][png]], [[./figs/cubic_conf_not_centered_J_center.pdf][pdf]]) [[file:figs/cubic_conf_not_centered_J_center.png]] #+begin_src matlab :exports results :results value table replace :tangle no data2orgtable(stewart.kinematics.K, {}, {}, ' %.2g '); #+end_src #+RESULTS: | 2 | 0 | -1.7e-16 | 0 | 4.9e-17 | 0 | | 0 | 2 | 0 | -2.2e-17 | 0 | 2.8e-17 | | -1.7e-16 | 0 | 2 | 1.1e-18 | -1.4e-17 | 1.4e-17 | | 0 | -2.2e-17 | 1.1e-18 | 0.015 | 0 | 3.5e-18 | | 4.4e-17 | 0 | -1.4e-17 | -5.7e-20 | 0.015 | -8.7e-19 | | 6.6e-18 | 2.5e-17 | 0 | 3.5e-18 | -8.7e-19 | 0.06 | 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 H = 100e-3; % height of the Stewart platform [m] MO_B = -H/2; % Position {B} with respect to {M} [m] Hc = 1.5*H; % Size of the useful part of the cube [m] FOc = H/2 + 10e-3; % Center of the cube with respect to {F} #+end_src #+begin_src matlab stewart = initializeStewartPlatform(); stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B); stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0); stewart = computeJointsPose(stewart); stewart = initializeStrutDynamics(stewart, 'K', ones(6,1)); stewart = computeJacobian(stewart); stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 215e-3, 'Mpr', 195e-3); #+end_src #+begin_src matlab :exports none displayArchitecture(stewart, 'labels', false); scatter3(0, 0, FOc, 200, 'kh'); #+end_src #+header: :tangle no :exports results :results none :noweb yes #+begin_src matlab :var filepath="figs/cubic_conf_not_centered_J_stewart_center.pdf" :var figsize="wide-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+name: fig:cubic_conf_not_centered_J_stewart_center #+caption: Cubic Stewart platform not centered with the cube center - Jacobian estimated at the Stewart platform center ([[./figs/cubic_conf_not_centered_J_stewart_center.png][png]], [[./figs/cubic_conf_not_centered_J_stewart_center.pdf][pdf]]) [[file:figs/cubic_conf_not_centered_J_stewart_center.png]] #+begin_src matlab :exports results :results value table replace :tangle no data2orgtable(stewart.kinematics.K, {}, {}, ' %.2g '); #+end_src #+RESULTS: | 2 | 0 | 1.5e-16 | 0 | 0.02 | 0 | | 0 | 2 | 0 | -0.02 | 0 | 0 | | 1.5e-16 | 0 | 2 | -3e-18 | -2.8e-17 | 0 | | 0 | -0.02 | -3e-18 | 0.034 | -8.7e-19 | 5.2e-18 | | 0.02 | 0 | -2.2e-17 | -4.4e-19 | 0.034 | 0 | | 5.9e-18 | -7.5e-18 | 0 | 3.5e-18 | 0 | 0.14 | ** Conclusion #+begin_important Here are the conclusion about the Stiffness matrix for the Cubic configuration: - 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 Jacobian is estimated at the cube center. #+end_important ** Having Cube's center above the top platform Let's say we want to have a diagonal stiffness matrix when $\{A\}$ and $\{B\}$ are located above the top platform. Thus, we want the cube's center to be located above the top center. Let's fix the Height of the Stewart platform and the position of frames $\{A\}$ and $\{B\}$: #+begin_src matlab H = 100e-3; % height of the Stewart platform [m] MO_B = 20e-3; % Position {B} with respect to {M} [m] #+end_src We find the several Cubic configuration for the Stewart platform where the center of the cube is located at frame $\{A\}$. The differences between the configuration are the cube's size: - Small Cube Size in Figure [[fig:stewart_cubic_conf_type_1]] - Medium Cube Size in Figure [[fig:stewart_cubic_conf_type_2]] - Large Cube Size in Figure [[fig:stewart_cubic_conf_type_3]] For each of the configuration, the Stiffness matrix is diagonal with $k_x = k_y = k_y = 2k$ with $k$ is the stiffness of each strut. However, the rotational stiffnesses are increasing with the cube's size but the required size of the platform is also increasing, so there is a trade-off here. #+begin_src matlab Hc = 0.4*H; % Size of the useful part of the cube [m] FOc = H + MO_B; % Center of the cube with respect to {F} #+end_src #+begin_src matlab :exports none stewart = initializeStewartPlatform(); stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B); stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0); stewart = computeJointsPose(stewart); stewart = initializeStrutDynamics(stewart, 'K', ones(6,1)); stewart = computeJacobian(stewart); stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), 'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb))); displayArchitecture(stewart, 'labels', false); scatter3(0, 0, FOc, 200, 'kh'); #+end_src #+header: :tangle no :exports results :results none :noweb yes #+begin_src matlab :var filepath="figs/stewart_cubic_conf_type_1.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+name: fig:stewart_cubic_conf_type_1 #+caption: Cubic Configuration for the Stewart Platform - Small Cube Size ([[./figs/stewart_cubic_conf_type_1.png][png]], [[./figs/stewart_cubic_conf_type_1.pdf][pdf]]) [[file:figs/stewart_cubic_conf_type_1.png]] #+begin_src matlab :exports results :results value table replace :tangle no data2orgtable(stewart.kinematics.K, {}, {}, ' %.2g '); #+end_src #+RESULTS: | 2 | 0 | -2.8e-16 | 0 | 2.4e-17 | 0 | | 0 | 2 | 0 | -2.3e-17 | 0 | 0 | | -2.8e-16 | 0 | 2 | -2.1e-19 | 0 | 0 | | 0 | -2.3e-17 | -2.1e-19 | 0.0024 | -5.4e-20 | 6.5e-19 | | 2.4e-17 | 0 | 4.9e-19 | -2.3e-20 | 0.0024 | 0 | | -1.2e-18 | 1.1e-18 | 0 | 6.2e-19 | 0 | 0.0096 | #+begin_src matlab Hc = 1.5*H; % Size of the useful part of the cube [m] FOc = H + MO_B; % Center of the cube with respect to {F} #+end_src #+begin_src matlab :exports none stewart = initializeStewartPlatform(); stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B); stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0); stewart = computeJointsPose(stewart); stewart = initializeStrutDynamics(stewart, 'K', ones(6,1)); stewart = computeJacobian(stewart); stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), 'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb))); displayArchitecture(stewart, 'labels', false); scatter3(0, 0, FOc, 200, 'kh'); #+end_src #+header: :tangle no :exports results :results none :noweb yes #+begin_src matlab :var filepath="figs/stewart_cubic_conf_type_2.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+name: fig:stewart_cubic_conf_type_2 #+caption: Cubic Configuration for the Stewart Platform - Medium Cube Size ([[./figs/stewart_cubic_conf_type_2.png][png]], [[./figs/stewart_cubic_conf_type_2.pdf][pdf]]) [[file:figs/stewart_cubic_conf_type_2.png]] #+begin_src matlab :exports results :results value table replace :tangle no data2orgtable(stewart.kinematics.K, {}, {}, ' %.2g '); #+end_src #+RESULTS: | 2 | 0 | -1.9e-16 | 0 | 5.6e-17 | 0 | | 0 | 2 | 0 | -7.6e-17 | 0 | 0 | | -1.9e-16 | 0 | 2 | 2.5e-18 | 2.8e-17 | 0 | | 0 | -7.6e-17 | 2.5e-18 | 0.034 | 8.7e-19 | 8.7e-18 | | 5.7e-17 | 0 | 3.2e-17 | 2.9e-19 | 0.034 | 0 | | -1e-18 | -1.3e-17 | 5.6e-17 | 8.4e-18 | 0 | 0.14 | #+begin_src matlab Hc = 2.5*H; % Size of the useful part of the cube [m] FOc = H + MO_B; % Center of the cube with respect to {F} #+end_src #+begin_src matlab :exports none stewart = initializeStewartPlatform(); stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B); stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0); stewart = computeJointsPose(stewart); stewart = initializeStrutDynamics(stewart, 'K', ones(6,1)); stewart = computeJacobian(stewart); stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), 'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb))); displayArchitecture(stewart, 'labels', false); scatter3(0, 0, FOc, 200, 'kh'); #+end_src #+header: :tangle no :exports results :results none :noweb yes #+begin_src matlab :var filepath="figs/stewart_cubic_conf_type_3.pdf" :var figsize="full-tall" :post pdf2svg(file=*this*, ext="png") <> #+end_src #+name: fig:stewart_cubic_conf_type_3 #+caption: Cubic Configuration for the Stewart Platform - Large Cube Size ([[./figs/stewart_cubic_conf_type_3.png][png]], [[./figs/stewart_cubic_conf_type_3.pdf][pdf]]) [[file:figs/stewart_cubic_conf_type_3.png]] #+begin_src matlab :exports results :results value table replace :tangle no data2orgtable(stewart.kinematics.K, {}, {}, ' %.2g '); #+end_src #+RESULTS: | 2 | 0 | -3e-16 | 0 | -8.3e-17 | 0 | | 0 | 2 | 0 | -2.2e-17 | 0 | 5.6e-17 | | -3e-16 | 0 | 2 | -9.3e-19 | -2.8e-17 | 0 | | 0 | -2.2e-17 | -9.3e-19 | 0.094 | 0 | 2.1e-17 | | -8e-17 | 0 | -3e-17 | -6.1e-19 | 0.094 | 0 | | -6.2e-18 | 7.2e-17 | 5.6e-17 | 2.3e-17 | 0 | 0.37 | * Cubic size analysis We here study the effect of the size of the cube used for the Stewart Cubic configuration. We fix the height of the Stewart platform, the center of the cube is at the center of the Stewart platform and the frames $\{A\}$ and $\{B\}$ are also taken at the center of the cube. We only vary the size of the cube. #+begin_src matlab :results silent Hcs = 1e-3*[250:20:350]; % Heights for the Cube [m] Ks = zeros(6, 6, length(Hcs)); #+end_src The height of the Stewart platform is fixed: #+begin_src matlab H = 100e-3; % height of the Stewart platform [m] #+end_src The frames $\{A\}$ and $\{B\}$ are positioned at the Stewart platform center as well as the cube's center: #+begin_src matlab MO_B = -50e-3; % Position {B} with respect to {M} [m] FOc = H + MO_B; % Center of the cube with respect to {F} #+end_src #+begin_src matlab :results silent stewart = initializeStewartPlatform(); stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B); for i = 1:length(Hcs) Hc = Hcs(i); stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0); stewart = computeJointsPose(stewart); stewart = initializeStrutDynamics(stewart, 'K', ones(6,1)); stewart = computeJacobian(stewart); Ks(:,:,i) = stewart.kinematics.K; end #+end_src We find that for all the cube's size, $k_x = k_y = k_z = k$ where $k$ is the strut stiffness. We also find that $k_{\theta_x} = k_{\theta_y}$ and $k_{\theta_z}$ are varying with the cube's size (figure [[fig:stiffness_cube_size]]). #+begin_src matlab :results none :exports code figure; hold on; plot(Hcs, squeeze(Ks(4, 4, :)), 'DisplayName', '$k_{\theta_x} = k_{\theta_y}$'); plot(Hcs, squeeze(Ks(6, 6, :)), 'DisplayName', '$k_{\theta_z}$'); hold off; legend('location', 'northwest'); xlabel('Cube Size [m]'); 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") <> #+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. #+end_important * Functions <> ** =generateCubicConfiguration=: Generate a Cubic Configuration :PROPERTIES: :header-args:matlab+: :tangle ../src/generateCubicConfiguration.m :header-args:matlab+: :comments none :mkdirp yes :eval no :END: <> 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 % - geometry.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: % - platform_F.Fa [3x6] - Its i'th column is the position vector of joint ai with respect to {F} % - platform_M.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, mustBeNonnegative} = 15e-3 args.MHb (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e-3 end #+end_src *** Check the =stewart= structure elements :PROPERTIES: :UNNUMBERED: t :END: #+begin_src matlab assert(isfield(stewart.geometry, 'H'), 'stewart.geometry should have attribute H') H = stewart.geometry.H; #+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 Fa = CCf + [0; 0; args.FOc] + ((args.FHa-(args.FOc-args.Hc/2))./CSi(3,:)).*CSi; Mb = CCf + [0; 0; args.FOc-H] + ((H-args.MHb-(args.FOc-args.Hc/2))./CSi(3,:)).*CSi; #+end_src *** Populate the =stewart= structure :PROPERTIES: :UNNUMBERED: t :END: #+begin_src matlab stewart.platform_F.Fa = Fa; stewart.platform_M.Mb = Mb; #+end_src * Bibliography :ignore: bibliographystyle:unsrtnat bibliography:ref.bib