diff --git a/docs/cubic-configuration.html b/docs/cubic-configuration.html index e289382..15077f9 100644 --- a/docs/cubic-configuration.html +++ b/docs/cubic-configuration.html @@ -4,7 +4,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- +generateCubicConfiguration
: Generate a Cubic Configuration
generateCubicConfiguration
is used (described here).
-To generate and study the Stewart platform with a Cubic configuration, the Matlab function generateCubicConfiguration
is used (described here).
-
@@ -1157,8 +1162,8 @@ FOc = H + MO_B; % Cente
@@ -1232,8 +1237,8 @@ We also find that \(k_{\theta_x} = k_{\theta_y}\) and \(k_{\theta_z}\) are varyi
We observe that \(k_{\theta_x} = k_{\theta_y}\) and \(k_{\theta_z}\) increase linearly with the cube size. @@ -1249,37 +1254,506 @@ In order to maximize the rotational stiffness of the Stewart platform, the size
+In this section, we study the dynamics of the platform in the cartesian frame. +
+ ++We here suppose that there is one relative motion sensor in each strut (\(\delta\bm{\mathcal{L}}\) is measured) and we would like to control the position of the top platform pose \(\delta \bm{\mathcal{X}}\). +
+ ++Thanks to the Jacobian matrix, we can use the “architecture” shown in Figure 9 to obtain the dynamics of the system from forces/torques applied by the actuators on the top platform to translations/rotations of the top platform. +
+ +\begin{tikzpicture} + \node[block] (Jt) at (0, 0) {$\bm{J}^{-T}$}; + \node[block, right= of Jt] (G) {$\bm{G}$}; + \node[block, right= of G] (J) {$\bm{J}^{-1}$}; + + \draw[->] ($(Jt.west)+(-0.8, 0)$) -- (Jt.west) node[above left]{$\bm{\mathcal{F}}$}; + \draw[->] (Jt.east) -- (G.west) node[above left]{$\bm{\tau}$}; + \draw[->] (G.east) -- (J.west) node[above left]{$\delta\bm{\mathcal{L}}$}; + \draw[->] (J.east) -- ++(0.8, 0) node[above left]{$\delta\bm{\mathcal{X}}$}; +\end{tikzpicture} ++
+
+Figure 9: From Strut coordinate to Cartesian coordinate using the Jacobian matrix
++We here study the dynamics from \(\bm{\mathcal{F}}\) to \(\delta\bm{\mathcal{X}}\). +
+ ++One has to note that when considering the static behavior: +\[ \bm{G}(s = 0) = \begin{bmatrix} + 1/k_1 & & 0 \\ + & \ddots & 0 \\ + 0 & & 1/k_6 + \end{bmatrix}\] +
+ ++And thus: +\[ \frac{\delta\bm{\mathcal{X}}}{\bm{\mathcal{F}}}(s = 0) = \bm{J}^{-1} \bm{G}(s = 0) \bm{J}^{-T} = \bm{K}^{-1} = \bm{C} \] +
+ ++We conclude that the static behavior of the platform depends on the stiffness matrix. +For the cubic configuration, we have a diagonal stiffness matrix is the frames \(\{A\}\) and \(\{B\}\) are coincident with the cube’s center.
+Let’s create a Cubic Stewart Platform where the Center of Mass of the mobile platform is located at the center of the cube. +
+ ++We define the size of the Stewart platform and the position of frames \(\{A\}\) and \(\{B\}\). +
+H = 200e-3; % height of the Stewart platform [m] +MO_B = -10e-3; % Position {B} with respect to {M} [m] +
+Now, we set the cube’s parameters such that the center of the cube is coincident with \(\{A\}\) and \(\{B\}\). +
+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} +
stewart = initializeStewartPlatform(); +stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B); +stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 25e-3, 'MHb', 25e-3); +stewart = computeJointsPose(stewart); +stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1)); +stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical'); +stewart = computeJacobian(stewart); +stewart = initializeStewartPose(stewart); ++
+Now we set the geometry and mass of the mobile platform such that its center of mass is coincident with \(\{A\}\) and \(\{B\}\). +
+stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ... + 'Mpm', 10, ... + 'Mph', 20e-3, ... + 'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb))); ++
+And we set small mass for the struts. +
+stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3); +stewart = initializeInertialSensor(stewart); ++
+The obtain geometry is shown in figure 10. +
+ + ++
+Figure 10: Geometry used for the simulations - The cube’s center, the frames \(\{A\}\) and \(\{B\}\) and the Center of mass of the mobile platform are coincident (png, pdf)
++We now identify the dynamics from forces applied in each strut \(\bm{\tau}\) to the displacement of each strut \(d \bm{\mathcal{L}}\). +
+open('simulink/stewart_active_damping.slx') + +%% Options for Linearized +options = linearizeOptions; +options.SampleTime = 0; + +%% Name of the Simulink File +mdl = 'stewart_active_damping'; + +%% Input/Output definition +clear io; io_i = 1; +io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] +io(io_i) = linio([mdl, '/Dm'], 1, 'openoutput'); io_i = io_i + 1; % Displacement of each leg [m] + +%% Run the linearization +G = linearize(mdl, io, options); +G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; +G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'}; ++
+Now, thanks to the Jacobian (Figure 9), we compute the transfer function from \(\bm{\mathcal{F}}\) to \(\bm{\mathcal{X}}\). +
+Gc = inv(stewart.kinematics.J)*G*inv(stewart.kinematics.J'); +Gc.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'}; +Gc.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'}; ++
+The obtain dynamics \(\bm{G}_{c}(s) = \bm{J}^{-T} \bm{G}(s) \bm{J}^{-1}\) is shown in Figure 11. +
+ + + + ++The dynamics is well decoupled at all frequencies. +
+ ++We have the same dynamics for: +
++The Dynamics from \(F_i\) to \(D_i\) is just a 1-dof mass-spring-damper system. +
+ ++This is because the Mass, Damping and Stiffness matrices are all diagonal. +
+ ++Let’s create a Stewart platform with a cubic architecture where the cube’s center is at the center of the Stewart platform. +
+H = 200e-3; % height of the Stewart platform [m] +MO_B = -100e-3; % Position {B} with respect to {M} [m] ++
+Now, we set the cube’s parameters such that the center of the cube is coincident with \(\{A\}\) and \(\{B\}\). +
+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} ++
stewart = initializeStewartPlatform(); +stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B); +stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 25e-3, 'MHb', 25e-3); +stewart = computeJointsPose(stewart); +stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1)); +stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical'); +stewart = computeJacobian(stewart); +stewart = initializeStewartPose(stewart); ++
+However, the Center of Mass of the mobile platform is not located at the cube’s center. +
+stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ... + 'Mpm', 10, ... + 'Mph', 20e-3, ... + 'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb))); ++
+And we set small mass for the struts. +
+stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3); +stewart = initializeInertialSensor(stewart); ++
+The obtain geometry is shown in figure 12. +
+ ++
+Figure 12: Geometry used for the simulations - The cube’s center is coincident with the frames \(\{A\}\) and \(\{B\}\) but not with the Center of mass of the mobile platform (png, pdf)
++We now identify the dynamics from forces applied in each strut \(\bm{\tau}\) to the displacement of each strut \(d \bm{\mathcal{L}}\). +
+open('simulink/stewart_active_damping.slx') + +%% Options for Linearized +options = linearizeOptions; +options.SampleTime = 0; + +%% Name of the Simulink File +mdl = 'stewart_active_damping'; + +%% Input/Output definition +clear io; io_i = 1; +io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] +io(io_i) = linio([mdl, '/Dm'], 1, 'openoutput'); io_i = io_i + 1; % Displacement of each leg [m] + +%% Run the linearization +G = linearize(mdl, io, options); +G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; +G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'}; ++
+And we use the Jacobian to compute the transfer function from \(\bm{\mathcal{F}}\) to \(\bm{\mathcal{X}}\). +
+Gc = inv(stewart.kinematics.J)*G*inv(stewart.kinematics.J'); +Gc.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'}; +Gc.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'}; ++
+The obtain dynamics \(\bm{G}_{c}(s) = \bm{J}^{-T} \bm{G}(s) \bm{J}^{-1}\) is shown in Figure 13. +
+ + + + ++The system is decoupled at low frequency (the Stiffness matrix being diagonal), but it is not decoupled at all frequencies. +
+ ++This was expected as the mass matrix is not diagonal (the Center of Mass of the mobile platform not being coincident with the frame \(\{B\}\)). +
+ ++Some conclusions can be drawn from the above analysis: +
++From preumont07_six_axis_singl_stage_activ, the cubic configuration “minimizes the cross-coupling amongst actuators and sensors of different legs (being orthogonal to each other)”. +
+ ++In this section, we wish to study such properties of the cubic architecture. +
+ ++We will compare the transfer function from sensors to actuators in each strut for a cubic architecture and for a non-cubic architecture (where the struts are not orthogonal with each other). +
++Let’s generate a Cubic architecture where the cube’s center and the frames \(\{A\}\) and \(\{B\}\) are coincident. +
+ +H = 200e-3; % height of the Stewart platform [m] +MO_B = -10e-3; % Position {B} with respect to {M} [m] +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} ++
stewart = initializeStewartPlatform(); +stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B); +stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 25e-3, 'MHb', 25e-3); +stewart = computeJointsPose(stewart); +stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1)); +stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical'); +stewart = computeJacobian(stewart); +stewart = initializeStewartPose(stewart); +stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ... + 'Mpm', 10, ... + 'Mph', 20e-3, ... + 'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb))); +stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3); +stewart = initializeInertialSensor(stewart); ++
+And we identify the dynamics from the actuator forces \(\tau_{i}\) to the relative motion sensors \(\delta \mathcal{L}_{i}\) (Figure 15) and to the force sensors \(\tau_{m,i}\) (Figure 16). +
+ + + + + + ++Now we generate a Stewart platform which is not cubic but with approximately the same size as the previous cubic architecture. +
+ +H = 200e-3; % height of the Stewart platform [m] +MO_B = -10e-3; % Position {B} with respect to {M} [m] ++
stewart = initializeStewartPlatform(); +stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B); +stewart = generateGeneralConfiguration(stewart, 'FR', 250e-3, 'MR', 150e-3); +stewart = computeJointsPose(stewart); +stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1)); +stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical'); +stewart = computeJacobian(stewart); +stewart = initializeStewartPose(stewart); +stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ... + 'Mpm', 10, ... + 'Mph', 20e-3, ... + 'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb))); +stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3); +stewart = initializeInertialSensor(stewart); ++
+And we identify the dynamics from the actuator forces \(\tau_{i}\) to the relative motion sensors \(\delta \mathcal{L}_{i}\) (Figure 18) and to the force sensors \(\tau_{m,i}\) (Figure 19). +
+ + + + + + ++The Cubic architecture seems to not have any significant effect on the coupling between actuator and sensors of each strut. +
+ +generateCubicConfiguration
: Generate a Cubic ConfigurationgenerateCubicConfiguration
: Generate a Cubic Configuration-
Figure 9: Cubic Configuration
+Figure 20: Cubic Configuration
Created: 2020-02-12 mer. 11:23
+Created: 2020-02-12 mer. 18:26