WSL2環境下で構築したOpen-RMFのRMF Demosにおいて、tinyRobotに配送させるものを検討してみた

# 1. はじめに
[[1]](#参考記事やサイト)で公開されているRMF DemosのOffice Worldというシミュレーション環境ではtinyRobotというロボットがコーラ缶をピックアップして配送するということが以下の手順でできます。

```:terminal(1)
cd ~/rmf_ws
source ~/rmf_ws/install/setup.bash
ros2 launch rmf_demos_gz_classic office.launch.xml
```
```:terminal(2)
ros2 run rmf_demos_tasks dispatch_delivery -p pantry -ph coke_dispenser -d hardware_2 -dh coke_ingestor --use_sim_time
```

コーラの缶をピックアップして配送する様子をシミュレーションした際の動画を以下に示します。
（この機能の設定方法などは[[2]](#参考記事やサイト)の「Workcells」の項目に詳細に書かれておりますので、そちらをご参照ください。）
<iframe width="560" height="315" src="https://www.youtube.com/embed/k43Gg8ps0hI?si=FcI0fsrhNP4MBFfe" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

しかし配送シミュレーションをするのであれば、コーラの缶だけでなく他のものも運ばせたいなと考え、そのことに取り組んだことが本記事になります。

# 2. 実行環境
- CPU: CORE i7 7th Gen
- メモリ: 32GB
- GPU: GeForce RTX 2070
- OSと構築した環境: Window11でWSL2にUbuntu22.04をインストールした環境
- ROS2: Humble
- Open-RMFの構築環境：[WSL2の環境下において、Traffic-Editorを使って複数ロボットとエレベータの連携をシミュレーションできる環境を構築してみた](https://qiita.com/bebebefu/items/32dcb43db1213e1a00e0)の記事で構築した環境

# 3. 方針
[[3]](#参考記事やサイト)のサイトで公開されているモデルをダウンロードして、RMF DemosのOffice Worldのコーラの缶と入れ替えます。そしてそのモデルをtinyRobotが問題なく搬送できるか、Office Worldのシミュレーション環境を使って試行します。

# 4. モデルをOffice Worldに反映する手順
モデルをシミュレーション環境に反映した手順は以下です。
- [[3]](#参考記事やサイト)のサイトで適切なモデルを選んだら、以下の図で赤枠で囲んだボタンをクリックして、モデルをダウンロードします。（画面はCardboard box）
![スクリーンショット 2024-03-23 143903.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/658bc5ae-fe7e-e81f-d1ab-8bcecc9b74f8.png)

- ダウンロードしたファイルを解凍します。そのしてそのファイルをそのまま.gazebo\models（Open-RMFの環境構築したときにrmf_wsと同じ階層に.gazeboというファイルができていました。）の中にコピーします。

- ~/rmf_demos_maps/maps/officeの中にある、office.building.yamlの以下の部分の「model_name」（デフォルトではOpenRobotics/Coke）と「name」（デフォルトではCoke）をダウンロードしてきたモデルの名前に変更します。
    ```yaml:office.building.yaml
     - {dispensable: false, model_name: OpenRobotics/Coke, name: Coke, static: false, x: 2098.6509999999998, y: 650.52300000000002, yaw: 1.5708, z: 1.0800000000000001}
    ```

# 5. 各モデルの検討
## 5.1 段ボールの場合(Cardboard box)
[段ボールモデルのリンク](https://app.gazebosim.org/OpenRobotics/fuel/models/Cardboard%20box)から段ボールのモデルをダウンロードして、.gazeboの中に保存した後に、office.building.yamlの以下の部分をこのように修正しました。

```yaml:office.building.yaml（修正前）
- {dispensable: false, model_name: OpenRobotics/Coke, name: Coke, static: false, x: 2098.6509999999998, y: 650.52300000000002, yaw: 1.5708, z: 1.0800000000000001}
```

```yaml:office.building.yaml（修正後）
- {dispensable: false, model_name: cardboard_box, name: cardboard_box, static: false, x: 2098.6509999999998, y: 650.52300000000002, yaw: 1.5708, z: 1.0800000000000001}
```

そして、以下のコマンドを実行して、段ボールをピックアップして配送をしようとした結果を以下の動画に示します。（モデル以外は変えてませんので、指示はコーラ缶の時と同じで動きます。）
```:terminal(1)
cd ~/rmf_ws
source ~/rmf_ws/install/setup.bash
ros2 launch rmf_demos_gz_classic office.launch.xml
```
```:terminal(2)
ros2 run rmf_demos_tasks dispatch_delivery -p pantry -ph coke_dispenser -d hardware_2 -dh coke_ingestor --use_sim_time
```
<iframe width="560" height="315" src="https://www.youtube.com/embed/97mBGfk8J8Y?si=FcI0fsrhNP4MBFfe" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
👆をみるとピックアップはできるのですが、すぐに段ボールを落としてしまう挙動が見られました。

## 5.2 小包の場合(Google_Cardboard_Original_package)
[小包のモデルのリンク](https://app.gazebosim.org/GoogleResearch/fuel/models/Google_Cardboard_Original_package)から小包のモデルをダウンロードして、.gazeboの中に保存した後に、office.building.yamlの以下の部分をこのように修正しました。

```yaml:office.building.yaml（修正前）
- {dispensable: false, model_name: OpenRobotics/Coke, name: Coke, static: false, x: 2098.6509999999998, y: 650.52300000000002, yaw: 1.5708, z: 1.0800000000000001}
```

```yaml:office.building.yaml（修正後）
- {dispensable: false, model_name: Google_Cardboard_Original_package, name: Google_Cardboard_Original_package, static: false, x: 2098.6509999999998, y: 650.52300000000002, yaw: 1.5708, z: 1.0800000000000001}
```
そして、以下のコマンドを実行して、小包をピックアップして配送をしようとした結果を以下の動画に示します。（モデル以外は変えてませんので、指示はコーラ缶の時と同じで動きます。）
```:terminal(1)
cd ~/rmf_ws
source ~/rmf_ws/install/setup.bash
ros2 launch rmf_demos_gz_classic office.launch.xml
```
```:terminal(2)
ros2 run rmf_demos_tasks dispatch_delivery -p pantry -ph coke_dispenser -d hardware_2 -dh coke_ingestor --use_sim_time
```
<iframe width="560" height="315" src="https://www.youtube.com/embed/K7eWhLSB_wk?si=FcI0fsrhNP4MBFfe" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
👆をみるとピックアップは成功し途中までは運べるのですが、途中で小包を落とした上に、落とした小包を障害物として検知して、スタックしてしまいました。

## 5.3 その他
その他、以下のモデルの配送も試してみましたが、いずれもtinyRobotが途中で落としてしまい、**問題なく運べるものはありませんでした。**

- 本:
[Eat_to_Live_The_Amazing_NutrientRich_Program_for_Fast_and_Sustained_Weight_Loss_Revised_Edition_Book](https://app.gazebosim.org/GoogleResearch/fuel/models/Eat_to_Live_The_Amazing_NutrientRich_Program_for_Fast_and_Sustained_Weight_Loss_Revised_Edition_Book)
- コピー用紙の箱：
[INTERNATIONAL_PAPER_Willamette_4_Brown_Bag_500Count](https://app.gazebosim.org/GoogleResearch/fuel/models/INTERNATIONAL_PAPER_Willamette_4_Brown_Bag_500Count)

# 6. まとめ 
私が追加したモデルでtinyRobotにて運ぶものとしてしっくりくるものはありませんでした。そのためtinyRobotを用いた配送シミュレーションはコーラ缶を第1の配送対象物として今後環境構築に取り組んでいきたいと思います。またtinyRobotよりも大きいDeliveryRobotとかであれば今回追加したモデルを問題なく配送できるのかもしれません。この点についても今後取り組んでいきたいと思います。

# 参考記事やサイト
[1][open-rmf/rmf_demos](https://github.com/open-rmf/rmf_demos)
[2][Programming Multiple Robots with ROS 2](https://osrf.github.io/ros2multirobotbook/simulation.html)
[3][Gazebo](https://app.gazebosim.org/dashboard)