Pepperチュートリアル (8)：移動

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

このチュートリアルでは、Pepperの動きについて、特に移動に関するアプリケーションの作成方法を通じて、Pepperの足関係の仕様や、制御方法について説明します。

1. 各種駆動系、センサー仕様
2. 単純な移動
3. 任意の軌道による移動

# 各種駆動系、センサー仕様

Pepperは車輪による移動をおこないますが、周辺への衝突などを防ぐため、多くのセンサーを足回りに備えています。

![wheels-sensors.png](https://qiita-image-store.s3.amazonaws.com/0/54394/11e2c3f4-758b-3d90-6555-808dabbeba14.png)


* 車輪 (WheelFR **[A]**, WheelFL **[B]**, WheelB **[C]**)
* バンパー (BumperFR **[D]**, BumperFL **[E]**, BumperB **[F]**)
* ソナー (SonarF **[G]**, SonarB **[H]**)
* レーザーセンサー (**[I]**, **[J]**, **[K]**)
* レーザーアクチュエータ (Shovel **[L]**, Vertical right **[M]**, Vertical left **[N]**, Front **[O]**, Left **[P]**, Right **[Q]**)

これらの駆動系やセンサー1つ1つについて開発者が気にする必要はほとんどありません。これらのセンサーの値はロボットにより処理され、セーフティや、より抽象的なイベントの処理に使用され、駆動系は与えられた軌道の情報にあわせて適切に駆動されます。

# 単純な移動

もっとも簡単に移動を実現する方法として、Move Toボックスを利用する方法があります。
MoveToボックスのパラメータに、以下のような **X**, **Y**, **Theta** の値を指定することで、Pepperを移動させることができます。

![move-to.png](https://qiita-image-store.s3.amazonaws.com/0/54394/fc398442-7799-1448-0234-9f2eec56c253.png)


ここでは、サンプルとして、Pepperに **「まえ」「うしろ」「ひだり」「みぎ」と言うとその方向に移動し、「とけい」「はんとけい」と言うと回転する** ということをやってみます。このアプリケーションは、 **「おしまい」と言われたら「じゃあ また」と言って停止する**  ことにします。

なお、[チュートリアル(2)](http://qiita.com/Atelier-Akihabara/items/7a898f5e4d878b1ad889) でも見ましたが、Pepperは障害物があると移動をおこなわないというセーフティ機構を持っています。この確認のため、移動に成功したかどうかをSayでしゃべることにします。

### つくってみる

1. 利用するボックスの準備
    * Audio > Voice > Set Language ... 言語設定を変更する
    * Audio > Voice > Speech Reco. ... 音声認識をおこない、パラメータで与えられた単語候補のいずれかを判別する
    * Flow Control > Switch Case ... 入力された値に対して、条件に応じて異なる出力をおこなう
    * Motions > Move To ... 指定座標だけ移動/回転する (6回ドラッグ＆ドロップ)
    * Audio > Voice > Say ... 入力した文字列をしゃべる (3回ドラッグ＆ドロップ)
    ![move-to-flow.png](https://qiita-image-store.s3.amazonaws.com/0/54394/dc601302-7857-59ae-69db-2b624bab7c36.png)

    まずは接続せずに並べておきます。

2. パラメータを設定する
    Set LanguageボックスにはJapaneseを、Speech Reco.ボックスには、今回Pepperが認識すべきキーワードを **まえ;うしろ;ひだり;みぎ;とけい;はんとけい;おしまい** と、セミコロンで区切って指定します。
    ![move-to-params-1.png](https://qiita-image-store.s3.amazonaws.com/0/54394/8a8d2761-92b5-fd4d-24e7-bae0db9f54fb.png)
    また、各Move Toボックスには、それぞれ以下のように、X=0.2 (前方へ20cm), X=-0.2 (後方へ20cm), Y=0.2 (左へ20cm), Y=-0.2 (右へ20cm), Theta=1.57 (反時計回りに90°), Theta=-1.57 (時計回りに90°)と設定します。
    ![move-to-params-2.png](https://qiita-image-store.s3.amazonaws.com/0/54394/75c9cd3d-cd52-b637-05fb-aa48421eb84e.png)


3. 条件分岐を設定する
    Switch Caseボックスに条件を設定します。1番上のボックスから順番に、**"まえ"  "うしろ"  "ひだり"  "みぎ"  "とけい"  "はんとけい"  "おしまい"** と、それぞれセミコロンで囲んで指定します。
    ![move-to-switch-case.png](https://qiita-image-store.s3.amazonaws.com/0/54394/ed0e5d6e-58fb-4b17-5e04-5a2dfaeaf614.png)

4. ボックスをつなげる(成功パターン)
    まずは、Move Toボックスが失敗する場合を考えず、ボックス同士をつなげます。
    ![move-to-connect-1.png](https://qiita-image-store.s3.amazonaws.com/0/54394/6c4b6908-ef4d-ec98-5797-1d357180f447.png)

    
5. ボックスをつなげる(失敗パターン)
    次に、Move Toボックスが失敗した場合の接続をおこないます。
    ![move-to-connect-2.png](https://qiita-image-store.s3.amazonaws.com/0/54394/e5e078ab-0751-cb9d-e49a-bf34551b700d.png)

6. Sayボックスの内容を変更する
    Sayボックスをダブルクリックし、それぞれの内容を **成功** **失敗** **じゃあまた** に変更します。
    ![move-to-say.png](https://qiita-image-store.s3.amazonaws.com/0/54394/9775e127-f883-058a-dc3e-7348a8b3a3d6.png)

これで、聞いた内容に応じてそれぞれの座標だけ移動/回転するアプリケーションを作成することができました。

### 動作確認

バーチャルロボットまたはPepperに接続した上で、再生してみてください。
バーチャルロボットの場合は、[音声による対話](http://qiita.com/Atelier-Akihabara/items/52e086e7c47d85b9ed3d#3-1)のときと同様、ダイアログビューを開き、「まえ」「うしろ」など入力して **[1]** みてください。ロボットの移動する様子 **[2]** と、「成功」と言う **[3]** ことが確認できるはずです。

![move-to-virtualrobot.png](https://qiita-image-store.s3.amazonaws.com/0/54394/df8806c6-34c9-04f7-e310-2e9659bb2d54.png)

Pepperの場合は、Pepperに「まえ」「うしろ」などと話しかけてください。移動して、「成功」と言えば成功です。「失敗」と言う場合は、Tipsを参考に、原因を調べて取り除いてから再チャレンジしてみてください。

> ####![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)
> また、以下のように充電コネクタが開いている状態ですと、同様にセーフティが働き動きません。
> ![20140922_154828.jpg](https://qiita-image-store.s3.amazonaws.com/0/54394/6f5c15f1-97d5-3c46-b1d0-9e88f4ecbb98.jpeg)
> 他に、Pepperが「進行方向に障害物がある」と判断する状況ですと動きません。Pepperを少し移動させてみるなどして動作がどう変化するか、確認してみてください。


# 任意の軌道による移動

Choregrapheが提供する、**平面動作** の作成機能を利用することで、自由な軌道を直感的に定義することができます。

## 作成方法

以下の手順で利用することができます。

1. プロジェクトの内容パネルの **[+]ボタン** をクリックし、**[平面動作を作成中...]** をクリックします
    ![new-planar-move.png](https://qiita-image-store.s3.amazonaws.com/0/54394/bdbbd5e1-f764-457f-578c-2917023e6077.png)

2. 平面動作の名前を問い合わせるダイアログが開くので、適当な名前を設定し、[追加]ボタンをクリックします
    ![new-planar-move-props.png](https://qiita-image-store.s3.amazonaws.com/0/54394/9b5348e4-466a-bfc5-0065-0fc27f1aece5.png)

3. 平面動作エディタが開きます
    ![planar-move-dialog.png](https://qiita-image-store.s3.amazonaws.com/0/54394/ad2e7fa8-c8c4-2406-1191-ebd5de329580.png)
    **画面中央の円をドラッグ [A]** することで、軌道を作成することができます。 **[新規パス]をクリック [B]** することで、新たな曲線(パス)を追加し、**続けて軌道を描く[C]** ことができます。
    ![new-planar-move-1.png](https://qiita-image-store.s3.amazonaws.com/0/54394/0c701997-6fe9-e387-9ff2-86916c7abee3.png)
    ![new-planar-move-2.png](https://qiita-image-store.s3.amazonaws.com/0/54394/9479230a-224c-0c08-2f92-64049585ee6e.png)

4. 一連の軌道をどの程度の時間で実行するのか、フレーム数で指定することができます
   ![edit-frames.png](https://qiita-image-store.s3.amazonaws.com/0/54394/3c14632e-0d8b-75da-7e1b-6c9172a8ca3f.png)
   このフレーム数を大きくすれば、移動はゆっくりになり、小さくすると速く移動することになります。


5. 必要に応じて、移動後の向きを指定します
   ![direction-planar-move.png](https://qiita-image-store.s3.amazonaws.com/0/54394/b91eec35-ac72-29e0-bf0b-35681e39e32f.png)

6. 軌道はトラジェクトリという単位で編集します。**[新規＆トラジェクトリ]をクリック [A]**すると、**新たなパスを編集 [B]** することができます。
    ![new-trajectory.png](https://qiita-image-store.s3.amazonaws.com/0/54394/82306128-e0cc-6268-705c-901687c4a548.png)

    なお、トラジェクトリの[1]をクリックすると、これまで編集していたパスを再度編集することができます

## 利用方法

1. 編集した平面動作は、**フローダイアグラムパネルにドラッグ＆ドロップ** することで利用することができます
    ![dnd-planar-move.png](https://qiita-image-store.s3.amazonaws.com/0/54394/76d30bf5-0229-23ad-8841-76244bc91fc5.png)

2. ボックスをつなぎます
    ![connect-planar-move.png](https://qiita-image-store.s3.amazonaws.com/0/54394/67a41398-3d9d-5c77-d922-5a9f46209a32.png)

また、Move Alongボックスをドラッグ＆ドロップし、パラメータから平面動作を設定することも可能です。

![move-along-param.png](https://qiita-image-store.s3.amazonaws.com/0/54394/3f6bdcb0-da4a-58be-2cac-739aa94105bc.png)


これでPepperに接続、再生すると、作成した軌道にしたがってPepperが移動することが確認できます。

![planar-move-virtual-robot.png](https://qiita-image-store.s3.amazonaws.com/0/54394/c67c3fb4-8330-1691-3cac-1cb7718ccd5e.png)

このようにして、各ホイールをどう駆動するかなどを気にすることなく、平面移動に関する動作を定義、実行することが可能です。