まず,ここにあるODEのFAQを読んでからコメントお願いします.
ODE質問・要望6!のコメントがちょうと100件になりましたので,新しい質問や要望はこちらにお願いします! ご質問の内容を詳しく説明して頂けると的確に回答できますので,時間を節約できると思います.
また、私のコメントやご自分の努力により問題が解決された場合に、問題の原因がわかれば投稿して頂くと大変助かります。その情報はODEの初心者にとって重要なものです。ある程度たまりましたらFAQに掲 載したいと思いますのでご協力のほどよろしくお願いします。
でむ
コメント
昨日、メールにてご連絡をしましたが、届いたでしょうか?
御無沙汰しております。
以前は描画しないシミュレーションや初期角速度の設定を教えていただき
誠にありがとうございました。
また不明な点が出てきたので教えてください。
宜しくお願いします。
実は、以前話したかもしれませんが、
ODEを使ってヒトの脚を模した力学モデルを作っています。
構造は、上腿、下腿、足の3リンク、
腰、膝、踝の3関節からなります。
各リンクには底面の半径を極小にした、極細円柱を用いていたのですが、
より構造を実際の脚に近づけるために、
重心位置と慣性テンソルを、文献に合わせて設定することにしました。
dMassSetParameters を用いて、
慣性テンソルは上手く設定できたのですが、
重心位置を設定すると、
「The centre of mass must be at the origin.」
と言われアボートしてしまいます。
上位関節 リンク 下位関節
○===================○
|−−−−−−−リンクの長さL−−−−−−|
|−重心までの長さaL−|
<a:上位関節から重心までの長さ比>
↑テキストなので分かり難いかもしれませんが、
要するに重心がリンクの中心に有りません。
アボートしている箇所ではa=0.433なので、
元々リンクの中点に重心が有るならば、
リンク内の相対座標で(0.0, 0.0, L*0.067)
の位置に設定したいのです。
ただ、重心と物体の中心は同じようなことを
どこかで見た気もします。
物体の重心位置は変更できるのでしょうか?
また変更できないならばdMassSetParameters の引数にある
「cx, cy, cz」は何を設定するものなのでしょうか?
もし、御存じであれば是非教えてください。
宜しくお願いします。
プロフィールのページより連絡先を見つけました。
すぐにメールにてご連絡差し上げます。
よろしくお願いします。
返信ありがとうございます。
ソースなどはここに直接掲載してよろしいのでしょうか?
サイト内にメールアドレスが見つからなかったもので…
初さん、
簡単な設計図のようなもの(ボディ、関節の位置と姿勢がわかるもの)と、ソースコードを送って頂ければわかるかもしれません。または、実現したい機構の絵を見せて頂ければサンプルプログラムを作ることができるかもしれません。
実装の細部がわからないので、的確に回答することが難しいです。
でむ
いつもお世話になってます。
肩関節をボールジョンイントにしてみたところ、上腕の中心にジョイントの中心をくっつけたら安定してくっついたのですが、上腕部の中心から上腕の高さ分上にずらしてくっつけると上腕が勝手に動いてしまいます。
これは、どこからか力を受けているからなんでしょうか?
上腕部が動いているせいで、ひじ以下がうまくっつきません。
どのような原因が考えられますか?
kazukiさん,
はじめまして.
良くわかりませんが,ODEをDLLで作成して,デモプログラムをLIBで作成しているということはありませんか?
でむ
りんごさん
はじめまして!
サンプルプログラムを作りました.ODE講座29を参考にしてください.
でむ
はじめまして.でむさん,こんにちは.
ODE初心者です.質問があります.
ヒンジジョイントをステップごとに1[deg.]ずつゆっくり,115[deg.]から145[deg.]までx軸を中心に回転させたいのですが見当がつきません.
どのような方法でやればいいのでしょうか.
よろしくお願いします.
はじめまして。かずきと申します。
開発環境はXP、code::blocksで、ode-0.10.1をビルトしようとしましたができませんでした。
code::blocksの説明の通り進めたつもりでしたが、demo_basketをlibファイル(ディレクトリ)に作成する際に、以下のようにビルトログに出てしまいました。
コンパイル中: ..\..\GIMPACT\src\gim_boxpruning.cpp
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application’s support team for more information.
プロセスはステータス 3 で終了しました (0 分 0 秒)0 個のエラー、 0 個の警告
過去の質問も一通り読んでみましたが、解決できなかったのでなにかアドバイスを貰えると嬉しいです。お願いします。
本来ならサンプルどおりのパラメータを使いたいのですが、3自由度の関節がうまく連結されず、ダミーの大きさを変更したら連結されそうな感じになりました。
上腕部を連結するとダミーの2つが振動を始めます。
kumaさん、
一件落着おめでとうございます。
ODEを軽くするためには3Dグラフィクスが遅いパソコンの場合はテクスチャをオフにするか、速いグラフィクスカードに換装することですね。
なお、グラフィクスに問題がない場合は、dWorldQuickStepを使う、衝突判定の数を減らすなど考えられます。スピードアップはODE本にも記載していたのでそちらも参考にしてください。
でむ
初さん、
連結の強さはかわりませんが、関節中心、ボディの位置を正しく設定しないと肩関節が2軸直交しなくなります。
具体的にどこをどう変えたいか教えて頂ければ解説する記事をつくばチャレンジから帰ってきてから書きます。ヒューマノイドのソースは説明がないので、必要だと考えていました。
少々おまちください。
でむ
大きいと連結できるとは、連結の強さには接触面の大きさが関係あるのでしょうか?
でむさん
よくわからないですが、新しくプログラムを作ってコピペするだけで動くようになりました。
あと質問なのですが、ODEを軽く動作させるにはテクスチャを消すのが一番よいですか?
初さん、
ダミーを大きくしてはいけません。これは、2軸直交しているユニバーサルジョイントをヒンジジョイント2個で実現するためのものです。ダミーが小さい場合は2軸が直交しますが、大きくするとズレてきます。
でむ
ジョイントではなくkensei081026.cppのダミー部分に当たるものです。
UPPER_ARM_DUMMY1やUPPER_ARM_DUMMY2のことです。
初さん、
ジョイントのサイズとは何すか? ヒンジジョイントに設定できるパラメータは、回転中心と回転軸ベクトルです。
具体的にどの変数が教えてもらえますか。
でむ
Katsuさん、
dBodyGetTorque()は指定したボディのトルクを返しています。関節に周りにかかるトルクや力はdJointGetFeedback()で取得します。
Katsuさんと同様な質問が過去ODEのメーリングリストで出ていたのでそちらも参考にしてください。
http://www.ode.org/old_list_archives/2004-July/013489.html
http://www.ode.org/old_list_archives/2004-July/013494.html
http://www.ode.org/old_list_archives/2004-July/013533.html
でむ
goさん、
OpenHRP3がOPCODEを使っていることは以下に記述があります。
http://www.openrtp.jp/openhrp3/jp/abstract.html
Bulletの衝突検出ライブラリをODEに移植する話が以前メーリングリストに出ていましたが、いつになるか良くわかりません。
Bulletも試してみたいですが、もう少し日本語の資料等があれば良いと思います。是非、エキスパートになって情報を発信してください。
でむ
こんにちは、OpenHRP3がOPCODEを使ってるとは知りませんでした。 BulletでいまGilbert-Johnson-Keerthi (GJK) について調べてるのですが、見た感じOPCODEの上位verみたいな感じの印象です。(まだあまり調べてませんが) このようにODEのwikiにものっています http://opende.sourceforge.net/mediawiki-1.6.10/index.php/GJK_collision 今からやるならこっちのほうがいいかもしれませんね
訂正です。
ジョイントではなくkensei081026.cppのダミー部分に当たるものです。
肩関節(1関節3自由度)で悩んでいます。
ジョイントのサイズが大きいときはくっついているのですが、サイズを小さくしていくと離れてしまいます。
原因はなんなんでしょうか?
肩関節(1関節3自由度)で悩んでいます。
ジョイントのサイズが大きいときはくっついているのですが、サイズを小さくしていくと離れてしまいます。
原因はなんなんでしょうか?
先日の質問が分かりにくい内容になっていました.すいません.
本当に聞きたかったことは,
dBodyGetTorque()は指定したボディのトルクを返しているのですか?
ということです.
ボディが静止している状態でも0でない値を返していたので
気になって質問させてもらいました.
ODEの0.10.1は
http://demura.net/wordpress/9ode/538.html
を参考に
9.0は
http://demura.net/wordpress/9ode/491.html
を参考にして導入しました。
前回も上記の9.0のページを参考にしてインストールしました。
もしかしたらですが、プログラムを新しく作り直せば大丈夫なのかもしれません。
今日はちょっと出かけるのでまた夜か明日にでもきます。
Hi Robert,
Thank you very much for comment in Japanese. However, please comment in English again. It is a little bit difficult for me to
understand your Japanese.
I have no problem to read English. It is , however, a little bit difficult to write in English. Could I reply in Japanese ?
demu
kumaさん、
このサイトのどのページのとおりインストールし直したか、そのURLを教えてください。
記事を投稿したときは問題ありませんでしたが、もう一度間違いがないか試してみます。
でむ
質問なのですが、でむさんは今新しくインストールしなおしてもスムーズに行くのでしょうか?
原因がどうしてもわかりません。
1.私は、同じ相互作用の2つのオブジェクト場合があなたからのシミュレーションを使用している(interactive simulation -http://demura.net/wordpress/english/ode15). この問題は、衝突判定があるんです。私は2つのオブジェクトと地面間の衝突判定を成功に使用していました。しかし、私はこの2つのオブジェクト間の衝突判定をシミュレートすることができないました。
2.ロボットアームのシミュレーションでは、私は、個々のリンク間の、リンクと地面間の衝突判定を採用との困難な時期があるんです。私は’ nearCallback’を採用しようとしたが、私はまだできないました。
あなたのためならばこの問題の解決に支援を要請することが可能であんですか?
ありがとうござい
ました
エラーメッセージではなく、drawstuffの画面にmass.cppの53行目がおかしいと出るので
mass.cppのdMassCheckがおかしいのか何か引っかかっているのではないかと思います。
Verがあがったことで互換性がなくなっていたりすることはあるのでしょうか?
開発環境は
XP Visual C++ 2008 Expression Edition ODE0.10.1です
この情報であってますかね?
kumaさん,
開発環境を教えてください.
WindowsでCodeblocksをお使いの場合,すでにMinGWをインストールされていると,Codeblocksに付属しているMinGWと干渉してエラーが出る場合があります.その場合は,パスを変更してください.
でむ
連投本当に申し訳ありません。
なんとか10.1を導入しようとしていたら
9.0と同じようなエラーが出ました。
assertion ”dMassCheck(mass)” failed in C:\ode-0.10.1\ode\src ode.cpp494
と表示されます。
どうか解決方法を教えてくださいよろしくおねがいします。
記入漏れです・・ごめんなさい
C:\ode-0.9\ode\srcのode.cppの472行目です。
10.1を導入し前に動いていたファイルを走らせるとlibファイルが見つからないと出て
0.9を導入しなおしてやるとC:\ode-0.9\ode\srcの472行目
dIASSERT(dMassCheck(mass));
に何かエラーがあると出ます・・・
どうしたら良いでしょうか?
kumaさん,
ODEをインストールし直す場合は,ODE推奨のLIBでライブラリを作成してください.作成方法はこのブログに書いています.LIBで作成した場合,バイナリのサイズは大きくなりますが,他の環境へバイナリを持っていっても問題がありません.
でむ
連投ですいません。
今もう一度DLして試したのですが、それだとSKYが開けませんと出ました
もう一度インストールしなおしてみようと思います。
お返事ありがとうございます。
空だけが灰色になっています。
ODEを導入した当初は雲も表示されていたのでドライバは悪くないと思います。
今はODE付属のデモプログラムも同様に空だけが灰色です。
芝のテクチャにしても元に戻してもダメです。
drawstuff/textures以下のディレクトリを、表示したいプログラムの直下においてパスを変更しても同じ症状でした。
一度DLしなおしてdrawstuffのフォルダをコピーしてもダメでした。
ライブラリをDLL(動的)の場合、LIB(静的)の変更の仕方がわかりません。
C++のクラスを使用しても書けるのでしょうか?
goさん,
OPCODEはOpenHRP3も使っているので気になっていました.Bulletも素晴らしいライブラリと聞いています.日本語の情報が少ないので,情報を発信すると多くの方の参考になると思います.その時は教えてください.
でむ
すみません、返信遅れました OPCODEは試してないですね。。。 まぁこれから試すかもしれませんが。 まぁBulletにしたというのはIrrlicht等のforumでODEの話題が古い内容のばかりになってたってのが大きいですね。。 あと弾性体のシミュレーションでSoftBodyも使うかもしれないので、ODEじゃきついかなぁと思ったというのもあります。
katsuさん,
どのようなことを実現したいか良くわからないのでアドバイスが適切ではないかもしれませんが,ヒンジジョイントを制御するなら,トルク制御より速度制御がお勧めです.また,関節角はdJointGetHingeAngle()で取得する方が簡単です.ODE本やODE初級講座13にその方法を解説しています.
でむ
おおむらさん,
drawstuffはODEに影響を与えないので原因がわかりかねていました.エラーの原因がわかり安心しました.何かあれば,またコメントください.
でむ
でむさん、こんにちは。
先日の質問についてですが、自己解決できました。
原因は本来ならば初期化関数で初期化をする変数の一部がDrawStuffの初期化関数start()で初期化されていたために、setDrawStuffを消すと初期化されず、途中の計算がおかしなことになり、エラーを出していたようです。
start()にあった変数を初期化関数に戻したら描画をしない場合でもエラーが出なくなりました。
お手数をかけて申し訳ありませんでした。
はじめまして.でむさん,こんにちは.
疑問に思うことがあったので質問させていただきます.
ボディにヒンジジョイントを付けて,
ヒンジジョイントをサーボモータに見立てて,
現在ボディの回転角を制御するというシミュレーションをしています.
dBodyGetTorque()でボディのトルクを取得し,
dBodyGetQuaternion()からボディの回転角を見ているのですが,
ボディの回転が止まった状態でも
dBodyGetTorque()で取得するボディのトルクが
0ではなく値を持っています.
ボディに生じるトルクが0にならないと
回転は止まらないと思っているのですが
自分が何か勘違いしているのでしょうか?
もしくは,
これらの関数でボディの回転角とトルクを見れると思っているのですが,
間違っているのでしょうか?
何か気付く点があればご指摘お願いします.
山口さん,
お久しぶり!
それは大変ですね.何を消したか私にも検討がつかないので,再インストールした方が時間を節約できると思います.
でむ
おおむらさん,
描画をする場合はエラーがでないのですか? また,エラーはdNormalizationResultだけでしょうか?ODEとdrawstuffは相互に依存していないので,何故そのような結果になるか考えづらいです.どこかにバグが潜んでいるんでしょうね.
興味深いエラーなので,差し支えない範囲でエラーが再現できるソースコードを私に送って頂けますか?
でむ
お久しぶりです。
先日、久々にODEを使ったら、プログラムを変えていないのにシミュレーションの速度が遅くなっていて、空のテクスチャーが表示されませんでした。
何か削除してしまったのでしょうか?正直、見当がつきません^^;
対処法があれば教えてください。
初さん,
ビルドターゲットを選択するときに
DebugDoubleLibを選ぶとデバッグ向け,倍精度,静的ライブラリ,
DebugSingleLibを選ぶとデバッグ向け,単精度,静的ライブラリが選択されます.
ODEインストールについての記事に補足説明しました.
でむ
でむさん、はじめまして。
おおむらと申します。
研究で使うシミュレータを作るのにODE本を大いに活用させていただいています。
シミュレーションを高速で実行するために
ODE本の描画しないでシミュレーションをするにある通りに
ロボットの描画とsetDrawStuff関数とdsSimulationLoop()をコメントアウトし
whileループにsim+Loop(0)を入れるという事をしました。
しかし、コンパイルは通るのですが実行すると
assertion “bNormalizationResult” failed in odemath.h:321
というエラーが出てしまいます。
odemath.hを調べたところ、321行目はdNormalize4()のようで、質問・要望5のコメント30にありましたようにクオータニオンにNaNが入っていました。
倍精度でインストールしていたので、CFMやERPの値を変更する、摩擦係数をdInifinityにしないなどの対策をしたのですが、解決しませんでした。
ただ、描画をする場合はエラーが出ないので物体のモデルやdBodySetRotationには
問題は無いと思うのですが、描画をしない場合に他に注意すべき点や、
描画しない場合に限りクオータニオンにNaNが入る原因に思い当たることなどはありますでしょうか。
開発環境ですが、VC++2003、ODE 0.10.1を使用しています。
以上よろしくお願いいたします。
ODEをインストールするとき、倍制度と単精度がありますが、どこで倍精度をインストールと指定するのですか?