6K Views
April 10, 24
スライド概要
この資料では、箱庭アセット間の通信データであるPDUの情報を整理しています。
- 箱庭のPDU(Protocol Data Unity)とは何か
- 箱庭の通信プロトコル・アーキテクチャ
- 箱庭アセットと箱庭PDUチャネルについて
- 箱庭PDUデータの作成方法
- 箱庭PDUデータの組み込み方法
箱庭アセットAPI
箱庭アセットUnity
- 箱庭PDUデータのアクセス方法
箱庭アセットAPI
箱庭アセットUnity
TOPPERS/箱庭WG活動でUnityやらAthrillやらmROSやら触ってます。 最近は仕事の関係でWeb系の技術に注力しつつ、箱庭への転用を模索しています。 2023年8月1日:合同会社箱庭ラボに移動しました
箱庭(Hakoniwa) PDU 合同会社箱庭ラボ CTO 森崇
はじめに • この資料では、箱庭アセット間の通信データであるPDUの情報を整理してい ます。 • 箱庭のPDU(Protocol Data Unit)とは何か • 箱庭の通信プロトコル・アーキテクチャ • 箱庭のPDUデータをプログラムで使うには • 箱庭アセットと箱庭PDUチャネルについて • 箱庭PDUデータの作成方法 2
箱庭のPDUとは何か • 箱庭のPDU(Protocol Data Unit)は、箱庭アセットが互いに通信するためのデータ単位です。 • PDUデータ型の定義: ROS IDL (Interface Definition Language) というインターフェース記述言語 • PDUデータは、様々な通信プロトコルを介してデータ交換されます。 • UDP, MQTT, ROS, Zenoh, 共有メモリ 3
箱庭の通信プロトコル・アーキテクチャ(1/4) • UDP通信 4
箱庭の通信プロトコル・アーキテクチャ(2/4) • MQTT通信 5
箱庭の通信プロトコル・アーキテクチャ(3/4) • ROS通信 6
箱庭の通信プロトコル・アーキテクチャ(3/4) • 共有メモリ 7
箱庭PDUデータをプログラムで使うには • 箱庭PDUデータをプログラムで使うには • データ(位置・速度など)をネットワーク用に変換する必要があります。 • まずは、「一般的な通信プログラムの流れ」を理解し、 • 次に、「箱庭PDUの場合の流れ」を理解します。 • そして、「一般的な通信プログラム vs 箱庭PDU」の比較をして理解を深めます。 • 最後に、「箱庭PDUの変換ライブラリとテンプレート」を紹介します。 8
一般的な通信プログラムの流れ • 通信フレームワーク側でプログラムデータ型をバイナリ変換してくれる アプリケーションプログラム プログラムデータ型 アプリケーションプログラム プログラムデータ型 アプリケーション 処理 アプリケーション 処理 通信API 通信API バイナリデータ バイナリ変換処理 (encode) バイナリデータ バイナリ変換処理 (decode) 通信フレームワーク 通信フレームワーク 転送API 転送API トランスポート層/ネットワーク層/データリンク層 トランスポート層/ネットワーク層/データリンク層 9
箱庭PDUの場合の流れ • アプリケーション側でプログラムデータ型をバイナリ変換します アプリケーションプログラム プログラムデータ型 アプリケーションプログラム プログラムデータ型 アプリケーション 処理 バイナリデータ バイナリ変換処理 (encode) アプリケーション 処理 バイナリデータ バイナリ変換処理 (decode) 転送API 転送API トランスポート層/ネットワーク層/データリンク層 トランスポート層/ネットワーク層/データリンク層 10
一般的な通信プログラム vs 箱庭PDU の比較 • 一般的な通信はFW任せ、箱庭PDUはアプリ主導 項目 一般的な通信プログラム 箱庭PDU バイナリ変換処理の場所 通信フレームワークが自動で実施 (アプリ側は意識する必要なし) アプリケーション側がバイナリ変換APIを使って実施 (アプリ側は意識する必要あり) データ型の定義 通信FW依存のデータ型を利用する 箱庭PDUのデータ型(ROS IDL) 通信層構造 アプリ → 通信API → 通信FW → 転送API → ネットワーク層 アプリ → PDU変換処理 → 転送API → ネットワーク層 API表面積 プログラム言語毎に通信APIが増える構造 (通信API内処理+バイナリ変換) プログラム言語毎にバイナリ変換APIが増える構造 (バイナリ変換のみ) 他プログラミング言語への 移植コスト ノード層・型バインディング・ミドル層など 広範囲改修 言語毎のバイナリ変換テンプレートの新規作成のみ 利点 FW内で閉じた最適化・通信の透明化 多言語対応が用意、API表面積を最小化すること で移植コストを低減できる 11
箱庭PDUの変換ライブラリとテンプレート • 箱庭PDU向けのデータ型/バイナリ変換ライブラリはテンプレートで自動生成! 通信記述形式 (ROS IDL) Python C# C++ データ型 テンプレート データ型 テンプレート データ型 テンプレート バイナリ変換 テンプレート バイナリ変換 テンプレート バイナリ変換 テンプレート ROS msgファイル ・・・ 箱庭PDU変換ツール Python C# C++ データ型 データ型 データ型 バイナリ変換 ライブラリ バイナリ変換 ライブラリ バイナリ変換 ライブラリ ・・・ 12
箱庭アセットと箱庭PDUチャネルについて • 箱庭アセットをPDUデータI/Oの観点で分類すると以下の2種類に分かれます • プラントモデル • 制御モデル • プラントモデルは、複数のロボットを持つことができます(制御側も同様) • ロボットは、複数のPDUデータに対してI/O発行できます • 各ロボットから見たときのPDUデータの識別IDをチャネルと呼びます • なのでPDUチャネルの識別は以下の2つの情報が必要となります • プラントモデルのロボット名 • チャネルID プラントモデル ロボットA チャネルID チャネルID 0 0 PDUデータA-1 1 0 ロボットB 1 PDUデータA-2 PDUデータB-1 PDUデータB-2 1 制御モデル 制御A 0 1 ロボットAのPDUデータ A-2にアクセスするには、 (“ロボットA”, “1” ) でアクセスする 制御B ロボットBのPDUデータ B-2にアクセスするには、 (“ロボットB”, “1” ) でアクセスする 13
箱庭アセットと箱庭PDUチャネルについて • UnityとPythonの箱庭アセットが箱庭コア機能を通して通信している様子(共有メモリ方式) 箱庭アセット(Unityの場合) 箱庭アセット (Pythonの場合) センサ1 0:センシングデータ1 0 センサ2 1:センシングデータ2 1 モータ 2:モータ指示値 2 ロボット PDU 0 1 2 0 1 2 0 1 2 箱庭コア機能 2 1 0 PDUデータ 14
箱庭PDUデータの作成方法 • 以下の手順で箱庭PDUデータを作成します。 • 0. 箱庭PDUデータを作成するリポジトリをクローンする • https://github.com/toppers/hakoniwa-ros2pdu • インストール手順およびPDUデータ生成方法は上記を参照ください。 • 1. 箱庭PDUデータの型を決める • 2-(a). ROS標準の通信データに存在している場合 • 対象の定義ファイル(.msg)から箱庭のPDUデータ定義ファイル群を生成する • 2-(b). ROS標準の通信データに存在していない場合 • ROS IDLで、定義ファイル(.msg)を作成する • 対象の定義ファイル(.msg)から箱庭のPDUデータ定義ファイル群を生成する • 3. 生成した箱庭PDUデータ/バイナリ変換ライブラリを取得する 15
生成される箱庭PDUデータの内訳 • 生成される場所: • hakoniwa-ros2pdu/pdu • 3種類のファイルが生成されます。 • json: • json形式の定義ファイル(Unityで利用) • offset: • offset定義ファイル(PDUバイナリデータのエンコーダ/デコーダで利用) • types: • C言語のデータ型およびROSデータ型への変換定義ファイル(.h, .hpp) • C言語のデータ型定義ファイル :pdu_ctype_<PDUデータ名>.h • ROSデータ型への変換定義ファイル:pdu_ctype_conv_<PDUデータ名>. hpp • python/csharp • python/C#のデータ型およびROSデータ型への変換定義ファイル群 • 上記ファイルは、以下のディレクトリ構成で生成されます。 • <ROSのパッケージ名>/<メッセージ名> 16
箱庭PDUデータの組み込み方法 • TODO:最新のAPIに対応した内容で作り直す予定。。 17
箱庭PDUデータのアクセス方法 • TODO:最新のAPIに対応した内容で作り直す予定。。 18