2024年5月19日日曜日

zenohについて調べてみる

Eclipse SDV Projectを調べていたら、 zenoh というのが出てきた。

見てみるとROS界隈でも使われている軽量スタックだったので、調べて見ようと思いました。

zenohとは

Zero Network Overhead Protocolからzenohと名付けているようです。
サイトを見るとZeroOverHead Network Protocolになっているため、あれ?って部分はありますが。

主な機能

機能としては

  • Pub/Sub
  • Storages
  • Queries and Queryables

があります。

また、トポロジー構成は

  • Peer-to-Peer
    • Clique , Mesh トポロジを構築
  • Brokered
    • zenoh routerで複数clientを接続
  • Routed
    • routerを構築し、client間や別subnetを接続

が実現できるようです。参照:https://zenoh.io/docs/getting-started/deployment/

非機能的な要素として

  • Scalable
    • Scalable Routing
    • Low Power Networks
    • Constrained Devices
  • Fast
    • Fast Adoption
    • Low Latency
    • High Throughput

とあり、マイコンからクラウドまでサポートしているとのこと。

C言語で実装されたzenoh-picoもあります。

パフォーマンス

 以下のブログでパフォーマンスについて言及されています。

https://zenoh.io/blog/2023-03-21-zenoh-vs-mqtt-kafka-dds/   MQTTよりも性能があることが示されています。
とはいえ、MQTTは低スペックや不安定なネットワーク向けだから同じ土俵に乗せるのもと思うが。

拡張性

プラグインを使う事により、様々なミドルウェアと接続することが可能になります。

  • mqtt
  • dds
  • rocksdb
  • filesystem
  • influxdb
  • s3
  • webserver
  • sql

などがあり、自作で拡張することが可能です。

動作確認

簡単なpub/subの動作確認の手順です。

  1. z_sub とz_pubをビルド
  $ git clone https://github.com/eclipse-zenoh/zenoh.git
  $ cd zenoh/examples
  $ cargo build --example z_sub
  $ cargo build --example z_pub

subscriberの実行

  $ ../target/debug/examples/z_sub
Opening session...
Declaring Subscriber on 'demo/example/**'...
Press CTRL-C to quit...
>> [Subscriber] Received PUT ('demo/example/zenoh-rs-pub': '[   1] Pub from Rust!')
>> [Subscriber] Received PUT ('demo/example/zenoh-rs-pub': '[   2] Pub from Rust!')
>> [Subscriber] Received PUT ('demo/example/zenoh-rs-pub': '[   3] Pub from Rust!')
>> [Subscriber] Received PUT ('demo/example/zenoh-rs-pub': '[   4] Pub from Rust!')  
  

publisherの実行

$ ../target/debug/examples/z_pub
Opening session...
Declaring Publisher on 'demo/example/zenoh-rs-pub'...
Press CTRL-C to quit...
Putting Data ('demo/example/zenoh-rs-pub': '[   0] Pub from Rust!')...
Putting Data ('demo/example/zenoh-rs-pub': '[   1] Pub from Rust!')...
Putting Data ('demo/example/zenoh-rs-pub': '[   2] Pub from Rust!')...
Putting Data ('demo/example/zenoh-rs-pub': '[   3] Pub from Rust!')...
Putting Data ('demo/example/zenoh-rs-pub': '[   4] Pub from Rust!')...

こんな感じで簡単に動かせます。
routerを使ったサンプルは別の投稿でかければと思います。

使ってみた感想

機能としては未知数なところもあるが、ROS2で使われている&色々拡張できるという面で 非常に期待しているミドルウェアではあります。

uProtocol というミドルウェアでも使われているということなので、そこでも調べてみようかと思います。

参考サイト

以下参考にしたサイトです。

2024年5月6日月曜日

rustup updateした後にcargoを実行したらエラーになった

発生事象

  1. rustup update stableを実行
  2. cargoを実行
$ cargo
error: the 'cargo' binary, normally provided by the 'cargo' component, is not applicable to the '1.72.0-aarch64-unknown-linux-gnu' toolchain

と実行したがエラーが発生した。

解決方法

googleで検索したら、AIが以下コマンド実行してみてと教えてくれたので、実行。

rustup component remove cargo
rustup component add cargo

これで無事cargoが実行できた。

rustup updateだけだとバイナリの不整合が発生する模様なため、cargoの入れ替えも同時に実施したほうが良さそう。

reference

https://github.com/rust-lang/rustup/issues/2704#issuecomment-815062952

2024年5月5日日曜日

instrument_functionで関数トレースをしてみる

モチベーション

ちょっとした動作確認を行った場合、コールツリーなどをチェックしたいということがありました。
わざわざ、関数にDebug Printを入れ込むのも面倒だなと言うことなので、ちょっと調査しました。

実現方法

1 . コンパイルオプション -finstrument-functions を設定してコンパイル 2 . 関数のentry/exitで以下の関数が呼び出される

  void __cyg_profile_func_enter(void *func_address, void *call_site) // func_addressが呼び出される関数アドレス、call_siteは呼び出しもとの関数アドレス
  void __cyg_profile_func_exit(void *func_address, void *call_site)

3 . この関数の中で、アドレスから関数名に変換する仕組みを入れることにより、 コールツリーが確認できる。 ※cyg_profile_func_enter/exit自体はフック対象外とするため、 -finstrument-functionsの対象外とする必要がある。

実装したサンプルコードはこちら サンプルコード

ちなみにstatic関数のコールトレースはできない。    staticを空のマクロ定義にして、読み出せるようにするなどで実現できるが、関数名の衝突などがありそうなため、うまくできるかは微妙。

改善点

  • 関数名までなので、引数も表示できるようにしたい。
    • libdwarfを使うとできるよう。