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