📶

zenoh-bridge-ros2ddsでZenohとROS 2間通信

2024/12/22に公開

海洋ロボコンをやってた人です。
ROS 2アドカレには3年目の投稿になります。

今回は初の試みとしてアドカレ用のネタをX(旧Twitter)にて募集し、一番ホットなジャンルの技術について語ろうと考えました。
大変ありがたいことに10/20票でZenohの需要があるという結果となりましたので、本稿ではZenoh-plugin-ros2ddsについて記載していきたいと思います。

投票していただいた皆様に、この場をお借りしてお礼申し上げます。ありがとうございました。


この記事のゴールはzenohの基本的な使い方、zenohとROS 2を組み合わせた使い方を習得できることとします。

本記事で使用するプログラムは下記をご参照ください。

https://github.com/tasada038/zenoh-demos

誤記等あればご指摘ください、どうぞよろしくお願いいたします。

1. What is Zenoh?

1.1. Overview of Zenoh

Zenoh はスケーラビリティと低遅延性・高スループットに強みがある新しい通信プロトコル/ミドルウェアであり,出版購読型の通信方式だけでなくキーバリューストア型の分散クエリの機能も提供しています.Zenoh自体はRust実装ですが,C/C++やPythonなどのAPIライブラリも提供されています.Zenoh Routerを介して任意のネットワークトポロジを構成できたり,ROS 2/DDSやMQTT,MariaDBやinfluxdbなどの他プロトコルとの相互運用プラグインを利用できる特徴もあります.[1]

Zenoh は移動中のデータ、保存中のデータおよび計算を統合する pub/sub/query プロトコルで、高いスループット・低レイテンシーを提供しています。

詳細は A Performance Study on the Throughput and Latency of Zenoh, MQTT, Kafka, and DDS のArxivにもまとめられていますが、60Gpbsに近いスループットと15マイクロ秒の低レイテンシーを実現できます。

また、TCP/IPやUDP/IPなどの従来のトランスポート層上で実行可能なように設計されていますが、同様にEthernetやBluetoothなどのネットワーク層やデータリンク層でも同じように実行可能となっています。

ROS 2 is taking a lighter-weight, “code-first” approach, while the AUTOSAR consortium is working on a structured exchange and interoperability format. However, ROS 2 needs to come up to automotive certification standards, acknowledged Corsaro.
Companies such as Intrinsic and Apex.AI are working on bridging the platforms. Intrinsic is using Zenoh with ROS 2 Jazzy Jalisco. [2]

Likewise, several Autonomous Vehicles and Mobility initiatives, such as CARMA and the Indy Autonomous Challenge, have adopted Zenoh for Vehicle-to-Anything communication and in a growing number of cases as the only protocol used for on- and off- vehicle communication. [3]

さらに上述の記事から引用しますが、Apex.AIなどの企業は、ROS 2のブリッジでZenohを使用しているようです。
他にも、Indy Autonomous Challengeなどのいくつかの自律走行車およびモビリティでは Vehicle-to-Anything通信にZenohが採用されているようです。

脱線しますが、Vehicle-to-xxx 関連でV2X (Vehicle-to-everything):自動車とあらゆるモノをつなげる通信技術の総称という用語がありますね。このあたりはV2Xとは?車とあらゆるモノをつなげる技術の課題と動向のコラムにまとめられているので、V2V / V2I / V2P / V2N なども知っておくとZenohのユースケース考える機会が増えるのでは?と思っています。

[1] ZettaScale CEO/CTO直伝!Zenoh完全理解セミナー! 動画アーカイブがあります!

[2] ZettaScale designs Zenoh to transcend DDS for automotive, ROS communications

[3] What is Zenoh?

1.2. Zenoh Python library

実際にYour first Zenoh app のチュートリアルからZenohの通信も試してみます。

pip install eclipse-zenoh

z_sensor.py (上: Host PC) とz_subscriber.py (下: SBC) を準備して実行すると、下記のようにPub/Sub通信でデータ送受信できることが確認できます。(Wifi経由)

シーケンス図で書くと上述のようになり、Zenohで送受信をさせる場合はkeyを変更してpub/subすれば良いということになります。


また、Zenohによって生成された値を保存 / クエリ発行するには Zenoh router (zenohd)を使用します。

Pub/Sub通信のようにPeer-to-Peer (P2P)モデルだけでなく、Brokered, Routedモデル構築時にZenoh routerを使用することで、柔軟なネットワーク構造を作ることが可能になります。
(下記イメージ)

Zenoh routerとそのプラグイン関連は、クロスプラットホーム対応 (Mac/Ubuntu or any Debian/Windows)に対応しており、Ubuntuの場合は下記で入手できます。

terminal
echo "deb [trusted=yes] https://download.eclipse.org/zenoh/debian-repo/ /" | sudo tee -a /etc/apt/sources.list > /dev/null
sudo apt update
sudo apt install zenoh

# Zenoh routerの起動
zenohd

1.3. Zenoh RGBD Camera

せっかくなのでRealSense D435を使用してZenoh Pub/Subしてみましょう。

terminal
sudo apt-get update
sudo apt-get install librealsense2-dkms librealsense2-utils librealsense2-dev librealsense2-dbg
pip install pyrealsense2

https://github.com/tasada038/zenoh-demos/tree/main/computer-vision/zcam/zcam-rs-python

からプログラムを入手し、下記を実行します。

terminal
python3 zcapture_rs.py
python3 zdisplay_rs.py

PC間を跨いだRealSenseのPub/Subができることも確認できます。

2. Zenoh-bridge-ros2dds

ではアドカレの本題であるzenoh-plugin-ros2dds, zenoh-bridge-ros2ddsの活用に進みます。

2.1. Install zenoh-bridge-ros2dds

https://github.com/eclipse-zenoh/zenoh-plugin-ros2dds

ZenohとROS/ROS 2をブリッジするためのパッケージが公開されているので、「How to install it > Linux Debian」に従ってインストールします。

terminal
echo "deb [trusted=yes] https://download.eclipse.org/zenoh/debian-repo/ /" | sudo tee -a /etc/apt/sources.list > /dev/null
sudo apt update
sudo apt install zenoh-plugin-ros2dds
sudo apt install zenoh-bridge-ros2dds

zenoh-bridge-ros2ddsを起動する場合はIP指定の有無で下記のように使い分け可能です。

terminal
# On the robot, run
zenoh-bridge-ros2dds

# On the operating host run:
zenoh-bridge-ros2dds -e tcp/192.168.11.88:7447

このbridgeを使用することで、ZenohでPubしたデータをROS/ROS 2メッセージとして受け取ることができます。起動イメージ↓

2.2. zenoh-rest-teleop

下記参考に、zenoh-rest-teleopを使用してGazebo上のTurtlebot3を動かしてみます。
※ Forkした私のリポジトリの方はTurtlebot3用で少しカスタマイズしています。

https://github.com/eclipse-zenoh/zenoh-demos/tree/main/ROS2/zenoh-rest-teleop

注意点として、REST経由でROS 2トピックを送信する際README.mdにも記載がありますが、CycloneDDSが前提となっています。

⚠️ Note: this demo depends on the Ros2 Middleware implementation being set to CycloneDDS
Installation instructions for CycloneDDS below:

そのため、RMWのパラメータを変更する必要があります。

terminal
RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

参考までに、RMW_IMPLEMENTATIONのパラメータはWorking with multiple ROS 2 middleware implementationsからも指定できる種別が示されています。

rmw_cyclonedds_cpp, rmw_fastrtps_cpp, rmw_connextdds, rmw_gurumdds_cpp.

この注意点を考慮した上で、下記手順に従ってプログラムを実行していきます。

Turtlebot3のパッケージと起動はこちらを利用します。

https://zenn.dev/tasada038/articles/0a69eb6c6b444f


  • ① zenoh-demos/ROS2/zenoh-rest-teleop/ros2-teleop.htmlを入手し、ブラウザで起動

  • ② Cycloneddsの設定でGazebo TB3 launchファイルを起動

terminal
RMW_IMPLEMENTATION=rmw_cyclonedds_cpp ros2 launch turtlebot3_gazebo turtlebot3_jp_world_corridor_pedestrian.launch.py
  • ③ zenoh-bridge-ros2ddsを起動
terminal
zenoh-bridge-ros2dds --rest-http-port 8000

あとはhtml上のGUIアプリからコントローラーを動かせば、Turtlebot3もGazebo上で動くことが確認できます。

https://twitter.com/tasada038/status/1860507124696252567

2.3. zenoh-python-teleop

zenoh-demos/ROS2/zenoh-python-teleop/ros2-teleop.py
のトピック名を下記のように変更し実行します。

terminal
- default='rt/turtle1/cmd_vel',
+ default='cmd_vel',
  • ① ros2-teleop.pyを入手し、実行する
terminal
python3 ros2-teleop.py
  • ② Gazebo TB3 launchファイルを起動
terminal
ros2 launch turtlebot3_gazebo turtlebot3_jp_world_corridor_pedestrian.launch.py
  • ③ zenoh-bridge-ros2ddsを起動
terminal
zenoh-bridge-ros2dds

こちらもターミナルから問題無くTurtlebot3を動かせることが確認できました。

2.4. zenoh_ros2_float32 publisher

最後に、2.3.節のteleop記述をベースに、Float32 msgをPublishして、Rviz 2で表示してみます。

Float32データが送れれば、おおよそのセンサーデータをZenoh経由で送れるという算段です。

  • ① ros2-float32-data.pyを入手し、実行する
terminal
python3 ros2-float32-data.py
  • ② zenoh-bridge-ros2ddsを起動
terminal
zenoh-bridge-ros2dds
  • ③ Rviz2を起動し、/random_float32をPlotter2Dで表示する
terminal
rviz2

こちらも無事Rviz 2で値を確認することができました。


以上、zenoh-bridge-ros2ddsでZenohとROS 2間通信してみる内容でした。
Likeいただけると大変励みになりますので、よろしくお願いいたします。

Appendix

Zenoh関連で気になるが力尽きた、優先度的にDropさせた内容も記載しておきます。
どなたか是非チャレンジして記事にまとめてくださると助かります。

Datadog

https://zenoh.io/blog/2024-04-17-datadog-zenoh-router-integration/

https://docs.datadoghq.com/ja/integrations/zenoh_router/

https://www.datadoghq.com/ja/pricing/

zenoh-kuksa-provider

https://github.com/eclipse-kuksa/kuksa-incubation/tree/main/zenoh-kuksa-provider

Discussion