简介PDF文档系统展示了MATLAB在凸轮机构运动分析与动画模拟中的典型应用面向机械工程、机电专业学习者及工程技术人员帮助掌握机构运动建模、参数化绘图与动态仿真的完整思路。文档以2007年《南昌高专学报》发表的学术论文为基础作者罗世民、杨春辉来自华东交通大学资源包仅含1个PDF文件压缩包约196KB轻量便于查阅。论文以对心滚子直动从动件盘形凸轮机构为实例建立理论轮廓线和实际轮廓线的数学模型介绍MATLAB参数化绘图函数和实时动画、电影动画两类实现方法并演示如何用Guide工具搭建运动分析系统主界面。读者可循此思路完成机构简图绘制、位移/速度/加速度线图输出及运动动画模拟对机械原理教学、课程设计与机构分析研究都有一定参考价值。已有973人浏览学习。1. 凸轮机构运动分析用MATLAB能把解析解一直做到动画收到一个机械课程设计的题目基于MATLAB的凸轮机构运动分析与动画模拟。这名字听起来很学院派但实际做起来就是三件事先把从动件运动规律写成解析函数再用反转法把凸轮理论廓线和实际廓线坐标算出来最后用MATLAB图形句柄让凸轮转起来、推杆跟着动。做代码的过程中我踩过不少坑比如运动规律衔接处冲击、数值微分噪声、动画掉帧后面都一一解决了。这篇文章直接给你一套能跑的完整思路适合课程设计、毕业设计也适合想快速验证盘形凸轮方案的工程师。2. 从动件运动规律先选对曲线类型再写位移函数2.1 等速、等加速等减速、简谐与摆线冲击特性差在哪儿凸轮机构的从动件运动规律决定了机构动力学品质。低速轻载可以用最简单的等速运动但等速规律在推程起止点速度突变理论上加速度无穷大会产生刚性冲击实际中会有明显振动和噪声。等加速等减速规律加速度是常数但在起止点和中间过渡点加速度突变产生柔性冲击一般只适用于中低速。简谐运动也就是余弦加速度规律加速度在两端有有限值突变仍然属于柔性冲击。只有摆线运动也就是正弦加速度规律位移、速度、加速度在边界都是连续的加速度曲线光滑没有冲击是高速凸轮机构的首选。实际做课程设计时老师通常要求对比几种规律所以你最好把所有规律都实现成函数。摆动从动件、直动从动件用的运动规律数学形式完全相同只是用角度和行程参数表达不一样。把你选定的规律写成统一的[s, dsdp, ddsdp] fun(phi, phi0, h)格式后面无论算轮廓还是画曲线都能复用。2.2 摆线运动规律的无量纲化解析式摆线运动规律的标准解析式是s h(Φ/Φ0 - sin(2πΦ/Φ0)/(2π))速度比对角度的一阶导数是ds/dΦ h/Φ0 (1 - cos(2πΦ/Φ0))加速度比是d²s/dΦ² 2πh/Φ0² sin(2πΦ/Φ0)这里的 Φ 从 0 增长到 Φ0h 是行程Φ0 是推程运动角。无量纲化后位移 s/h 从 0 到 1速度比先增大后减小在 Φ Φ0/2 处达到最大值。这个性质很重要后面算最大压力角时速度比最大值直接决定压力角的峰值。对应MATLAB函数如下function [s, dsdp, ddsdp] cycloidal(phi, phi0, h) % 摆线(正弦加速度)运动规律 % 输入 % phi - 当前转角单位度从推程起始位置算起 % phi0 - 推程运动角单位度 % h - 从动件行程单位mm % 输出 % s - 位移mm % dsdp - ds/dΦ单位 mm/deg % ddsdp - d²s/dΦ²单位 mm/deg² p phi / phi0; % 无量纲转角 s h * (p - sin(2*pi*p)/(2*pi)); dsdp h / phi0 * (1 - cos(2*pi*p)); ddsdp 2*pi*h / (phi0^2) * sin(2*pi*p); end这里为什么输出对角度的一阶、二阶导数而不是对时间求导因为凸轮转速恒定的时候ds/dt ds/dΦ * ωd²s/dt² d²s/dΦ² * ω²把角速度 ω 提出来运动规律与转速无关。后面做压力角校核时只需要 ds/dΦ不需要角速度这个设计让函数通用性更强。2.3 简谐运动函数与两种规律的对比表简谐运动也是课程设计高频考点实现函数如下function [s, dsdp, ddsdp] simpleHarmonic(phi, phi0, h) % 简谐(余弦加速度)运动规律 p phi / phi0; s h/2 * (1 - cos(pi*p)); dsdp (h*pi/(2*phi0)) * sin(pi*p); ddsdp (h*pi^2/(2*phi0^2)) * cos(pi*p); end对比两种函数可得到下表。特性摆线正弦加速度简谐余弦加速度位移表达式h(p - sin(2πp)/(2π))h/2(1 - cos(πp))速度边界起点和终点为0连续起点和终点为0连续加速度边界起点终点为0连续起终点非零有突变冲击等级无冲击柔性冲击最大速度系数1与2π/2 ≈ 1.57适用场合高速、重载、要求低振动中低速、中等载荷选型时看速度系数就明白为什么高速凸轮几乎都用摆线同样行程和推程角摆线的最大速度比可以降到1简谐是1.57等加速等减速更高。最大速度越小最大压力角越小机构受力越好。2.4 回程运动角与远休止角的拆分方法实际凸轮一个循环包含推程、远休止、回程、近休止四段。运动规律函数只处理单段所以主函数要按角度区间分段调用。我的习惯是把总转角折到 [0,360) 度然后用 if 分支判断当前角落在哪一段。回程段的处理方式是先复制推程位移函数再用 h - s(phiR) 把它镜像过来速度方向取负这样回程位移从 h 平滑回到 0。function [s, dsdp, ddsdp] followerMotion(phi, h, phi0, phiS, phiR, phiS1) % 根据四个运动角计算任意角度下的总运动参数 % phiS - 远休止角 % phiR - 回程运动角 % phiS1 - 近休止角 phi mod(phi, 360); if phi phi0 [s, dsdp, ddsdp] cycloidal(phi, phi0, h); elseif phi phi0 phiS s h; dsdp 0; ddsdp 0; elseif phi phi0 phiS phiR phiR phi - phi0 - phiS; [sR, dsR, ddsR] cycloidal(phiR, phiR, h); s h - sR; dsdp -dsR; ddsdp -ddsR; else s 0; dsdp 0; ddsdp 0; end end这里有个容易忽略的坑mod(phi, 360)会把负角度和大于360度的角度都归位方便循环。但如果在MATLAB中使用linspace(0,360,N)最后一个点正好是360会用近休止角段计算结果和0度一致画图时首尾自然闭合很舒服。3. MATLAB运动分析脚本用解析求导画曲线而不是用diff3.1 主脚本参数定义和分辨率选择运动分析的主脚本核心是遍历 0~360 度对每个角度调用上面的followerMotion然后把结果画成三张子图。参数定义我建议集中放在脚本开头后面所有函数共用课程设计答辩时改参数也方便。% 凸轮基本参数 rb 50; % 基圆半径mm rr 10; % 滚子半径mm h 30; % 行程mm phi0 110; % 推程运动角deg phiS 40; % 远休止角deg phiR 100; % 回程运动角deg phiS1 110; % 近休止角deg N 721; % 采样点数建议不低于360 phi linspace(0, 360, N); % 预分配数组 s zeros(size(phi)); dsdp zeros(size(phi)); ddsdp zeros(size(phi)); for k 1:N [s(k), dsdp(k), ddsdp(k)] followerMotion(phi(k), h, phi0, phiS, phiR, phiS1); end为什么采样点数取 721因为凸轮每转一度至少需要两个点轮廓曲线才平滑动画也更流畅。取 721 是 360 的整数倍还多一个点刚好覆盖首尾。如果只取 360工作廓线的等距线在曲率变化大的点容易看出折线感。3.2 解析求导与数值diff的区别很多初学的人写完位移曲线后用diff(s)和diff(s,2)去拿速度和加速度结果发现曲线噪声大、边界杂乱。这是因为diff是数值差分对位移曲线上的微小误差非常敏感尤其是凸轮轮廓中不同段连接处差分会放大误差。解析求导才是正确方法。凸轮运动规律本身是初等函数的组合位移、速度、加速度都有精确表达式。上面followerMotion已经一次性返回了 s、一阶导、二阶导所以不需要任何数值差分。如果你要验证自己的解析结果可以用diff看趋势但不能作为报告主图。这里有一个判断方法把解析速度的峰值和理论最大速度系数对比例如摆线的最大速度为 1 mm/deg 每单位行程若数值差分结果明显偏离说明采样不足或函数有误。3.3 三线图绘制与横坐标切换运动分析结果通常画在一张图上三个子图便于检查突变点。完整绘图代码如下figure(Color,w, Position,[100 100 800 600]); subplot(3,1,1); plot(phi, s, LineWidth, 1.5); grid on; ylabel(位移 s (mm)); title(摆线运动规律凸轮运动分析); subplot(3,1,2); plot(phi, dsdp, r, LineWidth, 1.2); grid on; ylabel(ds/dΦ (mm/deg)); subplot(3,1,3); plot(phi, ddsdp, b, LineWidth, 1.2); grid on; ylabel(d²s/dΦ² (mm/deg²)); xlabel(凸轮转角 Φ (deg));图中三个子图共用横轴当你缩放时三个图同步联动可以快速定位冲击点。如果你导师要求横轴显示时间只需把 phi 除以转速 n 对应的角速度 6nt phi / (6*n)因为 n 的单位是 rpm。我一般还是保留角度轴因为凸轮设计书习惯用角度描述时间轴只有做动力学仿真时才需要。3.4 检查运动规律连续性的自动化脚本人工看图难免漏掉极值时的小尖刺。加一个简单检查判断速度和加速度在分段点是否连续% 检查位移是否从0开始并回到0 if abs(s(1))1e-6 || abs(s(end))1e-6 error(位移首尾不为0运动规律定义有误); end % 检查远休止段速度是否为0 mid find(phi phi0 phi phi0phiS); if max(abs(dsdp(mid))) 1e-6 warning(远休止段出现非零速度回程与推程边界异常); end这些检查能自动帮你抓住参数边界错误。常见的翻车是回程角度写成 phiR但在followerMotion里变量名冲突导致回程段调用的推程函数实际传入了总角度。加了检查后远休止段速度非零就会触发警告很好排查。4. 凸轮轮廓与动画模拟反转法坐标推算和MATLAB动图实现4.1 理论廓线坐标公式与符号约定凸轮轮廓设计的基础是反转法。给从动件施加一个反向角速度让凸轮静止从动件绕凸轮回转中心反转其运动轨迹就是凸轮理论廓线。对于直动滚子从动件对心或偏置理论廓线的笛卡尔坐标是x (r0 s) sinδ e cosδ y (r0 s) cosδ - e sinδ其中 r0 是基圆半径s 是从动件位移e 是偏距反时针为正时取这个符号顺时针正转时把 sin/cos 互换或用负号。实际做代码时建议把 δ 用弧度制并以上面公式为准最后画出轮廓后检查是否左右镜像。下面用第 3 章算出来的 s 和 dsdp 生成理论廓线% 角度转弧度 rad phi * pi / 180; % 对心直动从动件偏距 e0 e 0; x0 (rb s) .* sin(rad) e * cos(rad); y0 (rb s) .* cos(rad) - e * sin(rad); % 画理论廓线 figure; plot(x0, y0, k--, LineWidth, 1); axis equal; grid on; title(凸轮理论廓线);axis equal必须加否则凸轮会被拉伸成椭圆肉眼很难看出压力角问题。理论廓线的数据点数量必须和运动分析相同这样后面求等距线时数组长度一致不需要插值。4.2 工作廓线滚子中心轨迹的等距线实际凸轮与滚子接触的轮廓是理论廓线的等距线。对于滚子半径为 rr 的外凸凸轮工作廓线坐标是xw x - rr * (dy/dδ) / sqrt( (dx/dδ)² (dy/dδ)² ) yw y rr * (dx/dδ) / sqrt( (dx/dδ)² (dy/dδ)² )需要先求理论廓线对 δ 的导数 dx/dδ 和 dy/dδ。由于我们已经解析得到了 ds/dΦmm/deg要先转换成对弧度的导数即 ds/dδ ds/dΦ * 180/pi。然后对 x 求导时注意乘法和加法ds_drad dsdp * 180 / pi; % 由 mm/deg 转换为 mm/rad dxd ds_drad .* sin(rad) (rb s) .* cos(rad) e * (-sin(rad)); dyd ds_drad .* cos(rad) - (rb s) .* sin(rad) - e * cos(rad); denom sqrt(dxd.^2 dyd.^2); xw x0 - rr .* dyd ./ denom; yw y0 rr .* dxd ./ denom;符号方向是工作廓线取“外侧”等距线的结果。如果你画出来的轮廓产生了自相交大概率是滚子半径太大或者等距线符号反了。一个快速判断方法取凸轮轮廓上任意一点指向滚子中心方向如果是从凸轮内部指向外部说明符号正确。我一般会把理论廓线和工作廓线画在一张图上放大几个点看是否满足距离等于 rr 的条件如果所有距离等于 rr那符号就对了。4.3 动画实现用 set 更新 XData/YData 而不是重绘整个图形动画的直觉是凸轮旋转、推杆上下移动。但注意反转法的凸轮是静止的可那是设计状态动画为了让老师看起来直观还是让凸轮旋转比较好。做法是预生成工作廓线的原始坐标数组然后用旋转矩阵把整个轮廓绕原点转动同时根据旋转角重新计算从动件位移更新推杆图形对象的坐标。核心代码片段figure(Color,w,Position,[100 100 900 600]); % 先画工作廓线 hC plot(xw, yw, b-, LineWidth, 1.5); axis equal; grid on; hold on; xlim([-(rbhrr20) (rbhrr20)]); ylim([-(rbhrr20) (rbhrr20)]); % 推杆用一条竖直直线表示高度固定随位移上下移动 hRod plot([0 0], [0 rbrrh], r-, LineWidth, 2); % 滚子用一个圈表示 th linspace(0, 2*pi, 30); hRoller plot(rr*cos(th), rr*sin(th), k-, LineWidth, 1.5); % 动画循环 speedN 60; % 凸轮转速 rpm framesPerRev 360; % 每转更新360次 for k 0:framesPerRev-1 theta k * 2*pi / framesPerRev; % 当前旋转角rad rot theta; % 旋转工作廓线 xr xw*cos(rot) - yw*sin(rot); yr xw*sin(rot) yw*cos(rot); set(hC, XData, xr, YData, yr); % 对应的凸轮转角(度)并求从动件位移 phiNow mod(theta*180/pi, 360); [sNow, ~, ~] followerMotion(phiNow, h, phi0, phiS, phiR, phiS1); % 推杆头部位置从动件在凸轮右侧沿y方向移动 yRod rb rr sNow; set(hRod, YData, [0 yRod]); % 滚子圆心在 (0, yRod)画圆 set(hRoller, XData, rr*cos(th), YData, yRod rr*sin(th)); drawnow limitrate; end这里有个细节凸轮旋转时推杆和滚子也应当随凸轮一起绕原点转动但实际机构中推杆是固定在机架上的不随凸轮转。因此上面的代码只旋转凸轮轮廓推杆始终保持竖直滚子圆心固定在 y 轴上。从动画视觉上滚子会在凸轮表面上下滚动但你没有把滚子旋转到接触点位置所以看起来滚子和凸轮可能有微小间隙。如果要严格接触需要把滚子的 X 坐标移动到接触点但那样推杆就歪了。工程课程设计动画通常接受简化只显示凸轮旋转和从动件往复运动。另外一个性能坑drawnow在循环中会强制刷新整个图窗如果点数多会卡。drawnow limitrate限制了最大帧率让动画流畅又不占满CPU。如果改成pause(0.01)反而可能卡。你要导出 GIF 时可以改用exportgraphics或writeAnimation本文先不展开。4.4 动画辅助元素基圆、偏距圆与接触点踪迹为了让动画更像课程设计插图可以在图窗上叠加基圆和推杆导轨phiCircle linspace(0,2*pi,200); plot(rb*cos(phiCircle), rb*sin(phiCircle), --, Color, [0.4 0.4 0.4]); line([0 0], [-20 rbrr10], Color, [0.6 0.6 0.6], LineWidth, 1);如果凸轮有偏距 e还要画偏距圆半径等于 e并让导轨方向始终与偏距圆相切。不过那属于进阶内容下一章避坑里我再讲偏距带来的符号陷阱。5. 凸轮仿真避坑压力角、曲率半径与动画流畅性的5个高频问题5.1 压力角计算单位混乱导致校核失效现象用同名公式算出的最大压力角很大或很小和手算结果对不上。原因压力角公式 tanα (ds/dδ - e)/(r0 s) 中ds/dδ 是位移对凸轮转角的导数但转角必须用弧度制。很多同学直接从课程设计书上抄来 mm/deg 的速度值代入量纲不对计算出来的角度完全无意义。解决把 mm/deg 的 dsdp 转换成 mm/rad也就是乘以 180/pi再代入公式。ds_drad dsdp * 180 / pi; alpha atand( (ds_drad - e) ./ (rb s) ); plot(phi, alpha); % 检查推程最大压力角是否小于30度 [maxAlpha, idx] max(alpha(phi phi0)); fprintf(推程最大压力角 %.2f deg\n, maxAlpha);注意偏距 e 的符号。当从动件偏置方向使得推程压力角减小时公式取负号。如果算出来比想象中大多半是 e 符号写反了。我吃过这个亏程序里 e 取 15结果最大压力角比不偏置还大后来改成 -15 才合理。另外压力角曲线应该在推程中点附近达到峰值如果峰值出现在起止点说明运动规律衔接有问题。5.2 滚子半径过大导致轮廓自相交现象工作廓线出现“牙签状”尖点或者动画里推杆左下角刺入凸轮轮廓内部。原因工作廓线是理论廓线外偏置 rr 得到的等距线当 rr 大于理论廓线最小曲率半径时等距线会出现自相交凸轮轮廓实际无法加工。解决计算理论廓线的最小曲率半径 ρ_min确保 rr 0.8ρ_min。% 求理论廓线曲率半径的数值近似 dx1 diff(x0); dy1 diff(y0); dx2 diff(dx1); dy2 diff(dy1); % diff 后长度少1需做插值对齐 x1 (x0(1:end-1)x0(2:end))/2; y1 (y0(1:end-1)y0(2:end))/2; rho (dx1.^2 dy1.^2).^(3/2) ./ abs(dx1.*dy2 - dy1.*dx2); rhoMin min(rho); fprintf(理论廓线最小曲率半径 %.2f mm\n, rhoMin); if rr 0.8*rhoMin error(滚子半径过大工作廓线可能出现尖点); end这个数值近似在曲线光滑处足够用但在分段点因为 diff 突变会产生虚假旁瓣所以要用中值滤波或只取推程段。我一般用 smoother 函数或把运动规律的二阶解析式代入曲率公式能更准。但课程设计答辩时数值曲率半径够说明问题。5.3 动画中推杆与凸轮分离或穿透现象凸轮旋转到某个角度推杆底部滚子看起来和凸轮离开一段距离或者嵌进去一块。原因动画循环中凸轮旋转角与推杆位移不同步。常见是凸轮轮廓旋转用 theta而推杆位移用另一个独立循环变量两个变量累计误差导致错位。另一个原因是从动件运动规律函数里用了mod(phi,360)而提交通用theta没转成度。解决强制检查和分离。phiNow mod(theta*180/pi, 360); [sNow, ~, ~] followerMotion(phiNow, h, phi0, phiS, phiR, phiS1);我用过一段错误代码循环里写的是theta theta 1而凸轮轮廓旋转角用theta*pi/180但theta是循环步数不是角度。结果凸轮越转越快推杆乱跳。最终统一用弧度制存储 theta再转到度去调运动函数问题消失。5.4 绘制轮廓时坐标轴不等长导致凸轮被压扁现象凸轮轮廓画出来是个歪的椭圆量半径对不上。原因plot默认将 X 和 Y 都缩放到图窗凸轮 X 和 Y 数值范围相同但显示比例不同。解决在plot后加axis equal。这个简单但我在课程设计里见过太多人翻车。加完以后基圆、滚子、轮廓才能在同一比例下检查。还有一个技巧axis equal后手动设置xlim和ylim保证凸轮居中动画时不会因为旋转而被裁剪。5.5 运动规律分段点出现速度尖峰现象位移曲线看上去平滑但速度或加速度曲线在推程-远休止、远休止-回程连接处出现不可导的尖角。原因回程段我用h - sR镜像摆线但回程运动角phiR和推程phi0如果不同镜像后的速度在高点处是连贯的前提是推程段结束和远休止段衔接处速度必须为0。摆线运动在终点速度确实为0所以衔接没问题。但如果你混合用简谐运动会起点加速度不为零就会在休止段连接处产生柔性冲击。解决要么全程用摆线要么对连接处采用特殊处理。课程设计一般不要求高阶连续但你要在报告里说明冲击等级所以每个运动规律选型后的速度加速度边界要心里有数。如果实在需要更光滑的曲线可以改用3-4-5多项式运动规律位移、速度、加速度、跃度全部连续但函数复杂得多。我建议优先用摆线不用改代码。6. 进阶验证动画准确性、扩展到偏置与摆动从动件动画做出来只是第一步课程设计答辩时老师会问“你怎么保证动画里的位移和理论曲线一致”一个很实用的验证方法在动画循环中把推杆位移单独存成一个数组循环结束后和理论位移曲线叠加。record zeros(framesPerRev, 1); for k 0:framesPerRev-1 theta k * 2*pi / framesPerRev; phiNow mod(theta*180/pi, 360); [sNow, ~, ~] followerMotion(phiNow, h, phi0, phiS, phiR, phiS1); record(k1) sNow; end % 动画结束后验证 phiAnim linspace(0, 360, framesPerRev); figure; plot(phi, s, b-, LineWidth, 1.5); hold on; plot(phiAnim, record, ro, MarkerSize, 3); legend(理论位移,动画推杆位移);如果红点和蓝线完全重合说明动画循环计算接收的输入角度和理论分析一致。这一步我每次做新凸轮都必跑经常能抓出凸轮轮廓旋转方向反了的低级错误。进一步扩展把对心直动从动件改成偏置从动件只需在轮廓公式中把 e 改成非零值同时在压力角校核公式带上偏距项。偏距的方向就是你希望压力角减小的一侧但代价是回程压力角可能增大所以需要双向校核。摆动从动件更复杂要建立摆杆长度、初始摆角与凸轮转角的几何关系理论廓线公式变成绕固定摆心旋转的矢端方程这些都可以沿用本文的s运动规律函数。如果你想做成交互工具用 MATLAB App Designer 做参数滑块实时重算轮廓和动画配合 4.3 节的set更新逻辑效果非常好。说到底凸轮机构运动分析这套代码核心并不是动画炫酷而是运动规律和轮廓几何的准确性。把解析公式写对、把符号约定统一动画只是最后一层包装。我做课程设计时曾经为了动画效果把凸轮轮廓旋转方向弄反推导半天没发现问题最后用理论位移叠加法一眼揪出。从那以后我养成了习惯所有图形显示类的程序都要用数据验证图形而不是凭眼睛判断。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?