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)
参考
simscape.multibody.Component | simscape.multibody.CompiledMultibody