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:
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.
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.