Rust crate for PointCloud2 ROS1/ROS2 message conversion.
Go to file
stelzo b3b137a425
Memopt (#17)
* remove Vec creation in byte conversions

* par par

* opti with byte similar

* clippy

* intro docs

* translations

* idiomatic

* fix par docs

* fix rosrust conv

* fix msg conv
2024-05-13 17:40:19 +02:00
.github API changes for v1 (#14) 2024-05-07 23:21:42 +02:00
benches Memopt (#17) 2024-05-13 17:40:19 +02:00
examples Memopt (#17) 2024-05-13 17:40:19 +02:00
rpcl2_derive Memopt (#17) 2024-05-13 17:40:19 +02:00
src Memopt (#17) 2024-05-13 17:40:19 +02:00
tests Memopt (#17) 2024-05-13 17:40:19 +02:00
.gitignore first commit 2023-04-25 18:30:54 +02:00
Cargo.toml Memopt (#17) 2024-05-13 17:40:19 +02:00
LICENSE first commit 2023-04-25 18:30:54 +02:00
README.md Memopt (#17) 2024-05-13 17:40:19 +02:00

README.md

!! Note !!

This library is currently in development for v1.0.0, for the documentation of v0.4.0 on crates.io, visit the docs.

ROS PointCloud2

A PointCloud2 message conversion library.

ros_pointcloud2 uses its own type for the message PointCloud2Msg to keep the library framework agnostic. ROS1 and ROS2 are supported with feature flags.

Get started with the example below, check out the other use cases in the examples folder or see the Documentation for a complete guide.

Quickstart

use ros_pointcloud2::prelude::*;

// PointXYZ (and many others) are provided by the crate.
let cloud_points = vec![
  PointXYZ::new(91.486, -4.1, 42.0001),
  PointXYZ::new(f32::MAX, f32::MIN, f32::MAX),
];

// Give the Vec or anything that implements `IntoIterator`.
let in_msg = PointCloud2Msg::try_from_vec(cloud_points).unwrap();

// Convert the ROS crate message type, we will use r2r here.
// let msg: r2r::sensor_msgs::msg::PointCloud2 = in_msg.into();
// Publish ...
// ... now incoming from a topic.
// let in_msg: PointCloud2Msg = msg.into();

let new_pcl = in_msg.try_into_iter().unwrap()
  .map(|point: PointXYZ| { // Define the info you want to have from the Msg.
      // Some logic here ...

      point
    })
    .collect::<Vec<_>>();

Integrations

There are currently 3 integrations for common ROS crates.

You can use rosrust and r2r by enabling the respective feature:

[dependencies]
ros_pointcloud2 = { version = "*", features = ["r2r_msg"]}
# or
ros_pointcloud2 = { version = "*", features = ["rosrust_msg"]}

rclrs (ros2_rust)

Features do not work properly with rcrls because the messages are linked externally. You need to use tags instead:

[dependencies]
ros_pointcloud2 = { git = "https://github.com/stelzo/ros_pointcloud2", tag = "v0.4.0_rclrs" }

Also, indicate the following dependencies to your linker inside the package.xml of your package.

<depend>std_msgs</depend>
<depend>sensor_msgs</depend>
<depend>builtin_interfaces</depend>

Please open an issue or PR if you need other integrations.

Performance

The library offers a speed up when compared to PointCloudLibrary (PCL) conversions but the specific factor depends heavily on the use case and system. vec conversions are on average ~7.5x faster than PCL while the single core iteration _iter APIs are around 2x faster. Parallelization with _par_iter showcases a 10.5x speed up compared to an OpenMP accelerated PCL pipeline.

The full benchmarks are publicly available in this repository.

License

MIT