Point_cloud_transport is here!

If you’ve ever worked with images in ROS, you’ve met image_transport, a library that hides a lot of complexity of image de/compression, leaving you a nice interface via which you can dynamically decide how your images should be transported.

If you’ve ever worked with pointclouds in ROS, you’ve met… Nothing. point_cloud_transport was not there. But that’s no longer true!

I’m happy to announce that today’s Noetic sync (and the next Melodic sync) brings point_cloud_transport - ROS Wiki for everybody! It’s the same interface you know from image_transport, the same plugin architecture for providing transport plugins… The only thing that’s missing is RViz integration. But that might come, too! In fact, the interface is even a bit more practical - you can decode a compressed message without the need to set up publishers and subscribers - e.g. when postprocessing a bag, no roscore needed.

As a first shot, our student has implemented Google Draco lossy pointcloud compression. Just say how many bits per position, per normal, per color, and the library strips 10-70% of your pointcloud size. Go ahead and check draco_point_cloud_transport - ROS Wiki .

As a quick test of how the library decimates your pointclouds, this simple launch file will first encode your raw pointcloud using draco and then decode it again so that you can view it in rviz:

<launch>
  <node name="compress" pkg="nodelet" type="nodelet" args="standalone point_cloud_transport/republish raw draco in:=my_cloud out:=compressed_cloud" />
  <node name="decompress" pkg="nodelet" type="nodelet" args="standalone point_cloud_transport/republish draco raw in:=compressed_cloud out:=decompressed_cloud" />
</launch>
<!-- Launch rosrun rqt_reconfigure rqt_reconfigure to play with the compression parameters -->
<!-- Launch rviz and compare my_cloud and decompressed_cloud -->

As a byproduct, the draco library itself has been also released on ROS buildfarm, which means you can <depend>draco</depend> and use the Draco library directly in your code.


There is also a first integration of point_cloud_transport - it has been added to sensor_filters - ROS Wiki (along with image_transport), so the filter chain runners now automatically subscribe images and pointclouds via the corresponding transports.


Let me know what you think about this library!

21 Likes

Great work, but ROS2 support is needed!

1 Like

Wow, this is fantastic timing! I’m developing a remote connector for Foxglove that is already using h264 compression for video, which is super efficient, but I was struggling to find an (easy?) way to handle pointclouds. I’ll definitely check it out. Thanks a lot!

Adding an Rviz plugin that will visualize this via that transport would be really valuable for remote on-network debugging!

1 Like

That’s awesome. Thanks for the great work. Looking forward to test it.

Contributions welcome :slight_smile: I can’t do it myself yet as we don’t run on ROS 2 yet, so I don’t have the insights into the ecosystem to get things right…

For example I always wondered what the relationship between transports and type adaptation would (or should) be…

2 Likes

Great work.

Same question.

The ROS 2 design is not compatible with efficient accelerated computing for compression | decompression images.

The community has started working on the ROS 2 port! Port point_cloud_transport to ROS2 by john-maidbot · Pull Request #1 · john-maidbot/point_cloud_transport · GitHub . Thanks a lot to everyone!

2 Likes

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.