bambooflow Note

概念

最終更新:

匿名ユーザー

- view
管理者のみ編集可

3. 概念


3.1. 背景

[ここでは、剛体力学およびシミュレーションに関するいくつかの参考事項を書く。しかしまずは、Baraff氏の優れたSIGGRAPHの教本を参照して下さい]。

3.2. 剛体

剛体はシミュレーションの視点から見て様々な特性を持っている。いくつ かの特性は時間とともに変わる:

  • 剛体の参照ポイントの位置ベクトル(x,y,z)、実際の参照ポイントは剛体の質量中心に相当する。
  • 参照のポイント、ベクトル(vx、vy、vz)の線速度。
  • 剛体の方位、四元数(qs、qx、qy、qz)あるいは3x3 回転マトリックスによって表される。
  • 角速度ベクトル(wx、wy、wz)、時間とともに変化する方位を表現する

その他の剛体の特性は、通常は時間とともに一定である:
  • 剛体の質量
  • 参照ポイントに関しての重心位置。現在の表現では、重心と参照ポイントとが一致する
  • 慣性マトリックス、これは剛体の質量が重心のまわりへどのように分配されるか示す3x3マトリックスである

概念的に、各剛体は、それ(図1の中で示されるように、それは剛体とともに移動し回転する)にx-y-z座標構造を埋め込んでいる。

図1: 剛体の座標構造

この座標フレームの元は剛体の参照のポイントである。ODE(ベクト ル、マトリックスなど)の中のいくつかの値は剛体の座標構造に関連がある。また、他のものはグローバルな座標構造に関連する。

注意として、剛体の形状は動的性質でない(様々な質量特性に影響する場合を除いて)。剛体の形状について気にするのは衝突検出だけである。

3.2.1. 島(islands)と無効な剛体

剛体はジョイントでお互いを接続される。剛体の”島”は引き離すことができないグループである。言い換えれば、各剛体は島の各剛体ごと何らかの形で接続される。

世界の各島はシミュレーションステップごとに別々に扱われる。これは 知っていると役立つ:そのときシミュレーション上にN個の同様の島がある場合、ステップ計算時間はO(N)になる。

各剛体は有効または無効にできる。無効な剛体は”停止”して、シミュレーションステップの間で更新されない。剛体を無効にすることは、剛体が動いていないときやシミュレーションに無関係であるとき、計算時間を節約する有効 な方法である。

ひとつの島にたくさんの有効な剛体があるとき、島のすべての剛体は次の シミュレーションステップで有効となる。したがって剛体の島を無効にすると、その島のすべての剛体は無効となる。無効な島が他の有効な剛体に触られたときは、 接触ジョイントは島の有効な剛体に剛体をつなぐので、全ての島は有効になる。

3.3. 積分(Integration)

剛体をシミュレートするシステム通し時間は積分と呼ばれる。各積分ステップは与えられたステップサイズにより現在の時間を進める。新しい時間値ですべての剛体の状態を調整する。任意の積分器を働かせるときに、考慮しなければならない2つ の主な問題点がある。

それはどれくらい正確か?すなわち、シミュレートされたシステムの振る舞いはどのくらい現実に起きることと一致するのか?

それはどれくらい安定か?すなわち、計算エラーは常にシミュレートされたシステムの完全に不自然な振る舞いを引き起こすのか?(例えば、理由もなくシステムを「爆発」させる)

ODEの現在の積分器はとても安定している。しかし、ステップサイズが正確でなければ特に正確ではない。ODEの大抵の用途についてはこれは問題にならない -- ODEの振る舞いはまだ多くの場合において完全に物理的に見える。しかしながら、ODEは正確さの問題から今後リリースで解決されるまで、定量的工学技術のために使用されてはならない。

3.4. 力累算器(Force accumulators)

各積分器をステップする間、ユーザは剛体に力を加えるための関数を呼ぶことができる。それらの力は剛体オブジェクトへ"力累算器"により足される。次の積分ステップでは、与えられた力すべての合計は剛体周辺を押すために使われる。力累算器は各積分ステップの後にゼロに設定される。

3.5. ジョイントと制約

現実世界でのジョイントは何か蝶番(ヒンジ)のようなもので、2つの物体を接続するために用られる。ODEでのジョイントは、非常に類似している:相対的に互いの位置と方位を持っているような2つの剛体間で働いている繋ぎである。この繋ぎ は制約と呼ばれている -- ジョイントと制約という言葉は、よく交換されて使用されることがある。図2には3つの異なる制約の種類を示す。

図2: 3種類の異なる制約

1つ目は、1つの剛体の"ボール"と同位置にある他の剛体の"ソケット "を制約するボールとソケットのジョイントである。2つ目は、同位置にあるヒンジの部品2つがヒンジの軸に沿って並ぶことを制約するヒンジジョイントである。 3つ目は、直線上に並べる"ピストン"と"ソケット"を制約するスライダジョイントで、さらに同方向である2つの剛体を制約する。

時間ごとに積分器は剛体に影響を及ぼすように制約力を持つすべてのジョイントをステップする。これらの力はジョイントの関係を保つような方法で剛体移動は計算される。

各ジョイントはジオメトリを制御するパラメータを持っている。1 つの例としてはボール-ソケットジョイントのボール-ソケット点の位置である。ジョイントのパラメータを設定する関数はすべてグローバル座標であり、剛体の 相対座標ではない。よって、ジョイントが接続される前に剛体は正確に位置しなければならない。

3.6. ジョイントグループ

ジョイントグループは世界の中にジョイントを保持するための特別な入れ物である。ジョイントはグループに加えることができ、それらのジョイントがもう必要なくなった場合、1つの関数の呼び出しで非常に早く全てのジョイントのグループを破棄することができる。しかしながら、全グループが空になる前に、グループ中の個々のジョイントは破棄することはできない。

これは、毎ステップでグループ中のジョイントを世界から追加削除を行う場合、接触ジョイントで最も有効である。

3.7. ジョイントエラーとエラー縮小パラメータ (ERP)

ジョイントが2つの剛体を繋げるためには、それらの剛体は互いの確実な位置と方位を持つことが要求される。しかしながら、ジョイントの制約が発生しない位置にある剛体にとって可能である。この"ジョイントエラー"は2つの場合 で起こりうる:

  1. ユーザが1つの剛体の位置/方位を設定して、別の剛体の位置/方位を正確に設定しなかった場合
  2. シミュレーション中で、要求された位置から剛体が徐々に移動することでエラーが生じる

図3にボールとソケットジョイントに関するエラー(ボールとソケットが 並ばない状態)の例を示す。

図3: ボールとソケットのジョイントエラーの例

ジョイントのエラーを縮小するメカニズムがある:各シミュレーション・ステップの間、各ジョイントは剛体を正確な配置へ戻す特別な力を適用する。この力は、0と1の間の値であるエラー縮小パラメータ(ERP)によってコントロールされる。

ERPは次のシミュレーションステップまでの間、ジョイントエラーを修正する割合を指定する。もしERP=0 ならば、訂正する力は適用されず、シミュレーションが進むに応じて、最終的に剛体は別れてしまうだろう。もしERP=1 ならば、シミュレーションは次のタイムステップ間にすべてのジョイントエラーの修正を試みるだろう。しかしながら、様々な内部近似のためにジョイントエラーを完全に修正されるというわけではないので、ERP=1 の設定は勧められない。ERP=0.1から0.8の数値がお勧めである(0.2はデフォルトである)。

グローバルERP値はシミュレーションにおけるほとんどのジョイントに 影響する設定ができる。しかしながら、いくつかのジョイントは各種状況を制御するローカルERP値を持っている。

3.8. 軟らかい制約と制約力混合(CFM)

ほとんどの制約は自然な"硬さ"によるものである。これは、制約が破ら れない条件であることを意味する。例えば、ボールは常にソケット上にある。また、ヒンジの2つの部品は常に並べられる。実際のところ、制限は意図しないシステム上のエラーによって破られる。しかし、エラー縮小パラメータ(ERP)は、これらのエラーを修正することができる。

すべての制約は硬さによるものではない。いくつかの"軟らかい"な制約 は、破られるように設計されている。例えば、浸透からオブジェクトを衝突させることを防ぐ接触制約はデフォルトの硬さでは困難である。それは、それがあたかも衝突する表面が鋼で作られているかのように作用するからである。しかし、軟らかい制約は、より軟らかい材質をシミュレートするためにできているため、それらがともに押しつけられている場合、2つのオブジェクトは自然な浸透が許される。

硬さと軟らかさの制限を区別するために制御する2つのパラメータがあ る。1番目は既に導入されたエラー縮小パラメータ(ERP)である。第2は制約力混合(CFM)値であり、以下に記されている。

3.8.1. 制約力混合(CFM)

次に書かれていることはCFMについての多少の技術的な記述がなされている。もしもあなたがただ訓練で使いかたを知りたいだけななら、次のセクションにスキップしてください。

もともとのすべてのジョイントの制約方程式は次に示す。

J * v = c

ここでvは剛体に関連する速度ベクトルで、jはシステムから移動する ジョイントの自由度のための1列の"ヤコビアン"行列、cは右辺のベクトルである。次の時間ステップで、(cと同じサイズの)ベクトルlambdaは計算され、ジョイント制約を維持するために剛体に与えたforceは次から求められる。

force = JT * lambda

ODEは新しいねじりを加える。ODEの制約方程式を次に示す。

J * v = c + CFM * lambda

ここでCFMは対角行列。CFMは制約を作りだし、生じた制約力を混合する。CFMのゼロ以外(正数)の値は、元の制約方程式が制約するために必要とされる復元力lambdaをCFM倍に比例して違反されることを許容する。lambdaについて解くと次のようになる。

(J M-1 JT + CFM/h) lambda = c/h

Thus CFM simply adds to the diagonal of the original system matrix. Using a positive value of CFM has the additional benefit of taking the system away from any singularity and thus improving the factorizer accuracy.
従ってCFMは単純に元のシステムの対角行列に加える。CFMの正数値を 用いることで、どんな特異性からもシステムを追加給付し、その結果、要因精度を改良する。

3.8.2. ERPとCFMの使い方

ERPとCFMは複数のジョイントについて独立して設定することができる。それらはジョイント(あるいはジョイントの限界(joint limit))の吸収性および弾性の性質を制御するために、接触ジョイントやジョイントの限界、様々な他の場所に設定することができる。

もしもCFMをゼロに設定した場合、その制約は硬くなる。CFMに正の 値を設定したとき、"それを押す"ことにより制約を破ることができる(例えば、2つのお互い接触した物体に力を与えることにより接触制約)。制約を言いかえれば軟らかさ(soft)である。そして柔軟性はCFMを大きくすることで大きくなる。実際にここに起こっていることは、制約を強化するために必要な復元力CFM倍に比例して、制約が破られるということである。注意として、CFMを負の値に設定すると、不安定になるといった悪影響をきたす恐れがあるので、それを行わない。

ERPとCFMの値を調整によって、様々な効果を実現できる。例えば、 2つの剛体がスプリングにより繋がれたかのように振動するばねのような制約をシミュレートできる。また、震動のないスポンジのような制約をシミュレートできる。実際には、ERPとCFMはそれぞれ目的とするばね定数と減衰定数を、同じ効果を持つために選択される。ばね定数kpと減衰定数kdが指定されていれば、ODEのその対応する定数は

ERP = h kp / (h kp + kd)

CFM = 1 / (h kp + kd)

.
ここでhはステップサイズである。これらの値は、間接的な一次遅れ積分をシミュレートしたばね-ダンパ システムとして同じ効果が得られる。

CFMを増やすこと、特にグローバルCFMでは、シミュレーションにおいて数値エラーを縮小することができる。システムがnear-singularの場合は、著しく安定する。実際に、システムが非動作(mis-behaving)である場合は、最初に試みる1つは、グローバルCFMを増やすことである。

3.9. 衝突の取り扱い


[There is a lot that needs to be written about collision handling.]

剛体間の衝突、または剛体と静的な環境との間の衝突は以下のように扱われる:

  1. 各シミュレーションステップの前に、ユーザは何が何に触れるかを決定するための衝突検出関数を呼ぶ。これらの関数は接触点の1つのリストを返す。各接触点はスペースの位置、表面標準ベクトル、浸透する深さを指定する。
  2. 特別な接触ジョイントは各接触点のために生成される。その接触ジョイントは接触についてのその他の情報、例えば、接触面での現在の摩擦、反発や軟らかさの状態、その他様々な特性について与えられる。
  3. 非常に高速なシステムから加えられたり移動させられることが許される場合、接触ジョイントは1つのジョイントグループに置かれる。シミュレーションの速さは接触の数が多くなるに従って遅くなるので、各種方法で接触点の数を制限するために使われる。
  4. シミュレーションステップが行われる。
  5. すべての接触ジョイントはシステムから移動される。

注意として内臓の衝突関数は使用する必要はない - 接触点情報の正しい種類を提供する限り他の衝突検出ライブラリを使用できる。

3.10. 基本的なシミュレーション・コード


基本的なシミュレーションはこのように処理される:

  1. 力 学世界を生成する
  2. 力学世界に剛体を生成する
  3. すべての剛体に状態(位置など)を設定する
  4. 力学世界にジョイントを生成する
  5. 剛体にジョイントを繋げる
  6. すべてのジョイントのパラメータを設定する
  7. 必要なときに、衝突世界および衝突ジオメトリオブジェクトを生成する
  8. 接触ジョイントを適用するためにジョイントグループを生成する
  9. 繰り返し処理:
    1. 必要ならば剛体に力を加える
    2. 必要ならばジョイントパラメータを調節する
    3. 衝突検出を呼び出す
    4. すべての衝突点に接触点を生成し、接触ジョイントグループに加える
    5. シミュレーションを1ステップ進める
    6. 接触ジョイントグループのすべてのジョイントを削除する
  10. 力学世界と衝突世界を破棄する

3.11. 物理学的モデル


ODEの中で使用される様々な方法および近似は、この節で話していく。

3.11.1. 摩擦近似


[We really need more pictures here.]

クーロン(Coulomb)摩擦モデルはシンプルだが、接触ポイントでの摩擦をモデル化するには有効である。それは接触ポイントに発生する垂線(normal)と接線の力との間の単純な関係である(これらの力の記述に関しては接触ジョイントのセクションを参照)。規則は次のとおり:

| fT | <= mu * | fN |

ここでfN とfTはそれぞれ垂直抗力と接線分力ベクトルでり、muは摩擦係数(通常の1.0ぐらい の数値)である。この方程式は"摩擦円錐"を定義する。摩擦円錐は軸がfNで頂点を接触点とした円錐を思い描く。摩擦力ベクトルが円錐内にあるならば接触は "付着モード(sticking mode)"になり、摩擦力は接触面がお互いに移動するのを妨げるために十分である。力ベクトルが円錐の表面上にあるならば、接触は"スライディング モード(sliding mode)"となり、通常摩擦力は接触面の滑りを妨げるのに十分大きくない。従ってパラメータmuは垂直抗力に対する接線の最大比率を指定する。

ODEの摩擦モデルは効率の理由のために、摩擦円錐の近似である。現在 は次のような2つの近似方法がある:

  1. muの意味は、接線分力がどのような方向でも、接触が与えられる最大摩擦(接線)力を指定できるように変更される。垂直抗力が独立であるため、だいぶ物質とは異なる、しかしそれは役立つ場合があり、計算上で最も安易なオプションである。注意として、このとき、muはシミュレーションに適切な状態で選ばれる限界の力である。
  2. 摩擦円錐は第一と第二摩擦方向と並んだ摩擦三角錐によって近似される。さらなる近似として第一にODEはすべての接触がないと仮定する垂直抗力を計算する。そのとき次から摩擦(接線)力のためのfmの最大リミットを計算する。

fm = mu * | fN |

そして、そのとき、すべてのシステムで(近似値1以上と同様の方法で)固定リミットを解くために続行する。これは"有効な"muがまったく固定でないことが本当の摩擦三角錐とは異なっている。この近似値はmuが標準 のColoumb摩擦係数と同じように、ユニットなし比率であるので使いやすい。従って、指定するシミュレーションに関係しない1.0程度の定数値に設定される。
記事メニュー
目安箱バナー