利用PCL库画简单的三维立体图形

利用PCL库画简单的三维立体图形需要知道各种图形的参数方程,然后给每个参数赋值便可以。

圆柱面的参数方程为:x = R*cos(θ); y = R*sin(θ); z = z;其中 θ范围是[-2*PI, 2*PI), z的范围是(-∞,+∞)

球面的参数方程是:x = R*sin(θ)*cos(ψ); y = R*sin(θ)*sin(ψ); z = R*cos(θ);其中θ∈[0, PI), ψ∈[0, 2*PI)

下面给出代码:

  1. #include <iostream>   
  2. #include <boost/thread/thread.hpp>  
  3. #include <pcl/common/common_headers.h>  
  4. #include <pcl/features/normal_3d.h>  
  5. #include <pcl/io/pcd_io.h>   
  6. #include <pcl/visualization/pcl_visualizer.h>  
  7. // #include <pcl/console/parse.h>  
  8.   
  9. boost::shared_ptr<pcl::visualization::PCLVisualizer> simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)  
  10. {  
  11.     boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));  
  12.     viewer->setBackgroundColor(0.0, 0.0, 0.0);  
  13.     viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");  
  14.     viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1.0, "sample cloud");  
  15.     viewer->addCoordinateSystem(1.0);  
  16.     viewer->initCameraParameters();  
  17.   
  18.     return viewer;  
  19. }  
  20.   
  21. //构造圆柱体点云  
  22. void ConsCylinderCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr)  
  23. {  
  24.     for(float z = -1.0; z <= 1.0; z += 0.05)  
  25.     {  
  26.         for (float angle = 0.0; angle <= 360.0; angle += 5.0)  
  27.         {  
  28.             pcl::PointXYZ basic_point;  
  29.   
  30.             basic_point.x = cosf(pcl::deg2rad(angle));  
  31.             basic_point.y = sinf(pcl::deg2rad(angle));  
  32.             basic_point.z = z;  
  33.             basic_cloud_ptr->points.push_back(basic_point);  
  34.         }  
  35.     }  
  36.   
  37.     basic_cloud_ptr->width = (int)basic_cloud_ptr->points.size();  
  38.     basic_cloud_ptr->height = 1;  
  39. }  
  40.   
  41. //构造球体点云  
  42. void ConsSphereCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr)  
  43. {  
  44.     float radius = 0.2;  
  45.   
  46.     for (float angle1 = 0.0; angle1 <= 180.0; angle1 += 5.0)  
  47.     {  
  48.         for (float angle2 = 0.0; angle2 <= 360.0; angle2 += 5.0)  
  49.         {  
  50.             pcl::PointXYZ basic_point;  
  51.   
  52.             basic_point.x = radius * sinf(pcl::deg2rad(angle1)) * cosf(pcl::deg2rad(angle2));  
  53.             basic_point.y = radius * sinf(pcl::deg2rad(angle1)) * sinf(pcl::deg2rad(angle2));  
  54.             basic_point.z = radius * cosf(pcl::deg2rad(angle1));  
  55.             basic_cloud_ptr->points.push_back(basic_point);  
  56.         }  
  57.     }  
  58.   
  59.     basic_cloud_ptr->width = (int)basic_cloud_ptr->points.size();  
  60.     basic_cloud_ptr->height = 1;  
  61. }  
  62.   
  63. int main(int _Argc, char *argv[])  
  64. {  
  65.     pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr(new pcl::PointCloud<pcl::PointXYZ>);  
  66.     pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr(new pcl::PointCloud<pcl::PointXYZRGB>);  
  67.   
  68. #define SPHERE  
  69. #if defined CYLINDER  
  70.     ConsCylinderCloud(basic_cloud_ptr);  
  71. #elif defined SPHERE  
  72.     ConsSphereCloud(basic_cloud_ptr);  
  73. #endif  
  74.     boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = simpleVis(basic_cloud_ptr);  
  75.     while ( !viewer->wasStopped())  
  76.     {  
  77.         viewer->spinOnce(100);  
  78.         boost::this_thread::sleep(boost::posix_time::microseconds(100000));  
  79.     }  
  80.     return 0;  
  81. }  

这个是画出的球面。

如果要画出圆柱面,则将代码中的#define SPHERE改为#define CYLINDER,然后编译运行即可显示以xoy平面对称的圆柱面。


以上显示方式是在程序中写死的,也可以将点云保存为文件,
程序中的main函数中稍微修改下,将viewer的代码替换为
  1. ConsSphereCloud(basic_cloud_ptr);  
  2.     pcl::io::savePCDFileASCII("sphere.pcd", *basic_cloud_ptr);  

然后在控制台下切换到C:\Program Files (x86)\PCL 1.6.0\bin目录中,再执行
  1. C:\Users\pc>pcd_viewer_release D:\pcl_test\visualizer\cmake-bin\sphere.pcd  
  2. The viewer window provides interactive commands; for help, press 'h' or 'H' from within the window.  
  3. > Loading D:\pcl_test\visualizer\cmake-bin\sphere.pcd [done, 140 ms : 2701 points]  
  4. Available dimensions: x y z  
显示的图像如下所示:



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值