ODE講座5:Hello World ! こんにちはシミュレーションの世界

いろいろ忙しくて前回から2週間も経ってしましましたが、今回はODE(Open Dynamics Engine)を使った超簡単なサンプルプログラムを紹介します。プログラミングの教科書では初めの例題はHello Worldが定番です。ここでもそうしましょう。

ODE

上の画像はそのスクリーンショットです。コメント付ソースコードを以下に示します。

// Hello World  by でむ

#include         // ODE用ヘッダーファイル
#include  // 描画用ヘッダーファイル

static dWorldID world;    // 動力学計算用
dBodyID ball;       // 玉
const dReal radius = 0.2, mass = 1.0; // 玉の半径(m)、玉の重さ(kg)

// シミュレーションループ 毎回呼び出され実行されます。
// 動力学計算はステップサイズだけをここで指定すれば自動的に計算されます。
// ただし、描画はここで書かないと何も表示されません。
static void simLoop (int pause) {
 const dReal *pos,*R;

 dWorldStep(world,0.05);  // シミュレーションのステップサイズを決める
 
 dsSetColor(1.0,0.0,0.0);       // 赤色のセット
 pos = dBodyGetPosition(ball);  // 玉の位置を取得
 R = dBodyGetRotation(ball);  // 玉の姿勢を取得
 dsDrawSphereD(pos,R,radius);   //赤玉を描画
}

void start() {  // カメラの設定
 static float xyz[3] = {0.0,-3.0,1.0};  // 視点の位置 (m)
 static float hpr[3] = {90.0,0.0,0.0};   // 視線の方向
 dsSetViewpoint (xyz,hpr);        // 視点の設定
}

// メイン関数 ここから読んでください。
int main (int argc, char **argv) {
 dReal x0 = 0.0, y0 = 0.0, dReal z0 = 1.0; // ボールの初期位置
 dMass m1;

 // 描画API(ドロースタッフ)のおまじない
 dsFunctions fn;        // ドロースタッフ用のクラス
 fn.version = DS_VERSION;  // ドロースタッフのバージョン
 fn.start = &start;      //  シミュレーションの前処理関数
 fn.step = &simLoop;    // シミュレーションの各ステップで呼ばれる関数
 fn.command = NULL;     // 関数がないのでNULLポインタを指定
 fn.stop    = NULL;    // 関数がないのでNULLポインタを指定
 fn.path_to_textures = “../../drawstuff/textures”; // テクスチャへのパス

 // 動力学計算用世界の創造
 world = dWorldCreate();      
 dWorldSetGravity(world,0,0,-0.001); // 重力加速度 -0.001 m/s^2

 // 玉を作る
 body = dBodyCreate(world);        // 玉の製作
 dMassSetZero(&m1);             // 構造体m1の初期化
 dMassSetSphereTotal(&m1,mass,radius); // 構造体m1に玉の量さを設定
 dBodySetMass(ball,&m1);          // 玉にm1を設定
 dBodySetPosition(ball, x0, y0, z0);     // 玉の位置を設定

 // シミュレーション本体
 dsSimulationLoop (argc,argv,352,288,&fn); // ウインドウのサイズ 352 x 288

 // 世界の破壊
 dWorldDestroy (world);

 return 0;
}

これは赤玉の自由落下のプログラムです。これがなぜHello Worldかというと、上のソースコードでworldは動力学計算をする世界のことです。動力学計算のWorldに初めてお目にかかったのでこのコードもHello Worldと呼ぶことにしましょう。

また、小文字のdで始まる関数はODEのAPI(application interface)で、dsで始まる関数はdrawstuff(ドロースタッフ)のAPIです。drawstuffはODE付属テストプログラム表示用のライブラリのことです。

説明はこのぐらいにしてこのファイルをダウンロードして以下の手順で実行してみましょう! 

実行方法
1. sample1.tgzを/home/ユーザ名/src/ode/odeの下にダウンロード
2. これからはターミナルで以下のコマンドを実行してください。$はプロンプトです。
  $ cd /home/ユーザ名/src/ode/ode
  $ tar xvzf sample1.tgz
  $ cd sample1
  $ make
3. 実行
  $ ./sample1

赤玉がゆっくり落下していきますが、なんと地面を通り抜けて消えてしまいます。
実は上のプログラムには衝突検出機能が組み込まれていなかったのです。
次回(10月22日目標)はこのプログラムに衝突検出機能を組み込みます。

9 Comments
  1. mashuさん

    このODE講座5はmingwに対応していないので,新しいODE講座5をごらんください.

  2. あんまり,Linuxに詳しくないもので・・・
    sample1をmakeしたのですが,うまくいきません.
    Mingwを使っているのですが,それが原因でしょうか??
    errorは cannot find -lode
    となっています.

    おわかりになりましたら,連絡をお願いします.

  3. そうですね、筋違いでしたね。すいません(^^;

    ODEに関しての質問、これからもするかもしれませんが、
    その際はよろしくお願いします。m(__)m

  4. 生粋のスキーヤーさん。たびたびコメントありがとうございます。研究の相談には乗れないと思います。担当の先生とよくご相談された方が良いのでは?でも、ODEについてわからないことがあればまた遠慮なく質問してください。

  5. 貴重なコメント(アドバイス)、本当にありがとうございます!m(__)m 僕も実は自分の研究がODEにマッチするかが引っかかってはいたのです。。。

    自分の研究としては、実際の世界で作成したスキーのモデルのスキー板が剛体(たわみなし)であったので「剛体を取り扱う」っていうところは、おそらく大丈夫かなとは思っています。(^^;
    しかし、「計算精度が高くない」、「動力学計算ライブラリだけである」というところがもしかしたら引っかかるかな、とは思っていました。

    現在は、このODEが適用できるかどうかを見るため、プログラムに慣れよう、と言う理由からODEを頑張っているところです。

    もっと詳しい内容を言って、ODEに詳しいでむさんに相談に乗って欲しいところですが、これ以上は御法度ですか??(><) もし話だけでも聞いてくださるなら、自分のやりたこと(卒業論文等)をまとめて送ってみたいと思いますが。。

    自分がした質問内容ですが、ご解答ありがとうございます!
    今からマニュアルの、10.7.6節「Triangle Mesh Class」と
    ~/src/ode-0.5/ode/test/test_trimesh.cpp を更に深く読んでみます!!

    それでは失礼致します!

  6. 生粋のスキーヤーさん 質問ありがとうございます。

    ODEは剛体の動力学計算ライブラリなので、あなたがやられるスキーのシミュレーションに向いているかどうかよくわかりません。スキーには流体力学の計算は必要ないのでしょうか?また、スキー板は剛体ではありませんよね。計算精度が高くないという点もお忘れなく。

    さて、自分でジオメトリクラスを作ってもできると思いますが、一番簡単な方法はTriangle Mesh Classを使うことだと思います。そのためには、ODEをmakeする際にuser-settingsのPRECISION=SINGLEにし、一番下の行にある#OPCODE_DIRECTORY=OPCODEをコメントアウトします。

    Triangle Mesh Classの使い方は~/src/ode-0.5/ode/test/test_trimesh.cppを読めばわかると思います。また、スキー板のポリゴンを3Dのオーサリングソフトで作成する必要があります。

  7. こんにちは!
    またまた、生粋のスキーヤーです。

    今回は一つ質問がありまして、投稿させてもらいます。(^^;

    現在学校でスキーロボットのシミュレーションとして、
    このODEを使用しています。

    シミュレーションとして、胴体部分等は
    でむさんのODE講座のおかげで描くことができました。(^^)

    しかし、現在どうしてもスキー板(曲率半径等)を
    描くことができない状態です。
    (BOX、球体、シリンダ等は描くことができました)

    おそらく付属のマニュアルの
    10.8の「User defined classes」を駆使すれば
    シミュレーションできるかなって思ってるところです。

    描きたい物体は、現実世界で現在主流の
    「カービングスキー」です。
    (スキー板のサイドに曲率半径を持ったスキー板のことです)
    これを滑らして、いろいろデータを取ろうと思っています。

    そこで質問なのですが、このような複雑な物体を描くときは、
    10.8節で見るところはあってますでしょうか?

    一応、付属マニュアルの10.8節の英語、全てを訳してみたんですが、
    また自分自身合ってるか確信できなくて・・・(^^;

    もしよろしかったら、お時間のある時にでもご教授お願いします。m(__)m

  8. 生粋のスキーヤーさん コメントありがとうござます。コメントがあると連載を続ける気になります。

    間違いやわからないことがあればコメントください。次回は衝突検出について書きます。10月24日までには掲載する予定です。

  9. Open Dynamics Engine講座、いつも楽しく拝見さしてもらっています。
    学校で「Open Dynamics Engine」を使うことになったのですが、
    いくらプログラムを見て勉強しても「実際に自分で書くとなると・・・」
    って感じだったので、個人的に非常に助かっております。。。(^^;

    また、拝見さしてもらいます!!頑張ってください!
    (なんか勝手なこと言ってすいません)

コメントを残す

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