pcl 读取stl模型文件并生产点云:
#include "pcl/point_cloud.h"
#include "pcl/point_types.h"
#include "pcl/PolygonMesh.h"
#include "pcl/visualization/vtk.h"
#include "pcl/io/vtk_lib_io.h"
#include "pcl/visualization/cloud_viewer.h"
#include "/opt/ros/foxy/include/pcl_conversions/pcl_conversions.h"
std::string model_file = file_path + "/model.STL";
//方式一:
pcl::PointCloud<pcl::PointNormal>::Ptr cloud(new pcl::PointCloud<pcl::PointNormal>());//创建点云对象
pcl::PolygonMesh mesh_data;
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
pcl::io::loadPolygonFileSTL(model_file, mesh_data); //PCL利用VTK的IO接口,可以直接读取stl,ply,obj等格式的三维点云数据,传给PolygonMesh对象
pcl::io::mesh2vtk(mesh_data, polydata); //将PolygonMesh对象转化为vtkPolyData对象
pcl::io::vtkPolyDataToPointCloud(polydata, *cloud);//将vtkPolyData对象转化为Ptr对象, 获取点云
//pcl::io::savePCDFileASCII("/home/jack/ros2_ws/1.pcd", *cloud);
//方式二:
vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
reader->SetFileName(model_file.c_str());
reader->Update();
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
polydata = reader->GetOutput();
polydata->GetNumberOfPoints();
polydata->BuildCells();
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
pcl::io::vtkPolyDataToPointCloud(polydata, *cloud);
//方法三
pcl::io::loadPolygonFileSTL(model_file, mesh_data);
pcl::fromPCLPointCloud2(mesh_data.cloud, *cloud);
pcl::toROSMsg(*cloud,cloud_msg);