首页/文章/ 详情

参数化几何建模-直齿轮

10小时前浏览1
内容提示:
1)直齿轮基本几何参数
2)渐开线数学方程;
3)Abaqus Python 脚本实现;

1. 基本几何参数计算

给定齿轮的核心设计参数,具体包括模数(m)、齿数(z)、分度圆压力角(alpha,标准值为 20 度)、齿宽(b)、齿顶高系数(ha,标准值为1.0)、顶隙系数(c,标准值为0.25)、齿根圆角半径系数(rf,标准推荐值为0.38)。
相关的几何尺寸计算公式如下,
分度圆半径:r = m*z/2;
基圆半径:r_b = r*cos(alpha);
齿顶圆半径:r_a = r + ha*m;
齿根圆半径:r_f = r - (ha+c)* m;
齿根圆角半径:r_k = rf*m;

2. 渐开线函数

渐开线函数为,

inv(α) = tan(α) - α

其中,inv(α)表示渐开线上某点的‌展角‌(弧度),该值随压力角 α(弧度)的增大而增大。

3. Python 脚本核心构建流程

在 Abaqus 中生成三维齿轮模型包含 4 个主要步骤:
1)计算直齿轮的基本几何参数及单齿轮廓离散点集;
2)草图绘制(ConstrainedSketch),生成齿根圆彩图,利用 Spline 拟合渐开线,并连接齿根圆弧,生成单个齿廓;
3)实体拉伸,将基圆和单个齿形轮廓拉伸;
4)阵列与合并(Merge):按齿数将单齿圆周阵列,合并生成三维齿轮实体。

4. Python 脚本核心代码

1)齿轮几何参数计算及齿廓离散点集获取






























































import mathfrom abaqus import *from abaqusConstants import *import partimport sketchimport assemblydef calculate_gear_base_geometry(m, z, alpha_deg=20.0, ha_star=1.0, c_star=0.25, rf_star=0.38, num_inv=40):    """    计算直齿轮基本几何参数及单齿轮廓点集    """    alpha_rad = math.radians(alpha_deg)          # 压力角 (弧度)    r = (m * z) / 2.0                            # 分度圆半径    rb = r * math.cos(alpha_rad)                 # 基圆半径    ra = r + ha_star * m                         # 齿顶圆半径    rf = r - (ha_star + c_star) * m              # 齿根圆半径    r_k = rf_star * m                            # 齿根圆角半径        inv_alpha = math.tan(alpha_rad) - alpha_rad  # 渐开线函数    theta_0 = math.pi / (2.0 * z)                # 半齿厚角    r_start_inv = max(rb, rf)                    # 渐开线起点半径        # 1. 右侧渐开线节点计算 (从 r_start_inv 到 ra)    right_inv = []    for i in range(num_inv):        R = r_start_inv + (ra - r_start_inv) * i / float(num_inv - 1)        phi_R = math.acos(rb / R)        inv_phi_R = math.tan(phi_R) - phi_R        theta_R = theta_0 + inv_alpha - inv_phi_R        x = R * math.cos(theta_R)        y = R * math.sin(theta_R)        right_inv.append((x, y))            theta_flank_right = theta_0 + inv_alpha       # 右侧齿侧切线极角    r_tangent = math.sqrt(rf**2 + 2.0 * rf * r_k)  # 切点极径        # 2. 齿根圆角解析特征几何参数 (右侧)    delta_theta = math.asin(r_k / (rf + r_k))    theta_C_right = theta_flank_right + delta_theta        # 右圆角圆心与切点    C_R0 = ((rf + r_k) * math.cos(theta_C_right), (rf + r_k) * math.sin(theta_C_right))    P_root_R0 = (rf * math.cos(theta_C_right), rf * math.sin(theta_C_right))    P_flank_R0 = (r_tangent * math.cos(theta_flank_right), r_tangent * math.sin(theta_flank_right))        # 渐开线起点点位 (右/左)    P_inv_start_R0 = (r_start_inv * math.cos(theta_flank_right), r_start_inv * math.sin(theta_flank_right))    P_inv_start_L0 = (r_start_inv * math.cos(-theta_flank_right), r_start_inv * math.sin(-theta_flank_right))        # 左侧镜像参数 (关于 X 轴对称)    C_L0 = (C_R0[0], -C_R0[1])    P_root_L0 = (P_root_R0[0], -P_root_R0[1])    P_flank_L0 = (P_flank_R0[0], -P_flank_R0[1])    left_inv = [(x, -y) for (x, y) in right_inv]        geom_info = {        'm': m, 'z': z, 'r': r, 'rb': rb, 'ra': ra, 'rf': rf, 'r_k': r_k,        'r_tangent': r_tangent, 'r_start_inv': r_start_inv,        'C_R0': C_R0, 'P_root_R0': P_root_R0, 'P_flank_R0': P_flank_R0, 'P_inv_start_R0': P_inv_start_R0, 'right_inv': right_inv,        'C_L0': C_L0, 'P_root_L0': P_root_L0, 'P_flank_L0': P_flank_L0, 'P_inv_start_L0': P_inv_start_L0, 'left_inv': left_inv    }        return geom_info
2)创建直齿轮



















































































def create_spur_gear_part(model_name, part_name, m, z, width, alpha_deg=20.0, ha_star=1.0, c_star=0.25, rf_star=0.38, num_inv=40):    """    在 Abaqus 中创建直齿轮 Part (通过基圆柱 + 单齿阵列 + 布尔合并)    """    if model_name in mdb.models:        model = mdb.models[model_name]    else:        model = mdb.Model(name=model_name)            g = calculate_gear_base_geometry(m, z, alpha_deg, ha_star, c_star, rf_star, num_inv)    # 计算草图尺寸 (基于齿顶圆半径)    sketch_size = g['ra'] * 3.0        # =========================================================================    # 步骤 1:创建齿根圆柱临时 Part    # =========================================================================    s_base = model.ConstrainedSketch(name=part_name + '_Base_Sketch', sheetSize=sketch_size)    s_base.CircleByCenterPerimeter(center=(0.00.0), point1=(g['rf'], 0.0))    part_base = model.Part(name=part_name + '_Base', dimensionality=THREE_D, type=DEFORMABLE_BODY)    part_base.BaseSolidExtrude(sketch=s_base, depth=width)    del s_base        # =========================================================================    # 步骤 2:创建单个轮廓齿Part    # =========================================================================    s_tooth = model.ConstrainedSketch(name=part_name + '_Tooth_Sketch', sheetSize=sketch_size)        # 1) 左侧齿根圆角解析弧    s_tooth.ArcByCenterEnds(center=g['C_L0'], point1=g['P_root_L0'], point2=g['P_flank_L0'], direction=CLOCKWISE)        # 2) 左侧齿侧 (Line + Spline)    if g['r_tangent'] < g['r_start_inv']:        s_tooth.Line(point1=g['P_flank_L0'], point2=g['P_inv_start_L0'])        s_tooth.Spline(points=tuple(g['left_inv']))    else:        s_tooth.Spline(points=tuple([g['P_flank_L0']] + g['left_inv']))            # 3) 齿顶圆弧    s_tooth.ArcByCenterEnds(center=(0.00.0), point1=g['left_inv'][-1], point2=g['right_inv'][-1], direction=COUNTERCLOCKWISE)        # 4) 右侧齿侧 (Spline + Line)    right_inv_reversed = list(reversed(g['right_inv']))    if g['r_tangent'] < g['r_start_inv']:        s_tooth.Spline(points=tuple(right_inv_reversed))        s_tooth.Line(point1=g['P_inv_start_R0'], point2=g['P_flank_R0'])    else:        s_tooth.Spline(points=tuple(right_inv_reversed + [g['P_flank_R0']]))            # 5) 右侧齿根圆角解析弧    s_tooth.ArcByCenterEnds(center=g['C_R0'], point1=g['P_flank_R0'], point2=g['P_root_R0'], direction=CLOCKWISE)        # 6) 封闭底部圆弧    s_tooth.ArcByCenterEnds(center=(0.00.0), point1=g['P_root_R0'], point2=g['P_root_L0'], direction=CLOCKWISE)        part_tooth = model.Part(name=part_name + '_SingleTooth', dimensionality=THREE_D, type=DEFORMABLE_BODY)    part_tooth.BaseSolidExtrude(sketch=s_tooth, depth=width)    del s_tooth        # =========================================================================    # 步骤 3:在 Assembly 中进行周向阵列与布尔合并    # =========================================================================    asm = model.rootAssembly    inst_base = asm.Instance(name='Inst-Base', part=part_base, dependent=ON)    inst_tooth = asm.Instance(name='Inst-Tooth-0', part=part_tooth, dependent=ON)        # 默认Z轴为旋转轴,周向阵列单齿 Instance    if z > 1:        asm.RadialInstancePattern(            instanceList=('Inst-Tooth-0',),            number=z,            totalAngle=360.0        )            # 获取所有装配实例进行布尔合并    all_insts = [asm.instances[inst_name] for inst_name in asm.instances.keys()]        gear_part = asm.InstanceFromBooleanMerge(        name=part_name,                   # 合并后生成的新 Part 名称        instances=tuple(all_insts),       # 参与合并的所有实体 Instance        domain=GEOMETRY                   # 针对几何实体进行布尔合并    )        return gear_part

5. Python 脚本运行

将上述函数合并到一个文件(模块),添加如下代码。



# testif __name__ == "__main__":    create_spur_gear_part("gear","g1",1,23,12)
可以在VS Code中以GUI模式运行(方法详见这里),还可以直接运行脚本(参见Python如何与Abaqus/CAE Kernel交互),还可以通过Command Line(命令行界面)运行。
再者,将脚本文件放入Abaqus的工作目录里,在Command Line(命令行界面)导入该模块,执行相应测试代码,如下图所示。

执行上述代码,会创建基圆和单个齿廓草图,如下图所示。
创建基圆圆柱、单个齿以及整个完整齿轮。



来源:兵哥讲力学
AbaqusDeformpythonUM装配
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-08-27
最近编辑:10小时前
兵心依旧
博士 兵哥出品,必是精品
获赞 81粉丝 521文章 55课程 3
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈