六个固态激光雷达扫出来的点云,需要拼接成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;
// 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前端狗,是的就是那位彩笔
版权声明:本文为u013172864原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。