はじめまして。時間があるときに答えていただけたら幸いです。
コンパイル+実行について質問です。
WindowsでCygwinを使いodeを実行したいのですが、テストファイル(demo_baggy.cppなど)はデフォルトのMakefileでコンパイル+実行できた(ソースの内容を書き換えてもできました)のですが、自作のファイルを出村さんのsample1に入っていたMakefileを使うとコンパイルできるのですが実行できません。
sample1はhttp://demura.net/archives/9ode/ode5.htmlのsample1-071001.tgzに含まれているものです。Makefile.cygwinも試しましたが同じ結果でした。
実行すると、以下のような表示がでます。
ODE Message 2: inertia must be positive definite in dMassCheck() File mass.cpp Line 53
ODE Message 2: inertia must be positive definite in dMassCheck() File mass.cpp Line 53
placeable(配置可能)とnon-placeable(配置不可能)はODE User manualでは次のように定義されています。
“A placeable geom has a position vector and a 3*3 rotation matrix, just like a rigid body, that can be changed during the simulation. A non-placeable geom does not have this capability”
spaceとplaneクラスはnon-placeableです。
dGeomSetBody(),dGeomGetBody(),dGeomSetPosition(), dGeomGetPosition(),dGeomSetRotation(),dGeomGetRotation(), dGeomSetQuaternion(),dGeomGetQuaternion()などでnon-placable geomを引数に入れると”geom must be placeable”のエラーが出ます。
はじめまして
MacBookPro(OS X 10.5.6)にODE10.0.1をインストールしてサンプルファイルhello.cppをmakeしようとしているのですが、どうしても上手くいきません。
アドバイスをお願いします。
まず、下記のエラーがでるので、本WEBを検索したところ、倍精度でインストールし直す必要があるとのことで、数回インストールし直してみたのですが、
エラーが回避出来ませんでした。
config.logを確認しても倍精度に設定されている様なので、原因が不明です。もしかしたら、何回もインストールし直した為、単精度の設定でインストールされた別のODEが動いているのかもしれないのですが、
確認の方法がわかりません。どうすれば確認出来るかや、正しい再インストール方法をアドバイス頂けないかと思います。
エラー内容
hello.cpp: In function ‘void simLoop(int)’:
hello.cpp:32: error: cannot convert ‘const dReal*’ to ‘const double*’ for argument ‘1’ to ‘void dsDrawSphereD(const double*, const double*, float)’
make: *** [hello.o] Error 1
なお、再インストールは下記の手順で行いました。
sh autogen.sh
./configure –with-drawstuff=OSX –with-trimesh=opcode –enable-double-precision –enable-debug
make
sudo make install
ODE Message 2: inertia must be positive definite in dMassCheck() File mass.cpp Line 53
ODE Message 2: inertia must be positive definite in dMassCheck() File mass.cpp Line 53
ODE INTERNAL ERROR 1: assertion “dMassCheck(mass)” failed in dBodySetMass() [ode.cpp]
Abort trap
ODEで加速度の計算に必要なマトリクスを取り出すにはどうしたらよいのでしょう?加速度がa, Mass Matrix がM, トルクがtau、その他諸々がXにあるといたしましてMa = tau – X とした場合、更に拘束条件を記述したJacobian等をx=Jq’ + J’q 等とした場合 M,tau,X、J、J’ 等を取り出す方法はありますでしょうか?どうぞよろしくお願い申し上げます。
コメント
たつやさん,
ODE-0.5はかなり古いので使わない方が良いです.最近のコンパイラーではビルドできないと思います.
さて,c:\Program Files\CodeBlocks\MinGW\bin\ld.exe:
cannot find -lode_doubleのエラーになる原因はODEをビルドするときにターゲットをDebugDoubleLibにしなかった可能性が高いです.
c:\ode-0.10.1\lib\DebugDoubleLib\libode_doubled.aがありますか?
でむ
すみません.初心者です.
一番簡単そうなode-0.5をlinuxにインストールしました.
ロボットシミュレーションノ本を見ながらプログラムを作成しました.
コンパイルするには動すればいいのでしょう?
御回答よろしくお願いします.
はじめましてたつやと申します。
code::blocksでのODEビルドで行き詰っています.
最後の
c:\ode-0.10.1\robosimu\src\robosimu.workspace をDebugLibでビルドする
と
c:\Program Files\CodeBlocks\MinGW\bin\ld.exe:
cannot find -lode_double
とエラーが出ます.
そのフォルダにはちゃんとアプリケーションファイルのldがあります.
どうすれば解決できますか?
ご回答お願いします.
先ほどの記事についてですが、自己解決できました。以下にCygwinでコンパイルできるMakefileをあげておきます。お騒がせしました。
CC = g++ -Wall -fno-exceptions -fno-rtti -mwindows -g -DWIN32 -DCYGWIN
TARGET = sample1
OBJS = sample1.o
SOURCE = $(TARGET).cpp
HEADER =
LIBS = -L../../lib -L/usr/X11R6/lib -L/usr/lib -L/usr/local/lib
INDS = -I. -I../../include -I/usr/X11R6/include -I/usr/include
OPTS = -lstdc++ -lm -lode -ldrawstuff -lComctl32 -lkernel32 -luser32 -lgdi32 -lOpenGL32 -lGlu32 -lwinmm
OPT1 = -DdTRIMESH_ENABLED -DdDOUBLE
#windows specification rule
RESOURCE_FILE=resources.o
$(TARGET):$(OBJS) $(HEADER)
$(CC) -o $(TARGET) $(OBJS) $(LIBS) $(INDS) $(OPTS) $(RESOURCE_FILE)
$(OBJS):$(SOURCE) $(HEADER)
$(CC) -c $(SOURCE) $(LIBS) $(INDS) $(OPT1)
clean:
rm $(TARGET) $(OBJS) *.*~ *~ *.exe
すみません、先ほどの記事に追加です。
odeはode-0.11を使用しています。
よろしくお願いします。
はじめまして。時間があるときに答えていただけたら幸いです。
コンパイル+実行について質問です。
WindowsでCygwinを使いodeを実行したいのですが、テストファイル(demo_baggy.cppなど)はデフォルトのMakefileでコンパイル+実行できた(ソースの内容を書き換えてもできました)のですが、自作のファイルを出村さんのsample1に入っていたMakefileを使うとコンパイルできるのですが実行できません。
sample1はhttp://demura.net/archives/9ode/ode5.htmlのsample1-071001.tgzに含まれているものです。Makefile.cygwinも試しましたが同じ結果でした。
実行すると、以下のような表示がでます。
ODE Message 2: inertia must be positive definite in dMassCheck() File mass.cpp Line 53
ODE Message 2: inertia must be positive definite in dMassCheck() File mass.cpp Line 53
ODE INTERNAL ERROR 1: assertion “dMassCheck(mass)” failed in dBodySetMass() [ode.cpp]
Aborted (core dumped)
よろしくお願いします。
ありがとうございます.
早速自分のシミュレータと照らし合わせながら試してみたいと思います. また何かありましたらよろしくお願いします.
hideさん,
明日から出張であまり時間を取れないのでODE講座31にソースコードだけ示しました.
http://demura.net/9ode/3561.html
わからないところはコメントください.
でむ
質問に関してはこちらの掲示板ということで,はじめて投稿させていただきますhideといいます.
よろしくお願いします.
さっそく質問なのですが,現在,勉強の一環としてODEを使用したシミュレーションモデルを作成しています.
そこで一つお聞きしたいのですが,仮に空間上に初期高さの異なる2つのボールA,Bを同時に落下させ,それらのボールが地面と衝突する際
今地面にぶつかったのはAのボールである
と値を返すようにすることは可能でしょうか.また可能であるならどういったコーディングになるか教えていただければ幸いです.
なにぶんODEに関して初心者でして単純な質問かもしれませんがよろしくお願いします.
すいません。あいさつを忘れました。はじめまして。
先ほどの質問ですが、地面ジオメトリのdCreatePlaneがよくないことがわかりました。Planeは不具合が出るようです。地面の代わりに平たい立方体を配置することで解決しました。
ODEで物体に対して外部から力を加えていないのに、時間がしばらく経過した後に物体が動き出す(振動がだんだん激しくなるような動き)ことはありますか?円柱を地面に立てるプログラムでおきています。
lylaさん
一件落着おめでとうございます。
また、何かあったらコメントください。
でむ
こんばんは。
確かに、適当に100個の配列で関節を定義して100個描画しても何ら問題ありませんね。
ちょっと書き方もごちゃごちゃしていたので、物体と関節をそれぞれ1つの配列にして書き直してみたところ、問題なく実行できました。
結局原因がわかりませんが、コーディングの問題であったことは間違いありません。
ご親切に回答いただきまして誠にありがとうございました。
lylaさん、
dBodySetMass()はdMassSetBoxTotal()のすぐ後にした方が良いとは思いますが、それ以外は問題なさそうですね。
固定関節の数に上限があるとは聞いたことがありません。固定関節だけを使う簡単なプログラムを作成するとチェックはできると思います。
差し支えなければ、ソースコードを送っても頂ければ私の環境でも同様な現象が生ずるか試してみますが。
でむ
こんばんは。
今まで問題なく使用できていた通りにボックスを新たに作り、既存のボックスと固定するようにしたところエラーが出るようになりました。
コーディングに違いはないので、試しに既存の物体を1つ消した上で新規のボックスを追加したところ、正常になりました。
さらに、既存の物体だけの状態で適当な物体同士に新たに固定関節を作ったところ、エラーとなりました。
というわけで、どうやら今使っている固定関節の数が限界であるかのように感じます。(高々10個程度なのですが・・・)
そういったことはあるのでしょうか?
ちなみにコードは下記のように書いています。
body.body = dBodyCreate(world);
dBodySetPosition(body.body, X,Y,Z );
dMassSetBoxTotal(&cm,質量,L,W,H);
body.geom = dCreateBox(space,L,W,H);
dGeomSetBody(body.geom, body.body);
dBodySetMass(body.body,&cm);
//固定関節
fix = dJointCreateFixed (world,0);
dJointAttach (fix,body.body, body2.body);
dJointSetFixed(fix);
lylaさん、
はじめまして。
placeable(配置可能)とnon-placeable(配置不可能)はODE User manualでは次のように定義されています。
“A placeable geom has a position vector and a 3*3 rotation matrix, just like a rigid body, that can be changed during the simulation. A non-placeable geom does not have this capability”
spaceとplaneクラスはnon-placeableです。
dGeomSetBody(),dGeomGetBody(),dGeomSetPosition(), dGeomGetPosition(),dGeomSetRotation(),dGeomGetRotation(), dGeomSetQuaternion(),dGeomGetQuaternion()などでnon-placable geomを引数に入れると”geom must be placeable”のエラーが出ます。
固定に関するコードで該当箇所はありませんか?
でむ
はじめまして。
現在車両モデルを作っているのですが、
構成している16個の物体に、新たに追加した物体をdJointSetFixedで固定しようとすると、”geom must be placeable”というエラーが出てしまいます。
固定に関する部分をコメントアウトすればコンパイルは通ります。
扱える物体の数に制限があるのでしょうか?
よろしくお願いいたします。
Miyaさん、
最近OS Xは全く使っていないので助かります。
ありがとうございました。
でむ
でむさん、2009-02-23に質問した件ですが、なんとか解決しましたので、報告させて頂きます。
ODE関連のファイルを削除して再インストールしても改善しませんでしたが、demoフォルダに入っているファイルは無事にコンパイルされていたので、demoフォルダのmakefileと比較して調べてみました。
その結果、でむさんのmakefileを参考に作った私のmakefileでは、下記の指定が足りないことが判りました。
-DdTRIMESH_ENABLED -DdDOUBLE
そこで、makefileに上記を追加したら無事にコンパイルできる様になりました。
ちょっと長くなりますが、修正したmakefileは下記の通りです。
CC = g++ -I -O2 -Wall -g
TARGET = hello
OBJS = $(TARGET).o
SOURCE = $(TARGET).cpp
HEADER =
LIBS = -L../../drawstuff/src -L/usr/local/lib -L/usr/X11R6/lib -L/usr/X11R6/lib
INDS = -I. -I../../include -I/usr/local/include -I/usr/X11R6/include
OPTS = -lm -lode -ldrawstuff -lX11 -framework OpenGL -framework Carbon -framework AGL
OPT1 = -DdTRIMESH_ENABLED -DdDOUBLE
$(TARGET):$(OBJS) $(HEADER)
$(CC) -o $(TARGET) $(OBJS) $(LIBS) $(INDS) $(OPTS)
$(OBJS):$(SOURCE) $(HEADER)
$(CC) -c $(SOURCE) $(LIBS) $(INDS)$(OPT1)
clean:
rm $(TARGET) $(OBJS) *.*~ *~
インストール手順も以前に書いたものでは足りない部分があったので、
報告しておきます。
sh autogen.sh
./configure –enable-double-precision
make
sudo make install
sudo mkdir -p /usr/local/include/drawstuff
sudo cp include/drawstuff/version.h /usr/local/include/drawstuff
sudo cp include/drawstuff/drawstuff.h /usr/local/include/drawstuff
sudo cp drawstuff/src/libdrawstuff.la /usr/local/lib
sudo cp drawstuff/src/.libs/libdrawstuff.a /usr/local/lib
何故か、drawstuff関連のファイルは上手くインストールされない様で、
追加でコピーする必要がありました。
でむさん
早々の回答ありがとうございました。
(const double *)でキャストして試してみました。
コンパイルは出来るようになりましたが、やはり単精度で実行した時同様にODE Message2のエラーが出てしまいます。
Miyaさん、
はじめまして。以下のエラーは1番目の引数を(const double *)でキャストすれば直ると思います。ただし、サンプルプログラムではわざわざキャストする必要はないので、単精度でインストールしたか、または、単精度でビルドしたライブラリを使用しているかの可能性が高いです。
キャストしてもODE Message2のエラーが出るか教えてください。
なお、ODE並びにODE関連の環境変数を削除してから、再インストールする方法が一番時間を節約できるかもしれません。
でむ
hello.cpp: In function ‘void simLoop(int)’:
hello.cpp:32: error: cannot convert ‘const dReal*’ to ‘const double*’ for argument ‘1’ to ‘void dsDrawSphereD(const double*, const double*, float)’
make: *** [hello.o] Error 1
はじめまして
MacBookPro(OS X 10.5.6)にODE10.0.1をインストールしてサンプルファイルhello.cppをmakeしようとしているのですが、どうしても上手くいきません。
アドバイスをお願いします。
まず、下記のエラーがでるので、本WEBを検索したところ、倍精度でインストールし直す必要があるとのことで、数回インストールし直してみたのですが、
エラーが回避出来ませんでした。
config.logを確認しても倍精度に設定されている様なので、原因が不明です。もしかしたら、何回もインストールし直した為、単精度の設定でインストールされた別のODEが動いているのかもしれないのですが、
確認の方法がわかりません。どうすれば確認出来るかや、正しい再インストール方法をアドバイス頂けないかと思います。
エラー内容
hello.cpp: In function ‘void simLoop(int)’:
hello.cpp:32: error: cannot convert ‘const dReal*’ to ‘const double*’ for argument ‘1’ to ‘void dsDrawSphereD(const double*, const double*, float)’
make: *** [hello.o] Error 1
なお、再インストールは下記の手順で行いました。
sh autogen.sh
./configure –with-drawstuff=OSX –with-trimesh=opcode –enable-double-precision –enable-debug
make
sudo make install
どうしても回避出来なかったので、hello.cppの設定を単精度に変更して
makeしたところ、コンパイルは出来る様になったんですが、今度は下記のアラームが発生しました。
(dsDrawSphereDをdsDrawSphereに変更)
ODE Message 2: inertia must be positive definite in dMassCheck() File mass.cpp Line 53
ODE Message 2: inertia must be positive definite in dMassCheck() File mass.cpp Line 53
ODE INTERNAL ERROR 1: assertion “dMassCheck(mass)” failed in dBodySetMass() [ode.cpp]
Abort trap
これも検索したところ、10.0.1で同様のアラームが発生したとのコメントが下記ページにあったのですが、解決方法が書いてませんでした。
http://demura.net/9ode/538.html
ソース内の変数を10倍にする等試してみましたが、上手くいきません。
ソースコードは本のとおりなので、inartiaがマイナスということもないはずです。他に原因があるはずなのですが、わかりません。
アドバイスをお願いします。
kumaさん、
剣玉は面白そうですね。頑張ればモデルはできると思いますが、それを上手に制御して玉を剣に入れることは簡単ではありません。
確か、ATRの川人先生らのグループが剣玉を学習するロボットを発表したことがあったと思います。
卒研頑張ってください。
でむ
でむさん返事が送れてすいません。
前回質問した理由なんですが、今卒研でけんだまを作ってシミュレーションしようとしています。
センサーで取った値をODEのブロックの座標にあわせて物体を動かして玉をはじこうとしたのですが、このやりかただと動いてるようには見えるのですが毎回座標を入力しているので、物体が動く力が発生せずにけんだまは出来ませんでした。
とりあえず今違うプログラムを作りなんとかデモは見せられるのですが、けんだまのことをレジュメに書いてしまったため、この後も作らなければならなくなる可能性があります。
説明があまり伝わっているかわかりませんが
とりあえず聞きたいことは、ODEでけんだまを作りシミュレーションはできるのでしょうか?
もし単純に「物体をどの軸咆哮にいくつずらす」と言うようなことふが出来るならばなんとかなるような気もするんですが・・・
もし出来るのであればまたいろいろとお聞きしたいことが出ると思います。
忙しいと思いますがよろしくお願いします。
kumaさん,
お互い忙しいみたいですね.
http://demura.net/9ode/2817.html
ではだめですか?
でむ
先ほどの書き込みが反映されていないようなのですが、急いで解決したいのでもう一度投稿させてもらいます。
ODEの物体を回転させる際に、トルクの力を制御して回すのではなく角度で宣言して物体の角度を変えることは可能でしょうか?
demuさんお久しぶりです。
物体を回転させたいのですがトルクで回転させる以外に角度を指定して回転させる方法はないでしょうか?
ODEで加速度の計算に必要なマトリクスを取り出すにはどうしたらよいのでしょう?加速度がa, Mass Matrix がM, トルクがtau、その他諸々がXにあるといたしましてMa = tau – X とした場合、更に拘束条件を記述したJacobian等をx=Jq’ + J’q 等とした場合 M,tau,X、J、J’ 等を取り出す方法はありますでしょうか?どうぞよろしくお願い申し上げます。
えじん
なるほど。。。位置座標によって条件分岐させればよいのですね。
幸いにも位置を取得するセンサは別の実験で実装済みなので、スムーズにこの作業が行えそうです。
お答え頂き、どうもありがとうございましたm(_ _)m
masaさん,
お久しぶりですね.
さて,この2種類の地面は同一平面上にあるということですか?
もし,そうであれば,いろいろな実現方法があると思います.
すぐ思いつくのが,ボディと地面との接触点の座標を常に調べ,それらの点がある特定の領域内にあるときだけ摩擦係数を小さくし,それ以外は大きくすれば良いのではないでしょうか? nearCallback関数の中にコードを書けば良いと思います.
でむ
お久しぶりです。以前質問させて頂いたmasaと申します。
今回の質問なのですが、ODE上で2種類の地面を作ることは可能なのでしょうか??
例えば、ある特定の領域の地面のみ摩擦がないつるつるで、
それ以外の地面は、摩擦があるといったような感じのものです。
すみませんが、よろしくお願いします。
しんいちさん,
お役に立つのであればうれしい限りです.しんいちさんのおかげでODEのソースコードを見直しました.
講座30でわからない箇所があればコメントください.説明が不十分なのはわかっています.
また,コメントまっています.
でむ
返信おそくなり、申し訳ございません。
わざわざ講座を作っていただいて感激です。
読んで勉強させていただきながら、プログラムを書き換えています。
またわからないことが出てきたら質問させていただきます。
ご回答本当にありがとうございました。
山口さん、
変な質問ではないと思います。デフォルト値はどうなっていますかという意味もあったのではないでしょうか?
例えば、反発係数は設定しない限り0です。静止摩擦係数は必ず設定しなけれいけない定数とマニュアルでは記述されています。
このサイトは、初心者向けですのでわからないことは遠慮なく何でもご質問ください。これに懲りず、また、コメントくださいね。
でむ
反発係数や,摩擦の係数などは,使用するロボットとその環境との関係から自分で計算して値を出すものですよね.
変な質問ですみませんでした.
山口さん、
ご質問の意味がよくわかりません。反発係数はプログラムを書く人がおやりにないたいシミュレーションに応じて決めれば良い値ですが…. ちなみに0以上1以下の値です。
でむ
しんいちさん、
はじめまして。返事が遅くなりすみません。
しんいちさんの方法ではうまくいきません。dBodyVectorFromWorld(body, v[0],v[1],v[2], sv)のソースコードを読んでください。ベクトルの向きを回転行列で変更しているだけです。
例えば、ボールが止まっているときは速度ベクトルは0です。これをdBodyVectorFromWorld()で変えたところで0のままです。でも、ロボットは並進運動並びに回転運動をしますので、相対速度が生ずるわけです。
絶対座標系でも計算できますが、相対座標系で速度を計算する方がとても簡単にできます。ODE講座30にそのサンプルコードを載せました。ご参考になれば執筆した甲斐があります。
でむ
お久しぶりです.
さっそくですが,質問させていただきます.
反発係数についてなのですが,この値は,どういう風に決まっているのでしょうか?係数の具体的な例というものはないのでしょうか?
よろしくお願いします.
はじめまして。しんいちと申します。
よろしくお願いします。
ロボットが投げたボールの速度をロボットからの相対座標系で取得したいのです。
dReal *v = (dReal *)dBodyGetLinearVel(ball.body);
で絶対座標系での速度を取得し、
dBodyVectorFromWorld(body, v[0],v[1],v[2], sv);
で相対速度に変換できるのではないか、と考えてプログラムを書いてみてはいるのですが、dBodyVectorFromWorldで扱うdVector3をどう定義して使えばいいのかわかりません。そしてこの方法が正しいのかどうかもわかりません。
教えてください。よろしくお願いします。
しんごさん,
一番簡単な方法は,非常に小さく,軽いボディをリンクの両端に付け,dBodyGetPositoin()でその位置を取得する方法です.
位置センサを取り付けると考えてください.
でむ
リンクの両端の位置座標を取得したいのですが、良い方法はあるでしょうか?
つながっているジョイントの座標を取得するのが簡単なのですが・・・
umeさん、
何が原因で、どうやったら解決したか教えて頂けないでしょうか?
でむ
すみません。とりあえずエラーを直すことができました。ありがとうございます。
umeさん、
drawstuffの設定のところで、fn->version = DS_VERSIONとしていると思います。
このエラーはfn->versionが DS_VERSIONより大きいときにでます。何をしたらこのエラーが出たのでしょうか?
でむ
どうもありがとうございます。調べてみます。
もう一つ質問なのですが、bad version number in dsFunctions structureというエラーが出たのですがどのような点がおかしいのですか?
umeさん,
はじめまして.
私は常微分方程式を解くAPIを知りません.
なお,ODEの全APIは以下のページで見ることができます.
http://opende.sourceforge.net/docs/index.html
でむ
はつさん,
謎ですね.
例えば,2回目以降勝手に消えるというわがままなsphereをboxに変更しても消えるでしょうか? この時,描画だけboxに変更してください.
でむ
はじめまして、おねがいします。
今回二足歩行のロボットをODEでおこなっているものですが、ODEで常微分方程式を解くための関数はありますか?もしあれば助かるのですが、教えてください。
追加です
カプセルやシリンダーやボックスなどは常に描画されます。
ご回答ありがとうございました。
また質問です。
歩行させているときに、倒れたらdesroyしてresetしなおし歩行させるという
プログラムを書いたのですが、sphereの描画だけ2回目以降勝手に消えてしまいます。原因はなにが考えられますでしょうか?
描画されないだけで存在はしています。