Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

pybulletでspinning_frictionを設定する

More than 1 year has passed since last update.

今回はspinning_frictionなるパラメータを実験する。
前回のrolling‗frictionとの違いは、quickstartguideによると以下の様子。
正しいかはわからないけど、向きの異なる摩擦係数と理解した。

  • rolling friction coefficient orthogonal to contact normal
  • spinning friction coefficient around contact normal

環境

  • Windows 10 Home
  • Python 3.6.8
  • PyBullet 2.5.5
  • Pillow 6.2.0

やったこと

urdfファイルにspinning_frictionを設定する。

パラメータの効果を知りたいので3セット作っておく。
- aセット
test_box07a.urdfに<spinning_friction value="0.004"/>
test_sphere05a.urdfに<spinning_friction value="0.001"/>
- bセット
test_box07b.urdfに<spinning_friction value="0.004"/>
test_sphere05b.urdfに<spinning_friction value="0.004"/>
‐ cセット
test_box07c.urdfに<spinning_friction value="0.001"/>
test_sphere05c.urdfに<spinning_friction value="0.004"/>

aセットのurdfファイルは以下の通り。(bセット、cセット)
それとtest‗sphere05a.urdfは、visualはboxに、collisionはsphereにしてる。

test_box07a.urdf
<robot name="robot_name">
  <link name="link_name">
    <contact>
      <lateral_friction value="1.0"/>
      <rolling_friction value="0.0"/>
      <spinning_friction value="0.004"/>
    </contact>
    <inertial>
      <origin xyz="0.0 -1.0 -0.1" rpy="0.0 0.0 0.0"/>
      <mass value="0.0"/>
      <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
    </inertial>
    <visual>
      <origin xyz="0.0 -1.0 -0.1" rpy="0.0 0.0 0.0"/>
      <geometry>
        <box size="0.8 0.8 0.2"/>
      </geometry>
      <material name="red">
        <color rgba="1.0 0.0 0.0 1.0"/>
      </material>
    </visual>
    <collision>
      <origin xyz="0.0 -1.0 -0.1" rpy="0.0 0.0 0.0"/>
      <geometry>
        <box size="0.8 0.8 0.2"/>
      </geometry>
    </collision>
  </link>
</robot>
test_sphere05a.urdf
<robot name="robot_name">
  <link name="link_name">
    <contact>
      <lateral_friction value="1.0"/>
      <rolling_friction value="0.0"/>
      <spinning_friction value="0.001"/>
    </contact>
    <inertial>
      <origin xyz="0.0 -1.0 0.5" rpy="0.0 0.0 0.0"/>
      <mass value="1.0"/>
      <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/>
    </inertial>
    <visual>
      <origin xyz="0.0 -1.0 0.5" rpy="0.0 0.0 0.0"/>
      <geometry>
        <box size="0.4 0.4 0.4"/>
      </geometry>
      <material name="l_red">
        <color rgba="1.0 0.5 0.5 1.0"/>
      </material>
    </visual>
    <collision>
      <origin xyz="0.0 -1.0 0.5" rpy="0.0 0.0 0.0"/>
      <geometry>
        <sphere radius="0.2"/>
      </geometry>
    </collision>
  </link>
</robot>

applyExternalTorqueする

shpere05aid = p.loadURDF("test_sphere05a.urdf")
p.applyExternalTorque(shpere05aid, -1, [0,0,100], flags=p.LINK_FRAME)

独楽のような動きをさせたかったので、applyExternalTorqueを使う。
loadURDFの際にunique idを取得しておき、applyExternalTorqueに与える。
次の-1はbase、[0,0,100]はトルク、flags=p.LINK_FRAMEはローカル座標系でトルクを与えるフラグの意。

スプリクト全体は以下。

import pybullet as p
import time
from PIL import Image

phisicsClient = p.connect(p.GUI)
p.setGravity(0,0,-10)
p.loadURDF("test_box07a.urdf")
p.loadURDF("test_box07b.urdf")
p.loadURDF("test_box07c.urdf")
sphere05aid = p.loadURDF("test_sphere05a.urdf")
sphere05bid = p.loadURDF("test_sphere05b.urdf")
sphere05cid = p.loadURDF("test_sphere05c.urdf")
p.applyExternalTorque(sphere05aid, -1, [0,0,100], flags=p.LINK_FRAME)
p.applyExternalTorque(sphere05bid, -1, [0,0,100], flags=p.LINK_FRAME)
p.applyExternalTorque(sphere05cid, -1, [0,0,100], flags=p.LINK_FRAME)

camera_img = p.getCameraImage(320,320)
imgs = [Image.fromarray(camera_img[2])]

for i in range(1200):
    p.stepSimulation()
    if i % 10 == 0:
        camera_img = p.getCameraImage(320,320)
        imgs.append(Image.fromarray(camera_img[2]))
    time.sleep(1./240.)
p.disconnect()

imgs[0].save("test_pybullet_09.gif", save_all = True, append_images = imgs[1:], duration=10, loop = 0)

実行する

実行結果は以下のGIFアニメ。手前からaセット、bセット、cセット。
test_pybullet_09.gif

aセットとcセットが長く回り続け、bセットがそれらより短かった。
今回は2面に与えたパラメータの和で摩擦の大きさが決まってる様子。
∵aセット:0.004+0.001=0.005
 bセット:0.004+0.004=0.008
 cセット:0.001+0.004=0.005
ただ、lateral_frictionも影響してそうで使い方があまりわかってない...

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away