接触マテリアル

概要

シミュレーションにおいて、物体同士が接触したときの挙動は、摩擦係数や反発係数といったパラメータによって決まります。これらのパラメータは、接触する物体の材質の組み合わせによって決まる性質のものです。

Choreonoidではこれを扱うための仕組みとして「接触マテリアル」の機構を備えています。この機構では、まず物体(リンク)ごとに材質を表す「マテリアル」を割り当てておきます。その上で、2つのマテリアルの組み合わせごとに、接触時の挙動を決めるパラメータを「接触マテリアル」として定義しておきます。するとシミュレータアイテムがこれらの定義を読み込み、物体同士の接触時にマテリアルの組み合わせに対応するパラメータが適用されるようになります。

この機構は全てのシミュレータアイテムが対応しており、摩擦係数・反発係数といった基本的なパラメータを、使用する物理エンジンによらず共通の記述で設定できます。

マテリアルの定義

マテリアルと接触マテリアルの定義は、YAML形式のマテリアルファイルに記述します。標準の定義ファイルとして、Choreonoidのシェアディレクトリに "default/materials.yaml" というファイルが用意されています。

マテリアルファイルは、マテリアルを定義する materials と、接触マテリアルを定義する contact_materials の2つのパートで構成されます。以下は記述例です。

materials:
  -
    name: Ground
    roughness: 1.0
    viscosity: 1.0
  -
    name: Ball
    roughness: 0.5
    viscosity: 0.36

contact_materials:
  -
    materials: [ Ground, Ball ]
    friction: 0.5
    restitution: 0.8

materials には、マテリアルの名前( name )と、そのマテリアル自体の物性値を列挙します。 contact_materials には、 materials キーで2つのマテリアル名の組を指定し、その組み合わせで接触が生じたときに適用するパラメータを記述します。

マテリアルのパラメータ

materials の各マテリアルで利用できる主なパラメータは以下のとおりです。「対応」の列は、そのパラメータを解釈するシミュレータアイテムを示します。

パラメータ

デフォルト値

意味

対応

name

(必須)

マテリアルの名前です。リンクへの割り当てや接触マテリアルのペア指定で使用します。

全て

roughness

0.5

表面の粗さを表す値です。接触マテリアルが定義されていないペアの摩擦係数の計算に使用されます(後述)。

全て

viscosity

1.0

表面の粘性を表す値です。接触マテリアルが定義されていないペアの反発係数の計算に使用されます(後述)。

全て

stiffness

0.0

接触の剛性です。0より大きい値を設定すると、そのマテリアルの接触が指定した剛性をもつ柔らかい(コンプライアントな)接触として扱われます。

PhysX / Bullet

damping

0.0

上記のコンプライアントな接触におけるダンピングです。 stiffness が設定されているときに使用されます。

PhysX / Bullet

density , youngs_modulus , surface_viscosity

AGXシミュレータで解釈される追加パラメータです。詳細は 物理マテリアルの追加パラメータ を参照してください。

AGX

接触マテリアルのパラメータ

contact_materials の各接触マテリアルで利用できる主なパラメータは以下のとおりです。

パラメータ

デフォルト値

意味

対応

materials

(必須)

対象とするマテリアル名の組です。2つのマテリアル名のリストとして指定します。同じ名前を2つ指定することで、同一マテリアル同士の接触を対象とすることもできます。

全て

friction

0.5

摩擦係数です。静止摩擦係数と動摩擦係数の両方にこの値が設定されます。

全て

static_friction

0.5

静止摩擦係数です。動摩擦係数と個別に指定したい場合に使用します。

全て(※)

dynamic_friction

0.5

動摩擦係数です。静止摩擦係数と動摩擦係数の区別に対応しているのはAISTシミュレータで、接触点の滑り状態に応じて両者が使い分けられます。

AIST

restitution

0.0

反発係数です。0で反発なし、1に近づくほどよく跳ね返ります。

全て

cullingDistance

シミュレータの設定値

このペアに適用する接触点間引きの距離閾値です。AISTシミュレータの「接触間引き距離」プロパティの値をペアごとに上書きします。

AIST

cullingDepth

シミュレータの設定値

このペアに適用する接触点間引きの深さ閾値です。AISTシミュレータの「接触間引き深度」プロパティの値をペアごとに上書きします。

AIST

max_num_contact_points

シミュレータの設定値

このペアに適用するリンクペアあたりの最大接触点数です。AISTシミュレータの「最大接触点数」プロパティの値をペアごとに上書きします。

AIST

friction_model

AGXシミュレータで解釈される追加パラメータです。摩擦モデルの選択やソルバの指定等が行えます。詳細は 物理マテリアルの追加パラメータ を参照してください。

AGX

(※) static_friction のみを指定した場合、AIST以外のシミュレータでは静止摩擦係数の値が摩擦係数として使用されます。

各シミュレータは、自身が対応していないパラメータを単に無視します。このため、特定のエンジン向けのパラメータを含むマテリアルファイルを、複数のエンジンで共用することができます。

接触マテリアルが定義されていない組み合わせの扱い

全てのマテリアルの組み合わせについて接触マテリアルを定義しておく必要はありません。接触マテリアルが定義されていない組み合わせについては、各マテリアルに設定された roughnessviscosity の値から、以下の式で摩擦係数と反発係数が自動的に計算されます。

一方のマテリアルの roughness の値をr1、もう一方のマテリアルの roughness の値をr2とすると、摩擦係数は

摩擦係数 = √(r1 × r2)

となります。また、一方のマテリアルの viscosity の値をv1、もう一方のマテリアルの viscosity の値をv2とすると、反発係数は

反発係数 = √((1 − v1) × (1 − v2))

となります。すなわち、粗いマテリアル同士ほど摩擦が大きくなり、粘性の小さいマテリアル同士ほどよく反発するという計算になります。この計算方法は全てのシミュレータアイテムで共通です。

このため、マテリアルごとに roughnessviscosity を適切に設定しておけば、全ての組み合わせを列挙しなくても、それらしい接触挙動が得られるようになっています。その上で、特定の組み合わせについて挙動を明示的に調整したい場合に、接触マテリアルを定義するという使い方ができます。

モデルへのマテリアルの割り当て

各リンクへのマテリアルの割り当ては、Body形式のモデルファイルにおいて material キーで行います。例えばボールのモデル(share/model/misc/ball.body)では、以下のようにリンクにBallマテリアルを割り当てています。

links:
  -
    name: Ball
    ...
    material: Ball

マテリアルを指定していないリンクは、デフォルトのマテリアル(Default)が割り当てられているものとして扱われます。

シミュレーションへの適用

マテリアルファイルの読み込みはワールドアイテムが担当します。ワールドアイテムは「デフォルトマテリアルテーブル」プロパティで指定されたマテリアルファイルを読み込み、マテリアルテーブルとして保持します。このプロパティのデフォルト値は標準の定義ファイルである "${SHARE}/default/materials.yaml" となっています。

シミュレータアイテムはシミュレーション開始時にワールドアイテムからマテリアルテーブルを取得し、各リンクに割り当てられたマテリアルの組み合わせに基づいて、接触時のパラメータを決定します。特別な設定をしなくても、モデルにマテリアルが割り当てられていれば、この仕組みが自動的に機能します。

マテリアル定義のカスタマイズ

標準の定義ファイル "default/materials.yaml" は、Choreonoid付属のサンプルが使用するデフォルトの定義であり、ユーザがこのファイルを直接編集することは想定されていません。マテリアルの定義を追加・変更したい場合は、独自のマテリアルファイルを作成して、それをプロジェクトに読み込むようにします。

具体的には、前述の形式で記述したマテリアルファイルを用意し、ワールドアイテムを選択した状態でメインメニューの「ファイル」-「読み込み」-「マテリアルテーブル」からそのファイルを読み込みます。するとマテリアルテーブルアイテムが生成されるので、これをワールドアイテムの子アイテムとして配置しておきます。アイテムツリーは例えば以下のような構成になります。

[ ] - World
[/]   + Robot
[/]   + Floor
[ ]   + MaterialTable
[ ]   + AISTSimulator

このようにすると、マテリアルテーブルアイテムの内容がデフォルトのマテリアルテーブルにマージされて使用されるようになります。デフォルトの定義と同じ名前のマテリアルや同じ組み合わせの接触マテリアルを記述した場合は、そちらの定義が優先されます。従って、追加のマテリアルファイルには独自に定義・変更したい分だけを記述すればOKです。

サンプル

接触マテリアルの効果を確認できるサンプルとして、以下のプロジェクトが用意されています。いずれのサンプルにも各物理エンジンのシミュレータアイテムが含まれており、エンジンを切り替えて挙動を比較することもできます。

Ball

sample/general/Ball.cnoid は、床の上にボールを落下させるシンプルなサンプルです。ボールのモデルにはBallマテリアルが割り当てられており、標準のマテリアル定義においてGroundとBallの接触マテリアルに反発係数0.8が設定されているため、ボールが床の上で跳ね返る様子を確認できます。反発係数の値を変えると跳ね方が変化しますので、接触マテリアルの調整の練習台としても利用できます。

SR1WalkSlippy

sample/SimpleController/SR1WalkSlippy.cnoid は、二足歩行ロボットSR1の歩行サンプルについて、床を滑りやすくしたものです。このプロジェクトでは、追加のマテリアルファイルである SlippyMaterialSet.yaml をマテリアルテーブルアイテム(SlippyMaterialSet)としてワールドアイテムの子アイテムに読み込んでおり、そこで床(Ground)と足裏(Sole)の接触マテリアルの摩擦係数を0.01に上書きしています。シミュレーションを実行すると、足裏が滑って歩行が乱れる様子を確認できます。マテリアル定義のカスタマイズ方法の実例としても参考になります。