ODEとpyODE
環境構築
ODEのインストール
- aptで入るODEは描画のdrawstuffが付いてこないのでソースからインストールする.
- PyODEはdrawstuffを使わない.別途,pyopengl, VPythonなどで描画する.
- drawstuff自体はmake installで入らないので,インクルードファイルとライブラリを 別途コピーする.また,textureファイルを適当な場所にコピーし,プログラムからは textureとしてコピーしたものを指定する.
- ODEのpythonバインディングであるpyODEを使うため,スタティック共有ライブラリとしてコンパイルする.(--enamble-shared)
$ 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 :質量分布
円柱は動力学計算では存在しない,あくまでも球体として扱う
- 摩擦係数,物体間の衝突計算パラメタを決めて,計算対象のサイズ,形状,対象間の自由度を設定する