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

このイメージはシステムの初期構成を示したもので、クランク リンクとベース リンクの間の角度は 60 度になっています。クランク リンクは、10 deg/s の角速度でシステムを駆動します。5 deg/s² の角加速度によってクランク リンクが推進され、50 N の負荷がロッカー リンクの遠端に作用します。この力は、ワールド フレームの x 軸に沿っています。
4 節リンク機構システムの作成
4 節リンク機構のマルチボディ システムを作成するには、例を開き、指定のリンク長でカスタム関数 fourbar を使用します。MATLAB で 4 節リンク機構システムを作成する詳しい手順については、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 方向に作用します。重力を指定するには、simscape.multibody.UniformGravity クラスを使用します。
gravity = UniformGravity(Value([0 -9.80665 0],"m/s^2"));マルチボディ システムを解析する前に、マルチボディ オブジェクトをコンパイルします。
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 with properties:
Status: Valid
結果から、システムが指定されたすべてのターゲットを満たしていることを確認できます。
システムを可視化するには、visualizeメソッドを使用します。このコマンドを MATLAB コマンド ウィンドウで実行します。
visualize(cfb,computeState(cfb,jointOP),"vizFourBar")
ジョイントの内部の仕組みの指定
現実の応用においては、機械システムのジョイントは理想どおりにはならず、多くの場合はエネルギー損失が発生します。回転ジョイントでこれらの影響を考慮するには、RevolutePrimitiveInternalMechanics クラスを使用してバネと減衰の特性を指定します。
バネの剛性と減衰係数を指定するには、LinearRotationalSpring クラスと LinearRotationalDamper クラスを使用します。
spring = LinearRotationalSpring(Value(0.5,'N*m/deg')); damper = LinearRotationalDamper(Value(0.1,'N*m/(deg/s)'));
バネの平衡位置を設定するには、simscape.Valueオブジェクトを使用します。
eilibriumPosition = Value(90,"deg");簡略化のため、すべてのジョイントに同一のバネ特性とダンパー特性を使用します。
im = RevolutePrimitiveInternalMechanics(eilibriumPosition,spring,damper); Bottom_Left_Joint.InternalMechanics = im; Top_Left_Joint.InternalMechanics = im; Top_Right_Joint.InternalMechanics = im; Bottom_Right_Joint.InternalMechanics = im;
ジョイントの作動と外部負荷のモデル化
システムの図に示すように、クランク リンクは 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,gravity,dict_accel,dict_t,dict_f);
これで、システムのすべてのジョイント プリミティブの位置、速度、加速度をクエリできるようになります。たとえば、ベース リンクとロッカー リンクの間にあるジョイント プリミティブの角速度と角加速度を得るには、componentResults メソッドを使用します。
vel_bottom_right = componentResults(cfb,"Bottom_Right_Joint",state).Rz.Velocityvel_bottom_right =
0.0723 (rad/s)
accel_bottom_right = componentResults(cfb,"Bottom_Right_Joint",dynamicsResult).Rz.Accelerationaccel_bottom_right =
0.0532 (rad/s^2)
参考
simscape.multibody.Component | simscape.multibody.CompiledMultibody