Pepper SDK入門(36) LocalizeAndMapでPepper専用地図を得る


はじめに

PepperはLocalizeAndMapアクションとLocalizeアクションによって周辺環境の地図を作成し、移動しても自分の相対位置を保持します。

//アクションをビルドする
LocalizeAndMap localizeAndMap = LocalizeAndMapBuilder.with(qiContext).build();

//非同期にアクションを実行
localizeAndMap.async().run();

//LocalizeAndMapの実行を保存
private Future<Void> localizationAndMapping;

つまりLocalizeが実行されていれば、Pepperを特定の位置に配置して周辺をネズミ花火のように動き回ってもらってもPepperは自分の立ち位置を見失いません🧨
LocalizeAndMapの使い方は以下の通りです↓

//アクションをビルド
LocalizeAndMap localizeAndMap = LocalizeAndMapBuilder.with(qiContext).build();

//Localize状況を取得するためのリスナーを追加
localizeAndMap.addOnStatusChangedListener(localizationStatus -> {
    if (localizationStatus == LocalizationStatus.LOCALIZED) {
        //アクションを停止
        localizingAndMapping.requestCancellation();
        //Localizeアクションが使う地図情報を出力する
        ExplorationMap explorationMap = localizeAndMap.dumpMap();
    }
});

//アクションを実行
localizingAndMapping = localizeAndMap.async().run();

既存の地図をパン生地のように拡張する🥖

周辺環境の地図が既に作成できていれば、新しいLocalizeAndMapによってその地図の拡張が可能になります。ドリルなどは使いません。
Pepperが地図を読み込むのに成功したら、ExplorationMapにデータを追加します。
この機能性はステレオカメラを装備したPepperで、APIレベル7のSDKでビルドされたExplorationMap上でのみ実行されます。
Pepperがステレオカメラを装備していない場合などは、LocalizeAndMapの呼び出しは失敗します。

//アクションをビルド
LocalizeAndMap localizeAndMap = LocalizeAndMapBuilder.with(qiContext)
                                                            .withMap(explorationMap)
                                                            .build();

センサーは超常的な何かを感知しない

位置を特定するには、センサーの情報を用いて環境内のPepperの位置を計算します。
主としてレーザーセンサーを用いるため、見えるのは数メートル先までです。鳥取砂丘などの開かれた環境ではPepperが得られる情報は少なく、一貫性のないものになります。

人間とか幻獣とかポルターガイストとか全ての動くオブジェクト

周辺環境の地図を作成している間にPepperが検出した障害物は、人間も含みすべて地図上に保存されます。極小規模なストリートビューですね。
人間が多ければ多いほどLocalizeアクションのパフォーマンスが落ちて、地図の結果に影響します。

障害物の検出は、LocalizeAndMapアクションの実行中以外にも継続的に実行されます。
Pepperの障害物検出の能力は、センサー値によって時間と共に上がります。その結果、LocalizeAndMapがスタートする数秒前にPepperの周りにいた人間は障害物などとして地図上に保存されます。
よって周辺環境の地図を作成する前には、Pepperの近くに人間や動くオブジェクトがいない方が望ましいです。15秒ほど待ってからLocalizeAndMapアクションを実行してください。
見えない何かがいそうな場合は、除霊などしないまでも窓を開けて外へ逃すなどしてから実行しましょう!

アニメーションを読み込む(熟読はしない)

LocalizeAndMapアクションがスタートした時、Pepperはセンサーから情報を集めるために周辺を見回します。
LocalizeAndMapがこのアニメーションを実行できない時、例えば既に実行中の他のアクションがある場合には、LocalizeAndMapはアニメーション失敗のエラーを投げます。椅子取りゲーム方式ですね💺

あとがき

今回もPepperSDKforAndroidを参考に書かせていただきました。
さらに詳しい情報は、LocalizeAndMapのAPIドキュメントを参照してください。

次回のPepperSDK入門はExplorationMapです。Pepperによる探検は始まりません💰⛏それでは〜