English | 日本語
本リポジトリでは、リアル(エッジ)とバーチャル(箱庭)を接続するための通信モジュールである「箱庭ブリッジ」を提供します。
箱庭ブリッジは以下の機能を提供します。
- バーチャル側のデータをエッジ側に配信できます
- エッジ側のデータをバーチャル側で購読できます
箱庭ブリッジの通信は、Zenoh をベースに構築されています。
箱庭ブリッジの機能は大きく分けて、以下の2機能です。
- ShmProxy
- RosProxy
ShmProxy(SharedMemoryProxy)は、バーチャル側に配置されており、箱庭PDUデータをZenoh通信データに変換し、データ転送します。
RosProxyは、エッジ側に配置されており、ROS通信データをZenoh通信データに変換して双方を接続する役割を担います。なお、エッジ側でZenohを組み込んでいる場合は、箱庭PDUデータにそのままアクセスできます。
Zenoh を採用している理由は以下の通りです。
- 通信方式として UDP/TCP/ROS/MQTTなど、さまざまなバリエーションを選択できる
- さまざまなプログラミング言語のサポート(C言語、Python、Rustなど)
- 異なるネットワークを超えるこができる(5Gルータ越しのROS通信も可能)
- 低遅延通信であり、リアルタイム性が求められる用途に適している
- バーチャル側
- Ubuntu, MacOS
- エッジ側
- Ubuntu
- ROSまたはZenohを組み込み可能なデバイス(RaspberryPi等)
- Ubuntu
サンプルプログラムはこちら。
箱庭ブリッジのリポジトリをクローンします。
git clone --recursive https://github.com/toppers/hakoniwa-bridge.git
以下の順番でインストールを実施します。
バーチャル側:
エッジ側側:
箱庭コア機能のインストール手順に従って、コア機能をインストールします。
- ディレクトリ移動
cd third-party/hakoniwa-core-cpp-client
- Build
bash build.bash
- Install
bash install.bash
箱庭ブリッジが利用する Zenoh は、 zenoh-c です。 なお Zenoh のインストールにはRust環境が必要です。
バーチャル側とエッジ側、両方にインストールする必要があります。
- ディレクトリ移動
cd third-party
- Build
mkdir -p build && cd build
cmake ../zenoh-c
cmake --build . --config Release
- Install
Linux環境の場合は sudo
が必要になることがあります。
cmake --build . --target install
成功すると、以下のファイルが作成されます。
% ls /usr/local/include
zenoh.h zenoh_commons.h zenoh_concrete.h zenoh_configure.h zenoh_macros.h zenoh_memory.h
% ls /usr/local/lib
libzenohc.dylib
Linuxの場合は libzenohc.so
が生成されます。
${LD_LIBRARY_PATH}
になければ、上記のパスを追加しておきます。
cd hakoniwa-bridge/virtual
bash build.bash
成功すると、以下のファイルが作成されます。
% ls cmake-build/shm-proxy/shm-proxy
cmake-build/shm-proxy/shm-proxy
RosProxyを作成するためには、最初に、箱庭PDUデータとして利用すROSメッセージ定義ファイルを準備する必要があります。ここでは、簡単のため、以下の標準ROSメッセージを利用する前提で説明をします。
- geometry_msgs/Twist
- std_msgs/Bool
- ディレクトリ移動
cd hakoniwa-bridge/third-party/hakonwia-ros2pdu
- 箱庭PDUデータの作成
今回は、ROS標準のメッセージを利用するため、箱庭PDUデータは既存のものを利用できます。 もし独自のROSメッセージを利用する場合は、こちらの手順にしたって、作成してください。
- コンフィグファイルの作成
本ファイルは、箱庭のUnityエディタ上でGenerate
すると自動生成されるものです。Unityを利用しない場合や、利用する場合でも全てのPDUデータをエッジ側と共有しない場合等は、手動で編集する必要があります。
コンフィグファイルのファイル配置は以下としてください。
hakoniwa-ros2pdu/config/custom.json
定義例:
https://github.com/toppers/hakoniwa-digital-twin/blob/main/sim/config/custom.json
custom.jsonの定義については、こちらを参照ください。
なお、method_typeには、SHMを必ず指定してください。 また、class_nameとconv_class_nameは設定不要です。
- RosProxyの作成
以下のコマンドを実行して RosProxyのコードを生成します。
bash create_proxy_ros_zenoh.bash ./config/custom.json
成功すると、以下のファイルが作成されます。
# ls workspace/src/hako_ros_proxy/src/gen/
hako_ros_proxy_com_ros2.cpp hako_ros_proxy_com_zenoh.cpp
- RosProxyのビルド
cd workspace
colcon build --packages-select hako_ros_proxy
成功すると以下のログが出力されます。
Starting >>> hako_ros_proxy
[Processing: hako_ros_proxy]
Finished <<< hako_ros_proxy [35.4s]
Summary: 1 package finished [36.0s]
ShmProxyの仕様:
Usage: ./cmake-build/shm-proxy/shm-proxy <asset_name> <config_path> <delta_time_msec> [master]
ShmProxyは、箱庭コンダクタを含んでいます。もし、箱庭コンダクタを独自に起動しない場合は、master
オプションを利用することで、箱庭コンダクタを駆動できます。
実行例:masterオプションを利用しない場合
./cmake-build/shm-proxy/shm-proxy ShmProxy ../third-party/hakoniwa-ros2pdu/config/custom.json 20
実行例:masterオプションを利用する場合
./cmake-build/shm-proxy/shm-proxy ShmProxy ../third-party/hakoniwa-ros2pdu/config/custom.json 20 master
source install/setup.bash
ros2 run hako_ros_proxy hako_ros_proxy_node