STEP2: シミュレータを作ã‚ã†

Open Dynamics Engine

ODE本 Step2 扉図ã®ã‚«ãƒ©ãƒ¼ç”»åƒ


ODE本「簡å˜!実践!ロボットシミュレーション – Open Dynamics Engineã«ã‚ˆã‚‹ãƒ­ãƒœãƒƒãƒˆãƒ—ログラミング

ã€ã®Step2ã§ã™ï¼Ž

ã“ã“ã§ã¯ï¼Œãƒ­ãƒœãƒƒãƒˆã‚’å‹•ã‹ã™ä¸Šã§å¿…è¦ã«ãªã‚‹é–¢ç¯€ã‚’å‹•ã‹ã™æ–¹æ³•,シミュレーションã®å†å®Ÿè¡Œæ³•,高速化,キーボードã‹ã‚‰ã®æ“作を学ã³ãƒ›ãƒƒãƒ”ングロボットã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ã‚’作りã¾ã™ï¼Ž

以下ã«Step2ã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ã®å‹•画を掲載ã—ã¾ã™ï¼Žã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¯ã“ã®ãƒšãƒ¼ã‚¸ã®æ³¨æ„事項を読ã¿ï¼Œãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ï¼Œãƒ“ルドやコンパイルã—実行ã—ã¦ãã ã•ã„.


  • プログラム2.5: ホッピングロボット(P37)
  • 説明:スライダ(直動å¼ï¼‰ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®å‹•ã‹ã—方を学ã³ï¼Œä¸€æœ¬è„šãƒ­ãƒœãƒƒãƒˆã‚’ã¡ã‚‡ã£ã¨ã‚¸ãƒ£ãƒ³ãƒ—ã•ã›ã¾ã™ï¼Ž

  • プログラム2.6: ドロースタッフã®è¨­å®š(P40)
  • プログラム2.7: comman関数(P41)
  • プログラム2.8: simLoop関数ã®å¤‰æ›´(P42)

    • プログラム2.9: ホッピングロボット,å†å®Ÿè¡Œå¯èƒ½ç‰ˆ (P44)
    • èª¬æ˜Žï¼šã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¯æ™®é€šã¯ï¼‘回ã§ã¯çµ‚ã‚らãšï¼Œä½•度も繰り返ã—実行ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“よã­ï¼Žã“ã“ã§ã¯ï¼ŒãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®å†å®Ÿè¡Œæ³•ã‚’å­¦ã³ã¾ã™ï¼Ž


    • プログラム2.1: ヒンジジョイントã®åˆ¶å¾¡(P32)
    • [cpp] void controlHinge(dReal target) { static const dReal kp  = 5.0; // 比例定数 static const dReal fmax = 200; // 最大トルク [Nm] dReal tmp = dJointGetHingeAngle(joint); // ç¾åœ¨ã®è§’度をå–å¾— dReal u = kp * (target – tmp); // æ“ä½œé‡ dJointSetHingeParam(joint,dParamVel,u); // 角速度ã®è¨­å®š dJointSetHingeParam(joint,dParamFMax,fmax); // 最大トルクã®è¨­å®š } [/cpp]

    • プログラム2.2: ヒンジジョイントã®åŠ›åˆ¶å¾¡(P33)
    • [cpp] void controlHinge2(dReal target) { static const dReal kp = 5.0, kt = 2.0; // 比例定数 dReal tmp = dJointGetHingeAngle(joint); // ç¾åœ¨ã®è§’度をå–å¾— dReal u = kp * (target – tmp);  // æ“ä½œé‡ dReal omega = dJointGetHingeAngleRate(joint); // 角速度 dReal trq = kt * omega;  // 摩擦トルク dJointAddHingeTorque(joint, u – trq); // トルクを加ãˆã‚‹ } [/cpp]

    • プログラム2.3: スライダージョイントã®ä½œã‚Šæ–¹(P34)
    • [cpp] s_joint = dJointCreateSlider(world, 0);  // ジョイントã®ç”Ÿæˆ dJointAttach(s_joint, leg[0].body,leg[1].body);  // ジョイントã®å–付 dJointSetSliderAxis(s_joint, 0, 0, 1); // 軸ベクトルã®è¨­å®š dJointSetSliderParam(s_joint, dParamLoStop, -0.5); // 最大åŽç¸®é•·[m] dJointSetSliderParam(s_joint, dParamHiStop, 0.5); // 最大伸展長[m] [/cpp]

    • プログラム2.4: スライダージョイントã®å‹•ã‹ã—æ–¹(P35)
    • [cpp] static void controlSlider(dReal target) { static dReal kp = 25.0; // 比例定数 static dReal fmax = 400; // 最大力[N] dReal tmp = dJointGetSliderPosition(s_joint); // スライダã®ç¾åœ¨ä½ç½® dReal u = kp * (target – tmp); // 残差 dJointSetSliderParam(s_joint, dParamVel, u); dJointSetSliderParam(s_joint, dParamFMax, fmax); } [/cpp]

    • プログラム2.6: ドロースタッフã®è¨­å®š(P40)
    • [cpp] void setDrawStuff() { fn.version = DS_VERSION; // drawStuffã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ fn.start = &start;  // シミュレーションループã®å‰ã«å‘¼ã³å‡ºã•れる関数 fn.step = &simLoop; // ステップ毎ã«å‘¼ã³ã ã•れる関数ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ fn.command = &command; // キー入力ã«ã‚ˆã‚Šå‘¼ã³å‡ºã•れる関数ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ fn.path_to_textures = "../../drawstuff/textures"; // テクスãƒãƒ£ã®ãƒ‘ス } [/cpp]

    • プログラム2.7: comman関数(P41)
    • [cpp] void command(int cmd) { float xyz[3],hpr[3]; // 視点,視線 switch (cmd) { case ‘a’:funcA(); break; // aキーを押ã™ã¨funcAを実行 case ’1′:func1(); break;      // 1キーを押ã™ã¨func1を実行 case ‘s’: // sキーを押ã™ã¨è¦–点,視線を表示 dsGetViewpoint(xyz,hpr); // 視点,視線をå–å¾— printf("xyz=%4.2f %4.2f %4.2f ",xyz[0],xyz[1],xyz[2]); printf("hpr=%6.2f %6.2f %5.2f \n",hpr[0],hpr[1],hpr[2]); break; default:printf("Input a or 1\n");break;// 上記以外ã®ã‚­ãƒ¼ã‚’押ã™ã¨ã } } [/cpp]

    • プログラム2.8: simLoop関数ã®å¤‰æ›´(P42)
    • [cpp] static void simLoop(int pause) { const dReal *pos1, *R1, *pos2, *R2; int s = 200; // è·³èºã™ã‚‹å‘¨æœŸ(ステップ) if (!pause) { // ä¸€æ™‚åœæ­¢ STEPS++; // ステップ数 printf("STEPS:%4d\n",STEPS); if ((0 <= (STEPS % s)) && ((STEPS % s) <= 10)) controlSlider(0.5); else controlSlider(0.0); dSpaceCollide(space,0,&nearCallback);  // è¡çªæ¤œå‡ºè¨ˆç®— dWorldStep(world,0.01); // 1ステップ進ã‚ã‚‹ dJointGroupEmpty(contactgroup); } dsSetColor(1.0,0.0,0.0); // 赤色ã®è¨­å®š dsDrawSphere(dBodyGetPosition(torso.body), // çƒã®æç”» dBodyGetRotation(torso.body), torso. r); } [/cpp]


    (最終更新日 2008-7-27)


    コメントをã©ã†ãž

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

    2,344 views