Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです(一覧はこちら)。
今回は、collisionFilter.pyを解説します。(コードのリンクはこちら)
本コードを実行すると、指定した任意の物体間の衝突の設定ができます。
使用している機能
本コードは、以下の機能を使用すると「指定した物体の衝突フィルターの設定」「任意の物体間の衝突の有効化/無効化」を設定できます。
指定した物体の衝突フィルターの設定
setCollisionFilterGroupMask
関数を使用することで、任意のグループに属した物体間の衝突を有効化/無効化できます。
pybullet.setCollisionFilterGroupMask(objectID, linkId, collisionFilterGroup, collisionMask)
-
objectId
: フィルターを設定するオブジェクトのID -
linkId
: フィルターを設定するオブジェクトのリンクのID-
-1
を指定した場合、ベースのリンクが対象となる
-
-
collisionFilterGroup
: 指定したオブジェクト、リンクをどの衝突フィルターグループに設定するか -
collisionFilterMask
: 指定したオブジェクト、リンクをどのグループに属した障害物と衝突させるか
例えば、以下のような場合、オブジェクトAとオブジェクトBはたがいに衝突するようになります。
# オブジェクトAの設定
p.setCollisionFilterGroupMask(objectAId, -1, 1, 2) # グループ1に属し、グループ2と衝突
# オブジェクトBの設定
p.setCollisionFilterGroupMask(objectBId, -1, 2, 1) # グループ2に属し、グループ1と衝突
任意の物体間の衝突の有効化/無効化
setCollisionFilterPair
関数を使用することで、任意の物体間の衝突の有効化/無効化を設定できます
pybullet.setCollisionFilterPair(objectId1, objectId2, linkId1, linkId2, enableCollision)
-
objectId1
: 衝突を有効化/無効化したいオブジェクトのID(1つ目のオブジェクト) -
objectId2
: 衝突を有効化/無効化したいオブジェクトのID(2つ目のオブジェクト) -
linkId1
: 衝突を有効化/無効化したいオブジェクトのリンクのID(1つ目のオブジェクト)-
-1
を指定した場合、ベースのリンクが対象となる
-
-
linkId2
: 衝突を有効化/無効化したいオブジェクトのリンクのID(2つ目のオブジェクト)-
-1
を指定した場合、ベースのリンクが対象となる
-
-
enableCollision
: 「オブジェクト1のリンク1」と「オブジェクト2のリンク2」間の衝突を有効化/無効化する
コメントをつけたサンプルコード
サンプルコードにコメントをつけたものが以下になります(もともとあった不要と思われるコメント等については削除しています)
import pybullet as p
import time
import pybullet_data
# GUI付きの物理サーバーに接続
p.connect(p.GUI)
# URDFファイルの検索パスを設定
p.setAdditionalSearchPath(pybullet_data.getDataPath())
# planeのURDFを読み込む
planeId = p.loadURDF("plane.urdf", useMaximalCoordinates=False)
# cubeのURDFを読み込み、初期位置を設定
cubeId = p.loadURDF("cube_collisionfilter.urdf", [0, 0, 3], useMaximalCoordinates=False)
# 衝突フィルターを設定(直後にsetCollisionFilterPairでplaneとcubeの間の衝突を有効にしているため、このコード内ではあまり意味がない処理)
collisionFilterGroup = 0 # 衝突フィルターグループを定義
collisionFilterMask = 0 # 衝突フィルターマスクを定義
p.setCollisionFilterGroupMask(cubeId, -1, collisionFilterGroup, collisionFilterMask) # cubeの衝突フィルターグループとマスクを設定
# planeとcubeの間の衝突を有効にする
enableCollision = 1 # 衝突を有効にする
p.setCollisionFilterPair(planeId, cubeId, -1, -1, enableCollision) # planeとcubeの間の衝突フィルターペアを設定
# リアルタイムシミュレーションを有効にする
p.setRealTimeSimulation(1)
# シミュレーション内の重力を設定
p.setGravity(0, 0, -10)
# 接続されている間シミュレーションを実行
while (p.isConnected()):
# 指定した時間だけ待機
time.sleep(1. / 240.)