0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【Pybulletサンプル解説】変形するオブジェクトを生成【deformable_torus.py】

Posted at

お疲れ様です。秋並です。

Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです(一覧はこちら)。


今回は、deformable_torus.pyを解説します。(コードのリンクはこちら

本コードを実行すると、剛体のオブジェクトと、変形するオブジェクトが生成されます。

deformable_torus.gif

使用している機能

本コードは、以下の機能を使用して「変形するオブジェクトが生成可能なワールドに設定」「urdfファイルからオブジェクトの生成」「ソフトボディのオブジェクトの生成」を実現できます。

変形するオブジェクトが生成可能なワールドに設定

resetSimulation 関数を使用することで、シミュレーションをリセットできます。

pybullet.resetSimulation(mode)
  • mode:どのモードでシミュレーションをリセットするか
    • RESET_USE_REDUCED_DEFORMABLE_WORLDの場合「変形するオブジェクト」が生成可能になります。

urdfファイルからオブジェクトの生成

loadURDF 関数を使用することで、urdfファイルからオブジェクトを生成できます。

pybullet.loadURDF(urdfFile, position)
  • urdfFile:生成するオブジェクトのurdfファイル
    • ワールドがRESET_USE_REDUCED_DEFORMABLE_WORLDの場合、変形するオブジェクトを生成できます
  • position:オブジェクトの生成位置

ソフトボディのオブジェクトの生成

loadSoftBody 関数を使用することで、ソフトボディのオブジェクトを生成できます。
loadUrdf関数と同様に、ワールドがRESET_USE_REDUCED_DEFORMABLE_WORLDの場合、変形するオブジェクトを生成できます。

softBodyId = pybullet.loadSoftBody(objectFile, 
                                    simFileName, 
                                    mass, 
                                    useNeoHookean, 
                                    NeoHookeanMu, 
                                    NeoHookeanLambda, 
                                    NeoHookeanDamping, 
                                    collisionMargin, 
                                    useSelfCollision, 
                                    frictionCoeff, 
                                    repulsionStiffness
)
  • softBodyId:ソフトボディのオブジェクトのID
  • objectFile:ソフトボディのオブジェクトのファイル
  • simFileName:シミュレーションファイル
  • mass:重量
  • useNeoHookean:ネオフック材料モデルの使用
  • NeoHookeanMu:ネオフック材料のパラメータ1
  • NeoHookeanLambda:ネオフック材料のパラメータ2
  • NeoHookeanDamping:ネオフック材料のパラメータ3
  • collisionMargin:衝突マージン
  • useSelfCollision:自己衝突の使用
  • frictionCoeff:摩擦係数
  • repulsionStiffness:反発剛性

コメントをつけたサンプルコード

サンプルコードにコメントをつけたものが以下になります(もともとあった不要と思われるコメント等については削除しています)

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.resetDebugVisualizerCamera(3,-420,-30,[0.3,0.9,-2])

# 重力を設定
p.setGravity(0, 0, -10)

# テクスチャをロードする
tex = p.loadTexture("uvmap.png")

# 床のオブジェクトを生成
planeId = p.loadURDF("plane.urdf", [0,0,-2])

# ボックスのオブジェクトを生成
boxId = p.loadURDF("cube.urdf", [0,3,2],useMaximalCoordinates = True)

# ソフトボディのオブジェクトの生成
bunnyId = p.loadSoftBody("torus/torus_textured.obj", simFileName="torus.vtk", mass = 3, useNeoHookean = 1, NeoHookeanMu = 180, NeoHookeanLambda = 600, NeoHookeanDamping = 0.01, collisionMargin = 0.006, useSelfCollision = 1, frictionCoeff = 0.5, repulsionStiffness = 800)

# オブジェクトにテクスチャを適用
p.changeVisualShape(bunnyId, -1, rgbaColor=[1,1,1,1], textureUniqueId=tex, flags=0)

# 変形するオブジェクトを設定
bunny2 = p.loadURDF("torus_deform.urdf", [0,1,0.5], flags=p.URDF_USE_SELF_COLLISION)

# オブジェクトにテクスチャを適用
p.changeVisualShape(bunny2, -1, rgbaColor=[1,1,1,1], textureUniqueId=tex, flags=0)

# sdfのボクセルのサイズを0.25に設定
p.setPhysicsEngineParameter(sparseSdfVoxelSize=0.25)

# リアルタイムシミュレーションモードをOFFに設定
p.setRealTimeSimulation(0)

# Pybulletが接続されている間、ループを繰り返す
while p.isConnected():

  # シミュレーションを1時刻分進める
  p.stepSimulation()

  # カメラ画像を取得
  p.getCameraImage(320,200)

  # 重力を設定
  p.setGravity(0,0,-10)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?