WSL2環境下で構築したOpen-RMFで複数ロボットとエレベータの連携をシミュレーションできる環境で遊んでみる　簡単な配送シミュレーションと得られた知見編

# 1. はじめに
　[[1]](#参考記事やサイト)の記事では、WSL2の環境下において、Open-RMFとtraffic-editorを使ってエレベータ付きの2階建ての建物環境を構築して複数台のロボットを動かすことができました。
　また[[2]](#参考記事やサイト)の記事では上記の環境下においてタスクのステータスも取得することができました。
　環境の構築やタスクを投げてロボットを動かすことやそのタスクのステータスを構築することができるようになってきましたので、今回は簡単な配送シミュレーションをしてみたいと思います。

# 2. 実行環境
- CPU: CORE i7 7th Gen
- メモリ: 32GB
- GPU: GeForce RTX 2070
- OSと構築した環境: Window11でWSL2にUbuntu22.04をインストールした環境
- ROS2: Humble
- Open-RMFの構築環境：[[1]](#参考記事やサイト)の記事で構築した環境

# 3. 方針
- 建物環境：[[1]](#参考記事やサイト)の記事で構築したエレベータ付きの2階建ての建物
- 使用ロボット：tinyRobot
- ロボット台数：2台
- 配送対象物：コーラ缶（[[3]](#参考記事やサイト)の記事より選定）
- タスク：配送(delivery)と巡回(loop) 

# 4. 配送対象物（コーラ缶）の設置と配送対象物の初期位置や配送位置の設定
## 4.1 コーラ缶の初期位置の設定
コーラ缶の初期位置は建物の1階で、下図の赤枠と矢印で示した、2か所に設置しました。
![コーラ缶の位置俯瞰.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/c2d91e66-8842-829e-03c6-07abbcb59537.png)

コーラ缶を初期に置くところとした棚(オブジェクト名：WhiteCabinet)のtraffic-editorでの設定は以下の図のようにしました。（オブジェクトの追加方法は[[4]](#参考記事やサイト)を参照ください）
![スクリーンショット 2024-03-30 095009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/d6a9a6e1-8a12-7628-2ab2-10bf50ca3e52.png)

そしてコーラ缶の初期位置のtraffic-editorでの設定は以下の図のようにしました。

**注意事項:**
- コーラ缶の初期位置は[[5]](#参考記事やサイト)のサイトを参考に「TeleportDispenser」をtraffic-editorのメニューバーにある「add model」から追加しました。この上に置いたものはロボットでピックアップができるようになるそうです。
- traffic-editor上では「TeleportDispenser」は青い小さく四角で表現されます（以下の図では選択状態なので、ピンク色になっています）。非常に小さく見にくいのでどこに設定したか忘れないように注意する必要があります。
![スクリーンショット 2024-03-30 095022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/d70d2040-c1ce-fa8d-94c1-25ca97b03bf8.png)

## 4.2 コーラ缶の設定
コーラ缶のtraffic-editorでの設定は以下の図のようにしました。

![スクリーンショット 2024-03-30 095031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/e07bc0e3-19cf-aa89-1a65-82b8ff3a027d.png)

**注意事項**
- コーラ缶の位置は必ず先ほど設定した「TeleportDispenser」の真上にしないといけません。私は最初に「近くに置けばいいのか」ぐらいに考えて真上ではなく脇に設定してしまったことでロボットでコーラ缶がピックアップができないという事象が起こりました。

- staticのところの設定はfalseにしておかないとコーラ缶が動かず、ロボットでのピックアップができないという事象が起こります。

## 4.3 コーラ缶の配達位置の設定
コーラ缶の配達位置は建物の2階で、下図の赤枠で示した、2か所の棚(オブジェクト名：WhiteCabinet)の上に配達するように設定しました。
![配達位置.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/12fb91ac-9828-2365-c4df-25fb46b1ae6b.png)

そしてコーラ缶の配達位置のtraffic-editorでの設定は以下の図のようにしました。
![スクリーンショット 2024-03-24 074009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/69e1ad76-4ee1-f775-51f5-3bae4415d56b.png)
**注意事項:**
- コーラ缶の配達位置は[[5]](#参考記事やサイト)のサイトを参考に「TeleportIngestor」をtraffic-editorのメニューバーにある「add model」から追加しました。この上にロボットでピックアップした配送物が置かれるようになるそうです。
- traffic-editor上では「TeleportIngestor」も青い小さく四角で表現されます。非常に小さく見にくいのでどこに設定したか忘れないように注意する必要があります。（以下の図では選択状態なので、ピンク色になっています）

# 5. ロボット経路上での設定
4章ではコーラ缶の初期位置と配達位置の設定をしましたが、コーラ缶をピックアップしたり配達先に置いたりするのはロボットが行いますので、経路上のどこでそれを行うか設定する必要があります。

## 5.1 ピックアップ位置の設定
ロボットで配送物のピックアップ作業を行う位置のtraffic-editorでの設定は以下の図のようにしました。

![スクリーンショット 2024-03-24 091246.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/e34c9afe-4507-54e8-fbf2-56eb243ac9d2.png)

**注意事項:**
- 「pickup_dispenser」という項目を追加した上で、名前は「TeleportDispenser」で設定した名前と同じにしました。
- ピックアップ位置を「is_passthrough_point」とするとピックアップできないらしいので、私は「is_holding_point」をtrueとして設定しました。（本当にピックアップできないのかは試していないので私の環境での真偽は不明です。）

## 5.2 配達作業位置の設定
ロボットでピックアップした配送物を置く作業を行う位置のtraffic-editorでの設定は以下の図のようにしました。

![スクリーンショット 2024-03-24 075832.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/b64b2cf7-df36-3133-91e7-c53156973be1.png)

**注意事項:**
- 「dropoff_ingestor」という項目を追加した上で、名前は「TeleportIngestor」で設定した名前と同じにしました。
- 配達位置を「is_passthrough_point」とすると配送対象物を置くことができないらしいので、私は「is_parking_spot」をtrueとして設定しました。（本当に置くことができないのかは試していないので私の環境での真偽は不明です。）

# 6. 結果
タスクとしてはtinyRobotでコーラ缶を2階の配達位置まで持って行くことを2回行いました。そしてシミュレーションしたときの動画を編集したものが以下になります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/cyoYf1lFhSE?si=FcI0fsrhNP4MBFfe" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

この結果から分かったことは
- コーラ缶をピックアップして配達には成功しますが、RMF Demos Panel（タスクステータスを可視化できるツール）ではタスクステータスが99%と表示されてしまいます。その後、何回か試してみましたが、completeと表示されるのは3回に1回ぐらいでした。なお、これはdeliveryタスクをさせてみた時ですが、patrolタスク（指定先に行くだけ）を与えた時も、目的地に着いた時点でタスクは自体は完了になるのですが、RMF Demos Panelではタスクステータスが99%と表示されてしまう同じような事象が起こりました。

- コーラ缶のモデルは配達を完了した後も初期位置に表示されますが、2回目の配達時はコーラ缶がピックアップされず、配達のタスクも失敗となってしまいます。これは調べても同じような事象の報告が私は見つけられませんでした。もしかしたら私の環境や設定方法に起因するものかもしれません。なお、patrolタスク（指定先に行くだけ）を与えた時は、配達するものがないということもあり2回目以降も問題なくタスクが処理されました（タスク進捗の表示が99%になる問題は除く）。

# 7. まとめ
今まで構築してきた環境にて、問題はありますが簡単な配送シミュレーションができるようになってきたと思います。ただ、deliveryタスクは2回目以降はできないことから、配送シミュレーションを行うには配送物のピックアップ位置を複数にするとか、patrolタスクを疑似的にdeliveryタスクとみなすなどの工夫は必要と考えられます。今後はもう少し現実に即した配送シミュレーション環境を構築して、シミュレーションとその分析なんかをやっていきたいと思います。

# 参考記事やサイト
[1][WSL2の環境下において、Traffic-Editorを使って複数ロボットとエレベータの連携をシミュレーションできる環境を構築してみた](https://qiita.com/bebebefu/items/32dcb43db1213e1a00e0)
[2][WSL2環境下で構築したOpen-RMFで複数ロボットとエレベータの連携をシミュレーションできる環境で遊んでみる　タスクステータス取得編](https://qiita.com/bebebefu/items/2adbc9304f5d3024085d)
[3][WSL2環境下で構築したOpen-RMFのRMF Demosにおいて、tinyRobotに配送させるものを検討してみた](https://qiita.com/bebebefu/items/9d2081b62dbcc7d1cc1d)
[4][WSL2の環境下において、Traffic-Editorを使って複数ロボットの移動をシミュレーションできる環境を構築してみた 4.9 オブジェクトの設定](https://qiita.com/bebebefu/items/c787bfa2d9daf04aab4c#49-%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A)
[5][Workcells](https://osrf.github.io/ros2multirobotbook/simulation.html?highlight=Dispenser#workcells)