سلسلة أدوات تسلسل البيانات لأجهزة الكمبيوتر والأنظمة المدمجة التي تدعم C++ أو MATLAB
microbuf
؟قد ترغب في استخدامه إذا كنت تخطط لإنشاء واجهة بين الأجهزة التي تقوم بتشغيل تطبيق C++ (كمبيوتر أو نظام مضمن) و/أو الأجهزة التي تعمل (ربما مجمعة) كود MATLAB (Simulink على الكمبيوتر الشخصي أو الأنظمة المدمجة). إحدى حالات الاستخدام المحتملة هي "إرسال بيانات التحكم من الكمبيوتر عبر UDP إلى النظام المضمن". اللغات المدعومة حاليًا هي C++ وMATLAB، لكل من التسلسل وإلغاء التسلسل (Tx+Rx). وهذا يجعل من الممكن على سبيل المثال إرسال البيانات من عقدة ROS إلى dSPACE MicroAutoBox، أو من Arduino إلى محاكاة Simulink على جهاز كمبيوتر، أو تبادل البيانات بين Arduinos المتعددة - دون كتابة رمز الواجهة بايت بايت أو القلق بشأن أشياء مثل endianness. يمكن إضافة دعم لمزيد من اللغات بجهد معقول.
protobuf
/ JSON
/ matlab-msgpack
/...؟ إن استخدام إطار عمل آخر يحتوي على المزيد من الميزات مثل protobuf قد يكون منطقيًا بالفعل في كثير من الحالات. تم تصميم microbuf
لحالات الاستخدام ذات القيود القوية، على سبيل المثال الأنظمة المدمجة أو البيئات المماثلة ذات سلسلة أدوات مقيدة. لا يعتمد microbuf
على المكتبات الخارجية (أو حتى الوظيفة في مساحة الاسم C++ std
) ومن الممكن التجميع باستخدام أدوات اللغة القياسية فقط.
لا يمكن ترجمة matlab-msgpack بواسطة bastibe إلى كود C باستخدام برنامج الترميز Simulink/MATLAB.
أنواع البيانات التالية مدعومة حاليًا:
bool
uint8
و uint16
و uint32
و uint64
float32
، float64
لغة | التسلسل | إلغاء التسلسل | دعم اتفاقية حقوق الطفل | أمثلة | ملحوظات |
---|---|---|---|---|---|
سي ++ | ✔ | ✔ | ✔ | عقدة ROS؛ تطبيق C++؛ رسم اردوينو | |
ماتلاب | ✔ | ✔ | ✔ | dSPACE MicroAutoBox؛ محاكاة سيمولينك | قابلة للاستخدام في Simulink. يجمع مع Simulink/MATLAB Coder |
... | ✘ | ✘ | ✘ | يرجى فتح طلب ميزة أو PR للغات المستهدفة الجديدة |
يستخدم microbuf
ملفات وصف الرسائل التي تنتهي بـ .mmsg
لوصف بنية الرسائل، وليس على عكس ROS. تحتاج ملفات 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
باستخدام رسالة المثال: ./microbuf.py SensorData.mmsg
git submodule update --init --recursive
لنفترض أنك تريد إرسال الرسالة SensorData.mmsg
المذكورة أعلاه من جهاز كمبيوتر (باستخدام C++) إلى محاكاة Simulink. سيقوم microbuf
بإنشاء ملف رأسي SensorData.h
والذي يمكنك تضمينه في كود C++ الخاص بك. يحتاج ملف رأس الرسالة هذا إلى الوصول إلى ملف رأس microbuf.h
، لذا قم بنسخ كلا الملفين إلى نفس المجلد حيث سيجدهما المترجم الخاص بك أو يقوم بتعديل CMakeLists.txt
الخاص بك. يمكنك بعد ذلك استخدام البنية SensorData_struct_t
في لغة C++ لملء بياناتك وتحويلها إلى متجه بايت، على سبيل المثال كما يلي:
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 لاستقبال البايتات المتسلسلة. يمكن تحقيق ذلك على سبيل المثال باستخدام كتلة تلقي UDP من صندوق أدوات نظام DSP. من خلال إضافة الملف deserialize_SensorData.m
الذي أنشأه microbuf
إلى نموذج Simulink، يمكنك بعد ذلك إلغاء تسلسل البيانات المستلمة بسهولة:
لاحظ أنه من أجل محاكاة أو تجميع مثل هذا النموذج، يجب أن يكون مجلد matlab
الخاص بـ microbuf
على مسار MATLAB الخاص بك لأنه يحتوي على الوظائف الضرورية التي لم يتم تضمينها في deserialize_SensorData.m
. يمكنك بالطبع أيضًا نسخ المجلد +microbuf
الموجود إلى مكان في مشروعك الموجود على مسار MATLAB الخاص بك على أي حال.
يحتوي مجلد examples
أيضًا على نموذج Simulink الكامل. ستجد في نفس الملف أيضًا مثالًا تم التعليق عليه باستخدام MATLAB لإجراء تسلسل للبيانات.
إلى حد كبير نفس الأشياء التي يجب القيام بها في هذا المثال كما في المثال السابق. يمكن إعادة استخدام الكود في الغالب. تحتاج إلى تضمين رمز C++ الضروري في عقدة ROS الخاصة بك والتفكير في الوقت الذي تريد فيه إرسال رسالة إلى MicroAutoBox (على سبيل المثال، بأي سعر).
على جانب MicroAutoBox، لا يمكنك استخدام نفس كتلة تلقي UDP لأنك تحتاج إلى كتلة خاصة بالأجهزة. يتم تضمين كتلة استقبال UDP مماثلة في مجموعة كتل RTI Ethernet (UDP)، لذا يمكنك استخدام تلك الكتلة بدلاً من ذلك. لاحظ أن الحد الأقصى للحمولة لحزم UDP لمجموعة الكتل هذه هو 1472 بايت، وفقًا للوثائق. يمكن تضمين وظيفة إلغاء التسلسل كما في المثال السابق وسيتم تجميعها إلى كود C تلقائيًا.
يمكن بسهولة تضمين الرؤوس التي ينشئها microbuf
في رسم Arduino. يتم تجميع الكود لأنه لا يتطلب وظيفة من مساحة الاسم std
. من المحتمل أن تعتمد بيانات float64
على أجهزة Arduino المحددة الخاصة بك، وربما لا يمكن إجراء تسلسل لها على Arduino حيث قد تحتوي s double
على 32 بت فقط. عند استخدام مكتبة Wire (I2C)، يمكن نقل 32 بايت فقط في خطوة واحدة.
يمكن العثور هنا على أحد الأمثلة لإرسال البيانات من Arduino إلى آخر عبر I2C.
microbuf
العدد المطلوب من البايتات، راجع على سبيل المثال حجم data_size
الثابت لبنية C++ التي تم إنشاؤها. الحدود المعروفة: