メインコンテンツ

MATLAB でのシステム ダイナミクスの解析

この例では、Simscape Multibody の MATLAB クラスを使用して 4 節リンク機構システムのダイナミクスを解析する方法を示します。この例のシステムは、長さが 5 cm、8 cm、10 cm、12 cm の 4 つのリンクをもつクランクロッカー機構です。

このイメージはシステムの初期構成を示したもので、クランク リンクとベース リンクの間の角度は 60 度になっています。クランク リンクがシステムを駆動する角速度は 1 秒あたり 10 度です。また、クランク リンクを推進する角加速度は 5 deg/s²、ロッカー リンクの遠端にかかる負荷は 50 N です。この力はワールド座標系の "x" 軸に沿ったものになります。

4 節リンク機構システムの作成

4 節リンク機構のマルチボディ システムを作成するには、例を開き、指定のリンク長でカスタム関数 fourbar を使用します。MATLAB で 4 節リンク機構システムを作成する詳しい手順については、Model a Multibody System in 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"));

4 節リンク機構システムは、"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");

4 節リンク機構システムが指定のすべてのターゲットを満たすことを確認するには、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;

既定では、システムのすべてのジョイント プリミティブの作動トルクがゼロになります。ただし、左下のジョイントには角加速度が加わります。ダイナミクスの計算時に均衡を保つには、トルクを自動で計算するジョイント プリミティブを 1 つ指定しなければなりません。たとえば、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;

ダイナミクスの計算

状態と作動の与えられた入力を使用して 4 節リンク機構システムのダイナミクスを計算するには、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)

参考

|

トピック