お疲れ様です。秋並です。
Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです(一覧はこちら)。
今回は、contactFriction.pyを解説します。(コードのリンクはこちら)
本コードを実行すると、法線力と摩擦力の合計値がターミナル上に表示されます。
使用している機能
getContactPoints()
関数を使用することで、「すべての接触点情報」を取得できます。
今回の場合は、「法線力」と「横方向摩擦力(法線ベクトルに対して垂直な方向の摩擦力)」を使用しています。
pts = pybullet.getContactPoints()
返り値のpts
にはすべての接触点情報が含まれているので、その中の一つの接触点における情報をpt
とすると、以下の情報を取得可能です(今回使用している情報のみを記載)。
-
pt[9]
:法線力 -
pt[11]
:1つめの横方向摩擦力の方向ベクトル([x,y,z]) -
pt[10]
:1つめの横方向摩擦力の大きさ -
pt[13]
:2つめの横方向摩擦力の方向ベクトル([x,y,z]) -
pt[12]
:2つめの横方向摩擦力の大きさ
コメントをつけたサンプルコード
サンプルコードにコメントをつけたものが以下になります(もともとあった不要と思われるコメント等については削除しています)
import pybullet as p
import pybullet_data
# GUIモードでPybulletに接続
p.connect(p.GUI)
# Pybulletに関連するデータの取得
p.setAdditionalSearchPath(pybullet_data.getDataPath())
# 最大座標系を使用しない設定
useMaximalCoordinates = False
# 床のモデルを生成
p.loadURDF("plane.urdf", useMaximalCoordinates=useMaximalCoordinates)
# 立方体のモデルを生成
p.loadURDF("cube.urdf", [0, 0, 1], useMaximalCoordinates=useMaximalCoordinates)
# 重力を(0, 3, -10)の方向に設定
p.setGravity(0, 3, -10)
while (1):
# シミュレーションを1step分進める
p.stepSimulation()
# 接触点の情報を取得
pts = p.getContactPoints()
# 接触点の数を出力
print("num pts=", len(pts))
# 法線力の合計
totalNormalForce = 0
# 横方向摩擦力の合計
totalLateralFrictionForce = [0, 0, 0]
for pt in pts:
# 法線力を足す
totalNormalForce += pt[9]
# x方向の横方向摩擦力の合計 += 1つ目の横方向摩擦力のx方向ベクトル * 1つ目の横方向摩擦力の大きさ + 2つ目の横方向摩擦力のx方向ベクトル * 2つ目の横方向摩擦力の大きさ
totalLateralFrictionForce[0] += pt[11][0] * pt[10] + pt[13][0] * pt[12]
# y方向の横方向摩擦力の合計 += 1つ目の横方向摩擦力のy方向ベクトル * 1つ目の横方向摩擦力の大きさ + 2つ目の横方向摩擦力のy方向ベクトル * 2つ目の横方向摩擦力の大きさ
totalLateralFrictionForce[1] += pt[11][1] * pt[10] + pt[13][1] * pt[12]
# z方向の横方向摩擦力の合計 += 1つ目の横方向摩擦力のz方向ベクトル * 1つ目の横方向摩擦力の大きさ + 2つ目の横方向摩擦力のz方向ベクトル * 2つ目の横方向摩擦力の大きさ
totalLateralFrictionForce[2] += pt[11][2] * pt[10] + pt[13][2] * pt[12]
# 合計の法線力、摩擦力を出力
print("totalNormalForce=", totalNormalForce)
print("totalLateralFrictionForce=", totalLateralFrictionForce)