## シミュレーションを使った課題
---
注意:ロボットを使った課題をやるためには、このシミュレーション課題を終えている必要があります。
---
### (1)
以下にROSパッケージmove_pillarを含むアーカイブがあります。
https://www.robot.soc.i.kyoto-u.ac.jp/roboprog/materials/move_pillar.zip
ROSのワークスペース(~/catkin_ws/src/)に解凍し、コンパイルしてください。
```bash
cd ~/catkin_ws/
catkin_make
```
### (2)
新しいROSパッケージ robot3\_task\_名字 を作成し、先週の課題で作ったロボット制御のソースファイルとlaunchファイルをそのパッケージの中の適宜なフォルダにコピーしてください。launchファイルを次のように変更しましょう。
- シミュレーションで使用されるワールド名を move_pillar パッケージ内の singlePillar.world に設定
- move_pillar パッケージの move_pillarノードの実行を追加
- 先週の課題で作成したロボット制御ノードの実行を(一時的に)外す
シミュレーションするワールドには1つの「柱」しか含まれていません。RVizの2D Nav Goalツールを使用すれば柱の位置を指定することができます。試してみてください。
(この機能はmove_pillarノードで実装されています)
注:Gazeboシミュレーションを表示したい場合は、launchファイルのGazeboのインクルードタグの gui パラメーターを true に設定する必要があります。後で false に戻してください。
### (3)
まず、レーザースキャナーの測定データが入っているメッセージの中身を見てみましょう。
```bash
rostopic echo -n 1 /scan
```
メッセージの重要な要素
- ranges → 距離データの配列
- angle_min → ranges[0]に対応する角度
- angle_increment → rangesの要素間の角度
- `ranges[i]`に対応する角度の計算 `angle[i] = angle_min + i * angle_increment`
(【ヒント】距離と角度データから位置の計算: `x = range * cos(angle)`、`y = range * sin(angle)`)
次に、ロボット制御ノードのソースファイルを次のように変更してください。
- /move_base_simple/goal トピックへの購読を削除
- ロボットのレーザースキャナー測定(/scan トピック)への購読を追加
- レーザースキャンを処理して、ロボットに一番近い物(つまり、柱)の位置の計算を実装してください(実装方法は自分で考えてください)。
- レーザースキャナーの測定データが base_scan という座標系にあるので、計算した物の位置も base_scan フレームにあります。
グローバルな座標系 odom に変換しましょう。
[第2週の実習その2](v2_2.html)の「TF APIの使用」で説明した方法が利用できます。
- 計算した柱の位置をロボット移動の目的地として使用します。第2週の課題で使っていた /move_base_simple/goal トピックから読んでいた位置の代わりに使うようにしてください(両方が odom 座標系を使っているので、残りのコードは変更する必要はありません)。
- ロボットが目的地の約0.3メートル手前(柱にぶつかる前)に停止するようにしてください。
launchファイルにロボット制御ノードの実行を復元してテストを行いましょう。ロボットは柱に向かって移動し、柱の手前で止まるはずです。
### (4)
ロボット制御ノードに「goto_closest」という名前のROSサービスを追加し、次のような機能を実装してください。
- サービスが呼び出されると、ロボットは一番近い物のほうへ移動する
- ロボットが止まったら、サービスは完了する
つまり、ロボットはサービスが呼び出されるまでは移動しません。サービスが呼び出されたときに、柱に向かって移動します。手前で停止して、再びサービスが呼び出されるまでは移動しません。
動作確認:RVizで柱の位置を設定し、`rosservice call goto_closest` を使用してサービスを呼び出してみてください。
### 任意(5)
RViz内に3Dのマーカーを表示することができます。
マーカーの使い方の詳細はこちらにあります(C++):
− 英語 https://wiki.ros.org/rviz/DisplayTypes/Marker
− 日本語チュートリアル https://wiki.ros.org/ja/rviz/Tutorials/Markers:%20Basic%20Shapes
Pythonの例: https://www.robotech-note.com/entry/2018/04/15/221524
最も近い物(柱)の位置にマーカーを作成し、RViz内に表示するようにしてください。
(より難しい:マーカーを正確に柱の中心に置く。柱の半径はレーザースキャナーのデータから推定できます。)
### 任意(6)
柱の近くでロボットを停止さめるのではなく、柱の周りを一定の距離(例えば1m)で連続回転させましょう。
実装ができたら、動画を撮って、上記のファイルと一緒に圧縮ファイルに入れて提出してください。
---
## 提出するビデオで何を示せばいいのか?
(すべての段階の結果がビデオにはっきりと表示されていることに注意してください!)
- launchファイルを実行し、RVizが起動するのを待ちます
- RVizで2DNav Goalツールを使用して、柱の位置を設定します
- (「任意(5)」の実装ができた場合)最も近い物の位置を表すマーカーがRVizで表示されます
- 実装したサービスをターミナルで呼びかけます。ロボットが柱に向かって移動するはずです
- (柱の位置を設定→サービスを開始→ロボットが柱まで移動)をあと2回繰り返します
---
リマインダー:提出するのは
- 上記のビデオ(スクリーンキャスト)
- この課題で作ったパッケージ (robot3\_task\_名字 フォルダ)
が入った圧縮ファイルです。
---
→ [課題(ロボット)](v3_task_robot.html)
← [実習その2](v3_2.html)
↑ [ホームページ](index.html)