「WSL2のROS2ノード」と「外部PCのROS2ノード」を通信する方法

お疲れ様です。秋並です。

最近、WSL2のアップデートでミラーモードが追加され、「WSL2のROS2ノード」と「外部PCのROS2ノード」で通信できるようになったので、今回はその手順について解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/4f626252-2ee0-543c-db9d-05214460c730.png)

https://x.com/akinami_robo/status/1780976220429316182

## 前提条件
- WSL2がインストールされている
- WSL2にROS2がインストールされている
- 外部PCのOSはubuntu
- 外部PCにROS2がインストールされている

# wslのアップデート
コマンドプロンプトを起動し、以下コマンドでWSLをアップデートします。
```bash
wsl --update
```
```bash
wsl --update --pre-release
```

# ネットワークの設定
windowsの`C:\Users\<ユーザ名>\`内の`.wslconfig`に以下を記載し、ネットワークモードをミラーモードに設定してください。

```plaintext
[wsl2]
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
```

::: note
よくあるミスとして、新規作成した「.wslconfig」に拡張子がつき、「.wslconfig.txt」となってしまい、設定が正しく反映されないことがあります。

そのため、下画像のように「ファイル拡張子」と「隠しファイル」を表示するようにし、不要な拡張子がついていないことを確認してください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/b5837c02-51ed-5e03-3124-3bf0a847512c.png)


:::

<br>

ファイルを保存したら、WSLを再起動します。
```bash
wsl --shutdown
```

# ファイアウォールにルールを追加する
上記でWSL側の設定は完了しましたが、このままだとファイアウォールの影響で外部PCとの通信が出来ません。

ファイアウォールを無効化すれば通信できますが、それだとセキュリティ的に不安なので、ここでは「外部PCとのみ通信可能とする」ファイアウォールの規則を追加します。

::: note warn
以下の手順がセキュリティ的に最適であるかは保証できないので、自己責任で実施してください。
:::

1．「コントロールパネル」を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/f6656414-3b83-49e2-2ccf-1fb356631320.png)
<br>

2． 画面左の「詳細設定」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/cbd037bf-c04d-9a3d-cd37-331a90d06070.png)

<br>

3．画面左の「受信の規則」をクリックし、画面右の「新しい規則」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/9f0e809f-36e6-4479-a480-5468857938e3.png)


<br>

4．「カスタム」を選択し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/825ccffa-3be4-09b3-ceab-ef9c49b45a3c.png)

<br>


5．「すべてのプログラム」を選択し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/bd9fa017-a63c-bfd2-7540-d781302a448b.png)

<br>

6．ROS2はUDPで通信を行っているため、「プロトコルの種類」を「UDP」に設定し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/90491de5-019c-9025-cfb8-f7cc9dfa15a4.png)

<br>

7．規則を適用するローカルIPアドレスに「windows側のIPアドレス」、リモートIPアドレスに「外部PC側のIPアドレス」を設定し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/84d01c92-a5e4-51cd-dff8-4348f42576cf.png)

<br>

8．「接続を許可する」を選択し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/7971adab-48ad-a222-62dd-c558d80b0801.png)

<br>

9．プロファイルの項目はデフォルトのままでよいので、そのまま「次へ」をクリックします。<br>
10． 「名前」に適当な規則名を入力し、「完了」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/d8c98c24-c9af-7e90-5823-2190e70575ff.png)

# 外部PCとの通信テスト
設定が完了したら、実際に「WSL2のROS2ノード」↔「外部PCのROS2ノード」で通信が出来るか確認しましょう。
<br>

WSL2側で、パブリッシャーのデモノードを起動します。
```
ros2 run demo_nodes_py talker
```

<br>

次に、外部PC側でサブスクライバのデモノードを起動します。
```
ros2 run demo_nodes_py listener
```

<br>

以下のように、外部PC側でメッセージをサブスクライブできればOKです。
```
[INFO] [1713533822.642729403] [listener]: I heard: [Hello World: 0]
[INFO] [1713533823.588779235] [listener]: I heard: [Hello World: 1]
[INFO] [1713533824.589133316] [listener]: I heard: [Hello World: 2]
[INFO] [1713533825.589290284] [listener]: I heard: [Hello World: 3]
[INFO] [1713533826.589316555] [listener]: I heard: [Hello World: 4]
[INFO] [1713533827.588612880] [listener]: I heard: [Hello World: 5]
[INFO] [1713533828.589711246] [listener]: I heard: [Hello World: 6]
```

# さいごに
今回は、
「WSL2のROS2ノード」と「外部PCのROS2ノード」を通信する方法
について解説しました。<br>

今までは、「外部PCのROS2ノード」と通信する時だけバーチャルボックスを使うなどしていましたが、今回のミラーモードの登場でWSL2でROS2を使用する際の不満点はほとんどなくなったかなと思ってます。