7 月 03
まず,ここにあるODEのFAQを読んでからコメントお願いします.
ODE質問・要望5!のコメントがちょうと100件になりましたので,新しい質問や要望はこちらにお願いします! ご質問の内容を詳しく説明して頂けると的確に回答できますので,時間を節約できると思います.
また、私のコメントやご自分の努力により問題が解決 された場合に、問題の原因がわかれば投稿して頂くと大変助かります。その情報はODEの初心者にとって重要なものです。ある程度たまりましたらFAQに掲 載したいと思いますのでご協力のほどよろしくお願いします。
投稿:08年07月03日


zipさん,
ODE初級講座9回目のソースコードをご覧ください.ボディの位置を取得し,表示しています.
でむ
でむさん、返答ありがとうございます。
講座を読んでやってみたのですが、dBodyGetPositionで取り出した位置座標に変数を入れて描写させようとすると’pos’ :const である変数へは割り当てることはできません、と出て上手くいきません。どうすれば良いでしょうか。
goさん,
Bulletの衝突検出ライブラリは素晴らしいとネットで読んだことがあります。ODEで使われているOPCODEの新しいバージョンでも精度の面で問題ありますか? それとも試されたのはOPCODEの古いバージョンでしょうか。なお、新しいバージョンは、ode-0.10.1/ode/src/config.hの44行目で以下を定義してコンパイルする必要があります。
#define dTRIMESH_OPCODE_USE_NEW_TRIMESH_TRIMESH_COLLIDER 1
Bulletは日本語の資料が少ないので是非ウェブや書籍で公開してください。本が出版されたら購入します。
でむ
こんにちは、お久しぶりです
Irrlicht + ODEのプロジェクトですが、ODEの衝突判定がどうも使いにくい(ちょっと精度の問題もある)ので、Bulletを使うことにしました
ご存知かもしれませんが、BulletはODEに比べると相当レベルの高いライブラリなのですが、日本語の情報がとても少ないので、そこら辺の情報も提供していこうと思います
とりあえずGimpを使って相当数の多いメッシュでも衝突判定できることが確認できたので、サンプル用のモデルも大体できたので、これからはBulletでやっていこうと思います。
shinさん、
以下のエラーも表示されますか?
ODE Message 3: LCP internal error
この場合、エラーの原因は数値計算の誤差、モデルの間違い、その他に理由により、システムを記述する行列が特異行列になり計算できない状態です。
まず、shinさんのロボットモデルは正しいですか?ボディやジョイントの位置関係が現実ではありえない場合にこのエラーが発生する場合があります。
以下を試して、その結果を教えてもらえますか?
1. 単精度インストールなら倍精度に変更
2. dWorldStep()からdWorldQuickStep()に変更
3. ERP、CFMの値をいろいろ変更する。CFMは大きい値(1e-3以上)、ERPはモデルによりますが大きい場合(0.8以上)にエラーが消える場合があります。
でむ
kensei.cpp と leg.cpp を参考にして二足歩行をさせようとしています。
コンパイルは通るのですが、実行すると以下のようなエラー文がでます。
原因は何なんでしょうか?
また、解決法はどうなりますか?
(エラー文)
assertion “bNormalizationResult” failed in _dNormalize4() [../../include/ode/odemath.h]
渡辺さん、
お力になれずすみません。
刃物で剛体を真っ二つに切るなんで、ルパン三世の石川五右衛門みたいで面白いですね。
平面と直方体の交点を求め、平面により分割された直方体の2つの部分を三角メッシュで生成すれば、刃物で剛体を真っ二つにしたように見えると思います。実装は結構大変だと思いますが、頭の体操には良いかもしれませんね。
でむ
zipさん、
ODE初級講座の9回目をごらんください。
http://demura.net/wordpress/tutorials/ode9
それを読んでもわからない場合は、わからない箇所を具体的に教えてください。
でむ
でむさん、こんにちわ。
ODEで描写した物体の位置座標を関数で制御したいのですが、
どうすれば良いでしょうか?
demu 様
やはりそうですか。
かなりショックです。
物理学、動力学、数学、英語力、全てに置いて
私には力が足りません。
本家のメーリングリストに質問するなんて、無理です(泣)
所で、ODEは、面白いですねぇ!
本もあるし、メーリングリストもあるし・・・
後、私が考えるには、刃物の面を平面方程式において、部材との交点を求める位か?
でも、それは、酒のつまみには、ちょっと重たいし・・・
又、これからも聞く事があると思いますが、よろしくお願いします。
ありがとうございました。
鉄さん,
私の環境でも同じ結果になるか試してみたいので以下を教えてください.
1.完全なソースコード
2.コンパイラのオプション
3.gccのバージョン
4.CPU
でむ
でむさん
以前にVC++とLinuxの疑問について質問させていただきました鉄です。
VC++とmingwの違いを調べる前に,本当にmingwとlinuxが同じなのかを調べました。今回は円周率(M_PI)がprintf文でどこまでの値をとるのかを調べました.その結果,
mingwは小数点以下第16位
linuxは小数点以下第48位
までの値をとりました.
この場合,何を改良すれば,mingwとlinuxが同じ浮動小数点を取るようになるのでしょうか?
できるだけ詳しく宜しくお願いします.
渡辺豊樹様、
接触点と貫通点は物理的に違うので、そのような用途には使えないと考えます。ODEでは接触点が拘束条件として計算されますが、貫通点では物理的に違いますよね。ODEは剛体の動力学計算エンジンなので、剛体に別の剛体が貫通することは想定外なのではないでしょうか。
でも、衝突検出時に、接触点を計算するので、渡辺さんの方法でも接触点が計算されても良いとも考えます。非常に難しいご質問なので是非ご本家さまのODE Mailing List
http://groups.google.com/group/ode-users
でご質問してください。
でむ
Kumaさん、
空だけが灰色になる状態ですか?
ODE付属のデモプログラムも同様な表示でしょうか?
drawstuff/textures以下のディレクトリを、表示したいプログラムの直下においてパスを変更しても同じ症状ですか?
それでもだめな場合、ライブラリをDLL(動的)の場合、LIB(静的)にしてもだめでしょうか?
それでもだめなら、グラフィクスカードのドライバを変えたりするしか、お酒を飲んでいる今は思いつきません。
でむ@麦とポップ、私もビールと間違いました。レモンを入れるとコロナビールよりおいしいと感じます。
はじめまして。
テクスチャはしっかり指定できていると思うのですが、skyppmが生きていないのか雲が表示されません。
これは何が原因なのでしょうか?
一度コピー元のフォルダからもう一度コピーしたりもしています。
設定をどこかでいぢってしまったのでしょうか?
はじめまして。
ODE初心者のなべ、と申します。
早速ですが、接触点について質問させて頂きます。
オブジェクト直方体を2個用意し、(1個は、棒、もう一つは、刃物(面))
矢が的を打ち抜いた様な感じで空中に作ります。
その時の条件、棒と刃物の高さは、一定にし刃物だけを
回転、斜めに寝かす等して棒との交点を求めます。、
(棒と刃の交点、刃の面 4点 * 2面=8個存在するはずです。)
接触点と交点は同じものと考えています?
棒の高さが100mmであれば、交点のZは、100mm。
(材の高さのオフセットは、無視。)
初期状態で刃物が90度の時は、100mm が出ますが、
刃物を回転させると、100mmが出ません。
平面上のXY座標は、よさそうです?。
(テストプログラムが悪くて刃物を回転させる所で、バグがあるかもしれませんが?)
どのようにしたら、その交点を求める事が可能でしょうか。
現状は
nearCallback(void *data, dGeomID o1, dGeomID o2)
{
n = dCollide(o1,o2,N,&contact[0].geom,sizeof(dContact));
contact[i].geom.pos[0] // X座標
contact[i].geom.pos[1] // Y座標
contact[i].geom.pos[2] // Z座標
この変数を見ています。
(現バージョンでは、円柱は、交点nが0で、四角形でないと計算出来ない?)
その他
1.実際は、8点の交点が出ないので、上の刃と下の刃を用意し、各4点ずつの
交点を出すようにしています。
2.直方体を作り空中に浮かせ-9.8の重力で落下させ、地面の上で停止。
この時の交点数がn=3と出ますが、4が正しいのでは?
3.環境は、WindowsXP、Visual C++2008EE
最終的には、ロボットアームの先に刃物を持たせ材をカットし
その部材を作る為にロボットアームの角度等のシミュレーションをしたいと考えています。
(次期バージョンで一個のオブジェからカットされた複数のオブジェが出来れば理想ですが?)
以上、よろしくお願い致します。
demu さん
コメントありがとうございます.
一度,試してみます.
ラーメンマンさん,
heightfieldを使えば良いと思います.
ODE付属デモプログラムdemo_heightfield.cppがその例です.全体は平面ですが,原点付近が不整地と考えることのできるheightfieldになっています.
詳しくは,ODE Wikiの以下のページをご覧ください.
http://opende.sourceforge.net/mediawiki-1.6.10/index.php/DHeightfield
でむ
でむさん,こんにちは.
現在,ODEで作ったロボットを不整地面(デコボコ道)で動かしたいと考えているのですが,フラットな地面をある区画(部分)だけ不整地にするには,どのようにプログラムを変更すれば宜しいのでしょうか?
宜しくお願いします.
goさん、
Wikiを拝見しましたが、コメントが詳しく多くの方の参考になると思います。
左上のアニメがかわいいですね。
また、よろしくお願いします。
でむ
たろーさん、
ODE+drawstuffでは3Dオブジェクトファイル(3dsやXファイルなど)を読み込むAPIがないのでポリゴン(三角メッシュ)を簡単に扱うことができません。以下のページが参考になると思いますが、ODE講座22の手法は現在使っていません。ODE+Irrlichtでこの問題に対処しようとしています。
ODE講座22:ODEでポリゴンを簡単に表示する方法 07/11/01
RoboCup Simulator Dev 第5回 「Xファイルを読み込む」
でむ
こんにちは、とりあえずWinForm内部でIrrlichtとODEが使える感じでしたので報告など。(WinForm + Irrlicht 及び Irrlicht + ODEは確認済み まだ、3つを統合したサンプルは作ってませんが)
とりあえず、オープンできる内容については、wikiをつくって、公開しだましたので参考程度にはなるかと
http://柊つかさ.jp/wiki/index.php?title=ODE%E3%81%A8Irrlicht%E3%81%A8%E3%81%AE%E9%80%A3%E6%90%BA%E6%89%8B%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6#.E5.AE.9F.E8.A1.8C.E7.94.BB.E9.9D.A2
http://柊つかさ.jp/wiki/index.php?title=Irrlicht%E4%BD%9C%E6%A5%AD%E4%B8%AD#IrrlichtManager.E3.81.9D.E3.81.AE2
demuさん
いつもお世話になっております.
一つ質問があります.
ODE上にTeapotのような複雑な物体を配置するには
どのようなアプローチを取ればいいでしょうか?
ロボットハンドでつかんで運ぶようなことをやりたいのですが...
了解しました。 何かしら作ったらwikiにでものせるつもりです
OpenScenGraphはこれで見る限りちょっと使いずらそうですね http://www.devmaster.net/engines/ http://www.devmaster.net/engines/engine_details.php?id=59
お久しぶりです。韓国のゼスンです。
Irrlicht+ODEで新しくdrawstuffを作りそうですね。この方法ならWINDOWS BASEのプログラム方法も見つられると思います。一様OSGはMFCを支援するし、OSD+ODEの応用を見たことがあります。今後もいろいろ質問しますからお願いします。
goさん、
はじめはOpenGLベースのOpenSceneGrapahにしようと考え、学生にインストールしてもらいましたが、どうしてもソースをコンパイルできないという泣きが入り初心者には向いてないと判断しました。
Irrlicht+ODEの問題点は座標系が左手系と右手系なので、いちいち変換しなければならない点ですね。
何か作品ができたら教えてください。
でむ
む、そうですね。 Ogreはちょっともっさりしてて、とっつきにくい感じでした。
ODE以外ではどうか知りませんが、Irrlicht + ODEの場合だと、互いに個別にインストールしたにもかかわらず、Irrlicht内部でODEを使えたのは依存性とかの問題を考慮しても、長所になると思います。
OpenSceneGraphはよく知りません。 まぁとりあえずはIrrlichtでやってみます。。
goさん、
Irrlicht以外にOgreやOpenSceneGraphなども検討しましたが、その中でIrrlichtは資料が多くわかりやすいですね。また、Irrlichtはその他のライブラリにあまり依存せず、インストールが簡単な点が良いと思います。
でむ
む、すばやい返答ありがとうございます><
そうですか、win のformに描画する方法は色々と調べてみますね。irrlicht + odeでやるというのは、irrrlichtのtutorialのサンプルで、winのapplicationの一部にodeの動作を描画できる方法についての説明があったので、できる事がわかっていたからです。。 irrlichtの便利な点はいろいろな拡張子のファイルを容易に読み込み処理できるという点にありますよね。。 odeとの対応も進んでるし(個別に扱えるのもいい)
まぁ、別にirrlichtにこだわる必要はないのですが、ogreとかcyber spaceだとやり方がわからないというのもあります。。
というわけで、ありがとうございます
goさん、
はじめまして。
私はWindowsプログラマーではないので、Windowsのプログラミングについてはほとんどわかりません。
ご質問の回答になっていないと思いますが、ODE付属のグラフィクスライブラリであるdrawstuffはデモを動かすための最低限の機能しかないので、私もIrrlichtとODEで開発を進めています。
でむ
質問です。 私は今windowsのform内部でODEを動かそうとしてるのですか、動かす方法はあるのでしょうか?
昔XNAでやったときはwindowsのpictureboxなりなんなりに関連付けることができたので、できるような気がするのですが。。
よろしければ返答お願いします>< できない場合はIrrlicht + ODE で実行するつもりです。。
としさん,
解決おめでとうございます。少し調べて見ましたが,このエラーは使用環境に大きく依存するようなのでお力になれませんでした。
コメント頂いてありがとうございました。同じようなエラーに遭遇した方に参考になると思われます。
また,何かあれば質問してくださいね。
でむ
でむさん
やっと解決できました!ありがとうございました!
このエラーが出た別のPCにリモートログインしてODEを使う予定でしたが
ローカルでも使えなければ意味がないと思い色々調べていました。
結局のところ、ライブラリを足せば解決しましたが
いくつか試してみた結果なのでそれが本質かどうかはわかりません。
とりあえずやったを載せておきます。
エラー:
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 1 (X_CreateWindow)
Serial number of failed request: 9
Current serial number in output stream: 11
原因:
X_CreateWindowでエラーが出ていて、エラーの種類はBadMatchである。
このエラーは解像度やdepthなどの不一致によって起こる…らしい。
最終的な解決策:
・libglu1-mesa-dev、libglu1-xorg-devのインストール
以下、やったこと
・/etc/X11/xorg.confの設定
Section “Screen” に
Defaultdepth 24
SubSection “Display”
Depth 24
Modes “1280×800″ “1152×864″ “1024×768″ “800×600″
EndSubSection
他にもいじると、何回かwindowがおかしくなりました。
ただ、解決後に元に戻してもうまくいったのでこれは関係ないと思います。
・自分のPCのグラフィックカードのconfigration toolとdriverのインストール
僕はnvidiaだったので、nvidia-xconfigとnvidia-glxをインストールしました。
インストールしてみたところいくつかライブラリが消えていました。
その結果、コンパイルができなくなるという別のエラーが出てきたので、上のライブラリをインストールすると問題解決に至りました。
以上になりますが、恥ずかしながら結局原因はわかっていません。
ライブラリが足りなかったのか、余分にインストールしてたのが悪さをしてうまく消えてくれたのか・・・
とりあえず、解決したので一安心です。
本当にお世話になりました。ありがとうございました。
ぽったーさん,
はい。nはODE本P15の31行目に書いてあるとおりに接触点数です。球と平面だと接触点数は1ですからね。
また,遊びにきてください。
でむ
でむさん
ありがとうございます.
接触点というのは,サンプルプログラムでいうと n のことですよね.
N が大きいほど正確なのかと勘違いしてかなり大きくしていましたが,想像以上に n が小さく拍子抜けでした...
お早い対応ありがとうございました.
ぽったーさん
接触点の数はシミュレーションによって違うので、ご自分のシミュレーションで接触点がどのくらいあるか表示して、そのうえでNの値を設定してください。Nは配列の上限を設定しているので、少し多めにとっておけば良いと思います。Nが接触点数より小さい場合は、その分だけ拘束条件を計算していないのでシミュレーションが不正確になります。
ODE本のサンプルプログラムなら10もあれば良いでしょうが、ポリゴン(三角メッシュ)などを使う場合は多く設定する必要があると思います。
でむ
でむさん
お元気ですか?
繰り返し計算のサンプルプログラム,ありがとうございました.
以前,描画の有無で結果が異なる...といった質問をしていたかと思いますが,サンプルプログラムのおかげで,そのようなトラブルもなくシミュレーションできています.
今回の質問は,接触の関数のパラメータについてです.
ODE本のp.15のサンプルプログラムの25,26行目で,N=10 としていると思います.
このNの値は大きいほうが接触点が増加し,正確にシミュレーションができるのでしょうか?それとも,だいたい10であれば十分なのでしょうか?
お忙しいかと思いますが,よろしくお願いします.
としさん、
Ubuntu8.04をお使いですか。UbuntuとODEを使っている人がまわりに多いですが、特にそのような問題に出会ったことはありません。
古いですが、以下のサイトは参考になります。Windowを作ろうとした時に、何らかの属性値が無効な値であるため生ずるエラーのようです。
http://myt.ag/URLWeb.aspx?email=steve@fooworks.com&url=http://www.rahul.net/kenton/perrors.html&sn=
問題が解決したら教えてください。
でむ
でむさん、
返答ありがとうございます。
ubuntu8.04を使っています。
色々検索してみたもののめぼしい情報は見つかりませんでした。
ダイレクトな解決策もないのでいくつかの情報を頼りにXのファイルもいじって
どこでエラーが出ているのかはわかりましたが
そこから根本的な原因を見つけるには至りませんでした。
原因がわからないので対処法を模索していますが、なにか方法があれば教えていただければうれしいです。
とりあえず、うまくいく保証はないですが近いうちにubuntuの再インストールか、あきらめてwindowsを使うかなどを考えています。
ろぼさん,
ご存知だと思いますが,ODEは動力学計算ライブラリで,3D描画ライブラリdrawstuffはデモ用の簡単なものです。
ですから,ODEではカメラビューのシミュレーションはできませんし,drawstuffにはそのような機能はありません。
ODEの弱いところではありませんが,グラフィクス表示に良いライブラリがあれば良いですね。
でむ
でむさん、こんにちは。
突然すいません。
シミュレータを始めようと思っているのですが、
カメラを作成した上で、そのカメラのビューをシミュレートすることなど
ODE上で可能なのでしょうか。
カメラビューからの見え方、焦点距離などをシミュレーションしたいと思っております。
としさん、
結論からいうと、drawstuffではなくLinuxの設定が問題だと思われます。Linuxはどのディストリビューションをお使いですか?
解像度やフォントの設定が悪い、あるいはリモートから起動して、ディスプレイの環境設定をうまくしていないなど、とにかく何らかの理由によりWindowを新しく作れないことが原因だという報告がありました。
googleで以下を検索してみてください。としさんの解決になるヒントが見つかるかもしれません。
Major opcode of failed request: 1 (X_CreateWindow)
お力になれずすみません。
でむ
でむさん,はじめまして
最近,linuxでODEをインストールしてみました.
デモを使ってみようとしたところ,以下のようなエラーが出ました.
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 1 (X_CreateWindow)
Serial number of failed request: 9
Current serial number in output stream: 11
ドロースタッフのところで出ているようです.
なにかご存知のことがあればおしえていただけないでしょうか.
でむさん、はじめまして
linux環境でODEをインストールしました.
デモを見ようとコンパイルして実行したところ、ドロースタッフのところで以下のようなエラーが出ました。
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 1 (X_CreateWindow)
Serial number of failed request: 9
Current serial number in output stream: 11
解決策が見つからずに困っています。
このようなエラーは過去にはないようですが、いかがでしょうか。
よろしくお願いします。
ゼスンさん,
はじめまして!
私の大学では昨年,ソウル産業大学と提携を結び,その関係で何度か韓国へ行きました。韓国の学生さんからコメントを頂けてうれしいです。
さて,ご質問の件ですが,私はMFCを使ったことがないので具体的にどうすれば良いかわかりません。ただ,ODEはライブラリなのでヘッダファイルをインクルードして,ライブラリをリンクすれば良いとは思うのですが…
でむ
こんにちは。
韓国の学生です。ODEのことを見つかってから、本も買ってこのサイトも見ていろいろ助かりました。ところでVS2008を利用してMFCの中でODEを使う方法はないでしょうか。できるようにも見えますけど自分でやるには限界ですね。
日本語が下駄でよく伝えたかわかりませんね。よろしくお願いします。
でむさん,お返事ありがとうございます。
さっそくトライしてみます。まだ勉強を始めたばっかりで至らない点が多々ありますが,わからないことがあったらまた質問させていただきます。よろしくお願いします。
takeさん,
表紙にのっているハンドなら簡単です.ロボットアーム先端のリンクに3つのカプセルをヒンジジョイントで付ければ良いだけです.具体的なコードはロボットアームとほとんど同じになります.
この説明でわからない場合は,具体的にどこがわからないか教えてください.恐らく,ODE本を読んだだけではわからない,ODEを初めて学ぶ人にとって共通の問題だと思います.
でむ
でむさんはじめまして.
私は現在ODEについて勉強しており,本に載っているようなものをつかめるロボットアームを作成しようとしています.しかし,どうやってハンドの部分を実装すればよいかがわかりません.具体的なプログラムの書き方を教えてください.
よろしくお願いします.
でむさん,
こちらこそ言葉足らずの説明ですみませんでした.
サンプルソース,ありがとうございます.さっそくコンパイルして,何回シミュレーションしても球が描写されることや,球の大きさが変更できることを確認しました.
ありがとうございました.
ポッターさん,
言葉足らずですみません.何度もウインドウが開いては閉じるという意味でした.ポッターさんの現象を確認できました.確かに,球だと2回目以降は表示されません.Linuxでも同様な現象を確認できましたが,原因を特定できていません.
ウインドウを試行毎に閉じたり開いたりする必要はないと考えますので,以下のコードではだめでしょうか?大きさ,質量,反発係数などはsimLoop関数の if (simtime > 3000) { }の中でお好きなように設定してください.
void simLoop(int pause)
{
static int simtime = 0;
dWorldStep(world, 0.01);
dsSetColor(1.0, 0.0, 0.0);
const dReal *pos = dBodyGetPosition(apple);
const dReal *R = dBodyGetRotation(apple);
dsDrawSphereD(pos,R,r);
printf(”apple position z=%f\n”,pos[2]);
simtime++;
if (simtime > 3000)
{
//dsStop();
simtime = 0;
dBodyDestroy(apple);
apple = dBodyCreate(world);
dMass mass;
dMassSetZero(&mass);
dMassSetSphereTotal(&mass,m,r);
dBodySetMass(apple,&mass);
dBodySetPosition(apple, 0, 0, 2);
}
}
int main(int argc, char **argv)
{
setDrawStuff();
world = dWorldCreate();
dWorldSetGravity(world, 0, 0, -0.01);
//while (1)
//{
apple = dBodyCreate(world);
dMass mass;
dMassSetZero(&mass);
dMassSetSphereTotal(&mass,m,r);
dBodySetMass(apple,&mass);
dBodySetPosition(apple, 0, 0, 2);
dsSimulationLoop(argc, argv, 640, 480, &fn);
//}
dWorldDestroy(world);
return 0;
}
でむ
でむさん,
質問ですが,私が載せたプログラムをでむさんの環境で実行した場合,描画ウインドウがたくさん表示されるのでしょうか?
私の環境(windows xp, msys, ode0.9)の場合,描画ウインドウが表示されて,時間が来ると閉じて,改めてウインドウが表示されています.このとき,球だと二回目以降のウインドウで赤い玉が描画されず,ボックスだと描画されています.
申し訳ないですが,簡単な繰り返し計算のプログラムを教えていただけませんか?
例えば同じappleが落下するプログラムで,1回目と2回目で大きさや重さ,反発係数などのパラメータが変化するものが良いのですが...
宜しくお願いします.
たくさん,
ハードウェアベースのDEPサポートですか。勉強になりました。また,何かありましたらコメントください。
でむ
でむさん,こんにちは
返答ありがとうございました。
返事が遅くなってすいません。
1月前にデータ実行防止について質問した件ですが、無事demo_basket.exeを起動できました。システムプロパティからは解決できなかったのですが、
BIOSの設定変更からできました。理由はプロセッサがハードウェアベースのDEPをサポートしていたからでした。
やっとこれではじめられます。
ありがとうございました。
たろーさん,
お久しぶり。
ODEはオープンソースですから,ご自分でソースを書き換えれば何でもできます。
drawstuff.cppの1080行目にあるdsDrawFrame()の1114行目から光源の設定なのでそれを変更すれば良いと思います。なお,drawstuffはOpenGLを使っているのでOpenGLの知識が必要です。
でむ
ぽったーさん,
ご質問を誤解していました。さて,見せて頂いたプログラムのようにwhileループの中に,dsSimulationLoopを入れるとウインドウがいくつも開いてしまうのでやらない法が良いと考えます。
スピードをあまり気にしないのなら,simLoop関数の中の描画命令をキーボードや繰り返し回数でON/OFFすれば良いでしょう。スピードを気にする場合はdrawstuffを変更する必要があります。
なお,drawstuffのバグかどうかに関する質問は良くわかりません。私の環境では問題なく球もボックスも表示されました。参考までに環境を教えてください。
ただ,現在,drawstuff上位互換ライブラリを作っていて,球だと表示されますが,ボックスだと表示されない現象が生じています。drawstuffのコードを参考にIrrlichtで作っているので,drawstuffのバグかもしれませんが,原因が特定できていません。
でむ
でむさん,
もしかすると,私の質問が悪くて意図が伝わっていなかったかもしれません...申し訳ないです.
単純にwhile(1)をはずすと,dsStop()の処理のあとシミュレーションが終了してしまいます.そうではなく,例えば遺伝的アルゴリズムなどのシミュレーションのように,何回も繰り返してシミュレーションをしたいと考えています.
その場合もwhile(1)を使用しないほうがよろしいでしょうか?
ちなみに前回質問したプログラムで,描画を球からボックスに変更するとwhile(1)で繰り返しても描画されました.(ある意味目的を達成できました.)
こちらはdrawstuffのほうのバグでしょうか...
お久しぶりです、でむさん。
一つ質問がありますのでご回答いただければ幸いです。
ODEのシミュレーションの画面の照明条件を変えて
実行することはできるのでしょうか?
具体的には、全体を明るくしたり、暗くしたりなどです。
描画関連だからdrawstuffあたりを見ているのですが、いまいち
わかりません!
demu さん,
drawstuff.cpp を見たら簡単な記述でピラミッドグリッドを描画していたので,すぐに変更できまた.
ありがとうございました.
ぽったーさん,
OFF会?やりましたよね。
さて,ソースコードを読んだところdsSimulationLoopをwhile文に入れているところがおかしいです。 dsSimulationLoopの中身はwhile文になっているので必要ありません。whileに入れるとウインドウがいくつも生成されてしまいます。
私の環境(Windows Vista, g++, ODE0.10.1)では,while文を取ると問題なくうまくいっています。while文をとって試してみてください。他のことが原因かもしれません。
でむ
skasaiさん,
drawstuff.cppのコードをいじる必要があります。地面のマーカーはピラミッドグリッドと呼ばれています。
1044行目から1077行目にあるdrawPyramidGrid()のfor文をいじれば簡単に変更可能だと思います。 大きさも簡単に変更できます。1061行目のkの値を変更してみてください。
でむ
でむさん
お久しぶり(?)です,ぽったーです
最近,繰り返し計算を必要とするシミュレーションをプログラムしたところ,なぜかシミュレーションの1回目のみ物体が描画され,2回目以降描画されなくなりました.確認のため,hello.cppをもとに繰り返し計算するプログラムにおいても同様の結果となりました.
ソースファイルを載せますので,確認をして頂けますか?
お忙しいかと思いますが,宜しくお願い致します.
/*———- 以下ソースファイル ———-*/
#include
#include
dWorldID world;
dBodyID apple;
dReal r = 0.2, m = 1.0;
dsFunctions fn;
void simLoop(int pause)
{
static int simtime = 0;
dWorldStep(world, 0.01);
dsSetColor(1.0, 0.0, 0.0);
const dReal *pos = dBodyGetPosition(apple);
const dReal *R = dBodyGetRotation(apple);
dsDrawSphereD(pos,R,r);
printf(”apple position z = %f\n”, pos[2]);
simtime++;
if(simtime > 3000) {
simtime = 0;
dsStop();
}
}
void stop()
{
}
void start()
{
}
void setDrawStuff()
{
fn.version = DS_VERSION;
fn.start = &start;
fn.step = &simLoop;
fn.stop = &stop;
fn.path_to_textures = “../../drawstuff/textures”;
}
int main(int argc, char **argv)
{
setDrawStuff();
world = dWorldCreate();
dWorldSetGravity(world, 0, 0, -0.01);
while(1) {
apple = dBodyCreate(world);
dMass mass;
dMassSetZero(&mass);
dMassSetSphereTotal(&mass,m,r);
dBodySetMass(apple,&mass);
dBodySetPosition(apple, 0, 0, 2);
dsSimulationLoop(argc, argv, 640, 480, &fn);
}
dWorldDestroy(world);
return 0;
}
お世話になります.
地面(z=0の面)には黄色や赤や青のマーカーがあります.
これらマーカーを制御する方法を知りたいです.
特に期待したいのは,z軸方向を含む表示のONOFF,間隔と数の変更です.
色,大きさもいじることができのでしたら,尚うれしいです.
パラメータを変更して,容易に変更可能でしょうか.
drawstuffのソースをいじる必要があるのでしたら,どのあたりでしょうか.
ご教授いただくことできませんか.
yoshiさん,
すみませんが,開発環境(Windows, コンパイラ)とどのページを手順どおりやったか教えてください。
おそらくincludeファイルのパスが設定されていないように思われますが。
でむ
demuさんはじめまして。
C++で手順通りにやって、pro1-1のプログラムをビルドすると
fatal error C1083: include ファイルを開けません。’ode/ode.h’: No such file or directory
という、エラーが出るんですがどうすれば良いですか?
鉄さん,
コメントありがとうございます.
興味深い御指摘なので調べてみたいのですが,9月9日からロボット学会がありその準備のため調べる時間がありません. 開発中のdrawstuff互換ライブラリについてお話する予定ですがあまり進んでいません...
さて,ウェブでは以下のサイトが少し関係ありそうですが試していないのでわかりません.
http://homepage1.nifty.com/herumi/prog/prog90.html
上のページにあるWindowsの演算精度をLinuxと同じ64ビットに変更したらどうなりますか?
また,Windows上ではVC++とgccの値は異なるでしょうか?
お時間があれば試して結果を教えて頂けるとありがたいです.
でむ
でむさん。度々申し訳ありません。
先ほど,ode-src-0.8.zipをインストールし直してtest_basketの例で
バスケットボールの各ステップごとの位置を取得したところ,
やはりVC++とLinuxとでセンサの取得結果の違いがでました。
これは,OSの違いから来るものなのでしょうか?
でむさん.はじめまして.
さっそく質問なのですが,VC++とLinuxとで同じプログラムをコンパイルしたところ,微妙に違う計算結果が現れました.
違う計算結果と言っても,似た値は出力されているのですが,これはどのようなことが原因で起こっているのでしょうか?
ちなみに,このサイトに乗っているセンサの取得実験で確かめました.
toshiさん,
すみませんが,VC#は使ったことがないのでわかりません.
でむ
demuさん初めまして.
これからODEを使って研究を行うのですが,VC++ではなく,VC#を使おうと考えています。
VC#でODEを使えるようにする方法を教えてください.
でむさん、
さっそく返事をいただき、ありがとうございました。
教えて頂いたODE Wikiのページも読んでみました。
OPCODEとGIMPACTをライブラリにしているので、直接使っているのかと思っていました。
Trimeshを使った場合以外は使用していないようですね。
また質問させて頂きます。
Yamaさん,
はじめまして!
ODEでは,AABBしかサポートしていません.つまり,ご自分で実装するしかありません.
なお,衝突検出空間としては,dSimpleSpace, dQuadTreeSpace, dHashSpace, dSAPSpaceを選択可能です.衝突検出に関してはODE Wikiの次のページを是非1読願います.
http://opende.sourceforge.net/mediawiki-1.6.10/index.php/How_Collision_Detection_Works
でむ
じろうさん,
Windows Vista Business, Visual C++ 2008 EEでは問題なくビルドできました.ご使用の環境を教えてください.
でむ
でむさん,こんにちは.
初めて質問します。
OBBによる衝突検出を試したいのですが、どのようにしたらよいでしょうか。
よろしくお願いします。
でむさん,ご指摘ありがとうございます.
ですが,問題の箇所を修正しても同じエラーが出てきてしまいました(><;)
重ねての質問になってしまうのですが,
ポリゴンの描画に使用しているdsDrawTriangleで描画される三角形に
表や裏といった概念はあるのでしょうか?
dsDrawTriangleで描画した図形で
思い通りに面が描かれている部分とそうでない部分があったので・・・
じろうさん,
ソースコードを拝見しましたが,ODEの問題ではなく配列の宣言に問題があるようです.
でむ
tetuさん,
良い本をご紹介頂きありがとうございます.ODEは剛体の動力学計算エンジンなので,人体を剛体近似できない場合の運動解析に利用するのは難しいかもしれません.
また,初音ミクの挙動がおかしいという現象は見ていないのでわかりませんが,恐らく衝突検出の部分だと思われます.ODEは衝突ライブラリとしてOPCODEを標準として使っていますが,GimpactやOPCODEを改善したものもビルドのオプションで利用できるので試してみてはいかがでしょうか?
それでも,だめな場合は,ODEの本家メーリングリストに投稿すると次のバージョンでは改善するかもしれません.ODEはオープンソースなので,利用者がフィードバックすると益々良くなります.
でむ
申し訳ありません、以前に質問したのですが解決しました。
dInitODE();
dCloseODE();
をmain関数に入れることでERRORはなくなり解決しました。
demuさん
ソースプログラムを送付しました.
よろしくお願いします.
ODE0.9で動いていた、自分で作成したcppファイル(segwey.cpp)をode0.10.1で動かそうとしたのですが、
ODE INTEANAL ERROR 2
colliders array not initialized in dcollide()
と表示され動きません。
これを回避するにはどうしたらいいでしょうか?
よろしくお願いします。
じろうさん,
連絡先のメールアドレスにお願いします.
でむ
demuさん,返事が遅れてすみません.
趣味で作ったプログラムなのでソースの公開は問題ありません.
送付先は”連絡先のメールアドレス”でよろしいですか?
ODEで、人体の力学計算が、まったく手つかずというのはあまりに惜しい。
人体の運動学の教科書とかも手に取ってみて、
http://www.ishiyaku.co.jp/search/details.cfm?bookcode=215320
3DCGの動作がどうしておかしいのか考えてほしいです。
初音ミクとかね。
じろうさん,
私も原因を知りたいので,差支えがなければソースコードを送って頂けますか?
差支えがある場合は,その部分を取り除いて送ってください.
基本的にはこのページで公開します.
でむ
キャストの件ですが,
(const dReal *)で引数をキャストしても同様のエラーが出てきました.
floatでpos[3]とR[12]を定義して,dBodyGetPositionとdBodyGetRotationを代入するといった無理やりな方法で一応は実行できるようになりました.
サンプルプログラムは問題なく実行できました.
今後も原因を究明していこうとは思います.
たくさん、
私が試したときはデータ実行防止が働かなかったので原因がよくわかりません。
データ実行防止(DEP)を無効にする方法はネットを探すといろいろありますが、原因がわからないのでお勧めはできません。自己責任でお願いします。
コントロールパネル→システムとメンテナンス→システム→システムの詳細設定→パフォーマンス→設定→データの実行防止→重要なWindowsのプログラム及びサービスついてのみ有効にする(T)にチェックを入れる
でむ
でむさん,はじめまして
インストールについて教えていただきたいことがあります。
講義 Visual C++ 2008 Expression Editionに沿ってインストールしましたが、
データ実行防止が働いて、demo_basket.exeの起動に失敗してしまいました。
使用環境は以下のとおりです。
OS:vista
CPU:intel core2 duo
起動させる良い方法はないものでしょうか。
よろしくお願いします。
でむさん,早速のお返事ありがとうございます.
お盆期間は大学の電源が落とされているため,現在は試せる環境がありません.
来週の月曜日には,経過報告できると思います.
じろうさん,
初めまして
(const dReal *)で引数をキャストしてください。
エラーがでるということは、ODE本のサンプルプログラムもエラーがでますか? 私が、Visual C++ 2008 EEで試したときは問題はなかったと記憶していますが…
でむ
でむさん,はじめまして.
今年度から研究にODEを導入して現在勉強中の者です.
描画についての質問なのですが,
dsDrawSphere,dsDrawCylinderを使用したときに
”1 番目の引数を ‘const dReal *’ から ‘const float []‘ に変換できません.(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です.”
といったエラーメッセージが出てきてしまい実行できなくなってしまいます.
引数としてはdBodyGetPosition(torso.body)などを使用しています.
monoBot.cppなどのdsDrawSphereを使用している他のプログラムはちゃんと実行できます.
開発環境はVisual Stadio 2005 Professional です.
お忙しいと思いますが,どうぞよろしくお願いいたします.
tadaさん,
つくば市へ出張していて返事が遅くなりました.
さて,問題は全部解決したのでしょうか?
でむ
先ほどの質問は解決しました。
dInitODE(); と dCloseODE();
をメイン関数にいれてあげればいいだけでした。
プログラム2.5(ホッピングロボットを作ろう)においてビルドは成功するのですが、
”colliders array not initialized (c:\ode-0.10.0\ode\src\colision_kernel.cpp:256)”
というエラーが出てしまいます。
どのようにすれば解決するのでしょうか?
ご指導ください。
先ほどの問題は単にソースコードの間違いでした。
矢継ぎ早で申し訳ありませんがジョイントをHingeからその他(Ballなど)に変更する時、 ”識別子が見つかりませんでした”
となりコンパイルエラーとなってしまいます。どうすればよいのでしょうか?教えてください。
画像を表示する際
”Bad argument(s)(c:\ode-0.10.0\src\collision_kernel.cpp:462)”
なる表示が出てしまいます。ビルドは成功してるのにどうしてこのようになってしまうのでしょうか?
でむさん、ご返答ありがとうございます。
返事が遅くなってすいません。
わかりました。ありがとうございます。
また質問させてもらうかもしれませんが、そのときはまたお願いします。
かつさん,
おはようございます.
dWorldStep(dWorldID World, dReal stepsize)のstepsizeはシミュレーションを進める時間なので実時間とは直接関係ありません.
シミュレーションの時間と実時間を同一精度で終わらせるためには,シミュレーションの1ステップに要する実時間とstepsizeの時間を同じにする必要があります.
つまり,1ステップ(衝突検出,動力学計算,制御,描画等を全て含む)の時間を毎回計測し,それとstepsizeとの時間差分だけSleep()などを使って時間を調整すれば良いでしょう.
以上です.
でむ
demuさん,こんにちは.
ODE講座12のトルクセンサのプログラムで,x軸周りのトルクの表示をfeedback->t1[0]からfeedback->t2[0]に変更するとTx=4.9となるのはなぜでしょうか?軸周りに力がつりあうのならば,Tx=9.8となるのではないかと思うのですが.ただ単に私に物理のセンスがないだけでしょうか(^ ^;)
おでさん,
ODEは動力学計算エンジンなので,そのようなAPIはありません.回答したキーボードの入力はODEではなく,drawstuffというODE付属の3Dグラフィクスライブラリの機能です.
なお,PCから加速度センサの値を読めれば,その情報をODEで作成したワールドに反映することは可能だとは思います.
こんな回答でよろしいですか.
でむ
>ご回答ありがとうございます。
>言葉が足りなくてすいません。キーボードからの操作はできているのですが、
>加速度センサーなどを使ってPCの外部からも操作出来るんですか?
でむさん,こんにちは.
計算周期(ステップ)について質問があります.
P11にありますが,ODEで設定している0.01秒(10ms)というのは,あくまで計算上のステップであり,実時間とはリンクしない,
つまり,計算負荷が軽く・PCのスペックが高ければ計算それだけ計算スピードは早くなるわけですよね.
そこで質問なんですが,計算周期(タイミング)をWindowsタイマか何かを参照して,実時間のタイミングで計算させることはできるのでしょうか?
もちろん高い精度は無理でしょうが,10秒のシミュレーションを約10秒で終わらせることができたら良いなと思い質問しました.
よろしくお願いします.