ODE質問・要望募集4!

新しい質問や要望はこちらにお願いします!

なお、私のコメントやご自分の努力により問題が解決 された場合に、問題の原因がわかれば投稿して頂くと大変助かります。その情報はODEの初心者にとって重要なものです。ある程度たまりましたらFAQに掲載したいと思いますのでご協力のほどよろしくお願いします。

Comments

Posted by でむ

Lycorisさん,

はじめまして,

ODEの関節には摩擦がないので,ご自分で実装する必要があります.
ODE本P33のプログラム2.2に摩擦トルクを与えるコードがありますので参考にしてください.ここでは,回転速度に比例して摩擦トルクを与える簡単な摩擦モデルを関節に実装しています.

でむ

Posted by Lycoris

はじめましてLycorisと言います

椅子などについているキャスター部分を作っているのですが、ジョイント部分に抵抗が無いため動き出すととまりません。
減衰的作用の関数は自分で作らなければ無いのでしょうか?

Posted by でむ

tiroさん、

今まで、テキストエディタに関する記事が一切なかったことに気づかされました。terapadのインストールと設定に関する記事をODE本のカテゴリに追加しましたので、良かったら読んでください。

全くの初心者でもODE本と本サイトを読めば、簡単なロボットシミュレータを作ることを目標としていますので、今後ともよろしくお願いします。

Posted by tiro [TypeKey Profile Page]

でむさん、

解説ありがとうございます。
TERAPADをインストールしソースコードを打ち込んでいくことができました。

Posted by でむ

tiroさん、

ODE本をご購入頂きまして、ありがとうございます。
初心者を対象に執筆しているので、わかりづらい箇所があればご指摘ください。

さて、以下回答します。
1. cppファイルのソースコード名を変更しなければmakefileの中身を書き換える必要はありません。ただ、通常は問題毎にフォルダ(ディレクトリ)を作り、ソースコード名も変更します。
その場合、hello.cppのファイル名をhello2.cppに変更したら、makefileの2行目にあるTARGET = の右辺をhello2に変更します。

2. ご自分でソースコードを作成するときは、何かのエディターを使ってください。私の授業ではterapadを使っています。ネットを検索すると見つかります。なお、メモ帳は改行に問題があるのでお勧めできません。

3. makefileはterapadなどのエディターで開いてください。

でむ

Posted by でむ

mommaさん、

イベントで迷路が好評だったとのこと。よかったですね。
何かあったら、また聞いてください。

でむ

Posted by tiro [TypeKey Profile Page]

はじめまして。 貴方の御本を購入しプログラミングとロボットシミュレーションにいそしんでおります。理解しやすい丁寧な説明は、初心者である私にとって大変ありがたいものです。ありがとうございます。ところで2.3質問があります。
まず一つ目は、本の中のEXを試すため、たとえばp13ページのEX1.3で「重力加速度を変更して~」のようにソースコードを変更しなければならないとき、サイトからダウンロードさせて頂いたファイルの中で変更しなければならないのは、cppフアイルのソースコードのみでよいのでしょうか?ほかのフアイル,例えばmakefileなどはいじらなくても良いのでしょうか?

二つめは、良くある質問のコーナーの11についてなのですが、まず自分でソースコードをつくるとき、メモ帳にソースコードをうちこんで、それをmyprogフォルダー内にいれればよいのですか?
次は説明文内の記述で「エディターを使いmakefileのTARGETを変更し・・・」と有りますが、makefileを開くことができないのですが、どうすればよいのでしょうか?
質問の内容が初歩的で大変恐縮ですが、よろしくお願いします。
年末でお忙しいでしょうから、年明けにでもよろしくお願いいたしますm(-。-)m

Posted by momma

でむさん

ご無沙汰しております。mommaです。
ようやくですが、Aモータのソースから作成したお遊びの迷路ゲームのソース公開となりました。
(ゴテゴテくっつけたので別物になりつつありますが)
実際にはJoystic等のセンサでコントローラを作成して、迷路を動かすようにしています。
イベントでもなかなか好評でした。
物理計算エンジンのお蔭で、こんなのも楽に作れて驚きです。

Posted by でむ

toshiさん

「地面との摩擦係数を物体毎に設定したいのですが、可能なのでしょうか?」というご質問ですが,可能です.

nearCallback関数の引数は接触する可能性がある2つのジオメトリのID番号です. if文などを使ってジオメトリ毎に好きな摩擦係数を設定してください.

でむ

Posted by でむ

やったーマンさん

ヤッターマンとは懐かしい響き...

さて、

1. すみませんが、ご質問の意味がよくわかりません。
  平面を描画するAPIはdsDrawPlane()です。

2.void dsDrawTriangle(const float p[3],const float R[12],const float *v0,const float *v1, const float *v2,int solid);

p[3]は位置,R[12]は回転行列,v0, v1, v2は三角形各頂点配列などへのポインタ,solidが0ならワイヤーフレーム,1なら面を表示します.

この程度の説明でよろしいでしょうか?

でむ

Posted by でむ

初心者さん

お返事が遅くなりすみません。年末なのでいろいろとありまして...

1. ODE本では簡単にするために例外処理はしていません。
 ご自分で例外処理を考える必要があります。
 (6.102)式の左辺の分母にあるS5を分子にもってきてください。

2.姿勢情報はどう与えれば良いかというご質問です。
 回転行列またはクオータニオンで設定することができます。

でむ

Posted by toshi

でむさん、以前質問させていただいたtoshiです

地面との摩擦係数を物体毎に設定したいのですが、可能なのでしょうか?
またその方法やヒントを教えていただけると助かります。

Posted by やったーマン

こんにちは。はじめまして。
卒業研究にむけて、ODEの本・サイトを参考にさせていただいております。

さて、質問なのですが
①平面のジオメトリを表す際描画APIは必要でしょうか?
②void dsDrawTriangle(const float p[3],const float R[12],const float *v0,const float *v1,
const float *v2,int solid);の使い方が分かりません。

よろしくお願いします。

Posted by 初心者

何度も申し訳ございません。
参考書「簡単!実践!ロボットシミュレーション」の6自由度アームロボットの学習をしていて二つ質問があります。

1:P179、式(6.103)の-b'z/S5とありますが、S5(sinθ5)が0の値をとるので、分母が0となりエラーが起こります。
  よくある質問にあるように、初期角度の設定ができないようなのでどうすればよいのでしょうか。
  前回、質問したエラーはこれが原因のようでした。

2:逆運動学とは"手先位置"と"姿勢"があたえられたとき、それを実現する間接角度を求めることですよね。
  6自由度のアームロボットに逆運動学を実装させたのですが、位置に関してはdrawP()関数によって位置情報を与えることができるのですが、姿勢情報はどのように与えればよいのでしょうか。

ご多忙の中大変申し訳ございません。

Posted by 初心者

でむさん、大変お忙しい中ご回答ありがとうございます。

なるほど!最近、式がsinやcosなどごちゃごちゃ複雑化してきているので、実際に数値を代入するなり確認してみます。

ありがとうございました!

Posted by でむ

初心者さん、

assertion "bNormalizaitionResult" failed in _dNormalize4()[../../include/ode/odemath.h]

このありがたくないメッセージがでるのは、dBodySetRotation()またはdBodySetQuaternion()の中で使われているクオータニオン(4元数)を正規化するときに、なんらかの理由で各要素の二乗和が0以下になる場合です。

このエラーメッセージだけでは原因がわかりません。

Posted by 初心者

現在、アームロボット関連でいろいろプログラムを作っています。
最近こんなエラーによく遭遇します。
コンパイルは成功し、実行ファイルを開こうとすると

ODE INTERNAL ERROR 1
assertion "bNormalizaitionResult" failed in _dNormalize4()[../../include/ode/odemath.h]

と表示され、シミュレーションは見れません。
どのようにすれば解決できるでしょうか?
よろしくお願いいたします。


Posted by でむ

チップさん

ご指摘ありがとうございます。
P112の車輪の長軸方向を2(y軸方向)としているのは誤りです。
24行目のdRFromAxisAndAngle()でy軸を中心に90度回転させて、円柱(車輪の軸)の向きをx軸と平行にしています。ですから長軸方向は2でなくて1でなければいけません。

でむ

Posted by チップ

でむさん、忙しい中ありがとうございます。

慣性テンソルについて、
色々調べてみたのですが・・・
どんなときにどんな値を入れればいいのか、正直よくわかりませんでした。
例えばODE本のp112で、車輪を作る際に、長軸方向を 2 とされていますが、
どうして、ここは 2 なのでしょうか?

dJointGetAMotorAngleRateについて、
なるほど、実装されてなかったんですね、
ボールにAモータをつけて動かしていたのですが、
ボールにもdJointGetBallAngleRateなんて実装されていませんよね?
dJointGetAMotorAngleRateが実相される日を待ったほうがいいかもしれませんね。
ソースコードなんて読めないので本当にありがたいです。どうもありがとうございました。

Posted by でむ

チップさん、

返事が遅くなりすみません。
師走だけあって忙しいです...

dJointGetAMotorAngleRateはソースコードを読むとまだ実装されていません。
AMotorは関節に標準で付いているモータより高性能なエーモータです。
使うときはヒンジなどの他の関節と組み合わせて使います。
その関節の角速度を取得してください。

でむ

Posted by でむ

チップさん、

dMassSetCylinder()の長軸方向を変えると慣性テンソルが変わります。静止しているときはわかりませんが、物体の挙動が変わります。

でむ

Posted by チップ

チップです。
先ほど質問したばかりで申し訳ないのですが、どうしても出来ないのでお願いします。
今、Aモータを使って振り子のようなものを作っています。
そこでp33のような摩擦モデルをAモータに適用しようと思いp93のAモータの角速度を出す関数
dJointGetAMotorAngleRateを使ってみたのですが、実行時に「not yet implemented」と出てしまいます。
なぜなのでしょう。。

Posted by Anonymous

こんにちは、チップです。
基本的な質問で申し訳ないのですが、カプセルや円柱を作るとき、
方向としてdirを1~3に設定するようになっていますが、
1にしても2にしても3にしても、何も変わらないように見えてしまいます。
一体どう違ってくるのでしょうか?

Posted by toshi

でむさん
理解しました。
お忙しい中、ありがとうございます。

Posted by へっぽこ

でむさんお久しぶりです。
以前、二足歩行について質問させてもらったへっぽこです。
シミュレーションスピードにむらが出てしまうという問題でしたが、
simLoop()内のステップサイズを上げたり、dWorldQuickStep()なども試し、
試行錯誤しましたが、いずれも精度が悪くなりキャラクタはこけてしまいます。
そこで、知人のマシンで同じプログラムをシミュレートしたところ、スムーズに歩いてくれました。
自分のノートPCでは限界があるのでは?ということで落ち着きました。
早速新たな壁にぶちあたってます。直進だけでなく、右や左にカーブを描いて歩行するようにしたいのですが、
どうにもこうにもいい方法が思い付きません...。何かヒントをいただけたら幸いです。
長々と失礼いたしました。

Posted by でむ

toshiさん、

dJointSetHingeParam()は角速度の設定です。dJointGetHingeAngleRate()でヒンジジョイントの角速度を取得してください(ODE本P33参照)。

でむ

Posted by toshi

初めてメールします。よろしくお願いします。

物体の回転速度を以下の命令で設定します。
①dJointSetHingeParam (djointID,dParamVel,dreal value);

その回転の実速度を以下の命令で読み込んだところ
②const dReal *VER_r = dBodyGetLinearVel(dbodyID);

①の速度設定値に対して、②は1/10の値となってしまっています。
何か設定や単位の違いなどがあるのでしょうか?

Posted by ぽったー

でむさん

ぽったーです

なるほど理解できました.
お忙しいところ,ありがとうございました.

Posted by でむ

ポッターさん、

dParamFMaxが定数である必要はありません。ODEに付属しているdemoのコードでは変数になっていると思います。ODE本では速く位置制御したいので大きな定数の値にしています。

ポッターさんのご指摘のとおりdParamVelとdParamFMaxは拘束として与えられます。(角)速度も制約として入ってきているので単純なトルク制御にならないと考えます。しかも、dParamFMaxは最大発揮できるトルク(最大値)なのでトルク制御は難しいでしょう。

ジョイントに内臓されているモータは、dParamVelの角速度または速度になるように最大dParamFMaxのトルクまたは力を加える働きをします。なお、dParamVelとdParamFMaxはヒンジジョイントの場合が角速度とトルクで、スライダジョイントの場合が速度と力になります。

なお、詳細についは以下のサイトをご覧ください。
http://www.ode.org/joints.pdf

Posted by ぽったー

でむさん

ぽったーです.

たしかにODE本のp.32-33に書いてありますね.
よく読まずに質問していました.
お忙しいところ申し訳ありません.

dJointSetHingeParam()ですが,dParamFMaxが定数である必要はありますか?
これを毎回計算して与えるとトルク制御に...なりますか?
わたしがソースを読んだ感じでは,dParamVelとdParamFMaxは
どちらも内部のモータのリミッタとして与えられているような気がします.

Posted by でむ

ポッターさん、

おひさしぶり。

ODE本のP32,33ページに記載していますが、
dJointSetHingeParam() は速度制御、
dJointAddHingeTorque()はトルク制御
に使います。

なお、dJointAddHingeTorque()は以下のソースコードのように、ボディにトルクを加えているだけです。ODEはオープンソースなのでソースコードを読むことをお勧めします。

void dJointAddHingeTorque (dJointID j, dReal torque)
{
dxJointHinge* joint = (dxJointHinge*)j;
dVector3 axis;

if (joint->flags & dJOINT_REVERSE)
torque = -torque;

getAxis (joint,axis,joint->axis1);
axis[0] *= torque;
axis[1] *= torque;
axis[2] *= torque;

if (joint->node[0].body != 0)
dBodyAddTorque (joint->node[0].body, axis[0], axis[1], axis[2]);
if (joint->node[1].body != 0)
dBodyAddTorque(joint->node[1].body, -axis[0], -axis[1], -axis[2]);
}

でむ

Posted by ぽったー

でむさん.

ぽったーです.

ジョイントの制御に関する質問です.
でむさんのサンプルプログラムで,車輪のヒンジジョイントを制御する際に
dJointSetHingeParam()
を使用していると思います.
これと
dJointAddHingeTorque()
を使用するのとでは,何が異なるのですか?

お忙しい時期だと思いますが,よろしくお願いします.

Posted by 初心者

お恥ずかしながら先ほどの質問はなかった事にしてください。
勘違いしていました。

Posted by 初心者

自信のあるプログラムだっただけに原因が全くわからず質問してしまいました。
すみませんでした。(^^;)


もうひとつ「簡単!実践!ロボットシミュレーション」の内容で質問してもよろしいでしょうか?

P160の図6.15と図6.16なのですが、3自由度のアームロボットは間接が見えイメージがつかみやすいのですが、6自由度となるとどこが4自由度目の間接で、どこが5自由度目の間接なのかイメージがつかめません。

イメージ的には図6.13の先端(3自由度のアームロボットの先端)にボールジョイント(ボールジョイントは確か3自由度ですよね?)をハンドの間にはさんだものがここで言う6自由度のアームロボットだと理解してもよろしいでしょうか?

Posted by でむ

初心者さん、

恐れ入りますが、プチプロジェクトの具体的な回答はお答えしない方針です。ODEの技術的な質問に限定させてください。

答えを教えるとプチプロジェクトの意味がありませんからね。私の経験では考えに考え考え抜くと不思議にわかるものです。頑張ってくださいね。

でむ

Posted by でむ

チップさん、

どうもありがとうございます。
ODE本の説明がわかりづらかったのが原因ですね。
言い訳するとページ数が限られていたので丁寧に説明できなかったのです。
わかりづらい箇所があれば、どんどん聞いてください。

でむ

Posted by へっぽこ

御返答ありがとうございます!
本家様を参考に頑張ってみたいとおもいます。

Posted by Anonymous

チップです。
>何が問題で関節中心点を取得できなかったか
GetHingeAnchorで取ってきた値を元に線を描写すると、どうもへんな場所に描写されていて、
(後から気がついたんですが、最初からヒンジの関節中心点の位置設定がおかしかったみたいです。)
それで、本当にGetHingeAnchorは関節中心点を取ってくる関数なのかと思って
本の説明を読んでみると、「ボディ1上での・・」と書かれていて、普通に読むとでむさんが言ったような意味に
とれるのですが、懐疑的に読んでしまったせいで(すいません)上が「座標的な意味での上」を指すのか、
「ボディ1において」の意味で使っているのかわからなくなってしまった次第です。ご迷惑おかけしました。

Posted by 初心者

今P181のプチプロ6.1に取り組んでいます。
円の媒介変数を用いて、以下のプログラムを追加したのですが、(-0.25,0.00,1.50)の位置になってしまうだけで、円軌道を描きません。アドバイスやヒントをお願いします。

/*** 円を描く関数 ***/
void ring()
{
float r, th, dth,; //変数定義
dth = 0.01*M_PI; //角度の刻みに値代入
r = 0.25; //半径に値代入
P[1] = 0.0;

for(th = 0.0; th <= 2M_PI; th=th+dth ){ //theta が0 から2π まで
  P[0] = r * cos(th);
  P[2] = r * sin(th) + 1.5;
}
}

/*** キー入力関数 ***/
void command2(int cmd)
{
switch (cmd) {
case '1': ANSWER = 1; break; // 1キーを押すと姿勢1

case 'r': ring(); break; // 円を描く関数ring()の実行
}
}

Posted by でむ

チップさん、

何が問題で関節中心点を取得できなかったか教えて頂けますか?
そこがわかりづらいポイントだと思いますので。

でむ

Posted by Anonymous

でむさん、ありがとうございます!
おかげで表示することが出来ました。
サンプルプログラムまで作っていただいて本当にありがたかったです。

Posted by でむ

へっぽこさん、

はじめまして。ご質問ありがとうございます。

ODEご本家様のHowtosにあるHOWTO integrate simulation and visualizationが参考になると思います。
http://opende.sourceforge.net/wiki/index.php/HOWTO_integrate_simulation_and_visualization

解決してもしなくても結果を教えて頂ければありがたいです。

でむ

Posted by へっぽこ

はじめまして。
現在、先生の本とサイトを参考に二足歩行にチャレンジしております。
サンプルプログラム、kensei,legged,warusapを改良して現段階では
危なっかしいながらも直進歩行するところまで完成しました。
そこで質問なんですが、実行するとスピードにむらが出てしまうのです...
(左脚が早くスムーズに動いたと思えば、急に右脚はゆっくり動くといったような)
マシンの計算能力の問題でしょうか?それともプログラム中に問題があるのでしょうか?
ちなみに、サンプルプログラムはテクスチャOFFにすれば問題なく実行できます。
初心者のため何かいいヒントをいただけたら幸いです。よろしくお願いします。

Posted by でむ

チップさん、

ご質問ありがとうございます。

dJointGetHingeAnchorで関節の中心点を取得できます。

ODE本(p86)で dJointGetHingeAnchorの説明「ボディ1上でのヒンジの中心点」とは、ボディ1に対応するヒンジの中心点です。dJointGetHingeAnchor2はボディ2に対応するヒンジの中心点です。

ヒンジを生成したときは両者の中心点は一致していますが、シミュレーションを重ねる度にずれが生じます。それぞれを直すのがEFPパラメータです。

なお、ヒンジ中心点を取得するサンプルコードを以下に示すので参考にしてください。

const dReal *pos[BODY_NUM],*R[BODY_NUM];
dMatrix3 R1;
dVector3 ap[BODY_NUM-1]; // anchor point
float ar = 0.06;        // anchor radius

   // draw anchors
dsSetColorAlpha(0.0, 0.0, 1.3, 1.0);
for (int i = 0; i < BODY_NUM-1; i++) {
dJointGetHingeAnchor(joint[i], ap[i]);
dsDrawSphere(ap[i], R1, ar);
}

  // draw lines
dsSetColorAlpha(1.3, 1.3, 1.3, 1.0);
for (int i = 0; i < BODY_NUM-1; i++) {
dsSetColorAlpha(1.3, 1.3, 1.3, 1.0);
dsDrawLine(pos[i], ap[i]);
dsSetColorAlpha(0.0, 0.0, 0.0, 1.0);
dsDrawLine(ap[i], pos[i+1]);
}

Posted by チップ

この前テクスチャの切り替えについて質問させていただいたチップです。

物体1と物体2をヒンジで結合させ、物体1から関節中心点を赤で、物体2から関節中心点を青で
dsDrawLineを用いて描写したいのですが、関節中心点の絶対座標が取得できません。
どうすればいいのでしょうか。

dJointGetHingeAnchorで出来るのかと思ったのですが、違ったようです。
ちなみに、ODE本(p86)で dJointGetHingeAnchorの説明を書かれていますが、その説明中の
「ボディ1上でのヒンジの中心点」とは一体何なのでしょうか。
すみませんがよろしくおねがいします。

Posted by 初心者

初心者

でむさん、ありがとうございます。
そうですよね!その文を追加していたのですが、跳ねていまう。
摩擦係数を0.0に設定してもだめでした。
原因は何かと、ゆっくりシミュレーションを見たところ、いきなり飛び跳ねていることがわかり、boxの初期位置に初歩的なミスをしていることがわかりました。
box=1.0でdBodySetPosition(ball.body, x0, y0, z0);がこのような状態でした。
つまり、地面のなかにboxがある状態?
dBodySetPosition(ball.body, x0, y0, z0+0.5);にしたら解決しました。
お騒がせすみませんでした。
ありがとうございました!

Posted by でむ

初心者さん、

コメントありがとうございます。

摩擦係数を変えるには、ODE本の89ページにあるようにmuを変えます。
具体例としてはP44 プログラム2.9の20行目にある
contact[i].surface.mu = dInfinity;
を変更します。dInifinityを設定したい摩擦係数に変更してください。

これではうまくいかないのでしょうか?

でむ

Posted by ひびきの

でむさん

修正しました。

あと、dLoadMeshFromX関数にも手を加えて、メモリ動的確保の部分と
ポリゴンデータの頂点数&三角メッシュ数の取得をまとめて処理できる
ようにしました。

新しいdLoadMeshFromX関数の使い方はリンク先に書いてあります。

MyTrimesh構造体を使うのがミソです。

Posted by 初心者

こんにちわ。

「ロボットシミュレーション」P35、EX2.2ですが、図2.1のようなプログラムを実行したところ、ジョイントが伸びるとともに真上に飛び跳ねてしまいました。
その時は、2つのboxの初期位置を地面から0.5[m]ほど上げると解決し、スライダージョイントの学習でしたのでそれでよしとしていました。
しかし、やはり気になり、boxと地面の摩擦抵抗が原因だと思いました。
そこで、P88~P90やODEのサンプルプログラム、test.cyl(斜面を立方体が滑り落ちるプログラム?)のプログラムのソースコードを参考にしたのですが、なかなかうまくはいきません。
地面との摩擦抵抗を変えるにはどうすればよいでしょうか。

Posted by でむ

ひびきのさん、

ごくろうさま。

ソースコードを読みましたが、質量設定やトライメッシュに対するsimLoopの処理が不完全です。demo_moving_trimesh.cppやODE講座22のソースを参考にしてください。

ODE本のトライメッシュに関するサンプルプログラムはODE-0.6の頃作成したので古くなっています。そのころと比較してトライメッシュの処理は劇的に良くなっています。

Posted by ひびきの

でむさん

出来ましたよ。

VertexCountとIndexCountを取得する関数を作って、
VerticesとIndicesをそれぞれmallocで動的メモリ確保するようにしました。

リンク先にソース(と説明)を置いています。

Posted by Rainlily

レスありがとうございます。

ジオメトリだけの場合で移動は毎フレームSetPosition()で指定すると
壁などですり抜けてしまうので何かいい方法はないかな、と思い質問させてもらいました。
ちなみに地形データはTriMeshで生成しています。

ちょっと余白部分が大きくなりますが一応球でそれっぽく見せられそうです。

Posted by でむ

Rainlilyさん、

はじめまして、

ODEはゲームの用途にはぴったりですね。
私はゲームをあまり作ったことがないのですが、キャラクタがマップを移動するときに動力学計算する必要はあまりないので、物体にボディを設定しないで、ジオメトリだけを設定するのではだめですか?

でむ

Posted by でむ

ひびきのさん、

X Fileのローダーですが、 VerticesとIndicesの数をいちいち人間が入力するのは手間がかかるので、自動にできませんか。ひびきのさんの実力ならそんなに難しくないでしょう。

でむ

Posted by Rainlily

はじめまして、ゲームに利用しようとODEを触っています。

マップ上をキャラが歩くような処理をする時に、直立しているキャラをカプセルとして扱おうと思っているのですが、
通常の使い方では当然ですがカプセルは地面にそって倒れてしまいます。
重力を3軸とも0に設定しても坂のような場所では当然倒れてしまいます。

ジョイントで固定した状態でdBodySetLinearVel()を使って移動をしても
ジョイントした位置と移動後の位置をいったりきたりしてうまくいきませんでした。

回転軸が固定された移動のみの剛体として使う事はできないのでしょうか?

Posted by ひびきの

でむさん

出来ました!

アドバイスありがとうございました。

Posted by でむ

ひびきのさん、

返事が遅くなりすみません。Xファイルのローダーいいですね。

さて、AIBOシミュレータではポリゴンは描画にだけ使い、衝突計算はそれをボックス、シリンダ、球などで近似したものを使いました。

LCP Internal Errorを回避するにはstep sizeを小さくしたり、CFMやERPの値を変更したり、物体同士が深くめり込まないようにdWorldSetContactSurfaceLayer(world, depth)を呼び出します。このときdepthはめり込む最大の深さなので小さくします。

また、ひびきのさんのサンプルプログラムを試したところ、摩擦係数muを以下のように無限大にするとエラーが回避できました。試してください。
contact[i].surface.mu = dInfinity;

でむ

Posted by チップ

でむさんの言うとおり最新のバージョンにしたら実行できました。
ありがとうございました。

Posted by でむ

チップさん,

ヘッダファイルを変更した後に,
ODE自体をmake, make installし直しする必要があります.

また,ODE0.9でしょうか?

でむ

Posted by チップ

でむさん、回答ありがとうございます!
なるほど、描写の関数を呼び出さないと再描写されないんですね。
さっそくヘッダファイルに
DS_API void dsStartGraphics (int window_width, int window_height, struct dsFunctions *fn);
を追加してやってみたのですが、なぜかmake時にエラーが出ます。
undefined reference to `dsStartGraphics'
といわれ、また悩んでいる状況です、何が悪いのでしょうか。
MINGでやっております。

Posted by ひびきの

でむ さん

お久しぶりです。

DirectX用ポリゴンデータ(拡張子.x)をDrawstuffで表示するプログラムを作ったのですが、
LCP internal error が止まりません。地面と衝突したときの挙動もおかしいです。

ODEのデモ「demo_moving_trimesh」や、でむさんのAIBOシミュレータは、こういったエラー
無しで動いているように見えますが、何かコツがあるのですか?

ソースとバイナリデータはリンク先に置いてあります。

Posted by でむ

チップさん

はじめまして。

さて、simloopの中でpath_to_texturesのパスを変えてもテクスチャは変わりません。
dsStartGraphics()を使ってください。ただし、drawstuff.hの95行目のdsSimulationLoop()の下に以下の一行を追加して、ode-0.9でmakeし直してください。

DS_API void dsStartGraphics(int window_width, int window_height, struct dsFunctions *fn);

キー操作によるテクスチャ切り替えのサンプルを以下に紹介します。

void command(int cmd)
{
switch (cmd) {
case 't':
fn.path_to_textures = "./textures";
dsStartGraphics(640,480,&fn);
break;
case 'u':
fn.path_to_textures = "../../drawstuff/textures";
dsStartGraphics(640,480,&fn);
break;
}
}

以上です。

でむ

Posted by チップ

はじめまして、本とサイトを見て勉強させてもらっています。
プログラムに関する質問なのですが、テクスチャをたくさん使うにはどうすればいいのでしょうか?
LOOPの中でfn.path_to_texturesのパスを変えてもテクスチャが変わらなくて悩んでいます。
よろしくおねがいします。

Posted by Shio

でむさん、

回答していただき、ありがとうございます。
参考にしてがんばってみます。
今後も、何かありましたらよろしくお願いします。

Posted by ryupioneer

何度もすいません、でむさん

あれから試行錯誤を繰り返した結果
dRFromEulerAnglesを用いてみたら
できました。

位置座標もきちんとそれのような値をとっていたので
たぶんこれでいいと思います。

自分から相談しといてこのような結末になりまして本当にすいません。
サンプルコードまで書いてもらうなんて、大変うれしい限りです。

一応自分が書いたコード(角度計算)を載せるので
間違いなどを指摘してもらえたら幸いです。

//角度計算
static void radian(dReal fx, dReal fy, dReal fz)
{
radianyz=atan(fz/fy);

radianxy=atan(fx/sqrt(fz*fz+fy*fy));
}


//オイラー角の設定
dMatrix3 R1;
dRFromEulerAngles(R1, M_PI/2-radianyz, -radianxy, 0);
dBodySetRotation(pole.body, R1);


こんな感じになりました。
自分がやろうとしていたのは
ベクトル(fx、fy、fz)の方向にカプセル型のボディ(pole.body)を
向けさそうとしたものです。

これを用いてODEに弓矢の矢の軌道をシミュレーションさせようというプログラムを
自分は作っています。なんとか完成は間に合いそうです。

長文ですいません。このページはプログラムを作るうえで大変役立ちました。
親身に相談にのっていただき本当にありがとうございました。


ryupioneer

Posted by でむ

ryupioneerさん、

ご質問があるということは、ODE本の説明ではわかりづらいということですね。

任意の姿勢に向けることができます。具体的に、どの姿勢にしたいかを教えてください。その姿勢を向けるサンプルコードを書いてみます。

でむ

Posted by ryupioneer

迅速なご返答ありがとうございました。

ただdRFromAxisAndAngleやdRFromEulerAnglesで何度も試しているのですが
うまくいきません。

一回の回転はできるのですが
複数回の回転ができません。
dRFromAxisAndAngleで設定できるのは
一つの回転命令だけなのでしょうか

やはり物体を中途半端な位置へ向けるのは
ODEでは無理なのでしょうか

何度もすいませんがよろしくお願いします

Posted by でむ

Shioさん、

ODEの世界へようこそ!

さて、試していませんが、物体から空洞部分をくりぬくのではなく、複数の物体で空洞を囲むように実装すればできると思います。

もし、実現できたら差し支えない範囲でご連絡をお願いします。

でむ

Posted by でむ

ryupioneerさん、

お急ぎのところ返事が遅れてすみません。韓国で開催されたRobot World 2007でヒューマノイドロボットのデモ展示のため出張で本日帰国しました。

さて、dRFromAxisAndAngle()で向けたい姿勢の回転行列を取得し、dBodySetPosition()でその姿勢にbodyを設定してください。ODE本のP75 プログラム3.3が参考になると思います。

でむ

Posted by ryupioneer

はじめまして
理系学校で展示物の作成に
ODEをつかったソフトを開発しているのですが
ODEの初期姿勢で行き詰ったので質問させていただきます。

あるベクトル(x、y、z)があたえられていて
それと同じ方向に物体の姿勢を向けたいのですが
うまくいきません。

勉強不足だと思いますが、日数も残り少ないので
よろしくお願いします。

Posted by Shio

はじめまして。Shioと申します。
最近ODEを始めまして、参考書やこちらのサイトを参考にして学習しております。

ところで質問なのですが。
物体の内部に空洞を作って、その空洞の中に物体を入れるということはできるのでしょうか?

よろしくお願いします。

Posted by ぽったー

でむさん

ぽったーです

ode-0.9がリリースされましたね.
さっそくインストールしてみたのですが,demura.netで紹介されている
新しいデモのdemo_basket.exeを起動しても,Errorがでてしまいます.

環境は,windows xpでmingwとmsysです.
Errorは
could not load accelerators
です.

なにかインストールで不備があったのでしょうか?

よろしくお願いします.

Posted by でむ

mif805さん、

nearCallbackをざっと見たところ特に問題はなさそうですね。挙動を確認したいので差し支えなければhttp://demura.net/archives/4profile/mail.htmlのメールアドレスへソースコードを送っていただけませんか?

でむ

Posted by tak

demuraさん、

わかりやすい説明ありがとうございました。大変助かりました。

Posted by 初心者

でむさん、

できました!!
毎度、本当にありがとうございます!!
いろいろな形を試してみたいと思います。

Posted by でむ

takさん、

ご質問ありがとうございます。お久しぶりですね。

さて、ODEの特徴として、物体にはジオメトリとボディの属性があり、ジオメトリは衝突検出計算、ボディは動力学計算の対象となります。この特徴をうまくつかうと効率的なシミュレーションをすることができます。 

例えば、自律移動ロボットが市街地を走行するシミュレーションをする場合、ビルなどは全く動かないものとして扱い、ロボットとの衝突だけを考慮するだけで良いと思います。そのような場合では、そのビルをジオメトリだけで定義することにより、特に必要のないビルに対する動力学計算を省略することができます。動力学計算を受けていないのでビルは当然動きません。

なお、ジャンプ台にボディを定義しても、boxが地面に沈まない方法もあります。それは、fixedジョイントをそのboxと静的(static)オブジェクトと結合すればOKです。静的オブジェクトのボディIDには0を設定してください。

以上です。

でむ

Posted by tak

demuraさん

お久しぶりです、以前MacOSXへのインストールや物体が地面の上を滑ってしまう現象について質問させていただいたtakです。

今回はodeに付属のサンプルtest_buggyについてです。
斜面を作ろうとしたのですが、odeには三角形のオブジェクトがないので困っていた所、
test_buggyに三角形のジャンプ台の用なものがあったのを思い出しソースを眺めていたのですが、
boxを斜めにして地面にめり込ませるという方法をとっていました。
しかしこのジャンプ台はなぜかジオメトリ(geom)のみで定義されており、ボディ(body)は定義されてませんでした。
逆のパターンはODE講座5で見たので性質が分かっていたのですが、ジオメトリのみ定義された
オブジェクトの性質がいまいちつかみきれません。
実際にジャンプ台にボディを定義してみると(自前のソースに移植)、ジャンプ台となるはずのboxは地面に沈んでいってしまいます(当然ですが)。

そこで質問なのですが、ジオメトリのみで定義されたオブジェクトはどのような利点があるのでしょうか?
またなぜこのオブジェクトは最後まで沈まず途中で止まるのでしょうか?
ひょっとして講座のどこかで述べられていましたら申し訳ありません。

Post a Comment

(サインインしなくてもコメントできますが、スパム対策のため表示されるまで時間がかかります。サインインしてからコメントし、このブログのオーナーの承認を受けるとコメントがすぐ表示されるようになります。)

Remember personal info?

Search
Entries
ODE本の宣伝
ODEを使い仮想空間でロボットを動かそう!本ウェブの連載から誕生.ODEのマニュアル機能有. よろしくお願いします。

Open Dynamics Engine
下記のサイトから購入できます.
amazon
7&Y icon

最近のコメント

カウンタ (since 2007-5-20)