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サンプル解説】オブジェクトの重心位置を変更する【shiftCenterOfMass.py】

Posted at

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


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

本コードを実行すると「重心位置を変更したオブジェクト」が生成されます。

shiftCenterOfMass.gif

使用している機能

本コードは、以下の機能を使用して「指定した視覚形状、衝突形状のオブジェクトを生成」することができます。

指定した視覚形状、衝突形状のオブジェクトを生成

createMultiBody 関数を使用することで、指定した視覚形状、衝突形状のオブジェクトを生成できます。

pybullet.createMultiBody(baseMass,
                  baseInertialFramePosition,
                  baseCollisionShapeIndex,
                  baseVisualShapeIndex,
                  basePosition,
                  useMaximalCoordinates)
  • baseMass:質量
  • baseInertialFramePosition:慣性位置のオフセット
  • baseCollisionShapeIndex:衝突形状のインデックス
  • baseVisualShapeIndex:視覚形状のインデックス
  • basePosition:初期位置
  • useMaximalCoordinates:最大座標系を使用するかどうか

今回の場合、baseInertialFramePosition[0,0,-0.5]に設定しているため、重心が中心から-0.5の位置に移動しています。

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

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

import pybullet as p
import time
import pybullet_data

# PybulletをGUIモードで接続
p.connect(p.GUI)

# Pybulletに関するデータパスを取得
p.setAdditionalSearchPath(pybullet_data.getDataPath())

# 床のオブジェクトを生成
p.loadURDF("plane.urdf")

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

# 視覚形状の原点位置
visualShift = [0, 0, 0]

# 衝突形状の原点位置
collisionShift = [0, 0, 0]

# 慣性の原点位置(重心位置)
inertiaShift = [0, 0, -0.5]

# メッシュのスケール
meshScale = [1, 1, 1]

# 視覚形状の設定
visualShapeId = p.createVisualShape(shapeType=p.GEOM_MESH,
                                    fileName="cube.obj",
                                    rgbaColor=[1, 1, 1, 1],
                                    specularColor=[0.4, .4, 0],
                                    visualFramePosition=visualShift,
                                    meshScale=meshScale)

# 衝突形状の設定
collisionShapeId = p.createCollisionShape(shapeType=p.GEOM_MESH,
                                          fileName="cube.obj",
                                          collisionFramePosition=collisionShift,
                                          meshScale=meshScale)

# 指定した視覚形状、衝突形状のオブジェクトを生成
p.createMultiBody(baseMass=1,
                  baseInertialFramePosition=inertiaShift,
                  baseCollisionShapeIndex=collisionShapeId,
                  baseVisualShapeIndex=visualShapeId,
                  basePosition=[0, 0, 1],
                  useMaximalCoordinates=False)

while (1):
  
  # シミュレーションを1時刻分進める
  p.stepSimulation()
  time.sleep(1. / 240.)
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?