我试图从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 ...
我还想补充一点,我是这方面的初学者。我和我的朋友谈过,他说使用互斥线程,但这似乎超出了我的想法。
谢谢!
我怀疑你会惊讶于现代硬件能够快速循环30000点。
您应该从循环和一些基本考虑开始。例如,要将X / Y坐标存储在矢量中,请在进入循环之前在矢量中保留所需的空间,以避免额外的内存分配。一旦你的循环工作,评估性能,如果你认为你的代码太慢,可能会发布另一个问题。
Donald E. Knuth的有用引用可能适用:
过早优化是万恶之源。
编辑;提供一些背景信息:我们在低端i5处理器上运行了一个应用程序,通过Kinect SDK或OpenNI(不同的传感器)以15 fps的速度收集76,800个3D点。在将每个点存储到pcl :: PointCloud之前,我们将遍历这些点并应用基本转换。然后我们再次循环点云点进行一些分析。分析部分远远超过任何基本循环的成本。您可能最终会担心优化您想要应用于数据的任何评估逻辑,而不是基本的事情,例如循环点。