+The discovery of the Cubic configuration is done in. 1
+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 4).
+
+
+
+
1 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?
+
+
+
+
+
+
2 Configuration Analysis - Stiffness Matrix
+
+
+
+
2.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 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.
+
+
+
+
+
+
+
Figure 1: Centered cubic configuration
+
+
+
+
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');
+
+
+
+
+
K = stewart.Jd'*stewart.Jd;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
2.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 1).
+The Jacobian matrix is not estimated at the location of the center of the cube.
+
+
+
+
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);
+
+
+
+
+
K = stewart.Jd'*stewart.Jd;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
2.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 2).
+The Jacobian is estimated at the cube center.
+
+
+
+
+
+
+
Figure 2: Not centered cubic configuration
+
+
+
+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\).
+
+
+
+
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);
+
+
+
+
+
K = stewart.Jd'*stewart.Jd;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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.
+
+
+
+
+
+
2.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 \(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\).
+
+
+
+
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);
+
+
+
+
+
K = stewart.Jd'*stewart.Jd;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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.
+
+
+
+
+
+
2.5 Conclusion
+
+
+
+
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
+
+
+
+
+
+
+
+
+
3 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.
+
fori = 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
+
+
+
+
+
+The Stiffness matrix is computed for all generated Stewart platforms.
+
Figure 3: \(k_{\theta_x} = k_{\theta_y}\) and \(k_{\theta_z}\) function of the size of the cube
+
+
+
+
+We observe that \(k_{\theta_x} = k_{\theta_y}\) and \(k_{\theta_z}\) increase linearly with the cube size.
+
+
+
+
+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.
+
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]
+ );
+
+
+
+
+Populate opts with input parameters
+
+
+
if exist('opts_param','var')
+ foropt = fieldnames(opts_param)'
+ opts.(opt{1}) = opts_param.(opt{1});
+ end
+end
+
Z.J. Geng, and L.S. Haynes, , Six Degree-Of-Freedom Active Vibration Control Using the Stewart Platforms, IEEE Transactions on Control Systems Technology, 2(1), pp. 45-53 (1994). http://dx.doi.org/10.1109/87.273110.
-The initializeHexapod function takes one structure that contains configurations for the hexapod and returns one structure representing the hexapod.
+Stewart platforms are generated in multiple steps.
\({}^Aa_i\) - Position of the joints fixed to the fixed base w.r.t \(\{A\}\)
+
\({}^Ab_i\) - Position of the joints fixed to the mobile platform w.r.t \(\{A\}\)
+
\({}^Bb_i\) - Position of the joints fixed to the mobile platform w.r.t \(\{B\}\)
+
\(H\) - Total height of the mobile platform
+
+
+
+These parameter are enough to determine all the kinematic properties of the platform like the Jacobian, stroke, stiffness, …
+These geometrical parameters can be generated using different functions: initializeCubicConfiguration for cubic configuration or initializeGeneralConfiguration for more general configuration.
+
+
+
+A function computeGeometricalProperties is then used to compute:
+
+
+
\(J_f\) - Jacobian matrix for the force location
+
\(J_d\) - Jacobian matrix for displacement estimation
+
\(R_m\) - Rotation matrices to position the leg vectors
+
+
+
+Then, geometrical parameters are computed for all the mechanical elements with the function initializeMechanicalElements:
+
+
+
Shape of the platforms
+
+
External Radius
+
Internal Radius
+
Density
+
Thickness
+
+
Shape of the Legs
+
+
Radius
+
Size of ball joint
+
Density
+
+
+
+
+Other Parameters are defined for the Simscape simulation:
+
+
+
Sample mass, volume and position (initializeSample function)
+
Location of the inertial sensor
+
Location of the point for the differential measurements
+
Location of the Jacobian point for velocity/displacement computation
+
+
+
+
1 initializeGeneralConfiguration
+
+
+
1.1 Function description
+
+
+The initializeGeneralConfiguration function takes one structure that contains configurations for the hexapod and returns one structure representing the Hexapod.
+
opts = struct(...
- 'height', 90, ...% Height of the platform [mm]
- 'density', 8000, ...% Density of the material used for the hexapod [kg/m3]
- 'k_ax', 1e8, ...% Stiffness of each actuator [N/m]
- 'c_ax', 1000, ...% Damping of each actuator [N/(m/s)]
- 'stroke', 50e-6, ...% Maximum stroke of each actuator [m]
- 'name', 'stewart'...% Name of the file
+ 'H_tot', 90, ...% Height of the platform [mm]
+ 'H_joint', 15, ...% Height of the joints [mm]
+ 'H_plate', 10, ...% Thickness of the fixed and mobile platforms [mm]
+ 'R_bot', 100, ...% Radius where the legs articulations are positionned [mm]
+ 'R_top', 80, ...% Radius where the legs articulations are positionned [mm]
+ 'a_bot', 10, ...% Angle Offset [deg]
+ 'a_top', 40, ...% Angle Offset [deg]
+ 'da_top', 0... % Angle Offset from 0 position [deg]
);
@@ -329,37 +423,263 @@ Populate opts with input parameters
-
-
2 Initialization of the stewart structure
-
-
-We initialize the Stewart structure
-
-
-
stewart = struct();
-
-
+
+
1.3 Geometry Description
+
-
-And we defined its total height.
-
-
-
stewart.H = opts.height; % [mm]
-
-
-
-
-
-
-
3 Bottom Plate
-
-
-
+
Figure 1: Schematic of the bottom plates with all the parameters
opts = struct(...
+ 'Jd_pos', [0, 0, 30], ...% Position of the Jacobian for displacement estimation from the top of the mobile platform [mm]
+ 'Jf_pos', [0, 0, 30]...% Position of the Jacobian for force location from the top of the mobile platform [mm]
+ );
+
+
+
+
+Populate opts with input parameters
+
+
+
if exist('opts_param','var')
+ foropt = fieldnames(opts_param)'
+ opts.(opt{1}) = opts_param.(opt{1});
+ end
+end
+
+We compute rotation matrices to have the orientation of the legs.
+The rotation matrix transforms the \(z\) axis to the axis of the leg. The other axis are not important here.
+
opts = struct(...
+ 'thickness', 10, ...% Thickness of the base and platform [mm]
+ 'density', 1000, ...% Density of the material used for the hexapod [kg/m3]
+ 'k_ax', 1e8, ...% Stiffness of each actuator [N/m]
+ 'c_ax', 1000, ...% Damping of each actuator [N/(m/s)]
+ 'stroke', 50e-6...% Maximum stroke of each actuator [m]
+ );
+
+
+
+
+Populate opts with input parameters
+
+
+
if exist('opts_param','var')
+ foropt = fieldnames(opts_param)'
+ opts.(opt{1}) = opts_param.(opt{1});
+ end
+end
+
+
+
+
+
+
+
3.3 Bottom Plate
+
+
+
+
+
+
Figure 2: Schematic of the bottom plates with all the parameters
+
The bottom plate structure is initialized.
@@ -382,16 +702,7 @@ BP.Rext = 150;
-
BP.H = 10; % Thickness of the Bottom Plate [mm]
-
-
-
-
-At which radius legs will be fixed and with that angle offset.
-
-
-
BP.Rleg = 100; % Radius where the legs articulations are positionned [mm]
-BP.alpha = 10; % Angle Offset [deg]
+
BP.H = opts.thickness; % Thickness of the Bottom Plate [mm]
@@ -429,9 +740,9 @@ The structure is added to the stewart structure
-
-
4 Top Plate
-
+
+
3.4 Top Plate
+
The top plate structure is initialized.
@@ -457,16 +768,6 @@ The thickness of the top plate.
-
-At which radius and angle are fixed the legs.
-
-
-
TP.Rleg = 100; % Radius where the legs articulations are positionned [mm]
-TP.alpha = 20; % Angle [deg]
-TP.dalpha = 0; % Angle Offset from 0 position [deg]
-
-
-
The density of its material.
@@ -501,17 +802,16 @@ The structure is added to the stewart structure
-
-
5 Legs
-
+
+
3.5 Legs
+
-
+
-
Figure 2: Schematic for the legs of the Stewart platform
+
Figure 3: Schematic for the legs of the Stewart platform
-
The leg structure is initialized.
@@ -570,6 +870,29 @@ The radius of spheres representing the ball joints are defined.
+
+We estimate the length of the legs.
+
+
+
legs = stewart.Ab - stewart.Aa;
+Leg.lenght = norm(legs(1,:))/1.5;
+
-We compute rotation matrices to have the orientation of the legs.
-The rotation matrix transforms the \(z\) axis to the axis of the leg. The other axis are not important here.
-
function[] = initializeSample(opts_param)
-%% Default values for opts
- sample = struct(...
- 'radius', 100, ...% radius of the cylinder [mm]
- 'height', 100, ...% height of the cylinder [mm]
- 'mass', 10, ...% mass of the cylinder [kg]
- 'measheight', 50, ...% measurement point z-offset [mm]
- 'offset', [0, 0, 0], ...% offset position of the sample [mm]
- 'color', [0.90.10.1]...
- );
+
+
+
+
- %% Populate opts with input parameters
- if exist('opts_param','var')
- foropt = fieldnames(opts_param)'
- sample.(opt{1}) = opts_param.(opt{1});
- end
+
+
4.2 Optional Parameters
+
+
+Default values for opts.
+
+
+
sample = struct(...
+ 'radius', 100, ...% radius of the cylinder [mm]
+ 'height', 100, ...% height of the cylinder [mm]
+ 'mass', 10, ...% mass of the cylinder [kg]
+ 'measheight', 50, ...% measurement point z-offset [mm]
+ 'offset', [0, 0, 0], ...% offset position of the sample [mm]
+ 'color', [0.90.10.1]...
+ );
+
+
+
+
+Populate opts with input parameters
+
+
+
if exist('opts_param','var')
+ foropt = fieldnames(opts_param)'
+ sample.(opt{1}) = opts_param.(opt{1});
end
-
- %% Save
- save('./mat/sample.mat', 'sample');
end