2 unstable releases
new 0.4.0 | Dec 4, 2024 |
---|---|
0.3.0 | Oct 17, 2024 |
#942 in Encoding
409 downloads per month
Used in roslibrust
70KB
1.5K
SLoC
Roslibrust Serde ROSMSG
This is a fork of serde_rosmsg maintained for the roslibrust project. Original work and all credit goes to Adnan Ademovic. This fork will only be maintained until serde_rosmsg is updated or someone else can take over maintenance.
roslibrust_serde_rosmsg is a Rust serializer to the rosmsg
data format, used in TCPROS and UDPROS.
For more information you can look at:
License
roslibrust_serde_rosmsg is distributed under the MIT license.
lib.rs
:
Serde ROSMSG
ROSMSG is a binary format used for communication between ROS nodes.
Message types are defined in ROS's own specification. The linked specification contains information about supported data structures. Serialization is performed by just writing the underlying binary data in a Little Endian byte order. Fields that contain multiple items are prefixed with a 32-bit length, in number of items. That applies to variable sized arrays (like vectors) and strings. Serialized data is prefixed by a 32-bit number, representing the number of bytes in the serialized data, excluding that prefix.
Examples
If we wanted to serialize "Rust is great!", we would need to prefix the string with 14, which is the string's length. Then we would need to prefix that with 18, the combined length of the length annotation and the string itself.
let rosmsg_data = to_vec(&String::from("Rust is great!")).unwrap();
assert_eq!(rosmsg_data, b"\x12\0\0\0\x0e\0\0\0Rust is great!");
let rust_data: String = from_slice(&rosmsg_data).unwrap();
assert_eq!(rust_data, "Rust is great!");
Serialization is performed using serde
.
Thus, if you want to serialize your own structures, you can use
serde_derive
use roslibrust_serde_rosmsg::{to_vec, from_slice};
use serde::{Serialize, Deserialize};
fn main() {
#[derive(Debug,Serialize,Deserialize,PartialEq)]
struct Position {
x: i16,
y: i16,
z: i16,
}
let data = Position {
x: 1025,
y: -1,
z: 5,
};
let rosmsg_data = to_vec(&data).unwrap();
assert_eq!(rosmsg_data, [6, 0, 0, 0, 1, 4, 255, 255, 5, 0]);
let rust_data: Position = from_slice(&rosmsg_data).unwrap();
assert_eq!(rust_data, data);
}
Dependencies
~2.8–8.5MB
~91K SLoC