szmlb.net

tips for robotics

ODEで弾性関節を作成する

(過去ブログの転載)

最近ODEでロボットを作成しては制御する, という作業を繰り返しています. 今回は, RHexライク(とい
うかそのもの)をつくってみました.

youtu.be

脚部が弾性のある素材で構成されていますので, ODEのBoxを弾性関節でつないで実現します.

下記サイトでは, 関節に弾性を持たせて連結し, 蛇ロボットを実現しています.

ODEのジョイントで角度ばねを実現する
http://ktaobo.blogspot.jp/2013/05/ode-damper-spring.html

作成した結果, 上記の画像のようになりました.

各脚は9個のBoxで構成しています.

Base Bodyと連結するjointだけ通常のHingeJointとし, それ以外のJointには上記サイトの例のよう

に弾性と粘性を設定して, 駆動範囲を制限しています.

jointの設定部のコードは以下の通りです.

dReal angle1 = 0.0;
dReal h = dt;  // タイムステップ
dReal kp = 40;  // バネ係数
dReal kd = 1.0;  // ダンパー係数
dReal erp = h * kp / (h * kp + kd);
dReal cfm = 1.0 / (h * kp + kd);
for(int i = 0; i < 9; i++){
    joint[i] = dJointCreateHinge(world, 0); // ヒンジ関節生成
    if(i == 0){
        dJointAttach(joint[i], base_robot[0].body, link_robot[i].body); // 関節の取付け
        dJointSetHingeAnchor(joint[i], anchor_x[i], anchor_y[i], anchor_z[i]); //関節中心の設定
        dJointSetHingeAxis(joint[i], 0, 1, 0); // 関節回転軸の設定
    }
    else{
        dJointAttach(joint[i], link_robot[i-1].body, link_robot[i].body); // 関節の取付け
        dJointSetHingeAnchor(joint[i], anchor_x[i], anchor_y[i], anchor_z[i]); //関節中心の設定
        dJointSetHingeAxis(joint[i], 0, 1, 0); // 関節回転軸の設定
        dJointSetHingeParam(joint[i], dParamLoStop, angle1);
        dJointSetHingeParam(joint[i], dParamHiStop, angle1);
        dJointSetHingeParam(joint[i], dParamStopERP, erp);
        dJointSetHingeParam(joint[i], dParamStopCFM, cfm);
    }
}

制御に関しては, 根元の関節の回転を制御するだけなので非常に簡単です.

今回は難しく考えず, 支持脚・遊脚の位相をπだけずらして回転させるようにしました.

動画は以下の通りです.

vimeo.com