この記事はSLAMでPepper 〜Pepper、うまくやれよ〜から続く一連の記事のオマケです。多分。
こんにちは皆さま、Fujiです。前回、前々回とSLAMとPepperに関する記事を書いてきたのですが、まさかの3回目です。もうちょっとだけ続くんじゃ状態です。
前回の記事でPepperをSLAMで指定した場所に動かすところまで紹介しましたが、そこまでできるようになると
「何かを契機にして移動をやめて何かやりたい」
という発想が出てきますよね。
例えば、
- 移動中に人を検知したら立ち止まって挨拶する
- 移動中に触られたら立ち止まって何かを言う
- 移動中に何かを見つけたら立ち止まってその場で踊る
とか、そういう事したくなりますよね。例えば自分だったら、
- 移動開始
- 人を認識したら移動中断
- 認識した人に対して威嚇をする
- 認識した人が謝ったら捨て台詞を吐いて移動再開
とかいう殺伐としたMADなPepperとかやりたくなります。ダメなロボアプリ開発者の見本がここにいます。真似しないでください。
で、それをどうすれば実現できるのかなーと思って調べてみたら、意外と色んな事がわかった。そういう記事です。
移動停止実現のためにした事その1:ドキュメントを見てみる
まずは基本のドキュメントを読んでみる、です。
が、実はドキュメントを見たところ、「stopLocalization」や「stopExplore」はあるんですが、「stop移動ほにゃらら」はありませんでした。ビビりました。マジかよお前、アンストッパブルな存在かよ。
移動停止実現のためにした事その2:Pepperの中身を調べる
SSHでPepperにつなげて、「qicli」コマンドを使ってちょっと調べてみました。そしたらあったんですよ。「stopNavigateTo()」ってメソッドが。
これで止まるかな?と思ってやってみました。

止まりません。全然止まりません。なんでだよ。お前、リアルでアンストッパブルな存在かよ。唯我独尊かよ勘弁してくれ。
移動停止実現のためにした事その3:ググる
もしかしたらWeb上に何か情報があるかもしれない・・・
そう思ってググってみました。そしたらこんな情報がありました。が、これはNaoqiOS2.8の話。多分あんまり関係ないかなぁ。そもそも「stopNavigateTo」で止めれるのは「navigateTo」だけであって、今回使用している「navigateToInMap」は別なのかなぁ。というか、マジで止めれないのかな。うーん、Pepper、お前は無敵な存在なのか。

移動停止実現のためにした事その4:もっとググる
AldebaranのGithubに、「どうやったら止めれる?」というまさに今の自分と全く同じ問い合わせを発見。戻り値を受け取って、そこにキャンセルをかければ止まれるよという回答。しかし・・・
自分がやったときはPepperは同期的に処理をしてしまうので、「navigateToInMap」の戻り値は処理が終わった後にInt型の値を返してしまうはず。実際に上記の回答の通りやってみたけど、「その戻り値にそんなメソッドねぇよ」という無情のエラーが出て終了。もう何も信じられない。Pepper、お前はアンビリーバブルな存在なんだな。

移動停止実現のためにした事その5:ソースを再確認
解決しました。マジで。Aldebaran社が公開しているソースと自分のソースをまじまじと見比べて、リアルで解決しました。「navigateToInMap」を非同期で実行する方法(というか、戻り値をFutureで受け取る方法)がようやくわかったので、やってみました。
※雑な編集ですみません・・・
※※ディスプレータッチする前にPepperが立ち止まったのは、近寄って行った私を障害物だと認識して一時停止しているからです。
結論:
さすがはAldebaran社でした。
Pepperは無敵でアンストッパブルでアンキャッチャブルな存在ではなく、やはりみんなの側に寄り添う素敵なロボットでした。
というわけで、SLAMを使用して移動しているPepperを任意のタイミングで止めて何かやらせて移動を再開する、という事が実現できそうです。
まだまだ狭いところは移動できなかったり、指定した場所に100%正確に移動できなかったり、向きまでは指定する事ができなかったり(ベータ版だから)と課題はありますが、「歩き回れるロボット」としてのPepper、いろんな活用方法がありそうですね!
もし弊社に「こんな風に使ってみたい!」「こういうのってできないだろうか?」等ございましたら、ぜひご連絡いただければと思います。
ではまた次の機会に!