AWS Robot Delivery Challenge 2022 に出場できなかった話

# AWS Robot Delivery Challenge 2022 に出場できなかった話

## はじめに
今回はじめてQiitaに投稿したのでわかりにくい箇所などが多いと思います。
大学生が移動ロボットの制御の勉強を兼ねて製作したものなので説明に間違いがあるかもしれません、ご指摘いただけるとありがたいです。

## AWS Robot Delivery Challenge とは？
詳しくは[こちら](https://aws.amazon.com/jp/robot-delivery-challenge/)
AWS Robot Delivery Challengeとは、AWS Japan が開催しているロボコンでROS上で自律二輪ロボットを制御し、どれだけ多くのチェックポイントを通過できたかを競う大会です。AWSロボコンは2020年と2021年の2回開催されています。

## 参加できなかったワケ
ルール発表が2月中旬頃にあるのですが、2022年はAWS Deep Racer Student に変更されてしまい、強化学習を用いたロボットの大会になってしまいました、、、
2021年の8月頃から移動ロボットの制御の勉強を兼ねて準備していたのですが、出場できなかったのでここに供養します。

## AWSロボコン2021決勝のルール
#### コース全体図
<img src="https://i.imgur.com/43StZDP.png" width="80%">

TurtleBot3 Burger という実機のロボットを使い、ロボットを走らせます。
コースには複数のチェックポイント(青い丸)が用意されています。競技は2チームが同時に各チームのロボットを走らせ、より多くのチェックポイントを通過したチームが勝ちです。オレンジの丸が各ロボットのスタート位置です。コース上の緑で引かれている軌道(真ん中の円形の経路と左下・右上の直線の経路)の上に一定速度で動いているトラックがあり、ロボットの走行を妨げます。

## 結果
任意のチェックポイントについてロボットが到達できました！
シミュレーション予選のルールで33.9秒でゴールすることができました！
ちなみにAWSロボコン2021の予選1位のタイムは約40秒です。
[AWSロボコン2021結果](https://aws.amazon.com/jp/robot-delivery-challenge/ranking/)




## 作ったもの

### 外観
<iframe width="560" height="315" src="https://www.youtube.com/embed/a3iBIJSkLUU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

#### Rviz
![](https://i.imgur.com/HPORtxa.png)



#### 製作したUI
![](https://i.imgur.com/kcHeuD1.jpg)


| 名称 | 内容 |
| -------- | -------- |
| Map     | ロボットの目標位置を入力する<br>入力されたチェックポイントがControllerのrefに入る     |
| Console     | ROSのweb_infoという名前のtopicの内容を表示する     |
| Controller     | ロボットに制御司令を与える     |
| State     | ロボットの情報を表示する     |


### 全体設計
![](https://i.imgur.com/4WTW3zL.png)

ロボットの自己位置推定を行うノード(amcl)やロボットの自己位置についてのmsgは省略してあります。一部複雑になるために省略している箇所があります。

| 名称 | 内容 |
| -------- | -------- |
| webUI|      ブラウザを通じてロボットを操作する(大会ではAWSIoTを用いるが練習ではroswwwを用いた)|
| target_subscriber     | WebUIからロボットの目標チェックポイントの情報を受けとりcommanderに送るノード     |
| robot_state_publisher     | commanderからロボットの情報を受け取り、WebUIに送るノード     |
| commander     | WebUIからの指示をもとにどの制御器を動かすか司令を行うノード     |
| csv_path_data     | あらかじめオフラインで計算された最適な経路の点群データ     |
| dijkstra     | グラフ探索を行うことによって現在いるチェックポイントから目標チェックポイントまでの経路を作るノード     |
| planner     | dijkstraによって生成された経路についてロボットの制御の目標位置を計算するノード     |
| kanayama_control     | Kanayamaの制御を行うノード     |
| stop_control     | ロボットを停止させるノード     |
| manual_control     | ロボットを手動で操作するときに用いるノード     |
| position_control     | ROSのnavigationパッケージを用いてロボットを目標チェックポイントまで動作させるノード     |
| move_base     | ロボットを指定した目標位置まで動かすROSのnavigatoionパッケージに入っているノード     |
| gazebo     | シミュレーションを行うノード     |



#### ロボット制御の主な流れ
あらかじめ各中継点の間の最適な経路を計算
↓
WebUIからの目標チェックポイントをもとにたどるべき経路を探索
↓
ロボットの位置から経路上の目標とする点を算出
↓
ロボットが目標点に追従するように制御
↓
ロボットの位置を推定し更新


### Commander
* [タスクプランニング](https://qiita.com/mitsu3291/items/88f19a306cd2866e0010)

### Planner
 * [最適経路](https://qiita.com/mitsu3291/items/a5c176fc367ae6a0b1b2)
 * [ダイクストラ法](https://qiita.com/Tsuji-Kosei/items/5628a6cd0957cc91f000)
 * [黄金探索](https://qiita.com/Tsuji-Kosei/items/e222a8a3b63adce10594)

### Controller
* [金山制御](https://qiita.com/mitsu3291/items/05c034494883836736c5)
* モデル予測制御


### 自己位置推定
* ROSのnavigationパッケージにあるamclを用いました。手法としてはパーティクルフィルタを用いています。