本文主要是讲述对于点云数据的理解
实际上点云也是一种数据,在rviz中显示点云,很显然,应该知道每个点云数据的坐标,也就是三维坐标。同时,点云显示还会有各种颜色来表示远近或者材质,那么,颜色信息也应该包含在点云数据当中。另外,有时候也需要知道显示对象是什么,那么就需要包含强度信息,通过强度信息能够知道点云显示的物体是什么类型的物体。
综上,点云数据可以包含:坐标、颜色、强度。这样就好理解,点云数据是如何显示的了。
那么,如何从传感器获得的数据变成点云显示呢?
接下来就是关于点云的处理
传感器的数据首先是因传感器不同而不同的,我们需要清楚传感器得到的数据是什么样子的,这些往往是在传感器的说明书里会讲或者设计的时候就应该知道。
举个例子,传感器发过来的数据为10000,这个数据来自于环境中的10米的物体。通过这个10000,我们要将其转化为10米的表示。意思就是,我们得清楚传感器的数据到环境转化的规则。可以通过测试,实验,来调试好这个规则。当然,传感器对一个位置的数据描述肯定不仅仅会是一个数值而已,上文已经说了,表示一个物体的信息,往往除了位置信息,还有类型信息等等。
明白,传感器到点云数据处理的大致流程。还需要注意的是,数据往往是以数据包的形式发送和获取的。
这就需要我们清楚,数据包是如何存储数据的,每一个点的数据,由几个数据构成。需要我们进行裁切和reshape。显然,所谓的数据传输,当然是一个一个数字发送,传递的,无论是点云的数据,还是图像的数据,都是由数字构成的,只不过传输的时候,会将这些数据变成一行,一个一个数字的传输。所以才有上述说的,裁切和reshape处理,形成标准的数据形式。
再补充一点,通过一些列的操作,我们已经知道点云数据的形式和内容。但要在rviz以PointCloud2的类型去表示。原理上是一样的,我们还是要将原始的点云数据转化为或者赋值为PointCloud2的数据类型,也就是我们还需要清楚PointCloud2数据是需要什么样子的信息,定义一个msg作为PointCloud2类的实例。然后,在通过订阅发布机制,把msg信息发布出去,rviz订阅即可。
如下:
msg = sensor.PointCloud2()
msg.height = 1
msg.width = self.Img[idx].shape[0]
msg.fields = [
sensor.PointField(
"x", 0, sensor.PointField.FLOAT32, 1
),
sensor.PointField(
"y", 4, sensor.PointField.FLOAT32, 1
),
sensor.PointField(
"z", 8, sensor.PointField.FLOAT32, 1
),
sensor.PointField(
"w", 12, sensor.PointField.FLOAT32, 1
),
]
msg.is_bigendian = False
msg.point_step = 16
msg.is_dense = False
self.sensor_data[seq_id] = msg
frame_id = "map"