MV-9000:跳ね返るボールのチュートリアル

本チュートリアルでは、Msolve Python APIを用いてシンプルな自由度1の機構をモデル化する方法を学びます。

本チュートリアルをIPython notebookとして実施している場合、SHIFT-ENTERをクリックすることにより、各コードセルを内部的に実行することが可能です。Pythonコードの出力(存在する場合)が表示され、実行すると次のセルにジャンプします。

下の図は、必要とされる形状と値を示しています。


図 1.

msolveモジュールの読み込み

msolveモジュールを読み込むには、以下のコマンドを実行します:
In [2]: from msolve import*
上記のコマンドを実行するには、msolveモジュールがコンピュータのパスになければなりません。上記が成功したと仮定すると、msolveの名称は現在のネームスペースにインポートされています。これにより、msolveで定義されているすべてのクラスと関数にアクセスできるようになり、バウンドするボールケースの作成を開始することができます。

モデルの作成

振子の機構を作成するにはまず、モデルを作成する必要があります。

このコマンドを実行します:
In [3]: model = Model() 
上記のコマンドを実行するには、msolveモジュールがコンピュータのパスになければなりません。上記が成功したと仮定すると、msolveの名称は現在のネームスペースにインポートされています。これにより、msolveで定義されているすべてのクラスと関数にアクセスできるようになり、バウンドするボールケースの作成を開始することができます。

単位と重力の追加

モデルを作成した後、単位、重力や地面などのエンティティを追加することができます。ほとんどのエンティティはデフォルトのプロパティを有しています。たとえば、引数を指定せずにソルバーの単位セットを作成する場合、基本的にはSI単位を作成していることになります。

  1. このコマンドを実行します:
    In [4]: units = Units()  #SI 
  2. 同様に、重力加速度場を作ることができます。
    In [5]: grav = 9.807
    gravity = Accgrav(igrav=0, jgrav=0, kgrav=-grav) 
    
  3. また、Partクラスを使用して地面のBoolean属性を'True'に指定することで、地面のパートを作成することができます。
    In [6]: ground = Part(ground=True)

マーカーの作成

次に、地面パートにマーカーを作成します。マーカーは、空間内の幾何学的なポイントと、その点を原点とした互いに直交する3つの座標軸のセットによって定義されます。これは、属するパートの参照フレームとして使用することができます。

このコマンドを実行します:
In [7]: global_ref = Marker(part=ground) 

形状オブジェクトの作成

アニメーションのために、形状オブジェクトを作成することができます。ここでは、ボックスが地面を表しています。ドキュメントによると、ボックスにはセンターマーカーとそのx、y、z寸法が必要とされます。

  1. このコマンドを実行します:
    In [8]: box=Box(cm=global_ref, x=20, y=20, z=5) 

    同様に、最初に質量のあるパートを作成し、そのパートの重心に位置する球体形状を作成することでボールを作成することができます。地面のパートを作成する場合を除き、そのパートの質量と重心をソルバーに入力してください。

    球体の質量は次の式で求められます:(1) m = V × ρ = 4 3 π r 3 × ρ
    慣性のプロパティは次の式で求められます:(2) I x x = I y y = I z z = 2 m r 2 5
  2. このコマンドを実行します:
    In [9]: # define the cm of sphere
    radius = 1
    initial_offset = 10
    p = Point(0,0,radius+box.z/2.0+initial_offset)
    
    # calculate the mass and inertial property of sphere
    volume = (4.0/3.0)*radius**3
    density = 1522
    mass = volume * density
    ixx = iyy = izz = 2.0 * mass * radius ** 2 / 5.0
    
    # create part and cm for the sphere 
    sphere= Part(mass = mass, ip = (ixx, iyy, izz, 0, 0, 0 ), qg=p)
    sphere.cm = Marker(body=sphere)
    
    # create the geometry
    geo = Sphere(cm=sphere.cm, radius = radius) 
    

接触力の定義

地面と球体の間の接触力を定義することができます。まず、接触点における各パート上のマーカーを定義します。これら2つのマーカーは、力の計算と変位の監視で使用されます。

  1. このコマンドを実行します:
    In [10]: marker_i = Marker(part = sphere, qp = (0,0,-radius), xp = (1,0,0), zp = (0,0,100))
    marker_j = Marker(part = ground, qp = (0,0,box.z/2.0), xp = (1,0,0), zp = (0,0,box.z/2.0+1))  
  2. Sforceを呼び出して、ボールが動くときの接触力を計算します。入力関数はMotionSolve式である必要があり、マーカーjのz軸は力がかかる方向を定義します。
    In [11]: input_function =
    "IMPACT(DZ({I}, {J}, {J}),VZ({I}, {J}, {J}),{G},{K},{E},{C},{D})"
    .
    format( I=marker_i.id,J=marker_j.id, K=5e9, G=0.00, E=1.0, C=0.8e5, D=0.0 )
    contact_force = Sforce(i = marker_i.id, j = marker_j.id,
    type=
    "TRANSLATION"
    , function = input_function) 
    

ジョイントとリクエストの追加

ここに並進ジョイントを追加することで、(必要ではないものの)ボールが動き廻らないようにすることができます。ジョイントを作成するために、ジョイントのタイプとジョイントが配置されるマーカーを定義します。マーカーjのz軸は、並進ジョイントの方向を定義します。

リクエストを作成することも可能です。リクエストはMotionSolveの出力チャンネルを定義し、MotionSolveの出力ファイルに書き込まれ、HyperGraphによるプロッティングや信号処理に使用されます。リクエストは、ランタイム式、組み込み関数(MOTION、FORCE、FIELDなど)、またはユーザーが作成した関数を使用して定義することができます。

  1. 事前に定義された“DZ”メソッドを使用して変位のリクエストを作成し、その後、接触力を追跡するための別のリクエストを作成します:
    In [12]: # Translational Joint, prevent the sphere flapping around
    joint = Joint (type="TRANSLATIONAL",i=marker_i.id,j=marker_j.id)
    
    # Adding monitor into the model
    model.forceRequest = forceRequest = Request(f2="FZ({I},{J},{J})".format(I=marker_i.id, J=marker_j.id))
    model.dispRequest = dispRequest = Request(f2="DZ({I}, {J}, {J})".format(I=marker_i.id, J=marker_j.id))  
  2. Sforceを呼び出して、ボールが動くときの接触力を計算します。入力関数はMotionSolve式である必要があり、マーカーjのz軸は力がかかる方向を定義します。
    In [13]: input_function =
    "IMPACT(DZ({I}, {J}, {J}),VZ({I}, {J}, {J}),{G},{K},{E},{C},{D})"
    .
    format( I=marker_i.id,J=marker_j.id, K=5e9, G=0.00, E=1.0, C=0.8e5, D=0.0 )
    contact_force = Sforce(i = marker_i.id, j = marker_j.id,
    type=
    "TRANSLATION"
    , function = input_function) 
    

シミュレーションの実行

この時点で、過渡解析を実行する準備が整っています。シミュレート手法はMBSモデル上で起動されます。モデルを構成する各エンティティ上で、検証プロセスが実行されます。これは、正しいモデルのみがシミュレートされていることを確認するために必要なステップです。シミュレートコマンドは、オプションのフラグreturnResultsTrueに設定して呼び出すことができます。これは以下に示すように、シミュレーションの結果をさらにポスト処理するために実行コンテナに保存します。

  1. 以下のコマンドを実行します:
    In [14]: run=model.simulate(type="DYNAMIC", returnResults=True, 
    end=50, steps = 10000) 
  2. 次の例では、実行コンテナからmodel.despRequestを抽出しています。時間変化する結果を抽出するのに便利なデータ構造を持つことが目的です。
    In [15]: dz=run.getObject(model.dispRequest)
  3. IPython notebookで提供されているmatplotlibモジュールを使用して、全体z軸に沿って変位をプロットするには、dzオブジェクトを使用します。プロットはインラインで表示されます。時間の経過とともに跳ね返りの大きさが変化していくのがわかります。
    In [16]: %matplotlibinline
    frommatplotlibimport pyplot
    pyplot.plot(dz.times, dz.getComponent(1))
    pyplot.xlabel('Time(s)')
    pyplot.ylabel('Displacement(m)')
    pyplot.show() 


    図 2.

    接触力の定義に減衰があるため、ボールが地面に当たるたびに跳ね返りの大きさが小さくなります。