• PCL内置点云类型


    PCL内置了许多点云类型供我们使用,下面先介绍PLC内置的点云数据类型

    PCL中的点云类型为PointT;至于为什么是PointT类型需要追随到原来的ros开发中去,因为PCL库也是从原来的ROS中剥离出来的;大家都一致的认为点云结构是离散的N维信息描述的物体。因此最简单的点云结构便是XYZ,下面首先来看看XYZ三维信息如何在PCL中实现的。

    1 PointXYZ

    最简单的XYZ点云结构体,包含X,Y,Z信息和一个padding;此处额外增加一个padding是为了满足支持SSE指令集的处理器,并实现SIMD向量化加速而额外添加的一个信息,该信息无实际意义;如果你觉得这里使用浪费了内存资源,你可以去掉最后一个padding维度并使用简单的XYZ来代表一个点云数据。

    1. struct PointXYZ
    2. {
    3. float x;
    4. float y;
    5. float z;
    6. float padding;
    7. };

    如下是之前已经演示过的一个简答示例:

    该示例创建了一个PointXYZ类型的点云数据,并向其中随机添加了1000个点云信息。

    其中

    1. #include
    2. #include
    3. #include
    4. #include
    5. int main(int argc, char **argv) {
    6. pcl::PointCloud cloud;
    7. // Fill in the cloud data
    8. /* pcl中的点云分为有序点云与无序点云:
    9. * 1、有序点云类使用深度相机生成的点云数据,该点云数据有指定的宽高,
    10. * 有序点云数据的可以轻松的获取相邻点的信息,这可以极大的提升某些点云算法的运算效率
    11. *
    12. * 2、无序点云就是常规的点云数据,无序点云的height始终为1,width为点云的个数
    13. *
    14. */
    15. //可以自行切换下面的注释,看看有什么区别
    16. // cloud.width = 640; // Image-like organized structure, with 480 rows and 640 columns,
    17. // cloud.height = 480; // thus 640*480=307200 points total in the dataset
    18. cloud.width = 640*480; // unorganized point cloud dataset with 307200 points
    19. cloud.height = 1;
    20. //is_dense 指定points中的信息数据是否全部是有效数值的,是则为true;
    21. // 当数据集中包含有Inf/NaN等无效值时,此时为false。
    22. cloud.is_dense = false;
    23. cloud.points.resize(cloud.width * cloud.height);
    24. for (auto &point: cloud) {
    25. point.x = 1024 * rand() / (RAND_MAX + 1.0f);
    26. point.y = 1024 * rand() / (RAND_MAX + 1.0f);
    27. point.z = 1024 * rand() / (RAND_MAX + 1.0f);
    28. }
    29. for (auto &point: cloud) {
    30. std::cout << point.x << point.y << point.z << std::endl;
    31. }
    32. pcl::io::savePCDFileASCII("test_pcd.pcd", cloud);
    33. std::cerr << "Saved " << cloud.size() << " data points to test_pcd.pcd." << std::endl;
    34. for (const auto &point: cloud)
    35. std::cerr << " " << point.x << " " << point.y << " " << point.z << std::endl;
    36. //判断点云是否为有序点云
    37. if (!cloud.isOrganized ())
    38. {
    39. std::cout<<"该点云为无序点云"<
    40. }
    41. return (0);
    42. }

    2 PointXYZI

    PointXYZI包含点云的坐标XYZ和该点的强度(intensity)信息,大家可能会觉得多了一个强度信息就可以使用强度信息替换掉PointXYZ中被无效占用的padding;但是实际上他的存储是这样的:

    1. union
    2. {
    3. float data[4];
    4. struct
    5. {
    6. float x;
    7. float y;
    8. float z;
    9. };
    10. };
    11. union
    12. {
    13. struct
    14. {
    15. float intensity;
    16. };
    17. float data_c[4];
    18. };

    点云还是占用了4个float空间,一个强度信息也占用了4个float空间;这样的原因如下:

    1 大多数的SE3变换中最后一行的元素都是0或者1,如果此时将强度信息与点xyz整合在一块内存区域,那么这其中的点乘操作会使得第四个维度的强度信息无意义;因此不如分开存放并进行内存对齐,有利于SSE的SIMD运算

    3 PointXYZRGBA

    PointXYZRGBA点云类型包含了xyz与std::uint32_t rgba类型的颜色信息

    注:此处的嵌套union结构为历史原因导致,应该在新的代码中舍弃

    1. union
    2. {
    3. float data[4];
    4. struct
    5. {
    6. float x;
    7. float y;
    8. float z;
    9. };
    10. };
    11. union
    12. {
    13. union
    14. {
    15. struct
    16. {
    17. std::uint8_t b;
    18. std::uint8_t g;
    19. std::uint8_t r;
    20. std::uint8_t a;
    21. };
    22. float rgb;
    23. };
    24. std::uint32_t rgba;
    25. };

    4 PointNormal

    点云中另外一种常见的数据类型是PointNormal,其中normal代表该点的法向量信息,与前面的PointXYZI一样,此处为了计算效率也使用了额外的数据进行对齐

    1. union
    2. {
    3. float data_n[4];
    4. float normal[3];
    5. struct
    6. {
    7. float normal_x;
    8. float normal_y;
    9. float normal_z;
    10. };
    11. }
    12. union
    13. {
    14. struct
    15. {
    16. float curvature;
    17. };
    18. float data_c[4];
    19. };

    5 衍生类型

    其他的类型还包括如下几个:

    PointWithRange - float x, y, z (union with float point[4]), range;点和距离信息,常见于RGBD图像

    PointXYZRGBNormal - float x, y, z, normal[3], curvature; std::uint32_t rgba;点与颜色和法线信息

    PointXYZINormal - float x, y, z, intensity, normal[3], curvature;点强度与法线信息

    PointWithScale - float x, y, z, scale;点与尺度信息,可以进行缩放操作

    PointWithViewpoint - float x, y, z, vp_x, vp_y, vp_z;点与视场角信息

    PointXY - float x,y;简单的二维结构,仅保存关键点信息

  • 相关阅读:
    1108 String复读机分数 20
    测试需求分析
    性能测试工具有哪些?原理是什么?怎么选择适合的工具?
    ubuntu18.04安装F4PGA教程
    13-Error接口错误处理以及go Module
    1.下载安装ESP32开发环境ESP-IDE
    SQL按月生成分区表,按月份查询该表数据
    ubuntu中执行一个c程序-编辑makefile文件执行make
    Leetcode(633)——平方数之和
    浅析 C# 控制台的 Ctrl+C 是怎么玩的
  • 原文地址:https://blog.csdn.net/qq_41366026/article/details/134432925