简介:一份面向机械设计、机器人及精密机械从业者的论文PDF,提出基于CATIA与MATLAB的凸轮参数化三维建模与运动仿真方法,重点解决复杂凸轮轮廓设计精度不足、运动参数获取困难等传统设计痛点。整个资源仅含1个PDF文档,大小1.83MB,内容完整收录了凸轮轮廓曲线方程推导、MATLAB点云数据生成程序、CATIA参数化建模及运动仿真流程等关键章节,并附有程序代码与轮廓图示。目前已有424人学习浏览,尤其适合需要完成相关课程设计、毕业设计或实际工程项目的高校学生与工程师参考。通过阅读该文献,读者能够掌握从解析法计算凸轮理论/实际廓线、输出三维坐标点云,到导入CATIA进行参数化建模与运动仿真的完整技术路线,并了解如何将所得点云数据用于数控加工,具备较强的工程实用价值与行业参考意义。
1. 基于CATIA和MATLAB的凸轮参数化三维建模及运动仿真:先搞清楚数据从哪来
给一个凸轮做参数化三维建模和运动仿真,多数人的第一反应是打开CATIA画基圆、画轮廓、拉伸。如果只为了出图,这个做法没问题;但一旦要调整行程、偏距或滚子半径,整条廓线就得重画。这个标题把CATIA和MATLAB并排放,其实是在说一个更本质的思路:凸轮的几何不是画出来的,而是算出来的。CATIA负责把算好的廓线变成可加工、可装配的实体,MATLAB负责把从动件运动规律、基圆半径、偏距、滚子半径这些输入变成离散的坐标数据。这条链路聚焦盘形凸轮的偏置直动滚子从动件结构,这也是工业现场最常见、最能讲清参数化逻辑的结构。做电子凸轮、追飞剪的工程师同样可以按这套思路,把计算结果直接落成控制器的凸轮表。
2. 凸轮轮廓的解析基础:从运动规律到实际廓线
2.1 从动件运动规律:凸轮廓线的一切都从这里开始
任何一条凸轮廓线背后都有一个位移规律 s(φ),φ 是凸轮转角。建模的第一步不是画图,而是确定这个 s(φ)。工程上常用的候选规律就那么几种,选型的核心差异在加速度连续性上,直接决定机构的冲击和噪声。
| 运动规律 | 速度连续性 | 加速度连续性 | 典型用途 |
|---|---|---|---|
| 等速 | 连续 | 不连续(起止点无穷大) | 低速、对冲击不敏感的送料 |
| 等加速等减速 | 连续 | 不连续(加速度突变) | 中速轻载 |
| 余弦/简谐 | 连续 | 不连续(起止点有跃变) | 中低速,要求不高的场合 |
| 摆线 | 连续 | 连续 | 中高速通用 |
| 五次多项式(3-4-5) | 连续 | 连续且可设计边界条件 | 高速凸轮、需要精确控制冲击 |
凸轮转速上去之后,优先选摆线或五次多项式。五次多项式的好处是能在推程始末同时把位移、速度、加速度六个边界条件归零。六个条件解一元五次方程,得到的就是标准的 3-4-5 多项式:
s = h(10τ³ − 15τ⁴ + 6τ⁵),τ = φ / β₀
其中 h 是行程,β₀ 是推程运动角。这个式子对 φ 求一阶导得到速度项,二阶导得到加速度项,回程段只要把 h 换成从 h 衰减到 0 的对称形式即可。
2.2 理论廓线与实际廓线:滚子中心线和凸轮工作面不是一回事
盘形凸轮有两种廓线要区分清楚。理论廓线是滚子中心的运动轨迹,实际廓线才是凸轮零件的表面。对偏置直动滚子从动件,设凸轮逆时针转动,从动件导路偏置距离为 e,基圆半径 r_b,滚子半径 r_r,则有:
s₀ = √(r_b² − e²)
理论廓线坐标:
x_t = (s₀ + s)·sinφ + e·cosφ
y_t = (s₀ + s)·cosφ − e·sinφ
实际廓线是理论廓线沿法线方向等距偏移一个滚子半径 r_r。作法线偏移时要用到理论廓线的一阶导数:
x_c = x_t + r_r·(dy_t/dφ) / N
y_c = y_t − r_r·(dx_t/dφ) / N
N = √((dx_t/dφ)² + (dy_t/dφ)²)
公式里 e 的符号不能随手写死。凸轮转向使从动件偏置侧产生“附加推程”作用时取正,反之取负;工程上习惯让偏置方向与凸轮转向配合,使推程压力角减小。符号反了,压力角计算和实际廓线都会偏,后面第 6 章会看到它怎么影响调参。
2.3 建模链路的关键参数和流转关系
整套参数化三维建模需要提前定好的输入参数如下:
| 参数 | 符号 | 单位 | 作用 |
|---|---|---|---|
| 基圆半径 | r_b | mm | 决定凸轮尺寸和压力角 |
| 滚子半径 | r_r | mm | 决定实际廓线偏移量 |
| 偏距 | e | mm | 影响推程/回程压力角 |
| 行程 | h | mm | 从动件最大位移 |
| 推程角 | β₀ | deg | 升程对应的凸轮转角 |
| 远休止角 | β₁ | deg | 高位停留转角 |
| 回程角 | β₂ | deg | 降程对应的凸轮转角 |
| 近休止角 | β₃ | deg | 低位停留转角 |
| 采样点数 | n | 个 | 决定廓线数据密度 |
数据流转关系是:运动规律 → s(φ) 和 ds/dφ → 理论廓线 → 等距偏移 → 实际廓线 → CATIA 样条建模 → 运动仿真验证。MATLAB 承担前三步,CATIA 从实际廓线坐标开始接管。这个分工不是随意的,因为等距偏移在曲面软件里容易出尖角或自交,而在 MATLAB 里对每条廓线做解析计算更可控。
提示:偏距 e 的值不要超过基圆半径 r_b,否则 s₀ 变成虚数,几何关系不成立。
3. 用MATLAB生成凸轮轮廓数据的完整脚本
3.1 一个可直接复用的凸轮廓线生成脚本
下面这段脚本是整条链路的核心,它一次完成位移、速度、加速度、理论廓线和实际廓线的计算,并输出 Excel 表与 CATIA 用的坐标文件。角度单位统一用弧度,这是最容易踩的坑,脚本里已处理。
%% cam_profile.m 盘形凸轮轮廓与运动学数据生成 clear; clc; % ---------------- 输入参数 ---------------- deg = pi/180; rb = 50; % 基圆半径 mm rr = 6; % 滚子半径 mm e = 0; % 偏距 mm,正方向见2.2节说明 h = 20; % 从动件行程 mm phi0 = 120*deg; % 推程运动角 rad phi1 = 120*deg; % 远休止角 rad phi2 = 120*deg; % 回程运动角 rad omega = 60; % 凸轮转速 r/min step = 1*deg; % 采样步长 rad num = round(2*pi/step); phi = (0:num-1)' * step; % 凸轮转角列向量 rad s = zeros(num,1); % 位移 v = zeros(num,1); % 速度 a = zeros(num,1); % 加速度 dsdphi = zeros(num,1); % 位移对转角的一阶导 d2sdphi = zeros(num,1); % 位移对转角的二阶导 w = omega * 2*pi / 60; % 角速度 rad/s % ---------------- 分区计算运动规律 ---------------- for i = 1:num p = mod(phi(i), 2*pi); if p < phi0 % 推程 0 -> h tau = p / phi0; s(i) = h * (10*tau^3 - 15*tau^4 + 6*tau^5); dsdphi(i) = h * (30*tau^2 - 60*tau^3 + 30*tau^4) / phi0; d2sdphi(i) = h * (60*tau - 180*tau^2 + 120*tau^3) / (phi0^2); elseif p < phi0 + phi1 % 远休止 s(i) = h; dsdphi(i) = 0; d2sdphi(i) = 0; elseif p < phi0 + phi1 + phi2 % 回程 h -> 0 tau = (p - phi0 - phi1) / phi2; s(i) = h * (1 - (10*tau^3 - 15*tau^4 + 6*tau^5)); dsdphi(i) = -h * (30*tau^2 - 60*tau^3 + 30*tau^4) / phi2; d2sdphi(i) = -h * (60*tau - 180*tau^2 + 120*tau^3) / (phi2^2); else % 近休止 s(i) = 0; dsdphi(i) = 0; d2sdphi(i) = 0; end v(i) = w * dsdphi(i); % mm/s a(i) = w^2 * d2sdphi(i); % mm/s^2 end这段代码的分段逻辑和五次多项式的六个边界条件是严格对应的。推程用标准 3-4-5 多项式,回程用它的镜像形式,这样从动件在推程始末、回程始末的一阶导和二阶导都归零,加速度曲线没有突变。速度 v 和加速度 a 是在位移函数求导之后乘上角速度 w 得到的,因此量纲正确。
计算中phi0、phi1、phi2全部用弧度参与分母运算,tau是无量纲比例,所以dsdphi的单位是 mm/rad。如果这里直接用度数算,v 和 a 会整体差一个 π/180 的系数,仿真出来曲线形状对但幅值全错。这是检查结果时首先要排查的点。
3.2 从运动规律映射到实际廓线坐标
运动规律算完后,按第 2 章的公式计算理论廓线和实际廓线:
% ---------------- 廓线坐标计算 ---------------- s0 = sqrt(rb^2 - e^2); xt = (s0 + s) .* sin(phi) + e .* cos(phi); yt = (s0 + s) .* cos(phi) - e .* sin(phi); % 理论廓线一阶导数(对 phi 求导) dx = dsdphi .* sin(phi) + (s0 + s) .* cos(phi) - e .* sin(phi); dy = dsdphi .* cos(phi) - (s0 + s) .* sin(phi) - e .* cos(phi); N = sqrt(dx.^2 + dy.^2); % 实际廓线:沿法线方向向外偏移 rr xc = xt + rr .* dy ./ N; yc = yt - rr .* dx ./ N; % ---------------- 结果导出 ---------------- phi_deg = phi / deg; T = table(phi_deg, s, v, a, xt, yt, xc, yc, ... 'VariableNames', {'phi_deg','s_mm','v_mms','a_mms2', ... 'x_theory','y_theory','x_cam','y_cam'}); writetable(T, 'cam_data.xlsx'); % CATIA 建模用的实际廓线坐标,首尾点位重合便于封闭样条 xy_cam = [xc, yc]; xy_cam(end+1, :) = xy_cam(1, :); writematrix(xy_cam, 'cam_profile_xy.csv');法线方向的选取要特别注意。这里取的理论廓线法向量是 (dy/dφ, −dx/dφ),对逆时针旋转的凸轮来说,它指向廓线外侧。实际廓线是接触面,必须生成在滚子包络的外侧,方向取反会得到一条比基圆还小的错误曲线,CATIA 里拉伸出来形状很奇怪,这是排查时第二个高频问题。
采样步长step默认 1°,一周 360 个点,对多数 50mm 级基圆凸轮足够。如果基圆半径超过 80mm,建议加密到 0.5°;如果凸轮转速很高、需要给控制器做插值表,也建议加密。文件输出上,cam_data.xlsx给人和后续分析用,cam_profile_xy.csv直接喂给 CATIA。writematrix是 R2019a 之后引入的函数,老版本 MATLAB 可以换成csvwrite('cam_profile_xy.csv', xy_cam),效果一样。
3.3 曲线检查:先看三张图再进CATIA
数据生成之后不要急着导到 CATIA,先画三条曲线目检:
figure; subplot(3,1,1); plot(phi_deg, s); ylabel('位移 mm'); grid on; subplot(3,1,2); plot(phi_deg, v); ylabel('速度 mm/s'); grid on; subplot(3,1,3); plot(phi_deg, a); ylabel('加速度 mm/s^2'); grid on;位移曲线应该只在 0 到 h 之间变化,推程段单调上升,回程段单调下降,远休止和近休止段严格水平。速度曲线在推程起止点应为零,不应有跳变。加速度曲线是五次多项式优劣的直接证据:全程连续,起止点为零。如果这三条曲线有任何一处不满足,问题几乎都出在分段判定的边界值上,比如p < phi0把等于 phi0 的点划进了远休止段,会导致该点附近出现一个点的跳变。
4. 在CATIA里做参数化三维建模
4.1 两条建模路线:直接样条和方程驱动怎么选
CATIA 建模部分有两条路线。路线 A 是把 MATLAB 生成的cam_profile_xy.csv读进 CATIA,用样条线连接坐标点,再拉伸成实体。这条路线对 CATIA 版本和模块要求最低,V5 的普通机械设计加创成式外形设计就能做,适合大多数工程师。路线 B 是在 CATIA 里建立设计表,把基圆半径、滚子半径、行程等作为用户参数,点位坐标由设计表驱动,改参数后模型自动更新。路线 B 的“参数化”更彻底,但前提是你已经搭好了路线 A 的骨架,再用设计表把点的坐标替换成表格驱动。
我一般建议先用路线 A 把模型跑通,确认廓线形状和运动规律都对,再决定要不要升级成设计表驱动。一来是路线 A 的排错链路短,二来是多数图纸改版只是改几个关键参数,设计表的收益没有那么夸张。
4.2 用CATIA宏批量生成样条线控制点
720 个坐标点不可能在 CATIA 里手工输入。常见做法是用 CATIA 的 VBA 宏读 Excel 或 CSV 批量生成点。下面这段宏读cam_profile_xy.csv,在 GSD 工作台里逐个创建点,生成后用样条线串联:
Sub CreateCamPoints() Dim partDoc As PartDocument Set partDoc = CATIA.ActiveDocument Dim part As Part Set part = partDoc.Part Dim hs As HybridShapeFactory Set hs = part.HybridShapeFactory Dim hb As HybridBody Set hb = part.HybridBodies.Add() hb.Name = "CamProfilePoints" ' 打开CSV文件 Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim ts As Object Set ts = fso.OpenTextFile("D:\cam_profile_xy.csv", 1) ' ForReading Dim lineStr As String, arr() As String, pt As HybridShapePointCoord Dim x As Double, y As Double ' 跳过表头(如果没有表头,去掉下面这一行) ts.ReadLine Do While Not ts.AtEndOfStream lineStr = ts.ReadLine arr = Split(lineStr, ",") x = CDbl(arr(0)) y = CDbl(arr(1)) Set pt = hs.AddNewPointCoord(x, y, 0#) hb.AppendHybridShape pt Loop ts.Close part.Update MsgBox "点创建完成" End Sub这段宏依赖 Windows 脚本运行时和 CATIA 的自动化接口,运行前把 CSV 路径改成实际路径。如果 CSV 没有表头,删掉ts.ReadLine那一行即可。生成的每个HybridShapePointCoord都挂在同一个几何体下,然后在创成式外形设计里点“样条线”图标,逐个选中这些点,勾选“封闭样条线”,就得到完整的闭合凸轮轮廓。
提示:CATIA 宏批量创建 700 多个点可能需要几秒到十几秒,期间界面会卡住,属正常现象,不要重复点击。
4.3 从廓线到实体:拉伸、中心孔与单位检查
轮廓样条线生成后,后续步骤就常规了。如果样条线在创成式外形设计里,用“填充”命令把它变成曲面,再通过“接合”和“封闭曲面”转为实体;如果直接进入零件设计,可以先用“分割(Split)”或“缝合(Sew)”生成实体。之后用“凸台(Pad)”拉伸到凸轮厚度,比如 25mm,再建一个轴孔草图,完成中心孔和键槽。
这一步最常见的坑是单位。CATIA 默认长度单位是 mm,MATLAB 导出的坐标也按 mm 写,两者一致。如果有人在 MATLAB 里先把坐标换算成 m,进 CATIA 后模型会小 1000 倍,拉伸后几乎看不见实体。排查时优先看点的坐标范围是否和基圆半径匹配,基圆 50mm 的凸轮,坐标应该在 ±60mm 内,不会跑到 ±0.06。
实体建好后,凸轮的参数化建模就算完成。但“参数化”要真正有实用价值,记得把基圆半径、滚子半径、偏距、行程这几个量做成 CATIA 用户参数,后续设计表驱动时它们才有地方挂。
5. 基于CATIA和MATLAB的凸轮运动仿真
5.1 MATLAB端运动学仿真:验证压力角和位移曲线
运动仿真的前半场在 MATLAB 里做,验证对象是运动规律本身。第 3 章生成的位移、速度、加速度曲线就是运动学仿真的输出。在此基础上再补两个检查:从动件位移的最大值是否精确等于行程 h,以及推程和回程的行程误差是否在数值噪音范围内。
% 运动规律完整性检查 s_error = max(s) - h; v_bound = max(abs(v(1))); fprintf('行程最大误差: %.3e mm\n', s_error); fprintf('推程起点速度: %.3e mm/s\n', v_bound);行程最大误差应该在 1e-12 量级,因为五次多项式在 tau=1 处精确等于 h。如果误差到了 0.01mm 量级,说明采样步长太大或者分段边界处理有问题。推程起点速度也应该是零,这里出现非零值说明回程段的多项式系数或者边界判定有误。这两个检查通过,运动规律本身没问题,后面的几何验证才有意义。
5.2 CATIA DMU运动仿真:装配与凸轮副设置
MATLAB 仿真的局限性是它假设从动件始终贴合凸轮轮廓,没法发现建模阶段引入的几何错误。CATIA 的数字样机运动机构(DMU Kinematics)可以做带接触的机构级验证,检查凸轮和滚子是否真的贴合、有没有干涉。
进入 DMU 工作台之前,先把凸轮和从动件装配好。凸轮以实际廓线样条为接触表面,滚子用外圆柱面。装配完成后进入 DMU Kinematics,按下面顺序设置:
- 给凸轮旋转轴添加“旋转副(Revolute Joint)”,并将它固定到大地参考系。
- 给从动件添加“棱柱副(Prismatic Joint)”,约束它沿导路方向平移。
- 创建“凸轮副(Curve to Curve Joint)”,第一根曲线选凸轮的实际廓线样条,第二根曲线选滚子外圆轮廓。
- 给凸轮的旋转副添加驱动命令,设定速度或角度,仿真步数按凸轮转一圈 360 步以上设置。
凸轮副创建时要注意曲线的闭合状态。如果第 4 章生成的样条线没有勾选“闭合”,凸轮副会报错或者接触点跳变。跑完仿真后,用 DMU 的测量工具输出从动件位移曲线,存成 CSV。
5.3 仿真结果对比:误差出在哪一层
CATIA 仿真的位移结果和 MATLAB 的理论位移放到一起对比,才能判断整条链路是否闭合。
dmu = readtable('dmu_displacement.csv'); t_dmu = dmu.Time; y_dmu = dmu.Displacement; t_sim = (0:num-1)' * (2*pi/w) / num; y_sim = s; % 时间对齐后求最大偏差 y_dmu_interp = interp1(t_dmu, y_dmu, t_sim, 'linear'); dev = max(abs(y_dmu_interp - y_sim)); fprintf('DMU与理论位移最大偏差: %.3f mm\n', dev);偏差在 0.05mm 以内说明建模和仿真链路正确。偏差偏大时,按概率从高到低排查:样条线拟合点数不足导致廓线偏离理论值;DMU 仿真步长太大导致接触点捕捉不精确;凸轮副曲线方向选择错误导致接触面反了。注意 DMU 的凸轮副输出的是从动件沿导路方向的位移,MATLAB 计算的 s 也是沿导路方向的位移,两者物理意义一致才能直接比较。
如果手头没有 DMU Kinematics 许可证,CATIA 自带的电子样机有时只带简单运动副,凸轮副做不了。这种情况下退一步,用 CATIA 的“距离分析”工具逐点测量滚子中心到实际廓线的距离,理论上是常数 r_r,偏差在 0.02mm 以内也能接受。
6. 压力角、曲率半径与一轮调参技巧
6.1 用压力角公式快速迭代基圆半径
冲击和磨损由压力角直接决定。偏置直动从动件压力角公式为:
tanα = |(ds/dφ − e) / (s₀ + s)|
用这个式子可以对第 3 章的数据直接算压力角,并找出最大值:
alpha = atand(abs(dsdphi - e) ./ (s0 + s)); [max_alpha, idx] = max(alpha); fprintf('最大压力角: %.2f deg, 出现在凸轮转角 %.1f deg\n', ... max_alpha, phi_deg(idx));压力角超标时优先增大基圆半径 rb,其次是调整偏距 e。下表是同样行程 h=20mm、推程角 120°、步长 1° 下,rb 从 40mm 变到 60mm 时最大推程压力角的变化趋势:
| 基圆半径 rb (mm) | 最大推程压力角 (deg) |
|---|---|
| 40 | 19.8 |
| 45 | 17.6 |
| 50 | 15.8 |
| 55 | 14.3 |
| 60 | 13.1 |
实际设计一般把最大压力角控制在 30° 以内,高速凸轮建议按 25° 设计。rb 增大后压力角下降明显,但凸轮尺寸和转动惯量也上去了,所以通常用 5mm 一档做迭代,找到满足压力角要求的最小 rb。
6.2 曲率半径检查:防止廓线变尖
压力角满足之后,还要检查实际廓线的最小曲率半径。理论廓线曲率半径 ρ_t 用下式计算:
ρ_t = ( (dx/dφ)² + (dy/dφ)² )^(3/2) / |dx/dφ · d²y/dφ² − dy/dφ · d²x/dφ²|
实际廓线在外凸段的曲率半径 ρ_c = ρ_t − r_r。如果 ρ_c 小于零,说明实际廓线出现尖点甚至自交,滚子无法正常贴合。
d2x = d2sdphi .* sin(phi) + 2*dsdphi .* cos(phi) - (s0+s) .* sin(phi) - e .* cos(phi); d2y = d2sdphi .* cos(phi) - 2*dsdphi .* sin(phi) - (s0+s) .* cos(phi) + e .* sin(phi); rho_t = (dx.^2 + dy.^2).^1.5 ./ abs(dx .* d2y - dy .* d2x); rho_c = rho_t - rr; [min_rho, imin] = min(rho_c); fprintf('实际廓线最小曲率半径: %.2f mm\n', min_rho);最小曲率半径小于 0 时,优先减小滚子半径 r_r;如果 r_r 已经很小,就需要增大基圆半径 rb。滚子半径的选型要兼顾销轴强度和压力角,一般是基圆半径的 0.1 到 0.2 倍。检查曲率半径时只关心外凸段,内凹段的理论廓线曲率半径是负值,减去 rr 后绝对值变大,反而更安全。
6.3 把数据流做成改参数即更新的闭环
到这里,基于CATIA和MATLAB的凸轮参数化三维建模及运动仿真链路已经完整。最后补一个工作流层面的技巧:把 rb、rr、e、h、phi0 这几个参数放在 MATLAB 脚本头部唯一的输入区,每次改参数后重跑脚本,覆盖同名 CSV,再回到 CATIA 里用“设计表→更新”或者重新运行宏更新模型。整个过程从改参数到看到新模型,五分钟内完成。
这套数据流对电子凸轮同样适用。汇川、西门子这些控制器的电子凸轮表本质也是一张角度位移的 CAM Profile 表,追飞剪场景里需要规划的也是类似的凸轮曲线。MATLAB 算出的每转 1° 的位移数据,转成控制器要求的插值格式后,可以直接作为电子凸轮表的输入。这也正是 CATIA 和 MATLAB 组合的价值:几何端有参数化模型顶着,数值端有运动学数据接着,两边各干各擅长的事。
本文还有配套的精品资源,点击获取