ODE質問・要望募集3!

コメント数が70を超えたので、新しいご質問等はODE質問・要望4に願いします!

コメント

  1. でむ より:

    黒い人さん、

    はじめまして、コメントありがとうございます。
    ラグランジェ法の一種を使っています。詳細は「よくある質問 B.16」に書きましたのでご覧ください。

    でむ

  2. 黒い人 より:

    ODE 本体が微積分を計算している方法が、何か教えてください。ニュートン法やオイラー法などの名前が判るだけでも大変助かります。

  3. でむ より:

    大和さん、

    お力になれずすみません。
    もし、よかったら解決方法を投稿して頂ければ、同じような問題に悩んでいる方の参考になると思います。

  4. ド初心者 より:

    >>ODE FAQのA.11に回答しました。
    わかりづらい箇所があれば教えてください。

    でむさん、非常にわかりやすい説明ありがとうございました!!
    大変助かります!!

  5. 大和 より:

    回答ありがとうございます
    いろいろと自分でいじってたらなんとかうまく行きました(^^;

  6. でむ より:

    ド初心者さん、

    ODE FAQのA.11に回答しました。
    わかりづらい箇所があれば教えてください。

    でむ

  7. ド初心者 より:

    >>ご質問の意味を取り違えているかもしれないので確認させてください。
    自分自身で作成する方法というのは、コンパイラー、エディターの使い方などの開発環境に関することでしょうか?

    より具体的に聞いてください。

    質問がわかりにくくて申し訳ございません。

    先ほどの蛇ロボットの話を例にすると、
    「snakeroboというフォルダをどこどこに作って、そこに自分で作成したソースコードsnakerobo.cppファイルをいれます。
    そして、どうコンパイルし、どう実行させます。」
    っといった具合です。
    わかりにくいですね・・・。(^^;)
    もう少しこういった知識があればうまく説明できるのですが。

    要はでむさんの言う通り開発環境に関する内容だと思います。

  8. でむ より:

    ド初心者様

    ご質問の意味を取り違えているかもしれないので確認させてください。
    自分自身で作成する方法というのは、コンパイラー、エディターの使い方などの開発環境に関することでしょうか?

    より具体的に聞いてください。

    でむ

  9. ド初心者 より:

    でむさん、ご解答ありがとうございます。

    >>さて、ご自分で新しくプログラムを作成される場合、よくわからないうちはサンプルプログラムをベースに作成される方が効率てきです。

    はい、確かにそれが一番手っ取り早い方法だと思います。
    しかし、これから自分自身でも自作のプログラムをいろいろ作成していきたいと考えていますので、お手数ですが教えていただけないでしょうか。申し訳ございません。

    >>なお、プチプロジェクトの解答例(プログラム)を公開する予定はありません。基本的な考え方やサンプルプログラムを本文中で説明しているので、それを元に自分で考えてプログラミングすることにより、プログラミングスキルの向上を図ることがプチプロジェクトの目的です。正解は1つではないので、解答例を掲載することは読者の自由な発想やコーディングを妨げることに成りかねないと考えています。

    そうゆうことでしたか、理解いたしました。

  10. でむ より:

    ド初心者さん、

    拙著を購入頂きありがとうございます。
    この本は初心者を対象に書いたものなので、わからない箇所があれば質問をお願いします。

    さて、ご自分で新しくプログラムを作成される場合、よくわからないうちはサンプルプログラムをベースに作成される方が効率てきです。例えば、蛇ロボットを作る場合は、P24 プログラム1.3 monoBot.cppの1本脚に、円柱をヒンジジョイントで結合していけば比較的簡単に作ることができると思います。

    なお、プチプロジェクトの解答例(プログラム)を公開する予定はありません。基本的な考え方やサンプルプログラムを本文中で説明しているので、それを元に自分で考えてプログラミングすることにより、プログラミングスキルの向上を図ることがプチプロジェクトの目的です。正解は1つではないので、解答例を掲載することは読者の自由な発想やコーディングを妨げることに成りかねないと考えています。

    でむ

  11. でむ より:

    大和さん、

    Microsoftの開発環境を使ったことがないので、私にはわかりません。ごめんなさい。

    どなたか、ご親切な方が回答してくだされば良いのですが...

    でむ

  12. ド初心者 より:

    こんにちわ、ド初心者と申します。
    本を購入しロボットシミュレーションの学習をしております。

    今現在、P27まで学習しました。そこでいくつかわからないことがあったので質問してもよろしいでしょうか。

    1.6のプチプロジェクトを取り組んでいるのですが、今まではこちらのサイトからプログラムをダウンロードしコンパイルして実行していたのですが、まったく新しいプログラム(プチプロ1.1蛇ロボット)を立ち上げるにはどうしたらよろしいでしょうか。

    また、プチプロの解答など載せていただけませんでしょうか。(すごい気になって先に進めません苦笑)

    本当に素人で申し訳ございません

  13. 大和 より:

    初めまして 大和といいます。
    ロボットシュミレーションの本を参考にODEにチャレンジしているのですが
    コンパイルは成功するのに実行すると以下のようなエラーで実行がうまくいきません。

    アセンブリ ‘odetest, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null’ から型 ‘dxWorld’ を読み込めません。

    もしかして ODEのインストール自体がうまくいっていないんでしょうか?
    開発環境はVisual Studio.Net 2003 を使っています。

    よろしくお願いします。

  14. Began より:

    でむさん
    早速のご回答ありがとうございます。

    解決しました。
    ODEのサンプルに似たような例があるのを見落としていました。

    「ある一定以上の力が加わったときに、固定ジョイントを無効化する」
    のを実現するため、dJointDestroyを使って失敗していましたが、
    dJointAttach(Joint, 0, 0)とすることで、ジョイントを無効化することができました。
    もう一度dJointAttach(Joint, body1,body2 )を使うことで、無効化したジョイントを復活させることもできました。

    今回ジオメトリのクラスは用いませんでしたが、便利そうなので使ってみようと思っています。

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

  15. でむ より:

    Beganさん、

    はじめまして。

    さて、2つのボディを1つの複合ボディとし扱う方法は、http://www.ode.org/ode-latest-userguide.html
    の10.7.7 Geometry Transform Classを使います。

    正確には2つのボディを1つの複合ボディではなく、2つのジオメトリを1つのジオメトリとして扱います。でも、形状を維持しますのでバラバラにはなりません。ODEに付属しているテストプログラムtest_boxstack.cppのソースコードを読むと使い方がわかります。ODE本では複雑になり難しくなるので説明していません。

    Beganさんのようなアプリケーションを作ったことがないので試したはありませんが、fixedジョイントでできるような気がします。ERPやCFMの値を変更するとエラーが消えるのではないかと思います。それでいろいろ試してからTransform Classを試してみると時間の節約になるかもしれません。

  16. Began より:

    はじめまして。
    ODE本を使ってシミュレーションの勉強をしています。
    とても参考になり、シミュレーションの製作がさくさく進みます。
    ありがとうございます。

    質問です。
    p90に
    「2つのボディを固定する必要がある場合は、それを1つの複合ボディとする方法が良い」
    という記述があります。
    ODE本では触れられていないのですが、具体的にはどのような関数を使えば良いのでしょうか。

    実現したい機能は、はじめは固定されていた2物体が、ある一定以上の力が加わるとバラバラになる、というものです。
    dBodyDisableなどを組み合わせれば模擬的に実現できそうですが、
    今後の拡張性を考えて、2つのボディを固定する方法を勉強したいと考えています。

    以下のようなことを試しましたが、うまくいきませんでした。
    固定ジョイントを作っておいて、ある一定以上の力でdJointDestroyでジョイントを破壊する。
    しかし実行すると、dJointDestroyのところで、
    「問題が発生したため、–.exeを終了します。ご不便をおかけして申し訳ありません。」
    とエラーが起きて終了されてしまいました。
    そこで固定ジョイント以外での方法で作ってみようと考えた次第です。

    どのような関数を使えばよいかさえわかれば、あとは自分で検索もできると思いますので、
    簡単でよいのでご解説いただけないでしょうか。
    よろしくお願いします。

  17. でむ より:

    Jagurさん、

    はじめまして

    さて、単振動や楕円振動を実現するAPIはありませんので、自分で作るしかありませんね。

    直線上に運動が拘束される振動の場合は、スライダージョイントを使えると思います。変位量に応じて、必要な周期や振幅になるように剛体に力を加えれば実現できるのではないでしょうか。

  18. jagur より:

    はじめまして
    最近ODEを使い始め、
    ロボットシュミレーションの本も購入し
    このサイトもよく参考にさせていただいております。

    そこで質問なのですが
    物体をその場で振動させるにはどのようにすればよいのでしょうか?
    実現したい振動としては
    1.直線的な振動
    2.楕円振動
    等で、つまりその場で一定の動きをし続けるようなものです。
    振動数や、振幅のパラメーターを持てるといいのですが。
    その様な関数があるとよいのですが。
    サンプルプログラム等がありましたら幸いです。

    よろしくお願いいたします。

  19. でむ より:

    ODE2joyさん,

    大きなポリゴンをODEで扱ったことがないのでわかりません.本家のメーリングリストでお聞きになられれば良いとかと思います.

  20. Tak より:

    Demuraさま

    丁寧な解説ありがとうございました。
    また何かありましたらよろしくお願いします。

  21. ode2joy より:

    ODEの接触解析機能に興味があって、ODE0.8に含まれていたサンプルプログラム(test_moving_trimesh.cpp)のを触ってみたのですが、巨大なtrimeshを表示しようと、下記変数を大きめにとるとプログラムのレスポンスが悪くなります。
    static float Vertices[NUM_VERTEX*3];
    static int Indices[NUM_POLYGON][3];

    20万ポリゴンvs20万ポリゴンの接触をやりたいのですが、難しそうでしょうか。

  22. でむ より:

    Takさん、

    dWorldSetERP()およびdWorldSetCFM()を変更するとシミュレーション中の全ジョイントに効いてきます。nearCallback()の中の contact[i].surface.soft_erpおよびcontact[i].surface.soft_cfmを変更すると接触ジョイントだけに効いてきます。Takさんの場合は、後者を変更すれば良いと思われます。

    なお、倍精度でODEをインストールした場合CFMのデフォルト値が1e-10なので、CFMを設定しないとその値になります。CFM=1/(h Kp + kd)、ここでhはステップサイズ、kpはバネ定数、kdはダンパ定数なのでhが十分小さい場合、CFMはダンパ定数の逆数になります。つまり、CFMを小さくすることはダンパ定数が大きくなるので、振動を抑えることができたと考えられます。

    また、ERPとCFMの値を変更しても計算時間にはさほど影響を与えません。一般的には、CFMを大きくするとシミュレータの安定性が向上します。ODEの内部エラーが出るときはその値を大きくすると回避できる場合があります。

  23. tak より:

    demuraさま

    takです。出張中にわざわざありがとうございます。
    指摘の通り以下を順に試してみました。

    1. Stepsizeを小さくする。
     Stepsizeを0.005 -> 0.001へ変更してみたのですが、進行速度が1/5になった分、滑りのスピードも1/5になったという印象でしたので、元に戻しました。

    2. ERPの値を小さくする。
     0.8 -> 0.2あたりまで小さくしてみましたが変化ありませんでした。

    3. CFMの値を大きくする。
     「小さくする」と読み違えて10e-4 -> 10e^-10としてみた所、滑り現象が解決しました。

    2と3ですが、グローバルな値の方(dWorldSetERP()およびdWorldSetCFM())を変更したのですが、これはnearCallback()の中のcontact[i].surface.soft_erpおよびcontact[i].surface.soft_cfmを変更するのとどう違うのでしょうか?私の解釈では、基本はグローバルの値に従うが、特定のオブジェクト同士のときのみ変更したいときに後者を用いて個別に与えると思っていたのですが間違いなのでしょうか?

    別の話になりますが、1は小さくすればシミュレーションの負担が大きくなりますが、2、3の値はシミュレーションの負荷に大きく影響してくるのでしょうか?

  24. でむ より:

    Takさん、

    現在、札幌出張中です。本場のジンギスカンはおいしいです。

    さて、ODEでは各ステップで衝突検出の計算をし、接触ジョイントの位置を修正しているので、Stepsizeの大きさやERPの値により微小振動するケースがあります。Stepsizeが大きいと物体が地面にめり込み、ERPが大きいとその修正量が大きいの振動が大きくなります。以下を順番に試してみてください。

    1. Stepsizeを小さくする。
    2. ERPの値を小さくする。
    3. CFMの値を大きくする。

    なお、ERPとCFMでバネ・ダンパシステムをシミュレーションできます。詳しくはODE本をご覧ください。

    上記で症状が改善しない場合は以下のAPIを利用してください。
    void dWorldSetContactMaxCorrectingVel (dWorldID, dReal vel);
    void dWorldSetContactSurfaceLayer (dWorldID, dReal depth);

    症状が改善したら、どのパラメータをどう変えたらうまくいったか連絡頂ければありがたいです。

  25. tak より:

    takと申します。以前、Macへのインストール方法でお世話になった者です。

    今までほとんど描画させずにシミュレーションを行っておりまして、最近確認のために描画させてみて気づいたのですが、何の力も働いていない地面に静止している物体が微妙に滑って動いているようなのです。摩擦係数をInfinityにしても症状は変わりませんでした。何か設定しなければいけないのでしょうか?
    あるいは地面と固定するための設定方法みたいなものがあるのでしょうか?
    よろしくお願いします。

  26. でむ より:

    Mommaさん,

    よくある質問の「A.6 Visual C++ Express Editionでインストールする方法を教えてください.」にリンクをはりました.

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

  27. Momma より:

    Demuraさま

    コメントありがとうございます!
    ご指摘の箇所、変更しました。
    また、環境構築についてもトピックに掲載してますので、宜しかったらリンクを張っていただければと思います。

  28. でむ より:

    Mommaさま,

    拝見しました.面白そうですね.お盆の中を迷路にして右手法で解けば自動的に出口に行けそうです.

    Visual C++をお使いとのことなので,環境設定などを書いて頂ければ私のFAQからリンクをはります.多くの方の参考になると思います.私はVisual C++は使ったことがないのでわかりません.

    また,リンクをはって頂きありがとうございました.demura.netは個人的なサイトなので出村教授ではなく「出村さん」または「でむさん」ぐらいにして頂けるとありがたいです.

  29. Momma より:

    Demuraさま

    公開許可ありがとうございます。
    ODEに関しては手探りの状態で、ODE本を片手に1つ作成できたところです。
    お盆の中身を迷路にしても面白いかなと思っています。

    拙のWebはURL欄に記載致しました。
    ソースは解説を含めて徐々に記載していく予定です。
    開発はVisual C++ 2005 EEとUbuntuで行なっていますので、備忘録を兼ねて環境構築を掲載しています。

  30. でむ より:

    Mommaさん,

    是非ソースコードを公開してください.楽しみにしています.
    URLを教えてください.

    また,demura.netへリンクをはって頂けるとありがたいです.ODEを盛り上げていきましょう.

    では

  31. でむ より:

    Lynさん

    お役に立てて良かったです.
    今後ともよろしくお願いします.

  32. Momma より:

    はじめまして。
    ODE本を参考に楽しませて頂いています。
    AMotorのソースを元に、衝突判定等を追加して、上にお盆を載せて玉をゴロゴロ転がす遊びのシミュレーションを作ったのですが、改変したソースの公開をしても宜しいでしょうか。ソースのコメントやWebでの解説に転用の旨を記載する予定です。

  33. Lyn より:

    Demura さん、
    適切なご回答ありがとうございました。
    教えていただいたテキストエディタによりhello.cppの重力サインを変更し上書き保存したところ
    upwardにボールが落下(?) 出来ました。
    再現性を確認するためNOTEPADで再度コンパイルしたところ再現しましたので参考までに
    エラーメッセージを書いておきます。
    $ make
    g++ -Wall -fno-exceptions -fno-rtti -g -DWIN32 -c hello.cpp -L../../drawstuff/src -L../../ode/src -L/usr/local/lib -I. -I../../include -I/usr/include
    hello.cpp:1: error: stray ‘\239’ in program
    hello.cpp:1: error: stray ‘\187’ in program
    hello.cpp:1: error: stray ‘\191’ in program
    make: *** [hello.o] Error 1

    ありがとうございました!
    これから最適軌道計画のプログラムを作るのですが、長い道のりになりそうです。

  34. でむ より:

    Lynさん,

    エラーメッセージを教えてください.
    全角の空白文字が入ったかもしれません.全角文字が入るとコンパイルに失敗します.

    notepadではなく,もう少し高い機能のエディターをお使いになることをお勧めします.
    私の授業ではフリーソフトTeraPad (http://www5f.biglobe.ne.jp/~t-susumu/library/tpad.html) を使っています.

    TeraPadをお使いになられる場合は,表示(V)→オプション→表示で全角空白にチェックをいれ,全角文字を全て表示するよう設定してください.

  35. Lyn より:

    demuraさん

    初歩質問で恐縮なのですが、サンプルでダウンロードしたhello.cpp file
    のコンパイル・実行は可能なのですが、重力加速度をnotepadを使用し
    変更後(ex1.3)、Makeコマンドでコンパイルが出来ません。
    これはフリーソフトによる制限なのでしょうか?

  36. でむ より:

    Kogasakさん、

    おめでとうございます。

    Windows XP + MinGW + MSys環境では多くの実績があり、今まで授業で50名程度の学生がインストールしてきましたが問題はほとんどありませんでした。そのため、不具合を報告されるとお手上げ状態になります。

    何らかの理由でシステムが正常にインストールされていなかった、環境変数が他のソフトウェアとぶつかっている、あるいはウイルスに感染しているなどが考えられますが、原因がはっきりしません。その場合、kogasakさんのようにシステムリカバリするしか他に手段はありません。それが一番時間を節約する方法なのかもしれません。

    また、何か問題があればコメントをください。

  37. kogasak より:

    ご丁寧なご指導ありがとうございました。
    その後、一週間をかけて、パソコンユーザカウント新設定、システムリカバリ、常駐プログラム停止、Lhaplusの設定変更等考えられる手を次々に打ってみました。
    (ご参考に、使用システムは、Microsoft Windows XP, Home Edition V. 2002、Service Pack 2です。)
    その結果、一部手順書と異なる応答があるものの、一応作動するようになりました。
    何が原因でインストールできるようになったのか、多くのことをやりすぎてよくわからないのが残念です。
    いずれにせよここまでこれたのは、御助言に励まされたことによるものと感謝しております。
    今後とも、よろしくお願いいたします。
    kogasak

  38. でむ より:

    でむです.

    Kogasakさんから以下のコメントを頂きました.
    拙著をご購入頂きありがとうございます.

    さて,ODE講座2ではなく,以下のURLの手順でインストールをして頂けますか?
    授業の際,25名程度でインストールしたときは問題なくできました.
    http://demura.net/archives/9ode/odewindows-1.html

    そのとき,mingwとmsysのバージョンは指示のとおりしてください.新しいバージョンですと動かない場合がありました.

    また,cygwinの環境と混在していないでしょうか?

    ちなみに私の環境は以下のとおりです.
    Windows XP Professional SP2
    MinGW 5.1.0
    MSYS 1.0.10

    ご面倒でも今一度,上のURLのとおり作業をし,cygwinの環境と混在している場合は一時的にc:\cygwinの名前をc:\cygwin1などとし,参考までに環境を教えてください.

    よろしくお願いします.

    ODEの入り口でつまずいています。
    出村先生の’ロボットシュミュレーション’を購入し、ODE二挑戦しようとしていますが、この10日ほどMinGW開発環境をインストールしようとあらゆる考えられる手を尽くしていますが歯が立ちません。
    OSは、WindowsXPです。
    ODE講座2に示されている手順を忠実たどってインストール作業をしていますが、makeの段階で毎回ストップします。
    ストップのたびにプログラムの削除および必要ファイルの再ダウンロードからやり直していますが、毎回makeの段階でつぎのいずれかのコメントがでます。
     *** No rule to make target ‘../configure in’ needed by ‘Makefile.in’. Stop
    *** No targets specified and no makefile found. Stop

    ode-src-0.8.zip の解凍はLhaplusの設定をサブフォルダまで解凍するようにし、またウイルスソフトも停止状態にしたりしてインストールをトライしていますが前進しません。
    以上ですが、解決法をご指導いただけませんでしょうか。     kogasak

  39. でむ より:

    Partizansさん,

    返事が大変遅くなりごめんなさい.ロボカップ,学会,ODE本のソースコード編集作業といろいろありました.

    先週,講義でこのウェブサイトに書いてあるとおりに学生にやってもらいましたが,約30名とも問題なくインストールできました.MinGW,MSYSが何らかの理由でうまくインストールされなかったと思われますが,全て削除し,再起動してから再度インストールしても状態が変わらないようなら違う理由も考えれられます.

    これ以上はよくわかりません.解決されていればよいのですが.

  40. でむ より:

    Partizansさん、

    解決できるかできるかどうかわかりませんが、よろしくお願いします。講義でも使っていますが、このような症状は初めてです。

    さて、私にはmingwになんらかの問題があると思われます。私の環境は、Partizansさんと全く同じですから。

    お手数ですが以下を試して頂けますか?
    1. 簡単なC言語のプログラムをmingw+msys環境でコンパイルできるか?
    2./bin/shはあるか?
    2.ode-0.8/config.logを送ってください。
    3.思い切って、mingwとmsysを完全に削除し、また入れ直す。Cドライブの直下をお勧めします。

    御返事を頂いても、ロボカップジャパンオープン直前で、てんてこ舞なので回答が遅れるかもしれません。ごめんなさい。

  41. partizans より:

    お世話になります、Partizansです。
    私はロボットのロの字も知らないし、仕事ともまったく関係ないですが、
    C言語でプログラミング出来るロボットがあるのを知り、それを検索していたところODEというのがひっかかりました。というか、貴サイトが見つかった訳です^^。ODEだけではなく、MinGW+Msysさえ初耳です、、、--;
    ですので、一連の作業は、貴サイトのODEのインストール方法を参照しました。
    以下の手順です。
    1.MinGWのインストール
     ①場所:D:/MinGW
     ②Version:5.1.3
    2.Msysのインストール
     ①場所:D:/msys
     ②Version:1.0
    ここまでは正常にインストールされたと思います(Msysが正常に動いたので)。最初は、Cドライブの直下ではないとまずいと思ったのですが、上記の2つをCドライブの直下にインストールしても同じでした。
    3.ODE-0.8 のインストール
     ①ODE-src-0.8のダウンロード
     ②+Lhacaで解凍後、生成されたODE-0.8をフォルダごと、
      D:\msys\1.0\home\ユーザ名\src\にコピー
     以下msysで実行…
     ③$cd src(return) ⇒$cd ODE-0.8(return),でODE-0.8フォルダに移動
     ④$./configure –enable-double-precision(return)
      とすると、訳の分からないメッセージがいっぱい出てくる.
    ここでやたらに気になるのは、
      configure : error : can not run /bin/sh ./config.sub
    というメッセージです。
     ⑤プロンプトに戻ったら、$make(return) を実施しましたが、結果はご存知の通りです。
    ご質問の1ですが、ODE-0.7も試したほどですから、ダウンロードの不十分さはないと思います。解凍に関しては再度試してみました。
    ご質問の2ですが、上記の手順通りやりましたので問題ないはずですよね?
    OSは、Windows XP professionalです。
    お忙しいところ申し訳ありませんが、ご返事頂けれと思います。
    よろしくお願いします。

  42. でむ より:

    partizansさん、

    はじめまして。何がきっかけでODEを知られたのですか?
    オープンソースですし、お手軽に使えるので、覚えると重宝すると思います。

    さて、Windowのバージョンと実際に実行したコマンドを詳しく教えてください。

    また、エラーをみるとmakefileがないようですね。

    1. ODEソースファイルの解凍に失敗、または完全にしていない。または、ダウンロードそのものが不完全。
      ダウンロードを再度し、解凍が完全にされているか確認をお願いします。
    2.makeコマンドを入力するディレクトリが違う。
      ode-0.8のすぐ下で実行しましたか?

    はずじているかもしれませんが、上の2点が考えられるので確かめてください。

  43. partizans より:

    こんにちは、
    先週ODEというものを知ったばかりです、、、(--;)
    興味がわいてインストールしようとしてるんですが、うまくいってません。
    WindowsのMinGW+MsysのインストールまではOK。
    ODE0.8のConfigurationからうまくいってないようで、
    makeしようとすると、
    No targets specified and no makefile fonund.Stop
    というエラーが出ます。
    どうすればいいでしょうか?

  44. saga より:

    でむさん,

    とても丁寧な回答ありがとうございます.

    質問1ですが,回答どおりにボディを設定することによって,
    解決することができました.
    質問2ですが,振動を回避するように摩擦を入れるなどの処理をやってみます.

    ODE本が出版されるのを待ち望んでいます.
    大変だと思いますが,頑張ってください.

  45. でむ より:

    sagaさん,

    「ODEよくある質問」が参考になるという意見,ありがとうございます.作った甲斐があったというものです.授業でODEを教えているので初心者の質問はとても貴重です.遠慮なく聞いてください.

    さて,ご質問に回答します.
    1.ODEのジョイント(関節)は単なる制約なので物理的な実体はありませんので,質量を設定するAPIはありません.ただし,ジョイントのある位置(アンカー)にボディ(剛体)を作り,そのボディは隣接したボディと接触判定をしないというようにコーディングすれば目的は達成できると思います.この程度の回答で解決できますか? 不十分な場合は校正が終わったら記事を書きましょう.

    2.トルク制御のサンプルプログラムを掲載しようとしていましたが,本の校正が大詰めを迎えているのでサボっています.ODE講座16のサンプルプログラムの以下の部分の下から3,4行目にある,dJointSetHingeParam(joint[j], dParamVel, k1*z); // 角速度の設定
    dJointSetHingeParam(joint[j], dParamFMax, fMax); // 最大トルクの設定
    の2行を消して,代わりに以下の行を挿入してください.なお,必要なトルクの値はご自分で設定してください.
    dJointAddHingeTorque(joint[j], 必要なトルクの値);

    // P制御
    void control() {
    static int step = 0; // シミュレーションのステップ数
    double k1 = 10.0, fMax = 100.0; // k1:比例ゲイン, fMax:最大トルク[Nm]
    printf(“\r%6d:”,step++);
    for (int j = 1; j < NUM; j++) {
    double tmpAngle = dJointGetHingeAngle(joint[j]); // 現在の関節角[rad]
    double z = THETA[j] – tmpAngle; // z: 残差=目標関節角-現在関節角
    dJointSetHingeParam(joint[j], dParamVel, k1*z); // 角速度の設定
    dJointSetHingeParam(joint[j], dParamFMax, fMax); // 最大トルクの設定
    }
    }

    ただし,これだけでは振動しますので,回避するためには関節に摩擦を入れるなどの処理が必要です.校正作業が終わったらアップしますね.

  46. saga より:

    はじめまして。sagaと申します。
    最近ODEをはじめました。
    このサイトを参考にさせてもらっています(特に「ODEよくある質問」は参考になります)。

    以下の2つの質問があります。
    ・ジョイントに質量を設定したいのですが、どうやったらできるのでしょうか。
    ・トルク制御をしたいと思っています。dJointAddHingeTorque()を使うということですが、
    プログラム例があれば教えてもらえないでしょうか。

    よろしくお願いします。

  47. でむ より:

    ゆうさん,

    解決おめでとうございます.
    Gimpactは単精度でないとインストールできないので,まだ試していません.シミュレーションをやられる場合は,精度の高い倍精度でインストールことをお勧めします.

    また,メーリングリストによると衝突検出計算に関してはBulletのライブラリと統合する話もでてきており,今後大きく変わるところだと思います.

    また,何かあったら投稿してください.

  48. ゆう より:

    こんにちは。
    固定ジョイントにした所、無事動きました!
    最初GIMPACTを使っていたのですが、すぐに離れてしまったりして、処理系によって違うのでなかなか難しいですね。

    ありがとうございました。
    これからもODE講座頑張ってください!

  49. でむ より:

    地面と同様にnearCallBack関数を作成しても,くっつかないと思います.
    そこでは接触ジョイントを使っていますから.

    以下はどうでしょうか?

    ただし,これは地面が鳥もち状態です.バットにくっつけたいならgroundをバットのジオメトリIDに変更してください.

    試したら結果を教えてくださいね.

    static void nearCallback(void *data, dGeomID o1, dGeomID o2)
    {
    const int N = 10;
    dContact contact[N];

    int isGround = ((ground == o1) || (ground == o2));

    int n = dCollide(o1,o2,N,&contact[0].geom,sizeof(dContact));
    if (isGround) {
    for (int i = 0; i < n; i++) {
    contact[i].surface.mode = dContactBounce|dContactSoftERP|dContactSoftCFM;
    contact[i].surface.bounce = 1.0; // (0.0~1.0)
    contact[i].surface.bounce_vel = 0.0;
    contact[i].surface.soft_erp = 1.0;
    contact[i].surface.soft_cfm = 0.0;
    //dJointID c = dJointCreateContact(world,contactgroup,&contact[i]);
    // dJointAttach (c,dGeomGetBody(contact[i].geom.g1),
       // dGeomGetBody(contact[i].geom.g2));
    fixed[i] = dJointCreateFixed(world,contactgroup);
    dJointAttach (fixed[i],dGeomGetBody(contact[i].geom.g1),
    dGeomGetBody(contact[i].geom.g2));
    dJointSetFixed(fixed[i]);
    }
    }
    }

  50. ゆう より:

    こんばんは。
    ご回答ありがとうございました。
    ボールがバットにくっつくというのは、でむさんがおっしゃるように
    両者をfixedジョイントか何かで完全に結合させるという意味です。
    地面と同じようにやっているつもりなのですが。
    よろしくお願いします。

タイトルとURLをコピーしました