PythonAPIでケーブル配策モデルを自動作成

Kosuke_IKEDA
Kosuke_IKEDA
Altair Employee
edited June 2023 in Altair Exchange

Overview

機構解析ソフトAltair MotionView / MotionSolveはPython APIが提供されており、さまざまな自動化が可能です。

今回はケーブル配策を対象に、ケーブルモデルを自動生成するPythonサンプルスクリプトを作成しました。

これにより、あるテンションをかけてケーブルをクリップした場合の最大曲げ角度(曲率)やトータルの曲げ角度などを評価できます。


Pre-Requisite

サンプルスクリプトのダウンロードはこちらです。

Altair SimulationのDesktop, Mechanical Solversのインストールが必要です。

ファイル構成

00_python_sub

calc_angle.py    :ケーブルの最大曲げ角度、トータル曲げ角度算出用ユーザーサブルーチン

cable_class.py       :ケーブル作成自動化のpython class

cable_instance_type1.py  :ケーブル配策モデル サンプル1 両端のクリップ

cable_instance_type2.py  :ケーブル配策モデル サンプル2 接触あり

cable_instance_type3.py  :ケーブル配策モデル サンプル3 クリップのスライドあり

 

Usage/Installation Instructions

実行方法

MotionViewを起動し、モデルブラウザの右クリックメニューのPython Scriptをクリックして、ケーブル配策モデルサンプル cable_instance_type1.py~cable_instance_type3.pyのいづれかを選択します。

cable_instance_type1.pyの場合、下記のようなモデルが自動で作成されます。

image

ケーブルの最大曲げ角度、トータル曲げ角度算出用ユーザーサブルーチンのパスが相対パスで定義されています。

ver. 2022.3現在では絶対パスに直す必要がありますので、calc_angle.pyを再度選択して、絶対パスに変更してください。

image

解析リボンの実行をクリックすると、ライブアニメーションでケーブルが変形する様子が確認できます。

image

 

結果の確認

HyperViewで.h3dファイルを開くことでアニメーション結果を確認できます。

HyperGraphで.abfファイルを開くことで最大曲げ角度などのプロットを確認できます。

image

最大曲げ角度などのプロットは.abfのREQSUB -> angleに格納されています。

RESULT(1):トータル曲げ角度

RESULT(2):最大曲げ角度

RESULT(3):最大曲げ角度の要素番号

image

ケーブルは離散のビーム要素でモデル化されていますので、曲げ角度は隣り合う要素の角度で計算しています。

image

 

ケーブル配策モデル サンプル1の解説

ケーブルの両端を固定クリップとしてケーブル配策を行うサンプルです。

image

cable_instance_type1.py

from cable_class import cable  #instance c=cable() sbeam=c.createBeam(varname='beam',N_beam=101,d_beam=10.0,con=0) sguide1=c.createGuide(varname='guide1',N_guide=2,d_guide=10.0, center = 5,     attbody='beam.pb1.body0',  attcurve = 'beam.curve_beam', lock=1, fix=0) sguide2=c.createGuide(varname='guide2',N_guide=2,d_guide=10.0, center = 1000-5, attbody='beam.pb1.body100', attcurve = 'beam.curve_beam', lock=1, fix=0) mot1=c.createMotionSys(varname='mot1',attbody='guide1.b_guide',x=0,y=0,rz='90d',t=5) mot2=c.createMotionSys(varname='mot2',attbody='guide2.b_guide',x=100,y=0,rz='-90d',t=5)  #sbeam ケーブルを定義します。離散の個数N_beamと1区間の長さd_beamを定義します。この場合(101-1) x 10.0 = 1000 mmのケーブルを定義しています。接触を用いない場合はcon=0としてください。 #sguide クリップを定義しています。今回ケーブル両端の2つのクリップを定義しています。クリップの長さd_guideと中心位置centerを定義します。attbodyでクリップを固定するケーブルのボディを選択します。両端なのでbody0とbody100を選択しています。クリップをケーブルに固定する場合はlock=1とします。クリップを初期位置から動かす場合はfix=0とします。 #mot クリップの移動位置を定義します。本スクリプトでは2次元を仮定していますので、x,y,rzを定義しています。また初期位置から移動位置までの移動時間をtで定義しています。 

 

ケーブル配策モデル サンプル2の解説

あるテンションをかけたケーブルがモノに接触する場合のケーブル配策を行うサンプルです。

image

cable_instance_type2.py

from cable_class import cable  #instance c=cable() sbeam=c.createBeam(varname='beam',N_beam=101,d_beam=10.0,con=1) sguide1=c.createGuide(varname='guide1',N_guide=2,d_guide=10.0, center = 5, attbody='beam.pb1.body0', attcurve = 'beam.curve_beam', lock=1, fix=1) sguide2=c.createGuide(varname='guide2',N_guide=2,d_guide=10.0, center = 595, attbody='', attcurve = 'beam.curve_beam', lock=0, fix=1) sobj1=c.createObj(varname='obj1',x=200,y= 55,z=0,r=50) sobj2=c.createObj(varname='obj2',x=300,y=-55,z=0,r=50) sobj2=c.createObj(varname='obj3',x=400,y= 55,z=0,r=50) con1=c.createContactSys(varname='con_beam1',NN=101,bpname='beam',objsys='obj1') con2=c.createContactSys(varname='con_beam2',NN=101,bpname='beam',objsys='obj2') con3=c.createContactSys(varname='con_beam3',NN=101,bpname='beam',objsys='obj3') tens=c.createTension(varname='tension',attbody='beam.pb1',NN=101,marker='guide2.b_guide.cm', value=50) mot1=c.createMotionSys(varname='mot1',attbody='obj1.b_obj',x=200,y= 25,rz=0,t=5) mot2=c.createMotionSys(varname='mot2',attbody='obj2.b_obj',x=300,y=-25,rz=0,t=5) mot3=c.createMotionSys(varname='mot3',attbody='obj3.b_obj',x=400,y= 25,rz=0,t=5)  #sbeam ケーブルを定義します。今回は接触がありますのでcon=1としています。 #sguide クリップを定義しています。2つめのクリップはケーブルがクリップをスライドする設定ですので、attbodyがブランクで、lock=0としています。また、クリップは初期位置で固定のためfix=1としています。 #sobj ケーブルの接触対象を定義しています。本スクリプトでは円柱のみです。中心座標x,yと半径rを定義します。 #con 接触を定義しています。NNでビームの分割数を指定してください。 #ten ケーブルのテンションを定義しています。テンションを与えるケーブルの要素番号をNNで指定します。また、テンションを与える方向をmarkerで選択します。今回は2つ目のガイドの向きに従う設定です。最後に荷重をvalueで定義します。 #mot 接触対象物である円柱の移動位置を定義します。 

 

ケーブル配策モデル サンプル3の解説

あるテンションをかけたケーブルをスライドするクリップで固定する場合のケーブル配策を行うサンプルです。

image

cable_instance_type3.py

from cable_class import cable  #instance c=cable() sbeam=c.createBeam(varname='beam',N_beam=101,d_beam=10.0,con=0) sguide1=c.createGuide(varname='guide1',N_guide=2,d_guide=10.0, center = 5,     attbody='beam.pb1.body0',  attcurve = 'beam.curve_beam', lock=1, fix=0) sguide2=c.createGuide(varname='guide2',N_guide=2,d_guide=10.0, center = 200,    attbody='',                attcurve = 'beam.curve_beam', lock=0, fix=0) sguide3=c.createGuide(varname='guide3',N_guide=2,d_guide=10.0, center = 400,   attbody='',                attcurve = 'beam.curve_beam', lock=0, fix=0) sguide4=c.createGuide(varname='guide4',N_guide=2,d_guide=10.0, center = 600,   attbody='',                attcurve = 'beam.curve_beam', lock=0, fix=0) mot1=c.createMotionSys(varname='mot1',attbody='guide1.b_guide',x=400,y=-200,      rz='180d',  t=5) mot2=c.createMotionSys(varname='mot2',attbody='guide2.b_guide',x=200,y=0,  rz='90d',      t=5) mot3=c.createMotionSys(varname='mot3',attbody='guide3.b_guide',x=400,y=200,    rz='0d', t=5) mot4=c.createMotionSys(varname='mot4',attbody='guide4.b_guide',x=600,y=0, rz='-90d',t=5) tens=c.createTension(varname='tension',attbody='beam.pb1',NN=101,marker='guide4.b_guide.cm', value=50)  #sbeam ケーブルを定義します。今回は接触はありませんのでcon=0としています。 #sguide クリップを定義しています。1つ目のクリップはケーブル固定で2~4つ目のクリップはケーブルがクリップをスライドする設定です。 #mot クリップの移動位置を定義します。 #ten ケーブルのテンションを定義しています。

Post-Requisite

使用製品:Altair MotionSolve/MotionView

よくあるエンジニアからの質問はこちら