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

问题描述 投票:0回答:1

我试图从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 ...

我还想补充一点,我是这方面的初学者。我和我的朋友谈过,他说使用互斥线程,但这似乎超出了我的想法。

谢谢!

c++ arrays loops floating-point
1个回答
0
投票

我怀疑你会惊讶于现代硬件能够快速循环30000点。

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

Donald E. Knuth的有用引用可能适用:

过早优化是万恶之源。

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

© www.soinside.com 2019 - 2024. All rights reserved.