8. ERPとCFM

sample4a

ODE (Open Dynamics Engine) 初級講座の第8回目です。

今回はODEを使ううえで覚えておかなければならないパラメータERP (Error Reduction Parameter,ジョイント誤差修正パラメータ)とCFM(Constraint Force Mixing,拘束力混合パラメータ)について説明します。

1. ERP (Error Reduction Parameter)

ERPはジョイントの誤差を修正するパラメータです。シミュレーションを繰り返していくと、ジョイントの中心が計算誤差などでずれていきます。それを修正 するのがERPで0以上1以下の値をとります。0は誤差を全く修正しないのに対し、1は次のステップで誤差を0に修正します。推奨値は0.1から0.8となっ ていますが、デフォルト値(規定値)は0.2です。今までのサンプルプログラムでは設定していなかったのでERPは0.2として計算されています。ERPを1に設定することは、あまりお勧めできません。

ERPを設定する場合は以下のAPIを使います。なお、これはグローバル(大域的)に働き全てのジョイントの誤差を修正します。

  • dWorldSetERP(dWorldID, dReal erp)
    ここで、dWorldIDはワールドのID番号、erpは0.0から1.0までの実数となります。

では、実習としてdWorldSetERP(world, 0.0);をsample3のdWorldSetGravityの下に挿入して実行してみてください。ERPが0の場合はジョイントのずれを修正しないので上図のようにバラバラ事件が発生します。

2. CFM (Constraint Force Mixing)

次に、もう一つのODE特有なパラメータCFM(Constraint Force Mixing)について説明します。日本語には訳しづらいですが直訳すると拘束力混合パラメータとなります。

拘束には 大きく分けてハード(hard)拘束ソフト(soft)拘束の 2種類あります。ハード拘束では拘束条件を律儀に必ず守らなければいけません。一方、ソフト拘束は融通がきいて多少のずれはOKなのです。一般的にはハー ド拘束が多いのですが、ODEではCFMを導入することによりソフト拘束となります。CFMが0のときはハード拘束、大きくなるに従いソフト拘束になりま す。

また、ODEでは拘束とジョイントを同じ意味で使う場合が多いのでジョイントを例に挙げると、ハード拘束ではジョイントの拘束条件を一切破ってはい けません。 つまり、ジョイントの回転軸の位置や向きが結合されている2つのリンクが少しもずれてはいけません。一方、ソフト拘束では多少関節中心や軸の向きがずれて もよいので物理的には生物のように柔らかい関節をシミュレート可能です。

なお、前回のERPと今回のCFMを 使うことによってバネ・ダンパシステムのシミュレートも可能です。ヒューマノイドのシミュレーションで地面と足の接触をバネ・ダンパモデルとする場合が多いので、そういったシミュレーションもODEで十分可能です。詳しくはODEマニュアルをご覧ください。

次に、CFMの具体的な使い方を説明します。

CFMを設定する場合は以下のAPIを使います。なお、これはグローバルに働き全てのジョイントに作用します。単精度の場合のCFMのデフォルト値は10E-5、倍精度の場合は10E-10となります。

  • dWorldSetCFM(dWorldID, dReal cfm)
    ここで、dWorldIDはワールドのID番号、cfmはCFMの値。

では、実習としてdWorldSetCFMを先ほど修正したsample3のWorldSetERP の下の行に挿入し、cfmの値をいろいろ変更して遊んでみてください。CFMの値を大きくするとジョイントが柔らかくなります。小さくする場合は0が最小 でこの場合はハード拘束となります。CFMが負の値はシステムが不安定になるので止めてください。

なお、CFMにはシミュレーションを安定させる働きがありますので、物体の挙動がおかしな場合は値を少しずつ大きくすることをお勧めしますが、通常の用途では大きい場合でも1e-3(10の-3乗)程度が良いでしょう。大きすぎるとスライムのように柔らかくなりすぎます。

では、また次回。

上記の方法に沿ってsample3のプログラムの
dWorldSetGravityの下にdWorldSetERP(world,0.0);を入れて実行したのですが、
いつまで待ってもバラバラ事件にはなりません。
プログラムの他の部分にも手を加える必要があるのでしょうか。

    • 名無しの権兵衛さん、

      誤植です。訂正しました。
      御指摘ありがとうございます。助かります。
      マニュアル、ODE本でも基準値は0.1-0.8、デフォルト値は0.2となっています。

      でむ

  • コメントを残す

    メールアドレスが公開されることはありません。