# 3DOF Stewart platform, how is this movement possible?

I'm trying to make my own 3DOF Stewart platform, to make ball balancing control. I've been struggling with the math for a while now and I've done some research in several places and I don't get how is the following movement possible.

The platform that I'm attempting to build follows the same configuration as this two platforms:

https://youtu.be/VvBojB_RUBA

https://youtu.be/ASe9uZmp-y0

From watching these videos is clear that this configuration doesn't allow the ball joints that are in the plane to move outside of a plane that is perpendicular to the floor.

I mean this ball joints: What I mean is that this joints can only move in space up down and back and forth(and they also support rotation but this doesn't affect the problem I'm having) but they doesn't support movement to the sides, the other joints in the platform are just rotational so this movement is not allowed.

Now, that being said, I did some simulations in python taking the coordinates of the 3 ball joints and rotating them with R3 rotation matrices, for example x_ang=30° y_ang=-30° and plotted the results from a top view, and this is what I got: In this plot the blue dots represent the position of the ball joints when both angles are 0° and the yellow points represent the positions of the ball joints after the rotation

If you see the ball joint at the bottom of the plot there is no problem because the motors would have to move the ball forward (and in some direction along the z axis but that's not a problem now). But if you see the other two joints, they have to move to the sides and that is clearly not aloud by the configuration.

My question here is, am I missing something here? How is that those two platforms are able to perform this movements without any problems, are they relaying in some loose joint and that movement is too subtle to be perceived?

Here is the Python script I've written for this:

import numpy as np
import matplotlib.pyplot as plt

#Function that performs the rotation
def rotate_vector(ang_x,ang_y,p):
Mx=np.array([[1,0,0],[0,np.cos(ang_x),-np.sin(ang_x)],[0,np.sin(ang_x),np.cos(ang_x)]])
My=np.array([[np.cos(ang_y),0,np.sin(ang_y)],[0,1,0],[-np.sin(ang_y),0,np.cos(ang_y)]])
Mxy=np.dot(Mx,My)
p_rot=np.dot(Mxy,p)
return p_rot

#positions of the ball joins when they are unactuated
dist=6
C1=dist*np.array([0,-1,0])
C2=dist*np.array([-np.cos(np.pi*30/180),np.sin(np.pi*30/180),0])
C3=dist*np.array([np.cos(np.pi*30/180),np.sin(np.pi*30/180),0])
#angles to perform
ang_x=30*np.pi/180
ang_y=-30*np.pi/180
#making the rotation of the joints
C1r=rotate_vector(ang_x,ang_y,C1)
C2r=rotate_vector(ang_x,ang_y,C2)
C3r=rotate_vector(ang_x,ang_y,C3)
#plot of the results
points=np.array([C1,C2,C3,C1r,C2r,C3r])
x, y,z= zip(*points)
#assign colors to differentiate the joints
colors=[0,0,0,100,100,100]
plt.scatter(x, y, c=colors)


Here is a webpage that describes the math that they used to build one of these platforms 3DOF STEWART PLATFORM. But it doesn't take into consideration all the problem that I've just described.

• i believe you missed some capability to rotate... consider the motion in the tangential direction when rotating about a point.
– Abel
Aug 24 at 2:59
• @Abel Thank you for your comment. Do you mean shifting the platform towards the y directions? If that is what you mean you can only align two of the ball joints and third one would be misaligned. If not, could you please elaborate a little more? I would really appreciate some insights that can guide me to solve this. Aug 24 at 3:25

This is the type of ball joint used. Figure source : Ball joint drawing Elesa -ganter)

As you can see the rounded cylinder inside can rotate in all directions, and thus the platform can move side to side.

If I understand correct the question is about translational motion. In this case there is some permitted translation which is due to the offset between the platform and the plane defined by the three ball joints.

The bid difference that I see in the first video from (e.g.) kawasaki Y series is that the ball joints are present on the top and on the bottom of the rod. That added flexibility allows for more the parallel translation. From watching these videos is clear that this configuration doesn't allow the ball joints that are in the plane to move outside of a plane that is perpendicular to the floor.

But the platform can tilt. You need to find the intersection between the plane the ball joins pmove in and the platform and constrain the motion of the ball joints within this plane. From your plot

Another constraint is that ball distances between the ball joints are always the same - I can't tell from your plot if this is the case in your model.

For every configuration (position of the three actors) there will be only one position possible for the platform that you can find using kinematic equations.

I can't walk you through the math or correct your python script.