WSL2の環境下において、Open-RMFを使って複数のturtlebot3を動かしてみた　現在地取得編

# 1. はじめに
[先日の投稿](https://qiita.com/bebebefu/items/ccbca44c24e285b3e30f)で[[1]](#参考記事やサイト)の記事を参考にWSL2の環境下において、Open-RMFを使って複数のturtlebot3を動かす環境を構築しました。本記事では同じようにWSL2の環境下において@yoshi-imaさんの[[2]](#参考記事やサイト)の記事を参考にFree Fleet ServerとOpen-RMFを接続し、turtlebot3を制御できるか試してみます。

**注：** 
本記事ではturtlebot3の現在地の取得までの手順を記載していますが、Free Fleet ServerとOpen-RMFを接続してturtlebot3を動かす部分については、今後の課題としています。

# 2. 実行環境
- CPU: CORE i7 7th Gen
- メモリ: 32GB
- GPU: GeForce RTX 2070
- OSと構築した環境: Window11でWSL2にUbuntu20.04をインストールした環境
- ROS: ROS/ROS 2の混在環境で、ROSは Noetic, ROS 2はFoxy

# 3. 手順
基本的には[[2]](#参考記事やサイト)の手順に従って進めましたが、ここでは私が困ったポイントや気づいたことを記載していきます。

## 3.1. SLAMの地図データのpng変換
Visual Visual Studio Codeのpluginである、PBM/PPM/PGM Viewer for Visual Studio Codeを使ってSLAMの地図データをpng変換しました。
![スクリーンショット 2023-12-29 080218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/368154bd-f3d2-41d0-b596-54e94ab1d9f4.png)

変換したファイルの保存先は[[2]](#参考記事やサイト)の記事と同じです。

## 3.2. Traffic Editorによる経路設定
ちなみに、初めて経路を設定する際、何も考えずにやってしまったため、次の表示になりました。明らかに原点がずれていることが分かります。
![スクリーンショット 2024-01-03 140524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/cc19aa63-ad76-120a-361a-ebcf4875b72d.png)

では、どのように問題を解決していったかを、Traffic Editorでの経路設定の手順も含めて以下で説明します。なお、Traffic Editorの使い方の詳細は[[3]](#参考記事やサイト)や[[4]](#参考記事やサイト)を参照された方がよいです。以下の手順は個人的なアプローチです。

### 3.2.1. ロボット地図の読み込み
まずは先ほどpngファイルに変換した地図データをTraffic Editorに読み込みます。私の調査によると原点は地図の左上端に設定されるそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/18b75fdc-2902-fb79-da2a-8a6a0e8d21fe.png)
**注：** [[2]](#参考記事やサイト)とは異なり、この記事では「Level Name」を「house」にしています。

この読み込んだ地図データを動かして原点合わせを試みましたが、うまくいきませんでした。そこで、GitHubのissueの[[5]](#参考記事やサイト)を読んで、「levels」ではなく「layer」に地図データを読み込んで、その地図データを動かすことで原点合わせを行うことにしました。

- layerへの地図データの読み込み
　以下の手順で地図データを読み込んでいきます
    - 赤枠で囲んだ「layer」を選択
    - 緑枠で囲んだ「add」をクリック
    - 黄色枠で囲んだダイアログが出る
    - ダイアログで先ほどpngファイルに変換した地図データを選択してOKをクリック
    - 赤い線で描かれた地図データがTraffic Editorに読み込まれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/7fa7b8e8-0017-2e6e-e221-53fca7634bb6.png)


- 縮尺の変更
👆の図ではわかりにくいですが、赤い線で描かれた地図データの左上に少し見える白い四角がlevelsのタブで読み込まれている地図データです。それと縮尺を合わせるため、ダイアログの「Meter per pixel」の箇所に適切な数値を入力して、元の図と合わせます（下図参照）。
**注：**　私の環境では、Traffic Editorを何回か開くと、なぜか元の図の縮尺が変わってしまうという現象が発生しました。
![スクリーンショット 2024-01-04 135356.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/606e110d-cc35-7192-05aa-9e390b9378ac.png)

- 原点合わせ
ダイアログの「X translation (meters)」と「Y translation (meters)」に適切な数値を入力し、以下の図のようにずらして、元の環境の原点と地図データの原点を合わせました。
![スクリーンショット 2024-01-04 135553.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/f8e14378-a377-68d7-bd1a-d3740f7e07fc.png)

### 3.2.2. 地図の設定と経路設定
- 壁の設定
以下の図で赤枠で囲んだ「Adding a wall」のアイコンをクリックして地図データの壁をなぞるようにして壁を設定しました。紫色の線で示されていることが下の図から分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/21f700c4-7998-632f-00c6-51ddd9aa46be.png)

- Waypointの設定
以下の図で赤枠で囲んだ「Adding a vertex」のアイコンをクリックして、ロボットを移動させたいWaypointを設定しました。なお、それぞれのWaypointにはTraffic Editorの画面の右下にある「Add Property」から、各Waypointの特性を付与する必要があります。特に後述するレーンの設定では、レーンで接続されたWaypointのうち、一つはis_charger=trueである必要があるそうです（[[4]](#参考記事やサイト)の記事より）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/04d78cad-cb43-8fb7-9d26-4e2a35489ab1.png)

- レーンの設定
以下の図で赤枠で囲んだ「Add lane」のアイコンをクリックして、先ほど設定したWaypointをつなげると下の図のように緑の太い線が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/754ba9be-6d6a-89b5-e754-bf7d69a62179.png)
最初の状態では矢印が表示されていますが、以下の図で赤枠で囲んだ「bidirectional」をtrueにすることで、その矢印が消え、双方向に走行できるようになるようです（ただし、これはまだ私のほうで検証できていない情報です）。この手順で全ての点をつないでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/4613ae61-377d-f3a3-a069-12bc16dbe3ca.png)

- 縮尺の設定と床の設定
縮尺の設定については、以下の図で赤枠で囲んだ「Adding a measurement」のアイコンをクリックし、地図上の適切な線と同じ長さの線を引いて、その線の長さを入力します。これにより、「画像ファイルの１ピクセルが何メートルであるかが計算されます」（[[4]](#参考記事やサイト)の記事より）。
　
 次に、床の設定については以下の図で青枠で囲んだ「Adding a floor」のアイコンをクリックし、床の部分の範囲を設定していきます。今回は以下の図で赤で塗りつぶされている部分を床として設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/4d8fb185-2488-e823-c647-28e4a5e181d0.png)

### 3.2.3. 保存とbuild
[[2]](#参考記事やサイト)の記事と同じように「house.building.yaml」というファイル名でファイルを保存しました。また「house.project.yaml」を以下の内容で作成し、「house.building.yaml」と同じところに保存しました。
```:house.project.yaml
building:
  filename: house.building.yaml
name: house
traffic_maps:
  {}
version: 1
```
最後に、以下のコマンドを実行してcolcon buildして経路設定を完了させました。

```:terminal
cd ~/Work/open-rmf/free_fleet/ros2
source install/setup.bash
colcon build --symlink-install
```

## 3.3. turtlebot3のスペック設定
[[2]](#参考記事やサイト)の記事の「車両スペック」の節と同じようにturtlebot3の公式HPを参考に設定を試みました。ただし、私の方ではまだうまくいってない箇所があるようでしてここでは詳細の記載は見送り、次回以降の課題としたいと思います。

## 3.4. Fleet Adapterの設定
[[2]](#参考記事やサイト)の記事の「Fleet Adapterと接続」の節と同じようにOpen-RMFとFleet Adapterの起動用launchファイルを作成しました。なお、私の環境ではFleet Name = "turtlebot3"としました。

# 4. 実行
実行の手順は[[2]](#参考記事やサイト)の記事の「実行手順」と同じように以下のコマンドを順次実行しました。
```:terminal(1)
cd ~/Work/open-rmf/free_fleet/ros1
source install/setup.bash
export TURTLEBOT3_MODEL=burger; roslaunch ff_examples_ros1 multi_turtlebot3_ff.launch
```
```:terminal(2)
cd ~/Work/open-rmf/free_fleet/ros2
source install/setup.bash
ros2 launch ff_examples_ros2 turtlebot3_world_ff_server.launch.xml
```
```:terminal(3)
cd ~/Work/open-rmf/free_fleet/ros1_bridge_ws
source /opt/ros/noetic/setup.bash
source /opt/ros/foxy/setup.bash
source install/setup.bash
ros2 run ros1_bridge dynamic_bridge
```
```:terminal(4)
cd ~/Work/open-rmf/free_fleet/ros2
source install/setup.bash
ros2 launch rmf_demos house.launch.xml
```

これらのコマンドを実行した後に表示されたrvizの画面は以下です。
ピンク色の印がロボットの現在位置で、黄色がOpen-RMF側で計画している位置とのことですので、現在地取得はできているようです。
![スクリーンショット 2024-01-04 183614.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/ae530f82-585e-d6f5-5970-f7cc87506492.png)

# 5. まとめと課題
WSL2の環境でもFree Fleet ServerとOpen-RMFを接続し、複数のturtlebot3の現在地を取得できたと考えられます。ただし、以下のコマンドを実行して動かそうとしましたが、turtlebot3が全く動作しませんでした。現在の考えでは、ロボットの設定がturtlebot3に適していないことが原因ではないかと考えていますが、まだ全然わかりません。。。次回以降はこの課題に取り組んでいく予定です。

```:terminal
cd ~/Work/open-rmf/free_fleet/ros2
source install/setup.bash
ros2 run rmf_demos_tasks dispatch_loop -s goal0 -f goal1 --use_sim_time
```
また、rviz上では元の地図データが表示されており、経路とのずれが目立ってしまっています。見た目があまり良くないため、この問題にも次回以降対応していきたいと考えています。


👆turtlebot3が全く動作しなかった件の解決方法を、[WSL2の環境下において、Open-RMFを使って複数のturtlebot3を動かしてみた　移動編](https://qiita.com/bebebefu/items/25b162dd5a634cae77f7)にまとめました。

👆本件に関連してブラウザ経由でturtlebot3を制御した件を、[WSL2の環境下において、Open-RMFを使って複数のturtlebot3を動かしてみた　ブラウザから指示編](https://qiita.com/bebebefu/items/ff7839dce4f1db3e336e)にまとめました。

# 参考サイト
[1][ロボット群制御：環境構築 〜 ROS/ROS 2混在環境で、Open-RMFを使って複数のturtlebot3を動かしてみた](https://qiita.com/yoshi-ima/items/1fd7a6c9fee4f0ab3171)
[2][ロボット群制御：実践編 ～ ROS/ROS 2混在環境でOpen-RMFを使って複数のturtlebot3を動かしてみた](https://qiita.com/yoshi-ima/items/153fd05ef40955d03503)
[3][Traffic Editor](https://osrf.github.io/ros2multirobotbook/traffic-editor.html)
[4][クラウドで動くOpen-RMFシミュレーション環境を作ってみた](https://tech.aptpod.co.jp/entry/2023/08/07/100000)
[5][Map image does not move](https://github.com/open-rmf/rmf_traffic_editor/issues/420)