[PYTHON] Définir spinning_friction dans pybullet

Cette fois, nous allons expérimenter avec un paramètre appelé spinning_friction. Selon le guide de démarrage rapide, la différence par rapport au frottement de roulement précédent est la suivante. Je ne sais pas si c'est correct, mais je l'ai compris comme un coefficient de frottement avec des orientations différentes.

environnement

Ce que j'ai fait

Définissez spinning_friction dans le fichier urdf.

Je veux connaître l'effet des paramètres, donc je vais faire 3 sets. --un ensemble <Spinning_friction value =" 0.004 "/> dans test_box07a.urdf <spinning_friction value =" 0.001 "/> dans test_sphere05a.urdf --b ensemble <Spinning_friction value =" 0.004 "/> dans test_box07b.urdf <Spinning_friction value =" 0.004 "/> dans test_sphere05b.urdf -C ensemble <Spinning_friction value =" 0.001 "/> dans test_box07c.urdf <Spinning_friction value =" 0.004 "/> dans test_sphere05c.urdf

Le fichier urdf d'un ensemble est le suivant. (Ensemble B, ensemble c) Et dans test‗sphere05a.urdf, le visuel est une boîte et la collision est une sphère.

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)

Je voulais le faire bouger comme une musique solo, alors j'utilise applyExternalTorque. Obtenez l'identifiant unique au moment de loadURDF et donnez-le à applyExternalTorque. Le -1 suivant est la base, [0,0,100] est le couple et flags = p.LINK_FRAME est un indicateur qui donne le couple dans le système de coordonnées local.

Le script entier est ci-dessous.

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)

Exécuter

Le résultat de l'exécution est l'animation GIF suivante. De face, un ensemble, b ensemble, c ensemble. test_pybullet_09.gif

L'ensemble a et c continuaient à tourner plus longtemps, et l'ensemble b était plus court qu'eux. Cette fois, il semble que l'amplitude du frottement soit déterminée par la somme des paramètres donnés aux deux côtés. ∵ un ensemble: 0,004 + 0,001 = 0,005 b ensemble: 0,004 + 0,004 = 0,008 c ensemble: 0,001 + 0,004 = 0,005 Cependant, il semble que later_friction ait aussi un effet, donc je ne sais pas comment m'en servir ...

Recommended Posts

Définir spinning_friction dans pybullet
Définir ulimit dans le superviseur
Définir dynamiquement des hôtes d'environnement avec Fabric
Méthodes disponibles dans le type d'ensemble
Configurer Nunjucks dans Node.js
Définir le test python dans jenkins
Pour définir le codage par défaut sur utf-8 en python
Associez l'ensemble de tables dans les modèles de python.py
Définissez les valeurs par défaut avant de valider dans sqlalchemy.orm
Configurer Pipenv sur Pycharm dans un environnement Windows