Material System

In RaiSim, all material properties are associated with a material pair.

Currently, there are three material properties used in RaiSim.

  • Coefficient of friction (\(\mu\ge 0\)): This defines how much friction is applied between the two materials

  • Coefficient of restitution (\(c_r\ge 0\)): How bouncy the material pair is

  • Restitution Threshold (\(c_{th}\ge 0\)): If the impact velocity is smaller than this number, objects do not bounce off

The bounce velocity is computed as \(c_{th}(v_i-c_{th})\), where \(v_i\) is the impact velocity.

A material name is set when the material is created. For example,

auto ball = world.addSphere(1, 1, "steel");

World owns a materials manager which holds all material pair properties. Unrecognized material pairs will get default material properties, which can be set as raisim::World::setDefaultMaterial. If the default material pair properties are not set, they are {\(\mu=0.8\), \(c_r=0\), \(c_{th}=0\)}.

Material properties over a pair can be defined as following

world.setMaterialPairProp("steel", "glass", 0.7, 0.1, 0.15);

The first two arguments are the two material names and the following three are the coefficient of friction, coeffcient of restitution, and restitution threshold. The order of the material names does not matter.

Example - Single Bodies

../_images/materials.gif

XML Way

<?xml version="1.0" ?>
<raisim version="1.0">
    <timeStep value="0.001"/>
    <objects>
        <ground name="ground" material="steel"/>
        <sphere name="sphere_steel" mass="1" material="steel">
            <dim radius="0.5"/>
            <state pos="-2 0 5" quat="1 0 0 0" linVel="0 0 0" angVel="0 0 0"/>
        </sphere>
        <sphere name="sphere_rubber" mass="1" material="rubber">
            <dim radius="0.5"/>
            <state pos="0 0 5" quat="1 0 0 0" linVel="0 0 0" angVel="0 0 0"/>
        </sphere>
        <sphere name="sphere_copper" mass="1" material="copper">
            <dim radius="0.5"/>
            <state pos="2 0 5" quat="1 0 0 0" linVel="0 0 0" angVel="0 0 0"/>
        </sphere>
    </objects>
    <material>
        <default friction="0.8" restitution="0" restitution_threshold="0"/>
        <pair_prop name1="steel" name2="steel" friction="0.8" restitution="0.95" restitution_threshold="0.001"/>
        <pair_prop name1="steel" name2="rubber" friction="0.8" restitution="0.15" restitution_threshold="0.001"/>
        <pair_prop name1="steel" name2="copper" friction="0.8" restitution="0.65" restitution_threshold="0.001"/>
    </material>
    <camera follow="anymal" x="1" y="1" z="1"/>
</raisim>

C++ Way

#include "raisim/RaisimServer.hpp"
#include "raisim/World.hpp"

int main(int argc, char* argv[]) {
  auto binaryPath = raisim::Path::setFromArgv(argv[0]);
  raisim::World::setActivationKey(binaryPath.getDirectory() + "\\rsc\\activation.raisim");

  /// create raisim world
  raisim::World world;
  world.setTimeStep(0.001);

  /// create objects
  world.addGround(0, "steel");
  auto sphere1 = world.addSphere(0.5, 1.0, "steel");
  auto sphere2 = world.addSphere(0.5, 1.0, "rubber");
  auto sphere3 = world.addSphere(0.5, 1.0, "copper");

  sphere1->setPosition(-2,0,5);
  sphere2->setPosition(0,0,5);
  sphere3->setPosition(2,0,5);

  world.setMaterialPairProp("steel", "steel", 0.8, 0.95, 0.001);
  world.setMaterialPairProp("steel", "rubber", 0.8, 0.15, 0.001);
  world.setMaterialPairProp("steel", "copper", 0.8, 0.65, 0.001);

  /// launch raisim servear
  raisim::RaisimServer server(&world);
  server.launchServer();

  for (int i = 0; i < 10000000; i++) {
    raisim::MSLEEP(1);
    server.integrateWorldThreadSafe();
  }

  server.killServer();
}

Example - Articulated Systems

URDF Way

The material can be specified in the URDF file as following

<!-- Foot link -->
<link name="LF_FOOT">
    <collision>
        <origin xyz="0 0 0.02325"/>
        <geometry>
            <sphere radius="0.035"/>
        </geometry>
        <material name="">
            <contact name="ice"/>
        </material>
    </collision>
</link>

C++ Way

Alternatively, you can specify the material dynamically as following

anymal->getCollisionBody("LF_FOOT/0").setMaterial("ice");

“LF_FOOT/0” means the first collision body of the link “LF_FOOT”.