## 課題:ギャラリーを案内するロボット
今週はROSに関する新しい内容は扱いませんが、この課題を完了するためには、今まで学んだ知識を活用する必要があります。 また、人間とロボットのインターアクションについても少し触れます。
---
### シミュレーション
以下のアーカイブをダウンロードし、/catkin_ws/srcフォルダに解凍してください。
https://www.robot.soc.i.kyoto-u.ac.jp/roboprog/materials/roboprog_week7.zip
次に catkin_make を使ってコンパイルします。
```bash
cd ~/catkin_ws
catkin_make
```
シミュレーションを起動するには、以下のコマンドを使用します。
```bash
roslaunch gallery_guide_robot gallery_robot.launch
```
---
### 課題
顧客との対話を行い、選択された展示物まで案内するギャラリーガイドロボットの開発を目指します。実世界と同様に、ロボットと環境だけの状態からスタートし、案内タスクを実装する前に必要な準備を完了させることが必要です。
また、シミュレーション内での人間は人が操作するため、その人にとって自然で快適なインタラクションを設計する必要があります。
課題は3つのステップに分かれています:
1. ステップ(1)「準備:地図作成、位置推定、ナビゲーション」
2. ステップ(2)「対象の絵画の地図を自律的に作成する」
3. ステップ(3)「自律ギャラリー案内ロボットの実装」
---
> 少なくとも最初の2つのステップを完成させ、課題を提出してください。時間があれば、ステップ(3)にも取り組んでください。ステップ(3)の部分的な実装を提出しても構いません。
---
### ステップ(1)
**「準備:地図作成、位置推定、ナビゲーション」**
このステップは、第4週と第5週に行ったタスクに似ています。
環境の地図作りのために、ロボットを手動で操作し、ロボットを動かしながら`gmapping`プログラムを実行します。手動操作には、以下のコマンドを使用します(TurtleBot3で使用したものとは少し異なります)。
```bash
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
```
生成された地図を保存してください。その後、第5週で行ったように、位置推定を設定してください。
最後に、`gallery_guide_robot`パッケージに含まれている`navigate.launch`を実行して、ロボットのナビゲーションをテストしてください。必要に応じて、第4週で説明されたナビゲーションパラメータを調整してください。
*レーザースキャナーについて*
TurtleBot3とは異なり、本シミュレーションのロボットは、ロボットの前方にレーザースキャナーを装備しており、前方90度、左右90度のみスキャンすることができます。このスキャナーの最大距離は30メートルです。スキャナーがロボットの前方のみをスキャンするにもかかわらず、マッピングとローカリゼーションは正しく機能するはずです。スキャナーは10 Hzで更新され、1回のスキャンで720の測定値を提供します。
---
### ステップ(2)
**「準備:対象の絵画の地図の自律的作成」**
ギャラリーには、色で区別できる4つの特別な絵画(「対象の絵画」)がある。ほとんどの絵画は白ですが、対象の絵画は以下のRGB値で色付けされた絵画です。
- "blue": 0.1, 0.1, 0.7
- "yellow": 0.8, 0.8, 0.1
- "green": 0.1, 0.9, 0.1
- "magenta": 0.8, 0.1, 0.8
まず、対象の絵画の配置を初期化します。シミュレーションを開始する前に、以下のコマンドを実行します。この操作は1回だけ必要です。再度実行すると異なる配置が生成されます。
```bash
rosrun gallery_guide_robot init_picture_setup.py
```
ロボットが自律的にギャラリーを探索し、対象の絵画を検出してその位置を推定するプログラムを作成します。4つすべての絵画の位置が特定されたら、その位置データをファイルに保存します。
ロボットが訪れる探索ポイントのシーケンスを定義してください。たとえば、各部屋の中心に探索ポイントを割り当てます。ロボットのナビゲーションを使用して、これらのポイント間を移動させます。各ポイントに到達したら、360度回転して部屋全体をスキャンします。
検出した絵画の位置を推定するには、ロボットを停止させ、絵画がカメラビューの中心に来るように回転します。その後、レーザースキャナーを使用して、ロボットの前方にある壁または絵画までの距離を測定します。この距離とロボットの現在位置と向きを基に、絵画の位置を計算します。計算式は次の通りです。
> 絵画のx座標 = ロボットのx座標 + 距離した測定 * cos (ロボットの角度)
>
> 絵画のy座標 = ロボットのy座標 + 距離した測定 * sin (ロボットの角度)
すべての絵画が検出されたら、その位置をテキストファイルに保存します。保存するデータの形式は任意です。例えば、「絵画の名前, x座標, y座標」という形式を使う場合、ファイルには次のように記述します:「blue, 0.3, 1.7」
*ヒント*
データの保存と読み込みには、`numpy`の`savetxt`, `loadtxt`, `genfromtxt`関数を使用できます。参考リンク: https://deepage.net/features/numpy-loadsavetxt.html
---
### ステップ(3)
**「自律ギャラリー案内ロボットの実装」**
自律ギャラリーガイドロボットのプログラムを開発します。来客はギャラリー内のランダムな場所に現れ、ロボットは最初にギャラリーを探索し、来客を探します。来客を検知した後、ロボットは接近して声をかけ、どの絵画に興味があるか尋ねます。来客の回答を受け取り、その絵画まで案内します。
来客をギャラリー内に出現させるには、以下のコマンドを実行します。
```bash
roslaunch gallery_guide_robot gallery_guest.launch
```
このコマンドを実行すると、来客を制御するためのGUIが開きます。GUIには、来客の視界(左上の部分)、移動の制御(右上の部分)、ロボットが話した内容(左下の部分)、興味ある絵画を選択するためのボタン(右下の部分)が表示されます。
*人と話す*
ロボットが来客に話しかけるには、トピック`/robot_says`に文字列を配信します。このテキストは上記のGUIに表示されます。
*人の話を聞く*
来客からの応答を受け取るには、トピック`/human_wants`を購読します。人がGUIを使って絵画を選択すると、対応する文字列("blue"、"yellow"、"green"、"magenta"のいずれか)がこのトピックに発信されます。
*人の検出*
ロボットはレーザースキャナーまたはカメラを使用して来客を検出します。シミュレーションでは、来客はレーザースキャン上で小さな円として表現されます。この単純化された表現を利用して来客を検出してください。
*対象の絵画の位置*
ステップ2で保存したファイルを使用し、対象の絵画の位置を取得します。
#### 来客との自然なインタラクションの工夫
実装の一つの目標は、GUIを通して来客をコントロールする人に対して、ロボットのサービスが自然で良いものに見えるようにすることです。人とロボットのインタラクションを自然に感じさせる方法を定義するのは簡単ではないんが、この分野の研究に基づいたいくつかのコツがあります。
*来客への接近と声かけ*
ロボットは話しかける前に、来客に十分近づくべきです。遠くから話しかけると、不自然に感じられることがあります。パーソナルスペースの研究によると、人々は自分の周りのスペースをどのように使うかに一定の好みがあります([パーソナルスペース](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%BC%E3%82%BD%E3%83%8A%E3%83%AB%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9))。ガイドロボットが来客に最初に話しかける際には、「社会距離」とされる約1.5〜2メートルの距離が良いと考えられています。さらに、話しかけるときには来客の方を向くのが良いです。理想的には、ロボットは話しかける前に来客の前の方に立つべきですが、来客の正面を正確に検出するのが難しいのであれば、この条件は簡略化しても構いません。
*絵画の提示*
ロボットが単に案内する絵画の前で止まるのは不自然です。物体について話し合ったり、インタラクションを行ったりする際の人々の立ち位置については、「F陣形」に関する研究で説明されています。この研究では、人々が互いと物体との間に円状のエリアを作るように立つ傾向があるとされています。この概念はガイドロボットにも応用できます(以下の図を参照)。絵画を提示する一つの良い方法は次の通りだと考えられます。ロボットが対象の絵画より少し先まで進み、来た方向とは反対側の絵画の横で停止します(図中のオレンジ色の経路A)。その後、回転し、来客または絵画の方に向きます(図中のB)。来客が十分に近づいたら(例えば、社会距離内に入る)、ロボットは絵画について話し始めていいです。
*来客についてもらう*
ロボットが案内する絵画へ向かう際に速度が速すぎると、来客を見失う可能性があります。一方で、遅すぎると来客が苛立つかもしれません。必要であれば、ナビゲーションパラメータで適切な最大速度を設定してください。(フォルダ`params`内の`dwa_local_planner_params.yaml`で設定できます。本来は最大0.7m/sに設定されています。)
*発話内容*
ロボットに発話させる具体的な内容は自由に選んでください。例として、次のようなフレーズを使用できます。「どの絵画に興味がありますか?」「ついてきてください。」「これが探していた絵画です。」
---
## 提出するもの
以下の内容を提出してください。
- ステップ(1):作成した地図(.pgmファイル)
- ステップ(2):①ギャラリーを探索するロボットのビデオ、②作成したプログラムのコード、③対象の絵画の位置を記載したテキストファイル
- ステップ(3):①サービスを実装したビデオ(部分的な実装でもOK)、②作成したプログラムのコード
すべてのファイルを1つの圧縮ファイルにまとめ、PandAで提出してください。
---
↑ [ホームページ](index.html)