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サンプル解説】デバッグスライダーで重力の方向を変更【manyspheres.py】

Posted at

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


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

本コードを実行すると、デバッグスライダーに指定された方向に重力を変更することができます。

manyspheres.gif

使用している機能

本コードは、以下の機能を使用して「デバッグスライダーの設定」「デバッグスライダーの値の取得」を実現しています。

デバッグスライダーの設定

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)
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?