Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです(一覧はこちら)。
今回は、shiftCenterOfMass.pyを解説します。(コードのリンクはこちら)
本コードを実行すると「重心位置を変更したオブジェクト」が生成されます。
使用している機能
本コードは、以下の機能を使用して「指定した視覚形状、衝突形状のオブジェクトを生成」することができます。
指定した視覚形状、衝突形状のオブジェクトを生成
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.)