【问题标题】:PointCloud2 Storage FormatPointCloud2 存储格式
【发布时间】:2021-07-09 10:40:00
【问题描述】:

我正在尝试在 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 是相应的数据):

标题:

  • 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 字节

【问题讨论】:

    标签: blob ros binary-data point-cloud-library blobstorage


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-06
      • 2015-08-30
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      相关资源
      最近更新 更多