|
|
|
このページの内容:
ポスチャファイルはメモリースティックに入っています。しかし、もともとはパソコンの下記フォルダにあったファイルをメモリースティックにコピーしたものです(make updateコマンドを実行すると、msフォルダの内容がメモリースティックにコピーされます)。
注意: 安全のため、AIBOを床の上、または広いテーブルの中央に置いてください。突然、ロボットが動き出しても落下しないようにしてください。 ポスチャファイルをロードする
- AIBOを動かそう:AIBOを起動する。コントローラ画面がAIBOに接続後、StopモードからRunningモードにする。
- コントローラ画面で File Access を選ぶ。
- File Access メニューから Posture Editor を選ぶ。Posture Editorメニューには、関節名と関節の現在値が表示される。
- Posture Editor メニューから Load Posture を選ぶ。
- LIEDOWN.POS を選択する。もし、AIBOが動かなければ、コントローラ画面がStopモードになっていないか確認する。
- もう一度、Load Posture で今度は SITUP.POS を選択する。
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 #ENDFile LIEDOWN.POS
PostureEngineのドキュメントには、ポスチャの作成や操作に使用する関数の説明があります。
PostureMCのオブジェクトを作成する方法はいくつかあります(あまり使うことはありませんが)。
モーションシーケンスファイルは、ファイル名の最後に拡張子 .motが付きます。そして、次の規則を持ちます。
注意: 安全のため、AIBOを床の上、または広いテーブルの中央に置く。突然、ロボットが動き出しても落下しないようにする。 モーションシーケンスを試す
- AIBOを起動する。コントローラ画面がAIBOに接続したら Stop モードから Running モードにする。
- コントローラ画面で File Access を選ぶ。
- File Access メニューから Run Motion Sequence を選ぶ。
- PAN_HEAD.MOT をダブルクリックする。PAN_HEAD.MOT は頭を左右に振るモーションシーケンス。
- .MOTが付くファイルがモーションシーケンスファイル。試すときは、AIBOが転倒しないように注意する。
モーションシーケンスファイルの内容を説明します。
#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 #ENDFile PAN_HEAD.MOT
degrees コマンドは、そのファイルでは角度を「度」で表示していることを意味します。もし、「ラジアン」で表示するならば、radians コマンドを使います。
advanceTime n コマンドは、nミリ秒で実行せよ、という意味です。このコマンドの次の行のポスチャに変化するまでの時間です。つまり、先に advanceTime で時間を指定し、次にポスチャ(関節角度)を指定します。システムが時間と角度をもとに、適切な速度を計算します。最初の例では、50ミリ秒かけて、tiltが15度、rollが0度の位置まで頭を動かします(tiltとrollは頭の上下の角度です)。次の例では、850ミリ秒かけて頭を45度だけ左に向けます(panというのは頭の左右の角度です)。最後の例では、900ミリ秒かけて、頭を45度だけ右に向けます。 モーションシーケンスでは、関節ごとの角度を指定する代わりにポスチャファイルを読み込むこともできます。
load posturefile 指定したポスチャファイルを読み込む
上記 LIESTAND.MOT では、伏せ、座り、立ちの姿勢を順番に実行するように命令を書いてますが、お粗末に作られているので、AIBOは転倒するでしょう。
#MSq advanceTime 2000 load liedown.pos advanceTime 2000 load situp.pos advanceTime 2000 load stand.pos #ENDFile LIESTAND.MOT
モーションシーケンスを実行する時、各々の関節は他の関節とは独立してファイルの指示通りの角度に調整されます。ある関節に対して目標角度と所要時間が与えられると、MotionSequenceEngine が目標角度に動かすまでのスピードを計算します。他の関節の状態は関係ありません。したがって、頭やボディのモーションを独立してコントロールできます。しかし、モーションシーケンスを作るとき、注意すべきことがあります。次の例を見てください。ここでは次の順に動かしたいとします。
モーションシーケンスファイルを試す
- ファイル LIESTAND.MOT を作成し、フォルダ project → ms → data → motion に保存する。
- "make update" を実行し、メモリースティックにコピーする。
- メモリースティックをAIBOに挿入し、AIBOを起動する。コントローラ画面がAIBOに接続したら、Stopモードから Runnningモードに切り替える。
- コントローラ画面で File Access を選ぶ。
- File Access メニューから、Run Motion Sequence を選ぶ。
- LIESTAND.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ミリ秒の箇所に赤い行を追加します。 発展:
#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 #ENDFile HEADWAG.MOT
上記プログラムをコピーして秀丸に貼り付け、次の通り保存してください。
#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()の箇所です。
Motion Sequence Type Name |
Fully-Specified Postures |
Keyframes | MotionEditor Postures |
TinyMotionSequenceMC | 2 | 94 | 〜 2 |
SmallMotionSequenceMC | 3 | 141 | 〜 6 |
MediumMotionSequenceMC | 6 | 282 | 〜 12 |
LargeMotionSequenceMC | 11 | 517 | 〜 24 |
XLargeMotionSequenceMC | 26 | 1222 | 〜 60 |
|
|
|