ODEの質問・要望募集のコメント総数が50件を超えました.本当にありがとうございます.コメントが長くなり読みづらくなりましたので新たな質問・要望は最新のODE質問・要望募集○!に投稿してください.
なお,延び延びになっていた初心者用ODE本の原稿脱稿が9月末となりました.できるだけ良い本にしたいので説明して欲しいところがあればコメントして頂ければありがたいです.
さっそく,以下に掲載したうえのさんのご質問に回答していきたいと思います.
こんばんは。
物体と物体のコンタクト時での 動いてる細長い板(Trimesh)の縦長の面を常に まず板の姿勢をdBodyGetRotationで ①FDir1の型はdVector3ということなのですが ②動いている物体を元にしてFDir1を設定するには ②もしかして、そもそもFDir1を動いている 以上、ちょっとわかりにくい文章かつ、 うえの |
うえのさん,毎度ありがとうございます.
①の回答:fdir1は第1摩擦方向で,単位ベクトルかつ接触点の法線方向と垂直でなければなりません.成分は3つあり,その単位ベクトルのx,y,z軸成分です.また,これを設定するためにはdContactFdir1のフラグを立てておく必要があります.
②の回答: いろいろな方法があるかとは思いますが姿勢を知るにはdBodyGetRotationかdBodyGetQuaternionを通常使用すると思います.その他,ボディにヒンジジョイントがあるなら軸の方向ベクトルを利用することもできます.
③の回答: 一般的かどうかわかりませんが,全方向移動ロボットのシミュレータを作成するときにfdir1を設定したことがあります.
以上です.
コメント
はじめましてCohCohと申します.
早速ですが幾つか質問をさせて下さい.
ODEでシミュレーションを行い,
そのシミュレーション結果を元に最適化計算を行って
目的の値を得るというプログラムを作成したのですが,
=====================================
開始
↓
適当な値を初期値として設定
↓
その値を元にODEでシミュレーション(A)
↓
シミュレーション結果を評価関数に入れ計算
↓
評価関数の計算結果を元に,
ODEシミュレーターに渡す値を更新
↓
評価関数の値が十分小さくなるまで,
(A)に戻り繰り返す。
↓
評価関数の値が十分小さくなったら,
その時ODEシミュレーターに与えた値をプロット
↓
終了
=====================================
という構造の為,
状態を描画するためにウィンドウを作成する,
dsSimulationLoop()
でのシミュレーションループでは最適化計算中に何度も,
ウィンドウを作成
↓
シミュレーション
↓
ウィンドウを閉じる
という, 実際必要なの計算とは関係ない部分の処理で,
大きく計算時間をロスしてしまいます。
そこで, シミュレーションの描画を行わず,
シミュレーションのループのみを実行する関数は,
ODEに備わっていないのでしょうか.
若しくは, 描画をOFFにする方法を御存じでしたら,
是非教えて下さい.
お答えありがとうございます。
返信遅くなってしまい申し訳ありません。
力をループ毎にかけてやったら球が止まりました。よかったです。
ちかさん、
はじめまして。
衝突検出に関してはnearCallが重要なので、お手数ですがプログラム一式をtarやlzhなどで固めメールに添付して送付して頂けますか? メールアドレスはトップページのProfile→連絡先のメールアドレスにあります。
はじめまして。
これまで機構解析にDADSを使用していましたがODEを試してみようとはじめました。
だいたい使えるようになったので、複雑な形状にアタックしようと思いましたが
躓いてしまいました。お助けください。
一つのbodyに複数のジオメトリを持たせたいと思いいろんなものを参考に
次のようなプログラムを作成しましたが、物体は地面を貫通してしまいます。
ご指導をお願いします。
dBodyID body;
dGeomID geom;
static void makebody()
{
dGeomID geom_a,geom_b;
dMass m_a,m_b;
dMassSetZero (&m1);
body = dBodyCreate(world);
dBodySetPosition(body,XO, YO, ZO);
geom = dCreateGeomTransform (space);
dGeomTransformSetCleanup (geom,1);
geom_a = dCreateSphere (0,radius);
geom_b = dCreateBox (0,SIZE[0],SIZE[1],SIZE[2]);
dMassSetSphere (&m_a,mass,radius);
dMassSetBox (&m_b,mass,SIZE[0],SIZE[1],SIZE[2]);
dGeomTransformSetGeom (geom,geom_a);
dGeomTransformSetGeom (geom,geom_b);
dGeomSetPosition(geom_a,0,0,0);
dGeomSetPosition(geom_b,0,0,0);
dMassAdd (&m1,&m_a);
dMassAdd (&m1,&m_b);
dGeomSetBody (geom,body);
dBodySetMass (body,&m1);
}
ミツルギさん、
今年もよろしくお願いします。
さて、私の知る限りODEには回転摩擦が実装されていないので、球は永遠に転がります。関節も同様に摩擦がありません。回転摩擦に関する部分は自分で実装しなければなりませんが、以下のODE Wiki のFAQ 3.15に同じ質問があり実装するうえで参考になりますので目をとおしてください。
How do I stop things from rolling off into infinity, or pendulums from swinging forever?
(http://opende.sourceforge.net/wiki/index.php/FAQ#How_do_I_stop_things_from_rolling_off_into_infinity.2C_or_pendulums_from_swinging_forever.3F)
あけましておめでとうございます。
球体を転がしてみると止まらずにどっかに行ってしまうのですがこれは
nearCallbackの変数の値がおかしいのでしょうか?力や速度を掛け続けているようではなく、
動いてる物体にボールが衝突して、ボール反射して転がっていく感じです。
他の物体は止まります。球体はそういった仕様なのでしょうか?
sunaさん、
すみません。ロボコンマガジンのODEプチキャンプの原稿に追われてお返事が遅れました(まだ執筆中)。
どのサンプルプログラムで実行環境は何ですか?
こんにちは。
いつも、simulation test environment v0.02の画面に灰色の縞模様が出て、画面が一部隠れてしまいます。
今までは気にしていなかったのですが、何ででしょうか?
でむさん、ご返信ありがとうございます!
2番目の動画キャプチャの方ですが、早速
窓の杜に行ってみて「カハマルカの瞳」を試してみたところ、
実現できました!
ありがとうございます。
1番目の方の質問はすこしわかりにくくなってすいませんでした。
dWorldQuickStep(world, 0.05)とした時、
1ステップ(0.05秒)毎にSimloopは1回呼び出されるとして、
nearcallbackは何回呼び出されるでしょうか?
と言い換えられるかもしれません。
今回もわかりにくい(もしくは的外れな質問をしているかもしれない・・・)ですが、
お答えいただければ幸いです。(^^;;
うえのさん
お久しぶりです.あなたの投稿記事がSpam Filterにひっかかり迷惑投稿に入っていたので返事が遅くなりました.
さて,1番目の質問がよくわかりません.
dWorldStep(world, 0.05)はシミュレーションを1ステップ0.05秒だけ進めます.
この計算にかかる時間は計算機の処理能力に依存するので,その環境で計測しない限りわかりません.
2番目の質問は動画キャプチャソフトを利用すればよいです.
いろいろあるようですが,窓の杜から「カハマルカの瞳」をダウンロードできます.お勧めかどうかはわかりませんが,試したところ動画をキャプチャできました.
御参考になれば良いのですが...
よっちゃん
投稿ありがとうございます.
AIBOの3DデータはAIBO SDEのウェブサイト(http://openr.aibo.com/)からERS-7の3Dデータ(lightwaveフォーマット)を使っています.
ODEに付属しているdrawstuffライブラリはOpenGLをベースにしているので,OpenGLで扱いやすいフォーマットに変換できればよいわけです.
AIBOシミュレータを作ったときは,Crossroads 3Dというフリーソフトがあったのでそれを利用していました.残念ながら最近はリンクが切れてダウンロードできません.
なんらかのファイルフォーマット変換ソフトを使ってOpenGLにフレンドリーなファイルフォーマットに変換すればdrawstuffで描画が可能になります.
ODEは動力学計算ライブラリなので,シミュレーションの描画に関しての開発はほとんどされていません.コミュニティ的にも開発する意向はないようです.
こんばんは。お久しぶりです!
毎度申し訳ありませんが、今回も2つ質問させてください。
1、nearcallbak、simloopの1秒間における呼び出し回数
void nearcallback{
① ・・(略)・・
for(i=0; i<MAX_CON; i++){
contact[i].surface.mode= ・・・
・・(略)・・
}
}
void Simloop{
・・(略)・・
dSpaceCollide(space, 0, &nearcallback))
if(!pause) dWorldQuickStep(world, 0.05)
② ・・(略)・・
}
dWorldQuickstepで、ステップサイズを0.05、
反復回数(iterations)をデフォルトの20とした時に
①と②の場所が、何秒毎に実行されるかを教えてください。
(または1秒毎に何回呼び出しされるか)
②が、0.05秒毎でステップ、dSpaceCollideも0.05秒毎でステップだと
思っていましたが、違うようでした。
(fprintf等を入れてみて何らかの値を出力するように実験してみたところ、
同じ時間で①が②のちょうど8倍の行になりました。)
加速度を求めたり、最終的なグラフに
使用するために詳細が知りたいのでよろしくお願いします。
2、シミュレーション結果(drawstaff)を動画として保存したいのですが
何かいい方法はご存知でしょうか?
「simulation test environment v0.02」のウインドウを
そのまま動画ファイルとして保存できたら嬉しいです。。
これは直接ODEの質問とは関係ないかもしれませんが、
何かいいアドバイスがあればよろしくおねがいします!
1、の質問がちょっとわかりにくいかもしれませんが、
以上、お時間のある時お答えいただけたら嬉しいです。
でむさん、こんにちは。
いつもこちらのサイトを参考にさせて頂いております。
質問なのですが、
本サイトに掲載されているかっこいいアイボのモデルはどのように作られているのでしょうか?
3D-CADか何かのデータからモデルを構築するようなことが可能なのでしょうか?
できればCADから作れればありがたいのですが(^^;
もしかすると初歩的な質問なのかもしれませんが、お答え頂けたら幸いです。
Jimmyさん,
ODE講座12:トルクセンサを作ろう!にサンプルコードを掲載しましたので参考にしてください.
こんにちは。ちょっと質問があるですがよろしいでしょうか?
jointのトルクと力のdataを取りたいですが。
ODEのmanualを読んでもよく分からないです。
やり方教えていただけませんか?もしsampleが
あればうれしいです。
よろしくお願いします。
sunaさん,
ODEは剛体動力学計算エンジンなので,流体力学のシミュレーションには使えません. 空気抵抗などのパラメータはありません.
でむ
またまた質問ですが、
空気抵抗を設定するには、どうしたらいいのですか?
sunaさん,
よかったですね.解決して何よりです.
来春4月に出版する(講義に使用するので間に合わせなければならない)予定のODE本の原稿締め切りが11月10日なので,今それにかかりきりです.ロボコンマガジンの連載も抱え,ODE講座はなかなか更新できませんが時間を作り充実させますので今後ともよろしくお願いします.
ありがとうございます。
うまくいきました。
MSYSのインストールのときにコマンドプロンプトで、
c:/mingw
を
c:¥mingw
としていました。
http://www2.atwiki.jp/ccw/pages/5.htmlで気が付きました。
今後のODE講座も期待しています。
sunaさん、
$ ls /mingw/binを実行してNo such file or directoryと表示されるということは、インストールが何らかの原因でうまく終了していないことが考えられます。
以下のサイトの記事が参考になるかもしれません。
http://www2.atwiki.jp/ccw/pages/34.html
また、gccやmakeを別にインストールするときはc:\mingwの下に展開してください。
これで解決すればよいのですが…
1は、確実にやりました。
2は、
No such file or directory
と、見つからないようです。
別でインストールする場合は、どこに保存したら良いですか?
sunaさん、
詳しく現状を教えてください。
1. MinGWインストール時にChoose CompomentsでMinGW base tools, g++ compiler, MinGW makeにチェックボックスにチェックをいれましたか?
2. 以下のコマンドを実行して、gcc、g++が見つかりますか?
$ ls /mingw/bin
1を確実に実行して、2でgccとg++が見つからない場合は、私にはその原因がわかりません。その場合は、mingwのサイト(http://www.mingw.org/download.shtml)からCurrentにあるgccとmakeを別にダウンロードしてインストールするか, うまくいっている人のc:\MinGW以下を丸ごとコピーされたらいいかと思います。
何回やってもダメです。
sunaさん、
遅くなってすみません。
恐らく開発環境がインストールされていないと思います。
開発環境がインストールされていたら以下のコマンドを実行するとgcc.exeやg++.exeが見つかります。
mingwインストールのChoose Compomentsで確実にMinGW base tools, g++ compiler, MinGW makeにチェックをいれたかもう一度確認して頂けますか?
チェックの入れ忘れが原因だと思うのですが…
$ ls /mingw/bin
コマンド実行結果
addr2line.exe* g++.exe* mingw32-g++.exe* ranlib.exe*
ar.exe* gcc.exe* mingw32-gcc-3.4.2* readelf.exe*
as.exe* gccbug* mingw32-gcc.exe* size.exe*
c++.exe* gcov.exe* mingw32-make.exe* strings.exe*
c++filt.exe* gdb.exe* mingwm10.dll* strip.exe*
cpp.exe* gprof.exe* nm.exe* windres.exe*
dlltool.exe* ld.exe* objcopy.exe*
dllwrap.exe* mingw32-c++.exe* objdump.exe*
やってみたら、なにも表示されませんでした。
インストールしなおしても、同じでした。
sunaさん、
MINGW32のコンソールを開いて以下のコマンドを実行し、その結果を教えてください。
$ which gcc
私の場合は /mingw/bin/gccとなりました。何も表示されないのならg++コンパイラーがインストールされていないのでもう一度mingwをインストールしてください。
mingwは、このぺージに載っている通りに
インストールしました。
suna様
makeする環境を教えていただけませんか?
そのエラーですと、CのコンパイラーがPATHの通っているところにないようです。
開発環境はインストールされましたか?例えば、mingwですと、g++ compilerとmingw makeをインストール時に選択しなければいけません。
はじめまして。
./configure –enable-double-precision
の時、
error: no acceptable C compiler found in $PATH
See `config.log’ for more details.
となって、上手く出来ません。
どうしたら良いでしょうか?
教えてください.
田窪様
コメントありがとうございます.Visual Studio 2005 ExpressはフリーになりVisual Studioアカデミック版もとても安価になったので,Visual Studioのインストール法も紹介しないとだめだと思っていました.田窪様の記事は多くの方にご参考になっていると思います.
では,今後ともよろしくお願いします.
でむら様
私の名前が出ていたのでコメントさせていただきます.
私のHPにでむら様のHPに載っていたソースと同じものを載せてしまい申し訳ございません.
初めにお断りしてから載せるべきでした.
Vitual Studioでのコンパイルの例を示したいと考え拝借させていただいておりました.
よろしければこのまま掲載をさせていただきたいのですがよろしいでしょうか.
ご快諾いただけると幸いです.
→キーマ様
「ode.dllファイルが開けません」というエラーですが,私のパソコンの場合はシステムの環境変数のPATHへ下記のディレクトリを追加すると消えました.
C:\Program Files\ode-0.6\lib\debugdll
ODE-0.7+VisualStudio2005では,上記のパスでは解決されない場合があり,下記のフォルダを追加すると解決した例がございました.
C:\Program Files\ode-0.7\bin
ご参考になると幸いです.
KENさん,
本の執筆は遅れ気味です…
さて,解決おめでとうございます.
さしつかえなければ,何が原因でどのように対処したらエラーが直ったか教えて頂ければ,非常に参考になると思います.
すいません,自己解決いたしました.
ODEの本,楽しみにしております.
でむさん,ありがとうございました.姿勢角にもいろいろな定義があるということですね.
今後もよろしくお願いします!
KENさん
圧力センサのご質問ありがとうございます。
あまりにも情報が少なくてこれだけではよくわかりません。もう少し具体的に教えて頂けたら回答できるかもしれませんが、今月末、ODE本原稿の締め切りなのでお返事は遅くなると思います。
たこやきさん
回転行列を中身を調べたところ、たこやきさんのおっしゃるとおりdRFromEulerAnglesはcraigのロボティクスにあるZ-Y-Xオイラー角を転置したものになっていますね。
色々調べたところこれは間違いというよりオイラー角の表記にいろいろ流儀があり、NASA Standard Aerospace流ではないかと思います。
以下のサイトをご覧ください。
1.http://oemagazine.com/fromTheMagazine/nov05/tutorial.html
2.http://www.euclideanspace.com/maths/geometry/rotations/euler/index.htm
本家のメーリングリストで確かめてみてはいかがでしょうか?
でむさん,こんにちは.ぽったーです.
ode-0.7とcygwinの件,ありがとうございます.
私がバグとりとかとんでもない...
いつかそうなるように,今はでむさんのHPを見ながら日々自分のプログラムのバグとりです(笑)
興味本位の質問なんですが,drawstaffを使わなければcygwinでも問題ないそうですね.
参考までに,drawstaff以外で3D表示のためのAPI(?),ライブラリ(?)にはどんなものがありますか?
こんにちは.いつもお世話になっております.
ODE講座16 圧力センサを作ろう!を参考に,2足歩行ロボットの足首の圧力を測定しようとしているのですが,z方向の圧力は適切に求められてるようなのですが,x方向の圧力がありえないような桁の数字になってしまいます.
どんな原因が考えられるでしょうか?
ポッターさん
CygwinでのODE0.7のインストールについてのご質問ですね。
ODE0.6,0.7ではODEライブラリのコンパイル可能ですが、テストプログラムはコンパイルできません。私のサンプルプログラムもコンパイルできません。
drawstuffをcygwinで実行するときに問題が起きるようです。つまり、画面の3D表示にdrawstuffを使わなければ問題ありません。もともとdrawstuffはテストプログラムの表示用で、いわばオマケです。
なお、そのバグの詳しい原因を私は調べていないのでわかりません。メーリングリストではCygwinの実装が悪いという人もいます。開発者には知られたバグなのでそのうち直るかもしれません。
ポッターさん お時間があればそのバグを直してODEに貢献してみませんか?
キーマさん
返事が遅くなりすみません。
Visual Studioでのインストールについてのご質問ですが、私は使ったことがないので全くわかりません。ごめんなさい。
もし、わかったら投稿して頂けませんか?
田窪さんのホームページに参考となりそうな記事はありますので吉報をお待ちしています。
http://www-arailab.sys.es.osaka-u.ac.jp/~takubo/howto_ode.html
でむさん,こんにちわ.ぽったーです.
ODE-0.7に関する質問です.
何度かトライしたのですが,確かにOED-0.7はcygwinでのインストールができませんね.
テストプログラムがコンパイルできないとありますが,テストプログラムのみコンパイルできないのでしょうか?
それとも,インストールはできても,他のプログラム(例えばでむさんのプログラム)のコンパイルもできないのでしょうか?
そもそもMSYS,MinGWとcygwinは何が違って,このような結果になるのでしょうか?
あまりODEと関係のない質問ですみません.
ODEの本,もうすぐですね.楽しみにしてますよ~
御回答ありがとうございます.
dRFromEulerAnglesでオイラー角を設定して物体に姿勢を反映させようとすると,明らかにテキストのzyxオイラー角と違う姿勢を示します.(自分はCubeで試しました)
さらに,GetRotationで回転行列の中身を表示させてみても,zyxオイラー角のものとは異なりました.
さらに,転値した行列で同様なことを確かめてみると,「zyxオイラー角」の姿勢を取ることが確認できました.
ということは,やはり回転行列がおかしいのでは~~?でむさんも実際に動かして確かめてくれませんか?
初めまして。
つい先日よりODEを勉強し始め、こちらのサイトを参考にさせて頂いております。
非常に初歩的な質問で恐縮なのですが、
ODEをVisualStudio(2005)で実行する方法はあるのでしょうか?
サンプルに付いていた2005ソリューションを開き、プロジェクトの設定を真似したのですが、
「ode.dllファイルが開けません」という警告が出て実行が出来ない状態です。(コンパイルは通ります)
dllのあるディレクトリへのパスはちゃんと変更してあります。
とても馬鹿な質問であるとは思いますが、お答え頂けたら幸いです。
関数dRFromEulerAngles(R,phi, theta, psi);
について。
以前より、疑問に思っていたのですが、上記の関数を使うと、「右手系,z-y-xオイラー角」の挙動を示しません。(回転行列を確かめてみても明らか)
ちなみに実行すると、「左手系,z-y-x固定角」の挙動を示します。
そこで、rotaotion.cppの中身をのぞいてみたところ。。。オイラー角の定義が以下のようになっていました。
_R(0,0) = cpsi*ctheta;
_R(0,1) = spsi*ctheta;
_R(0,2) =-stheta;
_R(1,0) = cpsi*stheta*sphi – spsi*cphi;
_R(1,1) = spsi*stheta*sphi + cpsi*cphi;
_R(1,2) = ctheta*sphi;
_R(2,0) = cpsi*stheta*cphi + spsi*sphi;
_R(2,1) = spsi*stheta*cphi – cpsi*sphi;
_R(2,2) = ctheta*cphi;
これって変ですよね?
z-y-xオイラー角の回転行列の転置になってしまっている気がします。
すなわち、_R(1,0)→_R(0,1)という具合に変更しなければ正しい動きをしないのでは?
なお、回転行列に関しては、
ロボティクスJhon J.Craig訳を参考にしました。
高橋さん,
力学に関する本とはどの程度のレベルなのでしょうか?
大学初級,中級,大学院レベル
こんにちは。
早急のご回答、ありがとうございます!
x、y、z成分の単位ベクトルだったんですね!
ちょっと難しく考えすぎてしまってました。(^^;
それぞれのご回答を元にして引き続き頑張ってみます。
ありがとうございました。
力学に関する書籍・参考書を紹介して頂けないでしょうか。よろしくお願いします。
座標は,実際に位置センサを動かして,レセプターがその相対座標を読み取ったものを用いています.
得られた座標値をもとにSetPositionで描画しているため,本来ではありえない場所に描画しているものと思われます.(接触を検知する前に貫通してしまう)
例えば,物体を描画する前に,物体間が貫通してしまうような場所かどうかを判定する機能とかあれば解決するのですが...
P.S
ODE0.7のインストール方法ありがとうございました!さっそくやってみます.
ひろさん,
すみません.情報量が少なく難解すぎて回答できません.具体的に何をやりたいか教えて頂ければイメージがわくかもしれませんが?
入力される座標値は実際の物理現象に従ったもので,ODE上の物体はそれをシミュレートしているのでしょうか?
また,不連続とは何ms間隔で,ODEのtime stepはどの程度にしていますか?
では
こんにちは、先日は明確な解答どうもありがとうございました。
またしても、質問させてください。
座標値を直接入力して描画した物体Aと,他の静止物体Bとの接触を検知(
物体Aが物体Bを押す等)しようとしているのですが,
物体Aが物体Bにめりこむ,あるいは貫通するような現象が生じうまく行きません・・・
座標入力値が不連続であったりするため入力デバイス側に問題があるのは明らかですが
ODE側からこのような問題を解決するアプローチがあれば教えて欲しいです!むちゃな質問でごめんなさいー