コメント総数が50件を超えたので,コメントを頂ける場合は最新のODE質問・要望募集○!にコメントください.
ODE(Open Dynamics Engine)本出版の話が決まり、急ピッチでその原稿を書き上げる作業と卒研の指導がまさに佳境に入っているため更新が遅くなりすみません。ODE本では初心者のユーザを対象に、わかりずらいところを説明したいので是非このウェブに質問や要望があれば投稿してください。2月は師走よりもより忙しいのですぐにご返答できないかもしれません。また、スパムコメント防止のためコメントを投稿いただいてもすぐには表示されません。 ご了承ください。
どあほさんから頂いた質問が良かったのでここで紹介します。
「 はじめまして。ODEについて最近勉強を始めたものです。
このホームページをいつも大変参考にさせていただいております。
姿勢についてですが、ジョイントでつながれた物体の初期姿勢を変換するにはどのようにすればよいでしょうか。
また、ウインドウにメッセージ(テキスト)を表示させるにはどのようにすればよいのでしょうか。
教えていただけませんでしょうか。」
さて、第1問目のご質問ですが、2つの方法が考えられます。
A ジョイントでつながれた物体の初期姿勢を変換する方法
1.軌道を計算、逆運動学を解き、物体のジョイントなどを制御してその位置と姿勢にする。これができれば何の苦労もしませんね
2.物体を構成している全てのボディに、設定したい姿勢と位置をdBodySetRotation()とdBodySetPosition()を使って指定する。この関数を作ったらキーボードからの入力を受けるcommand関数(ODEのテストプラグラムtest_buggy.cpp参照)の中に入れて置くとよいでしょう。キーを入力すると物体が指定した位置と姿勢になります。
B ウインドウにテキストを表示する方法
cygwinを使う場合の回答です。cygwinのターミナルで以下のコマンドを入力し、X Windowシステムを起動します。
startx &
そうするとXのターミナルが開くので、その上で実行したいオブジェクトファイルを起動してください。
以上です。
コメント
ひろさん demura.netへようこそ!
dBodyGetPositionで計算された位置(x,y,z)の値は配列に格納されます.dBodyGetPositionの戻り値はconst dReal *,つまりその配列へのポインタとなっています.
各要素の取り出し方は以下のコードを参考にしてください.
dBodyID body;
dReal x, y, z;
const dReal *pos = dBodyGetPositon(body);
x = pos[0]; // または x = *(pos +0);
y = pos[1]; // y = *(pos + 1);
z = pos[2]; // z = *(pos + 2);
printf(“重心の位置はx=%f y=%f z=%f \n”, x , y, z);
以上です.
はじめまして.こんにちは.いつも,参考にさせていただいてます.
いきなりですが質問させてください.
位置に対してP制御をかけることはできるのでしょうか?
目標位置(x,y,z)に対して
現在の位置をdBodyGetPositionで取得して差分を取りたいのですが...
dBodyGetPositionの中身(行列?ベクトル?)がわからないので詰まってしまいました.助けてくださ~い!
ぽったーさんの暖かいコメントありがとうございます。
励みになります。また、わからないところがあったらコメントください。
ちなみに、私はmakeを猿の絵がかわいい?オライリージャパンのGNU Makeで勉強しました。
ぽったーです.
でむさん,アドバイスありがとうございます.
無事armがコンパイルでき,すいすい動いています.
正直,makefileのことって分からないことが多いんですよね.
(それじゃあ,プログラムを書いてもコンパイルできないから,根本的にまずいんですが...)
ODEも,でむさんのサンプルファイルと出会ってなかったら手を出していたかどうか...
第2回のロボコンマガジンが楽しみにしてますよ.
アドバイス,ありがとうございました.
また分からないことがでてきたら,お願いします.
ポッターさん
ロボコンマガジンご愛読ありがとうございました.1回目は概要とインストールだけでしたが,次回は凝ったサンプルプログラムを掲載しますので楽しみにしてください.
さて,ODE講座では開発環境としてcygwinを使っていましたが,ODE-0.6ではcygwinを使ってテストプログラムをコンパイルできないのでmingwを使っています.
つまり,mingwを使う場合は以下のmingw用のmakefileを使ってください.
ただし,TARGETのところはプログラム毎に変更する必要があります.例えばsample.cをコンパイルする場合はbunnyではなくsampleに変更してください.
#mingw用 make file
CC = g++ -Wall -fno-exceptions -fno-rtti -g -DWIN32
TARGET = bunny
OBJS = $(TARGET).o
SOURCE = $(TARGET).c
HEADER =
WINDRES = windres
LIBS = -L../../drawstuff/src -L/usr/X11R6/lib -L/usr/local/lib -L/usr/lib/w32api/lib
INDS = -I. -I../../include -I/usr/X11R6/include -I/usr/include -I/usr/include/w32api/include
OPTS = -lode -ldrawstuff -lstdc++ -lcomctl32 -lkernel32 -luser32 -lgdi32 -lopengl32 -lglu32 -lwinmm -lm
#windows specification rule
RESOURCE_FILE= resources.o
$(TARGET):$(OBJS) $(RESOURCE_FILE) $(HEADER)
$(CC) -mwindows -o $@ $(OBJS) $(LIBS) $(INDS) $(OPTS) $(RESOURCE_FILE)
$(OBJS): $(SOURCE) $(HEADER)
$(CC) -c $(SOURCE) $(LIBS) $(INDS)
$(RESOURCE_FILE): ../../drawstuff/src/resources.rc ../../drawstuff/src/resource.h
$(WINDRES) $< -O coff $@
clean:
rm $(TARGET) $(OBJS) $(RESOURCE_FILE) *.*~ *~ *.exe *.*.stackdump
おひさしぶりです,でむさん.
ロボコンマガジン読みましたよ!
さっそくODE-0.6にトライして,テストプログラムの起動までは確認できました.
でむさんのサンプルプログラム(arm)を試そうとしたらコンパイルができませんでした.
ディレクトリの位置が悪いのかと思い,色々場所を変えて試しましたがうまくいきません.
アドバイスお願いします.
熱中症には気をつけてくださいね
たこやきさん
今日から夏季休暇に入りました。炎天下の中、テニスをして頭がクラクラしました。
さて、指と物体のジオメトリが同じスペースに属していれば、dSpaceCollideとdSpaceCollide2は全く同じです(同じ関数を呼び出してます)。ですからdSpaceCollide2を試す必要はありません。
ODE0.5をお使いの場合は0.6にバージョンアップされると改善するかもしれません。
でむさん
物体のマニピュレーションを行うシミュレーションですが,指と物体間の接触がdSpaceCollideでうまくいかなかったもので,dSpaceCollide2の方が適してるのかなと思った次第です.
たこやきさん
dSpaceCollide2の使い方のご質問ですが、さしつかえなければどのような場面で使用したいか教えてください。
dSpaceCollideではなく、dSpaceCollide2を使用する状況を知りたいのです。
またまた質問です。
dSpaceCollide2の使い方がよくわかりません。
サンプルプログラムでもあまり見受けられないので。
サンプルプログラムなどでどのように
使うのか教えていただければ幸いです。低レベルの質問ですいません。
でむさん,解答していただきありがとうございます.今後も,ODEで詰まったら質問させていただくと思うのでよろしくお願いします.
たこやきさん いつも見てくださりありがとうございます。
1.姿勢角について
dRFromEulerAnglesの角は固定角ではないかとのご質問ですが、Z-Y-Xオイラー角です。Z-Y-Xオイラー角についてはCraig(三浦、山下訳、共立出版)のロボティクスP45に記述があるので参考にしてください。なお、このAPIはZ-Y-Xオイラー角から回転行列を求めるものです。ode/ode/src/ratation.cppにdRFromEulerAnglesのコードがあるので、それを見るとZ-Y-Xオイラー角から回転行列を求める式になっていることがわかります。
2. LCP internal errorについて
行列が特異行列になっているなどLCPを解けない場合にこのエラーがでます。制約が矛盾していたり、冗長な場合に行列が特異になるので、関節や接触点の数を減らせば防げる可能性が高いです。
また、計算精度も関係があるのでODEの設定が単精度なら倍精度に変更すると改善するかもしれません。
さらに、CFMの値を増加させると改善する場合が多いです。
以上です。
でむさん,はじめまして.この4月からODEを勉強し始めたものです.このサイトは,研究の参考になるのでいつも興味深く,拝見させてもらっています.
さっそく質問です.
1.姿勢角の設定について
dRFromEulerAngles(dMatirix3R ,dReal phi,dReal theta,dReal psi);
で定義される姿勢角は,関数名に反して,オイラー角ではなく,固定角なのではないか?という疑問.実験してみたところ,基準座標系での回転になっていたんで.
いわゆる”回転座標系”での姿勢角はどのように表現したらいいんでしょうか?
2.エラーメッセージ
物体間の接触シミュレーションを行うとき,以下のようなエラーメッセージが出てうまくシミュレーションができません.解決策があればご教示お願いします.
ODE Message 3: LCP internal error, s <= 0 (s=0.0000e+000)
はじめまして。卒研で4月よりODEを勉強し始めた者です。
さっそく質問なんですが、物体間の接触シミュレーションを行う際、以下のようなエラーメッセージが出てうまくできません。物体がふっ飛んだり。。。どのように解決すればいいのでしょうか?
ODE Message 3: LCP internal error, s <= 0 (s=-0.0000e+00)
でむさんはじめまして。
halitiといいます。
このページのおかげでODEの基本的な使い方が分かり、大変助かっております。
さっそく質問なのですが、私はODEを使って力制御のシミュレーションをしたいと
考えているのですが、接触力や圧力などの情報を取得するコマンドがどうも見当
たりません(マニュアルに)。ただ見落としているだけでしょうか?
力情報の取得や、何かそれに準じる方法があれば教えていただきたいです。
よろしくお願いします。
うえの さん
おひさしぶりです。
衝突検出に関してはODE講座15で説明しますのでそれをご覧ください。
お久しぶりです!
私の環境だと、
test_moving_trimesh.cppでトライメッシュによる
うさぎを落下させた時、地面を通過してしまいますが
これでおかしくないのでしょうか?
他の基本クラス(ボックスや、球など)を
落とした後地面に転がってる基本クラスに
うさぎを落とすとしっかり衝突した挙動を
見せますが、地面の場合は通り抜けてしまいます。
このとき、test_trimesh_moving.cpp内の
基本クラスと地面の違いは何でしょうか?
(見たところ、地面がGeometryのみで
基本クラスはGeometry+Bodyという
違いしかわかりませんでした。)
前回御指摘いただいた、
・トライメッシュにボディーをつける
・衝突点の最大数は大きくする。(200にしました)
という所は直してみました。
やろうとしていることは、基本クラス(ボックス)
上で
トライメッシュクラスの物体の衝突認識です。
以上、相当初歩的な質問ですがよろしく御願いします。
AKさん 質問ありがとうございます.
さて,1番目のご質問に関してはODE講座14にサンプルプログラムを作り回答いたしました.私も重心を移動した経験がなかったのでサンプルプログラムは試行錯誤を重ねてつくりました.問題があれば教えてください.
2番目のご質問に関してはどちらも同じものです.質量パラメータには慣性テンソルもあるので単なる質点というわけではありません.
参考までにソースコードを以下に示します.
void dMassSetBox (dMass *m, dReal density,
dReal lx, dReal ly, dReal lz)
{
dMassSetBoxTotal (m, lx*ly*lz*density, lx, ly, lz);
}
void dMassSetBoxTotal (dMass *m, dReal total_mass,
dReal lx, dReal ly, dReal lz)
{
dMassSetZero (m);
m->mass = total_mass;
m->_I(0,0) = total_mass/REAL(12.0) * (ly*ly + lz*lz);
m->_I(1,1) = total_mass/REAL(12.0) * (lx*lx + lz*lz);
m->_I(2,2) = total_mass/REAL(12.0) * (lx*lx + ly*ly);
}
参考になればハッピーです.
はじめまして,でむ様.
このサイトを参考にODEの勉強をさせて頂いております。
早速で恐縮なのですが、いくつか分からないことがあるので質問させてください。
1.boxやsphere等の物体の重心を
dBodySetPosition ()
で指定した座標から移動させる為に
dMassTranslate (dMass *, dReal x, dReal y, dReal z);
をmain文の中で使用したのですが,重心が移動してくれません.一応
dBodyGetMass ()
を用いて重心の情報を調べたところ,ここから得られた値の上ではTranslateしたところに重心が移動しているようなのですが,怪しかったので,
dBodyGetPosition ()
で指定した座標(linkフレームの原点)に並進力を加えたところ,力を加えた方向に物体が平行移動してしまいました(重心を移動させているので回転するはずなんですけど).
dMassTranslate ()
を使って重心を移動させるにはどうしたら良いのでしょうか?(ひょっとして使用する為の条件みたいなものがあるのでしょうか?)
2.Box等を設定する際に以下の
dMassSetBox (dMass *, dReal density, dReal lx, dReal ly, dReal lz);
dMassSetBoxTotal (dMass *, dReal total_mass, dReal lx, dReal ly, dReal lz);
を用いると思うのですが,dMassSetBox()の方はdensityを,dMassSetBoxTotal()はtotal_massを設定するという点でこの2つは異なっていますが,これはdMassSetBox()の方は質量が分布しているものとして考え,dMassSetBoxTotal()の方は指定した座標に質点(物体を質点として考える?)があるという考え方で宜しいのでしょうか?
長くなって申し訳ございません.
お忙しいとは思いますが,お答え頂けたら幸いです.宜しくお願い致します.
コーエイさん,
ご質問ありがとうございます.
さて,ODEでは関節に角度を直接指定するAPIはないと思います.御自分でPD制御などをして角度を制御してください.
また,AMotorは次のステップで角速度を指定どおりにします.単独で使用するのではなく,他のジョイントと組み合わせて使用します.例えば,2つのボディをボールジョイントで結合し,そこにAMotorを付けたい場合,その2つのボディをボールジョイントで結合してから,その同じ2つのボディをAMotorで結合します.ODEのテストプログラムtest_joints.cppのソースを参考にするとできると思います.
以下は例です.そのうち連載にアップします.
// make and set a ball joint
joint = dJointCreateBall(world,0);
dJointAttach(joint,body[0],body[1]);
jointSetBallAnchor(joint,anchor_x,anchor_y,anchor_z);
// make and set a AMotor
motor = dJointCreateAMotor(world,0);
dJointAttach(motor,body[0],body[1]);
dJointSetAMotorNumAxes(motor,3);
dJointSetAMotorAxis(motor,0,1,0,0,1);
dJointSetAMotorAxis(motor,1,2,0,1,0);
dJointSetAMotorAxis(motor,2,2,1,0,0);
dJointSetAMotorMode(motor,dAMotorEuler);
でむさん はじめまして.コーエイといいます.
昨年暮れあたりから,でむさんのホームページを参考にODEの勉強をしてきました.
最近,実際にシミュレーションを行っているんですが,ちょっと問題が生じましたので質問させてください.
・2つのリンクをヒンジでつなぎ,そこにある周期を持った角速度を与えています.シミュレーションしてみると角速度は正しく入力されているのですが,角度のほうが一致しません.そこで,ヒンジに角速度でなく角度を入力しようと思いましたが,これはマニュアルを見ても書いてない(見落とし?)のようです.
何かいい方法はないでしょうか?
・また,AMotorの使用方法がよく分からないのです.ヒンジなどと同様に関節として使用すればよいのでしょうか?
忙しい中大変だと思いますが,よろしくお願いします.
KOEDAさん. ありがとうございます.
私のサンプルプログラムではシンプルにするためにstaticを関数の前につけていない場合が多いのですが,グローバル変数や関数の前にはstaticを付けてそれらをそのファイル内のみで有効にしてください.
KOEDAです。
ご指摘のとおり、 衝突点の上限Nにstaticをつけたら症状は改善しました。
でむさん,ぽったーです.
お返事ありがとうございます.
結局,解決方法としては,
粘性摩擦係数みたいなものを設定する
それに応じた逆方向のトルクを加える
ですね.
マニュアルにないので,自力で設定するのか,それとも見落としなのか気になって質問しました.
ありがとうございました.
ペンギンさん.はじめまして. ペンギンということはLinux使いですか?
さて,剛体振り子の周期が理論値と1/100ずれるということですが,これだけでは情報が少なくてよくわかりません.
ERP=1.0, CFM=0.0に設定してテストお願いします.
はずしている可能性が高いですが,CFMが0.0でないと剛体ではないので,これが原因だとよいのですが.
結果を教えてください.
ポッターさん.
粘性摩擦を設定できるかということですが,APIにはそのものズバリはないと思います.
自分でソースコードを変更するか,関節の回転方向とは逆にお望みのトルクをかける方法が考えられます.この方法ではだめですか?
はじめまして。
自分もODEを使って遊んでいます。
そこで質問です。
剛体振り子を作ってシミュレーションしたのですが、周期が理論値とは1/100精度でずれてでてきます。シミュレーションのステップサイズを変えてもずれが起こります。これはなぜなのでしょうか?
でむさん,こんにちわ.ぽったーです.
説明の足りない質問をしてすみません.
質問の内容は,
例えば2リンクのアームを作るとして,リンク同士を接続する関節としてHingeジョイントを設定したとします.
このときの関節に粘性摩擦を設定することは可能でしょうか?
KOEDAさん.はじめまして.
貴重なコメントありがとうございます.
私の環境ではsample3でそのような症状はでませんでしたが,別のプログラムではKOEDAさんと同じような症状がでました.
nearCallback関数の接触点数の行に以下のようにstaticを付けてみてください.
static const int N = 10; // 接触点数の上限は10個
私はこれで直りました.ちなみにsample3では接触点数がたかだか1個なので10個も必要ありませんでした.
KOEDAさん,すみませんがstaticを付けて症状が改善するか教えて頂けませんか?こちらでは症状がでないのでよろしくお願いします.
私も最近勉強を始めました。
うりぼうさんと同様に
反発係数を変えてもバウンドしませんでしたが、
衝突点数Nの数を減らしてみたら
バウンドするようになりました。
環境はでむ先生と同じ
CYGWIN_NT5.1+Windows XP,
gcc 3.4.4,ODE0.5
です。
ポッターさん こんにちは.
Hingeジョイントにおいて物体間の摩擦とはどのような意味ですか? ジョイントはODEでは実体のない拘束です.この物体間とは,ジョイントによって接続されているリンク同士のことですか? それともジョイントにバネとダンパを組み込みたいということでしょうか?
もう少し,具体的に説明をお願いします.
でむさん,またまたODEでつまづいたので助けてください.
質問ですが,例えばHingeジョイントにおいて,
物体間の摩擦などを設定したい場合は
どのようにしたらいいでしょうか?
マニュアルを見たところ,Contactジョイントは
設定がありそうですが,その他のジョイントについて
分からないので教えてください.
MR2です。
お返事ありがとうございます。
質問したこととは別のところでつまづいてしまいまして、
まだどちらのことも試せていませんが、
なるべく近いうちに試そうと思っています。
今回は丁寧なお返事ありがとうございました。
また質問ができたときにはご相談にのっていただけるとうれしいです。
でむ様
ご回答有難う御座いました。
ODEのフォーラムなどを見ても、同じような質問をしている方がいらっしゃったのですが、
明確な回答がないままになっていました。
Trimeshについて詳しく把握している方はあまりいらっしゃらないようです。
現在私が取り組んでいるものは早急に仕上げなければなりませんので、
ご回答をお待ちするのと並行して、
別の物理学ライブラリPhysXに取り組んでいました。
現在の作業が落ち着き次第、MLに質問したり、自分でソースを見てみたりしてみたいと思います。
何か有益なことが分かりましたら、
またこちらに書き込ませて頂きたいと思います。
ありがとうございました。
KKさん. Trimesh衝突の質問ありがとうございます.
Trimeshの衝突に関しては詳しくありませんでの回答できません.ODEのmailing listにでも聞いてみればいかがでしょうか?
ごめんなさい.
MR2さん.質問ありがとうございます.普段,シミュレーションではあまり拘束はかけないので勉強になります.
1.ボディとstatic environmentとをジョイントで結合する方法が考えられます.具体的にはdJointAttach(jointID, body1, 0);とします.0はstatic environmentを指します.
効果としては,anchorの位置でボディがそのジョイントと結合されるので,空中で円柱を回転させることなどができます.
2. そうですね.では,角速度を同じに設定すればよいのではないですか.その場合,各軸にAMotorを設定してください.AMotorを設定すると次のステップで目標角速度に設定されますのでお望みのことができるかと思います.
ご参考になれば幸いです.
MR2です。
お忙しいというのに
迅速で丁寧なお返事ありがとうございます。
>1番目のご質問は具体的にどのような拘束をかけるか教えてください。
マニピュレータでものをつかんだり離したりというシミュレーションを行う場合に、
エンドエフェクタと対象物体が近づいたときに、
これらを拘束するといった感じです。
長い円柱を持つ(円柱の中心軸まわりの回転は許す)可能性もあるので、
完全な拘束だけではなく、できればヒンジジョイントでもつなぎたいと考えています。
>2.4つのタイヤの軸に同じトルクをかける
確認なのですが、こちらの方法はそれぞれの車輪の接地状態によっては
回転数は同じにはならないですよね?
時間が空いたときでいいですので
どうぞよろしくお願いいたします。
でむ様
はじめまして。
ODEを勉強し始めて、2,3週間ほど経ちますが、
こちらのページを拝見させて頂いて、お蔭様で大分色々とできるようになってきました。
しかし、最近Trimeshを扱い始めて、分からない部分がでてきましたので、
質問をさせて下さい。
Trimeshと基本形(球、長方形、円柱、キャップつき円柱)との衝突判定は問題ないのですが、
Trimesh同士の衝突は変な動きをします。
例えば、Trimeshで任意の形状を作成し、床(平面)に置いておき、
そこに別のTrimeshを落として衝突させると、
床に置いたTrimeshにくっついてしまう現象がおきます。
これはサンプルのTest_MovingTrimeshでも同じ現象が起き、
うさぎモデルの上にうさぎモデルを落とすと、
とてもバランスがとれているとは思えない状態で止まってしまったりします。
この件に関して色々と調べていると、ODE Forumで、
collision_trimesh_trimesh.cppの229行あたりの
SUB( e1, v2[1], v2[0] );
SUB( e2, v2[2], v2[0] ); を、
SUB( e2, v2[1], v2[0] );
SUB( e1, v2[2], v2[0] );
と書き換えるとうまく動くと書かれていましたので、これを試してみました。
そうすると、サンプルのTest_MovingTrimeshでは、くっついてしまうという現象がなくなり、
割りとうまく動くようになりました。
しかし、Test_MovingTrimeshのモデルデータを自作のモデルデータに変更すると、
くっついてしまう現象がおきたり、くっついている状態から突然吹っ飛んでしまったりします。
現象を言葉で説明するのはなかなか難しく、
状況をお分かり頂けたか分かりませんが、
もし、お時間があるようでしたら、ご回答頂けますでしょうか?
よろしくお願い致します。
うりぼうさん。こんにちは。コメントありがとうございます。
1番目のご質問ですが36行目だけを
contact[i].surface.bounce = 0.5;
に変更すると私の環境CYGWIN_NT5.1+Windows XP,gcc 3.4.4,ODE0.5ではバウンドしました。本日確認済みです。
開発環境を教えてください。cygwinのターミナルで以下のコマンドを実行すると教えてくれます。
$uname -a
$gcc -v
2番目のご質問は、ウインドウを閉じなくても再シミュレーション可能です。ジョイントグループ、ボディ、ジオメトリを破壊し、再度生成すればOKです。このコードをcommand関数内に記述すればキーを押すたびにシミュレーションを再実行してくれます。ODEはインタラクティブなところも売りのひとつです。
以上です。
はじめまして。最近ODEを勉強し始めた者です。
非常に初歩的な質問で申し訳ないのですが、
よろしくお願いします。
①
講座6の課題で、反発係数(0.0→0.5)を変更し、makeしなおし、実行したのですが、
相変わらず張り付いたまま跳ね返ってくれません。
どこか間違ってるのでしょうか?
②シミュレーションをもう一度最初から再生したい場合、
一度ウィンドウを閉じて再実行するしかないのでしょうか?
よろしくお願いします。
MR2さん 質問ありがとうございます。
ODEは他の動力学計算エンジンと比べて敷居が低いと思います。少なくともOpen HPRよりは…
まず、2番目のご質問から回答します。
dBodyAddForce(dBodyID, fx, fy, fz)を使うと可能です。
指定したい物体のボディIDを1番目の引数、加えたい力のx,y,z成分をそれぞれ2番目以降の引数にいれてください。
3番目の御質問は、いろいろな実現方法が可能です。
1. シミュレータ上で物理的にそのような機構を作る
2.4つのタイヤの軸に同じトルクをかける
ODEのテストプログラムtest_buggy.cppをご参考になればコーディングがわかります。
1番目のご質問は具体的にどのような拘束をかけるか教えてください。これだけではODEのAPIで簡単に実現できるかよくわかりませんので。
以上です。
でむさん,こちらの不手際で何度も同じ質問をのせてすみませんでした...
回答のほうですが,大変参考になりました.
ひとつひとつ回答していただいてありがとうございます.
これで次の段階にステップアップできるかな~??
またODEでつまづいたときに質問させていただきます.
ありがとうございました.
はじめまして。
ODEはなかなか手をつけられないでいたのですが、
このサイトのおかげではじめることができました。
非常に参考になり助かっております。
本の出版も楽しみにしています。
いくつか質問をさせてください。
・シミュレーションの最中に、途中から拘束をもうけたり、逆に外したりすることはできますでしょうか?
・特定の物体にだけ(たとえば、箱が複数あったときに、そのうちのひとつにだけ)に外力(~[N]でおす、など)を加えることができますでしょうか?
・たとえば、4輪車の前後輪の動きをつないでひとつのトルクで駆動(モータは1つで、4つの車輪が歯車等でつながっているようなイメージ)することはできますでしょうか?
それぞれ、できるならば、どのような感じに
プログラムを組めばよいかヒントを教えてください。
お忙しいとは思いますが、
お返事をいただければ幸いです。
どうぞよろしくお願いいたします。
うえのさんおひさしぶり!
さて、この手の質問は実際にソースコードをみないとわからないケースがほとんどですが、考えられることを回答します。
「トライメッシュがジオメトリー(ボディーがない)で、
トライメッシュと衝突させる物体(例えばボックス)がボディーあり」なのでは?と疑ってみましたが、
どうもそうじゃないようです。」
トライメッシュにもボディをつけてあげないとODEに動力学計算をしてもらえません。また、衝突判定はジオメトリ同士だけです。衝突判定する必要のないボディにはジオメトリを設定するもありません。
肝心のトライメッシュの衝突判定ができない部分ですが、衝突判定をするnearCallback関数の中に衝突点の最大数MAX_CONTACTSを大きくしてください。
この関数名はtest_moving_trimesh.cppと同じです。あとは、test_moving_trimesh.cppともう一度比較することをお勧めします。
このコメントが参考になれば良いのですが。
ポッターさんのご質問に回答します。
1.dWorldStepのステップサイズは何?
数値積分の時間幅です。このサイズの分だけ時間が進みます。小さくすると精度が向上しますが遅くなり、大きくすると精度が悪くなりますが速くなります。シミュレータでの挙動を見て決めてください。ただし、ODEの積分器は精度が悪いので、非常に正確な計算が求められる用途には向きません。
2.ODEウインドウの大きさを変更すると動作が遅くなるのですが…
テストプログラムなどでは表示が終わらないと、次の動力学計算や衝突計算をしないので、ウインドウが大きくなると動作が遅くなります。
高速に計算したい場合は、表示を止める必要があります。
以上です。ご参考になりましたか?
ポッターさん コメントありがとうございます。でも、先生はやめてください。
1. ODEの単位系
単位系はお好きなものを使えますが、国際(SI)単位系(長さはm、重さはkg、…)とした方がわかりやすいと考えます。ただし、角度はODEのAPIでradianを使っていますので度はそのまま使えません。
2.dWorldStepの質問
はい。動力学計算はそのステップサイズ毎に更新し、衝突計算は動力学計算と同じループで回っていますのでポッターさんのいうとおりだと思います。
3.テキストの表示の質問
ODEのテストプログラムの描画はdrawstuffライブラリで処理しており、それはOpenGLを使ったシンプルなものです。ただし、テキストを表示するAPIがないので自分で作るしかありません。
printfやcoutを使って標準出力(ターミナル)に出力させる方法が楽です。
本は原稿ができないといつまで経っても出版されません…
はじめまして,でむ先生.
最近にODEの勉強を始め,でむ先生のホームページを参考にさせて頂いています.
質問ですが,ODEのシミュレーションにおいて,
シミュレーションのステップサイズを決定するところがあります.
dWorldStep(world,0.05);
このシミュレーションのステップサイズは何を表しているのでしょうか?
また,ODEのウインドウの大きさを変更すると物体の移動速度が変化します.
シミュレーション結果に影響はあるのでしょうか?
よろしくお願いします.
どうもこんばんは。
けっこう質問をさしてもらっているうえのです。
サイト、お久しぶりの更新ということで
お忙しさが伺えます。
この前「トライメッシュ衝突判定」ができないとメールしました。
最後のメールで
「トライメッシュがジオメトリー(ボディーがない)で、
トライメッシュと衝突させる物体(例えばボックス)がボディーあり」
なのでは?と疑ってみましたが、
どうもそうじゃないようです。
(自分の中では(^^; )
やっている内容は以下のとおりです。
simloop内
・ trimeshbody の dbodyGetPosition、dbodyGetRotation
・vertices の floatから dReal計算
・drawtriangle
main文内
・bodyCreate
・Massセット
・ボディパラメーター設定(position, rotation)
・trimeshDataの作成
・trimeshGeometoryの作成
・dGeomSetBody
というような内容です。(めちゃくちゃ大まかなないようですが)
順番もこのままで、3.10節のシミュレーションコードと
同じ順序だと思うのですがなぜか作った
トライメッシュクラスは衝突判定をしてくれません。
御教授願います・・・m(__)m
はじめまして,でむ先生.
最近ODEの勉強を始めて,でむ先生のホームページを参考にさせていただいています.
質問ですが,
1.ODEの単位系はどうなっているのでしょうか?
角度はラジアンになっているようですが,重さや長さについてはどうなっているのでしょうか?
2.でむ先生のHelloWorldのプログラムで,
dWorldStep(world,0.05); // シミュレーションのステップサイズを決める
とありますが,このステップサイズは何を設定しているのでしょうか?
3.シミュレーション中にウインドウのサイズを変更すると物体の動きが早くなりますが,これは結果に影響するのでしょうか?
ODEの本の出版,とても楽しみにしてます.
よろしくお願いします.
はじめまして.
このホームページを参考に,最近ODEの勉強を始めましたが,なかなかうまくいかず四苦八苦しています.
さっそく質問なんですが,
1.ODEの単位系はどうなっているのでしょうか?角度はラジアンなのは確認しましたが,長さや重さについてはどうなっているのでしょうか?
2.でむ先生のHelloWorldの中に,
dWorldStep(world,0.05); // シミュレーションのステップサイズを決める
とありますが,このシミュレーションのステップサイズというのは,0.05秒ごとに衝突などの解析を行うのでしょうか?
3.ODEのウインドウに,物体の位置を表示したり,シミュレーション時間の表示をするにはどうしたらよいのでしょうか?
ODEの本はいつ頃出版されるのでしょうか?
出版楽しみにしてます.