ロボットがエレベータに乗れない！Open-RMFでロボットとエレベータの連携をシミュレーションできる環境を構築したのに。。。　～調査結果と解決策～

# 1. はじめに
　いままで「WSL2環境下で構築したOpen-RMFで複数ロボットとエレベータの連携をシミュレーションできる環境で遊んでみる　〇〇編」とか「Open-RMFで複数ロボットとエレベータの連携をシミュレーションできる環境で、オフィスビルにおける簡単な館内配送シミュレーションをしてみた　その〇」など、いくつかのOpen-RMF関連の記事を書いてきました。
　これらの環境は[rmf demos](https://github.com/open-rmf/rmf_demos/tree/humble)で公開されているOffice WorldやClinic Worldの設定をコピーして構築したものです。その時は特段ロボットとエレベータの連携についてのエラーは出ませんでした。しかし、今回新たな環境を構築しシミュレーションを行おうとしたところ、ロボットがエレベータに乗れないという問題が発生しました。
 　なぜこのようなことが起こったのか、どう解決したのかを調査・検証したのがこの記事の内容になります。

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

# 3. 起きたトラブル
今回構築した環境は[WSL2の環境下において、Traffic-Editorを使って複数ロボットとエレベータの連携をシミュレーションできる環境を構築してみた](https://qiita.com/bebebefu/items/32dcb43db1213e1a00e0)で構築した環境とほぼ一緒です。ただ、エレベータの名前を以下の図のように「EV1」としました。（これが良くなかったということが後々わかりました。。）

![Screenshot from 2024-07-14 10-49-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/785f6e5b-f31d-12f8-1937-d5f942c54ca1.png)

そして、シミュレーション環境を起動し、ロボットにエレベータを使って上の階に行くよう指示を出しました。ところが、エレベータに乗ろうとしたところ、ロボットがエレベータのドアの手前で止まり、それ以上動かなくなりました（下図参照）

![Screenshot from 2024-07-14 10-48-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/2cd2aab1-7e75-9707-32fe-e5377260af2e.png)

ロボットがエレベータの前に来ると、エレベータのドアは開き、rvizにもステータスが"Open"と表示されます（下図参照）。しかし、ロボットはそれ以上進みません。

![Screenshot from 2024-07-14 10-52-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/54dbcc4b-91c2-9e87-4d31-54556ed7aae1.png)


# 4. 似たようなトラブルの調査結果
　似たようなトラブルが報告されていないか調べてみましたところ、以下の記事に行き当たりました。

https://github.com/open-rmf/rmf/discussions/463

　この記事でもロボットはエレベータのドアの前で止まってしまうという事象が報告されていました。それに加えrviz上でエレベータが表示されない事象についての報告もありました。
 
　これらの解決策として、「シミュレーションを起動する際に、initial_map:=<マップ名>という引数を追加すること」と「エレベータの名前をLift〇とすること」が提示されていました。
私の環境ではinitial_mapの設定はデフォルトのL1にしていたので、あまり関係はないと思い、エレベータの名前を変えることが対策になると考えました。

# 5. エレベータの名前修正によるトラブル解決
4章で述べた「エレベータの名前をLift〇とすること」について、traffic-editorを使い、以下のようにエレベータの名前を「Lift1」に修正しました。

![Screenshot from 2024-07-14 10-58-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/6ea15f17-0e6a-6520-f6ed-0fb800fc9181.png)

そうしたところロボットは止まることなく、以下の図のようにエレベータに乗り上の階への垂直移動に成功しました。

![Screenshot from 2024-07-14 11-03-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/29196f9a-f6a7-5d42-797d-8ad55b6cd381.png)

またエレベータの名前を以下のように「lift_1」としても、ロボットとエレベータは問題なく連携し、ロボットは上の階への垂直移動に成功しました。

![Screenshot from 2024-07-14 10-58-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/c6b6509f-f03e-4ee4-a73f-5d60e1dbce33.png)

# 6. rvizでエレベータの状態が表示できないことについての検証
https://github.com/open-rmf/rmf/discussions/463 の記事でrviz上でエレベータが表示されない事象についても報告されており、その原因としてinitial_mapの設定がデフォルトのL1とは異なることが挙げられていました。そこで私の環境でも、以下の図の赤枠で囲んだ部分のようにinitial_mapの設定を「L3」としました。

![Screenshot red.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/7cf0471d-f06c-657f-661a-32e2693423ed.png)

またエレベータの設定も以下のようにフロア名の変更を反映しました。
![Screenshot from 2024-07-14 11-06-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/d221cfc0-81b4-44ba-b6a1-49c487864037.png)

そしてinitial_map:=<マップ名>という引数を**追加せずに**シミュレーション環境を以下のコマンドで実行したところ、

```:terminal
ros2 launch rmf_demos_gz_classic evtest.launch.xml
```

rvizの表示は以下のようになりました。本来であれば、図の赤枠で囲んだ部分に薄青色の箱でエレベータの状態が表示されるはずですが、何も表示されませんでした。

![Screenshot from 2024-07-14 11-07-31 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/bcff787b-c085-98c9-4b04-08cf9f9b6f85.png)

**ただ、この状態でもエレベータの名前をLift〇もしくはlift〇としておけば、ロボットとエレベータの連携には問題はなく、ロボットは垂直移動できました。**

次に、initial_map:=<マップ名>という引数を**追加して**シミュレーション環境を以下のコマンドで実行したところ、

```:terminal
ros2 launch rmf_demos_gz_classic evtest.launch.xml initial_map:=L3
```

rvizの表示は以下のようになりました。先ほど何も表示されていなかったところに、薄青色の箱でエレベータの状態が表示されています。またロボットとエレベータの連携にも問題はありませんでした。

![Screenshot from 2024-07-14 11-10-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/a58d11f8-3e83-ba1a-4df3-bbc65f62bf47.png)

これらのことから、https://github.com/open-rmf/rmf/discussions/463 の記事で述べられていた「rviz上でエレベータが表示されない事象」を私の環境でも再現でき、その解決法についても検証することができたと考えられます。

# 6. まとめ
Open-RMFで構築したロボットとエレベータの連携をシミュレーションできる環境では以下の設定が必要であることが分かりました。

- **エレベータの名前:** エレベータの名前は「Lift〇」または「lift〇」とする
- **rviz上でエレベータの状態を表示する設定:** rviz上でエレベータの状態を表示するためには、initial_mapの設定を「L1」とするか、initial_map:=<マップ名>という引数を追加してシミュレーション環境を起動する

これらの設定については、Open-RMFやtraffic-editorのドキュメントに記載されているかもしれませんが、私は見つけられなかったため、ここに記載しました。この情報が皆さんの役に立てば幸いです。