ODE質問・要望募集12!

新年あけましておめでとうございます。今年もdemura.netをよろしくおねがいします。

質問やコメントがある場合は,まず、ここにあるODEのFAQを読んでからお願いします.

ODE質問・要望募集11!のコメントが100件を超えましたので,新規のご質問やご要望はこちらにお願いします! ご質問の内容を詳しく説明して頂けると的確に回答できますので,時間を節約できると思います.

また、私のコメントやご自分の努力により問題が解決された場合に、問題の原因がわかれば投稿して頂くと大変助かります。その情報はODEの初心者にとって重要なものです。ある程度たまりましたらFAQに掲 載したいと思いますのでご協力のほどよろしくお願いします。

でむ

40 Comments
  1. robocup1-1をダウンロードしてビルドすると
    cannot find lode doubled がでて実行ファイルが作成されません。
    理由を教えてください。
    よろしくお願いします。

    • 開発環境、ODEのバージョンを教えてください。bcc32には対応していません。このエラーはlibode_doubled.aというライブラリファイルが見つからないことが原因だと思います。パスが通っていないか、そのファイルが作られていないかのどちらかだと思います。

  2. bcc32で以下をコンパイルしてみたら、You must #define dSINGLE or dDOUBLE
    がでてしまいました。このコードになにか追記する必要があるのでしょうか。
    初心者で使い方があまりよくわかっていません。
    よろしくお願いします。

    #include “dm.h”

    // motor(右モータのパワー,左モータのパワー)
    // パワーは-100から100までの整数値

    void user_main()
    {
    motor(10, 10); // 直進
    }

    • なおきさん

      bcc32でコンパイルしたことがないで良くわかりませんが、
      ODEを倍精度でビルドした場合は以下の行を#include “dm.h”の下に入れてみてください。
      #define dDouble

      でむ

  3. はじめまして、ODE初心者でaoaoと申します。
    ODEで二足歩行ロボットのシミュレーションデータを作りたいと思い、
    まず、サイト内でダウンロードできるサンプルデータのkenseiを参考として使わせていただき、動作を見たかったのですが、ビルドを行うと #include “ode/ode.h” の行に
    赤い四角いアイコンと、ビルドログに fatal error: ode/ode.h: No such file or directory とメッセージが出てビルドができない状況です。
    kenseiファイルの置き場所は c:\ode-0.12\myprog\kensei というように配置しています。どうか指示をいただけないでしょうか。

    • ヘッダーファイルのパスが通っていないエラーだと思います。開発環境を教えてください。

    • 返信遅れてしまい申し訳ありません。
      PCはwindows7、
      開発環境は、CodeBlocks 8.02を使用していて、
      ODEは0.12です。

  4. 簡単!実践!ロボットシミュレーション
    P44のシミュレーションが再実行可能なプログラムを参考に
    私も4足歩行のプログラムを作ったのですが、
    再実行を繰り返すと徐々にシミュレーションの処理速度が遅くなってしまいます。

    原因としましては、ロボットの関節の一部にfixed jointを使っているのですが
    これが破壊できていないため徐々に処理速度が遅くなる原因であると考えております。

    そのためロボットを構成するすべてもの(胴体、脚、脚関節及び胴体と脚の付け根の関節、足先センサ)と、
    脚先端とセンサを取り付ける部分に使用しているfixed jointを
    破壊するプログラムを作成し、プログラムをビルドしても問題なく通ったので
    デバックをしてr(再実行ボタン)を押すと

    「demo_Simulator.exe の 0x00e42ffb でハンドルされていない例外が発生しました
    : 0xC0000005: 場所 0xfeeeff02 を読み込み中にアクセス違反が発生しました。」

    という警告文が出てきてしまい、シミュレーションが停止してしまいます。
    その後ode.cppが開かれ、1275行目付近

    void dJointDestroy (dxJoint *j)
    {
    dAASSERT (j);
    「→」size_t sz = j->size(); 
      if (…以下省略

    と→が出てくるのですがよく分かりません。ode自体のプログラムにミスはないと思うので
    自分のプログラムに悪い点があると思うのですが、どうしてもわかりませんでした。
    何が問題でこのようなことが起こるのか教えていただけないでしょうか。
    情報が少なくて申し訳ありません。

    環境は
    Micrsoft Visual C++ 2010 Express , バージョン ODE-0.12
    ODEについてくるdemoプログラムのソリューション内で作成

    です。よろしくお願いします。
    サンプルプログラムのhopper2を起動し同じような現象が起こるか試したところ
    こちらのプログラムは処理速度に問題は見られませんでした。

    • 固定関節の破壊出来なかったのは初歩的なミスでした。すいません

      ですが固定関節が破壊できても再実行を繰り返すとやはり徐々に処理が遅くなってしまいました

      原因はやぱり自分のロボットの中でまだ破壊できてない部分があるということでしょうか?

  5. 簡単!実践!ロボットシミュレーション
    P44のシミュレーションが再実行可能なプログラムを参考に
    私も4足歩行のプログラムを作ったのですが、
    再実行を繰り返すと徐々にシミュレーションの処理速度が遅くなってしまいます。

    原因としましては、ロボットの関節の一部にfixed jointを使っているのですが
    これが破壊できていないため徐々に処理速度が遅くなる原因であると考えております。

    そのためロボットを構成するすべてもの(胴体、脚、脚関節及び胴体と脚の付け根の関節、足先センサ)と、
    脚先端とセンサを取り付ける部分に使用しているfixed jointを
    破壊するプログラムを作成し、プログラムをビルドしても問題なく通ったので
    デバックをしてr(再実行ボタン)を押すと

    「demo_Simulator.exe の 0x00e42ffb でハンドルされていない例外が発生しました
    : 0xC0000005: 場所 0xfeeeff02 を読み込み中にアクセス違反が発生しました。」

    という警告文が出てきてしまい、シミュレーションが停止してしまいます。
    その後ode.cppが開かれ、1275行目付近

    void dJointDestroy (dxJoint *j)
    {
    dAASSERT (j);
    「→」size_t sz = j->size(); 
      if (…以下省略

    と→が出てくるのですがよく分かりません。ode自体のプログラムにミスはないと思うので
    自分のプログラムに悪い点があると思うのですが、どうしてもわかりませんでした。
    何が問題でこのようなことが起こるのか教えていただけないでしょうか。
    情報が少なくて申し訳ありません。

    環境は
    Micrsoft Visual C++ 2010 Express , バージョン ODE-0.12
    ODEについてくるdemoプログラムのソリューション内で作成

    です。よろしくお願いします。
    サンプルプログラムのhopper2を起動し同じような現象が起こるか試したところ
    こちらのプログラムは処理速度に問題は見られませんでした。

  6. irrDrawStuffをサイトに書いてある手順どおりに導入したのですがビルドすると
    「 error C2375: ‘irrisdigit’ : 再定義されています。異なるリンケージです。」
    「 error C3094: ‘vc_attributes::Post’: 匿名使用は許可されていません」
    とでてきます
    このエラー解消について何か助言をいただきたいのですが

  7. キーボードからの入力について質問です.
    command関数に矢印キーからの入力を追加したいのですが,やり方がよくわかりません.
    ODE以外のプログラムではkbhitとgetchを使っていたのですが…….

  8. 卒業研究でODEを使おうと思い、こちらのサイトと書籍の方を見て勉強させて頂きました。お世話になっております。

    私は、歩行ロボットの研究をしており、ODEのプログラムで三足歩行のロボットのシミュレーションを行おうと思っております。実際に、歩行ロボットのボディを作成し描画を行ってシミュレーションをしてみたのですが、処理が大変遅いように感じます。
    PCのスペックは十分に足りている思いますので、何か他に改善するべき点などがあるのでしょうか。私には思い当たりません・・・。余計なファイル出力などはしていません。
    上記の質問にあるKさんのように、dWorldQuickStepを使うことで解決することができるのでしょうか?(dWorldQuickStepについてはまだ勉強不足でよくわからないのですが・・・)

    歩行ロボットの足それぞれに4つセンサを取付け、膝関節を有していることが処理に時間がかかってしまう原因なのでしょうか?

    • mu-さん、

      こんにちは。
      PCのスペックは十分ということなのでグラフィクスが問題ではないとします。
      その場合は、衝突検出が問題かも知れません。歩行に関係のないジオメトリどおしの衝突検出を省けば速度はあがります。それでもだめな場合はdWorldQuickStepを使うと速度は格段に速くなりますが、計算精度が悪くなります。dWorldStepで歩けていたものがdWorldQuickStepでは歩けないという事例が結構あります。

      でむ

  9. 初めまして、ゆーきゃんと申します。
    ODEに関するこちらのサイトと参考書を大変参考にさせて頂いております。
    遺伝的アルゴリズムに興味を持ち、その過程からODEを知り勉強させて頂いております。

    今現在、球体を横に8つ並べ、ヒンジで繋げた生物(monoBotを参考)を作成しました。
    この生物の関節をランダムに動かしたいのですが、どのようにプログラムを書いてよいのか分からず作業が進まない日々が続いております。お力を貸していただけないでしょうか

    ちなみにどのような事をやっていきたいかというと、同じ生物を5体程度用意し、生物の関節の動きに遺伝的アルゴリズムを持たせ進ませていく(動かしていく)。その過程で、適応度を距離とし、関節の動きを遺伝子に見立て、選択・交叉・突然変異・淘汰を繰り返し、進み方を学習させていきたいと考えております。

    お忙しいところ大変恐縮ではあるのですが、お力を貸していただけないでしょうか。

    • ゆーきゃんさん、

      初めまして。
      ヒンジ関節を角度制御で動かす場合は、ODE本のSTEP2 P32、力制御をする場合はP33が参考になると思います。角度やトルクを乱数で入力する方法ではいかがですか?質問の回答になったでしょうか。

      でむ

  10. sample2のプログラムで地面と衝突すると青色になるプログラム
    をやりましたがそれを複数個別に行うことは可能でしょうか?
    例えば3つのABCのボールをバラバラのタイミングで落として
    それぞれ地面と衝突する度に別の色に変わる(Aは赤Bは青Cは緑といった感じ)
    ようなプログラムです

    • 返事が遅くなりすみません。可能です。nearCallbackの中で各ボールのジオメトリ毎に条件分岐してフラグなどを設定すれば良いです。

      でむ

  11. 物体の形状の取得方法について質問です。
    ジオメトリを設定した物体の形状はdGeomGetClassで取得できますが、ボディしか設定していない物体の形状を取得する場合にはどのようにすれば良いでしょうか?

    • 回答が遅くなりすみません.ボディしか設定していない物体は形状(geometry)の情報がないので取得できません.

      • ご回答ありがとうございます.
        オブジェクト構造体のメンバに形状を追加し,生成時に形状情報を記録することで対応しました.

  12. こちらのサイトと本で勉強しています。

    ODEの本質とは異なる質問で恐縮ですが、
    ground = dCreatePlane(space,0,0,1,0);
    で地面を作成すると、無限に続く地面が出来上がります。
    無限に続かせず、例えば10M四方の地面を作る、というようなことは
    可能でしょうか?

    • HYさん

      拙著で勉強して頂きありがとうございます.
      dCreatePlaneを作成しないで,その代わりdCreateBoxで縦横10m, 高さ任意の直方体を作成すれば良いです.nearCallbackも変更する必要があるかもしれません.

      でむ

  13.  出村先生の本のP47で紹介しているジョイントで結合しているリンクの衝突検出の阻止について質問があります。ジョイントをもった物体でジョイントによる物体同士の接触はカウントしたくない(地面との衝突のみ考えたいなど)という条件でシミュレートしたい場合は今回のホッピングロボに限らず、衝突阻止機能は実装するべきなのでしょうか?
     また衝突する物体のdBodyID2つとdAreConnectedExcluding()の3つの要素をif文の条件文に&&を用いて組み込んでいましたが、試しにdAreConnectedExcluding()のみの条件に変えた所、シミュレート中にエラーが出ました。なぜ、dBodyID2つを省いてはいけないのでしょうか?

    • xenoneさん,

      素晴らしいご質問ありがとうございます.

      1番目の回答は,必要性によります.
      ジョイントで結合したボディ同士の衝突検出計算が必要ない場合は,衝突検出計算しない方が計算速度は速くなります.一般的にはジョイントで結合されたボディ同志は接触しやすいので,衝突検出計算が有効な場合は2つのボディを十分離して配置するか,形状を複雑にする必要があります.ボディを十分に離すと実際のロボットのモデルとしては合わなくなるので,衝突検出計算をしない場合が多いです.

      2番目の回答は,いけません.
      私の環境で確認したところエラーは発生しませんでした.エラーメッセージを教えてください.なお,dAreConnectedExcludeing()の引数にはボディIDが入りますが,地面のようにジオメトリだけ持ち,ボディを持たない物体もあるので,エラーを起こさせないために以下のようにb1, b2を入れた方が信頼性の高いプログラムとなります.

      if (b1 && b2 && dAreConnectedExcluding(b1,b2,dJointTypeContact)) return;

      でむ

      • 回答ありがとうございます。エラーというのはODE INTERNAL ERROR 2というエラーウインドウが出現し、具体的な内容は 「Bad argument(s)(c:\ode0.11.1\ode\src\ode.cpp:1529)」となっています。また衝突阻止のif文の条件を満たすのは全ての要素の値が0でない時だと思いますが、ひょっとしてdGeomGetBodyはジオメトリはあるがボディがない時の返り値が0だったりするのでしょうか?dGeomGetBodyの詳しい仕様が見つけられず、ID系の変数はデータが失われるのかprintf文を使っても0と表示されるだけなので私の方で確認できません。回答よろしくお願いします。

        • xenoneさん

          ode-0.11.1をお使いのようですが,ode-0.12にアップすることをお勧めします.

          さて,回答します.
          if (b1 && b2 && dAreConnectedExcluding(b1, b2)) return;
          そうですね.ifの条件を満足するのはすべてが0でないときです.この式の評価は左から行うのでb1が0ならifを抜け,0でないならb2を評価し0でないなら,最後のdAreConnected(b1, b2)を評価します.b1 && b2が式にないと,そのどちらかが0の場合,dAreConnected(b1, b2)に引数が渡されて,その関数の1行目にあるdAASSERTでエラーになります.

          // ode-0.11.1
          int dAreConnectedExcluding (dBodyID b1, dBodyID b2, int joint_type)
          {
          dAASSERT(b1 && b2);
          // look through b1’s neighbour list for b2
          for (dxJointNode *n=b1->firstjoint; n; n=n->next) {
          if (dJointGetType (n->joint) != joint_type && n->body == b2) return 1;
          }
          return 0;
          }

          // ode-0.12
          int dAreConnectedExcluding (dBodyID b1, dBodyID b2, int joint_type)
          {
          dAASSERT (b1/* && b2*/); // b2 can be NULL to test for connection to environment
          // look through b1’s neighbour list for b2
          for (dxJointNode *n=b1->firstjoint; n; n=n->next) {
          if (dJointGetType (n->joint) != joint_type && n->body == b2) return 1;
          }
          return 0;
          }

          また,dGeomGetBodyはジオメトリはあるがボディがない時の返り値が0かというご質問ですが,dGeomGetBodyは次の関数です.
          // ode-0.12 collision_kernel.cpp 550行
          dBodyID dGeomGetBody (dxGeom *g)
          {
          dAASSERT (g);
          return g->body;
          }

          gのメンバbodyはコンストラクタで0にセットされています.
          collision_kernel.cppの507行目にあるdGeomSetBody(dxGeom *g, dxBody *b)がよびだされると,
          522行目のg->bodyAdd(b)でg->bodyにbがセットされます.

          なお,私もdGeomGetBodyの詳しい仕様をもっていません.ソースコードを追っているだけですよ.

          普段,疑問に思わない興味深いご質問ありがとうございました.

  14. 質問です。

    ODEの練習に、よくみかける「積み上げられたボックスに、物体を衝突させる」シミュレーションをしようとしています。

    ボックスは5✕5✕5で125個配置しています。
    これに初速度を持ったボックスをぶつけるのですが、
    ぶつかった瞬間から、描画が非常に重くなってしまいます。
    体感ですが通常時の1/10以下の速度になっている感じです。

    何か考えられる原因はありますでしょうか?

    似たようなことをやっているODEのデモdemo_crash.exeの動作速度は
    問題ありませんので、PCのスペックはネックになっていないと思います。

    • dWorldQuickStepを使うことで解決しました。

      しかしdWorldStepのときと、処理速度が違うだけでなく、挙動も全く異なることが
      少し疑問でした。(dWorldStepの場合は、ものすごい力でボックスが吹っ飛んでいく)

      **

      http://demura.net/tutorials/ode3内で、
      void dWorldSetQuickStepNumIteration(dWorldID, int num);
      にsがつけ忘れているのを見つけたのでご連絡します。

      • Kさん,

        ボディの数が多くなり,接触点数が増えるとるとdWorldStepは極端に遅くなります.接触点数をnとすると計算量はnの3乗(O(n^3))です.一方,dWorldQuickStepの計算量は繰り返し数をkとすると計算量はO(nk)なので,比例するだけです.ただし,dWorldStepの方が計算精度は高いので用途に応じて使い分けてください.

        なお,dWorldSetQuickStepNumIterationsは訂正しました.

        ありがとうございました.

  15. 簡単!実践!ロボットシミュレーションのstep8にて紹介されている4脚歩行ロボットについて質問です。
    ロボットの肩部分の回転軸が直交していますが、この直交部分の順序を入れ替え(s1とs2の入れ替え)ると運動学が計算しやすそうです。
    よって入れ替えをしたいのですが、入れ替えてシミュレーションを行っても入れ替え前と同様の結果は得られるでしょうか?回答よろしくお願いします。

    • あわぁさん,

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

      入れ替えて比較したことがないので同じ結果になるかわかりません.
      なお,4脚ロボットのサンプルプログラムの実装はユニバーサルジョイントではなく,
      ヒンジジョイント2個を微小なリンクで結合しているので,
      1点で交わっているわけではありません.

      比較して結果を教えて頂ければ大変ありがたいです.

      でむ

      • 補足です.ご存知だと思いますが,ODE本の運動学の式を変更したら,逆運動学の式も変更する必要があります.サンプルプログラムそのままでは動かないので,運動学,逆運動学に関するコードを変更してください.練習問題に良いかもしれませんね.コメントありがとうございました.

        でむ

  16. ある物体をHingeJointで繋ぐとエラーがでないんですが,
    UniversalJointで繋ぐとODE Message 2 zero length vectorと出てしまうのですが,解決策はないでしょうか?

    よろしくお願いします.

  17. xファイルを表示するための質問です.

    メタセコイアで作成したポリゴンをxファイルで表示することはできるのですが,google sketchupからdxfファイルにエクスポートしてメタセコイアからxファイルに変換すると表示できません.

    解決策があれば教えてください.

    • haraさん

      コメントありがとうございます。
      すみませんが、ご質問がODEとは無関係なので回答できません。

      でむ

      • ありがとうございます.
        それでは質問を変えます.

        3Dモデリングソフトで作成したデータを読み込みたいのですが,ODEで読み込むことができる拡張子の種類を教えていただけませんか.

        • haraさん

          ODEは物理計算エンジンのみです。テスト用に3Dグラフィクスライブラリdrawstuffが附属していますが、3Dモデルを読み込む機能はありません。

          でむ

  18. 衝突検出についての質問です。

    物体と物体の衝突を検出するときに、全く触っていない2つの物体が衝突していると判断されることがありました。そこで、その2つがnearcallbackの引数になった時は関数を抜けるようにしたら衝突検出自体がされなくなりました。おそらく常に触っていることになっているようです。私の探し方が悪いのか解決策が見つかりませんでした。解決策がありましたら教えていただきたく思います。

    ちなみに物体というのは、四角い柱のてっぺんに上下にスイングするスロープがついたもので、2つの円柱で作った電動シリンダ(的なもの)でスロープの傾きを調節しています。

    シリンダの両端はそれぞれ柱の側面とスロープの下面にヒンジで付けられています。

    衝突検出されるのはスロープとシリンダの柱側の円柱で、初期位置でもシリンダを伸縮させても全く触れないのですが、初期位置でかなりめり込んでいるように判断されスロープがプログラム開始と同時に強制的に持ち上げられます。

    いろいろ触ってみたのですが解決の兆しが見えないので解決策があれば教えてください。
    長々と申し訳ありません。

    • すみません。解決しました。超ウルトラ凡ミスでした。

      スロープのジオメトリの寸法を打ち間違っていただけでした。

      長々と書いてしまい申し訳ありませんでした。

Comments are closed.