MAD Cycloidal Actuator
New Method (Updated 2023-09-30)
# generate_cycloidal_profile.py
import numpy as np
import matplotlib.pyplot as plt
import ezdxf
def generateCycloidalGearProfile(r_housing=36, r_roller=4, N=16, eccentricity=2):
theta = np.arange(0, 2*np.pi, 0.001)
psi = - np.arctan(np.sin((1 - N) * theta) / (r_housing / (eccentricity * N) - np.cos((1 - N)*theta)))
x = r_housing * np.cos(theta) - r_roller * np.cos(theta - psi) - eccentricity * np.cos(N * theta)
y = -r_housing * np.sin(theta) + r_roller * np.sin(theta - psi) + eccentricity * np.sin(N * theta)
return np.concatenate(([x], [y]), axis=0)
def writeDXF(filename, fit_points, ref_circle_radius=10):
doc = ezdxf.new("R2010") # create a new DXF drawing in R2010 fromat
msp = doc.modelspace()
fit_points = fit_points.T.tolist()
start_point = fit_points[0]
# close the loop
fit_points.append(start_point)
spline = msp.add_spline(fit_points)
spline.set_closed([(start_point[0], start_point[1], 0)])
print(spline.dxf.n_fit_points)
circle = msp.add_circle((0, 0), radius=ref_circle_radius)
doc.saveas(filename)
# 5010
fit_points = generateCycloidalGearProfile(
r_housing=29.,
r_roller=2.5,
N=16.,
eccentricity=1.25
)
'''
#fit_points_ = generateCycloidalGearProfile(
# r_housing=29.,
# r_roller=3.,
# N=16.,
# eccentricity=1.25
# )
'''
# M6C12
'''
fit_points = generateCycloidalGearProfile(
r_housing=36,
r_roller=4,
N=16,
eccentricity=2
)
'''
print(fit_points.shape)
x, y = fit_points
#x_, y_ = fit_points_
plt.plot(x, y)
#plt.plot(x_, y_)
plt.show()
writeDXF("cycloidal_profile.dxf", fit_points, ref_circle_radius=31)
RI-60 Parameters
Housing Radius
29
mm
Housing Roller Diameter
5
mm
Central Hole Diameter
18
mm
Side Hole Diameter
13
mm
Eccentricity
1.25
mm
Spacing Radius of Side Hole
17
mm
RI-70 Parameters
Housing Radius
36
mm
Housing Roller Diameter
8
mm
Central Hole Diameter
18
mm
Side Hole Diameter
13
mm
Eccentricity
2
mm
Spacing Radius of Side Hole
20
mm
Old Method
Go in an active sketch plane

Run the following script:
Then we get the cycloidal gear profile


To adapt to the motor we are using, we need to edit the model a bit.


Last updated
Was this helpful?