Rantai alat serialisasi data untuk komputer dan sistem tertanam dengan dukungan C++ atau MATLAB
microbuf
?Anda mungkin ingin menggunakannya jika Anda berencana membuat antarmuka antara perangkat yang menjalankan aplikasi C++ (komputer atau sistem tertanam) dan/atau perangkat yang menjalankan (mungkin dikompilasi) kode MATLAB (Simulink pada PC atau sistem tertanam). Salah satu kasus penggunaan yang mungkin adalah "Kirim data kontrol dari komputer melalui UDP ke sistem tertanam". Bahasa yang didukung saat ini adalah C++ dan MATLAB, untuk serialisasi dan deserialisasi (Tx+Rx). Hal ini memungkinkan misalnya mengirim data dari node ROS ke dSPACE MicroAutoBox, dari Arduino ke simulasi Simulink di PC, atau bertukar data antara beberapa Arduino - tanpa menulis kode antarmuka byte demi byte atau mengkhawatirkan hal-hal seperti sifat endian. Dukungan untuk lebih banyak bahasa dapat ditambahkan dengan upaya yang wajar.
protobuf
/ JSON
/ matlab-msgpack
/... saja? Menggunakan kerangka kerja lain dengan lebih banyak fitur seperti protobuf mungkin masuk akal dalam banyak kasus. microbuf
ditujukan untuk kasus penggunaan dengan keterbatasan yang kuat, misalnya sistem tertanam atau lingkungan serupa dengan rantai alat yang dibatasi. microbuf
tidak bergantung pada perpustakaan eksternal (atau bahkan fungsionalitas di namespace C++ std
) dan kompilasi hanya menggunakan alat bahasa standar dimungkinkan.
matlab-msgpack oleh bastibe tidak dapat dikompilasi ke kode C dengan pembuat kode Simulink/MATLAB.
Tipe data berikut saat ini didukung:
bool
uint8
, uint16
, uint32
, dan uint64
float32
, float64
Bahasa | Serialisasi | Deserialisasi | dukungan CRC | Contoh | Catatan |
---|---|---|---|---|---|
C++ | ✔ | ✔ | ✔ | simpul ROS; aplikasi C++; Sketsa Arduino | |
MATLAB | ✔ | ✔ | ✔ | dSPACE MicroAutoBox; Simulasi simulink | Dapat digunakan di Simulink; kompilasi dengan Simulink/MATLAB Coder |
... | ✘ | ✘ | ✘ | Silakan buka permintaan fitur atau PR untuk bahasa target baru |
microbuf
menggunakan file deskripsi pesan yang diakhiri dengan .mmsg
untuk mendeskripsikan struktur pesan, tidak seperti ROS. file mmsg
harus mengikuti struktur tertentu dan harus YAML
yang valid. Contoh berikut dapat disimpan sebagai SensorData.mmsg
dan kemudian digunakan sebagai pesan microbuf
:
version : 1
append_checksum : yes
content :
distance : float32[10]
angle : float32[10]
robot_id : uint8
Contoh lainnya dapat ditemukan di bawah test/messages/.
Saat Anda menjalankan ./microbuf.py SensorData.mmsg
, serializer dan deserializer untuk bahasa yang didukung akan dibuat secara otomatis. Anda dapat menggunakan serializer untuk mengkonversi data menjadi byte, mengirimkannya ke penerima Anda (misalnya melalui UDP atau I2C), dan mendekodekannya di sana dengan deserializer.
Serialisasi microbuf
didasarkan pada spesifikasi MessagePack. Semua elemen data dikemas ke dalam array datar dan checksum CRC16 opsional ditambahkan.
git clone https://github.com/nspo/microbuf.git
cd microbuf
pyyaml
pada saat penulisan) diinstal:sudo apt install python3-yaml
pip
: pip3 install -r requirements.txt
microbuf
dengan contoh pesan: ./microbuf.py SensorData.mmsg
git submodule update --init --recursive
Misalkan Anda ingin mengirim pesan SensorData.mmsg
yang disebutkan di atas dari komputer (menggunakan C++) ke simulasi Simulink. microbuf
akan menghasilkan file header SensorData.h
yang dapat Anda sertakan dalam kode C++ Anda. File header pesan ini memerlukan akses ke file header microbuf.h
, jadi cukup salin kedua file ke folder yang sama di mana kompiler Anda akan menemukannya atau sesuaikan CMakeLists.txt
Anda. Anda kemudian dapat menggunakan struct SensorData_struct_t
di C++ untuk mengisi data Anda dan mengubahnya menjadi vektor byte, misalnya seperti ini:
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
sekarang perlu dikirim ke sistem penerima, misalnya melalui UDP. Folder examples
berisi contoh bagaimana seseorang dapat melakukannya.
Simulasi Simulink dapat dikonfigurasi untuk menerima byte serial. Hal ini dapat dicapai misalnya dengan blok Terima UDP dari DSP System Toolbox. Dengan menambahkan file deserialize_SensorData.m
yang dihasilkan microbuf
ke model Simulink, Anda kemudian dapat dengan mudah melakukan deserialize data yang diterima:
Perhatikan bahwa untuk mensimulasikan atau mengkompilasi model seperti itu, folder matlab
microbuf
harus berada di jalur MATLAB Anda karena berisi fungsionalitas yang diperlukan yang tidak termasuk dalam deserialize_SensorData.m
. Tentu saja Anda juga dapat menyalin folder +microbuf
yang ada ke suatu tempat di proyek Anda yang berada di jalur MATLAB Anda.
Folder examples
juga berisi model Simulink lengkap. Dalam file yang sama Anda juga akan menemukan contoh komentar menggunakan MATLAB untuk membuat serial data.
Pada dasarnya, hal yang sama perlu dilakukan untuk contoh ini seperti contoh sebelumnya. Kode ini sebagian besar dapat digunakan kembali. Anda perlu memasukkan kode C++ yang diperlukan di node ROS Anda dan memikirkan kapan Anda ingin mengirim pesan ke MicroAutoBox (misalnya dengan tarif berapa).
Di sisi MicroAutoBox, Anda tidak dapat menggunakan blok Penerimaan UDP yang sama karena Anda memerlukan blok khusus perangkat keras. Blok Penerimaan UDP serupa disertakan dalam Blok RTI Ethernet (UDP), jadi Anda dapat menggunakannya sebagai gantinya. Perhatikan bahwa payload maksimum paket UDP untuk blockset ini adalah 1472 byte, menurut dokumentasi. Fungsi deserialisasi dapat dimasukkan seperti pada contoh sebelumnya dan akan dikompilasi ke kode C secara otomatis.
Header yang dihasilkan microbuf
dapat dengan mudah dimasukkan ke dalam sketsa Arduino. Kode dikompilasi karena tidak memerlukan fungsionalitas dari namespace std
. Mungkin bergantung pada perangkat keras Arduino spesifik Anda, data float64
mungkin tidak dapat diserialkan di Arduino karena double
s mungkin hanya memiliki 32 bit. Saat menggunakan perpustakaan Wire (I2C), hanya 32 byte yang dapat ditransmisikan dalam satu langkah.
Salah satu contoh pengiriman data dari satu Arduino ke Arduino lainnya melalui I2C dapat dilihat di sini.
microbuf
mengetahui jumlah byte yang diperlukan, lihat misalnya konstanta data_size
dari struct C++ yang dihasilkan. Batasan yang diketahui: