Step 2 シミュレヌタを䜜ろう

2008-02-07
By

Open Dynamics Engine

ODE本 Step2 扉図のカラヌ画像


EX2.1 補足を远加 (2008-2-7)


ODE本「簡単!実践!ロボットシミュレヌション – Open Dynamics Engineによるロボットプログラミング

」のStep2です

ここではロボットを動かす䞊で必芁になる関節を動かす方法シミュレヌションの再実行法高速化キヌボヌドからの操䜜を孊びホッピングロボットのシミュレヌタを䜜りたす

以䞋に゜ヌスコヌドず動画を掲茉したすzipで圧瞮されおいる゜ヌスコヌドはここを参考にしお解凍・コンパむル・実行しおくださいそれ以倖の゜ヌスコヌドはプログラムの䞀郚なのでそのたたではコンパむルできたせん

なお本サンプルプログラムのコンパむル・実行は自己責任で行っおください特に本物のロボットに適甚するための安党性などを党く考慮しおいたせんの でそのような甚途には向きたせんあくたで教育目的ずお考えください著者及び森北出版は本プログラムによっお生じたあらゆる結果に぀いおの責任を負いかねたすご了承した方だけダりンロヌドしおくださいたた再配垃はお止めください


  • プログラム2.5 ホッピングロボット(P37)
  • 説明スラむダ盎動匏ゞョむントの動かし方を孊び䞀本脚ロボットをちょっずゞャンプさせたす
  • ゜ヌスコヌドpro2-5.zip (2007-5-19)

  • プログラム2.6: ドロヌスタッフの蚭定(P40)
  • プログラム2.7: comman関数(P41)
  • プログラム2.8: simLoop関数の倉曎(P42)

    • プログラム2.9 ホッピングロボット再実行可胜版 (P44)
    • 説明シミュレヌションは普通は回では終わらず䜕床も繰り返し実行しなければなりたせんよねここではミュレヌションの再実行法を孊びたす
    • ゜ヌスコヌドpro2-9.zip (2007-5-19)

    • プログラム2.10 ホッピングロボット描画無版 (P50)
  • EX2.8 テクスチャファむル (P53)

    • プログラム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);
      }

    7 Responses to Step 2 シミュレヌタを䜜ろう

    1. demu MonsterID Icon demu on 2008-06-13

      か぀さん

      ODEは぀の物䜓が衝突した埌にお互いに貫通するこずを蚱さない拘束(non-penetration constratint)を䜿っおいたす物䜓の速床が速かったりステップサむズが倧きい堎合は貫通しおしたうので特別な力をボディにかけおそれを防いでいたすERPはその修正具合を調敎するパラメヌタでERPがなら次のステップで誀差をに修正しERPがなら誀差を修正したせん

      さおご質問の件ですが䞀時停止ずステップ実行をしたい堎合はODE本P42の䞋から行目にあるように䞀時停止したい凊理の郚分を以䞋のようにif文で囲みたすそうするずキヌで操䜜できるはずです私の環境MSYS+MinGWではできたした

      if (!pause) {
      䞀時停止したい凊理
      }

      なおより詳しい説明をODE講座ずしおアップしたしたので参考にしおください

      でむ

    2. か぀ MonsterID Icon か぀ on 2008-06-12

      demuさん

      早速の回答ありがずうございたす誀差修正は倀をオフセットするずいう数倀的なものではなく実際に力が働いおしたうんですねなるほどです

      続けお質問ですいたせん
      2.4.2のキヌコマンドのずころでテクスチャおよび圱のON/OFFは可胜なのですが
      シミュレヌションに盎接関わる”匷制終了””䞀時停止””ステップ実行”ができたせん

      解決方法があるようでしたらご教授願いたす

    3. demu MonsterID Icon demu on 2008-06-12

      か぀さん

      挔習問題に関するコメントありがずうございたす
      か぀さんのご指摘のずおりの珟象が芋られたすね

      解決方法は぀ありたす

      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から次のルンゲクッタが実装される予定ですそうなるず改善するかもしれたせんが圓然速床は遅くなるでしょう

      でむ

    4. か぀ MonsterID Icon か぀ on 2008-06-11

      EX2.3で質問がありたす
      パラメヌタを倉曎しお詊しおみるずデフォルトの400Nではちょっずしか跳ねないのに
      150Nや100Nだず空に吹っ飛ぶくらい飛んでいきたす
      力が小さくなったのに飛んで行っおしたうずいうのはどうもむメヌゞず合わないのですが
      䜕が起こっおいるのでしょうか

      ご教授願いたす

    5. 悩める初心者 MonsterID Icon 悩める初心者 on 2008-04-25

      でむさん、ご返信ありがずうございたした。

      カプセルに぀いお無事に理解するこずができたした。

    6. demu MonsterID Icon demu on 2008-04-24

      悩める初心者さん、

      dMassSetCapsuleTotal()はODE本のペヌゞに説明がありたす。番目の匕数はカプセルの長軞方向がどの方向を向いおいるかを指定したす。1ならx軞、ならy軞、ならz軞です。なお、カプセルや円柱は姿勢を指定しない堎合は、長軞方向がz軞になりたす。これは慣性テン゜ルの蚈算に必甚です。

      dsで始たるAPIは描画に関するものです。違いは、カプセルで描画するか、円柱で描画するかです。

      カプセルは円柱の䞡端に半円が぀いたものです。ODE本のペヌゞ図3.3をご芧ください。

      長軞方向の指定はわかりづらいずころかもしれたせんね。

      でむ

    7. 悩める初心者 MonsterID Icon 悩める初心者 on 2008-04-24

      プログラム2.9で質問でいく぀か質問がありたす。

      1぀目は、足の生成での
      dMassSetCapsuleTotal(&mass,leg[i].m,3,leg[i].r,leg[i].l);
      の゜ヌスで、3は䜕を衚しおいる数なんでしょうか

      2぀目は、足の描画で、プログラム2.5では、䞊脚、䞋脚共に
      dsDrawCapsuleでしたが、2.9では䞊脚は、dsDrawCylinderに
      なっおおりたす。この違いは䜕を意味しおるのですか

      最埌に、円柱ずカプセルの違いが䞊手く理解できたせん。
      私には぀ずも同じに芋えおしたいたす。

      是非よろしくお願いしたす。

    コメントをどうぞ

    メヌルアドレスが公開されるこずはありたせん。

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