Step 2ïŒãã·ãã¥ã¬ãŒã¿ãäœãã

ODEæ¬ãStep2 æå³ã®ã«ã©ãŒç»å
EX2.1 è£è¶³ã远å ã(2008-2-7)
ODEæ¬ãç°¡å!å®è·µ!ããããã·ãã¥ã¬ãŒã·ã§ã³ – Open Dynamics Engineã«ããããããããã°ã©ãã³ã°
ãã®Step2ã§ãïŒ
ããã§ã¯ïŒãããããåããäžã§å¿ èŠã«ãªãé¢ç¯ãåããæ¹æ³ïŒã·ãã¥ã¬ãŒã·ã§ã³ã®åå®è¡æ³ïŒé«éåïŒããŒããŒãããã®æäœãåŠã³ãããã³ã°ããããã®ã·ãã¥ã¬ãŒã¿ãäœããŸãïŒ
以äžã«ãœãŒã¹ã³ãŒããšåç»ãæ²èŒããŸãïŒzipã§å§çž®ãããŠãããœãŒã¹ã³ãŒãã¯ãããåèã«ããŠè§£åã»ã³ã³ãã€ã«ã»å®è¡ããŠãã ããïŒãã以å€ã®ãœãŒã¹ã³ãŒãã¯ããã°ã©ã ã®äžéšãªã®ã§ïŒãã®ãŸãŸã§ã¯ã³ã³ãã€ã«ã§ããŸããïŒ
ãªãïŒæ¬ãµã³ãã«ããã°ã©ã ã®ã³ã³ãã€ã«ã»å®è¡ã¯èªå·±è²¬ä»»ã§è¡ã£ãŠãã ããïŒç¹ã«ïŒæ¬ç©ã®ããããã«é©çšããããã®å®å šæ§ãªã©ãå šãèæ ®ããŠããŸããã® ã§ïŒãã®ãããªçšéã«ã¯åããŸããïŒãããŸã§ïŒæè²ç®çãšãèããã ããïŒèè åã³æ£®ååºçã¯æ¬ããã°ã©ã ã«ãã£ãŠçããããããçµæã«ã€ããŠã®è²¬ä»»ãè² ããããŸãïŒãäºæ¿ããæ¹ã ãããŠã³ããŒãããŠãã ããïŒãŸãïŒåé åžã¯ãæ¢ããã ããïŒ
- ãœãŒã¹ã³ãŒã
- EX2.1è£è¶³ã(P33)
- ãã³ãã§ãcontrolHinge颿°ãsimLoop颿°ã®äžã«å
¥ããŸããããšããæå³ã¯ãsimLoop颿°ã®äžã§åŒã³åºããšããæå³ã§ãã颿°ã®å®çŸ©ïŒæ¬äœïŒã¯ãsimLoop颿°ã®ããäžã«æ¿å
¥ããŠãã ãããããã°ã©ã 2.5(P37)ãåèã«ãªããšæããŸããããã§ã¯ãcontrolSlider颿°ãsimLoop颿°ã®äžã§åŒã³åºãããŠããŸããã
- ããã°ã©ã 2.5ïŒããããã³ã°ãããã(P37)
- 説æïŒã¹ã©ã€ãïŒçŽååŒïŒãžã§ã€ã³ãã®åããæ¹ãåŠã³ïŒäžæ¬èãããããã¡ãã£ãšãžã£ã³ããããŸãïŒ
- ãœãŒã¹ã³ãŒãïŒpro2-5.zip (2007-5-19)
- ããã°ã©ã 2.9ïŒããããã³ã°ããããïŒåå®è¡å¯èœç (P44)
- 説æïŒã·ãã¥ã¬ãŒã·ã§ã³ã¯æ®éã¯ïŒåã§ã¯çµãããïŒäœåºŠãç¹°ãè¿ãå®è¡ããªããã°ãªããŸããããïŒããã§ã¯ïŒãã¥ã¬ãŒã·ã§ã³ã®åå®è¡æ³ãåŠã³ãŸãïŒ
- ãœãŒã¹ã³ãŒãïŒpro2-9.zip (2007-5-19)
- ããã°ã©ã 2.10ïŒããããã³ã°ããããïŒæç»ç¡ç (P50)
- pro2-10.zip (2007-5-19)
- ããã°ã©ã 2.1ïŒããã³ãžãžã§ã€ã³ãã®å¶åŸ¡(P32)
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); // æå€§ãã«ã¯ã®èšå®
} - ããã°ã©ã 2.2ïŒããã³ãžãžã§ã€ã³ãã®åå¶åŸ¡(P33)
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); // ãã«ã¯ãå ãã
} - ããã°ã©ã 2.3ïŒãã¹ã©ã€ããŒãžã§ã€ã³ãã®äœãæ¹(P34)
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] - ããã°ã©ã 2.4ïŒãã¹ã©ã€ããŒãžã§ã€ã³ãã®åããæ¹(P35)
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);
} - ããã°ã©ã 2.6: ãããŒã¹ã¿ããã®èšå®(P40)
void setDrawStuff() {
fn.version = DS_VERSION; // drawStuffã®ããŒãžã§ã³
fn.start = &start;ã ã// ã·ãã¥ã¬ãŒã·ã§ã³ã«ãŒãã®åã«åŒã³åºããã颿°
fn.step = &simLoop;ã // ã¹ãããæ¯ã«åŒã³ã ããã颿°ã®ã¢ãã¬ã¹
fn.command = &command;ã // ããŒå ¥åã«ããåŒã³åºããã颿°ã®ã¢ãã¬ã¹
fn.path_to_textures = “../../drawstuff/textures”; // ãã¯ã¹ãã£ã®ãã¹
} - ããã°ã©ã 2.7: comman颿°(P41)
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;// äžèšä»¥å€ã®ããŒãæŒããšã
}
} - ããã°ã©ã 2.8: simLoop颿°ã®å€æŽ(P42)
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);
}
ãã€ããïŒ
ODEã¯ïŒã€ã®ç©äœãè¡çªããåŸã«ãäºãã«è²«éããããšãèš±ããªãææ(non-penetration constratint)ã䜿ã£ãŠããŸãïŒç©äœã®é床ãéãã£ããïŒã¹ããããµã€ãºã倧ããå Žåã¯è²«éããŠããŸãã®ã§ïŒç¹å¥ãªåãããã£ã«ãããŠãããé²ãã§ããŸãïŒERPã¯ãã®ä¿®æ£å ·åã調æŽãããã©ã¡ãŒã¿ã§ïŒERPãïŒãªã次ã®ã¹ãããã§èª€å·®ãïŒã«ä¿®æ£ãïŒERPãïŒãªã誀差ãä¿®æ£ããŸããïŒ
ããŠïŒã質åã®ä»¶ã§ããïŒäžæåæ¢ãšïŒã¹ãããå®è¡ããããå Žåã¯ïŒODEæ¬P42ã®äžããïŒè¡ç®ã«ããããã«ïŒäžæåæ¢ãããåŠçã®éšåã以äžã®ããã«ifæã§å²ã¿ãŸãïŒãããããšããŒã§æäœã§ããã¯ãã§ãïŒç§ã®ç°å¢MSYS+MinGWã§ã¯ã§ããŸããïŒ
if (!pause) {
äžæåæ¢ãããåŠç
}
ãªãïŒãã詳ãã説æãODEè¬åº§ïŒïŒãšããŠã¢ããããŸããã®ã§ïŒåèã«ããŠãã ããïŒ
ã§ã
demuãã
æ©éã®åçããããšãããããŸãïŒèª€å·®ä¿®æ£ã¯å€ããªãã»ãããããšããæ°å€çãªãã®ã§ã¯ãªãïŒå®éã«åãåããŠããŸããã§ããïŒãªãã»ã©ã§ãïŒ
ç¶ããŠè³ªåã§ãããŸããïŒ
2.4.2ã®ããŒã³ãã³ãã®ãšããã§ïŒãã¯ã¹ãã£ããã³åœ±ã®ON/OFFã¯å¯èœãªã®ã§ããïŒ
ã·ãã¥ã¬ãŒã·ã§ã³ã«çŽæ¥é¢ããâ匷å¶çµäºââäžæåæ¢ââã¹ãããå®è¡âãã§ããŸããïŒ
è§£æ±ºæ¹æ³ãããããã§ããããææé¡ããŸãïŒ
ãã€ããïŒ
æŒç¿åé¡ã«é¢ããã³ã¡ã³ãããããšãããããŸãïŒ
ãã€ããã®ãææã®ãšããã®çŸè±¡ãèŠãããŸããïŒ
è§£æ±ºæ¹æ³ã¯ïŒã€ãããŸãïŒ
ïŒïŒcreateMonoBot颿°ã®æåŸã«ä»¥äžãå ããïŒ
dJointSetSliderParam(s_joint, dParamStopERP, 0.2);
dJointSetSliderParam(s_joint, dParamStopCFM, 1e-5);
ãµã³ãã«ããã°ã©ã ã§ã¯main颿°å ã§dWorldSetERP(), dWorldSetCFM()ã§ERPã1.0ïŒCFMã0.0ã«ããŠããŸãïŒããã¯Worldå ã®å šãŠã®ãžã§ã€ã³ãã«äœçšããŸãïŒERPãïŒãšããããšã¯ïŒã¹ãããã§é¢ç¯èª€å·®ãä¿®æ£ããŸãïŒãã®ãµã³ãã«ããã°ã©ã ã§ã¯ã¹ããããµã€ãºã0.01ãªã®ã§ïŒç¶æ³ã«ããé¢ç¯ã®å¯ååããªã³ã¯ãè¶ ããå ŽåããããŸãïŒæ¬¡ã®ã¹ãããã§é¢ç¯èª€å·®ãïŒã«ããããã«å€§ããªåããªã³ã¯ã«ãããããšã«ãªãïŒã¹ãŒããŒãžã£ã³ãããŠã©ããã«é£ãã§ããããšã«ãªããŸãïŒ
ä»åã®ãµã³ãã«ããã°ã©ã ã§ã¯ã¹ã©ã€ããŒãžã§ã€ã³ããåé¡ã«ãªãã®ã§ïŒãã®å¯ååã®äž¡ç«¯ã§äœçšããdParamStopERP, dParamStopCFMãäžã®ããã«èšå®ããã°OKã§ãïŒ
ïŒïŒãã¹ããããµã€ãºãå°ãããã
çŸç¶ã®ODEã§ã¯ææåã®èšç®ä»¥å€ã¯ïŒæ¬¡ã®ãªã€ã©ãŒæ³ã䜿ã£ãŠããããèšç®ç²ŸåºŠãé«ããªãã®ã§ïŒãã®ãããªçŸè±¡ãçããå ŽåããããŸãïŒãsimLoop颿°ã®dWorldStep()ã®ã¹ããããµã€ãºã0.002ã«å€æŽãããšãã®ãããªçŸè±¡ãèŠãããªããªããŸããïŒãåœç¶ã§ããïŒã¹ããããµã€ãºãå°ãããããšç²ŸåºŠã¯åäžããŸããïŒé床ã¯é ããªããŸãïŒODEã®æ¬¡æããŒãžã§ã³1.0ããïŒæ¬¡ã®ã«ã³ã²ã¯ãã¿ãå®è£ ãããäºå®ã§ãïŒãããªããšæ¹åãããããããŸãããïŒåœç¶é床ã¯é ããªãã§ãããïŒ
ã§ã
EX2.3ã§è³ªåããããŸãïŒ
ãã©ã¡ãŒã¿ã倿ŽããŠè©ŠããŠã¿ããšïŒããã©ã«ãã®400Nã§ã¯ã¡ãã£ãšããè·³ããªãã®ã«ïŒ
150Nã100Nã ãšç©ºã«å¹ã£é£ã¶ãããé£ãã§ãããŸãïŒ
åãå°ãããªã£ãã®ã«é£ãã§è¡ã£ãŠããŸããšããã®ã¯ã©ããã€ã¡ãŒãžãšåããªãã®ã§ããïŒ
äœãèµ·ãã£ãŠããã®ã§ããããïŒ
ãææé¡ããŸãïŒ
ã§ãããããè¿ä¿¡ããããšãããããŸããã
ã«ãã»ã«ã«ã€ããŠç¡äºã«çè§£ããããšãã§ããŸããã
æ©ããåå¿è ããã
ïŒïŒdMassSetCapsuleTotal()ã¯ODEæ¬ã®ïŒïŒããŒãžã«èª¬æããããŸããïŒçªç®ã®åŒæ°ã¯ã«ãã»ã«ã®é·è»žæ¹åãã©ã®æ¹åãåããŠããããæå®ããŸãã1ãªãx軞ãïŒãªãy軞ãïŒãªãz軞ã§ãããªããã«ãã»ã«ãåæ±ã¯å§¿å¢ãæå®ããªãå Žåã¯ãé·è»žæ¹åãz軞ã«ãªããŸããããã¯æ £æ§ãã³ãœã«ã®èšç®ã«å¿ çšã§ãã
ïŒïŒdsã§å§ãŸãAPIã¯æç»ã«é¢ãããã®ã§ããéãã¯ãã«ãã»ã«ã§æç»ããããåæ±ã§æç»ãããã§ãã
ïŒïŒã«ãã»ã«ã¯åæ±ã®äž¡ç«¯ã«ååãã€ãããã®ã§ããODEæ¬ã®ïŒïŒããŒãžå³3.3ãã芧ãã ããã
é·è»žæ¹åã®æå®ã¯ãããã¥ãããšãããããããŸãããã
ã§ã
ããã°ã©ã 2.9ã§è³ªåã§ããã€ã質åããããŸãã
1ã€ç®ã¯ãè¶³ã®çæã§ã®
dMassSetCapsuleTotal(&mass,leg[i].m,3,leg[i].r,leg[i].l);
ã®ãœãŒã¹ã§ã3ã¯äœã衚ããŠããæ°ãªãã§ããããïŒ
2ã€ç®ã¯ãè¶³ã®æç»ã§ãããã°ã©ã 2.5ã§ã¯ãäžèãäžèå ±ã«
dsDrawCapsuleã§ãããã2.9ã§ã¯äžèã¯ãdsDrawCylinderã«
ãªã£ãŠãããŸãããã®éãã¯äœãæå³ããŠãã®ã§ããïŒ
æåŸã«ãåæ±ãšã«ãã»ã«ã®éããäžæãçè§£ã§ããŸããã
ç§ã«ã¯ïŒã€ãšãåãã«èŠããŠããŸããŸãã
æ¯éãããããé¡ãããŸãã