11 months ago
次世代通信プロトコル的なZenohをUnityで動かせるようにした #zenoh – Qiita
通信プロトコルZenohの機能をUnity (Windows, MacOS, Android) から使えるようにしました。文字列のPublish / Subscribeのほか、画像を受信してテクスチャに反映できるようにして、Meta Quest 3でステレオカメラ画像を受信したりしてみました。 読み方は今のところゼノーと呼んでいます。 比較的新しいオープンソースの通信プロトコルで、メッセージの投げ方はMQTTと似た感じで、トピックにメッセージを投げ込み、購読者がそれを受け取るという感じですが、一般的なMQTTなどと異なり、固定したサーバーを持ちません。場合によってはpeer-to-peerつまり直接やりとりをするし、場合によってはZenohルーターというプロキシー的なものを介してやりとりしますが、利用者(プログラム)側としてはそれを意識することがありません。また、低レイヤーの転送のプロトコルは様々なものが利用できます。 なお、RPC的なQueryableなどの機能もあります。(今回は利用していない) 特にロボット用OSとして有名な ROS2 において、ネットワークレイヤーの Tier1 (最上位)としてのサポートを行うことが発表されています。これまでは DDSプロトコルがデフォルトでしたが、いくつかの課題があり、それを解決するものとして Zenoh が選ばれた経緯があります。なお、Zenohがデフォルトになるというよりは、DDSかどちらかを選べるようになるという感じのようです。 ROS2におけるDDSの課題や、選ばれた経緯などは以下の動画に詳しいです。 こちらも参考になります。 Zenohを利用すると何が良いかというと、ネットワークをどういう構成にするかというのをあまり事前に考えずにプログラムを書くことができるという点じゃないかと思います。 データの生成者的なプログラムであれば、Zenohライブラリを利用して、Aというトピックにデータを投げるように作っておけば良いです。データの消費者的なプログラムであれば、Zenohライブラリを利用して、Aというトピックを購読するように作っておけば良いです。 Zenohの初期化に利用するconfigを調整するだけで、上記の2つのプログラムはLAN内や同じインスタンス内でpeer-to-peerで超低レイテンシでつなぐこともできるし、クラウドに配置したZenohルーターを介してNAT超えでつなぐこともできます。 パフォーマンスも、小さい容量からかなり大きな容量まで、他の手法と比べて良いケースが多いようです。また、Zenohは最終的にどのようなプロトコルで通信するかを限定してはいません。TCP,UDP,QUIC,WebSocket,共有メモリなどを利用することができます。ネットワーク環境に応じた接続方法をconfigで指定すれば良いです。そう、共有メモリによるマシン内通信もサポートされています。PC内やクラウド内では高速な手段で通信をして、クラウド越しの場合は一般的なネットワーク通信を行うなどができ、ソフトウェアからは、それらを全体的に同じ使い方で扱うことができます。 便利だと思いませんか? Raspberry Pi5には、カメラ用のソケットが2つあります。これでステレオカメラを作って、Zenoh経由でQuestに送ってリアルタイムステレオ視聴してみたいなあ、と思いました。セオリー的には、左右カメラを合成して1つの画像にして送信するほうが安全ですが、今回あえて左右の画像をZenohの別キー(トピック)に送ってみます。 左目用のキー : camera/left右目用のキー : camera/right Zenohルーターを利用すると以下のような感じに組むことができます。この場合、送信者と受信者が直接相手を知らなくても通信ができます。 Zenohの面白いこととしては、LAN内など直接通信可能であれば、以下のようにpeer-to-peerで動きます。上記と全く同じプログラムでもこのように動かすことができます。(Zenohの初期化に与えるconfigは場合により変更します) いろいろ紆余曲折ありましたが、できました!Questでステレオ視ができます! Raspberry Pi 5 + Camera Module V3 Wide x2 Meta Quest 左目Meta Quest 右目 ちゃんと測定していませんが、遅延も十分少ないです。感覚値で50ms以下という感じがあります。ただし、解像度を上げていくと急激に遅延が出てきたりします。 960x540 20fps というあたりが今のところベストな雰囲気ですが、環境によると思います。ボトルネックがどこかはまだ調査できていません。 今回作成したプロジェクトなど ステレオ画像受信Unityプロジェクト (Meta Quest用) こちらのリポジトリにUnityプロジェクトがあります。 LANでpeer-to-peerをする場合はconfigなしでいけると思います。Zenohルーターにつなぐ設定を行いたい場合は、Zenoh初期化用のconfig (Text Asset)を与える必要があります。このあたりは別の記事で書ければと思っています。 JPEGを別スレッドでデコードするのに、UniTaskと、画像系ライブラリSkiaForUnityを利用しました。 余計なメモリアロケーションはあまりしないように、ある程度気をつけましたが、まだ残っています。 2025/4/7現状では、Questのスリープ後などに不安定になって、システムUIの応答がなくなる気がしますので注意してください。 ステレオ画像送信Raspberry Pi用C++プロジェクト 画像送信側のRaspberry Pi5のコードはこちらです。Camera Module V3 (Wide)を2つつないだ状態で動かす前提です。 ./Main R と ./Main L のようにコマンドを2つ動かしておくと、両目分のストリームがそれぞれ送信されます。 利用しているカメラデバイスによって z_pub_camera.cpp のコード、特に
次世代通信プロトコル的なZenohをUnityで動かせるようにした #zenoh – Qiita
通信プロトコルZenohの機能をUnity (Windows, MacOS, Android) から使えるようにしました。文字列のPublish / Subscribeのほか、画像を受信してテクスチャに反映できるようにして、Meta Quest 3でステレオカメラ画像を受信したりしてみました。 読み方は今のところゼノーと呼んでいます。…
0
0
0
0