TL;DR
この文書では、rmw_zenohをつかってNAT越えROS通信を実現する方法を解説します。
Zenohとは
Zenohは、様々な規模のデバイスやシステム間で効率的に通信を行うための軽量で高性能な通信プロトコルです。以下の特徴があります:
- 超低遅延:マイクロ秒オーダーの遅延で通信可能
- スケーラブル:小規模なIoTデバイスから大規模なクラウドシステムまで対応
- NAT/ファイアウォール越え:複雑なネットワーク構成でも通信可能
- プラグイン可能:DDS、MQTT、RESTなど様々なプロトコルと連携
とにかく軽くて、かなり何でもつながる凄いプロトコルです。
より詳しい説明は@Shintaro_Hosoaiさんのこちらの記事や@takasehidekiさんのこのプレゼン等を参照ください。
Zenoh Routerと呼ばれるサーバを用いることで、遠隔地の別ネットワークのPC同士でもpub/sub通信させることができます。また、MQTTやOPC-UAの様なPLCで使う通信規格や各種DBとも通信が可能です。
rmw_zenohの位置づけ
rmw_zenoh_cppは、ROS2のRMW(ROS Middleware)層の実装の一つです。従来のDDS実装(FastDDS、CycloneDDS等)と同様に、ROS2の通信層として機能します。
主な利点:
- NAT越え通信が容易
- ファイアウォール設定の簡略化(通常は7447ポートのみ開放で済む)
- 低遅延・高スループット
- リソース消費が少ない
似たようなソリューションとして、zenoh-ros2-ddsがありますが、今回は割愛します。
今回の動作環境
以下が今回の動作検証環境です。
OS | Ubuntu 24.04 |
ROS | Jazzy |
zenohd | 1.5.1 |
rmw_zenoh | 0.2.5 |
準備する物
以下の3つを用意してください。
- Server
- Zenoh Routerを動かします。VPSやAWS/Azureなどを利用して適当なサーバを用意
- ドメインやグローバルIPで参照可であることが必要
- Ubuntuがインストール済み・SSHでアクセス可能
- 他にはこの記事で使用しているZetta platformで準備しても問題ありません(TLSの設定が必要であるため、configファイルはZetta Platformからダウンロードした物をRouterモード用に書き換えて使用のこと)
- PC1 , PC2
- Nat超えできたことが確認できるよう別々のルーター配下にあるPCが望ましい
- ROS 2はインストール済みであるとします
以降それぞれをServer、PC1 ,PC2と呼称します。
Server、PC1 ,PC2にはそれぞれUbuntuインストール済みであるとします。
構成図
必要なソフトのインストール・設定
Serverの準備作業
Zenoh Router(zenohd)のインストールします。以下をターミナルで実行して、zenohdをインストールしてください。
# gpgキーの追加
$ curl -L https://download.eclipse.org/zenoh/debian-repo/zenoh-public-key | sudo gpg --dearmor --yes --output /etc/apt/keyrings/zenoh-public-key.gpg
# リポジトリの追加
$ echo "deb [signed-by=/etc/apt/keyrings/zenoh-public-key.gpg] https://download.eclipse.org/zenoh/debian-repo/ /" | sudo tee -a /etc/apt/sources.list > /dev/null
$ sudo apt update
$ sudo apt install zenoh
加えて、サーバーのポート開放を適切に行ってください。(7447,7446の開放が必要です。)
PC1, PC2の準備作業
以下の作業はPC1, PC2でそれぞれ実施してください。
rmw_zenohのインストール
以下のコマンドで、rmw_zenohをインストールしてください。
sudo apt install ros-jazzy-rmw-zenoh-cpp
zenoh_config.json5 の設置
zenoh_config.json5を作成して、適当なディレクトリ( /home/user/
など)に置いてください。
ファイル内のYOUR_SEVER_IP_OR_DOMAINにはServerのIPやドメインに書き換えてください。
{
mode:"router",
connect: {
endpoints: [
"tcp/YOUR_SEVER_IP_OR_DOMAIN:7447"
],
},
}
NAT超え通信実行
Serverの操作
以下のコマンドでZenohdを起動します
zenohd
PC1での操作
# terminal 1
export ZENOH_ROUTER_CONFIG_URI=/home/user/zenoh_config.json5
export RMW_IMPLEMENTATION=rmw_zenoh_cpp
ros2 run rmw_zenoh_cpp rmw_zenohd
# terminal 2
export RMW_IMPLEMENTATION=rmw_zenoh_cpp
ros2 run demo_nodes_cpp talker
terminal 2でのコマンドの実行後以下のように表示されれば成功です。
$ ros2 run demo_nodes_cpp talker
[INFO] [1758206190.018846912] [talker]: Publishing: 'Hello World: 1'
[INFO] [1758206191.019050799] [talker]: Publishing: 'Hello World: 2'
[INFO] [1758206192.018827630] [talker]: Publishing: 'Hello World: 3'
[INFO] [1758206193.018850205] [talker]: Publishing: 'Hello World: 4'
[INFO] [1758206194.019190562] [talker]: Publishing: 'Hello World: 5'
[INFO] [1758206195.019011297] [talker]: Publishing: 'Hello World: 6'
[INFO] [1758206196.019057942] [talker]: Publishing: 'Hello World: 7'
[INFO] [1758206197.018831966] [talker]: Publishing: 'Hello World: 8'
[INFO] [1758206198.019050867] [talker]: Publishing: 'Hello World: 9'
[INFO] [1758206199.018851747] [talker]: Publishing: 'Hello World: 10'
PC2での操作
# terminal 1
export ZENOH_ROUTER_CONFIG_URI=/home/user/zenoh_config.json5
export RMW_IMPLEMENTATION=rmw_zenoh_cpp
ros2 run rmw_zenoh_cpp rmw_zenohd
# terminal 2
export RMW_IMPLEMENTATION=rmw_zenoh_cpp
ros2 run demo_nodes_cpp listener
terminal 2での実行後、以下のように表示されればServerで動作しているZeonh Routerを介して通信に成功しています。
$ ros2 run demo_nodes_cpp listener
[INFO] [1758120201.717442377] [listener]: I heard: [Hello World: 8]
[INFO] [1758120202.768131475] [listener]: I heard: [Hello World: 9]
[INFO] [1758120203.818773596] [listener]: I heard: [Hello World: 10]
[INFO] [1758120204.869163987] [listener]: I heard: [Hello World: 11]
[INFO] [1758120205.919808983] [listener]: I heard: [Hello World: 12]
[INFO] [1758120206.971777424] [listener]: I heard: [Hello World: 13]
[INFO] [1758120208.022506364] [listener]: I heard: [Hello World: 14]
[INFO] [1758120209.072695260] [listener]: I heard: [Hello World: 15]
まとめ
rmw_zenohを使用して、遠隔地のネットワーク設定なしにNAT越えのROS2通信が実現する方法を示した。
参考資料
今後やりたいこととか
- 今回の環境をベースにVPNで接続した場合とZenohのスループット・レイテンシの計測
- e-Prosim の DDS routerで同様のことができるらしくその試用と性能計測