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

【Pybulletサンプル解説】物体の動力学特性を変更する【changeDynamicsMass.py】

Posted at

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

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


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

本コードを実行すると、2つのオブジェクトが生成され、そのうち片方のオブジェクトの動力学特性を変更します。

changeDynamicsMass.gif

使用している機能

本コードは、以下の機能を使用して「オブジェクトの動力学特性の変更」を実現しています。

  • 動力学特性の変更

動力学特性の変更

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