Windows10 Pro(21H1)上のWSL2(Ubuntu18.04 ROS Melodic)とUbuntu18.04(ROS Melodic)でネットワーク接続し、共通のroscoreを使用する方法

# はじめに
Windows10 Pro(21H1)で使用しているWSL2を用いたUbuntu環境のネットワーク構成では、外部ネットワークに接続されているUbuntuと接続できない。
出来たとしても、片側のメッセージのみ可能などとの記事もあった。
WSL2で使用する仮想ネットワークと外部ネットワーク接続をするために以下の環境で確認を行った内容を記述します。

## 環境
- エディション：Windows 10 Pro
- バージョン：21H1
- OSビルド:19043.1645

## 概要
Windows10の内部で仮想ネットワークに接続されているWSL2と外部ネットワークに接続されているUbuntuを接続させます。
双方向でのTopicの送受信をさせます。
そのため、下記の図の順でネットワークの構成を変更させます。

:::note info
以下、コマンドで設定している内容は下記の図のIPアドレスを参考にしています。
各自のIPアドレス環境に置き換えて、設定を行ってください。
:::
### ネットワーク構成、変更図
![変更前](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/00b9493a-38e3-6dd2-8384-7994430137e4.jpeg "変更前")
:arrow_down:　:arrow_down:　:arrow_down:　変更後1　:arrow_down:　:arrow_down:　:arrow_down:
![スライド19.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/706872a5-f32a-69e2-632c-fc00a4248ce7.jpeg "変更後1")
:arrow_down:　:arrow_down:　:arrow_down:　変更後2(最終型)　:arrow_down:　:arrow_down:　:arrow_down:
![スライド20.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/ed3df9e4-306f-c157-5756-f8bdb0044677.jpeg "変更後2")

## Hyper-Vを有効にする
・Windows ボタンを右クリックし、[アプリと機能] を選択します
・右側の関連する設定にある [プログラムと機能] を選択します
・[Windows の機能の有効化または無効化] を選択します
・[Hyper-V] を選択して、[OK] をクリックします
![enable_role_upd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/7093f858-48db-3768-a6b1-d6e02e8553b1.png)

## Hyper-Vマネージャーの設定
1. ネットワークの設定を行うため、Hyper-Vマネージャーを「管理者として実行」して起動します。
![スライド6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/f3cdce86-14db-d234-19bd-e87d6928ec36.jpeg)
2. 「仮想スイッチマネージャー」を選択します。
![スライド7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/53ba5118-4f79-5300-461f-01e0738a3443.jpeg)
3. 「仮想スイッチ」の「WSL」を選択します。
![スライド8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/926a8a44-f85c-2171-282c-e21192f368a7.jpeg)
4. 「仮想スイッチのプロパティ」の「接続の種類」を「外部ネットワーク」にして適用を選択します。
![スライド9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/b1086783-3e3b-0654-4154-6dbbb659f2ff.jpeg)
以上の設定を行うことで、ネットワーク構成が、下の図のように変更されます。
物理NICが仮想NICに変更されます。
![スライド19.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/bda4c268-879f-92b8-7cb1-4f348beacf56.jpeg)

:::note warn
2022/05/28追記
適用ボタンを押した際に、下記のポップアップが表示される場合は、Hyper-Vマネージャーを「管理者として実行」していないので、Hyper-Vマネージャーの設定から再度設定してください。
![スライド10 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/f562fb0c-758b-b946-60bb-2d7b349e7f69.jpeg)
:::

:::note warn
2022/05/28追記
適用ボタンを押した際に、下記のポップアップが表示される場合
![スライド10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/50d9adc2-c032-555a-8392-6f84b46955e6.jpeg)
下記のネットワークのプロパティ設定になっている可能性があるため、「Hyper-V拡張可能仮想スイッチ」のチェックを外して再度、Hyper-Vマネージャーの設定から再度設定してください。(※画像はチェックが入っていますが、上記ポップアップが表示された場合は外してください)
![スライド15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/ae8ceaa9-cc12-24fc-fe1b-eaf131c978c3.jpeg)
「ウインドウズ」アイコンを右クリックし、「ネットワーク接続」を選択する
![スライド13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/d218e673-e5c6-efe7-0f53-2aebb15a69ac.jpeg)
「アダプターのオプションを変更する」を選択する
![スライド14.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/2cf57ccb-4a1b-342b-b4e7-ad16c0f8abc0.jpeg)
該当するイーサネットを右クリックし、「プロパティ」を選択する
![スライド15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/c6fd6865-83b9-0415-bc1a-38987c6de8b5.jpeg)
「Hyper-V拡張可能仮想スイッチ」のチェックを外して「OK」を選択する
:::

# WSL2内のeth0のネットワークアドレスを設定
 WSL2のターミナルにて下記のコマンドを入力することにより、下の図のようなネットワーク構成に変わり、WSL2のターミナルから外部ネットワークに接続されているUbuntuマシンにping疎通確認ができます。また、UbuntuマシンマシンからWSL2のeth0へのping疎通確認も可能となります。なお、Firewallの設定は不要です。
```console:wsl2
sudo ifconfig eth0 192.168.11.20
ip -4 a show eth0
```
```console:wsl2出力結果
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.1.20/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
```
![スライド20.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/629ef3c5-088c-18d2-4a67-36e639890dff.jpeg)
# ROS環境設定
WSL2が外部ネットワークと接続できるようになったため、ここでは、ROS1/2における環境設定の手順について記述します。なお、例として、ネットワーク構成は下図を元にしています。
**※vEthernet(WSL)については、Windows起動毎に異なるアドレスが割り振られるため、毎回環境設定が必要となる。**
![スライド20.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638129/63179b54-dbff-3f95-e709-c5ce1592964f.jpeg)


## ROS1環境設定
ROS1の開発環境において記述する。roscoreをUbuntuマシンで動かす前提で記載していますが、WLS2側でroscoreを動かすことも可能です。
まずはWSL2のターミナルで、下記のコマンドにて環境変数の設定をします。
```console:wsl2
export DISPLAY=192.168.11.18:0.0
export ROS_MASTER_URI=http://192.168.11.10:11311
export ROS_IP=192.168.11.20
```
Ubuntuマシンは、下記の環境変数の設定をします。
```console:Ubuntu
export ROS_MASTER_URI=http://192.168.11.10:11311
export ROS_IP=192.168.11.10
```
あとは、通常の使用方法(rosrunやroslaunch)でノードを起動すると、相互でTopicのやり取りができます。
また、rqtのTopic MonitorでTopicの内容がWindows(wsl2)とLinux双方でやりとりできていることが確認できると思います。
## ROS2環境設定
ROS2(Galacticで確認)の開発環境において記述します。
X Window Systemの設定のみWSL2のターミナルで必要となります。
```console:wsl2
export DISPLAY=192.168.11.18:0.0
```
あとは、通常の使用方法(ros2 runやroslaunch)でノードを起動すると、相互でTopicのやり取りができます。