#はじめに
GoToでは、Pepeprをどこかに移動させることができます。トラジェクトリファイルを利用したAnimateとは異なり、障害物を回避して目標地点に到達するように柔軟に動いてくれるのが特徴です。
このようなアクロバティック回避は不可なので、乗り越えられる塩梅の試練を課してあげてください。
// ターゲットフレームを取得
Frame targetFrame = ...;
// アクションをビルド
GoTo goTo = GoToBuilder.with(qiContext)
.withFrame(targetFrame)
.build();
// 同期でアクションを実行
goTo.run();
#GoToの微に入り細を穿つ
GoToアクションの実行には三段階の準備が必要です。その内訳を順番に紹介します👐
1.まずはFrameを取得するか算出するかして、目標位置(ターゲットフレーム)を取得する。Frameについてはこちらを参考にしてください。
2.次にGoToアクションをビルドする
3.GoToアクションを実行する。これでPepperで道案内などができます🍉🙈
GoToアクションには次の三つのパラメーターがあります。
- Path Planning Policy
- Final Orientation Policy
- Maximum Navigating Speed
以下でこの三つの詳しい機能を説明します↓
Path Planning Policy
GET_AROUND_OBSTACLES(デフォルト): 移動経路上に障害物があった場合は迂回して目的地に向かう。
STRAIGHT_LINES_ONLY: 移動経路上に障害物があっても迂回せずに停止する。
Final Orientation Policy
FREE_ORIENTATION(デフォルト): ターゲットフレームに到達時に向きを調整しない(最終的な進行方向を向いたままとなる)。
ALIGN_X: ターゲットフレームに到達時に、Pepperの向きをターゲットフレームのX軸と同じになるように調整する
Maximum Navigating Speed
Pepperの移動速度を秒速何mにするか、指定することが可能。
下記のコードは使用例です。
ここではターゲットのX軸に沿って、毎秒0.55mで直進するように書かれています。
// ターゲットフレームを取得
Frame targetFrame = ...;
// アクションをビルド
GoTo goTo = GoToBuilder.with(qiContext)
.withFrame(targetFrame)
.withPathPlanningPolicy(PathPlanningPolicy.STRAIGHT_LINES_ONLY)
.withFinalOrientationPolicy(OrientationPolicy.ALIGN_X)
.withMaxSpeed(0.55f)
.build();
// アクションを同期で実行
goTo.run();
#ターゲットと待ち合わせ
以下のコードはPepperを前に1m前進させるためのサンプルコードです↓
//ロボットフレームを取得
Actuation actuation = qiContext.getActuation();
Frame robotFrame = actuation.robotFrame();
//移動内容を定義
Transform transform = TransformBuilder.create().fromXTranslation(1);
//空のフリーフレームの作成
Mapping mapping = qiContext.getMapping();
FreeFrame targetFrame = mapping.makeFreeFrame();
//空のフリーフレームにフレーム情報を設定する
//現在のPepperの位置(robotFrame)から1メートル前の位置(transform)にフレームを更新
targetFrame.update(robotFrame, transform, 0L);
GoTo goTo = GoToBuilder.with(qiContext)
.withFrame(targetFrame.frame())
.build();
goTo.run();
#障害物回避チャレンジ
Pepperも歩けば諸々のものに当たりそうになりますが、Pepperはその障害物を回避して目標地点まで到達しようとします。主人公気質ですね👑
障害物の回避は目的地まで1.2m以上あり、且つ障害物と0.5m以上離れて移動できる場合にのみ機能します。
#エラー色々
GoToの実行を妨げる要因には様々なものがあります🕳🕳🕳🕳🕳🕳🕳🕳
- センサーを妨げる太陽のような明るさ☀️
- モノリスのように回避できない障害物⬛️
- スレイプニルやサンタクロースといった生物のような動く障害物
- 地面の凹凸
こういった要因によるエラーが発生した場合に備えて、Pepperがタスクを放棄できるように定義しておく必要があります。
#あとがき
今回もPepperSDKforAndroidを参考に書かせていただきました。
さらに詳しい情報は、GoToのAPIドキュメントを参照してください。
次回のPepperSDK入門はLocalizeです。ノーマライズは関係ありません🎧それでは〜