1 月 07
まず,ここにあるODEのFAQを読んでからコメントお願いします.
ODE質問・要望5!のコメントが100件になりましたので,新しい質問や要望はODE質問・要望6!にお願いします!
なお、私のコメントやご自分の努力により問題が解決 された場合に、問題の原因がわかれば投稿して頂くと大変助かります。その情報はODEの初心者にとって重要なものです。ある程度たまりましたらFAQに掲 載したいと思いますのでご協力のほどよろしくお願いします。 投稿:08年01月07日


でむさん
ご回答ありがとうございます。
言葉が足りなくてすいません。キーボードからの操作はできているのですが、加速度センサーなどを使ってPCの外部からも操作出来るんですか?
おでさん,
初めまして.
demura.netへようこそ.
さて,ご質問の外部入力とは,キーボードの操作ですか? それなら,ODE講座14とODE本の40ページに説明があります.
でむ
始めまして。
最近ODEをつかっているのですが、ODEは外部から入力して操作させることは可能なのでしょうか?
ご回答ありがとうございます。
今年の卒業研究でODEを初めて使うことになり、毎日悩みながらパソコンに向かってます・・・。笑
まだまだ初心者でわからないこともいっぱいあるので、またお世話になることもあるかもしれません。そのときはまたよろしくお願い致しますm(ーー)m
グディさん,
はじめまして.
思いもよらぬご質問ありがとうございます.ODE本にはその辺の記述がわかりづらいようですね. ODE本20ページの第1パラグラフに記述があります.
15ページのプログラム1.2のnearCallback関数では,33行目のif (isGround)文が,地面の衝突だけを考慮する要因になっているので,このif文を削除すればOKです.
ODE講座6にもその説明を補足します.
初心者に超わかりやすいブログと教科書を目指しているので,とても参考になるコメントでした. ありがとうございました.
でむ
衝突検出に関して質問です。
地面との衝突だけではなく、物体同士の衝突を検出したいのですが・・・。
よろしければ物体同士の衝突に関するプログラムを教えてくださいm(_ _)m
でむさん
ありがとうございました。
dJointGetHingeAngle (JointID)があるなら dJointSetHingeAngle (JointID)
があれば便利なのにないようですね。。。
でむさん
わかりました。ありがとうございます。
mif805さん,
お久しぶりですね.
ODEでは,ジョイントは拘束なので姿勢はありません.ジョイントで結合されている2リンクの角度を知りたい場合は,dJointGetHingeAngle()などのAPIを使います.
ご質問の回答になっているでしょうか?
でむ
でむさん、こんにちわ。
Jointについて質問したいのですが、Jointにも
dBodyGetRotationのような姿勢を取得する関数はありますか?
ない場合はどのようにして取得したらよいのでしょうか?
ご回答よろしくお願いいたします。
がきーさん,
ジョイントの初期角度は,ジョイントを生成した時が0[rad]になります.
例えば,2つのリンクの成す角度π/4を初期角度としたい場合は,片方のリンクをπ/4回転させた後で,ジョイントで2つのリンクを結合します.
この程度の回答でよろしいですか?
でむ
出村さま
いつも御世話になっておりますm(–)m
今回の質問は、Jointに関することです。
ジョイントの角度の初期設定を行いたいとき(例えば
Hinge Jointをπ/4だけ曲げるとか)、どのように設定すれば良いのでしょうか?
トルクがかからない状態で初期設定を行い、その状態からシミュレーション
を始めたいのですが。。。ヒントがあればよろしくお願い致します
takaさん,
解決して何よりですが,接触した後に重力がかからず上昇する現象を解決するために,接触に関する関数を入れると解決したという理屈がわかりません.
具体的に接触に関する関数は何で(nearCallback?), もし,dWorldSetGravity()を設定していたとして,何故重力がかからなくなったのでしょうか?
初学者が間違える箇所は,恐らく多くの方に共通するわかりづらい箇所だと思いますので,詳しく教えて頂ければ有益な情報になると考えます.
お手数をおかけしますが,お時間があればコメントください.
でむ
すみません。自分で解決できました。
球が最初重力を受けて下降するのですが、
他の物体に衝突した後に、重力がかからずに上昇し続けるという現象が見られました。
接触関係の関数を書き忘れていたせいのようで、その関数を入れると
直りました。
takaさん,
この情報だけではわかりません.
より詳しく教えてください.
でむ
ボールが落下して他の物体に当たった後、ずっと上昇を続けてしまいます。
落ちてこないのですが何が原因なのでしょうか?
よろしくお願いします。
かつさん,
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次のルンゲクッタが実装される予定です.そうなると改善するかもしれませんが,当然速度は遅くなるでしょう.
でむ
ODE本のところにも書いたんですが,こちらの方がふさわしい場所かと思い,再度書き込みさせていただきます.
EX2.3で質問があります.
パラメータを変更して試してみると,デフォルトの400Nではちょっとしか跳ねないのに,
150Nや100Nだと空に吹っ飛ぶくらい飛んでいきます.
力が小さくなったのに飛んで行ってしまうというのはどうもイメージと合わないのですが,
何が起こっているのでしょうか?
ご教授願います.
JPさん,
初めまして!
この質問コーナーではODEの技術的な事項に限定させてください.ロボット工学全般ですと広すぎて私の手に負えません.2リンクが尺取虫のモデルとして適切なのか私にはわかりかねます.
すみませんが,ご質問の内容をODEの技術的な質問内容に変換して再投稿頂けますか? 恐らく摩擦に関連することだと思うのですが…
でむ
はじめましてJPと申します。
ODEで2リンクの物体で尺取虫の動きをさせたいと思ったのですが、ヒンジジョイントがその場で開いたり閉じたりするだけで、とうてい尺取虫とは言えない動きをします。
どうやったら、前に進むような動きが実現できるか教えてもらえないでしょうか。
よろしくお願いします。
がきーさん,
はじめまして.
>ジョイントを用いないで物体の姿勢角度の制限を行うことは
>できるのでしょうか??
そのようなAPIはないので自分で作るか,姿勢を常に計測し,制限したい角度より外に出たら,反対側に力を加えて制限角度内に収まるようにすることです.恐らく,ご質問の意図からすると,角度制限を拘束条件としたいということでしょうから,後者では不十分ですね.
差し支えなければ,より具体的におやりになりたいことを教えて頂けますか?
でむさん
はじめまして。ODE歴3ヶ月のものです。
ジョイントを用いないで物体の姿勢角度の制限を行うことは
できるのでしょうか??
でむさん
解決しました。ありがとうございます
たろーさん,
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)
でむ
でむさん
初心者の質問でもうしわけないのですが、
axis_x、torqueなどは、どう定義すればいいか?
*=が何を意味しているのか?
わかりません。。。ご回答よろしくお願い致します
質問途中で切れてしまっていてすいませんでした!
ERPもCFMもデフォルト値です.
倍精度でインストールしたと思います!
ありがとうございます.少しいじってみます!また,おねがいします.
山口さん,
解決されましたか?
もし,解決されたのなら,どのようにしたら解決したかコメント頂ければ,多くの方の参考になると思います.
よろしくお願いします.
でむ
でむさん
ありがとうございます。
今後もイロイロ解からない事が出てくると思いますので
そのときはよろしくおねがいします。
たろーさん,
>ジョイント拘束しない物体に対して,等価回転ベクトル回りにトルクを付加して回>転させたいのですが,可能でしょうか?
以下では,如何でしょうか?
等価回転軸ベクトルを(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を参考にしてください.
でむ
山口さん,
dNormalize4()はODE0.9では,クオータニオンを正規化するときに使われています.細かくなりますが,dBodySetRotation(),dBodySetQuaternion(), util.cppの中のdxStepBody(), stepfast.cppの中のmoveAndRotateBody()の中で呼び出されています.
このエラーは何らかの原因で,クオータニオンにNaN(Not a Number)が入ったときなどに生じます.
まず,dBodySetRotationやdBodySetQuaternionを使っている場合は,引数がおかしくないかチェックし,問題ない場合はクオータニオンの値を表示してみて,デバッグしてみてください.
ODEを単精度でインストールしている場合は倍精度に変更し,CFMやERPの値を変更すると直るかもしれません.また,摩擦係数MuをdInifinityと有限値を混在させるとエラーが起きたという報告もありました.stepsizeも小さくしてみてください.後は,物体のモデル(ボディ,ジョイントの位置関係,軸の設定など)が正しく設定されているか確認することも大切です.
でむ
>私はそのような事例を知りません
やはりできないですよね・・・
すばやい回答ありがとうございました
初めまして。
コンパイルはできたんですが、実行しようとしたら
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]
とか出てきました。
変な質問かもしれませんが、初心者なので対処法がわかりません。
どうすれば実行できるのでしょうか?教えてください。
でむさん
迅速な回答ありがとうございます.
>それとも、ジョイントで拘束させずに1つのボディに対して任意軸まわりのトル>クをかけたいという意味でしょうか?
そうです.ジョイント拘束しない物体に対して,等価回転ベクトル回りにトルクを付加して回転させたいのですが,可能でしょうか?
アドバイスよろしくお願い致します.
のぶひこさん、
はじまして。
私はそのような事例を知りません。
現状のODEは積分器の一部に一次のオイラー法を利用しているため計算精度が高くないのでそのような用途には向かないと思います。次のバージョンアップでは4次のルンゲクッタも利用可能になる予定です。そうなると、そのようなアプリケーションを開発する意義もでてくるでしょう。
でむ
始めまして
最近ODEを使い始めた者なのですが
一つお伺いしたいことがあります
ロボットシミュレーションなどで
SimulinkとvisualNastran4Dのような構造解析ソフトなどを
リンクさせているのを行う事例をよく見かけるのですが
同じようにSIMULINKとODEをリンクさせて
シミュレーションを行うことは可能なのでしょうか
たろーさん、
はじめまして。
多くの場合、ジョイントでボディ(剛体)を拘束し、そのジョイントに対してdJointAddHingeTorque()でトルクをかけます。
その際、ヒンジジョイントの回転軸を任意軸に設定すればよいと思います。
それとも、ジョイントで拘束させずに1つのボディに対して任意軸まわりのトルクをかけたいという意味でしょうか?
でむ
はじめまして.ODEで少しわからないことがあるので質問させて下さい.
ボディに対して任意軸回りにトルクを加えるにはどうしたらいいのでしょうか?
ballさん、
ODE FAQ: ODEのよくある質問のB.9をご覧ください。
ODE内部の数値計算によるエラーです。
リンク、ジョイントなど初期位置の設定に誤りがない場合は、
dWorldSetERP, dWorldSetCFM, soft_erp, soft_cfm, mu などのパラメータを調整すると回避できることがあります。
特に, CFMの値を大きくすると改善する場合が多いです。 ちなみに、現在のCFM, ERPの値はいくつですか?
また、ODEを倍精度でインストールしていない場合は、倍精度でインストールすることをお勧めします。
でむ
小さい質問ですいません・・・
シミュレーションはできているのですがDrawStuff Messages に
ODE Message 3: LCP internal error, s
らりほーさん、
ODE本には回転行列に関するサンプルプログラムがなかったですね。らりほーさんのおかげでODE講座も充実することができました。
また、コメントください。
でむ
demuさん、ありがとうございます。
配列の並びを直したところ解決しました。
ODE講座25も大変参考になりました。
らりほーさん、
ODE本お買い上げありがとうございます。
ズバリ配列の並びが違います。ODEの回転行列配列の並びについてはODE本のP103に記載していますので、そちらを参考にしてください。
また、ODE講座25:回転行列とRoll-Pitch-Yaw角にも説明並びにサンプルプログラムを掲載しましたので、これも参考願いますね。
でむ
はじめまして。
回転行列について質問させてください。
物体の回転行列から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…という順序で配列に格納されるという認識であっていますでしょうか。
よろしくお願いします。
お返事遅れました。すみません。
demuさんありがとうございます。
第1段階で右往左往していたので助かりました。
またここに書いたときはヨロシクお願いしますね。
demuさん
ご返事ありがとうございます!
LGPLとBSD-style Licenseのライセンスを確認してみます。
また、配布のさいにはテキストファイルを同時に配布するように致します。
ありがとうございました。
マッキーさん,
はじめまして.
楕円の衝突に関するAPIはないので,ラグビーボールを三角メッシュで作成してください.
でむ
shuさん,
ODEはLGPLとBSD-style Licenseの2重ライセンスです.再配布するときはどちらか好きな方のライセンスに従っていれば良いです.ODEのライセンス全体に関するREADME.txt,LGPLに関するLICENSE.TXT,
BSDに関するLICENSE-BSD.TXTも同時に配布する必要があります.
でむ
初コメです。ODEに関しては初心者ですが、ヨロシクお願いします。
早速ですが質問です。ラグビーボールを作りたいのですが、楕円形を生成するにはどうすればいいのですか?
ライセンスに関する質問です。
ode.dllとdrawstuff.dllを再配布することは可能でしょうか?
再配布するときに気をつけることはありますか?
現在ode.dllとdrawstuff.dllなどをソースコードと同じフォルダに入れて開発をしています。そうすることでODEがインストールされていないパソコンでも開発を行うことができるからです。
将来的にMFCなどで作ったWindowsアプリケーションをODEがインストールされていないパソコンでも起動できるように、ode.dllなどをexeファイルと同じフォルダに入れて配布しようと考えています。
そこで、ライセンスの問題があったりすると危険なので、質問させていただきました。
自分が作ったアプリケーションをode.dllなどと含めてネット上で配布してもよいのでしょうか?
わかりました!ありがとうございます!
また、何かあったらそのときはよろしくおねがいします!
ballさん、
過去のODEメーリングリストのメールを検索しましたが、該当する記事はありませんでした。
ただ、Ruby(Ruby_ODE)、JAVA(odejava)、Python(PyODE)などでは使えるようです。
私はどれも使ったことはないのでよくわかりません。
でむ
説明がへたですいません・・・
そういうことです。どうすればできますか?
ballさん、
Excel VBAからODEのAPIを呼び出すということでしょうか?
でむ
Excel VBAでもインストールできますか?
でむさん,返事が遅くなりすみません.
描画の有無で結果が異なる件ですが,1回のシミュレーションに要したトルクの総和や目標速度との誤差の総和です.制御にはdJointAddHingeTorque()を使用して,繰り返し計算の1回目だけが微妙に値が異なっていました.
しかし,最近デモのbuggy.cppを改良して繰り返し計算のプログラムを実行したところ,描画の有無で結果は変わりませんでした.
どこかプログラムにミスがあるようです.
お騒がせしました.
ぽったー
ぽったーさん
貧乏暇なしといったところです。
さて、制御と衝突検出計算の順番ですが、制御を先にしてから、衝突、動力学計算の順が良いと考えます。
衝突検出計算では、拘束条件となる接触点を算出し、それに基づき動力学計算を実施します。例えば、位置制御などにより物体の位置や姿勢が変化する場合は、それにより接触点が変更になるので、制御を先に行った方が良いです。
また、工学設計Ⅲ発表会のビデオは発表の数週間前に撮ったものなので、本番はもう少し良かったですよ。
さて、描画する場合としない場合で結果が変わるという理由は良くわかりません。表示することが動力学計算に影響を与えるとは考えづらいです。
具体的にどのように違うか教えて頂けたらありがたいです。
でむ
でむさん,忙しい時期も過ぎたでしょうか?
ぽったーです.
simLoop()について質問なんですが,simLoop()内で行う作業(関数)には明確な順番があるでしょうか?
例えば,ロボットシミュレーションのp.113では,
制御 -> 衝突検出 -> 動力学計算 -> 接触点消去 -> 描画
となっていると思います.
混乱している点は,制御してから接触ジョイントを構成するのか?それとも,接触ジョイントが構成されてから制御するのか?です.
これは,順番はどちらでもよく,動力学計算よりも前で処理すれば良い問題なのでしょうか?
工学設計Ⅲ公開発表会のムービー見ましたよ!いろいろバラエティに富んでますね.
ODEと強化学習を用いたシミュレーションですが,繰り返し計算をする際に,同じパラメータを使用しても,描画をする,しないで結果が微妙に異なることはなかったですか?
遺伝的アルゴリズムを使用してシミュレーションを行っているのですが,描画のある,なしで結果が異なるので困っています.
現在は時間がかかりますが,描画ありでシミュレーションを行いつつ,どこか変数の初期化をまちがえているのかな..と悩んでいます.
よろしくお願いします.
勉強中さん、
解決してなによりです。
またのお越しをお待ちしています。
でむ
ありがとうございます。
/sbin/ldconfigを実行したところエラーもなくなり、うまく動くようになりました。
また質問すると思いますので、今後ともよろしくお願いします!!
勉強中さん
はじめまして!
ODEをインストールするときに、make installをされましたか?
また、共有ライブラリがシステムに認識されるように、 /usr/local/lib を /etc/ld.so.confに追加し、 /sbin/ldconfigを実行しましたか?
でむ
最初のhello.cppをコンパイルして実行しようとすると
error while loading shared libraries: libode.so: cannot open shared object file: No such file or directory
といわれてしまいます。
これはどこがいけないのでしょうか??
Fedoraを使っています。
すいません,自己解決しました.
単にオフセットのやり方がまずかっただけのようです.
上にもう1つボックスを置いたらできました.
お手数掛けさせてしまい申し訳ありません.
ありがとうございました.
でむさん,お返事ありがとうございます.
一応そのページやwebの該当講座を見て作ったのですが,
そのとおりに作ってもうまくいきません.
ボックスの重心をずらしても四隅の圧力センサは同じ圧力を示しています.
まるさん、
はじめまして!
ODE本プログラム9.1:力・トルクセンサではだめでしょうか?
でむ
はじめまして,まると申します.
現在,圧力センサに関するプログラムを作っています.
ロボットの足を模したボックスの四隅に圧力センサが取り付けられており,
これからZMPを算出しようと考えています.
これでボックスの重心をずらせばZMPも移動するはずなのですが,
四隅の圧力センサはどれもほぼ同じ値を示しており,ZMPは変わりません.
どのように記述すれば正しく圧力を測定できるのでしょうか?
どうかご回答よろしくお願いします.
やはりソースコードが途切れてしまいました。
ソースコードが途切れていました。すいませんでした。
全体のソースコードを数日前にメールにてお送りいたしました。
以下はそのシミュレーションの再スタートに関する部分です。
もう一度載せてみます。
void destroyArm()
{
dJointDestroy(sensor_joint); // センサージョイントの破壊
dBodyDestroy(sensor); // センサーボディの破壊
for (int i = 1; i
C初心者さん,
これだけの情報だと原因を特定できません。
ソースコードを送って頂くか,リンクを張って頂けませんか?
でむ
pro6-4のロボットアームにシミュレーションの再スタートするプログラムを実装したのですがうまくいきません。
コンパイルは通りました。キー操作から”r”を押すと、再スタートする関数が呼び出されるのですが、”r”を押すと「問題が発生したため、・・・.exeを終了します。・・・」など表示されてしまいます。球の落下など簡単なプログラムの再シミュレーションはうまくいきました。
いろいろ試したのですが、まったくうまくいきません。どこに問題があるのでしょうか。よろしくお願いします。
実装してうまくいかなかったソースコードです。
void destroyArm()
{
dJointDestroy(sensor_joint); // センサージョイントの破壊
dBodyDestroy(sensor); // センサーボディの破壊
for (int i = 1; i
ぽったーさん、
情報ありがとうございました。助かります。さっそく、FAQに掲載させて頂きました。
現在、ロボット情報学ハンドブックのODEに関する記事の執筆を頼まれ、締め切りを過ぎて青くなっています。
修士発表が2月16日、4年生の発表が2月29日なので、これから益々忙しくなりそうです。
でむ
でむさん,お元気ですか?
そろそろ忙しさもピークを迎えたのではないでしょうか?
今回は質問ではなく,こんなことできましたという報告です.
遺伝的アルゴリズムのような繰り返し計算にODEを使用する際,計算スピードを上げるために描画を止めていました.
しかし,状態の変化を見ようとprintfをしても,MinGW+msysの環境下で描画を止めるとprintfの出力も止まってしまいました.
そこであれこれ調べていたところ,でむさんが配布されているmakefileの14行目付近にある
$(CC) -mwindows -o (略)
を
$(CC) -mconsole -o (略)
のようにすることで,描画を止めてもコンソールにprintfされるようになりました.
同じように悩んでいる方の手助けになれば幸いです.
なるほど~。できました!
衝突検出の理解も深まりました。
これでまた、ODEでさらに遊べそうです!
本当にどうもありがとうございました!!!
初心者さん、
もちろんODEで実現できます。
実際に接触したかどうかは、接触点があるかないかでわかります。
ODE講座6のサンプルプログラムでは接触点数が1個以上の場合に、flagを1にセットしています。
なお、地面に接触しているときだけ色を赤にしたい場合は、simLoopの中でdSpaceCollide()を呼び出す前にflagを0にセットすればできます(サンプルプログラムを変更しました)。ただし、跳ね返るデモでは、接触が一瞬なので肉眼では確認しづらいです。
でむ
非常にわかりやすいご回答ありがとうございます。大変助かりました!!!
参考書のP20にありますが、neerCallback関数は2つのオブジェクトが接触する可能性のある場合呼び出されます。なので、接触する場合のみ取り扱いたい場合はODEの特性上、不可能でしょうか?
今回の場合ですと、赤のボールが一度地面と衝突したらずっと青のままになってしまいます。地面と衝突して、跳ね上がったらまた赤にすることは無理でしょうか?
初心者さん、
衝突したら色を変えるためには以下の手順でやってください。
1.衝突したことを示すグローバル変数を準備する。ここでは以下のようにします。
static int flag = 0;
2.nearCallback関数の中でdCollide()の返却値が1以上なら、衝突したことを示すグローバル変数flagを1にセットし、そうでない場合は0にセットする。
3.simLoop関数の中で、flagが1なら別の色を設定し、0なら元の色に設定する。
また、シミュレーションの画面に文字を表示する機能はdrawstuffにはありませんが、以下の3つの方法で対処可能です。
1.標準出力で我慢する
2.drawstuff+文字表示ライブラリを利用する
3.drawstuff以外のライブラリを使用する
でむ
球を空中から落下させて、地面と衝突したら球の色を変えたり、画面に「衝突した」と表示させるなど衝突したときの反応を示すプログラムを作りたいのですがが、どうすればよいでしょうか?
ODEのデモにも2つほど似たようなものを見つけましたが、ソースコードが複雑でなかなか上記に関する箇所を見つけることができませんでした。
nakaさん、
よかったですね。
また、遊びにきてください。
でむ
でむさん
ご回答ありがとうございました.
やはりSetFeedbackの指定の箇所に問題があったようでした.
9.1やODE講座13のプログラムを参考に設定しなおしてみたところ
上手く動作してくれました.
ありがとうございました.
nakaさん、
固定ジョイントでなくても力やトルクを取得可能です。
dJointSetFeedback()で取得したい関節を指定されましたか?
ODE本P227のプログラム9.1が参考になると思います。
でむ
でむさん
先日はありがとうございました.
すみません,またしても質問です.
dJointGetFeedback関数を用いてボディにかける力の値を得たいと思うのですが,その際のジョイントは固定関節でなければできないのでしょうか?
また,ボディのどこかが地面に接着していなければまずいでしょうか?
ジョイントがfixedでなく,ボディも接着していない状態で値を取得してみたのですが,それが10桁以上の値になってしまいました.
これはジョイントやボディの問題でなく,関数の設定方法に問題があるのでしょうか?
よろしくお願いします.
nakaさん,
問題が解決して何よりです。初歩的な質問はdemura.netにとって大変重要なので,また,何かあれば聞いてください。
でむ
でむさん
初歩的な質問ばかりですみませんでした.
ですが,おかげさまで進められそうです.
ありがとうございました.
これからもよろしくお願いします.
でむさん,お忙しいところありがとうございます.
幸い風邪をひくことなく,元気にODEをしています.
stepsizeが数値積分の刻み幅であり,精度と計算速度のトレードオフがあることは分かりました.
ご報告として,けんせいちゃんのシミュレーションなのですが,stepsize=0.00001など非常に小さな値にすると,なんとけんせいちゃんが宙に舞います.
ぽったーさん、
お久しぶりです。お元気ですか?
さて、dWordStep(dWorldID world, dReal stepsize)のstepsizeは数値積分の刻み幅です。小さいほど精確になりますが、速度は遅くなります。
ただし、ODEはゲームの物理計算エンジン用に開発されたので、現状では精度が要求される工学分野には向きません。そのような用途にはOpenHRP3を利用されるのが良いと考えます。ただし、ODEと比較すると速度は遅いです。一般に、精度と速度はトレードオフの関係にあります。ODEはリーズナブルな挙動で、高速性と安定性が特徴となっています。
nakaさん、
新HPが見やすくなったとのコメントありがとうございます。苦労した甲斐がありました。
1. 慣性力が働くので、全てのボディ(剛体)の速度、角速度を0に初期化してください。
2.はい。ただし、ロボットは複数のボディとそれを結合している複数のリンクで構成されているので、あるボディだけに特定の方向へ動かす力を与えても、ロボット全体がどの方向に移動するかはシミュレーションの結果を見なければわかりません。
地面との拘束も考慮しなければなりません。
でむ
でむさん
ご回答ありがとうございます.
新HPでは項目などが整理されていて,とても読みやすくなっていると思います!
申し訳ないですがさらに2つほど質問させてください.
1.先日の2.の続きですが物体を拘束するにはどうすればいいのでしょうか?
それまで力を与えて動かしていたので,とりあえず力を与えるのをやめましたが,慣性力が働いてしばらく動いてしまいます.すぐに止めたいのですが,位置座標の指定(?)など固定の方法はないでしょうか?
2.ロボットのボディの別々の場所に力を与えた場合,ロボットはその合力方向に動くのでしょうか?
よろしくお願いします.
でむさん,おひさしぶりです.
ODEのシミュレーションのステップに関する質問です.
こちらのサイトで紹介されている
EX9.3: ヒューマノイドモデル 「けんせいちゃん」 (P223)
のサンプルプログラムの270行目の数値を0.01から0.00001や0.05,0.1に変更するとシミュレーション結果が変わります.
シミュレーションのステップがODEの数値積分などに利用されているために,このように結果が異なるのでしょうか?
単に小さければいいというわけではなさそうなのですが,目安としてどのくらいの値を与えるべきなのでしょうか?
nakaさん、
はじめまして。ウェブサイトをリニューアルして以前より読みやすくなったと思いますがいかがでしょうか? 改善して欲しいことがあればコメント頂ければありがたいです。さて、回答します。
1.そうです。dContactMu2をdInfinityにすると滑りません。ただし、そのためには、dContactMu2のフラグを設定する必要があります。さらに、車軸方向を計算して、contact[i].fdir1[0]~contact[i].fdir1[2]に設定しなければなりません。dContactFDir1のフラグを設定することもお忘れなく。ODE本のプログラム5.2に全方向移動ロボットのサンプルプログラムがあります。全方向移動ロボットの車輪は横方向に摩擦が小さいので、nakaさんの例とは逆になりますが、参考にはなると思います。
2. simloopの中でループをカウントして、ある数に達成したら拘束をかけるというのではだめでしょうか?
でむ
はじめまして,いつもこちらのHPで勉強させていただいております.
2つほど質問させてください.
1.シミュレーションでロボットが進行方向と垂直な方向に横滑りします.
車輪がついているわけではないのですが,その横滑りを抑えるにはdContactMu2を用いればいいのでしょうか?一応設定してみたのですが,あまり効いているように見えません.設定方法に注意点などありますでしょうか?
2.いくつかのリンクが連なっている物体を考えているのですが,ある時間までは自由に動き回っているとして,シミュレーションの途中(一定時間経った後など)からその一部のみを拘束する,と言うことは可能でしょうか?
説明不足でしたらすみません.
よろしくお願いします.
CohCohさん、
ご質問ありがとうございます。
剛体の初期角速度の設定はdBodySetAngularVel、初期速度の設定はdBodySetLinearVelを使います。ただし、この角速度は重心周りの角速度、速度は重心の速度です。
ご質問はロボットのように多リンク機構の関節の角速度を初期設定したいということですので計算に手間がかかりますね。
普通のモータは役不足なので、高性能で理想的なAモータなら使えると思います。このモータは次のステップで必ず指定した角速度になるとユーザガイドには記載されています。ODE本では簡単ですが、91ページから96ページにかけて説明しています。また、ODE講座24としてAモータを使った簡単なサンプルプログラムを作りましたので参考にしてください。
ODE講座8のコメント欄に質問したんですが、
このページを見付けたので、転載しました。
質問の重複になりすいません。
以前はシミュレーション中に描画しない方法を教えて頂き、
本当にありがとうございました。
いまODEを用いて、腰、膝、踝の3関節と
上腿、下腿、足の3関節からなるヒトの脚を模した
力学モデルを作成し、運動のシミュレーションを行っているのですが、
各関節に初期角速度を設定する方法が分からなくて困っています。
dJointSetHingeParam(joint, dParamVel, 値);
という関数で設定できるのかと思ったのですが、
ODE本やこのサイトを見ると「目標角速度」と記述が有り、
どうやら求めている、初期角速度の設定では無いようで、
どのように設定したら良いか分かりません。
運動途中の一部分を抜き出して、
その部分に対しシミュレーションを行っているので、
初期速度(加速度)が設定できないと、
正確なシミュレーションが出来ません。
もしよろしければ、設定方法を教えていただけないでしょうか。
ゲストさん,
はじめまして,
まず,dWorldQuickStep()が問題かどうか,dWorldStep()に変えて調べ,ステップサイズも教えてください.
dWorldStep()でも同様な症状が現れる場合は,現実には起こりえないことをシミュレーションしようとしている可能性があります.
例えば,本来剛体であるべきオブジェクト同士が貫通している場合などです.
その現象を防ぐためには,ステップサイズを小さくする.ODE本の100ページに説明のあるdWorldSetContactMaxCorrectingVel()やdWorldSetContactSurfaceLayer()などで貫通することを防いでください.
結果を教えてください.
でむ
はじめまして、どうしても解決することができない問題があるので、よろしくお願いします。
bodyで作成したオブジェクトを密集させたところ、プログラムが強制終了します。gdbで調べたところ、segmentation faultと表示されます。quickstep.cppのmの値を出力しながら、シミュレーションを行うと下記のようになりました。
私は、mの値が関係していると思うのですが、プログラムが強制終了する原因は、どのようなものが考えられるでしょうか?
m(quickstep.cpp)=24
m(quickstep.cpp)=24
m(quickstep.cpp)=45
m(quickstep.cpp)=87
m(quickstep.cpp)=45
m(quickstep.cpp)=24
m(quickstep.cpp)=24
m(quickstep.cpp)=24
m(quickstep.cpp)=24
m(quickstep.cpp)=45
m(quickstep.cpp)=87
m(quickstep.cpp)=45
m(quickstep.cpp)=24
m(quickstep.cpp)=24
m(quickstep.cpp)=45
m(quickstep.cpp)=45
m(quickstep.cpp)=84
m(quickstep.cpp)=162
m(quickstep.cpp)=84
m(quickstep.cpp)=45
m(quickstep.cpp)=45
m(quickstep.cpp)=45
m(quickstep.cpp)=45
m(quickstep.cpp)=84
m(quickstep.cpp)=66
m(quickstep.cpp)=84
m(quickstep.cpp)=45
m(quickstep.cpp)=45
m(quickstep.cpp)=0
m(quickstep.cpp)=0
m(quickstep.cpp)=0
Step contact_index:490
1
m(quickstep.cpp)=48
m(quickstep.cpp)=48
m(quickstep.cpp)=321
m(quickstep.cpp)=48
m(quickstep.cpp)=48
m(quickstep.cpp)=48
m(quickstep.cpp)=48
m(quickstep.cpp)=321
m(quickstep.cpp)=48
m(quickstep.cpp)=48
m(quickstep.cpp)=168
m(quickstep.cpp)=168
m(quickstep.cpp)=168
m(quickstep.cpp)=237
m(quickstep.cpp)=168
m(quickstep.cpp)=168
m(quickstep.cpp)=168
m(quickstep.cpp)=120
m(quickstep.cpp)=132
m(quickstep.cpp)=120
m(quickstep.cpp)=0
m(quickstep.cpp)=0
m(quickstep.cpp)=0
Step 2
contact_index:391
m(quickstep.cpp)=402
m(quickstep.cpp)=402
m(quickstep.cpp)=420
m(quickstep.cpp)=402
m(quickstep.cpp)=402
m(quickstep.cpp)=423
m(quickstep.cpp)=225
m(quickstep.cpp)=321
m(quickstep.cpp)=234
m(quickstep.cpp)=153
m(quickstep.cpp)=198
m(quickstep.cpp)=153
m(quickstep.cpp)=0
m(quickstep.cpp)=0
m(quickstep.cpp)=0
Step 3
contact_index:364
m(quickstep.cpp)=516
m(quickstep.cpp)=507
m(quickstep.cpp)=528
m(quickstep.cpp)=507
m(quickstep.cpp)=507
m(quickstep.cpp)=543
m(quickstep.cpp)=291
m(quickstep.cpp)=408
m(quickstep.cpp)=300
m(quickstep.cpp)=186
m(quickstep.cpp)=273
m(quickstep.cpp)=186
m(quickstep.cpp)=0
m(quickstep.cpp)=0
m(quickstep.cpp)=0
Step 4
contact_index:339
m(quickstep.cpp)=621
m(quickstep.cpp)=1893
m(quickstep.cpp)=633
m(quickstep.cpp)=603
m(quickstep.cpp)=366
m(quickstep.cpp)=486
m(quickstep.cpp)=366
m(quickstep.cpp)=219
m(quickstep.cpp)=354
m(quickstep.cpp)=219
m(quickstep.cpp)=0
m(quickstep.cpp)=0
m(quickstep.cpp)=0
Step 5
contact_index:336
m(quickstep.cpp)=705
m(quickstep.cpp)=2184
m(quickstep.cpp)=750
m(quickstep.cpp)=678
m(quickstep.cpp)=429
m(quickstep.cpp)=570
m(quickstep.cpp)=423
m(quickstep.cpp)=252
m(quickstep.cpp)=438
m(quickstep.cpp)=252
m(quickstep.cpp)=0
m(quickstep.cpp)=0
m(quickstep.cpp)=0
Step 6
contact_index:307
m(quickstep.cpp)=774
m(quickstep.cpp)=3264
m(quickstep.cpp)=741
m(quickstep.cpp)=492
m(quickstep.cpp)=651
m(quickstep.cpp)=489
m(quickstep.cpp)=285
m(quickstep.cpp)=534
m(quickstep.cpp)=285
m(quickstep.cpp)=0
m(quickstep.cpp)=0
m(quickstep.cpp)=0
Step 7
contact_index:278
m(quickstep.cpp)=5196
m(quickstep.cpp)=543
m(quickstep.cpp)=729
m(quickstep.cpp)=537
m(quickstep.cpp)=318
m(quickstep.cpp)=615
m(quickstep.cpp)=318
m(quickstep.cpp)=0
m(quickstep.cpp)=0
m(quickstep.cpp)=0
Step 8
contact_index:247
m(quickstep.cpp)=5607
m(quickstep.cpp)=579
m(quickstep.cpp)=816
m(quickstep.cpp)=609
m(quickstep.cpp)=351
m(quickstep.cpp)=702
m(quickstep.cpp)=351
m(quickstep.cpp)=0
m(quickstep.cpp)=0
m(quickstep.cpp)=0
Step 9
contact_index:253
m(quickstep.cpp)=5988
m(quickstep.cpp)=621
m(quickstep.cpp)=900
m(quickstep.cpp)=657
m(quickstep.cpp)=384
m(quickstep.cpp)=775
m(quickstep.cpp)=384
m(quickstep.cpp)=0
m(quickstep.cpp)=0
Step 10
contact_index:232
m(quickstep.cpp)=9076
m(quickstep.cpp)=663
m(quickstep.cpp)=717
m(quickstep.cpp)=0
m(quickstep.cpp)=0
Step 11
contact_index:255
m(quickstep.cpp)=11401
akadaさん,
良かったですね.是非,ODEの世界を楽しまれてください.
でむ@妙高高原
ありがとうございました。ご指摘のようにするとうまくいきました。
これからも超初歩的な質問をすることになりそうですが、よろしくおねがいします。
akadaさん,
はじめまして. demura.netのサーバーを移転し,ブログのカスタマイズをしているのでいろいろご迷惑をおかけします.
さて,configure: error: no acceptable C compiler found in $PATH というエラーは恐らく,MinGW+MSYSのインストールが失敗したためだと考えられます.ユーザー名を半角に変えたらうまくいったとのことですので,一度MinGWとMSYSをアンインストールしてから再起動し,インストールしてみてください.
でむ
すいません。変なものを投稿してしまってました・・・。
「add your coment」というのは無視してください。
あと、はじめの「bash.exe: warning: could not find /tmp, please create!」と表示される問題はアカウント名を半角にしたら解決できました。もうひとつのほうをお願いします・・・
odeをインストールした後に
「$./configure□–enable-double-precision」を入力すると
「configure: error: no acceptable C compiler found in $PATH 」
と表示されて、コンパイルできません。どうすればよいのでしょうか?
odeのインストールでつまづいたのですが、MSYSを起動すると
「bash.exe: warning: could not find /tmp, please create!」と表示されるのですが、
これは何なのでしょうか?
>>でむ 07-12-20 (木) 7:51
初心者さん
お返事が遅くなりすみません。年末なのでいろいろとありまして…
1. ODE本では簡単にするために例外処理はしていません。
ご自分で例外処理を考える必要があります。
(6.102)式の左辺の分母にあるS5を分子にもってきてください。
2.姿勢情報はどう与えれば良いかというご質問です。
回転行列またはクオータニオンで設定することができます。
でむ
***************************
パソコンの調子が悪くなり、お礼を伝えるのが遅くなりました。
すみません、申し訳ないです。
ご回答ありがとうございました!!