主要内容

在 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.JointAccelerationDictionarysimscape.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);

现在,您可以查询系统中每个关节基元的位置、速度和加速度。例如,要获取机架连杆和摇杆连杆之间的关节基元的角速度和角加速度,请使用 jointPrimitiveVelocityjointPrimitiveAcceleration 方法。

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)

另请参阅

|

主题