Cubic configuration for the Stewart Platform
Table of ContentsClose
The Cubic configuration for the Stewart platform was first proposed in (Geng and Haynes 1994). This configuration is quite specific in the sense that the active struts are arranged in a mutually orthogonal configuration connecting the corners of a cube. This configuration is now widely used ((Preumont et al. 2007; Jafari and McInroy 2003)).
According to (Preumont et al. 2007), the cubic configuration offers the following advantages:
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).
In this document, the cubic architecture is analyzed:
- In section 1, we study the uniform stiffness of such configuration and we find the conditions to obtain a diagonal stiffness matrix
- In section 2, we find cubic configurations where the cube’s center is located above the mobile platform
- In section 3, we study the effect of the cube’s size on the Stewart platform properties
- In section 4, we study the dynamics of the cubic configuration in the cartesian frame
- In section 5, we study the dynamic cross-coupling of the cubic configuration from actuators to sensors of each strut
- In section 6, function related to the cubic configuration are defined. To generate and study the Stewart platform with a Cubic configuration, the Matlab function
generateCubicConfiguration
is used (described here).
1 Stiffness Matrix for the Cubic configuration
Note
The Matlab script corresponding to this section is accessible here.
To run the script, open the Simulink Project, and type run cubic_conf_stiffness.m
.
First, we have to understand what is the physical meaning of the Stiffness matrix
The Stiffness matrix links forces
with:
If the stiffness matrix is inversible, its inverse is the compliance matrix: \(\bm{C} = \bm{K}^{-1\) and:
Thus, if the stiffness matrix is diagonal, the compliance matrix is also diagonal and a force (resp. torque)
One has to note that this is only valid in a static way.
We here study what makes the Stiffness matrix diagonal when using a cubic configuration.
1.1 Cubic Stewart platform centered with the cube center - Jacobian estimated at the cube center
We create a cubic Stewart platform (figure 1) in such a way that the center of the cube (black star) 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.
CopyH = 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}
Copystewart = 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);
Figure 1: Cubic Stewart platform centered with the cube center - Jacobian estimated at the cube center (png, pdf)
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 |
1.2 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 2). The Jacobian matrix is not estimated at the location of the center of the cube.
CopyH = 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}
Copystewart = 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);
Figure 2: Cubic Stewart platform centered with the cube center - Jacobian not estimated at the cube center (png, pdf)
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 |
1.3 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 3). The Jacobian is estimated at the cube center.
CopyH = 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}
Copystewart = 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);
Figure 3: Cubic Stewart platform not centered with the cube center - Jacobian estimated at the cube center (png, pdf)
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
1.4 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
CopyH = 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}
Copystewart = 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);
Figure 4: Cubic Stewart platform not centered with the cube center - Jacobian estimated at the Stewart platform center (png, pdf)
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 |
1.5 Conclusion
Important
Here are the conclusion about the Stiffness matrix for the Cubic configuration:
- The cubic configuration permits to have
and - The stiffness matrix
is diagonal for the cubic configuration if the Jacobian is estimated at the cube center.
2 Configuration with the Cube’s center above the mobile platform
Note
The Matlab script corresponding to this section is accessible here.
To run the script, open the Simulink Project, and type run cubic_conf_above_platform.m
.
We saw in section 1 that in order to have a diagonal stiffness matrix, we need the cube’s center to be located at frames
We here see if the cubic configuration can provide a diagonal stiffness matrix when
2.1 Having Cube’s center above the top platform
Let’s say we want to have a diagonal stiffness matrix when
Let’s fix the Height of the Stewart platform and the position of frames
CopyH = 100e-3; % height of the Stewart platform [m] MO_B = 20e-3; % Position {B} with respect to {M} [m]
We find the several Cubic configuration for the Stewart platform where the center of the cube is located at frame
For each of the configuration, the Stiffness matrix is diagonal with
CopyHc = 0.4*H; % Size of the useful part of the cube [m] FOc = H + MO_B; % Center of the cube with respect to {F}
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 |
CopyHc = 1.5*H; % Size of the useful part of the cube [m] FOc = H + MO_B; % Center of the cube with respect to {F}
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 |
CopyHc = 2.5*H; % Size of the useful part of the cube [m] FOc = H + MO_B; % Center of the cube with respect to {F}
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 |
2.2 Size of the platforms
The minimum size of the platforms depends on the cube’s size and the height between the platform and the cube’s center.
Let’s denote:
the height between the cube’s center and the considered platform the size of the cube’s edges
Let’s denote by
Initially, we have:
We rotate the cube around its center (origin of the rotated frame) such that one of its diagonal is vertical.
After rotation, the points
Points
Then we want to find the intersection between the line that defines the strut with the plane defined by the height
Then, the intersection point
Finally, the circle can contains the intersection point has a radius
By symmetry, we can show that all the other intersection points will also be on the circle with a radius
For a small cube:
2.3 Conclusion
Important
We found that we can have a diagonal stiffness matrix using the cubic architecture when
Cube’s Size | Paper with the corresponding cubic architecture |
---|---|
Small | (Furutani, Suzuki, and Kudoh 2004) |
Medium | (Yang et al. 2019) |
Large |
3 Cubic size analysis
Note
The Matlab script corresponding to this section is accessible here.
To run the script, open the Simulink Project, and type run cubic_conf_size_analysis.m
.
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
We only vary the size of the cube.
3.1 Analysis
We initialize the wanted cube’s size.
CopyHcs = 1e-3*[250:20:350]; % Heights for the Cube [m] Ks = zeros(6, 6, length(Hcs));
The height of the Stewart platform is fixed:
CopyH = 100e-3; % height of the Stewart platform [m]
The frames
CopyMO_B = -50e-3; % Position {B} with respect to {M} [m] FOc = H + MO_B; % Center of the cube with respect to {F}
We find that for all the cube’s size,
Figure 8:
3.2 Conclusion
We observe that
Important
In order to maximize the rotational stiffness of the Stewart platform, the size of the cube should be the highest possible.
4 Dynamic Coupling in the Cartesian Frame
Note
The Matlab script corresponding to this section is accessible here.
To run the script, open the Simulink Project, and type run cubic_conf_coupling_cartesian.m
.
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 (
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.
Figure 9: From Strut coordinate to Cartesian coordinate using the Jacobian matrix
We here study the dynamics from
One has to note that when considering the static behavior:
And thus:
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
4.1 Cube’s center at the Center of Mass of the mobile platform
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
CopyH = 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
CopyHc = 2.5*H; % Size of the useful part of the cube [m] FOc = H + MO_B; % Center of the cube with respect to {F}
Copystewart = 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
Copystewart = 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.
Copystewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3); stewart = initializeInertialSensor(stewart);
No flexibility below the Stewart platform and no payload.
Copyground = initializeGround('type', 'none'); payload = initializePayload('type', 'none'); controller = initializeController('type', 'open-loop');
The obtain geometry is shown in figure 10.
Figure 10: Geometry used for the simulations - The cube’s center, the frames
We now identify the dynamics from forces applied in each strut
Copyopen('stewart_platform_model.slx') %% Options for Linearized options = linearizeOptions; options.SampleTime = 0; %% Name of the Simulink File mdl = 'stewart_platform_model'; %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [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
CopyGc = inv(stewart.kinematics.J)*G*inv(stewart.kinematics.J'); Gc = inv(stewart.kinematics.J)*G*stewart.kinematics.J; Gc.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'}; Gc.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
The obtain dynamics
It is interesting to note here that the system shown in Figure 12 also yield a decoupled system (explained in section 1.3.3 in (Li 2001)).
Figure 12: Alternative way to decouple the system
Important
The dynamics is well decoupled at all frequencies.
We have the same dynamics for:
, and and
The Dynamics from
This is because the Mass, Damping and Stiffness matrices are all diagonal.
4.2 Cube’s center not coincident with the Mass of the Mobile platform
Let’s create a Stewart platform with a cubic architecture where the cube’s center is at the center of the Stewart platform.
CopyH = 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
CopyHc = 2.5*H; % Size of the useful part of the cube [m] FOc = H + MO_B; % Center of the cube with respect to {F}
Copystewart = 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.
Copystewart = 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.
Copystewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3); stewart = initializeInertialSensor(stewart);
No flexibility below the Stewart platform and no payload.
Copyground = initializeGround('type', 'none'); payload = initializePayload('type', 'none'); controller = initializeController('type', 'open-loop');
The obtain geometry is shown in figure 13.
Figure 13: Geometry used for the simulations - The cube’s center is coincident with the frames
We now identify the dynamics from forces applied in each strut
Copyopen('stewart_platform_model.slx') %% Options for Linearized options = linearizeOptions; options.SampleTime = 0; %% Name of the Simulink File mdl = 'stewart_platform_model'; %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [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
CopyGc = 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
Important
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
4.3 Conclusion
Important
Some conclusions can be drawn from the above analysis:
- Static Decoupling <=> Diagonal Stiffness matrix <=> {A} and {B} at the cube’s center
- Dynamic Decoupling <=> Static Decoupling + CoM of mobile platform coincident with {A} and {B}.
5 Dynamic Coupling between actuators and sensors of each strut
Note
The Matlab script corresponding to this section is accessible here.
To run the script, open the Simulink Project, and type run cubic_conf_coupling_struts.m
.
From (Preumont et al. 2007), 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).
5.1 Coupling between the actuators and sensors - Cubic Architecture
Let’s generate a Cubic architecture where the cube’s center and the frames
CopyH = 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}
Copystewart = 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);
No flexibility below the Stewart platform and no payload.
Copyground = initializeGround('type', 'none'); payload = initializePayload('type', 'none'); controller = initializeController('type', 'open-loop');
Copydisturbances = initializeDisturbances(); references = initializeReferences(stewart);
And we identify the dynamics from the actuator forces
5.2 Coupling between the actuators and sensors - Non-Cubic Architecture
Now we generate a Stewart platform which is not cubic but with approximately the same size as the previous cubic architecture.
CopyH = 200e-3; % height of the Stewart platform [m] MO_B = -10e-3; % Position {B} with respect to {M} [m]
Copystewart = 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);
No flexibility below the Stewart platform and no payload.
Copyground = initializeGround('type', 'none'); payload = initializePayload('type', 'none'); controller = initializeController('type', 'open-loop');
And we identify the dynamics from the actuator forces
5.3 Conclusion
Important
The Cubic architecture seems to not have any significant effect on the coupling between actuator and sensors of each strut and thus provides no advantages for decentralized control.
6 Functions
6.1 generateCubicConfiguration
: Generate a Cubic Configuration
This Matlab function is accessible here.
Function description
Copyfunction [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}
Documentation
Figure 21: Cubic Configuration
Optional Parameters
Copyarguments 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
Check the stewart
structure elements
Copyassert(isfield(stewart.geometry, 'H'), 'stewart.geometry should have attribute H') H = stewart.geometry.H;
Position of the Cube
We define the useful points of the cube with respect to the Cube’s center.
Copysx = [ 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
Compute the pose
We can compute the vector of each leg
CopyCSi = (CCm - CCf)./vecnorm(CCm - CCf);
We now which to compute the position of the joints
CopyFa = 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;
Populate the stewart
structure
Copystewart.platform_F.Fa = Fa; stewart.platform_M.Mb = Mb;