91robotsimu: 2007年6月アーカイブ

ODE本「簡単!実践!ロボットシミュレーション - Open Dynamics Engineによるロボットプログラミング 」のStep9です.

最終章です.ここでは,やんちゃでかわいい男をイメージしたヒューマノイドロボットモデル「けんせいちゃん:Kensei-Chan」の運動学,逆運動学を求め,足裏に圧力センサを取り付け,ZMPによる簡単な歩行制御により歩かせることが最終ミッションです.

動画を上に,ソースコードを以下に掲載します.zipで圧縮されているソースコードはここを参考にして解凍・コンパイル・実行してください.

  • EX9.3: ヒューマノイドモデル 「けんせいちゃん」 (P223)
    • 説明:Controlキーを押しながらpキーを押すと,kensei-chanがジャンプし着地します.ただし,ODE本では跳躍制御は全くふれていませんのでこれは単なるデモです.初心者向けの本なので過度の期待をなさらぬようお願いします(笑い).「けんせいちゃん」に歩行制御を組み込み無事歩かせてください.
    • ソースコード:kensei070619.zip  (2007-6-19)
  • プログラム9.1: 力・トルクセンサ (P227)
    • 説明:ヒューマノイドロボットには欠かせない圧力,トルクセンサの実装例です.
    • ソースコード:pro9-1-070702.zip  (2007-7-2)
      ODE本P227のプログラム32行目に誤りがありましたので訂正しました.ねぶらさんご指摘ありがとうございました.

なお,本サンプルプログラムのコンパイル・実行は自己責任で行ってください.特に,本物のロボットに適用するための安全性などを全く考慮していませんので,そのような用途には向きません.また,教育目的のシミュレータであるため,精度を必要とするような研究の用途にも向きません.あくまで,教育目的とお考えください.著者及び森北出版は本プログラムによって生じたあらゆる結果についての責任を負いかねます.ご了承した方だけダウンロードしてください.また,再配布はお止めください.
 

ODE本「簡単!実践!ロボットシミュレーション - Open Dynamics Engineによるロボットプログラミング 」のStep8です. 

ここでは,4脚歩行ロボットについて学びます.クロール,ウオーク,トロットなどの代表的な歩き方を学び,4脚ロボットのモデルを作り,それにクロール歩行を実装します.続きはODE本で...

以下に動画とソースコードを掲載します.zipで固められているソースコードはここを参考にして解凍・コンパイル・実行してください.

  • プログラム8.1: 4脚ロボットの歩行制御 (P210)
    • 説明:上の動画では体を左右にふって転ばないように歩いています.パラメータを調整していないので,歩き方がぎこちないです.これをスムーズに歩かせることが,あなたのミッションです.
    • ソースコード:pro8-1.zip  (2007-5-19)

なお,本サンプルプログラムのコンパイル・実行は自己責任で行ってください.特に,本物のロボットに適用するための安全性などを全く考慮していませんの で,そのような用途には向きません.また,教育目的のシミュレータであるため,精度を必要とするような研究の用途にも向きません.あくまで,教育目的とお 考えください.著者及び森北出版は本プログラムによって生じたあらゆる結果についての責任を負いかねます.ご了承した方だけダウンロードしてください.ま た,再配布はお止めください.

ODE本「簡単!実践!ロボットシミュレーション - Open Dynamics Engineによるロボットプログラミング 」のStep7です.

Step7では関節角速度と先端速度の関係を勉強します.ここを勉強すると何故多くのヒューマノイドロボットの膝が曲がっているかがわかります.続きはODE本で... 

なお,このステップはソースコードがありませんが,おまけとして動画を掲載します.上の動画は,多くのロボット工学の教科書に載っている特異点付近でのロボットアームの挙動を観察するシミュレーションです.特異点近傍では関節の角速度が非常に速くなっていることがわかると思います.読者の皆さんも是非プログラムして観察してください.

(最終更新日 2007-6-15) 

Open Dynamics Engine
ODE本 Step6 扉図のカラー画像

ODE本「簡単!実践!ロボットシミュレーション - Open Dynamics Engineによるロボットプログラミング 」のStep6です.

ここでは,ロボット工学の最も基本である関節角と手先位置の関係を学びます.専門用語では運動学と逆運動学といい,難しいそうですがそれほどでもありません.ODE本では,運動学の計算にシンプルで美しい広瀬先生の方法を採用しています.DH記法に嫌気がさした方もこの方法なら大丈夫です.このステップをマスターすることで下のデモのようにロボットアーム先端を好きなところへ移動することができるようになります.詳しくはODE本で...

以下にロボットシミュレータの動画とソースを掲載します.zipで圧縮されているソースコードはここを参考にして解凍・コンパイル・実行してください.それ以外のソースコードはプログラムの一部なので,そのままではコンパイルできません.

なお,本サンプルプログラムのコンパイル・実行は自己責任で行ってください.特に,本物のロボットに適用するための安全性などを全く考慮していませんの で,そのような用途には向きません.また,教育目的のシミュレータであるため,精度を必要とするような研究の用途にも向きません.あくまで,教育目的とお 考えください.著者及び森北出版は本プログラムによって生じたあらゆる結果についての責任を負いかねます.ご了承した方だけダウンロードしてください.ま た,再配布はお止めください.


  • プログラム6.1: 3自由度ロボットアーム (P164)
    • 説明:上の動画ではキーボードの操作によりロボットを動かしています.このおしゃれな?ロボットアームに運動学,逆運動学を実装していきましょう.
    • ソースコード:pro6-1.zip  (2007-5-19)

  • プログラム6.3: arm2.cpp 3自由度ロボットアーム,運動学実装 (P169)

  • プログラム6.4: 3自由度ロボットアーム,逆運動学実装 (P180)
    • 説明:3自由度ロボットアームに逆運動学を実装しています.赤い球にアーム先端が 届くように制御しています.逆運動学の解は複数あり,上のデモでも途中で切り替えています. 数年前にこのシミュレータを作ったときは感動しました.
    • ソースコード:pro6-4.zip  (2007-5-19)

Open Dynamics Engine
ODE本 Step5 扉図のカラー画像

ODE本「簡単!実践!ロボットシミュレーション - Open Dynamics Engineによるロボットプログラミング 」のStep5です.

ここでは,ロボカップでは当たり前になっている360度自由自在に動くことができる全方向移動ロボットのシミュレータを作りながら,P制御,PD制御,PID制御,運動学,衝突航法,障害物回避などを学び,ロボットへ実装します.詳しくはODE本で...

以下に,シミュレーションの動画とソースコードを掲載します.zipで圧縮されているソースコードはここを参考にして解凍・コンパイル・実行してください.それ以外のソースコードはプログラムの一部なので,そのままではコンパイルできません.

なお,本サンプルプログラムのコンパイル・実行は自己責任で行ってください.特に,本物のロボットに適用するための安全性などを全く考慮していませんの で,そのような用途には向きません.また,教育目的のシミュレータであるため,精度を必要とするような研究の用途にも向きません.あくまで,教育目的とお 考えください.著者及び森北出版は本プログラムによって生じたあらゆる結果についての責任を負いかねます.ご了承した方だけダウンロードしてください.ま た,再配布はお止めください.


  • プログラム5.2: 全方向移動型ロボット (P141)
    • 説明:上の動画ではキーボードの操作によりロボットを動かしています.これに,Step4で実習したようにプログラムを実装し,フォワードロボットのプログラムを作りましょう.
    • ソースコード:pro5-2.zip  (2007-5-19)

  • プチプロ5.3: キーパーロボット (P142)
    • 説明:上の動画はキーパーにプログラムを組み込んだデモです.下のソースコードには組み込まれていないので,そのままではキーパーは動きません.Step5で学んだ知識を総動員してキーパーロボットのプログラムを開発しましょう.
    • ソースコード:pk.zip  (2007-5-19)

Open Dynamics Engine
ODE本 Step4 扉図のカラー画像

ODE本「簡単!実践!ロボットシミュレーション - Open Dynamics Engineによるロボットプログラミング 」のStep4です.

ここでは,山彦やPioneerなど研究用自立移動ロボットでよく採用されている差動駆動型移動機構を持つ車輪型ロボットの基礎を説明します.具体的には,シミュレータ上のロボットにビジョンセンサを搭載するため,絶対座標系から相対座標系への座標変換,自己位置推定,デッドレコニングなどを学び,ロボットに実装します.詳しくはODE本で...

以下にソースコードを掲載します.zipで圧縮されているソースコードはここを参考にして解凍・コンパイル・実行してください.それ以外のソースコードはプログラムの一部なので,そのままではコンパイルできません.

なお,本サンプルプログラムのコンパイル・実行は自己責任で行ってください.特に,本物のロボットに適用するための安全性などを全く考慮していませんの で,そのような用途には向きません.また,教育目的のシミュレータであるため,精度を必要とするような研究の用途にも向きません.あくまで,教育目的とお 考えください.著者及び森北出版は本プログラムによって生じたあらゆる結果についての責任を負いかねます.ご了承した方だけダウンロードしてください.ま た,再配布はお止めください.


  • プログラム4.1: 差動駆動型ロボット (P112)
    • 説明:差動駆動型ロボットのサンプルプログラム.この例では,キーボードの操作によってロボットをボールへ向かわせています.
    • ソースコード:pro4-1.zip  (2007-5-19)

  • プログラム4.3: 差動駆動型ロボット,センサ搭載版 (P120)
    • 説明:上のプログラムにビジョンセンサを組み込み,簡単な制御によりロボットをボールへ向かわせています.センサを実装するために絶対座標系から相対座標系への変換を学びます.
    • ソースコード:pro4-3.zip  (2007-5-19)

  • プログラム4.4: 差動駆動型ロボット, デッドレコニング (P128)
    • 説明:上のプログラムにデッドレコニングを実装しています.y軸成分しか計算していないので,同じ要領でx軸,姿勢角を計算しましょう!車輪型ロボットの運動学と数値積分について学びます.
    • 補足:P128のコードはsimloop関数の中に入れることを想定していない場合です.でも,ODE上のロボットにデッドレコニングを実装する場合は,simloop関数の中に入れる必要があります.以下のソースコードはODEで動作可能にしているのでP128のコードとは一部異なり,whileループがありません.これはsimloop関数がwhileループに入っているためです.


(最終更新日 2007-6-11)

ODEを使って作成したAIBOシミュレータ.ODEに付属している3Dライブラリ(drawstuff)を使ってもこの程度のシミュレータを作れるというデモです.ODE本で勉強すればこの程度のものを作ることも不可能ではありません.実際に,数年前,卒研生と作ったものです.AIBOの著作権の関係で残念ながらソースコードは公開できません.

ODE本「簡単!実践!ロボットシミュレーション - Open Dynamics Engineによるロボットプログラミング 」のStep3です.

ここはODEの英文マニュアルを私流に書き直しています.100%ではありませんが,主要な部分を網羅していますので,英文マニュアルを読まなくてもプログラミングが可能です.APIについても90%以上掲載していますので,ODEのテストプログラムを読むときや,自分でプログラミングをするときも困らないと思います.詳しくはODE本で...

以下にStep3のソースコードを掲載します.zipで圧縮されているソースコードはここを参考にして解凍・コンパイル・実行してください.それ以外のソースコードはプログラムの一部なので,そのままではコンパイルできません.

なお,本サンプルプログラムのコンパイル・実行は自己責任で行ってください.特に,本物のロボットに適用するための安全性などを全く考慮していませんの で,そのような用途には向きません.また,教育目的のシミュレータであるため,精度を必要とするような研究の用途にも向きません.あくまで,教育目的とお 考えください.著者及び森北出版は本プログラムによって生じたあらゆる結果についての責任を負いかねます.ご了承した方だけダウンロードしてください.ま た,再配布はお止めください.

  • プログラム3.1: ODEのデータ型 (P60)
  • プログラム3.2: 答え (P69)

  • プログラム3.3: 斜面をころがるボール (P75)
    • 説明:斜面をボールが転がり,あなたに向かっていきます.
    • ソースコード:pro3-3.zip  (2007-5-19)

  • プログラム3.4: バニー (P80)
    • 説明:ODEのテストプログラムtest_moving_trimesh.cppからバニーだけを取り出し,ソースコードもわかりやすいように変更しています.ここでは,ポリゴンの物体の扱い方を学びます.
    • ソースコード:pro3-4-070607.zip (2007-06-07)

  • プログラム3.5: Aモータ (P94)
    • 説明:ODEで最もエーモータのAモータの使い方のサンプルです.なお,ODE本ではオヤジギャグを封印しています.
    • ソースコード:pro3-5.zip  (2007-5-19)

(最終更新日 2007-6-7)  

 


 

  • プログラム3.1: ODEのデータ型 (P60)
    #if defined(dSINGLE)     // dSINGLEが定義されていたら
    typedef float dReal;      //    dRealはfloatとします.
    #elif defined(dDOUBLE) // dDOUBLEが定義されていたら
    typedef double dReal; //    dRealはdoubleとします.
    #else                  // それ以外の場合
    #error You must #define dSINGLE or dDOUBLE
    #endif                 // #ifの終わり

    typedef dReal dVector3[4];    // dVector3はdRealの配列(要素4個)
    typedef dReal dMatrix3[4*3]; // dMatrix3はdRealの配列(要素12個)
  • プログラム3.2: 答え (P69)
      dBodyID body;
      dMass mass;                       // 質量パラメータ構造体
      dReal r = 0.5, l = 1.0, m = 10.0;    // 半径,長さ,質量
      dReal x = 0.0, y = 0.0, z =  1.0;     // 位置の座標
      dReal ax = 1, ay = 0, az = 0;         // 回転軸ベクトル
      dReal angle = 45.0 * M_PI / 180.0;    // M_PIは円周率
     
      body   = dBodyCreate(world);       // ボディの生成
      dMassSetZero(&mass);         // 質量パラメータの初期化
      dMassSetCylinderTotal(&mass,m,3,r,l); // 質量計算
      dBodySetMass(body,&mass);         // 質量の設定
      dBodySetPosition(body,x, y, z);          // 位置の設定
     
      dMatrix3 R;
      dRFromAxisAndAngle(R, ax, ay, az, angle); // 回転行列の計算
      dBodySetRotation(body,R);                 // 姿勢の設定

 

Open Dynamics Engine
ODE本 Step2 扉図のカラー画像


ODE本「簡単!実践!ロボットシミュレーション - Open Dynamics Engineによるロボットプログラミング 」のStep2です. ここでは,ロボットを動かす上で必要になる関節を動かす方法,シミュレーションの再実行法,高速化,キーボードからの操作を学びホッピングロボットのシミュレータを作ります.詳しくはODE本で...

以下にソースコードと動画を掲載します.zipで圧縮されているソースコードはここを参考にして解凍・コンパイル・実行してください.それ以外のソースコードはプログラムの一部なので,そのままではコンパイルできません.

なお,本サンプルプログラムのコンパイル・実行は自己責任で行ってください.特に,本物のロボットに適用するための安全性などを全く考慮していませんの で,そのような用途には向きません.また,教育目的のシミュレータであるため,精度を必要とするような研究の用途にも向きません.あくまで,教育目的とお 考えください.著者及び森北出版は本プログラムによって生じたあらゆる結果についての責任を負いかねます.ご了承した方だけダウンロードしてください.ま た,再配布はお止めください.


  • プログラム2.5: ホッピングロボット(P37)
    • 説明:スライダ(直動式)ジョイントの動かし方を学び,一本脚ロボットをちょっとジャンプさせます.
    • ソースコード:pro2-5.zip  (2007-5-19)


  • プログラム2.9: ホッピングロボット,再実行可能版 (P44)
    • 説明:シミュレーションは普通は1回では終わらず,何度も繰り返し実行しなければなりませんよね.ここでは,ミュレーションの再実行法を学びます.
    • ソースコード:pro2-9.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);
    }

Open Dynamics Engine
ODE本 Step1  扉図のカラー画像


ODE本「簡単!実践!ロボットシミュレーション - Open Dynamics Engineによるロボットプログラミング」のStep1では,ODE初体験ということで,リンゴの落下,ボールの跳ね返り,1本脚ロボットのシミュレータを作りながらODEの使い方をマスターします. 以下にStep1の全ソースコードとシミュレータの動画を掲載します.zipで圧縮されているソースコードはここを参考にして解凍・コンパイル・実行してください.それ以外のソースコードはプログラムの一部なので,そのままではコンパイルできません.

なお,本サンプルプログラムのコンパイル・実行は自己責任で行ってください.特に,本物のロボットに適用するための安全性などを全く考慮していませんので,そのような用途には向きません.また,教育目的のシミュレータであるため,精度を必要とするような研究の用途にも向きません.あくまで,教育目的とお考えください.著者及び森北出版は本プログラムによって生じたあらゆる結果についての責任を負いかねます.ご了承した方だけダウンロードしてください.また,再配布はお止めください.


  • プログラム1.1: りんごの落下 (P7)
    • 説明:ニュートンさんの逸話でおなじみのリンゴの落下です.でも,衝突検出が組み込まれていないので....以下のソースコードを見ればわかりますが,このようなプログラムならたった50行です.上の動画は解像度を落としているので美しくありませんが,実際はたなびく雲が美しいですよ.
    • ソースコード:pro1-1-070602.zip  (2007-6-2)

  • プログラム1.2: ボールの跳ね返り (P15)
    • 説明:衝突検出を組み込み地面を突き抜けなくなりましたが,跳ね返ることはできません.反発係数を設定して跳ね返るようにしましょう.
    • ソースコード:pro1-2-070602.zip  (2007-6-2)


  • プログラム1.3: 1本脚ロボット (P24)
    • 説明:球と円柱を関節で結合し,1本脚ロボットを作ります.Step1を学ぶことで関節のあるロボットを作ることができます.Step2では関節の動かし方を学びます.
    • ソースコード:pro1-3-070602.zip  (2007-6-2)

詳しくはODE本で...

注:ソースコードのLinux用makefileに警告がでる不具合がありました.訂正しソースコードの名称を変更しました. 今後をわかりやすいように訂正した日付をソースコード名に入れることにします.

(最終更新日 2007-6-8) 

ODE本はロボット工学の初歩的なことを広く浅く紹介していますので,さらに勉強をするための教科書を紹介します.私はコンピュータ科学を専攻したので,ロボット工学に関しては多くの良書に出会い,また,ロボカップに参戦しながら学びました.ここでは,個人的に大変お世話になった良書を紹介します.
 


Smile ロボット工学―機械システムのベクトル解析,広瀬茂男著,裳華房

ODE本の運動学を計算する手法は広瀬先生によるものです.ロボット工学の教科書の多くはDH記法を使って運動学を説明していますが,これがわかりづらく挫折する人が続出します.

その点,広瀬先生の手法はシンプルでわかりやすいもので運動学が好きになります.運動学以外の部分でも大変わかりやすく書かれており,ロボット工学を理解するために読んでおきたい教科書です.ロボット工学を教えていたときは,この教科書を使い,学生にも好評でした.

ただ一つの欠点は価格が4725円と高いことですが,その価格でロボット工学を理解できるので十分元は取れます.学部低学年でも十分に理解可能です.


Smile はじめてのロボット創造設計,米田完,大隅久,坪内孝司著,講談社

ロボカップでロボットを作るとき,ODE本の執筆に際しても参考にさせて頂きました.ロボットを実際に設計し,作る人はまず読んでおきたい本です.ロボコンなどのロボットコンテストに参加している学生はただやみくもに作るのではなく,このような本で勉強し,基礎をしっかりさせてから作ると結果がついてくると思います.


Smile  ヒューマノイドロボット,梶田秀司編著,オーム社

ODE本でも紹介していますが,私の知る限りヒューマノイドロボットに関する教科書としてはこれしかありません.著者の梶田さんを存じ上げていますが,本質をついた明快な語り口のためファンが多いです.この本の随所に梶田さんの思想を読み取ることができます.ただし,HRP-2を実際に動かしている技術をまじめに(数式テンコ盛りで)説明しているので数学,力学の素養が相当ないと完全に理解することは容易ではありません.学部高学年,大学院生向けです.

 

 

このアーカイブについて

このページには、2007年6月以降に書かれたブログ記事のうち91robotsimuカテゴリに属しているものが含まれています。

前のアーカイブは91robotsimu: 2007年5月です。

次のアーカイブは91robotsimu: 2007年8月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01