0
1

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サンプル解説】法線力と摩擦力を取得する【contactFriction.py】

Last updated at Posted at 2024-07-09

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

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


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

本コードを実行すると、法線力と摩擦力の合計値がターミナル上に表示されます。

contactFriction.gif

使用している機能

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?