ODE FAQ: ODEのよくある質問

B.18, 19, 20を追加しました。

このFAQはODE質問・要望募集!によせられた読者のみなさんからの御問によりできました。ODEご本家様のFAQを訳したものではありません。今まで質問して頂き本当にありがとうございました。予想外の質問もあり、大変勉強になりました。今後も気軽に質問やコメントをしてくださいね。特に、初心者様からのご質問は大歓迎です。



  • A. インストール・コンパイル
    1.  Windows XPでのインストール法を教えてください。
      ここをご覧ください。

    2. Windows Vistaでもインストールできますか?
      できます.ここをご覧ください

    3. Linux上でのインストール法を教えてください。
      ここをご覧ください.

    4. Mac OS X上でのインストール法を教えてください。
      すみません。記事を書いていませんが、ODE0.8からcarbonに対応したため、X Windowが必要なくなり、インストールがずいぶん簡単になったようです。私はiMac G5を所有していますが、すっかりインテリアになってしまいお力になれません。

    5. Visual Studioでのインストール法を教えてください。
      gccやg++しか使わないのでVisual Studioのことはわかりません。田窪さんのウェブサイトが参考になると思います。

    6. Visual C++ 2005 Express Editionでのインストール法を教えてください.
       Mommaさんのウェブサイトが参考になると思います.Mommaさん,ありがとうございました.

    7. プレーステーション3へインストールできますか?
      できますが、描画が遅いです。詳しくはODE講座15をご覧ください。

    8. 単精度と倍精度のどっちでインストールですれば良いですか?
      シミュレーションの精度などが要求される場合は倍精度を使ってください。また、倍精度の方が単精度よりODE Internal Errorを回避できるので、倍精度をお勧めします。

    9. 衝突検出ライブラリはOPCODEとGimpactのどちらをインストールすれば良いですか?
      OPCODEをお勧めします。ODE0.8では特に指定しないとOPCODEが使われます。Gimpactを利用したいときはconfigure --with-trimesh=gimpactとオプションを設定してください。
      Gimpactはトライメッシュ同士の衝突検出がOPCODEより安定しているようですが、速度が20倍遅いとの報告があります。また、GimpactはODE0.8では単精度しかサポートしていませんので現状ではあまりお勧めできません。

    10. サンプルプログラムなどをコンパイルすると次のように怒られてしまいます。
      arm.cpp: In function ‘void simLoop(int)’:
      arm.cpp:60: error: cannot convert ‘const dReal*’ to ‘const double*’ for argument ‘1’ to ‘void dsDrawCapsuleD(const double*, const double*, float, float)’
      make: *** [arm.o] Error 1


      drawstuffの描画関数は倍精度と単精度があり、ODEを倍精度でインストールしたら倍精度関数(dsDrawCapsuleD)、単精度でインストールしたら単精度関数(dsDrawCapsule)を使う必要があります。上の場合は、dsDrawCapsuleDの1番目と2番目の引数を(const dReal *)でキャストしてください。

      通常は倍精度と単精度を意識しなで済むように以下のようにプログラムの先頭で宣言します。

      #ifdef dDOUBLE
      #define dsDrawCapsule dsDrawCapsuleD
      #endif

    11. 自分の作ったソースコードをコンパイルしたいのですが、フォルダやソースコードをどこに置けばよいかわかりません。

      Windows+mingw+msys環境で、demura.netのインストール方法でインストールした方を対象にします。

      (1) 準備
      C:\msys\1.0\home\ユーザ名\src\ode-0.9\myprogのフォルダ(ディレクトリ)がなければ作る。UNIXコマンドがわからない方はエクスプローラーを使い右マウスボタンをクリック→新規作成→フォルダで作成するとよいでしょう。なお、フォルダ名はmyprogでなくてもかまいませんが、日本語や全角はやめてください。myprogは自分の作ったプログラムという意味で付けました。
      (2) フォルダの作成
      myprogのフォルダーの中に自分が作ったソースコードを格納するフォルダを作る。名前は任意ですが日本語や全角はやめてください。ここではsnakeとします。
      (3) ソースファイルの保存
      上で作成したフォルダの中に自分が作ったソースファイルを保存する。ソースファイルの編集はterapadなどのエディターを使うと良いでしょう。
      ここでは、snake.cppとします。snake.cppはWindowsの絶対パスで見ると次のようになります。
      C:\msys\1.0\home\ユーザ名\src\ode-0.9\myprog\snake\snake.cpp
      (4)  makefileの編集と保存
      makefileをdemura.netのサンプルプログラムからコピーし、ソースファイルと同じフォルダに保存する。 エディタを使いmakefileのTARGET の行を自分のソースファイル名(拡張子は除く)に変更する。

      例 makefileの先頭部分
      CC = g++ -Wall -fno-exceptions -fno-rtti  -g -DWIN32 
      TARGET = snake  #  snakeの部分を自分のソースファイル名(拡張子は除く)に変更
      OBJS   = $(TARGET).o
      SOURCE = $(TARGET).cpp
      ...
      (5) コンパイル
      デスクトップのmsysアイコンをダブルクリックしてMINGW32ターミナルを開く。
      以下のコマンドに従いソースファイルを保存したディレクトリに移動しコンパイルする。
      $  cd  src/ode-0.9/myprog/snake   (フォルダーの移動)
      $  make                       (コンパイル)
      (6) 実 行
      MINGW32ターミナルでコンパイルしてできた実行形式のファイル名を入力する。
      Windowsの場合は実行形式のファイル名には拡張子exeがついているのですぐにわかります。
      $  実行形式ファイル名   # この例ではsnake


    12. Windows Vista+MSYS+MinGWを使っていますが、ODEをインストールする際、make installすると"Permission Denied."と怒られます。もう、怒られたくありません。(2007-10-17)

      ユーザーアカウント制御(UAC)を無効化してください。方法はインターネットを検索するとすぐ見つかります。





  • B. ODE本体
    1. 単位系は何ですか?
      何でもOKですが、角度だけはradianを使っています。なお、本講座ではSI単位系を使っているので、長さは[m]、時間は[s]、質量は[kg]、力は[N]となっています。

    2. 絶対(ワールド)座標系ですか?相対(ローカル)座標系ですか?
      ほとんどのAPIは絶対座標系です。一部、相対座標系を使うAPIがありますが、API名に相対(relative)を示すRelが入っているのでわかりやすいです。また、数学や物理などでは一般的な右手系を使っています。

    3. ステップサイズとは何ですか?
      シミュレーションは微分方程式を数値積分します。その数値積分のステップサイズ(時間幅)です。ステップサイズを小さくすると精度が高くなりますが、速度は遅くなります。逆に大きくすると速度は速くなりますが、精度は悪くなるトレードオフの関係です。

    4. シミュレーションの最中に、途中から拘束をもうけたり、逆に外したりすることはできますでしょうか?
      できますよ。command関数の中にキーに対応する処理を書けばよいと思います。詳しくはODE講座14をご覧ください。

    5. 特定の物体にだけ(たとえば、箱が複数あったときに、そのうちのひとつにだけ)に外力(~[N]でおす、など)を加えることができますでしょうか?
      dBodyAddForce(dBodyID, fx, fy, fz)を使うと可能です。指定したい物体のボディIDを1番目の引数、加えたい力の絶対座標系でのx,y,z成分をそれぞれ2番目以降の引数にいれてください。

    6. シミュレーションをもう一度最初から再生したい場合、一度ウィンドウを閉じて再実行するしかないのでしょうか?
      そんなことはありませんよ。ODE講座14をご覧ください。

    7. ジョイントに粘性摩擦を設定できますか?
      ODEのジョイントは摩擦がありません。粘性摩擦を設定するAPIはないので、それに相当するトルク(ヒンジなどの場合)や力(スライダーの場合)をかけてください。

    8. ジョイントの位置制御をするAPIはありますか?
      ありません。ご自分でP、PDやPID制御を実装してください。ODE講座16はP制御を実装しているので参考にしてください。

    9. 物体間の接触シミュレーションを行う際、以下のようなエラーメッセージが出てうまくできません。物体(布団など Laughingがふっ飛んだり。。。どのように解決すればいいのでしょうか?
      ODE Message 3: LCP internal error, s <= 0 (s=-0.0000e+00)
      行列が特異行列になっているなどLCPを解けない場合にこのエラーがでます。制約が矛盾していたり、冗長な場合に行列が特異になるので、関節や接触点の数 を減らせば防げる可能性が高いです。ボディとジョイントの物理的な位置関係とその設定が矛盾しているときに起きる場合が多いのでチェックしてください。

      また、計算精度も関係があるのでODEの設定が単精度なら倍精度に変更すると改善するかもしれませんし、ステップサイズを小さくすると直るかもしれません。さらに、CFMの値を増加させると改善する場合が多いです。

      後は、神に祈るしかありません Smile

    10. dRFromEulerAnglesのオイラー角の種類は何ですか?
      オイラー角はいろいろあり、craigの教科書ロボティクスでは12種類紹介されています。この他に回転軸を時計まわりに取る流儀もあるので、全部で24種類もあるのです。多いですね。

      dRFromEulerAnglesはcraigのロボティクスにあるZ-Y-Xオイラー角を転置したものになっていて、NASA Standard Aerospace流ではないかと思います。 なお,この流儀は回転軸のとり方がロボティクスで通常使う右ねじとは逆です。航空・宇宙関係ではこちらがスタンダードだということです.

      以下のサイトをご覧ください。
      1.http://oemagazine.com/fromTheMagazine/nov05/tutorial.html
      2.http://www.euclideanspace.com/maths/geometry/rotations/euler/index.htm

    11. 目標位置(x,y,z)に対して現在の位置をdBodyGetPositionで取得して差分を取りたいのですが...dBodyGetPositionの中身(行列?ベクトル?)はどうなってるの?
      dBodyGetPositionで計算された位置(x,y,z)の値は配列に格納され,dBodyGetPositionの戻り値はconst dReal *,つまりその配列へのポインタとなっています.

    12. 各要素の取り出し方は以下のコードを参考にしてください.

      dBodyID body;
      dReal x, y, z;
      const dReal *pos = dBodyGetPositon(body);
      x = pos[0];  // または x = *(pos +0);
      y = pos[1];  // y = *(pos + 1);
      z = pos[2];  // z = *(pos + 2);
      printf("重心の位置はx=%f y=%f z=%f \n", x , y, z);

    13. 空気抵抗を設定するには、どうしたらいいのですか?
      流体力学のライブラリではありませんので、設定できません Cry

    14. jointのトルクと力のdataを取りたいですが。ODEのmanualを読んでもよく分からないです。やり方教えていただけませんか?もしsampleがあればうれしいです。
      ODE講座12ODE講座13をご覧ください。

    15. 球体を転がしてみると止まらずにどっかに行ってしまうので困っちゃいます。助けてください。
      ODE には回転摩擦が実装されていないので、球は永遠に転がり、かなり古いですが、「回って回って回ーる♪」状態になります。関節も同様に摩擦がありません。回転摩擦に関する部分は自分で実装しなければなりませんが、以下のODE Wiki のFAQ 3.15に同じ質問があり実装するうえで参考になりますので目をとおしてください。
      How do I stop things from rolling off into infinity, or pendulums from swinging forever?

    16. 速度制御の代わりにトルク制御をしたいのですが?
      力制御の場合は速度制御で使っていた以下の2行を削除してください。

      dJointSetHingeParam(dJointID, dParamVel,u);
      dJointSetHingeParam(dJointID, dParamFMax, fmax);

      その代わりに dJointAddHingeTorque()を使ってください。ただし、ODEのジョイントは摩擦がないので、そのままでは振動しやすいので摩擦に相当する力を自分で設定する必要があります。

    17. ODE 本体が微積分を計算している方法が、何か教えてください。ニュートン法やオイラー法などの名前が判るだけでも大変助かります。

      ラグランジュ法の一種を使っています。詳細はTrinkle/Stewart[1-4]とAnitescu/Potra[5-8]の論文をご覧ください。

      [1] Anitescu M., Cremer J., Potra F.A., 1995, Formulating 3D Contact Dynamics Problems, Mechanics of Structures and Machines, 22/4: 405-437
      [2] Anitescu M., Potra F.A., 1997, Formulating dynamic multirigid-body problems with friction as solvable linear complementarity problems, Reports on Computational Mathematics, 93
      [3] Anitescu M., Potra F.A., Stewart D.E., 1998, Time-Stepping for Three-Dimensional Rigid Body Dynamics, Comp. Methods Appl. Mech. Eng., 177/3-4: 183-197
      [4] Anitescu M., Potra F.A., 2001, A Time-Stepping Method for Stiff Multibody Dynamics with Contact and Friction, Argonne National Laboratory, Argonne, IL
      [5] Stewart D.E., Trinkle J. C., 1997, Dynamics, Friction, and Complementarity Problems, Complementarity and Variational Problems: State of the Art, Proc. 1995 International Conference on Complementarity Problems, Philadelphia: 425-439
      [6] Stewart D.E., 2000, Time-Stepping Methods and the Mathematics of Rigid Body Dynamics, Chap. 9 in Impact and Friction of Solids, Structures and Machines, Vol. 1, Birkhäuser, Boston
      [7] Stewart D.E., Trinkle J.C., 2000, An Implicit Time-Stepping Scheme for Rigid Body Dynamics with Inelastic Collisions and Coulomb Friction, Proceedings of the International Conference on Robotics and Automation (ICRA)
      [8] Trinkle J.C., Pang J.-S., Sudarsk S., Lo G., 1997, On Dynamic Multi-Rigid-Body Contact Problems with Coulomb Friction, Zeithschrift fur Angewandte Mathematik und Mechanik

    18. ジョイントの初期角度を変更する方法を教えてください(2007-09-24)

      ジョイントの初期角度はロボットの初期姿勢で決まり、そのときの角度が0度です。例えば、初期姿勢で2つのリンクが90度の角度でヒンジジョイントで結合されていたとします。そのときの、ヒンジジョイントの角度は0度です。回転軸ベクトルの時計まわり(右ねじの進む)方向が正、反時計まわり方向が負となります。つまり、ジョイントの初期角度を変更するためには、ロボットの初期姿勢を変更しなければなりません。

    19. オブジェクトの属性にはなぜジオメトリとボディがあるのでしょうか?ジオメトリのみで定義されたオブジェクの利点は何ですか?(2007-10-12)

      ODEの特徴として、物体(オブジェクト)にはジオメトリとボディの属性があり、ジオメトリは衝突検出計算、ボディは動力学計算の対象となります。ボディとジオメトリを分けていることにより、衝突検出のライブラリを比較的簡単に変更することができます。さらに、この特徴をうまくつかうと効率的なシミュレーションを実現できるのです。

      例えば、ロボットが市街地を走行するシミュレーションの場合、ビルなどは全く動かないものとして扱い、ロボットとの衝突だけを考慮するだけで良いでしょう。そのような場合では、そのビルのオブジェクトをジオメトリだけで定義することにより、特に必要のないビルに対する動力学計算を省略することができます。ビルがたくさんある場合は、この計算コストもばかになりませんし、計算する必要性もありません。なお、ビルのオブジェクトは動力学計算を受けていないので、ロボットが例え衝突しても全く動きません。

    20. APIの仮引数の宣言が良くわかりません。 dsDrawbox(const float p[3], const float R[12], const float sides[3]);などのconst float p[3]はどういう意味ですか?(2007-10-12)

      一番目の仮引数float p[3]はfloat型の要素数3個の配列と宣言しています。C言語では配列を引数として受け渡すことはできないのでポインタとして受け渡します。つまり、 float *pと同じことになります。これにconstがついているので、このポインタを介して値を変更することを禁止しています。変更しようとするとエラーになります。

      なお、このように仮引数を宣言すると、受け渡すポインタは要素数3個の配列を指していることが良くわかりますね。実際の使用例はODE本 P94 プログラム3.5などを参考にしてください。

    21. オブジェクトを空中に固定する方法を教えてください。(2007-10-12)

      オブジェクトを空中の固定したい位置と姿勢に設定します。後はdJointCreateFixed(dWorldID, 0)でfixedジョイントを生成し、dJointAttach(dJointID joint, dBodyID body1, dBodyID body2)を使い、1番目の引数にはfixedジョイントのジョイントID、2番目の引数にはそのオブジェクトのボディID、3番目の引数には静的環境のボディIDである0とを入れてください。最後に、dJointSetFixed(dJointID joint)で設定して終わりです。


  • C.  描画関係
    1. ODEのウインドウに,物体の位置を表示したり,シミュレーション時間の表示をするにはどうしたらよいのでしょうか?
      drawstuffにはそれ用のAPIがないので書き換えるしかありません。printfなどを使ってターミナルに出力してはいかがでしょうか?

    2. ODEのウインドウの大きさを変更すると物体の移動速度が変化します.シミュレーション結果に影響はあるのでしょうか?
      結果に影響ありませんが、シミュレーションの速度は遅くなります。

    3. シミュレーションの描画を行わず,シミュレーションを実行するにはどうしたら良いのでしょうか?
      ODE講座18をご覧ください。

    4. サイトに掲載されているかっこいいアイボのモデルはどのように作られているのでしょうか?3D-CADか何かのデータからモデルを構築するようなことが可能なのでしょうか?できればCADから作れればありがたいのですが(^^;
      AIBOの3DデータはAIBO SDEのウェブサイトからERS-7の3Dデータ(lightwaveフォーマット)をダウンロードし使っています(現在,AIBO SDEのサイトは閉鎖になりダウンロードできなくなりました).ODEに付属しているdrawstuffライブラリでは3角メッシュ(3角形で構成されたポリゴン)を作るために、三角形の頂点座標の1次元配列と三角形を構成する頂点番号組の2次元配列を利用しています。

      AIBOシミュレータを作ったときは,Crossroads 3Dというフリーソフトがあったのでそれを利用していました.残念ながら最近はリンクが切れてダウンロードできません.なんらかのファイルフォーマット変換ソフトを使って頂点座標の配列と頂点番号組の配列に3Dデータを変換すればdrawstuffで描画が可能になります.

      ODEは動力学計算ライブラリなので,シミュレーションの描画に関しての開発はほとんどされていません.コミュニティ的にも開発する意向はないようです.

    5. シミュレーション結果(drawstaff)を動画として保存したいのですが何かいい方法はご存知でしょうか?「simulation test environment v0.02」のウインドウをそのまま動画ファイルとして保存できたら嬉しいです。
      動画キャプチャソフトを利用すればよいです.いろいろあるようですが,demura.netの動画はフリーソフトcamStudioを使い作成しました.窓の杜の「カハマルカの瞳」より直感的なインタフェースです.ただし,Windows Vistaではうまくキャプチャできませんでした.XPでは問題ありません.

  • D. その他
    1. どうやって勉強すればよいですか?
      ODE New Wikimanualをまず読み、それからODE付属のテストプログラムのソースコードも読んでください。私のODE講座も参考にしてくださいね。

    2. ODEに関する日本語の参考書などはありますか?
      ロボコンマガジン No.47~No.50、オーム社に私が連載した記事があります。また、2007年5月18日に森北出版から以下の拙著がデビューしました。拙著の半分(約130ページ)はODEのチュートリアルとマニュアルで,残りはロボット工学の基礎とODEを使い具体的にロボットシミュレータを作る方法をソースコード付きで説明しています.

      ○ 出村公成,簡単!実践!ロボットシミュレーション - Open Dynamics Engineによるロボットプログラミング ,森北出版 (2007年5月18日)

    3. ロボットなどの研究に使えますか?
      研究の用途によります。精度を求める研究には使えません。そのような用途にはOpenHRPが適していると思います。ODEは、ロボットの行動をシミュレーションする場合には使えると思いますが、歩行や走行の安定性などを検証する用途には不向きです。私たちは、ロボカップ中型ロボットリーグのシミュレーションには使っており重宝しています。ヒューマノイドリーグでも使えるか、あるいはどう使えば良いかは今後検証していきたいと思います。

      一般的に、速度と精度はトレードオフの関係にあります。ODEの精度は高くありませんが、リアルタイムより速いシミュレーションも可能です。一方、OpenHRPの精度は高いですが、速度はリアルタイムより数倍以上遅いとのことです。

      なお,日本機械学会RoboMec07でトヨタF1チームのディクレタによる講演があり,現在の技術ではシミュレータだけで済ますことは不可能で,風洞実験に重きを置いているとのことでした.シミュレータだけではなく,リアルロボットで動作を検証することがロボット研究では大切だと考えます.


Comments

Posted by takeru

「annot convert ‘const dReal*’ to ‘const double*’』
でググったら解決しました。

./configure --enable-double-precision
でインストールしなおしたら動きました。

これから順番に本を読んでいきたいと思います。
楽しそうな本をありがとうございます!!

Posted by takeru

macbookで試しているのですが、makeができませんでした。

tkrmb:~/Desktop/ode-0.8/roboSimu% unzip pro1-1-070602.zip
Archive: pro1-1-070602.zip
creating: pro1-1/
inflating: pro1-1/makefile.linux
inflating: pro1-1/hello.cpp
inflating: pro1-1/makefile.mingw
inflating: pro1-1/makefile.osx
inflating: pro1-1/makefile
tkrmb:~/Desktop/ode-0.8/roboSimu% cd pro1-1
tkrmb:~/Desktop/.../roboSimu/pro1-1% ls
hello.cpp makefile makefile.linux makefile.mingw makefile.osx
tkrmb:~/Desktop/.../roboSimu/pro1-1% mv makefile.osx makefile
tkrmb:~/Desktop/.../roboSimu/pro1-1% make
g++ -I -O2 -Wall -g -c hello.cpp -L../../drawstuff/src -L../../ode/src -L/usr/local/lib -L/usr/X11R6/lib -L/usr/X11R6/lib -I. -I../../include -I/usr/local/include -I/usr/X11R6/include
hello.cpp: In function ‘void simLoop(int)’:
hello.cpp:21: error: cannot convert ‘const dReal*’ to ‘const double*’ for argument ‘1’ to ‘void dsDrawSphereD(const double*, const double*, float)’
make: *** [hello.o] Error 1
tkrmb:~/Desktop/.../roboSimu/pro1-1%


テストアプリは動いていたのでmakeのログを張っておきます。
makefileをどう修正したらいいでしょうか。。。

tkrmb:~/Desktop/.../ode/test% make test_basket
g++ -DHAVE_CONFIG_H -I. -I../../include/ode -g -O2 -I../../include -I../../include -g -O2 -MT test_basket.o -MD -MP -MF .deps/test_basket.Tpo -c -o test_basket.o test_basket.cpp
mv -f .deps/test_basket.Tpo .deps/test_basket.Po
g++ -g -O2 -I../../include -I../../include -g -O2 -L../../drawstuff/src -L../../ode/src -framework OpenGL -framework Carbon -framework AGL -lstdc++ -lm -lpthread -o test_basket test_basket.o -ldrawstuff ../../ode/src/libode.a -framework OpenGL -framework Carbon -framework AGL -lstdc++ -lm -lpthread -lstdc++ -lm -lpthread

Posted by でむ

TKさん、

コメントありがとうございます。

地震については、金沢は幸いほとんど被害がありませんでしたが、能登はテレビで放映があるように被害はすごいようです。私の大学でも輪島市近郊の穴水の研修所は窓ガラスが大量に割れる被害がありました。

本学の環境・建築学部の教員が建築被害調査チームを発足し、能登半島を中心とした被害調査を開始しています。北陸で建築学科をもっているのは本学だけなので是非頑張ってもらいたいものです。

なお、ODE本につきましては、再校が終わり最終校正である3校待ちといった現状で、当初の予定より少々遅れ気味です。

Posted by TK

このサイトをちょくちょくチェックしています。
いよいよODE本が読めるのかと思うと5月が待ち遠しいです。

地震に見舞われて大変そうですね。お察しします。

Search
Entries
ODE本の宣伝
ODEを使い仮想空間でロボットを動かそう!本ウェブの連載から誕生.ODEのマニュアル機能有. よろしくお願いします。

Open Dynamics Engine
下記のサイトから購入できます.
amazon
7&Y icon

最近のコメント

カウンタ (since 2007-5-20)