ชุดเครื่องมือซีเรียลไลซ์ข้อมูลสำหรับคอมพิวเตอร์และระบบฝังตัวที่รองรับ C++ หรือ MATLAB

microbuf ?คุณอาจต้องการใช้มันหากคุณวางแผนที่จะสร้างอินเทอร์เฟซระหว่างอุปกรณ์ที่ใช้แอปพลิเคชัน C++ (คอมพิวเตอร์หรือระบบฝังตัว) และ/หรืออุปกรณ์ที่ใช้รหัส MATLAB (อาจคอมไพล์แล้ว) (Simulink บนพีซีหรือระบบฝังตัว) กรณีการใช้งานหนึ่งที่เป็นไปได้คือ "ส่งข้อมูลควบคุมจากคอมพิวเตอร์ผ่าน UDP ไปยังระบบฝังตัว" ภาษาที่รองรับในปัจจุบันคือ C++ และ MATLAB สำหรับทั้งการทำให้เป็นอนุกรมและการดีซีเรียลไลซ์ (Tx+Rx) ซึ่งช่วยให้สามารถส่งข้อมูลจากโหนด ROS ไปยัง dSPACE MicroAutoBox จาก Arduino ไปยังการจำลอง Simulink บนพีซี หรือแลกเปลี่ยนข้อมูลระหว่าง Arduino หลายเครื่อง โดยไม่ต้องเขียนโค้ดอินเทอร์เฟซแบบไบต์ต่อไบต์ หรือกังวลเกี่ยวกับสิ่งต่างๆ เช่น ความเอนเอียง สามารถเพิ่มการรองรับภาษาอื่น ๆ ได้มากขึ้นด้วยความพยายามที่สมเหตุสมผล
protobuf / JSON / matlab-msgpack /... ล่ะ? การใช้เฟรมเวิร์กอื่นที่มีคุณสมบัติมากกว่า เช่น protobuf อาจสมเหตุสมผลในหลายกรณี microbuf มีไว้สำหรับกรณีการใช้งานที่มีข้อจำกัดสูง เช่น ระบบฝังตัวหรือสภาพแวดล้อมที่คล้ายกันซึ่งมี toolchain ที่จำกัด microbuf ไม่ได้ขึ้นอยู่กับไลบรารีภายนอก (หรือแม้แต่ฟังก์ชันการทำงานในเนมสเปซ C++ std ) และสามารถคอมไพล์โดยใช้เครื่องมือภาษามาตรฐานได้
matlab-msgpack โดย bastibe ไม่สามารถคอมไพล์เป็นโค้ด C ด้วย Simulink/MATLAB coder
ปัจจุบันรองรับประเภทข้อมูลต่อไปนี้:
booluint8 , uint16 , uint32 และ uint64float32 , float64| ภาษา | การทำให้เป็นอนุกรม | ดีซีเรียลไลเซชัน | ซีอาร์ซีสนับสนุน | ตัวอย่าง | หมายเหตุ |
|---|---|---|---|---|---|
| ซี++ | โหนด ROS; แอปพลิเคชัน C ++; ร่าง Arduino | ||||
| แมทแล็บ | dSPACE ไมโครออโต้บ็อกซ์; การจำลองซิมูลิงค์ | ใช้งานได้ใน Simulink; คอมไพล์ด้วย Simulink/MATLAB Coder | |||
| - | โปรดเปิดคำขอคุณลักษณะหรือการประชาสัมพันธ์สำหรับภาษาเป้าหมายใหม่ |
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 microbufpyyaml ในขณะที่เขียนเท่านั้น):sudo apt install python3-yamlpip : pip3 install -r requirements.txtmicrobuf ด้วยข้อความตัวอย่าง: ./microbuf.py SensorData.mmsggit submodule update --init --recursive สมมติว่าคุณต้องการส่งข้อความ SensorData.mmsg ที่กล่าวถึงข้างต้นจากคอมพิวเตอร์ (โดยใช้ C++) ไปยังการจำลอง Simulink microbuf จะสร้างไฟล์ส่วนหัว SensorData.h ซึ่งคุณสามารถรวมไว้ในโค้ด C++ ของคุณได้ ไฟล์ส่วนหัวของข้อความนี้จำเป็นต้องเข้าถึงไฟล์ส่วนหัว microbuf.h ดังนั้น เพียงคัดลอกทั้งสองไฟล์ไปยังโฟลเดอร์เดียวกันกับที่คอมไพเลอร์ของคุณจะพบหรือปรับเปลี่ยน CMakeLists.txt ของคุณ จากนั้นคุณสามารถใช้ struct 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) Blockset ดังนั้นคุณจึงสามารถใช้บล็อกนั้นแทนได้ โปรดทราบว่าเพย์โหลดสูงสุดของแพ็กเก็ต UDP สำหรับบล็อกเซ็ตนี้คือ 1472 ไบต์ ตามเอกสารประกอบ สามารถรวมฟังก์ชันดีซีเรียลไลซ์ไลซ์เซชันไว้ในตัวอย่างก่อนหน้าได้ และจะถูกคอมไพล์เป็นโค้ด C โดยอัตโนมัติ
ส่วนหัวที่ microbuf สร้างขึ้นสามารถรวมไว้ในร่าง Arduino ได้อย่างง่ายดาย โค้ดคอมไพล์เนื่องจากไม่ต้องการฟังก์ชันการทำงานจากเนมส std อาจขึ้นอยู่กับฮาร์ดแวร์ Arduino เฉพาะของคุณ ข้อมูล float64 อาจไม่สามารถซีเรียลไลซ์บน Arduino ได้ เนื่องจาก double s อาจมีเพียง 32 บิตเท่านั้น เมื่อใช้ไลบรารี Wire (I2C) สามารถส่งข้อมูลได้เพียง 32 ไบต์ในขั้นตอนเดียว
ตัวอย่างหนึ่งของการส่งข้อมูลจาก Arduino เครื่องหนึ่งไปยังอีกเครื่องหนึ่งผ่าน I2C สามารถพบได้ที่นี่

microbuf รู้จำนวนไบต์ที่ต้องการ ดูเช่น data_size คงที่ของโครงสร้าง C++ ที่สร้างขึ้น ขีดจำกัดที่ทราบ: