Open-RMFで複数ロボットとエレベータの連携をシミュレーションできる環境で、オフィスビルにおける簡単な館内配送シミュレーションをしてみた　その２　時間帯別荷物搬入個数の配送への反映

# 1. はじめに
先日[Open-RMFで複数ロボットとエレベータの連携をシミュレーションできる環境で、オフィスビルにおける簡単な館内配送シミュレーションをしてみた](https://qiita.com/bebebefu/items/6fc0ede2af08248fbfd6)[[1]](#参考文献)にて濱野ら[[2]](#参考文献)の論文を参考に、オフィスビルにおける館内配送を対象に簡単なシミュレーションをしてみました。

参考文献[[1]](#参考文献)のシミュレーションでは、以下の条件にてシミュレーションを行いました。

|項目  |内容  |
|---|---|
|ロボット発進位置 | 館内メールセンター（地上3階)|
|配送場所① | 地上3階～地上18階のそれぞれのフロアのオフィスエリアに各2か所（上図で示した配送先1と配送先2）|
|配送場所② | 地上19階の厨房に1か所|
|配送場所③ | 地上19階のコンビニに1か所|
|館内配送の総量|41個|
|**館内配送の頻度**|午前10時開始配送：21個（本記事のシミュレーションン対象）、午後15時開始配送：20個|
|**午前10時開始配送の詳細（本記事のシミュレーション対象）**|地上3階～地上18階の「配送先1」（位置は上図参照）に各1個：計16個、地上19階のコンビニ：3個　地上19階の厨房：2個|
|**午後15時開始配送の詳細**|地上3階～地上18階の「配送先2」（位置は上図参照）に各1個：計16個、地上19階のコンビニ：3個　地上19階の厨房：1個|
|ロボット配送方法|1配送につき1個の荷物を配送する。そしてその荷物は配送先に到着したら荷物は即受け取られるとする。そして受け取られたらすぐにロボットは発進元である館内メールセンターに帰還し、次の配送物がある場合は館内メールセンター帰還後にすぐに「ロボット巡回開始位置」より配送先に発進する|
|ロボット種類|tinyRobot|
|ロボット台数|1台 or 2台　の2通りをシミュレーション|
|ロボットが使用可能なエレベータ|1台| 

　ここで、これをもう少し実際の運用に近づけることをしてきたいと考えています。本記事の対象としたは、👆の表で太字で示した「館内配送の頻度」と「午前10時開始配送の詳細」「午後15時開始配送の詳細」のところです。
　参考文献[[1]](#参考文献)のシミュレーションでは、午前10時開始の配送の21個については、午前10時の時点ですべての荷物がメールセンターに到着した状態から始めるという想定で行いました。しかし参考文献[[2]](#参考文献)では荷物が届く量は時間帯によって波があることが述べられています。そのため、例えば次のようなこともあると考えられます。(以下はあくまでも例です、シミュレーションのシナリオや条件については3章で設定します。)

 - 例①
 午前10時～午前11時の時間帯は2個到着したのですぐに配送を完了できて、残りの時間は他の業務に充てられた。しかし午前11時の時点では15個も到着したのでずっとその時間帯は配送業務に充てなくてはならない。

- 例②
昨日受け取れなかった荷物が午前9時～午前10時に大量に到着したことに加え午前11時にいつもの量の荷物が来てしまい、ピストン配送をしたが午後2時まで館内配送にかかってしまった。ただ午後は荷物の搬入が1～2個程度で午後2時以降は他の業務に集中できた。
 
　そこで本記事では参考文献[[2]](#参考文献)の文献における時間帯別の搬入貨物個数を参考に時間帯による搬入個数の差をロボットによる配送に反映したシミュレーションをしていきたいと思います。

# 2. 実行環境
CPU: CORE i7 7th Gen
メモリ: 32GB
GPU: GeForce RTX 2070
OS: Ubuntu22.04(WSL2ではなくPCに直接インストール)
ROS2: Humble

# 3. シミュレーション条件
本記事では、シミュレーションする建物モデル、ロボットモデル、ロボットの台数、配送先、館内配送開始位置については参考文献[[1]](#参考文献)の条件と同じとします。そして参考文献[[2]](#参考文献)における時間帯別の搬入貨物個数を参考にし、時間帯ごとの搬入個数の差をロボットによる配送に反映したシミュレーションを本記事では行います。
本記事では、ある時間帯に届く荷物は、その時間帯の正時に届くものと仮定します（例えば、8:00～8:59の間に届く荷物はシミュレーション上では8:00に届いたものとします）。ロボット配送は荷物が届いた時点で即時開始する設定です。その時間帯に届いた荷物をその時間帯内で処理できるか、あるいは次の時間帯に持ち越すかをシミュレーションで評価します。

## 3.1 時間帯による荷物搬入個数の違いについて
参考文献[[2]](#参考文献)では、時間帯別の平均搬入貨物個数（平日）のグラフが示されています。なお、そのグラフはオフィス床行貨物と商業床行貨物に分けられています。それぞれの貨物の行先について1章で示した配送場所については以下のようになります。

- オフィス床行貨物:　配送場所①への荷物
- 商業床行貨物:　　　配送場所②と配送場所③への荷物

 そしてそれぞれの時間帯における搬入量については、参考文献[[2]](#参考文献)から私の方で読み取ったおおよその値は以下のようになっています。（なお、グラフ読み取りソフトなどは使っておりませんので、完全に私の目視確認の結果です。）

|時間帯  |オフィス床行貨物 個数  |商業床行貨物 個数  |備考  |
|---|---|---|---|
|6:00| 約1個|約50個 | -|
|7:00| 約50個|約10個 | -|
|8:00| 約130個|約5個 | 注1|
|9:00| 約30個|約1個 | -|
|10:00| 約90個|約0個 | -|
|11:00| 約20個|約0個 | -|
|12:00| 約5個|約0個 | -|
|13:00| 約10個|約2個 | -|
|14:00| 約10個|約5個 | -|
|15:00| 約5個|約10個 | -|
|16:00| 約10個|約5個 | -|
|17:00| 約2個|約0個 | -|
|18:00| 約10個|約30個 | -|
|19:00| 約0個|約5個 | -|

**注１：** 参考文献[[2]](#参考文献)では、館内配送業者が担う荷物について、特定のフロアのほとんどが9:30までに到着することから、貨物の搬入時間を8:30として統一していると述べられています。

注1に記載されている集計方法では、時間帯ごとの搬入荷物の個数の違いがわかりにくくなります。そこで、館内配送業者が運ぶ荷物の個数を差し引いて、各時間帯の違いを確認することにしました。参考文献[[2]](#参考文献)によると、館内配送業者は平日に平均34.4個の荷物を運んでいるため、この数を差し引いた場合の各時間帯の搬入荷物の個数は以下のようになります。

|時間帯  |オフィス床行貨物 個数  |商業床行貨物 個数  |
|---|---|---|
|6:00| 約1個|約50個 |
|7:00| 約50個|約10個 |
|8:00| **約96個**(差し引いた個数)|約5個 |
|9:00| 約30個|約1個 |
|10:00| 約90個|約0個 |
|11:00| 約20個|約0個 |
|12:00| 約5個|約0個 |
|13:00| 約10個|約2個 |
|14:00| 約10個|約5個 |
|15:00| 約5個|約10個 |
|16:00| 約10個|約5個 |
|17:00| 約2個|約0個 |
|18:00| 約10個|約30個 |
|19:00| 約0個|約5個 |

そしてこれらを時間帯ごとの割合に直すと以下のようになります。
|時間帯  |オフィス床行貨物  |商業床行貨物  |
|---|---|---|
|6:00| 0.3%| 53.8%|
|7:00| 14.7%| 10.8%|
|8:00| 28.3%| 5.4%|
|9:00| 8.8%| 1.1%|
|10:00| 26.5%| 0.0%|
|11:00| 5.9%| 0.0%|
|12:00| 1.5%| 0.0%|
|13:00| 2.9%| 2.2%|
|14:00| 2.9%| 5.4%|
|15:00| 1.5%| 10.8%|
|16:00| 2.9%| 5.4%|
|17:00| 0.6%| 0.0%|
|18:00| 2.9%| 0.0%|
|19:00| 0.0%| 5.4%|

ここで館内配送業者が担う配送の話に戻します。先ほどの時間帯ごとの搬入個数の違いに関する割合算出では、館内配送業者が担当する荷物の個数は差し引きました。ただ、オフィスビルに外部から荷物を届ける業者は、館内配送業者が運ぶ荷物とその他の荷物を分けて搬入することはなく、荷物をまとめて搬入するものと考えられます。そのため、館内配送業者が担当する荷物についても時間帯ごとの搬入個数の違いの傾向は同様であると推測されます。

そして参考文献[[1]](#参考文献)にて設定した41個の荷物の内訳は以下です。
配送場所①への荷物（オフィス床行貨物）：32個
配送場所②への荷物（商業床行貨物）：3個
配送場所③への荷物（商業床行貨物）：6個

これを先ほど計算した時間帯ごとの割合に当てはめ、時間帯ごとの搬入荷物個数を以下のように設定しました。

|時間帯  |配送場所①への荷物  |配送場所②への荷物  |配送場所③への荷物  |
|---|---|---|---|
|6:00| 0| 2| 3|
|7:00| 5| 0| 1|
|8:00| 9| 0| 0|
|9:00| 3| 0| 0|
|10:00| 9| 0| 0|
|11:00| 2| 0| 0|
|12:00| 0| 0| 0|
|13:00| 1| 0| 0|
|14:00| 1| 0| 0|
|15:00| 0| 1| 2|
|16:00| 1| 0| 0|
|17:00| 0| 0| 0|
|18:00| 1| 0| 0|
|19:00| 0| 0| 0|

## 3.2  配送先について
配送場所①への荷物（オフィスフロアへの貨物）については、シミュレーションの条件を厳しくするために、配送先をロボット待機場所（地上3階）からできるだけ遠い場所に設定します。すべての荷物を一番遠い地上18階に設定することも考えられますが、それでは現実的ではないため、例えば、7時台における配送場所①への荷物が5個ある場合、地上18階の配送先1、地上18階の配送先2、地上17階の配送先1、地上17階の配送先2、地上16階の配送先1にそれぞれ1個ずつ配送する設定にします。

## 3.3  シミュレーション条件のまとめ
ここまでの項で設定した項目を以下の表に一旦まとめます。

|項目  |内容  |
|---|---|
|ロボット発進位置 | 館内メールセンター（地上3階)|
|配送場所① | 地上3階～地上18階のそれぞれのフロアのオフィスエリアに各2か所（上図で示した配送先1と配送先2）|
|配送場所② | 地上19階の厨房に1か所|
|配送場所③ | 地上19階のコンビニに1か所|
|館内配送の頻度|荷物が届いた時点で即時に配送を開始（荷物は毎正時に、その時間帯に届くすべての荷物が一斉に届くと仮定）|
|ロボット配送方法|1配送につき1個の荷物を配送する。そしてその荷物は配送先に到着したら荷物は即受け取られるとする。そして受け取られたらすぐにロボットは発進元である館内メールセンターに帰還し、次の配送物がある場合は館内メールセンター帰還後にすぐに「ロボット巡回開始位置」より配送先に発進する|
|ロボット種類|tinyRobot|
|ロボット台数|2台|
|ロボットが使用可能なエレベータ|1台|

# 4. シミュレーション
シミュレーションの設定、タスクの指示方法、ロボットの現在位置やタスクステータスの取得方法は参考文献[[1]](#参考文献)と同じにしましたので、ここでは割愛させていただきます。例として6:00台のタスクと8:00台のタスクを指示するjsonファイルを以下に示します。

```json:6:00台のタスク
[
    {
        "places": ["start_point", "L19_A"],
        "rounds": 1,
        "use_sim_time": true
    },
    {
        "places": ["start_point", "L19_A"],
        "rounds": 1,
        "use_sim_time": true
    },
    {
        "places": ["start_point", "L19_A"],
        "rounds": 1,
        "use_sim_time": true
    },
    {
        "places": ["start_point", "L19_B"],
        "rounds": 1,
        "use_sim_time": true
    },
    {
        "places": ["start_point", "L19_B"],
        "rounds": 1,
        "use_sim_time": true
    }
]
```

```json:8:00台のタスク
[
    {
        "places": ["start_point", "L10_A"],
        "rounds": 1,
        "use_sim_time": true
    },
    {
        "places": ["start_point", "L11_A"],
        "rounds": 1,
        "use_sim_time": true
    },
    {
        "places": ["start_point", "L12_A"],
        "rounds": 1,
        "use_sim_time": true
    },
    {
        "places": ["start_point", "L13_A"],
        "rounds": 1,
        "use_sim_time": true
    },
    {
        "places": ["start_point", "L14_A"],
        "rounds": 1,
        "use_sim_time": true
    },
    {
        "places": ["start_point", "L15_A"],
        "rounds": 1,
        "use_sim_time": true
    },
    {
        "places": ["start_point", "L16_A"],
        "rounds": 1,
        "use_sim_time": true
    },
    {
        "places": ["start_point", "L17_A"],
        "rounds": 1,
        "use_sim_time": true
    },
    {
        "places": ["start_point", "L18_A"],
        "rounds": 1,
        "use_sim_time": true
    }
]
```

# 5.結果
3章で設定した条件による配送シミュレーションの結果を以下の表に示します。結果として1時間以内に配送を完了できなかった時間帯はありませんでした。さらに1番時間のかかった8:00と10:00の時間帯において配送完了後にロボットの待機場所に戻る時間を加味してもプラス12分34秒で合計55分31秒となり、すぐに次の時間帯の配送作業に入れることが分かりました。

|時間帯  |配送場所①への荷物  |配送場所②への荷物  |配送場所③への荷物  |配送完了までにかかった時間  |1時間以内に処理できなかった荷物  |
|---|---|---|---|---|---|
|6:00| 0| 2| 3|23分22秒|なし|
|7:00| 5| 0| 1|24分56秒|なし|
|8:00| 9| 0| 0|42分57秒|なし|
|9:00| 3| 0| 0|14分07秒|なし|
|10:00| 9| 0| 0|42分57秒|なし|
|11:00| 2| 0| 0|5分46秒|なし|
|12:00| 0| 0| 0|---|---|
|13:00| 1| 0| 0|4分22秒|なし|
|14:00| 1| 0| 0|4分22秒|なし|
|15:00| 0| 1| 2|13分36秒|なし|
|16:00| 1| 0| 0|4分22秒|なし|
|17:00| 0| 0| 0|---|---|
|18:00| 1| 0| 0|4分22秒|なし|
|19:00| 0| 0| 0|---|---|

なお、それぞれの時間帯におけるロボットの軌跡を以下の図に示します。

6:00台
![0600position.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/4949ea02-61fb-52ed-bf53-b1fbe59bfa6a.png)

7:00台
![0700position.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/d889bd62-3fb4-8758-d712-f092a4021e17.png)

8:00台・10:00台
![0800position.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/9ee3338f-ad0d-42e6-d5c6-2e099a843b7d.png)

9:00台
![0900position.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/5af32041-a190-7643-4a48-ae5cc95b8d6b.png)

11:00台
![1100position.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/96448b97-fb95-5597-a958-f763c030942d.png)

13:00台・14:00台・16:00台・18:00台
![1300position.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/49ae0539-7294-4e13-d383-1194bea1520f.png)

15:00台
![1500position.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/e25df85d-82ed-218e-05bb-2885256e6606.png)

またシミュレーションをしているときの一部の動画を以下に示します。エレベータと連動してロボットが配送先への移動を終えた後、待機場所に戻ることが確認できます。

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

# 6. まとめ
　本記事では参考文献[[2]](#参考文献)における時間帯別の搬入貨物個数を参考に時間帯による搬入個数の差をロボットによる配送に反映したシミュレーションを行いました。結果として、設定した時間帯内で全ての荷物を配送できることが確認されました。（時間内に終わらなかった場合の次の時間帯への配送を含めたシミュレーションも考えていたため、少し残念な部分もあります。）
　ただし、前回も課題として挙げたように、このシミュレーションは什器の配置や人の動きによる外乱を考慮しておらず、ロボット配送には「理想的な状態」でした。そのため、外乱がある場合には、時間内に配送が完了しないことも考えられます。特にエレベーターの利用に関しては、人との競合が実際の環境では発生し、もっと時間がかかることが予想されます。次回以降は、こういった外乱をシミュレーションに取り入れることを考えています。
　また、配送経路の工夫が必要であることを示唆する事象も見られました。以下は6:00の時間帯におけるロボットの移動の軌跡の図です。赤枠で囲んだ部分は、配送先やエレベーターに向かう経路には含まれない場所ですが、tinyRobot_2がここに移動していたことが分かります。これは、tinyRobot_1と経路上で衝突する恐れがあったため、一時的に退避した結果だと考えられます。この事象はOpen-RMFの衝突回避機能が正しく働いたものであり、異常なことではありません。しかし、本シミュレーションではtinyRobot_1とtinyRobot_2が同じ経路を使用していたため、互いに干渉してしまったものと考えられます。そのため、ロボットごとに異なる経路を設定することで、配送時間のさらなる短縮が可能だと考えています。次回以降は、この点もシミュレーションに取り入れたいと思います。
 
![0600position_枠.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/c8c10894-af70-1d3e-69c7-7468683441e9.png)



# 参考文献
[1] [Open-RMFで複数ロボットとエレベータの連携をシミュレーションできる環境で、オフィスビルにおける簡単な館内配送シミュレーションをしてみた](https://qiita.com/bebebefu/items/6fc0ede2af08248fbfd6)
[2] 濱野百恵,南部世紀夫,小早川悟,田部井裕也: オフィスビルの映像記録を用いた館内貨物量調査の基礎的研究, 日本物流学会誌 第30号, pp.139-145, 2022.