如何在模式中获取数组中的数据?

时间:2019-03-25 03:16:11

标签: c++ arrays loops floating-point

我正在尝试从PointCloud2数据中获取x和y值。此数据以float32的字节数存储在数组中。我的问题是,如何只获取x和y数据?

我将添加一个PointCloud2数据的摘要,但是现在我只希望能够获取x-数据。因此,对于每16个值,我只想要前4个值(我想使用前4个值,因为这是它的排序方式,因为float32分别分解为4个字节)。

我最初的想法是使用循环,但是我担心这可能太慢。这是因为我的数组有2000多个值,并且我每秒获得15个这些数组。还有其他方法吗?

  seq: 296
  stamp: 
    secs: 1553456947
    nsecs: 421859979
  frame_id: "cloud"
height: 1
width: 811
fields: 
  - 
    name: "x"
    offset: 0
    datatype: 7
    count: 1
  - 
    name: "y"
    offset: 4
    datatype: 7
    count: 1
  - 
    name: "z"
    offset: 8
    datatype: 7
    count: 1
  - 
    name: "intensity"
    offset: 12
    datatype: 7
    count: 1
is_bigendian: False
point_step: 16
row_step: 12976
data: [108, 171, 8, 191, 107, 171, 8, 191, 0, 0, 0, 0, 0, 0, 113, 70, 167, 
197, 8, 191, 103, 95, 10, 191, 0, 0, 0, 0, 0, 240, 115, 70, 99, 101, 9, 191,
 127, 161, 12, 191, 0, 0, 0, 0, 0, 200, 106, 70, 99, 50, 5, 191, 202, 237, 9,
 191, 0, 0, 0, 0, 0, 76, 82, 70, 200, 22, 235, 190, 200, 74, 246, 190, 0, 0,
 0, 0, 0, 132, 52, 70, 186, 111, 255, 190, 99, 95, 7, 191, 0, 0, 0, 0, 0, 24,
 60, 70, 227, 1, 8, 191, 89, 217, 17, 191, 0, 0, 0, 0, 0, 64, 93, 70, 216, 
183, 8, 191, 245, 84, 20, 191, 0, 0, 0, 0, 0, 236, 112, 70, 195, 94, 8, 191,
 64, 177, 21, 191, 0, 0, 0, 0 ...

我还想补充一点,我是这种事情的初学者。我和我的朋友聊天,他说为此使用互斥锁线程,但这似乎让我头疼。

谢谢!

1 个答案:

答案 0 :(得分:0)

我怀疑您会惊讶于现代硬件如此快速地循环通过30000点。

您应该从循环和一些基本注意事项开始。例如,要在向量中存储X / Y坐标,请在进入循环之前在向量中保留所需的空间,以避免额外的内存分配。循环工作后,请评估性能,如果您认为代码太慢,则可能会发布另一个问题。

Donald E. Knuth的有用报价可能适用:

  

过早的优化是万恶之源。

编辑;提供一些背景信息:我们有一个运行在低端i5处理器上的应用程序,它通过Kinect SDK或OpenNI(不同传感器)以15 fps的速度收集了76,800个3D点。我们将遍历所有点并应用基本转换,然后再将每个点存储到pcl :: PointCloud中。然后,我们将再次遍历点云点以进行一些分析。分析部分远远超过了任何基本循环的成本。您可能最终会担心要优化要应用于数据的任何评估逻辑,而不是优化诸如遍历点的基本操作。