Pepperチュートリアル (3)：ポーズを作る

#このチュートリアルの内容

このチュートリアルでは、Pepperの動き、特に上半身の動きをつくることを通じて、Pepperの関節の仕様や、制御方法について説明します。

1. 各種アクチュエータ仕様
2. ポーズの作成
3. 作成したポーズの実行

#各種アクチュエータ仕様

Pepperのポーズに関するアクチュエータには以下のようなものがあります。

* 頭: 首(2軸:Pitch,Yaw)
* 腕(左右共通): 肩(2軸:Roll,Pitch), 肘(2軸:Yaw,Roll), 腕(1軸:Yaw), 手(開く→閉じる)
* 下半身: 腰(2軸:Pitch,Roll), ひざ(1軸:Pitch)

Pitch,Roll,Yawの説明は、[ヨーイング - Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%A8%E3%83%BC%E3%82%A4%E3%83%B3%E3%82%B0) などを参考にしてください。

#ポーズに関するパネル

##ポーズ ライブラリパネル

ポーズを管理するためには、ポーズ ライブラリパネルを利用します。
もし現在のChoregrapheのウィンドウにポーズ ライブラリパネルが表示されていない場合は、[表示]メニューの[ポーズ ライブラリ]をクリックします。

![pose-library.png](https://qiita-image-store.s3.amazonaws.com/0/28770/0839f382-8ce4-597a-ba45-76fd2c4ef081.png)

1. ポーズ一覧 ... 右クリックでコンテキストメニュー(削除, プロパティ, フォルダ作成)を開けます。ポーズをダブルクリックすると、接続されているロボットがそのポーズをとります
2. ポーズ ライブラリを開く
3. 現在のポーズ ライブラリをエクスポートする
4. ポーズを追加する ... 現在ロボットビューに表示されているポーズ(接続しているバーチャルロボット/Pepperのポーズ)をポーズ ライブラリに追加できます

##ロボットビュー

現在接続しているバーチャルロボットやPepperの状態を確認したり、関節の操作を行うことができます。また、Pepperが認識している顔の位置や、人を認識する領域などの補助情報も表示されます。
もし現在のChoregrapheのウィンドウにロボットビューが表示されていない場合は、[表示]メニューの[ロボットビュー]をクリックします。

![robot-view.png](https://qiita-image-store.s3.amazonaws.com/0/28770/f5671d16-b8b0-941d-c91c-ccd24c29401f.png)

1. ロボット
2. 3D情報表示 ... 描画に関する情報です。
3. 3D情報表示のオン/オフ
4. ALWorldRepresentationに記憶されているオブジェクト情報表示のオン/オフ
5. ロボット位置を更新する/しない
6. モーターの位置を更新する/しない
7. ゾーン表示のオン/オフ
8. 認知した人の表示のオン/オフ

また、ロボットの表示領域では、以下の操作が可能です。

* 表示領域移動 ... マウス左ボタンを押しながらドラッグ
* ズームイン・ズームアウト ... マウスのスクロールホイール操作
* 視点移動 ... マウス右ボタンを押しながらドラッグ

#ポーズの作成

まずは止めのポーズを作ってみます。ポーズを作るには、Choregraphe上で行う方法と、Pepperを手で動かしながらポーズをつけていく方法の2種類があります。

##Choregrapheによるポーズ作成

Choregrapheを使うと、接続しているバーチャルロボット、もしくはPepperに対して関節の制御をおこなうことができます。

###モーション ダイアログボックスによる編集

ロボットビュー上のロボットに対して、変更をおこないたい部位をクリックするとモーション ダイアログが開きます。

![open-motion-dlg.png](https://qiita-image-store.s3.amazonaws.com/0/28770/9351d23d-ccf4-0bf5-b743-0cf766c3608e.png)

モーションダイアログ上のスライダーを移動させる **[A]** ことで、関節を回転させることができます。

![adjust-slider.png](https://qiita-image-store.s3.amazonaws.com/0/28770/b7252c08-0025-9bf8-49ea-8a50732f28d1.png)

ロボットは、自分の体に自身の部品をぶつけないように、Anti-self collisionといった機構を持っています。そのため、関節を動かした際に意図しない動きをする場合があります。


###ローテーションハンドルによる編集

ロボットをクリックしたときにあらわれるリング(ローテーションハンドル)によっても関節を制御することができます。
操作したいローテーションハンドル上にマウスオーバーするとハンドル幅が広がって表示されます。この状態でマウスドラッグ **[A]** すると、対象の関節を制御することができます。

![rotation-handle.png](https://qiita-image-store.s3.amazonaws.com/0/28770/60405f38-f512-007c-7bfb-e6f8efb9db9b.png)

場面に応じて、モーションダイアログとローテーションハンドルの使いやすいほうを利用することができます。

##ポーズの記憶

バーチャルロボットのポーズを、ポーズライブラリに保存しておいて、好きな時に呼び出すことができます。

1. ロボットが保存したいポーズをしている状態で、**[ポジションを追加]ボタン** をクリックします

    ![add-pose.png](https://qiita-image-store.s3.amazonaws.com/0/28770/fece20ee-c7ac-5786-e6d7-5beac5825b4a.png)

2. [ポジションを新規作成]ダイアログで、ポーズの情報を記入します
    * ポーズの名前を入力 **[A]** したり、ポーズのイメージ画像を登録することができます。**[スクリーンショット]ボタン [B]**をクリックすることで、現在のロボットビューの内容をイメージ画像 **[C]** にすることができます

    ![add-pose-dlg.png](https://qiita-image-store.s3.amazonaws.com/0/28770/c03f5072-e149-dde9-9fd2-f3658f7a55bf.png)


3. ポーズが登録されます

    ![added-pose.png](https://qiita-image-store.s3.amazonaws.com/0/28770/f8cf7d7c-2f2c-c121-52a4-24176b133b6e.png)


ポーズライブラリ中のポーズは、ダブルクリックすることで現在接続しているロボットに反映することができます。

また、ポーズ ライブラリの **[ポジションライブラリをエクスポート]ボタン**と**[ポジションライブラリを開く]ボタン** を使って編集したポジションライブラリを保存することも可能です。

> ####![info.png](https://qiita-image-store.s3.amazonaws.com/0/54394/ed7863bd-4c2e-7710-58db-0e38a4f26959.png) [Tips]動かないときは
> Pepperに接続している場合、ポーズを選択しても、うなだれたまま何もしない場合があります。Pepperが以下のような状態になっているときは、おやすみ中です。
> ![rest.jpg](https://qiita-image-store.s3.amazonaws.com/0/28770/e5ec9255-6e8b-0d17-30b5-00ae2269da1f.jpeg)
> このような場合は、[Wake Up]をクリックして起こしてあげてください。
> ![wake-up.png](https://qiita-image-store.s3.amazonaws.com/0/28770/34da3e56-5f29-7aa1-717d-99a1f62fe886.png)


##Pepperによるポーズ作成

アニメーションモードを使うと、Pepperをさわりながらポーズをつくることもできます。
アニメーションモードに入るためには、Pepperに接続した状態で、ツールバーの **[アニメーションモード]ボタン** をクリックします。

![toolbar-animation.png](https://qiita-image-store.s3.amazonaws.com/0/28770/0377b2b0-69ad-d784-eafb-6b9c187b57d4.png)


###頭(首)のポーズづけ

1. アニメーションモード設定後は、目がオレンジ色に点灯します

    ![animation-head-0.png](https://qiita-image-store.s3.amazonaws.com/0/28770/d595bc16-bc3e-6c0e-17ef-74fa983bb7df.png)

2. Pepperの頭をさわると、目の一部分が緑色になり、首の関節の固定が解除されます
     * 首の関節を手で自由に動かして、ポーズをつけることができます

         ![animation-head-1.png](https://qiita-image-store.s3.amazonaws.com/0/28770/82a8f08c-1023-4851-e9c4-373e109765fa.png)

3. 再度Pepperの頭をさわることで、再度固定することができます。目の色はオレンジ色に戻ります
     * 関節の動きはロボットビューにも同期されます

         ![animation-head-2.png](https://qiita-image-store.s3.amazonaws.com/0/28770/1250c9dc-3627-7956-a291-4c090e5ef95c.png)


###腕のポーズづけ

1. 首と同様、アニメーションモード設定後は目はオレンジ色に点灯している状態です
2. Pepperの手の甲をさわると、腕全体の関節の固定が解除されます
     * 手の甲にふれている状態で、腕の関節を動かすことができます
     
     ![20140912_181913.jpg](https://qiita-image-store.s3.amazonaws.com/0/28770/fed73177-5bef-4b60-0fe2-3e1db23821c8.jpeg)
     
3. 手の甲から手を放すと、腕の関節が固定されます

     ![20140912_181931.jpg](https://qiita-image-store.s3.amazonaws.com/0/28770/5c268dbd-6819-ca11-0b2a-93511aaf11d3.jpeg)

###モーションダイアログによる関節固定解除

関節の固定の設定・解除は、モーションダイアログからも指定できます。
Pepperが接続された状態でモーションダイアログを開くと、**[チェーンの固定化オン／オフ]ボタン** が有効になります。
このアイコンが緑色の状態が固定オフ、赤色の状態は固定となり、ボタンで切り替えることができます。

![motion-dialog-stiffness.png](https://qiita-image-store.s3.amazonaws.com/0/28770/ee77e49a-d87f-ee55-982e-249b86cf6168.png)


###アニメーションモードの解除

アニメーションモードは、再度[アニメーションモード]ボタンをクリックするか、Pepperの頭を3秒以上さわると解除できます。

アニメーションモードでつけたポーズは、Choregrapheによって設定したポーズ同様、ポーズライブラリに登録して好きな時に再生することができます。

#作成したポーズの実行

作成したポーズをボックスとして実行する方法について、ガッツポーズを例に説明します。
ここでは、例として、以下のような8つのポーズを作ってポーズ ライブラリに登録しているものとします。

![poses.png](https://qiita-image-store.s3.amazonaws.com/0/28770/0cad4656-fbed-726c-4683-035411cc5dbf.png)



##ポーズの切り替えをおこなうボックス

ポーズをフローダイアグラム中にドラッグ＆ドロップすることで、簡単に「ポーズに移行する」ボックスを配置することができます。

1. ポーズ ライブラリからポーズを選択し、フローダイアグラムにドラッグ＆ドロップします
    ![pose-dnd.png](https://qiita-image-store.s3.amazonaws.com/0/28770/fc875c28-3345-cff6-c26b-70eb54d5d276.png)

2. 作成されたボックスのonStart入力にビヘイビアのonStart入力を接続します
    ![pose-flow.png](https://qiita-image-store.s3.amazonaws.com/0/28770/141d7895-54c8-f203-0230-b79c90382709.png)

 
このフローを再生すると、ロボットは現在のポーズから、ポーズAへとポーズを変更します。ポーズからポーズへの変更にともなう動作は自動的に補間されます。
なお、このポーズとポーズを補間する際に、自分自身に衝突してしまうような(たとえばタブレットの近くを腕が通過するような)動きになってしまう場合に、Anti-self collision機構によって意図しない動きになってしまう場合があるので注意が必要です。

こんな風に、ポーズを並べることで、順番にポーズを変えていくような動きを簡易的に実現することができます。

![pose-sequence.png](https://qiita-image-store.s3.amazonaws.com/0/28770/51b5f49e-ca67-6c9b-f241-0882dd566dd6.png)

実際に連続した動きのように見せるためには、あるポーズとあるポーズの間はすばやく動かしたり、ゆっくり動かしたりと時系列の制御が必要になります。これには、タイムラインボックスを利用します。

##タイムラインボックスの作成

作成したポーズを使って、あらたにモーションをボックスとして定義するには、以下のようにおこないます。

1. フローダイアグラム上で右クリックし、 **[ボックスの新規作成]メニュー** の **[タイムライン...]** を選択します

    ![add-new-timeline.png](https://qiita-image-store.s3.amazonaws.com/0/28770/e52700ba-5aa9-9e8f-06ff-963dc8627b99.png)

2. ボックスの情報を問い合わせるダイアログが開くので、適当な名前を入力し、[OK]ボタンを押します

    ![edit-timeline-props.png](https://qiita-image-store.s3.amazonaws.com/0/28770/a68ca2cf-c3c1-9f04-2e87-3e8a39253127.png)


3. 新しい、空のタイムラインボックスが作成されます。このボックスをダブルクリックし、タイムラインを開きます

    ![new-timeline-box.png](https://qiita-image-store.s3.amazonaws.com/0/28770/cd39ac7b-a7a8-0f08-5795-7140629cb03f.png)

4. 最初のポーズAを、モーション開始後の25フレーム目(デフォルトのフレームレートは25フレーム/秒なので、1秒経過時点)に設定してみます。まず、 **ポーズAをダブルクリック** し、ロボットのポーズをポーズAに変更します

    ![set-pose-a.png](https://qiita-image-store.s3.amazonaws.com/0/28770/5366faec-7b43-ed46-c73a-c826e5deb58b.png)

5. タイムラインの25フレーム目で右クリックし、 **[キーフレーム中に保存された関節]** の **[全身]** を選択します
    ![set-motion-keyframe.png](https://qiita-image-store.s3.amazonaws.com/0/28770/06f3cac7-b624-e583-4b90-374adfda4be7.png)
   すると、25フレーム目がモーションキーフレームとなり、グレーで表示されます。これにより、25フレーム目ではポーズAになるように関節の各部が調整されることになります。
   ![set-motion-keyframe-result.png](https://qiita-image-store.s3.amazonaws.com/0/28770/ba777e81-ff18-598f-adbc-600cdc8e08d7.png)

6. ここまで作成した動きを確認してみます。変化がわかりやすいように、ポーズライブラリを使って、ロボットのポーズを標準で用意されている **ポーズStandInit** にダブルクリックで変更します
    ![set-pose-stand-init.png](https://qiita-image-store.s3.amazonaws.com/0/28770/fa82bab3-3e5b-bab8-ffc6-2d679d73a562.png)

7. **再生ボタン[A]** をクリックします
   1秒程度で、ロボットのポーズがポーズStandInitからポーズAに移行する様子が確認できます。停止したい場合は **停止ボタン[B]** をクリックします。
    ![motion-play.png](https://qiita-image-store.s3.amazonaws.com/0/28770/e056eca6-5886-efb5-a074-1ce3ddf69ed1.png)

     > ####![info.png](https://qiita-image-store.s3.amazonaws.com/0/54394/ed7863bd-4c2e-7710-58db-0e38a4f26959.png) [参考]最初のモーションキーフレームの配置
     > ここでは最初のモーションキーフレームを25フレーム目にしましたが、基本的にタイムラインにおいて、1フレーム目にモーションキーフレームを配置すべきではありません。
     > ここまで見てきたとおり、ロボットでは各関節を駆動させてポーズを変化させていきます。そのため、急激な変化を起こさせるようなタイムラインを記述してしまうと、予期しない動作をしてしまうおそれがあります。

8. ここまでの要領で、ポーズB以降のモーションキーフレームを作成していきます
   たとえば、以下のようなタイミングで各ポーズを設定してみるとよいかもしれません。
   ![timeline.png](https://qiita-image-store.s3.amazonaws.com/0/28770/62ca913b-c045-62f0-d13e-86c41c535471.png)

9. 終了フレームの設定
    このモーションの終了としたいフレーム上で右クリックし、 **[終了フレームに設定]** を選択します。
    ![end-frame.png](https://qiita-image-store.s3.amazonaws.com/0/28770/25506480-7a75-3c7a-76df-502052fbbb78.png)

このような手順で、新たなタイムラインボックスを作成し、フレームごとにモーションを作成していくことが可能です。作成したボックスは標準ボックスライブラリのモーションと同様に、他のボックスと並列に実行したり、さまざまな機能と組み合わせることができます。

このようにして、Pepperのポーズを定義し、それらをボックスから必要なタイミングで呼び出すことで、さまざまなジェスチャーをともなう振る舞いを作成することができます。

なお、ここまででも見てきたとおり、PepperはAnti-self collision機構や、各種センサーなどの、自身や他のものを保護するためのさまざまな機構を備えており、モーションを作る際には、これらの機構と衝突しないように配慮していくことが必要です。これは実体のあるロボットならではの難しさであり、面白さだと思います。