ODE講座27: é–¢ç¯€åˆæœŸè§’度ã®è¨­å®šæ³•

2008-06-27
By


2関節ロボットアーム.1番目ã®é–¢ç¯€åˆæœŸè§’度を15度,2番目ã®é–¢ç¯€åˆæœŸè§’度を30度ã«è¨­å®šï¼Ž


ãŒãーã•ã‚“ã‹ã‚‰ä»¥ä¸‹ã®ã”質å•ãŒã‚りã¾ã—ãŸï¼Žã€Œã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®è§’度ã®åˆæœŸè¨­å®šã‚’行ã„ãŸã„ã¨ã(例ãˆã°Hinge Jointã‚’Ï€/4ã ã‘曲ã’ã‚‹ã¨ã‹)ã€ã©ã®ã‚ˆã†ã«è¨­å®šã™ã‚Œã°è‰¯ã„ã®ã§ã—ょã†ã‹?トルクãŒã‹ã‹ã‚‰ãªã„状態ã§åˆæœŸè¨­å®šã‚’行ã„ã€ãã®çŠ¶æ…‹ã‹ã‚‰ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å§‹ã‚ãŸã„ã®ã§ã™ãŒã€‚。。ヒントãŒã‚れã°ã‚ˆã‚ã—ããŠé¡˜ã„致ã—ã¾ã™ï¼Žã€

ã“れã«ã€Œã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®åˆæœŸè§’度ã¯ï¼Œã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã‚’生æˆã—ãŸæ™‚ãŒï¼[rad]ã«ãªã‚Šã¾ã™ï¼Žä¾‹ãˆã°ï¼Œï¼’ã¤ã®ãƒªãƒ³ã‚¯ã®æˆã™è§’度π/4ã‚’åˆæœŸè§’度ã¨ã—ãŸã„å ´åˆã¯ï¼Œç‰‡æ–¹ã®ãƒªãƒ³ã‚¯ã‚’Ï€/4回転ã•ã›ãŸå¾Œã§ï¼Œã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã§ï¼’ã¤ã®ãƒªãƒ³ã‚¯ã‚’çµåˆã—ã¾ã™ï¼Žã€ã¨å›žç­”ã—ã¾ã—ãŸï¼Ž

ãれã‹ã‚‰ã¾ãŸï¼ŒãŒãーã•ã‚“ãŒã€ŒdJointSetHingeAngleãŒã‚れã°ä¾¿åˆ©ãªã®ã«ï¼Žï¼Žï¼Žã€ã¨ã„ã†æ›¸ãè¾¼ã¿ãŒã‚り,googleã§dJointSetHingeAngle検索ã—ãŸã‚‰ï¼Œãƒ­ã‚·ã‚¢èªžã§ã™ãŒé–¢é€£ã™ã‚‹ä»¥ä¸‹ã®ãƒšãƒ¼ã‚¸ã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã—ãŸï¼Žhttp://www.gamedev.ru/code/forum/?id=19481ãã®ä¸­ã§ShurikParã•ã‚“ãŒï¼Œä»¥ä¸‹ã®ã‚ˆã†ã«ã™ã‚Œã°é–¢ç¯€ã‚’固定ã§ãã‚‹ã¨ã„ã†ã‚³ãƒ¡ãƒ³ãƒˆãŒã‚り,ãれをヒントã«åˆæœŸè§’度を設定ã™ã‚‹ã‚µãƒ³ãƒ—ルプログラムを作りã¾ã—ãŸï¼Ž

  • dJointSetHingeParam (Joint, dParamLoStop, angle – 0.001f);
  • dJoitSetHingeParam (Joint, dParamHiStop, angle);

ã¨ã„ã†ã‚ã‘ã§ï¼Œã™ã£ã‹ã‚Šå‰ç½®ããŒé•·ããªã‚Šã¾ã—ãŸãŒï¼ŒODE(Open Dyamics Engine)講座27を開講ã—ã¾ã™ï¼Žé–¢ç¯€ã®åˆæœŸè§’度を自由ã«è¨­å®šã™ã‚‹ã«ã¯ä»¥ä¸‹ã®æ‰‹é †ã§è¡Œã„ã¾ã™ï¼Ž

    1. モデルã®ç”Ÿæˆ
    2. åˆæœŸé–¢ç¯€è§’度ã®è¨­å®š
      dJointSetHingeParam()を使ã„,関節角ã®ä¸‹é™ã¨ä¸Šé™ã‚’åˆæœŸè§’度ã®è¿‘å‚ã«è¨­å®šã™ã‚‹ï¼Ž
    3. ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®æ›´æ–°
      ã“れã«ã‚ˆã‚Šé–¢ç¯€è§’ãŒåˆæœŸè§’度ã«ç§»å‹•ã™ã‚‹ï¼Ž
    4. å„ボディã®ä½ç½®ã¨å§¿å‹¢ã®å–å¾—
      å„関節ã®ä¸­å¿ƒä½ç½®ã¨å›žè»¢è»¸ã®å–å¾—ã™ã‚‹ï¼Ž
    5. モデルã®ç ´å£Š
      ボディã¨ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã‚’破壊ã™ã‚‹ï¼Ž
    6. モデルã®å†ç”Ÿ
      4.ã§å–å¾—ã—ãŸãƒœãƒ‡ã‚£ã®ä½ç½®ã¨å§¿å‹¢ï¼Œé–¢ç¯€ã®ä¸­å¿ƒä½ç½®ã¨å›žè»¢è»¸ãªã©ã‚’åˆæœŸå€¤ã¨ã—ã¦ï¼Œãƒ¢ãƒ‡ãƒ«ã‚’å†ç”Ÿã™ã‚‹ï¼Ž

以下ã«ã‚µãƒ³ãƒ—ルプログラムã®ä¸»è¦éƒ¨åˆ†ã‚’掲載ã—ã¾ã™ï¼Žå®Œå…¨ãªãƒ—ログラムã¯ã“ã“ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ãã ã•ã„.

[cpp]
// 2関節,2リンクã®ãƒ­ãƒœãƒƒãƒˆã‚¢ãƒ¼ãƒ ã®ç”Ÿæˆ
// 関節,リンク用ã®é…列ã¯è¦ç´ æ•°ï¼“ã§ã™ï¼Ž
// ã“れã¯ï¼Œï¼ç•ªç›®ã®ãƒªãƒ³ã‚¯ã‚’土å°ï¼Œï¼ç•ªç›®ã®é–¢ç¯€ã‚’固定関節ã¨ã—ã¦
// 地é¢ã¨çµåˆã—ã¦ã„ã‚‹ãŸã‚ã§ã™ï¼Ž
void  makeArm()
{
  dReal l0[3]  = { 0.00, 0.00, 0.05};  // link0ã®ä½ç½®
 dReal l1[3]  = { 0.25, 0.00, 0.04};  // link1ã®ä½ç½®
 dReal l2[3]  = { 0.75, 0.00, 0.04};  // link2ã®ä½ç½®

 dReal anc0[3] = { 0.00, 0.00, 0.00}; // 関節0ã®ä¸­å¿ƒä½ç½®ï¼ˆãƒ€ãƒŸãƒ¼ï¼‰
 dReal anc1[3] = { 0.00, 0.00, 0.04}; // 関節1ã®ä¸­å¿ƒä½ç½®
 dReal anc2[3] = { 0.50, 0.00, 0.04}; // 関節2ã®ä¸­å¿ƒä½ç½®
 dReal ax0[3]  = { 0.00, 0.00, 1.00}; // 関節0ã®å›žè»¢è»¸ï¼ˆãƒ€ãƒŸãƒ¼ï¼‰
 dReal ax1[3]  = { 0.00, 0.00, 1.00}; // 関節1ã®å›žè»¢è»¸
 dReal ax2[3]  = { 0.00, 0.00, 1.00}; // 関節2ã®å›žè»¢è»¸

 // pos0ã¯è¦ç´ æ•°NUMã®é…列.å„è¦ç´ ãŒconst dRealã¸ã®ãƒã‚¤ãƒ³ã‚¿
  const dReal *pos[NUM];
  const dReal *R[NUM];

 /*** 1. モデルを作る ***/
  // åˆæœŸä½ç½®
  pos[0] = l0;	pos[1] = l1;	pos[2] = l2;

 // åˆæœŸå§¿å‹¢
  dMatrix3 tmpR0, tmpR1;
  dRSetIdentity(tmpR0);  // å˜ä½è¡Œåˆ—,回転ã—ãªã„
 dRFromAxisAndAngle(tmpR1,0,1,0,0.5*M_PI); // y軸を中心ã«Ï€/2回転
  R[0] = tmpR0;	R[1] = tmpR1;	R[2] = tmpR1;

  // ジョイント
  const dReal *anchor[NUM];
  const dReal *axis[NUM];

 // 関節中心ã¨å›žè»¢è»¸ã®è¨­å®š
  anchor[0] = anc0; anchor[1] = anc1; anchor[2] = anc2;
  axis[0]   = ax0;  axis[1]   = ax1;  axis[2]   = ax2;

  makeLinks(pos,R);          // リンクã®ç”Ÿæˆ
  makeJoints(anchor, axis);	 // ジョイントã®ç”Ÿæˆ

  /*** 2. åˆæœŸé–¢ç¯€è§’度ã®è¨­å®š ***/
  // 関節角ã®ä¸Šé™ã¨ä¸‹é™ã‚’åˆæœŸè§’度ã®è¿‘å‚ã«ã™ã‚‹ã“ã¨ã§å¼·åˆ¶çš„ã«ç›®æ¨™è§’度ã«ã™ã‚‹
  for (int i = 1; i < NUM; i++) {
   dJointSetHingeParam(joint[i],dParamLoStop, ANGLE0[i] * M_PI/180.0 - 1e-6);
    dJointSetHingeParam(joint[i],dParamHiStop, ANGLE0[i] * M_PI/180.0);
  }

 /*** 3. シミュレーションを進ã‚ã‚‹ ***/
  // ã“れãŒãªã„ã¨é–¢ç¯€ãŒå‹•ã‹ãªã„
  for (int j = 0; j < 100; j++) {
    dWorldStep(world, 0.01);
   dJointGroupEmpty(contactgroup);
  }

 /*** 4. リンクã®ä½ç½®ã¨å§¿å‹¢ã®å–å¾— ***/
  for (int k = 0; k < NUM; k++) {
  pos[k] = dBodyGetPosition(rlink[k].body);
    R[k]   = dBodyGetRotation(rlink[k].body);
  }

  /*** 5. ジョイント中心ã®ä½ç½®ã¨å›žè»¢è»¸ã®å–å¾— ***/
  anchor[0] = anc0;
 axis[0]    = ax0;
  for (int k = 1; k < NUM; k++) {
   dJointGetHingeAnchor(joint[k], (dReal *) anchor[k]);
   dJointGetHingeAxis(joint[k], (dReal *) axis[k]);
  }

 // 何故ã‹mingw環境ã§ã¯ï¼Œprintf文を以下ã«å…¥ã‚Œãªã„ã¨anchor, axisãŒå映ã•れãªã„
 // Linuxã§ã¯æœªç¢ºèªï¼Žprintf("n");ã ã‘ã§ã‚‚OK.
  for (int k = 0; k < NUM; k++) {
     printf("nanchor[%d]=%5.2f %5.2f %5.2f n",k, anchor[k][0],anchor[k][1],anchor[k][2]);
     printf("axis[%d]  =%5.2f %5.2f %5.2f n", k, axis[k][0],axis[k][1],axis[k][2]);
 }

  /*** 6. モデルã®ç ´å£Šã€€***/
  destroyJoints(); // ジョイントã®ç ´å£Š
 destroyLinks();  // リンクã®ç ´å£Š

  /*** 7. モデルã®å†ç”Ÿ ***/
  makeLinks(pos,R);          // リンクã®å†ç”Ÿæˆ
 makeJoints(anchor,axis);  // ジョイントã®å†ç”Ÿæˆ
}
[/cpp]

ã“よれよりもã£ã¨ç°¡å˜ãªæ–¹æ³•ãŒã‚れã°ï¼Œã‚³ãƒ¡ãƒ³ãƒˆã‚’é ‚ã‘れã°ã†ã‚Œã—ã„é™ã‚Šã§ã™ï¼Ž

3 Responses to ODE講座27: é–¢ç¯€åˆæœŸè§’度ã®è¨­å®šæ³•

  1. sunlight MonsterID Icon sunlight on 2011-02-02

    ã¤ã„先日,ã“ã®ãƒšãƒ¼ã‚¸ã®ã‚µãƒ³ãƒ—ルプログラムをダウンロードã•ã›ã¦ã„ãŸã ã„ãŸã‚“ã§ã™ãŒã€ã“ã®ãƒšãƒ¼ã‚¸ã®ã‚µãƒ³ãƒ—ル画åƒã®ã‚ˆã†ãªçŠ¶æ…‹ã«æˆã£ã¦ã„ã¾ã›ã‚“ã§ã—ãŸã€‚
    dRFromAxisAndAngle(tmpR1,0,1,0,0.5*M_PI) 㧠『y軸を中心ã«Ï€/2å›žè»¢ï¼ˆåæ™‚計回り)ã€ã—ã¦ã„ã‚‹ã¯ãšã®link1ã‚‚link2ã‚‚zè»¸ã«æ²¿ã£ãŸã¾ã¾ã«æˆã£ã¦ã„ã¦ã€ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
    サンプルプログラム内ã®ã©ã“を修正ã™ã‚Œã°ã‚ˆã„ã§ã—ょã†ã‹ã€‚ã”æ•™æŽˆãŠé¡˜ã„ã„ãŸã—ã¾ã™ã€‚

  2. mado MonsterID Icon mado on 2010-01-09

    失礼ã—ã¾ã™ï¼Žè³ªå•よã‚ã—ã„ã§ã—ょã†ã‹ï¼Ž
    VC++環境ã§è‡ªå·±æµã«ã¦ãƒ—ログラムをã„ã˜ã£ã¦ã„る者ã§ã™ï¼Ž

    勉強ã®ãŸã‚ã«ã€Œé–¢ç¯€åˆæœŸè§’度ã®è¨­å®šæ³•ã€ã®ã‚µãƒ³ãƒ—ルプログラムをダウンロードã•ã›ã¦ã„ãŸã ã„ãŸã®ã§ã™ãŒï¼Œã‚³ãƒ³ãƒ‘イルã¯é€šã‚‹ã®ã«å®Ÿè¡Œæ™‚ã«ãƒªãƒ³ã‚¯ãŒè¡¨ç¤ºã•れã¾ã›ã‚“.
    ã¾ãŸ.exeãƒ•ã‚¡ã‚¤ãƒ«ã®æ–¹ã‹ã‚‰é–‹ãã¨ï¼Œä½•æ•…ã‹ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã ã‘ãŒè¡¨ç¤ºã•れã¦ã—ã¾ã„ã¾ã™.

    VC++ã ã‹ã‚‰èµ·ã“ã‚‹å•題ãªã®ã§ã—ょã†ã‹ï¼Ÿè§£æ±ºæ–¹æ³•ã®æ¤œè¨ŽãŒä»Šä¸€ã¤æ€ã„ã¤ãã¾ã›ã‚“…

  3. mado MonsterID Icon mado on 2010-01-16

    madoã§ã™ï¼Žã‚¢ãƒ¼ãƒ ã®è¡¨ç¤ºçŠ¶æ…‹ã«é–¢ã—ã¦ï¼Œè§£æ±ºã—ã¾ã—ãŸï¼Ž
    ãŠä¸–話ã‹ã‘ã¾ã—ãŸï¼Ž

    makeArm関数ã®ä¸­ã«ã‚りã¾ã™ï¼Œã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã¨ãƒœãƒ‡ã‚£ã®ç ´å£Šã«é–¢ã™ã‚‹éƒ¨ä½ã‚’コメントアウトã—ãŸã¨ã“ã‚,正ã—ã„グラフィック表示ã«ãªã‚Šã¾ã—ãŸï¼Ž
    destroyJoints関数ã¨destroyLinks関数を外ã—ãŸã“ã¨ã§ä»–ã«å½±éŸ¿ãŒã§ã¦ã„る様å­ã‚‚ãªã‹ã£ãŸã®ã§ï¼Œã“れã§ã‚ˆã„ã‹ã¨æ€ã„ã¾ã™ï¼Ž

    ã©ã†ã‚‚,ã‚りãŒã¨ã†ã”ã–ã„ã¾ã—ãŸï¼Ž

コメントをã©ã†ãž

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

1,073 views  (Since 2010-08-11)