【WSL2 + Docker + Ubuntu 22.04】megarover3 Ver3.0を接続する方法【ROS 2】

# 本記事の対象者
WSL2上のDocker上のUbuntu22.04コンテナを実行しROS2を使ってメガローバーVer3.0を制御したい方向けの記事です。
![メガローバー (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/710848/a99aee2e-e0c0-031d-09b2-bcadd88c559e.gif)
# はじめに
メガローバー Ver3.0をROS2を使って制御します。詳しい製品情報は以下を御覧ください
[ヴイストン株式会社 メガローバー Ver3.0](https://www.vstone.co.jp/products/wheelrobot/ver.3.0_normal.html)
またヴィストン株式会社が公開しているリポジトリを利用してメガローバーVer3.0を制御します。加えてご確認ください。
[GitHub repository メガローバー Ver3.0　ROS2パッケージ](https://github.com/vstoneofficial/megarover3_ros2)

### 本記事で使用するDocker imagesについて
本記事では[Tiryoh](https://github.com/Tiryoh)さんが作られた`ROS2`の`Docker`環境を利用します。
https://github.com/Tiryoh/docker-ros2-desktop-vnc
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/710848/a70034f2-c8ba-2b3b-9eb1-14b8b1f91c7d.png)

# 私のPC構成
Windows 11 Home
Intel Core i7 11390H
メモリ 16GB
Ubuntu-20.04 WSL

:::note warn
この記事を読み進めるにあたって
「Windows11」➡「WSL2」➡「Ubuntu20.04」➡「Docker」➡「Ubuntu22.04 (tiryohさんのDocker image)」で本記事は進みます。

本記事では誤解を招く表現を避けるため以下の言葉を使用します。
* WSL2上のUbuntu20.04 ➡ **WSL2 Ubuntu**
* Docker上のUbuntu22.04 ➡ **Docker Ubuntu**
:::

# メガローバーをDocker Ubuntuで制御できるようにする
まずWindowsPC本体に`メガローバーVer3.0`のUSBを接続します。しかし、接続しただけでは`WSL2 Ubuntu`に認識はしません。そのため`Powershell`を使って`WSL2 Ubuntu`にメガローバーの接続情報をパスしましょう。
## 手順①Powershellを管理者で開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/710848/daee9f5c-b0b9-d91f-837b-8a5d218dbb3a.png)

:::note warn
注意
Powershellを開く前にメガローバーVer3.0はPC本体と接続しておいてください。
:::

## 手順② シリアルポート情報をWSL2 Ubuntuに渡す
シリアルポート情報を`WSL2 Ubuntu`に渡します。この作業をしなければWindows側でシリアルポートを利用する設定になってしまい`WSL2 Ubuntu`に情報が行き届きません。

でははじめにMicrosoft社の`WSL2`の公式ページを参考にしてUSBIPDパッケージをWindows本体にインストールしてください
[USBIPD-WIN プロジェクトをインストールする](https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb#install-the-usbipd-win-project)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/710848/2a89439a-778c-3fec-dfe0-73f436742bf3.png)
このリンクを押して、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/710848/8ebe403b-8fe5-0e7e-06c5-4197f31d1116.png)
最新版の`usbipd-win_xxx.msi`をダウンロードしてインストールしてください。

**インストール完了後**以下の操作を続行してください。
```:Powershell
usbipd wsl list
```
この入力をした後に`USB Serial Converter`と書かれているものを見つけてください。**その行のBUSIDの番号を使います**
次に
```:Powershell
例）usbipd wsl attach --busid 2-1
```
のようにコマンドの語尾の数字を`BUSID`の数字にしてください。
するとWindows11 のパン↑ポン↓という音がなってWSL2 UbuntuにUSB情報が行きます。

## 手順③ WSL2 Ubuntuで接続確認を行う
`WSL2 Ubuntu`で正しくシリアルポート接続が完了したか確認します。
```:bash
lsusb
```
この時に`Serial Converter`が存在していると正しく接続できています。

:::note warn
注意
毎回PCにメガローバーのUSBを指す度にこの操作を行って接続確認をおすすめします。
:::

## 手順④ シリアルポート接続ができるDocker container作成
`Docker`のコンテナを作成するときにシリアルポート接続を有効にしなければなりません。
本記事では`Tiryoh`さんの`Docker images`を利用し、そのオプション機能として`tty/USB0`を有効にしてコンテナを作成します。

以下の操作を行ってください。
```:bash
sudo docker run -p 6080:80 --security-opt seccomp=unconfined --shm-size=512m tiryoh/ros2-desktop-vnc:humble --device=/dev/ttyUSB0:/dev/ttyUSB0
```

初回の方は10分程度時間がかかってコンテナが作成されると思います。
これで`tty/USB0`が使えるコンテナが作成されました！！！

## 手順⑤ Docker Ubuntuでtty/USB0を有効化
ラストの操作です！
DockerのコンテナをGUI操作するために`Docker run`した状態で以下のローカルアドレスにアクセスしてください。
http://127.0.0.1:6080/
> 二回目以降Docker runする場合は $ sudo docker start <container id>です

するとGUIのUbuntuが表示されます。そしてターミナルで以下を入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/710848/b81f6c89-acd5-c8c5-b257-1793a5ef5ba7.png)
これでエラーが出なければ完了です。
お疲れさまでした！！！

# メガローバー Ver3.0を操作
以下の`README.md`を参考にしてDocker Ubuntuにインストールしてください。

https://github.com/vstoneofficial/megarover3_ros2#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95　

有線シリアル接続が問題なく成功すると`teleop`などが使えるようになりました。

私の場合はインストールがすべて終わった状態で以下の操作で簡単にできました。
```:bash
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0
ros2 launch megarover3_bringup_mouse_teleop.launch.py
```

# 最後に
WSL2は完全なるLinuxカーネルが使えるため、個人的にデュアルブートしなくてもよくなるという点がとても魅力的に思いました。
今後もAI ロボット開発に注力するのでよければフォローやいいねなどお願いいたします。

ご購読いただきありがとうございました。不明点がございましたらコメント欄にて教えていただけると幸いです。