如何在PointCloud的sensor_msgs / Image中保存强度值?

时间:2018-09-24 14:39:27

标签: ros point-cloud-library

我正在使用ROS-Kinetic。我有一个PointCloud类型的Pointcloud。我已经在飞机上投影了相同的点云。我想将平面点云转换为类型sensor_msgs / Image的图像。

toROSMsg(cloud, image); 

在此处输入代码会引发错误

error: ‘const struct pcl::PointXYZI’ has no member named ‘rgb’
         memcpy (pixel, &cloud (x, y).rgb, 3 * sizeof(uint8_t));

请在这方面启发我。如果可能,还附有代码段。

预先感谢

2 个答案:

答案 0 :(得分:1)

如果toROSMsg()抱怨您的输入云没有'rgb'成员,请尝试输入pcl :: PointXYZRGB类型的云。这是PCL处理的另一种点云。您可以查看documentation的PCL点类型。

使用以下几行转换为pcl :: PointXYZRGB类型:

if __name__ == '__main__':
    fn = sys.argv[1]
    sg = SegmentGenerator(fn)

    print("Num segments:", len(sg.segments))
    i = 0
    value = 'x'
    while value:
        value = sg.next()
        i += 1
        print(i, value)

    print("Num iterations:", i)

然后将函数调用为:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudrgb (new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::copyPointCloud(*cloud, *cloudrgb);

答案 1 :(得分:0)

您尝试实现的是2D体素化。我假设您想实现一些Thrun所解释的“逆传感器模型”(ISM),对吗? 通常将这种方法直接实现到映射算法中,以规避简单ISM的详尽计算。 因此,您几乎找不到开箱即用的解决方案。

无论如何,您可以通过多种方式做到这一点:

  1. 使用pointcloud_to_laserscan进行2D投影(但还是可以使用)
  2. 使用ISM算法。在book
  3. 中进行了解释

  1. 转换PCL to an octree
  2. 下采样为四叉树并将其转换为图像