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