系列文章目录
前言
Cloudini 是一个点云压缩库。
它的重点是速度,但仍能达到很好的压缩比。
其主要用途如下
- 改进包含点云数据的数据集的存储(一个显著的例子就是 rosbags)。
- 降低在网络上串流点云数据时所使用的带宽。
它可与 PCL 和 ROS 无缝协作,但如果需要,主库也可独立编译和使用。
一、预期结果
压缩率很难预测,因为它取决于原始数据的编码方式。
例如,ROS 的点云信息效率极低,因为它们在信息中包含了一些 “填充”,在极端情况下,填充可能高达 50%。
(是的,你没有听错,10 Gb 的数据包中几乎有 50% 是无用的填充)。
不过,总的来说,你可以期待比 ZTD 或 LZ4 单独压缩更好、编码/解码更快。
这是两个使用激光雷达真实数据的随机例子。
- 通道: XYZ、强度,无填充
[LZ4 only] ratio: 0.77 time (usec): 2165[ZSTD only] ratio: 0.68 time (usec): 2967[Cloudini-LZ4] ratio: 0.56 time (usec): 1254[Cloudini-ZSTD] ratio: 0.51 time (usec): 1576
- 通道: XYZ、强度、环(int16)、时间戳(双),带填充
[LZ4 only] ratio: 0.31 time (usec): 2866[ZSTD only] ratio: 0.24 time (usec): 3423[Cloudini-LZ4] ratio: 0.16 time (usec): 2210[Cloudini-ZSTD] ratio: 0.14 time (usec): 2758
如果您是 ROS 用户,可以在任何包含 sensor_msgs::msg::PointCloud2 主题的 rosbag 上运行应用程序 rosbag_benchmark,亲自测试压缩率和速度。
二、工作原理
该算法包含两个步骤:
- 逐个通道对点云进行编码。
- 使用 LZ4 或 ZSTD 压缩。
浮点通道(通常是 X、Y、Z 通道)的编码是有损的,而 RGBA 和整数通道的编码是无损的。
现在,我知道当你读到 “有损 ”这个词时,你可能会想到颗粒状的 JPEGS 图像。其实不然。
编码器使用用户提供的分辨率进行量化。
典型激光雷达的精度/噪声约为 +/- 2 厘米。因此,使用 1 毫米的分辨率(+/- 0.5 毫米的最大量化误差)通常是非常保守的选择。
但是,如果您真的很偏执,决定使用 100 微米的分辨率,您仍然可以获得极佳的压缩比!
还需要注意的是,这种两步压缩策略会产生负开销,也就是说,它实际上比单独使用 LZ4 或 ZSTD 更快。
三、ROS 专用实用程序
3.1 point_cloud_transport plugins
请参阅 point_cloud_transport 插件,了解其使用方法。
3.2 cloudini_rosbag_converter
这是一个命令行工具,在给定一个 rosbag(仅限于 MCAP 格式)后,可将所有 sensor_msgs/msg/PointCloud2 主题转换为压缩的 point_cloud_interfaces/msg/CompressedPointCloud2 主题,反之亦然。
编码/解码速度比通用压缩算法更快,在 1 毫米分辨率下可实现更好的压缩比。
有趣的是,它可以在系统未安装 ROS 的情况下编译!
使用示例:往返压缩/解压缩;
# Use option -c for compression
cloudini_rosbag_converter -f original_rosbag.mcap -o compressed_rosbag.mcap -c# Use option -d for decompression
cloudini_rosbag_converter -f compressed_rosbag.mcap -o restored_rosbag.mcap -d
请注意,“restored_rosbag.mcap ”可能比原始文件小,因为 MCAP 提供的基于分块的 ZSTD 压缩功能已启用。
四、常见问题
4.1 与 Draco 相比,它的性能如何?
Google Draco 有两种主要的编码方式: SEQUENTIAL 和 KD_TREE。
后者可以达到很好的压缩率,但速度非常慢,而且不能保留点云中点的原始顺序。
与 Draco 的顺序模式相比,Cloudini 可实现大致相同的压缩率,但在我的基准测试中(目前有限),Cloudini 的速度要快得多。
4.2 解码器需要知道使用的是 LZ4 还是 ZSTD 吗?
不需要,该信息存储在压缩数据的头部,解码器会自动选择正确的库。