Advertisement

PCL点云拼接(通过Lidar外参拼接点云)

阅读量:

六台固态激光雷达阵列扫描所得的点云数据需要拼接成一个完整的360度闭合点云。起初我认为将所有的PCD文件简单叠加(即简单地将所有点坐标叠加计算)是一种可行的方法。

说实话看到官网的操作流程感觉这也太复杂了吧
说实话实际项目中能遇到的理想情况太少了
每个PCD文件输出的坐标信息都是基于当前雷达设备作为基准点进行计算得出的
这合理吗?毕竟理论上有这么多变量叠加在一起嘛
不过说真的这个固态激光雷达设备的标定参数配置确实够专业

CMakeLists.txt

复制代码
 cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

    
  
    
 project(concatenate_clouds)
    
  
    
 find_package(PCL 1.2 REQUIRED)
    
  
    
 include_directories(${PCL_INCLUDE_DIRS})
    
 link_directories(${PCL_LIBRARY_DIRS})
    
 add_definitions(${PCL_DEFINITIONS})
    
  
    
 add_executable (concatenate_clouds concatenate_clouds.cpp)
    
 target_link_libraries (concatenate_clouds ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES} ${PCL_LIBRARIES})

完整逻辑代码 concatenate_clouds.cpp

复制代码
 #include <iostream>

    
 #include <pcl/io/io.h>
    
 #include <pcl/io/pcd_io.h>
    
 #include <pcl/point_types.h>
    
 #include <pcl/point_cloud.h>
    
 #include <pcl/console/time.h>
    
 #include <pcl/filters/voxel_grid.h>
    
 #include <pcl/visualization/cloud_viewer.h>
    
 #include <pcl/common/transforms.h>
    
 using namespace std;
    
 int main()
    
 {
    
       pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_1(new pcl::PointCloud<pcl::PointXYZ>);
    
       pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_2(new pcl::PointCloud<pcl::PointXYZ>);
    
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_3(new pcl::PointCloud<pcl::PointXYZ>);
    
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_4(new pcl::PointCloud<pcl::PointXYZ>);
    
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_5(new pcl::PointCloud<pcl::PointXYZ>);
    
       pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_6(new pcl::PointCloud<pcl::PointXYZ>);
    
  
    
     pcl::console::TicToc tt;
    
     std::cerr<<"Reader...\n",tt.tic();
    
  
    
     pcl::PCDReader reader1;
    
     reader1.read("1-0.pcd",*cloud_1);
    
     pcl::PCDReader reader2;
    
     reader2.read("1-1.pcd",*cloud_2);
    
     pcl::PCDReader reader3;
    
     reader3.read("1-2.pcd",*cloud_3);
    
     pcl::PCDReader reader4;
    
     reader4.read("1-3.pcd",*cloud_4);
    
     pcl::PCDReader reader5;
    
     reader5.read("1-4.pcd",*cloud_5);
    
     pcl::PCDReader reader6;
    
     reader6.read("1-5.pcd",*cloud_6);
    
     
    
     std::cerr<<"Done  "<<tt.toc()<<"  ms\n"<<std::endl;
    
     //转换
    
     Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();//单位矩阵
    
     transform_1 (0,0) = 0.999972;
    
     transform_1 (0,1) = 0;
    
     transform_1 (0,2) = 0.00750485;
    
     transform_1 (0,3) = 0;
    
     transform_1 (1,0) = 0;
    
     transform_1 (1,1) =1;
    
     transform_1 (1,2) = 0;
    
     transform_1 (1,3) = 0;
    
     transform_1 (2,0) = -0.00750485;
    
     transform_1 (2,1) =-0;
    
     transform_1 (2,2) = 0.999972;
    
     transform_1 (2,3) = 1.909;
    
     pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut_1(new pcl::PointCloud<pcl::PointXYZ>);
    
     pcl::transformPointCloud(*cloud_1, *cloudOut_1, transform_1);
    
     
    
     Eigen::Matrix4f transform_2 = Eigen::Matrix4f::Identity();//单位矩阵
    
     transform_2 (0,0) = 0.338535;
    
     transform_2 (0,1) = -0.939803;
    
     transform_2 (0,2) = 0.0465286;
    
     transform_2 (0,3) = -0.001;
    
     transform_2 (1,0) = 0.929107;
    
     transform_2 (1,1) =0.341685;
    
     transform_2 (1,2) = 0.141463;
    
     transform_2 (1,3) = 0.338;
    
     transform_2 (2,0) = -0.148845;
    
     transform_2 (2,1) =-0.00465988;
    
     transform_2 (2,2) = 0.98885;
    
     transform_2 (2,3) = 1.909;
    
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut_2(new pcl::PointCloud<pcl::PointXYZ>);
    
     pcl::transformPointCloud(*cloud_2, *cloudOut_2, transform_2);
    
     
    
     Eigen::Matrix4f transform_3 = Eigen::Matrix4f::Identity();//单位矩阵
    
     transform_3 (0,0) = -0.742701;
    
     transform_3 (0,1) = -0.656677;
    
     transform_3 (0,2) = -0.131041;
    
     transform_3 (0,3) = -1.109;
    
     transform_3 (1,0) = 0.64927;
    
     transform_3 (1,1) =-0.754084;
    
     transform_3 (1,2) = 0.0990242;
    
     transform_3 (1,3) = 0.15;
    
     transform_3 (2,0) = -0.163842;
    
     transform_3 (2,1) =-0.0115354;
    
     transform_3 (2,2) = 0.986419;
    
     transform_3 (2,3) = 1.909;
    
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut_3(new pcl::PointCloud<pcl::PointXYZ>);
    
     pcl::transformPointCloud(*cloud_3, *cloudOut_3, transform_3);
    
     
    
     Eigen::Matrix4f transform_4 = Eigen::Matrix4f::Identity();//单位矩阵
    
        transform_4 (0,0) = -0.742701;
    
        transform_4 (0,1) = 0.62401;
    
        transform_4 (0,2) = -0.128361;
    
        transform_4 (0,3) = -1.2;
    
        transform_4 (1,0) = -0.617308;
    
        transform_4 (1,1) =-0.617308;
    
        transform_4 (1,2) = -0.781369;
    
        transform_4 (1,3) = -0.149;
    
        transform_4 (2,0) = -0.157469;
    
        transform_4 (2,1) = 0.00861766;
    
        transform_4 (2,2) = 0.987486;
    
        transform_4 (2,3) = 1.909;
    
       pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut_4(new pcl::PointCloud<pcl::PointXYZ>);
    
    pcl::transformPointCloud(*cloud_4, *cloudOut_4, transform_4);
    
     
    
     Eigen::Matrix4f transform_5 = Eigen::Matrix4f::Identity();//单位矩阵
    
        transform_5 (0,0) = 0.33825;
    
        transform_5 (0,1) = 0.939574;
    
        transform_5 (0,2) = 0.0528062;
    
        transform_5 (0,3) = -0.009;
    
        transform_5 (1,0) = -0.929838;
    
        transform_5 (1,1) =-0.342329;
    
        transform_5 (1,2) = -0.134952;
    
        transform_5 (1,3) = -0.301;
    
        transform_5 (2,0) = -0.144874;
    
        transform_5 (2,1) =-0.00345383;
    
        transform_5 (2,2) = 0.989444;
    
        transform_5 (2,3) = 1.909;
    
       pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut_5(new pcl::PointCloud<pcl::PointXYZ>);
    
    pcl::transformPointCloud(*cloud_5, *cloudOut_5, transform_5);
    
     
    
     Eigen::Matrix4f transform_6 = Eigen::Matrix4f::Identity();//单位矩阵
    
        transform_6 (0,0) = 0.999931;
    
        transform_6 (0,1) = -0.000861352;
    
        transform_6 (0,2) = 0.0117086;
    
        transform_6 (0,3) = -0.037;
    
        transform_6 (1,0) = 0.00104713;
    
        transform_6 (1,1) =0.999874;
    
        transform_6 (1,2) = -0.0158696;
    
        transform_6 (1,3) = 0.019;
    
        transform_6 (2,0) = -0.0116934;
    
        transform_6 (2,1) = 0.0158807;
    
        transform_6 (2,2) = 0.999806;
    
        transform_6 (2,3) = 1.909;
    
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut_6(new pcl::PointCloud<pcl::PointXYZ>);
    
    pcl::transformPointCloud(*cloud_6, *cloudOut_6, transform_6);
    
     
    
     pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_x(new pcl::PointCloud<pcl::PointXYZ>);
    
     *cloud_x=*cloudOut_1+*cloudOut_2;
    
     *cloud_x+=*cloudOut_3;
    
     *cloud_x+=*cloudOut_4;
    
     *cloud_x+=*cloudOut_5;
    
     *cloud_x+=*cloudOut_6;
    
   141.  
    
 //    std::cerr<<"The point cloud_1 has:  "<<cloud_1.points.size()<<"  points data."<<std::endl;
    
 //    std::cerr<<"The point cloud_2 has:  "<<cloud_2.points.size()<<"  points data."<<std::endl;
    
 //    std::cerr<<"The point cloud_3 has:  "<<cloud_3.points.size()<<"  points data."<<std::endl;
    
  
    
     pcl::PCDWriter writer;
    
     writer.write("hz.pcd",*cloud_x);
    
  
    
     pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_7(new pcl::PointCloud<pcl::PointXYZ>);
    
  
    
     pcl::PCDReader reader_7;
    
     reader_7.read("hz.pcd",*cloud_7);
    
     std::cerr<<cloud_7,tt.tic();
    
     std::cerr<<"SorFilter...\n",tt.tic();
    
     pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
    
     pcl::VoxelGrid<pcl::PointXYZ> sor;
    
     sor.setInputCloud(cloud_7);
    
     sor.setLeafSize(0.01f,0.01f,0.01f);
    
     sor.filter(*cloud_filtered);
    
     std::cerr<<"Done  "<<tt.toc()<<" ms.\n"<<std::endl;
    
  
    
     std::cerr<<"视图...\n",tt.tic();
    
 //    pcl::visualization::CloudViewer viewer("3D Viewer");
    
 //     std::cerr<<"1111  "<<std::endl;
    
 //    viewer.showCloud(cloud_filtered);
    
 //     std::cerr<<"2222  "<<std::endl;
    
     pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
    
      viewer->setBackgroundColor (0, 0, 0);
    
      viewer->addPointCloud<pcl::PointXYZ> (cloud_filtered, "sample cloud");
    
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
    
      viewer->addCoordinateSystem (1.0);
    
      viewer->initCameraParameters ();
    
     while(!viewer->wasStopped())
    
     {
    
     viewer->spinOnce(100);
    
     }
    
     std::cerr<<"Done  "<<tt.toc()<<"  ms.\n"<<std::endl;
    
  
    
     return 0;
    
 }

那就跑起来看看吧:

1.cd 这两文件的文件夹目录

2.mkdir build
3.cd build

4.cmake ..

5.make

6.把要拼接的pcd塞到build文件目录下

7../concatenate_clouds

那就看看效果吧:

完事呗!

另:pcd无法给分享练手,客户数据不能瞎瘠薄泄露(哈哈)

---其实我就是C++写的超吊web前端狗,是的就是那位彩笔

全部评论 (0)

还没有任何评论哟~