MV-9002:溝付きリンクチュートリアル
本チュートリアルでは、形状をインポートし、Msolve MotionSolve Python APIを用いてシンプルなPoisson接触をモデル化する方法を学びます。
本チュートリアルをIPython notebookとして実施している場合、SHIFT-ENTERをクリックすることにより、各コードセルを内部的に実行することが可能です。Pythonコードの出力(存在する場合)が表示され、実行すると次のセルにジャンプします。これを実行したい場合は、ファイルslotted_link.femがフォルダー内にあることを確認してください。
msolveモジュールの読み込み
In [1]: from msolve import*
上記のコマンドを実行するには、msolveモジュールがコンピュータのパスになければなりません。上記が成功したと仮定すると、msolveの名称は現在のネームスペースにインポートされています。これにより、msolveで定義されているすべてのクラスと関数にアクセスできるようになり、本ケースの作成を開始することができます。
モデルの作成
リンクの機構を作成するにはまず、モデルを作成する必要があります。モデルは、すべてのエンティティの親として機能するコンテナに他なりません。
In [2]: model = Model()
単位と重力の追加
パートの追加
次に、リンク、カム、ピン、溝付きリンクを表す4つのパーツを作成します。また、パーツの質量、初期プロパティ、重心を指定することができます。この情報は、CADやFEMファイルからMotionSolveに自動的にインポートはされません。
In [6]: link = Part(cm=Marker(),mass = 0.0526,ip=[20.0844,21.7819,1.9169,0,0,0])
link.cm.qp = [0, -17.499994784, 33.609856169]
pin = Part(cm=Marker(),mass = 0.0972, ip = [15.3742, 4.8085, 15.37, 0,0,0])
pin.cm.qp = [0,-0.000001527,74.999999124]
cam = Part(cm=Marker(),mass = 1.2159, ip = [372.14,961.3416,913.45,0,0,0])
cam.cm.qp = [0,0,-21.22]
slotted_link = Part(cm=Marker(),mass = 5.8943,ip = [3721.7065,1.8e5,1.7689e5,0,0,0])
slotted_link.cm.qp = [224.988, 0, -63.813495]
形状用のマーカーの定義
形状をインポートする前に、その形状がリンクされているパートのマーカーを定義する必要があります。この場合、重心マーカーは使用できません。FEM内の節点の位置は全体参照フレームで測定され、重心マーカーはパートの局所参照を表します。したがって、全体座標系の原点と一致する4つのマーカーを作成する必要があります。
In [7]: link_geo_marker = Marker(part = link)
pin_geo_marker = Marker(part = pin)
cam_geo_marker = Marker(part = cam)
slotted_link_geo_marker = Marker(part = slotted_link)
形状のインポート
これで、パーツの形状をインポートできるようになりました。これを行うために、4つの外部インスタンスを作成します。クラスExternalは、CADファイルやFEMファイルのインポートを支援するために作成されています。インポートしたファイルに複数のコンポーネントがある場合は、'element'プロパティを指定することで、それらを1つずつ抽出することができます。CADファイルをインポートした際に、'refinement_level’の値を大きくすることでメッシュを改善することができます。以下の例では、この場合の外部インスタンスの作成方法を示しています。
In [8]: link_geo = External(rm = link_geo_marker, file ="slotted_link.fem",
element=["Link"], refinement_level = 0)
pin_geo = External(rm = pin_geo_marker, file ="slotted_link.fem",
element=["Pin"], refinement_level = 0)
cam_geo = External(rm = cam_geo_marker, file ="slotted_link.fem",
element=["Cam"], refinement_level = 0)
slotted_link_geo = External(rm = slotted_link_geo_marker, file ="slotted_link.fem",
element=["Slotted_Link"], refinement_level = 0)
ジョイントの追加
次のステップは、異なるパート間のジョイントの作成です。2つの固定ジョイントが作成されます。1つはピンとリンクの間、もう1つはリンクとカムを接続します。固定ジョイントの場合、iマーカーとjマーカーは、それらのx、y、z軸を揃えて一致させる必要があります。
運動の追加
msolveでMotionのインスタンスを作成することで、運動を作成することができます。プロパティ’function’を指定することで、運動のパターンを変更することが可能です。プロパティ’function’はMotionSolve式でなければなりません。
In [12]: cam_pivot_motion = Motion(joint=cam_pivot_revolute, jtype="ROTATION",dtype=
"DISPLACEMENT",function='360d*TIME')
接触の追加
最後のステップは、インポートした形状間の接触を作成することです。ここでは2つのPoisson接触が作成されます: 1つはカムとスロットリンクの間、もう1つはピンとスロットリンクの間です。
In [13]: cam_slotted_contact = Contact(igeom=cam_geo,jgeom=slotted_link_geo,type="POISSON",
restitution_coefficient=0.5,penalty=1e5)
pin_slotted_contact = Contact(igeom=pin_geo,jgeom=slotted_link_geo,type="POISSON",
restitution_coefficient=0.5,penalty=1e5)
リクエストの作成
モデルを実行する前に、接触力と貫通の深さを追跡するリクエストを作成します。結果はpyplotを用いてプロットすることができます。
In [14]:#forceRequest = Request(f2="FX({I})".format(I=slotted_link_geo_marker.id))
forceRequest = Request(f1="CONTACT({ID},{JFLAG},{COMP},{RM})".format(ID=cam_slotted_contact.id,
JFLAG=1,COMP=1,RM=0),
f2="CONTACT({ID},{JFLAG},{COMP},{RM})".format(ID=pin_slotted_contact.id,
JFLAG=1,COMP=1,RM=0))
depthRequest = Request(f1="CONTACT({ID},{INDEX},{RM})".format(ID=cam_slotted_contact.id,
INDEX=1,RM=0),
f2="CONTACT({ID},{INDEX},{RM})".format(ID=pin_slotted_contact.id,
INDEX=1,RM=0))
シミュレーションの実行
この時点で、過渡解析を実行する準備が整っています。シミュレート手法はMBSモデル上で起動されます。モデルを構成する各エンティティ上で、検証プロセスが実行されます。これは、正しいモデルのみがシミュレートされていることを確認するために必要なステップです。シミュレートコマンドは、オプションのフラグreturnResultsをTrueに設定して呼び出すことができます。これは以下に示すように、シミュレーションの結果をさらにポスト処理するために実行コンテナに保存します。
また、アニメーション用にMotionViewに取り込める出力ファイルを生成することも可能です。
In [15]: run=model.simulate(type="DYNAMIC", returnResults=True,
end=3, steps = 3000)
model.generateOutput()
プロットとアニメーションの生成
%matplotlib inline
force = run.getObject(forceRequest)
depth = run.getObject(depthRequest)
from matplotlib import pyplot
pyplot.subplot(2,1,1)
pyplot.plot(force.times, force.get
Component(0),'r',force.times, force.getComponent(1))
pyplot.title("Contact Force Magnitude")
pyplot.xlabel("Time(s)")
pyplot.ylabel("Contact Force (N)")
pyplot.grid(True)
pyplot.legend(["Cam-Slotted Contact","Pin-Slotted Contact"],loc="upper left",prop={'size':8})
pyplot.subplot(2,1,2)
pyplot.plot(depth.times, depth.getComponent(0),'r',depth.times, depth.getComponent(1))
pyplot.title("Maximum Penetration Depth")
pyplot.xlabel("Time(s)")
pyplot.ylabel("Penetration Depth (m)")
pyplot.grid(True)
pyplot.legend(["Cam-Slotted Contact","Pin-Slotted Contact"],loc="upper left",prop={'size':8})
pyplot.subplots_adjust(hspace=0.5)
pyplot.show()
図 1.

図 2.