在 MATLAB 中分析系统动态特性
此示例展示了如何使用 Simscape Multibody 的 MATLAB 类来分析四连杆机构系统的动态特性。示例系统是一个曲柄摇杆机构,它有四个连杆,长度分别为 5 cm、8 cm、10 cm 和 12 cm。

下图显示了该系统的初始配置,其中曲柄连杆和机架连杆之间的角度为 60 度。曲柄连杆以 10 度/秒的角速度驱动系统。此外,曲柄连杆还受到 5 deg/s² 的角加速度驱动,且摇杆连杆的远端作用有 50 N 的负载。该力沿世界坐标系的 x 轴方向作用。
创建四杆系统
要构造四杆多体系统,请打开示例并使用自定义函数 fourbar 和指定的连杆长度。有关在 MATLAB 中构建四杆系统的详细说明,请参阅在 MATLAB 中对多体系统进行建模。
import simscape.multibody.* simscape.Value simscape.op.* [fb,op] = fourBar(simscape.Value(12,"cm"), simscape.Value(10,"cm"), simscape.Value(5,"cm"), simscape.Value(8,"cm"));
该四杆系统在 X-Y 平面内运行,重力沿 -y 方向作用。
在对多体系统执行分析之前,请先编译关联的多体对象。
cfb = compile(fb);
要设置初始关节基元目标,请创建一个工作点对象 jointOP。
jointOP = simscape.op.OperatingPoint; jointOP("Bottom_Left_Joint/Rz/q") = simscape.op.Target(60,"deg","High"); jointOP("Bottom_Right_Joint/Rz/q") = simscape.op.Target(90,"deg","Low"); jointOP("Bottom_Left_Joint/Rz/w") = simscape.op.Target(10,"deg/s","High");
要验证四杆系统是否满足所有指定目标,请使用 computeState 方法计算系统的状态。
state = computeState(cfb,jointOP)
state =
State:
Status: Valid
Assembly diagnostics:
x
Bottom_Left_Joint
'Bottom_Left_Joint' successfully assembled
Rz
High priority position target +60 (deg) achieved
High priority velocity target +10 (deg/s) achieved
Top_Left_Joint
'Top_Left_Joint' successfully assembled
Rz
Free position value: +38.485 (deg)
Free velocity value: +12.7749 (deg/s)
Bottom_Right_Joint
'Bottom_Right_Joint' successfully assembled
Rz
Low priority position target +90 (deg) not achieved; actual value: +91.4095 (deg)
Free velocity value: +4.14183 (deg/s)
Top_Right_Joint
'Top_Right_Joint' successfully assembled
Rz
Free position value: +69.8945 (deg)
Free velocity value: +6.91669 (deg/s)
结果表明系统满足所有指定的目标。
要可视化该系统,请使用 visualize 方法:
visualize(cfb,computeState(cfb,jointOP),"vizFourBar")
指定关节内部力学特性
在实际应用中,机械系统中的关节并非理想关节,经常存在能量损耗。要在系统中考虑这些现象,请使用 simscape.multibody.JointForceLaw 类的子类来指定弹簧和阻尼属性。
要表示扭转弹簧-阻尼器定律,请创建一个 simscape.multibody.TorsionalSpringDamper 对象。
tsd = simscape.multibody.TorsionalSpringDamper;
要设置弹簧的平衡位置和刚度,请使用 simscape.Value 对象。
tsd.EquilibriumPosition = simscape.Value(90,"deg"); tsd.SpringStiffness = simscape.Value(0.5,"N*cm/deg")
tsd =
TorsionalSpringDamper with properties:
EquilibriumPosition: 90 (deg)
SpringStiffness: 0.5000 (N*cm/deg)
DampingCoefficient: 0 (N*m*s/deg)
要指定阻尼器的阻尼系数,请使用 simscape.Value 对象。
tsd.DampingCoefficient = simscape.Value(0.1,"N*cm/(rev/s)")tsd =
TorsionalSpringDamper with properties:
EquilibriumPosition: 90 (deg)
SpringStiffness: 0.5000 (N*cm/deg)
DampingCoefficient: 0.1000 (N*cm*s/rev)
为简单起见,对所有关节基元应用相同的弹簧-阻尼器定律。
Bottom_Left_Joint.Rz.ForceLaws = tsd; Top_Left_Joint.Rz.ForceLaws = tsd; Top_Right_Joint.Rz.ForceLaws = tsd; Bottom_Right_Joint.Rz.ForceLaws = tsd;
关节作动和外部负载建模
如系统图所示,曲柄连杆以 5 deg/s^2 的角加速度驱动系统,且摇杆连杆的远端作用有 50 N 的负载。要构造系统的加速度和负载,请使用 simscape.multibody.JointAccelerationDictionary 和 simscape.multibody.ExternalForceTorqueDictionary 类。
要将关节加速度与关联的关节基元配对并进行存储,请使用 dict_accel 字典。
dict_accel = simscape.multibody.JointAccelerationDictionary; accel_revolute = simscape.multibody.RevolutePrimitiveAcceleration(simscape.Value(5,"deg/s^2")); dict_accel("Bottom_Left_Joint/Rz") = accel_revolute;
默认情况下,系统中所有关节基元的作动扭矩均为零。但是,左下关节会承受一个角加速度。为了在动态特性计算过程中保持平衡,您必须指定一个要自动计算扭矩的关节基元。例如,您可以使用 simscape.multibody.JointActuationDictionary 类将连接器连杆和摇杆连杆之间的关节基元指定为自动计算。
dict_t = simscape.multibody.JointActuationDictionary; torque = simscape.multibody.RevolutePrimitiveActuationTorque("Computed"); dict_t("Top_Right_Joint/Rz") = torque;
要将负载与关联的坐标系连接器配对并进行存储,请使用 dict_f 字典。该负载沿世界坐标系的 x 轴方向作用。
dict_f = simscape.multibody.ExternalForceTorqueDictionary; force = simscape.multibody.ExternalForce(simscape.Value([50 0 0],"N"),"World"); dict_f("Right_Link/pos_end/f") = force;
计算动态特性
要使用给定的状态和作动输入来计算四杆系统的动态特性,请使用 computeDynamics 方法。
dynamicsResult = computeDynamics(cfb,state,dict_accel,dict_t,dict_f);
现在,您可以查询系统中每个关节基元的位置、速度和加速度。例如,要获取机架连杆和摇杆连杆之间的关节基元的角速度和角加速度,请使用 jointPrimitiveVelocity 和 jointPrimitiveAcceleration 方法。
vel_bottom_right = jointPrimitiveVelocity(cfb,"Bottom_Right_Joint/Rz",state)vel_bottom_right =
4.1418 (deg/s)
accel_bottom_right = jointPrimitiveAcceleration(cfb,"Bottom_Right_Joint/Rz",dynamicsResult)accel_bottom_right =
3.0495 (deg/s^2)
另请参阅
simscape.multibody.Component | simscape.multibody.CompiledMultibody