Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです(一覧はこちら)。
今回は、manyspheres.pyを解説します。(コードのリンクはこちら)
本コードを実行すると、デバッグスライダーに指定された方向に重力を変更することができます。
使用している機能
本コードは、以下の機能を使用して「デバッグスライダーの設定」「デバッグスライダーの値の取得」を実現しています。
デバッグスライダーの設定
addUserDebugParameter
関数を使用することで、デバッグ用のスライダーを設定できます。
debugSliderId = p.addUserDebugParameter(paramName, minVal, maxVal, initVal)
-
debugSliderId
:デバッグスライダーのID -
paramName
:パラメータの名称 -
minVal
:パラメータの最小値 -
maxVal
:パラメータの最大値 -
initVal
:パラメータの初期値
今回は、重力を設定するために使用します。
# 重力の方向を設定するデバッグスライダーを設定
gravXid = p.addUserDebugParameter("gravityX", -10, 10, 0)
gravYid = p.addUserDebugParameter("gravityY", -10, 10, 0)
gravZid = p.addUserDebugParameter("gravityZ", -10, 10, -10)
デバッグスライダーの値の取得
readUserDebugParameter
関数を使用することで、デバッグスライダーの値を取得可能です。
paramVal = pybullet.readUserDebugParameter(debugSliderId)
-
paramVal
:デバッグスライダーで設定された値 -
debugSliderId
:デバッグスライダーのID
今回は、デバッグスライダーに設定された重力の値を取得しています。
# デバッグスライダーから値を取得し重力に設定
gravX = p.readUserDebugParameter(gravXid)
gravY = p.readUserDebugParameter(gravYid)
gravZ = p.readUserDebugParameter(gravZid)
コメントをつけたサンプルコード
サンプルコードにコメントをつけたものが以下になります(もともとあった不要と思われるコメント等については削除しています)
import pybullet as p
import time
import pybullet_data
# Pybulletに共有メモリモードで接続
conid = p.connect(p.SHARED_MEMORY)
# 接続に失敗したら、GUIモードで接続
if (conid < 0):
p.connect(p.GUI)
# Pybulletに関するデータパスを取得
p.setAdditionalSearchPath(pybullet_data.getDataPath())
# 内部シミュレーションフラグをリセット
p.setInternalSimFlags(0)
# シミュレーションをリセット
p.resetSimulation()
# 床のオブジェクトを生成
p.loadURDF("plane.urdf", useMaximalCoordinates=True)
# トレイのオブジェクトを生成
p.loadURDF("tray/traybox.urdf", useMaximalCoordinates=True)
# 重力の方向を設定するデバッグスライダーを設定
gravXid = p.addUserDebugParameter("gravityX", -10, 10, 0)
gravYid = p.addUserDebugParameter("gravityY", -10, 10, 0)
gravZid = p.addUserDebugParameter("gravityZ", -10, 10, -10)
# ソルバーの反復回数を設定
p.setPhysicsEngineParameter(numSolverIterations=10)
# 接触分離の閾値を設定
p.setPhysicsEngineParameter(contactBreakingThreshold=0.001)
# レンダリングを無効化
p.configureDebugVisualizer(p.COV_ENABLE_RENDERING, 0)
# 10×10×10のグリッドに小さな球体を生成
for i in range(10):
for j in range(10):
for k in range(10):
ob = p.loadURDF("sphere_1cm.urdf", [0.02 * i, 0.02 * j, 0.2 + 0.02 * k],
useMaximalCoordinates=True)
# レンダリングを有効化
p.configureDebugVisualizer(p.COV_ENABLE_RENDERING, 1)
# 重力を設定
p.setGravity(0, 0, -10)
# リアルタイムシミュレーションを設定
p.setRealTimeSimulation(1)
while True:
# デバッグスライダーから値を取得し重力に設定
gravX = p.readUserDebugParameter(gravXid)
gravY = p.readUserDebugParameter(gravYid)
gravZ = p.readUserDebugParameter(gravZid)
p.setGravity(gravX, gravY, gravZ)
time.sleep(0.01)