11. 力ã¨ãƒˆãƒ«ã‚¯

ODE (Open Dynamics Engine) åˆç´šè¬›åº§ã®ç¬¬ï¼‘1回目ã§ã™ã€‚

今回㯠力ã¨ãƒˆãƒ«ã‚¯ã«ã¤ã„ã¦å‹‰å¼·ã—ã¾ã—ょã†ã€‚

1.  ボディã«é–¢ã™ã‚‹åŠ›ã¨ãƒˆãƒ«ã‚¯

ボディã«ã‹ã‹ã‚‹åŠ›ã€ãƒˆãƒ«ã‚¯ã‚’å–å¾—ã™ã‚‹APIã¯dBodyGetForce(), dBodyGetTorqueã§ã™ã€‚ボディã«åŠ›ã€ãƒˆãƒ«ã‚¯ã‚’設定ã™ã‚‹APIã¯dBodySetForce, dBodySetTorqueã¨ãªã£ã¦ã„ã¾ã™ã€‚座標系ã¯çµ¶å¯¾åº§æ¨™ç³»ã§ã™ã€‚

  • const dReal *dBodyGetForce (dBodyID body);
  • const dReal *dBodyGetTorque (dBodyID body);
    ボディbodyã®åŠ›ã¨ãƒˆãƒ«ã‚¯ãƒ™ã‚¯ãƒˆãƒ«ã‚’è¿”ã™ã€‚戻り値ã¯dRealåž‹ã®è¦ç´ æ•°ï¼“個ã®é…列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚
  • void dBodySetForce(dBodyID b, dReal x, dReal y, dReal z);
  • void dBodySetTorque(dBodyID b, dReal x, dReal y, dReal z);
    力ã¨ãƒˆãƒ«ã‚¯ãƒ™ã‚¯ãƒˆãƒ«ã‚’ボディbodyã«è¨­å®šã™ã‚‹ã€‚


2.ジョイント(関節)ã«é–¢ã™ã‚‹åŠ›ã¨ãƒˆãƒ«ã‚¯

(1) 力ã¨ãƒˆãƒ«ã‚¯ã®å–å¾—

次ã«ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã«é–¢ã™ã‚‹åŠ›ã¨ãƒˆãƒ«ã‚¯ã«ã¤ã„ã¦å­¦ã³ã¾ã—ょã†ã€‚ODEã§ã¯é–¢ç¯€ã« ã‹ã‹ã‚‹ãƒˆãƒ«ã‚¯ãªã©ã‚’ã™ãå–å¾—ã§ãã¾ã›ã‚“.å–å¾—ã™ã‚‹ãŸã‚ã«ã¯dJointSetFeedback()ã§é–¢ç¯€ã‚’指定ã—ã¦ã‹ã‚‰dJointGetFeedback()㧠情報をå–å¾—ã—ã¾ã™ï¼Žã“れã¯ãƒ‘フォーマンスをå‘上ã•ã›ã‚‹ãŸã‚ã§ã™ï¼Žå¸¸ã«å…¨ã¦ã®é–¢ç¯€ã«ã‹ã‹ã‚‹åŠ›ã¨ãƒˆãƒ«ã‚¯ãŒå¿…è¦ãªã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“よã­ï¼Ž

  • void dJointSetFeedback (dJointID, dJointFeedback *);
    力ã¨ãƒˆãƒ«ã‚¯ã®æƒ…報をå–å¾—ã™ã‚‹é–¢ç¯€JointIDã«dJointFeedback構造体を設定ã™ã‚‹ï¼Ž


    typedef struct dJointFeedback {
    dVector3 f1; // 関節ãŒãƒœãƒ‡ã‚£1ã«åŠã¼ã—ã¦ã„る力
    dVector3 t1; // 関節ãŒãƒœãƒ‡ã‚£1ã«åŠã¼ã—ã¦ã„るトルク
    dVector3 f2; // 関節ãŒãƒœãƒ‡ã‚£2ã«åŠã¼ã—ã¦ã„る力
    dVector3 t2; // 関節ãŒãƒœãƒ‡ã‚£2ã«åŠã¼ã—ã¦ã„るトルク
    } dJointFeedback;

  • dJointFeedback *dJointGetFeedback (dJointID);
    dJointIDã§æŒ‡å®šã—ã¦ã„る関節ã®åŠ›ã¨ãƒˆãƒ«ã‚¯ã®æƒ…報をå–å¾—ã—ã¾ã™ï¼Ž

(2) 力ã¨ãƒˆãƒ«ã‚¯ã®è¨­å®š

ジョイントã®ç¨®é¡žã«ã‚ˆã£ã¦åŠ›ã¾ãŸã¯ãƒˆãƒ«ã‚¯ã‚’設定ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ã¤ã¾ã‚Šã€ãƒ’ンジジョイントã®ã‚ˆã†ãªå›žè»¢å¼ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã«ã¯ãƒˆãƒ«ã‚¯ã‚’与ãˆã‚Œã°è‰¯ã„ã§ã™ã—ã€ã‚¹ãƒ©ã‚¤ãƒ€ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®ã‚ˆã†ãªç›´å‹•å¼ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã«ã¯åŠ›ã‚’ä¸Žãˆã‚Œã°è‰¯ã„ã‚ã‘ã§ã™ã€‚

  • dJointAddHingeTorque(dJointID joint, dReal torque)
    ヒンジジョイントjointã«å¯¾ã—ã¦ãƒˆãƒ«ã‚¯torqueã‚’ã‹ã‘ã¾ã™ã€‚ジョイントã«çµåˆã•れã¦ã„るボディ1ã¨ãƒœãƒ‡ã‚£ï¼’ã«å¯¾ã—ã¦åŒã˜ãƒˆãƒ«ã‚¯ã‚’å対方å‘ã«ã‹ã‘ã¦ã„ã¾ã™ã€‚ã“れã¯dBodyAddTorqueã‚’å…ƒã«ä½œã‚‰ã‚Œã¦ã„ã¾ã™ã€‚
  • dJointAddSliderForce(dJointID joint, dReal force)
    スライダジョイントã®è»¸ã«å¯¾ã—ã¦åŠ›forceã‚’ã‹ã‘ã¾ã™ã€‚ジョイントã«çµåˆã•れã¦ã„るボディ1ã¨ãƒœãƒ‡ã‚£ï¼’ã«å¯¾ã—ã¦åŒã˜åŠ›ã‚’å対方å‘ã«ã‹ã‘ã¦ã„ã¾ã™ã€‚ã“れã¯dBodyAddForceã‚’å…ƒã«ä½œã‚‰ã‚Œã¦ã„ã¾ã™ã€‚

次 ã«ï¼Œã“ã®APIを使ã£ãŸã‚µãƒ³ãƒ—ルプログラムを紹介ã—ã¾ã™ï¼Žï¼’ã¤ã®ãƒœãƒƒã‚¯ã‚¹ã‚’固定ジョイント(Fixed Joint)ã§ãã£ã¤ã‘,ãã“ã«ã‹ã‹ã‚‹åŠ›ã‚’è¡¨ç¤ºã™ã‚‹ãƒ—ログラムã§ã™ï¼Žãƒœãƒƒã‚¯ã‚¹ã®é‡ã•ãŒå„1kgãªã®ã§ï¼Œz軸方å‘(上方å‘)ã«ã¯9.8Nã®åŠ›ãŒã‹ã‹ã£ã¦ã„れ ã°ç†è«–ã©ãŠã‚Šã§ã™ï¼Žç§ã®ç’°å¢ƒã§ã¯ç†è«–ã©ãŠã‚Š9.8ã®å€¤ã‚’ãŸãŸã出ã—ã¦ã„ã¾ã—ãŸï¼Ž

ãªãŠï¼Œãƒ—ログラムã§ã¯ï¼’ã¤ã®ãƒœãƒƒã‚¯ã‚¹ã®ã†ã¡ï¼Œä¸‹ã‚’圧力センサã¨ã¿ãªã—ã¦ã„ã¾ã™ï¼Žãƒ’ューマノイド足è£ã®åœ§åŠ›ã‚»ãƒ³ã‚µã‚’ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆã™ã‚‹å ´åˆã¯ï¼Œä¸‹ã®ãƒœãƒƒã‚¯ã‚¹ã®ã‚µã‚¤ã‚ºã‚’å°ã•ãã—,数を増やã›ã°ã‚ˆã„ã‚ã‘ã§ã™ï¼Ž

サンプルプログラムã¯ã“ã“ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã§ãã¾ã™ã€‚

// sample11.cpp  by Kosei Demura  2006-2008
#include "ode/ode.h"
#include "drawstuff/drawstuff.h"

static dWorldID world;
static dSpaceID space;
static dGeomID  ground;
static dJointID fixed;
static dJointGroupID
contactgroup;
dJointFeedback *feedback = new dJointFeedback;
dsFunctions fn;

typedef struct {
  dBodyID body;
  dGeomID geom;
  dReal   radius,length,width,height,mass;
} myLink;

myLink box,sensor;

static void nearCallback (void *data, dGeomID o1, dGeomID o2)
{
  static int MAX_CONTACTS = 10;
  int i;    // 2ã¤ã®ãƒœãƒ‡ã‚£ãŒã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã§çµåˆã•れã¦ã„ãŸã‚‰è¡çªæ¤œå‡ºã—ãªã„

  dBodyID b1 = dGeomGetBody(o1);
  dBodyID b2 = dGeomGetBody(o2);

  if (b1 && b2 && dAreConnected (b1,b2)) return;

  dContact contact[MAX_CONTACTS];
  int numc = dCollide(o1,o2,MAX_CONTACTS,&contact[0].geom,   sizeof(dContact));

  if (numc > 0) {     for (i=0; i < numc; i++) {
    contact[i].surface.mode  =  dContactSoftCFM | dContactSoftERP;
    contact[i].surface.mu       = dInfinity;  // 摩擦係数
    contact[i].surface.soft_cfm = 1e-8;
    contact[i].surface.soft_erp = 1.0;

    dJointID c = dJointCreateContact(world,contactgroup,&contact[i]);
    dJointAttach (c,dGeomGetBody(contact[i].geom.g1),        dGeomGetBody(contact[i].geom.g2));
  }
}

static void simLoop (int pause)
{
  static int steps = 0;
  dSpaceCollide(space,0,&nearCallback);

  dWorldStep(world,0.01);
  dJointGroupEmpty(contactgroup);
  feedback = dJointGetFeedback(fixed); // 力ã¨ãƒˆãƒ«ã‚¯æƒ…å ±ã®å–å¾—
  printf("%5d Force fx=%6.2f ",steps++,feedback->f1[0]); // x座標æˆåˆ†
  printf("fy=%6.2f ",feedback->f1[1]);       // y座標æˆåˆ†
  printf("fz=%6.2f \n",feedback->f1[2]);      // z座標æˆåˆ†

  // ãƒœãƒƒã‚¯ã‚¹ã®æç”»
  dsSetColor(1.0,0.0,0.0);
  dReal sides1[] = {box.length,box.width,box.height};

  dsDrawBoxD(dBodyGetPosition(box.body),   dBodyGetRotation(box.body),sides1);    // ã‚»ãƒ³ã‚µã®æç”»
  dsSetColor(0.0,0.0,1.0);
  dReal sides2[] = {sensor.length,sensor.width,sensor.height};

  dsDrawBoxD(dBodyGetPosition(sensor.body),    dBodyGetRotation(sensor.body),sides2);
}

void start()
{
  static float xyz[3] = {0.0,-3.0,1.0};
  static float hpr[3] = {90.0,0.0,0.0};
  dsSetViewpoint (xyz,hpr);
}

void  setDrawStuff()
{
  fn.version = DS_VERSION;
  fn.start   = &start;
  fn.step    = &simLoop;
  fn.command = NULL;
  fn.stop    = NULL;
  fn.path_to_textures = "../../drawstuff/textures";
}

int main (int argc, char **argv)
{
  setDrawStuff();
  dInitODE();
  world = dWorldCreate();
  space = dHashSpaceCreate(0);
  contactgroup = dJointGroupCreate(0);
  dWorldSetGravity(world,0,0,-9.8);
  ground = dCreatePlane(space,0,0,1,0);

  dMass m1;
  dReal x0 = 0.0, y0 = 0.0, z0 = 0.0;

  // センサ(下ã®ãƒœãƒƒã‚¯ã‚¹ï¼‰
  sensor.length = 0.2;
  sensor.width  = 0.2;
  sensor.height = 0.2;
  sensor.mass   = 1.0;
  sensor.body   = dBodyCreate(world);
  dMassSetZero(&m1);
  dMassSetBoxTotal(&m1,sensor.mass,sensor.length,sensor.width,sensor.height);
  dBodySetMass(sensor.body,&m1);
  dBodySetPosition(sensor.body, x0, y0, 0.5 * sensor.height + z0);
  sensor.geom = dCreateBox(space,sensor.length,sensor.width,sensor.height);
  dGeomSetBody(sensor.geom,sensor.body);

   // ボックス(上ã®ãƒœãƒƒã‚¯ã‚¹ï¼‰
  box.length = 0.2;
  box.width  = 0.2;
  box.height = 0.2;
  box.mass   = 1.0;
  box.body   = dBodyCreate(world);
  dMassSetZero(&m1);
  dMassSetBoxTotal(&m1,box.mass,box.length,box.width,box.height);
  dBodySetMass(box.body,&m1);
  dBodySetPosition(box.body, x0, y0, sensor.height + 0.5 * box.height + z0);
  box.geom = dCreateBox(space,box.length,box.width,box.height);
  dGeomSetBody(box.geom,box.body);

  // 固定ジョイント
  fixed = dJointCreateFixed(world,0);
  dJointAttach(fixed,box.body,sensor.body);
  dJointSetFixed(fixed);    // 力ã¨ãƒˆãƒ«ã‚¯æƒ…報をå–å¾—ã™ã‚‹é–¢ç¯€ã‚’指定
  dJointSetFeedback(fixed,feedback);
  dsSimulationLoop(argc,argv,352,288,&fn);
  dWorldDestroy(world);
  dCloseODE();

  return 0;
}

6 Responses to 11. 力ã¨ãƒˆãƒ«ã‚¯

  1. ashin MonsterID Icon ashin on 2010-07-15

    ã“ã®é–“ã¯è³ªå•ã«ç­”ãˆã¦ã„ãŸã ã„ã¦ã‚りãŒã¨ã†ã”ã–ã„ã¾ã—ãŸã€‚

    ã‚‚ã†ã²ã¨ã¤è³ªå•ãªã‚“ã§ã™ãŒãƒ»ãƒ»ãƒ»ï¼ˆã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã«é–¢ã™ã‚‹åŠ›ã¨ãƒˆãƒ«ã‚¯ã«ã¤ã„ã¦ï¼‰

    ロボットアームã®å ´åˆã€ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã«ç”Ÿã˜ã‚‹åŠ›ã®æ¤œå‡ºã¯ãŸã¨ãˆã°ç‰©ãŒã¶ã¤ã‹ã£ãŸè¡æ’ƒã§ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆãŒå‹•ã„ã¦ãªãã¦ã‚‚トルクã¨åŠ›ã®æ¤œå‡ºã¯ã§ãã‚‹ã®ã§ã—ょã†ã‹ï¼Ÿ

    何度も質å•ã‚’ã—ã¦ã—ã¾ã£ã¦ç”³ã—訳ã‚りã¾ã›ã‚“ãŒã€ã‚ˆã‚ã—ã‘れã°è¿”答をãŠé¡˜ã„ã—ã¾ã™ã€‚

  2. ï½ï½“hin MonsterID Icon ï½ï½“hin on 2010-06-04

    åˆæ›¸ãè¾¼ã¿ã§ã™

    質å•ãªã‚“ã§ã™ãŒã€ãƒ­ãƒœãƒƒãƒˆã‚¢ãƒ¼ãƒ ã®å„関節ã«ç”Ÿã˜ã‚‹ãƒˆãƒ«ã‚¯ã‚’å–å¾—ã—ãŸã„ã®ã§ã™ãŒã€ã‚µãƒ³ãƒ—ル13ã«ã‚µãƒ³ãƒ—ル11ã®ãƒ—ログラムを組ã¿è¾¼ã‚“ã§ã‚ã’れã°ã„ã„ã‚“ã§ã—ょã†ã‹ï¼Ÿåˆå¿ƒè€…ãªã®ã§ãƒã‚«ãªè³ªå•ã‹ã‚‚ã—れã¾ã›ã‚“ãŒã€ã‚ˆã‚ã—ã‘ã‚Œã°æ•™ãˆã¦ãã ã•ã„

  3. AH MonsterID Icon AH on 2009-10-11

    先日ã®å›ºå®šã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã«é–¢ã™ã‚‹å›žç­”ã‚りãŒã¨ã†ã”ã–ã„ã¾ã—ãŸã€‚
    力ä¸è¶³ãªãŒã‚‰ã€ä»Šå›žã‚‚質å•ã—ãŸã„ã®ã§ã™ãŒ
    トルク制御ã«ãŠã„ã¦ã€
    dJointAddHingeTorque();
    を用ã„ã¦åˆ¶å¾¡ã—よã†ã¨ã—ãŸã®ã§ã™ãŒã€å‹•ãã¾ã›ã‚“。
    他者ã®è³ªå•ã‚’å‚考ã«ã™ã‚‹ã¨ã€
    dJointSetHingeParam(dJointID, dParamVel,u);
    dJointSetHingeParam(dJointID, dParamFMax, fmax);
    を削除ã—ãªã„ã¨ã„ã‘ãªã„らã—ã„ã®ã§ã™ãŒã€
    ã“れらも用ã„ã‚‹å¿…è¦ãŒã‚ã£ã¦ã€ã©ã†ã—よã†ã‹æ‚©ã‚“ã§ã„ã‚‹ã¨ã“ã‚ã§ã™ã€‚
    ãªã«ã‹ã€åŠ©è¨€ãŒã‚ã‚Œã°æ•™ãˆã¦ãã ã•ã„。

  4. AH MonsterID Icon AH on 2009-10-12

    å•題ãŒè§£æ±ºã—ã¾ã—ãŸã€‚
    ãšã£ã¨ã€uã ã‘コマンドã§å¤‰åŒ–ã•ã›ã¦ã„ã¦ã€fmaxを変化ã•ã›ã¦ã„ãªã‹ã£ãŸ
    ã®ãŒåŽŸå› ã§ã—ãŸã€‚
    åˆæ­©çš„ãªã“ã¨ã‚’ã„ã¡ã„ã¡è³ªå•ã—ã¦ã—ã¾ã„失礼ã—ã¾ã—ãŸã€‚

  5. demu MonsterID Icon demu on 2009-10-14

    トルク制御ã¯ï¼Œï¼¯ï¼¤ï¼¥æœ¬ï¼“3ページã®ãƒ—ログラム2.2ãŒå‚考ã«ãªã‚‹ã¨æ€ã„ã¾ã™ï¼Žãã®ã¾ã¾ä½¿ã£ã¦ã‚‚らãˆã‚Œã°å‹•ãã¨æ€ã„ã¾ã™ï¼Ž

    ã§ã‚€

  6. demu MonsterID Icon demu on 2009-10-14

    fmaxã¯æœ€å¤§ç™ºæ®ãƒˆãƒ«ã‚¯ãªã®ã§å¤šãã®å ´åˆã¯å¤‰åŒ–ã•ã›ã‚‹å¿…è¦ã¯ã‚りã¾ã›ã‚“.æ“作é‡ã®uã ã‘を変化ã•ã›ã‚Œã°è‰¯ã„ã¯ãšã§ã™ãŒï¼Žï¼Žï¼Ž

    ã§ã‚€

コメントをã©ã†ãž

メールアドレスãŒå…¬é–‹ã•れるã“ã¨ã¯ã‚りã¾ã›ã‚“。

2,450 views