お疲れ様です。秋並です。
Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです(一覧はこちら)。
今回は、deformable_ball.pyを解説します。(コードのリンクはこちら)
本コードを実行すると、剛体のキューブと変形するボールが生成されます。
使用している機能
本コードは、以下の機能を使用して「ソフトボディのオブジェクトの生成」を実現できます。
ソフトボディのオブジェクトの生成
loadSoftBody
関数を使用することで、ソフトボディのオブジェクトを生成できます。
loadUrdf
関数と同様に、ワールドがRESET_USE_REDUCED_DEFORMABLE_WORLD
の場合、変形するオブジェクトを生成できます。
softBodyId = pybullet.loadSoftBody(objectFile,
simFileName,
base_position,
scale,
mass,
useNeoHookean,
NeoHookeanMu,
NeoHookeanLambda,
NeoHookeanDamping,
useSelfCollision,
frictionCoeff,
collisionMargin
)
-
softBodyId
:ソフトボディのオブジェクトのID -
objectFile
:ソフトボディのオブジェクトのファイル -
simFileName
:シミュレーションファイル -
base_position
:位置([x,y,z]) -
scale
:スケール -
mass
:重量 -
useNeoHookean
:ネオフック材料モデルの使用 -
NeoHookeanMu
:ネオフック材料のパラメータ1 -
NeoHookeanLambda
:ネオフック材料のパラメータ2 -
NeoHookeanDamping
:ネオフック材料のパラメータ3 -
useSelfCollision
:自己衝突の使用 -
frictionCoeff
:摩擦係数 -
collisionMargin
:衝突マージン
コメントをつけたサンプルコード
サンプルコードにコメントをつけたものが以下になります(もともとあった不要と思われるコメント等については削除しています)
import pybullet as p
from time import sleep
import pybullet_data
# PybulletをGUIモードで接続
physicsClient = p.connect(p.GUI)
# Pybulletに関するデータパスを取得
p.setAdditionalSearchPath(pybullet_data.getDataPath())
# シミュレーションを「変形可能なワールド」にリセットする
p.resetSimulation(p.RESET_USE_DEFORMABLE_WORLD)
# 重力を設定
p.setGravity(0, 0, -10)
# 床の姿勢を設定
planeOrn = [0,0,0,1]
# 床のオブジェクトを生成
planeId = p.loadURDF("plane.urdf", [0,0,-2],planeOrn)
# ボックスのオブジェクトを生成
boxId = p.loadURDF("cube.urdf", [0,3,2],useMaximalCoordinates = True)
# ボールの変形するオブジェクトを生成
ballId = p.loadSoftBody("ball.obj", simFileName = "ball.vtk", basePosition = [0,0,-1], scale = 0.5, mass = 4, useNeoHookean = 1, NeoHookeanMu = 400, NeoHookeanLambda = 600, NeoHookeanDamping = 0.001, useSelfCollision = 1, frictionCoeff = .5, collisionMargin = 0.001)
# 1時刻分シミュレーションを進めたときの経過時間の設定
p.setTimeStep(0.001)
# sdfのボクセルのサイズを0.25に設定
p.setPhysicsEngineParameter(sparseSdfVoxelSize=0.25)
# Pybulletが接続されている間ループを繰り返す
while p.isConnected():
# シミュレーションを1時刻分進める
p.stepSimulation()
# 重力を設定
p.setGravity(0,0,-10)