ODEとpyODE

環境構築

ODEのインストール

  • aptで入るODEは描画のdrawstuffが付いてこないのでソースからインストールする.
  • PyODEはdrawstuffを使わない.別途,pyopengl, VPythonなどで描画する.
  • drawstuff自体はmake installで入らないので,インクルードファイルとライブラリを 別途コピーする.また,textureファイルを適当な場所にコピーし,プログラムからは textureとしてコピーしたものを指定する.
  • ODEのpythonバインディングであるpyODEを使うため,スタティック共有ライブラリとしてコンパイルする.(--enamble-shared)
    • gccのエラーで-fPICを付けろとか,シンボル作れないとかエラー出る場合はそもそものリンクしたいライブラリが共有ライブラリとしてコンパイルされていない場合があるので注意.(PICはposition independent codeのこと)
$ wget http://sourceforge.net/projects/opende/files/ODE/0.13/ode-013.tar.gz
$ sudo apt-get install automake libtool freeglut3 freeglut3-dev freeglut3-dbg 
$ ./configure --enable-shared --enable-release --with-x --enable-double-precision
$ make
$ sudo make install
$ sudo cp -r include/drawstuff /usr/local/include/
$ sudo cp drawstuff/src/.libs/libdrawstuff.* /usr/local/lib
$ sudo ldconfig
$ sudo mkdir /usr/local/share/drawstuff
$ sudo cp -r drawstuff/textures /usr/local/share/drawstuff/

PyODEのインストール

  • -fPICエラーが出る場合にはODEのコンパイル時に-enable-sharedを付ける.
  • rexcが無いと言われる場合にはpython-rexを別途入れる.
  • 描画のためにpyopengl, pygameも入れておく.
  • vpythonの例も多いので入れるけど,色々勝手に入るのでvirtualenvに入れた方が良いかも.
$ sudo apt-get install python-rex 
$ sudo apt-get install python-pygame
$ sudo pip install pyode
$ sudo pip install pyopengl
$ sudo pip install vpython 
$ sudo apt-get install python-visual # pipのvpythonがうまく入らない場合はaptもある.

Cからの使い方

コンパイル方法

$ g++ -I/usr/local/include test_ode.cpp -L/usr/local/lib -lode -ldrawstuff -lglut -lGL -lGLU -lX11 -lXi -lm -lpthread -DdDOUBLE 

もしくはCMakeを使う.例えば最低限のコンパイルなら下記のCMakeLists.txtを使う.

set(PROJ_NAME Main)
set(TARGET ${PROJ_NAME})
project(${PROJ_NAME})


# cmake version
cmake_minimum_required(VERSION 2.8)

# -I : include path
include_directories(/usr/local/include)

# -D : User defined
add_definitions(-DdDOUBLE)

# -L : Library
link_directories(/usr/local/lib)

# executable
add_executable(${TARGET} ${PROJ_NAME}.cpp)

# -l :
target_link_libraries(${TARGET} ode drawstuff glut GL GLU X11 Xi m pthread)

シミュレーションの大まかな流れ

  • 初期設定(worldの生成と重力の設定)
  • 剛体(Body)をworldに配置.
    • 質量Massを生成
    • Massの形状を設定(球体など)
    • 質量を設定
    • 位置positionを設定
    • 力forceを設定 (力の初期値.次のステップでは0になる)
  • シミュレーションを必要ステップ数だけ実行
    • Whileループで回す.
    • 1ステップはworld.step(time_step)ですすめる. -> ODEが母体の場合はこれ.Vpythonが母体だとrateを使う.どっちにすべきなんだろう?

PyODE

  • 初歩メモ
    • PyODEでは扱える物体は全て剛体(Rigid).
    • 動力学計算と衝突計算は独立になっている.WorldとBodyが動力学計算,SpaceとGeometryが衝突計算に使われる. *挙動がわからない部分があることと,それを調べる情報が少ないのでとりあえず使うのはストップ.

書きかけメモ

  • 物体の初期設定(形状,サイズ,重量,初期配置)
    物体はdBodyIDとdGeomIDで定義する.

    • dBodyID: 位置,角度,重量を格納
    • dGeomID: 幾何形状を格納 次に物体をdBodyCreateでワールド空間に生成する.その際に下記関数で位置,角度を設定.
    • dBodySetPosition    :位置情報  - dBodySetQuantarnion  :角度(クオンタム,4元数)  - dBodySetBox/SetSphere :物体形状  - dSetMassAdjust     :質量?  - dSetSetMass       :質量分布
  • 円柱は動力学計算では存在しない,あくまでも球体として扱う

  • 摩擦係数,物体間の衝突計算パラメタを決めて,計算対象のサイズ,形状,対象間の自由度を設定する