まず,ここにあるODEのFAQを読んでからコメントお願いします.
このコメントが100件を超えましたので,新規のご質問やご要望はODE質問・要望募集11!にお願いします! ご質問の内容を詳しく説明して頂けると的確に回答できますので,時間を節約できると思います.
また、私のコメントやご自分の努力により問題が解決された場合に、問題の原因がわかれば投稿して頂くと大変助かります。その情報はODEの初心者にとって重要なものです。ある程度たまりましたらFAQに掲 載したいと思いますのでご協力のほどよろしくお願いします。
でむ
コメント
初めて質問致します”きん”と申します。
最近ODEの勉強を始めたのですが、四機のロボットのうち一機をリーダーとし、そのリーダー機に近づき合体するというプログラムを作ろうと考えております。
合体する際にはヒンジジョイントで固定を行っています。
ですが合体二機目まではうまくいくのですが、最後の一機がリーダーに近づき4機が密集した状態になると
dWorldStepの前後で
“動作が停止しました”
というメッセージとともにウィンドウが止まってしまいます。
nearCallback関数の中の
if (b1 && b2 && dAreConnectedExcluding(b1,b2,dJointTypeContact))return;
も部分を消した場合は三機の機体が密集状態になった場合に同じく動作を停止します。
またこの合体プログラムの場合以外にも四機の機体を一か所に密集させた時に同じようにウィンドウの動作が停止してしまいます。
情報が少なく申し訳ありませんが、この原因や対策がありましたら教えて頂けないでしょうか?
よろしくお願いいたします。
きんさん,
はじめまして
衝突検出が問題だと思います.
stackの値を大きくしてみてください.
stackを大きくする方法はmommaさんのページに書かれています.
http://www.eml.ele.cst.nihon-u.ac.jp/~momma/wiki/wiki.cgi/OpenDynamicsEngine/Stack%20Overflow.html
でむ
初めて質問させてもらいます。
自分で車のようなロボットを作って障害物を並べて乗り越えなどをしていたのですが、
直方体や球は衝突するのですが円柱はすり抜けてしまいました。
ちなみにタイヤも円柱を横にしたものでこの円柱同士の時だけすり抜けます。
ロボット本体の直方体には衝突しました。
衝突していたボディIDで直方体から円柱に変えてみたり、ジオメトリだけで障害物を作ってみても同じでした。
情報が少なくて申し訳ありませんが原因や対応策等ありましたらよろしくお願いします。
まささん,
ご質問ありがとうございます.
衝突検出に関する円柱の実装は不完全のようです.
Dan FiserがGJKアルゴリズムをODE用に実装したので,そのパッチをあてると問題が解決するかもしれません.
http://groups.google.com/group/ode-users/
をlibgjkで検索すると関連記事が見つかります.
でむ
お伺いしたいことがあるのですが、物体Aが物体Bに接触したときに物体Bに生じる力を取得するためには
const dReal *f = (const dReal *)dBodyGetForce(物体B);
printf(“fx = %lf fy = %lf fz = %lf\n”, f[0], f[1], f[2]);
このようなプログラムを書いてみたのですが、物体Aが物体Bに衝突しても値が0のままで困っています。
どこか間違えているのでしょうか?アドバイスがあればお願いします。
dBodyGetForce()は拘束力を計算できません.
でむ
以前お世話になりましたくないと申します。
ODEの勉強を再開したところ、行き詰ってしまい質問させていただきたいと思います。
ODE本P183のプチプロ6.4のプログラムを作りたいと思い、サンプルのarm3にODE本P15のプログラムをためしに追加してみたのですが、うまくいきません。
ビルドは通ったのですが、なぜかTargetは変わらないのにCurrent PositionのZ座標が0.10多くなってしまいます。
その上なぜかsimloop関数の衝突検出の一文をはずすと元に戻ります。(ボールはアームに当たっていません)
関係ありそうなところを自分で思いつく限りチェックしましたが、わかりません。
何かわかりましたら、アドバイスをお願いします。
くないさん、
すみませんが、この手のご質問は情報が少なすぎて回答できません。
ソースコードを読めばわかると思いますが…
APIの使い方が分かっているなら一つずつ追ってい行くしかないと思います。
でむ
以前質問した問題なのですが、さまざまなサイトや本を参考にしていろいろ試しているのですが解決しません。
衝突判定の関数が悪さをしていることはわかったのですが・・・
申し訳ありませんがソースコードを見てもらえませんか?
よろしければメールで送りますのでアドレスをお教えください。
念のためこちらのアドレスもメールアドレスの欄に載せておきます。
よろしくお願いします。
くない
ODE本のロール・ピッチ・ヨーの部分(P148~P150)についてご質問します。
R=0°、P=92°、Y=0°の場合、
回転行列は
-0.034899497 0 0.999390827
0 1 0
-0.999390827 0 -0.034899497
となり、
再度RPYを求めると、
R1=180° R2=180°
P1=88° P2=92°
Y1=180° Y2=180°
となってしまいます。
質問1
R=ATAN2(0,-0.034899497)の戻り値は
(X,Yの引数の符号から)0とならず、3.1415・・・・となり、元の値と合いません。
どのように解釈すればよいのでしょうか?
(ODE本のATAN2()は0を期待していますか?)
また、どのように計算すれば元のRPYが算出できますか?
質問2
以前、ご紹介頂いた広瀬先生の書籍(P142,143)ですと
R1=-180 R2=180
P1=-92 P2=92
Y1=180 Y2=360
となります。
ODE本のR1~Y2と合わないのが気になるのですが、
何か理由がありますか?
(この方法でもATAN2の影響で元のRPYが求まっていません。)
質問3
どうしても
R1=180° R2=180°
P1=88° P2=92°
Y1=180° Y2=180°
が同じ姿勢を表す2つR、P、Yに思えません。
私の計算が間違っていますでしょうか?
以上、教えて頂けますでしょうか。
よろしくお願いします。
kaneさん,
素晴らしいご質問ありがとうございました.
2週間も返事がおくれすみません.いろいろ立て込んでいたもので.
さて,回答ですが,ODE本P150の式(6.12), (6.14)は+,-の符号が抜けています.
正確には以下となります.
(6.14) Y=atan2(±r21, ±r11)
(6.15) R=atan2(±r32, ±r33)
今後ともよろしくお願いします.
でむ
いつもお世話になっております。
WindowsVista, VisualC++2010EE, ode-0.11.1です。
gimpact と OPCODE では demo_bascket.exe で異なる挙動です。
デフォルトだとOPCODEですよね。
trimesh を含む場合 gimpact の結果が正解なのでしょうか?
ボディ形状と使い分け、がありましたらご教授をお願いいたします。
skasaiさん、
私はOPCODEしか使っていないのでGIMPACTは良くわかりませんが、メーリングリストの情報ですと、現在のバージョンのODEで使われているOPCODEは以前よりはtrimeshの挙動が改善されたが、GIMPACTの方が良いという報告があります。GIMPACTとOPCODEの定量的な比較については知りません。御本家のメーリングリストに問い合わることをお勧めします。お力になれずすみません。
http://groups.google.com/group/ode-users/browse_thread/thread/59a247f2a5b5cd0/4ede0304d1fc7da6?lnk=gst&q=gimpact++OPCODE#4ede0304d1fc7da6
でむ
先日はありがとうございました。
描画で光の向き(光源の位置)を変えたいのですが、どうしたらよろしいでしょうか?
よつさん、
drawstuffのAPIにはそのような機能はないので、drawstuffのソースコードを変更しコンパイルし直す必要があります。なお、OpenGLで書かれているので、OpenGLを少し勉強する必要があります。
具体的にはdrawstuff.cppの1141行、1142行で光源の位置を設定しています。
でむ
ありがとうございます。
勉強不足で申し訳ありませんが、drawstuff.cppを編集したあと、
どのようにコンパイルにしたらよろしいでしょうか?
開発環境はVisualC++2008Expressです。
ODEのコンパイルと同様です.
でむ
初めまして!
初めてのコメントです。
最近ODEの勉強を始めました。
よろしくお願い致します!
さて、本題ですが
現在、私は
全方位カメラを装備したクローラ型ロボットが不整地を走行するシミュレーションを作成しようと考えております。
そこでいくつか質問があります。
1.ODEで全方位カメラのように360度の範囲の視野を提示するにはどうしたらいいでしょうか?
パノラマ展開、もしくは分割表示でもかまいません。
2.不整地(でこぼこ、傾斜)モデルを作成したいです。
3.クローラ型の車輪の作成。
簡単な答えでいいのでご教授していただきたいです。
もし、似たようなsampleコードがあるのならば教えていただきたいです。
自分の勉強不足かもしれませんが、
すみませんがよろしくお願い致します。
クローラさん,
はじめまして.これからもよろしくお願いします.
さて,
1.ODEは動力学計算エンジンなので全方位カメラのシミュレーションはできません.つまり,付属のグラフィクスライブラリdrawstuffをご自分で書き換えるか,別のグラフィクスライブラリを使う必要があります.
2.heightfieldを使えるので不整地モデルを作成可能です.付属のデモプログラムdemo_heighfield.cppが参考になると思います.
3.クローラー型の車輪を複数の形状プリミティブを使ってモデル化することが考えられます.ただ,試していないのでわかりませんが,真面目にモデルを作ると計算時間に問題があるかもしれません.シミュレーションの用途にもよりますが,モデルを単純化した方が良いかもしれません.私自信,クローラー型車輪を作ったことがないのでよくわかりません.
この程度の回答でよろしいでしょうか?
でむ
でむ様
返信ありがとうございます!!
丁寧な回答、ありがとうございます。
1.ご教授いただいた通り、付属のdrawstuffを自分で書き換えようと考えていますが具体的にどのように書き換えたらいいのでしょうか?
2. demo_heighfield.cppを参考にして進めていきます。
3.一旦はクローラタイヤは単純化して作成していこうと思うます。
度々すいませんが、よろしくお願いします。
クローラ
近々、PCを購入しようと思っていますが、
Windows 7 で、ODEを使用することはできますか?
よつさん、
はいできます。
32bit版のWindows7では動作を確認しています。64bit版は未確認です。
でむ
よかった、ありがとうございます。
念のため、32bitにします。
いつも返信頂きありがとうございます。
返信ボタンが見あたらなかったので、
新たに書かせて頂きます。
現状のirrDrawStuffを組み込みました。
そこで質問なのですが、
irrDrawStuffのサンプルのAモータのプログラムで、
黄色いブロックは透過にすることは可能なのでしょうか?
ロボット先端のツール向きの確認に使っているのですが、
視点を動かさずに、姿勢によって裏に回ったRayを確認したいです。
黄色いブロックの縁だけ分かるとベストなのですが・・・
アドバイス頂けないでしょうか?
よろしくお願いします。
p.s.
irrDrawStuffのバージョンアップの方、是非よろしくお願いします。
Aモータのサンプルでは、
Rayではなく、軸はcapsuleを使われていましたね。
訂正します。
また、ODEにode-0.6/contrib/TerrainAndConeから持ってきたConeを移植して、
三角錐の描画は出来ました。
(TerrainAndCone内のReadmeを見ながら作業しました。)
当面、衝突検出は不要なので事足りたのですが、
irrDrawStuffにもDrawCone()等を追加したく思います。
DrawStuffに行ったような変更で可能ですか?
何か気をつける事はありますか?
以上、アドバイス頂けますでしょうか?
よろしくお願いします。
kaneさん、
返事が遅くなりすみません。
irrDrawStuff(以下iDS)にDrawConeを追加することは可能ですが、衝突検出がODEにないので追加する意義がないのでiDSに追加する予定はありません。なお、irrDrawStuffはOpenGLで書かれたdrawstuffのコードをirrlichtのAPIで書き直しているので、OpenGLで書かれたConeのコードをirrlichtのAPIで書き直す作業が必要です。
形状に関しては無限にあるので、iDSに3次元オブジェクトファイル(3dsなど)を読み込ませる機能を追加する予定です。
でむ
demu様
何度もご回答ありがとうございます。
了解いたしました。
衝突検出不要ですので、
現状のirrDrawStuffへの追加を自分で行ってみます。
“3次元オブジェクトファイル(3dsなど)”等について不勉強で申し訳ないのですが、
irrDrawStuffで対応予定の”3dsなど”はフリーソフトなどで
簡単に作成可能なのでしょうか?
(dxf等のように亜種が多いとDXF形式でも読み込めないことが多いので、確認したいです。)
情報など頂けたらと思います。
度々すいませんが、よろしくお願いします。
kane
kane様
Blenderでできると思います。また、irrDrawStuffはirrlichtを使っているので、Maya (.obj), 3DStudio (.3ds), COLLADA (.dae), Blitz3D (.b3d), Milkshape (.ms3d), Quake 3 levels (.bsp), Quake2 models (.md2), Microsoft DirectX (.X)を読み込み可能です。
詳しくは以下をご覧ください。
http://irrlicht.sourceforge.net/features.html#supportedformats
でむ
質問への回答を頂き、ありがとうございます。
また、質問(2点)なのですが、
1.ODE本でしばしば出てくる
矢印はどのように作成されていますか?
たとえば、ODE本のp59″図3.1 左手系”のような矢印です。
(カプセルで胴体を作りましたが、先端の作り方が良く分かりません。)
2.シュミレーション中に自作のダイアログから設定を変更し、
シュミレーションに反映をやりたいのです。
(例えば、ODE本p15のプログラム1.2、ボールが跳ね返るシミュレーション実行中に
ダイアログからボールの色を変える様なイメージです。)
何か良いサンプルありますか?(VS2008希望)
以上、初歩的ですいませんが
アドバイス頂けますでしょうか。
よろしくお願いします。
kaneさん、
1.ODEの古いバージョンode-0.6/contrib/TerrainAndConeに含まれていたAPIを使いました。最近のバージョンではもう入っていないようです。
2.ODEのドロースタッフはGUIの機能が貧弱で、ダイアログから入力などはできません。そのため、私はirrDrawStuffというライブラリを作り、その問題を解決したいと考えています。具体的にはシミュレーションのどのような項目をダイアログで変更したいでしょうか? なお、今のところサンプルはありません。
でむ
でむ様
ありがとうございます。
毎回、回答頂き本当に感謝しております。
1について、
矢印先端形状は残念です。
最新で作成するとしたらどんな方法が一番楽ですか?
2について
やりたいのは、ロボットアーム先端の目標ポジションを
ダイアログから数値指定させたいです。
また、現在座標や姿勢、各関節角度をプロンプトではなく
ダイアログに表示できればと思っています。
ちなみに、
Odeで作成したexeをodeをインストールしていない環境で
実行したいのですが、何か方法ありますか?
(うまく同様の質問を探せませんでした。すでに同様の回答があったらすいません。)
ついでの様に質問を追加してしまい
申し訳ありませんが、アドバイス頂けますでしょうか。
よろしくお願いします。
kaneさん、
1.形状だけでよければode-0.6のcontribから持ってきてODE全体をコンパイルすれば良いと思いますが、簡単かどうかよくわかりません。衝突検出も必要なら、コーン(矢印形状)を三角メッシュで作成すればよいですが、これも簡単ではありません。つまり、現状のODEでは標準で容易されているジオメトリ以外を使うことは簡単ではありません。この問題を解決するためにirrDrawStuffを作っています。3Dのオブジェクトファイルを読み込み、衝突検出をする部分を実装しています。夏休み中にはできると思います。
2.GUIの部分を御自分で実装するしかないですね。
3.Staticライブラリを使った場合は、exeファイルを持っていくだけで実行できます。Dynamicライブラリを使った場合はdllファイルも必要です。
なお、demura.netの記事は多くなったので、右上の検索窓からキーワードを入れて探してください。
お役に立てれば良かったのですが、残念ながら現状では凝ったことをしようと思うと簡単ではありません。ODEは動力学計算をするライブラリだけなので、描画やGUIに凝ったことをしようとすると他のライブラリを使わねばなりません。
でむ
返信ありがとうございます。
前回の続きなのですが、返信のボタンが見あたらないので新しく質問をあげさせていただきます。
>実行できずにcould not load acceleratorsとエラーが出たプログラムは、ODEのデモプログラム、ODE本のサンプルプログラム、あるいは自作プログラムのうちどちらでしょうか?
自分が使ったプログラムは 簡単!Code::Blocksを使った自作ODE0.11.1プログラムのビルド法 (Windows) に沿って落としたtemplateファイルです。
Code::Blocksを使った自作ODEプログラムのビルド法 (Windows) を試してみたところ、最後のビルドができませんでした。
No such file or directory と表示されてしまいます。
また、コンソールアプリケーションを試してみたのですが、Debug targetがDebugとしか表示されなかったりして設定がうまくいきません。
手段と目的が逆転しそうなのではっきりさせたいのですが、
自分は本のサンプルを元にしたEX課題のプログラム(P.28のmonoBot2)やプチプロの蛇ロボット(P.27)を作って見たいのです。
もし、これらのほかにいい方法があれば教えていただけるとありがたいです。
現在、多忙なため返信が遅くご迷惑をおかけしますが、どうかよろしくお願いします。
今野
くないさん,
No such file or directoryと出るのは,多くの場合指定されてフォルダーにファイルを置いていないからです.ODEのライブラリとヘッダファイルの相対パスでプロジェクトファイルを記述しているのが原因です.
その他にも原因があるかもしれませんが,この情報だけではわかりまねます.他に良い方法としては,ODEのデモプログラムと同じ場所にファイルを置いてビルド関係のファイルpremake4.luaにご自分の作成したファイルを追加すれば可能だと思います.
なかなかお力になれずすみません.
でむ
くないさん、
一番簡単だと考えられる方法の記事を7月26日付demura.netに書きましたので参考にしてください。この方法ならできると思います。
でむ
この間は質問に答えていただいてありがとうございました。
もうひとつ質問なんですが・・・(ジョイントに関する力とトルクについて)
ロボットアームの場合、ジョイントに生じる力の検出はたとえば物がぶつかった衝撃でジョイントが動いてなくてもトルクと力の検出はできるのでしょうか?
何度も質問をしてしまって申し訳ありませんが、よろしければ返答をお願いします。
ashinさん、
できると思います。
固定ジョイントでセンサのモデルを作ったことがありますから。
でむ
はじめまして、くないと申します。
ODEに興味を持ち、本とこのサイト様を参考に挑戦して見たのですがODEのインストールで躓いてしまいました。
このサイト様のODE 0.10 のインストール (MSYS+MinGW)というページに沿ってやってみたのですが、
make CONFIG=DebugDoubleLib を実行したあと、
ディレクトリのlib/DebugDoubleLibが存在せず、拡張子が.exeのファイルも見当たりません。
初心者なので見落としなどあるかも知れませんがどうかご教授ください。
くないさん、
コメントありがとうございます。
最近のODEはMSYS+MinGWをサポートしてないんです。Windows環境でgccを使いたいのであれば、Codeblocksの使用をお勧めします。
または、御自分で頑張ってインストール記事を執筆してください。
その時は、その方法を教えてください。よろしく御願いします。
でむ
返信が遅れてしまい申し訳ありません。
ご返答ありがとうございます。
Codeblocksを試してみたところ、無事にインストールできました。
また、何度もすみませんがまた問題が発生してしまったため質問させて頂きたいと思います。
自作のプログラムを試して見たかったので
簡単!Code::Blocksを使った自作ODE0.11.1プログラムのビルド法 (Windows) に沿って設定をしたところ、.exeが実行できませんでした。
コンパイルは通っていますし何度か試したので手順に間違いは無いと思います。
実行したところ could not load accelerators とエラーが出ました。
windowsXP,ode-0.11.1,codeblocks-10.05を使用しています。
あと、気になったのですがtemplate090616 にtemplate.layoutが入っていませんでした。
どうかご教授ください。
また、自作ファイルができなかったのでcodeblocksで新規プロジェクトを作ろうとしたのですが、
ODEの本のようなプログラムを書きたい場合、どれを選べばよいのでしょうか?
新規プロジェクトを選ぶとさまざまな選択肢が出てきたので自分で調べてみたのですが、どれがどれほど違うのかいまいち分かりません。
お勧めがあったら教えていただけないでしょうか?
くないさん、
実行できずにcould not load acceleratorsとエラーが出たプログラムは、ODEのデモプログラム、ODE本のサンプルプログラム、あるいは自作プログラムのうちどちらでしょうか? このエラーはリソースファイルがうまく設定されていないときに出るものです。プロジェクトファイルがおかしい可能性があります。
簡単!Code::Blocksを使った自作ODE0.11.1プログラムのビルド法 (Windows) に従ってやってみましたが問題ありませんでした。ただ、template.layoutは入っていないので元記事を変更しました。なお、codeblocksで新規プロジェクトを作る方法は、コンソールアプリケーションを選べば良いのですが設定が少々大変です。多少古いですが、自作プログラムのビルド法は以下の記事も参考になると思います。
http://demura.net/9ode/548.html
でむ
【有顔ベクトル→ロール、ピッチ、ヨー導出時の解の特定】
度々すいません。
ODE本の内容について
ご質問させて頂きます。
現在、6自由度ロボットアームのジョイント角度から
ロール、ピッチ、ヨー角を
以下のように導出しようとしております。
①.”6.3 順運動学:関節角度から手先位置と姿勢の求め方”の
“6.3.3 6自由度ロボットアームのステップ3(161ページ)の方法で、
各ジョイント角度から有顔ベクトルを求めます。
②.次に、求めた有顔ベクトルからロール、ピッチ、ヨーを求める為、
“6.1 物体を空間に表示するには”の
“6.1.4 絶対座標系を使うロール、ピッチ、ヨー角”(148~150ページ)
を参考に求めています。
ここで疑問なのですが、
②の結果、ロール、ピッチ、ヨー角が2組出ると思います。
数式として2組出る事は理解できるのですが、
どちらの組を選択するかの判断をどのようにすれば良いのか分かりません。
(計算からどちらの解を取ればよいか判断したいです。)
有顔ベクトルで一意に姿勢が決まっているので、
どちらのロール、ピッチ、ヨー角を選択すればよいのか
判断可能と思うのですが・・・
単純な事かもしれませんが
教えて頂けませんでしょうか?
よろしくお願いします。
kaneさん、
御質問頂きありがとうございます。
どの解を選べば良いかはロボットの可動域制限やロボットの姿勢によります。
何らかの評価基準をお決めになって選択されれば良いと思います(この議論はODE本の範囲外)。
最低でもロボットの運動中に突然姿勢が変わる解を選んではいけません。
現実的にはシミュレータで動作を確認して、選択した解で問題ないか確認すればよいと思います。
でむ
demu様
ご回答ありがとうございます。
また、本ページの下方の質問(6軸アームでθ5=0の時のθ4とθ6の関係)にも
ご回答頂きありがとうございます。
(下方の回答頂いた欄に”返信”ボタンが見あたりませんでしたので、
ここでお礼をさせて頂きます。)
さて、ご回答の中の”評価基準による解の選択”については、
おっしゃる通りだと思います。
ただ、疑問なのが
例えば、ODE本の(6.11)式
でCpが±符号となっています。
Cpが+符号を取るのか、-符号を取るのかは
変換前の回転行列(や有顔ベクトル)が分かっている場合は
判断できるのではないか?
(特に有顔ベクトルは空間上の一意の姿勢なので、
計算からCpが+か-か判断が可能と思うのですが・・・)
という点です。
また、
例えばODE本の(6.7)式から
r31 = -sin(P)
の関係が分かるので、
P = asin(-r31)
としてPを算出するのは問題あるのでしょうか?
もしくは、
ODE本の(6.12)式を使って出した2種類のPと
上記で算出したPから
本来取るべきPを判断する事は出来ないのでしょうか?
以上、長くなり申し訳ございませんが、
ご意見を頂けないでしょうか。
よろしくお願いします。
Kaneさん、
ODE本の(6.11)式は回転行列とロール・ピッチ・ヨー角の関係から求めており、計算すると解が2とおりでてきます。つまり、同じ回転行列(姿勢)になるロール・ピッチ・ヨー角が2通りあるということです。
なお、r31=-sin(P)だけから計算すると解が1とおりしかでないので、もう一つの解が求まりません。
この件のもう少し詳しい説明は広瀬先生の教科書ロボット工学P141からP142にあります。
でむ
別件で教えて頂けますでしょうか?
ODE本に6軸自由度ロボットアームの画面が何個か見受けました。
掲載のある”6軸自由度ロボットアーム”のサンプルはダウンロード可能なのでしょうか?
(見落としていましたら申し訳ございません。)
以上、教えて頂けますでしょうか。
よろしくお願いします。
すみません。
サンプルはダウンロードできるようにしていません。
でむ
ご回答ありがとうございます。
了解いたしました。
もし、ご計画が変わりましたら
(ダウンロード可能になりしたら)うれしいです。
どうぞ、ご検討下さい。
demura様
私はdemura様が書かれた「ロボットシミュレーション 森北出版」を読んで学習している者です.
今,前述本のP.171 図6.18,19を参考に二自由度ロボットアームの逆運動学をシミュレーションしようと取り組んでいるのですが,図6.19でいうθ1が動いていないと思われます.
ヒンジジョイントを用いて地面とリンク0をつなぎそのヒンジを動かしたいのですが動きません.
アドバイスをお願いいたします.
-sunlight-
以下 組んでみた初期設定とジョイント設定及び角度指示を記述します.
//初期設定//
NUM 2
dMass mass;
dMatrix3 R;
dRFromAxisAndAngle(R,1,0,0,M_PI/2);
dReal x[NUM]={0.0, 0.0};
dReal y[NUM]={0.5, 1.5};
dReal z[NUM]={0.0, 0.0};
dReal length[NUM]={1, 1};
dReal weight[NUM]={0.30, 0.25};
dReal r[NUM]={0.04, 0.04};
dReal c_x[NUM]={0.00, 0.00};
dReal c_y[NUM]={0.00, 1};
dReal c_z[NUM]={0.0, 0.0};
dReal axis_x[NUM]={0, 0};
dReal axis_y[NUM]={0, 0};
dReal axis_z[NUM]={1, 1};
for (int i = 0; i < NUM; i++){
rlink[i].body =dBodyCreate(world);
dBodySetPosition(rlink[i].body, x[i], y[i], z[i]);
dBodySetRotation(rlink[i].body,R);
dMassSetZero(&mass);
dMassSetCapsuleTotal(&mass, weight[i], 3, r[i], length[i]);
dBodySetMass(rlink[i].body, &mass);
rlink[i].geom = dCreateCapsule(space, r[i], length[i]);
dGeomSetBody(rlink[i].geom, rlink[i].body);
}
//ジョイント設定//
joint[0] = dJointCreateHinge(world,0);
dJointAttach(joint[0], 0,rlink[0].body);
dJointSetHingeAnchor(joint[0],0,0,0);
dJointSetHingeAxis(joint[0],0,0,1);
joint[1] =dJointCreateHinge(world,0);
dJointAttach(joint[1],rlink[0].body,rlink[1].body);
dJointSetHingeAnchor(joint[1],0,1,0);
dJointSetHingeAxis(joint[1],0,0,1);
}
//角度指示//
case 1:
THETA[1] = M_PI – beta;
THETA[0] = M_PI/2 -phi -alpha; break;
sunlightさん、
すみませんが、ロボカップが終わり雑用が溜まっていて、このようなソースを解読して悪いところを御指摘するような御質問に回答する余裕がありません。
逆運動学のサンプルプログラムは動くので、それと比較してデバッグして頂けないでしょうか。
でむ
ODE本を購入しさせていただきました。
本の内容で質問があります。
“6.5.36自由度ロボットアームの逆運動学”
のθ4~θ6を導出する部分(P178~P179)ですが、
θ5が0°の場合、S5が0となってしまいます。
その場合でも、az’の値からθ5は求まると思いますが、
θ4,θ6はどのように導出すべきなのでしょうか?
現在、運動学計算の結果を逆運動学に入れ、
逆運動学の計算を確認しております。
(0,0,0,0,0,0)を入れ時の運動学計算結果から
逆運動学を使っての計算を確認しております。
上記の部分でつまずいております。
対象方法などあれば教えて頂けませんでしょうか?
よろしくお願いします。
kaneさん、
コメントをこちらに移動させて頂きました。
さて、ODE本を御購入頂きありがとうございます。
御質問ですが、θ5が0の場合、θ4に関しては(6.97)式、θ6に関しては(6.103)式から0となります。
御回答になったでしょうか?
でむ
demu様
ご回答ありがとうございます。
また、質問する場所が適切でなかったようで、申し訳ございません。
θ5=0の場合、ax’,ay’ともに0となり、atan2(ay’,ax’)がエラーになってしまうと思います。
θ5=0と分かっていれば良いのですが、与えられた先端位置とロール、ピッチ、ヨーから
計算する場合は、”ax’,ay’ともに0”でありaz’=1であればθ5=0とし、
bx’やby’,bz’からθ4,θ6を導出すればよいのでしょうか?
θ4=20°、θ5=0°、θ6=40°の状態を状態Aとしたとき、
状態Aの先端位置とロール、ピッチ、ヨーから各θを求めようとすると、
θ5=0だとθ4+θ6=60とまでしか算出できないように思えます。
実際のロボットアームを制御する場合、状態Aの姿勢になったときは、
どのようにθ4、θ6を決めているのでしょうか?
(直前のθ4、θ6角度pre_θ4、pre_θ6とすると、
add = ((θ4+θ6)-(pre_θ4+pre_θ6))/2
θ4=pre_θ4+add、θ6=pre_θ6+add
の様に考えるのでしょうか?
細かい内容で申し訳ございませんが、教えて頂けますでしょうか。
よろしくお願いします。
Kaneさん、
素晴らしい御質問ありがとうございます。
atan2(0,0)は0になります。
逆運動学の計算なので角度が先に与えられることはありません。手先位置とその姿勢(ODE本では有顔ベクトル)が与えられます。
例えば、θ1からθ6が0のとき、つまり基準姿勢を逆運動学で計算する場合、リンク長の長さに見合った位置と有顔ベクトルa=(0,0,1), b=(1,0,0)を代入して計算すると、θ1からθ6が0となって求められます。
御指摘のとおり、θ5が0の場合は、広瀬先生の著書ロボット工学のP140、図8.2にあるオイラー角を示す3自由度関節機構になり、θ4とθ6が同じ軸の回転となるため、解が一意にきまりません。
御回答になっているでしょうか。
でむ
初書き込みです
質問なんですが、ロボットアームの各関節に生じるトルクを取得したいのですが、サンプル13にサンプル11のプログラムを組み込んであげればいいんでしょうか?初心者なのでバカな質問かもしれませんが、よろしければ教えてください
ashinさん、
コメントありがとうございます。そうです。ODE本ではP226に関節にかかるトルクを取得する dJointSetFeedback()とdJointGetFeedback()の説明があります。ODEではパフォーマンスを向上させるために、トルクを取得したいt関節をdJointSetFeedback()で指定しする必要があります。トルクの情報が必要なシミュレーションがすべてではありませんから。
でむ
ご返答ありがとうございました。
なんとか自分の中で解決のめどが立ちました。
はじめまして
他の方の質問に便乗させていただくようで,恐縮ですがよろしくお願いします.
関節に生じるトルクの向きに関してです.
ODE本 P227 のサンプルプログラム9.1内で下記のように説明がありますが,
tx[i] = fb->t1[0]; //トルクx軸まわり
このx軸とはどの座標系で見たx軸なのでしょうか?
また,こちらの質問が本命なのですが,
関節をヒンジにした場合に”回転軸まわり”に生じるトルクはどのように計測したらよろしいのでしょうか?
よろしくお願いいたします
ともさん、
はじめまして。
絶対座標系です。
ODE本227ページのプログラム9.1の61行目dJointSetFeedback()の1番目の引数をヒンジジョイントに設定すればOKです。トルクの取得は20から22行目となります。
でむ
ご回答ありがとうございます.
先の質問が抽象的過ぎたため回答も基本的なことになってしまっているようなので,もう少し詳しくお聞きしたいのですがよろしいでしょうか?
大きな目的としては,3自由度ロボットアームが指定された手先位置を達成し,その姿勢を維持しているときに各関節に配置してあるモータ(= ヒンジジョイント)がどれだけのトルクを出力しているかを知りたいです.
>dJointSetFeedback()の1番目の引数をヒンジジョイントに設定すればOKです。
>トルクの取得は20から22行目となります。
上記の方法ですと,回転軸と直交する軸まわりのトルクも含まれてしまいますよね?
実際には,出力できない向きのトルクも計測してしまっているように思われます.
どうすれば,1自由度ヒンジジョイントの回転軸まわりに生じているトルクだけを計測することができるでしょうか?
質問させていただいた内容が理解できない,などありましたらコメント頂ければと思います.
お手数でなければ,直接メールでやりとりできたらうれしいのですが…
よろしくお願いいたします.
ともさん,
dBodyVectorFromWorld()で絶対座標系から相対座標系に変換してはいかがでしょうか?
本サイトのODE講座30(http://demura.net/9ode/3153.html)に関連記事があります.
でむ
こんにちは.HP,ODE本,参考にさせて頂いております.
私は,ロボットが平地,階段を歩行するシミュレータを作成しています.
現在,ロボット,階段ボディの作成を完了し,階段上を歩かせようとしているのですが,
ロボット足が階段に接触した瞬間にexeファイルが停止する問題が発生しています.
原因がわからず,衝突設定のパラメータを調整すると,摩擦設定をoff(contact[i].surface.mode から dContactApprox1を消した)場合,接触しても停止しませんでした.
しかし,摩擦を設定した上で歩行させたいと考えてます.
exeファイルが停止しない方法はありますでしょうか.
よろしくお願いします.
さがやまさん、
約3か月ぶりのご質問ありがとうございます。
エラーメッセージは何もないでしょうか?
なお、
dContactApprox1はマニュアルによると次のようになっています。
Use the friction pyramid approximation for friction direction 1. If this is not specified then the constant-force-limit approximation is used (and mu is a force limit).
dContactApprox1を消すとconstant-force-limitとなり、クーロンの摩擦法則に従いません。この場合は質量に関係なく、muが以上の力が加わるとすべり出します。つまり、物理的には不正確なモデルですが摩擦は設定されていることにはなります。
でむ
早々に回答していただき,ありがとうございます.
昨日から試行錯誤して,とりあえずexeファイルを起動することができました.
エラーメッセージですが,
exeファイル起動中に「動作を停止しました」と書かれたウィンドウが出てきて,
そこに「問題のイベント名:APPCRASH」と書かれています.
ネット上に解決法があるようなので,ODE上で修正不可な場合,行おうと思います.
あと,申し訳ないのですが,質問内容に間違いありました.
dContactApprox1を消すのではなくて,muの設定をコメントアウトした時,うまく起動しました.
問題の原因はmuのようです.muに値を入力したら上記の問題が発生します.
何を変更してexeファイルが起動したかですが,
接触点数(現状N=10)を減らすか,シミュレーションステップ(現状0.001)をさらに細かくすると,
muに値を入力してもexeファイルが起動しました.
対応ありがとうございました.
こんにちは、いつも参考にさせて頂いています。私はODEを利用してゲームを作成しています。今回どうしても分からない問題があったので投稿させてもらいました。
TriMeshについて早速質問なのですが、グローバル変数で作成した頂点データなどをdGeomTriMeshDataBuildDouble関数の引数に渡してやると、うまく当たり判定を行ってくれるのですが、変数をC++言語でメンバ変数化し、それをdGeomTriMeshDataBuildDouble関数に渡してやると当たり判定のdCollide関数でエラーがでてしまいます。
dGeomTriMeshDataBuildDouble仕様の関係でメンバ変数を引数に渡してやることは不可能なのでしょうか?
C++の問題で質問違いかもしれませんが、よろしくお願いします。
はじめまして。
ODEの内部構造を知りたいのですが、ODE内ではシミュレーションを行う際に(ステップが進んでいる間に)どのような計算が行われているのでしょうか?
お時間ありましたらよろしくお願いいたします
物体数(球)を10000個作成し、プログラムを実行(もしくは物体同士が衝突)した瞬間に
以下のようなエラーが発生します。
「*****.exe の 0x101605a7 (ode_doubled.dll) でハンドルされていない例外が発生しました: 0xC00000FD: Stack overflow」
スタックのサイズの設定を0→1000000000 に設定することで、物体数1000個くらいまでは、エアーが出なくなりましたが、これ以上、物体数を増やす方法はあるでしょうか?
こんにちは、少し教えてもらいたいことがあります。
今私はOpenGLとODEの明確な違いはなんでしょう??
なるべく詳しく教えてくれると助かります。
いつもお世話になっています、melです。
あらためまして、質問があります。
他の方の質問でもありましたが、自分もODEの状態の保存をして、特定の状態になったときに、その保存データから再スタートしたいと思ってプログラムを作っています。
ジョイントはありますが位置情報だけ分かれば問題ないので、物体の位置、物体の向き、関節の位置の3つを保存して読み込むことで、保存データから再スタートさせることができるのではないかと考えています。
自分のプログラムは物体が多いため、下のようなプログラムで一気に情報を保存しようとしたのですが『定数式が必要です』『サイズが 0 の配列を割り当てまたは宣言しようとしました』『’const dReal *’ から ‘const dReal *[]’ に変換できません』などのエラーが出てしまいます。どのように書けばエラーを出さずにすむのでしょうか?
for(i=0; i<=26; i++) {
const dReal *bp[i] = dBodyGetPosition(body[i]);
}
こんにちは
基本的な質問で申し訳ないのですがよろしくお願いします。
また、過去に同じような質問があったらすみません。
作成したプログラムをビルドすると以下のようなエラーになります。
「fatal error C1083: include ファイルを開けません。’texturepath.h’: No such file or directory」
また、他のパソコンで作成したプログラムは実行できるのですが、円柱の端面が設定した色にかかわらず黒くなってしまいます。
他のパソコンで作成したプログラムでも、このパソコンで編集すると上記のエラーが出て実行できなくなってしまいます。
最初の設定で何かが間違っているのでしょうか?教えてください。
よろしくお願いします。
こんにちは、こちらのサイトと本を見ながらODEの勉強をしているのですが、アームのプログラムでx軸にリンクを沿わせるにはどう設定すればいいのでしょうか?
いろいろやってみたのですが重心など変えてもリンクが縦方向のまま移動しているだけでつながっていなかったりという風になってしまいます。
また初期姿勢を変える方法もやってみたのですがどうも姿勢も変わりません・・・この場合はどの物体に姿勢設定のAPIをいれればいいのでしょうか?
初歩的な質問ですがよろしくお願いします。
こんにちは,以前にお世話になったAHです.
早速質問ですが,
ビルドは問題なくいけたのですが,その後
ODE INTERNAL ERROR 2
Bad argument(s) in dBodyGetRotation()
のエラーが解決できません.
何かアドバイスがあればお願いいたします.
要望募集9で質問させていただいた摩擦モデルの問題ですが,trqやomegaの初期化をわすれていたのが原因でした。初期化を行ったところ,きちんと摩擦が働いてくれました。
返事がおくれて申し訳ございません。質問にお答えいただきありがとうございました。
いつもありがとうございます。
また質問があるのでよろしくお願いします。
前方に跳躍する2脚ロボットを作り、その跳躍した距離と高さを測り、データを取りたいのですが、どうすればいいのでしょうか?
位置センサをボディに実装して跳躍前の位置と跳躍後の位置を知ることができるようなもの、もしくは、ステップごとに位置を取得できるようなものをイメージしているのですが可能でしょうか?
よろしくお願いします。
以前はこちらのプログラムミスで質問をしてしまいご迷惑をおかけしました.また,質問があるのですがよろしくお願いします.
物体の回転角度についてですが,ODE本では回転行列からpitch角を求める際に
pitch = atan2(-r31, sqrt(r32*r32+r33*r33));
で求めていますが,cosの値が2乗により符号情報がなくなってしまうためatan2の値が-pi/2~pi/2の範囲になってしまい困っています.
回転行列から-pi~piの範囲で求める方法はありますか?
世界軸周りでの2物体間の角度差を求めたいのですがほかに方法があればご教授願います.
あらためまして、質問があります。
ヒンジジョイントを用いて2脚ロボットを製作しています。
ヒンジジョイントの力制御なんですが、膝関節に力を加えて膝を曲げていき、力を一気に解放することで前方に跳躍させたいのですが、どうしたらいいでしょうか?
いつもお世話になっていますが、今回もよろしくお願いします。
こんにちは、以前お世話になりましたチップと申します。
早速質問なのですが、
ODEの状態の保存をして、一旦プログラムを終了した後でも、その保存データから再スタートしたいと思ってプログラムを作っています。
ジョイントが無い状態であれば、位置、移動速度、回転速度、向きを保存して読み込むことで、保存データから再スタートさせることができました。
ジョイントがあるとき、位置、角度、中心位置、速度を保存し、読み込んでいます。しかし、速度だけはdJointSetHingeParamでやっているので完全な再現になっていないせいか、完全に同じ状態にはならないようなのです。
これはどうにかなる問題なのでしょうか。
よろしくお願いします。