Pepper SDK入門(32) Frameでメリーさんのように正確な現在地を把握する

#はじめに
都市伝説に登場するメリーさんは、自分の現在地を丁寧に電話してきてくれます。Pepperもそのように正しい位置を把握できれば便利ですね！そこで登場するのがFrameです。
Frameは特定の位置を表します🗺それでは早速、順を追ってFrameについての理解を深めていきましょう。

#FreeFrameかAttachedFrameで最先端
Frameの位置は後から更新されます。交信はしません📡🛸
FreeFrameは緯度と経度を表します。例えば本棚の位置にフレームを設定すれば、Pepperはどこに動いても本棚に戻ってきます。
AttachedFrameは対象の物体との相対位置を表します。人も設定することが可能で、その人が動けば一緒についていくピクミン的挙動を示します🌱画像は刷り込まれるひよこです。
<img width="180px" alt="niwatori_hiyoko_koushin.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/e6bbe2ea-6af4-de7b-a14c-c0a761c495ba.png">
作成後、AttachedFrameと親フレームの間にある偏りは更新され続けます。
下記のソースコードではAttachedFrameを作成しています↓

```java
Frame baseFrame = ...;
Transform transform1 = TransformBuilder.create().fromXTranslation(1);
AttachedFrame attachedFrame = baseFrame.makeAttachedFrame(transform1);
Transform transform2 = TransformBuilder.create().fromXTranslation(2);
attachedFrame.update(transform2);
```

既存のFrameのGoToやLookAtアクションのため、ターゲットを特定します👼
#Pepperに見せびらかそう✨
GoToアクションとFrameで特定の場所まで~~おびき寄せる~~動いてもらうことができます。

```java
Frame targetFrame = ...;

GoTo goTo = GoToBuilder.with(qiContext)
                       .withFrame(targetFrame)
                       .build();

goTo.async().run();
```

LookAtで人の顔を見つめるなどしてもらいましょう🔭🌕

```java
Frame targetFrame = ...;

LookAt lookAt = LookAtBuilder.with(qiContext)
                             .withFrame(targetFrame)
                             .build();

Future<Void> lookAtFuture = lookAt.async().run();

```

#Robot Frame
Pepperの位置を教えてくれます。
Actuationサービスで取り扱い可能です[^1]。

```java
Actuation actuation = qiContext.getActuation();
Frame robotFrame = actuation.robotFrame();
```
<img width="180px" alt="2021-09-27 13.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/8a558512-acf9-3945-f66f-5dcfd78970c3.png">

[^1]: RobotFrameを起点としてFreeFrameやAttachedFrameを作るため、Pepperの位置が分かるわけではなくPepperを起点の位置として使うフレームが取れるという意味になります。

#Human head Frame
人間の位置を表しています。Pepperが認知してくれます👁‍🗨🙌
Humanインスタンスでアクセス可能です。

```java
Human human = ...;
Frame headFrame = human.getHeadFrame();
```
<img width="180px" alt="yumekawa_angel_tenshi.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/88f4e21c-e7f2-a6ef-8ed2-61918d808c40.png">

#Gaze Frame
Pepperの胴体ではなく頭の位置を起点とするフレームで、Pepperの視線の位置と方向を表しています。ブラックホールのような目に吸収されそうですね🧹🌌ちなみに首はかなり動く部分なので、使いにくいです。
Actuationサービスで取り扱い可能となっています。

```java
Actuation actuation = qiContext.getActuation();
Frame gazeFrame = actuation.gazeFrame();
```

<img width="180px" alt="dasfdfgfnsgf.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/65ab2af5-2740-022e-8b80-34c49ec3f808.png">
#Map Frame
Pepperの起点を表しています。ローカライズ(周辺地図の作成)が実行されていない場合は利用できません。Pepperはどこから来てどこへ行くのでしょう🎈🍃
Mappingサービスで取り扱い可能です。

```java
Mapping mapping = qiContext.getMapping();
Frame mapFrame = mapping.mapFrame();
```

#Charging Station Frame
Pepperの充電場所の位置と方向を表しています。
Pepperが充電場所を感知していない場合は利用できません。某電気ネズミは充電には利用できませんので注意してください🐭⚡️
Mappingサービスで取り扱い可能です。

```java
Mapping mapping = qiContext.getMapping();
Frame chargingStationFrame = mapping.chargingStationFrame();
```

#あとがき
今回も[PepperSDKforAndroid](https://android.aldebaran.com/sdk/doc/pepper-sdk/ch4_api/movement/reference/frame.html)を参考に書かせていただきました。
さらに詳しい情報は[FrameのAPIリファレンス](https://android.aldebaran.com/sdk/doc/javadoc/qisdk/com.aldebaran.qi.sdk.object.actuation/-frame/index.html)を参照してみてください！

次回はLookAtです、母音は同じですがCOOKPADのお話はありません。それでは〜🍳👐