お疲れ様です。秋並です。
最近、WSL2のアップデートでミラーモードが追加され、「WSL2のROS2ノード」と「外部PCのROS2ノード」で通信できるようになったので、今回はその手順について解説します。
前提条件
- WSL2がインストールされている
- WSL2にROS2がインストールされている
- 外部PCのOSはubuntu
- 外部PCにROS2がインストールされている
wslのアップデート
コマンドプロンプトを起動し、以下コマンドでWSLをアップデートします。
wsl --update
wsl --update --pre-release
ネットワークの設定
windowsのC:\Users\<ユーザ名>\
内の.wslconfig
に以下を記載し、ネットワークモードをミラーモードに設定してください。
[wsl2]
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
ファイルを保存したら、WSLを再起動します。
wsl --shutdown
ファイアウォールにルールを追加する
上記でWSL側の設定は完了しましたが、このままだとファイアウォールの影響で外部PCとの通信が出来ません。
ファイアウォールを無効化すれば通信できますが、それだとセキュリティ的に不安なので、ここでは「外部PCとのみ通信可能とする」ファイアウォールの規則を追加します。
以下の手順がセキュリティ的に最適であるかは保証できないので、自己責任で実施してください。
3.画面左の「受信の規則」をクリックし、画面右の「新しい規則」をクリックします。
5.「すべてのプログラム」を選択し、「次へ」をクリックします。
6.ROS2はUDPで通信を行っているため、「プロトコルの種類」を「UDP」に設定し、「次へ」をクリックします。
7.規則を適用するローカルIPアドレスに「windows側のIPアドレス」、リモートIPアドレスに「外部PC側のIPアドレス」を設定し、「次へ」をクリックします。
9.プロファイルの項目はデフォルトのままでよいので、そのまま「次へ」をクリックします。
10. 「名前」に適当な規則名を入力し、「完了」をクリックします。
外部PCとの通信テスト
設定が完了したら、実際に「WSL2のROS2ノード」↔「外部PCのROS2ノード」で通信が出来るか確認しましょう。
WSL2側で、パブリッシャーのデモノードを起動します。
ros2 run demo_nodes_py talker
次に、外部PC側でサブスクライバのデモノードを起動します。
ros2 run demo_nodes_py listener
以下のように、外部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ノード」を通信する方法
について解説しました。
今までは、「外部PCのROS2ノード」と通信する時だけバーチャルボックスを使うなどしていましたが、今回のミラーモードの登場でWSL2でROS2を使用する際の不満点はほとんどなくなったかなと思ってます。