## 課題:ゴーストバスター
ロボットがいるスペースに幽霊が現れました。ロボットのタスクはそれらすべてを捕まえることです。幽霊は地図上の空きスペースにいて、移動しません。時々、新しい幽霊が現れます。
幽霊は見えないため、カメラやレーザースキャナなどの一般的なセンサでは検出できません。しかし、幽霊が新しく現れるまたはいなくなるときは、幽霊の世界からのメッセージがトピック`/ghost`に残されます。このメッセージのタイプは`geometry_msgs/PolygonStamped`であり、すべての幽霊がいる位置の正確な情報が含まれています(z座標は常に0です)。
ロボットが幽霊から0.5メートル以内に来れば捕まえるチャンスがあります。サービス`/buster`を呼び出して捕まえましょう。
### (1)
以下のリンクからghostbusterパッケージが入っているアーカイブをダウンロードしてください。いつものROSパッケージディレクトリに解凍してコンパイルしてください。
https://www.robot.soc.i.kyoto-u.ac.jp/roboprog/materials/ghostbuster.zip
このパッケージには、Gazeboシミュレーション、ロボットのローカリゼーション(`amcl`)、ナビゲーション(`move_base`)、およびRVizを実行するために必要なすべてのlaunchファイルが含まれています。
次のコマンドで実行します:`roslaunch ghostbuster all.launch`。 RVizは、環境の地図、ロボット、レーザースキャンを表示します。さらに、幽霊を示す青紫色のポリゴンが表示されます。幽霊の位置はポリゴンの角にあります。
### (2)
あなたのタスクはロボットの行動を実行することです。srcフォルダにそのための新しいノードのファイルを作成してください。
部屋には障害物があるので、回避しながら移動しなければなりません。そのために、ROSナビゲーション(move_base) を使用することができます。
演習では、RVizから(2D Nav Goal ツールを使って)目標が設定されていました。次に、コードからそれを実行する必要があります。これを行うには2つの方法があります。
1. RVizと同様に、`move_base_simple/goal`にメッセージを送信します。簡単な方法なので、これをお勧めします。
2. ROSアクションとしてmove_baseを呼び出します。基本的なコード例は、[こちら](https://wiki.ros.org/ja/navigation/Tutorials/SendingSimpleGoals) にあります。
(ROSアクションでは、アクションの実行中にフィードバックを受け取るなど、追加のオプションがあります。たとえば、[こちらのコード](https://wiki.ros.org/ja/actionlib_tutorials/Tutorials/Writing%20a%20Simple%20Action%20Client%20%28Python%29)を参照してください。)
幽霊を捕まえる順番は自分で決めてください。
---
## 提出するビデオで何を示せばいいのか?
- 起動ファイルを実行してから、コードを実行します
- RVizが表示されていることを確認し、ロボットにすべての幽霊を捕まえさせます
---
リマインダー:今回はビデオもコードも提出する必要があります。
- 上記のビデオ(スクリーンキャスト)
- この課題で作ったコード (srcフォルダの中身だけでいいです)
が入った圧縮ファイルです。
---
#### よくある質問
*質問*:以下のように、move_baseに目的地をループで送っているが、ロボットが動きません。
```python
while not rospy.is_shutdown():
...
pub.publish(goal)
r.sleep()
```
*問題点*:move_baseは新しい目的地が送られたたびにそれまでのナビゲーションを中断して、最初から経路計画をやり直します。
その結果、ループで高い頻度で目的地を送り続けると、move_baseが毎回リセットされて、ロボットを動かす時間がありません。
*解決方法*:目的地のメッセージを連続的に送らず、一つだけ送ってください。
---
#### 結果の例
以下のリンクには、課題のビデオの例があります。これは最も単純な解決方法ではないので、真似する必要はありません!すべての幽霊さえ捕まえれば問題ありませんので、自分のやり方で解決してください。
https://www.robot.soc.i.kyoto-u.ac.jp/roboprog/materials/v6-例.mp4
このビデオでは、常に最も近い幽霊を捕まえるという戦略を使用しています。スペースには壁があるため、直線距離は使っていません。move_baseからすべての幽霊までの経路を得て、経路の距離を比較しています。(move_baseは`make_plan`サービスを提供し、それを使えば(ロボットを動かさずに)経路計画の結果が得られます。経路は、開始点から終了点までの経路上の一連の点として定義されています。経路内の隣接するすべてのポイントペア間の距離の合計は経路の距離です。)
ご覧のとおり、結果は「最適」ではありません。 1つの理由は、すべての幽霊までの経路を計算するには比較的長い時間がかかるからです。
また、常に最も近い幽霊に行くという戦略を使えば、必ずしも最短ルートを得られるとは限りません。(これは[巡回セールスマン問題](https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%B3%E5%95%8F%E9%A1%8C)に似ている問題なので、興味があれば巡回セールスマン問題の解法を調べてみてください。)
---
← [実習](v6_1.html)
↑ [ホームページ](index.html)