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を使うとできるよう。

 

2024年3月6日水曜日

wasm環境構築

https://rustwasm.github.io/docs/book/game-of-life/setup.html

に書いてあることをコピーとちょっとしたエラー時の対応のログです。

必要なパッケージのインストール

npm

npm install npm@latest -g

wasm pack

curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh

cargo-generate

$ cargo --version
cargo 1.71.1 (7f1d04c00 2023-07-29)
$ cargo install cargo-generate
  Updating crates.io index
  Installing cargo-generate v0.19.0
  Updating crates.io index
error: failed to compile `cargo-generate v0.19.0`, intermediate artifacts can be found at `/tmp/cargo-installDG3XkQ`
Caused by:
  package `normpath v1.2.0` cannot be built because it requires rustc 1.74.0 or newer, while the currently active rustc v
ersion is 1.71.1
  Try re-running cargo install with `--locked`

エラーの指示の通りrustcのバージョンアップを
する。

$ rustup check
stable-aarch64-unknown-linux-gnu - Update available : 1.71.1 (eb26296b5 2023-08-03) -> 1.76.0 (07dca489a 2024-02-04)
rustup - Up to date : 1.26.0
$ rustup update stable
$ cargo install cargo-generate

無事インストール完了

動作確認

cargo generate --git https://github.com/rustwasm/wasm-pack-template
cd wasm-game-of-life
wasm-pack build
npm init wasm-app www

pkg/package.json を作成し、下記を追加

{
  "name": "wasm-game-of-life",
  "collaborators": [
    "Your Name <your.email@example.com>"
  ],
  "description": null,
  "version": "0.1.0",
  "license": null,
  "repository": null,
  "files": [
    "wasm_game_of_life_bg.wasm",
    "wasm_game_of_life.d.ts"
  ],
  "main": "wasm_game_of_life.js",
  "types": "wasm_game_of_life.d.ts"
}
vi www/package.json

以下ブロックを追加

  "dependencies": {
    "wasm-game-of-life": "file:../pkg"
  },

export NODE_OPTIONS=--openssl-legacy-provider
npm install
npm run start

ブラウザでhttp://localhost:8080 を開くとアラートが表示される

Exercises

lib.rsのgreeting関数に引数をして、jsから引数ありの呼び出しをしてみる。

lib.rs

pub fn greet(name: &str) {
    alert(&format!("Hello, {}!", name));
}

index.js

wasm.greet("Your Name");