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

ODE本 Step2 扉図ã®ã‚«ãƒ©ãƒ¼ç”»åƒ
ODE本「簡å˜!実践!ãƒãƒœãƒƒãƒˆã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ – Open Dynamics Engineã«ã‚ˆã‚‹ãƒãƒœãƒƒãƒˆãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°
ã€ã®Step2ã§ã™ï¼Ž
ã“ã“ã§ã¯ï¼Œãƒãƒœãƒƒãƒˆã‚’å‹•ã‹ã™ä¸Šã§å¿…è¦ã«ãªã‚‹é–¢ç¯€ã‚’å‹•ã‹ã™æ–¹æ³•,シミュレーションã®å†å®Ÿè¡Œæ³•,高速化,ã‚ーボードã‹ã‚‰ã®æ“作をå¦ã³ãƒ›ãƒƒãƒ”ングãƒãƒœãƒƒãƒˆã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ã‚’作りã¾ã™ï¼Ž
以下ã«Step2ã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ã®å‹•画を掲載ã—ã¾ã™ï¼Žã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¯ã“ã®ãƒšãƒ¼ã‚¸ã®æ³¨æ„äº‹é …ã‚’èªã¿ï¼Œãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ï¼Œãƒ“ルドやコンパイルã—実行ã—ã¦ãã ã•ã„.
- ソースコード
- EX2.1補足 (P33)
-
ヒントã§ã€ŒcontrolHinge関数をsimLoop関数ã®ä¸ã«å…¥ã‚Œã¾ã™ã€‚ã€ã¨ã„ã†æ„味ã¯ã€simLoop関数ã®ä¸ã§å‘¼ã³å‡ºã™ã¨ã„ã†æ„味ã§ã™ã€‚関数ã®å®šç¾©ï¼ˆæœ¬ä½“)ã¯ã€simLoop関数ã®ã™ãä¸Šã«æŒ¿å…¥ã—ã¦ãã ã•ã„。プãƒã‚°ãƒ©ãƒ 2.5(P37)ãŒå‚考ã«ãªã‚‹ã¨æ€ã„ã¾ã™ã€‚ã“ã“ã§ã¯ã€controlSlider関数ãŒsimLoop関数ã®ä¸ã§å‘¼ã³å‡ºã•れã¦ã„ã¾ã™ã。
- プãƒã‚°ãƒ©ãƒ 2.5: ホッピングãƒãƒœãƒƒãƒˆ(P37)
- 説明:スライダ(直動å¼ï¼‰ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®å‹•ã‹ã—方をå¦ã³ï¼Œä¸€æœ¬è„šãƒãƒœãƒƒãƒˆã‚’ã¡ã‚‡ã£ã¨ã‚¸ãƒ£ãƒ³ãƒ—ã•ã›ã¾ã™ï¼Ž
- プãƒã‚°ãƒ©ãƒ 2.9: ホッピングãƒãƒœãƒƒãƒˆï¼Œå†å®Ÿè¡Œå¯èƒ½ç‰ˆ (P44)
- èª¬æ˜Žï¼šã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¯æ™®é€šã¯ï¼‘回ã§ã¯çµ‚ã‚らãšï¼Œä½•度も繰り返ã—実行ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“よã.ã“ã“ã§ã¯ï¼ŒãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®å†å®Ÿè¡Œæ³•ã‚’å¦ã³ã¾ã™ï¼Ž
- プãƒã‚°ãƒ©ãƒ 2.10: ホッピングãƒãƒœãƒƒãƒˆï¼Œæç”»ç„¡ç‰ˆ (P50)
- EX2.8: テクスãƒãƒ£ãƒ•ァイル (P53)
- プãƒã‚°ãƒ©ãƒ 2.1: ヒンジジョイントã®åˆ¶å¾¡(P32)
- プãƒã‚°ãƒ©ãƒ 2.2: ヒンジジョイントã®åŠ›åˆ¶å¾¡(P33)
- プãƒã‚°ãƒ©ãƒ 2.3: スライダージョイントã®ä½œã‚Šæ–¹(P34)
- プãƒã‚°ãƒ©ãƒ 2.4: スライダージョイントã®å‹•ã‹ã—æ–¹(P35)
- プãƒã‚°ãƒ©ãƒ 2.6: ドãƒãƒ¼ã‚¹ã‚¿ãƒƒãƒ•ã®è¨å®š(P40)
- プãƒã‚°ãƒ©ãƒ 2.7: comman関数(P41)
- プãƒã‚°ãƒ©ãƒ 2.8: simLoop関数ã®å¤‰æ›´(P42)
[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]
[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]
[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]
[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]
[cpp] void setDrawStuff() { fn.version = DS_VERSION; // drawStuffã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ fn.start = &start;  // シミュレーションループã®å‰ã«å‘¼ã³å‡ºã•れる関数 fn.step = &simLoop; // ステップ毎ã«å‘¼ã³ã ã•れる関数ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ fn.command = &command; // ã‚ー入力ã«ã‚ˆã‚Šå‘¼ã³å‡ºã•れる関数ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ fn.path_to_textures = "../../drawstuff/textures"; // テクスãƒãƒ£ã®ãƒ‘ス } [/cpp]
[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]
[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)