92ODE: 2006年12月アーカイブ
ゲーム開発やロボットの研究者にも使われているオープンソースの物理計算エンジンODE(Open Dynamics Engine、オープン ダイナミクスエンジン)を学ぶODE講座の第13回目です。
今回は ジョイント(関節)にかかる力を取得する方法を勉強します.
これを応用するとヒューマノイドロボットの足裏に付け,ZMPの計測に利用する圧力センサをシミュレートできます.
ゲーム開発やロボットの研究者にも使われているオープンソースの物理計算エンジンODE(Open Dynamics Engine、オープン ダイナミクスエンジン)を学ぶODE講座の第12回目です。
Jimmyさんからの御質問にあったように関節にかかるトルクや力を調べるコマンドはわかりづらくなっています.今回は関節にかかるトルクを取得する方法を学びましょう。
ODEでは関節に かかるトルクなどをすぐ取得できません.取得するためにはdJointSetFeedbackで関節を指定してからdJointGetFeedbackで 情報を取得します.これはパフォーマンスを向上させるためです.常に全ての関節にかかる力とトルクが必要なわけではありませんよね.
- void dJointSetFeedback (dJointID, dJointFeedback *);
力とトルクの情報を取得する関節をdJointIDで指定する.dJointFeedback構造体は次のとおりです.
typedef struct dJointFeedback {
dVector3 f1; // 関節がボディ1に及ぼしている力
dVector3 t1; // 関節がボディ1に及ぼしているトルク
dVector3 f2; // 関節がボディ2に及ぼしている力
dVector3 t2; // 関節がボディ2に及ぼしているトルク
} dJointFeedback;
- dJointFeedback *dJointGetFeedback (dJointID);
dJointIDで指定している関節の力とトルクの情報を取得します.
ODEの座標系(右手系)
ゲーム開発やロボットの研究者にも使われているオープンソースの物理計算エンジンODE(Open Dynamics Engine、オープン ダイナミクスエンジン)を学ぶODE講座の愛11回目です。
今回はODEの単位系並びに座標系のお話をし、剛体の位置・姿勢を設定及び取得する方法を説明します。
単位系
ODEの単位系は基本的に何でもかまいません。ただし、角度だけはradianになっています。本講座では世界標準であるSI単位系を用います。 これは物理などで御なじみの長さはm、質量はkg、時間はsです。
座標系
ODEの座標系は上図に示すように物理や数学で一般的に使われている右手系の直交座標です。原点は9個ある小さいピラミッドの中心で、中心から赤いピラミッド方向がx軸、青いピラミッド方向がy軸、上空方向がz軸となっています。なお、単位系は何でもよいのですが、この講座ではSI単位系を採用しているので、各ピラミッドは1mずつの間隔で並んでいます。
位置と姿勢の設定
剛体を3次元空間上に設定するためには、位置と姿勢を指定する必要があります。姿勢は回転変換行列で決めることができ、ODEでも以下のAPIにより設定可能です。
void dBodySetPosition(dBodyID, dReal x, dReal y, dReal z);
剛体dBodyIDの重心を絶対座標系の位置(x, y, z)に設定する。
void dRFromAxisAndAngle(dMatrix3 R, dReal ax, dReal ay, dReal az, dReal angle);
回転軸ベクトル(ax, ay, az)の回りを反時計方向にangle[rad]回転したときの回転変換行列Rを取得する。
void dBodySetRotation(dBodyID, const dMatrix3 R);
剛体dBodyIDの姿勢を回転行列Rに設定する。
また、ODEではこのほかにクオータニオンに関するAPI、void dBodySetQuaternion (dBodyID, const dQuaternion q)もあります。
位置と姿勢の取得
const dReal * dBodyGetPosition(dBodyID);
剛体dBodyIDの位置を取得する。戻り値は絶対座標系での位置が格納されている配列へのポインタ。
const dReal * dBodyGetRotation(dBodyID);
剛体dBodyIDの回転行列取得する。戻り値は回転行列が格納されている配列へのポインタ。
