python之求解螺旋槽截线

1、模型建立

建立3个数学模型:

①用于加工微钻头螺旋面刀具的数学模型;

②微钻头螺旋槽的数学模型;

③基本啮合条件的数学模型。

在这3个数学模型的基础上,进一步得出螺旋槽径向截面的数学模型。

具体过程参见文献:周志雄, 袁建军, 林丞. 微钻头螺旋槽的数学模型及其 CAD 方法[J]. 中国机械工程, 2000, 11(11): 1284-1288.

2、坐标系与砂轮

下图为模型所用的坐标系:

python之求解螺旋槽截线_第1张图片

python之求解螺旋槽截线_第2张图片

下图为一种砂轮廓形:单斜边砂轮

python之求解螺旋槽截线_第3张图片

下图为一种砂轮廓形:单圆弧砂轮

python之求解螺旋槽截线_第4张图片

下图为一种砂轮廓形:两圆弧砂轮

python之求解螺旋槽截线_第5张图片

3、python求解

基于单斜边砂轮,python求解代码:

import sympy as sy
import numpy as np
import matplotlib.pyplot as plt
# R为钻头半径
# delta为螺旋角
R,delta=sy.symbols('R,delta')
# ax,ay,az为砂轮坐标系原点在机床坐标系里的位置
# lamda为砂轮偏置角
ax,ay,az,lamda=sy.symbols('ax,ay,az,lamda')
# R0为砂轮最大外径
# u1为砂轮宽度
# u2为砂轮外缘宽度
# yita为砂轮锥角
# u为砂轮厚度参数,可控
# v为砂轮角度参数,可控
R0,u,u1,u2,yita,v=sy.symbols('R0,u,u1,u2,yita,v')
# t为钻心半厚
# beta为坐标系相对转角
# xc,yc,zc为钻头外缘转接点
t,beta,xc,yc,zc=sy.symbols('t,beta,xc,yc,zc')
# 砂轮轮廓函数
def g1(u):
    # if u<=u2 and u>=0:
    #     return R0
    # if u<=u1 and u>u2:
        return R0-(u-u2)*sy.cot(yita)
def g2(u):
    return u
# 砂轮的参数方程,工具坐标系XtYtZt
Rw=sy.Matrix([g1(u)*sy.cos(v),g1(u)*sy.sin(v),g2(u)])
# 砂轮的参数方程,机床坐标系XmYmZm
TtoM = sy.Matrix([[1,0,0],[0,sy.cos(lamda),-sy.sin(lamda)],[0,sy.sin(lamda),sy.cos(lamda)]])
Trans1=sy.Matrix([ax,ay,az])
Rf=TtoM*Rw+Trans1
# 依据啮合条件,给定u,求出v
k=R/sy.tan(delta)
Ad_u=-sy.diff(g2(u),u)*(ax*sy.cos(lamda)+k*sy.sin(lamda))
Bd_u=ay*sy.diff(g2(u),u)-(g1(u)*sy.diff(g1(u),u)+g2(u)*sy.diff(g2(u),u))*sy.sin(lamda)
Cd_u=sy.diff(g1(u),u)*(-ax*sy.sin(lamda)+k*sy.cos(lamda))
# 暂时无法求出解析解
# sy.solve(Ad_u*sy.sin(v)+Bd_u*sy.cos(v)+Cd_u,v)
f=Ad_u*sy.sin(v)+Bd_u*sy.cos(v)+Cd_u
x=np.arange(0,4,0.04)
y1=[]
y2=[]
for i in x:
    ans=sy.solve(f.subs([(u,i),(ax,67.5625),(ay, 0),(R,0.5/2),(R0,67.5),(delta,sy.pi/6),(lamda,sy.pi/3),(yita,sy.pi / 4),(u2,0)]),v)
    y1.append(ans[0])
    y2.append(ans[1])


# 螺旋槽径向截面方程
vw=Rf[2]/k
H=sy.Matrix([Rf[0]*sy.cos(vw)+Rf[1]*sy.sin(vw),-Rf[0]*sy.sin(vw)+Rf[1]*sy.cos(vw),0])
X=[]
Y=[]
for (i,j) in zip(x,y1):
    h0=H[0].evalf(subs={u:i,v:j,ax:67.5625,ay: 0,az:0,R:0.5/2,R0: 67.5,delta:sy.pi/6,lamda:sy.pi/3,yita: sy.pi / 4,u2:0})
    h1=H[1].evalf(subs={u:i,v:j,ax:67.5625,ay: 0,az:0,R:0.5/2,R0: 67.5,delta:sy.pi/6,lamda:sy.pi/3,yita: sy.pi / 4,u2:0})
    if (h0**2+h1**2)<=(0.5/2)**2:
        X.append(h0)
        Y.append(h1)
for (i,j) in zip(x,y2):
    h0=H[0].evalf(subs={u:i,v:j,ax:67.5625,ay: 0,az:0,R:0.5/2,R0: 67.5,delta:sy.pi/6,lamda:sy.pi/3,yita: sy.pi / 4,u2:0})
    h1=H[1].evalf(subs={u:i,v:j,ax:67.5625,ay: 0,az:0,R:0.5/2,R0: 67.5,delta:sy.pi/6,lamda:sy.pi/3,yita: sy.pi / 4,u2:0})
    if (h0**2+h1**2)<=(0.5/2)**2:
        X.append(h0)
        Y.append(h1)
fig=plt.figure()
plt.rcParams['xtick.direction'] = 'in'  # 将x周的刻度线方向设置向内
plt.rcParams['ytick.direction'] = 'in'  # 将y轴的刻度方向设置向内
# 圆的基本信息
# 1.圆半径
r = 0.5/2
# 2.圆心坐标
a, b = (0., 0.)
# ==========================================
# 参数方程画圆形
theta = np.arange(0, 2*np.pi, 0.01)
x = a + r * np.cos(theta)
y = b + r * np.sin(theta)
plt.plot(x,y,c='red')
# ==========================================
# 画螺旋槽截线
plt.plot(X,Y,c='blue')
plt.tight_layout()
plt.show()
# 坐标变换
Wto=sy.Matrix([[sy.cos(beta),-sy.sin(beta),0],[sy.sin(beta),sy.cos(beta),0],[0,0,1]])
Trans2=sy.Matrix([0,0,zc])
r=Wto*sy.Matrix([-Rf[0],Rf[1],Rf[2]])+Trans2

python之求解螺旋槽截线_第6张图片

import sympy as sy
import numpy as np
import matplotlib.pyplot as plt
import time
from sympy.plotting import plot3d_parametric_surface
from sympy.plotting import plot
import math
# R为钻头半径
# delta为螺旋角
R,delta=sy.symbols('R,delta')
# ax,ay,az为砂轮坐标系原点在机床坐标系里的位置
# lamda为砂轮偏置角
ax,ay,az,lamda=sy.symbols('ax,ay,az,lamda')
# R0为砂轮最大外径
# u1为砂轮宽度
# u2为砂轮外缘宽度
# yita为砂轮锥角
# u为砂轮厚度参数,可控
# v为砂轮角度参数,可控
R0,u,u1,u2,yita,v=sy.symbols('R0,u,u1,u2,yita,v')
# t为钻心半厚
# beta为坐标系相对转角
# xc,yc,zc为钻头外缘转接点
t,beta,xc,yc,zc=sy.symbols('t,beta,xc,yc,zc')
#钻径截面圆参数
a=sy.symbols('a')
# 砂轮轮廓函数
def g1(u):
    # if u<=u2 and u>=0:
    #     return R0
    # if u<=u1 and u>u2:
        return R0-(u-u2)*sy.cot(yita)
def g2(u):
    return u
# 砂轮的参数方程,工具坐标系XtYtZt
Rw=sy.Matrix([g1(u)*sy.cos(v),g1(u)*sy.sin(v),g2(u)])
#砂轮作图
#f0=Rw[0].subs([(R0,67.5),(yita,sy.pi/4),(u2,0)])
#f1=Rw[1].subs([(R0,67.5),(yita,sy.pi/4),(u2,0)])
#f2=Rw[2]
#plot3d_parametric_surface(f0,f1,f2,(u, 0, 4), (v, 0, 2*math.pi),xlabel='x',ylabel='y',zlabel='z')


# 砂轮的参数方程,机床坐标系XmYmZm
TtoM = sy.Matrix([[1,0,0],[0,sy.cos(lamda),-sy.sin(lamda)],[0,sy.sin(lamda),sy.cos(lamda)]])
Trans1=sy.Matrix([ax,ay,az])
Rf=TtoM*Rw+Trans1
# 依据啮合条件,给定u,求出v
k=R/sy.tan(delta)
Ad_u=-sy.diff(g2(u),u)*(ax*sy.cos(lamda)+k*sy.sin(lamda))
Bd_u=ay*sy.diff(g2(u),u)-(g1(u)*sy.diff(g1(u),u)+g2(u)*sy.diff(g2(u),u))*sy.sin(lamda)
Cd_u=sy.diff(g1(u),u)*(-ax*sy.sin(lamda)+k*sy.cos(lamda))

#作图,看根
#x=np.arange(0,4,0.5)
#for i in x:
#    A=Ad_u.subs([(u,i),(ax,65.1272),(ay, 0),(R,0.5/2),(R0,67.5),(delta,sy.pi/6),(lamda,sy.pi/3),(yita,sy.pi / 4),(u2,0)])
#    B=Bd_u.subs([(u,i),(ax,65.1272),(ay, 0),(R,0.5/2),(R0,67.5),(delta,sy.pi/6),(lamda,sy.pi/3),(yita,sy.pi / 4),(u2,0)])
#    C=Cd_u.subs([(u,i),(ax,65.1272),(ay, 0),(R,0.5/2),(R0,67.5),(delta,sy.pi/6),(lamda,sy.pi/3),(yita,sy.pi / 4),(u2,0)])
#    plot(A*sy.sin(v)+B*sy.cos(v)+C, line_color='red')

start=time.perf_counter()
# 暂时无法求出解析解
# sy.solve(Ad_u*sy.sin(v)+Bd_u*sy.cos(v)+Cd_u,v)
f=Ad_u*sy.sin(v)+Bd_u*sy.cos(v)+Cd_u
#不是所有的截圆都起切削作用
#求相切截圆对应的u
d=((ay*sy.tan(lamda))**2+ay**2+ax**2)**0.5-R/sy.cos(lamda)
u_up=(R0-d)*sy.tan(yita)
up=u_up.subs([(ax,67.5625),(ay,0),(az,0),(R,0.5/2),(R0,67.5),(lamda,sy.pi/3),(yita,sy.pi / 4)])
x=np.arange(0,up,0.005)
y1=[]
y2=[]
f1=f.subs([(ax,67.5625),(ay,0),(R,0.5/2),(R0,67.5),(delta,sy.pi/6),(lamda,sy.pi/3),(yita,sy.pi / 4),(u2,0)])
for i in x:
    ans=sy.solveset(f1.subs([(u,i)]),v,domain=sy.Interval(0, 2*sy.pi))
    for j in ans:
        y1.append(i)
        y2.append(j)


# 螺旋槽径向截面方程
vw=Rf[2]/k
H=sy.Matrix([Rf[0]*sy.cos(vw)+Rf[1]*sy.sin(vw),-Rf[0]*sy.sin(vw)+Rf[1]*sy.cos(vw),0])
X=[]
Y=[]
H0=H[0].subs([(ax,67.5625),(ay,0),(az, 0),(R,0.5/2),(R0,67.5),(delta,sy.pi/6),(lamda,sy.pi/3),(yita,sy.pi / 4),(u2,0)])
H1=H[1].subs([(ax,67.5625),(ay,0),(az, 0),(R,0.5/2),(R0,67.5),(delta,sy.pi/6),(lamda,sy.pi/3),(yita,sy.pi / 4),(u2,0)])
for (i,j) in zip(y1,y2):
    h0=H0.subs([(u,i),(v,j)])
    h1=H1.subs([(u,i),(v,j)])
    if (h0**2+h1**2)<=(0.5/2)**2:
        X.append(h0)
        Y.append(h1)
print("execute time:",time.perf_counter()-start)
fig=plt.figure(figsize=(5,5))
plt.rcParams['xtick.direction'] = 'in'  # 将x周的刻度线方向设置向内
plt.rcParams['ytick.direction'] = 'in'  # 将y轴的刻度方向设置向内
# 圆的基本信息
# 1.圆半径
r = 0.5/2
# 2.圆心坐标
a, b = (0., 0.)
# ==========================================
# 参数方程画圆形
theta = np.arange(0, 2*np.pi, 0.01)
x = a + r * np.cos(theta)
y = b + r * np.sin(theta)
plt.plot(x,y,c='red')
# ==========================================
# 画螺旋槽截线
plt.plot(X,Y,c='blue')
plt.tight_layout()
plt.show()
# 坐标变换
Wto=sy.Matrix([[sy.cos(beta),-sy.sin(beta),0],[sy.sin(beta),sy.cos(beta),0],[0,0,1]])
Trans2=sy.Matrix([0,0,zc])
r=Wto*sy.Matrix([-Rf[0],Rf[1],Rf[2]])+Trans2

python之求解螺旋槽截线_第7张图片

4、结果分析

如图所示,并没有得到理想的结果,原因为单圆弧砂轮廓形并非处处可导,而建立方程过程中却利用了导数信息,导致导数不连续处无法得到正确结果

你可能感兴趣的:(python,numpy,matplotlib)