我正在尝试在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等其他类型的转换和乘法等数学运算。