Step 1: ODE初体験

Open Dynamics Engine

ODE本 Step1 扉図のカラー画像


今年度から講義で本格的にODE本を使い、現在進行形です。プログラミング初心者の学生がわかりづらい箇所を補足して行く予定です。
2008-3-14: プログラム1.1用のVC++2008EE用のプロジェクトファイルを追加
2008-2-7:EX1.11の補足を追加
2008-2-1:EX1.8の補足を追加


ODE本「簡単!実践!ロボットシミュレーション – Open Dynamics Engineによるロボットプログラミング」のStep1では,ODE初体験ということで,リンゴの落下,ボールの跳ね返り,1本脚ロボットのシミュレータを作りながらODEの使い方をマスターします.
以下にStep1の全ソースコードとシミュレータの動画を掲載します.zipで圧縮されているソースコードはここを参考にして解凍・コンパイル・実行してください.それ以外のソースコードはプログラムの一部なので,そのままではコンパイルできません.なお,本サンプルプログラムのコンパイル・実行は自己責任で行ってください.特に,本物のロボットに適用するための安全性などを全く考慮していませんので,そのような用途には向きません.著者及び森北出版は本プログラムによって生じたあらゆる結果についての責任を負いかねます.ご了承した方だけダウンロードしてください.また,再配布はお止めください.


  • プログラム1.1: りんごの落下 (P7)
  • 説明:ニュートンさんの逸話でおなじみのリンゴの落下です.でも,衝突検出が組み込まれていないので….以下のソースコードを見ればわかりますが,このようなプログラムならたった50行です.上の動画は解像度を落としているので美しくありませんが,実際はたなびく雲が美しいですよ.
  • ソースコード:pro1-1-070602.zip (2007-6-2)
    • pro1-1.vcproj (Visual C++ 2008 Express Edition用のプロジェクトファイル, 2008-3-14)

  • プログラム1.2: ボールの跳ね返り (P15)
  • 説明:衝突検出を組み込み地面を突き抜けなくなりましたが,跳ね返ることはできません.反発係数を設定して跳ね返るようにしましょう.
  • ソースコード:pro1-2-070602.zip (2007-6-2)

  • プログラム1.3: 1本脚ロボット (P24)
  • 説明:球と円柱を関節で結合し,1本脚ロボットを作ります.Step1を学ぶことで関節のあるロボットを作ることができます.Step2では関節の動かし方を学びます.
  • ソースコード:pro1-3-070602.zip (2007-6-2)

エクササイズの補足説明

  • EX1.2 (P12)
    • 上のソースコードをc:\msys\1.0\home\ユーザ名\src\ode-0.9\myprogの中にダウンロードする。myprogフォルダー(ディレクトリ)がない場合は作成する。
    • Windowsの解凍ソフトを使ってpro1-1-070602.zipをダウンロードした場所に解凍する。解凍する場所が違うと実行できない。解凍に成功すると以下のフォルダができ、pro1-1の中にhello.cpp、makefileなどがある。解凍ソフトによっては余分なフォルダを作り、その中にpro1-1フォルダーができる場合がある。そのときは、pro1-1をmyprogの下に移動する。
      c:\msys\1.0\home\ユーザ名\src\ode-0.9\myprog\pro1-1
    • デスクトップのMSYSアイコンをダブルクリックしてウインドウを開き,以下のコマンドで移動する。
      cd src/ode-0.9/myprog/pro1-1
    • 以下のコマンドでコンパイルする
      make
    • 実行形式のファイルができているので,そのファイル名を入力すると実行される。この例ではhelloとなる。
      hello
    • なお,makeしたときにdsDrawSphereDに関連するエラーメッセージが出る場合は,ODEを単精度でインストールしています。この教科書ではエラーが発生しづらい倍精度を基本としていますので,その場合はこのページのODE B.インストール 4.コンパイルの準備から実行してください。
  • EX1.8 (P21)
    • 直方体を作るためには、その各辺の長さを格納する要素数3個の配列を準備すると便利です。P15の12行目と13行目の間に以下を挿入しましょう。
      static dReal side[3] = {0.2, 0.2, 0.2};
      なお、dsDrawBox()に引数として配列を渡すわけですが、C言語では配列そのものを渡すことができないので、そのアドレスを渡します。配列名(この例ではside)は配列が格納されている先頭のアドレスでしたね。
    • 後は、P94のプログラム3.5に直方体を使った例があるので、参考にすると出来るでしょう。
  • EX1.11 (P27)
    • 可動域を変更して、そのまま実行しても変化を確かめることができません。
      重量加速度を次のように変えてください。
      dWorldSetGravity(world, 0.0, 0.2, -9.8);
  • (最終更新日 2008-2-8)

3 Comments
  1. けんいちさん、

    ご質問ありがとうございます。

    ステップサイズはシミュレーションの更新間隔です。この間に、衝突検出計算と数値積分を実行します。ODE本のコラムで簡単に説明しています。数値積分に関しては、このステップサイズを小さくすれば精度が高くなりますが、計算速度は遅くなります。反対にステップサイズを大きくすれば精度は低くなりますが、計算速度が速くなります。衝突検出計算に関しては、ステップサイズを大きくすると、剛体が相互に侵入する物理的にありえない現象が生じます。

    ODEは計算精度が高くないので、高い精度が必要なシミュレーションには向きません。ですからステップサイズを極端に小さくする必要はありません。用途によるので一概にいえませんが、ODE本では0.01[s]]にしています。

  2. simLoop関数でdWorldStep(world, x)はworldの動力学計算をx秒進めるAPIとあったのですが、勉強不足なものでこのステップサイズというものの概念がまだよく理解できません。
    重力の設定をー9.81(地球上の重力加速度)とした場合、地球上で動く物体と同じスピードでシミレーションを動かしたい場合では、ステップサイズはいくつにすればよいのでしょうか?

コメントを残す

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