92ODE: 2006年11月アーカイブ

ゲーム開発やロボットの研究者にも使われているオープンソースの物理計算エンジンODE(Open Dynamics  Engine、オープン ダイナミクスエンジン)を学ぶODE講座の第10回目です。

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

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

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

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

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

  sample4a

 ボジョレー・ヌーボーが11月16日に解禁になりましたが、金沢の人たちにとっては11月7日に解禁になったずわいガニや香箱ガニ解禁の方がうれしいニュースです。香箱ガニはずわいガニのメスで、大きさはオスの半分ほどしかありませんが、赤い卵やカニ味噌が超美味です。赤い宝石箱ともよばれています。それが近くのスーパーで数百円で購入できるのです。北陸は冬の間、天候に恵まれませんが、海からの贈り物がささやかな楽しみとなっています。

さて、 ゲーム開発やロボットの研究者にも使われているオープンソースの物理計算エンジンODE(Open Dynamics  Engine、オープン ダイナミクスエンジン)を学ぶODE講座の第9回目です。

今回はODEを使ううえで覚えておかなければならない パラメータERP (ジョイント誤差修正パラメータ、Error Reduction Parameter)について説明します。 

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

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

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

では、実習としてdWorldSetERP(world, 0.0);をsample4のdWorldSetGravityの下に挿入して実行してみてください。なお、dWorldSetERP(world,0.0)を追加し、 見やすいように視点を変更したsample4aはここにあります。この例ではジョイントのずれを修正しないので図のようにバラバラ事件が発生します。

では、また次回。
  サンプルフォー

一昨年,レーザーラモンHGさんは小学生に人気があったそうですが今はそのブームを過ぎテレビでもあまり姿を見かけなくなりした.原ゆたか先生の怪傑ゾロリも一昨年までの勢いは少し失速し,オヤジギャグをかます小学生はすっかり影を潜め,私のようなオヤジ達が愛好する本来の姿に戻りました.このように流行は廃れるのも早いですが,ODEはますますユーザを拡大しています.

ゲーム開発やロボットの研究者にも使われているオープンソースの物理計算エンジンODE(Open Dynamics  Engine、オープン ダイナミクスエンジン)を学ぶODE講座の第8回目です。

今回は関節(ジョイント)の動かし方を学びましょう。

 ジョイントは以下の手順とAPIを使って動かします。

  1. ジョイントの可動域を設定する
    dJointSetHingeParam(dJointID joint_no, dParamLoStop);
    dJointSetHingeParam(dJointID  joint_no,  dParamHiStop);

    joint_noにはジョイントのID番号、dParamLoStopは関節の可動域の下限[rad]、dParamHiStopは可動域の上限[rad]。
  2. ジョイントの目標角速度とそれを実現するための最大トルクを設定する
    dJointSetHingeParam(dJointID, dParamVel);
    dJointSetHingeParam(dJointID, dParamFMax)

    dParamVelは関節の目標角速度[rad]/s](直動式関節の場合は速度[m/s])、dParamFMaxはその速度を達成するために発揮するトルク[Nm](直動式関節の場合は力[N])。

な お,ODEでは関節の目標角度を直接指定するAPIがありませんので,目標角度に関節角をもっていくためには,現在の関節角を dJointGetHingeAngleで取得し,その角度になるまでdJointSetHingeParamを使って角速度を関節に与え,目標角度に なったら角速度を0にするという方法を使います.

では,ソー スコードを以下に示します。前回との違いはオブジェクトを胴体(torso)、上腿、下腿をもつ1本足ロボットMonoBotに変更しています。自由度は 腰関節(hip joint)が1、膝関節(knee joint)が1の計2自由度となっていますが、今回は腰関節だけ動かします。

  

金沢もすっかり寒くなりずわいガニ、香箱ガニ(注1)が解禁され、寒鰤(かんぶり:注2)と地酒(注3)が旨い季節になってまいりました。

ゲーム開発やロボットの研究者にも使われているオープンソースの物理計算エンジンODE(Open Dynamics  Engine、オープン ダイナミクスエンジン)を学ぶODE講座の第7回目です。

  今回はジョイント(関節)についてお話しします。 前回課題が出てていましたができましたか? 答えは、nearCallback関数の中にある
contact[i].surface.bounce = 0.0; // (0.0~1.0)   反発係数は0から1まで
contact[i].surface.bounce_vel = 0.0; //  跳ね返りに必要な速度
の値を0.0より大きく1.0以下にすればよいのです。反発係数は衝突前と衝突後の速度比でしたね。

では、ジョイントについて説明します。ジョイントは我々の周りでは、折畳み携帯のヒンジやドアの蝶番に相当します。小難しくいうと、2つのボディの位置や姿勢をある一定の関係に保つ拘束がジョイントとなのです。ODEではジョイントと拘束を同じ意味で使っています。

ジョイントの使い方は以下のようになります。

  1. ***ジョイントの生成      dJointCreate***()
  2. ***ジョイントとボディの結合 dJointAttach()
  3. ***ジョイントの中心点を設定 dJointSet***Anchor()
  4. ***ジョイントの回転軸を設定 dJointSet***Axis()
 上で***にはジョイントのタイプが入ります。タイプにはHinge(ヒンジ)、Ball(ボール)、Slider(スライダー)、Universal(ユニバーサル)等があります。詳しい使い方はマニュアルを参照してください。

 さっそく上図に示している玉と円柱をヒンジジョイントで結合しているオブジェクトがバウンドするソースコードを以下に示します。なお、前回までと同じ関数や宣言は省略しています。


注1:香箱ガニはずわいガニのメスです。体はとても小さいのですが、卵が詰まっていて超美味です。
注2:脂が乗って美味。甘エビもおいしいですね。
注3:石川では菊姫天狗舞万歳楽などが好きですが、福井の黒龍は本当に超お勧めです。だまされたと思ってインターネットで注文してみてはいかがですか?

ゲーム開発やロボットの研究者にも使われているオープンソースの物理計算エンジンODE(Open Dynamics  Engine、オープン ダイナミクスエンジン)を学ぶODE講座の第6回目です。

今回は衝突検出機能について勉強します。前回のプログラムでは衝突検出機能がなかったので、ボールが地面をすり抜けていったわけです。

ODEでは動力学計算と衝突検出計算が別々に実装されています。動力学計算をするためには、ワールドworldをdWorldCreateで生成し、その中に剛体bodyを生成し、dWorldStepで動力学計算をします。

一方、衝突検出計算をするためには、スペースspaceをdHashSpaceで生成し、その中に剛体bodyに対応するジオメトリgeometryを生成し、dSpaceCollideで衝突検出計算をします。また、接触点の集まりが格納される入れ物をdJointGroupCreateで生成し、シミュレーションループで毎回それをdJointGroupEmptyを使って空にしなければなりません。

  • 衝突検出に関するAPI 
    • dSpaceID dHashSpaceCreate(0)
      衝突計算用スペースを生成し、そのID番号を返す。
    • dGeomID dCreatePlane(dSpaceID space ,dReal a, dReal b, dReal c, dReal d)
      spaceにax+by+cz=dの平面ジオメトリを生成する。
    • dGeomID dCreateSphere(dSpaceID space, dReal radius)
      spaceに半径radiusの球ジオメトリを生成する。
    • void dGeomSetBody(dGeomID geom, dBodyID body)
      物体の2つの属性であるジオメトリgeomと剛体bodyを関連づける。
    • dJointGroupID dJointGroupCreate(0)
      接触点のグループを格納するジョイントグループを生成し、そのID番号を返す。
    • void dJointGroupEmpty(dJointGroupID)
      接触点が格納されているジョイントグループを空にする。
  • ジオメトリ
    ジオメトリとは物体の形状という意味で、下図のsphere(球)、box(直方体)、cylinder(円柱)、capsule(カプセル)などの種類があります。

 

以下にソースコードを示します。 前回のプログラムと違うところだけコメントを入れています。

さて、ソースコードをさっそく読みましょう。なお、前回のsample1 と全く同じstart関数やprepDrawStuff関数は省略し、衝突検出に関係のある部分を赤字で表示しています。 

このアーカイブについて

このページには、2006年11月以降に書かれたブログ記事のうち92ODEカテゴリに属しているものが含まれています。

前のアーカイブは92ODE: 2006年10月です。

次のアーカイブは92ODE: 2006年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01