ชุดเครื่องมือซีเรียลไลซ์ข้อมูลสำหรับคอมพิวเตอร์และระบบฝังตัวที่รองรับ 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
ปัจจุบันรองรับประเภทข้อมูลต่อไปนี้:
bool
uint8
, uint16
, uint32
และ uint64
float32
, 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 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
ของคุณ จากนั้นคุณสามารถใช้ 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++ ที่สร้างขึ้น ขีดจำกัดที่ทราบ: