ページへ戻る

− Links

 印刷 

SMPL1(PlayMotion) のバックアップソース(No.3) :: Besttechnology

knowledge:SMPL1(PlayMotion) のバックアップソース(No.3)

« Prev[4]  Next »[5]
只今編集中です。

**初めに [#mcf2cd20]
いきなりですがモーションを動かすサンプルプログラムです。~
モーションを再生するのは簡単で、1行書くだけです。~
1行書くだけとは言ってもそのために準備が数行必要です。~
準備の数行はどのサンプルでも大体同じですから、今は深く考えずコピペ(コピー&ペースト)します。~

**モーションとは [#d1bffd31]
ここで言うモーションとは、ロボットの動作のことです。手を振ったり、お辞儀したり、起き上がったり、FREEDOM jr.IIIの動きはほとんどモーションです。~
モーションはよくペラペラ漫画に例えられます。ペラペラ漫画をもっと荒く(コマ数を少なく)したものです。例えばお辞儀するモーションなら3コマでできます。「直立姿勢」->「お辞儀した姿勢」->「直立姿勢」です。それを繋げてお辞儀する動作になります。~
お辞儀の画像~
大抵ロボットでモーションを再生するとロボットダンスのようにカクカクした動きになります。しかしFREEDOM jr.IIIは、コマとコマの間を補間して加減速することで滑らかな動きを実現しています。~
~
FREEDOMjr.IIIの歩行はモーションではありません。言葉の意味で言えばロボットが動くのでモーションと言えばモーションなのですが、上で説明したペラペラ漫画の要領で歩いているのではないのでここでは区別してモーションではないと言います。

**モーション再生のための準備(その1) [#hb810bee]
早速サンプルプログラムの中身を見て行きましょう。SMPL1(PlyaMotion).cをGCC Developer Liteで開いてください。~
これがC言語のプログラムです。/*と*/で挟まれている所や行の先頭に//と書いてある字が水色の所はコメントです。コメントはプログラムを初めて見た人が分かるようにするための説明書きです。とりあえずその部分は飛ばして見て行きます。~
ここでは詳しく説明しませんので簡単に読んで先に進んでください。

 // FREEDOMライブラリ
 #include <fd.h>
 // 人型構造定義
 #include "share/Humanoid16Axis.h"
 // 人型へのアクチュエータの割り当て
 #include "share/HumanoidServoParam.c"

最初にコピペする所です。詳しくは別の機会に説明します。
 /*=========================================================*/
 /* ホームポジションデータ(アクチュエータの制御値 0~1023)  */
 /*=========================================================*/
 const THumanoid Homeposition = {
  Servos:{
    RightLeg:{  511,   513,   718,   617,   514,},
    LeftLeg: {  520,   515,   300,   410,   510,},
    RightArm:{  512,   247,   464,},
    LeftArm: {  512,   761,   570,},
  },
 };
FREEDOMjr.IIIの全ての基準となる大事なデータです。大事ですが別の機会に説明します。
 /*=============================================================*/
 /* モーションデータ(ホームポジションからのオフセット角度(x10倍)*/
 /*=============================================================*/
 // ホームポジションへ移動
 const THumanoidMotion GotoHome[] = {
   { Servos:{
       RightLeg:{    0,     0,     0,     0,     0,},
       LeftLeg: {    0,     0,     0,     0,     0,},
       RightArm:{    0,     0,     0,},
       LeftArm: {    0,     0,     0,},
     },
     Adj:ADJ_SACC_SDECEL, Div:2000,
   },
 };
   ・
   (中略)
   ・
   { Servos:{
       RightLeg:{    0,     0,     0,     0,     0,},
       LeftLeg: {    0,     0,     0,     0,     0,},
       RightArm:{    0,     0,     0,},
       LeftArm: {    0,     0,     0,},
     },
     Adj:ADJ_SACC_SDECEL, Div:1000
   },
 };
これがモーションのデータです。同じ塊が何個も並んでいるように見えると思いますがこれがペラペラ漫画の1コマです。詳しくは別の機会に説明します。
 /*==============================================================*/
 /* モーションの適用部位設定                                     */
 /*==============================================================*/
 // 全身 (優先度1)
 TApplyPart WholeBody_1 = {
   Priority:  1,
   PartNum:  16,
   part:{
      &((THumanoid*)0)->Servos.RightLeg[0],
      &((THumanoid*)0)->Servos.RightLeg[1],
      &((THumanoid*)0)->Servos.RightLeg[2],
      &((THumanoid*)0)->Servos.RightLeg[3],
   ・
   (中略)
   ・
 // 右腕のみ (優先度10)
 TApplyPart OnlyArm = {
   Priority: 10,
   PartNum:   6,
   part:{
      &((THumanoid*)0)->Servos.RightArm[0],
      &((THumanoid*)0)->Servos.RightArm[1],
      &((THumanoid*)0)->Servos.RightArm[2],
   }
 };
これはモーションを体のどの部分が再生するかを設定するものです。普通は体全体がモーションを行いますが、FREEDOMjr.IIIでは好きな所だけを動かすことができます。これにより体の部位によって別々の動きをすることができます。体の分類の仕方も自由に決められます。詳しくは別の機会に説明します。~
~
ここまでは下準備です。本当はこんなに沢山書かなくても良いのですが説明のために書いています(ここでは説明しませんが)。~

**モーション再生のための準備(その2) [#laca6790]
 /*=============================================================*/
 /* Main                                                        */
 /*=============================================================*/
 void main (void) {
   // ライブラリ初期化
   fd_Init (115200, false, _MONITOR_VOLTAGE);
   fd_Wait (2000);
   // サーボパラメータ初期化
   fd_SetServoParameter (ConvToPPose (&Homeposition), SVParam, fd_SVSize(SVParam));


« Prev[4]  Next »[5]