Upgrade to Pro — share decks privately, control downloads, hide ads and more …

すべてが #Zenoh になる 〜柔軟にして軽量〜

すべてが #Zenoh になる 〜柔軟にして軽量〜

SWEST26: 第26回 組込みシステム技術に関するサマーワークショップ
2024/08/30(金) セッションs5b->s2c
「すべてが #Zenoh になる 〜柔軟にして軽量〜」
https://swest.toppers.jp/phx/event/program#s5b
https://github.com/takasehideki/zenoh_swest26_trial

takasehideki

August 29, 2024
Tweet

More Decks by takasehideki

Other Decks in Programming

Transcript

  1. Hobby Recent R&D Affiliation https://discourse-cdn-sjc1.com/standard/uploads/ros/original/1X/4a43b86081b214cff55280de763dbc2f3a445189.png Mission あらゆる モノ・コトと ヒトを繋げる 設計基盤の

    確⽴ 最適化 設計技術 良いモノ を 誰でも楽に つくることができる世界へ 組込み/IoTコンピューティング基盤を⽀える プラットフォーム技術と設計⽅法論 @takasehideki MEC BEAM クラウド BEAM エッジ BEAM 最適配分アルゴリズム 透過型分散プラットフォーム BEAM システム開発者 デプロイされる コード ① ③ ② ③ ③ ❤ 評価アプリ ❤ 評価アプリ ④ ④ ❤ 評価アプリ ④ ② ② ❤ 評価アプリ ④ ② ② ② ②
  2. 3 本セッションの構成 • 前半:チュートリアル (a.k.a Zenoh完全に理解した:D −前口上:IoT Computing と出版購読型通信 −Zenoh

    の4つの側面 −広がるセカイ:ロボットにもマイコンにも! • 後半:ハンズオン (a.k.a Zenohまるでわからん;;( 1:様々な言語でつなげる 2:IoT的につなげる
  3. 4 ハンズオンの前準備 • ハンズオンの前準備 −環境準備は済んでいますよね?? −会場参加者:PCを専用のWi-Fi APに接続してください ✓SSID / PASS

    は会場で案内します −ハンズオン用のリポジトリを clone してください ✓--recursive 必須! −リポジトリにある zenoh_pico/ のディレクトリを VSCode で開く ✓ウインドウ下の “OUTPUT” に Project has been sucessfully updated! が 表示されるまで(チュートリアルを聴きながら)待ちます git clone --recursive https://github.com/takasehideki/zenoh_swest26_trial
  4. 5 デバイス エッジサーバ クラウド IoT Computing?? AI/ML技術との 密接な統合 あらゆるモノ・コトの ネットワーク接続によって

    新たな社会的価値を創造 各構成要素における 計算機特性の結集 大量のデバイスとデータ 「デバイスレベル並列化」 による最適化の時代へ!
  5. クラウド エッジデバイス MEC MEC 応答時間 計算性能 応答時間 計算性能 応答時間 計算性能

    7 広域分散処理の実現に向けた課題 • システム開発者視点から システム記述 ➢ なにをどこで処理するのか? ➢ それらをどのように繋げるのか? ➢ これをどうやって実現するのか? エッジデバイス
  6. 8 出版購読型通信 • Brokered (e.g., MQTT) −brokerがどこかを把握する必要アリ • Peer-to-Peer (e.g.,

    DDS) −自律的に通信相手を探索できる −通常の適用範囲は同一ネットワーク内のみ • 嬉しさ −非同期かつ疎結合なアーキテクチャを 形成しやすい −それぞれのノードが独立して動作する 追加/削除/再配置が容易 publisher1 publisher2 topicA topicB subscriber1 sub2 sub3 broker
  7. • Zero Overhead Pub/Sub, Store/Query and Compute. −Zero network overhead

    protocol −ネットワーク内ではDDSライク, ネットワーク間ではMQTTライクな通信ミドルウェア −GitHub : https://github.com/eclipse-zenoh/ ✓Eclipse Public License 2.0 and/or Apache 2.0 −当初はOCaml実装,2020/10- 頃からRustに移行 • 開発主体:ZettaScale Technology −CEO/CTO:Angelo Corsaro さん −ADLINK(CycloneDDS開発主体)から独立? 10
  8. • Low latency and High throughput −10 us latency in

    the single machine, 16 us in multiple machines (P2P config.) −~70 Gbps at 8 KB payload ✓35x higher than MQTT, 23x than Kafka, 3.3x than DDS • Why?: minimum wire overhead −only 5 bytes for delivering messages 12 https://zenoh.io/blog/2023-03- 21-zenoh-vs-mqtt-kafka-dds/ arxiv:2303.09419 とにかくかるい!
  9. 13 • Pub / Sub (Push) −basic pub/sub method •

    Pub / Sub (Pull) −Sub receives in its own timing • Pub / Store / Get −KVS based computation • Get / Reply −RPC-like communication node node node node node node node node Pub Sub(callback) Sub(Pull) Pub Pub Get Reply Pull なんでもつかえる!
  10. 14 Peer to Peer Clique Mesh Brokered Routed Peer Peer

    Peer Peer Peer Peer Peer Peer Peer client client Router Router Router client client client client client client Router Router いろいろつながる! • Zenoh router behaves as a broker between networks • We can construct a wide area network structure easily!
  11. 16 QUIC, TLS, TCP, UDP Unicast, UDP Multicast IPv4, IPv6

    6LoWPAN WiFi, Ethernet, Bluetooth, Serial APIs for various languages • zenoh-python • zenoh-c • zenoh-cpp • zenoh-java https://zenoh.io/docs/ getting-started/first-app/ Runs Everywhere! • zenoh-kotlin • zenoh-csharp • zenoh-go Getting Started with Python Native
  12. • Zenohex = Zenoh + Elixir https://github.com/b5g-ex/zenohex Zenoh Protocol by

    Rust Erlang VM Elixir node1 Elixir node2 process Rustler github.com/rusterlium/rustler Rust謹製のZenoh APIを Elixir/Erlangから利用 Python node2 Erlangプロセスなので 軽量かつ堅牢!! C++ node1 だったらElixirじゃね??
  13. 18 なんしか Elixir!! 2012年に登場した新しめの関数型言語 BEAM (Erlang VM) 上で動作 • 高い並行/並列性能を誇る

    • 軽量かつ頑強なプロセスモデル • 耐障害性が極めて高い Rubyを基にした言語設計 • 習得しやすく生産性が向上する • 通信応答性能が極めて高い • Web/IoT/AI FW. を備える Programming should be about transforming data Elixir Zen Style ➢ データフローと並列処理を Enum Flow |> で直感的に記述できる ※各言語・フレームワークのロゴの権利は それぞれの作成者に帰属しています
  14. 21 つまり,こうなる!(はず) … … rclcpp rclpy node.cpp node.py RCL (ROS

    Client Library) RMW (ROS MiddleWare) DDS B DDS A General Purpose OS rclrs node.rs Zenoh?? DDSと同じようにZenohを 選択できるようになる DDSと同じレイヤに Zenohが追加される (現時点ではDDSノードとは 通信できない) ユーザアプリ/クライアントライブラリの レベルでは影響なし
  15. 22 ros2/rmw_zenoh • ROS 2がZenohでつながる −zenoh-c (C API for Zenoh)

    の binding として実装 階層:RMW(C++) |> API(C) |> Zenoh(Rust) −ROS 2 node = Zenoh Session Zenoh Router で discovery |> P2P で pub/sub ✓現状は Router の立ち上げが必須(将来的には不要に?) −maintainers: ✓Yadunund Vijay (@Yadunund Iron ROS Boss) ✓Chris Lalancette (@clalancette ROS 2 Technical Lead)
  16. そしてさらに! ROSJP#53「ROSCon 2023参加報告:Real-Time Workshop & Zenoh’s Current Status and Forecast」

    https://speakerdeck.com/takasehideki/roscon-2023can-jia-bao- gao-real-time-workshop-and-zenohs-current-status-and-forecast https://www.youtube.com/watch?v=TZaYVL8xeBs&t=2426s
  17. 24 zenoh-plugin-ros2dds • ZenohでROS 2がつながる −zenoh-plugin-dds から派生 −より ROS 2

    フレンドリーに! −plugin: router にロードして使う −bridge: スタンドアロンで動作する −maintainers: ✓Julien Enoch (@JEnoch Senior Solutions Architect at ZettaScale)
  18. 26 • ハンズオン1:様々な言語でつなげる −Python, Elixir, Rust 実装のノードをPub/Subしてみる −PhoenixアプリとWeb連携させてみる −プログラミングモデルを理解する •

    ハンズオン2:IoT的につなげる −zenoh-pico を使ってみる −組込みマイコンとWebアプリをIoT連携させてみる • 詳細な手順は,,, https://github.com/takasehideki/zenoh_swest26_trial −次ページ以降は要点のみを示しています 論よりRUN!! "ron yori run" The RUN is mightier than the word
  19. 27 ハンズオン1:様々な言語でつなげる • 下準備:コンテナの起動 cd zenoh_swest26_trial docker compose up -d

    • ターミナルを8つ開いて Docker に入る(ペインで2行4列がオススメ) cd zenoh_swest26_trial docker compose exec app bash cd zenoh_elixir mix deps.get && mix compile • ノードやアプリをビルドする cd zenohex_phoenix_demo mix setup && mix compile cd zenoh_native cargo build cd zenoh_python cd zenoh_elixir cd zenoh_native cd zenoh_python
  20. 28 ハンズオン1:様々な言語でつなげる • Let’s talk!! iex -S mix iex()> ZenohElixir.Sub.main()

    mix phx.server ./target/debug/sub python3 sub.py iex -S mix iex()> ZenohElixir.Pub.main() ./target/debug/pub python3 pub.py • ソースコードを眺めてみましょう • key を変えたりいろいろ試してみましょう
  21. 29 プログラミングモデル • Resource: −(key, value)ペアの名前付けされたデータ −例:home/kitchen/sensor/temp, 21.5 home/kitchen/sensor/hum, 0.67

    • Key expression: −keyの集合表現(ワイルドカード?) −例:home/kitchen/sensor/* home/**/temp • Selector: −resource 集合を特定する表現 −例:home/*/sensor/air?_where=co2> 12&_project=humidity • open/close: −zenohセッションを開始/終了する −引数等でネットワーク構成を指定する ✓ 多くの場合では1つのセッションを 使い回すことが推奨されている • declare_keyexpr: −key-expressions を宣言する • declare_publisher: −出版者として宣言する • declare_subscriber: −購読者として宣言する −購読時に実行されるコールバック関数を 指定する
  22. 30 ハンズオン2:IoT的につなげる • 下準備 −`zenoh_d3ai_trial/zenoh_pico/` のディレクトリを PlatformIO Project として開く −`src/main.cpp`

    を編集する ✓ 13-14行目の `SSID` と `PASS` を本日のWi-Fi AP環境に合わせる ✓ 19行目の `CONNECT` を自身のPCのIPとポート番号に合わせる #define CONNECT "tcp/192.168.x.x:7447" −Build, Upload, and RUN!!! • いろいろ試してみてください • 補足: − がむばれば他のM5ボードでもできますが platform.ini の記述がいろいろ必要なことがあります(こんな感じ) − zenohd (Zenoh router) は IP reachable であれば接続できます でも今回はちょっとサボっています,,, (こんな感じ) − がむばれば Cloud VM とも連携可能です(こんな感じ)
  23. 31 ネットワークモデル • Peer: −Zenohアプリとしての基本 −ローカルネットワーク内では通信相手を自律的に探索できる(like DDS) −Scouting: 通信相手の探索方式の指定(multicast と

    gossip の方式がある) • Client: −ルータを介して通信する構成 • Zenoh router: −通信を仲介するモジュール −IP or URL, TCP or UDP で指定可能 −ポート番号も指定可能(基本は7447) JSONとかでいろいろ指定できるらしい,,, https://zenoh.io/docs/getting-started/deployment/
  24. 32 Thank you! merci!! Arigato!!! @takasehideki A part of this

    work is going as collaborative research with SoftBank Corp., and was supported by the commissioned research (04001) by National Institute of Information and Communications Technology (NICT), Japan.