PointCloud2存储格式



我正在尝试在FPGA中实现PointCloud2消息的ROS发布器节点。作为第一步,我已经在FPGA上实现了一个发布字符串的发布器节点。现在,除了PointCloud2消息格式之外,我正在尝试做同样的操作。

理解字符串是如何存储的非常简单,基本上每个字符都被转换为其ASCII值并进行存储(如图所示(。另一方面,PointCloud2是一种复杂的数据类型,不太容易理解。

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

1=[0,0,128,63]->小端序,因此,最高有效字节是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,019264]

7=[0,022464]

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,011265]

16=[0,0,128,65]

17=[0,013665]

所以,我的问题是,这些值是如何存储的?假设数据部分根据此处存储在二进制Blob中。然而,我不明白这意味着什么以及它是如何工作的。此外,我还没有找到任何关于如何将十进制值转换为这种表示的具体示例。

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

标题:

  • seq(4字节(
  • stamp(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等其他类型的转换和乘法等数学运算。

相关内容

  • 没有找到相关文章

最新更新