Main Content

MATLAB でのマルチボディ システムの作成方法

この例では、MATLAB® でのマルチボディ システムの作成の主な概念と推奨手順を取り上げます。この目的のために簡単な設計問題を選びました。次の節でこの設計問題について、その後の節でそれを解決する方法について説明します。

問題の説明

次の図は、照準装置として機能する機構を示します。

sm_aiming_mechanism.png

問題は、機構の平面内を狙うように単純化されています。図は機構の概念的スケッチを示し、機構の動作の基本的な性質のみをとらえています (これは通常、設計プロセスの初期段階に該当します)。リンク "C" はリンク "A" 上でスライド可能です。モーターがトルク τ を回転ジョイント "Ri" に加えます。タスクは、回転角 β の固有の軌跡を追跡することです。

機構の作成

従うべき重要な原則は、基本的な機構が機能するようにするために単純な近似から始め、その後の反復でモデルに複雑度を追加していくことです。推奨されるモデル作成プロセスは、次の手順に分けることができます。

  1. 機構内の剛体を特定します。

  2. 剛体同士を互いに接続する方法 (ジョイント、拘束など) を特定します。

  3. それぞれの剛体を単独で考えます。剛体の単純な近似を作成し、その剛体に剛性的に付加する座標系を定義します。

  4. 剛体をジョイントや拘束に接続して組み立てます。

  5. モデルのアセンブリに関する問題を特定します。

  6. 組み立てたマルチボディを可視化し、システムに関するその他の問題を特定して修正します。

  7. "OperatingPoint" を使用して、目的の構成に向けてアセンブリをガイドします。

  8. "Multibody" オブジェクトからブロック線図モデルを作成してシステムをシミュレートします。

  9. モデルが実際の機構をより正確に表すようにするために、個々の剛体に詳細を追加します。

以下のセクションで、これらの手順を詳しく説明します。

剛体とジョイントの特定

機構には 4 つの剛体があります。

  • 剛体 A (オレンジ)

  • 剛体 B (青)

  • 剛体 C (緑)

  • 剛体 D (グレー)

機構には次のジョイントがあります。

  • 剛体 A と剛体 D は、回転ジョイント Ro を介して接続されています。

  • 剛体 A と剛体 C は、直進ジョイント Pg を介して接続されています。

  • 剛体 C と剛体 B は、回転ジョイント Rg を介して接続されています。

  • 剛体 B と剛体 D は、回転ジョイント Ri を介して接続されています。

さらに、剛体 D は動かないため、ワールド座標系 W に剛結合されています。

剛体とそのインターフェイスの定義

剛体を定義するには、ジオメトリ、質量特性、および他のパーツとのインターフェイスを指定します。それぞれの剛体は、単独で特定および定義します。上の例では、機構は 4 つの剛体 A、B、CD で構成されています。

以下に剛体 A を単独で示します。

sm_dcrankaim_body_A.png

オブジェクトの形状を定義して密度を指定すると、Simscape™ Multibody™ で慣性を自動的に計算できます。上記のやや複雑な形状を定義する代わりに、最初の近似として、剛体の形状を単純な円柱として定義できます。

sm_dcrankaim_body_A_approx.png

MATLAB では、"simscape.multibody.RigiBody や simscape.mulitbody.Solid" などのオブジェクトを使用する "dcrankaim_approx_body_A" のような高水準関数を使用して上記の剛体を定義できます。この関数は、長さ、半径、密度、色などの入力引数を受け取り、リンクの一方の端と中心に座標系がある円柱固体を含む剛体オブジェクトを返します。

radius = simscape.Value(2,'cm');
length = simscape.Value(1,'m');
color = [0 0 1];
density = simscape.Value(2700,'kg/m^3') ;
bodyA = dcrankaim_approx_body_A(length,radius,density,color);

これらのさまざまなオブジェクトの使用について理解するために、この関数の実装を見てみましょう。"dcrankaim_approx_body_A" では、最初に、Simscape の Value と OperatingPoint および Simscape Multibody の MATLAB クラスを使用するために必要なパッケージをインポートしています。

import simscape.Value simscape.op.* simscape.multibody.*;

次に、"RigidBody" クラスのオブジェクトを作成します。"RigidBody" クラスは、固体、慣性、グラフィックス、座標系 (マルチボディ システムの他のパーツに接続するためのインターフェイスとして機能)、および他の剛体オブジェクトで構成できるコンテナーです。

link = RigidBody;

その後、"BodyA" の形状を近似するための円柱固体を定義して追加します。これは、円柱のジオメトリ、密度、および視覚特性を使用して作成されています。

cylinder = Solid(Cylinder(radius, length),...
                 UniformDensity(density),...
                 SimpleVisualProperties(color));

addComponent(link,'Link', 'reference', cylinder);

剛体 "A" の形状 (最初の近似) を定義し、その密度を指定しました。これで、固体の慣性特性を計算するのに十分な情報が得られます。MATLAB では、次のジオメトリ クラスを使用して単純な形状のジオメトリを定義できます。

  • simscape.multibody.Brick

  • simscape.multibody.Sphere

  • simscape.multibody.Cylinder

  • simscape.multibody.Ellipsoid

  • simscape.multibody.RegularExtrusion

  • simscape.multibody.GeneralExtrusion

  • simscape.multibody.Revolution

これらのジオメトリ オブジェクトは "Solid" クラスに含まれています。固体はジオメトリ、慣性、および視覚特性によって特徴付けられ、それを上記のジオメトリ オブジェクトで使用することでさまざまな形状の単純な固体を作成できます。固体は常に剛体であり、必ず暗黙的な基準座標系をもちます。ジオメトリと慣性は、この座標系を基準にして指定されます。

剛体のインターフェイスは、剛体に付加した座標系を定義することによって確立します。剛体は、剛性的に付加された座標系を介して、機構の他のパーツに接続されます。Simscape Multibody では、ジョイントは時間によって変化する関係を 2 つの座標系間に確立します。たとえば、回転ジョイントは、付加された 2 つの座標系の Z 軸が平行で原点が一致する関係を確立します。直進ジョイントは、付加された 2 つの座標系の Z 軸が同一直線上にあり、X 軸と Y 軸が常に平行な関係を確立します。座標系自体はジョイントとは独立して定義されることに注意してください。ジョイントは既存の座標系間に関係を確立するだけです。また、Z 軸は回転ジョイントの場合は回転軸になり、直進ジョイントの場合はスライド軸になることにも注意してください。この情報は、剛体に剛性的に付加する座標系を定義することによって、剛体のインターフェイスを定義する際に重要です。

この例では、剛体 A の一方の端には円柱型の穴があります。この穴をペグにはめると、A を円柱型の穴の軸の周りで回転させることができます。これは、座標系を穴の中心に定義し、その Z 軸の向きを穴の軸 (回転軸) に揃えるべきであることを示しています。上図ではこの座標系に FAD というラベルが付いています。FAD における "X" 軸と "Y" 軸の向きの選択は、FAD の接続先となるジョイントの零点構成を一部決定します (零点構成に関する以下の説明を参照)。また A は、パーツ C がその上をスライドするシャフトとしても機能します。これは、座標系を A の中心 (任意に選択した位置) に定義し、その Z 軸の向きを A の長さ方向 (スライド方向) に揃えるべきであることを示しています。上図ではこの座標系に FAC というラベルが付いています。座標系 FAD と座標系 FAC は、剛体 "A" のインターフェイスを定義します。

次のコードは、関数 "dcrankaim_approx_body_A" で座標系をどのように定義して剛体 "A" に追加しているかを示しています。

rt_Fad = RigidTransform( ...
         StandardAxisRotation(Value(90, 'deg'), Axis.PosY), ...
         StandardAxisTranslation(length/2, Axis.PosZ));

rt_Fac = RigidTransform( ...
         StandardAxisRotation(Value(180, 'deg'), Axis.PosY));

addFrame(link,'Fad', 'reference', rt_Fad);
addConnector(link,'Fad');

addFrame(link,'Fac', 'reference', rt_Fac);
addConnector(link,'Fac');

座標系 FAC と座標系 FAD は、剛体の基準座標系を基準にして定義されています。

この剛体を可視化するには、次のコードを実行します。

mb = Multibody;
addComponent(mb,'BodyA',bodyA);
cmb = compile(mb);
visualize(cmb,computeState(cmb,OperatingPoint),'BodyVizA');

次に、剛体 "B" について考えてみましょう。ここでも、剛体の形状を単純な円柱として近似できます。この剛体には、ペグにはまる円柱型の穴が両端にあります。剛体 B はそれぞれの穴の軸を中心に回転できます。これは、2 つの座標系を定義する必要があることを示します。それぞれの穴の中心に座標系を 1 つずつ定義し、その Z 軸を穴の軸に揃えます。

sm_dcrankaim_body_B.png

関数 "dcrankaim_approx_body_B" は、"RigidBody""Solid"、および "RigidTransform" オブジェクトをどのように使用して、剛体 "B" の形状、慣性、およびインターフェイスを定義しているかを示しています。

radius = simscape.Value(2,'cm');
length = simscape.Value(1,'m');
color = [0 0 1];
density = simscape.Value(2700,'kg/m^3') ;

bodyB = dcrankaim_approx_body_B(length,radius,density,color);

この剛体を可視化するには、次のコードを実行します。

mb = Multibody;
addComponent(mb,'BodyB',bodyB);
cmb = compile(mb);
visualize(cmb, computeState(cmb,OperatingPoint),'BodyVizB');

剛体 D の最初の近似を作成する際にも、同様のアプローチをとることができます。

次に、剛体 "C" について考えてみましょう。

sm_dcrankaim_body_C.png

この剛体には、ペグ上でスライドする円柱型の穴があります。さらに、別のボディがその周りを回転できるペグもあります。これは、2 つの座標系を定義する必要があることを示します。1 つは穴の中心に定義し、Z 軸を穴の軸に揃えます。もう 1 つはペグの中心に定義し、Z 軸をペグの軸に揃えます。これらは上図で FCA および FCB としてマークされています。

剛体 C の形状は、単純な立方体で近似できます。剛体の最初の近似では、座標系 FCB と座標系 FCA の原点間のオフセットもゼロにできます。この結果、以下に示すような、剛体の簡略表現が得られます。

sm_dcrankaim_body_C_approx.png

関数 "dcrankaim_approx_body_C" は、"RigidBody""Solid"、および "RigidTransform" オブジェクトをどのように使用して、剛体 "C" の形状、慣性、およびインターフェイスを定義しているかを示しています。

brickdim =  simscape.Value([10, 8, 8], 'cm');
density = simscape.Value(2700,'kg/m^3') ;
color = [0 0 1];
bodyC = dcrankaim_approx_body_C(brickdim,density,color);

ジョイントを使用した個々のボディの組み立て

個々のボディはすべて単独で作成されています。アセンブリのプロセスには、剛体に付加された座標系間の関係の確立 (ジョイントを使用) が含まれます。次のジョイントによって、機構を組み立てるために必要な、座標系間のすべての関係が確立されます。

  • 座標系 Fda と座標系 Fad 間の "回転ジョイント"

  • 座標系 Fac と座標系 Fca 間の "直進ジョイント"

  • 座標系 Fcb と座標系 Fbc 間の "回転ジョイント"

  • 座標系 Fbd と座標系 Fdb 間の "回転ジョイント"

関数 "dcrank_aiming_mechanism_v1" は、"Mulitbody""Joints" などのオブジェクトを使用して個々の剛体をどのように組み立てるかを示しています。この関数は、円柱リンク "BodyA""BodyC""BodyD" のそれぞれの長さとスライダー リンク "BodyB" の寸法を入力引数として受け取り、出力としてマルチボディ オブジェクトを返します。

bodyA_l = Value(80,'cm'); 
bodyB_l = Value(30, 'cm');
bodyC_dim = Value([10, 8, 8], 'cm');
bodyD_l = Value(40, 'cm'); 
dcrankAimMech_mb = dcrank_aiming_mechanism_v1(bodyA_l,bodyB_l,bodyC_dim,bodyD_l);

この関数でどのように機構が組み立てられるかを理解するために、その実装をいくつか見てみましょう。

"dcrank_aiming_mechanism_v1" では、最初に Multibody オブジェクトを作成しています。これは、"RigidBodies""Solids""Joints""RigidTransforms" などの他のさまざまなコンポーネントのコンテナーとして機能します。

dcrankAimMech_mb = Multibody;

次に、"addComponent" メソッドを使用して Multibody にワールド座標系を追加します。

addComponent(dcrankAimMech_mb,'World', WorldFrame());

その後、上記のセクションで説明したように、RigidBody オブジェクトを使用して BodyA、BodyB、BodyC、および BodyD を作成します。

% add body_a
bodyA_l = Value(80,'cm'); 
bodyA_r = simscape.Value(2,'cm');
bodyA_color = [1 0.6 0];
bodyA_density = simscape.Value(2700,'kg/m^3') ;
body_a = dcrankaim_approx_body_A(bodyA_l,bodyA_r,bodyA_density,bodyA_color);

% add body_b
bodyB_l =  Value(30, 'cm');
bodyB_r = simscape.Value(2,'cm');
bodyB_color = [0 0 1];
bodyB_density = simscape.Value(2700,'kg/m^3') ;
body_b = dcrankaim_approx_body_B(bodyB_l,bodyB_r,bodyB_density,bodyB_color);

% add body_c
bodyC_dim = Value([10, 8, 8], 'cm');
bodyC_color = [0 1 0];
bodyC_density = simscape.Value(2700,'kg/m^3') ;
body_c = dcrankaim_approx_body_C(bodyC_dim,bodyC_density,bodyC_color);

% add body_d
bodyD_l = Value(40, 'cm'); 
bodyD_r = simscape.Value(2,'cm');
bodyD_color = [0.2 0.2 0.2];
bodyD_density = simscape.Value(2700,'kg/m^3') ;
body_d = dcrankaim_approx_body_D(bodyD_l,bodyD_r,bodyD_density,bodyD_color);

4 つのボディをすべて作成した後、"addComponent" メソッドを使用して Multibody コンテナー オブジェクトにそれらを追加します。

addComponent(dcrankAimMech_mb,'body_a', body_a);
addComponent(dcrankAimMech_mb,'body_b', body_b);
addComponent(dcrankAimMech_mb,'body_c', body_c);
addComponent(dcrankAimMech_mb,'body_d', body_d);

この機構にはジョイントが 4 つあります。3 つは回転で 1 つは直進です。"RevoluteJoint" オブジェクトと "PrismaticJoint" オブジェクトを使用して、それらを作成して追加します。

rJoint = RevoluteJoint;
pJoint = PrismaticJoint;

addComponent(dcrankAimMech_mb,'Ro', rJoint);
addComponent(dcrankAimMech_mb,'Ri', rJoint);
addComponent(dcrankAimMech_mb,'Rg', rJoint);
addComponent(dcrankAimMech_mb,'P', pJoint);

これで、機構に必要なコンポーネントはすべて揃いました。ただし、まだ、それらのコンポーネントの接続が残っています。それらの接続を追加するために、"Multibody" オブジェクトの "connect" メソッドと "connectVia" メソッドを使用して、該当する RigidBody の座標系を該当する base 座標系と follower 座標系に接続します。

connect(dcrankAimMech_mb,'World/W', 'body_d/Fdw');
connectVia(dcrankAimMech_mb,'Ro', 'body_d/Fda', 'body_a/Fad');
connectVia(dcrankAimMech_mb,'P',  'body_a/Fac', 'body_c/Fca');
connectVia(dcrankAimMech_mb,'Rg', 'body_b/Fbc', 'body_c/Fcb');
connectVia(dcrankAimMech_mb,'Ri', 'body_d/Fdb', 'body_b/Fbd');

すべての剛体のインターフェイス (つまり、剛体に付加された座標系) を注意深く定義しておけば、適切な座標系の間にジョイントを追加して接続するだけで、きわめて簡単に機構を完成できます。ただし、機構は複数の構成に組み立て可能なため、この時点で結果として得られたアセンブリは、望ましい構成になっている場合も、いない場合もあります。関数 "dcrankaim_assembly_failure" は、組み立てた機構を示します。

dcrankAimMech_mb = dcrankaim_assembly_failure(bodyA_l,bodyB_l,bodyC_dim,bodyD_l);

computeState メソッドを使用した問題の特定

上記の関数では、剛体 "C" に付加された座標系 FCA の定義に意図的な誤りが含まれています。そのため、アセンブリは失敗します。下図は、座標系 FCA の望ましい向きと実際の向きを示しています。

sm_dcrankaim_body_C_error.png

FCA の向きを、"Z" 軸を中心に 90 度回転して修正しなければなりません。この問題を特定するために、まず、"Multibody" オブジェクトの "compile" メソッドを使用してマルチボディをコンパイルします。

compiled_mb = compile(dcrankAimMech_mb);

次に、コンパイルしたマルチボディ オブジェクトの "computeState" メソッドを既定の OperatingPoint に対して使用します。

state = computeState(compiled_mb,simscape.op.OperatingPoint)
state = 
  State:

  Status: PositionViolation

  Assembly diagnostics:
  x
    Ro
        Joint successfully assembled
        Rz
            Free position value: +0.000377073 (deg)
            Free velocity value: +0 (deg/s)
    P
        Joint successfully assembled
        Pz
            Free position value: +0.3 (m)
            Free velocity value: +0 (m/s)
    Ri
        Joint successfully assembled
        Rz
            Free position value: +0.00087955 (deg)
            Free velocity value: +0 (deg/s)
    Rg
        Joint not assembled due to a position violation.
        Rz
            Free position value: N/A (deg)
            Free velocity value: N/A (deg/s)

computeState メソッドから返される "State" オブジェクトに、状態の計算が成功したか失敗したかが示されます。このケースでは、"PositionViolation" があり、ジョイント "Rg" のアセンブリが位置の違反で失敗したことが報告されています。この例では実際に、座標系 FCA の仕様に位置の違反の原因となるエラーがあります。

"dcrankaim_approx_body_C_assembly_failure" で剛体変換 "ax_fca.BaseAxis2" のパラメーターを "Axis.NegZ" から "Axis.PosZ" に変更すると、問題が解決し、アセンブリが成功するようになります。

ジョイントの零点構成

ジョイントの零点構成は、すべてのジョイント角度が 0 度の場合における、base 座標系と follower 座標系の相対的な位置と向きとして定義されます。Simscape Multibody のほとんどのジョイントでは、零点構成における base 座標系と follower 座標系は同一です。つまり、原点が一致し、軸の向きが揃っています。ジョイント角度が 0 度の場合における、ジョイントによって接続された 2 つのボディ間の相対的な位置と向きを定義するには、それぞれのボディの base 座標系と follower 座標系の位置と向きを調整します。

たとえば、剛体 B、剛体 C、それらを接続するジョイント Rg を考えます。座標系 FCB と座標系 FBC は、ジョイント "Rg" の base 座標系と follower 座標系です。下図は、剛体 "C" に付加された座標系 FCB の向きの選択が異なると、ジョイントの角度がゼロの場合に組み立てた構成の結果がどのように異なるかを示しています。座標系の向きを選択する際には、望ましい零点構成を念頭に置かなければなりません。

sm_dcrankaim_BC_zero_config.png

この照準機構では、座標系の向きを選択することで、すべてのボディの中心軸が同一のライン上に揃う既定のアセンブリ構成が得られます。

操作点を使用したアセンブリのガイド

次のコードを使用して、"dcrank_aiming_mechanism_v1" を使用して作成した機構 ("dcrankaim_approx_body_C_assembly_failure" で見つかったエラーの修正を含む) を可視化します。

dcrankAimMech_mb = dcrank_aiming_mechanism_v1(bodyA_l,bodyB_l,bodyC_dim,bodyD_l);
cmb = compile(dcrankAimMech_mb);
visualize(cmb,computeState(cmb,simscape.op.OperatingPoint),'vizAssembly');

すべてのボディが共通のライン上にまとめられたことがわかります。これが、既定のアセンブリ構成です。この構成では、すべての回転ジョイントの角度はゼロです。したがって、各回転ジョイントの base 座標系と follower 座標系は同一の位置にあり、互いに対して同一の向きになります。対応する座標系のペアは FDAFADFCBFBCFBDFDB です。一方、座標系 FCA は座標系 FAC から並進しているため、ジョイント "Pg" はゼロ状態にありません。computeState の結果を表示して、このアセンブリ構成におけるジョイント位置の値を確認できます。これは、現時点では望ましいアセンブリ構成ではありません。

sm_dcrankaim_default_assembly.png

機構の概略図に示された構成が、望ましい初期アセンブリ構成です。概略図から、初期構成では角度 β が約 35 度であることがわかります。"OperatingPoint" を使用してジョイントの位置ターゲットと速度ターゲットを指定することで、アセンブリ アルゴリズムをガイドできます。この例では、操作点を使用してジョイント "Ro" の位置ターゲットを設定することで、アセンブリを望ましい初期構成にガイドできます。ターゲットの優先順位は [High] に設定されています。システムのターゲットはこれ以外にないため、"computeState" は正確にターゲットを満たすことができます。

op = simscape.op.OperatingPoint;
op('Ro/Rz/q') = simscape.op.Target(35, 'deg', 'high') ;
% Note: As an aid to obtain the joint primitive paths needed by the operating point (i.e
% 'Ro/Rz/q'), use jointPrimitivePaths method of the Multibody object.
% For example, in this case we can view all the joint primitive paths using
% >> dcrankAimMech_mb.jointPrimitivePaths;

次に、上記の操作点の状態を計算し、"State" オブジェクトをチェックして、"Ro" のジョイント ターゲットが正確に満たされたことを確認します。

compiled_mb = dcrankAimMech_mb.compile();
state = compiled_mb.computeState(op)
state = 
  State:

  Status: Valid

  Assembly diagnostics:
  x
    Ro
        Joint successfully assembled
        Rz
            High priority position target +35 (deg) achieved
            Free velocity value: +0 (deg/s)
    P
        Joint successfully assembled
        Pz
            Free position value: +0.120952 (m)
            Free velocity value: +0 (m/s)
    Ri
        Joint successfully assembled
        Rz
            Free position value: +84.8864 (deg)
            Free velocity value: +0 (deg/s)
    Rg
        Joint successfully assembled
        Rz
            Free position value: -49.8864 (deg)
            Free velocity value: +0 (deg/s)

可視化して新しい構成を確認します。

compiled_mb.visualize(state,'vizAimMech');

sm_dcrankaim_guided_assembly_a.png

残念ながら、組み立てられた構成は意図したものと異なります。剛体 B の向きが概略図に示したものと異なるためです。RoRi の両方のジョイント角度を正確に指定しようとすると、この自由度 1 の機構では指定過剰になります。これは禁止されていませんが、矛盾がある場合、どちらのターゲットも達成されません。さらに、ジョイント Ri の望ましい角度はそもそも正確にわかっていません。

この状況で便利なアプローチは、Ro に設定された優先順位の高いターゲットの 35 度はそのままにして、優先順位の低い位置ターゲットによって Ri の角度を指定することです。後者は、望ましいジョイント角度の近似値またはヒントとなります。この場合、明らかに角度 θ を鈍角にすべきです。望ましい値のおおまかな推定値は 150 度です。このターゲットをジョイント Ri に、優先順位 [Low] で設定します。

op('Ri/Rz/q') = simscape.op.Target(150, 'deg', 'low') ;
compiled_mb = compile(dcrankAimMech_mb); 
state = computeState(compiled_mb,op);
visualize(compiled_mb,state,'vizAimMech');

新しいターゲットを設定した後に組み立てた構成を以下に示します。

sm_dcrankaim_guided_assembly_b.png

機構をシミュレートするために、"Multibody" オブジェクトの "makeBlockDiagram" メソッドを使用して Simulink モデルを作成できます。

makeBlockDiagram(dcrankAimMech_mb,op,'dcrankAimMech_model');

モデルが作成されたら、モデルのシミュレーションを実行 (Ctrl-T) して、重力下における機構の動きを表示します。

剛体への詳細の追加

これで、基本モデルが機能するようになりました。次の手順では詳細を追加し、モデルの現実感と正確性を高めます。剛体のジオメトリに関する詳細情報が入手できていないうちに、モデルの最初のバージョンを作成することもあります。剛体のインターフェイスを注意深く定義しておけば、モデルの残りの部分に影響を与えたり変更を及ぼしたりすることなく、各剛体に対して比較的簡単に詳細を追加できます。

たとえば、剛体 A のインターフェイスを変更せずに、この剛体に詳細を追加することを考えます。下図は、剛体 A をより単純なボディの複合体として示します。剛体 "A" で明らかになるインターフェイスは、これまでと同様に座標系 FAD と座標系 FAC のペアです。位置と向きは変わりません。座標系 F12F21F23、および F32 は剛体内部にあり、剛体の個々のピースを組み立てて一体化するために作成する必要があります。関数 "dcrankaim_detailed_body_A" は、剛体 "A" の構造の複雑なバージョンを示します。

sm_dcrankaim_body_A_cplx.png

関数の 2 番目のバージョン "dcrank_aiming_mechanism_v2" は、"dcrank_aiming_mechanism_v1" から得られ、剛体 "A" の複雑なバージョンを作成するために関数 "dcrankaim_approx_body_A" の呼び出しを "dcrankaim_detailed_body_A" に置き換えただけです。インターフェイスが変わっていないため、これだけの操作で済みます。次のコードを使用して、更新された機構を作成して表示します。

dcrankAimMech_mb = dcrank_aiming_mechanism_v2(simscape.Value(80,'cm'),simscape.Value(30,'cm'),simscape.Value([8 8 8],'cm'),simscape.Value(40,'cm'));
cmb = compile(dcrankAimMech_mb);
op = OperatingPoint;
op('Ro/Rz/q') = Target(35, 'deg', 'high') ;
op('Ri/Rz/q') = Target(150, 'deg', 'low') ;
visualize(cmb,computeState(cmb,op),'vizMechDetailed');

上記と同様のプロセスに従って、他の剛体にも詳細を追加できます。

sm_dcrankaim_v2_viz.png

まとめ

要約すると、MATLAB でマルチボディ システムを作成するために以下の手順を実行したことになります。

  • 機構の概略図から始め、機構にある剛体とジョイントを特定した。

  • "RigidBody" オブジェクトを使用して、各剛体の最初の近似を単独で作成した。

  • ジョイントを使用して剛体を組み立て、"Multibody""RevoluteJoint""PristmaticJoint" などのさまざまなオブジェクトを使用してアセンブリ機構の最初のバージョンを得た。

  • "Multibody" オブジェクトの "computeState" メソッドを使用して、アセンブリの問題を特定した。

  • "OperatingPoint" を使用して、アセンブリを望ましい構成にガイドした。

  • モデルの最初のフル バージョンが完成した後で、剛体のインターフェイスを変更せずに、剛体の 1 つに詳細を追加した。詳細を他の剛体にも追加することができた。

参考

| | | | | |

関連するトピック