ODE質問・要望募集5!

まず,ここにあるODEのFAQを読んでからコメントお願いします.

ODE質問・要望5!のコメントが100件になりましたので,新しい質問や要望はODE質問・要望6!にお願いします!

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

100 Comments
  1. でむさん

    ご回答ありがとうございます。
    言葉が足りなくてすいません。キーボードからの操作はできているのですが、加速度センサーなどを使ってPCの外部からも操作出来るんですか?

  2. おでさん,

    初めまして.

    demura.netへようこそ.

    さて,ご質問の外部入力とは,キーボードの操作ですか? それなら,ODE講座14とODE本の40ページに説明があります.

    でむ

  3. 始めまして。
    最近ODEをつかっているのですが、ODEは外部から入力して操作させることは可能なのでしょうか?

  4. ご回答ありがとうございます。
    今年の卒業研究でODEを初めて使うことになり、毎日悩みながらパソコンに向かってます・・・。笑

    まだまだ初心者でわからないこともいっぱいあるので、またお世話になることもあるかもしれません。そのときはまたよろしくお願い致しますm(ーー)m

  5. グディさん,

    はじめまして.

    思いもよらぬご質問ありがとうございます.ODE本にはその辺の記述がわかりづらいようですね. ODE本20ページの第1パラグラフに記述があります.

    15ページのプログラム1.2のnearCallback関数では,33行目のif (isGround)文が,地面の衝突だけを考慮する要因になっているので,このif文を削除すればOKです.

    ODE講座6にもその説明を補足します.

    初心者に超わかりやすいブログと教科書を目指しているので,とても参考になるコメントでした. ありがとうございました.

    でむ

  6. 衝突検出に関して質問です。
    地面との衝突だけではなく、物体同士の衝突を検出したいのですが・・・。
    よろしければ物体同士の衝突に関するプログラムを教えてくださいm(_ _)m

  7. でむさん

    ありがとうございました。
    dJointGetHingeAngle (JointID)があるなら dJointSetHingeAngle (JointID)
    があれば便利なのにないようですね。。。

  8. mif805さん,

    お久しぶりですね.

    ODEでは,ジョイントは拘束なので姿勢はありません.ジョイントで結合されている2リンクの角度を知りたい場合は,dJointGetHingeAngle()などのAPIを使います.

    ご質問の回答になっているでしょうか?

    でむ

  9. でむさん、こんにちわ。

    Jointについて質問したいのですが、Jointにも
    dBodyGetRotationのような姿勢を取得する関数はありますか?
    ない場合はどのようにして取得したらよいのでしょうか?

    ご回答よろしくお願いいたします。

  10. がきーさん,

    ジョイントの初期角度は,ジョイントを生成した時が0[rad]になります.
    例えば,2つのリンクの成す角度π/4を初期角度としたい場合は,片方のリンクをπ/4回転させた後で,ジョイントで2つのリンクを結合します.

    この程度の回答でよろしいですか?

    でむ

  11. 出村さま
    いつも御世話になっておりますm(–)m
    今回の質問は、Jointに関することです。
    ジョイントの角度の初期設定を行いたいとき(例えば
    Hinge Jointをπ/4だけ曲げるとか)、どのように設定すれば良いのでしょうか?
    トルクがかからない状態で初期設定を行い、その状態からシミュレーション
    を始めたいのですが。。。ヒントがあればよろしくお願い致します

  12. takaさん,

    解決して何よりですが,接触した後に重力がかからず上昇する現象を解決するために,接触に関する関数を入れると解決したという理屈がわかりません.

    具体的に接触に関する関数は何で(nearCallback?), もし,dWorldSetGravity()を設定していたとして,何故重力がかからなくなったのでしょうか?

    初学者が間違える箇所は,恐らく多くの方に共通するわかりづらい箇所だと思いますので,詳しく教えて頂ければ有益な情報になると考えます.

    お手数をおかけしますが,お時間があればコメントください.

    でむ

  13. すみません。自分で解決できました。

    球が最初重力を受けて下降するのですが、
    他の物体に衝突した後に、重力がかからずに上昇し続けるという現象が見られました。
    接触関係の関数を書き忘れていたせいのようで、その関数を入れると
    直りました。

  14. ボールが落下して他の物体に当たった後、ずっと上昇を続けてしまいます。
    落ちてこないのですが何が原因なのでしょうか?
    よろしくお願いします。

  15. かつさん,

    ODE本の該当箇所と全く同じ回答です.

    ———————————

    演習問題に関するコメントありがとうございます.
    かつさんのご指摘のとおりの現象が見られますね.

    解決方法は2つあります.

    1.createMonoBot関数の最後に以下を加える.
    dJointSetSliderParam(s_joint, dParamStopERP, 0.2);
    dJointSetSliderParam(s_joint, dParamStopCFM, 1e-5);

    サンプルプログラムではmain関数内でdWorldSetERP(), dWorldSetCFM()でERPを1.0,CFMを0.0にしています.これはWorld内の全てのジョイントに作用します.ERPが1ということは1ステップで関節誤差を修正します.このサンプルプログラムではステップサイズが0.01なので,状況により関節の可動域をリンクが超える場合があります.次のステップで関節誤差を0にするために大きな力がリンクにかかることになり,スーパージャンプしてどこかに飛んでいくことになります.

    今回のサンプルプログラムではスライダージョイントが問題になるので,その可動域の両端で作用するdParamStopERP, dParamStopCFMを上のように設定すればOKです.

    2. ステップサイズを小さくする
    現状のODEでは拘束力の計算以外は1次のオイラー法を使っているため計算精度が高くないので,このような現象が生ずる場合があります. simLoop 関数のdWorldStep()のステップサイズを0.002に変更するとこのような現象が見られなくなりました. 当然ですが,ステップサイズを小さくすると精度は向上しますが,速度は遅くなります.ODEの次期バージョン1.0から4次のルンゲクッタが実装される予定です.そうなると改善するかもしれませんが,当然速度は遅くなるでしょう.

    でむ

  16. ODE本のところにも書いたんですが,こちらの方がふさわしい場所かと思い,再度書き込みさせていただきます.

    EX2.3で質問があります.
    パラメータを変更して試してみると,デフォルトの400Nではちょっとしか跳ねないのに,
    150Nや100Nだと空に吹っ飛ぶくらい飛んでいきます.
    力が小さくなったのに飛んで行ってしまうというのはどうもイメージと合わないのですが,
    何が起こっているのでしょうか?

    ご教授願います.

  17. JPさん,

    初めまして!

    この質問コーナーではODEの技術的な事項に限定させてください.ロボット工学全般ですと広すぎて私の手に負えません.2リンクが尺取虫のモデルとして適切なのか私にはわかりかねます.

    すみませんが,ご質問の内容をODEの技術的な質問内容に変換して再投稿頂けますか? 恐らく摩擦に関連することだと思うのですが…

    でむ

  18. はじめましてJPと申します。
    ODEで2リンクの物体で尺取虫の動きをさせたいと思ったのですが、ヒンジジョイントがその場で開いたり閉じたりするだけで、とうてい尺取虫とは言えない動きをします。
    どうやったら、前に進むような動きが実現できるか教えてもらえないでしょうか。
    よろしくお願いします。

  19. がきーさん,

    はじめまして.

    >ジョイントを用いないで物体の姿勢角度の制限を行うことは
    >できるのでしょうか??

    そのようなAPIはないので自分で作るか,姿勢を常に計測し,制限したい角度より外に出たら,反対側に力を加えて制限角度内に収まるようにすることです.恐らく,ご質問の意図からすると,角度制限を拘束条件としたいということでしょうから,後者では不十分ですね.

    差し支えなければ,より具体的におやりになりたいことを教えて頂けますか?

  20. でむさん
    はじめまして。ODE歴3ヶ月のものです。

    ジョイントを用いないで物体の姿勢角度の制限を行うことは
    できるのでしょうか??

  21. たろーさん,

    C言語のプログラムです.例えば,回転軸のベクトルを(1/sqrt(2), 1/sqrt(2), 0)とします.なお,回転軸ベクトルは単位ベクトルとしてください.dRealはODEの実数型です.

    dReal axis_x = 1/sqrt(2), axis_y=1/sqrt(2), axis_ z=0;
    dReal torque = 10; // [Nm]

    axis_x *= torque; // axis_x = axis * torque
    axis_y *= torque;
    axis_z *= torque;
    dBodyAddTorque(bodyID, axis_x, axis_y, axis_z)

    でむ

  22. でむさん
    初心者の質問でもうしわけないのですが、
    axis_x、torqueなどは、どう定義すればいいか?
    *=が何を意味しているのか?
    わかりません。。。ご回答よろしくお願い致します

  23. 質問途中で切れてしまっていてすいませんでした!

    ERPもCFMもデフォルト値です.

    倍精度でインストールしたと思います!

    ありがとうございます.少しいじってみます!また,おねがいします.

  24. 山口さん,

    解決されましたか?
    もし,解決されたのなら,どのようにしたら解決したかコメント頂ければ,多くの方の参考になると思います.

    よろしくお願いします.

    でむ

  25. でむさん

    ありがとうございます。
    今後もイロイロ解からない事が出てくると思いますので
    そのときはよろしくおねがいします。

  26. たろーさん,

    >ジョイント拘束しない物体に対して,等価回転ベクトル回りにトルクを付加して回>転させたいのですが,可能でしょうか?

    以下では,如何でしょうか?
    等価回転軸ベクトルを(axis_x, axis_y, axis_z)とし,トルクの大きさをtorqueとします.

    axis_x *= torque;
    axis_y *= torque;
    axis_z *= torque;
    dBodyAddTorque(bodyID, axis.x, axis.y, axis.z)

    なお,これはdJointAddHingeTorque(dJointID j, dReal Torque)のコードの一部を改変したものです.
    ode-バージョン番号/ode/src/joint.cppを参考にしてください.

    でむ

  27. 山口さん,

    dNormalize4()はODE0.9では,クオータニオンを正規化するときに使われています.細かくなりますが,dBodySetRotation(),dBodySetQuaternion(), util.cppの中のdxStepBody(), stepfast.cppの中のmoveAndRotateBody()の中で呼び出されています.

    このエラーは何らかの原因で,クオータニオンにNaN(Not a Number)が入ったときなどに生じます.

    まず,dBodySetRotationやdBodySetQuaternionを使っている場合は,引数がおかしくないかチェックし,問題ない場合はクオータニオンの値を表示してみて,デバッグしてみてください.

    ODEを単精度でインストールしている場合は倍精度に変更し,CFMやERPの値を変更すると直るかもしれません.また,摩擦係数MuをdInifinityと有限値を混在させるとエラーが起きたという報告もありました.stepsizeも小さくしてみてください.後は,物体のモデル(ボディ,ジョイントの位置関係,軸の設定など)が正しく設定されているか確認することも大切です.

    でむ

  28. >私はそのような事例を知りません
    やはりできないですよね・・・
    すばやい回答ありがとうございました

  29. 初めまして。

    コンパイルはできたんですが、実行しようとしたら

    this application has requested the runtime to terminate it in an unusual way please contact the applibcation’s support team for more information

    とか

    assertion “bNormalizationResult” failed in _dNormalize4()[../../include/ode/odemath.h]

    とか出てきました。

    変な質問かもしれませんが、初心者なので対処法がわかりません。

    どうすれば実行できるのでしょうか?教えてください。

  30. でむさん
    迅速な回答ありがとうございます.

    >それとも、ジョイントで拘束させずに1つのボディに対して任意軸まわりのトル>クをかけたいという意味でしょうか?

    そうです.ジョイント拘束しない物体に対して,等価回転ベクトル回りにトルクを付加して回転させたいのですが,可能でしょうか?
    アドバイスよろしくお願い致します.

  31. のぶひこさん、

    はじまして。

    私はそのような事例を知りません。

    現状のODEは積分器の一部に一次のオイラー法を利用しているため計算精度が高くないのでそのような用途には向かないと思います。次のバージョンアップでは4次のルンゲクッタも利用可能になる予定です。そうなると、そのようなアプリケーションを開発する意義もでてくるでしょう。

    でむ

  32. 始めまして
    最近ODEを使い始めた者なのですが
    一つお伺いしたいことがあります
    ロボットシミュレーションなどで
    SimulinkとvisualNastran4Dのような構造解析ソフトなどを
    リンクさせているのを行う事例をよく見かけるのですが
    同じようにSIMULINKとODEをリンクさせて
    シミュレーションを行うことは可能なのでしょうか

  33. たろーさん、

    はじめまして。

    多くの場合、ジョイントでボディ(剛体)を拘束し、そのジョイントに対してdJointAddHingeTorque()でトルクをかけます。
    その際、ヒンジジョイントの回転軸を任意軸に設定すればよいと思います。

    それとも、ジョイントで拘束させずに1つのボディに対して任意軸まわりのトルクをかけたいという意味でしょうか?

    でむ

  34. はじめまして.ODEで少しわからないことがあるので質問させて下さい.
    ボディに対して任意軸回りにトルクを加えるにはどうしたらいいのでしょうか?

  35. ballさん、

    ODE FAQ: ODEのよくある質問のB.9をご覧ください。

    ODE内部の数値計算によるエラーです。

    リンク、ジョイントなど初期位置の設定に誤りがない場合は、
    dWorldSetERP, dWorldSetCFM, soft_erp, soft_cfm, mu などのパラメータを調整すると回避できることがあります。
    特に, CFMの値を大きくすると改善する場合が多いです。 ちなみに、現在のCFM, ERPの値はいくつですか?

    また、ODEを倍精度でインストールしていない場合は、倍精度でインストールすることをお勧めします。

    でむ

  36. 小さい質問ですいません・・・

    シミュレーションはできているのですがDrawStuff Messages に

    ODE Message 3: LCP internal error, s

  37. らりほーさん、

    ODE本には回転行列に関するサンプルプログラムがなかったですね。らりほーさんのおかげでODE講座も充実することができました。

    また、コメントください。

    でむ

  38. demuさん、ありがとうございます。
    配列の並びを直したところ解決しました。
    ODE講座25も大変参考になりました。

  39. らりほーさん、

    ODE本お買い上げありがとうございます。

    ズバリ配列の並びが違います。ODEの回転行列配列の並びについてはODE本のP103に記載していますので、そちらを参考にしてください。

    また、ODE講座25:回転行列とRoll-Pitch-Yaw角にも説明並びにサンプルプログラムを掲載しましたので、これも参考願いますね。

    でむ

  40. はじめまして。
    回転行列について質問させてください。

    物体の回転行列からODE本のP150の式6.12-6.14を使って
    ロール、ピッチ、ヨー角を求めたいと思います。
    dBodyGetRotationを使い、

    rot = dBodyGetRotation(base.body);
    r11=*(rot+0);
    r12=*(rot+4);
    r13=*(rot+8);
    r21=*(rot+1);
    r22=*(rot+5);
    r23=*(rot+9);
    r31=*(rot+2);
    r32=*(rot+6);
    r33=*(rot+10);
    p=atan2(-r31, sqrt(r32*r32+r33*r33) );
    y=atan2(r21,r11);
    r=atan2(r32,r33) );

    としてみたのですが、どうもうまくいきません。
    出鱈目な値が出てきてしまいます。
    一応角度が変わると値も変わるのですが…。

    回転行列の配列の順序が間違っているんでしょうかね。
    回転行列はサイズが4×3で、4行目は全て0で
    r11,r21,r31,r41,r12,r22…という順序で配列に格納されるという認識であっていますでしょうか。
    よろしくお願いします。

  41. お返事遅れました。すみません。
    demuさんありがとうございます。
    第1段階で右往左往していたので助かりました。
    またここに書いたときはヨロシクお願いしますね。

  42. demuさん

    ご返事ありがとうございます!
    LGPLとBSD-style Licenseのライセンスを確認してみます。
    また、配布のさいにはテキストファイルを同時に配布するように致します。

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

  43. マッキーさん,

    はじめまして.
    楕円の衝突に関するAPIはないので,ラグビーボールを三角メッシュで作成してください.

    でむ

  44. shuさん,

    ODEはLGPLとBSD-style Licenseの2重ライセンスです.再配布するときはどちらか好きな方のライセンスに従っていれば良いです.ODEのライセンス全体に関するREADME.txt,LGPLに関するLICENSE.TXT,
    BSDに関するLICENSE-BSD.TXTも同時に配布する必要があります.

    でむ

  45. 初コメです。ODEに関しては初心者ですが、ヨロシクお願いします。
    早速ですが質問です。ラグビーボールを作りたいのですが、楕円形を生成するにはどうすればいいのですか?

  46. ライセンスに関する質問です。
    ode.dllとdrawstuff.dllを再配布することは可能でしょうか?
    再配布するときに気をつけることはありますか?

    現在ode.dllとdrawstuff.dllなどをソースコードと同じフォルダに入れて開発をしています。そうすることでODEがインストールされていないパソコンでも開発を行うことができるからです。
    将来的にMFCなどで作ったWindowsアプリケーションをODEがインストールされていないパソコンでも起動できるように、ode.dllなどをexeファイルと同じフォルダに入れて配布しようと考えています。

    そこで、ライセンスの問題があったりすると危険なので、質問させていただきました。
    自分が作ったアプリケーションをode.dllなどと含めてネット上で配布してもよいのでしょうか?

  47. わかりました!ありがとうございます!

    また、何かあったらそのときはよろしくおねがいします!

Comments are closed.