C++ または MATLAB をサポートするコンピューターおよび組み込みシステム用のデータ シリアル化ツールチェーン
microbuf
を使いたい人はいるでしょうか?C++ アプリケーションを実行しているデバイス (コンピューターまたは組み込みシステム) および/または (コンパイルされた) MATLAB コードを実行しているデバイス (PC または組み込みシステム上の Simulink) の間のインターフェイスを作成する予定がある場合は、これを使用するとよいでしょう。考えられるユースケースの 1 つは、「制御データをコンピュータから UDP 経由で組み込みシステムに送信する」です。現在サポートされている言語は、シリアル化と逆シリアル化 (Tx+Rx) の両方について、C++ と MATLAB です。これにより、インターフェースコードをバイトごとに書いたり、次のようなことを心配したりすることなく、ROS ノードから dSPACE MicroAutoBox に、Arduino から PC 上の Simulink シミュレーションにデータを送信したり、複数の Arduino 間でデータを交換したりすることが可能になります。エンディアンネス。相応の努力をすれば、より多くの言語のサポートを追加できます。
protobuf
/ JSON
/ matlab-msgpack
/... を使用しないのはなぜですか? protobuf のような、より多くの機能を備えた別のフレームワークを使用することは、多くの場合、確かに意味があるかもしれません。 microbuf
は、制約のあるツールチェーンを備えた組み込みシステムや同様の環境など、強い制限のあるユースケースを対象としています。 microbuf
外部ライブラリ (または C++ std
名前空間の機能) に依存せず、標準の言語ツールだけを使用してコンパイルが可能です。
bastibe による matlab-msgpack は、Simulink/MATLAB コーダーを使用して C コードにコンパイルできません。
現在、次のデータ型がサポートされています。
bool
uint8
、 uint16
、 uint32
、およびuint64
float32
、 float64
言語 | 連載 | 逆シリアル化 | CRCのサポート | 例 | 注意事項 |
---|---|---|---|---|---|
C++ | ✔ | ✔ | ✔ | ROSノード。 C++ アプリケーション。 Arduinoのスケッチ | |
MATLAB | ✔ | ✔ | ✔ | dSPACE MicroAutoBox; Simulinkシミュレーション | Simulink で使用可能。 Simulink/MATLAB Coder でコンパイルします |
... | ✘ | ✘ | ✘ | 新しいターゲット言語についての機能リクエストまたは PR を開いてください |
microbuf
、ROS と同様に、メッセージの構造を記述するために.mmsg
で終わるメッセージ記述ファイルを使用します。 mmsg
ファイルは特定の構造に従う必要があり、有効なYAML
である必要があります。次の例は、 SensorData.mmsg
として保存し、 microbuf
メッセージとして使用できます。
version : 1
append_checksum : yes
content :
distance : float32[10]
angle : float32[10]
robot_id : uint8
他の例は test/messages/ にあります。
ここで./microbuf.py SensorData.mmsg
を実行すると、サポートされている言語のシリアライザーとデシリアライザーが自動的に生成されます。シリアライザーを使用してデータをバイトに変換し、(UDP または I2C 経由などで) 受信者に送信し、そこでデシリアライザーを使用してデコードできます。
microbuf
のシリアル化は、MessagePack 仕様に基づいています。すべてのデータ要素はフラット配列にパックされ、オプションの CRC16 チェックサムが追加されます。
git clone https://github.com/nspo/microbuf.git
cd microbuf
pyyaml
のみ) がインストールされていることを確認してください。sudo apt install python3-yaml
pip
を使用します: pip3 install -r requirements.txt
./microbuf.py SensorData.mmsg
を使用してmicrobuf
試してください。git submodule update --init --recursive
前述のメッセージSensorData.mmsg
コンピューター (C++ を使用) から Simulink シミュレーションに送信するとします。 microbuf
C++ コードに含めることができるヘッダー ファイルSensorData.h
を生成します。このメッセージ ヘッダー ファイルはmicrobuf.h
ヘッダー ファイルにアクセスする必要があるため、両方のファイルをコンパイラーが見つけられる同じフォルダーにコピーするか、 CMakeLists.txt
調整してください。次に、C++ で struct SensorData_struct_t
使用してデータを入力し、バイト ベクトルに変換できます。たとえば次のようになります。
SensorData_struct_t sensor_data {};
// fill example data into SensorData msg
for ( size_t i= 0 ; i< 10 ; ++i)
{
sensor_data. distance [i] = 2.5 * static_cast < float >(i);
sensor_data. angle [i] = 4.2 * static_cast < float >(i);
}
sensor_data.robot_id = 42U ;
const auto bytes = sensor_data.as_bytes(); // convert to bytes
bytes
何らかの方法で、たとえば UDP 経由で受信側システムに送信する必要があります。 examples
フォルダーには、それを行う方法の例が含まれています。
Simulink シミュレーションは、シリアル化されたバイトを受信するように構成できます。これは、DSP System Toolbox の UDP Receive ブロックなどを使用して実現できます。 microbuf
が生成したファイルdeserialize_SensorData.m
を Simulink モデルに追加すると、受信したデータを簡単に逆シリアル化できます。
このようなモデルをシミュレートまたはコンパイルするには、 microbuf
のmatlab
フォルダーが MATLAB パス上にある必要があることに注意してください。これは、 deserialize_SensorData.m
には含まれていない必要な機能が含まれているためです。もちろん、含まれている+microbuf
フォルダーをプロジェクト内の MATLAB パス上の場所にコピーすることもできます。
examples
フォルダーには、完全な Simulink モデルも含まれています。同じファイルには、MATLAB を使用してデータをシリアル化するコメントアウトされた例もあります。
この例でも、前の例とほぼ同じことを行う必要があります。コードはほとんど再利用できます。 ROS ノードに必要な C++ コードを含めて、MicroAutoBox にメッセージを送信するタイミング (たとえば、どのレートで) を検討する必要があります。
MicroAutoBox 側では、ハードウェア固有のブロックが必要となるため、同じ UDP 受信ブロックを使用することはできません。ただし、同様の UDP 受信ブロックが RTI イーサネット (UDP) ブロックセットに含まれているため、代わりにそれを使用できます。ドキュメントによると、このブロックセットの UDP パケットの最大ペイロードは 1472 バイトであることに注意してください。前の例のように逆シリアル化関数を含めることができ、自動的に C コードにコンパイルされます。
microbuf
生成するヘッダーは、Arduino スケッチに簡単に含めることができます。コードはstd
名前空間の機能を必要としないためコンパイルされます。特定の Arduino ハードウェアに依存する可能性がありますが、 double
は 32 ビットしか持たないため、 float64
データは Arduino 上でシリアル化できない可能性があります。 Wire (I2C) ライブラリを使用する場合、1 ステップで送信できるのは 32 バイトのみです。
I2C 経由で 1 つの Arduino から別の Arduino にデータを送信する一例は、ここにあります。
microbuf
必要なバイト数を知っています。たとえば、生成された C++ 構造体の定数data_size
参照してください。既知の制限: