ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

六杆机构MATLAB运动学仿真:从闭环矢量方程到雅可比矩阵求解

六杆机构MATLAB运动学仿真:从闭环矢量方程到雅可比矩阵求解 六杆机构课程设计最容易被卡住的不是机构本身而是不知道仿真程序该怎么组织。用 MATLAB 做六杆机构运动学仿真核心流程其实就四步理清机构自由度、列闭环矢量方程、用 fsolve 解位置、再用雅可比矩阵求速度和加速度。这个方案适合机械专业正在做课程设计、或者想从图解法过渡到数值法的学生。下面我按自己在课程设计里跑通的一版流程拆开讲先交付什么再准备什么最后看结果对不对。你不需要把机构画得多精美也不需要掌握特别复杂的算法。MATLAB 自带的 fsolve、线性方程组求解和基础绘图函数就够用。真正决定仿真能不能顺利跑完的是建模阶段的位置方程和初值策略。1. 先明确六杆机构仿真要交付的三样东西1.1 课程设计里最看重哪几项六杆机构课程设计和平时随便玩玩仿真不太一样。老师验收时通常看你有没有把三件事讲清楚机构自由度和运动简图是否正确位置、速度、加速度的解析推导过程是否完整MATLAB 仿真曲线能否和理论计算或者图解法结果对得上。所以不要一上来就写代码。先把机构简图画在纸上标清楚每个铰链、每个固定点、每个构件的长度。这一步看起来笨但能避免后面一大半问题。1.2 自由度计算别等仿真跑完才发现机构有问题六杆机构听起来复杂但实际上很多课程设计题目是由一个铰链四杆机构加一个二级杆组组成的。比如我用的例子是曲柄摇杆机构 ABCD在连杆 BC 上取一点 E再用 EF 杆连接一个沿水平导路移动的滑块 F。计算自由度用 Grübler-Kutzbach 公式F 3n - 2Pl - Ph其中 n 是活动构件数Pl 是低副数Ph 是高副数。这个例子里活动构件有 5 个曲柄、连杆、摇杆、EF 杆、滑块。低副有 7 个A、B、C、D、E、F 六个转动副加上滑块和导路之间的移动副。没有高副。所以F 3 × 5 - 2 × 7 1自由度是 1说明只要曲柄转起来整个机构每一个位置都是唯一确定的。如果算出来自由度不是 1就要重新检查机构简图不然仿真根本没有确定解。1.3 建模前把参数定下来我用的机构参数如下后面所有代码都按这一组参数写参数数值含义L10.10 m曲柄 AB 长度L20.40 m连杆 BC 长度L30.35 m摇杆 CD 长度L40.40 mEF 杆长度XD0.40 m固定铰 D 的 x 坐标YD0.00 m固定铰 D 的 y 坐标y00.00 m滑块导路高度k0.50E 点在 BC 上的比例BE k × L2固定铰 A 放在坐标系原点曲柄角速度取 2π rad/s也就是一圈每秒。2. 位置方程怎么列两个闭环、四个未知量2.1 角度方向必须先统一写 MATLAB 代码之前所有角度定义必须明确。我建议统一采用水平向右为 x 轴正方向逆时针为正。每个杆件的角度定义为该杆件从起始铰链指向末端铰链的方向角。比如曲柄 AB 的角度是 θ1方向从 A 指向 B连杆 BC 的角度是 θ2方向从 B 指向 C摇杆 CD 的角度是 θ3方向从 D 指向 CEF 杆的角度是 θ4方向从 E 指向 F。角度方向如果不统一后面所有方程和代码都会错。工程上很多报错不是公式推错而是角度定义自己在换算过程中搞混了。2.2 第一个闭环曲柄、连杆、摇杆和机架四杆机构 ABCD 的闭环矢量方程可以写成AB BC AD DC其中 AB 由曲柄生成BC 由连杆生成DC 是摇杆从 D 到 C 的矢量AD 是固定矢量。展开成 x 和 y 两个方向后得到两个方程L1·cosθ1 L2·cosθ2 - L3·cosθ3 - XD 0L1·sinθ1 L2·sinθ2 - L3·sinθ3 - YD 0这里 θ3 使用的是从 D 指向 C 的方向角不是从 C 指向 D 的方向角。这是最容易写反的地方。2.3 第二个闭环连杆上的 E 点、EF 杆和滑块导路E 点不在连杆末端而是在 BC 杆上的某个位置。因此 E 点坐标可以通过 B 点和 C 点线性插值得到E B k × (C - B)其中 k 是 BE 占 BC 全长的比例。k 0.5 时 E 在 BC 中点。滑块 F 受到两个约束F 点必须在水平导路上同时 EF 杆长度固定为 L4。于是可以得到第二个闭环方程E_x L4·cosθ4 - s 0E_y L4·sinθ4 - y0 0其中 s 是滑块在导路上的水平位移是未知量。现在数一下未知量θ2、θ3、θ4、s一共 4 个。方程也是 4 个。方程组有唯一解可以用 fsolve 数值求解。我一般会建议学生把位置方程单独写成一个函数文件而不是全部堆在主脚本里。这样不仅能反复调用后面做速度分析、动画时也能直接复用。3. 位置分析用 fsolve 求解非线性方程组3.1 程序结构主脚本、残差函数、参数结构体位置分析的代码分成三部分主脚本、残差函数、参数结构体。残差函数six_bar_pos.m如下function F six_bar_pos(x, theta1, param) % x [theta2; theta3; theta4; s] theta2 x(1); theta3 x(2); theta4 x(3); s x(4); B [param.L1 * cos(theta1); param.L1 * sin(theta1)]; C [param.XD param.L3 * cos(theta3); ... param.YD param.L3 * sin(theta3)]; E B param.k * (C - B); F [ param.L1 * cos(theta1) param.L2 * cos(theta2) ... - param.L3 * cos(theta3) - param.XD; param.L1 * sin(theta1) param.L2 * sin(theta2) ... - param.L3 * sin(theta3) - param.YD; E(1) param.L4 * cos(theta4) - s; E(2) param.L4 * sin(theta4) - param.y0; ]; end主脚本里用 fsolve 循环求解整个周期的位置clear; clc; close all; param.L1 0.10; param.L2 0.40; param.L3 0.35; param.L4 0.40; param.XD 0.40; param.YD 0.00; param.y0 0.00; param.k 0.50; omega1 2 * pi; N 361; theta1 linspace(0, 2 * pi, N); theta2 zeros(N, 1); theta3 zeros(N, 1); theta4 zeros(N, 1); s zeros(N, 1); x_guess [0.8; 2.0; -1.5; 0.5]; options optimoptions(fsolve, Display, off); for i 1:N if i 1 x_guess x_sol; end x_sol fsolve((x) six_bar_pos(x, theta1(i), param), ... x_guess, options); theta2(i) x_sol(1); theta3(i) x_sol(2); theta4(i) x_sol(3); s(i) x_sol(4); end这里 fsolve 是 MATLAB 优化工具箱的函数。校园版 MATLAB 基本都自带不需要额外安装很重的东西。3.2 初值策略为什么“上一个解”很关键位置方程组是非线性的fsolve 是一个局部求解器。初值离真实解太远的话它可能在半路就报错或者收敛到错误的机构分支。所以初值策略直接决定循环能不能跑完。我的做法是第一步给一组手工估计的初值从第二个时刻开始直接把上一时刻的解作为当前时刻的初值。曲柄每一圈只转 1 度相邻两个位置之间机构变化很小所以这个策略非常有效。手工估计初次值也容易。用 CAD 画一下机构简图或者用手画图解法量一下角度填入x_guess就行。第一次给不准也没关系只要残差函数能算出数值fsolve 大概率能自己修正。3.3 判断位置解是否合理的几个标准fsolve 返回“求解成功”不代表结构一定合理。我一般会检查三件事残差 F 是否接近 0正常应该在 1e-8 以下计算出的 B、C、E、F 四个点是否满足杆长约束整个周期内角度和位移曲线是否连续没有非物理的突变。如果第一点不满足说明求解本身有问题如果后两点不满足说明很可能收敛到了错误的装配分支。这种问题靠调初值就能解决不要急着改算法参数。4. 速度与加速度从雅可比矩阵到运动曲线4.1 对位置方程求导得到速度线性方程组位置方程是等式两边对时间求导就得到速度方程。由于位置方程中同时包含 θ1 和四个未知量而 θ1 的变化率 ω1 已知其余四个变量的角速度只需要解一个线性方程组。速度方程组可以写成矩阵形式A × [ω2; ω3; ω4; s_dot] b其中 A 是雅可比矩阵b 是包含 ω1 的常数项。这个方程组在每个时刻都需要重新组装和求解。4.2 速度分析代码我建议把速度分析单独写成一个函数方便检查和复用function [d2, d3, d4, ds] calc_velocity(theta1, theta2, ... theta3, theta4, s, omega1, param) A zeros(4, 4); A(1
返回列表