## 課題:BB-9ロボットの位置を追跡する
*スターウォーズ:エピソード VII + II・i*
*BB-8ロボットのなりすましが惑星Jakkuに侵入しました。一見するとBB-8ロボットに似ているが、非常に不器用な模倣であることがすぐにわかります。このロボットが何を意図しているのか、誰が送り込んだのかは不明です。あなたの仕事は、ロボットの動きを観測し、その正確な位置情報を基地に送り返すことです。それをもとに衛星がレーザー光線を照射し、ロボットを破壊する。使用できるのはカメラつきの1台のTurtlebot3ロボットだけです。途中、Turtlebot3の駆動の部分が故障して、前後移動できなくなってロボットにそれ以上近づけないがが、その場で回転することはまだできます。幸い、侵入ロボット(BB-9と呼ばれているようです)の下部球体の半径が0.15mという情報が手に入りました。これは、位置を推定するのに役立つかもしれません…*
### (1)
ROSパッケージtrackmeを含むアーカイブをダウンロードしてください。
https://www.robot.soc.i.kyoto-u.ac.jp/roboprog/materials/trackme.zip
ROSのワークスペース(~/catkin_ws/src/)に解凍し、catkin_makeでコンパイルしてください。
### (2)
BB-9ロボットの位置を推定推定する必要があります。 trackmeパッケージには、基本的なコードが入っているtemplateRobot.pyプログラムが含まれています。ただし、カメラを使用してBB-9ロボットの位置推定(角度と距離の推定)を実装するプログラムはまだできていません。
(このページの一番下にカメラの画像からボールの角度と距離を計算する式があります。)
新しいパッケージ(robot5\_task\_名字)を作成し、templateRobot.pyノードをそのパッケージにコピーして、名前を変更してください。
プログラムは次のように実行します。
```bash
roslaunch trackme trackme.launch robot_pkg:=<パッケージ名> robot_node:=<ノード名>
```
ロボットの位置推定がうまく行っているかをRVizで確認してください。緑色のボール(推定位置)が赤色のボール(ロボットの実際の位置)に近いことが必要です。
(Gazeboのシミュレーション自体がみたい場合は、trackme.launchないのgui引数をtrueに設定してください。)
rqt_plotを使用して、実際の位置と推定位置の時間変化を視覚化することもできます。必要なトピックは、`/bb/odom/pose/pose/position/x`と`y`、そして`/robot/ball_pose/point/x`と`y`です。
推定位置がロボットの近くにあると、衛星からのレーザーがBB-9に当たり、ヘルスが徐々に減少していきます。ヘルスがゼロになるとロボットは破壊され、ミッションは達成されます。しかし、位置の推定が間違っている場合は、ロボットのヘルスが徐々に回復していきます。100%になるとミッション失敗となります。(BB-9のヘルスはコンソールに表示されます。)
### (3)
BB-9ロボットは、最初は狭い領域を移動しますが、時間の経過とともに移動領域が拡大します。追跡をし続けるためには、ロボットの角度を変更する必要があります。そのための角速度制御を実装してください(直線速度は0のままにしてください)。
### (4)
実際の位置と推定した位置を比較してみれば、完全には一致しないことが解ると思います。特に距離推定の誤差が比較的に大きいでしょう。
単純なフィルターを使用して、推定結果をより滑らかにしてみましょう。以下の計算方法が使えます。
> 距離 = alpha ・ 前のステップの距離 + (1-alpha) ・ 新しい距離の推定値
パラメータ alpha ∈ [0,1] のいくつかの値を試してみて、自分が良さそうだと思っている値に設定してください。(推定位置が不安定な場合は、alphaを小さくすることがお勧めです。ただ、alphaが小さすぎたら推定に遅延が生じます。)
### 任意 (5)
ミッションをより難しくするために、launchファイルのパラメータnoisyをtrueにしてみてください。
```bash
roslaunch trackme trackme.launch robot_pkg:=<パッケージ名> robot_node:=<ノード名> noisy:=true
```
その設定の場合、Turtlebot3はさらに故障しています。カメラのデータにはノイズが多いし、ロボットの回転も不安定で、あなたの命令に正確に従わないのです。それでもなんとかBB-9を追いかけられるか?
## 提出するビデオで何を示せばいいのか?
- launchファイルと作成したノードを実行します(RVizが表示されていることを確かめてください)
- BB-9ロボットのヘルスがゼロになるまで位置を追跡しつづけてください
---
リマインダー:今回はビデオもコードも提出する必要があります。
- 上記のビデオ(スクリーンキャスト)
- この課題で作ったパッケージ (robot5\_task\_名字 フォルダ)
が入った圧縮ファイルです。
---
---
#### ボールまでの角度と距離の計算
カメラ画像では、ボールを検出し、その中心点Tを決定します。下の画像を参照してください。
また、ボールの左と右の境界点TLとTRをそれぞれ検出できるとしましょう。
(a) 角度を計算するには次の図に示すピンホールカメラモデルを使用します。
> XT / ZT = (u0 − u) / f
> ⇒ β = atan((u0 − u) / f)
(b) ボールまでの距離 d を計算したいです。ボールの大きさ(半径 r)がわかるとしましょう。
uRとuLはボールの境界点TRおよびTLのカメラ画像上の水平座標だとすれば、以下の式が得られます。
> (2r)/ d = (uR-uL) / f
> ⇒ d = 2rf/(uR-uL)
計算を簡単にするために、ボールがカメラの真正面にあると仮定しました。そうじゃない場合でもこの式は近似として使えいます。
---
← [イントロ](vextra_intro.html)
→ [パーティクルフィルタについて](vextra_pf.html)
↑ [ホームページ](index.html)