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:
- seq(4 字节)
- 戳记(8 字节)
- frame_id(每个字符 1 个字节)
高度:4字节
宽度:4字节
字段:
- 字段数(4 字节)
字段 1
- 维度(4 字节)
- 名称(1 字节)
- 偏移量(4 字节)
- 数据类型(1 字节)
- 计数(4 个字节)
字段 2
- 维度(4 字节)
- 名称(1 字节)
- 偏移量(4 字节)
- 数据类型(1 字节)
- 计数(4 个字节)
字段 3
- 维度(4 字节)
- 名称(1 字节)
- 偏移量(4 字节)
- 数据类型(1 字节)
- 计数(4 个字节)
is_bigendian: 1 个字节
point_step: 4 个字节
row_step: 4 个字节
大小:4 字节
数据:大小字节
is_dense: 1 个字节
当我选择数据类型 7 (FLOAT32) 时,数据部分按照标准 IEEE 754(这是一种广泛使用的有效存储浮点数的标准)中的指示进行存储。值得庆幸的是,已经有一个 Xilinx IP(浮点运算符)来处理浮点数,包括从其他类型(如 INT32)的转换和数学运算(如乘法)。
我正在尝试在 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:
- seq(4 字节)
- 戳记(8 字节)
- frame_id(每个字符 1 个字节)
高度:4字节
宽度:4字节
字段:
- 字段数(4 字节)
字段 1
- 维度(4 字节)
- 名称(1 字节)
- 偏移量(4 字节)
- 数据类型(1 字节)
- 计数(4 个字节)
字段 2
- 维度(4 字节)
- 名称(1 字节)
- 偏移量(4 字节)
- 数据类型(1 字节)
- 计数(4 个字节)
字段 3
- 维度(4 字节)
- 名称(1 字节)
- 偏移量(4 字节)
- 数据类型(1 字节)
- 计数(4 个字节)
is_bigendian: 1 个字节
point_step: 4 个字节
row_step: 4 个字节
大小:4 字节
数据:大小字节
is_dense: 1 个字节
当我选择数据类型 7 (FLOAT32) 时,数据部分按照标准 IEEE 754(这是一种广泛使用的有效存储浮点数的标准)中的指示进行存储。值得庆幸的是,已经有一个 Xilinx IP(浮点运算符)来处理浮点数,包括从其他类型(如 INT32)的转换和数学运算(如乘法)。