お疲れ様です。秋並です。
Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです(一覧はこちら)。
今回は、changeDynamicsMass.pyを解説します。(コードのリンクはこちら)
本コードを実行すると、2つのオブジェクトが生成され、そのうち片方のオブジェクトの動力学特性を変更します。
使用している機能
本コードは、以下の機能を使用して「オブジェクトの動力学特性の変更」を実現しています。
- 動力学特性の変更
動力学特性の変更
pybulletでは、changeDynamics
関数を使用することで「物体の指定したリンクの動力学特性」を設定することができます。
pybullet.changeDynamics(objectId, linkIdx, mass)
-
objectId
:動力学特性を変更したいオブジェクトのID -
linkIdx
:オブジェクトのリンクのインデックス- ベースリンクの場合は、
-1
を指定
- ベースリンクの場合は、
-
mass
:重量(kg)
今回の場合、loadURDF
関数でcube2
のベースリンクを空間上に固定した状態(useFixedBase=True
)で生成しています。
そのため、このままの状態ではcube2
は重力の影響を無視し、空間上に固定されたままなのですが、そのあとに changeDynamics
関数を使用することで重力の影響を受け落下するようになります。
(ただし、サンプルコードでは、時間を待たずにすぐにchangeDynamics
関数を呼び出しているため、コードを実行した際は、すぐにcube2
が落下しているように見えます。)
コメントをつけたサンプルコード
サンプルコードにコメントをつけたものが以下になります(もともとあった不要と思われるコメント等については削除しています)
import pybullet as p
import time
import pybullet_data
# PubulletをGUIモードで接続
p.connect(p.GUI)
# Pybulletに関するデータのパスを取得
p.setAdditionalSearchPath(pybullet_data.getDataPath())
# 箱形のオブジェクトを2つ生成する(ベースリンクを空間に固定した状態で生成)
cube2 = p.loadURDF("cube.urdf", [0, 0, 3], useFixedBase=True)
cube = p.loadURDF("cube.urdf", useFixedBase=True)
# 重力を設定
p.setGravity(0, 0, -10)
# シミュレーションの時間ステップ(1ステップあたりに経過する秒数)を設定
timeStep = 1. / 240.
p.setTimeStep(timeStep)
# cube2の動力学特性を変更
p.changeDynamics(cube2, -1, mass=1)
# Pybulletが接続されている間ループを継続
while (p.isConnected()):
# シミュレーションを1ステップ進める
p.stepSimulation()
# 1ステップ分スリープ
time.sleep(timeStep)