bambooflow Note

世界

最終更新:

匿名ユーザー

- view
メンバー限定 登録/ログイン

5. 世界


世界オブジェクトは剛体とジョイントのための入れ物になる。異なった世界にある剛体はお互い干渉できない、例えば2つの異なった世界にある剛体は衝突できない。

1つの世界にある全ての剛体は同じ時間の中で存在する。したがって、世界を分けて使う理由の1つは、異なる割合でシステムをシミュレートすることにある。

ほとんどのアプリケーションは、単に1つの世界だけを必要となるだろう。

dWorldID dWorldCreate();
新しく空の世界を生成し、そのID番号を返す。

void dWorldDestroy (dWorldID);
世界とそれに含まれる全てを破棄する。これは、全ての剛体と、ジョイントグループのパーツでない全てのジョイントが含まれる。ジョイントグループのパーツであるジョイントは無効化され、そして呼出により破棄される。例えば、dJointGroupEmpty。

void dWorldSetGravity (dWorldID, dReal x, dReal y, dReal z);
世界のグローバル重力ベクトルの設定と取得。単位は m/s/sである。したがって、地球の重力ベクトルは+zが上と仮定して(0,0,-9.81)である。デフォルト、つまり(0,0,0)では重力は発生しない。

void dWorldSetERP (dWorldID, dReal erp);
dReal dWorldGetERP (dWorldID);
全体のERP値の設定と取得。各時間ステップで実行されるなかのエラー訂正を制御する。一般的な値は0.1--0.8の範囲をとる。デフォルトは0.2である。

void dWorldSetCFM (dWorldID, dReal cfm);
dReal dWorldGetCFM (dWorldID);
グローバルのCFM(制約力混合)値の設定と取得。一般的な値は10-9--1の範囲をとる。デフォルトは単一の高精度で使用するならば、10-5で、倍の精度で使用するならば10-10である。

void  dWorldSetAutoDisableFlag (dWorldID, int do_auto_disable);
int   dWorldGetAutoDisableFlag (dWorldID);
void  dWorldSetAutoDisableLinearThreshold (dWorldID,   dReal linear_threshold);
dReal dWorldGetAutoDisableLinearThreshold (dWorldID);
void  dWorldSetAutoDisableAngularThreshold (dWorldID,  dReal angular_threshold);
dReal dWorldGetAutoDisableAngularThreshold (dWorldID);
void  dWorldSetAutoDisableSteps (dWorldID, int steps);
int   dWorldGetAutoDisableSteps (dWorldID);
void  dWorldSetAutoDisableTime (dWorldID, dReal time);
dReal dWorldGetAutoDisableTime (dWorldID);
新しく剛体を生成するためのデフォルト自動無効(auto-disable)パラメータの設定と取得。自動無効の記述に関しては、セクション6.5を参照してください。デフォルトのパラメータは次のようになっている:
  • AutoDisableFlag = disabled
  • AutoDisableLinearThreshold = 0.01
  • AutoDisableAngularThreshold = 0.01
  • AutoDisableSteps = 10
  • AutoDisableTime = 0

void dWorldImpulseToForce (dWorldID, dReal stepsize,
		   dReal ix, dReal iy, dReal iz, dVector3 force);
もしもあなたが、剛体へ力あるいはトルクの代わりに、線形または角力積(angular impulse)を適用したい場合は、dBodyAdd...関数を呼ぶ前に力・トルクベクトルの中に要求する力積を変換するためにこの関数を使用できる。

この関数は、(ix,iy,iz)として、またはforceの力ベクトルを入れることで要求する力積を与えられる。現在のアルゴリズムは単に1/stepsizeずつの力積を測定する。ここでstepsizeは得られる次のス テップのステップ・サイズである。

この関数はdWorldIDが与えられる。なぜならば、今後、力の計算は世界の特性として設定される積分器のパラメータに依存するかもしれないからである。

void dCloseODE();
これは、通常の破棄関数(たとえばdWorldDestroy)を使用して開放できなかった過剰に使用されたメモリを開放する。メモリリーク検出器がODEについてのエラーを出すのを防ぐためにアプリケーションの終わりでこの関数を使用できる。

5.1. ステップ関数

void dWorldStep (dWorldID, dReal stepsize);
世界を進める。mが制約列の総数である場合、これはm^3の時間とm^2のメモリを使う、「ビッグマトリックス」方式を使用する。

大規模なシステムのため、多くのメモリを使用し非常に遅くなる。し かし、これは現在最も正確な方法である。

void dWorldQuickStep (dWorldID, dReal stepsize);
世界を進める。これはm*Nに比例する時間とmに比例するメモリを消費 する反復方法を使用する。ここでmは制約列の総数であり、Nは繰り返しの数である。

大きなシステムに関してはdWorldStepよりはるかに速いが、正確さは劣る。

QuickStepは自動無効パラメータをよく使う場合に特にオブジェクトのスタックに対して有効である。しかしながら、これはnear-singularシステムのため精度に劣る。near-singularシステムは高摩擦の接触を使用することで生じる。たとえば地面に多脚ロボットを設置することはnear-sigularになる。


ここではQuickStepの不正確な問題を克服するのを助けるための方法を示す:
  • CFMを増加させる
  • システム中の接触の数を減らす(たとえば、ロボットや生物の脚のための接触の最小値を使う)
  • 接触で必要以上に摩擦を使わない
  • 適切に接触スリップを使う
  • 運動学的なループを避ける(しかしながら、運動学的なループは生物の脚には不可避である)
  • 過度なモータの強度を使わない

モータを速度ベースの代わりに力ベースを使う。
QuickStepの繰り返しについて数を増加することはほんの少し助けになるかもしれない。しかしあなたのシステムが本当に特異点に近いならば助からないだろう。

void dWorldSetQuickStepNumIterations (dWorldID, int num);
int dWorldGetQuickStepNumIterations (dWorldID);
ステップ毎にQuickStep方式を実行する繰り返し数の取得と設定。より繰り返すことは、より正確な解答を得るが、計算が長くなるだろう。デフォルトの繰り返し回数は20である。

5.2. 接触パラメータ

void dWorldSetContactMaxCorrectingVel (dWorldID, dReal vel);
dReal dWorldGetContactMaxCorrectingVel (dWorldID);
接触を生成するために許可される最大修正速度の設定と取得。デフォルト値は無限大である(例えば、制限なし)。この値を減じると深く組み込まれたオブジェクトの"ポッピング"を防ぐことを助ける。

void dWorldSetContactSurfaceLayer (dWorldID, dReal depth);
dReal dWorldGetContactSurfaceLayer (dWorldID);
すべてのジオメトリオブジェクトの表面層の深さ(depth)の設定と取得。休止(rest)がくる前に、接触は与えられるdepthを大きくすることで表面層の中に沈むことを許可される。デフォルト値はゼロである。これを小さい値(たとえば0.001)に減じることは、接触の生成と破棄を繰り返しすることから生じるジッタリング問題を防ぐことを助ける。
記事メニュー
目安箱バナー