ポスチャとモーションシーケンス

前のページ
目次
次のページ


このページの内容:


ポスチャ(Postures)

 AIBOがとるポーズ(姿勢)をポスチャ(posture)と呼びます。ポスチャは、複数の関節角度のセットです。ポスチャを表現するオブジェクトが PostureEngineオブジェクトです。プログラマの望むポスチャをAIBOにさせるには PostureMC というモーションコマンドを使用します。
 AIBOに特定の姿勢を取らせる方法の1つはポスチャファイルを使用することです。Tekkotsuには、あらかじめポスチャファイルがいくつか含まれています。以下の記述にしたがって試してください。

ポスチャファイルをロードする

注意: 安全のため、AIBOを床の上、または広いテーブルの中央に置いてください。突然、ロボットが動き出しても落下しないようにしてください。

  1. AIBOを動かそう:AIBOを起動する。コントローラ画面がAIBOに接続後、StopモードからRunningモードにする。

  2. コントローラ画面で File Access を選ぶ。

  3. File Access メニューから Posture Editor を選ぶ。Posture Editorメニューには、関節名と関節の現在値が表示される。

  4. Posture Editor メニューから Load Posture を選ぶ。

  5. LIEDOWN.POS を選択する。もし、AIBOが動かなければ、コントローラ画面がStopモードになっていないか確認する。

  6. もう一度、Load Posture で今度は SITUP.POS を選択する。

 ポスチャファイルはメモリースティックに入っています。しかし、もともとはパソコンの下記フォルダにあったファイルをメモリースティックにコピーしたものです(make updateコマンドを実行すると、msフォルダの内容がメモリースティックにコピーされます)。

    project → ms → data → motion

 ポスチャファイルは、ファイル名の最後に拡張子 .posが付きます。そして、次の規則を持ちます。
   ・最初の行は #POS で始まる。
   ・最後の行は #END で終わる。
 ここで、LIEDOWN.POS の内容を見てみましょう。左の列は関節の名前です。中央列は関節角度です(単位はラジアン)。右列は重みです(重みはモーションマネージャが複数のモーションを1つにまとめるときに使用します)。

#POS
LFr:rotor       0.946459        1.000000
LFr:elvtr       -0.034906       1.000000
LFr:knee~       0.602027        1.000000
RFr:rotor       0.924253        1.000000
RFr:elvtr       -0.052359       1.000000
RFr:knee~       0.585458        1.000000
LBk:rotor       -2.042035       1.000000
LBk:elvtr       0.245109        1.000000
LBk:knee~       1.978277        1.000000
RBk:rotor       -2.042035       1.000000
RBk:elvtr       0.233709        1.000000
RBk:knee~       2.100212        1.000000
#END
File LIEDOWN.POS

PostureMCを作成する

 PostureMCは次の2つの部品を持ちます。
  ・PostureEngine : 関節角度でポスチャを表現する
  ・MotionCommand : 関節を動かす

 PostureEngineのドキュメントには、ポスチャの作成や操作に使用する関数の説明があります。

 PostureMCのオブジェクトを作成する方法はいくつかあります(あまり使うことはありませんが)。

 PostureMCはとてもシンプルなモーションを実行します。つまり、特定の目標へすべての関節をダイレクトに動かします。座り姿勢から立ち姿勢に動くような複雑な変化に関して、PostureMCは安全ではありません。AIBOが転倒してしまいます。複雑なアクションを実行するためには、複数の小さなモーションをつなげる必要があります。また、これらのモーションはバランスを考慮し、かつ、足どうしが衝突しないようにデザインすべきです。足どうしの衝突は故障の原因にもなるので注意してください。

 上記の理由から、実際のアクションには、シンプルな PostureMC の代わりに MotionSequenceMC (下記)を使用します。

モーションシーケンス

 モーションシーケンスは、関節を動かすスクリプトです。シーケンスには「連続の」「一連の」「順番の」という意味があります。モーションシーケンスは、複数のポスチャで定義されるキーフレーム( Keyframe )を順番に実行するためのスクリプトなのです。あるポスチャから別のポスチャに姿勢を変えるには、キーフレーム間の時間を調整しなければなりません。

 Tekkotsu には、すでに用意されたモーションシーケンスが含まれています。

モーションシーケンスを試す

注意: 安全のため、AIBOを床の上、または広いテーブルの中央に置く。突然、ロボットが動き出しても落下しないようにする。

  1. AIBOを起動する。コントローラ画面がAIBOに接続したら Stop モードから Running モードにする。

  2. コントローラ画面で File Access を選ぶ。

  3. File Access メニューから Run Motion Sequence を選ぶ。

  4. PAN_HEAD.MOT をダブルクリックする。PAN_HEAD.MOT は頭を左右に振るモーションシーケンス。

  5. .MOTが付くファイルがモーションシーケンスファイル。試すときは、AIBOが転倒しないように注意する。

  モーションシーケンスファイルは、ファイル名の最後に拡張子 .motが付きます。そして、次の規則を持ちます。
   ・最初の行は #MSq で始まる。
   ・最後の行は #END で終わる。

 ここで、PAN_HEAD.MOT の内容を見てみましょう。

#MSq
degrees

advanceTime  50
NECK:tilt	15
NECK:roll	0

advanceTime  850
NECK:pan~	-45

advanceTime  900
NECK:pan~	45
NECK:tilt	15
NECK:roll	0
#END
File PAN_HEAD.MOT

 モーションシーケンスファイルの内容を説明します。

 degrees コマンドは、そのファイルでは角度を「度」で表示していることを意味します。もし、「ラジアン」で表示するならば、radians コマンドを使います。

 advanceTime n コマンドは、nミリ秒で実行せよ、という意味です。このコマンドの次の行のポスチャに変化するまでの時間です。つまり、先に advanceTime で時間を指定し、次にポスチャ(関節角度)を指定します。システムが時間と角度をもとに、適切な速度を計算します。最初の例では、50ミリ秒かけて、tiltが15度、rollが0度の位置まで頭を動かします(tiltとrollは頭の上下の角度です)。次の例では、850ミリ秒かけて頭を45度だけ左に向けます(panというのは頭の左右の角度です)。最後の例では、900ミリ秒かけて、頭を45度だけ右に向けます。

 モーションシーケンスでは、関節ごとの角度を指定する代わりにポスチャファイルを読み込むこともできます。
 その場合、次のコマンドをモーションシーケンスファイルに書きます。

load posturefile指定したポスチャファイルを読み込む

モーションシーケンスファイルの作成

 モーションシーケンスを作成する方法はいくつかあります。
 1つの方法はテキストエディタを使って角度を直接打ち込むか、ポスチャファイルを読み込む命令を打ち込むかして、モーションシーケンスファイルを作ることです。このファイルを "project/ms/data/motion" フォルダに保存して、"make update"コマンドを実行すれば、メモリースティックにコピーされます。
 次の例は、複数のポスチャファイルを読み込む方法です:

#MSq
advanceTime 2000
load liedown.pos

advanceTime 2000
load situp.pos

advanceTime 2000
load stand.pos
#END

File LIESTAND.MOT

 上記 LIESTAND.MOT では、伏せ、座り、立ちの姿勢を順番に実行するように命令を書いてますが、お粗末に作られているので、AIBOは転倒するでしょう。

モーションシーケンスファイルを試す

  1. ファイル LIESTAND.MOT を作成し、フォルダ project → ms → data → motion に保存する。

  2. "make update" を実行し、メモリースティックにコピーする。

  3. メモリースティックをAIBOに挿入し、AIBOを起動する。コントローラ画面がAIBOに接続したら、Stopモードから Runnningモードに切り替える。

  4. コントローラ画面で File Access を選ぶ。

  5. File Access メニューから、Run Motion Sequence を選ぶ。

  6. LIESTAND.MOT をダブルクリックする。

 モーションシーケンスを実行する時、各々の関節は他の関節とは独立してファイルの指示通りの角度に調整されます。ある関節に対して目標角度と所要時間が与えられると、MotionSequenceEngine が目標角度に動かすまでのスピードを計算します。他の関節の状態は関係ありません。したがって、頭やボディのモーションを独立してコントロールできます。しかし、モーションシーケンスを作るとき、注意すべきことがあります。次の例を見てください。ここでは次の順に動かしたいとします。
   ・首(NECK)と尻尾(TAIL)をニュートラル位置に動かす。(50ミリ秒)
   ・首を左右に振り、ニュートラル位置に戻す。(50〜2550ミリ秒)
   ・尻尾を振る。(2550〜3550ミリ秒)
 この例を実行する場合、下の赤い行の有無により、尻尾の動きが異なります。


#MSq
degrees

advanceTime 50
NECK:pan~ 0
NECK:tilt 0
TAIL:pan~ 0
TAIL:tilt 0

advanceTime 1000
NECK:pan~ 90

advanceTime 1000
NECK:pan~ -90

advanceTime 500
NECK:pan~ 0
TAIL:pan~ 0

advanceTime 500
TAIL:pan~ 90

advanceTime 500
TAIL:pan~ -90

#END
File HEADWAG.MOT

 上記 HEADWAG.MOT で赤い行(TAIL:pan~ 0)がないと、50ミリ秒で「TAIL:pan~ 0」によってニュートラル位置に指定された後、3050ミリ秒(50+1000+1000+500+500ミリ秒)「TAIL:pan~ 90」の時点まで尻尾は参照されません。このため、尻尾を振るモーションが実際には 2550ミリ秒(50+1000+1000+500ミリ秒)でなく、50ミリ秒から始まります。そして尻尾が+90度の位置になるのは3050秒です。最後に-90度の位置になるのは3550秒です。頭を振り終わった2550ミリ秒の時点から尻尾を振り始めるには、尻尾を振り始めるときに(つまり2550秒の時点で)尻尾のスタート角度を与えておかなければなりません。このため、2550ミリ秒の箇所に赤い行を追加します。

発展:

  1. SITSTAND.MOTを実行してみてください。先のLIESTAND.MOTでは立ち上がる途中で転倒しますが、SITSTAND.MOTでは転倒しないと思います。その理由を考えてください。

  2. コントローラ画面で、Stopモードにしてください。StopモードでSITSTAND.MOT をダブルクリックすると、どんな音がしますか? その音の直後にRunモードに切り替えるとどうなりますか?

  3. 同じポスチャを5秒間、続けた後、別のポスチャに変化させるには、モーションシーケンスファイルにどう書けばいいですか?

モーションシーケンスのプログラミング

 もっと洗練したモーションシーケンスを作るには、MotionSequeceMC モーションコマンドを使います。
 次の例は、モーションシーケンスの関節位置を異なる方法で与えるプログラムです。
 異なる方法とは次の3つです。
   1) ポスチャファイルを読み込む。
   2) PostureEngineオブジェクトを作り OutputCmdsを設定する。
   3) MotionSequenceMC に直接 OutputCmds を設定する。

#ifndef INCLUDED_MySeq_h_
#define INCLUDED_MySeq_h_
 
#include "Behaviors/BehaviorBase.h"

#include "Motion/MotionManager.h"    // MotionManagerを使用するためにインクルード
#include "Motion/MotionSequenceMC.h" // MotionSequenceを使用するためにインクルード

#define PI acos(-1.)                 // PI(3.14)の定義

class MySeq : public BehaviorBase {
public:
  MySeq() : BehaviorBase("MySeq") {}
 
  virtual void DoStart() {
    BehaviorBase::DoStart();

    float const leftGlanceAngle = 60.0*PI/180.0;
    float const rightGlanceAngle = -70.0*PI/180.0;
    float const downGlanceAngle = -55.0*PI/180.0;

    // SharedObjectクラスのオブジェクトmseq_mcを作成
    SharedObject<MediumMotionSequenceMC> mseq_mc;

    // 1秒かけて頭を真っすぐ正面に向ける

    // PostureEngineのオブジェクトlookstraight を作成
    PostureEngine lookstraight;
    // 頭の上下角(Tilt)を設定
    lookstraight.setOutputCmd(HeadOffset+TiltOffset, 0.0);
    // 頭の左右角(Pan)を設定
    lookstraight.setOutputCmd(HeadOffset+PanOffset, 0.0);
    // 所要時間を設定
    mseq_mc->advanceTime(1000);
    // ポスチャを設定
    mseq_mc->setPose(lookstraight);

    // 5秒かけて座る

    // 所要時間を設定
    mseq_mc->advanceTime(5000);
    // ポスチャファイルsitup.posを設定
    mseq_mc->LoadFile("situp.pos");

    // 1秒かけて頭を左に向ける

    // 所要時間を設定
    mseq_mc->advanceTime(1000);
    // 頭の左右角(Pan)を設定
    mseq_mc->setOutputCmd(HeadOffset+PanOffset, leftGlanceAngle);

    // 2秒間、頭を左に向けたままにする

    mseq_mc->advanceTime(2000);
    mseq_mc->setOutputCmd(HeadOffset+PanOffset, leftGlanceAngle);

    // 1秒かけて頭を右に向ける

    mseq_mc->advanceTime(1000);
    mseq_mc->setOutputCmd(HeadOffset+PanOffset, rightGlanceAngle);

    // 2秒間、頭を右に向けたままにする
    mseq_mc->advanceTime(2000);
    mseq_mc->setOutputCmd(HeadOffset+PanOffset, rightGlanceAngle);
    // 頭の上下角(Tilt)を設定
    mseq_mc->setOutputCmd(HeadOffset+TiltOffset, 0.0);

    // 1秒かけて頭を下に向ける

    // 所要時間を設定
    mseq_mc->advanceTime(1000);

    // PostureEngineオブジェクトcurrentposeを作成
    PostureEngine currentpose("situp.pos");

    // 頭の上下角(Tilt)を設定
    currentpose.setOutputCmd(HeadOffset+TiltOffset, downGlanceAngle);

    // currentposeを設定
    mseq_mc->setPose(currentpose);

    // 5秒かけて伏せる
    mseq_mc->advanceTime(5000);
    mseq_mc->LoadFile("liedown.pos");
    mseq_mc->setOutputCmd(HeadOffset+TiltOffset, downGlanceAngle);

    // モーションコマンドをモーションマネージャに登録(この瞬間に実行される)
    motman->addPrunableMotion(mseq_mc);

    DoStop();
  }
 
};

#endif

 上記プログラムをコピーして秀丸に貼り付け、次の通り保存してください。

    保存する場所 : マイドキュメント → usXX → project
    ファイル名  : MySeq.h
    ファイルの種類: C言語ヘッダーファイル(*.h)

 ファイルを保存したら、次の手順を実行してください。

 プログラムを実行したら、AIBOがプログラムの順番通りに動くことを確認してください。

 モーションシーケンスでは、MMAccessor を使いません。理由は、MotionSequenceMC オブジェクトを作成してから、モーションマネージャにモーションコマンドを登録するからです。モーションコマンド登録は、addPrunableMotion()の箇所です。
 setOutputCmd()関数は、第二引数としてOutputCmdオブジェクトを必要としますが、上記の例では実数値が与えていることに注意して下さい。OutputCmdのコンストラクタでは、明示的に型を書くと省略できるのです。つまり、setOutputCmd(j,x)は setOutputCmd(j,OutputCmd(x)) と同じです。

 MotionSequenceMC オブジェクトは共有メモリに置かれるので、サイズを固定しなければなりません。大きなオブジェクトになるほど多くのポスチャを持つことができます。Tekkotsu は下記に示すモーションシーケンスコマンドを提供してます。このように書くと、すべてXLargeサイズにすればよいように思えますが、それは違います。メモリには限りがあるので、すべてXLargeサイズにするとメモリが不足するかもしれません。ポスチャ数に合わせたメモリサイズを選択してください。

Motion Sequence
Type Name
Fully-Specified
Postures
KeyframesMotionEditor
Postures
TinyMotionSequenceMC2 94〜 2
SmallMotionSequenceMC3 141〜 6
MediumMotionSequenceMC6 282〜 12
LargeMotionSequenceMC11 517〜 24
XLargeMotionSequenceMC261222〜 60

 Fully-Specified Posturesは、AIBOの全関節・全LEDの情報を持つ場合で、1ポスチャ当り47個のKeyframeを持ちます。例えば、TinyMotionSequenceMC の場合、2ポスチャ(合計47 x 2 = 94 Keyframe)まで持つことができます。MotionEditor Posturesは別ページで学習するMotionEditorで作成するポスチャのことです。MotionEditor Postureは1ポスチャ当り20個の関節情報を持つので、上記のようになります。

 これまで、頭の動かし方や、伏せ・座り・立ち姿勢のモーションについては説明してきました。しかし、自由に足を動かす方法は説明していません。自由に足を動かすには、4本の足の関節(合計12関節)の角度を時間ごとに逐一指定しなければなりません。このプログラミングは大変な作業になります。このため、もっと簡単にモーションを指定する方法があります。それがMotionEditorを使う方法です。この方法については別のページで学習します。


前のページ
目次
次のページ