SLAMでPepper 〜もはやボクは止められない〜


※この画像は社内でダースベイダーのテーマと共にPepperを歩かせた時、表示していた画像です。
※自分でも結構上手くできた気がしたので気に入ってしまいました。
※あと、この記事はSLAMでPepperの続きであり、この記事のシメになると思います。

ボクはビルの中を颯爽と駆け抜ける。
まるで流星のように・・・
虎のように・・・
そして、ゴディバ夫人のように・・・

 

というわけで、前回はPepperに執務室を探索してもらって地図を作るところまで紹介しました。今回は、その地図を元に徘徊経路を作り、徘徊するところまで紹介したいと思います。

あ、そういえば、このBlogでPepperに関するの記事書くのすっごい久しぶりでした。
自分でもビックリしてます。

さて、今回は

  1. Pepperが自分のいる場所を探索・自己位置を測定する
  2. Pepperが探索結果を画像にしてディスプレーに表示
  3. 利用者がディスプレーからPepperに移動して欲しい場所を指示
  4. Pepperがそこに移動
  5. 「3」と「4」を繰り返してPepperが巡回

の「3.利用者がディスプレーからPepperに移動してほしい場所を指示」からです。

 

3. 利用者がディスプレーからPepperに移動して欲しい場所を指示

ディスプレーにPepperが探索した地図を表示して、ユーザがその地図をタップすることで移動して欲しい場所を指示するという機能をつくります。

まずは探索した地図のロードと表示です。

探索結果をファイル化した「.explo」ファイルは、Pepperのあるフォルダ内にあるので、そのフォルダ内のファイル一覧をリストとして取得します。そして、そのリストをそのままディスプレー側に投げてください。ディスプレー側では、そのリストを元にプルダウンメニューを生成する処理を準備しておきます。(今回はそこまで紹介するといろいろ面倒なので割愛)

ディスプレーのプルダウンメニューには、変更するとプルダウンメニューの何番目が選択されたかをPepper側に送る処理も入れておきます。

で、選択されるたびに「onInput_getImageData(self, num)」が起動するようにしておきます。この関数の中で、「ALNavigation.loadExploration(exploファイルのパス)」を呼び出します。そうすることで、Pepperが指定された探索結果ファイルを読み込みます(ロードします)。

あとは、このexploファイルを画像にしてディスプレーに送ってあげます。

こうすれば、ディスプレーに地図が表示されるので、あとはその地図に対してタップイベントを設置して、タップイベントが発生したX座標、Y座標(event.offsetX, event.offsetY)をPepper側に投げてあげればOKです。ついでに、タッチした場所に数字とか表示してあげれば親切かなと思います。

ディスプレーから位置を設定(別の執務室で実施してみました)

 

4. Pepperがそこに移動

「3. 」で、Pepperに移動して欲しい場所を設定したので、満を持してPepperに徘徊してもらいましょう!

の前に・・・

この記事で紹介するやり方だと、Pepperが徘徊を開始する地点を前もって決めておかないといけないかもしれません。

具体的には、探索を開始した場所にガムテープや養生テープで印をつけておいて、徘徊を始める時にPepperをそこに移動させるという方法です。

これは注意事項でもあるのですが、Pepperは確か、今の時点では「周りを見て、自分がどこにいるか判断する。」というのができないため、開始位置(今、Pepperがどこにいるか)を人間が設定することでPepperに今自分がどこにいるのかを教えてあげないといけません。

やり方としては下記2点の方法かなと思ってます。

  • 方法案1:探索を始めた位置にPepperを移動させる(この位置が、座標[0, 0]となるため)
  • 方法案2:ディスプレー上に表示した地図をタップする事で、Pepperがどこにいるかを知らせる

方法案2が多分スマートですが、正直まぁ、ちょっと手抜きした部分もあるので今回は方法案1を取ってます。

プログラム的にはこんな感じです。

 

Pepperがディスプレー上で設定された座標を順々に動き回ります。タブレットタッチやPepperの頭、手、足をタッチとかそういう方法で「self.doLocomotion」の値をFalseにすると、While文を脱出、徘徊を終了します。

「ALNavigation.relocalized([0, 0, 0])」で、徘徊開始前にPepperが今どこにいるか・・・というか、探索を開始した場所にいるというのを教えてあげています。で、その後に「ALNavigation.startLocalization」をします。これをしないと、次の「ALNavigation.navigateToInMap」で「位置情報取得を開始してないエラー」が発生するので、必ずこれをしてください。

で、位置情報取得を始めたらWhile文突入。ループが始まります。

「ALNavigation.navigateToInMap」でPepperを指定した座標に移動させます。Aldebalan社が作ったOS2.5.3版のサンプルですとここは非同期のような作りになっていましたが、OS2.5.5では同期的に処理してくれるので、移動したら移動結果を返して次の処理に移行します。

移動結果の値の意味は、ドキュメントだとちょっとよくわかりませんでしたが、Aldebaran社のサンプルや、実際に動かした結果を見るとこんな感じっぽいです

  • 0:OK
  • 1:KO(移動できない・失敗って事?)
  • 2:キャンセルされた
  • 4:障害物があって進めない?
  • 5:マップの外を指定された?

何らかの方法でWhile文を抜けたら徘徊終了です。

まずは初期位置に戻ります。初期位置に戻るのは、こちらのサイトにある情報を使わせていただいております。

初期値に戻ったら「ALNavigation.stopLocalization」を実施し、自己位置測定を終了させます。これをしないで再度自己位置測定開始をすると、エラーが発生するので必ずこれを実施してください。

これで、こんな感じのPepperが実現できます!
(前回の動画の使い回しですが・・・)

 

というわけで、SLAMを使ってPepperをうろうろさせてみました!

こうやってPepperが走行できるようになれば、Pepperはもっとより良いものになっていけますね!

同時に、Pepperを使って何かしたい、うちの施設を歩かせてみたい等、アイディアやご要望ありましたらお気軽に弊社までお問い合わせください!


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です