C++ 또는 MATLAB을 지원하는 컴퓨터 및 임베디드 시스템을 위한 데이터 직렬화 툴체인
microbuf
사용하고 싶어할까요?C++ 응용 프로그램을 실행하는 장치(컴퓨터 또는 임베디드 시스템) 및/또는 MATLAB 코드를 실행하는(컴파일된) 장치(PC 또는 임베디드 시스템의 Simulink) 사이에 인터페이스를 생성하려는 경우 이 기능을 사용할 수 있습니다. 가능한 사용 사례 중 하나는 "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 Coder를 사용하여 C 코드로 컴파일할 수 없습니다.
현재 지원되는 데이터 유형은 다음과 같습니다.
bool
uint8
, uint16
, uint32
및 uint64
float32
, float64
언어 | 직렬화 | 역직렬화 | CRC 지원 | 예 | 메모 |
---|---|---|---|---|---|
C++ | ✔ | ✔ | ✔ | ROS 노드; C++ 애플리케이션; 아두이노 스케치 | |
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
사용해 보세요: ./microbuf.py SensorData.mmsg
git submodule update --init --recursive
위에서 언급한 SensorData.mmsg
메시지를 컴퓨터(C++ 사용)에서 Simulink 시뮬레이션으로 보내고 싶다고 가정해 보겠습니다. microbuf
C++ 코드에 포함할 수 있는 헤더 파일 SensorData.h
생성합니다. 이 메시지 헤더 파일은 microbuf.h
헤더 파일에 액세스해야 하므로 두 파일을 컴파일러가 찾을 동일한 폴더에 복사하거나 CMakeLists.txt
조정하면 됩니다. 그런 다음 C++에서 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 시스템 도구 상자의 UDP 수신 블록을 사용하여 달성할 수 있습니다. Simulink 모델에 microbuf
생성된 deserialize_SensorData.m
파일을 추가하면 수신된 데이터를 쉽게 역직렬화할 수 있습니다.
이러한 모델을 시뮬레이션하거나 컴파일하려면 microbuf
의 matlab
폴더가 MATLAB 경로에 있어야 합니다. 왜냐하면 deserialize_SensorData.m
에 포함되지 않은 필수 기능이 포함되어 있기 때문입니다. 물론 포함된 +microbuf
폴더를 프로젝트의 MATLAB 경로에 있는 위치로 복사할 수도 있습니다.
examples
폴더에는 전체 Simulink 모델도 포함되어 있습니다. 동일한 파일에서 MATLAB을 사용하여 데이터를 직렬화하는 주석 처리된 예제도 찾을 수 있습니다.
이 예제에서는 이전 예제와 거의 동일한 작업을 수행해야 합니다. 코드는 대부분 재사용이 가능합니다. ROS 노드에 필요한 C++ 코드를 포함하고 언제 MicroAutoBox에 메시지를 보낼지(예: 어느 속도로) 생각해야 합니다.
MicroAutoBox 측에서는 하드웨어별 UDP 수신 블록이 필요하기 때문에 동일한 UDP 수신 블록을 사용할 수 없습니다. 하지만 유사한 UDP 수신 블록이 RTI 이더넷(UDP) 블록 세트에 포함되어 있으므로 해당 블록을 대신 사용할 수 있습니다. 문서에 따르면 이 블록세트에 대한 UDP 패킷의 최대 페이로드는 1472바이트입니다. deserialization 함수는 이전 예제와 같이 포함될 수 있으며 자동으로 C 코드로 컴파일됩니다.
microbuf
생성하는 헤더는 Arduino 스케치에 쉽게 포함될 수 있습니다. 코드는 std
네임스페이스의 기능이 필요하지 않으므로 컴파일됩니다. 특정 Arduino 하드웨어에 따라 다를 수 있으며 double
s는 32비트만 가질 수 있으므로 float64
데이터는 Arduino에서 직렬화되지 않을 수 있습니다. Wire(I2C) 라이브러리를 사용하면 한 단계에 32바이트만 전송할 수 있습니다.
I2C를 통해 하나의 Arduino에서 다른 Arduino로 데이터를 전송하는 한 가지 예는 여기에서 찾을 수 있습니다.
microbuf
필요한 바이트 수를 알고 있습니다. 예를 들어 생성된 C++ 구조체의 상수 data_size
참조하세요. 알려진 한계: