パラメトリックバケットモデルから面積、線長さ、角度などを算出する方法


本記事では、Altair Inspireを用いて作成したパラメトリックバケットモデルに対し、形状変更後の面積や線長さ、角度などを算出する方法を紹介します。バケット側面の面積は体積一定の様々なバケットモデルを生成するのに役立ちます。

算出にはPythonAPIを使用します。

本記事で使用したモデル、スクリプト、入力ファイルは下記よりダウンロードいただけます。

bucket_param.stmod

py_calc_area.py

param.txt

 

モデル

パラメトリックバケットモデルの作成方法

の記事で、下記の論文の図5を参考にパラメトリックのバケットモデルを作成しました。

Haoran Sun, Zhigui Ren, Jiahao Li, Gaowei Li, and Wenshuai Liu. Bucket structure optimization of backhoe hydraulic excavator based on compound digging trajectory and limit digging force. Advances in Mechanical Engineering 2022, Vol. 14(4) 1-8

ただし、上記論文と作成したモデルではパラメータの取り方が一部異なります。

 

  参考論文 作成モデル
バケット前後長さ R R
フロント壁長さ l1 l1
カットアングル beta beta
ボトム円弧長さ l2 -
ボトム円弧半径 - r
リア壁長さ l3 -
バックアングル gamma -

 そこで、本記事では、パラメータ変更後のl2、l3、gammaを算出する方法と、体積一定拘束を付与するための側面積AをpythonAPIを用いて算出します。

 

Pythonスクリプトと実行方法

作成したスクリプトはこちらです。

from hwx import inspire

#define path & filename
filepath = r"G:\data\Motion_Training\bucket_optimization\model\Inspire"
filename = "bucket_param.stmod"

#read inspire model
model = inspire.openFile(filepath + "/" + filename)

#read parameter from param.txt
with open("param.txt") as f:
    s = f.read()
param=s.split('\n')

#update paraeter
model.variables.update("R", expression = param[0] + " mm")
model.variables.update("beta", expression = param[1] + " deg")
model.variables.update("l1", expression = param[2] + " mm")
model.variables.update("r", expression = param[3] + " mm")

#get bucket side wall area
bucket = model.getChild(name='bucket', recursive=True, type=inspire.Part)
s=bucket.getFeatures(name='FeaturePlanar(bucket.10)')[0]
area=str(s.area)
l=bucket.getFeatures(name='FeatureCircular(bucket.12)')[0]
l2=str(l.length)
l=bucket.getFeatures(name='FeatureLinear(bucket.9)')[0]
l3=str(l.length)

point1 = bucket.getFeatures(name='FeaturePoint(bucket.1)')[0]
point2 = bucket.getFeatures(name='FeaturePoint(bucket.3)')[0]
point3 = bucket.getFeatures(name='FeaturePoint(bucket.6)')[0]

angleMeasure = inspire.AngleMeasure(point1.location,
                                    point2.location,
                                    point3.location,
                                    entity1 = point1, 
                                    entity2 = point2,
                                    entity3 = point3 )
gamma=str(angleMeasure.angle)                                   

outlist=[area, '\n', l2, '\n',l3, '\n', gamma]
f = open("area.txt",'w')
f.writelines(outlist)
f.close()

 また、設計変数R,beta,l1,rを書き換えるための入力ファイルparam.txtを別途準備します。上から順にR,beta,l1,rの値を記述しています。

1800.000000
33.000000
1200.000000
570.000000

 以下のコマンドでpythonスクリプトを実行できます。Inspireのインストールパスはみなさまの環境に合わせて変更してください。

"C:\Program Files\Altair\2023.1\Inspire2023.1\hwx\bin\win64\ExecWinEnvInsp.exe" -b -p Inspire -ex hwx.exe -f py_calc_area.py

実行すると次のテキストファイルarea.txtが出力されます。上から順にA[m2], l2[m], l3[m], 90-gamma[deg.]となります。

1.585403532672351
1.386456433954485
0.7785931950069177
82.36509148131691

 param.txtの値を変更して実行すると、新しいバケット形状に対する数値が求まります。

 

解説

スクリプトを解説します。

from hwx import inspire

#define path & filename
filepath = r"G:\data\Motion_Training\bucket_optimization\model\Inspire"
filename = "bucket_param.stmod"

#read inspire model
model = inspire.openFile(filepath + "/" + filename)

#read parameter from param.txt
with open("param.txt") as f:
    s = f.read()
param=s.split('\n')

Inspireのライブラリの読み込み、Inspireモデルの読み込み、および入力ファイルparam.txtの読み込みです。

Inspireモデルは固定パスのものを読み込みます。パスはみなさまの環境に合わせてください。

param.txtはパス無しで指定しています。pythonを実行したフォルダ内のparam.txtを読みに行きます。

 

#update paraeter
model.variables.update("R", expression = param[0] + " mm")
model.variables.update("beta", expression = param[1] + " deg")
model.variables.update("l1", expression = param[2] + " mm")
model.variables.update("r", expression = param[3] + " mm")

モデルのパラメータを上書きす処理になります。

param.txtから読み取った値を用いて、Inspireのパラメータの値を変更します。

 

#get bucket side wall area
bucket = model.getChild(name='bucket', recursive=True, type=inspire.Part)
s=bucket.getFeatures(name='FeaturePlanar(bucket.10)')[0]
area=str(s.area)
l=bucket.getFeatures(name='FeatureCircular(bucket.12)')[0]
l2=str(l.length)
l=bucket.getFeatures(name='FeatureLinear(bucket.9)')[0]
l3=str(l.length)

名前がbucketのパートを取得し、bucketの面積A、円弧長さl2、直線長さl3を取得しています。

各featureには番号が定義されているため、bucket.10などの数値でfeatureを取得して、.area / .lengthなどで面積、長さが取得できます。

featureの番号は下記スクリプトで取得できます。

from hwx import inspire
from hwx.inspire.gui.debug import pickFeatures
model = inspire.getModel()
pickFeatures()

ライブラリと現在開いているモデルを読み込み、pickFeature()でGUI上でクリックしたFeatureの番号を調べることができます。

 

point1 = bucket.getFeatures(name='FeaturePoint(bucket.1)')[0]
point2 = bucket.getFeatures(name='FeaturePoint(bucket.3)')[0]
point3 = bucket.getFeatures(name='FeaturePoint(bucket.6)')[0]

angleMeasure = inspire.AngleMeasure(point1.location,
                                    point2.location,
                                    point3.location,
                                    entity1 = point1, 
                                    entity2 = point2,
                                    entity3 = point3 )
gamma=str(angleMeasure.angle)                           

同様に3点を取得しバックアングルの角度を算出します。算出した角度は90-gammaの値になります。

 

outlist=[area, '\n', l2, '\n',l3, '\n', gamma]
f = open("area.txt",'w')
f.writelines(outlist)
f.close()

算出したA, l2, l3, gammaの4つの値をarea.txtに書き出します。

 

関連記事

パラメトリックバケットモデルの作成方法

バケット掘削時の掘削土量を算出するEDEMpyスクリプト

Altair HyperStudyを用いたバケットの自動形状変更方法(体積一定拘束なし)

 

使用ソフト

Altair Inspire

Altair EDEM

Altair MotionView/MotionSolve

Altair HyperStudy