PointCloud2 存储格式

PointCloud2 Storage Format

我正在尝试在 FPGA 中实现 PointCloud2 消息的 ROS 发布者节点。作为第一步,我已经在发布字符串的 FPGA 上实现了一个发布者节点。现在,我正在尝试做同样的事情,但针对 PointCloud2 消息格式。

理解字符串的存储方式非常简单,基本上每个字符都转换为它的ASCII值并存储(可以看出here)。另一方面,PointCloud2是一种复杂的数据类型,不太容易理解。

我在理解 PointCloud2 的元数据如何存储方面取得了一些进展,但是,理解 PointCloud2 数据类型的数据部分的存储非常困难。为简化起见,我还尝试了一个只有一个点的 PointCloud2,但我也无法对其进行解码。我知道 X、Y 和 Z 按顺序排列,每个 4 个字节(数据类型是 Float32)。因此,我可以隔离对应于其中一个坐标的 4 个字节。我试图将 0 到 17(十进制)的值分配给 X 坐标。这是使用这些值时存储的值(它们都是十进制):

1 = [0, 0, 128, 63] -> little-endian 所以,最重要的字节是 63,然后是 128, 0, 0

2 = [0, 0, 0, 64]

3 = [0, 0, 64, 64]

4 = [0, 0, 128, 64]

5 = [0, 0, 160, 64]

6 = [0, 0, 192, 64]

7 = [0, 0, 224, 64]

8 = [0, 0, 0, 65]

9 = [0, 0, 16, 65]

10 = [0, 0, 32, 65]

11 = [0, 0, 48, 65]

12 = [0, 0, 64, 65]

13 = [0, 0, 80, 65]

14 = [0, 0, 96, 65]

15 = [0, 0, 112, 65]

16 = [0, 0, 128, 65]

17 = [0, 0, 136, 65]

所以,我的问题是,这些值是如何存储的?据推测,数据部分根据 here 存储在二进制 blob 中。但是,我不明白这是什么意思以及它是如何工作的。另外,我还没有找到任何关于如何将十进制值转换为这种表示的具体示例。

对于具有X、Y和Z的PointCloud2,我目前的理解如下(here是对应的数据):

header:

高度:4字节

宽度:4字节

字段:

字段 1

字段 2

字段 3

is_bigendian: 1 个字节

point_step: 4 个字节

row_step: 4 个字节

大小:4 字节

数据:大小字节

is_dense: 1 个字节

当我选择数据类型 7 (FLOAT32) 时,数据部分按照标准 IEEE 754(这是一种广泛使用的有效存储浮点数的标准)中的指示进行存储。值得庆幸的是,已经有一个 Xilinx IP(浮点运算符)来处理浮点数,包括从其他类型(如 INT32)的转换和数学运算(如乘法)。