まず,ここにあるODEのFAQを読んでからコメントお願いします.
ODE質問・要望6!のコメントがちょうと100件になりましたので,新しい質問や要望はこちらにお願いします! ご質問の内容を詳しく説明して頂けると的確に回答できますので,時間を節約できると思います.
また、私のコメントやご自分の努力により問題が解決された場合に、問題の原因がわかれば投稿して頂くと大変助かります。その情報はODEの初心者にとって重要なものです。ある程度たまりましたらFAQに掲 載したいと思いますのでご協力のほどよろしくお願いします。
でむ
コメント
はつさん,
dMassSetCapsule()は円柱の慣性テンソルなどを計算します.長軸がx軸方向の慣性テンソルを計算する場合は,姿勢も長軸がx軸方向になるように回転行列またはクオータニオンを設定する必要があります.
でむ
足の部分にカプセルを使いたく倒した状態にしたいのですが、カプセルの長軸方向がZ軸になってしまいます。
dMassSetCapsule(&m,1,1,F_Rad,F_L);
というふうに、3番目の引数でX軸を指定するだけではダメなのでしょうか?
kokoさん,
あけましておめでとうございます.今年もよろしくお願いします.
さて,接触点数だけではなく,その位置も確認してください.接触点の3点が常に同じか,それとも時間により変わるかどうかです.2つの剛体が衝突を繰り返し細かく振動する場合があります.
また,シミュレーションの速度を上げるとはどのようは意味でしょうか?stepsizeをどの程度大きくしたのですか?
でむ
demuさん、あけましておめでとうございます。
また衝突点数のことですが、よろしくお願いします。
小さい立方体と大きい立方体を接触させたとき面に対して垂直に接触させているはずなのに、小さい立方体の接触点数が3になるときがあります。
大きい立方体の面からはみ出ているということはありません。
立方体の面がゆがむ以外に3は考えられないのですが思い当たる点があれば教えてください。
また、PCのスペックに対してシミュレーション速度を上げすぎると物体が勝手にふっ飛んでしまうことはありえますか?
ありがとうございます。
CADを使った方法に挑戦してみようと思います。
らりほーさん,
タイヤの実物があるなら3Dスキャナで3次元データを取る,AutoCADなどのファイルがあればそれをファイルフォーマット変換して3dsやxファイルにして読み込む方法が考えられます.
以下の記事が参考になると思います.
http://demura.net/misc/462.html
http://demura.net/9ode/460.html
http://hwm7.gyao.ne.jp/shinpuku/column05.html
でむ
アドバイスありがとうございます。
なるほど三角メッシュですね。
どうやって三角メッシュの座標データを作ろうか考えていますがこれがなかなか手強そうですね。
らりほーさん、
あけましておめでとうございます。らりほーさんが2009年初めてのコメントです。
さて、ODEの衝突プリミティブに楕円はありません。衝突プリミティブを自分で作成することはとても大変なので三角メッシュでタイヤの形状を作る方法が比較すると簡単だと思います。
でむ
あけましておめでとうございます。
正月休みにODEで遊んでいたのですが疑問が一つ沸いたので質問させてください。
ODEで楕円体を作る方法は何かないでしょうか。
というのは、一輪車や二輪車といったバンク角を付けて走行する車両のシミュレーションをやっているのですが、車輪を円柱で作るとバンク角を付けたときの挙動がおかしくなるので別の形状に置き換えたいのです。
とりあえず球で代用してうまくいっているのですが、実機に近づけたいので球を押しつぶしたような楕円体にしたいのです。
何か良い方法はないでしょうか。
でむさん、回答ありがとうございます。
新しいやり方、楽しみにお待ちしております。
こんにちは、チップです。
『ODE講座22:ODEでポリゴンを簡単に表示する方法』
を参考にして、自分で作ったデータを渡したいと思い、
Google SkechUp というソフトを使って3dsファイルを作成したのですが、
必ずアボートしてしまいます。
同じ3dsファイルでも読み取れるエクスポートをするソフトと、
読み取れないエクスポートをするソフトがあるのでしょうか。
環境はLinuxでやっています、
解決策があればよろしくお願いします。
ありがとうございます。
なるほど。。。バージョンによるものかもしれないですね。
衝突検出が改善されているのは、とても心強いです。
バージョンを新しくして、また検討してみたいと思います。
いろいろとアドバイスありがとうございましたm(__)m
助かりました!!
masaさん,
年の暮れまで研究ごくろうさまです.
さて,パラメータは特におかしな値ではありませんね.
ODE0.10.1でオプションで設定するOPCODEの新しいものは,衝突検出が改善されています.記憶が定かではあいませんが,ODEの古いバージョンは円柱の実装が悪いので問題がなければ,車輪を円柱ではなくカプセルに変更して試してみてはいかがでしょうか?
または,ご自分のノートパソコンにODE0.10.1をインストールして,プログラムを試されてはいかがでしょうか.
でむ
御返事ありがとうございます。
以下、詳細です。
1.円柱の高さは0.05[m]に設定しています。ちょうど車輪の幅にあたる部分で
す。
2.nearCallback関数内では、soft_erpは0.8、soft_cfmは1e-5に、それぞれ設定し ています。
また、これとは別にmain関数内で、
dWorldSetERP(world, 0.8);
dWorldSetCFM(world, 0.02);
を組み込んでいます。
3.ODEのバージョンは0.9です。ビルドCの作業は行っておりません。
研究室のパソコンでシミュレーション等すべて行っているのですが、初めの 時期にインストールを行ったのみだと思います。
4.動力学計算はdWorldStepで行っています。stepsizeは0.002[s]です。
以上です。よろしくお願いしますm(__)m
初めまして。masaと申します。
現在ODEを用いて、二足歩行のシミュレーションを作成しています。
具体的には、まず2本の脚と2つの車輪を作成します。
脚どうし、車輪どうしはそれぞれ棒で連結されており、さらに、その棒どうしを別の細長い棒で連結します。
そして脚が歩くと、連結された車輪も一緒に転がって前に進むような状態です。
(ちょうど人間が乳母車を押している状態に近いです)
そこで本題なのですが、前に進み始めてしばらくすると、車輪のみが地面の中にめり込むという状態が発生してしまいます。
脚や連結に使っている棒はめり込みません。
ちなみに車輪は、円柱を用いて作っています。
(通常、円柱がまっすぐ立っている状態から、円柱の高さをとても小さくして、
90度だけ回転させた感じです)
衝突検出をおこなうnearCallback関数なども、ODE本などを参考にしながらチェックしたのですが、特に問題なさそうな感じです。
それとも別の場所に問題があるのでしょうか。
何かアドバイス等ございましたら、よろしくお願いします。
では、失礼します。
hiroさん,
dJointSetHingeParam(joint, dParamLoStop, theta1); // 最小可動域の設定
dJointSetHingeParam(joint, dParamHiStop, theta2); // 最大可動域の設定
theta1を-dInifinity, theta2をdInfinityに設定し直せば変更できます.
ODE講座29 サンプルプログラムのstepper.cppも参考になるでしょう.
また,+180, -180の切り替えについては,ODE本P182プチプロ6.3の問題になっていますので直接は回答しない方針です.ただ,その問題以降のODE本サンプルプログラムに答えは載っています.
でむ
ヒンジジョイントのパラメータに、
角度の上下限を制限するパラメータがありますが、
※dParamLoStop,dParamHiStop
一度、このパラメータを設定した後に、無効にする方法はあるでしょうか?
又、位置制御で関節を無限回転するプログラムを作っていますが、どうしても
+180°→-180°の切替がうまくいきません。参考になるプログラムは
あるでしょうか?ご教授願います。
demuさんありがとうございましたm(_ _)m
接触点は触れている面の頂点数ですね!立方体において接触点1とは斜めに接触したということですよね。
解決できました。ありがとうございます!また何かあったら質問させていただきます。
P.S.
ODE本重宝してます。
ばいさん,
歩行ロボットもロボットアームも有顔ベクトルを計算する式(6.21,6.22, P155)は同じです.ODE本では168ページと170ページに具体的なソースコードを掲載しています.また,ステップ8の4脚ロボットの説明も参考になると思いますよ.
もう少し具体的に質問して頂けると,より詳しい回答ができるかもしれません.
でむ
kokoさん,
初めまして!
ODEは剛体の動力学計算エンジンですから,剛体同士の貫通は考えません.球と平面の接触点数は0か1です.直方体の接触点数は0,1,2,3,4のどれかです.
dCollide()の戻り値が接触点数なので,ジオメトリの種類で場合分けして調べて見ると面白いです.具体的な方法がわからなければコメントください.サンプルプログラムを作っているので公開します.
でむ
先ほどのコメントが途中になってしまってすみません。
まず2足歩行の逆運動学の足先先端位置の姿勢の有顔ベクトルa,bはdBodyGetRotation()とdMultiply0を使って抽出すればよいのですか??
いまodeで二足歩行を行っているのですがどうしても逆運動学を入れた後の歩行がうまくいきません。歩行を行った
出村さん、はじめまして。kokoといいます。初めて質問させていただきます。
ODEの衝突点数についてです。
衝突点数は「接触した物体同士の接触面の頂点数」だと思っているのですが、正しいでしょうか?
例えば接触物体が立方体なら接触面の切り口は「点」か「線」か「三角」か「四角」しかありえないので最大値が4で、また、例えば球体であれば接触面の形は「円」になるので接触点数は多くなるということです。
morikawaさん,
ODEのマニュアルにも全く記述がないので,わかりづらいところですね.私のODE本のサンプルプログラムを作ったときに悩みました.ODE本の増刷時やこのブログの記事にも追加しておきます.
素晴らしいご質問ありがとうございました.また,お願いします.
でむ
でむさん
返信遅れて申し訳ありません。ヒンジジョイントについて質問したmorikawaです。
でむさんのご指摘なさっていた、body1とbody2の順番が問題でした。body1とbody2の関係がよくわかっていませんでした。自分なりの解釈としては、dJointAttachではbody2にモータが埋め込まれていて、回転軸がbody1に固定される。回転軸方向はdJointSetHingeAxisで設定される、という感じになりました。
的確なご指摘、どうもありがとうございました。
fumiさん、
そのようなAPIはないので作るしかありません。
トルクを一定時間出すだけならdJointAddHingeTorque(dJointID joint, dReal torque)を好きな時間(ループ回数x タイムステップ)だけ呼び出せばよいと思います。
また、ある値のトルクを一定時間出し続けるためにはdJointGetFeedback(dJointID joint)を使いトルクを一定に保つようにトルク制御する必要があると考えます。
でむ
でむ
説明不足ですいません
慣性ローターでトルクを一定期間出力というのは
トルクの制御で何秒かの間トルクを出力し続けるということです
H8マイコンのwaitを使ってこの処理何秒継続とかと同じ感じです
morikawaさん、
1番目のケースと2番目のケースの物体aやヒンジジョイントaは同一のものですか?
また、dJointAttach(dJointID joint, dBodyID body1, dBodyID body2)のbody1とbody2の順番を逆にすると回転方向が反対になりますから注意してください。
でむ
fumiさん,
卒研もそろそろ佳境ですね。
さて、慣性ローターでトルクを一定期間出力とはどういう意味でしょうか?
もう少し具体的に教えて頂けませんか?
でむ
質問修正
morikawaです.
先の質問の2-3部分は
「ジョイントbの角度を0」の間違いでした.
コピペして間違えました.すいませんでした.
はじめまして,morikawaと申します.つい最近ODEを始めました.
質問はヒンジジョイントの回転軸に関してです.
物体aの初期位置,初期姿勢と
ヒンジジョイントaのアンカーポイントは固定したままで,
1-1: 物体aと静止環境をヒンジジョイントaで結合
1-2: ヒンジジョイントaの回転軸を(-1,0,0)
1-3: ODE講座29の方法でジョイントaの角度をM_PI/2
にした場合と
2-1: 静止環境と物体bをヒンジジョイントbで結合
2-2: ヒンジジョイントbの回転軸を(0,-1,0)
2-3: ODE講座29の方法でジョイントaの角度をM_PI/2
2-4: 物体bと物体aをヒンジジョイントaで結合
2-5: ヒンジジョイントaの回転軸を(-1,0,0)
2-6: ODE講座29の方法でジョイントaの角度をM_PI/2
とした場合では物体aの回転方向が異なるという現象が発生しました.
1の場合は(-1,0,0)ベクトルを進行方向とした右ねじ回転
2の場合は1の逆回転.
絶対座標で回転軸が決定されるなら,同じ回転なると思うのですが,違うのでしょうか?
以上よろしくお願いします.
はじめまして、卒業研究に使用しているのですが
行き詰まってしまって質問させていただきます
慣性ロータ式の倒立振子をシミュレートしているのですが
トルクを一定時間出力ということができずに困っています
トルクの出力秒数を指定できる方法を教えてもらえませんでしょうか?
グティさん、
この情報だけで原因を探ることは厳しいですね。
ロボットのモデルが悪いことも考えられます。関節とボディの位置関係が物理的にありえない場合はロボットがバラバラになり、吹っ飛びます。または、ロボットのリンク同士が干渉している場合なども考えられます。
ロボットのモデルが正しい場合は、ERPやCFMの値を変更してください。タイムステップを小さくしたり、dWorldQuickStep()をお使いの場合は、反復数を変更したり、dWorldStep()に変更すると改善するかもしれません。
衝突検出計算も関係してきますので、デフォルトではオフになっているOPCODEの新しいバージョンを使ってください。また、dWorldSetContactSurfaceLayer (dWorldID, dReal depth);を設定したりしても有効かもしれません。
最後に、位置制御にバグが潜んでいる可能性もあります。
でむ
おひさしぶりです。以前質問させていただいたグティです(^^)
またひとつお聞きしたいことがあるのですが・・・
私は卒業研究で簡単な二足歩行ロボットをODE上で
作成しています。
大体の形もでき、角度を制御することもできるようになったのですが、
突然ロボットが吹っ飛んでしまいます・・・
どうしたらよいでしょうか?
雑な質問で申し訳ございません(T~T)
初さん、
描画は計算結果を可視化しているだけです。dで始まるAPIは動力学等の計算を担当するODEのもので、dsで始まるAPIは描画を担当するdrawstuffのものです。角度や位置を取得するAPIはODEのAPIなので描画とは関係ありません。
何か問題でもありますか?
でむ
描画をしないと角度や位置の取得はできないのでしょうか?
初さん,
すみませんが,この少ない情報だけでは原因を推定できません.
could not make OpenGL context currentのエラーメッセージは,/ode-0.10.1/drawstuff/src/windows.cppの124,125行目で発生しています.
2番目のエラーはdrawstuff.cppの175行目で発生しています.
この情報を頼りにデバッグされてはいかがでしょうか?
でむ
昨日はご回答ありがとうございました。
また、エラーで詰まってしまいました。以下のようなエラーが出ます。
(エラー文)
“could not make OpenGL context current”
もうひとつが、遺伝子アルゴリズムでループで探索をしていると、
(エラー文)
Can’t open image file ‘..\textures\/sky.ppm’
途中まではループで回っているので、drawstuffのつけ忘れなどではないんです。
原因は何でしょうか?
こんにちは Robert さん.
あなたはrobotですか ? さて,sample15の73,74,85行目を以下のようにコメントアウトしてください.このプログラムでは簡単にするために,衝突する可能性のあるジオメトリのうち,片方が地面の場合だけ衝突検出を行っています.
ロボットアームのシミュレータも同様にするとできます.
//if (isGround)
//{
for (int i = 0; i < n; i++) { contact[i].surface.mode = dContactBounce|dContactSoftERP|dContactSoftCFM; contact[i].surface.bounce = 0.5; // (0.0~1.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)); } //} でむ
Hi~~~Mr Demu:
I am Robot, I am sorry for just got your replay here, now I just use English to write my English, and you can replay me with Japanese.
1.I’m using the simulation provided by you, with two objects in the same interaction (interactive simulation – http://demura.net/wordpress/english/ode15). The problem that I’m having is with collision detection. I have the two objects utilize the collision detection with the floor/ground. However, I cannot simulate / invoke collision detection between these two objects.
2. In the robotic arm simulation, I’m having a difficult time with employing collision detection between the link(s) and the ground and also between the individual links. I tried to employ the ‘nearCallback’ but I’m still having no luck.
Would it be possible to ask for you assistance or some direction in solving this?
Thank you.
でむさん、お返事ありがとうございます。
勉強が足りなくて勘違いしていました。
紹介していただいた本も参考にして今後もシミュレータの作成を続けていこう思います。
また質問させていただくことがあると思いますが、そのときはよろしくお願いします。
takeさん,
ポテンシャル法の場合,引力,斥力をシミュレータで実際に発生させる必要はなく,あくまでロボットの進む方向を計算するために使います.目的地への引力と障害物の斥力の合成ベクトルが進む方向となります.
ポテンシャル法は目的地に進むことと,障害物回避を同じコードで実現できるので最も簡単な方法だと考えます.ただし,パラメータを適切に決めることは簡単ではないかもしれませんし、合成ベクトルが0になる場合はロボットが止まってしまいます。
なお,センサのプログラミングではありませんが,移動ロボットの運動学,逆運動学,経路計画法の本として、中野先生、小森谷先生、米田先生、高橋先生共著の書籍をお勧めします.障害物がある場合の経路計画法について、ポテンシャル法以外の方法も説明しています。
大学院情報理工学〈4〉高知能移動ロボティクス, 講談社サイエンティフィク (2004)
でむ
でむさん、こんにちは。
以前、ODEについて質問させていだだいた者です。
現在、ステアリング型のロボットに障害物回避センサを組み込んだものを作成しようとしていますが、肝心のセンサの作成でつまずいています。
ODE本に書いてあったようにポテンシャル法を使おうと思ったのですが、シミュレータでの引力と斥力の発生のさせ方がいまいちよくわかりません。
ほかにポテンシャル法より簡単な障害物回避に適した方法はあるでしょうか?
また、このようなセンサのプログラミングについて初心者でも理解できる参考書があったら教えていただけないでしょうか。
質問ばかりで申し訳ありません。よろしくお願いします。
初さん,
初さんから頂いたソースコードを私が試したところ特に問題はありませんでした.ボディの位置と関節の位置に矛盾があるとシミュレーションではおかしな挙動になります.そのため,実際のロボットを作るように設計図が必要です.恐らく以前問題があったことは,その設計図とプログラムに矛盾があるためだと思われます.ただし,その間違いを見つけることは,正確な図面がないと設計者以外には難しいです.
ヒューマノイドのモデルを作るのは非常に手間がかかるので必要がなければ「けんせいちゃん」のサンプルプログラムを使ってください.非商用用途なら自由に使ってもらってかまいません.モデルを作ることに時間をかけるよりも歩行制御に時間をかけるほうが実りがあるでしょう.
私は2軸直交,3軸直交を複数個のヒンジジョイントで実装しました.実はユニバーサルジョイントやボールジョイントを試しましたがうまく歩行制御をすることができなかったのでそれ以来使っていません.初さんがうまくできたら是非,教えてくださいね.
でむ
ご回答ありがとうございます。
つまり、ロボットが落下しているのが原因であるから、同じ条件j下の場合、腕よりも先に足をつけることによって最初からロボットを接地させておけば、解決でしょうか?
もうひとつ、疑問なのですが、サンプルプログラムのkensei.cppでは、同じ状況(足をなくして、腕をつける)でしっかりとくっついているのですが、違いは何でしょうか?
初さん,
原因がわかりました.
ODEの関節は摩擦がないため,ロボットが落ちた衝撃が腕に伝わるため振動します.重力加速度を0にするか,加速度を非常に小さな値にすると振動しないことが確認できます.
また,説明して欲しい箇所があれば,ODE講座として追加しますので教えてください.おそらく,ODE本やこのブログに記述が少ない箇所だと思われますので.
でむ
CohCohさん,
ご丁寧なご質問ありがとうございます。
重心を移動するのではなくジオメトリを移動すると簡単に実現できます。重心は物理的な実体を持たないのでお好きな位置に設定し、重心をずらしたい分だけジオメトリをずらしてください。それを実現するAPIはdGeomSetOffsetPositionです。オフセット値は相対座標系の値を入れてください。具体的なコードはODE講座17に書いています。
なお、同じような議論がODEのメーリングリストに載っています。ここをクリックしてください。そちらの方は別の方法も書いています。
ご参考になれば幸いです。
でむ
初さん、
届きました。ちょっと待ってください。
でむ